My Project
Loading...
Searching...
No Matches
Macros | Functions
p_polys.h File Reference
#include "misc/mylimits.h"
#include "misc/intvec.h"
#include "coeffs/coeffs.h"
#include "polys/monomials/monomials.h"
#include "polys/monomials/ring.h"
#include "polys/templates/p_MemAdd.h"
#include "polys/templates/p_MemCmp.h"
#include "polys/templates/p_Procs.h"
#include "polys/sbuckets.h"
#include "polys/nc/nc.h"

Go to the source code of this file.

Macros

#define pIfThen(cond, check)   do {if (cond) {check;}} while (0)
 
#define p_Test(p, r)   _p_Test(p, r, PDEBUG)
 
#define p_LmTest(p, r)   _p_LmTest(p, r, PDEBUG)
 
#define pp_Test(p, lmRing, tailRing)   _pp_Test(p, lmRing, tailRing, PDEBUG)
 
#define p_SetmComp   p_Setm
 
#define __p_Mult_nn(p, n, r)   r->p_Procs->p_Mult_nn(p, n, r)
 
#define __pp_Mult_nn(p, n, r)   r->p_Procs->pp_Mult_nn(p, n, r)
 
#define _p_LmCmpAction(p, q, r, actionE, actionG, actionS)
 
#define pDivAssume(x)   do {} while (0)
 
#define p_LmCmpAction(p, q, r, actionE, actionG, actionS)    _p_LmCmpAction(p, q, r, actionE, actionG, actionS)
 
#define p_LmEqual(p1, p2, r)   p_ExpVectorEqual(p1, p2, r)
 

Functions

poly p_Farey (poly p, number N, const ring r)
 
poly p_ChineseRemainder (poly *xx, number *x, number *q, int rl, CFArray &inv_cache, const ring R)
 
unsigned long p_GetShortExpVector (const poly a, const ring r)
 
unsigned long p_GetShortExpVector0 (const poly a, const ring r)
 
unsigned long p_GetShortExpVector1 (const poly a, const ring r)
 
BOOLEAN p_DivisibleByRingCase (poly f, poly g, const ring r)
 divisibility check over ground ring (which may contain zero divisors); TRUE iff LT(f) divides LT(g), i.e., LT(f)*c*m = LT(g), for some coefficient c and some monomial m; does not take components into account
 
poly p_One (const ring r)
 
int p_MinDeg (poly p, intvec *w, const ring R)
 
long p_DegW (poly p, const int *w, const ring R)
 
BOOLEAN p_OneComp (poly p, const ring r)
 return TRUE if all monoms have the same component
 
int p_IsPurePower (const poly p, const ring r)
 return i, if head depends only on var(i)
 
int p_IsUnivariate (poly p, const ring r)
 return i, if poly depends only on var(i)
 
int p_GetVariables (poly p, int *e, const ring r)
 set entry e[i] to 1 if var(i) occurs in p, ignore var(j) if e[j]>0 return #(e[i]>0)
 
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_Vec2Polys (poly v, poly **p, int *len, const ring r)
 
poly p_Vec2Poly (poly v, int k, const ring r)
 
void p_Vec2Array (poly v, poly *p, int len, const ring r)
 julia: vector to already allocated array (len=p_MaxComp(v,r))
 
void p_ShallowDelete (poly *p, const ring r)
 
poly p_Sub (poly a, poly b, const ring r)
 
poly p_Power (poly p, int i, const ring r)
 
BOOLEAN pIsMonomOf (poly p, poly m)
 
BOOLEAN pHaveCommonMonoms (poly p, poly q)
 
BOOLEAN p_LmCheckIsFromRing (poly p, ring r)
 
BOOLEAN p_LmCheckPolyRing (poly p, ring r)
 
BOOLEAN p_CheckIsFromRing (poly p, ring r)
 
BOOLEAN p_CheckPolyRing (poly p, ring r)
 
BOOLEAN p_CheckRing (ring r)
 
BOOLEAN _p_Test (poly p, ring r, int level)
 
BOOLEAN _p_LmTest (poly p, ring r, int level)
 
BOOLEAN _pp_Test (poly p, ring lmRing, ring tailRing, int level)
 
static int pLength (poly a)
 
poly p_Last (const poly a, int &l, const ring r)
 
void p_Norm (poly p1, const ring r)
 
void p_Normalize (poly p, const ring r)
 
void p_ProjectiveUnique (poly p, const ring r)
 
void p_ContentForGB (poly p, const ring r)
 
void p_Content (poly p, const ring r)
 
void p_SimpleContent (poly p, int s, const ring r)
 
number p_InitContent (poly ph, const ring r)
 
poly p_Cleardenom (poly p, const ring r)
 
void p_Cleardenom_n (poly p, const ring r, number &c)
 
int p_Size (poly p, const ring r)
 
poly p_Homogen (poly p, int varnum, const ring r)
 
BOOLEAN p_IsHomogeneous (poly p, const ring r)
 
BOOLEAN p_IsHomogeneousW (poly p, const intvec *w, const ring r)
 
BOOLEAN p_IsHomogeneousW (poly p, const intvec *w, const intvec *module_w, const ring r)
 
static void p_Setm (poly p, const ring r)
 
p_SetmProc p_GetSetmProc (const ring r)
 
poly p_Subst (poly p, int n, poly e, const ring r)
 
static unsigned long p_SetComp (poly p, unsigned long c, ring r)
 
static void p_SetCompP (poly p, int i, ring r)
 
static void p_SetCompP (poly p, int i, ring lmRing, ring tailRing)
 
static long p_MaxComp (poly p, ring lmRing, ring tailRing)
 
static long p_MaxComp (poly p, ring lmRing)
 
static long p_MinComp (poly p, ring lmRing, ring tailRing)
 
static long p_MinComp (poly p, ring lmRing)
 
static poly pReverse (poly p)
 
void pEnlargeSet (poly **p, int length, int increment)
 
void p_String0 (poly p, ring lmRing, ring tailRing)
 print p according to ShortOut in lmRing & tailRing
 
charp_String (poly p, ring lmRing, ring tailRing)
 
void p_Write (poly p, ring lmRing, ring tailRing)
 
void p_Write0 (poly p, ring lmRing, ring tailRing)
 
void p_wrp (poly p, ring lmRing, ring tailRing)
 
void p_String0Short (const poly p, ring lmRing, ring tailRing)
 print p in a short way, if possible
 
void p_String0Long (const poly p, ring lmRing, ring tailRing)
 print p in a long way
 
static long p_FDeg (const poly p, const ring r)
 
static long p_LDeg (const poly p, int *l, const ring r)
 
long p_WFirstTotalDegree (poly p, ring r)
 
long p_WTotaldegree (poly p, const ring r)
 
long p_WDegree (poly p, const ring r)
 
long pLDeg0 (poly p, int *l, ring r)
 
long pLDeg0c (poly p, int *l, ring r)
 
long pLDegb (poly p, int *l, ring r)
 
long pLDeg1 (poly p, int *l, ring r)
 
long pLDeg1c (poly p, int *l, ring r)
 
long pLDeg1_Deg (poly p, int *l, ring r)
 
long pLDeg1c_Deg (poly p, int *l, ring r)
 
long pLDeg1_Totaldegree (poly p, int *l, ring r)
 
long pLDeg1c_Totaldegree (poly p, int *l, ring r)
 
long pLDeg1_WFirstTotalDegree (poly p, int *l, ring r)
 
long pLDeg1c_WFirstTotalDegree (poly p, int *l, ring r)
 
BOOLEAN p_EqualPolys (poly p1, poly p2, const ring r)
 
BOOLEAN p_EqualPolys (poly p1, poly p2, const ring r1, const ring r2)
 same as the usual p_EqualPolys for polys belonging to equal rings
 
long p_Deg (poly a, const ring r)
 
static number p_SetCoeff (poly p, number n, ring r)
 
static long p_GetOrder (poly p, ring r)
 
static unsigned long p_AddComp (poly p, unsigned long v, ring r)
 
static unsigned long p_SubComp (poly p, unsigned long v, ring r)
 
static long p_GetExp (const poly p, const unsigned long iBitmask, const int VarOffset)
 get a single variable exponent @Note: the integer VarOffset encodes:
 
static unsigned long p_SetExp (poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
 set a single variable exponent @Note: VarOffset encodes the position in p->exp
 
static long p_GetExp (const poly p, const ring r, const int VarOffset)
 
static long p_SetExp (poly p, const long e, const ring r, const int VarOffset)
 
static long p_GetExp (const poly p, const int v, const ring r)
 get v^th exponent for a monomial
 
static long p_SetExp (poly p, const int v, const long e, const ring r)
 set v^th exponent for a monomial
 
static long p_IncrExp (poly p, int v, ring r)
 
static long p_DecrExp (poly p, int v, ring r)
 
static long p_AddExp (poly p, int v, long ee, ring r)
 
static long p_SubExp (poly p, int v, long ee, ring r)
 
static long p_MultExp (poly p, int v, long ee, ring r)
 
static long p_GetExpSum (poly p1, poly p2, int i, ring r)
 
static long p_GetExpDiff (poly p1, poly p2, int i, ring r)
 
static int p_Comp_k_n (poly a, poly b, int k, ring r)
 
static poly p_New (const ring, omBin bin)
 
static poly p_New (ring r)
 
static void p_LmFree (poly p, ring)
 
static void p_LmFree (poly *p, ring)
 
static poly p_LmFreeAndNext (poly p, ring)
 
static void p_LmDelete (poly p, const ring r)
 
static void p_LmDelete0 (poly p, const ring r)
 
static void p_LmDelete (poly *p, const ring r)
 
static poly p_LmDeleteAndNext (poly p, const ring r)
 
unsigned long p_GetMaxExpL (poly p, const ring r, unsigned long l_max=0)
 return the maximal exponent of p in form of the maximal long var
 
poly p_GetMaxExpP (poly p, ring r)
 return monomial r such that GetExp(r,i) is maximum of all monomials in p; coeff == 0, next == NULL, ord is not set
 
static unsigned long p_GetMaxExp (const unsigned long l, const ring r)
 
static unsigned long p_GetMaxExp (const poly p, const ring r)
 
static unsigned long p_GetTotalDegree (const unsigned long l, const ring r, const int number_of_exps)
 
static poly p_Copy_noCheck (poly p, const ring r)
 returns a copy of p (without any additional testing)
 
static poly p_Copy (poly p, const ring r)
 returns a copy of p
 
static poly p_Head (const poly p, const ring r)
 copy the (leading) term of p
 
poly p_Head0 (const poly p, const ring r)
 like p_Head, but allow NULL coeff
 
poly p_CopyPowerProduct (const poly p, const ring r)
 like p_Head, but with coefficient 1
 
poly p_CopyPowerProduct0 (const poly p, const number n, const ring r)
 like p_Head, but with coefficient n
 
static poly p_Copy (poly p, const ring lmRing, const ring tailRing)
 returns a copy of p with Lm(p) from lmRing and Tail(p) from tailRing
 
static void p_Delete (poly *p, const ring r)
 
static void p_Delete (poly *p, const ring lmRing, const ring tailRing)
 
static poly p_ShallowCopyDelete (poly p, const ring r, omBin bin)
 
static poly p_Add_q (poly p, poly q, const ring r)
 
static poly p_Add_q (poly p, poly q, int &lp, int lq, const ring r)
 like p_Add_q, except that if lp == pLength(lp) lq == pLength(lq) then lp == pLength(p+q)
 
static poly p_Mult_nn (poly p, number n, const ring r)
 
static poly p_Mult_nn (poly p, number n, const ring lmRing, const ring tailRing)
 
static poly pp_Mult_nn (poly p, number n, const ring r)
 
static BOOLEAN p_LmIsConstantComp (const poly p, const ring r)
 
static BOOLEAN p_LmIsConstant (const poly p, const ring r)
 
static poly pp_Mult_mm (poly p, poly m, const ring r)
 
static poly pp_mm_Mult (poly p, poly m, const ring r)
 
static poly p_Mult_mm (poly p, poly m, const ring r)
 
static poly p_mm_Mult (poly p, poly m, const ring r)
 
static poly p_Minus_mm_Mult_qq (poly p, const poly m, const poly q, int &lp, int lq, const poly spNoether, const ring r)
 
static poly p_Minus_mm_Mult_qq (poly p, const poly m, const poly q, const ring r)
 
static poly pp_Mult_Coeff_mm_DivSelect (poly p, const poly m, const ring r)
 
static poly pp_Mult_Coeff_mm_DivSelect (poly p, int &lp, const poly m, const ring r)
 
static poly p_Neg (poly p, const ring r)
 
poly _p_Mult_q (poly p, poly q, const int copy, const ring r)
 Returns: p * q, Destroys: if !copy then p, q Assumes: pLength(p) >= 2 pLength(q) >=2, !rIsPluralRing(r)
 
static poly p_Mult_q (poly p, poly q, const ring r)
 
static poly pp_Mult_qq (poly p, poly q, const ring r)
 
static poly p_Plus_mm_Mult_qq (poly p, poly m, poly q, int &lp, int lq, const ring r)
 
static poly p_Plus_mm_Mult_qq (poly p, poly m, poly q, const ring r)
 
static poly p_Merge_q (poly p, poly q, const ring r)
 
static poly p_SortAdd (poly p, const ring r, BOOLEAN revert=FALSE)
 
static poly p_SortMerge (poly p, const ring r, BOOLEAN revert=FALSE)
 
static charp_String (poly p, ring p_ring)
 
static void p_String0 (poly p, ring p_ring)
 
static void p_Write (poly p, ring p_ring)
 
static void p_Write0 (poly p, ring p_ring)
 
static void p_wrp (poly p, ring p_ring)
 
static void p_MemAdd_NegWeightAdjust (poly p, const ring r)
 
static void p_MemSub_NegWeightAdjust (poly p, const ring r)
 
static void p_ExpVectorCopy (poly d_p, poly s_p, const ring r)
 
static poly p_Init (const ring r, omBin bin)
 
static poly p_Init (const ring r)
 
static poly p_LmInit (poly p, const ring r)
 
static poly p_LmInit (poly s_p, const ring s_r, const ring d_r, omBin d_bin)
 
static poly p_LmInit (poly s_p, const ring s_r, const ring d_r)
 
static poly p_GetExp_k_n (poly p, int l, int k, const ring r)
 
static poly p_LmShallowCopyDelete (poly p, const ring r)
 
static void p_ExpVectorAdd (poly p1, poly p2, const ring r)
 
static void p_ExpVectorSum (poly pr, poly p1, poly p2, const ring r)
 
static void p_ExpVectorSub (poly p1, poly p2, const ring r)
 
static void p_ExpVectorAddSub (poly p1, poly p2, poly p3, const ring r)
 
static void p_ExpVectorDiff (poly pr, poly p1, poly p2, const ring r)
 
static BOOLEAN p_ExpVectorEqual (poly p1, poly p2, const ring r)
 
static long p_Totaldegree (poly p, const ring r)
 
static void p_GetExpV (poly p, int *ev, const ring r)
 
static void p_GetExpVL (poly p, int64 *ev, const ring r)
 
static int64 p_GetExpVLV (poly p, int64 *ev, const ring r)
 
static void p_SetExpV (poly p, int *ev, const ring r)
 
static void p_SetExpVL (poly p, int64 *ev, const ring r)
 
static void p_SetExpVLV (poly p, int64 *ev, int64 comp, const ring r)
 
static int p_LmCmp (poly p, poly q, const ring r)
 
static int p_LtCmp (poly p, poly q, const ring r)
 
static int p_LtCmpNoAbs (poly p, poly q, const ring r)
 
static int p_LtCmpOrdSgnDiffM (poly p, poly q, const ring r)
 
static int p_LtCmpOrdSgnDiffP (poly p, poly q, const ring r)
 
static int p_LtCmpOrdSgnEqM (poly p, poly q, const ring r)
 
static int p_LtCmpOrdSgnEqP (poly p, poly q, const ring r)
 
BOOLEAN p_ComparePolys (poly p1, poly p2, const ring r)
 returns TRUE if p1 is a skalar multiple of p2 assume p1 != NULL and p2 != NULL
 
static int p_Cmp (poly p1, poly p2, ring r)
 
static int p_CmpPolys (poly p1, poly p2, ring r)
 
static BOOLEAN _p_LmDivisibleByNoComp (poly a, poly b, const ring r)
 return: FALSE, if there exists i, such that a->exp[i] > b->exp[i] TRUE, otherwise (1) Consider long vars, instead of single exponents (2) Clearly, if la > lb, then FALSE (3) Suppose la <= lb, and consider first bits of single exponents in l: if TRUE, then value of these bits is la ^ lb if FALSE, then la-lb causes an "overflow" into one of those bits, i.e., la ^ lb != la - lb
 
static BOOLEAN _p_LmDivisibleByNoComp (poly a, const ring r_a, poly b, const ring r_b)
 
static BOOLEAN _p_LmDivisibleByNoCompPart (poly a, const ring r_a, poly b, const ring r_b, const int start, const int end)
 
static BOOLEAN _p_LmDivisibleByPart (poly a, const ring r_a, poly b, const ring r_b, const int start, const int end)
 
static BOOLEAN p_LmDivisibleByPart (poly a, poly b, const ring r, const int start, const int end)
 
static BOOLEAN _p_LmDivisibleBy (poly a, poly b, const ring r)
 
static BOOLEAN p_LmDivisibleByNoComp (poly a, poly b, const ring r)
 
static BOOLEAN p_LmDivisibleByNoComp (poly a, const ring ra, poly b, const ring rb)
 
static BOOLEAN p_LmDivisibleBy (poly a, poly b, const ring r)
 
static BOOLEAN p_DivisibleBy (poly a, poly b, const ring r)
 
static BOOLEAN p_LmShortDivisibleBy (poly a, unsigned long sev_a, poly b, unsigned long not_sev_b, const ring r)
 
static BOOLEAN p_LmShortDivisibleByNoComp (poly a, unsigned long sev_a, poly b, unsigned long not_sev_b, const ring r)
 
static BOOLEAN p_IsConstantComp (const poly p, const ring r)
 like the respective p_LmIs* routines, except that p might be empty
 
static BOOLEAN p_IsConstant (const poly p, const ring r)
 
static BOOLEAN p_IsOne (const poly p, const ring R)
 either poly(1) or gen(k)?!
 
static BOOLEAN p_IsConstantPoly (const poly p, const ring r)
 
static BOOLEAN p_IsUnit (const poly p, const ring r)
 
static BOOLEAN p_LmExpVectorAddIsOk (const poly p1, const poly p2, const ring r)
 
void p_Split (poly p, poly *r)
 
BOOLEAN p_HasNotCF (poly p1, poly p2, const ring r)
 
BOOLEAN p_HasNotCFRing (poly p1, poly p2, const ring r)
 
poly p_mInit (const char *s, BOOLEAN &ok, const ring r)
 
const charp_Read (const char *s, poly &p, const ring r)
 
poly p_MDivide (poly a, poly b, const ring r)
 
poly p_DivideM (poly a, poly b, const ring r)
 
poly pp_DivideM (poly a, poly b, const ring r)
 
poly p_Div_nn (poly p, const number n, const ring r)
 
void p_Lcm (const poly a, const poly b, poly m, const ring r)
 
poly p_Lcm (const poly a, const poly b, const ring r)
 
poly p_LcmRat (const poly a, const poly b, const long lCompM, const ring r)
 
poly p_GetCoeffRat (poly p, int ishift, ring r)
 
void p_LmDeleteAndNextRat (poly *p, int ishift, ring r)
 
void p_ContentRat (poly &ph, const ring r)
 
poly p_Diff (poly a, int k, const ring r)
 
poly p_DiffOp (poly a, poly b, BOOLEAN multiply, const ring r)
 
int p_Weight (int c, const ring r)
 
poly p_PolyDiv (poly &p, const poly divisor, const BOOLEAN needResult, const ring r)
 assumes that p and divisor are univariate polynomials in r, mentioning the same variable; assumes divisor != NULL; p may be NULL; assumes a global monomial ordering in r; performs polynomial division of p by divisor:
 
BOOLEAN p_VectorHasUnitB (poly p, int *k, const ring r)
 
void p_VectorHasUnit (poly p, int *k, int *len, const ring r)
 
void p_TakeOutComp (poly *p, long comp, poly *q, int *lq, const ring r)
 Splits *p into two polys: *q which consists of all monoms with component == comp and *p of all other monoms *lq == pLength(*q) On return all components pf *q == 0.
 
poly p_TakeOutComp (poly *p, int k, const ring r)
 
void p_DeleteComp (poly *p, int k, const ring r)
 
void pSetDegProcs (ring r, pFDegProc new_FDeg, pLDegProc new_lDeg=NULL)
 
void pRestoreDegProcs (ring r, pFDegProc old_FDeg, pLDegProc old_lDeg)
 
void p_SetModDeg (intvec *w, ring r)
 
poly pp_Jet (poly p, int m, const ring R)
 
poly p_Jet (poly p, int m, const ring R)
 
poly pp_JetW (poly p, int m, int *w, const ring R)
 
poly p_JetW (poly p, int m, int *w, const ring R)
 
poly n_PermNumber (const number z, const int *par_perm, const int OldPar, const ring src, const ring dst)
 
poly p_PermPoly (poly p, const int *perm, const ring OldRing, const ring dst, nMapFunc nMap, const int *par_perm=NULL, int OldPar=0, BOOLEAN use_mult=FALSE)
 
poly p_Series (int n, poly p, poly u, intvec *w, const ring R)
 
int p_Var (poly mi, const ring r)
 
int p_LowVar (poly p, const ring r)
 the minimal index of used variables - 1
 
void p_Shift (poly *p, int i, const ring r)
 shifts components of the vector p by i
 
int p_Compare (const poly a, const poly b, const ring R)
 
poly p_GcdMon (poly f, poly g, const ring r)
 polynomial gcd for f=mon
 
poly p_Div_mm (poly p, const poly m, const ring r)
 divide polynomial by monomial
 
int p_MaxExpPerVar (poly p, int i, const ring r)
 max exponent of variable x_i in p
 

Macro Definition Documentation

◆ __p_Mult_nn

#define __p_Mult_nn (   p,
  n,
 
)    r->p_Procs->p_Mult_nn(p, n, r)

Definition at line 971 of file p_polys.h.

◆ __pp_Mult_nn

#define __pp_Mult_nn (   p,
  n,
 
)    r->p_Procs->pp_Mult_nn(p, n, r)

Definition at line 1002 of file p_polys.h.

◆ _p_LmCmpAction

