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 954 of file rmodulon.cc.

955 {
956  const char * start=s;
957  if (!(*s >= '0' && *s <= '9'))
958  {
959  mpz_init_set_si(i, 1);
960  return s;
961  }
962  mpz_init(i);
963  while (*s >= '0' && *s <= '9') s++;
964  if (*s=='\0')
965  {
966  mpz_set_str(i,start,10);
967  }
968  else
969  {
970  char c=*s;
971  *s='\0';
972  mpz_set_str(i,start,10);
973  *s=c;
974  }
975  return s;
976 }
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 292 of file rmodulon.cc.

293 {
294  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
295  mpz_init(erg);
296  mpz_add(erg, (mpz_ptr)a, (mpz_ptr) b);
297  mpz_mod(erg, erg, r->modNumber);
298  return (number) erg;
299 }
#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 582 of file rmodulon.cc.

583 {
584  mpz_ptr tmp = (mpz_ptr) omAllocBin(gmp_nrz_bin);
585  mpz_init(tmp);
586  mpz_gcd(tmp, (mpz_ptr) k, r->modNumber);
587  if (mpz_cmp_si(tmp, 1)==0) {
588  mpz_set_si(tmp, 0);
589  return (number) tmp;
590  }
591  mpz_divexact(tmp, r->modNumber, tmp);
592  return (number) tmp;
593 }
#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  #ifdef SINGULAR_4_1
101  char* s = (char*) omAlloc(15+l);
102  if (nCoeff_is_Ring_ModN(r)) sprintf(s,"ZZ/%s",b);
103  else /*if (nCoeff_is_Ring_PtoM(r))*/ sprintf(s,"ZZ/(bigint(%s)^%lu)",b,r->modExponent);
104  #else
105  char* s = (char*) omAlloc(7+2+10+l);
106  if (nCoeff_is_Ring_ModN(r)) sprintf(s,"integer,%s",b);
107  else /*if (nCoeff_is_Ring_PtoM(r))*/ sprintf(s,"integer,%s^%lu",b,r->modExponent);
108  #endif
109  omFreeSize(b,l);
110  return s;
111 }
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:116
#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 251 of file rmodulon.cc.

252 {
253  mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
254  mpz_init_set(erg, (mpz_ptr) a);
255  return (number) erg;
256 }
#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 940 of file rmodulon.cc.

941 {
942  if (a==NULL) return TRUE;
943  if ( (mpz_cmp_si((mpz_ptr) a, 0) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
944  {
945  return FALSE;
946  }
947  return TRUE;
948 }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:95
#define TRUE
Definition: auxiliary.h:99
#define NULL
Definition: omList.c:10

§ nrnDelete()

void nrnDelete ( number *  a,
const coeffs  r 
)

Definition at line 243 of file rmodulon.cc.

244 {
245  if (*a == NULL) return;
246  mpz_clear((mpz_ptr) *a);
247  omFreeBin((void *) *a, gmp_nrz_bin);
248  *a = NULL;
249 }
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 617 of file rmodulon.cc.

618 {
619  if (a == NULL) a = (number)r->modNumber;
620  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
621  mpz_init(erg);
622  if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)b))
623  {
624  mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)b);
625  return (number)erg;
626  }
627  else
628  {
629  mpz_ptr gcd = (mpz_ptr)nrnGcd(a, b, r);
630  mpz_divexact(erg, (mpz_ptr)b, gcd);
631  if (!nrnIsUnit((number)erg, r))
632  {
633  WerrorS("Division not possible, even by cancelling zero divisors.");
634  WerrorS("Result is integer division without remainder.");
635  mpz_tdiv_q(erg, (mpz_ptr) a, (mpz_ptr) b);
636  nrnDelete((number*) &gcd, NULL);
637  return (number)erg;
638  }
639  // a / gcd(a,b) * [b / gcd (a,b)]^(-1)
640  mpz_ptr tmp = (mpz_ptr)nrnInvers((number) erg,r);
641  mpz_divexact(erg, (mpz_ptr)a, gcd);
642  mpz_mul(erg, erg, tmp);
643  nrnDelete((number*) &gcd, NULL);
644  nrnDelete((number*) &tmp, NULL);
645  mpz_mod(erg, erg, r->modNumber);
646  return (number)erg;
647  }
648 }
#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:243
const ring r
Definition: syzextra.cc:208
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:537
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:318
const poly b
Definition: syzextra.cc:213
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:343

