source: git/coeffs/numbers.cc @ c08834

spielwiese
Last change on this file since c08834 was c08834, checked in by Mohamed Barakat <mohamed.barakat@…>, 14 years ago
renamed output -> reporter in /coeffs
  • Property mode set to 100644
File size: 6.6 KB
Line 
1/*****************************************
2*  Computer Algebra System SINGULAR      *
3*****************************************/
4/* $Id$ */
5
6/*
7* ABSTRACT: interface to coefficient aritmetics
8*/
9
10#include <string.h>
11#include <stdlib.h>
12#include "coeffs.h"
13#include "reporter.h"
14#include "omalloc.h"
15#include "numbers.h"
16#include "longrat.h"
17#include "modulop.h"
18#include "gnumpfl.h"
19#include "gnumpc.h"
20#include "ffields.h"
21#include "shortfl.h"
22#include "longtrans.h"
23#ifdef HAVE_RINGS
24#include <kernel/rmodulo2m.h>
25#include <kernel/rmodulon.h>
26#include <kernel/rintegers.h>
27
28extern omBin gmp_nrz_bin;
29#endif
30
31#ifndef assume
32#  define assume(a) if(!(a)){ Werror( "Assumption: is wrong: %s\n", #a ); };
33#endif
34
35
36//static int characteristic = 0;
37extern int IsPrime(int p);
38
39/*0 implementation*/
40number nNULL; /* the 0 as constant */
41
42n_Procs_s *cf_root=NULL;
43
44void   nNew(number* d) { *d=NULL; }
45void   ndDelete(number* d, const coeffs r) { *d=NULL; }
46void   ndInpMult(number &a, number b, const coeffs r)
47{
48  number n=n_Mult(a,b,r);
49  n_Delete(&a,r);
50  a=n;
51}
52number ndInpAdd(number &a, number b, const coeffs r)
53{
54  number n=n_Add(a,b,r);
55  n_Delete(&a,r);
56  a=n;
57  return a;
58}
59
60#ifdef LDEBUG
61void   nDBDummy1(number* d,char *f, int l) { *d=NULL; }
62BOOLEAN ndDBTest(number a, const char *f, const int l, const coeffs r)
63{
64  return TRUE;
65}
66#endif
67
68void   ndNormalize(number& d, const coeffs r) { }
69
70char * ndName(number n, const coeffs r) { return NULL; }
71
72number ndPar(int i, const coeffs r) { return n_Init(0,r); }
73
74number ndReturn0(number n, const coeffs r) { return n_Init(0,r); }
75
76int    ndParDeg(number n, const coeffs r) { return 0; }
77
78number ndGcd(number a, number b, const coeffs r) { return n_Init(1,r); }
79
80number ndIntMod(number a, number b, const coeffs r) { return n_Init(0,r); }
81
82number ndGetDenom(number &n, const coeffs r) { return n_Init(1,r); }
83number ndGetNumerator(number &a,const coeffs r) { return n_Copy(a,r); }
84
85int ndSize(number a, const coeffs r) { return (int)n_IsZero(a,r)==FALSE; }
86
87number ndCopy(number a, const coeffs) { return a; }
88number ndCopyMap(number a, const coeffs aRing, const coeffs r)
89{
90  assume( getCoeffType(r) == getCoeffType(aRing) );
91  assume( nField_has_simple_Alloc(r) && nField_has_simple_Alloc(aRing) );
92 
93  return a;
94}
95
96number nd_Copy(number a, const coeffs r) { return n_Copy(a, r); }
97
98#ifdef HAVE_RINGS
99BOOLEAN ndDivBy(number a, number b) { return TRUE; } // assume a,b !=0
100int ndDivComp(number a, number b) { return 2; }
101BOOLEAN ndIsUnit(number a) { return !nIsZero(a); }
102number  ndExtGcd (number a, number b, number *s, number *t) { return nInit(1); }
103#endif
104
105static n_coeffType nLastCoeffs=n_Z2n;
106static cfInitCharProc *nInitCharTable=NULL;
107/*2
108* init operations for coeffs r
109*/
110coeffs nInitChar(n_coeffType t, void * parameter)
111{
112  n_Procs_s *n=cf_root;
113  while((n!=NULL) && (!n->nCoeffIsEqual(n,t,parameter)))
114      n=n->next;
115  if (n==NULL)
116  {
117    n=(n_Procs_s*)omAlloc0(sizeof(n_Procs_s));
118    n->next=cf_root;
119    n->ref=1;
120    n->type=t;
121
122    // default entries (different from NULL) for some routines:
123    n->cfPar  = ndPar;
124    n->cfParDeg=ndParDeg;
125    n->cfSize = ndSize;
126    n->cfGetDenom= ndGetDenom;
127    n->cfGetNumerator= ndGetNumerator;
128    n->cfName =  ndName;
129    n->cfImPart=ndReturn0;
130    n->cfDelete= ndDelete;
131    n->cfInpMult=ndInpMult;
132    n->cfCopy=nd_Copy;
133    n->cfIntMod=ndIntMod; /* dummy !! */
134    n->cfNormalize=ndNormalize;
135    n->cfGcd  = ndGcd;
136    n->cfLcm  = ndGcd; /* tricky, isn't it ?*/
137#ifdef HAVE_RINGS
138    n->cfDivComp = ndDivComp;
139    n->cfDivBy = ndDivBy;
140    n->cfIsUnit = ndIsUnit;
141    n->cfExtGcd = ndExtGcd;
142    //n->cfGetUnit = (nMapFunc)NULL;
143#endif
144  #if 0 /*vertagt*/
145  if (nField_is_Extension(r))
146  {
147    //ntInitChar(c,TRUE,r);
148    n->cfDelete       = ntDelete;
149    n->nNormalize     = ntNormalize;
150    n->cfInit         = ntInit;
151    n->nPar           = ntPar;
152    n->nParDeg        = ntParDeg;
153    n->n_Int          = ntInt;
154    n->nAdd           = ntAdd;
155    n->nSub           = ntSub;
156    n->nMult          = ntMult;
157    n->nDiv           = ntDiv;
158    n->nExactDiv      = ntDiv;
159    n->nIntDiv        = ntIntDiv;
160    n->nNeg           = ntNeg;
161    n->nInvers        = ntInvers;
162    //n->nCopy          = ntCopy;
163    n->cfCopy         = nt_Copy;
164    n->nGreater       = ntGreater;
165    n->nEqual         = ntEqual;
166    n->nIsZero        = ntIsZero;
167    n->nIsOne         = ntIsOne;
168    n->nIsMOne        = ntIsMOne;
169    n->nGreaterZero   = ntGreaterZero;
170    n->cfWrite        = ntWrite;
171    n->nRead          = ntRead;
172    n->nPower         = ntPower;
173    n->nGcd           = ntGcd;
174    n->nLcm           = ntLcm;
175    n->cfSetMap       = ntSetMap;
176    n->nName          = ntName;
177    n->nSize          = ntSize;
178    n->cfGetDenom     = napGetDenom;
179    n->cfGetNumerator = napGetNumerator;
180#ifdef LDEBUG
181    n->nDBTest        = naDBTest;
182#endif
183  }
184  #endif
185    cf_root=n;
186    // init
187    if ((nInitCharTable!=NULL) && (t<=nLastCoeffs))
188       (nInitCharTable[t])(n,parameter);
189     else
190       Werror("coeff init missing for %d",(int)t);
191    // post init settings:
192    if (n->cfRePart==NULL) n->cfRePart=n->cfCopy;
193    if (n->cfIntDiv==NULL) n->cfIntDiv=n->cfDiv;
194#ifdef HAVE_RINGS
195   if (n->cfGetUnit==(nMapFunc)NULL) n->cfGetUnit=n->cfCopy;
196#endif
197  }
198  else
199  {
200    n->ref++;
201  }
202  return n;
203}
204
205void nKillChar(coeffs r)
206{
207  if (r!=NULL)
208  {
209    r->ref--;
210    if (r->ref<=0)
211    {
212      n_Procs_s tmp;
213      n_Procs_s* n=&tmp;
214      tmp.next=cf_root;
215      while((n->next!=NULL) && (n->next!=r)) n=n->next;
216      if (n->next==r)
217      {
218        n->next=n->next->next;
219        if (cf_root==r) cf_root=n->next;
220        r->cfDelete(&(r->nNULL),r);
221        if (r->cfKillChar!=NULL) r->cfKillChar(r);
222        omFreeSize((void *)r, sizeof(n_Procs_s));
223        r=NULL;
224      }
225      else
226      {
227        WarnS("cf_root list destroyed");
228      }
229      r->cf=NULL;
230    }
231  }
232}
233
234n_coeffType nRegister(n_coeffType n, cfInitCharProc p)
235{
236  if (n==n_unknown)
237  {
238    nLastCoeffs=(n_coeffType)(int(nLastCoeffs)+1);
239    if (nInitCharTable==NULL)
240    {
241      nInitCharTable=(cfInitCharProc*)omAlloc0(
242                                          nLastCoeffs*sizeof(cfInitCharProc));
243    }
244    else
245    {
246      nInitCharTable=(cfInitCharProc*)omReallocSize(nInitCharTable,
247                                          (((int)nLastCoeffs)-1)*sizeof(cfInitCharProc),
248                                          ((int)nLastCoeffs)*sizeof(cfInitCharProc));
249    }
250
251    nInitCharTable[nLastCoeffs]=p;
252    return nLastCoeffs;
253  }
254  else
255  {
256    if (nInitCharTable==NULL)
257    {
258      nInitCharTable=(cfInitCharProc*)omAlloc0(
259                                         ((int) nLastCoeffs)*sizeof(cfInitCharProc));
260    }
261    nInitCharTable[n]=p;
262    return n;
263  }
264}
265
Note: See TracBrowser for help on using the repository browser.