#define _p_LmCmpAction (   p,
  q,
  r,
  actionE,
  actionG,
  actionS 
)
Value:
p_MemCmp_LengthGeneral_OrdGeneral(p->exp, q->exp, r->CmpL_Size, r->ordsgn, \
int p
Definition cfModGcd.cc:4079
#define p_MemCmp_LengthGeneral_OrdGeneral(s1, s2, length, ordsgn, actionE, actionG, actionS)
Definition p_MemCmp.h:719

Definition at line 1276 of file p_polys.h.

1281 {} while (0)
1282
1283
1284
1285/***************************************************************
1286 *
1287 * Allocation/Initalization/Deletion
1288 *
1289 ***************************************************************/
1290// adjustments for negative weights
1291static inline void p_MemAdd_NegWeightAdjust(poly p, const ring r)
1292{
1293 if (r->NegWeightL_Offset != NULL)
1294 {
1295 for (int i=r->NegWeightL_Size-1; i>=0; i--)
1296 {
1297 p->exp[r->NegWeightL_Offset[i]] -= POLY_NEGWEIGHT_OFFSET;
1298 }
1299 }
1300}
1301static inline void p_MemSub_NegWeightAdjust(poly p, const ring r)
1302{
1303 if (r->NegWeightL_Offset != NULL)
1304 {
1305 for (int i=r->NegWeightL_Size-1; i>=0; i--)
1306 {
1307 p->exp[r->NegWeightL_Offset[i]] += POLY_NEGWEIGHT_OFFSET;
1308 }
1309 }
1310}
1311// ExpVextor(d_p) = ExpVector(s_p)
1312static inline void p_ExpVectorCopy(poly d_p, poly s_p, const ring r)
1313{
1316 memcpy(d_p->exp, s_p->exp, r->ExpL_Size*sizeof(long));
1317}
1318
1319static inline poly p_Init(const ring r, omBin bin)
1320{
1321 p_CheckRing1(r);
1322 pAssume1(bin != NULL && omSizeWOfBin(r->PolyBin) == omSizeWOfBin(bin));
1323 poly p;
1324 omTypeAlloc0Bin(poly, p, bin);
1326 p_SetRingOfLm(p, r);
1327 return p;
1328}
1329static inline poly p_Init(const ring r)
1330{
1331 return p_Init(r, r->PolyBin);
1332}
1333
1334static inline poly p_LmInit(poly p, const ring r)
1335{
1337 poly np;
1338 omTypeAllocBin(poly, np, r->PolyBin);
1339 p_SetRingOfLm(np, r);
1340 memcpy(np->exp, p->exp, r->ExpL_Size*sizeof(long));
1341 pNext(np) = NULL;
1342 pSetCoeff0(np, NULL);
1343 return np;
1344}
1345static inline poly p_LmInit(poly s_p, const ring s_r, const ring d_r, omBin d_bin)
1346{
1349 pAssume1(d_r->N <= s_r->N);
1350 poly d_p = p_Init(d_r, d_bin);
1351 for (unsigned i=d_r->N; i!=0; i--)
1352 {
1353 p_SetExp(d_p, i, p_GetExp(s_p, i,s_r), d_r);
1354 }
1355 if (rRing_has_Comp(d_r))
1356 {
1358 }
1359 p_Setm(d_p, d_r);
1360 return d_p;
1361}
1362static inline poly p_LmInit(poly s_p, const ring s_r, const ring d_r)
1363{
1364 pAssume1(d_r != NULL);
1365 return p_LmInit(s_p, s_r, d_r, d_r->PolyBin);
1366}
1367
1368// set all exponents l..k to 0, assume exp. k+1..n and 1..l-1 are in
1369// different blocks
1370// set coeff to 1
1371static inline poly p_GetExp_k_n(poly p, int l, int k, const ring r)
1372{
1373 if (p == NULL) return NULL;
1375 poly np;
1376 omTypeAllocBin(poly, np, r->PolyBin);
1377 p_SetRingOfLm(np, r);
1378 memcpy(np->exp, p->exp, r->ExpL_Size*sizeof(long));
1379 pNext(np) = NULL;
1380 pSetCoeff0(np, n_Init(1, r->cf));
1381 int i;
1382 for(i=l;i<=k;i++)
1383 {
1384 //np->exp[(r->VarOffset[i] & 0xffffff)] =0;
1385 p_SetExp(np,i,0,r);
1386 }
1387 p_Setm(np,r);
1388 return np;
1389}
1390
1391// simialar to p_ShallowCopyDelete but does it only for leading monomial
1392static inline poly p_LmShallowCopyDelete(poly p, const ring r)
1393{
1395 pAssume1(omSizeWOfBin(bin) == omSizeWOfBin(r->PolyBin));
1396 poly new_p = p_New(r);
1397 memcpy(new_p->exp, p->exp, r->ExpL_Size*sizeof(long));
1399 pNext(new_p) = pNext(p);
1401 return new_p;
1402}
1403
1404/***************************************************************
1405 *
1406 * Operation on ExpVectors
1407 *
1408 ***************************************************************/
1409// ExpVector(p1) += ExpVector(p2)
1410static inline void p_ExpVectorAdd(poly p1, poly p2, const ring r)
1411{
1412 p_LmCheckPolyRing1(p1, r);
1413 p_LmCheckPolyRing1(p2, r);
1414#if PDEBUG >= 1
1415 for (int i=1; i<=r->N; i++)
1416 pAssume1((unsigned long) (p_GetExp(p1, i, r) + p_GetExp(p2, i, r)) <= r->bitmask);
1417 pAssume1(p_GetComp(p1, r) == 0 || p_GetComp(p2, r) == 0);
1418#endif
1419
1420 p_MemAdd_LengthGeneral(p1->exp, p2->exp, r->ExpL_Size);
1422}
1423// ExpVector(pr) = ExpVector(p1) + ExpVector(p2)
1424static inline void p_ExpVectorSum(poly pr, poly p1, poly p2, const ring r)
1425{
1426 p_LmCheckPolyRing1(p1, r);
1427 p_LmCheckPolyRing1(p2, r);
1429#if PDEBUG >= 1
1430 for (int i=1; i<=r->N; i++)
1431 pAssume1((unsigned long) (p_GetExp(p1, i, r) + p_GetExp(p2, i, r)) <= r->bitmask);
1432 pAssume1(p_GetComp(p1, r) == 0 || p_GetComp(p2, r) == 0);
1433#endif
1434
1435 p_MemSum_LengthGeneral(pr->exp, p1->exp, p2->exp, r->ExpL_Size);
1437}
1438// ExpVector(p1) -= ExpVector(p2)
1439static inline void p_ExpVectorSub(poly p1, poly p2, const ring r)
1440{
1441 p_LmCheckPolyRing1(p1, r);
1442 p_LmCheckPolyRing1(p2, r);
1443#if PDEBUG >= 1
1444 for (int i=1; i<=r->N; i++)
1445 pAssume1(p_GetExp(p1, i, r) >= p_GetExp(p2, i, r));
1446 pAssume1(p_GetComp(p1, r) == 0 || p_GetComp(p2, r) == 0 ||
1447 p_GetComp(p1, r) == p_GetComp(p2, r));
1448#endif
1449
1450 p_MemSub_LengthGeneral(p1->exp, p2->exp, r->ExpL_Size);
1452}
1453
1454// ExpVector(p1) += ExpVector(p2) - ExpVector(p3)
1455static inline void p_ExpVectorAddSub(poly p1, poly p2, poly p3, const ring r)
1456{
1457 p_LmCheckPolyRing1(p1, r);
1458 p_LmCheckPolyRing1(p2, r);
1460#if PDEBUG >= 1
1461 for (int i=1; i<=r->N; i++)
1462 pAssume1(p_GetExp(p1, i, r) + p_GetExp(p2, i, r) >= p_GetExp(p3, i, r));
1463 pAssume1(p_GetComp(p1, r) == 0 ||
1464 (p_GetComp(p2, r) - p_GetComp(p3, r) == 0) ||
1465 (p_GetComp(p1, r) == p_GetComp(p2, r) - p_GetComp(p3, r)));
1466#endif
1467
1468 p_MemAddSub_LengthGeneral(p1->exp, p2->exp, p3->exp, r->ExpL_Size);
1469 // no need to adjust in case of NegWeights
1470}
1471
1472// ExpVector(pr) = ExpVector(p1) - ExpVector(p2)
1473static inline void p_ExpVectorDiff(poly pr, poly p1, poly p2, const ring r)
1474{
1475 p_LmCheckPolyRing1(p1, r);
1476 p_LmCheckPolyRing1(p2, r);
1478#if PDEBUG >= 2
1479 for (int i=1; i<=r->N; i++)
1480 pAssume1(p_GetExp(p1, i, r) >= p_GetExp(p2, i, r));
1481 pAssume1(!rRing_has_Comp(r) || p_GetComp(p1, r) == p_GetComp(p2, r));
1482#endif
1483
1484 p_MemDiff_LengthGeneral(pr->exp, p1->exp, p2->exp, r->ExpL_Size);
1486}
1487
1488static inline BOOLEAN p_ExpVectorEqual(poly p1, poly p2, const ring r)
1489{
1490 p_LmCheckPolyRing1(p1, r);
1491 p_LmCheckPolyRing1(p2, r);
1492
1493 unsigned i = r->ExpL_Size;
1494 unsigned long *ep = p1->exp;
1495 unsigned long *eq = p2->exp;
1496
1497 do
1498 {
1499 i--;
1500 if (ep[i] != eq[i]) return FALSE;
1501 }
1502 while (i!=0);
1503 return TRUE;
1504}
1505
1506static inline long p_Totaldegree(poly p, const ring r)
1507{
1509 unsigned long s = p_GetTotalDegree(p->exp[r->VarL_Offset[0]],
1510 r,
1511 r->ExpPerLong);
1512 for (unsigned i=r->VarL_Size-1; i!=0; i--)
1513 {
1514 s += p_GetTotalDegree(p->exp[r->VarL_Offset[i]], r,r->ExpPerLong);
1515 }
1516 return (long)s;
1517}
1518
1519static inline void p_GetExpV(poly p, int *ev, const ring r)
1520{
1522 for (unsigned j = r->N; j!=0; j--)
1523 ev[j] = p_GetExp(p, j, r);
1524
1525 ev[0] = p_GetComp(p, r);
1526}
1527// p_GetExpVL is used in Singular,jl
1528static inline void p_GetExpVL(poly p, int64 *ev, const ring r)
1529{
1531 for (unsigned j = r->N; j!=0; j--)
1532 ev[j-1] = p_GetExp(p, j, r);
1533}
1534// p_GetExpVLV is used in Singular,jl
1535static inline int64 p_GetExpVLV(poly p, int64 *ev, const ring r)
1536{
1538 for (unsigned j = r->N; j!=0; j--)
1539 ev[j-1] = p_GetExp(p, j, r);
1540 return (int64)p_GetComp(p,r);
1541}
1542// p_GetExpVL is used in Singular,jl
1543static inline void p_SetExpV(poly p, int *ev, const ring r)
1544{
1546 for (unsigned j = r->N; j!=0; j--)
1547 p_SetExp(p, j, ev[j], r);
1548
1549 if(ev[0]!=0) p_SetComp(p, ev[0],r);
1550 p_Setm(p, r);
1551}
1552static inline void p_SetExpVL(poly p, int64 *ev, const ring r)
1553{
1555 for (unsigned j = r->N; j!=0; j--)
1556 p_SetExp(p, j, ev[j-1], r);
1557 p_SetComp(p, 0,r);
1558
1559 p_Setm(p, r);
1560}
1561
1562// p_SetExpVLV is used in Singular,jl
1563static inline void p_SetExpVLV(poly p, int64 *ev, int64 comp, const ring r)
1564{
1566 for (unsigned j = r->N; j!=0; j--)
1567 p_SetExp(p, j, ev[j-1], r);
1568 p_SetComp(p, comp,r);
1569
1570 p_Setm(p, r);
1571}
1572
1573/***************************************************************
1574 *
1575 * Comparison w.r.t. monomial ordering
1576 *
1577 ***************************************************************/
1578
1579static inline int p_LmCmp(poly p, poly q, const ring r)
1580{
1582 p_LmCheckPolyRing1(q, r);
1583
1584 const unsigned long* _s1 = ((unsigned long*) p->exp);
1585 const unsigned long* _s2 = ((unsigned long*) q->exp);
1586 REGISTER unsigned long _v1;
1587 REGISTER unsigned long _v2;
1588 const unsigned long _l = r->CmpL_Size;
1589
1590 REGISTER unsigned long _i=0;
1591
1593 _v1 = _s1[_i];
1594 _v2 = _s2[_i];
1595 if (_v1 == _v2)
1596 {
1597 _i++;
1598 if (_i == _l) return 0;
1600 }
1601 const long* _ordsgn = (long*) r->ordsgn;
1602#if 1 /* two variants*/
1603 if (_v1 > _v2)
1604 {
1605 return _ordsgn[_i];
1606 }
1607 return -(_ordsgn[_i]);
1608#else
1609 if (_v1 > _v2)
1610 {
1611 if (_ordsgn[_i] == 1) return 1;
1612 return -1;
1613 }
1614 if (_ordsgn[_i] == 1) return -1;
1615 return 1;
1616#endif
1617}
1618
1619// The coefficient will be compared in absolute value
1620static inline int p_LtCmp(poly p, poly q, const ring r)
1621{
1622 int res = p_LmCmp(p,q,r);
1623 if(res == 0)
1624 {
1625 if(p_GetCoeff(p,r) == NULL || p_GetCoeff(q,r) == NULL)
1626 return res;
1627 number pc = n_Copy(p_GetCoeff(p,r),r->cf);
1628 number qc = n_Copy(p_GetCoeff(q,r),r->cf);
1629 if(!n_GreaterZero(pc,r->cf))
1630 pc = n_InpNeg(pc,r->cf);
1631 if(!n_GreaterZero(qc,r->cf))
1632 qc = n_InpNeg(qc,r->cf);
1633 if(n_Greater(pc,qc,r->cf))
1634 res = 1;
1635 else if(n_Greater(qc,pc,r->cf))
1636 res = -1;
1637 else if(n_Equal(pc,qc,r->cf))
1638 res = 0;
1639 n_Delete(&pc,r->cf);
1640 n_Delete(&qc,r->cf);
1641 }
1642 return res;
1643}
1644
1645// The coefficient will be compared in absolute value
1646static inline int p_LtCmpNoAbs(poly p, poly q, const ring r)
1647{
1648 int res = p_LmCmp(p,q,r);
1649 if(res == 0)
1650 {
1651 if(p_GetCoeff(p,r) == NULL || p_GetCoeff(q,r) == NULL)
1652 return res;
1653 number pc = p_GetCoeff(p,r);
1654 number qc = p_GetCoeff(q,r);
1655 if(n_Greater(pc,qc,r->cf))
1656 res = 1;
1657 if(n_Greater(qc,pc,r->cf))
1658 res = -1;
1659 if(n_Equal(pc,qc,r->cf))
1660 res = 0;
1661 }
1662 return res;
1663}
1664
1665#ifdef HAVE_RINGS
1666// This is the equivalent of pLmCmp(p,q) != -currRing->OrdSgn for rings
1667// It is used in posInTRing
1668static inline int p_LtCmpOrdSgnDiffM(poly p, poly q, const ring r)
1669{
1670 return(p_LtCmp(p,q,r) == r->OrdSgn);
1671}
1672#endif
1673
1674#ifdef HAVE_RINGS
1675// This is the equivalent of pLmCmp(p,q) != currRing->OrdSgn for rings
1676// It is used in posInTRing
1677static inline int p_LtCmpOrdSgnDiffP(poly p, poly q, const ring r)
1678{
1679 if(r->OrdSgn == 1)
1680 {
1681 return(p_LmCmp(p,q,r) == -1);
1682 }
1683 else
1684 {
1685 return(p_LtCmp(p,q,r) != -1);
1686 }
1687}
1688#endif
1689
1690#ifdef HAVE_RINGS
1691// This is the equivalent of pLmCmp(p,q) == -currRing->OrdSgn for rings
1692// It is used in posInTRing
1693static inline int p_LtCmpOrdSgnEqM(poly p, poly q, const ring r)
1694{
1695 return(p_LtCmp(p,q,r) == -r->OrdSgn);
1696}
1697#endif
1698
1699#ifdef HAVE_RINGS
1700// This is the equivalent of pLmCmp(p,q) == currRing->OrdSgn for rings
1701// It is used in posInTRing
1702static inline int p_LtCmpOrdSgnEqP(poly p, poly q, const ring r)
1703{
1704 return(p_LtCmp(p,q,r) == r->OrdSgn);
1705}
1706#endif
1707
1708/// returns TRUE if p1 is a skalar multiple of p2
1709/// assume p1 != NULL and p2 != NULL
1710BOOLEAN p_ComparePolys(poly p1,poly p2, const ring r);
1711
1712
1713/***************************************************************
1714 *
1715 * Comparisons: they are all done without regarding coeffs
1716 *
1717 ***************************************************************/
1718#define p_LmCmpAction(p, q, r, actionE, actionG, actionS) \
1719 _p_LmCmpAction(p, q, r, actionE, actionG, actionS)
1720
1721// returns 1 if ExpVector(p)==ExpVector(q): does not compare numbers !!
1722#define p_LmEqual(p1, p2, r) p_ExpVectorEqual(p1, p2, r)
1723
1724// pCmp: args may be NULL
1725// returns: (p2==NULL ? 1 : (p1 == NULL ? -1 : p_LmCmp(p1, p2)))
1726static inline int p_Cmp(poly p1, poly p2, ring r)
1727{
1728 if (p2==NULL)
1729 {
1730 if (p1==NULL) return 0;
1731 return 1;
1732 }
1733 if (p1==NULL)
1734 return -1;
1735 return p_LmCmp(p1,p2,r);
1736}
1737
1738static inline int p_CmpPolys(poly p1, poly p2, ring r)
1739{
1740 if (p2==NULL)
1741 {
1742 if (p1==NULL) return 0;
1743 return 1;
1744 }
1745 if (p1==NULL)
1746 return -1;
1747 return p_ComparePolys(p1,p2,r);
1748}
1749
1750
1751/***************************************************************
1752 *
1753 * divisibility
1754 *
1755 ***************************************************************/
1756/// return: FALSE, if there exists i, such that a->exp[i] > b->exp[i]
1757/// TRUE, otherwise
1758/// (1) Consider long vars, instead of single exponents
1759/// (2) Clearly, if la > lb, then FALSE
1760/// (3) Suppose la <= lb, and consider first bits of single exponents in l:
1761/// if TRUE, then value of these bits is la ^ lb
1762/// if FALSE, then la-lb causes an "overflow" into one of those bits, i.e.,
1763/// la ^ lb != la - lb
1764static inline BOOLEAN _p_LmDivisibleByNoComp(poly a, poly b, const ring r)
1765{
1766 int i=r->VarL_Size - 1;
1767 unsigned long divmask = r->divmask;
1768 unsigned long la, lb;
1769
1770 if (r->VarL_LowIndex >= 0)
1771 {
1772 i += r->VarL_LowIndex;
1773 do
1774 {
1775 la = a->exp[i];
1776 lb = b->exp[i];
1777 if ((la > lb) ||
1778 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask)))
1779 {
1781 return FALSE;
1782 }
1783 i--;
1784 }
1785 while (i>=r->VarL_LowIndex);
1786 }
1787 else
1788 {
1789 do
1790 {
1791 la = a->exp[r->VarL_Offset[i]];
1792 lb = b->exp[r->VarL_Offset[i]];
1793 if ((la > lb) ||
1794 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask)))
1795 {
1797 return FALSE;
1798 }
1799 i--;
1800 }
1801 while (i>=0);
1802 }
1803/*#ifdef HAVE_RINGS
1804 pDivAssume(p_DebugLmDivisibleByNoComp(a, b, r) == n_DivBy(p_GetCoeff(b, r), p_GetCoeff(a, r), r->cf));
1805 return (!rField_is_Ring(r)) || n_DivBy(p_GetCoeff(b, r), p_GetCoeff(a, r), r->cf);
1806#else
1807*/
1809 return TRUE;
1810//#endif
1811}
1812
1813static inline BOOLEAN _p_LmDivisibleByNoComp(poly a, const ring r_a, poly b, const ring r_b)
1814{
1815 int i=r_a->N;
1816 pAssume1(r_a->N == r_b->N);
1817
1818 do
1819 {
1820 if (p_GetExp(a,i,r_a) > p_GetExp(b,i,r_b))
1821 {
1822 return FALSE;
1823 }
1824 i--;
1825 }
1826 while (i);
1827/*#ifdef HAVE_RINGS
1828 return n_DivBy(p_GetCoeff(b, r_b), p_GetCoeff(a, r_a), r_a->cf);
1829#else
1830*/
1831 return TRUE;
1832//#endif
1833}
1834
1835#ifdef HAVE_RATGRING
1836static inline BOOLEAN _p_LmDivisibleByNoCompPart(poly a, const ring r_a, poly b, const ring r_b,const int start, const int end)
1837{
1838 int i=end;
1839 pAssume1(r_a->N == r_b->N);
1840
1841 do
1842 {
1843 if (p_GetExp(a,i,r_a) > p_GetExp(b,i,r_b))
1844 return FALSE;
1845 i--;
1846 }
1847 while (i>=start);
1848/*#ifdef HAVE_RINGS
1849 return n_DivBy(p_GetCoeff(b, r_b), p_GetCoeff(a, r_a), r_a->cf);
1850#else
1851*/
1852 return TRUE;
1853//#endif
1854}
1855static inline BOOLEAN _p_LmDivisibleByPart(poly a, const ring r_a, poly b, const ring r_b,const int start, const int end)
1856{
1857 if (p_GetComp(a, r_a) == 0 || p_GetComp(a,r_a) == p_GetComp(b,r_b))
1858 return _p_LmDivisibleByNoCompPart(a, r_a, b, r_b,start,end);
1859 return FALSE;
1860}
1861static inline BOOLEAN p_LmDivisibleByPart(poly a, poly b, const ring r,const int start, const int end)
1862{
1864 pIfThen1(a != NULL, p_LmCheckPolyRing1(b, r));
1865 if (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r))
1866 return _p_LmDivisibleByNoCompPart(a, r, b, r,start, end);
1867 return FALSE;
1868}
1869#endif
1870static inline BOOLEAN _p_LmDivisibleBy(poly a, poly b, const ring r)
1871{
1872 if (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r))
1873 return _p_LmDivisibleByNoComp(a, b, r);
1874 return FALSE;
1875}
1876static inline BOOLEAN p_LmDivisibleByNoComp(poly a, poly b, const ring r)
1877{
1878 p_LmCheckPolyRing1(a, r);
1880 return _p_LmDivisibleByNoComp(a, b, r);
1881}
1882
1883static inline BOOLEAN p_LmDivisibleByNoComp(poly a, const ring ra, poly b, const ring rb)
1884{
1887 return _p_LmDivisibleByNoComp(a, ra, b, rb);
1888}
1889
1890static inline BOOLEAN p_LmDivisibleBy(poly a, poly b, const ring r)
1891{
1893 pIfThen1(a != NULL, p_LmCheckPolyRing1(b, r));
1894 if (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r))
1895 return _p_LmDivisibleByNoComp(a, b, r);
1896 return FALSE;
1897}
1898
1899static inline BOOLEAN p_DivisibleBy(poly a, poly b, const ring r)
1900{
1902 pIfThen1(a!=NULL, p_LmCheckPolyRing1(a, r));
1903
1904 if (a != NULL && (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r)))
1905 return _p_LmDivisibleByNoComp(a,b,r);
1906 return FALSE;
1907}
1908
1909static inline BOOLEAN p_LmShortDivisibleBy(poly a, unsigned long sev_a,
1910 poly b, unsigned long not_sev_b, const ring r)
1911{
1912 p_LmCheckPolyRing1(a, r);
1914#ifndef PDIV_DEBUG
1915 _pPolyAssume2(p_GetShortExpVector(a, r) == sev_a, a, r);
1917
1918 if (sev_a & not_sev_b)
1919 {
1921 return FALSE;
1922 }
1923 return p_LmDivisibleBy(a, b, r);
1924#else
1925 return pDebugLmShortDivisibleBy(a, sev_a, r, b, not_sev_b, r);
1926#endif
1927}
1928
1929static inline BOOLEAN p_LmShortDivisibleByNoComp(poly a, unsigned long sev_a,
1930 poly b, unsigned long not_sev_b, const ring r)
1931{
1932 p_LmCheckPolyRing1(a, r);
1934#ifndef PDIV_DEBUG
1935 _pPolyAssume2(p_GetShortExpVector(a, r) == sev_a, a, r);
1937
1938 if (sev_a & not_sev_b)
1939 {
1941 return FALSE;
1942 }
1943 return p_LmDivisibleByNoComp(a, b, r);
1944#else
1946#endif
1947}
1948
1949/***************************************************************
1950 *
1951 * Misc things on Lm
1952 *
1953 ***************************************************************/
1954
1955
1956/// like the respective p_LmIs* routines, except that p might be empty
1957static inline BOOLEAN p_IsConstantComp(const poly p, const ring r)
1958{
1959 if (p == NULL) return TRUE;
1960 return (pNext(p)==NULL) && p_LmIsConstantComp(p, r);
1961}
1962
1963static inline BOOLEAN p_IsConstant(const poly p, const ring r)
1964{
1965 if (p == NULL) return TRUE;
1966 return (pNext(p)==NULL) && p_LmIsConstant(p, r);
1967}
1968
1969/// either poly(1) or gen(k)?!
1970static inline BOOLEAN p_IsOne(const poly p, const ring R)
1971{
1972 if (p == NULL) return FALSE; /* TODO check if 0 == 1 */
1973 p_Test(p, R);
1974 return (p_IsConstant(p, R) && n_IsOne(p_GetCoeff(p, R), R->cf));
1975}
1976
1977static inline BOOLEAN p_IsConstantPoly(const poly p, const ring r)
1978{
1979 p_Test(p, r);
1980 poly pp=p;
1981 while(pp!=NULL)
1982 {
1983 if (! p_LmIsConstantComp(pp, r))
1984 return FALSE;
1985 pIter(pp);
1986 }
1987 return TRUE;
1988}
1989
1990static inline BOOLEAN p_IsUnit(const poly p, const ring r)
1991{
1992 if (p == NULL) return FALSE;
1993 if (rField_is_Ring(r))
1994 return (p_LmIsConstant(p, r) && n_IsUnit(pGetCoeff(p),r->cf));
1995 return p_LmIsConstant(p, r);
1996}
1997
1998static inline BOOLEAN p_LmExpVectorAddIsOk(const poly p1, const poly p2,
1999 const ring r)
2000{
2001 p_LmCheckPolyRing(p1, r);
2002 p_LmCheckPolyRing(p2, r);
2003 unsigned long l1, l2, divmask = r->divmask;
2004 int i;
2005
2006 for (i=0; i<r->VarL_Size; i++)
2007 {
2008 l1 = p1->exp[r->VarL_Offset[i]];
2009 l2 = p2->exp[r->VarL_Offset[i]];
2010 // do the divisiblity trick
2011 if ( (l1 > ULONG_MAX - l2) ||
2012 (((l1 & divmask) ^ (l2 & divmask)) != ((l1 + l2) & divmask)))
2013 return FALSE;
2014 }
2015 return TRUE;
2016}
2017void p_Split(poly p, poly * r); /*p => IN(p), r => REST(p) */
2018BOOLEAN p_HasNotCF(poly p1, poly p2, const ring r);
2019BOOLEAN p_HasNotCFRing(poly p1, poly p2, const ring r);
2020poly p_mInit(const char *s, BOOLEAN &ok, const ring r); /* monom s -> poly, interpreter */
2021const char * p_Read(const char *s, poly &p,const ring r); /* monom -> poly */
2022poly p_MDivide(poly a, poly b, const ring r);
2023poly p_DivideM(poly a, poly b, const ring r);
2024poly pp_DivideM(poly a, poly b, const ring r);
2025poly p_Div_nn(poly p, const number n, const ring r);
2026
2027// returns the LCM of the head terms of a and b in *m, does not p_Setm
2028void p_Lcm(const poly a, const poly b, poly m, const ring r);
2029// returns the LCM of the head terms of a and b, does p_Setm
2030poly p_Lcm(const poly a, const poly b, const ring r);
2031
2032#ifdef HAVE_RATGRING
2033poly p_LcmRat(const poly a, const poly b, const long lCompM, const ring r);
2034poly p_GetCoeffRat(poly p, int ishift, ring r);
2035void p_LmDeleteAndNextRat(poly *p, int ishift, ring r);
2036void p_ContentRat(poly &ph, const ring r);
2037#endif /* ifdef HAVE_RATGRING */
2038
2039
2040poly p_Diff(poly a, int k, const ring r);
2041poly p_DiffOp(poly a, poly b,BOOLEAN multiply, const ring r);
2042int p_Weight(int c, const ring r);
2043
2044/// assumes that p and divisor are univariate polynomials in r,
2045/// mentioning the same variable;
2046/// assumes divisor != NULL;
2047/// p may be NULL;
2048/// assumes a global monomial ordering in r;
2049/// performs polynomial division of p by divisor:
2050/// - afterwards p contains the remainder of the division, i.e.,
2051/// p_before = result * divisor + p_afterwards;
2052/// - if needResult == TRUE, then the method computes and returns 'result',
2053/// otherwise NULL is returned (This parametrization can be used when
2054/// one is only interested in the remainder of the division. In this
2055/// case, the method will be slightly faster.)
2056/// leaves divisor unmodified
2057poly p_PolyDiv(poly &p, const poly divisor, const BOOLEAN needResult, const ring r);
2058
2059/* syszygy stuff */
2060BOOLEAN p_VectorHasUnitB(poly p, int * k, const ring r);
2061void p_VectorHasUnit(poly p, int * k, int * len, const ring r);
2062/// Splits *p into two polys: *q which consists of all monoms with
2063/// component == comp and *p of all other monoms *lq == pLength(*q)
2064/// On return all components pf *q == 0
2065void p_TakeOutComp(poly *p, long comp, poly *q, int *lq, const ring r);
2066
2067// This is something weird -- Don't use it, unless you know what you are doing
2068poly p_TakeOutComp(poly * p, int k, const ring r);
2069
2070void p_DeleteComp(poly * p,int k, const ring r);
2071
2072/*-------------ring management:----------------------*/
2073
2074// resets the pFDeg and pLDeg: if pLDeg is not given, it is
2075// set to currRing->pLDegOrig, i.e. to the respective LDegProc which
2076// only uses pFDeg (and not pDeg, or pTotalDegree, etc).
2077// If you use this, make sure your procs does not make any assumptions
2078// on ordering and/or OrdIndex -- otherwise they might return wrong results
2079// on strat->tailRing
2081// restores pFDeg and pLDeg:
2083
2084/*-------------pComp for syzygies:-------------------*/
2085void p_SetModDeg(intvec *w, ring r);
2086
2087/*------------ Jet ----------------------------------*/
2088poly pp_Jet(poly p, int m, const ring R);
2089poly p_Jet(poly p, int m,const ring R);
2090poly pp_JetW(poly p, int m, int *w, const ring R);
2091poly p_JetW(poly p, int m, int *w, const ring R);
2092
2093poly n_PermNumber(const number z, const int *par_perm, const int OldPar, const ring src, const ring dst);
2094
2095poly p_PermPoly (poly p, const int * perm,const ring OldRing, const ring dst,
2096 nMapFunc nMap, const int *par_perm=NULL, int OldPar=0,
2098
2099/*----------------------------------------------------*/
2100poly p_Series(int n,poly p,poly u, intvec *w, const ring R);
2101
2102/*----------------------------------------------------*/
2103int p_Var(poly mi, const ring r);
2104/// the minimal index of used variables - 1
2105int p_LowVar (poly p, const ring r);
2106
2107/*----------------------------------------------------*/
2108/// shifts components of the vector p by i
2109void p_Shift (poly * p,int i, const ring r);
2110/*----------------------------------------------------*/
2111
2112int p_Compare(const poly a, const poly b, const ring R);
2113
2114/// polynomial gcd for f=mon
2115poly p_GcdMon(poly f, poly g, const ring r);
2116
2117/// divide polynomial by monomial
2118poly p_Div_mm(poly p, const poly m, const ring r);
2119
2120
2121/// max exponent of variable x_i in p
2122int p_MaxExpPerVar(poly p, int i, const ring r);
2123#endif // P_POLYS_H
2124
long int64
Definition auxiliary.h:68
int BOOLEAN
Definition auxiliary.h:87
#define TRUE
Definition auxiliary.h:100
#define FALSE
Definition auxiliary.h:96
CanonicalForm FACTORY_PUBLIC pp(const CanonicalForm &)
CanonicalForm pp ( const CanonicalForm & f )
Definition cf_gcd.cc:676
int l
Definition cfEzgcd.cc:100
int m
Definition cfEzgcd.cc:128
int i
Definition cfEzgcd.cc:132
int k
Definition cfEzgcd.cc:99
g
Definition cfModGcd.cc:4091
CanonicalForm b
Definition cfModGcd.cc:4104
FILE * f
Definition checklibs.c:9
static FORCE_INLINE number n_Copy(number n, const coeffs r)
return a copy of 'n'
Definition coeffs.h:448
static FORCE_INLINE BOOLEAN n_IsUnit(number n, const coeffs r)
TRUE iff n has a multiplicative inverse in the given coeff field/ring r.
Definition coeffs.h:512
static FORCE_INLINE BOOLEAN n_GreaterZero(number n, const coeffs r)
ordered fields: TRUE iff 'n' is positive; in Z/pZ: TRUE iff 0 < m <= roundedBelow(p/2),...
Definition coeffs.h:491
static FORCE_INLINE number n_InpNeg(number n, const coeffs r)
in-place negation of n MUST BE USED: n = n_InpNeg(n) (no copy is returned)
Definition coeffs.h:554
static FORCE_INLINE BOOLEAN n_Greater(number a, number b, const coeffs r)
ordered fields: TRUE iff 'a' is larger than 'b'; in Z/pZ: TRUE iff la > lb, where la and lb are the l...
Definition coeffs.h:508
static FORCE_INLINE void n_Delete(number *p, const coeffs r)
delete 'p'
Definition coeffs.h:452
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
Definition coeffs.h:535
static FORCE_INLINE BOOLEAN n_Equal(number a, number b, const coeffs r)
TRUE iff 'a' and 'b' represent the same number; they may have different representations.
Definition coeffs.h:457
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
Definition coeffs.h:73
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition coeffs.h:465
const CanonicalForm int s
Definition facAbsFact.cc:51
CanonicalForm res
Definition facAbsFact.cc:60
const CanonicalForm & w
Definition facAbsFact.cc:51
int j
Definition facHensel.cc:110
int comp(const CanonicalForm &A, const CanonicalForm &B)
compare polynomials
#define p_GetComp(p, r)
Definition monomials.h:64
#define pIfThen1(cond, check)
Definition monomials.h:179
#define pIter(p)
Definition monomials.h:37
#define pNext(p)
Definition monomials.h:36
#define p_LmCheckPolyRing1(p, r)
Definition monomials.h:177
#define pAssume1(cond)
Definition monomials.h:171
#define pSetCoeff0(p, n)
Definition monomials.h:59
#define p_GetCoeff(p, r)
Definition monomials.h:50
#define p_CheckRing1(r)
Definition monomials.h:178
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
Definition monomials.h:44
#define _pPolyAssume2(cond, p, r)
Definition monomials.h:195
#define POLY_NEGWEIGHT_OFFSET
Definition monomials.h:236
#define p_SetRingOfLm(p, r)
Definition monomials.h:144
#define rRing_has_Comp(r)
Definition monomials.h:266
Definition lq.h:40
#define omTypeAlloc0Bin(type, addr, bin)
#define omTypeAllocBin(type, addr, bin)
#define omFreeBinAddr(addr)
#define omSizeWOfBin(bin_ptr)
#define NULL
Definition omList.c:12
omBin_t * omBin
Definition omStructs.h:12
#define REGISTER
Definition omalloc.h:27
BOOLEAN p_DebugLmDivisibleByNoComp(poly a, poly b, ring r)
Definition pDebug.cc:144
#define p_MemDiff_LengthGeneral(r, s1, s2, length)
Definition p_MemAdd.h:262
#define p_MemSub_LengthGeneral(r, s, length)
Definition p_MemAdd.h:291
#define p_MemAdd_LengthGeneral(r, s, length)
Definition p_MemAdd.h:173
#define p_MemAddSub_LengthGeneral(r, s, t, length)
Definition p_MemAdd.h:312
#define p_MemSum_LengthGeneral(r, s1, s2, length)
Definition p_MemAdd.h:86
poly p_Diff(poly a, int k, const ring r)
Definition p_polys.cc:1898
static int p_CmpPolys(poly p1, poly p2, ring r)
Definition p_polys.h:1739
poly p_DivideM(poly a, poly b, const ring r)
Definition p_polys.cc:1578
static void p_ExpVectorSum(poly pr, poly p1, poly p2, const ring r)
Definition p_polys.h:1425
poly pp_Jet(poly p, int m, const ring R)
Definition p_polys.cc:4358
void pSetDegProcs(ring r, pFDegProc new_FDeg, pLDegProc new_lDeg=NULL)
Definition p_polys.cc:3637
BOOLEAN p_LmCheckPolyRing(poly p, ring r)
Definition pDebug.cc:123
static void p_MemAdd_NegWeightAdjust(poly p, const ring r)
Definition p_polys.h:1292
static void p_ExpVectorAdd(poly p1, poly p2, const ring r)
Definition p_polys.h:1411
void pRestoreDegProcs(ring r, pFDegProc old_FDeg, pLDegProc old_lDeg)
Definition p_polys.cc:3649
static BOOLEAN _p_LmDivisibleByPart(poly a, const ring r_a, poly b, const ring r_b, const int start, const int end)
Definition p_polys.h:1856
poly p_PolyDiv(poly &p, const poly divisor, const BOOLEAN needResult, const ring r)
assumes that p and divisor are univariate polynomials in r, mentioning the same variable; assumes div...
Definition p_polys.cc:1870
static BOOLEAN p_IsConstantComp(const poly p, const ring r)
like the respective p_LmIs* routines, except that p might be empty
Definition p_polys.h:1958
static poly p_LmInit(poly p, const ring r)
Definition p_polys.h:1335
poly p_GcdMon(poly f, poly g, const ring r)
polynomial gcd for f=mon
Definition p_polys.cc:4930
BOOLEAN p_ComparePolys(poly p1, poly p2, const ring r)
returns TRUE if p1 is a skalar multiple of p2 assume p1 != NULL and p2 != NULL
Definition p_polys.cc:4576
int p_LowVar(poly p, const ring r)
the minimal index of used variables - 1
Definition p_polys.cc:4680
static void p_ExpVectorCopy(poly d_p, poly s_p, const ring r)
Definition p_polys.h:1313
static int p_Cmp(poly p1, poly p2, ring r)
Definition p_polys.h:1727
static void p_SetExpVL(poly p, int64 *ev, const ring r)
Definition p_polys.h:1553
BOOLEAN p_HasNotCF(poly p1, poly p2, const ring r)
Definition p_polys.cc:1329
static void p_SetExpV(poly p, int *ev, const ring r)
Definition p_polys.h:1544
static int p_LtCmpNoAbs(poly p, poly q, const ring r)
Definition p_polys.h:1647
static void p_MemSub_NegWeightAdjust(poly p, const ring r)
Definition p_polys.h:1302
poly pp_DivideM(poly a, poly b, const ring r)
Definition p_polys.cc:1633
int p_Weight(int c, const ring r)
Definition p_polys.cc:705
static int p_LtCmpOrdSgnEqP(poly p, poly q, const ring r)
Definition p_polys.h:1703
poly p_DiffOp(poly a, poly b, BOOLEAN multiply, const ring r)
Definition p_polys.cc:1973
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent @Note: VarOffset encodes the position in p->exp
Definition p_polys.h:488
poly p_Jet(poly p, int m, const ring R)
Definition p_polys.cc:4386
static void p_ExpVectorDiff(poly pr, poly p1, poly p2, const ring r)
Definition p_polys.h:1474
const char * p_Read(const char *s, poly &p, const ring r)
Definition p_polys.cc:1370
void p_Shift(poly *p, int i, const ring r)
shifts components of the vector p by i
Definition p_polys.cc:4706
poly p_Div_nn(poly p, const number n, const ring r)
Definition p_polys.cc:1505
void p_DeleteComp(poly *p, int k, const ring r)
Definition p_polys.cc:3544
poly p_MDivide(poly a, poly b, const ring r)
Definition p_polys.cc:1492
void p_ContentRat(poly &ph, const ring r)
Definition p_polys.cc:1744
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
Definition p_polys.h:247
poly p_Div_mm(poly p, const poly m, const ring r)
divide polynomial by monomial
Definition p_polys.cc:1538
static void p_ExpVectorSub(poly p1, poly p2, const ring r)
Definition p_polys.h:1440
int p_MaxExpPerVar(poly p, int i, const ring r)
max exponent of variable x_i in p
Definition p_polys.cc:4992
int p_Var(poly mi, const ring r)
Definition p_polys.cc:4656
int p_Compare(const poly a, const poly b, const ring R)
Definition p_polys.cc:4896
static void p_Setm(poly p, const ring r)
Definition p_polys.h:233
poly p_mInit(const char *s, BOOLEAN &ok, const ring r)
Definition p_polys.cc:1442
void p_LmDeleteAndNextRat(poly *p, int ishift, ring r)
Definition p_polys.cc:1700
static poly p_LmShallowCopyDelete(poly p, const ring r)
Definition p_polys.h:1393
static void p_GetExpVL(poly p, int64 *ev, const ring r)
Definition p_polys.h:1529
static int p_LtCmp(poly p, poly q, const ring r)
Definition p_polys.h:1621
static BOOLEAN p_LmIsConstantComp(const poly p, const ring r)
Definition p_polys.h:1006
static int p_LmCmp(poly p, poly q, const ring r)
Definition p_polys.h:1580
poly p_Series(int n, poly p, poly u, intvec *w, const ring R)
Definition p_polys.cc:4498
static BOOLEAN p_LmShortDivisibleBy(poly a, unsigned long sev_a, poly b, unsigned long not_sev_b, const ring r)
Definition p_polys.h:1910
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent @Note: the integer VarOffset encodes:
Definition p_polys.h:469
static BOOLEAN p_LmIsConstant(const poly p, const ring r)
Definition p_polys.h:1023
static BOOLEAN p_LmDivisibleByNoComp(poly a, poly b, const ring r)
Definition p_polys.h:1877
static BOOLEAN p_IsOne(const poly p, const ring R)
either poly(1) or gen(k)?!
Definition p_polys.h:1971
static BOOLEAN p_IsConstant(const poly p, const ring r)
Definition p_polys.h:1964
static void p_SetExpVLV(poly p, int64 *ev, int64 comp, const ring r)
Definition p_polys.h:1564
static BOOLEAN _p_LmDivisibleByNoCompPart(poly a, const ring r_a, poly b, const ring r_b, const int start, const int end)
Definition p_polys.h:1837
BOOLEAN p_CheckRing(ring r)
Definition pDebug.cc:131
static BOOLEAN _p_LmDivisibleBy(poly a, poly b, const ring r)
Definition p_polys.h:1871
static unsigned long p_GetTotalDegree(const unsigned long l, const ring r, const int number_of_exps)
Definition p_polys.h:810
static poly p_New(const ring, omBin bin)
Definition p_polys.h:664
void p_Split(poly p, poly *r)
Definition p_polys.cc:1320
poly n_PermNumber(const number z, const int *par_perm, const int OldPar, const ring src, const ring dst)
Definition p_polys.cc:4027
static poly p_GetExp_k_n(poly p, int l, int k, const ring r)
Definition p_polys.h:1372
static BOOLEAN p_LmShortDivisibleByNoComp(poly a, unsigned long sev_a, poly b, unsigned long not_sev_b, const ring r)
Definition p_polys.h:1930
poly p_GetCoeffRat(poly p, int ishift, ring r)
Definition p_polys.cc:1722
BOOLEAN p_VectorHasUnitB(poly p, int *k, const ring r)
Definition p_polys.cc:3379
static BOOLEAN p_LmDivisibleBy(poly a, poly b, const ring r)
Definition p_polys.h:1891
poly p_LcmRat(const poly a, const poly b, const long lCompM, const ring r)
Definition p_polys.cc:1677
static BOOLEAN p_DivisibleBy(poly a, poly b, const ring r)
Definition p_polys.h:1900
static BOOLEAN p_ExpVectorEqual(poly p1, poly p2, const ring r)
Definition p_polys.h:1489
void p_SetModDeg(intvec *w, ring r)
Definition p_polys.cc:3673
static int64 p_GetExpVLV(poly p, int64 *ev, const ring r)
Definition p_polys.h:1536
void p_TakeOutComp(poly *p, long comp, poly *q, int *lq, const ring r)
Splits *p into two polys: *q which consists of all monoms with component == comp and *p of all other ...
Definition p_polys.cc:3496
BOOLEAN p_HasNotCFRing(poly p1, poly p2, const ring r)
Definition p_polys.cc:1345
static int p_LtCmpOrdSgnDiffM(poly p, poly q, const ring r)
Definition p_polys.h:1669
static BOOLEAN _p_LmDivisibleByNoComp(poly a, poly b, const ring r)
return: FALSE, if there exists i, such that a->exp[i] > b->exp[i] TRUE, otherwise (1) Consider long v...
Definition p_polys.h:1765
void p_VectorHasUnit(poly p, int *k, int *len, const ring r)
Definition p_polys.cc:3402
static void p_GetExpV(poly p, int *ev, const ring r)
Definition p_polys.h:1520
poly p_PermPoly(poly p, const int *perm, const ring OldRing, const ring dst, nMapFunc nMap, const int *par_perm=NULL, int OldPar=0, BOOLEAN use_mult=FALSE)
Definition p_polys.cc:4130
static int p_LtCmpOrdSgnEqM(poly p, poly q, const ring r)
Definition p_polys.h:1694
#define pDivAssume(x)
Definition p_polys.h:1282
static BOOLEAN p_IsUnit(const poly p, const ring r)
Definition p_polys.h:1991
static poly p_Init(const ring r, omBin bin)
Definition p_polys.h:1320
unsigned long p_GetShortExpVector(const poly a, const ring r)
Definition p_polys.cc:4780
poly pp_JetW(poly p, int m, int *w, const ring R)
Definition p_polys.cc:4403
static BOOLEAN p_LmDivisibleByPart(poly a, poly b, const ring r, const int start, const int end)
Definition p_polys.h:1862
static long p_Totaldegree(poly p, const ring r)
Definition p_polys.h:1507
static BOOLEAN p_LmExpVectorAddIsOk(const poly p1, const poly p2, const ring r)
Definition p_polys.h:1999
static int p_LtCmpOrdSgnDiffP(poly p, poly q, const ring r)
Definition p_polys.h:1678
void p_Lcm(const poly a, const poly b, poly m, const ring r)
Definition p_polys.cc:1655
#define p_Test(p, r)
Definition p_polys.h:161
poly p_JetW(poly p, int m, int *w, const ring R)
Definition p_polys.cc:4430
static BOOLEAN p_IsConstantPoly(const poly p, const ring r)
Definition p_polys.h:1978
static void p_ExpVectorAddSub(poly p1, poly p2, poly p3, const ring r)
Definition p_polys.h:1456
long(* pFDegProc)(poly p, ring r)
Definition ring.h:38
long(* pLDegProc)(poly p, int *length, ring r)
Definition ring.h:37
#define rField_is_Ring(R)
Definition ring.h:490
#define R
Definition sirandom.c:27

◆ p_LmCmpAction

#define p_LmCmpAction (   p,
  q,
  r,
  actionE,
  actionG,
  actionS 
)     _p_LmCmpAction(p, q, r, actionE, actionG, actionS)

Definition at line 1719 of file p_polys.h.

◆ p_LmEqual

#define p_LmEqual (   p1,
  p2,
 
)    p_ExpVectorEqual(p1, p2, r)

Definition at line 1723 of file p_polys.h.

◆ p_LmTest

#define p_LmTest (   p,
 
)    _p_LmTest(p, r, PDEBUG)

Definition at line 162 of file p_polys.h.

◆ p_SetmComp

#define p_SetmComp   p_Setm

Definition at line 244 of file p_polys.h.

◆ p_Test

#define p_Test (   p,
 
)    _p_Test(p, r, PDEBUG)

Definition at line 161 of file p_polys.h.

◆ pDivAssume

#define pDivAssume (   x)    do {} while (0)

Definition at line 1282 of file p_polys.h.

◆ pIfThen

#define pIfThen (   cond,
  check 
)    do {if (cond) {check;}} while (0)

Definition at line 155 of file p_polys.h.

◆ pp_Test

#define pp_Test (   p,
  lmRing,
  tailRing 
)    _pp_Test(p, lmRing, tailRing, PDEBUG)

Definition at line 163 of file p_polys.h.

Function Documentation

◆ _p_LmDivisibleBy()

static BOOLEAN _p_LmDivisibleBy ( poly  a,
poly  b,
const ring  r 
)
inlinestatic

Definition at line 1871 of file p_polys.h.

1872{
1873 if (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r))
1874 return _p_LmDivisibleByNoComp(a, b, r);
1875 return FALSE;
1876}

◆ _p_LmDivisibleByNoComp() [1/2]

static BOOLEAN _p_LmDivisibleByNoComp ( poly  a,
const ring  r_a,
poly  b,
const ring  r_b 
)
inlinestatic

Definition at line 1814 of file p_polys.h.

1815{
1816 int i=r_a->N;
1817 pAssume1(r_a->N == r_b->N);
1818
1819 do
1820 {
1821 if (p_GetExp(a,i,r_a) > p_GetExp(b,i,r_b))
1822 {
1823 return FALSE;
1824 }
1825 i--;
1826 }
1827 while (i);
1828/*#ifdef HAVE_RINGS
1829 return n_DivBy(p_GetCoeff(b, r_b), p_GetCoeff(a, r_a), r_a->cf);
1830#else
1831*/
1832 return TRUE;
1833//#endif
1834}

◆ _p_LmDivisibleByNoComp() [2/2]

static BOOLEAN _p_LmDivisibleByNoComp ( poly  a,
poly  b,
const ring  r 
)
inlinestatic

return: FALSE, if there exists i, such that a->exp[i] > b->exp[i] TRUE, otherwise (1) Consider long vars, instead of single exponents (2) Clearly, if la > lb, then FALSE (3) Suppose la <= lb, and consider first bits of single exponents in l: if TRUE, then value of these bits is la ^ lb if FALSE, then la-lb causes an "overflow" into one of those bits, i.e., la ^ lb != la - lb

Definition at line 1765 of file p_polys.h.

1766{
1767 int i=r->VarL_Size - 1;
1768 unsigned long divmask = r->divmask;
1769 unsigned long la, lb;
1770
1771 if (r->VarL_LowIndex >= 0)
1772 {
1773 i += r->VarL_LowIndex;
1774 do
1775 {
1776 la = a->exp[i];
1777 lb = b->exp[i];
1778 if ((la > lb) ||
1779 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask)))
1780 {
1782 return FALSE;
1783 }
1784 i--;
1785 }
1786 while (i>=r->VarL_LowIndex);
1787 }
1788 else
1789 {
1790 do
1791 {
1792 la = a->exp[r->VarL_Offset[i]];
1793 lb = b->exp[r->VarL_Offset[i]];
1794 if ((la > lb) ||
1795 (((la & divmask) ^ (lb & divmask)) != ((lb - la) & divmask)))
1796 {
1798 return FALSE;
1799 }
1800 i--;
1801 }
1802 while (i>=0);
1803 }
1804/*#ifdef HAVE_RINGS
1805 pDivAssume(p_DebugLmDivisibleByNoComp(a, b, r) == n_DivBy(p_GetCoeff(b, r), p_GetCoeff(a, r), r->cf));
1806 return (!rField_is_Ring(r)) || n_DivBy(p_GetCoeff(b, r), p_GetCoeff(a, r), r->cf);
1807#else
1808*/
1810 return TRUE;
1811//#endif
1812}

