source: git/libpolys/polys/prCopy.cc @ 85bcd6

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