algebramix_doc 0.3
|
#include <root_modular.hpp>
Definition at line 31 of file root_modular.hpp.
static Polynomial degree_one_factorization | ( | const Polynomial & | f, |
const integer & | p | ||
) | [inline, static] |
Definition at line 43 of file root_modular.hpp.
References mmx::C, mmx::gcd(), Polynomial, and root_modular_naive::pow_mod().
Referenced by root_modular_naive::roots().
{ // return the product of the linear factors Polynomial x (C(1), 1); Polynomial g= pow_mod (x, p, f) - x; return gcd (g, f); }
static vector<Polynomial> linear_factorization | ( | const Polynomial & | f, |
const integer & | p | ||
) | [inline, static] |
Definition at line 71 of file root_modular.hpp.
References mmx::deg(), root_modular_naive::linear_splitting(), and Polynomial.
Referenced by root_modular_naive::roots().
{ VERIFY (f != 0, "bug"); list<Polynomial> todo (f); vector<Polynomial> factors= vec<Polynomial> (); if (deg (f) <= 0) return factors; while (!is_nil (todo)) { Polynomial h= car(todo), g; todo= cdr(todo); linear_splitting (g, h, p); if ((nat) deg (g) == 1) factors << g; else todo= cons (g, todo); if (deg (g) != deg (h)) todo= cons (h / g, todo); } return factors; }
static void linear_splitting | ( | Polynomial & | g, |
const Polynomial & | f, | ||
const integer & | p | ||
) | [inline, static] |
Definition at line 51 of file root_modular.hpp.
References mmx::C, mmx::deg(), mmx::gcd(), Polynomial, and root_modular_naive::pow_mod().
Referenced by root_modular_naive::linear_factorization().
{ VERIFY (f != 0, "bug"); nat n= deg (f); g= f; if (n == 1) return; Polynomial x (C(1), 1); nat counter= 0; while (deg (g) <= 0 || (nat) deg (g) == n) { vector<C> _a (C (0), n); for (nat i= 0; i < n; i++) _a[i]= C(rand ()); // TODO << improve Polynomial a (_a), b; g= gcd (a, f); if (deg (g) > 0) return; g= p == 2 ? gcd (a - 1, f) : gcd (pow_mod (a, (p-1) / 2, f) - 1, f); counter++; } //mmout << "Number of equal degree splitting failures: " << counter << "\n"; ASSERT (deg (g) > 0 && (nat) deg (g) < n, "cannot find a linear factor"); }
static Polynomial pow_mod | ( | const Polynomial & | a, |
const integer & | n, | ||
const Polynomial & | f | ||
) | [inline, static] |
Definition at line 34 of file root_modular.hpp.
References Modular_polynomial, Modulus_polynomial, and Polynomial.
Referenced by root_modular_naive::degree_one_factorization(), and root_modular_naive::linear_splitting().
{ Modulus_polynomial _f= Modular_polynomial::get_modulus (); Modular_polynomial::set_modulus (f); Polynomial g= * binpow (Modular_polynomial (a), n); Modular_polynomial::set_modulus (_f); return g; }
static vector< typename scalar_type_helper<Polynomial>::val > roots | ( | const Polynomial & | f, |
const integer & | p | ||
) | [inline, static] |
Definition at line 86 of file root_modular.hpp.
References mmx::C, mmx::deg(), root_modular_naive::degree_one_factorization(), root_modular_naive::linear_factorization(), mmx::N(), and Polynomial.
Referenced by mmx::separable_roots().
{ if (deg (f) <= 0) { return vector<C> (); } //mmout << f << "\n"; Polynomial g= degree_one_factorization (f, p); //mmout << g << "\n"; vector<Polynomial> lin_facts= linear_factorization (g, p); vector<C> b (C(), N(lin_facts)); for (nat i= 0; i < N(lin_facts); i++) b[i]= - lin_facts[i][0] / lin_facts[i][1]; return b; }