32class Eqs :
public Dense<Field> {
34 using Dense<Field>::v_;
35 using Dense<Field>::n0_;
38 Eqs(
size_t logn, corner_t n,
const Elt I[],
const Field& F)
39 : Dense<Field>(n, 1) {
40 filleq(&v_[0], logn, n, I, F);
43 corner_t n()
const {
return n0_; }
48 static std::vector<Elt> raw_eq2(
size_t logn, corner_t n,
const Elt* G0,
49 const Elt* G1,
const Elt& alpha,
51 std::vector<Elt> eq0(n);
52 std::vector<Elt> eq1(n);
53 filleq(&eq0[0], logn, n, G0, F);
54 filleq(&eq1[0], logn, n, G1, F);
55 Blas<Field>::axpy(n, &eq0[0], 1, alpha, &eq1[0], 1, F);
69 static corner_t ceilshr(corner_t a,
size_t n) {
return 1u + ((a - 1u) >> n); }
84 static void filleq(Elt* eq,
size_t logn, corner_t n,
const Elt* Q,
86 check(n > 0,
"n > 0");
88 for (
size_t l = logn; l-- > 0;) {
89 corner_t nl = ceilshr(n, l);
90 corner_t i = ceilshr(nl, 1);
95 if ( 2 * i - 1 >= nl) {
97 Elt v = eq[i], qv = Q[l];
100 F.sub(eq[2 * i], qv);
107 Elt v = eq[i], qv = Q[l];
110 F.sub(eq[2 * i], qv);