source: git/Singular/pInline2.h @ a6a239

fieker-DuValspielwiese
Last change on this file since a6a239 was a6a239, checked in by Olaf Bachmann <obachman@…>, 24 years ago
* new implementation of polys git-svn-id: file:///usr/local/Singular/svn/trunk@4580 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 9.1 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/***************************************************************
5 *  File:    pInline2.h
6 *  Purpose: implementation of poly procs which are of constant time
7 *  Author:  obachman (Olaf Bachmann)
8 *  Created: 8/00
9 *  Version: $Id: pInline2.h,v 1.1 2000-09-12 16:01:05 obachman Exp $
10 *******************************************************************/
11#ifndef PINLINE2_H
12#define PINLINE2_H
13
14/***************************************************************
15 *
16 * Primitives for accessing and setting fields of a poly
17 *
18 ***************************************************************/
19#if !defined(NO_PINLINE2) || defined(PINLINE2_CC)
20
21#include "mod2.h"
22#include "omalloc.h"
23#include "structs.h"
24#include "polys.h"
25#include "numbers.h"
26#include "p_Procs.h"
27
28
29PINLINE2 number p_SetCoeff(poly p, number n, ring r)
30{
31  p_CheckPolyRing(p, r);
32  p_nDelete(&(p->coef), r);
33  (p)->coef=n;
34  return n;
35}
36
37// order
38PINLINE2 Order_t p_GetOrder(poly p, ring r)
39{
40  p_CheckPolyRing(p, r);
41  return ((p)->exp[r->pOrdIndex]);
42}
43
44PINLINE2 Order_t p_SetOrder(poly p, long o, ring r)
45{
46  p_CheckPolyRing(p, r);
47  passume2(o >= 0);
48  return (p)->exp[r->pOrdIndex] = o;
49}
50
51// component
52PINLINE2  unsigned long p_SetComp(poly p, unsigned long c, ring r)
53{
54  p_CheckPolyRing(p, r);
55  passume2(rRing_has_Comp(r));
56  __p_GetComp(p,r) = c;
57  return c;
58}
59PINLINE2 unsigned long p_IncrComp(poly p, ring r)
60{
61  p_CheckPolyRing(p, r);
62  passume2(rRing_has_Comp(r));
63  return ++(__p_GetComp(p,r));
64}
65PINLINE2 unsigned long p_DecrComp(poly p, ring r)
66{
67  p_CheckPolyRing(p, r);
68  passume2(rRing_has_Comp(r));
69  passume2(__p_GetComp(p,r) > 0);
70  return --(__p_GetComp(p,r));
71}
72PINLINE2 unsigned long p_AddComp(poly p, unsigned long v, ring r)
73{
74  p_CheckPolyRing(p, r);
75  passume2(rRing_has_Comp(r));
76  return __p_GetComp(p,r) += v;
77}
78PINLINE2 unsigned long p_SubComp(poly p, unsigned long v, ring r)
79{
80  p_CheckPolyRing(p, r);
81  passume2(rRing_has_Comp(r));
82  passume2(__p_GetComp(p,r) >= v);
83  return __p_GetComp(p,r) -= v;
84}
85
86// exponent
87PINLINE2 Exponent_t p_GetExp(poly p, int v, ring r)
88{
89  p_CheckPolyRing(p, r);
90  passume2(v > 0 && v <= r->N);
91  return (p->exp[(r->VarOffset[v] & 0xffffff)] >> (r->VarOffset[v] >> 24))
92          & r->bitmask;
93}
94PINLINE2 Exponent_t p_SetExp(poly p, int v, int e, ring r)
95{
96  p_CheckPolyRing(p, r);
97  passume2(v>0 && v <= r->N);
98  passume2(e>=0);
99  passume2((unsigned int) e<=r->bitmask);
100
101  // shift e to the left:
102  register int shift = r->VarOffset[v] >> 24;
103  unsigned long ee = ((unsigned long)e) << shift /*(r->VarOffset[v] >> 24)*/;
104  // clear the bits in the exponent vector:
105  register int offset = (r->VarOffset[v] & 0xffffff);
106  p->exp[offset]  &=
107    ~( r->bitmask << shift );
108  // insert e with |
109  p->exp[ offset ] |= ee;
110  return e;
111}
112
113// the following should be implemented more efficiently
114PINLINE2  Exponent_t p_IncrExp(poly p, int v, ring r)
115{
116  p_CheckPolyRing(p, r);
117  Exponent_t e = p_GetExp(p,v,r);
118  e++;
119  return p_SetExp(p,v,e,r);
120}
121PINLINE2  Exponent_t p_DecrExp(poly p, int v, ring r)
122{
123  p_CheckPolyRing(p, r);
124  Exponent_t e = p_GetExp(p,v,r);
125  passume2(e > 0);
126  e--;
127  return p_SetExp(p,v,e,r);
128}
129PINLINE2  Exponent_t p_AddExp(poly p, int v, Exponent_t ee, ring r)
130{
131  p_CheckPolyRing(p, r);
132  Exponent_t e = p_GetExp(p,v,r);
133  e += ee;
134  return p_SetExp(p,v,e,r);
135}
136PINLINE2  Exponent_t p_SubExp(poly p, int v, Exponent_t ee, ring r)
137{
138  p_CheckPolyRing(p, r);
139  Exponent_t e = p_GetExp(p,v,r);
140  passume2(e >= ee);
141  e -= ee;
142  return p_SetExp(p,v,e,r);
143}
144PINLINE2  Exponent_t p_MultExp(poly p, int v, Exponent_t ee, ring r)
145{
146  p_CheckPolyRing(p, r);
147  Exponent_t e = p_GetExp(p,v,r);
148  e *= ee;
149  return p_SetExp(p,v,e,r);
150}
151
152PINLINE2 Exponent_t p_GetExpSum(poly p1, poly p2, int i, ring r)
153{
154  p_CheckPolyRing(p1, r);
155  p_CheckPolyRing(p2, r);
156  return p_GetExp(p1,i,r) + p_GetExp(p2,i,r);
157}
158PINLINE2 Exponent_t p_GetExpDiff(poly p1, poly p2, int i, ring r)
159{
160  return p_GetExp(p1,i,r) - p_GetExp(p2,i,r);
161}
162
163
164/***************************************************************
165 *
166 * Allocation/Initalization/Deletion
167 *
168 ***************************************************************/
169PINLINE2 poly p_New(ring r)
170{
171  p_CheckRing(r);
172  poly p;
173  omTypeAllocBin(poly, p, r->PolyBin);
174  p_SetRingOfPoly(p, r);
175  return p;
176}
177
178PINLINE2 void p_Delete1(poly *p, ring r)
179{
180  p_CheckIf(*p != NULL, p_CheckPolyRing(*p, r));
181  assume(r != NULL);
182  poly h = *p;
183  if (h != NULL)
184  {
185    p_nDelete(&_pGetCoeff(h), r);
186    *p = _pNext(h);
187    omFreeBinAddr(h);
188  }
189
190}
191PINLINE2 void p_Free(poly p, ring r)
192{
193  p_CheckPolyRing(p, r);
194  omFreeBinAddr(p);
195}
196PINLINE2 poly p_FreeAndNext(poly p, ring r)
197{
198  p_CheckPolyRing(p, r);
199  poly pnext = _pNext(p);
200  omFreeBinAddr(p);
201  return pnext;
202}
203PINLINE2 void p_LmDelete(poly p, ring r)
204{
205  p_CheckPolyRing(p, r);
206  p_nDelete(&_pGetCoeff(p), r);
207  omFreeBinAddr(p);
208}
209PINLINE2 poly p_LmDeleteAndNext(poly p, ring r)
210{
211  p_CheckPolyRing(p, r);
212  poly pnext = _pNext(p);
213  p_nDelete(&_pGetCoeff(p), r);
214  omFreeBinAddr(p);
215  return pnext;
216}
217
218/***************************************************************
219 *
220 * Misc routines
221 *
222 ***************************************************************/
223PINLINE2 int p_Cmp(poly p1, poly p2, ring r)
224{
225  if (p2==NULL)
226    return 1;
227  if (p1==NULL)
228    return -1;
229  return p_LmCmp(p1,p2,r);
230}
231
232/***************************************************************
233 *
234 * Dispatcher to r->p_Procs
235 *
236 ***************************************************************/
237// returns a copy of p
238PINLINE2 poly p_Copy(poly p, const ring r)
239{
240  assume(r != NULL && r->p_Procs != NULL);
241  return r->p_Procs->p_Copy(p, r);
242}
243
244// deletes *p, and sets *p to NULL
245PINLINE2 void p_Delete(poly *p, const ring r)
246{
247  assume(r != NULL && r->p_Procs != NULL);
248  r->p_Procs->p_Delete(p, r);
249}
250
251// returns p+q, destroys p and q
252PINLINE2 poly p_Add_q(poly p, poly q, const ring r)
253{
254  int shorter;
255  assume(r != NULL && r->p_Procs != NULL);
256  return r->p_Procs->p_Add_q(p, q, shorter, r);
257}
258
259PINLINE2 poly p_Add_q(poly p, poly q, int &lp, int lq, const ring r)
260{
261  int shorter;
262  poly res = r->p_Procs->p_Add_q(p, q, shorter, r);
263  lp = (lp + lq) - shorter;
264  return res;
265}
266
267// returns p*n, destroys p
268PINLINE2 poly p_Mult_nn(poly p, number n, const ring r)
269{
270  assume(r != NULL && r->p_Procs != NULL);
271  return r->p_Procs->p_Mult_nn(p, n, r);
272}
273
274// returns p*n, does not destroy p
275PINLINE2 poly pp_Mult_nn(poly p, number n, const ring r)
276{
277  assume(r != NULL && r->p_Procs != NULL);
278  return r->p_Procs->pp_Mult_nn(p, n, r);
279}
280
281// returns Copy(p)*m, does neither destroy p nor m
282PINLINE2 poly pp_Mult_mm(poly p, poly m, const ring r)
283{
284  assume(r != NULL && r->p_Procs != NULL);
285  return r->p_Procs->pp_Mult_mm(p, m, NULL, r);
286}
287
288// returns p*m, destroys p, const: m
289PINLINE2 poly p_Mult_mm(poly p, poly m, const ring r)
290{
291  assume(r != NULL && r->p_Procs != NULL);
292  return r->p_Procs->p_Mult_mm(p, m, r);
293}
294
295// return p - m*Copy(q), destroys p; const: p,m
296PINLINE2 poly p_Minus_mm_Mult_qq(poly p, poly m, poly q, const ring r)
297{
298  int shorter;
299  assume(r != NULL && r->p_Procs != NULL);
300  return r->p_Procs->p_Minus_mm_Mult_qq(p, m, q, shorter, NULL, r);
301}
302PINLINE2 poly p_Minus_mm_Mult_qq(poly p, poly m, poly q, int &lp, int lq, 
303                                 poly spNoether, const ring r)
304{
305  int shorter;
306  poly res = r->p_Procs->p_Minus_mm_Mult_qq(p, m, q, shorter, spNoether, r);
307  lp = (lp + lq) - shorter;
308  return res;
309}
310 
311// returns -p, destroys p
312PINLINE2 poly p_Neg(poly p, const ring r)
313{
314  assume(r != NULL && r->p_Procs != NULL);
315  return r->p_Procs->p_Neg(p, r);
316}
317
318extern poly  _p_Mult_q(poly p, poly q, const int copy, const ring r);
319// returns p*q, destroys p and q
320PINLINE2 poly p_Mult_q(poly p, poly q, const ring r)
321{
322  if (p == NULL) 
323  {
324    r->p_Procs->p_Delete(&q, r);
325    return NULL;
326  }
327  if (q == NULL)
328  {
329    r->p_Procs->p_Delete(&p, r);
330    return NULL;
331  }
332
333  if (pNext(p) == NULL)
334  {
335   
336    q = r->p_Procs->p_Mult_mm(q, p, r);
337    r->p_Procs->p_Delete(&p, r);
338    return q;
339  }
340 
341  if (pNext(q) == NULL)
342  {
343    p = r->p_Procs->p_Mult_mm(p, q, r);
344    r->p_Procs->p_Delete(&q, r);
345    return p;
346  }
347 
348  return _p_Mult_q(p, q, 0, r);
349}
350
351BOOLEAN pEqualPolys(poly p1,poly p2);
352// returns p*q, does neither destroy p nor q
353PINLINE2 poly pp_Mult_qq(poly p, poly q, const ring r)
354{
355  if (p == NULL || q == NULL) return NULL;
356
357  if (pNext(p) == NULL)
358    return r->p_Procs->pp_Mult_mm(q, p, NULL, r);
359 
360  if (pNext(q) == NULL)
361    return r->p_Procs->pp_Mult_mm(p, q, NULL, r);
362
363  poly qq = q;
364  if (p == q)
365    qq = p_Copy(q, r);
366   
367  poly res = _p_Mult_q(p, qq, 1, r);
368  if (qq != q)
369    p_Delete(&qq, r);
370  return res;
371}
372
373// returns p + m*q destroys p, const: q, m
374// this should be implemented more efficiently
375PINLINE2 poly p_Plus_mm_Mult_qq(poly p, poly m, poly q, const ring r)
376{
377  poly res;
378  int shorter;
379  number n_old = pGetCoeff(m);
380  number n_neg = p_nCopy(n_old, r);
381  n_neg = p_nNeg(n_neg, r);
382  pSetCoeff0(m, n_neg);
383 
384  res = r->p_Procs->p_Minus_mm_Mult_qq(p, m, q, shorter, NULL, r);
385  pSetCoeff0(m, n_old);
386  p_nDelete(&n_neg, r);
387  return res;
388}
389
390
391#endif // !defined(NO_PINLINE2) || defined(POLYS_IMPL_CC)
392#endif // PINLINE2_H
393
Note: See TracBrowser for help on using the repository browser.