◆ _p_LmDivisibleByNoCompPart()

static BOOLEAN _p_LmDivisibleByNoCompPart ( poly  a,
const ring  r_a,
poly  b,
const ring  r_b,
const int  start,
const int  end 
)
inlinestatic

Definition at line 1837 of file p_polys.h.

1838{
1839 int i=end;
1840 pAssume1(r_a->N == r_b->N);
1841
1842 do
1843 {
1844 if (p_GetExp(a,i,r_a) > p_GetExp(b,i,r_b))
1845 return FALSE;
1846 i--;
1847 }
1848 while (i>=start);
1849/*#ifdef HAVE_RINGS
1850 return n_DivBy(p_GetCoeff(b, r_b), p_GetCoeff(a, r_a), r_a->cf);
1851#else
1852*/
1853 return TRUE;
1854//#endif
1855}

◆ _p_LmDivisibleByPart()

static BOOLEAN _p_LmDivisibleByPart ( poly  a,
const ring  r_a,
poly  b,
const ring  r_b,
const int  start,
const int  end 
)
inlinestatic

Definition at line 1856 of file p_polys.h.

1857{
1858 if (p_GetComp(a, r_a) == 0 || p_GetComp(a,r_a) == p_GetComp(b,r_b))
1859 return _p_LmDivisibleByNoCompPart(a, r_a, b, r_b,start,end);
1860 return FALSE;
1861}

◆ _p_LmTest()

BOOLEAN _p_LmTest ( poly  p,
ring  r,
int  level 
)

Definition at line 326 of file pDebug.cc.

327{
328 if (level < 0 || p == NULL) return TRUE;
329 poly pnext = pNext(p);
330 pNext(p) = NULL;
332 pNext(p) = pnext;
333 return test_res;
334}
int level(const CanonicalForm &f)
BOOLEAN _p_Test(poly p, ring r, int level)
Definition pDebug.cc:215

◆ _p_Mult_q()

poly _p_Mult_q ( poly  p,
poly  q,
const int  copy,
const ring  r 
)
extern

Returns: p * q, Destroys: if !copy then p, q Assumes: pLength(p) >= 2 pLength(q) >=2, !rIsPluralRing(r)

Definition at line 313 of file p_Mult_q.cc.

314{
315 assume(r != NULL);
316#ifdef HAVE_RINGS
317 if (!nCoeff_is_Domain(r->cf))
318 return _p_Mult_q_Normal_ZeroDiv(p, q, copy, r);
319#endif
320 int lp, lq, l;
321 poly pt;
322
323 // MIN_LENGTH_FACTORY must be >= MIN_LENGTH_FACTORY_QQ, MIN_FLINT_QQ, MIN_FLINT_Zp 20
325
326 if (lp < lq)
327 {
328 pt = p;
329 p = q;
330 q = pt;
331 l = lp;
332 lp = lq;
333 lq = l;
334 }
335 BOOLEAN pure_polys=(p_GetComp(p,r)==0) && (p_GetComp(q,r)==0);
336 #ifdef HAVE_FLINT
337 #if __FLINT_RELEASE >= 20503
338 if (lq>MIN_FLINT_QQ)
339 {
341 if (pure_polys && rField_is_Q(r) && !convSingRFlintR(ctx,r))
342 {
343 // lq is a lower bound for the length of p and q
344 poly res=Flint_Mult_MP(p,lq,q,lq,ctx,r);
345 if (!copy)
346 {
347 p_Delete(&p,r);
348 p_Delete(&q,r);
349 }
350 return res;
351 }
352 }
353 if (lq>MIN_FLINT_Zp)
354 {
357 {
358 // lq is a lower bound for the length of p and q
359 poly res=Flint_Mult_MP(p,lq,q,lq,ctx,r);
360 if (!copy)
361 {
362 p_Delete(&p,r);
363 p_Delete(&q,r);
364 }
365 return res;
366 }
367 }
368 if (lq>MIN_FLINT_Z)
369 {
371 if (pure_polys && rField_is_Z(r) && !convSingRFlintR(ctx,r))
372 {
373 // lq is a lower bound for the length of p and q
374 poly res=Flint_Mult_MP(p,lq,q,lq,ctx,r);
375 if (!copy)
376 {
377 p_Delete(&p,r);
378 p_Delete(&q,r);
379 }
380 return res;
381 }
382 }
383 #endif
384 #endif
386 return _p_Mult_q_Normal(p, q, copy, r);
387 else if (pure_polys
388 && ((r->cf->extRing==NULL)||(r->cf->extRing->qideal!=NULL))
389 /* exclude trans. extensions: may contain rat.funct as cf */
390 && (((lq >= MIN_LENGTH_FACTORY)
391 && (r->cf->convSingNFactoryN!=ndConvSingNFactoryN))
393 && rField_is_Q(r))))
394 {
395 poly h=singclap_pmult(p,q,r);
396 if (!copy)
397 {
398 p_Delete(&p,r);
399 p_Delete(&q,r);
400 }
401 return h;
402 }
403 else
404 {
405 lp=pLength(p);
406 lq=pLength(q);
407 return _p_Mult_q_Bucket(p, lp, q, lq, copy, r);
408 }
409}
poly singclap_pmult(poly f, poly g, const ring r)
Definition clapsing.cc:577
static FORCE_INLINE BOOLEAN nCoeff_is_Domain(const coeffs r)
returns TRUE, if r is a field or r has no zero divisors (i.e is a domain)
Definition coeffs.h:736
CFArray copy(const CFList &list)
write elements of list into an array
STATIC_VAR Poly * h
Definition janet.cc:971
#define assume(x)
Definition mod2.h:389
CanonicalForm ndConvSingNFactoryN(number, BOOLEAN, const coeffs)
Definition numbers.cc:313
#define TEST_OPT_NOT_BUCKETS
Definition options.h:105
static void pqLengthApprox(poly p, poly q, int &lp, int &lq, const int min)
Definition p_Mult_q.cc:69
#define MIN_LENGTH_FACTORY
Definition p_Mult_q.cc:304
#define MIN_FLINT_Z
Definition p_Mult_q.cc:308
#define MIN_FLINT_QQ
Definition p_Mult_q.cc:306
static poly _p_Mult_q_Normal(poly p, poly q, const int copy, const ring r)
Definition p_Mult_q.cc:223
#define MIN_LENGTH_FACTORY_QQ
Definition p_Mult_q.cc:305
static poly _p_Mult_q_Bucket(poly p, const int lp, poly q, const int lq, const int copy, const ring r)
Definition p_Mult_q.cc:100
static poly _p_Mult_q_Normal_ZeroDiv(poly p, poly q, const int copy, const ring r)
Definition p_Mult_q.cc:195
#define MIN_FLINT_Zp
Definition p_Mult_q.cc:307
#define MIN_LENGTH_BUCKET
Definition p_Mult_q.h:21
static int pLength(poly a)
Definition p_polys.h:190
static void p_Delete(poly *p, const ring r)
Definition p_polys.h:901
static BOOLEAN rField_is_Z(const ring r)
Definition ring.h:514
static BOOLEAN rField_is_Zp(const ring r)
Definition ring.h:505
static BOOLEAN rField_is_Q(const ring r)
Definition ring.h:511

◆ _p_Test()

BOOLEAN _p_Test ( poly  p,
ring  r,
int  level 
)

Definition at line 215 of file pDebug.cc.

216{
217 assume(r->cf !=NULL);
218
219 if (PDEBUG > level) level = PDEBUG;
220 if (level < 0 || p == NULL) return TRUE;
221
222 poly p_prev = NULL;
223
224 #ifndef OM_NDEBUG
225 #ifndef X_OMALLOC
226 // check addr with level+1 so as to check bin/page of addr
228 == omError_NoError, "memory error",p,r);
229 #endif
230 #endif
231
233
234 // this checks that p does not contain a loop: rather expensive O(length^2)
235 #ifndef OM_NDEBUG
236 if (level > 1)
238 #endif
239
240 int ismod = p_GetComp(p, r) != 0;
241
242 while (p != NULL)
243 {
244 // ring check
246 #ifndef OM_NDEBUG
247 #ifndef X_OMALLOC
248 // omAddr check
250 == omError_NoError, "memory error",p,r);
251 #endif
252 #endif
253 // number/coef check
254 _pPolyAssumeReturnMsg(p->coef != NULL || (n_GetChar(r->cf) >= 2), "NULL coef",p,r);
255
256 #ifdef LDEBUG
257 _pPolyAssumeReturnMsg(n_Test(p->coef,r->cf),"coeff err",p,r);
258 #endif
259 _pPolyAssumeReturnMsg(!n_IsZero(p->coef, r->cf), "Zero coef",p,r);
260
261 // check for valid comp
262 _pPolyAssumeReturnMsg(p_GetComp(p, r) >= 0 && (p_GetComp(p, r)<65000), "component out of range ?",p,r);
263 // check for mix poly/vec representation
264 _pPolyAssumeReturnMsg(ismod == (p_GetComp(p, r) != 0), "mixed poly/vector",p,r);
265
266 // special check for ringorder_s/S
267 if ((r->typ!=NULL) && (r->typ[0].ord_typ == ro_syzcomp))
268 {
269 long c1, cc1, ccc1, ec1;
270 sro_ord* o = &(r->typ[0]);
271
272 c1 = p_GetComp(p, r);
273 if (o->data.syzcomp.Components!=NULL)
274 {
275 cc1 = o->data.syzcomp.Components[c1];
276 ccc1 = o->data.syzcomp.ShiftedComponents[cc1];
277 }
278 else { cc1=0; ccc1=0; }
279 _pPolyAssumeReturnMsg(c1 == 0 || cc1 != 0, "Component <-> TrueComponent zero mismatch",p,r);
280 _pPolyAssumeReturnMsg(c1 == 0 || ccc1 != 0,"Component <-> ShiftedComponent zero mismatch",p,r);
281 ec1 = p->exp[o->data.syzcomp.place];
282 //pPolyAssumeReturnMsg(ec1 == ccc1, "Shifted comp out of sync. should %d, is %d");
283 if (ec1 != ccc1)
284 {
285 dPolyReportError(p,r,"Shifted comp out of sync. should %d, is %d",ccc1,ec1);
286 return FALSE;
287 }
288 }
289
290 // check that p_Setm works ok
291 if (level > 0)
292 {
293 poly p_should_equal = p_DebugInit(p, r, r);
294 _pPolyAssumeReturnMsg(p_ExpVectorEqual(p, p_should_equal, r), "p_Setm field(s) out of sync",p,r);
296 }
297
298 // check order
299 if (p_prev != NULL)
300 {
301 int cmp = p_LmCmp(p_prev, p, r);
302 if (cmp == 0)
303 {
304 _pPolyAssumeReturnMsg(0, "monoms p and p->next are equal", p_prev, r);
305 }
306 else
307 _pPolyAssumeReturnMsg(p_LmCmp(p_prev, p, r) == 1, "wrong order", p_prev, r);
308
309 // check that compare worked sensibly
310 if (level > 1 && p_GetComp(p_prev, r) == p_GetComp(p, r))
311 {
312 int i;
313 for (i=r->N; i>0; i--)
314 {
315 if (p_GetExp(p_prev, i, r) != p_GetExp(p, i, r)) break;
316 }
317 _pPolyAssumeReturnMsg(i > 0, "Exponents equal but compare different", p_prev, r);
318 }
319 }
320 p_prev = p;
321 pIter(p);
322 }
323 return TRUE;
324}
#define PDEBUG
Definition auxiliary.h:170
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
Definition coeffs.h:709
static FORCE_INLINE BOOLEAN n_IsZero(number n, const coeffs r)
TRUE iff 'n' represents the zero element.
Definition coeffs.h:461
static FORCE_INLINE int n_GetChar(const coeffs r)
Return the characteristic of the coeff. domain.
Definition coeffs.h:441
#define pFalseReturn(cond)
Definition monomials.h:139
#define _pPolyAssumeReturnMsg(cond, msg, p, r)
Definition monomials.h:124
@ omError_NoError
Definition omError.h:18
#define omTestList(ptr, level)
Definition omList.h:81
static poly p_DebugInit(poly p, ring src_ring, ring dest_ring)
Definition pDebug.cc:198
BOOLEAN dPolyReportError(poly p, ring r, const char *fmt,...)
Definition pDebug.cc:43
BOOLEAN p_CheckRing(ring r)
Definition pDebug.cc:131
BOOLEAN p_LmCheckIsFromRing(poly p, ring r)
Definition pDebug.cc:74
static BOOLEAN p_ExpVectorEqual(poly p1, poly p2, const ring r1, const ring r2)
Definition p_polys.cc:4526
static void p_LmFree(poly p, ring)
Definition p_polys.h:683
@ ro_syzcomp
Definition ring.h:59
union sro_ord::@1 data
#define omTestBinAddrSize(A, B, C)
Definition xalloc.h:272

◆ _pp_Test()

BOOLEAN _pp_Test ( poly  p,
ring  lmRing,
ring  tailRing,
int  level 
)

Definition at line 336 of file pDebug.cc.

337{
338 if (PDEBUG > level) level = PDEBUG;
339 if (level < 0 || p == NULL) return TRUE;
340 if (pNext(p) == NULL || lmRing == tailRing) return _p_Test(p, lmRing, level);
341
343 pFalseReturn(_p_Test(pNext(p), tailRing, level));
344
345 // check that lm > Lm(tail)
346 if (level > 1)
347 {
348 poly lm = p;
349 poly tail = p_DebugInit(pNext(p), tailRing, lmRing);
350 poly pnext = pNext(lm);
351 pNext(lm) = tail;
352 BOOLEAN cmp = p_LmCmp(lm, tail, lmRing);
353 if (cmp != 1)
354 dPolyReportError(lm, lmRing, "wrong order: lm <= Lm(tail)");
355 p_LmFree(tail, lmRing);
356 pNext(lm) = pnext;
357 return (cmp == 1);
358 }
359 return TRUE;
360}
BOOLEAN _p_LmTest(poly p, ring r, int level)
Definition pDebug.cc:326

◆ n_PermNumber()

poly n_PermNumber ( const number  z,
const int par_perm,
const int  OldPar,
const ring  src,
const ring  dst 
)

Definition at line 4027 of file p_polys.cc.

4028{
4029#if 0
4030 PrintS("\nSource Ring: \n");
4031 rWrite(src);
4032
4033 if(0)
4034 {
4035 number zz = n_Copy(z, src->cf);
4036 PrintS("z: "); n_Write(zz, src);
4037 n_Delete(&zz, src->cf);
4038 }
4039
4040 PrintS("\nDestination Ring: \n");
4041 rWrite(dst);
4042
4043 /*Print("\nOldPar: %d\n", OldPar);
4044 for( int i = 1; i <= OldPar; i++ )
4045 {
4046 Print("par(%d) -> par/var (%d)\n", i, par_perm[i-1]);
4047 }*/
4048#endif
4049 if( z == NULL )
4050 return NULL;
4051
4052 const coeffs srcCf = src->cf;
4053 assume( srcCf != NULL );
4054
4056 assume( src->cf->extRing!=NULL );
4057
4058 poly zz = NULL;
4059
4060 const ring srcExtRing = srcCf->extRing;
4061 assume( srcExtRing != NULL );
4062
4063 const coeffs dstCf = dst->cf;
4064 assume( dstCf != NULL );
4065
4066 if( nCoeff_is_algExt(srcCf) ) // nCoeff_is_GF(srcCf)?
4067 {
4068 zz = (poly) z;
4069 if( zz == NULL ) return NULL;
4070 }
4071 else if (nCoeff_is_transExt(srcCf))
4072 {
4073 assume( !IS0(z) );
4074
4075 zz = NUM((fraction)z);
4076 p_Test (zz, srcExtRing);
4077
4078 if( zz == NULL ) return NULL;
4079 if( !DENIS1((fraction)z) )
4080 {
4082 WarnS("Not defined: Cannot map a rational fraction and make a polynomial out of it! Ignoring the denominator.");
4083 }
4084 }
4085 else
4086 {
4087 assume (FALSE);
4088 WerrorS("Number permutation is not implemented for this data yet!");
4089 return NULL;
4090 }
4091
4092 assume( zz != NULL );
4093 p_Test (zz, srcExtRing);
4094
4096
4097 assume( nMap != NULL );
4098
4099 poly qq;
4100 if ((par_perm == NULL) && (rPar(dst) != 0 && rVar (srcExtRing) > 0))
4101 {
4102 int* perm;
4103 perm=(int *)omAlloc0((rVar(srcExtRing)+1)*sizeof(int));
4104 for(int i=si_min(rVar(srcExtRing),rPar(dst));i>0;i--)
4105 perm[i]=-i;
4107 omFreeSize ((ADDRESS)perm, (rVar(srcExtRing)+1)*sizeof(int));
4108 }
4109 else
4111
4113 && (!DENIS1((fraction)z))
4115 {
4117 qq=p_Div_nn(qq,n,dst);
4118 n_Delete(&n,dstCf);
4120 }
4121 p_Test (qq, dst);
4122
4123 return qq;
4124}
static int si_min(const int a, const int b)
Definition auxiliary.h:125
static FORCE_INLINE BOOLEAN nCoeff_is_GF(const coeffs r)
Definition coeffs.h:836
static FORCE_INLINE nMapFunc n_SetMap(const coeffs src, const coeffs dst)
set the mapping function pointers for translating numbers from src to dst
Definition coeffs.h:697
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition coeffs.h:588
static FORCE_INLINE BOOLEAN nCoeff_is_algExt(const coeffs r)
TRUE iff r represents an algebraic extension field.
Definition coeffs.h:907
static FORCE_INLINE BOOLEAN nCoeff_is_transExt(const coeffs r)
TRUE iff r represents a transcendental extension field.
Definition coeffs.h:915
#define WarnS
Definition emacs.cc:78
void WerrorS(const char *s)
Definition feFopen.cc:24
The main handler for Singular numbers which are suitable for Singular polynomials.
#define omFreeSize(addr, size)
#define omAlloc0(size)
poly p_PermPoly(poly p, const int *perm, const ring oldRing, const ring dst, nMapFunc nMap, const int *par_perm, int OldPar, BOOLEAN use_mult)
Definition p_polys.cc:4130
poly p_Div_nn(poly p, const number n, const ring r)
Definition p_polys.cc:1505
void p_Normalize(poly p, const ring r)
Definition p_polys.cc:3813
#define NUM
Definition readcf.cc:180
void PrintS(const char *s)
Definition reporter.cc:284
void rWrite(ring r, BOOLEAN details)
Definition ring.cc:227
static int rPar(const ring r)
(r->cf->P)
Definition ring.h:604
static short rVar(const ring r)
#define rVar(r) (r->N)
Definition ring.h:597

◆ p_Add_q() [1/2]

static poly p_Add_q ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 936 of file p_polys.h.

937{
938 assume( (p != q) || (p == NULL && q == NULL) );
939 if (q==NULL) return p;
940 if (p==NULL) return q;
941 int shorter;
942 return r->p_Procs->p_Add_q(p, q, shorter, r);
943}

◆ p_Add_q() [2/2]

static poly p_Add_q ( poly  p,
poly  q,
int lp,
int  lq,
const ring  r 
)
inlinestatic

like p_Add_q, except that if lp == pLength(lp) lq == pLength(lq) then lp == pLength(p+q)

Definition at line 946 of file p_polys.h.

947{
948 assume( (p != q) || (p == NULL && q == NULL) );
949 if (q==NULL) return p;
950 if (p==NULL) { lp=lq; return q; }
951 int shorter;
952 poly res = r->p_Procs->p_Add_q(p, q, shorter, r);
953 lp += lq - shorter;
954 return res;
955}

◆ p_AddComp()

static unsigned long p_AddComp ( poly  p,
unsigned long  v,
ring  r 
)
inlinestatic

Definition at line 447 of file p_polys.h.

448{
451 return __p_GetComp(p,r) += v;
452}
const Variable & v
< [in] a sqrfree bivariate poly
Definition facBivar.h:39
#define p_LmCheckPolyRing2(p, r)
Definition monomials.h:199
#define pAssume2(cond)
Definition monomials.h:193
#define __p_GetComp(p, r)
Definition monomials.h:63

◆ p_AddExp()

static long p_AddExp ( poly  p,
int  v,
long  ee,
ring  r 
)
inlinestatic

Definition at line 606 of file p_polys.h.

607{
609 int e = p_GetExp(p,v,r);
610 e += ee;
611 return p_SetExp(p,v,e,r);
612}

◆ p_CheckIsFromRing()

BOOLEAN p_CheckIsFromRing ( poly  p,
ring  r 
)

Definition at line 105 of file pDebug.cc.

106{
107 while (p!=NULL)
108 {
110 pIter(p);
111 }
112 return TRUE;
113}

◆ p_CheckPolyRing()

BOOLEAN p_CheckPolyRing ( poly  p,
ring  r 
)

Definition at line 115 of file pDebug.cc.

116{
117 #ifndef X_OMALLOC
118 pAssumeReturn(r != NULL && r->PolyBin != NULL);
119 #endif
120 return p_CheckIsFromRing(p, r);
121}
#define pAssumeReturn(cond)
Definition monomials.h:78
BOOLEAN p_CheckIsFromRing(poly p, ring r)
Definition pDebug.cc:105

◆ p_CheckRing()

BOOLEAN p_CheckRing ( ring  r)

Definition at line 131 of file pDebug.cc.

132{
133 #ifndef X_OMALLOC
134 pAssumeReturn(r != NULL && r->PolyBin != NULL);
135 #endif
136 return TRUE;
137}

◆ p_ChineseRemainder()

poly p_ChineseRemainder ( poly *  xx,
number x,
number q,
int  rl,
CFArray inv_cache,
const ring  R 
)

Definition at line 88 of file p_polys.cc.

89{
90 poly r,h,hh;
91 int j;
92 poly res_p=NULL;
93 loop
94 {
95 /* search the lead term */
96 r=NULL;
97 for(j=rl-1;j>=0;j--)
98 {
99 h=xx[j];
100 if ((h!=NULL)
101 &&((r==NULL)||(p_LmCmp(r,h,R)==-1)))
102 r=h;
103 }
104 /* nothing found -> return */
105 if (r==NULL) break;
106 /* create the monomial in h */
107 h=p_Head(r,R);
108 /* collect the coeffs in x[..]*/
109 for(j=rl-1;j>=0;j--)
110 {
111 hh=xx[j];
112 if ((hh!=NULL) && (p_LmCmp(h,hh,R)==0))
113 {
114 x[j]=pGetCoeff(hh);
116 xx[j]=hh;
117 }
118 else
119 x[j]=n_Init(0, R->cf);
120 }
122 for(j=rl-1;j>=0;j--)
123 {
124 x[j]=NULL; // n_Init(0...) takes no memory
125 }
126 if (n_IsZero(n,R->cf)) p_Delete(&h,R);
127 else
128 {
129 //Print("new mon:");pWrite(h);
130 p_SetCoeff(h,n,R);
131 pNext(h)=res_p;
132 res_p=h; // building res_p in reverse order!
133 }
134 }
136 p_Test(res_p, R);
137 return res_p;
138}
Variable x
Definition cfModGcd.cc:4083
static FORCE_INLINE number n_ChineseRemainderSym(number *a, number *b, int rl, BOOLEAN sym, CFArray &inv_cache, const coeffs r)
Definition coeffs.h:761
static number p_SetCoeff(poly p, number n, ring r)
Definition p_polys.h:412
static poly pReverse(poly p)
Definition p_polys.h:335
static poly p_Head(const poly p, const ring r)
copy the (leading) term of p
Definition p_polys.h:860
static poly p_LmFreeAndNext(poly p, ring)
Definition p_polys.h:711
#define loop
Definition structs.h:75

◆ p_Cleardenom()

poly p_Cleardenom ( poly  p,
const ring  r 
)

Definition at line 2845 of file p_polys.cc.

