source: git/kernel/rintegers.cc @ bac8611

spielwiese
Last change on this file since bac8611 was bac8611, checked in by Oliver Wienand <wienand@…>, 16 years ago
ring.h: no simple alloc for modn kutil.cc: delete generated coeffs in pair creation number.cc: copy, delete, size for rmodulon and rintegers kspoly.cc: pSetCoeff durch pSetCoeff0 ersetzt rint*, rmod*: delete, etc. git-svn-id: file:///usr/local/Singular/svn/trunk@10550 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: rintegers.cc,v 1.7 2008-02-01 15:11:34 wienand Exp $ */
5/*
6* ABSTRACT: numbers modulo n
7*/
8
9#include <string.h>
10#include "mod2.h"
11#include <mylimits.h>
12#include "structs.h"
13#include "febase.h"
14#include "omalloc.h"
15#include "numbers.h"
16#include "longrat.h"
17#include "mpr_complex.h"
18#include "ring.h"
19#include "rintegers.h"
20#include "gmp.h"
21
22#ifdef HAVE_RINGZ
23
24typedef MP_INT *int_number;
25omBin gmp_nrz_bin = omGetSpecBin(sizeof(MP_INT));
26number nrzOne = nrzInit(1);
27
28/*
29 * Multiply two numbers
30 */
31number nrzMult (number a, number b)
32{
33  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
34  mpz_init(erg);
35  mpz_mul(erg, (int_number) a, (int_number) b);
36  return (number) erg;
37}
38
39/*
40 * Give the smallest non unit k, such that a * x = k = b * y has a solution
41 */
42number nrzLcm (number a,number b,ring r)
43{
44  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
45  mpz_init(erg);
46  mpz_lcm(erg, (int_number) a, (int_number) b);
47  return (number) erg;
48}
49
50/*
51 * Give the largest non unit k, such that a = x * k, b = y * k has
52 * a solution.
53 */
54number nrzGcd (number a,number b,ring r)
55{
56  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
57  mpz_init(erg);
58  mpz_gcd(erg, (int_number) a, (int_number) b);
59  return (number) erg;
60}
61
62/*
63 * Give the largest non unit k, such that a = x * k, b = y * k has
64 * a solution and r, s, s.t. k = s*a + t*b
65 */
66number  nrzExtGcd (number a, number b, number *s, number *t)
67{
68  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
69  int_number bs = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
70  int_number bt = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
71  mpz_init(erg);
72  mpz_init(bs);
73  mpz_init(bt);
74  mpz_gcdext(erg, bs, bt, (int_number) a, (int_number) b);
75  *s = (number) bs;
76  *t = (number) bt;
77  return (number) erg;
78}
79
80void nrzPower (number a, int i, number * result)
81{
82  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
83  mpz_init(erg);
84  mpz_pow_ui(erg, (int_number) a, i);
85  *result = (number) erg;
86}
87
88/*
89 * create a number from int
90 */
91number nrzInit (int i)
92{
93  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
94  mpz_init_set_si(erg, i);
95  return (number) erg;
96}
97
98void nrzDelete(number *a, const ring r)
99{
100  mpz_clear((int_number) *a);
101  omFreeBin((ADDRESS) *a, gmp_nrz_bin);
102}
103
104number nrzCopy(number a)
105{
106  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
107  mpz_init_set(erg, (int_number) a);
108  return (number) erg;
109}
110
111number cfrzCopy(number a, const ring r)
112{
113  return nrzCopy(a);
114}
115
116int nrzSize(number a)
117{
118  if (a == NULL) return 0;
119  return sizeof(MP_INT);
120}
121
122/*
123 * convert a number to int (-p/2 .. p/2)
124 */
125int nrzInt(number &n)
126{
127  return (int) mpz_get_si( (int_number) &n);
128}
129
130number nrzAdd (number a, number b)
131{
132  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
133  mpz_init(erg);
134  mpz_add(erg, (int_number) a, (int_number) b);
135  return (number) erg;
136}
137
138number nrzSub (number a, number b)
139{
140  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
141  mpz_init(erg);
142  mpz_sub(erg, (int_number) a, (int_number) b);
143  return (number) erg;
144}
145
146number  nrzGetUnit (number a)
147{
148  return nrzOne;
149}
150
151BOOLEAN nrzIsUnit (number a)
152{
153  return 0 == mpz_cmpabs_ui((int_number) a, 1);
154}
155
156BOOLEAN nrzIsZero (number  a)
157{
158  return 0 == mpz_cmpabs_ui((int_number) a, 0);
159}
160
161BOOLEAN nrzIsOne (number a)
162{
163  return 0 == mpz_cmp_si((int_number) a, 1);
164}
165
166BOOLEAN nrzIsMOne (number a)
167{
168  return 0 == mpz_cmp_si((int_number) a, -1);
169}
170
171BOOLEAN nrzEqual (number a,number b)
172{
173  return 0 == mpz_cmp((int_number) a, (int_number) b);
174}
175
176BOOLEAN nrzGreater (number a,number b)
177{
178  return 0 < mpz_cmp((int_number) a, (int_number) b);
179}
180
181BOOLEAN nrzGreaterZero (number k)
182{
183  return 0 <= mpz_cmp_si((int_number) k, 0);
184}
185
186int nrzComp(number a, number b)
187{
188  if (nrzEqual(a, b)) return 0;
189  if (nrzDivBy(a, b)) return -1;
190  if (nrzDivBy(b, a)) return 1;
191  return 2;
192}
193
194BOOLEAN nrzDivBy (number a,number b)
195{
196  return mpz_divisible_p((int_number) a, (int_number) b) != 0;
197}
198
199number nrzDiv (number a,number b)
200{
201  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
202  int_number r = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
203  mpz_init(erg);
204  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
205  if (!nrzIsZero((number) r))
206  {
207    WarnS("Division by non divisible element.");
208    WarnS("Result is without remainder.");
209  }
210  mpz_clear(r);
211  omFreeBin(r, gmp_nrz_bin);
212  return (number) erg;
213}
214
215number nrzIntDiv (number a,number b)
216{
217  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
218  mpz_init(erg);
219  mpz_tdiv_q(erg, (int_number) a, (int_number) b);
220  return (number) erg;
221}
222
223number  nrzInvers (number c)
224{
225  if (!nrzIsUnit((number) c))
226  {
227    WarnS("Non invertible element.");
228    return (number)0; //TODO
229  }
230  return c;
231}
232
233number nrzNeg (number c)
234{
235  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
236  mpz_init(erg);
237  mpz_mul_si(erg, (int_number) c, -1);
238  return (number) erg;
239}
240
241nMapFunc nrzSetMap(ring src, ring dst)
242{
243  return NULL;      /* default */
244}
245
246
247/*
248 * set the exponent (allocate and init tables) (TODO)
249 */
250
251void nrzSetExp(int m, ring r)
252{
253}
254
255void nrzInitExp(int m, ring r)
256{
257}
258
259#ifdef LDEBUG
260BOOLEAN nrzDBTest (number a, char *f, int l)
261{
262  return TRUE;//TODO
263}
264#endif
265
266void nrzWrite (number &a)
267{
268  char *s,*z;
269  if (a==NULL)
270  {
271    StringAppendS("o");
272  }
273  else
274  {
275    int l=mpz_sizeinbase((int_number) a, 10);
276    if (a->s<2) l=si_max(l,mpz_sizeinbase((int_number) a,10));
277    l+=2;
278    s=(char*)omAlloc(l);
279    z=mpz_get_str(s,10,(int_number) a);
280    StringAppendS(z);
281    omFreeSize((ADDRESS)s,l);
282  }
283}
284
285/*2
286* extracts a long integer from s, returns the rest    (COPY FROM longrat0.cc)
287*/
288char * nlEatLongC(char *s, MP_INT *i)
289{
290  char * start=s;
291  if (!(*s >= '0' && *s <= '9'))
292  {
293    mpz_init_set_si(i, 1);
294    return s;
295  }
296  mpz_init(i);
297  while (*s >= '0' && *s <= '9') s++;
298  if (*s=='\0')
299  {
300    mpz_set_str(i,start,10);
301  }
302  else
303  {
304    char c=*s;
305    *s='\0';
306    mpz_set_str(i,start,10);
307    *s=c;
308  }
309  return s;
310}
311
312
313char * nrzRead (char *s, number *a)
314{
315  int_number z = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
316  {
317    mpz_init(z);
318    s = nlEatLongC(s, z);
319  }
320  *a = (number) z;
321  return s;
322}
323#endif
Note: See TracBrowser for help on using the repository browser.