37class BitAdderAux<
Logic, N, false> {
39 using Field =
typename Logic::Field;
41 using EltW =
typename Logic::EltW;
43 using BV =
typename Logic::template bitvec<N>;
46 explicit BitAdderAux(
const Logic& l) : l_(l) {}
48 EltW as_field_element(
const BV& v)
const {
50 constexpr uint64_t uno = 1;
51 EltW r = L.konst(L.zero());
52 for (
size_t i = 0; i < N; ++i) {
53 auto vi = L.eval(v[i]);
54 r = L.axpy(&r, L.elt(uno << i), vi);
59 EltW add(
const EltW* a,
const EltW& b)
const {
return l_.add(a, b); }
60 EltW add(
const BV& a,
const BV& b)
const {
61 auto a_fe = as_field_element(a);
62 auto b_fe = as_field_element(b);
63 return add(&a_fe, b_fe);
65 EltW add(
const std::vector<BV>& a)
const {
66 return l_.add(0, a.size(),
67 [&](
size_t i) { return as_field_element(a[i]); });
71 void assert_eqmod(
const BV& a,
const EltW& b,
size_t k)
const {
73 constexpr uint64_t uno = 1;
74 EltW z = L.sub(&b, as_field_element(a));
75 EltW zz = L.mul(0, k, [&](
size_t i) {
76 return L.sub(&z, L.konst((uno << N) * i));
84class BitAdderAux<
Logic, N, true> {
86 using Field =
typename Logic::Field;
88 using EltW =
typename Logic::EltW;
90 using BV =
typename Logic::template bitvec<N>;
93 explicit BitAdderAux(
const Logic& l) : l_(l) {
95 const Field& F = l_.f_;
100 for (
size_t i = 0; i < N; ++i) {
101 alpha_2_i_[i] = alpha;
102 alpha = L.mulf(alpha, alpha);
107 EltW as_field_element(
const BV& v)
const {
109 return L.mul(0, N, [&](
size_t i) {
110 auto a2i = L.konst(alpha_2_i_[i]);
111 return L.mux(&v[i], &a2i, L.konst(L.one()));
115 EltW add(
const EltW* a,
const EltW& b)
const {
return l_.mul(a, b); }
116 EltW add(
const BV& a,
const BV& b)
const {
117 auto a_fe = as_field_element(a);
118 auto b_fe = as_field_element(b);
119 return add(&a_fe, b_fe);
121 EltW add(
const std::vector<BV>& a)
const {
122 return l_.mul(0, a.size(),
123 [&](
size_t i) { return as_field_element(a[i]); });
127 void assert_eqmod(
const BV& a,
const EltW& b,
size_t k)
const {
129 const Field& F = l_.f_;
131 std::vector<Elt> p(k);
133 for (
size_t i = 1; i < k; ++i) {
134 p[i] = F.mulf(alpha_2_N_, p[i - 1]);
136 EltW aa = as_field_element(a);
137 EltW prod = L.mul(0, k, [&](
size_t i) {
138 auto pi = L.konst(p[i]);
139 return L.sub(&b, L.mul(&pi, aa));
145 Elt alpha_2_i_[N + 1];