source: git/Singular/prCopy.cc @ ec3ab8

fieker-DuValspielwiese
Last change on this file since ec3ab8 was c232af, checked in by Olaf Bachmann <obachman@…>, 24 years ago
* omalloc stuff git-svn-id: file:///usr/local/Singular/svn/trunk@4524 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 7.6 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: prCopy.cc,v 1.3 2000-08-14 12:56:46 obachman Exp $ */
5/*
6* ABSTRACT - implementation of functions for Copy/Move/Delete for Polys
7*/
8
9#include "mod2.h"
10#include <omalloc.h>
11#include "polys.h"
12#include "numbers.h"
13#include "tok.h"
14#include "ring.h"
15#include "ideals.h"
16#include "polys-comp.h"
17
18
19/////////////////////////////////////////////////////////////////////////
20// prSort prMerge
21
22poly prMergeR(poly p1, poly p2, ring r)
23{
24  if (p1 == NULL) return p2;
25  if (p2 == NULL) return p1;
26 
27  spolyrec rp;
28  poly p = &rp;
29 
30  Top:
31  _prMonCmp(p1, p2, r, goto Equal, goto Greater, goto Smaller);
32 
33  Equal:
34  // should never get here
35  assume(0);
36
37  Greater:
38  pNext(p) = p1;
39  if (pNext(p1) != NULL)
40  {
41    pIter(p);
42    pIter(p1);
43    goto Top;
44  }
45  pNext(p1) = p2;
46  goto Finish;
47 
48  Smaller:
49  pNext(p) = p2;
50  if (pNext(p2) != NULL)
51  {
52    pIter(p);
53    pIter(p2);
54    goto Top;
55  }
56  pNext(p2) = p1;
57  goto Finish;
58 
59  Finish:
60  assume(prTest(pNext(&rp), r));
61  return pNext(&rp);
62}
63 
64// Sorts poly, reverts it first -- this way, almost sorted polys's
65// don't have n^2 sorting property
66poly prSortR(poly p, ring r, BOOLEAN revert)
67{
68  if (p == NULL) return NULL;
69  poly qq, result = NULL;
70  int *lp = NULL, lq = 0;
71 
72  if (revert)
73  {
74    while (p != NULL)
75    {
76      qq = p;
77      pIter(p);
78      qq->next = result;
79      result = qq;
80    }
81    p = result;
82  }
83 
84  result = p;
85  pIter(p);
86  pNext(result) = NULL;
87  while (p != NULL)
88  {
89    qq = p;
90    pIter(p);
91    qq->next = NULL;
92    result = prMergeR(result, qq, r);
93  }
94  prTest(result, r);
95  return result;
96}
97
98static inline void 
99prCopyEvector(poly dest, ring dest_r, poly src, ring src_r,int max)
100{
101  assume(dest_r == currRing);
102  int i=0;
103  for (i=max; i; i--)
104  {
105    pRingSetExp(dest_r, dest, i, pRingGetExp(src_r, src, i));
106  }
107  pSetComp(dest, pRingGetComp(src_r, src));
108  pSetm(dest);
109}
110
111#include "prCopy.inc"
112
113/////////////////////////////////////////////////////////////////////////
114// prCopy
115poly prCopy(poly p)
116{
117  poly res;
118 
119  if (rField_has_simple_Alloc(currRing))
120    res = pr_Copy_REqual_NSimple_NoSort(p, currRing, currRing);
121  else
122    res = pr_Copy_REqual_NoNSimple_NoSort(p, currRing, currRing);
123  assume(pTest(res));
124  return res;
125}
126
127poly prCopyR(poly p, ring src_r)
128{
129  poly res;
130  if (rField_has_simple_Alloc(currRing))
131    res =  pr_Copy_NoREqual_NSimple_Sort(p, src_r, currRing);
132  else
133    res =  pr_Copy_NoREqual_NoNSimple_Sort(p, src_r, currRing);
134  assume(pTest(res));
135  return res;
136}
137
138poly prCopyR_NoSort(poly p, ring src_r)
139{
140  poly res;
141  if (rField_has_simple_Alloc(currRing))
142    res =  pr_Copy_NoREqual_NSimple_NoSort(p, src_r, currRing);
143  else
144    res =  pr_Copy_NoREqual_NoNSimple_NoSort(p, src_r, currRing);
145  assume(pTest(res));
146  return res;
147}
148
149/////////////////////////////////////////////////////////////////////////
150// prMove
151poly prMoveR(poly &p, ring src_r)
152{
153  poly res;
154  if (rField_has_simple_Alloc(currRing))
155    res =  pr_Move_NoREqual_NSimple_Sort(p, src_r, currRing);
156  else
157    res =  pr_Move_NoREqual_NoNSimple_Sort(p, src_r, currRing);
158  assume(pTest(res));
159  return res;
160}
161
162poly prMoveR_NoSort(poly &p, ring src_r)
163{
164  poly res;
165  if (rField_has_simple_Alloc(currRing))
166    res =  pr_Move_NoREqual_NSimple_NoSort(p, src_r, currRing);
167  else
168    res =  pr_Move_NoREqual_NoNSimple_NoSort(p, src_r, currRing);
169  assume(pTest(res)); 
170  return res;
171}
172 
173/////////////////////////////////////////////////////////////////////////
174// prHead
175typedef poly (*prCopyProc_t)(poly &src_p, ring src_r, ring dest_r);
176
177poly prHeadR(poly p, ring src_r, prCopyProc_t prproc)
178{
179  if (p == NULL) return NULL;
180  poly tail, head, q = p;
181  tail = pNext(p);
182  pNext(p) = NULL;
183  head = prproc(q, src_r, currRing);
184  pNext(p) = tail;
185  return head;
186}
187
188poly prHeadR(poly p, ring src_r)
189{
190  prCopyProc_t prproc;
191  if (rField_has_simple_Alloc(currRing)) 
192    prproc = pr_Copy_NoREqual_NSimple_NoSort;
193  else
194    prproc = pr_Copy_NoREqual_NoNSimple_NoSort; 
195 
196  return prHeadR(p, src_r, prproc);
197}
198
199/////////////////////////////////////////////////////////////////////////
200// idrCopy
201static inline ideal
202idrCopy(ideal id, ring src_r, ring dest_r, prCopyProc_t prproc)
203{
204  if (id == NULL) return NULL;
205  poly p;
206  ideal res = idInit(IDELEMS(id), id->rank);
207  int i;
208 
209  for (i=IDELEMS(id)-1; i>=0; i--)
210  {
211    p = id->m[i];
212    res->m[i] = prproc(p, src_r, dest_r);
213    assume(pTest(res->m[i]));
214  }
215  return res;
216}
217
218ideal idrCopy(ideal id)
219{
220  ideal res;
221  prCopyProc_t prproc;
222  if (rField_has_simple_Alloc(currRing)) 
223    prproc = pr_Copy_REqual_NSimple_NoSort;
224  else
225    prproc = pr_Copy_REqual_NoNSimple_NoSort;
226  res =  idrCopy(id, currRing, currRing, prproc);
227  return res;
228}
229
230ideal idrCopyR(ideal id, ring src_r)
231{
232  ideal res;
233  prCopyProc_t prproc;
234  if (rField_has_simple_Alloc(currRing)) 
235    prproc = pr_Copy_NoREqual_NSimple_Sort;
236  else
237    prproc = pr_Copy_NoREqual_NoNSimple_Sort;
238  res =  idrCopy(id, src_r, currRing, prproc);
239  return res;
240}
241 
242ideal idrCopyR_NoSort(ideal id, ring src_r)
243{
244  ideal res;
245  prCopyProc_t prproc;
246  if (rField_has_simple_Alloc(currRing)) 
247    prproc = pr_Copy_NoREqual_NSimple_NoSort;
248  else
249    prproc = pr_Copy_NoREqual_NoNSimple_NoSort;
250  res =  idrCopy(id, src_r, currRing, prproc);
251  return res;
252}
253 
254/////////////////////////////////////////////////////////////////////////
255// idrMove
256static inline ideal
257idrMove(ideal &id, ring src_r, ring dest_r, prCopyProc_t prproc)
258{
259  if (id == NULL) return NULL;
260  ideal res = id;
261 
262  int i;
263  for (i=IDELEMS(id)-1; i>=0; i--)
264    res->m[i] = prproc(id->m[i], src_r, dest_r);
265  id = NULL;
266  return res;
267}
268
269ideal idrMoveR(ideal &id, ring src_r)
270{
271  prCopyProc_t prproc;
272  ideal res;
273 
274  if (rField_has_simple_Alloc(currRing)) 
275    prproc = pr_Move_NoREqual_NSimple_Sort;
276  else
277    prproc = pr_Move_NoREqual_NoNSimple_Sort;
278  res =  idrMove(id, src_r, currRing, prproc);
279  return res;
280}
281 
282ideal idrMoveR_NoSort(ideal &id, ring src_r)
283{
284  prCopyProc_t prproc;
285  ideal res;
286 
287  if (rField_has_simple_Alloc(currRing)) 
288    prproc = pr_Move_NoREqual_NSimple_NoSort;
289  else
290    prproc = pr_Move_NoREqual_NoNSimple_NoSort;
291  res =  idrMove(id, src_r, currRing, prproc);
292  return res;
293}
294
295/////////////////////////////////////////////////////////////////////////
296// prDelete
297typedef void (*prDeleteProc_t)(poly &src_p, ring src_r);
298
299static inline void prDeleteR_NSimple(poly &p, ring r)
300{
301  poly next;
302 
303  while (p != NULL)
304  {
305    next = pNext(p);
306    omFreeBin(p, r->PolyBin);
307    p = next;
308  }
309}
310
311static inline void prDeleteR_NoNSimple(poly &p, ring r)
312{
313  poly next;
314 
315  while (p != NULL)
316  {
317    next = pNext(p);
318    nDelete(&pGetCoeff(p));
319    omFreeBin(p, r->PolyBin);
320    p = next;
321  }
322}
323
324void prDelete(poly &p)
325{
326  if (rField_has_simple_Alloc(currRing))
327    prDeleteR_NSimple(p, currRing);
328  else
329    prDeleteR_NoNSimple(p, currRing);
330}
331
332void prDeleteR(poly &p, ring r)
333{
334  if (rField_has_simple_Alloc(r))
335    prDeleteR_NSimple(p, r);
336  else
337    prDeleteR_NoNSimple(p, r);
338}
339
340
341static inline void idrDelete(ideal &id, ring r,  prDeleteProc_t prproc)
342{
343  if (id == NULL) return;
344  int i = IDELEMS(id);
345
346  for (; i>=0; i--)
347    prproc(id->m[i], r);
348 
349  omFreeSize(id->m, IDELEMS(id)*sizeof(poly));
350  omFreeBin(id, sip_sideal_bin);
351  id = NULL;
352}
353
354void idrDelete(ideal &id)
355{
356  prDeleteProc_t prproc;
357  if (rField_has_simple_Alloc(currRing))
358    prproc = prDeleteR_NSimple;
359  else
360    prproc = prDeleteR_NoNSimple;
361 
362  idrDelete(id, currRing, prproc);
363}
364
365void idrDeleteR(ideal &id, ring r)
366{
367  prDeleteProc_t prproc;
368  if (rField_has_simple_Alloc(r))
369    prproc = prDeleteR_NSimple;
370  else
371    prproc = prDeleteR_NoNSimple;
372 
373  idrDelete(id, r, prproc);
374}
375
376 
377 
378 
Note: See TracBrowser for help on using the repository browser.