Skip to content

Commit 25733f1

Browse files
committed
Move most field utils to libff
1 parent 47034ce commit 25733f1

File tree

132 files changed

+1204
-1109
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

132 files changed

+1204
-1109
lines changed

libiop/algebra/exponentiation.tcc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ std::vector<FieldT> subspace_element_powers(const affine_subspace<FieldT> &S,
8181
*
8282
* In the case where the exponent is a power of two, we skip the multiplications.
8383
*/
84-
if (is_power_of_2(exponent))
84+
if (libff::is_power_of_2(exponent))
8585
{
8686
return subspace_to_power_of_two(S, exponent);
8787
}

libiop/algebra/fft.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,30 +60,30 @@ std::vector<FieldT> multiplicative_IFFT_wrapper(const std::vector<FieldT> &v,
6060
const multiplicative_coset<FieldT> &H);
6161

6262
template<typename FieldT>
63-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
63+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
6464
field_subset<FieldT> domain);
6565

6666
template<typename FieldT>
67-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> coeffs,
67+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> coeffs,
6868
field_subset<FieldT> domain);
6969

7070
template<typename FieldT>
71-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
71+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
7272
field_subset<FieldT> domain);
7373

7474
template<typename FieldT>
75-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
75+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
7676
field_subset<FieldT> domain);
7777

7878
template<typename FieldT>
7979
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
80-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
80+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
8181
size_t degree_bound,
8282
field_subset<FieldT> domain);
8383

8484
template<typename FieldT>
8585
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
86-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
86+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
8787
size_t degree_bound,
8888
field_subset<FieldT> domain);
8989

libiop/algebra/fft.tcc

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <libfqfft/evaluation_domain/domains/basic_radix2_domain_aux.hpp>
55

66
#include <libff/common/profiling.hpp>
7-
#include "libiop/algebra/field_utils.hpp"
7+
#include <libff/algebra/field_utils/field_utils.hpp>
88
#include "libiop/algebra/utils.hpp"
99