2846{
2847 if( p == NULL )
2848 return NULL;
2849
2850 assume( r != NULL );
2851 assume( r->cf != NULL );
2852 const coeffs C = r->cf;
2853
2854#if CLEARENUMERATORS
2855 if( 0 )
2856 {
2859 n_ClearContent(itr, C); // divide out the content
2860 p_Test(p, r); n_Test(pGetCoeff(p), C);
2861 assume(n_GreaterZero(pGetCoeff(p), C)); // ??
2862// if(!n_GreaterZero(pGetCoeff(p),C)) p = p_Neg(p,r);
2863 return p;
2864 }
2865#endif
2866
2867 number d, h;
2868
2869 if (rField_is_Ring(r))
2870 {
2871 if(!n_GreaterZero(pGetCoeff(p),C)) p = p_Neg(p,r);
2872 return p;
2873 }
2874
2876 {
2877 if(!n_GreaterZero(pGetCoeff(p),C)) p = p_Neg(p,r);
2878 return p;
2879 }
2880
2881 assume(p != NULL);
2882
2883 if(pNext(p)==NULL)
2884 {
2885 if (!TEST_OPT_CONTENTSB)
2886 p_SetCoeff(p,n_Init(1,C),r);
2887 else if(!n_GreaterZero(pGetCoeff(p),C))
2888 p = p_Neg(p,r);
2889 return p;
2890 }
2891
2892 assume(pNext(p)!=NULL);
2893 poly start=p;
2894
2895#if 0 && CLEARENUMERATORS
2896//CF: does not seem to work that well..
2897
2898 if( nCoeff_is_Q(C) || nCoeff_is_Q_a(C) )
2899 {
2902 n_ClearContent(itr, C); // divide out the content
2903 p_Test(p, r); n_Test(pGetCoeff(p), C);
2904 assume(n_GreaterZero(pGetCoeff(p), C)); // ??
2905// if(!n_GreaterZero(pGetCoeff(p),C)) p = p_Neg(p,r);
2906 return start;
2907 }
2908#endif
2909
2910 if(1)
2911 {
2912 // get lcm of all denominators ----------------------------------
2913 h = n_Init(1,C);
2914 while (p!=NULL)
2915 {
2918 n_Delete(&h,C);
2919 h=d;
2920 pIter(p);
2921 }
2922 /* h now contains the 1/lcm of all denominators */
2923 if(!n_IsOne(h,C))
2924 {
2925 // multiply by the lcm of all denominators
2926 p = start;
2927 while (p!=NULL)
2928 {
2929 d=n_Mult(h,pGetCoeff(p),C);
2930 n_Normalize(d,C);
2931 p_SetCoeff(p,d,r);
2932 pIter(p);
2933 }
2934 }
2935 n_Delete(&h,C);
2936 p=start;
2937
2938 p_ContentForGB(p,r);
2939#ifdef HAVE_RATGRING
2940 if (rIsRatGRing(r))
2941 {
2942 /* quick unit detection in the rational case is done in gr_nc_bba */
2943 p_ContentRat(p, r);
2944 start=p;
2945 }
2946#endif
2947 }
2948
2949 if(!n_GreaterZero(pGetCoeff(p),C)) p = p_Neg(p,r);
2950
2951 return start;
2952}
This is a polynomial enumerator for simple iteration over coefficients of polynomials.
static FORCE_INLINE number n_Mult(number a, number b, const coeffs r)
return the product of 'a' and 'b', i.e., a*b
Definition coeffs.h:633
static FORCE_INLINE number n_NormalizeHelper(number a, number b, const coeffs r)
assume that r is a quotient field (otherwise, return 1) for arguments (a1/a2,b1/b2) return (lcm(a1,...
Definition coeffs.h:692
static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
Definition coeffs.h:803
static FORCE_INLINE void n_ClearDenominators(ICoeffsEnumerator &numberCollectionEnumerator, number &d, const coeffs r)
(inplace) Clears denominators on a collection of numbers number d is the LCM of all the coefficient d...
Definition coeffs.h:932
static FORCE_INLINE BOOLEAN nCoeff_is_Q_a(const coeffs r)
Definition coeffs.h:882
static FORCE_INLINE void n_ClearContent(ICoeffsEnumerator &numberCollectionEnumerator, number &c, const coeffs r)
Computes the content and (inplace) divides it out on a collection of numbers number c is the content ...
Definition coeffs.h:925
static FORCE_INLINE void n_Normalize(number &n, const coeffs r)
inplace-normalization of n; produces some canonical representation of n;
Definition coeffs.h:575
#define TEST_OPT_INTSTRATEGY
Definition options.h:110
#define TEST_OPT_CONTENTSB
Definition options.h:127
void p_ContentRat(poly &ph, const ring r)
Definition p_polys.cc:1744
void p_ContentForGB(poly ph, const ring r)
Definition p_polys.cc:2355
static poly p_Neg(poly p, const ring r)
Definition p_polys.h:1107
static BOOLEAN rIsRatGRing(const ring r)
Definition ring.h:432

◆ p_Cleardenom_n()

void p_Cleardenom_n ( poly  p,
const ring  r,
number c 
)

Definition at line 2954 of file p_polys.cc.

2955{
2956 const coeffs C = r->cf;
2957 number d, h;
2958
2959 assume( ph != NULL );
2960
2961 poly p = ph;
2962
2963#if CLEARENUMERATORS
2964 if( 0 )
2965 {
2967
2968 n_ClearDenominators(itr, d, C); // multiply with common denom. d
2969 n_ClearContent(itr, h, C); // divide by the content h
2970
2971 c = n_Div(d, h, C); // d/h
2972
2973 n_Delete(&d, C);
2974 n_Delete(&h, C);
2975
2976 n_Test(c, C);
2977
2978 p_Test(ph, r); n_Test(pGetCoeff(ph), C);
2979 assume(n_GreaterZero(pGetCoeff(ph), C)); // ??
2980/*
2981 if(!n_GreaterZero(pGetCoeff(ph),C))
2982 {
2983 ph = p_Neg(ph,r);
2984 c = n_InpNeg(c, C);
2985 }
2986*/
2987 return;
2988 }
2989#endif
2990
2991
2992 if( pNext(p) == NULL )
2993 {
2995 {
2996 c=n_Invers(pGetCoeff(p), C);
2997 p_SetCoeff(p, n_Init(1, C), r);
2998 }
2999 else
3000 {
3001 c=n_Init(1,C);
3002 }
3003
3004 if(!n_GreaterZero(pGetCoeff(ph),C))
3005 {
3006 ph = p_Neg(ph,r);
3007 c = n_InpNeg(c, C);
3008 }
3009
3010 return;
3011 }
3012 if (TEST_OPT_CONTENTSB) { c=n_Init(1,C); return; }
3013
3014 assume( pNext(p) != NULL );
3015
3016#if CLEARENUMERATORS
3017 if( nCoeff_is_Q(C) || nCoeff_is_Q_a(C) )
3018 {
3020
3021 n_ClearDenominators(itr, d, C); // multiply with common denom. d
3022 n_ClearContent(itr, h, C); // divide by the content h
3023
3024 c = n_Div(d, h, C); // d/h
3025
3026 n_Delete(&d, C);
3027 n_Delete(&h, C);
3028
3029 n_Test(c, C);
3030
3031 p_Test(ph, r); n_Test(pGetCoeff(ph), C);
3032 assume(n_GreaterZero(pGetCoeff(ph), C)); // ??
3033/*
3034 if(!n_GreaterZero(pGetCoeff(ph),C))
3035 {
3036 ph = p_Neg(ph,r);
3037 c = n_InpNeg(c, C);
3038 }
3039*/
3040 return;
3041 }
3042#endif
3043
3044
3045
3046
3047 if(1)
3048 {
3049 h = n_Init(1,C);
3050 while (p!=NULL)
3051 {
3054 n_Delete(&h,C);
3055 h=d;
3056 pIter(p);
3057 }
3058 c=h;
3059 /* contains the 1/lcm of all denominators */
3060 if(!n_IsOne(h,C))
3061 {
3062 p = ph;
3063 while (p!=NULL)
3064 {
3065 /* should be: // NOTE: don't use ->coef!!!!
3066 * number hh;
3067 * nGetDenom(p->coef,&hh);
3068 * nMult(&h,&hh,&d);
3069 * nNormalize(d);
3070 * nDelete(&hh);
3071 * nMult(d,p->coef,&hh);
3072 * nDelete(&d);
3073 * nDelete(&(p->coef));
3074 * p->coef =hh;
3075 */
3076 d=n_Mult(h,pGetCoeff(p),C);
3077 n_Normalize(d,C);
3078 p_SetCoeff(p,d,r);
3079 pIter(p);
3080 }
3081 if (rField_is_Q_a(r))
3082 {
3083 loop
3084 {
3085 h = n_Init(1,C);
3086 p=ph;
3087 while (p!=NULL)
3088 {
3090 n_Delete(&h,C);
3091 h=d;
3092 pIter(p);
3093 }
3094 /* contains the 1/lcm of all denominators */
3095 if(!n_IsOne(h,C))
3096 {
3097 p = ph;
3098 while (p!=NULL)
3099 {
3100 /* should be: // NOTE: don't use ->coef!!!!
3101 * number hh;
3102 * nGetDenom(p->coef,&hh);
3103 * nMult(&h,&hh,&d);
3104 * nNormalize(d);
3105 * nDelete(&hh);
3106 * nMult(d,p->coef,&hh);
3107 * nDelete(&d);
3108 * nDelete(&(p->coef));
3109 * p->coef =hh;
3110 */
3111 d=n_Mult(h,pGetCoeff(p),C);
3112 n_Normalize(d,C);
3113 p_SetCoeff(p,d,r);
3114 pIter(p);
3115 }
3116 number t=n_Mult(c,h,C);
3117 n_Delete(&c,C);
3118 c=t;
3119 }
3120 else
3121 {
3122 break;
3123 }
3124 n_Delete(&h,C);
3125 }
3126 }
3127 }
3128 }
3129
3130 if(!n_GreaterZero(pGetCoeff(ph),C))
3131 {
3132 ph = p_Neg(ph,r);
3133 c = n_InpNeg(c, C);
3134 }
3135
3136}
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
Definition coeffs.h:561
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...
Definition coeffs.h:612
static BOOLEAN rField_is_Q_a(const ring r)
Definition ring.h:544

◆ p_Cmp()

static int p_Cmp ( poly  p1,
poly  p2,
ring  r 
)
inlinestatic

Definition at line 1727 of file p_polys.h.

1728{
1729 if (p2==NULL)
1730 {
1731 if (p1==NULL) return 0;
1732 return 1;
1733 }
1734 if (p1==NULL)
1735 return -1;
1736 return p_LmCmp(p1,p2,r);
1737}

◆ p_CmpPolys()

static int p_CmpPolys ( poly  p1,
poly  p2,
ring  r 
)
inlinestatic

Definition at line 1739 of file p_polys.h.

1740{
1741 if (p2==NULL)
1742 {
1743 if (p1==NULL) return 0;
1744 return 1;
1745 }
1746 if (p1==NULL)
1747 return -1;
1748 return p_ComparePolys(p1,p2,r);
1749}

◆ p_Comp_k_n()

static int p_Comp_k_n ( poly  a,
poly  b,
int  k,
ring  r 
)
inlinestatic

Definition at line 640 of file p_polys.h.

641{
642 if ((a==NULL) || (b==NULL) ) return FALSE;
643 p_LmCheckPolyRing2(a, r);
645 pAssume2(k > 0 && k <= r->N);
646 int i=k;
647 for(;i<=r->N;i++)
648 {
649 if (p_GetExp(a,i,r) != p_GetExp(b,i,r)) return FALSE;
650 // if (a->exp[(r->VarOffset[i] & 0xffffff)] != b->exp[(r->VarOffset[i] & 0xffffff)]) return FALSE;
651 }
652 return TRUE;
653}
const CanonicalForm CFMap CFMap & N
Definition cfEzgcd.cc:56

◆ p_Compare()

int p_Compare ( const poly  a,
const poly  b,
const ring  R 
)

Definition at line 4896 of file p_polys.cc.

4897{
4898 int r=p_Cmp(a,b,R);
4899 if ((r==0)&&(a!=NULL))
4900 {
4901 number h=n_Sub(pGetCoeff(a),pGetCoeff(b),R->cf);
4902 /* compare lead coeffs */
4903 r = -1+n_IsZero(h,R->cf)+2*n_GreaterZero(h,R->cf); /* -1: <, 0:==, 1: > */
4904 n_Delete(&h,R->cf);
4905 }
4906 else if (a==NULL)
4907 {
4908 if (b==NULL)
4909 {
4910 /* compare 0, 0 */
4911 r=0;
4912 }
4913 else if(p_IsConstant(b,R))
4914 {
4915 /* compare 0, const */
4916 r = 1-2*n_GreaterZero(pGetCoeff(b),R->cf); /* -1: <, 1: > */
4917 }
4918 }
4919 else if (b==NULL)
4920 {
4921 if (p_IsConstant(a,R))
4922 {
4923 /* compare const, 0 */
4924 r = -1+2*n_GreaterZero(pGetCoeff(a),R->cf); /* -1: <, 1: > */
4925 }
4926 }
4927 return(r);
4928}
static FORCE_INLINE number n_Sub(number a, number b, const coeffs r)
return the difference of 'a' and 'b', i.e., a-b
Definition coeffs.h:652

◆ p_ComparePolys()

BOOLEAN p_ComparePolys ( poly  p1,
poly  p2,
const ring  r 
)

returns TRUE if p1 is a skalar multiple of p2 assume p1 != NULL and p2 != NULL

Definition at line 4576 of file p_polys.cc.

4577{
4578 number n,nn;
4579 pAssume(p1 != NULL && p2 != NULL);
4580
4581 if (!p_LmEqual(p1,p2,r)) //compare leading mons
4582 return FALSE;
4583 if ((pNext(p1)==NULL) && (pNext(p2)!=NULL))
4584 return FALSE;
4585 if ((pNext(p2)==NULL) && (pNext(p1)!=NULL))
4586 return FALSE;
4587 if (pLength(p1) != pLength(p2))
4588 return FALSE;
4589 #ifdef HAVE_RINGS
4590 if (rField_is_Ring(r))
4591 {
4592 if (!n_DivBy(pGetCoeff(p1), pGetCoeff(p2), r->cf)) return FALSE;
4593 }
4594 #endif
4595 n=n_Div(pGetCoeff(p1),pGetCoeff(p2),r->cf);
4596 while ((p1 != NULL) /*&& (p2 != NULL)*/)
4597 {
4598 if ( ! p_LmEqual(p1, p2,r))
4599 {
4600 n_Delete(&n, r->cf);
4601 return FALSE;
4602 }
4603 if (!n_Equal(pGetCoeff(p1), nn = n_Mult(pGetCoeff(p2),n, r->cf), r->cf))
4604 {
4605 n_Delete(&n, r->cf);
4606 n_Delete(&nn, r->cf);
4607 return FALSE;
4608 }
4609 n_Delete(&nn, r->cf);
4610 pIter(p1);
4611 pIter(p2);
4612 }
4613 n_Delete(&n, r->cf);
4614 return TRUE;
4615}
static FORCE_INLINE BOOLEAN n_DivBy(number a, number b, const coeffs r)
test whether 'a' is divisible 'b'; for r encoding a field: TRUE iff 'b' does not represent zero in Z:...
Definition coeffs.h:750
#define pAssume(cond)
Definition monomials.h:90
#define p_LmEqual(p1, p2, r)
Definition p_polys.h:1723

◆ p_Content()

void p_Content ( poly  p,
const ring  r 
)

Definition at line 2295 of file p_polys.cc.

2296{
2297 if (ph==NULL) return;
2298 const coeffs cf=r->cf;
2299 if (pNext(ph)==NULL)
2300 {
2301 p_SetCoeff(ph,n_Init(1,cf),r);
2302 return;
2303 }
2304 if ((cf->cfSubringGcd==ndGcd)
2305 || (cf->cfGcd==ndGcd)) /* trivial gcd*/
2306 return;
2307 number h;
2308 if ((rField_is_Q(r))
2309 || (rField_is_Q_a(r))
2310 || (rField_is_Zp_a)(r)
2311 || (rField_is_Z(r))
2312 )
2313 {
2314 h=p_InitContent(ph,r); /* first guess of a gcd of all coeffs */
2315 }
2316 else
2317 {
2319 }
2320 poly p;
2321 if(n_IsOne(h,cf))
2322 {
2323 goto content_finish;
2324 }
2325 p=ph;
2326 // take the SubringGcd of all coeffs
2327 while (p!=NULL)
2328 {
2331 n_Delete(&h,cf);
2332 h = d;
2333 if(n_IsOne(h,cf))
2334 {
2335 goto content_finish;
2336 }
2337 pIter(p);
2338 }
2339 // if found<>1, divide by it
2340 p = ph;
2341 while (p!=NULL)
2342 {
2344 p_SetCoeff(p,d,r);
2345 pIter(p);
2346 }
2348 n_Delete(&h,r->cf);
2349 // and last: check leading sign:
2350 if(!n_GreaterZero(pGetCoeff(ph),r->cf)) ph = p_Neg(ph,r);
2351}
CanonicalForm cf
Definition cfModGcd.cc:4084
static FORCE_INLINE number n_ExactDiv(number a, number b, const coeffs r)
assume that there is a canonical subring in cf and we know that division is possible for these a and ...
Definition coeffs.h:619
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
Definition coeffs.h:663
number ndGcd(number, number, const coeffs r)
Definition numbers.cc:189
number p_InitContent(poly ph, const ring r)
Definition p_polys.cc:2635
static BOOLEAN rField_is_Zp_a(const ring r)
Definition ring.h:534

◆ p_ContentForGB()

void p_ContentForGB ( poly  p,
const ring  r 
)

Definition at line 2355 of file p_polys.cc.

2356{
2357 if(TEST_OPT_CONTENTSB) return;
2358 assume( ph != NULL );
2359
2360 assume( r != NULL ); assume( r->cf != NULL );
2361
2362
2363#if CLEARENUMERATORS
2364 if( 0 )
2365 {
2366 const coeffs C = r->cf;
2367 // experimentall (recursive enumerator treatment) of alg. Ext!
2369 n_ClearContent(itr, r->cf);
2370
2371 p_Test(ph, r); n_Test(pGetCoeff(ph), C);
2372 assume(n_GreaterZero(pGetCoeff(ph), C)); // ??
2373
2374 // if(!n_GreaterZero(pGetCoeff(ph),r->cf)) ph = p_Neg(ph,r);
2375 return;
2376 }
2377#endif
2378
2379
2380#ifdef HAVE_RINGS
2381 if (rField_is_Ring(r))
2382 {
2383 if (rField_has_Units(r))
2384 {
2385 number k = n_GetUnit(pGetCoeff(ph),r->cf);
2386 if (!n_IsOne(k,r->cf))
2387 {
2388 number tmpGMP = k;
2389 k = n_Invers(k,r->cf);
2390 n_Delete(&tmpGMP,r->cf);
2391 poly h = pNext(ph);
2392 p_SetCoeff(ph, n_Mult(pGetCoeff(ph), k,r->cf),r);
2393 while (h != NULL)
2394 {
2395 p_SetCoeff(h, n_Mult(pGetCoeff(h), k,r->cf),r);
2396 pIter(h);
2397 }
2398// assume( n_GreaterZero(pGetCoeff(ph),r->cf) );
2399// if(!n_GreaterZero(pGetCoeff(ph),r->cf)) ph = p_Neg(ph,r);
2400 }
2401 n_Delete(&k,r->cf);
2402 }
2403 return;
2404 }
2405#endif
2406 number h,d;
2407 poly p;
2408
2409 if(pNext(ph)==NULL)
2410 {
2411 p_SetCoeff(ph,n_Init(1,r->cf),r);
2412 }
2413 else
2414 {
2415 assume( pNext(ph) != NULL );
2416#if CLEARENUMERATORS
2417 if( nCoeff_is_Q(r->cf) )
2418 {
2419 // experimentall (recursive enumerator treatment) of alg. Ext!
2421 n_ClearContent(itr, r->cf);
2422
2423 p_Test(ph, r); n_Test(pGetCoeff(ph), r->cf);
2424 assume(n_GreaterZero(pGetCoeff(ph), r->cf)); // ??
2425
2426 // if(!n_GreaterZero(pGetCoeff(ph),r->cf)) ph = p_Neg(ph,r);
2427 return;
2428 }
2429#endif
2430
2431 n_Normalize(pGetCoeff(ph),r->cf);
2432 if(!n_GreaterZero(pGetCoeff(ph),r->cf)) ph = p_Neg(ph,r);
2433 if (rField_is_Q(r)||(getCoeffType(r->cf)==n_transExt)) // should not be used anymore if CLEARENUMERATORS is 1
2434 {
2435 h=p_InitContent(ph,r);
2436 p=ph;
2437 }
2438 else
2439 {
2440 h=n_Copy(pGetCoeff(ph),r->cf);
2441 p = pNext(ph);
2442 }
2443 while (p!=NULL)
2444 {
2445 n_Normalize(pGetCoeff(p),r->cf);
2446 d=n_SubringGcd(h,pGetCoeff(p),r->cf);
2447 n_Delete(&h,r->cf);
2448 h = d;
2449 if(n_IsOne(h,r->cf))
2450 {
2451 break;
2452 }
2453 pIter(p);
2454 }
2455 //number tmp;
2456 if(!n_IsOne(h,r->cf))
2457 {
2458 p = ph;
2459 while (p!=NULL)
2460 {
2461 //d = nDiv(pGetCoeff(p),h);
2462 //tmp = nExactDiv(pGetCoeff(p),h);
2463 //if (!nEqual(d,tmp))
2464 //{
2465 // StringSetS("** div0:");nWrite(pGetCoeff(p));StringAppendS("/");
2466 // nWrite(h);StringAppendS("=");nWrite(d);StringAppendS(" int:");
2467 // nWrite(tmp);Print(StringEndS("\n")); // NOTE/TODO: use StringAppendS("\n"); omFree(s);
2468 //}
2469 //nDelete(&tmp);
2470 d = n_ExactDiv(pGetCoeff(p),h,r->cf);
2471 p_SetCoeff(p,d,r);
2472 pIter(p);
2473 }
2474 }
2475 n_Delete(&h,r->cf);
2476 if (rField_is_Q_a(r))
2477 {
2478 // special handling for alg. ext.:
2479 if (getCoeffType(r->cf)==n_algExt)
2480 {
2481 h = n_Init(1, r->cf->extRing->cf);
2482 p=ph;
2483 while (p!=NULL)
2484 { // each monom: coeff in Q_a
2485 poly c_n_n=(poly)pGetCoeff(p);
2486 poly c_n=c_n_n;
2487 while (c_n!=NULL)
2488 { // each monom: coeff in Q
2489 d=n_NormalizeHelper(h,pGetCoeff(c_n),r->cf->extRing->cf);
2490 n_Delete(&h,r->cf->extRing->cf);
2491 h=d;
2492 pIter(c_n);
2493 }
2494 pIter(p);
2495 }
2496 /* h contains the 1/lcm of all denominators in c_n_n*/
2497 //n_Normalize(h,r->cf->extRing->cf);
2498 if(!n_IsOne(h,r->cf->extRing->cf))
2499 {
2500 p=ph;
2501 while (p!=NULL)
2502 { // each monom: coeff in Q_a
2503 poly c_n=(poly)pGetCoeff(p);
2504 while (c_n!=NULL)
2505 { // each monom: coeff in Q
2506 d=n_Mult(h,pGetCoeff(c_n),r->cf->extRing->cf);
2507 n_Normalize(d,r->cf->extRing->cf);
2508 n_Delete(&pGetCoeff(c_n),r->cf->extRing->cf);
2509 pGetCoeff(c_n)=d;
2510 pIter(c_n);
2511 }
2512 pIter(p);
2513 }
2514 }
2515 n_Delete(&h,r->cf->extRing->cf);
2516 }
2517 /*else
2518 {
2519 // special handling for rat. functions.:
2520 number hzz =NULL;
2521 p=ph;
2522 while (p!=NULL)
2523 { // each monom: coeff in Q_a (Z_a)
2524 fraction f=(fraction)pGetCoeff(p);
2525 poly c_n=NUM(f);
2526 if (hzz==NULL)
2527 {
2528 hzz=n_Copy(pGetCoeff(c_n),r->cf->extRing->cf);
2529 pIter(c_n);
2530 }
2531 while ((c_n!=NULL)&&(!n_IsOne(hzz,r->cf->extRing->cf)))
2532 { // each monom: coeff in Q (Z)
2533 d=n_Gcd(hzz,pGetCoeff(c_n),r->cf->extRing->cf);
2534 n_Delete(&hzz,r->cf->extRing->cf);
2535 hzz=d;
2536 pIter(c_n);
2537 }
2538 pIter(p);
2539 }
2540 // hzz contains the gcd of all numerators in f
2541 h=n_Invers(hzz,r->cf->extRing->cf);
2542 n_Delete(&hzz,r->cf->extRing->cf);
2543 n_Normalize(h,r->cf->extRing->cf);
2544 if(!n_IsOne(h,r->cf->extRing->cf))
2545 {
2546 p=ph;
2547 while (p!=NULL)
2548 { // each monom: coeff in Q_a (Z_a)
2549 fraction f=(fraction)pGetCoeff(p);
2550 NUM(f)=__p_Mult_nn(NUM(f),h,r->cf->extRing);
2551 p_Normalize(NUM(f),r->cf->extRing);
2552 pIter(p);
2553 }
2554 }
2555 n_Delete(&h,r->cf->extRing->cf);
2556 }*/
2557 }
2558 }
2559 if(!n_GreaterZero(pGetCoeff(ph),r->cf)) ph = p_Neg(ph,r);
2560}
@ n_algExt
used for all algebraic extensions, i.e., the top-most extension in an extension tower is algebraic
Definition coeffs.h:35
@ n_transExt
used for all transcendental extensions, i.e., the top-most extension in an extension tower is transce...
Definition coeffs.h:38
static FORCE_INLINE number n_GetUnit(number n, const coeffs r)
in Z: 1 in Z/kZ (where k is not a prime): largest divisor of n (taken in Z) that is co-prime with k i...
Definition coeffs.h:529
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition coeffs.h:422
static BOOLEAN rField_has_Units(const ring r)
Definition ring.h:495

◆ p_ContentRat()

void p_ContentRat ( poly &  ph,
const ring  r 
)

Definition at line 1744 of file p_polys.cc.

1747{
1748 // init array of RatLeadCoeffs
1749 // poly p_GetCoeffRat(poly p, int ishift, ring r);
1750
1751 int len=pLength(ph);
1752 poly *C = (poly *)omAlloc0((len+1)*sizeof(poly)); //rat coeffs
1753 poly *LM = (poly *)omAlloc0((len+1)*sizeof(poly)); // rat lead terms
1754 int *D = (int *)omAlloc0((len+1)*sizeof(int)); //degrees of coeffs
1755 int *L = (int *)omAlloc0((len+1)*sizeof(int)); //lengths of coeffs
1756 int k = 0;
1757 poly p = p_Copy(ph, r); // ph will be needed below
1758 int mintdeg = p_Totaldegree(p, r);
1759 int minlen = len;
1760 int dd = 0; int i;
1761 int HasConstantCoef = 0;
1762 int is = r->real_var_start - 1;
1763 while (p!=NULL)
1764 {
1765 LM[k] = p_GetExp_k_n(p,1,is, r); // need LmRat istead of p_HeadRat(p, is, currRing); !
1766 C[k] = p_GetCoeffRat(p, is, r);
1767 D[k] = p_Totaldegree(C[k], r);
1768 mintdeg = si_min(mintdeg,D[k]);
1769 L[k] = pLength(C[k]);
1770 minlen = si_min(minlen,L[k]);
1771 if (p_IsConstant(C[k], r))
1772 {
1773 // C[k] = const, so the content will be numerical
1774 HasConstantCoef = 1;
1775 // smth like goto cleanup and return(pContent(p));
1776 }
1777 p_LmDeleteAndNextRat(&p, is, r);
1778 k++;
1779 }
1780
1781 // look for 1 element of minimal degree and of minimal length
1782 k--;
1783 poly d;
1784 int mindeglen = len;
1785 if (k<=0) // this poly is not a ratgring poly -> pContent
1786 {
1787 p_Delete(&C[0], r);
1788 p_Delete(&LM[0], r);
1789 p_ContentForGB(ph, r);
1790 goto cleanup;
1791 }
1792
1793 int pmindeglen;
1794 for(i=0; i<=k; i++)
1795 {
1796 if (D[i] == mintdeg)
1797 {
1798 if (L[i] < mindeglen)
1799 {
1800 mindeglen=L[i];
1801 pmindeglen = i;
1802 }
1803 }
1804 }
1805 d = p_Copy(C[pmindeglen], r);
1806 // there are dd>=1 mindeg elements
1807 // and pmideglen is the coordinate of one of the smallest among them
1808
1809 // poly g = singclap_gcd(p_Copy(p,r),p_Copy(q,r));
1810 // return naGcd(d,d2,currRing);
1811
1812 // adjoin pContentRat here?
1813 for(i=0; i<=k; i++)
1814 {
1815 d=singclap_gcd(d,p_Copy(C[i], r), r);
1816 if (p_Totaldegree(d, r)==0)
1817 {
1818 // cleanup, pContent, return
1819 p_Delete(&d, r);
1820 for(;k>=0;k--)
1821 {
1822 p_Delete(&C[k], r);
1823 p_Delete(&LM[k], r);
1824 }
1825 p_ContentForGB(ph, r);
1826 goto cleanup;
1827 }
1828 }
1829 for(i=0; i<=k; i++)
1830 {
1831 poly h=singclap_pdivide(C[i],d, r);
1832 p_Delete(&C[i], r);
1833 C[i]=h;
1834 }
1835
1836 // zusammensetzen,
1837 p=NULL; // just to be sure
1838 for(i=0; i<=k; i++)
1839 {
1840 p = p_Add_q(p, p_Mult_q(C[i],LM[i], r), r);
1841 C[i]=NULL; LM[i]=NULL;
1842 }
1843 p_Delete(&ph, r); // do not need it anymore
1844 ph = p;
1845 // aufraeumen, return
1846cleanup:
1847 omFree(C);
1848 omFree(LM);
1849 omFree(D);
1850 omFree(L);
1851}
poly singclap_pdivide(poly f, poly g, const ring r)
Definition clapsing.cc:624
#define D(A)
Definition gentable.cc:131
#define omFree(addr)
void p_LmDeleteAndNextRat(poly *p, int ishift, ring r)
Definition p_polys.cc:1700
poly p_GetCoeffRat(poly p, int ishift, ring r)
Definition p_polys.cc:1722
static poly p_Add_q(poly p, poly q, const ring r)
Definition p_polys.h:936
static poly p_Mult_q(poly p, poly q, const ring r)
Definition p_polys.h:1114
static poly p_Copy(poly p, const ring r)
returns a copy of p
Definition p_polys.h:846
poly singclap_gcd(poly f, poly g, const ring r)
polynomial gcd via singclap_gcd_r resp. idSyzygies destroys f and g
Definition polys.cc:380

◆ p_Copy() [1/2]

static poly p_Copy ( poly  p,
const ring  lmRing,
const ring  tailRing 
)
inlinestatic

returns a copy of p with Lm(p) from lmRing and Tail(p) from tailRing

Definition at line 883 of file p_polys.h.

884{
885 if (p != NULL)
886 {
887#ifndef PDEBUG
888 if (tailRing == lmRing)
889 return p_Copy_noCheck(p, tailRing);
890#endif
891 poly pres = p_Head(p, lmRing);
892 if (pNext(p)!=NULL)
893 pNext(pres) = p_Copy_noCheck(pNext(p), tailRing);
894 return pres;
895 }
896 else
897 return NULL;
898}
static poly p_Copy_noCheck(poly p, const ring r)
returns a copy of p (without any additional testing)
Definition p_polys.h:836

◆ p_Copy() [2/2]

static poly p_Copy ( poly  p,
const ring  r 
)
inlinestatic

returns a copy of p

Definition at line 846 of file p_polys.h.

847{
848 if (p!=NULL)
849 {
850 p_Test(p,r);
851 const poly pp = p_Copy_noCheck(p, r);
852 p_Test(pp,r);
853 return pp;
854 }
855 else
856 return NULL;
857}

◆ p_Copy_noCheck()

static poly p_Copy_noCheck ( poly  p,
const ring  r 
)
inlinestatic

returns a copy of p (without any additional testing)

Definition at line 836 of file p_polys.h.

837{
838 /*assume(p!=NULL);*/
839 assume(r != NULL);
840 assume(r->p_Procs != NULL);
841 assume(r->p_Procs->p_Copy != NULL);
842 return r->p_Procs->p_Copy(p, r);
843}

◆ p_CopyPowerProduct()

poly p_CopyPowerProduct ( const poly  p,
const ring  r 
)

like p_Head, but with coefficient 1

Definition at line 4980 of file p_polys.cc.

4981{
4982 if (p == NULL) return NULL;
4983 return p_CopyPowerProduct0(p,n_Init(1,r->cf),r);
4984}
poly p_CopyPowerProduct0(const poly p, number n, const ring r)
like p_Head, but with coefficient n
Definition p_polys.cc:4968

◆ p_CopyPowerProduct0()

poly p_CopyPowerProduct0 ( const poly  p,
const number  n,
const ring  r 
)

like p_Head, but with coefficient n

Definition at line 4968 of file p_polys.cc.

4969{
4971 poly np;
4972 omTypeAllocBin(poly, np, r->PolyBin);
4973 p_SetRingOfLm(np, r);
4974 memcpy(np->exp, p->exp, r->ExpL_Size*sizeof(long));
4975 pNext(np) = NULL;
4976 pSetCoeff0(np, n);
4977 return np;
4978}

◆ p_DecrExp()

static long p_DecrExp ( poly  p,
int  v,
ring  r 
)
inlinestatic

Definition at line 598 of file p_polys.h.

599{
601 int e = p_GetExp(p,v,r);
602 pAssume2(e > 0);
603 e--;
604 return p_SetExp(p,v,e,r);
605}

◆ p_Deg()

long p_Deg ( poly  a,
const ring  r 
)

Definition at line 587 of file p_polys.cc.

588{
589 p_LmCheckPolyRing(a, r);
590// assume(p_GetOrder(a, r) == p_WTotaldegree(a, r)); // WRONG assume!
591 return p_GetOrder(a, r);
592}
static long p_GetOrder(poly p, ring r)
Definition p_polys.h:421

◆ p_DegW()

long p_DegW ( poly  p,
const int w,
const ring  R 
)

Definition at line 690 of file p_polys.cc.

691{
692 p_Test(p, R);
693 assume( w != NULL );
694 long r=-LONG_MAX;
695
696 while (p!=NULL)
697 {
698 long t=totaldegreeWecart_IV(p,R,w);
699 if (t>r) r=t;
700 pIter(p);
701 }
702 return r;
703}
long totaldegreeWecart_IV(poly p, ring r, const int *w)
Definition weight.cc:231

◆ p_Delete() [1/2]

static void p_Delete ( poly *  p,
const ring  lmRing,
const ring  tailRing 
)
inlinestatic

Definition at line 908 of file p_polys.h.

909{
910 assume( p!= NULL );
911 if (*p != NULL)
912 {
913#ifndef PDEBUG
914 if (tailRing == lmRing)
915 {
916 p_Delete(p, tailRing);
917 return;
918 }
919#endif
920 if (pNext(*p) != NULL)
921 p_Delete(&pNext(*p), tailRing);
923 }
924}
static void p_LmDelete(poly p, const ring r)
Definition p_polys.h:723

◆ p_Delete() [2/2]

static void p_Delete ( poly *  p,
const ring  r 
)
inlinestatic

Definition at line 901 of file p_polys.h.

902{
903 assume( p!= NULL );
904 assume( r!= NULL );
905 if ((*p)!=NULL) r->p_Procs->p_Delete(p, r);
906}

◆ p_DeleteComp()

void p_DeleteComp ( poly *  p,
int  k,
const ring  r 
)

Definition at line 3544 of file p_polys.cc.

3545{
3546 poly q;
3547 long unsigned kk=k;
3548
3549 while ((*p!=NULL) && (__p_GetComp(*p,r)==kk)) p_LmDelete(p,r);
3550 if (*p==NULL) return;
3551 q = *p;
3552 if (__p_GetComp(q,r)>kk)
3553 {
3554 p_SubComp(q,1,r);
3555 p_SetmComp(q,r);
3556 }
3557 while (pNext(q)!=NULL)
3558 {
3559 if (__p_GetComp(pNext(q),r)==kk)
3560 p_LmDelete(&(pNext(q)),r);
3561 else
3562 {
3563 pIter(q);
3564 if (__p_GetComp(q,r)>kk)
3565 {
3566 p_SubComp(q,1,r);
3567 p_SetmComp(q,r);
3568 }
3569 }
3570 }
3571}
static unsigned long p_SubComp(poly p, unsigned long v, ring r)
Definition p_polys.h:453
#define p_SetmComp
Definition p_polys.h:244

◆ p_Diff()

poly p_Diff ( poly  a,
int  k,
const ring  r 
)

Definition at line 1898 of file p_polys.cc.

1899{
1900 poly res, f, last;
1901 number t;
1902
1903 last = res = NULL;
1904 while (a!=NULL)
1905 {
1906 if (p_GetExp(a,k,r)!=0)
1907 {
1908 f = p_LmInit(a,r);
1909 t = n_Init(p_GetExp(a,k,r),r->cf);
1910 pSetCoeff0(f,n_Mult(t,pGetCoeff(a),r->cf));
1911 n_Delete(&t,r->cf);
1912 if (n_IsZero(pGetCoeff(f),r->cf))
1913 p_LmDelete(&f,r);
1914 else
1915 {
1916 p_DecrExp(f,k,r);
1917 p_Setm(f,r);
1918 if (res==NULL)
1919 {
1920 res=last=f;
1921 }
1922 else
1923 {
1924 pNext(last)=f;
1925 last=f;
1926 }
1927 }
1928 }
1929 pIter(a);
1930 }
1931 return res;
1932}
STATIC_VAR poly last
Definition hdegree.cc:1172
static long p_DecrExp(poly p, int v, ring r)
Definition p_polys.h:598

◆ p_DiffOp()

poly p_DiffOp ( poly  a,
poly  b,
BOOLEAN  multiply,
const ring  r 
)

Definition at line 1973 of file p_polys.cc.

1974{
1975 poly result=NULL;
1976 poly h;
1977 for(;a!=NULL;pIter(a))
1978 {
1979 for(h=b;h!=NULL;pIter(h))
1980 {
1981 result=p_Add_q(result,p_DiffOpM(a,h,multiply,r),r);
1982 }
1983 }
1984 return result;
1985}
return result
static poly p_DiffOpM(poly a, poly b, BOOLEAN multiply, const ring r)
Definition p_polys.cc:1934

◆ p_Div_mm()

poly p_Div_mm ( poly  p,
const poly  m,
const ring  r 
)

divide polynomial by monomial

Definition at line 1538 of file p_polys.cc.

1539{
1540 p_Test(p, r);
1541 p_Test(m, r);
1542 poly result = p;
1543 poly prev = NULL;
1544 number n=pGetCoeff(m);
1545 while (p!=NULL)
1546 {
1547 number nc = n_Div(pGetCoeff(p),n,r->cf);
1548 n_Normalize(nc,r->cf);
1549 if (!n_IsZero(nc,r->cf))
1550 {
1551 p_SetCoeff(p,nc,r);
1552 prev=p;
1553 p_ExpVectorSub(p,m,r);
1554 pIter(p);
1555 }
1556 else
1557 {
1558 if (prev==NULL)
1559 {
1560 p_LmDelete(&result,r);
1561 p=result;
1562 }
1563 else
1564 {
1565 p_LmDelete(&pNext(prev),r);
1566 p=pNext(prev);
1567 }
1568 }
1569 }
1570 p_Test(result,r);
1571 return(result);
1572}

◆ p_Div_nn()

poly p_Div_nn ( poly  p,
const number  n,
const ring  r 
)

Definition at line 1505 of file p_polys.cc.

1506{
1507 pAssume(!n_IsZero(n,r->cf));
1508 p_Test(p, r);
1509 poly result = p;
1510 poly prev = NULL;
1511 while (p!=NULL)
1512 {
1513 number nc = n_Div(pGetCoeff(p),n,r->cf);
1514 if (!n_IsZero(nc,r->cf))
1515 {
1516 p_SetCoeff(p,nc,r);
1517 prev=p;
1518 pIter(p);
1519 }
1520 else
1521 {
1522 if (prev==NULL)
1523 {
1524 p_LmDelete(&result,r);
1525 p=result;
1526 }
1527 else
1528 {
1529 p_LmDelete(&pNext(prev),r);
1530 p=pNext(prev);
1531 }
1532 }
1533 }
1534 p_Test(result,r);
1535 return(result);
1536}

◆ p_DivideM()

poly p_DivideM ( poly  a,
poly  b,
const ring  r 
)

Definition at line 1578 of file p_polys.cc.

1579{
1580 if (a==NULL) { p_Delete(&b,r); return NULL; }
1581 poly result=a;
1582
1583 if(!p_IsConstant(b,r))
1584 {
1585 if (rIsNCRing(r))
1586 {
1587 WerrorS("p_DivideM not implemented for non-commuative rings");
1588 return NULL;
1589 }
1590 poly prev=NULL;
1591 while (a!=NULL)
1592 {
1593 if (p_DivisibleBy(b,a,r))
1594 {
1595 p_ExpVectorSub(a,b,r);
1596 prev=a;
1597 pIter(a);
1598 }
1599 else
1600 {
1601 if (prev==NULL)
1602 {
1603 p_LmDelete(&result,r);
1604 a=result;
1605 }
1606 else
1607 {
1608 p_LmDelete(&pNext(prev),r);
1609 a=pNext(prev);
1610 }
1611 }
1612 }
1613 }
1614 if (result!=NULL)
1615 {
1617 //if ((!rField_is_Ring(r)) || n_IsUnit(inv,r->cf))
1618 if (rField_is_Zp(r))
1619 {
1620 inv = n_Invers(inv,r->cf);
1622 n_Delete(&inv, r->cf);
1623 }
1624 else
1625 {
1627 }
1628 }
1629 p_Delete(&b, r);
1630 return result;
1631}
#define __p_Mult_nn(p, n, r)
Definition p_polys.h:971
static BOOLEAN rIsNCRing(const ring r)
Definition ring.h:426

◆ p_DivisibleBy()

static BOOLEAN p_DivisibleBy ( poly  a,
poly  b,
const ring  r 
)
inlinestatic

Definition at line 1900 of file p_polys.h.

1901{
1903 pIfThen1(a!=NULL, p_LmCheckPolyRing1(a, r));
1904
1905 if (a != NULL && (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r)))
1906 return _p_LmDivisibleByNoComp(a,b,r);
1907 return FALSE;
1908}

◆ p_DivisibleByRingCase()

BOOLEAN p_DivisibleByRingCase ( poly  f,
poly  g,
const ring  r 
)

divisibility check over ground ring (which may contain zero divisors); TRUE iff LT(f) divides LT(g), i.e., LT(f)*c*m = LT(g), for some coefficient c and some monomial m; does not take components into account

Definition at line 1642 of file p_polys.cc.

1643{
1644 int exponent;
1645 for(int i = (int)rVar(r); i>0; i--)
1646 {
1647 exponent = p_GetExp(g, i, r) - p_GetExp(f, i, r);
1648 if (exponent < 0) return FALSE;
1649 }
1650 return n_DivBy(pGetCoeff(g), pGetCoeff(f), r->cf);
1651}
#define exponent

◆ p_EqualPolys() [1/2]

BOOLEAN p_EqualPolys ( poly  p1,
poly  p2,
const ring  r 
)

Definition at line 4512 of file p_polys.cc.

4513{
4514 while ((p1 != NULL) && (p2 != NULL))
4515 {
4516 if (! p_LmEqual(p1, p2,r))
4517 return FALSE;
4518 if (! n_Equal(p_GetCoeff(p1,r), p_GetCoeff(p2,r),r->cf ))
4519 return FALSE;
4520 pIter(p1);
4521 pIter(p2);
4522 }
4523 return (p1==p2);
4524}

◆ p_EqualPolys() [2/2]

BOOLEAN p_EqualPolys ( poly  p1,
poly  p2,
const ring  r1,
const ring  r2 
)

same as the usual p_EqualPolys for polys belonging to equal rings

Definition at line 4550 of file p_polys.cc.

4551{
4552 assume( r1 == r2 || rSamePolyRep(r1, r2) ); // will be used in rEqual!
4553 assume( r1->cf == r2->cf );
4554
4555 while ((p1 != NULL) && (p2 != NULL))
4556 {
4557 // returns 1 if ExpVector(p)==ExpVector(q): does not compare numbers !!
4558 // #define p_LmEqual(p1, p2, r) p_ExpVectorEqual(p1, p2, r)
4559
4560 if (! p_ExpVectorEqual(p1, p2, r1, r2))
4561 return FALSE;
4562
4563 if (! n_Equal(p_GetCoeff(p1,r1), p_GetCoeff(p2,r2), r1->cf ))
4564 return FALSE;
4565
4566 pIter(p1);
4567 pIter(p2);
4568 }
4569 return (p1==p2);
4570}
BOOLEAN rSamePolyRep(ring r1, ring r2)
returns TRUE, if r1 and r2 represents the monomials in the same way FALSE, otherwise this is an analo...
Definition ring.cc:1800

◆ p_ExpVectorAdd()

static void p_ExpVectorAdd ( poly  p1,
poly  p2,
const ring  r 
)
inlinestatic

Definition at line 1411 of file p_polys.h.

1412{
1413 p_LmCheckPolyRing1(p1, r);
1414 p_LmCheckPolyRing1(p2, r);
1415#if PDEBUG >= 1
1416 for (int i=1; i<=r->N; i++)
1417 pAssume1((unsigned long) (p_GetExp(p1, i, r) + p_GetExp(p2, i, r)) <= r->bitmask);
1418 pAssume1(p_GetComp(p1, r) == 0 || p_GetComp(p2, r) == 0);
1419#endif
1420
1421 p_MemAdd_LengthGeneral(p1->exp, p2->exp, r->ExpL_Size);
1423}

◆ p_ExpVectorAddSub()

static void p_ExpVectorAddSub ( poly  p1,
poly  p2,
poly  p3,
const ring  r 
)
inlinestatic

Definition at line 1456 of file p_polys.h.

1457{
1458 p_LmCheckPolyRing1(p1, r);
1459 p_LmCheckPolyRing1(p2, r);
1461#if PDEBUG >= 1
1462 for (int i=1; i<=r->N; i++)
1463 pAssume1(p_GetExp(p1, i, r) + p_GetExp(p2, i, r) >= p_GetExp(p3, i, r));
1464 pAssume1(p_GetComp(p1, r) == 0 ||
1465 (p_GetComp(p2, r) - p_GetComp(p3, r) == 0) ||
1466 (p_GetComp(p1, r) == p_GetComp(p2, r) - p_GetComp(p3, r)));
1467#endif
1468
1469 p_MemAddSub_LengthGeneral(p1->exp, p2->exp, p3->exp, r->ExpL_Size);
1470 // no need to adjust in case of NegWeights
1471}

◆ p_ExpVectorCopy()

static void p_ExpVectorCopy ( poly  d_p,
poly  s_p,
const ring  r 
)
inlinestatic

Definition at line 1313 of file p_polys.h.

1314{
1317 memcpy(d_p->exp, s_p->exp, r->ExpL_Size*sizeof(long));
1318}

◆ p_ExpVectorDiff()

static void p_ExpVectorDiff ( poly  pr,
poly  p1,
poly  p2,
const ring  r 
)
inlinestatic

Definition at line 1474 of file p_polys.h.

1475{
1476 p_LmCheckPolyRing1(p1, r);
1477 p_LmCheckPolyRing1(p2, r);
1479#if PDEBUG >= 2
1480 for (int i=1; i<=r->N; i++)
1481 pAssume1(p_GetExp(p1, i, r) >= p_GetExp(p2, i, r));
1482 pAssume1(!rRing_has_Comp(r) || p_GetComp(p1, r) == p_GetComp(p2, r));
1483#endif
1484
1485 p_MemDiff_LengthGeneral(pr->exp, p1->exp, p2->exp, r->ExpL_Size);
1487}

◆ p_ExpVectorEqual()

static BOOLEAN p_ExpVectorEqual ( poly  p1,
poly  p2,
const ring  r 
)
inlinestatic

Definition at line 1489 of file p_polys.h.

1490{
1491 p_LmCheckPolyRing1(p1, r);
1492 p_LmCheckPolyRing1(p2, r);
1493
1494 unsigned i = r->ExpL_Size;
1495 unsigned long *ep = p1->exp;
1496 unsigned long *eq = p2->exp;
1497
1498 do
1499 {
1500 i--;
1501 if (ep[i] != eq[i]) return FALSE;
1502 }
1503 while (i!=0);
1504 return TRUE;
1505}

◆ p_ExpVectorSub()

static void p_ExpVectorSub ( poly  p1,
poly  p2,
const ring  r 
)
inlinestatic

Definition at line 1440 of file p_polys.h.

1441{
1442 p_LmCheckPolyRing1(p1, r);
1443 p_LmCheckPolyRing1(p2, r);
1444#if PDEBUG >= 1
1445 for (int i=1; i<=r->N; i++)
1446 pAssume1(p_GetExp(p1, i, r) >= p_GetExp(p2, i, r));
1447 pAssume1(p_GetComp(p1, r) == 0 || p_GetComp(p2, r) == 0 ||
1448 p_GetComp(p1, r) == p_GetComp(p2, r));
1449#endif
1450
1451 p_MemSub_LengthGeneral(p1->exp, p2->exp, r->ExpL_Size);
1453}

◆ p_ExpVectorSum()

static void p_ExpVectorSum ( poly  pr,
poly  p1,
poly  p2,
const ring  r 
)
inlinestatic

Definition at line 1425 of file p_polys.h.

1426{
1427 p_LmCheckPolyRing1(p1, r);
1428 p_LmCheckPolyRing1(p2, r);
1430#if PDEBUG >= 1
1431 for (int i=1; i<=r->N; i++)
1432 pAssume1((unsigned long) (p_GetExp(p1, i, r) + p_GetExp(p2, i, r)) <= r->bitmask);
1433 pAssume1(p_GetComp(p1, r) == 0 || p_GetComp(p2, r) == 0);
1434#endif
1435
1436 p_MemSum_LengthGeneral(pr->exp, p1->exp, p2->exp, r->ExpL_Size);
1438}

◆ p_Farey()

poly p_Farey ( poly  p,
number  N,
const ring  r 
)

Definition at line 54 of file p_polys.cc.

55{
56 poly h=p_Copy(p,r);
57 poly hh=h;
58 while(h!=NULL)
59 {
61 pSetCoeff0(h,n_Farey(c,N,r->cf));
62 n_Delete(&c,r->cf);
63 pIter(h);
64 }
65 while((hh!=NULL)&&(n_IsZero(pGetCoeff(hh),r->cf)))
66 {
67 p_LmDelete(&hh,r);
68 }
69 h=hh;
70 while((h!=NULL) && (pNext(h)!=NULL))
71 {
72 if(n_IsZero(pGetCoeff(pNext(h)),r->cf))
73 {
74 p_LmDelete(&pNext(h),r);
75 }
76 else pIter(h);
77 }
78 return hh;
79}
static FORCE_INLINE number n_Farey(number a, number b, const coeffs r)
Definition coeffs.h:764

◆ p_FDeg()

static long p_FDeg ( const poly  p,
const ring  r 
)
inlinestatic

Definition at line 380 of file p_polys.h.

380{ return r->pFDeg(p,r); }

◆ p_GcdMon()

poly p_GcdMon ( poly  f,
poly  g,
const ring  r 
)

polynomial gcd for f=mon

Definition at line 4930 of file p_polys.cc.

4931{
4932 assume(f!=NULL);
4933 assume(g!=NULL);
4934 assume(pNext(f)==NULL);
4935 poly G=p_Head(f,r);
4936 poly h=g;
4937 int *mf=(int*)omAlloc((r->N+1)*sizeof(int));
4938 p_GetExpV(f,mf,r);
4939 int *mh=(int*)omAlloc((r->N+1)*sizeof(int));
4942 loop
4943 {
4944 if (h==NULL) break;
4945 if(!one_coeff)
4946 {
4948 one_coeff=n_IsOne(n,r->cf);
4949 p_SetCoeff(G,n,r);
4950 }
4951 p_GetExpV(h,mh,r);
4953 for(unsigned j=r->N;j!=0;j--)
4954 {
4955 if (mh[j]<mf[j]) mf[j]=mh[j];
4956 if (mf[j]>0) const_mon=FALSE;
4957 }
4958 if (one_coeff && const_mon) break;
4959 pIter(h);
4960 }
4961 mf[0]=0;
4962 p_SetExpV(G,mf,r); // included is p_SetComp, p_Setm
4963 omFreeSize(mf,(r->N+1)*sizeof(int));
4964 omFreeSize(mh,(r->N+1)*sizeof(int));
4965 return G;
4966}
STATIC_VAR TreeM * G
Definition janet.cc:31
#define omAlloc(size)

◆ p_GetCoeffRat()

poly p_GetCoeffRat ( poly  p,
int  ishift,
ring  r 
)

Definition at line 1722 of file p_polys.cc.

1723{
1724 poly q = pNext(p);
1725 poly res; // = p_Head(p,r);
1726 res = p_GetExp_k_n(p, ishift+1, r->N, r); // does pSetm internally
1727 p_SetCoeff(res,n_Copy(p_GetCoeff(p,r),r),r);
1728 poly s;
1729 long cmp = p_GetComp(p, r);
1730 while ( (q!= NULL) && (p_Comp_k_n(p, q, ishift+1, r)) && (p_GetComp(q, r) == cmp) )
1731 {
1732 s = p_GetExp_k_n(q, ishift+1, r->N, r);
1733 p_SetCoeff(s,n_Copy(p_GetCoeff(q,r),r),r);
1734 res = p_Add_q(res,s,r);
1735 q = pNext(q);
1736 }
1737 cmp = 0;
1738 p_SetCompP(res,cmp,r);
1739 return res;
1740}
static int p_Comp_k_n(poly a, poly b, int k, ring r)
Definition p_polys.h:640
static void p_SetCompP(poly p, int i, ring r)
Definition p_polys.h:254

◆ p_GetExp() [1/3]

static long p_GetExp ( const poly  p,
const int  v,
const ring  r 
)
inlinestatic

get v^th exponent for a monomial

Definition at line 572 of file p_polys.h.

573{
575 pAssume2(v>0 && v <= r->N);
576 pAssume2(r->VarOffset[v] != -1);
577 return p_GetExp(p, r->bitmask, r->VarOffset[v]);
578}

◆ p_GetExp() [2/3]

static long p_GetExp ( const poly  p,
const ring  r,
const int  VarOffset 
)
inlinestatic

Definition at line 555 of file p_polys.h.

556{
558 pAssume2(VarOffset != -1);
559 return p_GetExp(p, r->bitmask, VarOffset);
560}

◆ p_GetExp() [3/3]

static long p_GetExp ( const poly  p,
const unsigned long  iBitmask,
const int  VarOffset 
)
inlinestatic

get a single variable exponent @Note: the integer VarOffset encodes:

  1. the position of a variable in the exponent vector p->exp (lower 24 bits)
  2. number of bits to shift to the right in the upper 8 bits (which takes at most 6 bits for 64 bit) Thus VarOffset always has 2 zero higher bits!

Definition at line 469 of file p_polys.h.

470{
471 pAssume2((VarOffset >> (24 + 6)) == 0);
472#if 0
473 int pos=(VarOffset & 0xffffff);
474 int bitpos=(VarOffset >> 24);
475 unsigned long exp=(p->exp[pos] >> bitmask) & iBitmask;
476 return exp;
477#else
478 return (long)
479 ((p->exp[(VarOffset & 0xffffff)] >> (VarOffset >> 24))
480 & iBitmask);
481#endif
482}
gmp_float exp(const gmp_float &a)

◆ p_GetExp_k_n()

static poly p_GetExp_k_n ( poly  p,
int  l,
int  k,
const ring  r 
)
inlinestatic

Definition at line 1372 of file p_polys.h.

1373{
1374 if (p == NULL) return NULL;
1376 poly np;
1377 omTypeAllocBin(poly, np, r->PolyBin);
1378 p_SetRingOfLm(np, r);
1379 memcpy(np->exp, p->exp, r->ExpL_Size*sizeof(long));
1380 pNext(np) = NULL;
1381 pSetCoeff0(np, n_Init(1, r->cf));
1382 int i;
1383 for(i=l;i<=k;i++)
1384 {
1385 //np->exp[(r->VarOffset[i] & 0xffffff)] =0;
1386 p_SetExp(np,i,0,r);
1387 }
1388 p_Setm(np,r);
1389 return np;
1390}

◆ p_GetExpDiff()

static long p_GetExpDiff ( poly  p1,
poly  p2,
int  i,
ring  r 
)
inlinestatic

Definition at line 635 of file p_polys.h.

636{
637 return p_GetExp(p1,i,r) - p_GetExp(p2,i,r);
638}

◆ p_GetExpSum()

static long p_GetExpSum ( poly  p1,
poly  p2,
int  i,
ring  r 
)
inlinestatic

Definition at line 629 of file p_polys.h.

630{
631 p_LmCheckPolyRing2(p1, r);
632 p_LmCheckPolyRing2(p2, r);
633 return p_GetExp(p1,i,r) + p_GetExp(p2,i,r);
634}

◆ p_GetExpV()

static void p_GetExpV ( poly  p,
int ev,
const ring  r 
)
inlinestatic

Definition at line 1520 of file p_polys.h.

1521{
1523 for (unsigned j = r->N; j!=0; j--)
1524 ev[j] = p_GetExp(p, j, r);
1525
1526 ev[0] = p_GetComp(p, r);
1527}

◆ p_GetExpVL()

static void p_GetExpVL ( poly  p,
int64 ev,
const ring  r 
)
inlinestatic

Definition at line 1529 of file p_polys.h.

1530{
1532 for (unsigned j = r->N; j!=0; j--)
1533 ev[j-1] = p_GetExp(p, j, r);
1534}

◆ p_GetExpVLV()

static int64 p_GetExpVLV ( poly  p,
int64 ev,
const ring  r 
)
inlinestatic

Definition at line 1536 of file p_polys.h.

1537{
1539 for (unsigned j = r->N; j!=0; j--)
1540 ev[j-1] = p_GetExp(p, j, r);
1541 return (int64)p_GetComp(p,r);
1542}

◆ p_GetMaxExp() [1/2]

static unsigned long p_GetMaxExp ( const poly  p,
const ring  r 
)
inlinestatic

Definition at line 804 of file p_polys.h.

805{
806 return p_GetMaxExp(p_GetMaxExpL(p, r), r);
807}
static unsigned long p_GetMaxExp(const unsigned long l, const ring r)
Definition p_polys.h:781
unsigned long p_GetMaxExpL(poly p, const ring r, unsigned long l_max=0)
return the maximal exponent of p in form of the maximal long var
Definition p_polys.cc:1175

◆ p_GetMaxExp() [2/2]

static unsigned long p_GetMaxExp ( const unsigned long  l,
const ring  r 
)
inlinestatic

Definition at line 781 of file p_polys.h.

782{
783 unsigned long bitmask = r->bitmask;
784 unsigned long max = (l & bitmask);
785 unsigned long j = r->ExpPerLong - 1;
786
787 if (j > 0)
788 {
789 unsigned long i = r->BitsPerExp;
790 long e;
791 loop
792 {
793 e = ((l >> i) & bitmask);
794 if ((unsigned long) e > max)
795 max = e;
796 j--;
797 if (j==0) break;
798 i += r->BitsPerExp;
799 }
800 }
801 return max;
802}
static int max(int a, int b)
Definition fast_mult.cc:264

◆ p_GetMaxExpL()

unsigned long p_GetMaxExpL ( poly  p,
const ring  r,
unsigned long  l_max = 0 
)

return the maximal exponent of p in form of the maximal long var

Definition at line 1175 of file p_polys.cc.

1176{
1177 unsigned long l_p, divmask = r->divmask;
1178 int i;
1179
1180 while (p != NULL)
1181 {
1182 l_p = p->exp[r->VarL_Offset[0]];
1183 if (l_p > l_max ||
1184 (((l_max & divmask) ^ (l_p & divmask)) != ((l_max-l_p) & divmask)))
1186 for (i=1; i<r->VarL_Size; i++)
1187 {
1188 l_p = p->exp[r->VarL_Offset[i]];
1189 // do the divisibility trick to find out whether l has an exponent
1190 if (l_p > l_max ||
1191 (((l_max & divmask) ^ (l_p & divmask)) != ((l_max-l_p) & divmask)))
1193 }
1194 pIter(p);
1195 }
1196 return l_max;
1197}
static unsigned long p_GetMaxExpL2(unsigned long l1, unsigned long l2, const ring r, unsigned long number_of_exp)
Definition p_polys.cc:1107

◆ p_GetMaxExpP()

poly p_GetMaxExpP ( poly  p,
ring  r 
)

return monomial r such that GetExp(r,i) is maximum of all monomials in p; coeff == 0, next == NULL, ord is not set

Definition at line 1138 of file p_polys.cc.

1139{
1140 p_CheckPolyRing(p, r);
1141 if (p == NULL) return p_Init(r);
1142 poly max = p_LmInit(p, r);
1143 pIter(p);
1144 if (p == NULL) return max;
1145 int i, offset;
1146 unsigned long l_p, l_max;
1147 unsigned long divmask = r->divmask;
1148
1149 do
1150 {
1151 offset = r->VarL_Offset[0];
1152 l_p = p->exp[offset];
1153 l_max = max->exp[offset];
1154 // do the divisibility trick to find out whether l has an exponent
1155 if (l_p > l_max ||
1156 (((l_max & divmask) ^ (l_p & divmask)) != ((l_max-l_p) & divmask)))
1157 max->exp[offset] = p_GetMaxExpL2(l_max, l_p, r);
1158
1159 for (i=1; i<r->VarL_Size; i++)
1160 {
1161 offset = r->VarL_Offset[i];
1162 l_p = p->exp[offset];
1163 l_max = max->exp[offset];
1164 // do the divisibility trick to find out whether l has an exponent
1165 if (l_p > l_max ||
1166 (((l_max & divmask) ^ (l_p & divmask)) != ((l_max-l_p) & divmask)))
1167 max->exp[offset] = p_GetMaxExpL2(l_max, l_p, r);
1168 }
1169 pIter(p);
1170 }
1171 while (p != NULL);
1172 return max;
1173}
STATIC_VAR int offset
Definition janet.cc:29
BOOLEAN p_CheckPolyRing(poly p, ring r)
Definition pDebug.cc:115

◆ p_GetOrder()

static long p_GetOrder ( poly  p,
ring  r 
)
inlinestatic

Definition at line 421 of file p_polys.h.

422{
424 if (r->typ==NULL) return ((p)->exp[r->pOrdIndex]);
425 int i=0;
426 loop
427 {
428 switch(r->typ[i].ord_typ)
429 {
430 case ro_am:
431 case ro_wp_neg:
432 return ((p->exp[r->pOrdIndex])-POLY_NEGWEIGHT_OFFSET);
433 case ro_syzcomp:
434 case ro_syz:
435 case ro_cp:
436 i++;
437 break;
438 //case ro_dp:
439 //case ro_wp:
440 default:
441 return ((p)->exp[r->pOrdIndex]);
442 }
443 }
444}
@ ro_syz
Definition ring.h:60
@ ro_cp
Definition ring.h:58
@ ro_wp_neg
Definition ring.h:56
@ ro_am
Definition ring.h:54

◆ p_GetSetmProc()

p_SetmProc p_GetSetmProc ( const ring  r)

Definition at line 560 of file p_polys.cc.

561{
562 // covers lp, rp, ls,
563 if (r->typ == NULL) return p_Setm_Dummy;
564
565 if (r->OrdSize == 1)
566 {
567 if (r->typ[0].ord_typ == ro_dp &&
568 r->typ[0].data.dp.start == 1 &&
569 r->typ[0].data.dp.end == r->N &&
570 r->typ[0].data.dp.place == r->pOrdIndex)
571 return p_Setm_TotalDegree;
572 if (r->typ[0].ord_typ == ro_wp &&
573 r->typ[0].data.wp.start == 1 &&
574 r->typ[0].data.wp.end == r->N &&
575 r->typ[0].data.wp.place == r->pOrdIndex &&
576 r->typ[0].data.wp.weights == r->firstwv)
578 }
579 return p_Setm_General;
580}
void p_Setm_WFirstTotalDegree(poly p, const ring r)
Definition p_polys.cc:554
void p_Setm_Dummy(poly p, const ring r)
Definition p_polys.cc:541
void p_Setm_TotalDegree(poly p, const ring r)
Definition p_polys.cc:547
void p_Setm_General(poly p, const ring r)
Definition p_polys.cc:158
@ ro_dp
Definition ring.h:52
@ ro_wp
Definition ring.h:53

◆ p_GetShortExpVector()

unsigned long p_GetShortExpVector ( const poly  a,
const ring  r 
)

Definition at line 4780 of file p_polys.cc.

4781{
4782 assume(p != NULL);
4783 unsigned long ev = 0; // short exponent vector
4784 unsigned int n = BIT_SIZEOF_LONG / r->N; // number of bits per exp
4785 unsigned int m1; // highest bit which is filled with (n+1)
4786 unsigned int i=0;
4787 int j=1;
4788
4789 if (n == 0)
4790 {
4791 if (r->N <2*BIT_SIZEOF_LONG)
4792 {
4793 n=1;
4794 m1=0;
4795 }
4796 else
4797 {
4798 for (; j<=r->N; j++)
4799 {
4800 if (p_GetExp(p,j,r) > 0) i++;
4801 if (i == BIT_SIZEOF_LONG) break;
4802 }
4803 if (i>0)
4804 ev = ~(0UL) >> (BIT_SIZEOF_LONG - i);
4805 return ev;
4806 }
4807 }
4808 else
4809 {
4810 m1 = (n+1)*(BIT_SIZEOF_LONG - n*r->N);
4811 }
4812
4813 n++;
4814 while (i<m1)
4815 {
4816 ev |= GetBitFields(p_GetExp(p, j,r), i, n);
4817 i += n;
4818 j++;
4819 }
4820
4821 n--;
4822 while (i<BIT_SIZEOF_LONG)
4823 {
4824 ev |= GetBitFields(p_GetExp(p, j,r), i, n);
4825 i += n;
4826 j++;
4827 }
4828 return ev;
4829}
#define BIT_SIZEOF_LONG
Definition auxiliary.h:80
static unsigned long GetBitFields(const long e, const unsigned int s, const unsigned int n)
Definition p_polys.cc:4748

◆ p_GetShortExpVector0()

unsigned long p_GetShortExpVector0 ( const poly  a,
const ring  r 
)

Definition at line 4831 of file p_polys.cc.

4832{
4833 assume(p != NULL);
4834 assume(r->N >=BIT_SIZEOF_LONG);
4835 unsigned long ev = 0; // short exponent vector
4836
4837 for (int j=BIT_SIZEOF_LONG; j>0; j--)
4838 {
4839 if (p_GetExp(p, j,r)>0)
4840 ev |= Sy_bitL(j-1);
4841 }
4842 return ev;
4843}
#define Sy_bitL(x)
Definition options.h:32

◆ p_GetShortExpVector1()

unsigned long p_GetShortExpVector1 ( const poly  a,
const ring  r 
)

Definition at line 4846 of file p_polys.cc.

4847{
4848 assume(p != NULL);
4849 assume(r->N <BIT_SIZEOF_LONG);
4850 assume(2*r->N >=BIT_SIZEOF_LONG);
4851 unsigned long ev = 0; // short exponent vector
4852 int rest=r->N;
4853 int e;
4854 // 2 bits per exp
4855 int j=r->N;
4856 for (; j>BIT_SIZEOF_LONG-r->N; j--)
4857 {
4858 if ((e=p_GetExp(p, j,r))>0)
4859 {
4860 ev |= Sy_bitL(j-1);
4861 if (e>1)
4862 {
4863 ev|=Sy_bitL(rest+j-1);
4864 }
4865 }
4866 }
4867 // 1 bit per exp
4868 for (; j>0; j--)
4869 {
4870 if (p_GetExp(p, j,r)>0)
4871 {
4872 ev |= Sy_bitL(j-1);
4873 }
4874 }
4875 return ev;
4876}

◆ p_GetTotalDegree()

static unsigned long p_GetTotalDegree ( const unsigned long  l,
const ring  r,
const int  number_of_exps 
)
inlinestatic

Definition at line 810 of file p_polys.h.

811{
812 const unsigned long bitmask = r->bitmask;
813 unsigned long sum = (l & bitmask);
814 unsigned long j = number_of_exps - 1;
815
816 if (j > 0)
817 {
818 unsigned long i = r->BitsPerExp;
819 loop
820 {
821 sum += ((l >> i) & bitmask);
822 j--;
823 if (j==0) break;
824 i += r->BitsPerExp;
825 }
826 }
827 return sum;
828}

◆ p_GetVariables()

int p_GetVariables ( poly  p,
int e,
const ring  r 
)

set entry e[i] to 1 if var(i) occurs in p, ignore var(j) if e[j]>0 return #(e[i]>0)

Definition at line 1267 of file p_polys.cc.

1268{
1269 int i;
1270 int n=0;
1271 while(p!=NULL)
1272 {
1273 n=0;
1274 for(i=r->N; i>0; i--)
1275 {
1276 if(e[i]==0)
1277 {
1278 if (p_GetExp(p,i,r)>0)
1279 {
1280 e[i]=1;
1281 n++;
1282 }
1283 }
1284 else
1285 n++;
1286 }
1287 if (n==r->N) break;
1288 pIter(p);
1289 }
1290 return n;
1291}

◆ p_HasNotCF()

BOOLEAN p_HasNotCF ( poly  p1,
poly  p2,
const ring  r 
)

Definition at line 1329 of file p_polys.cc.

1330{
1331
1332 if (p_GetComp(p1,r) > 0 || p_GetComp(p2,r) > 0)
1333 return FALSE;
1334 int i = rVar(r);
1335 loop
1336 {
1337 if ((p_GetExp(p1, i, r) > 0) && (p_GetExp(p2, i, r) > 0))
1338 return FALSE;
1339 i--;
1340 if (i == 0)
1341 return TRUE;
1342 }
1343}

◆ p_HasNotCFRing()

BOOLEAN p_HasNotCFRing ( poly  p1,
poly  p2,
const ring  r 
)

Definition at line 1345 of file p_polys.cc.

1346{
1347
1348 if (p_GetComp(p1,r) > 0 || p_GetComp(p2,r) > 0)
1349 return FALSE;
1350 int i = rVar(r);
1351 loop
1352 {
1353 if ((p_GetExp(p1, i, r) > 0) && (p_GetExp(p2, i, r) > 0))
1354 return FALSE;
1355 i--;
1356 if (i == 0) {
1357 if (n_DivBy(pGetCoeff(p1), pGetCoeff(p2), r->cf) ||
1358 n_DivBy(pGetCoeff(p2), pGetCoeff(p1), r->cf)) {
1359 return FALSE;
1360 } else {
1361 return TRUE;
1362 }
1363 }
1364 }
1365}

◆ p_Head()

static poly p_Head ( const poly  p,
const ring  r 
)
inlinestatic

copy the (leading) term of p

Definition at line 860 of file p_polys.h.

861{
862 if (p == NULL) return NULL;
864 poly np;
865 omTypeAllocBin(poly, np, r->PolyBin);
866 p_SetRingOfLm(np, r);
867 memcpy(np->exp, p->exp, r->ExpL_Size*sizeof(long));
868 pNext(np) = NULL;
869 pSetCoeff0(np, n_Copy(pGetCoeff(p), r->cf));
870 return np;
871}

◆ p_Head0()

poly p_Head0 ( const poly  p,
const ring  r 
)

like p_Head, but allow NULL coeff

Definition at line 4986 of file p_polys.cc.

4987{
4988 if (p==NULL) return NULL;
4989 if (pGetCoeff(p)==NULL) return p_CopyPowerProduct0(p,NULL,r);
4990 return p_Head(p,r);
4991}

◆ p_Homogen()

poly p_Homogen ( poly  p,
int  varnum,
const ring  r 
)

Definition at line 3270 of file p_polys.cc.

3271{
3272 pFDegProc deg;
3273 if (r->pLexOrder && (r->order[0]==ringorder_lp))
3274 deg=p_Totaldegree;
3275 else
3276 deg=r->pFDeg;
3277
3278 poly q=NULL, qn;
3279 int o,ii;
3280 sBucket_pt bp;
3281
3282 if (p!=NULL)
3283 {
3284 if ((varnum < 1) || (varnum > rVar(r)))
3285 {
3286 return NULL;
3287 }
3288 o=deg(p,r);
3289 q=pNext(p);
3290 while (q != NULL)
3291 {
3292 ii=deg(q,r);
3293 if (ii>o) o=ii;
3294 pIter(q);
3295 }
3296 q = p_Copy(p,r);
3297 bp = sBucketCreate(r);
3298 while (q != NULL)
3299 {
3300 ii = o-deg(q,r);
3301 if (ii!=0)
3302 {
3303 p_AddExp(q,varnum, (long)ii,r);
3304 p_Setm(q,r);
3305 }
3306 qn = pNext(q);
3307 pNext(q) = NULL;
3308 sBucket_Add_m(bp, q);
3309 q = qn;
3310 }
3311 sBucketDestroyAdd(bp, &q, &ii);
3312 }
3313 return q;
3314}
static long p_AddExp(poly p, int v, long ee, ring r)
Definition p_polys.h:606
@ ringorder_lp
Definition ring.h:77
void sBucket_Add_m(sBucket_pt bucket, poly p)
Definition sbuckets.cc:173
sBucket_pt sBucketCreate(const ring r)
Definition sbuckets.cc:96
void sBucketDestroyAdd(sBucket_pt bucket, poly *p, int *length)
Definition sbuckets.h:68

◆ p_IncrExp()

static long p_IncrExp ( poly  p,
int  v,
ring  r 
)
inlinestatic

Definition at line 591 of file p_polys.h.

592{
594 int e = p_GetExp(p,v,r);
595 e++;
596 return p_SetExp(p,v,e,r);
597}

◆ p_Init() [1/2]

static poly p_Init ( const ring  r)
inlinestatic

Definition at line 1330 of file p_polys.h.

1331{
1332 return p_Init(r, r->PolyBin);
1333}

◆ p_Init() [2/2]

static poly p_Init ( const ring  r,
omBin  bin 
)
inlinestatic

Definition at line 1320 of file p_polys.h.

1321{
1322 p_CheckRing1(r);
1323 pAssume1(bin != NULL && omSizeWOfBin(r->PolyBin) == omSizeWOfBin(bin));
1324 poly p;
1325 omTypeAlloc0Bin(poly, p, bin);
1327 p_SetRingOfLm(p, r);
1328 return p;
1329}

◆ p_InitContent()

number p_InitContent ( poly  ph,
const ring  r 
)

Definition at line 2635 of file p_polys.cc.

2638{
2640 assume(ph!=NULL);
2641 assume(pNext(ph)!=NULL);
2642 assume(rField_is_Q(r));
2643 if (pNext(pNext(ph))==NULL)
2644 {
2645 return n_GetNumerator(pGetCoeff(pNext(ph)),r->cf);
2646 }
2647 poly p=ph;
2649 pIter(p);
2651 pIter(p);
2652 number d;
2653 number t;
2654 loop
2655 {
2656 nlNormalize(pGetCoeff(p),r->cf);
2657 t=n_GetNumerator(pGetCoeff(p),r->cf);
2658 if (nlGreaterZero(t,r->cf))
2659 d=nlAdd(n1,t,r->cf);
2660 else
2661 d=nlSub(n1,t,r->cf);
2662 nlDelete(&t,r->cf);
2663 nlDelete(&n1,r->cf);
2664 n1=d;
2665 pIter(p);
2666 if (p==NULL) break;
2667 nlNormalize(pGetCoeff(p),r->cf);
2668 t=n_GetNumerator(pGetCoeff(p),r->cf);
2669 if (nlGreaterZero(t,r->cf))
2670 d=nlAdd(n2,t,r->cf);
2671 else
2672 d=nlSub(n2,t,r->cf);
2673 nlDelete(&t,r->cf);
2674 nlDelete(&n2,r->cf);
2675 n2=d;
2676 pIter(p);
2677 if (p==NULL) break;
2678 }
2679 d=nlGcd(n1,n2,r->cf);
2680 nlDelete(&n1,r->cf);
2681 nlDelete(&n2,r->cf);
2682 return d;
2683}
2684#else
2685{
2686 /* ph has al least 2 terms */
2687 number d=pGetCoeff(ph);
2688 int s=n_Size(d,r->cf);
2689 pIter(ph);
2691 int s2=n_Size(d2,r->cf);
2692 pIter(ph);
2693 if (ph==NULL)
2694 {
2695 if (s<s2) return n_Copy(d,r->cf);
2696 else return n_Copy(d2,r->cf);
2697 }
2698 do
2699 {
2701 int ns=n_Size(nd,r->cf);
2702 if (ns<=2)
2703 {
2704 s2=s;
2705 d2=d;
2706 d=nd;
2707 s=ns;
2708 break;
2709 }
2710 else if (ns<s)
2711 {
2712 s2=s;
2713 d2=d;
2714 d=nd;
2715 s=ns;
2716 }
2717 pIter(ph);
2718 }
2719 while(ph!=NULL);
2720 return n_SubringGcd(d,d2,r->cf);
2721}
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...
Definition coeffs.h:567
static FORCE_INLINE number n_GetNumerator(number &n, const coeffs r)
return the numerator of n (if elements of r are by nature not fractional, result is n)
Definition coeffs.h:605
LINLINE number nlAdd(number la, number li, const coeffs r)
Definition longrat.cc:2701
LINLINE number nlSub(number la, number li, const coeffs r)
Definition longrat.cc:2767
LINLINE void nlDelete(number *a, const coeffs r)
Definition longrat.cc:2666
BOOLEAN nlGreaterZero(number za, const coeffs r)
Definition longrat.cc:1308
number nlGcd(number a, number b, const coeffs r)
Definition longrat.cc:1345
void nlNormalize(number &x, const coeffs r)
Definition longrat.cc:1486

◆ p_IsConstant()

static BOOLEAN p_IsConstant ( const poly  p,
const ring  r 
)
inlinestatic

Definition at line 1964 of file p_polys.h.

1965{
1966 if (p == NULL) return TRUE;
1967 return (pNext(p)==NULL) && p_LmIsConstant(p, r);
1968}

◆ p_IsConstantComp()

static BOOLEAN p_IsConstantComp ( const poly  p,
const ring  r 
)
inlinestatic

like the respective p_LmIs* routines, except that p might be empty

Definition at line 1958 of file p_polys.h.

1959{
1960 if (p == NULL) return TRUE;
1961 return (pNext(p)==NULL) && p_LmIsConstantComp(p, r);
1962}

◆ p_IsConstantPoly()

static BOOLEAN p_IsConstantPoly ( const poly  p,
const ring  r 
)
inlinestatic

Definition at line 1978 of file p_polys.h.

1979{
1980 p_Test(p, r);
1981 poly pp=p;
1982 while(pp!=NULL)
1983 {
1984 if (! p_LmIsConstantComp(pp, r))
1985 return FALSE;
1986 pIter(pp);
1987 }
1988 return TRUE;
1989}

◆ p_ISet()

poly p_ISet ( long  i,
const ring  r 
)

returns the poly representing the integer i

Definition at line 1297 of file p_polys.cc.

1298{
1299 poly rc = NULL;
1300 if (i!=0)
1301 {
1302 rc = p_Init(r);
1303 pSetCoeff0(rc,n_Init(i,r->cf));
1304 if (n_IsZero(pGetCoeff(rc),r->cf))
1305 p_LmDelete(&rc,r);
1306 }
1307 return rc;
1308}

◆ p_IsHomogeneous()

BOOLEAN p_IsHomogeneous ( poly  p,
const ring  r 
)

Definition at line 3319 of file p_polys.cc.

3320{
3321 poly qp=p;
3322 int o;
3323
3324 if ((p == NULL) || (pNext(p) == NULL)) return TRUE;
3325 pFDegProc d;
3326 if (r->pLexOrder && (r->order[0]==ringorder_lp))
3327 d=p_Totaldegree;
3328 else
3329 d=r->pFDeg;
3330 o = d(p,r);
3331 do
3332 {
3333 if (d(qp,r) != o) return FALSE;
3334 pIter(qp);
3335 }
3336 while (qp != NULL);
3337 return TRUE;
3338}

◆ p_IsHomogeneousW() [1/2]

BOOLEAN p_IsHomogeneousW ( poly  p,
const intvec w,
const intvec module_w,
const ring  r 
)

Definition at line 3360 of file p_polys.cc.

3361{
3362 poly qp=p;
3363 long o;
3364
3365 if ((p == NULL) || (pNext(p) == NULL)) return TRUE;
3366 pIter(qp);
3367 o = totaldegreeWecart_IV(p,r,w->ivGetVec())+(*module_w)[p_GetComp(p,r)];
3368 do
3369 {
3370 long oo=totaldegreeWecart_IV(qp,r,w->ivGetVec())+(*module_w)[p_GetComp(qp,r)];
3371 if (oo != o) return FALSE;
3372 pIter(qp);
3373 }
3374 while (qp != NULL);
3375 return TRUE;
3376}

◆ p_IsHomogeneousW() [2/2]

BOOLEAN p_IsHomogeneousW ( poly  p,
const intvec w,
const ring  r 
)

Definition at line 3343 of file p_polys.cc.

3344{
3345 poly qp=p;
3346 long o;
3347
3348 if ((p == NULL) || (pNext(p) == NULL)) return TRUE;
3349 pIter(qp);
3350 o = totaldegreeWecart_IV(p,r,w->ivGetVec());
3351 do
3352 {
3353 if (totaldegreeWecart_IV(qp,r,w->ivGetVec()) != o) return FALSE;
3354 pIter(qp);
3355 }
3356 while (qp != NULL);
3357 return TRUE;
3358}

◆ p_IsOne()

static BOOLEAN p_IsOne ( const poly  p,
const ring  R 
)
inlinestatic

either poly(1) or gen(k)?!

Definition at line 1971 of file p_polys.h.

1972{
1973 if (p == NULL) return FALSE; /* TODO check if 0 == 1 */
1974 p_Test(p, R);
1975 return (p_IsConstant(p, R) && n_IsOne(p_GetCoeff(p, R), R->cf));
1976}

◆ p_IsPurePower()

int p_IsPurePower ( const poly  p,
const ring  r 
)

return i, if head depends only on var(i)

Definition at line 1226 of file p_polys.cc.

1227{
1228 int i,k=0;
1229
1230 for (i=r->N;i;i--)
1231 {
1232 if (p_GetExp(p,i, r)!=0)
1233 {
1234 if(k!=0) return 0;
1235 k=i;
1236 }
1237 }
1238 return k;
1239}

◆ p_IsUnit()

static BOOLEAN p_IsUnit ( const poly  p,
const ring  r 
)
inlinestatic

Definition at line 1991 of file p_polys.h.

1992{
1993 if (p == NULL) return FALSE;
1994 if (rField_is_Ring(r))
1995 return (p_LmIsConstant(p, r) && n_IsUnit(pGetCoeff(p),r->cf));
1996 return p_LmIsConstant(p, r);
1997}

◆ p_IsUnivariate()

int p_IsUnivariate ( poly  p,
const ring  r 
)

return i, if poly depends only on var(i)

Definition at line 1247 of file p_polys.cc.

1248{
1249 int i,k=-1;
1250
1251 while (p!=NULL)
1252 {
1253 for (i=r->N;i;i--)
1254 {
1255 if (p_GetExp(p,i, r)!=0)
1256 {
1257 if((k!=-1)&&(k!=i)) return 0;
1258 k=i;
1259 }
1260 }
1261 pIter(p);
1262 }
1263 return k;
1264}

◆ p_Jet()

poly p_Jet ( poly  p,
int  m,
const ring  R 
)

Definition at line 4386 of file p_polys.cc.

4387{
4388 while((p!=NULL) && (p_Totaldegree(p,R)>m)) p_LmDelete(&p,R);
4389 if (p==NULL) return NULL;
4390 poly r=p;
4391 while (pNext(p)!=NULL)
4392 {
4393 if (p_Totaldegree(pNext(p),R)>m)
4394 {
4395 p_LmDelete(&pNext(p),R);
4396 }
4397 else
4398 pIter(p);
4399 }
4400 return r;
4401}

◆ p_JetW()

poly p_JetW ( poly  p,
int  m,
int w,
const ring  R 
)

Definition at line 4430 of file p_polys.cc.

4431{
4432 while((p!=NULL) && (totaldegreeWecart_IV(p,R,w)>m)) p_LmDelete(&p,R);
4433 if (p==NULL) return NULL;
4434 poly r=p;
4435 while (pNext(p)!=NULL)
4436 {
4438 {
4439 p_LmDelete(&pNext(p),R);
4440 }
4441 else
4442 pIter(p);
4443 }
4444 return r;
4445}

◆ p_Last()

poly p_Last ( const poly  a,
int l,
const ring  r 
)

Definition at line 4621 of file p_polys.cc.

4622{
4623 if (p == NULL)
4624 {
4625 l = 0;
4626 return NULL;
4627 }
4628 l = 1;
4629 poly a = p;
4630 if (! rIsSyzIndexRing(r))
4631 {
4632 poly next = pNext(a);
4633 while (next!=NULL)
4634 {
4635 a = next;
4636 next = pNext(a);
4637 l++;
4638 }
4639 }
4640 else
4641 {
4642 long unsigned curr_limit = rGetCurrSyzLimit(r);
4643 poly pp = a;
4644 while ((a=pNext(a))!=NULL)
4645 {
4646 if (__p_GetComp(a,r)<=curr_limit/*syzComp*/)
4647 l++;
4648 else break;
4649 pp = a;
4650 }
4651 a=pp;
4652 }
4653 return a;
4654}
ListNode * next
Definition janet.h:31
static int rGetCurrSyzLimit(const ring r)
Definition ring.h:728
static BOOLEAN rIsSyzIndexRing(const ring r)
Definition ring.h:725

◆ p_Lcm() [1/2]

poly p_Lcm ( const poly  a,
const poly  b,
const ring  r 
)

Definition at line 1664 of file p_polys.cc.

1665{
1666 poly m=p_Init(r);
1667 p_Lcm(a, b, m, r);
1668 p_Setm(m,r);
1669 return(m);
1670}
void p_Lcm(const poly a, const poly b, poly m, const ring r)
Definition p_polys.cc:1655

◆ p_Lcm() [2/2]

void p_Lcm ( const poly  a,
const poly  b,
poly  m,
const ring  r 
)

Definition at line 1655 of file p_polys.cc.

1656{
1657 for (int i=r->N; i; --i)
1658 p_SetExp(m,i, si_max( p_GetExp(a,i,r), p_GetExp(b,i,r)),r);
1659
1660 p_SetComp(m, si_max(p_GetComp(a,r), p_GetComp(b,r)),r);
1661 /* Don't do a pSetm here, otherwise hres/lres chockes */
1662}
static int si_max(const int a, const int b)
Definition auxiliary.h:124

◆ p_LcmRat()

poly p_LcmRat ( const poly  a,
const poly  b,
const long  lCompM,
const ring  r 
)

Definition at line 1677 of file p_polys.cc.

1678{
1679 poly m = // p_One( r);
1680 p_Init(r);
1681
1682// const int (currRing->N) = r->N;
1683
1684 // for (int i = (currRing->N); i>=r->real_var_start; i--)
1685 for (int i = r->real_var_end; i>=r->real_var_start; i--)
1686 {
1687 const int lExpA = p_GetExp (a, i, r);
1688 const int lExpB = p_GetExp (b, i, r);
1689
1690 p_SetExp (m, i, si_max(lExpA, lExpB), r);
1691 }
1692
1693 p_SetComp (m, lCompM, r);
1694 p_Setm(m,r);
1695 p_GetCoeff(m, r)=NULL;
1696
1697 return(m);
1698};

◆ p_LDeg()

static long p_LDeg ( const poly  p,
int l,
const ring  r 
)
inlinestatic

Definition at line 381 of file p_polys.h.

381{ return r->pLDeg(p,l,r); }

◆ p_LmCheckIsFromRing()

BOOLEAN p_LmCheckIsFromRing ( poly  p,
ring  r 
)

Definition at line 74 of file pDebug.cc.

75{
76 if (p != NULL)
77 {
78 #if (OM_TRACK > 0) && defined(OM_TRACK_CUSTOM)
79 void* custom = omGetCustomOfAddr(p);
80 if (custom != NULL)
81 {
83 // be more sloppy for qrings
84 (r->qideal != NULL &&
86 omSizeWOfAddr(p)==omSizeWOfBin(r->PolyBin)) ||
88 "monomial not from specified ring",p,r);
89 return TRUE;
90 }
91 else
92 #endif
93 #ifndef X_OMALLOC
94 {
97 return TRUE;
98 }
99 return FALSE;
100 #endif
101 }
102 return TRUE;
103}
#define pPolyAssumeReturnMsg(cond, msg)
Definition monomials.h:137
#define _pPolyAssumeReturn(cond, p, r)
Definition monomials.h:101
#define omIsBinPageAddr(addr)
Definition omBinPage.h:68
#define omSizeWOfAddr(P)
Definition xalloc.h:223

