47 explicit Dense(corner_t n0, corner_t n1) : n0_(n0), n1_(n1), v_(n0 * n1) {}
50 explicit Dense(
const Field& F) : n0_(1), n1_(1), v_(1) { v_[0] = F.zero(); }
53 explicit Dense(corner_t n0, corner_t n1,
const Elt p[],
size_t ldp)
54 : n0_(n0), n1_(n1), v_(n0 * n1) {
55 for (corner_t i1 = 0; i1 < n1; ++i1) {
56 Blas<Field>::copy(n0, v_[i1 * n0], 1, &p[i1 * ldp], 1);
60 Dense(
const Dense& y) =
delete;
61 Dense(
const Dense&& y) =
delete;
62 Dense operator=(
const Dense& y) =
delete;
64 std::unique_ptr<Dense> clone()
const {
65 auto d = std::make_unique<Dense>(n0_, n1_);
66 for (corner_t i = 0; i < n0_ * n1_; ++i) {
72 void clear(
const Field& F) { Blas<Field>::clear(n0_ * n1_, &v_[0], 1, F); }
78 void bind(
const Elt& r,
const Field& F) {
79 corner_t rd = 0, wr = 0;
80 for (corner_t i1 = 0; i1 < n1_; ++i1) {
82 while (2 * i0 + 1 < n0_) {
83 v_[wr] = affine_interpolation(r, v_[rd], v_[rd + 1], F);
84 i0++, rd += 2, wr += 1;
87 v_[wr] = affine_interpolation(r, v_[rd], F.zero(), F);
91 n0_ = (n0_ + 1u) / 2u;
94 void bind_all(
size_t logv,
const Elt r[],
const Field& F) {
95 for (
size_t v = 0; v < logv; ++v) {
100 Elt at(corner_t j)
const {
return v_[j]; }
105 void scale(
const Elt& x,
const Elt& x_last,
const Field& F) {
107 for (corner_t i1 = 0; i1 < n1_; ++i1) {
109 for (; i0 + 1 < n0_; ++i0) {
113 F.mul(v_[ndx++], x_last);
118 Elt at_corners(corner_t p0, corner_t p1,
const Field& F)
const {
120 return v_[p1 * n0_ + p0];
126 T2 t2_at_corners(corner_t p0, corner_t p1,
const Field& F)
const {
127 return T2{at_corners(p0, p1, F), at_corners(p0 + 1, p1, F)};
132 void reshape(corner_t n0) {
133 check(n0_ == 1,
"n0_ == 1");
134 check(n0 > 0,
"n0 > 0");
135 corner_t wasn1 = n1_;
138 check(n1_ * n0 == wasn1,
"n1_*n0 == wasn1");
144 check(n0_ == 1,
"n0_ == 1");
145 check(n1_ == 1,
"n1_ == 1");