26 #ifndef CRYPTO3_MATH_BASIS_CHANGE_HPP
27 #define CRYPTO3_MATH_BASIS_CHANGE_HPP
45 template<
typename FieldType>
49 typedef typename FieldType::value_type value_type;
51 if (T.size() != m + 1)
61 T[0] = std::vector<std::vector<value_type>>(1u << m);
62 for (std::size_t j = 0; j < (1u << m); j++) {
63 T[0][j] = std::vector<value_type>(2, value_type::one());
64 T[0][j][0] = value_type(-j);
67 std::vector<value_type> a;
68 std::vector<value_type> b;
70 std::size_t index = 0;
71 for (std::size_t i = 1; i <= m; i++) {
72 T[i] = std::vector<std::vector<value_type>>(1u << (m - i));
73 for (std::size_t j = 0; j < (1u << (m - i)); j++) {
92 template<
typename FieldType>
98 typedef typename FieldType::value_type value_type;
100 std::size_t m = log2(n);
105 std::vector<value_type> I(T[m][0]);
108 std::vector<value_type> mod(n + 1, value_type::zero());
109 mod[n] = value_type::one();
119 std::vector<std::vector<value_type>> c(n);
122 std::size_t row_length;
126 for (std::size_t i = m - 1; i < m; i--) {
127 row_length = T[i].size() - 1;
131 for (std::size_t j = (1u << (m - i - 1)) - 1; j < (1u << (m - i - 1)); j--) {
134 c[2 * j].resize(c_vec);
141 for (std::size_t i = c.size() - 1; i < c.size(); i--) {
152 template<
typename FieldType>
158 typedef typename FieldType::value_type value_type;
160 std::size_t m = log2(n);
164 std::vector<std::vector<value_type>> f(n);
165 for (std::size_t i = 0; i < n; i++) {
166 f[i] = std::vector<value_type>(1, a[i]);
170 std::vector<value_type> temp(1, value_type::zero());
171 for (std::size_t i = 0; i < m; i++) {
172 for (std::size_t j = 0; j < (1u << (m - i - 1)); j++) {
186 template<
typename FieldType,
typename Range1,
typename Range2,
typename Range3>
188 const Range2 &geometric_sequence,
189 const Range3 &geometric_triangular_sequence,
190 const std::size_t &n) {
192 typedef typename FieldType::value_type value_type;
194 std::vector<value_type> u(n, value_type::zero());
195 std::vector<value_type> w(n, value_type::zero());
196 std::vector<value_type> z(n, value_type::zero());
197 std::vector<value_type> f(n, value_type::zero());
198 u[0] = value_type::one();
200 z[0] = value_type::one();
203 for (std::size_t i = 1; i < n; i++) {
204 u[i] = u[i - 1] * geometric_sequence[i] * (value_type::one() - geometric_sequence[i]).inversed();
205 w[i] = a[i] * (u[i].inversed());
206 z[i] = u[i] * geometric_triangular_sequence[i].inversed();
207 f[i] = w[i] * geometric_triangular_sequence[i];
218 #pragma omp parallel for
220 for (std::size_t i = 0; i < n; i++) {
230 template<
typename FieldType,
typename Range1,
typename Range2,
typename Range3>
232 const Range2 &geometric_sequence,
233 const Range3 &geometric_triangular_sequence,
236 typedef typename FieldType::value_type value_type;
238 std::vector<value_type> v(n, value_type::zero());
239 std::vector<value_type> u(n, value_type::zero());
240 std::vector<value_type> w(n, value_type::zero());
241 std::vector<value_type> z(n, value_type::zero());
243 u[0] = value_type::one();
245 z[0] = value_type::one();
247 for (std::size_t i = 1; i < n; i++) {
248 v[i] = a[i] * geometric_triangular_sequence[i];
252 u[i] = u[i - 1] * geometric_sequence[i] * (value_type::one() - geometric_sequence[i]).inversed();
253 w[i] = v[i] * u[i].inversed();
255 z[i] = u[i] * geometric_triangular_sequence[i].inversed();
263 #pragma omp parallel for
265 for (std::size_t i = 0; i < n; i++) {
vector(T, U...) -> vector< std::enable_if_t<(std::is_same_v< T, U > &&...), T >, 1+sizeof...(U)>
deduction guide for uniform initialization
void newton_to_monomial_basis_geometric(Range1 &a, const Range2 &geometric_sequence, const Range3 &geometric_triangular_sequence, std::size_t n)
Definition: basis_change.hpp:231
void addition(Range &c, const Range &a, const Range &b)
Definition: basic_operations.hpp:78
void extended_euclidean(const Range1 &a, const Range2 &b, Range3 &g, Range4 &u, Range5 &v)
Perform the standard Extended Euclidean Division algorithm. Input: Polynomial A, Polynomial B....
Definition: xgcd.hpp:48
void multiplication(Range &c, const Range &a, const Range &b)
Definition: basic_operations.hpp:192
Range transpose_multiplication(const std::size_t &n, const Range &a, const Range &c)
Definition: basic_operations.hpp:202
void monomial_to_newton_basis(std::vector< typename FieldType::value_type > &a, const std::vector< std::vector< std::vector< typename FieldType::value_type >>> &T, size_t n)
Definition: basis_change.hpp:94
void reverse(Range &a, std::size_t n)
Definition: basic_operations.hpp:54
void monomial_to_newton_basis_geometric(Range1 &a, const Range2 &geometric_sequence, const Range3 &geometric_triangular_sequence, const std::size_t &n)
Definition: basis_change.hpp:187
void newton_to_monomial_basis(std::vector< typename FieldType::value_type > &a, const std::vector< std::vector< std::vector< typename FieldType::value_type >>> &T, size_t n)
Definition: basis_change.hpp:154
void compute_subproduct_tree(std::vector< std::vector< std::vector< typename FieldType::value_type >>> &T, std::size_t m)
Definition: basis_change.hpp:46