31 static const size_t kN = N;
38 static void newton_of_lagrange_inplace(PolyN &A,
const PolyN &X,
43 Elt e = F.one(), inve = F.one();
45 for (
size_t i = 1; i < N; i++) {
46 for (
size_t k = N; k-- > i;) {
47 Elt dx = F.subf(X[k], X[k - i]);
52 A[k] = F.mulf(F.subf(A[k], A[k - 1]), inve);
57 static PolyN newton_of_lagrange(
const PolyN &L,
const PolyN &X,
60 newton_of_lagrange_inplace(A, X, F);
65 static Elt eval_newton(PolyN &Newton,
const PolyN &X,
const Elt &x,
69 for (
size_t i = N; i-- > 0;) {
70 e = F.addf(Newton[i], F.mulf(e, F.subf(x, X[i])));
76 static void monomial_of_newton_inplace(PolyN &A,
const PolyN &X,
78 for (
size_t i = N; i-- > 0;) {
79 for (
size_t k = i + 1; k < N; ++k) {
80 A[k - 1] = F.subf(A[k - 1], F.mulf(A[k], X[i]));
85 static PolyN monomial_of_newton(
const PolyN &Newton,
const PolyN &X,
88 monomial_of_newton_inplace(A, X, F);
93 static Elt eval_monomial(PolyN &M,
const Elt &x,
const Field &F) {
96 for (
size_t i = N; i-- > 0;) {
97 e = F.addf(M[i], F.mulf(e, x));
102 static void monomial_of_lagrange_inplace(PolyN &A,
const PolyN &X,
104 newton_of_lagrange_inplace(A, X, F);
105 monomial_of_newton_inplace(A, X, F);
108 static PolyN monomial_of_lagrange(
const PolyN &L,
const PolyN &X,
111 monomial_of_lagrange_inplace(A, X, F);