Macros | Functions | Variables
rmodulon.cc File Reference
#include <misc/auxiliary.h>
#include <omalloc/omalloc.h>
#include <misc/mylimits.h>
#include <reporter/reporter.h>
#include "si_gmp.h"
#include "coeffs.h"
#include "numbers.h"
#include "mpr_complex.h"
#include "longrat.h"
#include "rmodulon.h"
#include <string.h>

Go to the source code of this file.

Macros

#define nrnWrite   nrzWrite
 

Functions

number nrnCopy (number a, const coeffs r)
 
int nrnSize (number a, const coeffs r)
 
void nrnDelete (number *a, const coeffs r)
 
BOOLEAN nrnGreaterZero (number k, const coeffs r)
 
number nrnMult (number a, number b, const coeffs r)
 
number nrnInit (long i, const coeffs r)
 
long nrnInt (number &n, const coeffs r)
 
number nrnAdd (number a, number b, const coeffs r)
 
number nrnSub (number a, number b, const coeffs r)
 
void nrnPower (number a, int i, number *result, const coeffs r)
 
BOOLEAN nrnIsZero (number a, const coeffs r)
 
BOOLEAN nrnIsOne (number a, const coeffs r)
 
BOOLEAN nrnIsMOne (number a, const coeffs r)
 
BOOLEAN nrnIsUnit (number a, const coeffs r)
 
number nrnGetUnit (number a, const coeffs r)
 
number nrnAnn (number a, const coeffs r)
 
number nrnDiv (number a, number b, const coeffs r)
 
number nrnMod (number a, number b, const coeffs r)
 
number nrnIntDiv (number a, number b, const coeffs r)
 
number nrnNeg (number c, const coeffs r)
 
number nrnInvers (number c, const coeffs r)
 
BOOLEAN nrnGreater (number a, number b, const coeffs r)
 
BOOLEAN nrnDivBy (number a, number b, const coeffs r)
 
int nrnDivComp (number a, number b, const coeffs r)
 
BOOLEAN nrnEqual (number a, number b, const coeffs r)
 
number nrnLcm (number a, number b, const coeffs r)
 
number nrnGcd (number a, number b, const coeffs r)
 
number nrnExtGcd (number a, number b, number *s, number *t, const coeffs r)
 
number nrnXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
 
number nrnQuotRem (number a, number b, number *s, const coeffs r)
 
nMapFunc nrnSetMap (const coeffs src, const coeffs dst)
 
const char * nrnRead (const char *s, number *a, const coeffs r)
 
void nrnCoeffWrite (const coeffs r, BOOLEAN details)
 
BOOLEAN nrnDBTest (number a, const char *f, const int l, const coeffs r)
 
void nrnSetExp (unsigned long c, const coeffs r)
 
void nrnInitExp (unsigned long c, const coeffs r)
 
coeffs nrnQuot1 (number c, const coeffs r)
 
number nrnMapQ (number from, const coeffs src, const coeffs dst)
 
static BOOLEAN nrnCoeffsEqual (const coeffs r, n_coeffType n, void *parameter)
 
static char * nrnCoeffString (const coeffs r)
 
static void nrnKillChar (coeffs r)
 
BOOLEAN nrnInitChar (coeffs r, void *p)
 
number nrnMapModN (number from, const coeffs, const coeffs dst)
 
number nrnMap2toM (number from, const coeffs, const coeffs dst)
 
number nrnMapZp (number from, const coeffs, const coeffs dst)
 
number nrnMapGMP (number from, const coeffs, const coeffs dst)
 
number nrnMapZ (number from, const coeffs src, const coeffs dst)
 
static const char * nlCPEatLongC (char *s, mpz_ptr i)
 

Variables

static const n_coeffType ID = n_Zn
 Our Type! More...
 
static const n_coeffType ID2 = n_Znm
 
omBin gmp_nrz_bin
 
mpz_ptr nrnMapCoef = NULL
 

Macro Definition Documentation

#define nrnWrite   nrzWrite

Definition at line 63 of file rmodulon.cc.

Function Documentation

static const char* nlCPEatLongC ( char *  s,
mpz_ptr  i 
)
static

Definition at line 948 of file rmodulon.cc.