◆ p_LmCheckPolyRing()

BOOLEAN p_LmCheckPolyRing ( poly  p,
ring  r 
)

Definition at line 123 of file pDebug.cc.

124{
125 #ifndef X_OMALLOC
126 pAssumeReturn(r != NULL && r->PolyBin != NULL);
127 #endif
128 pAssumeReturn(p != NULL);
129 return p_LmCheckIsFromRing(p, r);
130}

◆ p_LmCmp()

static int p_LmCmp ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1580 of file p_polys.h.

1581{
1583 p_LmCheckPolyRing1(q, r);
1584
1585 const unsigned long* _s1 = ((unsigned long*) p->exp);
1586 const unsigned long* _s2 = ((unsigned long*) q->exp);
1587 REGISTER unsigned long _v1;
1588 REGISTER unsigned long _v2;
1589 const unsigned long _l = r->CmpL_Size;
1590
1591 REGISTER unsigned long _i=0;
1592
1594 _v1 = _s1[_i];
1595 _v2 = _s2[_i];
1596 if (_v1 == _v2)
1597 {
1598 _i++;
1599 if (_i == _l) return 0;
1601 }
1602 const long* _ordsgn = (long*) r->ordsgn;
1603#if 1 /* two variants*/
1604 if (_v1 > _v2)
1605 {
1606 return _ordsgn[_i];
1607 }
1608 return -(_ordsgn[_i]);
1609#else
1610 if (_v1 > _v2)
1611 {
1612 if (_ordsgn[_i] == 1) return 1;
1613 return -1;
1614 }
1615 if (_ordsgn[_i] == 1) return -1;
1616 return 1;
1617#endif
1618}

