source: git/Singular/pcv.cc @ 90cac2

fieker-DuValspielwiese
Last change on this file since 90cac2 was 90cac2, checked in by Hans Schönemann <hannes@…>, 25 years ago
*hannes: fixed declaration (compatiblity issue) git-svn-id: file:///usr/local/Singular/svn/trunk@2958 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.3 KB
Line 
1/*****************************************
2*  Computer Algebra System SINGULAR      *
3*****************************************/
4/* $Id: pcv.cc,v 1.17 1999-03-19 11:09:42 Singular Exp $ */
5/*
6* ABSTRACT: conversion between polys and coef vectors
7*/
8
9#include "mod2.h"
10#include "tok.h"
11#include "ipid.h"
12#include "numbers.h"
13#include "polys.h"
14#include "lists.h"
15#include "febase.h"
16#include "pcv.h"
17
18static int pcvDegBound;
19static int pcvTableSize;
20static int pcvIndexSize;
21static unsigned* pcvTable=NULL;
22static unsigned** pcvIndex=NULL;
23
24int pcvDeg(poly p)
25{
26  int dp=0;
27  for(int i=1;i<=pVariables;i++) dp+=pGetExp(p,i);
28  return dp;
29}
30
31int pcvMinDeg(poly p)
32{
33  if(!p) return 0;
34  int md=pcvDeg(p);
35  pIter(p);
36  while(p)
37  {
38    int d=pcvDeg(p);
39    if(d<md) md=d;
40    pIter(p);
41  }
42  return md;
43}
44
45int pcvMaxDeg(poly p)
46{
47  if(!p) return 0;
48  int md=pcvDeg(p);
49  pIter(p);
50  while(p)
51  {
52    int d=pcvDeg(p);
53    if(d>md) md=d;
54    pIter(p);
55  }
56  return md;
57}
58
59BOOLEAN pcvMinDeg(leftv res,leftv h)
60{
61  if(h)
62  {
63    if(h->Typ()==POLY_CMD)
64    {
65      res->rtyp=INT_CMD;
66      res->data=(void*)pcvMinDeg((poly)h->Data());
67      return FALSE;
68    }
69  }
70  WerrorS("<poly> expected");
71  return TRUE;
72}
73
74BOOLEAN pcvMaxDeg(leftv res,leftv h)
75{
76  if(h)
77  {
78    if(h->Typ()==POLY_CMD)
79    {
80      res->rtyp=INT_CMD;
81      res->data=(void*)pcvMaxDeg((poly)h->Data());
82      return FALSE;
83    }
84  }
85  WerrorS("<poly> expected");
86  return TRUE;
87}
88
89void pcvInit(int d)
90{
91  if(d<0) d=0;
92  pcvDegBound=d;
93  pcvTableSize=pVariables*pcvDegBound*sizeof(unsigned);
94  pcvTable=(unsigned*)Alloc0(pcvTableSize);
95  pcvIndexSize=pVariables*sizeof(unsigned*);
96  pcvIndex=(unsigned**)Alloc(pcvIndexSize);
97  int i;
98  for(i=0;i<pVariables;i++)
99    pcvIndex[i]=pcvTable+i*pcvDegBound;
100  for(i=0;i<pcvDegBound;i++)
101    pcvIndex[0][i]=i;
102  for(i=1;i<pVariables;i++)
103  {
104    unsigned x=0;
105    for(int j=0;j<pcvDegBound;j++)
106    {
107      x+=pcvIndex[i-1][j];
108      pcvIndex[i][j]=x;
109    }
110  }
111}
112
113void pcvClean()
114{
115  if(pcvTable)
116  {
117    Free(pcvTable,pcvTableSize);
118    pcvTable=NULL;
119  }
120  if(pcvIndex)
121  {
122    Free(pcvIndex,pcvIndexSize);
123    pcvIndex=NULL;
124  }
125}
126
127int pcvM2N(poly m)
128{
129  unsigned n=0,d=0;
130  for(int i=0;i<pVariables;i++)
131  {
132    d+=pGetExp(m,i+1);
133    n+=pcvIndex[i][d];
134  }
135  return n+1;
136}
137
138poly pcvN2M(int n)
139{
140  n--;
141  poly m=pOne();
142  int i,j,k;
143  for(i=pVariables-1;i>=0;i--)
144  {
145    k=j;
146    for(j=0;j<pcvDegBound&&pcvIndex[i][j]<=n;j++);
147    j--;
148    n-=pcvIndex[i][j];
149    if(i<pVariables-1) pSetExp(m,i+2,k-j);
150  }
151  if(n==0)
152  {
153    pSetExp(m,1,j);
154    pSetm(m);
155    return m;
156  }
157  else
158  {
159    pDelete1(&m);
160    return NULL;
161  }
162}
163
164poly pcvP2CV(poly p,int d0,int d1)
165{
166  poly cv=NULL;
167  while(p)
168  {
169    int d=pcvDeg(p);
170    if(d0<=d&&d<d1)
171    {
172      poly c=pOne();
173      pSetComp(c,pcvM2N(p));
174      pSetCoeff(c,nCopy(pGetCoeff(p)));
175      cv=pAdd(cv,c);
176    }
177    pIter(p);
178  }
179  return cv;
180}
181
182poly pcvCV2P(poly cv,int d0,int d1)
183{
184  poly p=NULL;
185  while(cv)
186  {
187    poly m=pcvN2M(pGetComp(cv));
188    if(m)
189    {
190      int d=pcvDeg(m);
191      if(d0<=d&&d<d1)
192      {
193        pSetCoeff(m,nCopy(pGetCoeff(cv)));
194        p=pAdd(p,m);
195      }
196    }
197    pIter(cv);
198  }
199  return p;
200}
201
202lists pcvP2CV(lists pl,int d0,int d1)
203{
204  lists cvl=(lists)Alloc(sizeof(slists));
205  cvl->Init(pl->nr+1);
206  pcvInit(d1);
207  for(int i=pl->nr;i>=0;i--)
208  {
209    if(pl->m[i].rtyp==POLY_CMD)
210    {
211      cvl->m[i].rtyp=VECTOR_CMD;
212      cvl->m[i].data=pcvP2CV((poly)pl->m[i].data,d0,d1);
213    }
214  }
215  pcvClean();
216  return cvl;
217}
218
219lists pcvCV2P(lists cvl,int d0,int d1)
220{
221  lists pl=(lists)Alloc(sizeof(slists));
222  pl->Init(cvl->nr+1);
223  pcvInit(d1);
224  for(int i=cvl->nr;i>=0;i--)
225  {
226    if(cvl->m[i].rtyp==VECTOR_CMD)
227    {
228      pl->m[i].rtyp=POLY_CMD;
229      pl->m[i].data=pcvCV2P((poly)cvl->m[i].data,d0,d1);
230    }
231  }
232  pcvClean();
233  return pl;
234}
235
236BOOLEAN pcvP2CV(leftv res,leftv h)
237{
238  if(currRingHdl)
239  {
240    if(h&&h->Typ()==LIST_CMD)
241    {
242      lists pl=(lists)h->Data();
243      h=h->next;
244      if(h&&h->Typ()==INT_CMD)
245      {
246        int d0=(int)h->Data();
247        h=h->next;
248        if(h&&h->Typ()==INT_CMD)
249        {
250          int d1=(int)h->Data();
251          res->rtyp=LIST_CMD;
252          res->data=pcvP2CV(pl,d0,d1);
253          return FALSE;
254        }
255      }
256    }
257    WerrorS("<list>,<int>,<int> expected");
258    return TRUE;
259  }
260  WerrorS("no ring active");
261  return TRUE;
262}
263
264BOOLEAN pcvCV2P(leftv res,leftv h)
265{
266  if(currRingHdl)
267  {
268    if(h&&h->Typ()==LIST_CMD)
269    {
270      lists pl=(lists)h->Data();
271      h=h->next;
272      if(h&&h->Typ()==INT_CMD)
273      {
274        int d0=(int)h->Data();
275        h=h->next;
276        if(h&&h->Typ()==INT_CMD)
277        {
278          int d1=(int)h->Data();
279          res->rtyp=LIST_CMD;
280          res->data=pcvCV2P(pl,d0,d1);
281          return FALSE;
282        }
283      }
284    }
285    WerrorS("<list>,<int>,<int> expected");
286    return TRUE;
287  }
288  WerrorS("no ring active");
289  return TRUE;
290}
291
292int pcvDim(int d0,int d1)
293{
294  if(d0<0) d0=0;
295  if(d1<0) d1=0;
296  pcvInit(d1+1);
297  int d=pcvIndex[pVariables-1][d1]-pcvIndex[pVariables-1][d0];
298  pcvClean();
299  return d;
300}
301
302BOOLEAN pcvDim(leftv res,leftv h)
303{
304  if(currRingHdl)
305  {
306    if(h&&h->Typ()==INT_CMD)
307    {
308      int d0=(int)h->Data();
309      h=h->next;
310      if(h&&h->Typ()==INT_CMD)
311      {
312        int d1=(int)h->Data();
313        res->rtyp=INT_CMD;
314        res->data=(void*)pcvDim(d0,d1);
315        return FALSE;
316      }
317    }
318    WerrorS("<int>,<int> expected");
319    return TRUE;
320  }
321  WerrorS("no ring active");
322  return TRUE;
323}
324
325int pcvBasis(lists b,int i,poly m,int d,int n)
326{
327  if(n<pVariables)
328  {
329    for(int k=0,l=d;k<=l;k++,d--)
330    {
331      pSetExp(m,n,k);
332      i=pcvBasis(b,i,m,d,n+1);
333    }
334  }
335  else
336  {
337    pSetExp(m,n,d);
338    pSetm(m);
339    b->m[i].rtyp=POLY_CMD;
340    b->m[i++].data=pCopy(m);
341  }
342  return i;
343}
344
345lists pcvBasis(int d0,int d1)
346{
347  if(d0<0) d0=0;
348  if(d1<0) d1=0;
349  lists b=(lists)Alloc(sizeof(slists));
350  b->Init(pcvDim(d0,d1));
351  poly m=pOne();
352  for(int d=d0,i=0;d<d1;d++)
353    i=pcvBasis(b,i,m,d,1);
354  pDelete1(&m);
355  return b;
356}
357
358BOOLEAN pcvBasis(leftv res,leftv h)
359{
360  if(currRingHdl)
361  {
362    if(h&&h->Typ()==INT_CMD)
363    {
364      int d0=(int)h->Data();
365      h=h->next;
366      if(h&&h->Typ()==INT_CMD)
367      {
368        int d1=(int)h->Data();
369        res->rtyp=LIST_CMD;
370        res->data=pcvBasis(d0,d1);
371        return FALSE;
372      }
373    }
374    WerrorS("<int>,<int> expected");
375    return TRUE;
376  }
377  WerrorS("no ring active");
378  return TRUE;
379}
Note: See TracBrowser for help on using the repository browser.