1010
namespace libiop {
@@ -207,23 +207,23 @@ template<typename FieldT>
207207
std::vector<FieldT> additive_FFT_wrapper(const std::vector<FieldT> &v,
208208
const affine_subspace<FieldT> &H)
209209
{
210-
enter_block("Call to additive_FFT_wrapper");
211-
print_indent(); printf("* Vector size: %zu\n", v.size());
212-
print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
210+
libff::enter_block("Call to additive_FFT_wrapper");
211+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
212+
libff::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
213213
const std::vector<FieldT> result = additive_FFT(v, H);
214-
leave_block("Call to additive_FFT_wrapper");
214+
libff::leave_block("Call to additive_FFT_wrapper");
215215
return result;
216216
}
217217

218218
template<typename FieldT>
219219
std::vector<FieldT> additive_IFFT_wrapper(const std::vector<FieldT> &v,
220220
const affine_subspace<FieldT> &H)
221221
{
222-
enter_block("Call to additive_IFFT_wrapper");
223-
print_indent(); printf("* Vector size: %zu\n", v.size());
224-
print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
222+
libff::enter_block("Call to additive_IFFT_wrapper");
223+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
224+
libff::print_indent(); printf("* Subspace size: %zu\n", H.num_elements());
225225
const std::vector<FieldT> result = additive_IFFT(v, H);
226-
leave_block("Call to additive_IFFT_wrapper");
226+
libff::leave_block("Call to additive_IFFT_wrapper");
227227
return result;
228228
}
229229

@@ -239,7 +239,7 @@ std::vector<FieldT> multiplicative_FFT_degree_aware(const std::vector<FieldT> &p
239239
const FieldT &shift)
240240
{
241241
assert(poly_coeffs.size() <= coset.num_elements());
242-
const size_t n = coset.num_elements(), logn = log2(n);
242+
const size_t n = coset.num_elements(), logn = libff::log2(n);
243243

244244
std::vector<FieldT> a(poly_coeffs);
245245
/** If there is a coset shift x, the degree i term of the polynomial is multiplied by x^i */
@@ -249,7 +249,7 @@ std::vector<FieldT> multiplicative_FFT_degree_aware(const std::vector<FieldT> &p
249249
}
250250
a.resize(n, FieldT::zero());
251251

252-
const size_t poly_dimension = log2(poly_coeffs.size());
252+
const size_t poly_dimension = libff::log2(poly_coeffs.size());
253253
const size_t poly_size = poly_coeffs.size();
254254
/** When the polynomial is of size k*|coset|, for k < 2^i,
255255
* the first i iterations of Cooley Tukey are easily predictable.
@@ -318,7 +318,7 @@ std::vector<FieldT> multiplicative_FFT_degree_aware(const std::vector<FieldT> &p
318318

319319
template<typename FieldT>
320320
std::vector<FieldT> multiplicative_FFT_internal(
321-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> &poly_coeffs,
321+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> &poly_coeffs,
322322
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
323323
{
324324
assert(poly_coeffs.size() <= domain.num_elements());
@@ -327,7 +327,7 @@ std::vector<FieldT> multiplicative_FFT_internal(
327327

328328
template<typename FieldT>
329329
std::vector<FieldT> multiplicative_FFT_internal(
330-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> &poly_coeffs,
330+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> &poly_coeffs,
331331
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
332332
{
333333
throw std::invalid_argument("attempting to perform multiplicative IFFT with non-multiplicative field type");
@@ -342,7 +342,7 @@ std::vector<FieldT> multiplicative_FFT(const std::vector<FieldT> &poly_coeffs,
342342

343343
template<typename FieldT>
344344
std::vector<FieldT> multiplicative_IFFT_internal(
345-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> &evals,
345+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> &evals,
346346
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
347347
{
348348
assert(domain.num_elements() == evals.size());
@@ -362,7 +362,7 @@ std::vector<FieldT> multiplicative_IFFT_internal(
362362

363363
template<typename FieldT>
364364
std::vector<FieldT> multiplicative_IFFT_internal(
365-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> &evals,
365+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> &evals,
366366
const multiplicative_subgroup_base<FieldT> &domain, const FieldT shift)
367367
{
368368
throw std::invalid_argument("attempting to perform multiplicative IFFT with non-multiplicative field type");
@@ -379,62 +379,62 @@ template<typename FieldT>
379379
std::vector<FieldT> multiplicative_FFT_wrapper(const std::vector<FieldT> &v,
380380
const multiplicative_coset<FieldT> &H)
381381
{
382-
enter_block("Call to multiplicative_FFT_wrapper");
383-
print_indent(); printf("* Vector size: %zu\n", v.size());
384-
print_indent(); printf("* Subgroup size: %zu\n", H.num_elements());
382+
libff::enter_block("Call to multiplicative_FFT_wrapper");
383+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
384+
libff::print_indent(); printf("* Subgroup size: %zu\n", H.num_elements());
385385
const std::vector<FieldT> result = multiplicative_FFT(v, H);
386-
leave_block("Call to multiplicative_FFT_wrapper");
386+
libff::leave_block("Call to multiplicative_FFT_wrapper");
387387
return result;
388388
}
389389

390390
template<typename FieldT>
391391
std::vector<FieldT> multiplicative_IFFT_wrapper(const std::vector<FieldT> &v,
392392
const multiplicative_coset<FieldT> &H)
393393
{
394-
enter_block("Call to multiplicative_IFFT_wrapper");
395-
print_indent(); printf("* Vector size: %zu\n", v.size());
396-
print_indent(); printf("* Coset size: %zu\n", H.num_elements());
394+
libff::enter_block("Call to multiplicative_IFFT_wrapper");
395+
libff::print_indent(); printf("* Vector size: %zu\n", v.size());
396+
libff::print_indent(); printf("* Coset size: %zu\n", H.num_elements());
397397
if (v.size() == 1)
398398
{
399-
leave_block("Call to multiplicative_IFFT_wrapper");
399+
libff::leave_block("Call to multiplicative_IFFT_wrapper");
400400
return {v[0]};
401401
}
402402
const std::vector<FieldT> result = multiplicative_IFFT(v, H);
403-
leave_block("Call to multiplicative_IFFT_wrapper");
403+
libff::leave_block("Call to multiplicative_IFFT_wrapper");
404404
return result;
405405
}
406406

407407
template<typename FieldT>
408-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
408+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> coeffs,
409409
field_subset<FieldT> domain)
410410
{
411411
return multiplicative_FFT_wrapper<FieldT>(coeffs, domain.coset());
412412
}
413413

414414
template<typename FieldT>
415-
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> coeffs,
415+
std::vector<FieldT> FFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> coeffs,
416416
field_subset<FieldT> domain)
417417
{
418418
return additive_FFT_wrapper<FieldT>(coeffs, domain.subspace());
419419
}
420420

421421
template<typename FieldT>
422-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
422+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
423423
field_subset<FieldT> domain)
424424
{
425425
return multiplicative_IFFT_wrapper<FieldT>(evals, domain.coset());
426426
}
427427

428428
template<typename FieldT>
429-
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
429+
std::vector<FieldT> IFFT_over_field_subset(const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
430430
field_subset<FieldT> domain)
431431
{
432432
return additive_IFFT_wrapper<FieldT>(evals, domain.subspace());
433433
}
434434

435435
template<typename FieldT>
436436
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
437-
const std::vector<typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type> evals,
437+
const std::vector<typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type> evals,
438438
size_t degree,
439439
field_subset<FieldT> domain)
440440
{
@@ -443,7 +443,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
443443
* The evaluations in this coset are every nth element of the evaluations
444444
* over the entire domain, where n = |domain| / |degree|
445445
*/
446-
const size_t closest_power_of_two = round_to_next_power_of_2(degree);
446+
const size_t closest_power_of_two = libff::round_to_next_power_of_2(degree);
447447
field_subset<FieldT> minimal_coset = domain.get_subset_of_order(closest_power_of_two);
448448
std::vector<FieldT> evals_in_minimal_coset;
449449
evals_in_minimal_coset.reserve(closest_power_of_two);
@@ -457,7 +457,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
457457

458458
template<typename FieldT>
459459
std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
460-
const std::vector<typename enable_if<is_additive<FieldT>::value, FieldT>::type> evals,
460+
const std::vector<typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type> evals,
461461
size_t degree,
462462
field_subset<FieldT> domain)
463463
{
@@ -466,7 +466,7 @@ std::vector<FieldT> IFFT_of_known_degree_over_field_subset(
466466
* therefore the evaluations are the first elements of the evaluations
467467
* over the entire domain.
468468
*/
469-
const size_t closest_power_of_two = round_to_next_power_of_2(degree);
469+
const size_t closest_power_of_two = libff::round_to_next_power_of_2(degree);
470470
field_subset<FieldT> minimal_subspace = domain.get_subset_of_order(closest_power_of_two);
471471
std::vector<FieldT> evals_in_minimal_subspace;
472472
evals_in_minimal_subspace.insert(

libiop/algebra/field_subset/basis_utils.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
#include <cstddef>
1212
#include <vector>
13-
#include "libiop/algebra/field_utils.hpp"
13+
#include <libff/algebra/field_utils/field_utils.hpp>
1414
#include "libiop/algebra/polynomials/polynomial.hpp"
1515

1616
namespace libiop {

libiop/algebra/field_subset/field_subset.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ class field_subset {
7171
bool operator!=(const field_subset<FieldT> &other) const;
7272
protected:
7373
void construct_internal(const std::size_t num_elements,
74-
const typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type coset_shift);
74+
const typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type coset_shift);
7575
void construct_internal(const std::size_t num_elements,
76-
const typename enable_if<is_additive<FieldT>::value, FieldT>::type coset_shift);
76+
const typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type coset_shift);
7777
};
7878

7979
} // namespace libiop

libiop/algebra/field_subset/field_subset.tcc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ namespace libiop {
33
template<typename FieldT>
44
field_subset<FieldT>::field_subset(const std::size_t num_elements)
55
{
6-
if (is_multiplicative<FieldT>::value) {
6+
if (libff::is_multiplicative<FieldT>::value) {
77
this->construct_internal(num_elements, FieldT::one());
88
} else {
99
this->construct_internal(num_elements, FieldT::zero());
@@ -31,7 +31,7 @@ field_subset<FieldT>::field_subset(const multiplicative_coset<FieldT> coset) :
3131

3232
template<typename FieldT>
3333
void field_subset<FieldT>::construct_internal(const std::size_t num_elements,
34-
const typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type coset_shift)
34+
const typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type coset_shift)
3535
{
3636
if (coset_shift == FieldT::zero()) {
3737
throw std::invalid_argument("coset_shift was supplied as 0, it was likely intended to be 1");
@@ -43,10 +43,10 @@ void field_subset<FieldT>::construct_internal(const std::size_t num_elements,
4343

4444
template<typename FieldT>
4545
void field_subset<FieldT>::construct_internal(const std::size_t num_elements,
46-
const typename enable_if<is_additive<FieldT>::value, FieldT>::type coset_shift)
46+
const typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type coset_shift)
4747
{
48-
assert(is_power_of_2(num_elements));
49-
const std::size_t dimension = log2(num_elements);
48+
assert(libff::is_power_of_2(num_elements));
49+
const std::size_t dimension = libff::log2(num_elements);
5050

5151
if (coset_shift != FieldT(0))
5252
{
@@ -221,7 +221,7 @@ field_subset<FieldT> field_subset<FieldT>::get_subset_of_order(const std::size_t
221221
{
222222
case affine_subspace_type:
223223
{
224-
const std::size_t subset_dim = log2(order);
224+
const std::size_t subset_dim = libff::log2(order);
225225
std::vector<FieldT> input_subspace_basis = this->subspace_->basis();
226226
input_subspace_basis.resize(subset_dim);
227227
return field_subset<FieldT>(

libiop/algebra/field_subset/subgroup.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <libfqfft/evaluation_domain/get_evaluation_domain.hpp>
1515
#include <libfqfft/evaluation_domain/domains/basic_radix2_domain.hpp>
1616

17-
#include "libiop/algebra/field_utils.hpp"
17+
#include <libff/algebra/field_utils/field_utils.hpp>
1818

1919
namespace libiop {
2020

@@ -61,9 +61,9 @@ class multiplicative_subgroup_base {
6161
bool operator!=(const multiplicative_subgroup_base<FieldT> &other) const;
6262

6363
protected:
64-
void construct_internal(typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type order,
64+
void construct_internal(typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type order,
6565
const FieldT generator = FieldT::zero());
66-
void construct_internal(typename enable_if<is_additive<FieldT>::value, FieldT>::type order,
66+
void construct_internal(typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type order,
6767
const FieldT generator = FieldT::zero());
6868
};
6969

libiop/algebra/field_subset/subgroup.tcc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ multiplicative_subgroup_base<FieldT>::multiplicative_subgroup_base(size_t order,
3232

3333
template<typename FieldT>
3434
void multiplicative_subgroup_base<FieldT>::construct_internal(
35-
typename enable_if<is_multiplicative<FieldT>::value, FieldT>::type order, const FieldT generator)
35+
typename libff::enable_if<libff::is_multiplicative<FieldT>::value, FieldT>::type order, const FieldT generator)
3636
{
3737
FieldT F_order = FieldT(FieldT::mod) - 1;
3838
// In debug mode, check that subgroup order divides the order of the field.
@@ -68,15 +68,15 @@ void multiplicative_subgroup_base<FieldT>::construct_internal(
6868
this->fft_cache_ = std::make_shared<std::vector<FieldT> >();
6969
this->order_ = order.as_ulong();
7070

71-
if (is_power_of_2(this->order_) && this->order_ > 1)
71+
if (libff::is_power_of_2(this->order_) && this->order_ > 1)
7272
{
7373
this->FFT_eval_domain_ = std::make_shared<libfqfft::basic_radix2_domain<FieldT>>(this->order_);
7474
}
7575
}
7676

7777
template<typename FieldT>
7878
void multiplicative_subgroup_base<FieldT>::construct_internal(
79-
typename enable_if<is_additive<FieldT>::value, FieldT>::type order, const FieldT generator)
79+
typename libff::enable_if<libff::is_additive<FieldT>::value, FieldT>::type order, const FieldT generator)
8080
{
8181
throw std::invalid_argument("cannot create multiplicative subgroup of this field type");
8282
}
@@ -100,9 +100,9 @@ std::size_t multiplicative_subgroup_base<FieldT>::dimension() const
100100

101101
/* dimension for a subgroup is only defined when the number of elements
102102
is a power of 2 */
103-
assert(is_power_of_2(num_elems));
103+
assert(libff::is_power_of_2(num_elems));
104104

105-
return log2(num_elems);
105+
return libff::log2(num_elems);
106106
}
107107

108108
template<typename FieldT>
@@ -199,7 +199,7 @@ std::size_t multiplicative_subgroup_base<FieldT>::position_by_coset_indices(
199199
template<typename FieldT>
200200
libfqfft::basic_radix2_domain<FieldT> multiplicative_subgroup_base<FieldT>::FFT_eval_domain() const
201201
{
202-
assert(is_power_of_2(this->order_));
202+
assert(libff::is_power_of_2(this->order_));
203203
return *(this->FFT_eval_domain_);
204204
}
205205

libiop/algebra/field_subset/subspace.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
#include <cstddef>
1212
#include <vector>
13-
#include "libiop/algebra/field_utils.hpp"
13+
#include <libff/algebra/field_utils/field_utils.hpp>
1414

1515
namespace libiop {
1616

0 commit comments

Comments
 (0)