20 #include <factory/factory.h> 34 #define TRANSEXT_PRIVATES 121 else if ( r->cf->extRing!=
NULL )
125 if (r->cf->extRing->qideal!=
NULL)
205 else if ( r->cf->extRing )
209 if (r->cf->extRing->qideal!=
NULL)
294 if (f==
NULL)
return g;
323 WerrorS(
"3rd argument must be a ring variable");
324 goto resultant_returns_res;
327 goto resultant_returns_res;
337 goto resultant_returns_res;
340 else if (r->cf->extRing!=
NULL)
345 if (r->cf->extRing->qideal!=
NULL)
390 goto resultant_returns_res;
394 resultant_returns_res:
487 else if ( r->cf->extRing!=
NULL )
492 if (r->cf->extRing->qideal!=
NULL)
564 else if (r->cf->extRing!=
NULL)
568 if (r->cf->extRing->qideal!=
NULL)
584 #if 0 // not yet working 589 CanonicalForm F( convSingGFFactoryGF( f ) ),
G( convSingGFFactoryGF( g ) );
590 res = convFactoryGFSingGF( F / G );
628 int sz1=
n_Size(g1, r->cf);
629 int sz2=
n_Size(g2, r->cf);
662 while ( (p !=
NULL) && (g != 1) && ( g != 0))
671 if (( g == 1 ) || (g == 0))
703 #ifdef FACTORIZE2_DEBUG 715 else if (r->cf->extRing!=
NULL)
717 if (r->cf->extRing->qideal!=
NULL)
748 else if (r->cf->extRing!=
NULL)
750 if (r->cf->extRing->qideal!=
NULL)
766 if (r->cf->extRing!=
NULL)
767 if (r->cf->extRing->qideal!=
NULL)
777 if (v!=
NULL) (*v)[
j]=e;
788 #ifdef FACTORIZE2_DEBUG 789 printf(
"singclap_factorize, degree %ld\n",
p_Totaldegree(f,r));
816 if (with_exps==0) n++;
839 for(i=
rVar(r);i>0;i--)
849 if (with_exps!=1) (**v)[n]=e;
911 else if (r->cf->extRing!=
NULL)
915 if (r->cf->extRing->qideal!=
NULL)
944 if ( ! L.
getFirst().factor().inCoeffDomain() )
953 if ((with_exps==2)&&(n>1))
961 for ( ; J.
hasItem(); J++, j++ )
963 if (with_exps!=1) (**v)[
j] = J.
getItem().exp();
971 res->m[j] = convFactoryGFSingGF( J.
getItem().factor() );
973 else if (r->cf->extRing!=
NULL)
979 if (r->cf->extRing->qideal==
NULL)
1007 if (r->cf->extRing!=
NULL)
1008 if (r->cf->extRing->qideal!=
NULL)
1017 #ifdef FACTORIZE2_DEBUG 1018 printf(
"factorize_retry\n");
1024 int l=(*v)->length();
1025 (*v)->resize(l+ww->
length());
1026 for(jj=0;jj<ww->
length();jj++)
1027 (**v)[jj+
l]=(*ww)[jj];
1030 for(jj=
IDELEMS(res)-1;jj>=0;jj--)
1032 hh->m[jj]=res->m[jj];
1035 for(jj=
IDELEMS(h)-1;jj>=0;jj--)
1037 hh->m[jj+
IDELEMS(res)]=h->m[jj];
1048 WarnS(
"problem with factorize");
1056 res->m[1]=ff; ff=
NULL;
1074 if ((res->m[i]!=
NULL)
1087 while ((v!=
NULL) && ((*v)!=
NULL) && ((**v)[i]>1))
1092 res->m[0]=
p_Mult_q(res->m[0],res->m[i],r);
1112 (**v)[
j]=(*w)[
i]; j++;
1118 if (res->m[0]==
NULL)
1128 if (with_exps!=0) stop=0;
1133 if (with_exps==0)
p_SetCoeff(res->m[0],old_lead_coeff,r);
1134 else n_Delete(&old_lead_coeff,r->cf);
1158 #ifdef FACTORIZE2_DEBUG 1159 printf(
"singclap_sqrfree, degree %d\n",
pTotaldegree(f));
1172 if (with_exps!=1 && with_exps!=3)
1186 if (with_exps==0 || with_exps==3) n++;
1213 for(i=
rVar(r);i>0;i--)
1223 if (with_exps!=1) (**v)[n]=e;
1244 if (with_exps==0 || with_exps==3)
1251 if (with_exps==0 || with_exps==3)
1263 if (with_exps==0 || with_exps==3)
1269 if (with_exps==0 || with_exps==3)
1282 else if (r->cf->extRing!=
NULL)
1286 if (r->cf->extRing->qideal!=
NULL)
1328 if ((with_exps==2)&&(n>1))
1335 else if (L.
getFirst().factor().inCoeffDomain() && with_exps!=3)
1341 for ( ; J.
hasItem(); J++, j++ )
1343 if (with_exps!=1 && with_exps!=3) (**v)[
j] = J.
getItem().exp();
1346 else if (r->cf->extRing!=
NULL)
1348 if (r->cf->extRing->qideal==
NULL)
1354 if (res->m[0]==
NULL)
1365 if (r->cf->extRing!=
NULL)
1366 if (r->cf->extRing->qideal!=
NULL)
1372 if (with_exps!=0 || with_exps==3) stop=0;
1377 if (with_exps==0 || with_exps==3)
p_SetCoeff(res->m[0],old_lead_coeff,r);
1378 else n_Delete(&old_lead_coeff,r->cf);
1455 for ( LLi = LL; LLi.
hasItem(); LLi++ )
1459 if ((m!=0) && (n!=0))
break;
1461 if (tries>=5)
break;
1463 if ((m==0) || (n==0))
1465 Warn(
"char_series returns %d x %d matrix from %d input polys (%d)",
1473 for ( m=1, LLi = LL; LLi.
hasItem(); LLi++, m++ )
1534 int cnt=
rVar(r)+offs;
1555 for(i=0;i<
rVar(r)+offs;i++)
1575 if (s[strlen(s)-1]==
',') s[strlen(s)-1]=
'\0';
1609 for(i=m->
rows();i>0;i--)
1611 for(j=m->
cols();j>0;j--)
1626 for(i=m->
rows();i>0;i--)
1628 for(j=m->
cols();j>0;j--)
1818 int n= absFactors.
length();
1832 if (iter.
getItem().factor().inCoeffDomain())
1837 for (; iter.
hasItem(); iter++, i++)
1840 alpha= iter.
getItem().minpoly().mvar();
1841 if (iter.
getItem().minpoly().isOne())
1846 if (iter.
getItem().minpoly().isOne())
1856 if (!iter.
getItem().minpoly().isOne())
1858 numFactors +=
count;
int status int void size_t count
ideal singclap_sqrfree(poly f, intvec **v, int with_exps, const ring r)
static FORCE_INLINE number n_Gcd(number a, number b, const coeffs r)
in Z: return the gcd of 'a' and 'b' in Z/nZ, Z/2^kZ: computed as in the case Z in Z/pZ...
const CanonicalForm int s
poly singclap_gcd_r(poly f, poly g, const ring r)
poly singclap_gcd_and_divide(poly &f, poly &g, const ring r)
clears denominators of f and g, divides by gcd(f,g)
matrix singntl_LLL(matrix m, const ring s)
CanonicalForm convSingAPFactoryAP(poly p, const Variable &a, const ring r)
std::pair< int, int > mark
static BOOLEAN rField_is_Zp_a(const ring r)
CanonicalForm extgcd(const CanonicalForm &f, const CanonicalForm &g, CanonicalForm &a, CanonicalForm &b)
CanonicalForm extgcd ( const CanonicalForm & f, const CanonicalForm & g, CanonicalForm & a...
static int si_min(const int a, const int b)
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
number n_convFactoryNSingN(const CanonicalForm n, const coeffs r)
static int rPar(const ring r)
(r->cf->P)
factory's class for variables
poly p_NSet(number n, const ring r)
returns the poly representing the number n, destroys n
static const int SW_USE_EZGCD_P
set to 1 to use EZGCD over F_q
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
int singclap_det_i(intvec *m, const ring)
static short rVar(const ring r)
#define rVar(r) (r->N)
void id_Delete(ideal *h, ring r)
deletes an ideal/module/matrix
poly singclap_gcd(poly f, poly g, const ring r)
destroys f and g
intvec * ivCopy(const intvec *o)
void singclap_divide_content(poly f, const ring r)
CanonicalForm convSingTrPFactoryP(poly p, const ring r)
poly singclap_resultant(poly f, poly g, poly x, const ring r)
poly convFactoryPSingTrP(const CanonicalForm &f, const ring r)
static BOOLEAN rField_is_Q_a(const ring r)
static long p_Totaldegree(poly p, const ring r)
ListCFList irrCharSeries(const CFList &PS)
irreducible characteristic series
poly singclap_det(const matrix m, const ring s)
void WerrorS(const char *s)
static BOOLEAN rField_is_GF(const ring r)
void out_cf(const char *s1, const CanonicalForm &f, const char *s2)
static BOOLEAN rField_is_Z(const ring r)
void p_Norm(poly p1, const ring r)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy ...
poly singclap_pdivide(poly f, poly g, const ring r)
static number p_SetCoeff(poly p, number n, ring r)
poly p_Sub(poly p1, poly p2, const ring r)
CanonicalForm n_convSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
static poly p_Copy(poly p, const ring r)
returns a copy of p
void prune(Variable &alpha)
void iiWriteMatrix(matrix im, const char *n, int dim, const ring r, int spaces)
set spaces to zero by default
void idShow(const ideal id, const ring lmRing, const ring tailRing, const int debugPrint)
Variable rootOf(const CanonicalForm &, char name='@')
returns a symbolic root of polynomial with name name Use it to define algebraic variables ...
void p_Cleardenom_n(poly ph, const ring r, number &c)
CFMatrix * cf_LLL(CFMatrix &A)
performs LLL reduction.
BOOLEAN count_Factors(ideal I, intvec *v, int j, poly &f, poly fac, const ring r)
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
CFFList factorize(const CanonicalForm &f, bool issqrfree=false)
factorization over or
Coefficient rings, fields and other domains suitable for Singular polynomials.
IntList neworderint(const CFList &PolyList)
int convFactoryISingI(const CanonicalForm &f)
const CanonicalForm CFMap CFMap & N
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent : the integer VarOffset encodes:
bigintmat * bimCopy(const bigintmat *b)
same as copy constructor - apart from it being able to accept NULL as input
static long pTotaldegree(poly p)
static BOOLEAN p_IsConstant(const poly p, const ring r)
The main handler for Singular numbers which are suitable for Singular polynomials.
void StringSetS(const char *st)
static poly pp_Mult_qq(poly p, poly q, const ring r)
void StringAppendS(const char *st)
poly convFactoryPSingP(const CanonicalForm &f, const ring r)
const char feNotImplemented[]
static const int SW_RATIONAL
set to 1 for computations over Q
static FORCE_INLINE number n_Invers(number a, const coeffs r)
return the multiplicative inverse of 'a'; raise an error if 'a' is not invertible ...
static int si_max(const int a, const int b)
static FORCE_INLINE BOOLEAN nCoeff_is_transExt(const coeffs r)
TRUE iff r represents a transcendental extension field.
void PrintS(const char *s)
static poly p_Mult_nn(poly p, number n, const ring r)
matrix singclap_irrCharSeries(ideal I, const ring r)
static BOOLEAN rField_is_Q(const ring r)
matrix singntl_HNF(matrix m, const ring s)
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size
static matrix mp_New(int r, int c)
CanonicalForm bCommonDen(const CanonicalForm &f)
CanonicalForm bCommonDen ( const CanonicalForm & f )
int pGetExp_Var(poly p, int i, const ring r)
CFMatrix * cf_HNF(CFMatrix &A)
The input matrix A is an n x m matrix of rank m (so n >= m), and D is a multiple of the determinant o...
#define BIMATELEM(M, I, J)
static BOOLEAN rField_is_Zp(const ring r)
matrix mpNew(int r, int c)
create a r x c zero-matrix
void p_Write0(poly p, ring lmRing, ring tailRing)
static void p_Delete(poly *p, const ring r)
ideal idInit(int idsize, int rank)
initialise an ideal / module
const Variable & v
< [in] a sqrfree bivariate poly
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent : VarOffset encodes the position in p->exp
int p_IsPurePower(const poly p, const ring r)
return i, if head depends only on var(i)
static BOOLEAN rField_is_Ring(const ring r)
CanonicalForm convSingPFactoryP(poly p, const ring r)
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
static FORCE_INLINE number n_Div(number a, number b, const coeffs r)
return the quotient of 'a' and 'b', i.e., a/b; raises an error if 'b' is not invertible in r exceptio...
coeffs basecoeffs() const
static const int SW_USE_QGCD
set to 1 to use Encarnacion GCD over Q(a)
static BOOLEAN rField_is_Ring_Z(const ring r)
number singclap_det_bi(bigintmat *m, const coeffs cf)
CanonicalForm determinant(const CFMatrix &M, int n)
static BOOLEAN p_IsConstantPoly(const poly p, const ring r)
BOOLEAN singclap_extgcd(poly f, poly g, poly &res, poly &pa, poly &pb, const ring r)
static void p_Setm(poly p, const ring r)
int singclap_factorize_retry
ideal singclap_absFactorize(poly f, ideal &mipos, intvec **exps, int &numFactors, const ring r)
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
void p_wrp(poly p, ring lmRing, ring tailRing)
void p_Write(poly p, ring lmRing, ring tailRing)
ideal singclap_factorize(poly f, intvec **v, int with_exps, const ring r)
poly convFactoryAPSingAP(const CanonicalForm &f, const ring r)
CFAFList absFactorize(const CanonicalForm &G)
absolute factorization of a multivariate poly over Q
static poly p_Add_q(poly p, poly q, const ring r)
char * singclap_neworder(ideal I, const ring r)
static const int SW_SYMMETRIC_FF
set to 1 for symmetric representation over F_q
#define IMATELEM(M, I, J)
CanonicalForm resultant(const CanonicalForm &f, const CanonicalForm &g, const Variable &x)
CanonicalForm resultant ( const CanonicalForm & f, const CanonicalForm & g, const Variable & x ) ...
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
poly p_Cleardenom(poly p, const ring r)
static FORCE_INLINE int n_Size(number n, const coeffs r)
return a non-negative measure for the complexity of n; return 0 only when n represents zero; (used fo...
static poly p_Mult_q(poly p, poly q, const ring r)
CFFList sqrFree(const CanonicalForm &f, bool sort=false)
squarefree factorization
void Werror(const char *fmt,...)
#define MATELEM(mat, i, j)