◆ p_LmDelete() [1/2]

static void p_LmDelete ( poly *  p,
const ring  r 
)
inlinestatic

Definition at line 743 of file p_polys.h.

744{
746 poly h = *p;
747 *p = pNext(h);
748 n_Delete(&pGetCoeff(h), r->cf);
749 #ifdef XALLOC_BIN
750 omFreeBin(h,r->PolyBin);
751 #else
753 #endif
754}
#define omFreeBin(addr, bin)

◆ p_LmDelete() [2/2]

static void p_LmDelete ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 723 of file p_polys.h.

724{
726 n_Delete(&pGetCoeff(p), r->cf);
727 #ifdef XALLOC_BIN
728 omFreeBin(p,r->PolyBin);
729 #else
731 #endif
732}

◆ p_LmDelete0()

static void p_LmDelete0 ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 733 of file p_polys.h.

734{
736 if (pGetCoeff(p)!=NULL) n_Delete(&pGetCoeff(p), r->cf);
737 #ifdef XALLOC_BIN
738 omFreeBin(p,r->PolyBin);
739 #else
741 #endif
742}

◆ p_LmDeleteAndNext()

static poly p_LmDeleteAndNext ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 755 of file p_polys.h.

756{
758 poly pnext = pNext(p);
759 n_Delete(&pGetCoeff(p), r->cf);
760 #ifdef XALLOC_BIN
761 omFreeBin(p,r->PolyBin);
762 #else
764 #endif
765 return pnext;
766}

◆ p_LmDeleteAndNextRat()

void p_LmDeleteAndNextRat ( poly *  p,
int  ishift,
ring  r 
)

Definition at line 1700 of file p_polys.cc.

1701{
1702 /* modifies p*/
1703 // Print("start: "); Print(" "); p_wrp(*p,r);
1704 p_LmCheckPolyRing2(*p, r);
1705 poly q = p_Head(*p,r);
1706 const long cmp = p_GetComp(*p, r);
1707 while ( ( (*p)!=NULL ) && ( p_Comp_k_n(*p, q, ishift+1, r) ) && (p_GetComp(*p, r) == cmp) )
1708 {
1709 p_LmDelete(p,r);
1710 // Print("while: ");p_wrp(*p,r);Print(" ");
1711 }
1712 // p_wrp(*p,r);Print(" ");
1713 // PrintS("end\n");
1714 p_LmDelete(&q,r);
1715}

◆ p_LmDivisibleBy()

static BOOLEAN p_LmDivisibleBy ( poly  a,
poly  b,
const ring  r 
)
inlinestatic

Definition at line 1891 of file p_polys.h.

1892{
1894 pIfThen1(a != NULL, p_LmCheckPolyRing1(b, r));
1895 if (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r))
1896 return _p_LmDivisibleByNoComp(a, b, r);
1897 return FALSE;
1898}

◆ p_LmDivisibleByNoComp() [1/2]

static BOOLEAN p_LmDivisibleByNoComp ( poly  a,
const ring  ra,
poly  b,
const ring  rb 
)
inlinestatic

Definition at line 1884 of file p_polys.h.

1885{
1888 return _p_LmDivisibleByNoComp(a, ra, b, rb);
1889}

◆ p_LmDivisibleByNoComp() [2/2]

static BOOLEAN p_LmDivisibleByNoComp ( poly  a,
poly  b,
const ring  r 
)
inlinestatic

Definition at line 1877 of file p_polys.h.

1878{
1879 p_LmCheckPolyRing1(a, r);
1881 return _p_LmDivisibleByNoComp(a, b, r);
1882}

◆ p_LmDivisibleByPart()

static BOOLEAN p_LmDivisibleByPart ( poly  a,
poly  b,
const ring  r,
const int  start,
const int  end 
)
inlinestatic

Definition at line 1862 of file p_polys.h.

1863{
1865 pIfThen1(a != NULL, p_LmCheckPolyRing1(b, r));
1866 if (p_GetComp(a, r) == 0 || p_GetComp(a,r) == p_GetComp(b,r))
1867 return _p_LmDivisibleByNoCompPart(a, r, b, r,start, end);
1868 return FALSE;
1869}

◆ p_LmExpVectorAddIsOk()

static BOOLEAN p_LmExpVectorAddIsOk ( const poly  p1,
const poly  p2,
const ring  r 
)
inlinestatic

Definition at line 1999 of file p_polys.h.

2001{
2002 p_LmCheckPolyRing(p1, r);
2003 p_LmCheckPolyRing(p2, r);
2004 unsigned long l1, l2, divmask = r->divmask;
2005 int i;
2006
2007 for (i=0; i<r->VarL_Size; i++)
2008 {
2009 l1 = p1->exp[r->VarL_Offset[i]];
2010 l2 = p2->exp[r->VarL_Offset[i]];
2011 // do the divisiblity trick
2012 if ( (l1 > ULONG_MAX - l2) ||
2013 (((l1 & divmask) ^ (l2 & divmask)) != ((l1 + l2) & divmask)))
2014 return FALSE;
2015 }
2016 return TRUE;
2017}

◆ p_LmFree() [1/2]

static void p_LmFree ( poly *  p,
ring   
)
inlinestatic

Definition at line 696 of file p_polys.h.

698{
700 poly h = *p;
701 *p = pNext(h);
702 #ifdef XALLOC_BIN
703 omFreeBin(h,r->PolyBin);
704 #else
706 #endif
707}

◆ p_LmFree() [2/2]

static void p_LmFree ( poly  p,
ring   
)
inlinestatic

Definition at line 683 of file p_polys.h.

685{
687 #ifdef XALLOC_BIN
688 omFreeBin(p,r->PolyBin);
689 #else
691 #endif
692}

◆ p_LmFreeAndNext()

static poly p_LmFreeAndNext ( poly  p,
ring   
)
inlinestatic

Definition at line 711 of file p_polys.h.

713{
715 poly pnext = pNext(p);
716 #ifdef XALLOC_BIN
717 omFreeBin(p,r->PolyBin);
718 #else
720 #endif
721 return pnext;
722}

◆ p_LmInit() [1/3]

static poly p_LmInit ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 1335 of file p_polys.h.

1336{
1338 poly np;
1339 omTypeAllocBin(poly, np, r->PolyBin);
1340 p_SetRingOfLm(np, r);
1341 memcpy(np->exp, p->exp, r->ExpL_Size*sizeof(long));
1342 pNext(np) = NULL;
1343 pSetCoeff0(np, NULL);
1344 return np;
1345}

◆ p_LmInit() [2/3]

static poly p_LmInit ( poly  s_p,
const ring  s_r,
const ring  d_r 
)
inlinestatic

Definition at line 1363 of file p_polys.h.

1364{
1365 pAssume1(d_r != NULL);
1366 return p_LmInit(s_p, s_r, d_r, d_r->PolyBin);
1367}

◆ p_LmInit() [3/3]

static poly p_LmInit ( poly  s_p,
const ring  s_r,
const ring  d_r,
omBin  d_bin 
)
inlinestatic

Definition at line 1346 of file p_polys.h.

1347{
1350 pAssume1(d_r->N <= s_r->N);
1351 poly d_p = p_Init(d_r, d_bin);
1352 for (unsigned i=d_r->N; i!=0; i--)
1353 {
1354 p_SetExp(d_p, i, p_GetExp(s_p, i,s_r), d_r);
1355 }
1356 if (rRing_has_Comp(d_r))
1357 {
1359 }
1360 p_Setm(d_p, d_r);
1361 return d_p;
1362}

◆ p_LmIsConstant()

static BOOLEAN p_LmIsConstant ( const poly  p,
const ring  r 
)
inlinestatic

Definition at line 1023 of file p_polys.h.

1024{
1025 if (p_LmIsConstantComp(p, r))
1026 return (p_GetComp(p, r) == 0);
1027 return FALSE;
1028}

◆ p_LmIsConstantComp()

static BOOLEAN p_LmIsConstantComp ( const poly  p,
const ring  r 
)
inlinestatic

Definition at line 1006 of file p_polys.h.

1007{
1008 //p_LmCheckPolyRing(p, r);
1009 int i = r->VarL_Size - 1;
1010
1011 do
1012 {
1013 if (p->exp[r->VarL_Offset[i]] != 0)
1014 return FALSE;
1015 i--;
1016 }
1017 while (i >= 0);
1018 return TRUE;
1019}

◆ p_LmShallowCopyDelete()

static poly p_LmShallowCopyDelete ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 1393 of file p_polys.h.

1394{
1396 pAssume1(omSizeWOfBin(bin) == omSizeWOfBin(r->PolyBin));
1397 poly new_p = p_New(r);
1398 memcpy(new_p->exp, p->exp, r->ExpL_Size*sizeof(long));
1400 pNext(new_p) = pNext(p);
1402 return new_p;
1403}

◆ p_LmShortDivisibleBy()

static BOOLEAN p_LmShortDivisibleBy ( poly  a,
unsigned long  sev_a,
poly  b,
unsigned long  not_sev_b,
const ring  r 
)
inlinestatic

Definition at line 1910 of file p_polys.h.

1912{
1913 p_LmCheckPolyRing1(a, r);
1915#ifndef PDIV_DEBUG
1916 _pPolyAssume2(p_GetShortExpVector(a, r) == sev_a, a, r);
1918
1919 if (sev_a & not_sev_b)
1920 {
1922 return FALSE;
1923 }
1924 return p_LmDivisibleBy(a, b, r);
1925#else
1926 return pDebugLmShortDivisibleBy(a, sev_a, r, b, not_sev_b, r);
1927#endif
1928}

◆ p_LmShortDivisibleByNoComp()

static BOOLEAN p_LmShortDivisibleByNoComp ( poly  a,
unsigned long  sev_a,
poly  b,
unsigned long  not_sev_b,
const ring  r 
)
inlinestatic

Definition at line 1930 of file p_polys.h.

1932{
1933 p_LmCheckPolyRing1(a, r);
1935#ifndef PDIV_DEBUG
1936 _pPolyAssume2(p_GetShortExpVector(a, r) == sev_a, a, r);
1938
1939 if (sev_a & not_sev_b)
1940 {
1942 return FALSE;
1943 }
1944 return p_LmDivisibleByNoComp(a, b, r);
1945#else
1947#endif
1948}

◆ p_LowVar()

int p_LowVar ( poly  p,
const ring  r 
)

the minimal index of used variables - 1

Definition at line 4680 of file p_polys.cc.

4681{
4682 int k,l,lex;
4683
4684 if (p == NULL) return -1;
4685
4686 k = 32000;/*a very large dummy value*/
4687 while (p != NULL)
4688 {
4689 l = 1;
4690 lex = p_GetExp(p,l,r);
4691 while ((l < (rVar(r))) && (lex == 0))
4692 {
4693 l++;
4694 lex = p_GetExp(p,l,r);
4695 }
4696 l--;
4697 if (l < k) k = l;
4698 pIter(p);
4699 }
4700 return k;
4701}

◆ p_LtCmp()

static int p_LtCmp ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1621 of file p_polys.h.

1622{
1623 int res = p_LmCmp(p,q,r);
1624 if(res == 0)
1625 {
1626 if(p_GetCoeff(p,r) == NULL || p_GetCoeff(q,r) == NULL)
1627 return res;
1628 number pc = n_Copy(p_GetCoeff(p,r),r->cf);
1629 number qc = n_Copy(p_GetCoeff(q,r),r->cf);
1630 if(!n_GreaterZero(pc,r->cf))
1631 pc = n_InpNeg(pc,r->cf);
1632 if(!n_GreaterZero(qc,r->cf))
1633 qc = n_InpNeg(qc,r->cf);
1634 if(n_Greater(pc,qc,r->cf))
1635 res = 1;
1636 else if(n_Greater(qc,pc,r->cf))
1637 res = -1;
1638 else if(n_Equal(pc,qc,r->cf))
1639 res = 0;
1640 n_Delete(&pc,r->cf);
1641 n_Delete(&qc,r->cf);
1642 }
1643 return res;
1644}

◆ p_LtCmpNoAbs()

static int p_LtCmpNoAbs ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1647 of file p_polys.h.

1648{
1649 int res = p_LmCmp(p,q,r);
1650 if(res == 0)
1651 {
1652 if(p_GetCoeff(p,r) == NULL || p_GetCoeff(q,r) == NULL)
1653 return res;
1654 number pc = p_GetCoeff(p,r);
1655 number qc = p_GetCoeff(q,r);
1656 if(n_Greater(pc,qc,r->cf))
1657 res = 1;
1658 if(n_Greater(qc,pc,r->cf))
1659 res = -1;
1660 if(n_Equal(pc,qc,r->cf))
1661 res = 0;
1662 }
1663 return res;
1664}

◆ p_LtCmpOrdSgnDiffM()

static int p_LtCmpOrdSgnDiffM ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1669 of file p_polys.h.

1670{
1671 return(p_LtCmp(p,q,r) == r->OrdSgn);
1672}

◆ p_LtCmpOrdSgnDiffP()

static int p_LtCmpOrdSgnDiffP ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1678 of file p_polys.h.

1679{
1680 if(r->OrdSgn == 1)
1681 {
1682 return(p_LmCmp(p,q,r) == -1);
1683 }
1684 else
1685 {
1686 return(p_LtCmp(p,q,r) != -1);
1687 }
1688}

◆ p_LtCmpOrdSgnEqM()

static int p_LtCmpOrdSgnEqM ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1694 of file p_polys.h.

1695{
1696 return(p_LtCmp(p,q,r) == -r->OrdSgn);
1697}

◆ p_LtCmpOrdSgnEqP()

static int p_LtCmpOrdSgnEqP ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1703 of file p_polys.h.

1704{
1705 return(p_LtCmp(p,q,r) == r->OrdSgn);
1706}

◆ p_MaxComp() [1/2]

static long p_MaxComp ( poly  p,
ring  lmRing 
)
inlinestatic

Definition at line 311 of file p_polys.h.

311{return p_MaxComp(p,lmRing,lmRing);}
static long p_MaxComp(poly p, ring lmRing, ring tailRing)
Definition p_polys.h:292

◆ p_MaxComp() [2/2]

static long p_MaxComp ( poly  p,
ring  lmRing,
ring  tailRing 
)
inlinestatic

Definition at line 292 of file p_polys.h.

293{
294 long result,i;
295
296 if(p==NULL) return 0;
298 if (result != 0)
299 {
300 loop
301 {
302 pIter(p);
303 if(p==NULL) break;
304 i = p_GetComp(p, tailRing);
305 if (i>result) result = i;
306 }
307 }
308 return result;
309}

◆ p_MaxExpPerVar()

int p_MaxExpPerVar ( poly  p,
int  i,
const ring  r 
)

max exponent of variable x_i in p

Definition at line 4992 of file p_polys.cc.

4993{
4994 int m=0;
4995 while(p!=NULL)
4996 {
4997 int mm=p_GetExp(p,i,r);
4998 if (mm>m) m=mm;
4999 pIter(p);
5000 }
5001 return m;
5002}

◆ p_MDivide()

poly p_MDivide ( poly  a,
poly  b,
const ring  r 
)

Definition at line 1492 of file p_polys.cc.

1493{
1494 assume((p_GetComp(a,r)==p_GetComp(b,r)) || (p_GetComp(b,r)==0));
1495 int i;
1496 poly result = p_Init(r);
1497
1498 for(i=(int)r->N; i; i--)
1499 p_SetExp(result,i, p_GetExp(a,i,r)- p_GetExp(b,i,r),r);
1500 p_SetComp(result, p_GetComp(a,r) - p_GetComp(b,r),r);
1501 p_Setm(result,r);
1502 return result;
1503}

◆ p_MemAdd_NegWeightAdjust()

static void p_MemAdd_NegWeightAdjust ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 1292 of file p_polys.h.

1293{
1294 if (r->NegWeightL_Offset != NULL)
1295 {
1296 for (int i=r->NegWeightL_Size-1; i>=0; i--)
1297 {
1298 p->exp[r->NegWeightL_Offset[i]] -= POLY_NEGWEIGHT_OFFSET;
1299 }
1300 }
1301}

◆ p_MemSub_NegWeightAdjust()

static void p_MemSub_NegWeightAdjust ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 1302 of file p_polys.h.

1303{
1304 if (r->NegWeightL_Offset != NULL)
1305 {
1306 for (int i=r->NegWeightL_Size-1; i>=0; i--)
1307 {
1308 p->exp[r->NegWeightL_Offset[i]] += POLY_NEGWEIGHT_OFFSET;
1309 }
1310 }
1311}

◆ p_Merge_q()

static poly p_Merge_q ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1212 of file p_polys.h.

1213{
1214 assume( (p != q) || (p == NULL && q == NULL) );
1215 return r->p_Procs->p_Merge_q(p, q, r);
1216}

◆ p_MinComp() [1/2]

static long p_MinComp ( poly  p,
ring  lmRing 
)
inlinestatic

Definition at line 332 of file p_polys.h.

332{return p_MinComp(p,lmRing,lmRing);}
static long p_MinComp(poly p, ring lmRing, ring tailRing)
Definition p_polys.h:313

◆ p_MinComp() [2/2]

static long p_MinComp ( poly  p,
ring  lmRing,
ring  tailRing 
)
inlinestatic

Definition at line 313 of file p_polys.h.

314{
315 long result,i;
316
317 if(p==NULL) return 0;
319 if (result != 0)
320 {
321 loop
322 {
323 pIter(p);
324 if(p==NULL) break;
325 i = p_GetComp(p,tailRing);
326 if (i<result) result = i;
327 }
328 }
329 return result;
330}

◆ p_MinDeg()

int p_MinDeg ( poly  p,
intvec w,
const ring  R 
)

Definition at line 4448 of file p_polys.cc.

4449{
4450 if(p==NULL)
4451 return -1;
4452 int d=-1;
4453 while(p!=NULL)
4454 {
4455 int d0=0;
4456 for(int j=0;j<rVar(R);j++)
4457 if(w==NULL||j>=w->length())
4458 d0+=p_GetExp(p,j+1,R);
4459 else
4460 d0+=(*w)[j]*p_GetExp(p,j+1,R);
4461 if(d0<d||d==-1)
4462 d=d0;
4463 pIter(p);
4464 }
4465 return d;
4466}

◆ p_mInit()

poly p_mInit ( const char s,
BOOLEAN ok,
const ring  r 
)

Definition at line 1442 of file p_polys.cc.

1443{
1444 poly p;
1445 char *sst=(char*)st;
1446 BOOLEAN neg=FALSE;
1447 if (sst[0]=='-') { neg=TRUE; sst=sst+1; }
1448 const char *s=p_Read(sst,p,r);
1449 if (*s!='\0')
1450 {
1451 if ((s!=sst)&&isdigit(sst[0]))
1452 {
1454 }
1455 ok=FALSE;
1456 if (p!=NULL)
1457 {
1458 if (pGetCoeff(p)==NULL) p_LmFree(p,r);
1459 else p_LmDelete(p,r);
1460 }
1461 return NULL;
1462 }
1463 p_Test(p,r);
1464 ok=!errorreported;
1465 if (neg) p=p_Neg(p,r);
1466 return p;
1467}
VAR short errorreported
Definition feFopen.cc:23
const char * p_Read(const char *st, poly &rc, const ring r)
Definition p_polys.cc:1370

◆ p_Minus_mm_Mult_qq() [1/2]

static poly p_Minus_mm_Mult_qq ( poly  p,
const poly  m,
const poly  q,
const ring  r 
)
inlinestatic

Definition at line 1081 of file p_polys.h.

1082{
1083 int shorter;
1084
1085 return r->p_Procs->p_Minus_mm_Mult_qq(p, m, q, shorter, NULL, r);
1086}

◆ p_Minus_mm_Mult_qq() [2/2]

static poly p_Minus_mm_Mult_qq ( poly  p,
const poly  m,
const poly  q,
int lp,
int  lq,
const poly  spNoether,
const ring  r 
)
inlinestatic

Definition at line 1070 of file p_polys.h.

1072{
1073 int shorter;
1074 const poly res = r->p_Procs->p_Minus_mm_Mult_qq(p, m, q, shorter, spNoether, r);
1075 lp += lq - shorter;
1076// assume( lp == pLength(res) );
1077 return res;
1078}

◆ p_mm_Mult()

static poly p_mm_Mult ( poly  p,
poly  m,
const ring  r 
)
inlinestatic

Definition at line 1061 of file p_polys.h.

1062{
1063 if (p==NULL) return NULL;
1064 if (p_LmIsConstant(m, r))
1065 return __p_Mult_nn(p, pGetCoeff(m), r);
1066 else
1067 return r->p_Procs->p_mm_Mult(p, m, r);
1068}

◆ p_Mult_mm()

static poly p_Mult_mm ( poly  p,
poly  m,
const ring  r 
)
inlinestatic

Definition at line 1051 of file p_polys.h.

1052{
1053 if (p==NULL) return NULL;
1054 if (p_LmIsConstant(m, r))
1055 return __p_Mult_nn(p, pGetCoeff(m), r);
1056 else
1057 return r->p_Procs->p_Mult_mm(p, m, r);
1058}

◆ p_Mult_nn() [1/2]

static poly p_Mult_nn ( poly  p,
number  n,
const ring  lmRing,
const ring  tailRing 
)
inlinestatic

Definition at line 973 of file p_polys.h.

975{
976 assume(p!=NULL);
977#ifndef PDEBUG
978 if (lmRing == tailRing)
979 return p_Mult_nn(p, n, tailRing);
980#endif
981 poly pnext = pNext(p);
982 pNext(p) = NULL;
983 p = lmRing->p_Procs->p_Mult_nn(p, n, lmRing);
984 if (pnext!=NULL)
985 {
986 pNext(p) = tailRing->p_Procs->p_Mult_nn(pnext, n, tailRing);
987 }
988 return p;
989}
static poly p_Mult_nn(poly p, number n, const ring r)
Definition p_polys.h:958

◆ p_Mult_nn() [2/2]

static poly p_Mult_nn ( poly  p,
number  n,
const ring  r 
)
inlinestatic

Definition at line 958 of file p_polys.h.

959{
960 if (p==NULL) return NULL;
961 if (n_IsOne(n, r->cf))
962 return p;
963 else if (n_IsZero(n, r->cf))
964 {
965 p_Delete(&p, r); // NOTE: without p_Delete - memory leak!
966 return NULL;
967 }
968 else
969 return r->p_Procs->p_Mult_nn(p, n, r);
970}

◆ p_Mult_q()

static poly p_Mult_q ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1114 of file p_polys.h.

1115{
1116 assume( (p != q) || (p == NULL && q == NULL) );
1117
1118 if (p == NULL)
1119 {
1120 p_Delete(&q, r);
1121 return NULL;
1122 }
1123 if (q == NULL)
1124 {
1125 p_Delete(&p, r);
1126 return NULL;
1127 }
1128
1129 if (pNext(p) == NULL)
1130 {
1131 q = r->p_Procs->p_mm_Mult(q, p, r);
1132 p_LmDelete(&p, r);
1133 return q;
1134 }
1135
1136 if (pNext(q) == NULL)
1137 {
1138 p = r->p_Procs->p_Mult_mm(p, q, r);
1139 p_LmDelete(&q, r);
1140 return p;
1141 }
1142#if defined(HAVE_PLURAL) || defined(HAVE_SHIFTBBA)
1143 if (rIsNCRing(r))
1144 return _nc_p_Mult_q(p, q, r);
1145 else
1146#endif
1147 return _p_Mult_q(p, q, 0, r);
1148}
poly _nc_p_Mult_q(poly p, poly q, const ring r)
general NC-multiplication with destruction
Definition old.gring.cc:215
poly _p_Mult_q(poly p, poly q, const int copy, const ring r)
Returns: p * q, Destroys: if !copy then p, q Assumes: pLength(p) >= 2 pLength(q) >=2,...
Definition p_Mult_q.cc:313

◆ p_MultExp()

static long p_MultExp ( poly  p,
int  v,
long  ee,
ring  r 
)
inlinestatic

Definition at line 621 of file p_polys.h.

622{
624 long e = p_GetExp(p,v,r);
625 e *= ee;
626 return p_SetExp(p,v,e,r);
627}

◆ p_Neg()

static poly p_Neg ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 1107 of file p_polys.h.

1108{
1109 return r->p_Procs->p_Neg(p, r);
1110}

◆ p_New() [1/2]

static poly p_New ( const ring  ,
omBin  bin 
)
inlinestatic

Definition at line 664 of file p_polys.h.

666{
667 p_CheckRing2(r);
668 pAssume2(bin != NULL && omSizeWOfBin(r->PolyBin) == omSizeWOfBin(bin));
669 poly p;
670 omTypeAllocBin(poly, p, bin);
671 p_SetRingOfLm(p, r);
672 return p;
673}
#define p_CheckRing2(r)
Definition monomials.h:200

◆ p_New() [2/2]

static poly p_New ( ring  r)
inlinestatic

Definition at line 675 of file p_polys.h.

676{
677 return p_New(r, r->PolyBin);
678}

◆ p_Norm()

void p_Norm ( poly  p1,
const ring  r 
)

Definition at line 3719 of file p_polys.cc.

3720{
3721 if (LIKELY(rField_is_Ring(r)))
3722 {
3723 if(!n_GreaterZero(pGetCoeff(p1),r->cf)) p1 = p_Neg(p1,r);
3724 if (!n_IsUnit(pGetCoeff(p1), r->cf)) return;
3725 // Werror("p_Norm not possible in the case of coefficient rings.");
3726 }
3727 else if (LIKELY(p1!=NULL))
3728 {
3729 if (UNLIKELY(pNext(p1)==NULL))
3730 {
3731 p_SetCoeff(p1,n_Init(1,r->cf),r);
3732 return;
3733 }
3734 if (!n_IsOne(pGetCoeff(p1),r->cf))
3735 {
3736 number k = pGetCoeff(p1);
3737 pSetCoeff0(p1,n_Init(1,r->cf));
3738 poly h = pNext(p1);
3739 if (LIKELY(rField_is_Zp(r)))
3740 {
3741 if (r->cf->ch>32003)
3742 {
3743 number inv=n_Invers(k,r->cf);
3744 while (h!=NULL)
3745 {
3746 number c=n_Mult(pGetCoeff(h),inv,r->cf);
3747 // no need to normalize
3748 p_SetCoeff(h,c,r);
3749 pIter(h);
3750 }
3751 // no need for n_Delete for Zp: n_Delete(&inv,r->cf);
3752 }
3753 else
3754 {
3755 while (h!=NULL)
3756 {
3757 number c=n_Div(pGetCoeff(h),k,r->cf);
3758 // no need to normalize
3759 p_SetCoeff(h,c,r);
3760 pIter(h);
3761 }
3762 }
3763 }
3764 else if(getCoeffType(r->cf)==n_algExt)
3765 {
3766 n_Normalize(k,r->cf);
3767 number inv=n_Invers(k,r->cf);
3768 while (h!=NULL)
3769 {
3770 number c=n_Mult(pGetCoeff(h),inv,r->cf);
3771 // no need to normalize
3772 // normalize already in nMult: Zp_a, Q_a
3773 p_SetCoeff(h,c,r);
3774 pIter(h);
3775 }
3776 n_Delete(&inv,r->cf);
3777 n_Delete(&k,r->cf);
3778 }
3779 else
3780 {
3781 n_Normalize(k,r->cf);
3782 while (h!=NULL)
3783 {
3784 number c=n_Div(pGetCoeff(h),k,r->cf);
3785 // no need to normalize: Z/p, R
3786 // remains: Q
3787 if (rField_is_Q(r)) n_Normalize(c,r->cf);
3788 p_SetCoeff(h,c,r);
3789 pIter(h);
3790 }
3791 n_Delete(&k,r->cf);
3792 }
3793 }
3794 else
3795 {
3796 //if (r->cf->cfNormalize != nDummy2) //TODO: OPTIMIZE
3797 if (rField_is_Q(r))
3798 {
3799 poly h = pNext(p1);
3800 while (h!=NULL)
3801 {
3802 n_Normalize(pGetCoeff(h),r->cf);
3803 pIter(h);
3804 }
3805 }
3806 }
3807 }
3808}
#define UNLIKELY(X)
Definition auxiliary.h:404
#define LIKELY(X)
Definition auxiliary.h:403

◆ p_Normalize()

void p_Normalize ( poly  p,
const ring  r 
)

Definition at line 3813 of file p_polys.cc.

3814{
3815 const coeffs cf=r->cf;
3816 /* Z/p, GF(p,n), R, long R/C, Nemo rings */
3817 if (cf->cfNormalize==ndNormalize)
3818 return;
3819 while (p!=NULL)
3820 {
3821 // no test befor n_Normalize: n_Normalize should fix problems
3823 pIter(p);
3824 }
3825}
void ndNormalize(number &, const coeffs)
Definition numbers.cc:187

◆ p_NSet()

poly p_NSet ( number  n,
const ring  r 
)

returns the poly representing the number n, destroys n

Definition at line 1473 of file p_polys.cc.

1474{
1475 if (n_IsZero(n,r->cf))
1476 {
1477 n_Delete(&n, r->cf);
1478 return NULL;
1479 }
1480 else
1481 {
1482 poly rc = p_Init(r);
1483 pSetCoeff0(rc,n);
1484 return rc;
1485 }
1486}

◆ p_One()

poly p_One ( const ring  r)

Definition at line 1313 of file p_polys.cc.

1314{
1315 poly rc = p_Init(r);
1316 pSetCoeff0(rc,n_Init(1,r->cf));
1317 return rc;
1318}

◆ p_OneComp()

BOOLEAN p_OneComp ( poly  p,
const ring  r 
)

return TRUE if all monoms have the same component

Definition at line 1208 of file p_polys.cc.

1209{
1210 if(p!=NULL)
1211 {
1212 long i = p_GetComp(p, r);
1213 while (pNext(p)!=NULL)
1214 {
1215 pIter(p);
1216 if(i != p_GetComp(p, r)) return FALSE;
1217 }
1218 }
1219 return TRUE;
1220}

◆ p_PermPoly()

poly p_PermPoly ( poly  p,
const int perm,
const ring  OldRing,
const ring  dst,
nMapFunc  nMap,
const int par_perm = NULL,
int  OldPar = 0,
BOOLEAN  use_mult = FALSE 
)

Definition at line 4130 of file p_polys.cc.

