27#define PLURAL_INTERNAL_DECLARATIONS
53 PrintS(
"ncInitSpecialPowersMultiplication(ring), ring: \n");
62 if( r->GetNC()->GetFormulaPowerMultiplier() !=
NULL )
64 WarnS(
"Already defined!");
85 Print(
"AreCommutingVariables(ring, k: %d, i: %d)!\n",
j,
i);
104 const poly d =
GetD(r,
i,
j);
118 if( !n_IsOne(q, r->cf) )
136 Print(
"AnalyzePair(ring, i: %d, j: %d):\n",
i,
j);
146 const poly c =
GetC(r,
i,
j);
147 const number q = pGetCoeff(c);
148 const poly d =
GetD(r,
i,
j);
160 if( n_IsOne(q, r->cf) )
163 if( n_IsMOne(q, r->cf) )
169 if( n_IsOne(q, r->cf) )
174 if( p_LmIsConstantComp(d, r) )
181 const int exp = p_GetExp(d,
k, r);
190 }
else if (
exp == 2 &&
k!=
i &&
k !=
j)
195 const number
g = pGetCoeff(d);
197 if (n_IsOne(
g, r->cf))
209 PrintS(
"====>>>>_ncSA_notImplemented\n");
219 PrintS(
"CFormulaPowerMultiplier::CFormulaPowerMultiplier(ring)!");
236 PrintS(
"CFormulaPowerMultiplier::~CFormulaPowerMultiplier()!");
251 const int cmp = p_LmCmp(pResult,
pNext(pResult), r);
254 pResult = pReverse(pResult);
259static inline poly
ncSA_1xy0x0y0(
const int i,
const int j,
const int n,
const int m,
const ring r)
262 Print(
"ncSA_1xy0x0y0(var(%d)^{%d}, var(%d)^{%d}, r)!\n",
j,
m,
i, n);
266 p_SetExp(
p,
j,
m, r);
267 p_SetExp(
p,
i, n, r);
276static inline poly
ncSA_Mxy0x0y0(
const int i,
const int j,
const int n,
const int m,
const ring r)
279 Print(
"ncSA_{M = -1}xy0x0y0(var(%d)^{%d}, var(%d)^{%d}, r)!\n",
j,
m,
i, n);
282 const int sign = 1 - ((n & (
m & 1)) << 1);
284 p_SetExp(
p,
j,
m, r);
285 p_SetExp(
p,
i, n, r);
295static inline poly
ncSA_Qxy0x0y0(
const int i,
const int j,
const int n,
const int m,
const number m_q,
const ring r)
298 Print(
"ncSA_Qxy0x0y0(var(%d)^{%d}, var(%d)^{%d}, Q, r)!\n",
j,
m,
i, n);
317 qN = n_Copy(m_q, r->cf);
321 n_Power(m_q,
max, &t, r->cf);
325 n_Power(t, min, &qN, r->cf);
333 p_SetExp(
p,
j,
m, r);
334 p_SetExp(
p,
i, n, r);
344static inline poly
ncSA_1xy0x0yG(
const int i,
const int j,
const int n,
const int m,
const number m_g,
const ring r)
347 Print(
"ncSA_1xy0x0yG(var(%d)^{%d}, var(%d)^{%d}, G, r)!\n",
j,
m,
i, n);
348 number t = n_Copy(m_g, r->cf);
349 PrintS(
"Parameter G: "); n_Write(t, r->cf);
356 number c = n_Init(1, r->cf);
360 p_SetExp(
p,
j, km--, r);
361 p_SetExp(
p,
i, kn--, r);
369 int min = si_min(
m, n);
375 number t = n_Init(km + 1, r->cf);
376 n_InpMult(t, m_g, r->cf);
377 n_InpMult(c, t, r->cf);
380 t = n_Init(kn + 1, r->cf);
381 n_InpMult(c, t, r->cf);
384 t = n_Init(
k, r->cf);
385 c = n_Div(c, t, r->cf);
390 t = n_Copy(c, r->cf);
394 p_SetExp(
p,
j, km--, r);
395 p_SetExp(
p,
i, kn--, r);
404 assume((km == 0) || (kn == 0) );
407 n_InpMult(c, m_g, r->cf);
411 number t = n_Init(km + 1, r->cf);
412 n_InpMult(c, t, r->cf);
418 number t = n_Init(kn + 1, r->cf);
419 n_InpMult(c, t, r->cf);
423 number t = n_Init(
k, r->cf);
424 c = n_Div(c, t, r->cf);
430 p_SetExp(
p,
j, km, r);
431 p_SetExp(
p,
i, kn, r);
443static inline poly
ncSA_1xy0x0yT2(
const int i,
const int j,
const int n,
const int m,
const int m_k,
const ring r)
446 Print(
"ncSA_1xy0x0yT2(var(%d)^{%d}, var(%d)^{%d}, t: var(%d), r)!\n",
j,
m,
i, n, m_k);
453 number c = n_Init(1, r->cf);
457 p_SetExp(
p,
j, km--, r);
458 p_SetExp(
p,
i, kn--, r);
467 int min = si_min(
m, n);
473 number t = n_Init(km + 1, r->cf);
475 n_InpMult(c, t, r->cf);
478 t = n_Init(kn + 1, r->cf);
479 n_InpMult(c, t, r->cf);
482 t = n_Init(
k, r->cf);
483 c = n_Div(c, t, r->cf);
488 t = n_Copy(c, r->cf);
492 p_SetExp(
p,
j, km--, r);
493 p_SetExp(
p,
i, kn--, r);
495 p_SetExp(
p, m_k,
k << 1, r);
504 assume((km == 0) || (kn == 0) );
511 number t = n_Init(km + 1, r->cf);
512 n_InpMult(c, t, r->cf);
518 number t = n_Init(kn + 1, r->cf);
519 n_InpMult(c, t, r->cf);
523 number t = n_Init(
k, r->cf);
524 c = n_Div(c, t, r->cf);
530 p_SetExp(
p,
j, km, r);
531 p_SetExp(
p,
i, kn, r);
533 p_SetExp(
p, m_k,
k << 1, r);
548static inline poly
ncSA_ShiftAx(
int i,
int j,
int n,
int m,
const number m_shiftCoef,
const ring r)
554 number c = n_Init(1, r->cf);
557 p_SetExp(
p,
j,
k, r);
558 p_SetExp(
p,
i, n, r);
566 number nn = n_Init(n, r->cf);
567 n_InpMult(nn, m_shiftCoef, r->cf);
575 number t = n_Init(
k + 1, r->cf);
576 n_InpMult(c, t, r->cf);
577 n_InpMult(c, nn, r->cf);
580 t = n_Init(mk++, r->cf);
581 c = n_Div(c, t, r->cf);
586 t = n_Copy(c, r->cf);
590 p_SetExp(
p,
j,
k, r);
591 p_SetExp(
p,
i, n, r);
602 n_InpMult(c, nn, r->cf);
604 number t = n_Init(
m, r->cf);
605 c = n_Div(c, t, r->cf);
609 n_Delete(&nn, r->cf);
613 p_SetExp(
p,
j,
k, r);
614 p_SetExp(
p,
i, n, r);
625static inline poly
ncSA_1xyAx0y0(
const int i,
const int j,
const int n,
const int m,
const number m_shiftCoef,
const ring r)
628 Print(
"ncSA_1xyAx0y0(var(%d)^{%d}, var(%d)^{%d}, A, r)!\n",
j,
m,
i, n);
629 number t = n_Copy(m_shiftCoef, r);
630 PrintS(
"Parameter A: "); n_Write(t, r);
637static inline poly
ncSA_1xy0xBy0(
const int i,
const int j,
const int n,
const int m,
const number m_shiftCoef,
const ring r)
640 Print(
"ncSA_1xy0xBy0(var(%d)^{%d}, var(%d)^{%d}, B, r)!\n",
j,
m,
i, n);
641 number t = n_Copy(m_shiftCoef, r);
642 PrintS(
"Parameter B: "); n_Write(t, r);
657 Print(
"ncSA_Multiply(type: %d, ring, (var(%d)^{%d} * var(%d)^{%d}, r)!\n", (
int)type,
j,
m,
i, n);
664 return ::ncSA_1xy0x0y0(
i,
j, n,
m, r);
667 return ::ncSA_Mxy0x0y0(
i,
j, n,
m, r);
672 return ::ncSA_Qxy0x0y0(
i,
j, n,
m, q, r);
675 const poly d =
GetD(r,
i,
j);
679 return ::ncSA_1xy0x0yG(
i,
j, n,
m,
g, r);
685 return ::ncSA_1xyAx0y0(
i,
j, n,
m,
g, r);
688 return ::ncSA_1xy0xBy0(
i,
j, n,
m,
g, r);
704 return ::AnalyzePairType( r,
i,
j);
717 return ::ncSA_1xy0x0y0(
i,
j, n,
m, r);
722 return ::ncSA_Mxy0x0y0(
i,
j, n,
m, r);
727 return ::ncSA_Qxy0x0y0(
i,
j, n,
m, m_q, r);
732 return ::ncSA_1xy0x0yG(
i,
j, n,
m, m_g, r);
737 return ::ncSA_1xy0x0yT2(
i,
j, n,
m,
k, r);
742 return ::ncSA_1xyAx0y0(
i,
j, n,
m, m_shiftCoef, r);
747 return ::ncSA_1xy0xBy0(
i,
j, n,
m, m_shiftCoef, r);
const CanonicalForm CFMap CFMap & N
CanonicalForm reverse(const CanonicalForm &F, int d)
static poly GetD(const ring r, int i, int j)
static poly GetC(const ring r, int i, int j)
gmp_float max(const gmp_float &a, const gmp_float &b)
gmp_float exp(const gmp_float &a)
#define omFreeSize(addr, size)
int p_IsPurePower(const poly p, const ring r)
return i, if head depends only on var(i)
poly p_ISet(long i, const ring r)
returns the poly representing the integer i
poly p_NSet(number n, const ring r)
returns the poly representing the number n, destroys n
void p_Write(poly p, ring lmRing, ring tailRing)
static poly pLast(poly a, int &length)
returns the length of a polynomial (numbers of monomials) respect syzComp
void PrintS(const char *s)
void rWrite(ring r, BOOLEAN details)