§ nrnDivBy()

BOOLEAN nrnDivBy ( number  a,
number  b,
const coeffs  r 
)

Definition at line 595 of file rmodulon.cc.

596 {
597  if (a == NULL)
598  return mpz_divisible_p(r->modNumber, (mpz_ptr)b);
599  else
600  { /* b divides a iff b/gcd(a, b) is a unit in the given ring: */
601  number n = nrnGcd(a, b, r);
602  mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)b, (mpz_ptr)n);
603  bool result = nrnIsUnit(n, r);
604  nrnDelete(&n, NULL);
605  return result;
606  }
607 }
const poly a
Definition: syzextra.cc:212
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:243
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:537
#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:343

§ nrnDivComp()

int nrnDivComp ( number  a,
number  b,
const coeffs  r 
)

Definition at line 609 of file rmodulon.cc.

610 {
611  if (nrnEqual(a, b,r)) return 2;
612  if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr) b)) return -1;
613  if (mpz_divisible_p((mpz_ptr) b, (mpz_ptr) a)) return 1;
614  return 0;
615 }
const poly a
Definition: syzextra.cc:212
BOOLEAN nrnEqual(number a, number b, const coeffs r)
Definition: rmodulon.cc:522
const poly b
Definition: syzextra.cc:213

§ nrnEqual()

BOOLEAN nrnEqual ( number  a,
number  b,
const coeffs  r 
)

Definition at line 522 of file rmodulon.cc.

523 {
524  return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
525 }
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 377 of file rmodulon.cc.

378 {
379  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
380  mpz_ptr bs = (mpz_ptr)omAllocBin(gmp_nrz_bin);
381  mpz_ptr bt = (mpz_ptr)omAllocBin(gmp_nrz_bin);
382  mpz_init(erg);
383  mpz_init(bs);
384  mpz_init(bt);
385  mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
386  mpz_mod(bs, bs, r->modNumber);
387  mpz_mod(bt, bt, r->modNumber);
388  *s = (number)bs;
389  *t = (number)bt;
390  return (number)erg;
391 }
#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 343 of file rmodulon.cc.