4132{
4133#if 0
4134 p_Test(p, oldRing);
4135 PrintS("p_PermPoly::p: "); p_Write(p, oldRing, oldRing);
4136#endif
4137 const int OldpVariables = rVar(oldRing);
4138 poly result = NULL;
4139 poly result_last = NULL;
4140 poly aq = NULL; /* the map coefficient */
4141 poly qq; /* the mapped monomial */
4142 assume(dst != NULL);
4143 assume(dst->cf != NULL);
4144 #ifdef HAVE_PLURAL
4145 poly tmp_mm=p_One(dst);
4146 #endif
4147 while (p != NULL)
4148 {
4149 // map the coefficient
4150 if ( ((OldPar == 0) || (par_perm == NULL) || rField_is_GF(oldRing) || (nMap==ndCopyMap))
4151 && (nMap != NULL) )
4152 {
4153 qq = p_Init(dst);
4154 assume( nMap != NULL );
4155 number n = nMap(p_GetCoeff(p, oldRing), oldRing->cf, dst->cf);
4156 n_Test (n,dst->cf);
4157 if ( nCoeff_is_algExt(dst->cf) )
4158 n_Normalize(n, dst->cf);
4159 p_GetCoeff(qq, dst) = n;// Note: n can be a ZERO!!!
4160 }
4161 else
4162 {
4163 qq = p_One(dst);
4164// aq = naPermNumber(p_GetCoeff(p, oldRing), par_perm, OldPar, oldRing); // no dst???
4165// poly n_PermNumber(const number z, const int *par_perm, const int P, const ring src, const ring dst)
4167 p_Test(aq, dst);
4168 if ( nCoeff_is_algExt(dst->cf) )
4170 if (aq == NULL)
4171 p_SetCoeff(qq, n_Init(0, dst->cf),dst); // Very dirty trick!!!
4172 p_Test(aq, dst);
4173 }
4174 if (rRing_has_Comp(dst))
4176 if ( n_IsZero(pGetCoeff(qq), dst->cf) )
4177 {
4178 p_LmDelete(&qq,dst);
4179 qq = NULL;
4180 }
4181 else
4182 {
4183 // map pars:
4184 int mapped_to_par = 0;
4185 for(int i = 1; i <= OldpVariables; i++)
4186 {
4187 int e = p_GetExp(p, i, oldRing);
4188 if (e != 0)
4189 {
4190 if (perm==NULL)
4191 p_SetExp(qq, i, e, dst);
4192 else if (perm[i]>0)
4193 {
4194 #ifdef HAVE_PLURAL
4195 if(use_mult)
4196 {
4197 p_SetExp(tmp_mm,perm[i],e,dst);
4198 p_Setm(tmp_mm,dst);
4200 p_SetExp(tmp_mm,perm[i],0,dst);
4201
4202 }
4203 else
4204 #endif
4205 p_AddExp(qq,perm[i], e/*p_GetExp( p,i,oldRing)*/, dst);
4206 }
4207 else if (perm[i]<0)
4208 {
4209 number c = p_GetCoeff(qq, dst);
4210 if (rField_is_GF(dst))
4211 {
4212 assume( dst->cf->extRing == NULL );
4213 number ee = n_Param(1, dst);
4214 number eee;
4215 n_Power(ee, e, &eee, dst->cf); //nfDelete(ee,dst);
4216 ee = n_Mult(c, eee, dst->cf);
4217 //nfDelete(c,dst);nfDelete(eee,dst);
4218 pSetCoeff0(qq,ee);
4219 }
4220 else if (nCoeff_is_Extension(dst->cf))
4221 {
4222 const int par = -perm[i];
4223 assume( par > 0 );
4224// WarnS("longalg missing 3");
4225#if 1
4226 const coeffs C = dst->cf;
4227 assume( C != NULL );
4228 const ring R = C->extRing;
4229 assume( R != NULL );
4230 assume( par <= rVar(R) );
4231 poly pcn; // = (number)c
4232 assume( !n_IsZero(c, C) );
4233 if( nCoeff_is_algExt(C) )
4234 pcn = (poly) c;
4235 else // nCoeff_is_transExt(C)
4236 pcn = NUM((fraction)c);
4237 if (pNext(pcn) == NULL) // c->z
4238 p_AddExp(pcn, -perm[i], e, R);
4239 else /* more difficult: we have really to multiply: */
4240 {
4241 poly mmc = p_ISet(1, R);
4242 p_SetExp(mmc, -perm[i], e, R);
4243 p_Setm(mmc, R);
4244 number nnc;
4245 // convert back to a number: number nnc = mmc;
4246 if( nCoeff_is_algExt(C) )
4247 nnc = (number) mmc;
4248 else // nCoeff_is_transExt(C)
4249 nnc = ntInit(mmc, C);
4250 p_GetCoeff(qq, dst) = n_Mult((number)c, nnc, C);
4251 n_Delete((number *)&c, C);
4252 n_Delete((number *)&nnc, C);
4253 }
4254 mapped_to_par=1;
4255#endif
4256 }
4257 }
4258 else
4259 {
4260 /* this variable maps to 0 !*/
4261 p_LmDelete(&qq, dst);
4262 break;
4263 }
4264 }
4265 }
4266 if ( mapped_to_par && (qq!= NULL) && nCoeff_is_algExt(dst->cf) )
4267 {
4268 number n = p_GetCoeff(qq, dst);
4269 n_Normalize(n, dst->cf);
4270 p_GetCoeff(qq, dst) = n;
4271 }
4272 }
4273 pIter(p);
4274
4275#if 0
4276 p_Test(aq,dst);
4277 PrintS("aq: "); p_Write(aq, dst, dst);
4278#endif
4279
4280
4281#if 1
4282 if (qq!=NULL)
4283 {
4284 p_Setm(qq,dst);
4285
4286 p_Test(aq,dst);
4287 p_Test(qq,dst);
4288
4289#if 0
4290 PrintS("qq: "); p_Write(qq, dst, dst);
4291#endif
4292
4293 if (aq!=NULL)
4294 qq=p_Mult_q(aq,qq,dst);
4295 aq = qq;
4296 while (pNext(aq) != NULL) pIter(aq);
4297 if (result_last==NULL)
4298 {
4299 result=qq;
4300 }
4301 else
4302 {
4304 }
4306 aq = NULL;
4307 }
4308 else if (aq!=NULL)
4309 {
4310 p_Delete(&aq,dst);
4311 }
4312 }
4314#else
4315 // if (qq!=NULL)
4316 // {
4317 // pSetm(qq);
4318 // pTest(qq);
4319 // pTest(aq);
4320 // if (aq!=NULL) qq=pMult(aq,qq);
4321 // aq = qq;
4322 // while (pNext(aq) != NULL) pIter(aq);
4323 // pNext(aq) = result;
4324 // aq = NULL;
4325 // result = qq;
4326 // }
4327 // else if (aq!=NULL)
4328 // {
4329 // pDelete(&aq);
4330 // }
4331 //}
4332 //p = result;
4333 //result = NULL;
4334 //while (p != NULL)
4335 //{
4336 // qq = p;
4337 // pIter(p);
4338 // qq->next = NULL;
4339 // result = pAdd(result, qq);
4340 //}
4341#endif
4342 p_Test(result,dst);
4343#if 0
4344 p_Test(result,dst);
4345 PrintS("result: "); p_Write(result,dst,dst);
4346#endif
4347 #ifdef HAVE_PLURAL
4349 #endif
4350 return result;
4351}
static FORCE_INLINE number n_Param(const int iParameter, const coeffs r)
return the (iParameter^th) parameter as a NEW number NOTE: parameter numbering: 1....
Definition coeffs.h:780
static FORCE_INLINE BOOLEAN nCoeff_is_Extension(const coeffs r)
Definition coeffs.h:843
number ndCopyMap(number a, const coeffs src, const coeffs dst)
Definition numbers.cc:291
static FORCE_INLINE void n_Power(number a, int b, number *res, const coeffs r)
fill res with the power a^b
Definition coeffs.h:629
poly n_PermNumber(const number z, const int *par_perm, const int, const ring src, const ring dst)
Definition p_polys.cc:4027
poly p_ISet(long i, const ring r)
returns the poly representing the integer i
Definition p_polys.cc:1297
poly p_One(const ring r)
Definition p_polys.cc:1313
void p_Write(poly p, ring lmRing, ring tailRing)
Definition polys0.cc:342
static poly p_Mult_mm(poly p, poly m, const ring r)
Definition p_polys.h:1051
static poly p_SortAdd(poly p, const ring r, BOOLEAN revert=FALSE)
Definition p_polys.h:1219
static BOOLEAN rField_is_GF(const ring r)
Definition ring.h:526
number ntInit(long i, const coeffs cf)
Definition transext.cc:704

◆ p_Plus_mm_Mult_qq() [1/2]

