14 #include "factory/factory.h" 25 #define TRANSEXT_PRIVATES 67 else if ( r->cf->extRing!=
NULL )
71 if (r->cf->extRing->qideal!=
NULL)
182 else if ( r->cf->extRing )
186 if (r->cf->extRing->qideal!=
NULL)
285 WerrorS(
"3rd argument must be a ring variable");
286 goto resultant_returns_res;
289 goto resultant_returns_res;
300 goto resultant_returns_res;
303 else if (r->cf->extRing!=
NULL)
308 if (r->cf->extRing->qideal!=
NULL)
353 goto resultant_returns_res;
357 resultant_returns_res:
451 else if ( r->cf->extRing!=
NULL )
456 if (r->cf->extRing->qideal!=
NULL)
523 else if (r->cf->extRing!=
NULL)
527 if (r->cf->extRing->qideal!=
NULL)
543 #if 0 // not yet working 548 CanonicalForm F( convSingGFFactoryGF( f ) ),
G( convSingGFFactoryGF( g ) );
549 res = convFactoryGFSingGF( F * G );
570 else if (r->cf->extRing!=
NULL)
574 if (r->cf->extRing->qideal!=
NULL)
590 #if 0 // not yet working 595 CanonicalForm F( convSingGFFactoryGF( f ) ),
G( convSingGFFactoryGF( g ) );
596 res = convFactoryGFSingGF( F / G );
617 else if (r->cf->extRing!=
NULL)
621 if (r->cf->extRing->qideal!=
NULL)
637 #if 0 // not yet working 642 CanonicalForm F( convSingGFFactoryGF( f ) ),
G( convSingGFFactoryGF( g ) );
643 res = convFactoryGFSingGF( F / G );
654 void singclap_divide_content ( poly
f,
const ring r )
683 int sz1=
n_Size(g1, r->cf);
684 int sz2=
n_Size(g2, r->cf);
717 while ( (p !=
NULL) && (g != 1) && ( g != 0))
726 if (( g == 1 ) || (g == 0))
759 #ifdef FACTORIZE2_DEBUG 772 else if (r->cf->extRing!=
NULL)
774 if (r->cf->extRing->qideal!=
NULL)
806 else if (r->cf->extRing!=
NULL)
808 if (r->cf->extRing->qideal!=
NULL)
824 if (r->cf->extRing!=
NULL)
825 if (r->cf->extRing->qideal!=
NULL)
835 if (v!=
NULL) (*v)[
j]=e;
846 #ifdef FACTORIZE2_DEBUG 847 printf(
"singclap_factorize, degree %ld\n",
p_Totaldegree(f,r));
874 if (with_exps==0) n++;
897 for(i=
rVar(r);i>0;i--)
907 if (with_exps!=1) (**v)[n]=e;
972 else if ((r->cf->extRing!=
NULL)
977 if (r->cf->extRing->qideal!=
NULL)
1007 if ( ! L.
getFirst().factor().inCoeffDomain() )
1016 if ((with_exps==2)&&(n>1))
1024 for ( ; J.
hasItem(); J++, j++ )
1026 if (with_exps!=1) (**v)[
j] = J.
getItem().exp();
1035 res->m[j] = convFactoryGFSingGF( J.
getItem().factor() );
1037 else if (r->cf->extRing!=
NULL)
1043 if (r->cf->extRing->qideal==
NULL)
1071 if (r->cf->extRing!=
NULL)
1072 if (r->cf->extRing->qideal!=
NULL)
1081 #ifdef FACTORIZE2_DEBUG 1082 printf(
"factorize_retry\n");
1088 int l=(*v)->length();
1089 (*v)->resize(l+ww->
length());
1090 for(jj=0;jj<ww->
length();jj++)
1091 (**v)[jj+
l]=(*ww)[jj];
1094 for(jj=
IDELEMS(res)-1;jj>=0;jj--)
1096 hh->m[jj]=res->m[jj];
1099 for(jj=
IDELEMS(h)-1;jj>=0;jj--)
1101 hh->m[jj+
IDELEMS(res)]=h->m[jj];
1112 WarnS(
"problem with factorize");
1120 res->m[1]=ff; ff=
NULL;
1138 if ((res->m[i]!=
NULL)
1151 while ((v!=
NULL) && ((*v)!=
NULL) && ((**v)[i]>1))
1156 res->m[0]=
p_Mult_q(res->m[0],res->m[i],r);
1176 (**v)[
j]=(*w)[
i]; j++;
1182 if (res->m[0]==
NULL)
1192 if (with_exps!=0) stop=0;
1197 if (with_exps==0)
p_SetCoeff(res->m[0],old_lead_coeff,r);
1198 else n_Delete(&old_lead_coeff,r->cf);
1223 #ifdef FACTORIZE2_DEBUG 1224 printf(
"singclap_sqrfree, degree %d\n",
pTotaldegree(f));
1237 if (with_exps!=1 && with_exps!=3)
1251 if (with_exps==0 || with_exps==3) n++;
1266 for(i=
rVar(r);i>0;i--)
1276 if (with_exps!=1) (**v)[n]=e;
1297 if (with_exps==0 || with_exps==3)
1304 if (with_exps==0 || with_exps==3)
1316 if (with_exps==0 || with_exps==3)
1322 if (with_exps==0 || with_exps==3)
1336 else if (r->cf->extRing!=
NULL)
1340 if (r->cf->extRing->qideal!=
NULL)
1382 if ((with_exps==2)&&(n>1))
1389 else if (L.
getFirst().factor().inCoeffDomain() && with_exps!=3)
1395 for ( ; J.
hasItem(); J++, j++ )
1397 if (with_exps!=1 && with_exps!=3) (**v)[
j] = J.
getItem().exp();
1401 else if (r->cf->extRing!=
NULL)
1403 if (r->cf->extRing->qideal==
NULL)
1409 if (res->m[0]==
NULL)
1420 if (r->cf->extRing!=
NULL)
1421 if (r->cf->extRing->qideal!=
NULL)
1427 if (with_exps!=0 || with_exps==3) stop=0;
1432 if (with_exps==0 || with_exps==3)
p_SetCoeff(res->m[0],old_lead_coeff,r);
1433 else n_Delete(&old_lead_coeff,r->cf);
1513 for ( LLi = LL; LLi.
hasItem(); LLi++ )
1517 if ((m!=0) && (n!=0))
break;
1519 if (tries>=5)
break;
1521 if ((m==0) || (n==0))
1523 Warn(
"char_series returns %d x %d matrix from %d input polys (%d)",
1531 for ( m=1, LLi = LL; LLi.
hasItem(); LLi++, m++ )
1594 int cnt=
rVar(r)+offs;
1615 for(i=0;i<
rVar(r)+offs;i++)
1635 if (s[strlen(s)-1]==
',') s[strlen(s)-1]=
'\0';
1669 for(i=m->
rows();i>0;i--)
1671 for(j=m->
cols();j>0;j--)
1686 for(i=m->
rows();i>0;i--)
1688 for(j=m->
cols();j>0;j--)
1878 int n= absFactors.
length();
1892 if (iter.
getItem().factor().inCoeffDomain())
1897 for (; iter.
hasItem(); iter++, i++)
1900 alpha= iter.
getItem().minpoly().mvar();
1901 if (iter.
getItem().minpoly().isOne())
1906 if (iter.
getItem().minpoly().isOne())
1916 if (!iter.
getItem().minpoly().isOne())
1918 numFactors +=
count;
int status int void size_t count
ideal singclap_sqrfree(poly f, intvec **v, int with_exps, const ring r)
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)
poly p_Div_mm(poly p, const poly m, const ring r)
divide polynomial by monomial
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
poly p_GcdMon(poly f, poly g, const ring r)
polynomial gcd for f=mon
STATIC_VAR int nfMinPoly[16]
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
intvec * ivCopy(const intvec *o)
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)
static BOOLEAN rField_is_Zn(const ring r)
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)
BOOLEAN pb(leftv res, leftv args)
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)
CanonicalForm ndConvSingNFactoryN(number, BOOLEAN, const coeffs)
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)
VAR 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[]
BOOLEAN convSingTrP(poly p, const ring r)
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)
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
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)
#define __p_Mult_nn(p, n, r)
CanonicalForm convSingPFactoryP(poly p, const ring r)
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
poly singclap_pmult(poly f, poly g, const ring r)
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)
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)
poly singclap_pmod(poly f, poly g, const ring r)
static void p_Setm(poly p, const ring r)
ideal singclap_absFactorize(poly f, ideal &mipos, intvec **exps, int &numFactors, const ring r)
BOOLEAN pa(leftv res, leftv args)
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,...)
VAR int singclap_factorize_retry
#define MATELEM(mat, i, j)
1-based access to matrix