26 #ifndef CRYPTO3_MATH_POLYNOMIAL_BASIC_OPERATIONS_HPP
27 #define CRYPTO3_MATH_POLYNOMIAL_BASIC_OPERATIONS_HPP
42 template<
typename Range>
47 [](
typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type i) {
49 typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type();
53 template<
typename Range>
64 template<
typename Range>
66 while (std::distance(std::cbegin(a), std::cend(a)) > 1 &&
68 typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type()) {
77 template<
typename Range>
78 void addition(Range &c,
const Range &a,
const Range &b) {
81 typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type value_type;
88 std::size_t a_size = std::distance(std::begin(a), std::end(a));
89 std::size_t b_size = std::distance(std::begin(b), std::end(b));
91 if (a_size > b_size) {
94 std::begin(b), std::end(b), std::begin(a), std::begin(c), std::plus<value_type>());
95 std::copy(std::begin(a) + b_size, std::end(a), std::begin(c) + b_size);
99 std::begin(a), std::end(a), std::begin(b), std::begin(c), std::plus<value_type>());
100 std::copy(std::begin(b) + a_size, std::end(b), std::begin(c) + a_size);
111 template<
typename Range>
115 typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type value_type;
121 std::transform(b.begin(), b.end(), c.begin(), std::negate<value_type>());
123 std::size_t a_size = a.size();
124 std::size_t b_size = b.size();
126 if (a_size > b_size) {
128 std::transform(a.begin(), a.begin() + b_size, b.begin(), c.begin(), std::minus<value_type>());
129 std::copy(a.begin() + b_size, a.end(), c.begin() + b_size);
132 std::transform(a.begin(), a.end(), b.begin(), c.begin(), std::minus<value_type>());
133 std::transform(b.begin() + a_size, b.end(), c.begin() + a_size, std::negate<value_type>());
144 template<
typename Range>
148 typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type value_type;
150 typedef typename value_type::field_type FieldType;
152 BOOST_STATIC_ASSERT(std::is_same<typename FieldType::value_type, value_type>::value);
155 value_type omega = unity_root<FieldType>(n);
159 u.resize(n, value_type::zero());
160 v.resize(n, value_type::zero());
161 c.resize(n, value_type::zero());
164 detail::basic_parallel_radix2_fft<FieldType>(u, omega);
165 detail::basic_parallel_radix2_fft<FieldType>(v, omega);
167 detail::basic_serial_radix2_fft<FieldType>(u, omega);
168 detail::basic_serial_radix2_fft<FieldType>(v, omega);
171 std::transform(u.begin(), u.end(), v.begin(), c.begin(), std::multiplies<value_type>());
174 detail::basic_parallel_radix2_fft<FieldType>(c, omega.inversed());
176 detail::basic_serial_radix2_fft<FieldType>(c, omega.inversed());
179 const value_type sconst = value_type(n).inversed();
183 std::bind(std::multiplies<value_type>(), sconst, std::placeholders::_1));
191 template<
typename Range>
201 template<
typename Range>
205 typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type value_type;
207 const std::size_t m = a.size();
217 for (std::size_t i = m - 1; i < n + m; i++) {
218 result.emplace_back(r[i]);
228 template<
typename Range>
229 void division(Range &q, Range &r,
const Range &a,
const Range &b) {
232 typename std::iterator_traits<decltype(std::begin(std::declval<Range>()))>::value_type value_type;
234 std::size_t d = b.size() - 1;
235 value_type c = b.back().inversed();
238 q = Range(r.size(), value_type::zero());
240 std::size_t r_deg = r.size() - 1;
243 while (r_deg >= d && !
is_zero(r)) {
249 value_type lead_coeff = r.back() * c;
251 q[shift] += lead_coeff;
253 if (b.size() + shift + 1 > r.size())
254 r.resize(b.size() + shift + 1);
255 auto glambda = [=](value_type x, value_type y) {
return y - (x * lead_coeff); };
256 std::transform(b.begin(), b.end(), r.begin() + shift, r.begin() + shift, glambda);
259 r_deg = r.size() - 1;
decoded_range< UnaryFunction, SinglePassRange > transform(SinglePassRange &rng, UnaryFunction fn)
Definition: decrypted.hpp:100
constexpr std::size_t power_of_two(std::size_t n)
Definition: field_utils.hpp:51
void fft_multiplication(Range &c, const Range &a, const Range &b)
Definition: basic_operations.hpp:145
void addition(Range &c, const Range &a, const Range &b)
Definition: basic_operations.hpp:78
void multiplication(Range &c, const Range &a, const Range &b)
Definition: basic_operations.hpp:192
void condense(Range &a)
Definition: basic_operations.hpp:65
bool is_zero(const Range &a)
Definition: basic_operations.hpp:43
Range transpose_multiplication(const std::size_t &n, const Range &a, const Range &c)
Definition: basic_operations.hpp:202
void subtraction(Range &c, const Range &a, const Range &b)
Definition: basic_operations.hpp:112
void reverse(Range &a, std::size_t n)
Definition: basic_operations.hpp:54
void division(Range &q, Range &r, const Range &a, const Range &b)
Definition: basic_operations.hpp:229
Definition: algebra/include/nil/crypto3/algebra/type_traits.hpp:95