static poly p_Plus_mm_Mult_qq ( poly  p,
poly  m,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1205 of file p_polys.h.

1206{
1207 int lp = 0, lq = 0;
1208 return p_Plus_mm_Mult_qq(p, m, q, lp, lq, r);
1209}
static poly p_Plus_mm_Mult_qq(poly p, poly m, poly q, int &lp, int lq, const ring r)
Definition p_polys.h:1183

◆ p_Plus_mm_Mult_qq() [2/2]

static poly p_Plus_mm_Mult_qq ( poly  p,
poly  m,
poly  q,
int lp,
int  lq,
const ring  r 
)
inlinestatic

Definition at line 1183 of file p_polys.h.

1185{
1186#ifdef HAVE_PLURAL
1187 if (rIsPluralRing(r))
1188 return nc_p_Plus_mm_Mult_qq(p, m, q, lp, lq, r);
1189#endif
1190
1191// this should be implemented more efficiently
1192 poly res;
1193 int shorter;
1195 number n_neg = n_Copy(n_old, r->cf);
1196 n_neg = n_InpNeg(n_neg, r->cf);
1197 pSetCoeff0(m, n_neg);
1198 res = r->p_Procs->p_Minus_mm_Mult_qq(p, m, q, shorter, NULL, r);
1199 lp = (lp + lq) - shorter;
1200 pSetCoeff0(m, n_old);
1201 n_Delete(&n_neg, r->cf);
1202 return res;
1203}
poly nc_p_Plus_mm_Mult_qq(poly p, const poly m, const poly q, int &lp, const int, const ring r)
Definition old.gring.cc:168
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
Definition ring.h:405

◆ p_PolyDiv()

poly p_PolyDiv ( poly &  p,
const poly  divisor,
const BOOLEAN  needResult,
const ring  r 
)

assumes that p and divisor are univariate polynomials in r, mentioning the same variable; assumes divisor != NULL; p may be NULL; assumes a global monomial ordering in r; performs polynomial division of p by divisor:

  • afterwards p contains the remainder of the division, i.e., p_before = result * divisor + p_afterwards;
  • if needResult == TRUE, then the method computes and returns 'result', otherwise NULL is returned (This parametrization can be used when one is only interested in the remainder of the division. In this case, the method will be slightly faster.) leaves divisor unmodified

Definition at line 1870 of file p_polys.cc.

1871{
1872 assume(divisor != NULL);
1873 if (p == NULL) return NULL;
1874
1875 poly result = NULL;
1876 number divisorLC = p_GetCoeff(divisor, r);
1877 int divisorLE = p_GetExp(divisor, 1, r);
1878 while ((p != NULL) && (p_Deg(p, r) >= p_Deg(divisor, r)))
1879 {
1880 /* determine t = LT(p) / LT(divisor) */
1881 poly t = p_ISet(1, r);
1882 number c = n_Div(p_GetCoeff(p, r), divisorLC, r->cf);
1883 n_Normalize(c,r->cf);
1884 p_SetCoeff(t, c, r);
1885 int e = p_GetExp(p, 1, r) - divisorLE;
1886 p_SetExp(t, 1, e, r);
1887 p_Setm(t, r);
1888 if (needResult) result = p_Add_q(result, p_Copy(t, r), r);
1889 p = p_Add_q(p, p_Neg(p_Mult_q(t, p_Copy(divisor, r), r), r), r);
1890 }
1891 return result;
1892}
long p_Deg(poly a, const ring r)
Definition p_polys.cc:587

◆ p_Power()

poly p_Power ( poly  p,
int  i,
const ring  r 
)

Definition at line 2197 of file p_polys.cc.

2198{
2199 poly rc=NULL;
2200
2201 if (i==0)
2202 {
2203 p_Delete(&p,r);
2204 return p_One(r);
2205 }
2206
2207 if(p!=NULL)
2208 {
2209 if ( (i > 0) && ((unsigned long ) i > (r->bitmask))
2211 && (!rIsLPRing(r))
2212 #endif
2213 )
2214 {
2215 Werror("exponent %d is too large, max. is %ld",i,r->bitmask);
2216 return NULL;
2217 }
2218 switch (i)
2219 {
2220// cannot happen, see above
2221// case 0:
2222// {
2223// rc=pOne();
2224// pDelete(&p);
2225// break;
2226// }
2227 case 1:
2228 rc=p;
2229 break;
2230 case 2:
2231 rc=p_Mult_q(p_Copy(p,r),p,r);
2232 break;
2233 default:
2234 if (i < 0)
2235 {
2236 p_Delete(&p,r);
2237 return NULL;
2238 }
2239 else
2240 {
2241#ifdef HAVE_PLURAL
2242 if (rIsNCRing(r)) /* in the NC case nothing helps :-( */
2243 {
2244 int j=i;
2245 rc = p_Copy(p,r);
2246 while (j>1)
2247 {
2248 rc = p_Mult_q(p_Copy(p,r),rc,r);
2249 j--;
2250 }
2251 p_Delete(&p,r);
2252 return rc;
2253 }
2254#endif
2255 rc = pNext(p);
2256 if (rc == NULL)
2257 return p_MonPower(p,i,r);
2258 /* else: binom ?*/
2259 int char_p=rInternalChar(r);
2260 if ((char_p>0) && (i>char_p)
2261 && ((rField_is_Zp(r,char_p)
2262 || (rField_is_Zp_a(r,char_p)))))
2263 {
2264 poly h=p_Pow_charp(p_Copy(p,r),char_p,r);
2265 int rest=i-char_p;
2266 while (rest>=char_p)
2267 {
2268 rest-=char_p;
2270 }
2271 poly res=h;
2272 if (rest>0)
2273 res=p_Mult_q(p_Power(p_Copy(p,r),rest,r),h,r);
2274 p_Delete(&p,r);
2275 return res;
2276 }
2277 if ((pNext(rc) != NULL)
2278 || rField_is_Ring(r)
2279 )
2280 return p_Pow(p,i,r);
2281 if ((char_p==0) || (i<=char_p))
2282 return p_TwoMonPower(p,i,r);
2283 return p_Pow(p,i,r);
2284 }
2285 /*end default:*/
2286 }
2287 }
2288 return rc;
2289}
poly p_Power(poly p, int i, const ring r)
Definition p_polys.cc:2197
static poly p_TwoMonPower(poly p, int exp, const ring r)
Definition p_polys.cc:2106
static poly p_Pow_charp(poly p, int i, const ring r)
Definition p_polys.cc:2185
static poly p_MonPower(poly p, int exp, const ring r)
Definition p_polys.cc:2000
static poly p_Pow(poly p, int i, const ring r)
Definition p_polys.cc:2171
void Werror(const char *fmt,...)
Definition reporter.cc:189
static int rInternalChar(const ring r)
Definition ring.h:694
static BOOLEAN rIsLPRing(const ring r)
Definition ring.h:416

◆ p_ProjectiveUnique()

void p_ProjectiveUnique ( poly  p,
const ring  r 
)

Definition at line 3143 of file p_polys.cc.

3144{
3145 if( ph == NULL )
3146 return;
3147
3148 const coeffs C = r->cf;
3149
3150 number h;
3151 poly p;
3152
3153 if (nCoeff_is_Ring(C))
3154 {
3155 p_ContentForGB(ph,r);
3156 if(!n_GreaterZero(pGetCoeff(ph),C)) ph = p_Neg(ph,r);
3158 return;
3159 }
3160
3162 {
3163 if(!n_GreaterZero(pGetCoeff(ph),C)) ph = p_Neg(ph,r);
3164 return;
3165 }
3166 p = ph;
3167
3168 assume(p != NULL);
3169
3170 if(pNext(p)==NULL) // a monomial
3171 {
3172 p_SetCoeff(p, n_Init(1, C), r);
3173 return;
3174 }
3175
3176 assume(pNext(p)!=NULL);
3177
3178 if(!nCoeff_is_Q(C) && !nCoeff_is_transExt(C))
3179 {
3180 h = p_GetCoeff(p, C);
3181 number hInv = n_Invers(h, C);
3182 pIter(p);
3183 while (p!=NULL)
3184 {
3185 p_SetCoeff(p, n_Mult(p_GetCoeff(p, C), hInv, C), r);
3186 pIter(p);
3187 }
3188 n_Delete(&hInv, C);
3189 p = ph;
3190 p_SetCoeff(p, n_Init(1, C), r);
3191 }
3192
3193 p_Cleardenom(ph, r); //removes also Content
3194
3195
3196 /* normalize ph over a transcendental extension s.t.
3197 lead (ph) is > 0 if extRing->cf == Q
3198 or lead (ph) is monic if extRing->cf == Zp*/
3199 if (nCoeff_is_transExt(C))
3200 {
3201 p= ph;
3202 h= p_GetCoeff (p, C);
3203 fraction f = (fraction) h;
3204 number n=p_GetCoeff (NUM (f),C->extRing->cf);
3205 if (rField_is_Q (C->extRing))
3206 {
3207 if (!n_GreaterZero(n,C->extRing->cf))
3208 {
3209 p=p_Neg (p,r);
3210 }
3211 }
3212 else if (rField_is_Zp(C->extRing))
3213 {
3214 if (!n_IsOne (n, C->extRing->cf))
3215 {
3216 n=n_Invers (n,C->extRing->cf);
3217 nMapFunc nMap;
3218 nMap= n_SetMap (C->extRing->cf, C);
3219 number ninv= nMap (n,C->extRing->cf, C);
3220 p=__p_Mult_nn (p, ninv, r);
3221 n_Delete (&ninv, C);
3222 n_Delete (&n, C->extRing->cf);
3223 }
3224 }
3225 p= ph;
3226 }
3227
3228 return;
3229}
static FORCE_INLINE BOOLEAN nCoeff_is_Ring(const coeffs r)
Definition coeffs.h:727
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition coeffs.h:797
poly p_Cleardenom(poly p, const ring r)
Definition p_polys.cc:2845

◆ p_Read()

const char * p_Read ( const char s,
poly &  p,
const ring  r 
)

Definition at line 1370 of file p_polys.cc.

1371{
1372 if (r==NULL) { rc=NULL;return st;}
1373 int i,j;
1374 rc = p_Init(r);
1375 const char *s = n_Read(st,&(p_GetCoeff(rc, r)),r->cf);
1376 if (s==st)
1377 /* i.e. it does not start with a coeff: test if it is a ringvar*/
1378 {
1379 j = r_IsRingVar(s,r->names,r->N);
1380 if (j >= 0)
1381 {
1382 p_IncrExp(rc,1+j,r);
1383 while (*s!='\0') s++;
1384 goto done;
1385 }
1386 }
1387 while (*s!='\0')
1388 {
1389 char ss[2];
1390 ss[0] = *s++;
1391 ss[1] = '\0';
1392 j = r_IsRingVar(ss,r->names,r->N);
1393 if (j >= 0)
1394 {
1395 const char *s_save=s;
1396 s = eati(s,&i);
1397 if (((unsigned long)i) > r->bitmask/2)
1398 {
1399 // exponent to large: it is not a monomial
1400 p_LmDelete(&rc,r);
1401 return s_save;
1402 }
1403 p_AddExp(rc,1+j, (long)i, r);
1404 }
1405 else
1406 {
1407 // 1st char of is not a varname
1408 // We return the parsed polynomial nevertheless. This is needed when
1409 // we are parsing coefficients in a rational function field.
1410 s--;
1411 break;
1412 }
1413 }
1414done:
1415 if (n_IsZero(pGetCoeff(rc),r->cf)) p_LmDelete(&rc,r);
1416 else
1417 {
1418#ifdef HAVE_PLURAL
1419 // in super-commutative ring
1420 // squares of anti-commutative variables are zeroes!
1421 if(rIsSCA(r))
1422 {
1423 const unsigned int iFirstAltVar = scaFirstAltVar(r);
1424 const unsigned int iLastAltVar = scaLastAltVar(r);
1425
1426 assume(rc != NULL);
1427
1428 for(unsigned int k = iFirstAltVar; k <= iLastAltVar; k++)
1429 if( p_GetExp(rc, k, r) > 1 )
1430 {
1431 p_LmDelete(&rc, r);
1432 goto finish;
1433 }
1434 }
1435#endif
1436
1437 p_Setm(rc,r);
1438 }
1439finish:
1440 return s;
1441}
static FORCE_INLINE const char * n_Read(const char *s, number *a, const coeffs r)
!!! Recommendation: This method is too cryptic to be part of the user- !!! interface....
Definition coeffs.h:595
const char * eati(const char *s, int *i)
Definition reporter.cc:373
static bool rIsSCA(const ring r)
Definition nc.h:190
static long p_IncrExp(poly p, int v, ring r)
Definition p_polys.h:591
int r_IsRingVar(const char *n, char **names, int N)
Definition ring.cc:213
static short scaLastAltVar(ring r)
Definition sca.h:25
static short scaFirstAltVar(ring r)
Definition sca.h:18

◆ p_Series()

poly p_Series ( int  n,
poly  p,
poly  u,
intvec w,
const ring  R 
)

Definition at line 4498 of file p_polys.cc.

4499{
4500 int *ww=iv2array(w,R);
4501 if(p!=NULL)
4502 {
4503 if(u==NULL)
4504 p=p_JetW(p,n,ww,R);
4505 else
4506 p=p_JetW(p_Mult_q(p,p_Invers(n-p_MinDeg(p,w,R),u,w,R),R),n,ww,R);
4507 }
4508 omFreeSize((ADDRESS)ww,(rVar(R)+1)*sizeof(int));
4509 return p;
4510}
static poly p_Invers(int n, poly u, intvec *w, const ring R)
Definition p_polys.cc:4469
int p_MinDeg(poly p, intvec *w, const ring R)
Definition p_polys.cc:4448
poly p_JetW(poly p, int m, int *w, const ring R)
Definition p_polys.cc:4430
int * iv2array(intvec *iv, const ring R)
Definition weight.cc:200

◆ p_SetCoeff()

static number p_SetCoeff ( poly  p,
number  n,
ring  r 
)
inlinestatic

Definition at line 412 of file p_polys.h.

413{
415 n_Delete(&(p->coef), r->cf);
416 (p)->coef=n;
417 return n;
418}

◆ p_SetComp()

static unsigned long p_SetComp ( poly  p,
unsigned long  c,
ring  r 
)
inlinestatic

Definition at line 247 of file p_polys.h.

248{
250 if (r->pCompIndex>=0) __p_GetComp(p,r) = c;
251 return c;
252}

◆ p_SetCompP() [1/2]

static void p_SetCompP ( poly  p,
int  i,
ring  lmRing,
ring  tailRing 
)
inlinestatic

Definition at line 281 of file p_polys.h.

282{
283 if (p != NULL)
284 {
285 p_SetComp(p, i, lmRing);
287 p_SetCompP(pNext(p), i, tailRing);
288 }
289}

◆ p_SetCompP() [2/2]

static void p_SetCompP ( poly  p,
int  i,
ring  r 
)
inlinestatic

Definition at line 254 of file p_polys.h.

255{
256 if (p != NULL)
257 {
258 p_Test(p, r);
260 {
261 do
262 {
263 p_SetComp(p, i, r);
264 p_SetmComp(p, r);
265 pIter(p);
266 }
267 while (p != NULL);
268 }
269 else
270 {
271 do
272 {
273 p_SetComp(p, i, r);
274 pIter(p);
275 }
276 while(p != NULL);
277 }
278 }
279}
BOOLEAN rOrd_SetCompRequiresSetm(const ring r)
return TRUE if p_SetComp requires p_Setm
Definition ring.cc:1994

◆ p_SetExp() [1/3]

static long p_SetExp ( poly  p,
const int  v,
const long  e,
const ring  r 
)
inlinestatic

set v^th exponent for a monomial

Definition at line 582 of file p_polys.h.

583{
585 pAssume2(v>0 && v <= r->N);
586 pAssume2(r->VarOffset[v] != -1);
587 return p_SetExp(p, e, r->bitmask, r->VarOffset[v]);
588}

◆ p_SetExp() [2/3]

static long p_SetExp ( poly  p,
const long  e,
const ring  r,
const int  VarOffset 
)
inlinestatic

Definition at line 562 of file p_polys.h.

563{
565 pAssume2(VarOffset != -1);
566 return p_SetExp(p, e, r->bitmask, VarOffset);
567}

◆ p_SetExp() [3/3]

static unsigned long p_SetExp ( poly  p,
const unsigned long  e,
const unsigned long  iBitmask,
const int  VarOffset 
)
inlinestatic

set a single variable exponent @Note: VarOffset encodes the position in p->exp

See also
p_GetExp

Definition at line 488 of file p_polys.h.

489{
490 pAssume2(e>=0);
491 pAssume2(e<=iBitmask);
492 pAssume2((VarOffset >> (24 + 6)) == 0);
493
494 // shift e to the left:
495 REGISTER int shift = VarOffset >> 24;
496 unsigned long ee = e << shift /*(VarOffset >> 24)*/;
497 // find the bits in the exponent vector
498 REGISTER int offset = (VarOffset & 0xffffff);
499 // clear the bits in the exponent vector:
500 p->exp[offset] &= ~( iBitmask << shift );
501 // insert e with |
502 p->exp[ offset ] |= ee;
503 return e;
504}

◆ p_SetExpV()

static void p_SetExpV ( poly  p,
int ev,
const ring  r 
)
inlinestatic

Definition at line 1544 of file p_polys.h.

1545{
1547 for (unsigned j = r->N; j!=0; j--)
1548 p_SetExp(p, j, ev[j], r);
1549
1550 if(ev[0]!=0) p_SetComp(p, ev[0],r);
1551 p_Setm(p, r);
1552}

◆ p_SetExpVL()

static void p_SetExpVL ( poly  p,
int64 ev,
const ring  r 
)
inlinestatic

Definition at line 1553 of file p_polys.h.

1554{
1556 for (unsigned j = r->N; j!=0; j--)
1557 p_SetExp(p, j, ev[j-1], r);
1558 p_SetComp(p, 0,r);
1559
1560 p_Setm(p, r);
1561}

◆ p_SetExpVLV()

static void p_SetExpVLV ( poly  p,
int64 ev,
int64  comp,
const ring  r 
)
inlinestatic

Definition at line 1564 of file p_polys.h.

1565{
1567 for (unsigned j = r->N; j!=0; j--)
1568 p_SetExp(p, j, ev[j-1], r);
1569 p_SetComp(p, comp,r);
1570
1571 p_Setm(p, r);
1572}

◆ p_Setm()

static void p_Setm ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 233 of file p_polys.h.

234{
235 p_CheckRing2(r);
236 r->p_Setm(p, r);
237}

◆ p_SetModDeg()

void p_SetModDeg ( intvec w,
ring  r 
)

Definition at line 3673 of file p_polys.cc.

3674{
3675 if (w!=NULL)
3676 {
3677 r->pModW = w;
3678 pOldFDeg = r->pFDeg;
3679 pOldLDeg = r->pLDeg;
3680 pOldLexOrder = r->pLexOrder;
3682 r->pLexOrder = TRUE;
3683 }
3684 else
3685 {
3686 r->pModW = NULL;
3688 r->pLexOrder = pOldLexOrder;
3689 }
3690}
STATIC_VAR pLDegProc pOldLDeg
Definition p_polys.cc:3661
void pRestoreDegProcs(ring r, pFDegProc old_FDeg, pLDegProc old_lDeg)
Definition p_polys.cc:3649
STATIC_VAR BOOLEAN pOldLexOrder
Definition p_polys.cc:3662
STATIC_VAR pFDegProc pOldFDeg
Definition p_polys.cc:3660
void pSetDegProcs(ring r, pFDegProc new_FDeg, pLDegProc new_lDeg)
Definition p_polys.cc:3637
static long pModDeg(poly p, ring r)
Definition p_polys.cc:3664

◆ p_ShallowCopyDelete()

static poly p_ShallowCopyDelete ( poly  p,
const ring  r,
omBin  bin 
)
inlinestatic

Definition at line 928 of file p_polys.h.

929{
931 pAssume2(omSizeWOfBin(r->PolyBin) == omSizeWOfBin(bin));
932 return r->p_Procs->p_ShallowCopyDelete(p, r, bin);
933}

◆ p_ShallowDelete()

void p_ShallowDelete ( poly *  p,
const ring  r 
)

◆ p_Shift()

void p_Shift ( poly *  p,
int  i,
const ring  r 
)

shifts components of the vector p by i

Definition at line 4706 of file p_polys.cc.

4707{
4708 poly qp1 = *p,qp2 = *p;/*working pointers*/
4709 int j = p_MaxComp(*p,r),k = p_MinComp(*p,r);
4710
4711 if (j+i < 0) return ;
4712 BOOLEAN toPoly= ((j == -i) && (j == k));
4713 while (qp1 != NULL)
4714 {
4715 if (toPoly || (__p_GetComp(qp1,r)+i > 0))
4716 {
4717 p_AddComp(qp1,i,r);
4718 p_SetmComp(qp1,r);
4719 qp2 = qp1;
4720 pIter(qp1);
4721 }
4722 else
4723 {
4724 if (qp2 == *p)
4725 {
4726 pIter(*p);
4727 p_LmDelete(&qp2,r);
4728 qp2 = *p;
4729 qp1 = *p;
4730 }
4731 else
4732 {
4733 qp2->next = qp1->next;
4734 if (qp1!=NULL) p_LmDelete(&qp1,r);
4735 qp1 = qp2->next;
4736 }
4737 }
4738 }
4739}
return
static unsigned long p_AddComp(poly p, unsigned long v, ring r)
Definition p_polys.h:447

◆ p_SimpleContent()

void p_SimpleContent ( poly  p,
int  s,
const ring  r 
)

Definition at line 2564 of file p_polys.cc.

2565{
2566 if(TEST_OPT_CONTENTSB) return;
2567 if (ph==NULL) return;
2568 if (pNext(ph)==NULL)
2569 {
2570 p_SetCoeff(ph,n_Init(1,r->cf),r);
2571 return;
2572 }
2573 if (pNext(pNext(ph))==NULL)
2574 {
2575 return;
2576 }
2577 if (!(rField_is_Q(r))
2578 && (!rField_is_Q_a(r))
2579 && (!rField_is_Zp_a(r))
2580 && (!rField_is_Z(r))
2581 )
2582 {
2583 return;
2584 }
2585 number d=p_InitContent(ph,r);
2586 number h=d;
2587 if (n_Size(d,r->cf)<=smax)
2588 {
2589 n_Delete(&h,r->cf);
2590 //if (TEST_OPT_PROT) PrintS("G");
2591 return;
2592 }
2593
2594 poly p=ph;
2595 if (smax==1) smax=2;
2596 while (p!=NULL)
2597 {
2598#if 1
2599 d=n_SubringGcd(h,pGetCoeff(p),r->cf);
2600 n_Delete(&h,r->cf);
2601 h = d;
2602#else
2603 n_InpGcd(h,pGetCoeff(p),r->cf);
2604#endif
2605 if(n_Size(h,r->cf)<smax)
2606 {
2607 //if (TEST_OPT_PROT) PrintS("g");
2608 n_Delete(&h,r->cf);
2609 return;
2610 }
2611 pIter(p);
2612 }
2613 p = ph;
2614 if (!n_GreaterZero(pGetCoeff(p),r->cf)) h=n_InpNeg(h,r->cf);
2615 if(n_IsOne(h,r->cf))
2616 {
2617 n_Delete(&h,r->cf);
2618 return;
2619 }
2620 if (TEST_OPT_PROT) PrintS("c");
2621 while (p!=NULL)
2622 {
2623#if 1
2624 d = n_ExactDiv(pGetCoeff(p),h,r->cf);
2625 p_SetCoeff(p,d,r);
2626#else
2627 STATISTIC(n_ExactDiv); nlInpExactDiv(pGetCoeff(p),h,r->cf); // no such function... ?
2628#endif
2629 pIter(p);
2630 }
2631 n_Delete(&h,r->cf);
2632}
#define TEST_OPT_PROT
Definition options.h:103

◆ p_Size()

int p_Size ( poly  p,
const ring  r 
)

Definition at line 3253 of file p_polys.cc.

3254{
3255 int count = 0;
3256 if (r->cf->has_simple_Alloc)
3257 return pLength(p);
3258 while ( p != NULL )
3259 {
3260 count+= n_Size( pGetCoeff( p ), r->cf );
3261 pIter( p );
3262 }
3263 return count;
3264}
int status int void size_t count
Definition si_signals.h:59

◆ p_SortAdd()

static poly p_SortAdd ( poly  p,
const ring  r,
BOOLEAN  revert = FALSE 
)
inlinestatic

Definition at line 1219 of file p_polys.h.

1220{
1221 if (revert) p = pReverse(p);
1222 return sBucketSortAdd(p, r);
1223}
poly sBucketSortAdd(poly p, const ring r)
Sorts p with bucketSort: p may have equal monomials.
Definition sbuckets.cc:368

◆ p_SortMerge()

static poly p_SortMerge ( poly  p,
const ring  r,
BOOLEAN  revert = FALSE 
)
inlinestatic

Definition at line 1229 of file p_polys.h.

1230{
1231 if (revert) p = pReverse(p);
1232 return sBucketSortMerge(p, r);
1233}
poly sBucketSortMerge(poly p, const ring r)
Sorts p with bucketSort: assumes all monomials of p are different.
Definition sbuckets.cc:332

◆ p_Split()

void p_Split ( poly  p,
poly *  r 
)

Definition at line 1320 of file p_polys.cc.

1321{
1322 *h=pNext(p);
1323 pNext(p)=NULL;
1324}

◆ p_String() [1/2]

char * p_String ( poly  p,
ring  lmRing,
ring  tailRing 
)

Definition at line 322 of file polys0.cc.

323{
324 StringSetS("");
325 p_String0(p, lmRing, tailRing);
326 return StringEndS();
327}
void p_String0(poly p, ring lmRing, ring tailRing)
print p according to ShortOut in lmRing & tailRing
Definition polys0.cc:223
void StringSetS(const char *st)
Definition reporter.cc:128
char * StringEndS()
Definition reporter.cc:151

◆ p_String() [2/2]

static char * p_String ( poly  p,
ring  p_ring 
)
inlinestatic

Definition at line 1240 of file p_polys.h.

1241{
1242 return p_String(p, p_ring, p_ring);
1243}
char * p_String(poly p, ring lmRing, ring tailRing)
Definition polys0.cc:322

◆ p_String0() [1/2]

void p_String0 ( poly  p,
ring  lmRing,
ring  tailRing 
)

print p according to ShortOut in lmRing & tailRing

Definition at line 223 of file polys0.cc.

224{
225 if (p == NULL)
226 {
227 StringAppendS("0");
228 return;
229 }
231 if ((n_GetChar(lmRing->cf) == 0)
232 && (nCoeff_is_transExt(lmRing->cf)))
233 p_Normalize(p,lmRing); /* Manual/absfact.tst */
234#ifdef HAVE_SHIFTBBA
235 if(lmRing->isLPring)
236 {
237 if ((p_GetComp(p, lmRing) == 0) || (!lmRing->VectorOut))
238 {
239 writemonLP(p,0, lmRing);
240 p = pNext(p);
241 while (p!=NULL)
242 {
243 assume((p->coef==NULL)||(!n_IsZero(p->coef,tailRing->cf)));
244 if ((p->coef==NULL)||n_GreaterZero(p->coef,tailRing->cf))
245 StringAppendS("+");
246 writemonLP(p,0, tailRing);
247 p = pNext(p);
248 }
249 return;
250 }
251 }
252 else
253#endif
254 {
255 if ((p_GetComp(p, lmRing) == 0) || (!lmRing->VectorOut))
256 {
257 writemon(p,0, lmRing);
258 p = pNext(p);
259 while (p!=NULL)
260 {
261 assume((p->coef==NULL)||(!n_IsZero(p->coef,tailRing->cf)));
262 if ((p->coef==NULL)||n_GreaterZero(p->coef,tailRing->cf))
263 StringAppendS("+");
264 writemon(p,0, tailRing);
265 p = pNext(p);
266 }
267 return;
268 }
269 }
270
271 long k = 1;
272 StringAppendS("[");
273#ifdef HAVE_SHIFTBBA
274 if(lmRing->isLPring)
275 {
276 loop
277 {
278 while (k < p_GetComp(p,lmRing))
279 {
280 StringAppendS("0,");
281 k++;
282 }
284 pIter(p);
285 while ((p!=NULL) && (k == p_GetComp(p, tailRing)))
286 {
287 if (n_GreaterZero(p->coef,tailRing->cf)) StringAppendS("+");
288 writemonLP(p,k,tailRing);
289 pIter(p);
290 }
291 if (p == NULL) break;
292 StringAppendS(",");
293 k++;
294 }
295 }
296 else
297#endif
298 {
299 loop
300 {
301 while (k < p_GetComp(p,lmRing))
302 {
303 StringAppendS("0,");
304 k++;
305 }
307 pIter(p);
308 while ((p!=NULL) && (k == p_GetComp(p, tailRing)))
309 {
310 if (n_GreaterZero(p->coef,tailRing->cf)) StringAppendS("+");
311 writemon(p,k,tailRing);
312 pIter(p);
313 }
314 if (p == NULL) break;
315 StringAppendS(",");
316 k++;
317 }
318 }
319 StringAppendS("]");
320}
static void writemon(poly p, int ko, const ring r)
Definition polys0.cc:24
static void writemonLP(poly p, int ko, const ring r)
Definition polys0.cc:104
void StringAppendS(const char *st)
Definition reporter.cc:107

◆ p_String0() [2/2]

static void p_String0 ( poly  p,
ring  p_ring 
)
inlinestatic

Definition at line 1244 of file p_polys.h.

1245{
1247}
void p_String0(poly p, ring lmRing, ring tailRing)
print p according to ShortOut in lmRing & tailRing
Definition polys0.cc:223

◆ p_String0Long()

void p_String0Long ( const poly  p,
ring  lmRing,
ring  tailRing 
)

print p in a long way

print p in a long way

Definition at line 203 of file polys0.cc.

204{
205 // NOTE: the following (non-thread-safe!) UGLYNESS
206 // (changing naRing->ShortOut for a while) is due to Hans!
207 // Just think of other ring using the VERY SAME naRing and possible
208 // side-effects...
209 // but this is not a problem: i/o is not thread-safe anyway.
211 const BOOLEAN bTAILShortOut = rShortOut(tailRing);
212
213 lmRing->ShortOut = FALSE;
214 tailRing->ShortOut = FALSE;
215
216 p_String0(p, lmRing, tailRing);
217
218 lmRing->ShortOut = bLMShortOut;
219 tailRing->ShortOut = bTAILShortOut;
220}
static BOOLEAN rShortOut(const ring r)
Definition ring.h:586

◆ p_String0Short()

void p_String0Short ( const poly  p,
ring  lmRing,
ring  tailRing 
)

print p in a short way, if possible

print p in a short way, if possible

Definition at line 184 of file polys0.cc.

185{
186 // NOTE: the following (non-thread-safe!) UGLYNESS
187 // (changing naRing->ShortOut for a while) is due to Hans!
188 // Just think of other ring using the VERY SAME naRing and possible
189 // side-effects...
191 const BOOLEAN bTAILShortOut = rShortOut(tailRing);
192
193 lmRing->ShortOut = rCanShortOut(lmRing);
194 tailRing->ShortOut = rCanShortOut(tailRing);
195
196 p_String0(p, lmRing, tailRing);
197
198 lmRing->ShortOut = bLMShortOut;
199 tailRing->ShortOut = bTAILShortOut;
200}
static BOOLEAN rCanShortOut(const ring r)
Definition ring.h:591

◆ p_Sub()

poly p_Sub ( poly  a,
poly  b,
const ring  r 
)

Definition at line 1990 of file p_polys.cc.

1991{
1992 return p_Add_q(p1, p_Neg(p2,r),r);
1993}

◆ p_SubComp()

static unsigned long p_SubComp ( poly  p,
unsigned long  v,
ring  r 
)
inlinestatic

Definition at line 453 of file p_polys.h.

454{
457 _pPolyAssume2(__p_GetComp(p,r) >= v,p,r);
458 return __p_GetComp(p,r) -= v;
459}

◆ p_SubExp()

static long p_SubExp ( poly  p,
int  v,
long  ee,
ring  r 
)
inlinestatic

Definition at line 613 of file p_polys.h.

614{
616 long e = p_GetExp(p,v,r);
617 pAssume2(e >= ee);
618 e -= ee;
619 return p_SetExp(p,v,e,r);
620}

◆ p_Subst()

poly p_Subst ( poly  p,
int  n,
poly  e,
const ring  r 
)

Definition at line 3958 of file p_polys.cc.

3959{
3960#ifdef HAVE_SHIFTBBA
3961 // also don't even use p_Subst0 for Letterplace
3962 if (rIsLPRing(r))
3963 {
3964 poly subst = p_LPSubst(p, n, e, r);
3965 p_Delete(&p, r);
3966 return subst;
3967 }
3968#endif
3969
3970 if (e == NULL) return p_Subst0(p, n,r);
3971
3972 if (p_IsConstant(e,r))
3973 {
3974 if (n_IsOne(pGetCoeff(e),r->cf)) return p_Subst1(p,n,r);
3975 else return p_Subst2(p, n, pGetCoeff(e),r);
3976 }
3977
3978#ifdef HAVE_PLURAL
3979 if (rIsPluralRing(r))
3980 {
3981 return nc_pSubst(p,n,e,r);
3982 }
3983#endif
3984
3985 int exponent,i;
3986 poly h, res, m;
3987 int *me,*ee;
3988 number nu,nu1;
3989
3990 me=(int *)omAlloc((rVar(r)+1)*sizeof(int));
3991 ee=(int *)omAlloc((rVar(r)+1)*sizeof(int));
3992 if (e!=NULL) p_GetExpV(e,ee,r);
3993 res=NULL;
3994 h=p;
3995 while (h!=NULL)
3996 {
3997 if ((e!=NULL) || (p_GetExp(h,n,r)==0))
3998 {
3999 m=p_Head(h,r);
4000 p_GetExpV(m,me,r);
4001 exponent=me[n];
4002 me[n]=0;
4003 for(i=rVar(r);i>0;i--)
4004 me[i]+=exponent*ee[i];
4005 p_SetExpV(m,me,r);
4006 if (e!=NULL)
4007 {
4008 n_Power(pGetCoeff(e),exponent,&nu,r->cf);
4009 nu1=n_Mult(pGetCoeff(m),nu,r->cf);
4010 n_Delete(&nu,r->cf);
4011 p_SetCoeff(m,nu1,r);
4012 }
4013 res=p_Add_q(res,m,r);
4014 }
4015 p_LmDelete(&h,r);
4016 }
4017 omFreeSize((ADDRESS)me,(rVar(r)+1)*sizeof(int));
4018 omFreeSize((ADDRESS)ee,(rVar(r)+1)*sizeof(int));
4019 return res;
4020}
CanonicalForm subst(const CanonicalForm &f, const CFList &a, const CFList &b, const CanonicalForm &Rstar, bool isFunctionField)
poly nc_pSubst(poly p, int n, poly e, const ring r)
substitute the n-th variable by e in p destroy p e is not a constant
static poly p_Subst0(poly p, int n, const ring r)
Definition p_polys.cc:3933
static poly p_Subst1(poly p, int n, const ring r)
Definition p_polys.cc:3865
static poly p_Subst2(poly p, int n, number e, const ring r)
Definition p_polys.cc:3892
poly p_LPSubst(poly p, int n, poly e, const ring r)
Definition shiftop.cc:912

◆ p_TakeOutComp() [1/2]

poly p_TakeOutComp ( poly *  p,
int  k,
const ring  r 
)

Definition at line 3435 of file p_polys.cc.

3436{
3437 poly q = *p,qq=NULL,result = NULL;
3438
3439 if (q==NULL) return NULL;
3441 if (__p_GetComp(q,r)==k)
3442 {
3443 result = q;
3444 do
3445 {
3446 p_SetComp(q,0,r);
3447 if (use_setmcomp) p_SetmComp(q,r);
3448 qq = q;
3449 pIter(q);
3450 }
3451 while ((q!=NULL) && (__p_GetComp(q,r)==k));
3452 *p = q;
3453 pNext(qq) = NULL;
3454 }
3455 if (q==NULL) return result;
3456 if (__p_GetComp(q,r) > k)
3457 {
3458 p_SubComp(q,1,r);
3459 if (use_setmcomp) p_SetmComp(q,r);
3460 }
3461 poly pNext_q;
3462 while ((pNext_q=pNext(q))!=NULL)
3463 {
3464 if (__p_GetComp(pNext_q,r)==k)
3465 {
3466 if (result==NULL)
3467 {
3468 result = pNext_q;
3469 qq = result;
3470 }
3471 else
3472 {
3473 pNext(qq) = pNext_q;
3474 pIter(qq);
3475 }
3476 pNext(q) = pNext(pNext_q);
3477 pNext(qq) =NULL;
3478 p_SetComp(qq,0,r);
3479 if (use_setmcomp) p_SetmComp(qq,r);
3480 }
3481 else
3482 {
3483 /*pIter(q);*/ q=pNext_q;
3484 if (__p_GetComp(q,r) > k)
3485 {
3486 p_SubComp(q,1,r);
3487 if (use_setmcomp) p_SetmComp(q,r);
3488 }
3489 }
3490 }
3491 return result;
3492}

◆ p_TakeOutComp() [2/2]

void p_TakeOutComp ( poly *  p,
long  comp,
poly *  q,
int lq,
const ring  r 
)

Splits *p into two polys: *q which consists of all monoms with component == comp and *p of all other monoms *lq == pLength(*q) On return all components pf *q == 0.

Definition at line 3496 of file p_polys.cc.

3497{
3498 spolyrec pp, qq;
3499 poly p, q, p_prev;
3500 int l = 0;
3501
3502#ifndef SING_NDEBUG
3503 int lp = pLength(*r_p);
3504#endif
3505
3506 pNext(&pp) = *r_p;
3507 p = *r_p;
3508 p_prev = &pp;
3509 q = &qq;
3510
3511 while(p != NULL)
3512 {
3513 while (__p_GetComp(p,r) == comp)
3514 {
3515 pNext(q) = p;
3516 pIter(q);
3517 p_SetComp(p, 0,r);
3518 p_SetmComp(p,r);
3519 pIter(p);
3520 l++;
3521 if (p == NULL)
3522 {
3523 pNext(p_prev) = NULL;
3524 goto Finish;
3525 }
3526 }
3527 pNext(p_prev) = p;
3528 p_prev = p;
3529 pIter(p);
3530 }
3531
3532 Finish:
3533 pNext(q) = NULL;
3534 *r_p = pNext(&pp);
3535 *r_q = pNext(&qq);
3536 *lq = l;
3537#ifndef SING_NDEBUG
3538 assume(pLength(*r_p) + pLength(*r_q) == (unsigned)lp);
3539#endif
3540 p_Test(*r_p,r);
3541 p_Test(*r_q,r);
3542}

◆ p_Totaldegree()

static long p_Totaldegree ( poly  p,
const ring  r 
)
inlinestatic

Definition at line 1507 of file p_polys.h.

1508{
1510 unsigned long s = p_GetTotalDegree(p->exp[r->VarL_Offset[0]],
1511 r,
1512 r->ExpPerLong);
1513 for (unsigned i=r->VarL_Size-1; i!=0; i--)
1514 {
1515 s += p_GetTotalDegree(p->exp[r->VarL_Offset[i]], r,r->ExpPerLong);
1516 }
1517 return (long)s;
1518}

◆ p_Var()

int p_Var ( poly  mi,
const ring  r 
)

Definition at line 4656 of file p_polys.cc.

4657{
4658 if (m==NULL) return 0;
4659 if (pNext(m)!=NULL) return 0;
4660 int i,e=0;
4661 for (i=rVar(r); i>0; i--)
4662 {
4663 int exp=p_GetExp(m,i,r);
4664 if (exp==1)
4665 {
4666 if (e==0) e=i;
4667 else return 0;
4668 }
4669 else if (exp!=0)
4670 {
4671 return 0;
4672 }
4673 }
4674 return e;
4675}

◆ p_Vec2Array()

void p_Vec2Array ( poly  v,
poly *  p,
int  len,
const ring  r 
)

julia: vector to already allocated array (len=p_MaxComp(v,r))

julia: vector to already allocated array (len=p_MaxComp(v,r))

Definition at line 3595 of file p_polys.cc.

3596{
3597 poly h;
3598 int k;
3599
3600 for(int i=len-1;i>=0;i--) p[i]=NULL;
3601 while (v!=NULL)
3602 {
3603 h=p_Head(v,r);
3604 k=__p_GetComp(h,r);
3605 if (k>len) { Werror("wrong rank:%d, should be %d",len,k); }
3606 else
3607 {
3608 p_SetComp(h,0,r);
3609 p_Setm(h,r);
3610 pNext(h)=p[k-1];p[k-1]=h;
3611 }
3612 pIter(v);
3613 }
3614 for(int i=len-1;i>=0;i--)
3615 {
3616 if (p[i]!=NULL) p[i]=pReverse(p[i]);
3617 }
3618}

◆ p_Vec2Poly()

poly p_Vec2Poly ( poly  v,
int  k,
const ring  r 
)

Definition at line 3573 of file p_polys.cc.

3574{
3575 poly h;
3576 poly res=NULL;
3577 long unsigned kk=k;
3578
3579 while (v!=NULL)
3580 {
3581 if (__p_GetComp(v,r)==kk)
3582 {
3583 h=p_Head(v,r);
3584 p_SetComp(h,0,r);
3585 pNext(h)=res;res=h;
3586 }
3587 pIter(v);
3588 }
3589 if (res!=NULL) res=pReverse(res);
3590 return res;
3591}

◆ p_Vec2Polys()

void p_Vec2Polys ( poly  v,
poly **  p,
int len,
const ring  r 
)

Definition at line 3625 of file p_polys.cc.

3626{
3627 *len=p_MaxComp(v,r);
3628 if (*len==0) *len=1;
3629 *p=(poly*)omAlloc((*len)*sizeof(poly));
3630 p_Vec2Array(v,*p,*len,r);
3631}
void p_Vec2Array(poly v, poly *p, int len, const ring r)
vector to already allocated array (len>=p_MaxComp(v,r))
Definition p_polys.cc:3595

◆ p_VectorHasUnit()

void p_VectorHasUnit ( poly  p,
int k,
int len,
const ring  r 
)

Definition at line 3402 of file p_polys.cc.

3403{
3404 poly q=p,qq;
3405 int j=0;
3406 long unsigned i;
3407
3408 *len = 0;
3409 while (q!=NULL)
3410 {
3411 if (p_LmIsConstantComp(q,r))
3412 {
3413 i = __p_GetComp(q,r);
3414 qq = p;
3415 while ((qq != q) && (__p_GetComp(qq,r) != i)) pIter(qq);
3416 if (qq == q)
3417 {
3418 j = 0;
3419 while (qq!=NULL)
3420 {
3421 if (__p_GetComp(qq,r)==i) j++;
3422 pIter(qq);
3423 }
3424 if ((*len == 0) || (j<*len))
3425 {
3426 *len = j;
3427 *k = i;
3428 }
3429 }
3430 }
3431 pIter(q);
3432 }
3433}

◆ p_VectorHasUnitB()

BOOLEAN p_VectorHasUnitB ( poly  p,
int k,
const ring  r 
)

Definition at line 3379 of file p_polys.cc.

3380{
3381 poly q=p,qq;
3382 long unsigned i;
3383
3384 while (q!=NULL)
3385 {
3386 if (p_LmIsConstantComp(q,r))
3387 {
3388 i = __p_GetComp(q,r);
3389 qq = p;
3390 while ((qq != q) && (__p_GetComp(qq,r) != i)) pIter(qq);
3391 if (qq == q)
3392 {
3393 *k = i;
3394 return TRUE;
3395 }
3396 }
3397 pIter(q);
3398 }
3399 return FALSE;
3400}

◆ p_WDegree()

long p_WDegree ( poly  p,
const ring  r 
)

Definition at line 714 of file p_polys.cc.

715{
716 if (r->firstwv==NULL) return p_Totaldegree(p, r);
718 int i;
719 long j =0;
720
721 for(i=1;i<=r->firstBlockEnds;i++)
722 j+=p_GetExp(p, i, r)*r->firstwv[i-1];
723
724 for (;i<=rVar(r);i++)
725 j+=p_GetExp(p,i, r)*p_Weight(i, r);
726
727 return j;
728}
int p_Weight(int i, const ring r)
Definition p_polys.cc:705

◆ p_Weight()

int p_Weight ( int  c,
const ring  r 
)

Definition at line 705 of file p_polys.cc.

706{
707 if ((r->firstwv==NULL) || (i>r->firstBlockEnds))
708 {
709 return 1;
710 }
711 return r->firstwv[i-1];
712}

◆ p_WFirstTotalDegree()

long p_WFirstTotalDegree ( poly  p,
ring  r 
)

Definition at line 596 of file p_polys.cc.

597{
598 int i;
599 long sum = 0;
600
601 for (i=1; i<= r->firstBlockEnds; i++)
602 {
603 sum += p_GetExp(p, i, r)*r->firstwv[i-1];
604 }
605 return sum;
606}

◆ p_Write() [1/2]

void p_Write ( poly  p,
ring  lmRing,
ring  tailRing 
)

Definition at line 342 of file polys0.cc.

343{
344 p_Write0(p, lmRing, tailRing);
345 PrintLn();
346}
void p_Write0(poly p, ring lmRing, ring tailRing)
Definition polys0.cc:332
void PrintLn()
Definition reporter.cc:310

◆ p_Write() [2/2]

static void p_Write ( poly  p,
ring  p_ring 
)
inlinestatic

Definition at line 1248 of file p_polys.h.

1249{
1251}

◆ p_Write0() [1/2]

void p_Write0 ( poly  p,
ring  lmRing,
ring  tailRing 
)

Definition at line 332 of file polys0.cc.

333{
334 char *s=p_String(p, lmRing, tailRing);
335 PrintS(s);
336 omFree(s);
337}
char * p_String(poly p, ring lmRing, ring tailRing)
Definition polys0.cc:322

◆ p_Write0() [2/2]

static void p_Write0 ( poly  p,
ring  p_ring 
)
inlinestatic

Definition at line 1252 of file p_polys.h.

1253{
1255}
void p_Write0(poly p, ring lmRing, ring tailRing)
Definition polys0.cc:332

◆ p_wrp() [1/2]

void p_wrp ( poly  p,
ring  lmRing,
ring  tailRing 
)

Definition at line 373 of file polys0.cc.

374{
375 poly r;
376
377 if (p==NULL) PrintS("NULL");
378 else if (pNext(p)==NULL) p_Write0(p, lmRing);
379 else
380 {
381 r = pNext(pNext(p));
382 pNext(pNext(p)) = NULL;
383 p_Write0(p, tailRing);
384 if (r!=NULL)
385 {
386 PrintS("+...");
387 pNext(pNext(p)) = r;
388 }
389 }
390}

◆ p_wrp() [2/2]

static void p_wrp ( poly  p,
ring  p_ring 
)
inlinestatic

Definition at line 1256 of file p_polys.h.

1257{
1258 p_wrp(p, p_ring, p_ring);
1259}
void p_wrp(poly p, ring lmRing, ring tailRing)
Definition polys0.cc:373

◆ p_WTotaldegree()

long p_WTotaldegree ( poly  p,
const ring  r 
)

Definition at line 613 of file p_polys.cc.

614{
616 int i, k;
617 long j =0;
618
619 // iterate through each block:
620 for (i=0;r->order[i]!=0;i++)
621 {
622 int b0=r->block0[i];
623 int b1=r->block1[i];
624 switch(r->order[i])
625 {
626 case ringorder_M:
627 for (k=b0 /*r->block0[i]*/;k<=b1 /*r->block1[i]*/;k++)
628 { // in jedem block:
629 j+= p_GetExp(p,k,r)*r->wvhdl[i][k - b0 /*r->block0[i]*/]*r->OrdSgn;
630 }
631 break;
632 case ringorder_am:
633 b1=si_min(b1,r->N);
634 /* no break, continue as ringorder_a*/
635 case ringorder_a:
636 for (k=b0 /*r->block0[i]*/;k<=b1 /*r->block1[i]*/;k++)
637 { // only one line
638 j+= p_GetExp(p,k,r)*r->wvhdl[i][k - b0 /*r->block0[i]*/];
639 }
640 return j*r->OrdSgn;
641 case ringorder_wp:
642 case ringorder_ws:
643 case ringorder_Wp:
644 case ringorder_Ws:
645 for (k=b0 /*r->block0[i]*/;k<=b1 /*r->block1[i]*/;k++)
646 { // in jedem block:
647 j+= p_GetExp(p,k,r)*r->wvhdl[i][k - b0 /*r->block0[i]*/];
648 }
649 break;
650 case ringorder_lp:
651 case ringorder_ls:
652 case ringorder_rs:
653 case ringorder_dp:
654 case ringorder_ds:
655 case ringorder_Dp:
656 case ringorder_Ds:
657 case ringorder_rp:
658 for (k=b0 /*r->block0[i]*/;k<=b1 /*r->block1[i]*/;k++)
659 {
660 j+= p_GetExp(p,k,r);
661 }
662 break;
663 case ringorder_a64:
664 {
665 int64* w=(int64*)r->wvhdl[i];
666 for (k=0;k<=(b1 /*r->block1[i]*/ - b0 /*r->block0[i]*/);k++)
667 {
668 //there should be added a line which checks if w[k]>2^31
669 j+= p_GetExp(p,k+1, r)*(long)w[k];
670 }
671 //break;
672 return j;
673 }
674 case ringorder_c: /* nothing to do*/
675 case ringorder_C: /* nothing to do*/
676 case ringorder_S: /* nothing to do*/
677 case ringorder_s: /* nothing to do*/
678 case ringorder_IS: /* nothing to do */
679 case ringorder_unspec: /* to make clang happy, does not occur*/
680 case ringorder_no: /* to make clang happy, does not occur*/
681 case ringorder_L: /* to make clang happy, does not occur*/
682 case ringorder_aa: /* ignored by p_WTotaldegree*/
683 break;
684 /* no default: all orderings covered */
685 }
686 }
687 return j;
688}
#define ringorder_rp
Definition ring.h:99
@ ringorder_a
Definition ring.h:70
@ ringorder_am
Definition ring.h:89
@ ringorder_a64
for int64 weights
Definition ring.h:71
@ ringorder_C
Definition ring.h:73
@ ringorder_S
S?
Definition ring.h:75
@ ringorder_ds
Definition ring.h:85
@ ringorder_Dp
Definition ring.h:80
@ ringorder_unspec
Definition ring.h:95
@ ringorder_L
Definition ring.h:90
@ ringorder_Ds
Definition ring.h:86
@ ringorder_dp
Definition ring.h:78
@ ringorder_c
Definition ring.h:72
@ ringorder_aa
for idElimination, like a, except pFDeg, pWeigths ignore it
Definition ring.h:92
@ ringorder_no
Definition ring.h:69
@ ringorder_Wp
Definition ring.h:82
@ ringorder_ws
Definition ring.h:87
@ ringorder_Ws
Definition ring.h:88
@ ringorder_IS
Induced (Schreyer) ordering.
Definition ring.h:94
@ ringorder_ls
degree, ip
Definition ring.h:84
@ ringorder_s
s?
Definition ring.h:76
@ ringorder_wp
Definition ring.h:81
@ ringorder_M
Definition ring.h:74
#define ringorder_rs
Definition ring.h:100

◆ pEnlargeSet()

void pEnlargeSet ( poly **  p,
int  length,
int  increment 
)

Definition at line 3696 of file p_polys.cc.

3697{
3698 poly* h;
3699
3700 if (increment==0) return;
3701 if (*p==NULL)
3702 {
3703 h=(poly*)omAlloc0(increment*sizeof(poly));
3704 }
3705 else
3706 {
3707 h=(poly*)omReallocSize((poly*)*p,l*sizeof(poly),(l+increment)*sizeof(poly));
3708 if (increment>0)
3709 {
3710 memset(&(h[l]),0,increment*sizeof(poly));
3711 }
3712 }
3713 *p=h;
3714}
#define omReallocSize(addr, o_size, size)

◆ pHaveCommonMonoms()

BOOLEAN pHaveCommonMonoms ( poly  p,
poly  q 
)

Definition at line 178 of file pDebug.cc.

179{
180 while (p != NULL)
181 {
182 if (pIsMonomOf(q, p))
183 {
184 return TRUE;
185 }
186 pIter(p);
187 }
188 return FALSE;
189}
BOOLEAN pIsMonomOf(poly p, poly m)
Definition pDebug.cc:168

◆ pIsMonomOf()

BOOLEAN pIsMonomOf ( poly  p,
poly  m 
)

Definition at line 168 of file pDebug.cc.

169{
170 if (m == NULL) return TRUE;
171 while (p != NULL)
172 {
173 if (p == m) return TRUE;
174 pIter(p);
175 }
176 return FALSE;
177}

◆ pLDeg0()

long pLDeg0 ( poly  p,
int l,
ring  r 
)

Definition at line 739 of file p_polys.cc.

740{
741 p_CheckPolyRing(p, r);
742 long unsigned k= p_GetComp(p, r);
743 int ll=1;
744
745 if (k > 0)
746 {
747 while ((pNext(p)!=NULL) && (__p_GetComp(pNext(p), r)==k))
748 {
749 pIter(p);
750 ll++;
751 }
752 }
753 else
754 {
755 while (pNext(p)!=NULL)
756 {
757 pIter(p);
758 ll++;
759 }
760 }
761 *l=ll;
762 return r->pFDeg(p, r);
763}

◆ pLDeg0c()

long pLDeg0c ( poly  p,
int l,
ring  r 
)

Definition at line 770 of file p_polys.cc.

771{
772 assume(p!=NULL);
773 p_Test(p,r);
774 p_CheckPolyRing(p, r);
775 long o;
776 int ll=1;
777
778 if (! rIsSyzIndexRing(r))
779 {
780 while (pNext(p) != NULL)
781 {
782 pIter(p);
783 ll++;
784 }
785 o = r->pFDeg(p, r);
786 }
787 else
788 {
789 long unsigned curr_limit = rGetCurrSyzLimit(r);
790 poly pp = p;
791 while ((p=pNext(p))!=NULL)
792 {
793 if (__p_GetComp(p, r)<=curr_limit/*syzComp*/)
794 ll++;
795 else break;
796 pp = p;
797 }
798 p_Test(pp,r);
799 o = r->pFDeg(pp, r);
800 }
801 *l=ll;
802 return o;
803}

◆ pLDeg1()

long pLDeg1 ( poly  p,
int l,
ring  r 
)

Definition at line 841 of file p_polys.cc.

842{
843 p_CheckPolyRing(p, r);
844 long unsigned k= p_GetComp(p, r);
845 int ll=1;
846 long t,max;
847
848 max=r->pFDeg(p, r);
849 if (k > 0)
850 {
851 while (((p=pNext(p))!=NULL) && (__p_GetComp(p, r)==k))
852 {
853 t=r->pFDeg(p, r);
854 if (t>max) max=t;
855 ll++;
856 }
857 }
858 else
859 {
860 while ((p=pNext(p))!=NULL)
861 {
862 t=r->pFDeg(p, r);
863 if (t>max) max=t;
864 ll++;
865 }
866 }
867 *l=ll;
868 return max;
869}

◆ pLDeg1_Deg()

long pLDeg1_Deg ( poly  p,
int l,
ring  r 
)

Definition at line 910 of file p_polys.cc.

911{
912 assume(r->pFDeg == p_Deg);
913 p_CheckPolyRing(p, r);
914 long unsigned k= p_GetComp(p, r);
915 int ll=1;
916 long t,max;
917
918 max=p_GetOrder(p, r);
919 if (k > 0)
920 {
921 while (((p=pNext(p))!=NULL) && (__p_GetComp(p, r)==k))
922 {
923 t=p_GetOrder(p, r);
924 if (t>max) max=t;
925 ll++;
926 }
927 }
928 else
929 {
930 while ((p=pNext(p))!=NULL)
931 {
932 t=p_GetOrder(p, r);
933 if (t>max) max=t;
934 ll++;
935 }
936 }
937 *l=ll;
938 return max;
939}

◆ pLDeg1_Totaldegree()

long pLDeg1_Totaldegree ( poly  p,
int l,
ring  r 
)

Definition at line 975 of file p_polys.cc.

976{
977 p_CheckPolyRing(p, r);
978 long unsigned k= p_GetComp(p, r);
979 int ll=1;
980 long t,max;
981
982 max=p_Totaldegree(p, r);
983 if (k > 0)
984 {
985 while (((p=pNext(p))!=NULL) && (__p_GetComp(p, r)==k))
986 {
987 t=p_Totaldegree(p, r);
988 if (t>max) max=t;
989 ll++;
990 }
991 }
992 else
993 {
994 while ((p=pNext(p))!=NULL)
995 {
996 t=p_Totaldegree(p, r);
997 if (t>max) max=t;
998 ll++;
999 }
1000 }
1001 *l=ll;
1002 return max;
1003}

◆ pLDeg1_WFirstTotalDegree()

long pLDeg1_WFirstTotalDegree ( poly  p,
int l,
ring  r 
)

Definition at line 1038 of file p_polys.cc.

1039{
1040 p_CheckPolyRing(p, r);
1041 long unsigned k= p_GetComp(p, r);
1042 int ll=1;
1043 long t,max;
1044
1046 if (k > 0)
1047 {
1048 while (((p=pNext(p))!=NULL) && (__p_GetComp(p, r)==k))
1049 {
1050 t=p_WFirstTotalDegree(p, r);
1051 if (t>max) max=t;
1052 ll++;
1053 }
1054 }
1055 else
1056 {
1057 while ((p=pNext(p))!=NULL)
1058 {
1059 t=p_WFirstTotalDegree(p, r);
1060 if (t>max) max=t;
1061 ll++;
1062 }
1063 }
1064 *l=ll;
1065 return max;
1066}
long p_WFirstTotalDegree(poly p, const ring r)
Definition p_polys.cc:596

◆ pLDeg1c()

long pLDeg1c ( poly  p,
int l,
ring  r 
)

Definition at line 877 of file p_polys.cc.

878{
879 p_CheckPolyRing(p, r);
880 int ll=1;
881 long t,max;
882
883 max=r->pFDeg(p, r);
884 if (rIsSyzIndexRing(r))
885 {
886 long unsigned limit = rGetCurrSyzLimit(r);
887 while ((p=pNext(p))!=NULL)
888 {
889 if (__p_GetComp(p, r)<=limit)
890 {
891 if ((t=r->pFDeg(p, r))>max) max=t;
892 ll++;
893 }
894 else break;
895 }
896 }
897 else
898 {
899 while ((p=pNext(p))!=NULL)
900 {
901 if ((t=r->pFDeg(p, r))>max) max=t;
902 ll++;
903 }
904 }
905 *l=ll;
906 return max;
907}

◆ pLDeg1c_Deg()

long pLDeg1c_Deg ( poly  p,
int l,
ring  r 
)

Definition at line 941 of file p_polys.cc.

942{
943 assume(r->pFDeg == p_Deg);
944 p_CheckPolyRing(p, r);
945 int ll=1;
946 long t,max;
947
948 max=p_GetOrder(p, r);
949 if (rIsSyzIndexRing(r))
950 {
951 long unsigned limit = rGetCurrSyzLimit(r);
952 while ((p=pNext(p))!=NULL)
953 {
954 if (__p_GetComp(p, r)<=limit)
955 {
956 if ((t=p_GetOrder(p, r))>max) max=t;
957 ll++;
958 }
959 else break;
960 }
961 }
962 else
963 {
964 while ((p=pNext(p))!=NULL)
965 {
966 if ((t=p_GetOrder(p, r))>max) max=t;
967 ll++;
968 }
969 }
970 *l=ll;
971 return max;
972}

◆ pLDeg1c_Totaldegree()

long pLDeg1c_Totaldegree ( poly  p,
int l,
ring  r 
)

Definition at line 1005 of file p_polys.cc.

1006{
1007 p_CheckPolyRing(p, r);
1008 int ll=1;
1009 long t,max;
1010
1011 max=p_Totaldegree(p, r);
1012 if (rIsSyzIndexRing(r))
1013 {
1014 long unsigned limit = rGetCurrSyzLimit(r);
1015 while ((p=pNext(p))!=NULL)
1016 {
1017 if (__p_GetComp(p, r)<=limit)
1018 {
1019 if ((t=p_Totaldegree(p, r))>max) max=t;
1020 ll++;
1021 }
1022 else break;
1023 }
1024 }
1025 else
1026 {
1027 while ((p=pNext(p))!=NULL)
1028 {
1029 if ((t=p_Totaldegree(p, r))>max) max=t;
1030 ll++;
1031 }
1032 }
1033 *l=ll;
1034 return max;
1035}

◆ pLDeg1c_WFirstTotalDegree()

long pLDeg1c_WFirstTotalDegree ( poly  p,
int l,
ring  r 
)

Definition at line 1068 of file p_polys.cc.

1069{
1070 p_CheckPolyRing(p, r);
1071 int ll=1;
1072 long t,max;
1073
1075 if (rIsSyzIndexRing(r))
1076 {
1077 long unsigned limit = rGetCurrSyzLimit(r);
1078 while ((p=pNext(p))!=NULL)
1079 {
1080 if (__p_GetComp(p, r)<=limit)
1081 {
1082 if ((t=p_Totaldegree(p, r))>max) max=t;
1083 ll++;
1084 }
1085 else break;
1086 }
1087 }
1088 else
1089 {
1090 while ((p=pNext(p))!=NULL)
1091 {
1092 if ((t=p_Totaldegree(p, r))>max) max=t;
1093 ll++;
1094 }
1095 }
1096 *l=ll;
1097 return max;
1098}

◆ pLDegb()

long pLDegb ( poly  p,
int l,
ring  r 
)

Definition at line 811 of file p_polys.cc.

812{
813 p_CheckPolyRing(p, r);
814 long unsigned k= p_GetComp(p, r);
815 long o = r->pFDeg(p, r);
816 int ll=1;
817
818 if (k != 0)
819 {
820 while (((p=pNext(p))!=NULL) && (__p_GetComp(p, r)==k))
821 {
822 ll++;
823 }
824 }
825 else
826 {
827 while ((p=pNext(p)) !=NULL)
828 {
829 ll++;
830 }
831 }
832 *l=ll;
833 return o;
834}

◆ pLength()

static int pLength ( poly  a)
inlinestatic

Definition at line 190 of file p_polys.h.

191{
192 int l = 0;
193 while (a!=NULL)
194 {
195 pIter(a);
196 l++;
197 }
198 return l;
199}

◆ pp_DivideM()

poly pp_DivideM ( poly  a,
poly  b,
const ring  r 
)

Definition at line 1633 of file p_polys.cc.

1634{
1635 if (a==NULL) { return NULL; }
1636 // TODO: better implementation without copying a,b
1637 return p_DivideM(p_Copy(a,r),p_Head(b,r),r);
1638}
poly p_DivideM(poly a, poly b, const ring r)
Definition p_polys.cc:1578

◆ pp_Jet()

poly pp_Jet ( poly  p,
int  m,
const ring  R 
)

Definition at line 4358 of file p_polys.cc.

4359{
4360 poly r=NULL;
4361 poly t=NULL;
4362
4363 while (p!=NULL)
4364 {
4365 if (p_Totaldegree(p,R)<=m)
4366 {
4367 if (r==NULL)
4368 r=p_Head(p,R);
4369 else
4370 if (t==NULL)
4371 {
4372 pNext(r)=p_Head(p,R);
4373 t=pNext(r);
4374 }
4375 else
4376 {
4377 pNext(t)=p_Head(p,R);
4378 pIter(t);
4379 }
4380 }
4381 pIter(p);
4382 }
4383 return r;
4384}

◆ pp_JetW()

poly pp_JetW ( poly  p,
int  m,
int w,
const ring  R 
)

Definition at line 4403 of file p_polys.cc.

4404{
4405 poly r=NULL;
4406 poly t=NULL;
4407 while (p!=NULL)
4408 {
4409 if (totaldegreeWecart_IV(p,R,w)<=m)
4410 {
4411 if (r==NULL)
4412 r=p_Head(p,R);
4413 else
4414 if (t==NULL)
4415 {
4416 pNext(r)=p_Head(p,R);
4417 t=pNext(r);
4418 }
4419 else
4420 {
4421 pNext(t)=p_Head(p,R);
4422 pIter(t);
4423 }
4424 }
4425 pIter(p);
4426 }
4427 return r;
4428}

◆ pp_mm_Mult()

static poly pp_mm_Mult ( poly  p,
poly  m,
const ring  r 
)
inlinestatic

Definition at line 1041 of file p_polys.h.

1042{
1043 if (p==NULL) return NULL;
1044 if (p_LmIsConstant(m, r))
1045 return __pp_Mult_nn(p, pGetCoeff(m), r);
1046 else
1047 return r->p_Procs->pp_mm_Mult(p, m, r);
1048}
#define __pp_Mult_nn(p, n, r)
Definition p_polys.h:1002

◆ pp_Mult_Coeff_mm_DivSelect() [1/2]

static poly pp_Mult_Coeff_mm_DivSelect ( poly  p,
const poly  m,
const ring  r 
)
inlinestatic

Definition at line 1090 of file p_polys.h.

1091{
1092 int shorter;
1093 return r->p_Procs->pp_Mult_Coeff_mm_DivSelect(p, m, shorter, r);
1094}

◆ pp_Mult_Coeff_mm_DivSelect() [2/2]

static poly pp_Mult_Coeff_mm_DivSelect ( poly  p,
int lp,
const poly  m,
const ring  r 
)
inlinestatic

Definition at line 1098 of file p_polys.h.

1099{
1100 int shorter;
1101 poly pp = r->p_Procs->pp_Mult_Coeff_mm_DivSelect(p, m, shorter, r);
1102 lp -= shorter;
1103 return pp;
1104}

◆ pp_Mult_mm()

static poly pp_Mult_mm ( poly  p,
poly  m,
const ring  r 
)
inlinestatic

Definition at line 1031 of file p_polys.h.

1032{
1033 if (p==NULL) return NULL;
1034 if (p_LmIsConstant(m, r))
1035 return __pp_Mult_nn(p, pGetCoeff(m), r);
1036 else
1037 return r->p_Procs->pp_Mult_mm(p, m, r);
1038}

◆ pp_Mult_nn()

static poly pp_Mult_nn ( poly  p,
number  n,
const ring  r 
)
inlinestatic

Definition at line 992 of file p_polys.h.

993{
994 if (p==NULL) return NULL;
995 if (n_IsOne(n, r->cf))
996 return p_Copy(p, r);
997 else if (n_IsZero(n, r->cf))
998 return NULL;
999 else
1000 return r->p_Procs->pp_Mult_nn(p, n, r);
1001}

◆ pp_Mult_qq()

static poly pp_Mult_qq ( poly  p,
poly  q,
const ring  r 
)
inlinestatic

Definition at line 1151 of file p_polys.h.

1152{
1153 if (p == NULL || q == NULL) return NULL;
1154
1155 if (pNext(p) == NULL)
1156 {
1157 return r->p_Procs->pp_mm_Mult(q, p, r);
1158 }
1159
1160 if (pNext(q) == NULL)
1161 {
1162 return r->p_Procs->pp_Mult_mm(p, q, r);
1163 }
1164
1165 poly qq = q;
1166 if (p == q)
1167 qq = p_Copy(q, r);
1168
1169 poly res;
1170#if defined(HAVE_PLURAL) || defined(HAVE_SHIFTBBA)
1171 if (rIsNCRing(r))
1172 res = _nc_pp_Mult_qq(p, qq, r);
1173 else
1174#endif
1175 res = _p_Mult_q(p, qq, 1, r);
1176
1177 if (qq != q)
1178 p_Delete(&qq, r);
1179 return res;
1180}
poly _nc_pp_Mult_qq(const poly p, const poly q, const ring r)
general NC-multiplication without destruction
Definition old.gring.cc:254

◆ pRestoreDegProcs()

void pRestoreDegProcs ( ring  r,
pFDegProc  old_FDeg,
pLDegProc  old_lDeg 
)

Definition at line 3649 of file p_polys.cc.

3650{
3651 assume(old_FDeg != NULL && old_lDeg != NULL);
3652 r->pFDeg = old_FDeg;
3653 r->pLDeg = old_lDeg;
3654}

◆ pReverse()

static poly pReverse ( poly  p)
inlinestatic

Definition at line 335 of file p_polys.h.

336{
337 if (p == NULL || pNext(p) == NULL) return p;
338
339 poly q = pNext(p), // == pNext(p)
340 qn;
341 pNext(p) = NULL;
342 do
343 {
344 qn = pNext(q);
345 pNext(q) = p;
346 p = q;
347 q = qn;
348 }
349 while (qn != NULL);
350 return p;
351}

◆ pSetDegProcs()

void pSetDegProcs ( ring  r,
pFDegProc  new_FDeg,
pLDegProc  new_lDeg = NULL 
)

Definition at line 3637 of file p_polys.cc.

3638{
3639 assume(new_FDeg != NULL);
3640 r->pFDeg = new_FDeg;
3641
3642 if (new_lDeg == NULL)
3643 new_lDeg = r->pLDegOrig;
3644
3645 r->pLDeg = new_lDeg;
3646}