source: git/kernel/prCopy.cc @ 83bde7

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