source: git/kernel/numbers.cc @ 6b9532

spielwiese
Last change on this file since 6b9532 was 35aab3, checked in by Hans Schönemann <hannes@…>, 21 years ago
This commit was generated by cvs2svn to compensate for changes in r6879, which included commits to RCS files with non-trunk default branches. git-svn-id: file:///usr/local/Singular/svn/trunk@6880 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 12.6 KB
Line 
1/*****************************************
2*  Computer Algebra System SINGULAR      *
3*****************************************/
4/* $Id: numbers.cc,v 1.1.1.1 2003-10-06 12:15:58 Singular Exp $ */
5
6/*
7* ABSTRACT: interface to coefficient aritmetics
8*/
9
10#include <string.h>
11#include <stdlib.h>
12#include "mod2.h"
13#include "structs.h"
14#include "febase.h"
15#include "kstd1.h"
16#include "numbers.h"
17#include "longrat.h"
18#include "longalg.h"
19#include "modulop.h"
20#include "gnumpfl.h"
21#include "gnumpc.h"
22#include "ring.h"
23#include "ffields.h"
24#include "shortfl.h"
25
26//static int characteristic = 0;
27extern int IsPrime(int p);
28
29void   (*nNew)(number *a);
30number (*nInit)(int i);
31number (*nPar)(int i);
32int    (*nParDeg)(number n);
33int    (*nSize)(number n);
34int    (*nInt)(number &n);
35numberfunc nMult, nSub, nAdd, nDiv, nIntDiv, nIntMod, nExactDiv;
36number (*nNeg)(number a);
37number (*nInvers)(number a);
38void   (*nNormalize)(number &a);
39number (*nCopy)(number a);
40number (*nRePart)(number a);
41number (*nImPart)(number a);
42BOOLEAN (*nGreater)(number a,number b);
43BOOLEAN (*nEqual)(number a,number b);
44BOOLEAN (*nIsZero)(number a);
45BOOLEAN (*nIsOne)(number a);
46BOOLEAN (*nIsMOne)(number a);
47BOOLEAN (*nGreaterZero)(number a);
48void    (*nWrite)(number &a);
49char *  (*nRead)(char *s,number *a);
50void    (*nPower)(number a, int i, number * result);
51number  (*nGcd)(number a, number b, const ring r);
52number  (*nLcm)(number a, number b, const ring r);
53char * (*nName)(number n);
54void   (*n__Delete)(number *a, const ring r);
55
56/*0 implementation*/
57number nNULL; /* the 0 as constant */
58
59
60n_Procs_s *cf_root=NULL;
61
62void   nDummy1(number* d) { *d=NULL; }
63void   ndDelete(number* d, const ring r) { *d=NULL; }
64void   ndInpMult(number &a, number b, const ring r)
65{
66  number n=n_Mult(a,b,r);
67  n_Delete(&a,r);
68  a=n;
69}
70
71#ifdef LDEBUG
72void   nDBDummy1(number* d,char *f, int l) { *d=NULL; }
73#endif
74
75void   nDummy2(number& d) { }
76
77char * ndName(number n) { return NULL; }
78
79number ndPar(int i) { return nInit(0); }
80
81number ndReturn0(number n) { return nInit(0); }
82
83int    ndParDeg(number n) { return 0; }
84
85number ndGcd(number a, number b, const ring r) { return r->cf->nInit(1); }
86
87number ndIntMod(number a, number b) { return nInit(0); }
88
89number ndGetDenom(number &n, const ring r) { return n_Init(1,r); }
90
91int ndSize(number a) { return (int)nIsZero(a)==FALSE; }
92
93number ndCopy(number a) { return a; }
94number nd_Copy(number a,const ring r) { return r->cf->nCopy(a); }
95
96/*2
97* init operations for characteristic c (complete==TRUE)
98* init nDelete    for characteristic c (complete==FALSE)
99*/
100void nSetChar(ring r)
101{
102  int c=rInternalChar(r);
103
104  n__Delete= r->cf->cfDelete;
105  if (rField_is_Extension(r))
106  {
107    naSetChar(c,r);
108  }
109  else if (rField_is_Zp(r))
110  /*----------------------char. p----------------*/
111  {
112    npSetChar(c, r);
113  }
114  /* -------------- GF(p^m) -----------------------*/
115  else if (rField_is_GF(r))
116  {
117    nfSetChar(c,r->parameter);
118  }
119  /* -------------- R -----------------------*/
120  //if (c==(-1))
121  else if (rField_is_R(r))
122  {
123  }
124  /* -------------- long R -----------------------*/
125  /* -------------- long C -----------------------*/
126  else if ((rField_is_long_R(r))
127  || (rField_is_long_C(r)))
128  {
129    setGMPFloatDigits(r->float_len,r->float_len2);
130  }
131#ifdef TEST
132  /* -------------- R -----------------------*/
133  //if (c==(-1))
134  else if (!rField_is_R(r) && !rField_is_Q(r))
135  {
136    WerrorS("unknown field");
137  }
138#endif
139  nNew   = r->cf->nNew;
140  nNormalize=r->cf->nNormalize;
141  nInit  = r->cf->nInit;
142  nPar   = r->cf->nPar;
143  nParDeg= r->cf->nParDeg;
144  nInt   = r->cf->nInt;
145  nAdd   = r->cf->nAdd;
146  nSub   = r->cf->nSub;
147  nMult  = r->cf->nMult;
148  nDiv   = r->cf->nDiv;
149  nExactDiv= r->cf->nExactDiv;
150  nIntDiv= r->cf->nIntDiv;
151  nIntMod= r->cf->nIntMod;
152  nNeg   = r->cf->nNeg;
153  nInvers= r->cf->nInvers;
154  nCopy  = r->cf->nCopy;
155  nGreater = r->cf->nGreater;
156  nEqual = r->cf->nEqual;
157  nIsZero = r->cf->nIsZero;
158  nIsOne = r->cf->nIsOne;
159  nIsMOne = r->cf->nIsMOne;
160  nGreaterZero = r->cf->nGreaterZero;
161  nWrite = r->cf->nWrite;
162  nRead = r->cf->nRead;
163  nPower = r->cf->nPower;
164  nGcd  = r->cf->nGcd;
165  nLcm  = r->cf->nLcm;
166  nName= r->cf->nName;
167  nSize  = r->cf->nSize;
168  nRePart = r->cf->nRePart;
169  nImPart = r->cf->nImPart;
170  if (!errorreported) nNULL=r->cf->nNULL;
171}
172
173/*2
174* init operations for ring r
175*/
176void nInitChar(ring r)
177{
178  int c=rInternalChar(r);
179  n_coeffType t=rFieldType(r);
180
181  if (rField_is_Extension(r))
182  {
183    if (r->algring==NULL)
184    {
185      int ch=-c;
186      if (c==1) ch=0;
187      r->algring=(ring) rDefault(ch,r->P,r->parameter);
188      //r->algring->ShortOut=r->ShortOut;
189      // includes: nInitChar(r->algring);
190    }
191  }
192
193  n_Procs_s *n=cf_root;
194  while((n!=NULL)
195    && ((n->nChar!=c) || (n->type!=t)))
196      n=n->next;
197  if (n==NULL)
198  {
199    n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
200    n->next=cf_root;
201    n->ref=1;
202    n->nChar=c;
203    n->type=t;
204    cf_root=n;
205  }
206  else if ((n->nChar==c) && (n->type==t))
207  {
208    n->ref++;
209    r->cf=n;
210    return;
211  }
212  else
213  {
214    WerrorS("nInitChar failed");
215    return;
216  }
217  r->cf=n;
218  n->nChar = c;
219  n->nPar  = ndPar;
220  n->nParDeg=ndParDeg;
221  n->nSize = ndSize;
222  n->n_GetDenom= ndGetDenom;
223  n->nName =  ndName;
224  n->nImPart=ndReturn0;
225  n->cfDelete= ndDelete;
226  n->nNew=nDummy1;
227  n->nInpMult=ndInpMult;
228  n->cfCopy=nd_Copy;
229  n->nIntMod=ndIntMod; /* dummy !! */
230  n->nNormalize=nDummy2;
231  n->nGcd  = ndGcd;
232  n->nLcm  = ndGcd; /* tricky, isn't it ?*/
233  if (rField_is_Extension(r))
234  {
235    //naInitChar(c,TRUE,r);
236    n->cfDelete = naDelete;
237    n-> nNew       = naNew;
238    n-> nNormalize = naNormalize;
239    n->nInit       = naInit;
240    n->nPar        = naPar;
241    n->nParDeg     = naParDeg;
242    n->nInt        = naInt;
243    n->nAdd        = naAdd;
244    n->nSub        = naSub;
245    n->nMult       = naMult;
246    n->nDiv        = naDiv;
247    n->nExactDiv   = naDiv;
248    n->nIntDiv     = naIntDiv;
249    n->nNeg        = naNeg;
250    n->nInvers     = naInvers;
251    n->nCopy       = naCopy;
252    n->cfCopy      = na_Copy;
253    n->nGreater    = naGreater;
254    n->nEqual      = naEqual;
255    n->nIsZero     = naIsZero;
256    n->nIsOne      = naIsOne;
257    n->nIsMOne     = naIsMOne;
258    n->nGreaterZero= naGreaterZero;
259    n->nWrite      = naWrite;
260    n->nRead       = naRead;
261    n->nPower      = naPower;
262    n->nGcd        = naGcd;
263    n->nLcm        = naLcm;
264    n->cfSetMap    = naSetMap;
265    n->nName       = naName;
266    n->nSize       = naSize;
267    n->n_GetDenom   = naGetDenom;
268#ifdef LDEBUG
269    //n->nDBTest     = naDBTest;
270#endif
271  }
272  else if (rField_is_Q(r))
273  {
274    n->cfDelete= nlDelete;
275    n->nNew   = nlNew;
276    n->nNormalize=nlNormalize;
277    n->nInit  = nlInit;
278    n->nInt   = nlInt;
279    n->nAdd   = nlAdd;
280    n->nSub   = nlSub;
281    n->nMult  = nlMult;
282    n->nInpMult=nlInpMult;
283    n->nDiv   = nlDiv;
284    n->nExactDiv= nlExactDiv;
285    n->nIntDiv= nlIntDiv;
286    n->nIntMod= nlIntMod;
287    n->nNeg   = nlNeg;
288    n->nInvers= nlInvers;
289    n->nCopy  = nlCopy;
290    n->nGreater = nlGreater;
291    n->nEqual = nlEqual;
292    n->nIsZero = nlIsZero;
293    n->nIsOne = nlIsOne;
294    n->nIsMOne = nlIsMOne;
295    n->nGreaterZero = nlGreaterZero;
296    n->nWrite = nlWrite;
297    n->nRead = nlRead;
298    n->nPower = nlPower;
299    n->nGcd  = nlGcd;
300    n->nLcm  = nlLcm;
301    n->cfSetMap = nlSetMap;
302    n->nSize  = nlSize;
303    n->n_GetDenom = nlGetDenom;
304#ifdef LDEBUG
305    //n->nDBTest=nlDBTest;
306#endif
307  }
308  else if (rField_is_Zp(r))
309  /*----------------------char. p----------------*/
310  {
311    npInitChar(c,r);
312    n->nInit  = npInit;
313    n->nInt   = npInt;
314    n->nAdd   = npAdd;
315    n->nSub   = npSub;
316    n->nMult  = npMult;
317    n->nDiv   = npDiv;
318    n->nExactDiv= npDiv;
319    n->nNeg   = npNeg;
320    n->nInvers= npInvers;
321    n->nCopy  = ndCopy;
322    n->nGreater = npGreater;
323    n->nEqual = npEqual;
324    n->nIsZero = npIsZero;
325    n->nIsOne = npIsOne;
326    n->nIsMOne = npIsMOne;
327    n->nGreaterZero = npGreaterZero;
328    n->nWrite = npWrite;
329    n->nRead = npRead;
330    n->nPower = npPower;
331    n->cfSetMap = npSetMap;
332    /* nName= ndName; */
333    /*nSize  = ndSize;*/
334#ifdef LDEBUG
335    //n->nDBTest=npDBTest;
336#endif
337#ifdef NV_OPS
338    if (c>NV_MAX_PRIME)
339    {
340      n->nMult  = nvMult;
341      n->nDiv   = nvDiv;
342      n->nExactDiv= nvDiv;
343      n->nInvers= nvInvers;
344    }
345#endif
346  }
347  /* -------------- GF(p^m) -----------------------*/
348  else if (rField_is_GF(r))
349  {
350    //nfSetChar(c,r->parameter);
351    n->nInit  = nfInit;
352    n->nPar   = nfPar;
353    n->nParDeg= nfParDeg;
354    n->nInt   = nfInt;
355    n->nAdd   = nfAdd;
356    n->nSub   = nfSub;
357    n->nMult  = nfMult;
358    n->nDiv   = nfDiv;
359    n->nExactDiv= nfDiv;
360    n->nNeg   = nfNeg;
361    n->nInvers= nfInvers;
362    n->nCopy  = ndCopy;
363    n->nGreater = nfGreater;
364    n->nEqual = nfEqual;
365    n->nIsZero = nfIsZero;
366    n->nIsOne = nfIsOne;
367    n->nIsMOne = nfIsMOne;
368    n->nGreaterZero = nfGreaterZero;
369    n->nWrite = nfWrite;
370    n->nRead = nfRead;
371    n->nPower = nfPower;
372    n->cfSetMap = nfSetMap;
373    n->nName= nfName;
374    /*nSize  = ndSize;*/
375#ifdef LDEBUG
376    //n->nDBTest=nfDBTest;
377#endif
378  }
379  /* -------------- R -----------------------*/
380  //if (c==(-1))
381  else if (rField_is_R(r))
382  {
383    n->nInit  = nrInit;
384    n->nInt   = nrInt;
385    n->nAdd   = nrAdd;
386    n->nSub   = nrSub;
387    n->nMult  = nrMult;
388    n->nDiv   = nrDiv;
389    n->nExactDiv= nrDiv;
390    n->nNeg   = nrNeg;
391    n->nInvers= nrInvers;
392    n->nCopy  = ndCopy;
393    n->nGreater = nrGreater;
394    n->nEqual = nrEqual;
395    n->nIsZero = nrIsZero;
396    n->nIsOne = nrIsOne;
397    n->nIsMOne = nrIsMOne;
398    n->nGreaterZero = nrGreaterZero;
399    n->nWrite = nrWrite;
400    n->nRead = nrRead;
401    n->nPower = nrPower;
402    n->cfSetMap=nrSetMap;
403    /* nName= ndName; */
404    /*nSize  = ndSize;*/
405#ifdef LDEBUG
406    //n->nDBTest=nrDBTest;
407#endif
408  }
409  /* -------------- long R -----------------------*/
410  else if (rField_is_long_R(r))
411  {
412    n->cfDelete= ngfDelete;
413    n->nNew=ngfNew;
414    n->nInit  = ngfInit;
415    n->nInt   = ngfInt;
416    n->nAdd   = ngfAdd;
417    n->nSub   = ngfSub;
418    n->nMult  = ngfMult;
419    n->nDiv   = ngfDiv;
420    n->nExactDiv= ngfDiv;
421    n->nNeg   = ngfNeg;
422    n->nInvers= ngfInvers;
423    n->nCopy  = ngfCopy;
424    n->nGreater = ngfGreater;
425    n->nEqual = ngfEqual;
426    n->nIsZero = ngfIsZero;
427    n->nIsOne = ngfIsOne;
428    n->nIsMOne = ngfIsMOne;
429    n->nGreaterZero = ngfGreaterZero;
430    n->nWrite = ngfWrite;
431    n->nRead = ngfRead;
432    n->nPower = ngfPower;
433    n->cfSetMap=ngfSetMap;
434    n->nName= ndName;
435    n->nSize  = ndSize;
436#ifdef LDEBUG
437    //n->nDBTest=ngfDBTest;
438#endif
439  }
440  /* -------------- long C -----------------------*/
441  else if (rField_is_long_C(r))
442  {
443    n->cfDelete= ngcDelete;
444    n->nNew=ngcNew;
445    n->nNormalize=nDummy2;
446    n->nInit  = ngcInit;
447    n->nInt   = ngcInt;
448    n->nAdd   = ngcAdd;
449    n->nSub   = ngcSub;
450    n->nMult  = ngcMult;
451    n->nDiv   = ngcDiv;
452    n->nExactDiv= ngcDiv;
453    n->nNeg   = ngcNeg;
454    n->nInvers= ngcInvers;
455    n->nCopy  = ngcCopy;
456    n->nGreater = ngcGreater;
457    n->nEqual = ngcEqual;
458    n->nIsZero = ngcIsZero;
459    n->nIsOne = ngcIsOne;
460    n->nIsMOne = ngcIsMOne;
461    n->nGreaterZero = ngcGreaterZero;
462    n->nWrite = ngcWrite;
463    n->nRead = ngcRead;
464    n->nPower = ngcPower;
465    n->cfSetMap=ngcSetMap;
466    n->nPar=ngcPar;
467    n->nRePart=ngcRePart;
468    n->nImPart=ngcImPart;
469    /*nSize  = ndSize;*/
470#ifdef LDEBUG
471    //n->nDBTest=ngcDBTest;
472#endif
473  }
474#ifdef TEST
475  else
476  {
477    WerrorS("unknown field");
478  }
479#endif
480  if (!errorreported)
481  {
482    n->nNULL=n->nInit(0);
483    if (n->nRePart==NULL)
484      n->nRePart=n->nCopy;
485    if (n->nIntDiv==NULL)
486      n->nIntDiv=n->nDiv;
487  }
488}
489
490void nKillChar(ring r)
491{
492  if (r!=NULL)
493  {
494    if (r->cf!=NULL)
495    {
496      r->cf->ref--;
497      if (r->cf->ref<=0)
498      {
499        n_Procs_s tmp;
500        n_Procs_s* n=&tmp;
501        tmp.next=cf_root;
502        while((n->next!=NULL) && (n->next!=r->cf)) n=n->next;
503        if (n->next==r->cf)
504        {
505          n->next=n->next->next;
506          if (cf_root==r->cf) cf_root=n->next;
507          r->cf->cfDelete(&(r->cf->nNULL),r);
508          switch(r->cf->type)
509          {
510            case n_Zp:
511                 #ifdef HAVE_DIV_MOD
512                 if (r->cf->npInvTable!=NULL)
513                 omFreeSize( (ADDRESS)r->cf->npInvTable,
514                             r->cf->npPrimeM*sizeof(CARDINAL) );
515                 #else
516                 if (r->cf->npExpTable!=NULL)
517                 {
518                   omFreeSize( (ADDRESS)r->cf->npExpTable,
519                               r->cf->npPrimeM*sizeof(CARDINAL) );
520                   omFreeSize( (ADDRESS)r->cf->npLogTable,
521                               r->cf->npPrimeM*sizeof(CARDINAL) );
522                 }
523                 #endif
524                 break;
525
526            default:
527                 break;
528          }
529          omFreeSize((ADDRESS)r->cf, sizeof(n_Procs_s));
530          r->cf=NULL;
531        }
532        else
533        {
534          WarnS("cf_root list destroyed");
535        }
536      }
537    }
538    if (r->algring!=NULL)
539    {
540      rKill(r->algring);
541      r->algring=NULL;
542    }
543  }
544}
Note: See TracBrowser for help on using the repository browser.