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

omBin gmp_nrz_bin
 
mpz_ptr nrnMapCoef = NULL
 

Macro Definition Documentation

§ nrnWrite

#define nrnWrite   nrzWrite

Definition at line 59 of file rmodulon.cc.

Function Documentation

§ nlCPEatLongC()

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

§ nrnAdd()

number nrnAdd ( number  a,
number  b,
const coeffs  r 
)

Definition at line 286 of file rmodulon.cc.

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

§ nrnAnn()

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:76

§ nrnCoeffsEqual()

static BOOLEAN nrnCoeffsEqual ( const coeffs  r,
n_coeffType  n,
void *  parameter 
)
static

Definition at line 89 of file rmodulon.cc.

90 {
91  /* test, if r is an instance of nInitCoeffs(n,parameter) */
92  return (n==n_Zn) && (mpz_cmp_ui(r->modNumber,(long)parameter)==0);
93 }
only used if HAVE_RINGS is defined
Definition: coeffs.h:44

§ nrnCoeffString()

static char* nrnCoeffString ( const coeffs  r)
static

Definition at line 95 of file rmodulon.cc.

96 {
97  size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
98  char* b = (char*) omAlloc(l);
99  b= mpz_get_str (b, 10, r->modBase);
100  char* s = (char*) omAlloc(15+l);
101  if (nCoeff_is_Ring_ModN(r)) sprintf(s,"ZZ/%s",b);
102  else /*if (nCoeff_is_Ring_PtoM(r))*/ sprintf(s,"ZZ/(bigint(%s)^%lu)",b,r->modExponent);
103  omFreeSize(b,l);
104  return s;
105 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
Definition: coeffs.h:753
#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

§ nrnCoeffWrite()

void nrnCoeffWrite ( const coeffs  r,
BOOLEAN  details 
)

Definition at line 77 of file rmodulon.cc.

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

§ nrnCopy()

number nrnCopy ( number  a,
const coeffs  r 
)

Definition at line 245 of file rmodulon.cc.

246 {
247  mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
248  mpz_init_set(erg, (mpz_ptr) a);
249  return (number) erg;
250 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:76

§ nrnDBTest()

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:94
#define TRUE
Definition: auxiliary.h:98
#define NULL
Definition: omList.c:10

§ nrnDelete()

void nrnDelete ( number *  a,
const coeffs  r 
)

Definition at line 237 of file rmodulon.cc.

238 {
239  if (*a == NULL) return;
240  mpz_clear((mpz_ptr) *a);
241  omFreeBin((void *) *a, gmp_nrz_bin);
242  *a = NULL;
243 }
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:76
#define NULL
Definition: omList.c:10
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259

§ nrnDiv()

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:237
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:76
#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:312
const poly b
Definition: syzextra.cc:213
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:337

§ nrnDivBy()

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:237
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:337

§ nrnDivComp()

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

§ nrnEqual()

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

§ nrnExtGcd()

number nrnExtGcd ( number  a,
number  b,
number *  s,
number *  t,
const coeffs  r 
)

Definition at line 371 of file rmodulon.cc.

372 {
373  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
374  mpz_ptr bs = (mpz_ptr)omAllocBin(gmp_nrz_bin);
375  mpz_ptr bt = (mpz_ptr)omAllocBin(gmp_nrz_bin);
376  mpz_init(erg);
377  mpz_init(bs);
378  mpz_init(bt);
379  mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
380  mpz_mod(bs, bs, r->modNumber);
381  mpz_mod(bt, bt, r->modNumber);
382  *s = (number)bs;
383  *t = (number)bt;
384  return (number)erg;
385 }
#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:76
const poly b
Definition: syzextra.cc:213

§ nrnGcd()

number nrnGcd ( number  a,
number  b,
const coeffs  r 
)

Definition at line 337 of file rmodulon.cc.

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

§ nrnGetUnit()

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:269
int k
Definition: cfEzgcd.cc:93
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:237
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:495
BOOLEAN nrnEqual(number a, number b, const coeffs r)
Definition: rmodulon.cc:516
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:229
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:337

§ nrnGreater()

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

§ nrnGreaterZero()

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

§ nrnInit()

number nrnInit ( long  i,
const coeffs  r 
)

Definition at line 229 of file rmodulon.cc.

230 {
231  mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
232  mpz_init_set_si(erg, i);
233  mpz_mod(erg, erg, r->modNumber);
234  return (number) erg;
235 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
omBin gmp_nrz_bin
Definition: rintegers.cc:76
int i
Definition: cfEzgcd.cc:123

§ nrnInitChar()

BOOLEAN nrnInitChar ( coeffs  r,
void *  p 
)

Definition at line 161 of file rmodulon.cc.

162 {
163  assume( (getCoeffType(r) == n_Zn) || (getCoeffType (r) == n_Znm) );
164  ZnmInfo * info= (ZnmInfo *) p;
165  r->modBase= (mpz_ptr)nrnCopy((number)info->base, r); //this circumvents the problem
166  //in bigintmat.cc where we cannot create a "legal" nrn that can be freed.
167  //If we take a copy, we can do whatever we want.
168 
169  nrnInitExp (info->exp, r);
170 
171  /* next computation may yield wrong characteristic as r->modNumber
172  is a GMP number */
173  r->ch = mpz_get_ui(r->modNumber);
174 
175  r->is_field=FALSE;
176  r->is_domain=FALSE;
177  r->rep=n_rep_gmp;
178 
179 
180  r->cfCoeffString = nrnCoeffString;
181 
182  r->cfInit = nrnInit;
183  r->cfDelete = nrnDelete;
184  r->cfCopy = nrnCopy;
185  r->cfSize = nrnSize;
186  r->cfInt = nrnInt;
187  r->cfAdd = nrnAdd;
188  r->cfSub = nrnSub;
189  r->cfMult = nrnMult;
190  r->cfDiv = nrnDiv;
191  r->cfAnn = nrnAnn;
192  r->cfIntMod = nrnMod;
193  r->cfExactDiv = nrnDiv;
194  r->cfInpNeg = nrnNeg;
195  r->cfInvers = nrnInvers;
196  r->cfDivBy = nrnDivBy;
197  r->cfDivComp = nrnDivComp;
198  r->cfGreater = nrnGreater;
199  r->cfEqual = nrnEqual;
200  r->cfIsZero = nrnIsZero;
201  r->cfIsOne = nrnIsOne;
202  r->cfIsMOne = nrnIsMOne;
203  r->cfGreaterZero = nrnGreaterZero;
204  r->cfWriteLong = nrnWrite;
205  r->cfRead = nrnRead;
206  r->cfPower = nrnPower;
207  r->cfSetMap = nrnSetMap;
208  //r->cfNormalize = ndNormalize;
209  r->cfLcm = nrnLcm;
210  r->cfGcd = nrnGcd;
211  r->cfIsUnit = nrnIsUnit;
212  r->cfGetUnit = nrnGetUnit;
213  r->cfExtGcd = nrnExtGcd;
214  r->cfXExtGcd = nrnXExtGcd;
215  r->cfQuotRem = nrnQuotRem;
216  r->cfCoeffWrite = nrnCoeffWrite;
217  r->nCoeffIsEqual = nrnCoeffsEqual;
218  r->cfKillChar = nrnKillChar;
219  r->cfQuot1 = nrnQuot1;
220 #ifdef LDEBUG
221  r->cfDBTest = nrnDBTest;
222 #endif
223  return FALSE;
224 }
mpz_ptr base
Definition: rmodulon.h:19
only used if HAVE_RINGS is defined
Definition: coeffs.h:44
number nrnMult(number a, number b, const coeffs r)
Definition: rmodulon.cc:269
number nrnQuotRem(number a, number b, number *s, const coeffs r)
Definition: rmodulon.cc:700
#define FALSE
Definition: auxiliary.h:94
return P p
Definition: myNF.cc:203
number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
Definition: rmodulon.cc:371
number nrnLcm(number a, number b, const coeffs r)
Definition: rmodulon.cc:324
BOOLEAN nrnIsMOne(number a, const coeffs r)
Definition: rmodulon.cc:503
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:89
number nrnMod(number a, number b, const coeffs r)
Definition: rmodulon.cc:644
BOOLEAN nrnGreaterZero(number k, const coeffs r)
Definition: rmodulon.cc:526
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:237
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:95
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:531
only used if HAVE_RINGS is defined
Definition: coeffs.h:45
const char * nrnRead(const char *s, number *a, const coeffs r)
Definition: rmodulon.cc:972
#define assume(x)
Definition: mod2.h:394
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:252
unsigned long exp
Definition: rmodulon.h:19
(mpz_ptr), see rmodulon,h
Definition: coeffs.h:115
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:425
void nrnPower(number a, int i, number *result, const coeffs r)
Definition: rmodulon.cc:278
number nrnAdd(number a, number b, const coeffs r)
Definition: rmodulon.cc:286
BOOLEAN nrnGreater(number a, number b, const coeffs r)
Definition: rmodulon.cc:521
static void nrnKillChar(coeffs r)
Definition: rmodulon.cc:107
number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition: rmodulon.cc:395
number nrnCopy(number a, const coeffs r)
Definition: rmodulon.cc:245
number nrnGetUnit(number a, const coeffs r)
Definition: rmodulon.cc:539
number nrnSub(number a, number b, const coeffs r)
Definition: rmodulon.cc:295
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:495
BOOLEAN nrnIsZero(number a, const coeffs r)
Definition: rmodulon.cc:487
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:59
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:229
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:312
void nrnCoeffWrite(const coeffs r, BOOLEAN details)
Definition: rmodulon.cc:77
long nrnInt(number &n, const coeffs r)
Definition: rmodulon.cc:261
number nrnNeg(number c, const coeffs r)
Definition: rmodulon.cc:304
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:337
coeffs nrnQuot1(number c, const coeffs r)
Definition: rmodulon.cc:115

§ nrnInitExp()

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:394
int m
Definition: cfEzgcd.cc:119
#define NULL
Definition: omList.c:10

§ nrnInt()

long nrnInt ( number &  n,
const coeffs  r 
)

Definition at line 261 of file rmodulon.cc.

262 {
263  return mpz_get_si((mpz_ptr) n);
264 }

§ nrnIntDiv()

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:76
#define NULL
Definition: omList.c:10
const poly b
Definition: syzextra.cc:213

§ nrnInvers()

number nrnInvers ( number  c,
const coeffs  r 
)

Definition at line 312 of file rmodulon.cc.

313 {
314  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
315  mpz_init(erg);
316  mpz_invert(erg, (mpz_ptr)c, r->modNumber);
317  return (number) erg;
318 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
omBin gmp_nrz_bin
Definition: rintegers.cc:76

§ nrnIsMOne()

BOOLEAN nrnIsMOne ( number  a,
const coeffs  r 
)

Definition at line 503 of file rmodulon.cc.

504 {
505 #ifdef LDEBUG
506  if (a == NULL) return FALSE;
507 #endif
508  if(nrnIsOne(a,r)) return FALSE; // for char 2
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:94
#define NULL
Definition: omList.c:10
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:495

§ nrnIsOne()

BOOLEAN nrnIsOne ( number  a,
const coeffs  r 
)

Definition at line 495 of file rmodulon.cc.

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

§ nrnIsUnit()

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:237
#define NULL
Definition: omList.c:10
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:495
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:337

§ nrnIsZero()

BOOLEAN nrnIsZero ( number  a,
const coeffs  r 
)

Definition at line 487 of file rmodulon.cc.

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

§ nrnKillChar()

static void nrnKillChar ( coeffs  r)
static

Definition at line 107 of file rmodulon.cc.

108 {
109  mpz_clear(r->modNumber);
110  mpz_clear(r->modBase);
111  omFreeBin((void *) r->modBase, gmp_nrz_bin);
112  omFreeBin((void *) r->modNumber, gmp_nrz_bin);
113 }
omBin gmp_nrz_bin
Definition: rintegers.cc:76
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259

§ nrnLcm()

number nrnLcm ( number  a,
number  b,
const coeffs  r 
)

Definition at line 324 of file rmodulon.cc.

325 {
326  number erg = nrnGcd(NULL, a, r);
327  number tmp = nrnGcd(NULL, b, r);
328  mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
329  nrnDelete(&tmp, r);
330  return (number)erg;
331 }
const poly a
Definition: syzextra.cc:212
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:237
#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:337

§ nrnMap2toM()

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:76

§ nrnMapGMP()

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:76

§ nrnMapModN()

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:269
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:736

§ nrnMapQ()

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:76

§ nrnMapZ()

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:70
#define SR_INT
Definition: longrat.h:68
#define SR_HDL(A)
Definition: tgb.cc:35
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:229

§ nrnMapZp()

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:177
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:736
omBin gmp_nrz_bin
Definition: rintegers.cc:76

§ nrnMod()

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:76
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
const poly b
Definition: syzextra.cc:213

§ nrnMult()

number nrnMult ( number  a,
number  b,
const coeffs  r 
)

Definition at line 269 of file rmodulon.cc.

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

§ nrnNeg()

number nrnNeg ( number  c,
const coeffs  r 
)

Definition at line 304 of file rmodulon.cc.

305 {
306  if( !nrnIsZero(c, r) )
307  // Attention: This method operates in-place.
308  mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
309  return c;
310 }
BOOLEAN nrnIsZero(number a, const coeffs r)
Definition: rmodulon.cc:487

§ nrnPower()

void nrnPower ( number  a,
int  i,
number *  result,
const coeffs  r 
)

Definition at line 278 of file rmodulon.cc.

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

§ nrnQuot1()

coeffs nrnQuot1 ( number  c,
const coeffs  r 
)

Definition at line 115 of file rmodulon.cc.

116 {
117  coeffs rr;
118  long ch = r->cfInt(c, r);
119  mpz_t a,b;
120  mpz_init_set(a, r->modNumber);
121  mpz_init_set_ui(b, ch);
122  mpz_ptr gcd;
123  gcd = (mpz_ptr) omAlloc(sizeof(mpz_t));
124  mpz_init(gcd);
125  mpz_gcd(gcd, a,b);
126  if(mpz_cmp_ui(gcd, 1) == 0)
127  {
128  WerrorS("constant in q-ideal is coprime to modulus in ground ring");
129  WerrorS("Unable to create qring!");
130  return NULL;
131  }
132  if(r->modExponent == 1)
133  {
134  ZnmInfo info;
135  info.base = gcd;
136  info.exp = (unsigned long) 1;
137  rr = nInitChar(n_Zn, (void*)&info);
138  }
139  else
140  {
141  ZnmInfo info;
142  info.base = r->modBase;
143  int kNew = 1;
144  mpz_t baseTokNew;
145  mpz_init(baseTokNew);
146  mpz_set(baseTokNew, r->modBase);
147  while(mpz_cmp(gcd, baseTokNew) > 0)
148  {
149  kNew++;
150  mpz_mul(baseTokNew, baseTokNew, r->modBase);
151  }
152  //printf("\nkNew = %i\n",kNew);
153  info.exp = kNew;
154  mpz_clear(baseTokNew);
155  rr = nInitChar(n_Znm, (void*)&info);
156  }
157  return(rr);
158 }
mpz_ptr base
Definition: rmodulon.h:19
const poly a
Definition: syzextra.cc:212
only used if HAVE_RINGS is defined
Definition: coeffs.h:44
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:45
The main handler for Singular numbers which are suitable for Singular polynomials.
const ExtensionInfo & info
< [in] sqrfree poly
unsigned long exp
Definition: rmodulon.h:19
#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:334

§ nrnQuotRem()

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:76
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
const poly b
Definition: syzextra.cc:213

§ nrnRead()

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:76

§ nrnSetExp()

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:76
int m
Definition: cfEzgcd.cc:119
#define NULL
Definition: omList.c:10

§ nrnSetMap()

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:753
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition: coeffs.h:834
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
Definition: coeffs.h:759
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
Definition: coeffs.h:750
(), see rinteger.h, new impl.
Definition: coeffs.h:112
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:237
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:76
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
Definition: coeffs.h:756
number nrnMapGMP(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:762
(mpz_ptr), see rmodulon,h
Definition: coeffs.h:115
(number), see longrat.h
Definition: coeffs.h:111
#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:312
number nrnMapModN(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:738

§ nrnSize()

int nrnSize ( number  a,
const coeffs  r 
)

Definition at line 252 of file rmodulon.cc.

253 {
254  if (a == NULL) return 0;
255  return sizeof(mpz_t);
256 }
const poly a
Definition: syzextra.cc:212
#define NULL
Definition: omList.c:10

§ nrnSub()

number nrnSub ( number  a,
number  b,
const coeffs  r 
)

Definition at line 295 of file rmodulon.cc.

296 {
297  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
298  mpz_init(erg);
299  mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
300  mpz_mod(erg, erg, r->modNumber);
301  return (number) erg;
302 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
const poly a
Definition: syzextra.cc:212
omBin gmp_nrz_bin
Definition: rintegers.cc:76
const poly b
Definition: syzextra.cc:213

§ nrnXExtGcd()

number nrnXExtGcd ( number  a,
number  b,
number *  s,
number *  t,
number *  u,
number *  v,
const coeffs  r 
)

Definition at line 395 of file rmodulon.cc.

396 {
397  number xx;
398 #ifdef CF_DEB
399  StringSetS("XExtGcd of ");
400  nrnWrite(a, r);
401  StringAppendS("\t");
402  nrnWrite(b, r);
403  StringAppendS(" modulo ");
404  nrnWrite(xx = (number)r->modNumber, r);
405  Print("%s\n", StringEndS());
406 #endif
407 
408  mpz_ptr one = (mpz_ptr)omAllocBin(gmp_nrz_bin);
409  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
410  mpz_ptr bs = (mpz_ptr)omAllocBin(gmp_nrz_bin);
411  mpz_ptr bt = (mpz_ptr)omAllocBin(gmp_nrz_bin);
412  mpz_ptr bu = (mpz_ptr)omAllocBin(gmp_nrz_bin);
413  mpz_ptr bv = (mpz_ptr)omAllocBin(gmp_nrz_bin);
414  mpz_init(erg);
415  mpz_init(one);
416  mpz_init_set(bs, (mpz_ptr) a);
417  mpz_init_set(bt, (mpz_ptr) b);
418  mpz_init(bu);
419  mpz_init(bv);
420  mpz_gcd(erg, bs, bt);
421 
422 #ifdef CF_DEB
423  StringSetS("1st gcd:");
424  nrnWrite(xx= (number)erg, r);
425 #endif
426 
427  mpz_gcd(erg, erg, r->modNumber);
428 
429  mpz_div(bs, bs, erg);
430  mpz_div(bt, bt, erg);
431 
432 #ifdef CF_DEB
433  Print("%s\n", StringEndS());
434  StringSetS("xgcd: ");
435 #endif
436 
437  mpz_gcdext(one, bu, bv, bs, bt);
438  number ui = nrnGetUnit(xx = (number) one, r);
439 #ifdef CF_DEB
440  n_Write(xx, r);
441  StringAppendS("\t");
442  n_Write(ui, r);
443  Print("%s\n", StringEndS());
444 #endif
445  nrnDelete(&xx, r);
446  if (!nrnIsOne(ui, r))
447  {
448 #ifdef CF_DEB
449  PrintS("Scaling\n");
450 #endif
451  number uii = nrnInvers(ui, r);
452  nrnDelete(&ui, r);
453  ui = uii;
454  mpz_ptr uu = (mpz_ptr)omAllocBin(gmp_nrz_bin);
455  mpz_init_set(uu, (mpz_ptr)ui);
456  mpz_mul(bu, bu, uu);
457  mpz_mul(bv, bv, uu);
458  mpz_clear(uu);
459  omFreeBin(uu, gmp_nrz_bin);
460  }
461  nrnDelete(&ui, r);
462 #ifdef CF_DEB
463  StringSetS("xgcd");
464  nrnWrite(xx= (number)bs, r);
465  StringAppendS("*");
466  nrnWrite(xx= (number)bu, r);
467  StringAppendS(" + ");
468  nrnWrite(xx= (number)bt, r);
469  StringAppendS("*");
470  nrnWrite(xx= (number)bv, r);
471  Print("%s\n", StringEndS());
472 #endif
473 
474  mpz_mod(bs, bs, r->modNumber);
475  mpz_mod(bt, bt, r->modNumber);
476  mpz_mod(bu, bu, r->modNumber);
477  mpz_mod(bv, bv, r->modNumber);
478  *s = (number)bu;
479  *t = (number)bv;
480  *u = (number)bt;
481  *u = nrnNeg(*u, r);
482  *v = (number)bs;
483  return (number)erg;
484 }
#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:237
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:595
omBin gmp_nrz_bin
Definition: rintegers.cc:76
void PrintS(const char *s)
Definition: reporter.cc:284
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:495
#define nrnWrite
Definition: rmodulon.cc:59
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:312
const poly b
Definition: syzextra.cc:213
number nrnNeg(number c, const coeffs r)
Definition: rmodulon.cc:304

Variable Documentation

§ gmp_nrz_bin

omBin gmp_nrz_bin

Definition at line 76 of file rintegers.cc.

§ nrnMapCoef

mpz_ptr nrnMapCoef = NULL

Definition at line 736 of file rmodulon.cc.