344 {
345  if ((a == NULL) && (b == NULL)) return nrnInit(0,r);
346  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
347  mpz_init_set(erg, r->modNumber);
348  if (a != NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
349  if (b != NULL) mpz_gcd(erg, erg, (mpz_ptr)b);
350  return (number)erg;
351 }
#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:235
const poly b
Definition: syzextra.cc:213

§ nrnGetUnit()

number nrnGetUnit ( number  a,
const coeffs  r 
)

Definition at line 545 of file rmodulon.cc.

546 {
547  if (mpz_divisible_p(r->modNumber, (mpz_ptr)k)) return nrnInit(1,r);
548 
549  mpz_ptr unit = (mpz_ptr)nrnGcd(k, 0, r);
550  mpz_tdiv_q(unit, (mpz_ptr)k, unit);
551  mpz_ptr gcd = (mpz_ptr)nrnGcd((number)unit, 0, r);
552  if (!nrnIsOne((number)gcd,r))
553  {
554  mpz_ptr ctmp;
555  // tmp := unit^2
556  mpz_ptr tmp = (mpz_ptr) nrnMult((number) unit,(number) unit,r);
557  // gcd_new := gcd(tmp, 0)
558  mpz_ptr gcd_new = (mpz_ptr) nrnGcd((number) tmp, 0, r);
559  while (!nrnEqual((number) gcd_new,(number) gcd,r))
560  {
561  // gcd := gcd_new
562  ctmp = gcd;
563  gcd = gcd_new;
564  gcd_new = ctmp;
565  // tmp := tmp * unit
566  mpz_mul(tmp, tmp, unit);
567  mpz_mod(tmp, tmp, r->modNumber);
568  // gcd_new := gcd(tmp, 0)
569  mpz_gcd(gcd_new, tmp, r->modNumber);
570  }
571  // unit := unit + modNumber / gcd_new
572  mpz_tdiv_q(tmp, r->modNumber, gcd_new);
573  mpz_add(unit, unit, tmp);
574  mpz_mod(unit, unit, r->modNumber);
575  nrnDelete((number*) &gcd_new, NULL);
576  nrnDelete((number*) &tmp, NULL);
577  }
578  nrnDelete((number*) &gcd, NULL);
579  return (number)unit;
580 }
number nrnMult(number a, number b, const coeffs r)
Definition: rmodulon.cc:275
int k
Definition: cfEzgcd.cc:93
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:243
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:501
BOOLEAN nrnEqual(number a, number b, const coeffs r)
Definition: rmodulon.cc:522
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:235
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:343

§ nrnGreater()

BOOLEAN nrnGreater ( number  a,
number  b,
const coeffs  r 
)

Definition at line 527 of file rmodulon.cc.

528 {
529  return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
530 }
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 532 of file rmodulon.cc.

533 {
534  return 0 < mpz_cmp_si((mpz_ptr)k, 0);
535 }
int k
Definition: cfEzgcd.cc:93

§ nrnInit()

number nrnInit ( long  i,
const coeffs  r 
)

Definition at line 235 of file rmodulon.cc.

236 {
237  mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
238  mpz_init_set_si(erg, i);
239  mpz_mod(erg, erg, r->modNumber);
240  return (number) erg;
241 }
#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 167 of file rmodulon.cc.

168 {
169  assume( (getCoeffType(r) == n_Zn) || (getCoeffType (r) == n_Znm) );
170  ZnmInfo * info= (ZnmInfo *) p;
171  r->modBase= (mpz_ptr)nrnCopy((number)info->base, r); //this circumvents the problem
172  //in bigintmat.cc where we cannot create a "legal" nrn that can be freed.
173  //If we take a copy, we can do whatever we want.
174 
175  nrnInitExp (info->exp, r);
176 
177  /* next computation may yield wrong characteristic as r->modNumber
178  is a GMP number */
179  r->ch = mpz_get_ui(r->modNumber);
180 
181  r->is_field=FALSE;
182  r->is_domain=FALSE;
183  r->rep=n_rep_gmp;
184 
185 
186  r->cfCoeffString = nrnCoeffString;
187 
188  r->cfInit = nrnInit;
189  r->cfDelete = nrnDelete;
190  r->cfCopy = nrnCopy;
191  r->cfSize = nrnSize;
192  r->cfInt = nrnInt;
193  r->cfAdd = nrnAdd;
194  r->cfSub = nrnSub;
195  r->cfMult = nrnMult;
196  r->cfDiv = nrnDiv;
197  r->cfAnn = nrnAnn;
198  r->cfIntMod = nrnMod;
199  r->cfExactDiv = nrnDiv;
200  r->cfInpNeg = nrnNeg;
201  r->cfInvers = nrnInvers;
202  r->cfDivBy = nrnDivBy;
203  r->cfDivComp = nrnDivComp;
204  r->cfGreater = nrnGreater;
205  r->cfEqual = nrnEqual;
206  r->cfIsZero = nrnIsZero;
207  r->cfIsOne = nrnIsOne;
208  r->cfIsMOne = nrnIsMOne;
209  r->cfGreaterZero = nrnGreaterZero;
210  r->cfWriteLong = nrnWrite;
211  r->cfRead = nrnRead;
212  r->cfPower = nrnPower;
213  r->cfSetMap = nrnSetMap;
214  //r->cfNormalize = ndNormalize;
215  r->cfLcm = nrnLcm;
216  r->cfGcd = nrnGcd;
217  r->cfIsUnit = nrnIsUnit;
218  r->cfGetUnit = nrnGetUnit;
219  r->cfExtGcd = nrnExtGcd;
220  r->cfXExtGcd = nrnXExtGcd;
221  r->cfQuotRem = nrnQuotRem;
222  r->cfCoeffWrite = nrnCoeffWrite;
223  r->nCoeffIsEqual = nrnCoeffsEqual;
224  r->cfKillChar = nrnKillChar;
225  r->cfQuot1 = nrnQuot1;
226 #ifdef LDEBUG
227  r->cfDBTest = nrnDBTest;
228 #endif
229  return FALSE;
230 }
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:275
number nrnQuotRem(number a, number b, number *s, const coeffs r)
Definition: rmodulon.cc:706
#define FALSE
Definition: auxiliary.h:95
return P p
Definition: myNF.cc:203
number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
Definition: rmodulon.cc:377
number nrnLcm(number a, number b, const coeffs r)
Definition: rmodulon.cc:330
BOOLEAN nrnIsMOne(number a, const coeffs r)
Definition: rmodulon.cc:509
BOOLEAN nrnDivBy(number a, number b, const coeffs r)
Definition: rmodulon.cc:595
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:650
BOOLEAN nrnGreaterZero(number k, const coeffs r)
Definition: rmodulon.cc:532
void nrnInitExp(unsigned long c, const coeffs r)
Definition: rmodulon.cc:929
number nrnDiv(number a, number b, const coeffs r)
Definition: rmodulon.cc:617
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:243
number nrnAnn(number a, const coeffs r)
Definition: rmodulon.cc:582
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:537
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:978
#define assume(x)
Definition: mod2.h:403
const ExtensionInfo & info
< [in] sqrfree poly
BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
Definition: rmodulon.cc:940
int nrnSize(number a, const coeffs r)
Definition: rmodulon.cc:258
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:284
number nrnAdd(number a, number b, const coeffs r)
Definition: rmodulon.cc:292
BOOLEAN nrnGreater(number a, number b, const coeffs r)
Definition: rmodulon.cc:527
static void nrnKillChar(coeffs r)
Definition: rmodulon.cc:113
number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition: rmodulon.cc:401
number nrnCopy(number a, const coeffs r)
Definition: rmodulon.cc:251
number nrnGetUnit(number a, const coeffs r)
Definition: rmodulon.cc:545
number nrnSub(number a, number b, const coeffs r)
Definition: rmodulon.cc:301
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:501
BOOLEAN nrnIsZero(number a, const coeffs r)
Definition: rmodulon.cc:493
int nrnDivComp(number a, number b, const coeffs r)
Definition: rmodulon.cc:609
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
Definition: rmodulon.cc:832
BOOLEAN nrnEqual(number a, number b, const coeffs r)
Definition: rmodulon.cc:522
#define nrnWrite
Definition: rmodulon.cc:59
number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:235
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:318
void nrnCoeffWrite(const coeffs r, BOOLEAN details)
Definition: rmodulon.cc:77
long nrnInt(number &n, const coeffs r)
Definition: rmodulon.cc:267
number nrnNeg(number c, const coeffs r)
Definition: rmodulon.cc:310
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:343
coeffs nrnQuot1(number c, const coeffs r)
Definition: rmodulon.cc:121

§ nrnInitExp()

void nrnInitExp ( unsigned long  c,
const coeffs  r 
)

Definition at line 929 of file rmodulon.cc.

930 {
931  nrnSetExp(m, r);
932  assume (r->modNumber != NULL);
933 //CF: in general, the modulus is computed somewhere. I don't want to
934 // check it's size before I construct the best ring.
935 // if (mpz_cmp_ui(r->modNumber,2) <= 0)
936 // WarnS("nrnInitExp failed (m in Z/m too small)");
937 }
void nrnSetExp(unsigned long c, const coeffs r)
Definition: rmodulon.cc:917
#define assume(x)
Definition: mod2.h:403
int m
Definition: cfEzgcd.cc:119
#define NULL
Definition: omList.c:10

§ nrnInt()

long nrnInt ( number &  n,
const coeffs  r 
)

Definition at line 267 of file rmodulon.cc.

268 {
269  return mpz_get_si((mpz_ptr) n);
270 }

§ nrnIntDiv()

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

Definition at line 682 of file rmodulon.cc.

683 {
684  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
685  mpz_init(erg);
686  if (a == NULL) a = (number)r->modNumber;
687  mpz_tdiv_q(erg, (mpz_ptr)a, (mpz_ptr)b);
688  return (number)erg;
689 }
#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 318 of file rmodulon.cc.

319 {
320  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
321  mpz_init(erg);
322  mpz_invert(erg, (mpz_ptr)c, r->modNumber);
323  return (number) erg;
324 }
#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 509 of file rmodulon.cc.

510 {
511 #ifdef LDEBUG
512  if (a == NULL) return FALSE;
513 #endif
514  if(nrnIsOne(a,r)) return FALSE; // for char 2
515  mpz_t t; mpz_init_set(t, (mpz_ptr)a);
516  mpz_add_ui(t, t, 1);
517  bool erg = (0 == mpz_cmp(t, r->modNumber));
518  mpz_clear(t);
519  return erg;
520 }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:95
#define NULL
Definition: omList.c:10
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:501

§ nrnIsOne()

BOOLEAN nrnIsOne ( number  a,
const coeffs  r 
)

Definition at line 501 of file rmodulon.cc.

502 {
503 #ifdef LDEBUG
504  if (a == NULL) return FALSE;
505 #endif
506  return 0 == mpz_cmp_si((mpz_ptr)a, 1);
507 }
const poly a
Definition: syzextra.cc:212
#define FALSE
Definition: auxiliary.h:95
#define NULL
Definition: omList.c:10

§ nrnIsUnit()

BOOLEAN nrnIsUnit ( number  a,
const coeffs  r 
)

Definition at line 537 of file rmodulon.cc.

538 {
539  number tmp = nrnGcd(a, (number)r->modNumber, r);
540  bool res = nrnIsOne(tmp, r);
541  nrnDelete(&tmp, NULL);
542  return res;
543 }
const poly a
Definition: syzextra.cc:212
poly res
Definition: myNF.cc:322
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:243
#define NULL
Definition: omList.c:10
BOOLEAN nrnIsOne(number a, const coeffs r)
Definition: rmodulon.cc:501
number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:343

§ nrnIsZero()

BOOLEAN nrnIsZero ( number  a,
const coeffs  r 
)

Definition at line 493 of file rmodulon.cc.

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

§ nrnKillChar()

static void nrnKillChar ( coeffs  r)
static

Definition at line 113 of file rmodulon.cc.

114 {
115  mpz_clear(r->modNumber);
116  mpz_clear(r->modBase);
117  omFreeBin((void *) r->modBase, gmp_nrz_bin);
118  omFreeBin((void *) r->modNumber, gmp_nrz_bin);
119 }
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 330 of file rmodulon.cc.

331 {
332  number erg = nrnGcd(NULL, a, r);
333  number tmp = nrnGcd(NULL, b, r);
334  mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
335  nrnDelete(&tmp, r);
336  return (number)erg;
337 }
const poly a
Definition: syzextra.cc:212
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:243
#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:343

§ nrnMap2toM()

number nrnMap2toM ( number  from,
const coeffs  ,
const coeffs  dst 
)

Definition at line 749 of file rmodulon.cc.

750 {
751  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
752  mpz_init(erg);
753  mpz_mul_ui(erg, nrnMapCoef, (unsigned long)from);
754  mpz_mod(erg, erg, dst->modNumber);
755  return (number)erg;
756 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:742
omBin gmp_nrz_bin
Definition: rintegers.cc:76

§ nrnMapGMP()

number nrnMapGMP ( number  from,
const coeffs  ,
const coeffs  dst 
)

Definition at line 768 of file rmodulon.cc.

769 {
770  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
771  mpz_init(erg);
772  mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
773  return (number)erg;
774 }
#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 744 of file rmodulon.cc.

745 {
746  return nrnMult(from, (number) nrnMapCoef, dst);
747 }
number nrnMult(number a, number b, const coeffs r)
Definition: rmodulon.cc:275
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:742

§ nrnMapQ()

number nrnMapQ ( number  from,
const coeffs  src,
const coeffs  dst 
)

Definition at line 823 of file rmodulon.cc.

824 {
825  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
826  mpz_init(erg);
827  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); // ?
828  mpz_mod(erg, erg, dst->modNumber);
829  return (number)erg;
830 }
#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 789 of file rmodulon.cc.

790 {
791  if (SR_HDL(from) & SR_INT)
792  {
793  long f_i=SR_TO_INT(from);
794  return nrnInit(f_i,dst);
795  }
796  return nrnMapGMP(from,src,dst);
797 }
number nrnMapGMP(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:768
#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:235

§ nrnMapZp()

number nrnMapZp ( number  from,
const coeffs  ,
const coeffs  dst 
)

Definition at line 758 of file rmodulon.cc.

759 {
760  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
761  mpz_init(erg);
762  // TODO: use npInt(...)
763  mpz_mul_si(erg, nrnMapCoef, (unsigned long)from);
764  mpz_mod(erg, erg, dst->modNumber);
765  return (number)erg;
766 }
#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:742
omBin gmp_nrz_bin
Definition: rintegers.cc:76

§ nrnMod()

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

Definition at line 650 of file rmodulon.cc.

651 {
652  /*
653  We need to return the number rr which is uniquely determined by the
654  following two properties:
655  (1) 0 <= rr < |b| (with respect to '<' and '<=' performed in Z x Z)
656  (2) There exists some k in the integers Z such that a = k * b + rr.
657  Consider g := gcd(n, |b|). Note that then |b|/g is a unit in Z/n.
658  Now, there are three cases:
659  (a) g = 1
660  Then |b| is a unit in Z/n, i.e. |b| (and also b) divides a.
661  Thus rr = 0.
662  (b) g <> 1 and g divides a
663  Then a = (a/g) * (|b|/g)^(-1) * b (up to sign), i.e. again rr = 0.
664  (c) g <> 1 and g does not divide a
665  Then denote the division with remainder of a by g as this:
666  a = s * g + t. Then t = a - s * g = a - s * (|b|/g)^(-1) * |b|
667  fulfills (1) and (2), i.e. rr := t is the correct result. Hence
668  in this third case, rr is the remainder of division of a by g in Z.
669  Remark: according to mpz_mod: a,b are always non-negative
670  */
671  mpz_ptr g = (mpz_ptr)omAllocBin(gmp_nrz_bin);
672  mpz_ptr rr = (mpz_ptr)omAllocBin(gmp_nrz_bin);
673  mpz_init(g);
674  mpz_init_set_si(rr, 0);
675  mpz_gcd(g, (mpz_ptr)r->modNumber, (mpz_ptr)b); // g is now as above
676  if (mpz_cmp_si(g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a, g); // the case g <> 1
677  mpz_clear(g);
679  return (number)rr;
680 }
#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 275 of file rmodulon.cc.

276 {
277  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
278  mpz_init(erg);
279  mpz_mul(erg, (mpz_ptr)a, (mpz_ptr) b);
280  mpz_mod(erg, erg, r->modNumber);
281  return (number) erg;
282 }
#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 310 of file rmodulon.cc.

311 {
312  if( !nrnIsZero(c, r) )
313  // Attention: This method operates in-place.
314  mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
315  return c;
316 }
BOOLEAN nrnIsZero(number a, const coeffs r)
Definition: rmodulon.cc:493

§ nrnPower()

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

Definition at line 284 of file rmodulon.cc.

285 {
286  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
287  mpz_init(erg);
288  mpz_powm_ui(erg, (mpz_ptr)a, i, r->modNumber);
289  *result = (number) erg;
290 }
#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 121 of file rmodulon.cc.

122 {
123  coeffs rr;
124  long ch = r->cfInt(c, r);
125  mpz_t a,b;
126  mpz_init_set(a, r->modNumber);
127  mpz_init_set_ui(b, ch);
128  mpz_ptr gcd;
129  gcd = (mpz_ptr) omAlloc(sizeof(mpz_t));
130  mpz_init(gcd);
131  mpz_gcd(gcd, a,b);
132  if(mpz_cmp_ui(gcd, 1) == 0)
133  {
134  WerrorS("constant in q-ideal is coprime to modulus in ground ring");
135  WerrorS("Unable to create qring!");
136  return NULL;
137  }
138  if(r->modExponent == 1)
139  {
140  ZnmInfo info;
141  info.base = gcd;
142  info.exp = (unsigned long) 1;
143  rr = nInitChar(n_Zn, (void*)&info);
144  }
145  else
146  {
147  ZnmInfo info;
148  info.base = r->modBase;
149  int kNew = 1;
150  mpz_t baseTokNew;
151  mpz_init(baseTokNew);
152  mpz_set(baseTokNew, r->modBase);
153  while(mpz_cmp(gcd, baseTokNew) > 0)
154  {
155  kNew++;
156  mpz_mul(baseTokNew, baseTokNew, r->modBase);
157  }
158  //printf("\nkNew = %i\n",kNew);
159  info.exp = kNew;
160  mpz_clear(baseTokNew);
161  rr = nInitChar(n_Znm, (void*)&info);
162  }
163  return(rr);
164 }
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 706 of file rmodulon.cc.

707 {
708  mpz_t g, aa, bb;
709  mpz_ptr qq = (mpz_ptr)omAllocBin(gmp_nrz_bin);
710  mpz_ptr rr = (mpz_ptr)omAllocBin(gmp_nrz_bin);
711  mpz_init(qq);
712  mpz_init(rr);
713  mpz_init(g);
714  mpz_init_set(aa, (mpz_ptr)a);
715  mpz_init_set(bb, (mpz_ptr)b);
716 
717  mpz_gcd(g, bb, r->modNumber);
718  mpz_mod(rr, aa, g);
719  mpz_sub(aa, aa, rr);
720  mpz_gcd(g, aa, g);
721  mpz_div(aa, aa, g);
722  mpz_div(bb, bb, g);
723  mpz_div(g, r->modNumber, g);
724  mpz_invert(g, bb, g);
725  mpz_mul(qq, aa, g);
726  if (rem)
727  *rem = (number)rr;
728  else {
729  mpz_clear(rr);
730  omFreeBin(rr, gmp_nrz_bin);
731  }
732  mpz_clear(g);
733  mpz_clear(aa);
734  mpz_clear(bb);
735  return (number) qq;
736 }
#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 978 of file rmodulon.cc.

979 {
980  mpz_ptr z = (mpz_ptr) omAllocBin(gmp_nrz_bin);
981  {
982  s = nlCPEatLongC((char *)s, z);
983  }
984  mpz_mod(z, z, r->modNumber);
985  *a = (number) z;
986  return s;
987 }
#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:954
omBin gmp_nrz_bin
Definition: rintegers.cc:76

§ nrnSetExp()

void nrnSetExp ( unsigned long  c,
const coeffs  r 
)

Definition at line 917 of file rmodulon.cc.

918 {
919  /* clean up former stuff */
920  if (r->modNumber != NULL) mpz_clear(r->modNumber);
921 
922  r->modExponent= m;
923  r->modNumber = (mpz_ptr)omAllocBin(gmp_nrz_bin);
924  mpz_init_set (r->modNumber, r->modBase);
925  mpz_pow_ui (r->modNumber, r->modNumber, m);
926 }
#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 832 of file rmodulon.cc.

833 {
834  /* dst = nrn */
835  if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src))
836  {
837  return nrnMapZ;
838  }
839  if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/)
840  {
841  return nrnMapZ;
842  }
843  if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Q(src)) or Z*/
844  {
845  return nrnMapQ;
846  }
847  // Some type of Z/n ring / field
848  if (nCoeff_is_Ring_ModN(src) || nCoeff_is_Ring_PtoM(src) ||
849  nCoeff_is_Ring_2toM(src) || nCoeff_is_Zp(src))
850  {
851  if ( (!nCoeff_is_Zp(src))
852  && (mpz_cmp(src->modBase, dst->modBase) == 0)
853  && (src->modExponent == dst->modExponent)) return nrnMapGMP;
854  else
855  {
856  mpz_ptr nrnMapModul = (mpz_ptr) omAllocBin(gmp_nrz_bin);
857  // Computing the n of Z/n
858  if (nCoeff_is_Zp(src))
859  {
860  mpz_init_set_si(nrnMapModul, src->ch);
861  }
862  else
863  {
864  mpz_init(nrnMapModul);
865  mpz_set(nrnMapModul, src->modNumber);
866  }
867  // nrnMapCoef = 1 in dst if dst is a subring of src
868  // nrnMapCoef = 0 in dst / src if src is a subring of dst
869  if (nrnMapCoef == NULL)
870  {
871  nrnMapCoef = (mpz_ptr) omAllocBin(gmp_nrz_bin);
872  mpz_init(nrnMapCoef);
873  }
874  if (mpz_divisible_p(nrnMapModul, dst->modNumber))
875  {
876  mpz_set_si(nrnMapCoef, 1);
877  }
878  else
879  if (nrnDivBy(NULL, (number) nrnMapModul,dst))
880  {
881  mpz_divexact(nrnMapCoef, dst->modNumber, nrnMapModul);
882  mpz_ptr tmp = dst->modNumber;
883  dst->modNumber = nrnMapModul;
884  if (!nrnIsUnit((number) nrnMapCoef,dst))
885  {
886  dst->modNumber = tmp;
887  nrnDelete((number*) &nrnMapModul, dst);
888  return NULL;
889  }
890  mpz_ptr inv = (mpz_ptr) nrnInvers((number) nrnMapCoef,dst);
891  dst->modNumber = tmp;
892  mpz_mul(nrnMapCoef, nrnMapCoef, inv);
893  mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
894  nrnDelete((number*) &inv, dst);
895  }
896  else
897  {
898  nrnDelete((number*) &nrnMapModul, dst);
899  return NULL;
900  }
901  nrnDelete((number*) &nrnMapModul, dst);
902  if (nCoeff_is_Ring_2toM(src))
903  return nrnMap2toM;
904  else if (nCoeff_is_Zp(src))
905  return nrnMapZp;
906  else
907  return nrnMapModN;
908  }
909  }
910  return NULL; // default
911 }
#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:595
mpz_ptr nrnMapCoef
Definition: rmodulon.cc:742
number nrnMapZ(number from, const coeffs src, const coeffs dst)
Definition: rmodulon.cc:789
void nrnDelete(number *a, const coeffs r)
Definition: rmodulon.cc:243
number nrnMap2toM(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:749
BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:537
number nrnMapQ(number from, const coeffs src, const coeffs dst)
Definition: rmodulon.cc:823
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:768
(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:758
number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:318
number nrnMapModN(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:744

§ nrnSize()

int nrnSize ( number  a,
const coeffs  r 
)

Definition at line 258 of file rmodulon.cc.

259 {
260  if (a == NULL) return 0;
261  return sizeof(mpz_t);
262 }
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 301 of file rmodulon.cc.

302 {
303  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
304  mpz_init(erg);
305  mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
306  mpz_mod(erg, erg, r->modNumber);
307  return (number) erg;
308 }
#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 401 of file rmodulon.cc.

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

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 742 of file rmodulon.cc.