source: git/kernel/rintegers.cc @ befecbc

spielwiese
Last change on this file since befecbc was befecbc, checked in by Oliver Wienand <wienand@…>, 16 years ago
r*.cc: delete nur wenn nicht NULL git-svn-id: file:///usr/local/Singular/svn/trunk@10551 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.8 2008-02-01 15:16:14 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  if (*a == NULL) return;
101  mpz_clear((int_number) *a);
102  omFreeBin((ADDRESS) *a, gmp_nrz_bin);
103  *a = NULL;
104}
105
106number nrzCopy(number a)
107{
108  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
109  mpz_init_set(erg, (int_number) a);
110  return (number) erg;
111}
112
113number cfrzCopy(number a, const ring r)
114{
115  return nrzCopy(a);
116}
117
118int nrzSize(number a)
119{
120  if (a == NULL) return 0;
121  return sizeof(MP_INT);
122}
123
124/*
125 * convert a number to int (-p/2 .. p/2)
126 */
127int nrzInt(number &n)
128{
129  return (int) mpz_get_si( (int_number) &n);
130}
131
132number nrzAdd (number a, number b)
133{
134  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
135  mpz_init(erg);
136  mpz_add(erg, (int_number) a, (int_number) b);
137  return (number) erg;
138}
139
140number nrzSub (number a, number b)
141{
142  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
143  mpz_init(erg);
144  mpz_sub(erg, (int_number) a, (int_number) b);
145  return (number) erg;
146}
147
148number  nrzGetUnit (number a)
149{
150  return nrzOne;
151}
152
153BOOLEAN nrzIsUnit (number a)
154{
155  return 0 == mpz_cmpabs_ui((int_number) a, 1);
156}
157
158BOOLEAN nrzIsZero (number  a)
159{
160  return 0 == mpz_cmpabs_ui((int_number) a, 0);
161}
162
163BOOLEAN nrzIsOne (number a)
164{
165  return 0 == mpz_cmp_si((int_number) a, 1);
166}
167
168BOOLEAN nrzIsMOne (number a)
169{
170  return 0 == mpz_cmp_si((int_number) a, -1);
171}
172
173BOOLEAN nrzEqual (number a,number b)
174{
175  return 0 == mpz_cmp((int_number) a, (int_number) b);
176}
177
178BOOLEAN nrzGreater (number a,number b)
179{
180  return 0 < mpz_cmp((int_number) a, (int_number) b);
181}
182
183BOOLEAN nrzGreaterZero (number k)
184{
185  return 0 <= mpz_cmp_si((int_number) k, 0);
186}
187
188int nrzComp(number a, number b)
189{
190  if (nrzEqual(a, b)) return 0;
191  if (nrzDivBy(a, b)) return -1;
192  if (nrzDivBy(b, a)) return 1;
193  return 2;
194}
195
196BOOLEAN nrzDivBy (number a,number b)
197{
198  return mpz_divisible_p((int_number) a, (int_number) b) != 0;
199}
200
201number nrzDiv (number a,number b)
202{
203  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
204  int_number r = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
205  mpz_init(erg);
206  mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b);
207  if (!nrzIsZero((number) r))
208  {
209    WarnS("Division by non divisible element.");
210    WarnS("Result is without remainder.");
211  }
212  mpz_clear(r);
213  omFreeBin(r, gmp_nrz_bin);
214  return (number) erg;
215}
216
217number nrzIntDiv (number a,number b)
218{
219  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
220  mpz_init(erg);
221  mpz_tdiv_q(erg, (int_number) a, (int_number) b);
222  return (number) erg;
223}
224
225number  nrzInvers (number c)
226{
227  if (!nrzIsUnit((number) c))
228  {
229    WarnS("Non invertible element.");
230    return (number)0; //TODO
231  }
232  return c;
233}
234
235number nrzNeg (number c)
236{
237  int_number erg = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
238  mpz_init(erg);
239  mpz_mul_si(erg, (int_number) c, -1);
240  return (number) erg;
241}
242
243nMapFunc nrzSetMap(ring src, ring dst)
244{
245  return NULL;      /* default */
246}
247
248
249/*
250 * set the exponent (allocate and init tables) (TODO)
251 */
252
253void nrzSetExp(int m, ring r)
254{
255}
256
257void nrzInitExp(int m, ring r)
258{
259}
260
261#ifdef LDEBUG
262BOOLEAN nrzDBTest (number a, char *f, int l)
263{
264  return TRUE;//TODO
265}
266#endif
267
268void nrzWrite (number &a)
269{
270  char *s,*z;
271  if (a==NULL)
272  {
273    StringAppendS("o");
274  }
275  else
276  {
277    int l=mpz_sizeinbase((int_number) a, 10);
278    if (a->s<2) l=si_max(l,mpz_sizeinbase((int_number) a,10));
279    l+=2;
280    s=(char*)omAlloc(l);
281    z=mpz_get_str(s,10,(int_number) a);
282    StringAppendS(z);
283    omFreeSize((ADDRESS)s,l);
284  }
285}
286
287/*2
288* extracts a long integer from s, returns the rest    (COPY FROM longrat0.cc)
289*/
290char * nlEatLongC(char *s, MP_INT *i)
291{
292  char * start=s;
293  if (!(*s >= '0' && *s <= '9'))
294  {
295    mpz_init_set_si(i, 1);
296    return s;
297  }
298  mpz_init(i);
299  while (*s >= '0' && *s <= '9') s++;
300  if (*s=='\0')
301  {
302    mpz_set_str(i,start,10);
303  }
304  else
305  {
306    char c=*s;
307    *s='\0';
308    mpz_set_str(i,start,10);
309    *s=c;
310  }
311  return s;
312}
313
314
315char * nrzRead (char *s, number *a)
316{
317  int_number z = (int_number) omAllocBin(gmp_nrz_bin); // evtl. spaeter mit bin
318  {
319    mpz_init(z);
320    s = nlEatLongC(s, z);
321  }
322  *a = (number) z;
323  return s;
324}
325#endif
Note: See TracBrowser for help on using the repository browser.