|
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; }