00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <lacunaryx/linear_factors_bivariate.hpp>
00022 #include <multimix/multivariate.hpp>
00023 #include <lacunaryx/lpolynomial.hpp>
00024
00025 namespace mmx {
00026
00027 #define Monomial monomial< vector<E> >
00028 #define Sparse_polynomial sparse_polynomial<C, Monomial, V>
00029 #define Sparse_factor irreducible_factor<Sparse_polynomial>
00030 #define Sparse_factors vector<Sparse_factor>
00031
00032 template<typename E, typename C, typename V>
00033 Sparse_factors
00034 linear_factors (const Sparse_polynomial &p) {
00035 nat d= dim(p);
00036 if (d == 1) return linear_factors_univariate (p);
00037 if (d == 2) return linear_factors_bivariate (p);
00038 else return linear_factors_bivariate (p);
00039 }
00040
00041
00042 template<typename E, typename C, typename V>
00043 vector<generic>
00044 linear_factors (const multivariate<Sparse_polynomial> &p) {
00045 vector<generic> ret;
00046 Sparse_factors factors= linear_factors (p.rep);
00047 for (nat i=0; i<N(factors); i++) {
00048 multivariate<Sparse_polynomial> pol (p.coords, factors[i].f);
00049 ret << as<generic> (vec (as<generic> (pol), as<generic> (as<integer> (factors[i].m)) ) );
00050 }
00051 return ret;
00052 }
00053
00054
00055 template<typename E, typename C, typename W>
00056 vector<generic> linear_factors ( const lpolynomial<C,E,W> &lp ){
00057 typedef typename Sparse_polynomial_variant(C) V;
00058
00059 vector<E> w (entries (*lp));
00060 vector<C> c;
00061 vector<Monomial> m;
00062 for (nat i= 0; i < N(w); i++)
00063 if (lp[w[i]] != 0) {
00064 c << lp[w[i]];
00065 m << Monomial (vec(w[i]));
00066 }
00067 Sparse_polynomial p (c, m, 1);
00068
00069
00070 Sparse_factors factors= linear_factors_univariate (p);
00071 vector<generic> ret;
00072 for (nat i=0; i<N(factors); i++) {
00073 table<C,E> tfactor;
00074 for (nat j=0; j<N(factors[i].f); j++)
00075 tfactor[ deg( get_monomial(factors[i].f,j) ) ]= get_coefficient(factors[i].f,j);
00076 lpolynomial<C,E,W> f (tfactor);
00077 ret << as<generic> (vec (as<generic> (f), as<generic> (as<integer> (factors[i].m))));
00078 }
00079 return ret;
00080 }
00081
00082 #undef Monomial
00083 #undef Sparse_polynomial
00084 #undef Sparse_factor
00085 #undef Sparse_factors
00086
00087 }