949 {
950  const char * start=s;
951  if (!(*s >= '0' && *s <= '9'))
952  {
953  mpz_init_set_si(i, 1);
954  return s;
955  }
956  mpz_init(i);
957  while (*s >= '0' && *s <= '9') s++;
958  if (*s=='\0')
959  {
960  mpz_set_str(i,start,10);
961  }
962  else
963  {
964  char c=*s;
965  *s='\0';
966  mpz_set_str(i,start,10);
967  *s=c;
968  }
969  return s;
970 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
int i
Definition: cfEzgcd.cc:123
number nrnAdd ( number  a,
number  b,
const coeffs  r 
)

Definition at line 288 of file rmodulon.cc.

289 {
290  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
291  mpz_init(erg);
292  mpz_add(erg, (mpz_ptr)a, (mpz_ptr) b);
293  mpz_mod(erg, erg, r->modNumber);
294  return (number) erg;
295 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
const poly b
Definition: syzextra.cc:213
number nrnAnn ( number  a,
const coeffs  r 
)

Definition at line 576 of file rmodulon.cc.

577 {
578  mpz_ptr tmp = (mpz_ptr) omAllocBin(gmp_nrz_bin);
579  mpz_init(tmp);
580  mpz_gcd(tmp, (mpz_ptr) k, r->modNumber);
581  if (mpz_cmp_si(tmp, 1)==0) {
582  mpz_set_si(tmp, 0);
583  return (number) tmp;
584  }
585  mpz_divexact(tmp, r->modNumber, tmp);
586  return (number) tmp;
587 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
int k
Definition: cfEzgcd.cc:93
omBin gmp_nrz_bin
Definition: rintegers.cc:80
static BOOLEAN nrnCoeffsEqual ( const coeffs  r,
n_coeffType  n,
void *  parameter 
)
static

Definition at line 91 of file rmodulon.cc.

92 {
93  /* test, if r is an instance of nInitCoeffs(n,parameter) */
94  return (n==n_Zn) && (mpz_cmp_ui(r->modNumber,(long)parameter)==0);
95 }
only used if HAVE_RINGS is defined: ?
Definition: coeffs.h:43
static char* nrnCoeffString ( const coeffs  r)
static

Definition at line 97 of file rmodulon.cc.

98 {
99  size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
100  char* b = (char*) omAlloc(l);
101  b= mpz_get_str (b, 10, r->modBase);
102  char* s = (char*) omAlloc(7+2+10+l);
103  if (nCoeff_is_Ring_ModN(r)) sprintf(s,"integer,%s",b);
104  else /*if (nCoeff_is_Ring_PtoM(r))*/ sprintf(s,"integer,%s^%lu",b,r->modExponent);
105  omFreeSize(b,l);
106  return s;
107 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
Definition: coeffs.h:749
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
#define omAlloc(size)
Definition: omAllocDecl.h:210
const poly b
Definition: syzextra.cc:213
int l
Definition: cfEzgcd.cc:94
void nrnCoeffWrite ( const coeffs  r,
BOOLEAN  details 
)

Definition at line 81 of file rmodulon.cc.

82 {
83  size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
84  char* s = (char*) omAlloc(l);
85  s= mpz_get_str (s, 10, r->modBase);
86  if (nCoeff_is_Ring_ModN(r)) Print("// coeff. ring is : Z/%s\n", s);
87  else if (nCoeff_is_Ring_PtoM(r)) Print("// coeff. ring is : Z/%s^%lu\n", s, r->modExponent);
88  omFreeSize((ADDRESS)s, l);
89 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
Definition: coeffs.h:749
#define Print
Definition: emacs.cc:83
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
void * ADDRESS
Definition: auxiliary.h:161
#define omAlloc(size)
Definition: omAllocDecl.h:210
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
Definition: coeffs.h:752
int l
Definition: cfEzgcd.cc:94
number nrnCopy ( number  a,
const coeffs  r 
)

Definition at line 247 of file rmodulon.cc.

248 {
249  mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
250  mpz_init_set(erg, (mpz_ptr) a);
251  return (number) erg;
252 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
BOOLEAN nrnDBTest ( number  a,
const char *  f,
const int  l,
const coeffs  r 
)

Definition at line 934 of file rmodulon.cc.

935 {
936  if (a==NULL) return TRUE;
937  if ( (mpz_cmp_si((mpz_ptr) a, 0) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
938  {
939  return FALSE;
940  }
941  return TRUE;
942 }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:140
#define TRUE
Definition: auxiliary.h:144
#define NULL
Definition: omList.c:10
void nrnDelete ( number *  a,
const coeffs  r 
)

Definition at line 239 of file rmodulon.cc.

240 {
241  if (*a == NULL) return;
242  mpz_clear((mpz_ptr) *a);
243  omFreeBin((void *) *a, gmp_nrz_bin);
244  *a = NULL;
245 }
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
#define NULL
Definition: omList.c:10
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
number nrnDiv ( number  a,
number  b,
const coeffs  r 
)

Definition at line 611 of file rmodulon.cc.

612 {
613  if (a == NULL) a = (number)r->modNumber;
614  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
615  mpz_init(erg);
616  if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)b))
617  {
618  mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)b);
619  return (number)erg;
620  }
621  else
622  {
623  mpz_ptr gcd = (mpz_ptr)nrnGcd(a, b, r);
624  mpz_divexact(erg, (mpz_ptr)b, gcd);
625  if (!nrnIsUnit((number)erg, r))
626  {
627  WerrorS("Division not possible, even by cancelling zero divisors.");
628  WerrorS("Result is integer division without remainder.");
629  mpz_tdiv_q(erg, (mpz_ptr) a, (mpz_ptr) b);
630  nrnDelete((number*) &gcd, NULL);
631  return (number)erg;
632  }
633  // a / gcd(a,b) * [b / gcd (a,b)]^(-1)
634  mpz_ptr tmp = (mpz_ptr)nrnInvers((number) erg,r);
635  mpz_divexact(erg, (mpz_ptr)a, gcd);
636  mpz_mul(erg, erg, tmp);
637  nrnDelete((number*) &gcd, NULL);
638  nrnDelete((number*) &tmp, NULL);
639  mpz_mod(erg, erg, r->modNumber);
640  return (number)erg;
641  }
642 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
void WerrorS(const char *s)
Definition: feFopen.cc:24
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
const ring r
Definition: syzextra.cc:208
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:531
omBin gmp_nrz_bin
Definition: rintegers.cc:80
#define NULL
Definition: omList.c:10
int gcd(int a, int b)
Definition: walkSupport.cc:839
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:314
const poly b
Definition: syzextra.cc:213
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:339
BOOLEAN nrnDivBy ( number  a,
number  b,
const coeffs  r 
)

Definition at line 589 of file rmodulon.cc.

590 {
591  if (a == NULL)
592  return mpz_divisible_p(r->modNumber, (mpz_ptr)b);
593  else
594  { /* b divides a iff b/gcd(a, b) is a unit in the given ring: */
595  number n = nrnGcd(a, b, r);
596  mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)b, (mpz_ptr)n);
597  bool result = nrnIsUnit(n, r);
598  nrnDelete(&n, NULL);
599  return result;
600  }
601 }
const poly a
Definition: syzextra.cc:212
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:531
#define NULL
Definition: omList.c:10
const poly b
Definition: syzextra.cc:213
return result
Definition: facAbsBiFact.cc:76
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:339
int nrnDivComp ( number  a,
number  b,
const coeffs  r 
)

Definition at line 603 of file rmodulon.cc.

604 {
605  if (nrnEqual(a, b,r)) return 2;
606  if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr) b)) return -1;
607  if (mpz_divisible_p((mpz_ptr) b, (mpz_ptr) a)) return 1;
608  return 0;
609 }
const poly a
Definition: syzextra.cc:212
BOOLEAN nrnEqual(number a, number b, const coeffs r)
Definition: rmodulon.cc:516
const poly b
Definition: syzextra.cc:213
BOOLEAN nrnEqual ( number  a,
number  b,
const coeffs  r 
)

