My Project  debian-1:4.1.2-p1+ds-2
Functions
p_Minus_mm_Mult_qq__T.cc File Reference

Go to the source code of this file.

Functions

LINKAGE poly p_Minus_mm_Mult_qq__T (poly p, poly m, poly q, int &Shorter, const poly spNoether, const ring r)
 

Function Documentation

◆ p_Minus_mm_Mult_qq__T()

LINKAGE poly p_Minus_mm_Mult_qq__T ( poly  p,
poly  m,
poly  q,
int &  Shorter,
const poly  spNoether,
const ring  r 
)

Definition at line 19 of file p_Minus_mm_Mult_qq__T.cc.

20 {
21  p_Test(p, r);
22  p_Test(q, r);
23  p_LmTest(m, r);
24 
25 #if PDEBUG > 0
26  int l_debug = pLength(p) + pLength(q);
27 #endif
28 
29  Shorter = 0;
30  // we are done if q == NULL || m == NULL
31  if (q == NULL || m == NULL) return p;
32 
33  spolyrec rp;
34  poly a = &rp, // collects the result
35  qm = NULL; // stores q*m
36 
37 
38  number tm = pGetCoeff(m), // coefficient of m
39  tneg = n_Neg__T(n_Copy__T(tm, r->cf), r->cf), // - (coefficient of m)
40  tb, // used for tm*coeff(a1)
41  tc; // used as intermediate number
42 
43 
44  int shorter = 0;
45  DECLARE_LENGTH(const unsigned long length = r->ExpL_Size);
46  DECLARE_ORDSGN(const long* ordsgn = r->ordsgn);
47 
48  const unsigned long* m_e = m->exp;
49  omBin bin = r->PolyBin;
50 
51  if (p == NULL) goto Finish; // return tneg*q if (p == NULL)
52 
53  pAssume(p_GetComp(q, r) == 0 || p_GetComp(m, r) == 0);
54 
55  AllocTop:
56  p_AllocBin(qm, bin, r);
57  SumTop:
58  p_MemSum__T(qm->exp, q->exp, m_e, length);
59  p_MemAddAdjust__T(qm, r);
60 
61  CmpTop:
62  // compare qm = m*q and p w.r.t. monomial ordering
63  p_MemCmp__T(qm->exp, p->exp, length, ordsgn, goto Equal, goto Greater, goto Smaller );
64 
65  Equal: // qm equals p
66  tb = n_Mult__T(pGetCoeff(q), tm, r->cf);
67 #ifdef HAVE_ZERODIVISORS
68  if (!n_IsZero__T(tb,r->cf)) {
69 #endif
70  tc = pGetCoeff(p);
71  if (!n_Equal__T(tc, tb, r->cf))
72  {
73  shorter++;
74  tc = n_Sub__T(tc, tb, r->cf);
75  n_Delete__T(&(pGetCoeff(p)), r->cf);
76  pSetCoeff0(p,tc); // adjust coeff of p
77  a = pNext(a) = p; // append p to result and advance p
78  pIter(p);
79  }
80  else
81  { // coeffs are equal, so their difference is 0:
82  shorter += 2;
83  n_Delete__T(&tc, r->cf);
84  p = p_LmFreeAndNext(p, r);
85  }
86 #ifdef HAVE_ZERODIVISORS
87  }
88  else
89  { // coeff itself is zero
90  shorter += 1;
91  }
92 #endif
93  n_Delete__T(&tb, r->cf);
94  pIter(q);
95  if (q == NULL || p == NULL) goto Finish; // are we done ?
96  // no, so update qm
97  goto SumTop;
98 
99 
100  Greater:
101 #ifdef HAVE_ZERODIVISORS
102  tb = n_Mult__T(pGetCoeff(q), tneg, r->cf);
103  if (!n_IsZero__T(tb,r->cf))
104  {
105 #endif
106  pSetCoeff0(qm, n_Mult__T(pGetCoeff(q), tneg, r->cf));
107  a = pNext(a) = qm; // append qm to result and advance q
108 #ifdef HAVE_ZERODIVISORS
109  }
110  else
111  {
112  shorter++;
113  }
114  n_Delete__T(&tb, r->cf);
115 #endif
116  pIter(q);
117  if (q == NULL) // are we done?
118  {
119  qm = NULL;
120  goto Finish;
121  }
122  // construct new qm
123  goto AllocTop;
124 
125  Smaller:
126  a = pNext(a) = p;// append p to result and advance p
127  pIter(p);
128  if (p == NULL) goto Finish;
129  goto CmpTop;
130 
131 
132  Finish: // q or p is NULL: Clean-up time
133  if (q == NULL) // append rest of p to result
134  {
135  pNext(a) = p;
136  }
137  else // append (- m*q) to result
138  {
139  pSetCoeff0(m, tneg);
140  if (spNoether != NULL)
141  {
142  int ll = 0;
143  pNext(a) = r->p_Procs->pp_Mult_mm_Noether(q, m, spNoether, ll, r);
144  shorter += ll;
145  }
146  else
147  {
148  pNext(a) = r->p_Procs->pp_Mult_mm(q, m, r);
149 #ifdef HAVE_RINGS
150  if (! rField_is_Domain(r))
151  {
152  shorter += pLength(q) - pLength(pNext(a));
153  }
154 #endif
155  }
156  pSetCoeff0(m, tm);
157  }
158 
159  n_Delete__T(&tneg, r->cf);
160  if (qm != NULL) p_FreeBinAddr(qm, r);
161  Shorter = shorter;
162  p_Test(pNext(&rp), r);
163  return pNext(&rp);
164 }
int m
Definition: cfEzgcd.cc:121
int p
Definition: cfModGcd.cc:4019
static BOOLEAN Equal(number a, number b, const coeffs r)
Definition: flintcf_Q.cc:322
static bool Greater(mono_type m1, mono_type m2)
static BOOLEAN length(leftv result, leftv arg)
Definition: interval.cc:263
#define p_FreeBinAddr(p, r)
Definition: monomials.h:255
#define p_GetComp(p, r)
Definition: monomials.h:64
#define pIter(p)
Definition: monomials.h:37
#define pNext(p)
Definition: monomials.h:36
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 pSetCoeff0(p, n)
Definition: monomials.h:59
#define p_AllocBin(p, bin, r)
Definition: monomials.h:248
#define pAssume(cond)
Definition: monomials.h:90
#define NULL
Definition: omList.c:12
omBin_t * omBin
Definition: omStructs.h:12
#define n_Delete__T(n, r)
Definition: p_polys.cc:4804
static unsigned pLength(poly a)
Definition: p_polys.h:191
static poly p_LmFreeAndNext(poly p, ring)
Definition: p_polys.h:702
#define p_LmTest(p, r)
Definition: p_polys.h:163
#define p_Test(p, r)
Definition: p_polys.h:162
static BOOLEAN rField_is_Domain(const ring r)
Definition: ring.h:482