source: git/libpolys/polys/prCopy.cc @ 14a0ca

spielwiese
Last change on this file since 14a0ca was 16f511, checked in by Oleksandr Motsak <motsak@…>, 11 years ago
Fixed the usage of "config.h" (if defined HAVE_CONFIG_H)
  • Property mode set to 100644
File size: 6.0 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT - implementation of functions for Copy/Move/Delete for Polys
6*/
7
8#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif /* HAVE_CONFIG_H */
11#include <omalloc/omalloc.h>
12#include <polys/monomials/ring.h>
13#include <polys/monomials/p_polys.h>
14#include <coeffs/numbers.h>
15#include <polys/monomials/ring.h>
16#include <polys/simpleideals.h>
17// #include <polys/sbuckets.h>
18
19static inline void
20prCopyEvector(poly dest, ring dest_r, poly src, ring src_r,int max)
21{
22  //memset(dest->exp,0,dest_r->ExpL_Size*sizeof(long));
23  int i;
24  for (i=max; i>0; i--)
25  {
26    p_SetExp(dest, i, p_GetExp( src, i,src_r), dest_r);
27  }
28  if (rRing_has_Comp(dest_r) && rRing_has_Comp(src_r))
29    p_SetComp(dest, p_GetComp( src,src_r), dest_r);
30  p_Setm(dest, dest_r);
31}
32
33#include <polys/prCopy.inc>
34
35/////////////////////////////////////////////////////////////////////////
36poly prCopyR(poly p, ring src_r, ring dest_r)
37{
38  poly res;
39  if (rField_has_simple_Alloc(dest_r))
40    res =  pr_Copy_NoREqual_NSimple_Sort(p, src_r, dest_r);
41  else
42    res =  pr_Copy_NoREqual_NoNSimple_Sort(p, src_r, dest_r);
43  p_Test(res, dest_r);
44  return res;
45}
46
47poly prCopyR_NoSort(poly p, ring src_r, ring dest_r)
48{
49  poly res;
50  if (rField_has_simple_Alloc(dest_r))
51    res =  pr_Copy_NoREqual_NSimple_NoSort(p, src_r, dest_r);
52  else
53    res =  pr_Copy_NoREqual_NoNSimple_NoSort(p, src_r, dest_r);
54  p_Test(res, dest_r);
55  return res;
56}
57
58/////////////////////////////////////////////////////////////////////////
59// prMove
60poly prMoveR(poly &p, ring src_r, ring dest_r)
61{
62  poly res;
63  if (rField_has_simple_Alloc(dest_r))
64    res =  pr_Move_NoREqual_NSimple_Sort(p, src_r, dest_r);
65  else
66    res =  pr_Move_NoREqual_NoNSimple_Sort(p, src_r, dest_r);
67  p_Test(res, dest_r);
68  return res;
69}
70
71poly prMoveR_NoSort(poly &p, ring src_r, ring dest_r)
72{
73  poly res;
74  if (rField_has_simple_Alloc(dest_r))
75    res =  pr_Move_NoREqual_NSimple_NoSort(p, src_r, dest_r);
76  else
77    res =  pr_Move_NoREqual_NoNSimple_NoSort(p, src_r, dest_r);
78  p_Test(res, dest_r);
79  return res;
80}
81
82poly prShallowCopyR_NoSort(poly p, ring r, ring dest_r)
83{
84  return pr_Copy_NoREqual_NSimple_NoSort(p, r, dest_r);
85}
86
87poly prShallowCopyR(poly p, ring r, ring dest_r)
88{
89  return pr_Copy_NoREqual_NSimple_Sort(p, r, dest_r);
90}
91
92/////////////////////////////////////////////////////////////////////////
93// prHead
94typedef poly (*prCopyProc_t)(poly &src_p, ring src_r, ring dest_r);
95
96poly prHeadR(poly p, ring src_r, ring dest_r, prCopyProc_t prproc)
97{
98  if (p == NULL) return NULL;
99  poly tail, head, q = p;
100  tail = pNext(p);
101  pNext(p) = NULL;
102  head = prproc(q, src_r, dest_r);
103  pNext(p) = tail;
104
105  p_Test(p, src_r);
106  p_Test(head, dest_r);
107
108  return head;
109}
110
111poly prHeadR(poly p, ring src_r, ring dest_r)
112{
113  prCopyProc_t prproc;
114  if (rField_has_simple_Alloc(dest_r))
115    prproc = pr_Copy_NoREqual_NSimple_NoSort;
116  else
117    prproc = pr_Copy_NoREqual_NoNSimple_NoSort;
118
119  const poly res = prHeadR(p, src_r, dest_r, prproc);
120  p_Test(res, dest_r);
121  return res;
122}
123
124/////////////////////////////////////////////////////////////////////////
125/// Copy leading terms of id[i] via prHeeadR into dest_r
126ideal idrHeadR(ideal id, ring r, ring dest_r)
127{
128  if (id == NULL) return NULL;
129
130  prCopyProc_t prproc = pr_Copy_NoREqual_NoNSimple_NoSort;
131  if (rField_has_simple_Alloc(dest_r))
132    prproc = pr_Copy_NoREqual_NSimple_NoSort;
133
134  const int N = IDELEMS(id);
135  ideal res = idInit(N, id->rank);
136
137  for (int i = N - 1; i >= 0; i--)
138    res->m[i] = prHeadR(id->m[i], r, dest_r, prproc); // !!!
139
140  return res;
141}
142
143
144static inline ideal
145idrCopy(ideal id, ring src_r, ring dest_r, prCopyProc_t prproc)
146{
147  if (id == NULL) return NULL;
148  assume(src_r->cf==dest_r->cf);
149  poly p;
150  ideal res = idInit(IDELEMS(id), id->rank);
151  int i;
152
153  for (i=IDELEMS(id)-1; i>=0; i--)
154  {
155    p = id->m[i];
156    res->m[i] = prproc(p, src_r, dest_r);
157    p_Test(res->m[i], dest_r);
158  }
159  return res;
160}
161
162ideal idrCopyR(ideal id, ring src_r, ring dest_r)
163{
164  assume(src_r->cf==dest_r->cf);
165  ideal res;
166  prCopyProc_t prproc;
167  if (rField_has_simple_Alloc(dest_r))
168    prproc = pr_Copy_NoREqual_NSimple_Sort;
169  else
170    prproc = pr_Copy_NoREqual_NoNSimple_Sort;
171  res =  idrCopy(id, src_r, dest_r, prproc);
172  return res;
173}
174
175ideal idrCopyR_NoSort(ideal id, ring src_r, ring dest_r)
176{
177  assume(src_r->cf==dest_r->cf);
178  ideal res;
179  prCopyProc_t prproc;
180  if (rField_has_simple_Alloc(dest_r))
181    prproc = pr_Copy_NoREqual_NSimple_NoSort;
182  else
183    prproc = pr_Copy_NoREqual_NoNSimple_NoSort;
184  res =  idrCopy(id, src_r, dest_r, prproc);
185  return res;
186}
187
188/////////////////////////////////////////////////////////////////////////
189// idrShallowCopy
190ideal idrShallowCopyR(ideal id, ring src_r, ring dest_r)
191{
192  return idrCopy(id, src_r, dest_r, pr_Copy_NoREqual_NSimple_Sort);
193}
194
195ideal idrShallowCopyR_NoSort(ideal id, ring src_r, ring dest_r)
196{
197  return idrCopy(id, src_r, dest_r, pr_Copy_NoREqual_NSimple_NoSort);
198}
199
200/////////////////////////////////////////////////////////////////////////
201// idrMove
202static inline ideal
203idrMove(ideal &id, ring src_r, ring dest_r, prCopyProc_t prproc)
204{
205  assume(src_r->cf==dest_r->cf);
206  assume( prproc != NULL );
207   
208  if (id == NULL) return NULL;
209
210  ideal res = id; id = NULL;
211
212  for (int i = IDELEMS(res) - 1; i >= 0; i--)
213    res->m[i] = prproc(res->m[i], src_r, dest_r);
214   
215  return res;
216}
217
218ideal idrMoveR(ideal &id, ring src_r, ring dest_r)
219{
220  assume(src_r->cf==dest_r->cf);
221  prCopyProc_t prproc;
222  ideal res;
223  if (rField_has_simple_Alloc(dest_r))
224    prproc = pr_Move_NoREqual_NSimple_Sort;
225  else
226    prproc = pr_Move_NoREqual_NoNSimple_Sort;
227  res =  idrMove(id, src_r, dest_r, prproc);
228  return res;
229}
230
231ideal idrMoveR_NoSort(ideal &id, ring src_r, ring dest_r)
232{
233  assume(src_r->cf==dest_r->cf);
234  prCopyProc_t prproc;
235  ideal res;
236  if (rField_has_simple_Alloc(dest_r))
237    prproc = pr_Move_NoREqual_NSimple_NoSort;
238  else
239    prproc = pr_Move_NoREqual_NoNSimple_NoSort;
240  res =  idrMove(id, src_r, dest_r, prproc);
241  return res;
242}
243
244
Note: See TracBrowser for help on using the repository browser.