source: git/coeffs/gnumpc.cc @ 502f7e8

fieker-DuValspielwiese
Last change on this file since 502f7e8 was ac5686, checked in by Oleksandr Motsak <motsak@…>, 14 years ago
GMP-Complex numbers are done now
  • Property mode set to 100644
File size: 8.7 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id$ */
5/*
6* ABSTRACT: computations with GMP complex floating-point numbers
7*
8* ngc == number gnu complex
9*/
10
11#include "coeffs.h"
12#include "numbers.h"
13#include "longrat.h"
14#include "modulop.h"
15#include "gnumpc.h"
16#include "gnumpfl.h"
17#include "mpr_complex.h"
18#include "output.h"
19#include "omalloc.h"
20
21
22#include "shortfl.h"
23
24
25#ifdef LDEBUG
26// not yet implemented
27BOOLEAN ngcDBTest(number a, const char *f, const int l, const coeffs r)
28{
29  assume( getCoeffType(r) == ID );
30
31  return TRUE;
32}
33#endif
34
35// #ifndef assume
36// #  define assume(a) if(!(a)){ Werror( "Assumption: is wrong: %s\n", #a ); };
37// #endif
38
39static const n_coeffType ID = n_long_C;
40
41number ngcMapQ(number from, const coeffs aRing, const coeffs r)
42{
43  assume( getCoeffType(r) == ID );
44  assume( getCoeffType(aRing) == n_Q );
45
46  if ( from != NULL )
47  {
48    gmp_complex *res=new gmp_complex(numberFieldToFloat(from,QTOF,aRing));
49    return (number)res;
50  }
51  else
52    return NULL;
53}
54
55static number ngcMapLongR(number from, const coeffs aRing, const coeffs r)
56{
57  assume( getCoeffType(r) == ID );
58  assume( getCoeffType(aRing) == n_long_R );
59 
60  if ( from != NULL )
61  {
62    gmp_complex *res=new gmp_complex(*((gmp_float *)from));
63    return (number)res;
64  }
65  else
66    return NULL;
67}
68
69static number ngcMapR(number from, const coeffs aRing, const coeffs r)
70{
71  assume( getCoeffType(r) == ID );
72  assume( getCoeffType(aRing) == n_R );
73
74  if ( from != NULL )
75  {
76    gmp_complex *res=new gmp_complex((double)nrFloat(from));
77    return (number)res;
78  }
79  else
80    return NULL;
81}
82
83static number ngcMapP(number from, const coeffs aRing, const coeffs r)
84{
85  assume( getCoeffType(r) == ID );
86  assume( getCoeffType(aRing) ==  n_Zp );
87 
88  if ( from != NULL)
89    return ngcInit(npInt(from, aRing), r);
90  else
91    return NULL;
92}
93
94
95
96static number ngcCopyMap(number from, const coeffs aRing, const coeffs r)
97{
98  assume( getCoeffType(r) == ID );
99  assume( getCoeffType(aRing) ==  ID );
100
101  gmp_complex* b = NULL;
102 
103  if ( from !=  NULL )
104  { 
105    b = new gmp_complex( *(gmp_complex*)from );
106  }
107  return (number)b; 
108}
109
110nMapFunc ngcSetMap(const coeffs src, const coeffs dst)
111{
112  assume( getCoeffType(dst) == ID );
113 
114  if(nField_is_Q(src))
115  {
116    return ngcMapQ;
117  }
118  if (nField_is_long_R(src))
119  {
120    return ngcMapLongR;
121  }
122  if (nField_is_long_C(src))
123  {
124    return ngcCopyMap;
125  }
126  if(nField_is_R(src))
127  {
128    return ngcMapR;
129  }
130  if (nField_is_Zp(src))
131  {
132    return ngcMapP;
133  }
134  return NULL;
135}
136
137
138
139number   ngcPar(int i, const coeffs r)
140{
141  assume( getCoeffType(r) == ID );
142
143  gmp_complex* n= new gmp_complex( (long)0, (long)1 );
144  return (number)n;
145}
146
147/*2
148* n := i
149*/
150number ngcInit (int i, const coeffs r)
151{
152  assume( getCoeffType(r) == ID );
153 
154  gmp_complex* n= new gmp_complex( (long)i, (long)0 );
155 
156  return (number)n;
157}
158
159/*2
160* convert number to int
161*/
162int ngcInt(number &i, const coeffs r)
163{
164  assume( getCoeffType(r) == ID );
165 
166  return (int)((gmp_complex*)i)->real();
167}
168
169int ngcSize(number n)
170{
171  int r = (int)((gmp_complex*)n)->real();
172  if (r < 0) r = -r;
173  int i = (int)((gmp_complex*)n)->imag();
174  if (i < 0) i = -i;
175  int oneNorm = r + i;
176  /* basically return the 1-norm of n;
177     only if this happens to be zero although n != 0,
178     return 1;
179     (this code ensures that zero has the size zero) */
180  if ((oneNorm == 0.0) & (ngcIsZero(n) == FALSE)) oneNorm = 1;
181  return oneNorm;
182}
183
184/*2
185* delete a
186*/
187void ngcDelete (number * a, const coeffs r)
188{
189  assume( getCoeffType(r) == ID );
190
191  if ( *a != NULL )
192  {
193    delete *(gmp_complex**)a;
194    *a=NULL;
195  }
196}
197
198/*2
199 * copy a to b
200*/
201number ngcCopy(number a, const coeffs r)
202{
203  assume( getCoeffType(r) == ID );
204 
205  gmp_complex* b= new gmp_complex( *(gmp_complex*)a );
206  return (number)b;
207}
208
209
210/*2
211* za:= - za
212*/
213number ngcNeg (number a, const coeffs R)
214{
215  assume( getCoeffType(R) == ID );
216
217  gmp_complex* r=(gmp_complex*)a;
218  (*r) *= ngc_m1;
219  return (number)a;
220}
221
222/*
223* 1/a
224*/
225number ngcInvers(number a, const coeffs R)
226{
227  assume( getCoeffType(R) == ID );
228
229  gmp_complex* r = NULL;
230  if (((gmp_complex*)a)->isZero())
231  {
232    WerrorS(nDivBy0);
233  }
234  else
235  {
236    b = new gmp_complex( (gmp_complex)1 / (*(gmp_complex*)a) );
237  }
238  return (number)b;
239}
240
241/*2
242* u:= a + b
243*/
244number ngcAdd (number a, number b, const coeffs R)
245{
246  assume( getCoeffType(R) == ID );
247
248  gmp_complex* r= new gmp_complex( (*(gmp_complex*)a) + (*(gmp_complex*)b) );
249  return (number)r;
250}
251
252/*2
253* u:= a - b
254*/
255number ngcSub (number a, number b, const coeffs R)
256{
257  assume( getCoeffType(R) == ID );
258
259  gmp_complex* r= new gmp_complex( (*(gmp_complex*)a) - (*(gmp_complex*)b) );
260  return (number)r;
261}
262
263/*2
264* u := a * b
265*/
266number ngcMult (number a, number b, const coeffs R)
267{
268  assume( getCoeffType(R) == ID );
269 
270  gmp_complex* r= new gmp_complex( (*(gmp_complex*)a) * (*(gmp_complex*)b) );
271  return (number)r;
272}
273
274/*2
275* u := a / b
276*/
277number ngcDiv (number a, number b, const coeffs r)
278{
279  assume( getCoeffType(r) == ID );
280
281  if (((gmp_complex*)b)->isZero())
282  {
283    // a/0 = error
284    WerrorS(nDivBy0);
285    return NULL;
286  }
287  gmp_complex* res = new gmp_complex( (*(gmp_complex*)a) / (*(gmp_complex*)b) );
288  return (number)res;
289}
290
291/*2
292* u:= x ^ exp
293*/
294void ngcPower ( number x, int exp, number * u, const coeffs r)
295{
296  assume( getCoeffType(r) == ID );
297
298  if ( exp == 0 )
299  {
300    gmp_complex* n = new gmp_complex(1);
301    *u=(number)n;
302    return;
303  }
304  else if ( exp == 1 )
305  {
306    n_New(u, r);
307    gmp_complex* n = new gmp_complex();
308    *n= *(gmp_complex*)x;
309    *u=(number)n;
310    return;
311  }
312  else if (exp == 2)
313  {
314    n_New(u, r);
315    gmp_complex* n = new gmp_complex();
316    *n= *(gmp_complex*)x;
317    *u=(number)n;
318    *(gmp_complex*)(*u) *= *(gmp_complex*)n;
319    return;
320  }
321  if (exp&1==1)
322  {
323    ngcPower(x,exp-1,u, r);
324    gmp_complex *n = new gmp_complex();
325    *n=*(gmp_complex*)x;
326    *(gmp_complex*)(*u) *= *(gmp_complex*)n;
327    delete n;
328  }
329  else
330  {
331    number w;
332    n_New(&w, r);
333    ngcPower(x,exp/2,&w, r);
334    ngcPower(w,2,u, r);
335    n_Delete(&w, r);
336  }
337}
338
339BOOLEAN ngcIsZero (number a, const coeffs r)
340{
341  assume( getCoeffType(r) == ID );
342
343  return ( ((gmp_complex*)a)->real().isZero() && ((gmp_complex*)a)->imag().isZero());
344}
345
346number ngcRePart(number a, const coeffs r)
347{
348  assume( getCoeffType(r) == ID );
349
350  gmp_complex* n = new gmp_complex(((gmp_complex*)a)->real());
351  return (number)n;
352}
353
354number ngcImPart(number a, const coeffs r)
355{
356  assume( getCoeffType(r) == ID );
357
358  gmp_complex* n = new gmp_complex(((gmp_complex*)a)->imag());
359  return (number)n;
360}
361
362/*2
363* za >= 0 ?
364*/
365BOOLEAN ngcGreaterZero (number a, const coeffs r)
366{
367  assume( getCoeffType(r) == ID );
368
369  if ( ! ((gmp_complex*)a)->imag().isZero() )
370    return ( abs( *(gmp_complex*)a).sign() >= 0 );
371  else
372    return ( ((gmp_complex*)a)->real().sign() >= 0 );
373}
374
375/*2
376* a > b ?
377*/
378BOOLEAN ngcGreater (number a, number b, const coeffs r)
379{
380  assume( getCoeffType(r) == ID );
381
382  gmp_complex *aa=(gmp_complex*)a;
383  gmp_complex *bb=(gmp_complex*)b;
384  return (*aa) > (*bb);
385}
386
387/*2
388* a = b ?
389*/
390BOOLEAN ngcEqual (number a, number b, const coeffs r)
391{
392  assume( getCoeffType(r) == ID );
393
394  gmp_complex *aa=(gmp_complex*)a;
395  gmp_complex *bb=(gmp_complex*)b;
396  return (*aa) == (*bb);
397}
398
399/*2
400* a == 1 ?
401*/
402BOOLEAN ngcIsOne (number a, const coeffs r)
403{
404  assume( getCoeffType(r) == ID );
405
406  return (((gmp_complex*)a)->real().isOne() && ((gmp_complex*)a)->imag().isZero());
407  //return (((gmp_complex*)a)->real().isOne());
408}
409
410/*2
411* a == -1 ?
412*/
413BOOLEAN ngcIsMOne (number a, const coeffs r)
414{
415  assume( getCoeffType(r) == ID );
416
417  return (((gmp_complex*)a)->real().isMOne() && ((gmp_complex*)a)->imag().isZero());
418  //return (((gmp_complex*)a)->real().isMOne());
419}
420
421/*2
422* extracts the number a from s, returns the rest
423*/
424const char * ngcRead (const char * s, number * a, const coeffs r)
425{
426  assume( getCoeffType(r) == ID );
427 
428  if ((*s >= '0') && (*s <= '9'))
429  {
430    gmp_float *re=NULL;
431    s=ngfRead(s,(number *)&re, r);
432    gmp_complex *aa=new gmp_complex(*re);
433    *a=(number)aa;
434    delete re;
435  }
436  else if (strncmp(s, r->parameter[0],strlen(r->parameter[0]))==0)
437  {
438    s+=strlen(r->parameter[0]);
439    gmp_complex *aa=new gmp_complex((long)0,(long)1);
440    *a=(number)aa;
441  }
442  else
443  {
444    *a=(number) new gmp_complex((long)1);
445  }
446  return s;
447}
448
449
450
451/*2
452* write a floating point number
453*/
454void ngcWrite (number &a, const coeffs r)
455{
456  assume( getCoeffType(r) == ID );
457
458  extern size_t gmp_output_digits; /// comes from mpr_complex.cc
459
460  if (a==NULL)
461    StringAppendS("0");
462  else
463  {
464    char *out;
465    out= complexToStr(*(gmp_complex*)a, gmp_output_digits, r);
466    StringAppendS(out);
467    //    omFreeSize((void *)out, (strlen(out)+1)* sizeof(char) );
468    omFree( (void *)out );
469  }
470}
471
472// local Variables: ***
473// folded-file: t ***
474// compile-command: "make installg" ***
475// End: ***
Note: See TracBrowser for help on using the repository browser.