Definition at line 516 of file rmodulon.cc.

517 {
518  return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
519 }
const poly a
Definition: syzextra.cc:212
const poly b
Definition: syzextra.cc:213
number nrnExtGcd ( number  a,
number  b,
number *  s,
number *  t,
const coeffs  r 
)

Definition at line 373 of file rmodulon.cc.

374 {
375  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
376  mpz_ptr bs = (mpz_ptr)omAllocBin(gmp_nrz_bin);
377  mpz_ptr bt = (mpz_ptr)omAllocBin(gmp_nrz_bin);
378  mpz_init(erg);
379  mpz_init(bs);
380  mpz_init(bt);
381  mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
382  mpz_mod(bs, bs, r->modNumber);
383  mpz_mod(bt, bt, r->modNumber);
384  *s = (number)bs;
385  *t = (number)bt;
386  return (number)erg;
387 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const CanonicalForm int s
Definition: facAbsFact.cc:55
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
const poly b
Definition: syzextra.cc:213
number nrnGcd ( number  a,
number  b,
const coeffs  r 
)

Definition at line 339 of file rmodulon.cc.

340 {
341  if ((a == NULL) && (b == NULL)) return nrnInit(0,r);
342  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
343  mpz_init_set(erg, r->modNumber);
344  if (a != NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
345  if (b != NULL) mpz_gcd(erg, erg, (mpz_ptr)b);
346  return (number)erg;
347 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
#define NULL
Definition: omList.c:10
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:231
const poly b
Definition: syzextra.cc:213
number nrnGetUnit ( number  a,
const coeffs  r 
)

Definition at line 539 of file rmodulon.cc.

540 {
541  if (mpz_divisible_p(r->modNumber, (mpz_ptr)k)) return nrnInit(1,r);
542 
543  mpz_ptr unit = (mpz_ptr)nrnGcd(k, 0, r);
544  mpz_tdiv_q(unit, (mpz_ptr)k, unit);
545  mpz_ptr gcd = (mpz_ptr)nrnGcd((number)unit, 0, r);
546  if (!nrnIsOne((number)gcd,r))
547  {
548  mpz_ptr ctmp;
549  // tmp := unit^2
550  mpz_ptr tmp = (mpz_ptr) nrnMult((number) unit,(number) unit,r);
551  // gcd_new := gcd(tmp, 0)
552  mpz_ptr gcd_new = (mpz_ptr) nrnGcd((number) tmp, 0, r);
553  while (!nrnEqual((number) gcd_new,(number) gcd,r))
554  {
555  // gcd := gcd_new
556  ctmp = gcd;
557  gcd = gcd_new;
558  gcd_new = ctmp;
559  // tmp := tmp * unit
560  mpz_mul(tmp, tmp, unit);
561  mpz_mod(tmp, tmp, r->modNumber);
562  // gcd_new := gcd(tmp, 0)
563  mpz_gcd(gcd_new, tmp, r->modNumber);
564  }
565  // unit := unit + modNumber / gcd_new
566  mpz_tdiv_q(tmp, r->modNumber, gcd_new);
567  mpz_add(unit, unit, tmp);
568  mpz_mod(unit, unit, r->modNumber);
569  nrnDelete((number*) &gcd_new, NULL);
570  nrnDelete((number*) &tmp, NULL);
571  }
572  nrnDelete((number*) &gcd, NULL);
573  return (number)unit;
574 }
number nrnMult(number a, number b, const coeffs r)
Definition: rmodulon.cc:271
int k
Definition: cfEzgcd.cc:93
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
const ring r
Definition: syzextra.cc:208
#define NULL
Definition: omList.c:10
int gcd(int a, int b)
Definition: walkSupport.cc:839
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:496
BOOLEAN nrnEqual(number a, number b, const coeffs r)
Definition: rmodulon.cc:516
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:231
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:339
BOOLEAN nrnGreater ( number  a,
number  b,
const coeffs  r 
)

Definition at line 521 of file rmodulon.cc.

522 {
523  return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
524 }
const poly a
Definition: syzextra.cc:212
const poly b
Definition: syzextra.cc:213
BOOLEAN nrnGreaterZero ( number  k,
const coeffs  r 
)

Definition at line 526 of file rmodulon.cc.

527 {
528  return 0 < mpz_cmp_si((mpz_ptr)k, 0);
529 }
int k
Definition: cfEzgcd.cc:93
number nrnInit ( long  i,
const coeffs  r 
)

Definition at line 231 of file rmodulon.cc.

232 {
233  mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
234  mpz_init_set_si(erg, i);
235  mpz_mod(erg, erg, r->modNumber);
236  return (number) erg;
237 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
omBin gmp_nrz_bin
Definition: rintegers.cc:80
int i
Definition: cfEzgcd.cc:123
BOOLEAN nrnInitChar ( coeffs  r,
void *  p 
)

Definition at line 163 of file rmodulon.cc.

164 {
165  assume( (getCoeffType(r) == ID) || (getCoeffType (r) == ID2) );
166  ZnmInfo * info= (ZnmInfo *) p;
167  r->modBase= (mpz_ptr)nrnCopy((number)info->base, r); //this circumvents the problem
168  //in bigintmat.cc where we cannot create a "legal" nrn that can be freed.
169  //If we take a copy, we can do whatever we want.
170 
171  nrnInitExp (info->exp, r);
172 
173  /* next computation may yield wrong characteristic as r->modNumber
174  is a GMP number */
175  r->ch = mpz_get_ui(r->modNumber);
176 
177  r->is_field=FALSE;
178  r->is_domain=FALSE;
179  r->rep=n_rep_gmp;
180 
181 
182  r->cfCoeffString = nrnCoeffString;
183 
184  r->cfInit = nrnInit;
185  r->cfDelete = nrnDelete;
186  r->cfCopy = nrnCopy;
187  r->cfSize = nrnSize;
188  r->cfInt = nrnInt;
189  r->cfAdd = nrnAdd;
190  r->cfSub = nrnSub;
191  r->cfMult = nrnMult;
192  r->cfDiv = nrnDiv;
193  r->cfAnn = nrnAnn;
194  r->cfIntMod = nrnMod;
195  r->cfExactDiv = nrnDiv;
196  r->cfInpNeg = nrnNeg;
197  r->cfInvers = nrnInvers;
198  r->cfDivBy = nrnDivBy;
199  r->cfDivComp = nrnDivComp;
200  r->cfGreater = nrnGreater;
201  r->cfEqual = nrnEqual;
202  r->cfIsZero = nrnIsZero;
203  r->cfIsOne = nrnIsOne;
204  r->cfIsMOne = nrnIsMOne;
205  r->cfGreaterZero = nrnGreaterZero;
206  r->cfWriteLong = nrnWrite;
207  r->cfRead = nrnRead;
208  r->cfPower = nrnPower;
209  r->cfSetMap = nrnSetMap;
210  //r->cfNormalize = ndNormalize;
211  r->cfLcm = nrnLcm;
212  r->cfGcd = nrnGcd;
213  r->cfIsUnit = nrnIsUnit;
214  r->cfGetUnit = nrnGetUnit;
215  r->cfExtGcd = nrnExtGcd;
216  r->cfXExtGcd = nrnXExtGcd;
217  r->cfQuotRem = nrnQuotRem;
218  r->cfCoeffWrite = nrnCoeffWrite;
219  r->nCoeffIsEqual = nrnCoeffsEqual;
220  r->cfKillChar = nrnKillChar;
221  r->cfQuot1 = nrnQuot1;
222 #ifdef LDEBUG
223  r->cfDBTest = nrnDBTest;
224 #endif
225  return FALSE;
226 }
mpz_ptr base
Definition: rmodulon.h:18
number nrnMult(number a, number b, const coeffs r)
Definition: rmodulon.cc:271
number nrnQuotRem(number a, number b, number *s, const coeffs r)
Definition: rmodulon.cc:700
#define FALSE
Definition: auxiliary.h:140
return P p
Definition: myNF.cc:203
number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
Definition: rmodulon.cc:373
number nrnLcm(number a, number b, const coeffs r)
Definition: rmodulon.cc:326
BOOLEAN nrnIsMOne(number a, const coeffs r)
Definition: rmodulon.cc:504
BOOLEAN nrnDivBy(number a, number b, const coeffs r)
Definition: rmodulon.cc:589
static BOOLEAN nrnCoeffsEqual(const coeffs r, n_coeffType n, void *parameter)
Definition: rmodulon.cc:91
number nrnMod(number a, number b, const coeffs r)
Definition: rmodulon.cc:644
BOOLEAN nrnGreaterZero(number k, const coeffs r)
Definition: rmodulon.cc:526
static const n_coeffType ID2
Definition: rmodulon.cc:28
void nrnInitExp(unsigned long c, const coeffs r)
Definition: rmodulon.cc:923
number nrnDiv(number a, number b, const coeffs r)
Definition: rmodulon.cc:611
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
number nrnAnn(number a, const coeffs r)
Definition: rmodulon.cc:576
const ring r
Definition: syzextra.cc:208
static char * nrnCoeffString(const coeffs r)
Definition: rmodulon.cc:97
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:531
const char * nrnRead(const char *s, number *a, const coeffs r)
Definition: rmodulon.cc:972
#define assume(x)
Definition: mod2.h:405
const ExtensionInfo & info
< [in] sqrfree poly
BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
Definition: rmodulon.cc:934
int nrnSize(number a, const coeffs r)
Definition: rmodulon.cc:254
unsigned long exp
Definition: rmodulon.h:18
(mpz_ptr), see rmodulon,h
Definition: coeffs.h:114
static const n_coeffType ID
Our Type!
Definition: rmodulon.cc:27
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:422
void nrnPower(number a, int i, number *result, const coeffs r)
Definition: rmodulon.cc:280
number nrnAdd(number a, number b, const coeffs r)
Definition: rmodulon.cc:288
BOOLEAN nrnGreater(number a, number b, const coeffs r)
Definition: rmodulon.cc:521
static void nrnKillChar(coeffs r)
Definition: rmodulon.cc:109
number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition: rmodulon.cc:397
number nrnCopy(number a, const coeffs r)
Definition: rmodulon.cc:247
number nrnGetUnit(number a, const coeffs r)
Definition: rmodulon.cc:539
number nrnSub(number a, number b, const coeffs r)
Definition: rmodulon.cc:297
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:496
BOOLEAN nrnIsZero(number a, const coeffs r)
Definition: rmodulon.cc:488
int nrnDivComp(number a, number b, const coeffs r)
Definition: rmodulon.cc:603
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
Definition: rmodulon.cc:826
BOOLEAN nrnEqual(number a, number b, const coeffs r)
Definition: rmodulon.cc:516
#define nrnWrite
Definition: rmodulon.cc:63
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:231
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:314
void nrnCoeffWrite(const coeffs r, BOOLEAN details)
Definition: rmodulon.cc:81
long nrnInt(number &n, const coeffs r)
Definition: rmodulon.cc:263
number nrnNeg(number c, const coeffs r)
Definition: rmodulon.cc:306
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:339
coeffs nrnQuot1(number c, const coeffs r)
Definition: rmodulon.cc:117
void nrnInitExp ( unsigned long  c,
const coeffs  r 
)

Definition at line 923 of file rmodulon.cc.

924 {
925  nrnSetExp(m, r);
926  assume (r->modNumber != NULL);
927 //CF: in general, the modulus is computed somewhere. I don't want to
928 // check it's size before I construct the best ring.
929 // if (mpz_cmp_ui(r->modNumber,2) <= 0)
930 // WarnS("nrnInitExp failed (m in Z/m too small)");
931 }
void nrnSetExp(unsigned long c, const coeffs r)
Definition: rmodulon.cc:911
#define assume(x)
Definition: mod2.h:405
int m
Definition: cfEzgcd.cc:119
#define NULL
Definition: omList.c:10
long nrnInt ( number &  n,
const coeffs  r 
)

Definition at line 263 of file rmodulon.cc.

264 {
265  return mpz_get_si((mpz_ptr) n);
266 }
number nrnIntDiv ( number  a,
number  b,
const coeffs  r 
)

Definition at line 676 of file rmodulon.cc.

677 {
678  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
679  mpz_init(erg);
680  if (a == NULL) a = (number)r->modNumber;
681  mpz_tdiv_q(erg, (mpz_ptr)a, (mpz_ptr)b);
682  return (number)erg;
683 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
#define NULL
Definition: omList.c:10
const poly b
Definition: syzextra.cc:213
number nrnInvers ( number  c,
const coeffs  r 
)

Definition at line 314 of file rmodulon.cc.

315 {
316  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
317  mpz_init(erg);
318  mpz_invert(erg, (mpz_ptr)c, r->modNumber);
319  return (number) erg;
320 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
omBin gmp_nrz_bin
Definition: rintegers.cc:80
BOOLEAN nrnIsMOne ( number  a,
const coeffs  r 
)

Definition at line 504 of file rmodulon.cc.

505 {
506 #ifdef LDEBUG
507  if (a == NULL) return FALSE;
508 #endif
509  mpz_t t; mpz_init_set(t, (mpz_ptr)a);
510  mpz_add_ui(t, t, 1);
511  bool erg = (0 == mpz_cmp(t, r->modNumber));
512  mpz_clear(t);
513  return erg;
514 }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:140
#define NULL
Definition: omList.c:10
BOOLEAN nrnIsOne ( number  a,
const coeffs  r 
)

Definition at line 496 of file rmodulon.cc.

497 {
498 #ifdef LDEBUG
499  if (a == NULL) return FALSE;
500 #endif
501  return 0 == mpz_cmp_si((mpz_ptr)a, 1);
502 }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:140
#define NULL
Definition: omList.c:10
BOOLEAN nrnIsUnit ( number  a,
const coeffs  r 
)

Definition at line 531 of file rmodulon.cc.

532 {
533  number tmp = nrnGcd(a, (number)r->modNumber, r);
534  bool res = nrnIsOne(tmp, r);
535  nrnDelete(&tmp, NULL);
536  return res;
537 }
const poly a
Definition: syzextra.cc:212
poly res
Definition: myNF.cc:322
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
#define NULL
Definition: omList.c:10
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:496
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:339
BOOLEAN nrnIsZero ( number  a,
const coeffs  r 
)

Definition at line 488 of file rmodulon.cc.

489 {
490 #ifdef LDEBUG
491  if (a == NULL) return FALSE;
492 #endif
493  return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
494 }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:140
#define NULL
Definition: omList.c:10
static void nrnKillChar ( coeffs  r)
static

Definition at line 109 of file rmodulon.cc.

110 {
111  mpz_clear(r->modNumber);
112  mpz_clear(r->modBase);
113  omFreeBin((void *) r->modBase, gmp_nrz_bin);
114  omFreeBin((void *) r->modNumber, gmp_nrz_bin);
115 }
omBin gmp_nrz_bin
Definition: rintegers.cc:80
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
number nrnLcm ( number  a,
number  b,
const coeffs  r 
)

Definition at line 326 of file rmodulon.cc.

327 {
328  number erg = nrnGcd(NULL, a, r);
329  number tmp = nrnGcd(NULL, b, r);
330  mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
331  nrnDelete(&tmp, r);
332  return (number)erg;
333 }
const poly a
Definition: syzextra.cc:212
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
#define NULL
Definition: omList.c:10
const poly b
Definition: syzextra.cc:213
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:339
number nrnMap2toM ( number  from,
const coeffs  ,
const coeffs  dst 
)

Definition at line 743 of file rmodulon.cc.

744 {
745  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
746  mpz_init(erg);
747  mpz_mul_ui(erg, nrnMapCoef, (unsigned long)from);
748  mpz_mod(erg, erg, dst->modNumber);
749  return (number)erg;
750 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:736
omBin gmp_nrz_bin
Definition: rintegers.cc:80
number nrnMapGMP ( number  from,
const coeffs  ,
const coeffs  dst 
)

Definition at line 762 of file rmodulon.cc.

763 {
764  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
765  mpz_init(erg);
766  mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
767  return (number)erg;
768 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
omBin gmp_nrz_bin
Definition: rintegers.cc:80
number nrnMapModN ( number  from,
const coeffs  ,
const coeffs  dst 
)

Definition at line 738 of file rmodulon.cc.

739 {
740  return nrnMult(from, (number) nrnMapCoef, dst);
741 }
number nrnMult(number a, number b, const coeffs r)
Definition: rmodulon.cc:271
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:736
number nrnMapQ ( number  from,
const coeffs  src,
const coeffs  dst 
)

Definition at line 817 of file rmodulon.cc.

818 {
819  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
820  mpz_init(erg);
821  nlGMP(from, (number)erg, src); // FIXME? TODO? // extern void nlGMP(number &i, number n, const coeffs r); // to be replaced with n_MPZ(erg, from, src); // ?
822  mpz_mod(erg, erg, dst->modNumber);
823  return (number)erg;
824 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
void nlGMP(number &i, number n, const coeffs r)
Definition: longrat.cc:1467
omBin gmp_nrz_bin
Definition: rintegers.cc:80
number nrnMapZ ( number  from,
const coeffs  src,
const coeffs  dst 
)

Definition at line 783 of file rmodulon.cc.

784 {
785  if (SR_HDL(from) & SR_INT)
786  {
787  long f_i=SR_TO_INT(from);
788  return nrnInit(f_i,dst);
789  }
790  return nrnMapGMP(from,src,dst);
791 }
number nrnMapGMP(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:762
#define SR_TO_INT(SR)
Definition: longrat.h:67
#define SR_INT
Definition: longrat.h:65
#define SR_HDL(A)
Definition: tgb.cc:35
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:231
number nrnMapZp ( number  from,
const coeffs  ,
const coeffs  dst 
)

Definition at line 752 of file rmodulon.cc.

753 {
754  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
755  mpz_init(erg);
756  // TODO: use npInt(...)
757  mpz_mul_si(erg, nrnMapCoef, (unsigned long)from);
758  mpz_mod(erg, erg, dst->modNumber);
759  return (number)erg;
760 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
void mpz_mul_si(mpz_ptr r, mpz_srcptr s, long int si)
Definition: longrat.cc:179
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:736
omBin gmp_nrz_bin
Definition: rintegers.cc:80
number nrnMod ( number  a,
number  b,
const coeffs  r 
)

Definition at line 644 of file rmodulon.cc.

645 {
646  /*
647  We need to return the number rr which is uniquely determined by the
648  following two properties:
649  (1) 0 <= rr < |b| (with respect to '<' and '<=' performed in Z x Z)
650  (2) There exists some k in the integers Z such that a = k * b + rr.
651  Consider g := gcd(n, |b|). Note that then |b|/g is a unit in Z/n.
652  Now, there are three cases:
653  (a) g = 1
654  Then |b| is a unit in Z/n, i.e. |b| (and also b) divides a.
655  Thus rr = 0.
656  (b) g <> 1 and g divides a
657  Then a = (a/g) * (|b|/g)^(-1) * b (up to sign), i.e. again rr = 0.
658  (c) g <> 1 and g does not divide a
659  Then denote the division with remainder of a by g as this:
660  a = s * g + t. Then t = a - s * g = a - s * (|b|/g)^(-1) * |b|
661  fulfills (1) and (2), i.e. rr := t is the correct result. Hence
662  in this third case, rr is the remainder of division of a by g in Z.
663  Remark: according to mpz_mod: a,b are always non-negative
664  */
665  mpz_ptr g = (mpz_ptr)omAllocBin(gmp_nrz_bin);
666  mpz_ptr rr = (mpz_ptr)omAllocBin(gmp_nrz_bin);
667  mpz_init(g);
668  mpz_init_set_si(rr, 0);
669  mpz_gcd(g, (mpz_ptr)r->modNumber, (mpz_ptr)b); // g is now as above
670  if (mpz_cmp_si(g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a, g); // the case g <> 1
671  mpz_clear(g);
673  return (number)rr;
674 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
g
Definition: cfModGcd.cc:4031
omBin gmp_nrz_bin
Definition: rintegers.cc:80
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
const poly b
Definition: syzextra.cc:213
number nrnMult ( number  a,
number  b,
const coeffs  r 
)

Definition at line 271 of file rmodulon.cc.

272 {
273  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
274  mpz_init(erg);
275  mpz_mul(erg, (mpz_ptr)a, (mpz_ptr) b);
276  mpz_mod(erg, erg, r->modNumber);
277  return (number) erg;
278 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
const poly b
Definition: syzextra.cc:213
number nrnNeg ( number  c,
const coeffs  r 
)

Definition at line 306 of file rmodulon.cc.

307 {
308  if( !nrnIsZero(c, r) )
309  // Attention: This method operates in-place.
310  mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
311  return c;
312 }
BOOLEAN nrnIsZero(number a, const coeffs r)
Definition: rmodulon.cc:488
void nrnPower ( number  a,
int  i,
number *  result,
const coeffs  r 
)

Definition at line 280 of file rmodulon.cc.

281 {
282  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
283  mpz_init(erg);
284  mpz_powm_ui(erg, (mpz_ptr)a, i, r->modNumber);
285  *result = (number) erg;
286 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
int i
Definition: cfEzgcd.cc:123
return result
Definition: facAbsBiFact.cc:76
coeffs nrnQuot1 ( number  c,
const coeffs  r 
)

Definition at line 117 of file rmodulon.cc.

118 {
119  coeffs rr;
120  long ch = r->cfInt(c, r);
121  mpz_t a,b;
122  mpz_init_set(a, r->modNumber);
123  mpz_init_set_ui(b, ch);
124  mpz_ptr gcd;
125  gcd = (mpz_ptr) omAlloc(sizeof(mpz_t));
126  mpz_init(gcd);
127  mpz_gcd(gcd, a,b);
128  if(mpz_cmp_ui(gcd, 1) == 0)
129  {
130  WerrorS("constant in q-ideal is coprime to modulus in ground ring");
131  WerrorS("Unable to create qring!");
132  return NULL;
133  }
134  if(r->modExponent == 1)
135  {
136  ZnmInfo info;
137  info.base = gcd;
138  info.exp = (unsigned long) 1;
139  rr = nInitChar(n_Zn, (void*)&info);
140  }
141  else
142  {
143  ZnmInfo info;
144  info.base = r->modBase;
145  int kNew = 1;
146  mpz_t baseTokNew;
147  mpz_init(baseTokNew);
148  mpz_set(baseTokNew, r->modBase);
149  while(mpz_cmp(gcd, baseTokNew) > 0)
150  {
151  kNew++;
152  mpz_mul(baseTokNew, baseTokNew, r->modBase);
153  }
154  //printf("\nkNew = %i\n",kNew);
155  info.exp = kNew;
156  mpz_clear(baseTokNew);
157  rr = nInitChar(n_Znm, (void*)&info);
158  }
159  return(rr);
160 }
mpz_ptr base
Definition: rmodulon.h:18
const poly a
Definition: syzextra.cc:212
only used if HAVE_RINGS is defined: ?
Definition: coeffs.h:43
void WerrorS(const char *s)
Definition: feFopen.cc:24
#define omAlloc(size)
Definition: omAllocDecl.h:210
only used if HAVE_RINGS is defined: ?
Definition: coeffs.h:44
The main handler for Singular numbers which are suitable for Singular polynomials.
const ExtensionInfo & info
< [in] sqrfree poly
unsigned long exp
Definition: rmodulon.h:18
#define NULL
Definition: omList.c:10
int gcd(int a, int b)
Definition: walkSupport.cc:839
const poly b
Definition: syzextra.cc:213
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
Definition: numbers.cc:327
number nrnQuotRem ( number  a,
number  b,
number *  s,
const coeffs  r 
)

Definition at line 700 of file rmodulon.cc.

701 {
702  mpz_t g, aa, bb;
703  mpz_ptr qq = (mpz_ptr)omAllocBin(gmp_nrz_bin);
704  mpz_ptr rr = (mpz_ptr)omAllocBin(gmp_nrz_bin);
705  mpz_init(qq);
706  mpz_init(rr);
707  mpz_init(g);
708  mpz_init_set(aa, (mpz_ptr)a);
709  mpz_init_set(bb, (mpz_ptr)b);
710 
711  mpz_gcd(g, bb, r->modNumber);
712  mpz_mod(rr, aa, g);
713  mpz_sub(aa, aa, rr);
714  mpz_gcd(g, aa, g);
715  mpz_div(aa, aa, g);
716  mpz_div(bb, bb, g);
717  mpz_div(g, r->modNumber, g);
718  mpz_invert(g, bb, g);
719  mpz_mul(qq, aa, g);
720  if (rem)
721  *rem = (number)rr;
722  else {
723  mpz_clear(rr);
724  omFreeBin(rr, gmp_nrz_bin);
725  }
726  mpz_clear(g);
727  mpz_clear(aa);
728  mpz_clear(bb);
729  return (number) qq;
730 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
void rem(unsigned long *a, unsigned long *q, unsigned long p, int &dega, int degq)
Definition: minpoly.cc:574
const poly a
Definition: syzextra.cc:212
g
Definition: cfModGcd.cc:4031
omBin gmp_nrz_bin
Definition: rintegers.cc:80
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
const poly b
Definition: syzextra.cc:213
const char * nrnRead ( const char *  s,
number *  a,
const coeffs  r 
)

Definition at line 972 of file rmodulon.cc.

973 {
974  mpz_ptr z = (mpz_ptr) omAllocBin(gmp_nrz_bin);
975  {
976  s = nlCPEatLongC((char *)s, z);
977  }
978  mpz_mod(z, z, r->modNumber);
979  *a = (number) z;
980  return s;
981 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const CanonicalForm int s
Definition: facAbsFact.cc:55
const poly a
Definition: syzextra.cc:212
static const char * nlCPEatLongC(char *s, mpz_ptr i)
Definition: rmodulon.cc:948
omBin gmp_nrz_bin
Definition: rintegers.cc:80
void nrnSetExp ( unsigned long  c,
const coeffs  r 
)

Definition at line 911 of file rmodulon.cc.

912 {
913  /* clean up former stuff */
914  if (r->modNumber != NULL) mpz_clear(r->modNumber);
915 
916  r->modExponent= m;
917  r->modNumber = (mpz_ptr)omAllocBin(gmp_nrz_bin);
918  mpz_init_set (r->modNumber, r->modBase);
919  mpz_pow_ui (r->modNumber, r->modNumber, m);
920 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
omBin gmp_nrz_bin
Definition: rintegers.cc:80
int m
Definition: cfEzgcd.cc:119
#define NULL
Definition: omList.c:10
nMapFunc nrnSetMap ( const coeffs  src,
const coeffs  dst 
)

Definition at line 826 of file rmodulon.cc.

827 {
828  /* dst = nrn */
829  if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src))
830  {
831  return nrnMapZ;
832  }
833  if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/)
834  {
835  return nrnMapZ;
836  }
837  if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Q(src)) or Z*/
838  {
839  return nrnMapQ;
840  }
841  // Some type of Z/n ring / field
842  if (nCoeff_is_Ring_ModN(src) || nCoeff_is_Ring_PtoM(src) ||
843  nCoeff_is_Ring_2toM(src) || nCoeff_is_Zp(src))
844  {
845  if ( (!nCoeff_is_Zp(src))
846  && (mpz_cmp(src->modBase, dst->modBase) == 0)
847  && (src->modExponent == dst->modExponent)) return nrnMapGMP;
848  else
849  {
850  mpz_ptr nrnMapModul = (mpz_ptr) omAllocBin(gmp_nrz_bin);
851  // Computing the n of Z/n
852  if (nCoeff_is_Zp(src))
853  {
854  mpz_init_set_si(nrnMapModul, src->ch);
855  }
856  else
857  {
858  mpz_init(nrnMapModul);
859  mpz_set(nrnMapModul, src->modNumber);
860  }
861  // nrnMapCoef = 1 in dst if dst is a subring of src
862  // nrnMapCoef = 0 in dst / src if src is a subring of dst
863  if (nrnMapCoef == NULL)
864  {
865  nrnMapCoef = (mpz_ptr) omAllocBin(gmp_nrz_bin);
866  mpz_init(nrnMapCoef);
867  }
868  if (mpz_divisible_p(nrnMapModul, dst->modNumber))
869  {
870  mpz_set_si(nrnMapCoef, 1);
871  }
872  else
873  if (nrnDivBy(NULL, (number) nrnMapModul,dst))
874  {
875  mpz_divexact(nrnMapCoef, dst->modNumber, nrnMapModul);
876  mpz_ptr tmp = dst->modNumber;
877  dst->modNumber = nrnMapModul;
878  if (!nrnIsUnit((number) nrnMapCoef,dst))
879  {
880  dst->modNumber = tmp;
881  nrnDelete((number*) &nrnMapModul, dst);
882  return NULL;
883  }
884  mpz_ptr inv = (mpz_ptr) nrnInvers((number) nrnMapCoef,dst);
885  dst->modNumber = tmp;
886  mpz_mul(nrnMapCoef, nrnMapCoef, inv);
887  mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
888  nrnDelete((number*) &inv, dst);
889  }
890  else
891  {
892  nrnDelete((number*) &nrnMapModul, dst);
893  return NULL;
894  }
895  nrnDelete((number*) &nrnMapModul, dst);
896  if (nCoeff_is_Ring_2toM(src))
897  return nrnMap2toM;
898  else if (nCoeff_is_Zp(src))
899  return nrnMapZp;
900  else
901  return nrnMapModN;
902  }
903  }
904  return NULL; // default
905 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
Definition: coeffs.h:749
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition: coeffs.h:823
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
Definition: coeffs.h:755
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
Definition: coeffs.h:746
(), see rinteger.h, new impl.
Definition: coeffs.h:111
BOOLEAN nrnDivBy(number a, number b, const coeffs r)
Definition: rmodulon.cc:589
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:736
number nrnMapZ(number from, const coeffs src, const coeffs dst)
Definition: rmodulon.cc:783
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
number nrnMap2toM(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:743
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:531
number nrnMapQ(number from, const coeffs src, const coeffs dst)
Definition: rmodulon.cc:817
omBin gmp_nrz_bin
Definition: rintegers.cc:80
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
Definition: coeffs.h:752
number nrnMapGMP(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:762
(mpz_ptr), see rmodulon,h
Definition: coeffs.h:114
(number), see longrat.h
Definition: coeffs.h:110
#define NULL
Definition: omList.c:10
number nrnMapZp(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:752
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:314
number nrnMapModN(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:738
int nrnSize ( number  a,
const coeffs  r 
)

Definition at line 254 of file rmodulon.cc.

255 {
256  if (a == NULL) return 0;
257  return sizeof(mpz_t);
258 }
const poly a
Definition: syzextra.cc:212
#define NULL
Definition: omList.c:10
number nrnSub ( number  a,
number  b,
const coeffs  r 
)

Definition at line 297 of file rmodulon.cc.

298 {
299  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
300  mpz_init(erg);
301  mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
302  mpz_mod(erg, erg, r->modNumber);
303  return (number) erg;
304 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:80
const poly b
Definition: syzextra.cc:213
number nrnXExtGcd ( number  a,
number  b,
number *  s,
number *  t,
number *  u,
number *  v,
const coeffs  r 
)

Definition at line 397 of file rmodulon.cc.

398 {
399  number xx;
400 #ifdef CF_DEB
401  StringSetS("XExtGcd of ");
402  nrnWrite(a, r);
403  StringAppendS("\t");
404  nrnWrite(b, r);
405  StringAppendS(" modulo ");
406  nrnWrite(xx = (number)r->modNumber, r);
407  Print("%s\n", StringEndS());
408 #endif
409 
410  mpz_ptr one = (mpz_ptr)omAllocBin(gmp_nrz_bin);
411  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
412  mpz_ptr bs = (mpz_ptr)omAllocBin(gmp_nrz_bin);
413  mpz_ptr bt = (mpz_ptr)omAllocBin(gmp_nrz_bin);
414  mpz_ptr bu = (mpz_ptr)omAllocBin(gmp_nrz_bin);
415  mpz_ptr bv = (mpz_ptr)omAllocBin(gmp_nrz_bin);
416  mpz_init(erg);
417  mpz_init(one);
418  mpz_init_set(bs, (mpz_ptr) a);
419  mpz_init_set(bt, (mpz_ptr) b);
420  mpz_init(bu);
421  mpz_init(bv);
422  mpz_gcd(erg, bs, bt);
423 
424 #ifdef CF_DEB
425  StringSetS("1st gcd:");
426  nrnWrite(xx= (number)erg, r);
427 #endif
428 
429  mpz_gcd(erg, erg, r->modNumber);
430 
431  mpz_div(bs, bs, erg);
432  mpz_div(bt, bt, erg);
433 
434 #ifdef CF_DEB
435  Print("%s\n", StringEndS());
436  StringSetS("xgcd: ");
437 #endif
438 
439  mpz_gcdext(one, bu, bv, bs, bt);
440  number ui = nrnGetUnit(xx = (number) one, r);
441 #ifdef CF_DEB
442  n_Write(xx, r);
443  StringAppendS("\t");
444  n_Write(ui, r);
445  Print("%s\n", StringEndS());
446 #endif
447  nrnDelete(&xx, r);
448  if (!nrnIsOne(ui, r)) {
449 #ifdef CF_DEB
450  Print("Scaling\n");
451 #endif
452  number uii = nrnInvers(ui, r);
453  nrnDelete(&ui, r);
454  ui = uii;
455  mpz_ptr uu = (mpz_ptr)omAllocBin(gmp_nrz_bin);
456  mpz_init_set(uu, (mpz_ptr)ui);
457  mpz_mul(bu, bu, uu);
458  mpz_mul(bv, bv, uu);
459  mpz_clear(uu);
460  omFreeBin(uu, gmp_nrz_bin);
461  }
462  nrnDelete(&ui, r);
463 #ifdef CF_DEB
464  StringSetS("xgcd");
465  nrnWrite(xx= (number)bs, r);
466  StringAppendS("*");
467  nrnWrite(xx= (number)bu, r);
468  StringAppendS(" + ");
469  nrnWrite(xx= (number)bt, r);
470  StringAppendS("*");
471  nrnWrite(xx= (number)bv, r);
472  Print("%s\n", StringEndS());
473 #endif
474 
475  mpz_mod(bs, bs, r->modNumber);
476  mpz_mod(bt, bt, r->modNumber);
477  mpz_mod(bu, bu, r->modNumber);
478  mpz_mod(bv, bv, r->modNumber);
479  *s = (number)bu;
480  *t = (number)bv;
481  *u = (number)bt;
482  *u = nrnNeg(*u, r);
483  *v = (number)bs;
484  return (number)erg;
485 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const CanonicalForm int s
Definition: facAbsFact.cc:55
const poly a
Definition: syzextra.cc:212
#define Print
Definition: emacs.cc:83
char * StringEndS()
Definition: reporter.cc:151
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:239
void StringSetS(const char *st)
Definition: reporter.cc:128
void StringAppendS(const char *st)
Definition: reporter.cc:107
static FORCE_INLINE void n_Write(number &n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition: coeffs.h:592
omBin gmp_nrz_bin
Definition: rintegers.cc:80
const Variable & v
< [in] a sqrfree bivariate poly
Definition: facBivar.h:37
number nrnGetUnit(number a, const coeffs r)
Definition: rmodulon.cc:539
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:496
#define nrnWrite
Definition: rmodulon.cc:63
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:314
const poly b
Definition: syzextra.cc:213
number nrnNeg(number c, const coeffs r)
Definition: rmodulon.cc:306

Variable Documentation

omBin gmp_nrz_bin

Definition at line 80 of file rintegers.cc.

const n_coeffType ID = n_Zn
static

Our Type!

Definition at line 27 of file rmodulon.cc.

const n_coeffType ID2 = n_Znm
static

Definition at line 28 of file rmodulon.cc.

mpz_ptr nrnMapCoef = NULL

Definition at line 736 of file rmodulon.cc.