source: git/kernel/prCopy.cc @ cdec33

spielwiese
Last change on this file since cdec33 was 132ea1, checked in by Hans Schoenemann <hannes@…>, 13 years ago
code cleanup: idrCopy git-svn-id: file:///usr/local/Singular/svn/trunk@13711 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.7 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 <kernel/mod2.h>
10#include <omalloc/omalloc.h>
11#include <kernel/p_polys.h>
12#include <kernel/numbers.h>
13#include <kernel/structs.h>
14#include <kernel/ring.h>
15#include <kernel/ideals.h>
16#include <kernel/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 <kernel/prCopy.inc>
33
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 = currRing)
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  poly p;
149  ideal res = idInit(IDELEMS(id), id->rank);
150  int i;
151
152  for (i=IDELEMS(id)-1; i>=0; i--)
153  {
154    p = id->m[i];
155    res->m[i] = prproc(p, src_r, dest_r);
156    p_Test(res->m[i], dest_r);
157  }
158  return res;
159}
160
161ideal idrCopyR(ideal id, ring src_r, ring dest_r)
162{
163  ideal res;
164  prCopyProc_t prproc;
165  if (rField_has_simple_Alloc(dest_r))
166    prproc = pr_Copy_NoREqual_NSimple_Sort;
167  else
168    prproc = pr_Copy_NoREqual_NoNSimple_Sort;
169  res =  idrCopy(id, src_r, dest_r, prproc);
170  return res;
171}
172
173ideal idrCopyR_NoSort(ideal id, ring src_r, ring dest_r)
174{
175  ideal res;
176  prCopyProc_t prproc;
177  if (rField_has_simple_Alloc(dest_r))
178    prproc = pr_Copy_NoREqual_NSimple_NoSort;
179  else
180    prproc = pr_Copy_NoREqual_NoNSimple_NoSort;
181  res =  idrCopy(id, src_r, dest_r, prproc);
182  return res;
183}
184
185/////////////////////////////////////////////////////////////////////////
186// idrShallowCopy
187ideal idrShallowCopyR(ideal id, ring src_r, ring dest_r)
188{
189  return idrCopy(id, src_r, dest_r, pr_Copy_NoREqual_NSimple_Sort);
190}
191
192ideal idrShallowCopyR_NoSort(ideal id, ring src_r, ring dest_r)
193{
194  return idrCopy(id, src_r, dest_r, pr_Copy_NoREqual_NSimple_NoSort);
195}
196
197/////////////////////////////////////////////////////////////////////////
198// idrMove
199static inline ideal
200idrMove(ideal &id, ring src_r, ring dest_r, prCopyProc_t prproc)
201{
202  if (id == NULL) return NULL;
203  ideal res = id;
204
205  int i;
206  for (i=IDELEMS(id)-1; i>=0; i--)
207    res->m[i] = prproc(id->m[i], src_r, dest_r);
208  id = NULL;
209  return res;
210}
211
212ideal idrMoveR(ideal &id, ring src_r, ring dest_r)
213{
214  prCopyProc_t prproc;
215  ideal res;
216  if (rField_has_simple_Alloc(dest_r))
217    prproc = pr_Move_NoREqual_NSimple_Sort;
218  else
219    prproc = pr_Move_NoREqual_NoNSimple_Sort;
220  res =  idrMove(id, src_r, dest_r, prproc);
221  return res;
222}
223
224ideal idrMoveR_NoSort(ideal &id, ring src_r, ring dest_r)
225{
226  prCopyProc_t prproc;
227  ideal res;
228  if (rField_has_simple_Alloc(dest_r))
229    prproc = pr_Move_NoREqual_NSimple_NoSort;
230  else
231    prproc = pr_Move_NoREqual_NoNSimple_NoSort;
232  res =  idrMove(id, src_r, dest_r, prproc);
233  return res;
234}
235
236
Note: See TracBrowser for help on using the repository browser.