29#define PLURAL_INTERNAL_DECLARATIONS
58poly
sca_pp_Mult_mm(
const poly pPoly,
const poly pMonom,
const ring rRing, poly &);
61static poly
sca_pp_mm_Mult(
const poly pPoly,
const poly pMonom,
const ring rRing);
64poly
sca_p_Mult_mm(poly pPoly,
const poly pMonom,
const ring rRing);
67static poly
sca_p_mm_Mult(poly pPoly,
const poly pMonom,
const ring rRing);
71poly
sca_SPoly(
const poly p1,
const poly p2,
const ring r);
88 const short iFirstAltVar = scaFirstAltVar(rRing);
89 const short iLastAltVar = scaLastAltVar(rRing);
94 for(
REGISTER short j = iLastAltVar;
j >= iFirstAltVar;
j-- )
96 const unsigned int iExpM = p_GetExp(pMonomM,
j, rRing);
97 const unsigned int iExpMM = p_GetExp(pMonomMM,
j, rRing);
122 return(1 - (tpower << 1) );
132static inline poly
sca_m_Mult_mm( poly pMonomM,
const poly pMonomMM,
const ring rRing )
139 const unsigned int iFirstAltVar = scaFirstAltVar(rRing);
140 const unsigned int iLastAltVar = scaLastAltVar(rRing);
145 for(
REGISTER unsigned int j = iLastAltVar;
j >= iFirstAltVar;
j-- )
147 const unsigned int iExpM = p_GetExp(pMonomM,
j, rRing);
148 const unsigned int iExpMM = p_GetExp(pMonomMM,
j, rRing);
172 p_ExpVectorAdd(pMonomM, pMonomMM, rRing);
177 nCoeffM = n_InpNeg(nCoeffM, rRing->cf);
179 const number nCoeffMM =
p_GetCoeff(pMonomMM, rRing);
181 number nCoeff = n_Mult(nCoeffM, nCoeffMM, rRing->cf);
183 p_SetCoeff(pMonomM, nCoeff, rRing);
196static inline poly
sca_mm_Mult_m(
const poly pMonomMM, poly pMonomM,
const ring rRing )
203 const unsigned int iFirstAltVar = scaFirstAltVar(rRing);
204 const unsigned int iLastAltVar = scaLastAltVar(rRing);
209 for(
REGISTER unsigned int j = iLastAltVar;
j >= iFirstAltVar;
j-- )
211 const unsigned int iExpMM = p_GetExp(pMonomMM,
j, rRing);
212 const unsigned int iExpM = p_GetExp(pMonomM,
j, rRing);
236 p_ExpVectorAdd(pMonomM, pMonomMM, rRing);
241 nCoeffM = n_InpNeg(nCoeffM, rRing->cf);
243 const number nCoeffMM =
p_GetCoeff(pMonomMM, rRing);
245 number nCoeff = n_Mult(nCoeffM, nCoeffMM, rRing->cf);
247 p_SetCoeff(pMonomM, nCoeff, rRing);
261static inline poly
sca_mm_Mult_mm( poly pMonom1,
const poly pMonom2,
const ring rRing )
268 const unsigned int iFirstAltVar = scaFirstAltVar(rRing);
269 const unsigned int iLastAltVar = scaLastAltVar(rRing);
274 for(
REGISTER unsigned int j = iLastAltVar;
j >= iFirstAltVar;
j-- )
276 const unsigned int iExp1 = p_GetExp(pMonom1,
j, rRing);
277 const unsigned int iExp2 = p_GetExp(pMonom2,
j, rRing);
302 p_ExpVectorSum(pResult, pMonom1, pMonom2, rRing);
306 const number nCoeff1 =
p_GetCoeff(pMonom1, rRing);
307 const number nCoeff2 =
p_GetCoeff(pMonom2, rRing);
309 number nCoeff = n_Mult(nCoeff1, nCoeff2, rRing->cf);
312 nCoeff = n_InpNeg(nCoeff, rRing->cf);
332 assume(
i <= scaLastAltVar(rRing));
333 assume( scaFirstAltVar(rRing) <=
i );
335 if( p_GetExp(pMonom,
i, rRing) != 0 )
338 const short iFirstAltVar = scaFirstAltVar(rRing);
343 cpower ^= p_GetExp(pMonom,
j, rRing);
349 poly pResult = p_LmInit(pMonom, rRing);
351 p_SetExp(pResult,
i, 1, rRing);
352 p_Setm(pResult, rRing);
354 number nCoeff = n_Copy(pGetCoeff(pMonom), rRing->cf);
357 nCoeff = n_InpNeg(nCoeff, rRing->cf);
393 const int iComponentMonomM =
p_GetComp(pMonom, rRing);
395 poly
p = pPoly; poly* ppPrev = &pPoly;
406 if( iComponentMonomM!=0 )
409 Werror(
"sca_p_Mult_mm: exponent mismatch %d and %d\n", iComponent, iComponentMonomM);
412 p_Delete( &pPoly, rRing);
416 if(iComponentMonomM==0 )
418 dReportError(
"sca_p_Mult_mm: Multiplication in the left module from the right");
440 p = p_LmDeleteAndNext(
p, rRing);
471 const int iComponentMonomM =
p_GetComp(pMonom, rRing);
474 poly* ppPrev = &pResult;
485 if( iComponentMonomM!=0 )
488 Werror(
"sca_pp_Mult_mm: exponent mismatch %d and %d\n", iComponent, iComponentMonomM);
491 p_Delete( &pResult, rRing);
496 if(iComponentMonomM==0 )
498 dReportError(
"sca_pp_Mult_mm: Multiplication in the left module from the right");
531 assume(
i <= scaLastAltVar(rRing));
532 assume(scaFirstAltVar(rRing) <=
i);
538 poly* ppPrev = &pResult;
553 ppPrev = &
pNext(*ppPrev);
582 const int iComponentMonomM =
p_GetComp(pMonom, rRing);
585 poly* ppPrev = &pResult;
594 if( iComponentMonomM!=0 )
599 Werror(
"sca_pp_mm_Mult: exponent mismatch %d and %d\n", iComponent, iComponentMonomM);
602 p_Delete( &pResult, rRing);
608 dReportError(
"sca_pp_mm_Mult: Multiplication in the left module from the right!");
622 ppPrev = &
pNext(*ppPrev);
655 const int iComponentMonomM =
p_GetComp(pMonom, rRing);
657 poly
p = pPoly; poly* ppPrev = &pPoly;
671 if( iComponentMonomM!=0 )
676 Werror(
"sca_p_mm_Mult: exponent mismatch %d and %d\n", iComponent, iComponentMonomM);
679 p_Delete( &pPoly, rRing);
685 dReportError(
"sca_p_mm_Mult: Multiplication in the left module from the right!");
708 p = p_LmDeleteAndNext(
p, rRing);
718 if( !
p_Test(pPoly, rRing) )
720 PrintS(
"pPoly is wrong!");
744poly
sca_SPoly(
const poly p1,
const poly p2,
const ring r )
751 if ((lCompP1!=lCompP2) && (lCompP1!=0) && (lCompP2!=0))
754 dReportError(
"sca_SPoly: different non-zero components!\n");
759 poly pL =
p_Lcm(p1, p2, r);
762 p_ExpVectorDiff(m1, pL, p1, r);
772 p_ExpVectorDiff (m2, pL, p2, r);
782 number C1 = n_Copy(pGetCoeff(p1),r->cf);
783 number C2 = n_Copy(pGetCoeff(p2),r->cf);
785 number C = n_Gcd(C1,C2,r->cf);
787 if (!n_IsOne(C, r->cf))
789 C1=n_Div(C1, C, r->cf);
790 C2=n_Div(C2, C, r->cf);
798 assume( (iSignSum*iSignSum == 0) || (iSignSum*iSignSum == 4) );
801 C2=n_InpNeg (C2, r->cf);
803 p_SetCoeff(m1, C2, r);
804 p_SetCoeff(m2, C1, r);
812 poly spoly = p_Add_q (
tmp1,
tmp2, r);
840 if ((lCompP1!=lCompP2) && (lCompP1!=0) && (lCompP2!=0))
843 dReportError(
"sca_ReduceSpoly: different non-zero components!");
849 p_ExpVectorDiff (
m, p2, p1, r);
855 number C1 = n_Copy( pGetCoeff(p1), r->cf);
856 number C2 = n_Copy( pGetCoeff(p2), r->cf);
859 number C = n_Gcd(C1, C2, r->cf);
861 if (!n_IsOne(C, r->cf))
863 C1 = n_Div(C1, C, r->cf);
864 C2 = n_Div(C2, C, r->cf);
871 C2 = n_InpNeg(C2,r->cf);
873 p_SetCoeff(
m, C2, r);
879 p2 = p_LmDeleteAndNext( p2, r );
881 p2 = p_Mult_nn(p2, C1, r);
887 p2 = p_Add_q(p2,
T, r);
922 assume(rIsPluralRing(rG));
924#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
925 PrintS(
"sca_SetupQuotient(rGR, rG, bCopy)");
937 if(rIsSCA(rG) && (rG != rGR))
938 return sca_Force(rGR, scaFirstAltVar(rG), scaLastAltVar(rG));
951 PrintS(
"sca_SetupQuotient: qring?\n");
954 if(rGR->qideal ==
NULL)
958 PrintS(
"sca_SetupQuotient: qideal!!!\n");
966 int iAltVarStart =
N+1;
969 const ring rBase = rG;
974 PrintS(
"sca_SetupQuotient: AltVars?!\n");
977 for(
int i = 1;
i <
N;
i++)
979 for(
int j =
i + 1;
j <=
N;
j++)
983#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
984 Print(
"Nonzero D[%d, %d]\n",
i,
j);
993 if( n_IsMOne(c, rBase->cf) )
995 if(
i < iAltVarStart)
1002 if( !n_IsOne(c, rBase->cf) )
1004#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1005 Print(
"Wrong Coeff at: [%d, %d]\n",
i,
j);
1013#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1014 Print(
"AltVars?1: [%d, %d]\n", iAltVarStart, iAltVarEnd);
1018 if((iAltVarEnd == -1) || (iAltVarStart == (
N+1)))
1020 if (
N>1)
return false;
1021 iAltVarEnd=iAltVarStart=1;
1024 for(
int i = 1;
i <
N;
i++)
1026 for(
int j =
i + 1;
j <=
N;
j++)
1031 if( (iAltVarStart <=
i) && (
j <= iAltVarEnd) )
1033 if( !n_IsMOne(c, rBase->cf) )
1035#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1036 Print(
"Wrong Coeff at: [%d, %d]\n",
i,
j);
1043 if( !n_IsOne(c, rBase->cf) )
1045#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1046 Print(
"Wrong Coeff at: [%d, %d]\n",
i,
j);
1054#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1055 Print(
"AltVars!?: [%d, %d]\n", iAltVarStart, iAltVarEnd);
1058 assume( 1 <= iAltVarStart );
1059 assume( iAltVarStart <= iAltVarEnd );
1070 const ideal idQuotient = rGR->qideal;
1073#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1074 PrintS(
"Analyzing quotient ideal:\n");
1088 b = si_min(
b, scaFirstAltVar(rG));
1089 e = si_max(e, scaLastAltVar(rG));
1091#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1092 Print(
"AltVars!?: [%d, %d]\n",
b, e);
1096 for (
int i = iAltVarStart; (
i <= iAltVarEnd);
i++ )
1097 if( (
i <
b) || (
i > e) )
1099 poly square =
p_One( rG);
1100 p_SetExp(square,
i, 2, rG);
1105 square =
nc_NF(idQuotient,
NULL, square, 0, 1, rG);
1107 if( square !=
NULL )
1109 p_Delete(&square, rG);
1114#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1115 Print(
"ScaVars!: [%d, %d]\n", iAltVarStart, iAltVarEnd);
1122 ideal tempQ =
id_KillSquares(idQuotient, iAltVarStart, iAltVarEnd, rG);
1125#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1128 PrintS(
"tempSCAQuotient: \n");
1136 scaFirstAltVar( rGR, iAltVarStart );
1137 scaLastAltVar( rGR, iAltVarEnd );
1140 rGR->GetNC()->SCAQuotient() =
NULL;
1142 rGR->GetNC()->SCAQuotient() =
idrMoveR(tempQ, rG, rGR);
1147#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1148 PrintS(
"SCAQuotient: \n");
1162 assume(rIsPluralRing(rGR));
1165 const int N = rGR->N;
1171 const ideal idQuotient = rGR->qideal;
1173 ideal tempQ = idQuotient;
1183 rGR->GetNC()->SCAQuotient() =
NULL;
1185 rGR->GetNC()->SCAQuotient() = tempQ;
1188 scaFirstAltVar( rGR,
b );
1189 scaLastAltVar( rGR, e );
1211 poly xi =
p_One( rRing);
1212 p_SetExp(xi,
i, 1, rRing);
1215 poly pResult = pp_Mult_qq(xi, pPoly, rRing);
1217 p_Delete( &xi, rRing);
1250 r->GetNC()->mmMultP() = sca_mm_Mult_p;
1251 r->GetNC()->mmMultPP() = sca_mm_Mult_pp;
1263 if (rHasLocalOrMixedOrdering(rGR))
1276 int& dx,
int& dy,
const ring r)
1278 const unsigned int N = r->N;
1294 for(
int i =
N;
i > 0;
i--)
1296 const int d = p_GetExp(
m,
i, r);
1297 x += d * (*wx)[
i-1];
1298 y += d * (*wy)[
i-1];
1301 if( (wCx !=
NULL) && (wCy !=
NULL) )
1346 if ( (
x != ddx) || (
y != ddy) )
return false;
1362 if (
id ==
NULL)
return true;
1364 const int iSize =
IDELEMS(
id);
1366 if (iSize == 0)
return true;
1371 for(
int i = iSize - 1; (
i >= 0 ) &&
b;
i--)
1383 const unsigned int N = r->N;
1385 const int CommutativeVariable = 0;
1386 const int AntiCommutativeVariable = 0;
1390 if(AntiCommutativeVariable != CommutativeVariable)
1393 const unsigned int m_iFirstAltVar = scaFirstAltVar(r);
1394 const unsigned int m_iLastAltVar = scaLastAltVar(r);
1396 for (
unsigned int i = m_iFirstAltVar;
i<= m_iLastAltVar;
i++)
1398 (*w)[
i-1] = AntiCommutativeVariable;
1411 const unsigned int N = r->N;
1413 const int CommutativeVariable = 0;
1414 const int AntiCommutativeVariable = 1;
1418 if(AntiCommutativeVariable != CommutativeVariable)
1421 const unsigned int m_iFirstAltVar = scaFirstAltVar(r);
1422 const unsigned int m_iLastAltVar = scaLastAltVar(r);
1424 for (
unsigned int i = m_iFirstAltVar;
i<= m_iLastAltVar;
i++)
1426 (*w)[
i-1] = AntiCommutativeVariable;
1438 const short iFirstAltVar,
const short iLastAltVar,
1443 assume( (iFirstAltVar >= 1) && (iLastAltVar <= rVar(r)) && (iFirstAltVar <= iLastAltVar) );
1446 PrintS(
"m_KillSquares, m = ");
1453 for(
short k = iFirstAltVar;
k <= iLastAltVar;
k++)
1454 if( p_GetExp(
m,
k, r) > 1 )
1457 return p_Head(
m, r);
1464 const short iFirstAltVar,
const short iLastAltVar,
1470 assume( (iFirstAltVar >= 1) && (iLastAltVar <= r->
N) && (iFirstAltVar <= iLastAltVar) );
1473 PrintS(
"p_KillSquares, p = ");
1482 poly pResult =
NULL;
1483 poly* ppPrev = &pResult;
1505 PrintS(
"p_KillSquares => ");
1519 const short iFirstAltVar,
const short iLastAltVar,
1520 const ring r,
const bool bSkipZeroes)
1522 if (
id ==
NULL)
return id;
1524 assume( (iFirstAltVar >= 1) && (iLastAltVar <= rVar(r)) && (iFirstAltVar <= iLastAltVar) );
1526 const int iSize =
IDELEMS(
id);
1528 if (iSize == 0)
return id;
1530 ideal temp =
idInit(iSize, id->rank);
1533 PrintS(
"<id_KillSquares>\n");
1536 for (
unsigned int i = 0;
i <
IDELEMS(
id);
i++)
1538 Print(
"; id[%d] = ",
i+1);
1547 for (
int j = 0;
j < iSize;
j++)
1554 PrintS(
"<id_KillSquares>\n");
1556 PrintS(
"ideal temp: \n");
1559 Print(
"; temp[%d] = ",
i+1);
1565 PrintS(
"</id_KillSquares>\n");
void * cast_A_to_vptr(A a)
const CanonicalForm CFMap CFMap & N
const CanonicalForm int const CFList const Variable & y
const Variable & v
< [in] a sqrfree bivariate poly
EXTERN_VAR BBA_Proc sca_mora
EXTERN_VAR BBA_Proc sca_bba
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
static poly nc_mm_Mult_pp(const poly m, const poly p, const ring r)
void nc_p_ProcsSet(ring rGR, p_Procs_s *p_Procs)
static poly sca_mm_Mult_m(const poly pMonomMM, poly pMonomM, const ring rRing)
void sca_p_ProcsSet(ring rGR, p_Procs_s *p_Procs)
bool sca_SetupQuotient(ring rGR, ring rG, bool bCopy)
static poly m_KillSquares(const poly m, const short iFirstAltVar, const short iLastAltVar, const ring r)
static poly sca_xi_Mult_pp(short i, const poly pPoly, const ring rRing)
static void m_GetBiDegree(const poly m, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, int &dx, int &dy, const ring r)
ideal id_KillSquares(const ideal id, const short iFirstAltVar, const short iLastAltVar, const ring r, const bool bSkipZeroes)
static poly sca_xi_Mult_mm(short i, const poly pMonom, const ring rRing)
static poly sca_p_mm_Mult(poly pPoly, const poly pMonom, const ring rRing)
poly p_KillSquares(const poly p, const short iFirstAltVar, const short iLastAltVar, const ring r)
poly sca_pp_Mult_mm(const poly pPoly, const poly pMonom, const ring rRing, poly &)
bool p_IsBiHomogeneous(const poly p, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, int &dx, int &dy, const ring r)
poly sca_p_Mult_mm(poly pPoly, const poly pMonom, const ring rRing)
intvec * ivGetSCAXVarWeights(const ring r)
static int sca_Sign_mm_Mult_mm(const poly pMonomM, const poly pMonomMM, const ring rRing)
poly sca_pp_Mult_xi_pp(short i, const poly pPoly, const ring rRing)
intvec * ivGetSCAYVarWeights(const ring r)
poly sca_ReduceSpoly(const poly p1, poly p2, const ring r)
static poly sca_mm_Mult_mm(poly pMonom1, const poly pMonom2, const ring rRing)
static poly sca_m_Mult_mm(poly pMonomM, const poly pMonomMM, const ring rRing)
bool sca_Force(ring rGR, int b, int e)
poly sca_SPoly(const poly p1, const poly p2, const ring r)
bool id_IsBiHomogeneous(const ideal id, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, const ring r)
static poly sca_pp_mm_Mult(const poly pPoly, const poly pMonom, const ring rRing)
void iiWriteMatrix(matrix im, const char *n, int dim, const ring r, int spaces)
set spaces to zero by default
#define MATELEM(mat, i, j)
1-based access to matrix
int dReportError(const char *fmt,...)
#define p_SetCoeff0(p, n, r)
#define p_AllocBin(p, bin, r)
STATIC_VAR p_Procs_s * _p_procs
poly p_ISet(long i, const ring r)
returns the poly representing the integer i
poly p_Cleardenom(poly p, const ring r)
void p_Lcm(const poly a, const poly b, poly m, const ring r)
void p_Write(poly p, ring lmRing, ring tailRing)
ideal idrMoveR(ideal &id, ring src_r, ring dest_r)
void PrintS(const char *s)
void Werror(const char *fmt,...)
void rWrite(ring r, BOOLEAN details)
struct p_Procs_s p_Procs_s
ideal idInit(int idsize, int rank)
initialise an ideal / module
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size