15 #define SHIFT_MULT_COMPAT_MODE 17 #ifdef SHIFT_MULT_DEBUG 18 #include "../kernel/polys.h" 23 #ifdef SHIFT_MULT_DEBUG 34 int lV = ri->isLPring;
36 #ifdef SHIFT_MULT_COMPAT_MODE 51 omBin bin = ri->PolyBin;
55 int *mExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
58 int *pExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
76 #ifdef SHIFT_MULT_COMPAT_MODE 80 #ifdef SHIFT_MULT_DEBUG 90 #ifdef SHIFT_MULT_DEBUG 99 int lV = ri->isLPring;
101 #ifdef SHIFT_MULT_COMPAT_MODE 116 int *mExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
119 int *pExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
134 #ifdef SHIFT_MULT_COMPAT_MODE 137 #ifdef SHIFT_MULT_DEBUG 146 #ifdef SHIFT_MULT_DEBUG 157 int lV = ri->isLPring;
159 #ifdef SHIFT_MULT_COMPAT_MODE 174 omBin bin = ri->PolyBin;
178 int *mExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
181 int *pExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
199 #ifdef SHIFT_MULT_COMPAT_MODE 203 #ifdef SHIFT_MULT_DEBUG 213 #ifdef SHIFT_MULT_DEBUG 222 int lV = ri->isLPring;
224 #ifdef SHIFT_MULT_COMPAT_MODE 239 int *mExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
242 int *pExpV = (
int *)
omAlloc((ri->N+1)*
sizeof(int));
257 #ifdef SHIFT_MULT_COMPAT_MODE 260 #ifdef SHIFT_MULT_DEBUG 269 #ifdef SHIFT_MULT_DEBUG 277 #ifdef SHIFT_MULT_DEBUG 286 PrintLn();
WarnS(
"pp_Mult_mm_Noether is not supported yet by Letterplace. Ignoring spNoether and using pp_Mult_mm. This might lead to unexpected behavior.");
310 PrintLn();
WarnS(
"pp_Mult_Coeff_mm_DivSelectMult is not supported yet by Letterplace. This might lead to unexpected behavior.");
315 PrintLn();
WarnS(
"pp_Mult_Coeff_mm_DivSelect is not supported yet by Letterplace. This might lead to unexpected behavior.");
326 int lV = ri->isLPring;
330 if (shift == 0)
return;
332 int *e=(
int *)
omAlloc((ri->N+1)*
sizeof(int));
333 int *
s=(
int *)
omAlloc0((ri->N+1)*
sizeof(int));
336 int expVoffset = shift*lV;
337 for (
int i = 1 + expVoffset;
i <= ri->N;
i++)
340 s[
i - expVoffset] = e[
i];
361 int lV = ri->isLPring;
366 int *e=(
int *)
omAlloc((ri->N+1)*
sizeof(int));
367 int *
s=(
int *)
omAlloc0((ri->N+1)*
sizeof(int));
370 for (
int i = ri->N - sh*lV;
i > 0;
i--)
375 s[
i + (sh*lV)] = e[
i];
419 int *e=(
int *)
omAlloc((ri->N+1)*
sizeof(int));
435 int lV = ri->isLPring;
438 while ( (!expV[j]) && (j>=1) ) j--;
440 b = (int)((j+lV-1)/lV);
476 int *e=(
int *)
omAlloc((ri->N+1)*
sizeof(int));
492 int lV = ri->isLPring;
495 while ( (!expV[j]) && (j<=ri->
N-1) ) j++;
497 b = (int)(j+lV-1)/lV;
502 void p_LPExpVappend(
int *m1ExpV,
int *m2ExpV,
int m1Length,
int m2Length,
const ring ri) {
503 #ifdef SHIFT_MULT_DEBUG 508 if (m1Length + m2Length > ri->N)
510 WarnS(
"letterplace degree bound too low for this multiplication");
512 for (
int i = 1 + m1Length;
i < 1 + m1Length + m2Length; ++
i)
514 assume(m2ExpV[
i - m1Length] <= 1);
515 m1ExpV[
i] = m2ExpV[
i - m1Length];
518 assume(m1ExpV[0] == 0 || m2ExpV[0] == 0);
519 m1ExpV[0] += m2ExpV[0];
520 #ifdef SHIFT_MULT_DEBUG 526 void p_LPExpVprepend(
int *m1ExpV,
int *m2ExpV,
int m1Length,
int m2Length,
const ring ri)
528 #ifdef SHIFT_MULT_DEBUG 533 if (m1Length + m2Length > ri->N)
535 WarnS(
"letterplace degree bound too low for this multiplication");
539 for (
int i = m2Length + m1Length;
i >= 1 + m2Length; --
i)
541 m1ExpV[
i] = m1ExpV[
i - m2Length];
545 for (
int i = 1;
i < 1 + m2Length; ++
i)
548 m1ExpV[
i] = m2ExpV[
i];
551 assume(m1ExpV[0] == 0 || m2ExpV[0] == 0);
552 m1ExpV[0] += m2ExpV[0];
553 #ifdef SHIFT_MULT_DEBUG 568 for (
int i = 0;
i <= ri->N; ++
i)
575 if (i % ri->isLPring == 0 && i != ri->N)
587 int lV = r->isLPring;
607 for(i = 0; i <=
s; i++)
638 int lV = r->isLPring;
644 int *e = (
int *)
omAlloc((r->N+1)*
sizeof(int));
645 int b = (int)((r->N+lV-1)/lV);
647 int *
B = (
int *)
omAlloc0((b+1)*
sizeof(int));
654 for (i=(j-1)*lV + 1; i<= j*lV; i++)
656 if (e[i]) B[
j] = B[
j]+1;
668 if (j==0)
goto ret_true;
712 #ifdef SHIFT_MULT_COMPAT_MODE 720 int j = r->N - (i * r->isLPring);
721 bool divisible =
true;
732 if (divisible)
return TRUE;
736 #ifdef SHIFT_MULT_COMPAT_MODE 745 if (p ==
NULL || pos < 1 || pos > (r->N / r->isLPring))
return NULL;
747 for (
int i = (pos-1) * r->isLPring + 1; i <= pos * r->isLPring;
i++) {
749 p_SetExp(v,
i - (pos-1) * r->isLPring, 1, r);
760 omFree(new_ring->wvhdl[p]);
761 int *
w=(
int*)
omAlloc(new_ring->N*
sizeof(
int));
764 for(
int i=old_ring->N-1;
i>=0;
i--)
766 if (old_ring->wvhdl[p][
i]<-0)
return TRUE;
767 w[
b*old_ring->N+
i]=old_ring->wvhdl[
p][
i];
770 new_ring->wvhdl[
p]=
w;
771 new_ring->block1[
p]=new_ring->N;
793 WerrorS(
"weights must be positive");
809 WerrorS(
"weights must be positive");
818 WerrorS(
"ordering (a(..),lp/rp not implemented for LP-rings");
821 int ** wvhdl=(
int**)
omAlloc0((r->N+3)*
sizeof(
int*));
823 int* blk0=(
int*)
omAlloc0((r->N+3)*
sizeof(int));
824 int* blk1=(
int*)
omAlloc0((r->N+3)*
sizeof(int));
825 omFree(R->wvhdl); R->wvhdl=wvhdl;
826 omFree(R->order); R->order=ord;
827 omFree(R->block0); R->block0=blk0;
828 omFree(R->block1); R->block1=blk1;
829 for(
int i=0;
i<r->N;
i++)
840 wvhdl[
i+
p][
j*r->N+
i]=1;
842 wvhdl[
i+
p][(
j+1)*r->N-
i-1]=1;
845 ord[r->N+
p]=r->order[
p];
850 if (p==1) ord[0]=r->order[0];
851 else if (p==0) ord[r->N+1]=r->order[1];
854 WerrorS(
"ordering not implemented for LP-rings");
861 default:
WerrorS(
"ordering not implemented for LP-rings");
865 char **names=(
char**)
omAlloc(R->N*
sizeof(
char*));
868 for(
int i=r->N-1;
i>=0;
i--)
871 for(
int i=r->N-1;
i>=0;
i--)
omFree(R->names[
i]);
const CanonicalForm int s
int p_mLastVblock(poly p, const ring ri)
static BOOLEAN p_LmIsConstantComp(const poly p, const ring r)
poly shift_pp_Mult_Coeff_mm_DivSelectMult_STUB(poly p, const poly m, const poly a, const poly b, int &shorter, const ring r)
static int si_min(const int a, const int b)
poly shift_p_mm_Mult(poly p, const poly m, const ring ri)
int id_IsInV(ideal I, const ring r)
static void p_GetExpV(poly p, int *ev, const ring r)
#define omFreeSize(addr, size)
int p_mIsInV(poly p, const ring r)
int p_mFirstVblock(poly p, const ring ri)
static BOOLEAN freeAlgebra_weights(const ring old_ring, ring new_ring, int p, int d)
substitute weights from orderings a,wp,Wp by d copies of it at position p
#define p_AllocBin(p, bin, r)
static long p_Totaldegree(poly p, const ring r)
poly shift_pp_Mult_Coeff_mm_DivSelect_STUB(poly p, const poly m, int &shorter, const ring r)
poly shift_pp_mm_Mult(poly p, const poly m, const ring ri)
void WerrorS(const char *s)
BOOLEAN p_LPLmDivisibleBy(poly a, poly b, const ring r)
void p_LPExpVappend(int *m1ExpV, int *m2ExpV, int m1Length, int m2Length, const ring ri)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy ...
poly shift_pp_Mult_mm_Noether_STUB(poly p, const poly m, const poly spNoether, int &ll, const ring ri)
void p_LPExpVprepend(int *m1ExpV, int *m2ExpV, int m1Length, int m2Length, const ring ri)
char * LPExpVString(int *expV, ring ri)
static number p_SetCoeff(poly p, number n, ring r)
static void p_SetExpV(poly p, int *ev, const ring r)
static poly p_Copy(poly p, const ring r)
returns a copy of p
static FORCE_INLINE number n_Mult(number a, number b, const coeffs r)
return the product of 'a' and 'b', i.e., a*b
int p_IsInV(poly p, const ring r)
poly shift_p_Mult_mm(poly p, const poly m, const ring ri)
static poly p_Head(poly p, const ring r)
void p_LPshift(poly p, int sh, const ring ri)
poly shift_p_Minus_mm_Mult_qq(poly p, poly m, poly q, int &Shorter, const poly spNoether, const ring ri)
const CanonicalForm CFMap CFMap & N
BOOLEAN rComplete(ring r, int force)
this needs to be called whenever a new ring is created: new fields in ring are created (like VarOffse...
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent : the integer VarOffset encodes:
void WriteLPExpV(int *expV, ring ri)
void StringSetS(const char *st)
ring rCopy0(const ring r, BOOLEAN copy_qideal, BOOLEAN copy_ordering)
void StringAppendS(const char *st)
BOOLEAN _p_LPLmDivisibleByNoComp(poly a, poly b, const ring r)
static int si_max(const int a, const int b)
int p_LastVblock(poly p, const ring r)
void PrintS(const char *s)
BOOLEAN p_LPDivisibleBy(poly a, poly b, const ring r)
#define p_LmCheckPolyRing1(p, r)
static unsigned pLength(poly a)
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
poly p_LPVarAt(poly p, int pos, const ring r)
static void p_Delete(poly *p, const ring r)
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
#define pIfThen1(cond, check)
int p_FirstVblock(poly p, const ring r)
#define p_MemCopy_LengthGeneral(d, s, length)
static poly p_GetExp_k_n(poly p, int l, int k, const ring r)
void p_mLPunshift(poly m, const ring ri)
static poly p_Neg(poly p, const ring r)
poly shift_pp_Mult_mm(poly p, const poly m, const ring ri)
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
void p_wrp(poly p, ring lmRing, ring tailRing)
static poly p_Add_q(poly p, poly q, const ring r)
void p_mLPshift(poly m, int sh, const ring ri)
ring freeAlgebra(ring r, int d)
create the letterplace ring corresponding to r up to degree d
void p_LPunshift(poly p, const ring ri)
void k_SplitFrame(poly &m1, poly &m2, int at, const ring r)
static long p_MaxComp(poly p, ring lmRing, ring tailRing)