Minor tweaks
This commit is contained in:
parent
0c5cd403d0
commit
52e620467a
|
@ -142,6 +142,8 @@ C_KZG_RET reduce_leaves(fr_t *dst, uint64_t len_dst, fr_t *scratch, uint64_t len
|
||||||
* @remark Fails for very high numbers of missing indices. For example, with `fs.max_width = 256` and `length = 256`,
|
* @remark Fails for very high numbers of missing indices. For example, with `fs.max_width = 256` and `length = 256`,
|
||||||
* this will fail for len_missing = 253 or more. In this case, `length` (and maybe `fs.max_width`) needs to be doubled.
|
* this will fail for len_missing = 253 or more. In this case, `length` (and maybe `fs.max_width`) needs to be doubled.
|
||||||
*
|
*
|
||||||
|
* @remark Note that @p zero_poly is used as workspace during calculation.
|
||||||
|
*
|
||||||
* @param[out] zero_eval Array length @p length (TODO: description)
|
* @param[out] zero_eval Array length @p length (TODO: description)
|
||||||
* @param[out] zero_poly Array length @p length (TODO: description)
|
* @param[out] zero_poly Array length @p length (TODO: description)
|
||||||
* @param[out] zero_poly_len The length of the resulting @p zero_poly
|
* @param[out] zero_poly_len The length of the resulting @p zero_poly
|
||||||
|
@ -153,6 +155,8 @@ C_KZG_RET reduce_leaves(fr_t *dst, uint64_t len_dst, fr_t *scratch, uint64_t len
|
||||||
* @retval C_CZK_BADARGS Invalid parameters were supplied
|
* @retval C_CZK_BADARGS Invalid parameters were supplied
|
||||||
* @retval C_CZK_ERROR An internal error occurred
|
* @retval C_CZK_ERROR An internal error occurred
|
||||||
* @retval C_CZK_MALLOC Memory allocation failed
|
* @retval C_CZK_MALLOC Memory allocation failed
|
||||||
|
*
|
||||||
|
* @todo What is the performance impact of tuning `per_leaf_poly`?
|
||||||
*/
|
*/
|
||||||
C_KZG_RET zero_polynomial_via_multiplication(fr_t *zero_eval, fr_t *zero_poly, uint64_t *zero_poly_len, uint64_t length,
|
C_KZG_RET zero_polynomial_via_multiplication(fr_t *zero_eval, fr_t *zero_poly, uint64_t *zero_poly_len, uint64_t length,
|
||||||
const uint64_t *missing_indices, uint64_t len_missing,
|
const uint64_t *missing_indices, uint64_t len_missing,
|
||||||
|
@ -168,20 +172,20 @@ C_KZG_RET zero_polynomial_via_multiplication(fr_t *zero_eval, fr_t *zero_poly, u
|
||||||
CHECK(length <= fs->max_width);
|
CHECK(length <= fs->max_width);
|
||||||
CHECK(is_power_of_two(length));
|
CHECK(is_power_of_two(length));
|
||||||
|
|
||||||
uint64_t domain_stride = fs->max_width / length;
|
uint64_t per_leaf_poly = 64; // Tunable parameter. Must be a power of two.
|
||||||
uint64_t per_leaf_poly = 64;
|
|
||||||
uint64_t per_leaf = per_leaf_poly - 1;
|
uint64_t per_leaf = per_leaf_poly - 1;
|
||||||
|
uint64_t domain_stride = fs->max_width / length;
|
||||||
uint64_t leaf_count = (len_missing + per_leaf - 1) / per_leaf;
|
uint64_t leaf_count = (len_missing + per_leaf - 1) / per_leaf;
|
||||||
uint64_t n = next_power_of_two(leaf_count * per_leaf_poly);
|
uint64_t n = next_power_of_two(leaf_count * per_leaf_poly);
|
||||||
|
|
||||||
if (len_missing <= per_leaf) {
|
if (len_missing <= per_leaf) {
|
||||||
TRY(do_zero_poly_mul_leaf(zero_poly, length, missing_indices, len_missing, domain_stride, fs));
|
TRY(do_zero_poly_mul_leaf(zero_poly, length, missing_indices, len_missing, domain_stride, fs));
|
||||||
TRY(fft_fr(zero_eval, zero_poly, false, length, fs));
|
TRY(fft_fr(zero_eval, zero_poly, false, length, fs));
|
||||||
*zero_poly_len = length;
|
*zero_poly_len = len_missing + 1;
|
||||||
} else {
|
} else {
|
||||||
CHECK(n <= length);
|
CHECK(n <= length);
|
||||||
|
|
||||||
// Work space for reducing the leaves - we could use `zero_poly` for this if it were always big enough.
|
// Work space for reducing the leaves - `zero_poly` is large enough due to the above check, so use that.
|
||||||
fr_t *work = zero_poly;
|
fr_t *work = zero_poly;
|
||||||
|
|
||||||
// Build the leaves.
|
// Build the leaves.
|
||||||
|
|
|
@ -229,8 +229,8 @@ void zero_poly_known(void) {
|
||||||
TEST_CHECK(C_KZG_OK == zero_polynomial_via_multiplication(zero_eval.coeffs, zero_poly.coeffs, &zero_poly_len,
|
TEST_CHECK(C_KZG_OK == zero_polynomial_via_multiplication(zero_eval.coeffs, zero_poly.coeffs, &zero_poly_len,
|
||||||
zero_eval.length, missing, len_missing, &fs));
|
zero_eval.length, missing, len_missing, &fs));
|
||||||
|
|
||||||
TEST_CHECK(expected_poly.length == zero_poly_len);
|
TEST_CHECK(len_missing + 1 == zero_poly_len);
|
||||||
TEST_MSG("Expected %lu, got %lu", expected_poly.length, zero_poly_len);
|
TEST_MSG("Expected %lu, got %lu", len_missing + 1, zero_poly_len);
|
||||||
|
|
||||||
for (int i = 0; i < expected_eval.length; i++) {
|
for (int i = 0; i < expected_eval.length; i++) {
|
||||||
TEST_CHECK(fr_equal(&expected_eval.coeffs[i], &zero_eval.coeffs[i]));
|
TEST_CHECK(fr_equal(&expected_eval.coeffs[i], &zero_eval.coeffs[i]));
|
||||||
|
|
Loading…
Reference in New Issue