My Project
Loading...
Searching...
No Matches
rmodulon.cc File Reference
#include "misc/auxiliary.h"
#include "misc/mylimits.h"
#include "misc/prime.h"
#include "reporter/reporter.h"
#include "coeffs/si_gmp.h"
#include "coeffs/coeffs.h"
#include "coeffs/modulop.h"
#include "coeffs/rintegers.h"
#include "coeffs/numbers.h"
#include "coeffs/mpr_complex.h"
#include "coeffs/longrat.h"
#include "coeffs/rmodulon.h"
#include <string.h>

Go to the source code of this file.

Macros

#define nrnDelete   nrzDelete
 
#define nrnSize   nrzSize
 

Functions

void nrnWrite (number a, const coeffs)
 
static BOOLEAN nrnDBTest (number a, const char *f, const int l, const coeffs r)
 
coeffs nrnInitCfByName (char *s, n_coeffType)
 
static char * nrnCoeffName (const coeffs r)
 
static BOOLEAN nrnCoeffIsEqual (const coeffs r, n_coeffType n, void *parameter)
 
static void nrnKillChar (coeffs r)
 
static coeffs nrnQuot1 (number c, const coeffs r)
 
static number nrnCopy (number a, const coeffs)
 
static number nrnInit (long i, const coeffs r)
 
static long nrnInt (number &n, const coeffs)
 
static number nrnMult (number a, number b, const coeffs r)
 
static void nrnInpMult (number &a, number b, const coeffs r)
 
static void nrnPower (number a, int i, number *result, const coeffs r)
 
static number nrnAdd (number a, number b, const coeffs r)
 
static void nrnInpAdd (number &a, number b, const coeffs r)
 
static number nrnSub (number a, number b, const coeffs r)
 
static BOOLEAN nrnIsZero (number a, const coeffs)
 
static number nrnNeg (number c, const coeffs r)
 
static number nrnInvers (number c, const coeffs r)
 
static number nrnGcd (number a, number b, const coeffs r)
 
static number nrnLcm (number a, number b, const coeffs r)
 
static number nrnExtGcd (number a, number b, number *s, number *t, const coeffs r)
 
static BOOLEAN nrnIsOne (number a, const coeffs)
 
static BOOLEAN nrnEqual (number a, number b, const coeffs)
 
static number nrnGetUnit (number k, const coeffs r)
 
static number nrnXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
 
static BOOLEAN nrnIsMOne (number a, const coeffs r)
 
static BOOLEAN nrnGreater (number a, number b, const coeffs)
 
static BOOLEAN nrnGreaterZero (number k, const coeffs cf)
 
static BOOLEAN nrnIsUnit (number a, const coeffs r)
 
static number nrnAnn (number k, const coeffs r)
 
static BOOLEAN nrnDivBy (number a, number b, const coeffs r)
 
static int nrnDivComp (number a, number b, const coeffs r)
 
static number nrnDiv (number a, number b, const coeffs r)
 
static number nrnMod (number a, number b, const coeffs r)
 
static number nrnQuotRem (number a, number b, number *rem, const coeffs r)
 
static number nrnMapModN (number from, const coeffs, const coeffs dst)
 
static number nrnMap2toM (number from, const coeffs, const coeffs dst)
 
static number nrnMapZp (number from, const coeffs, const coeffs dst)
 
number nrnMapGMP (number from, const coeffs, const coeffs dst)
 
static number nrnMapQ (number from, const coeffs src, const coeffs dst)
 
static number nrnMapZ (number from, const coeffs src, const coeffs dst)
 
nMapFunc nrnSetMap (const coeffs src, const coeffs dst)
 
static number nrnInitMPZ (mpz_t m, const coeffs r)
 
static void nrnMPZ (mpz_t m, number &n, const coeffs)
 
static void nrnSetExp (unsigned long m, coeffs r)
 
static void nrnInitExp (unsigned long m, coeffs r)
 
static const char * nlCPEatLongC (char *s, mpz_ptr i)
 
static const char * nrnRead (const char *s, number *a, const coeffs r)
 
static number nrnConvFactoryNSingN (const CanonicalForm n, const coeffs r)
 
static CanonicalForm nrnConvSingNFactoryN (number n, BOOLEAN setChar, const coeffs r)
 
BOOLEAN nrnInitChar (coeffs r, void *p)
 

Variables

EXTERN_VAR omBin gmp_nrz_bin
 
STATIC_VAR char * nrnCoeffName_buff =NULL
 
STATIC_VAR mpz_ptr nrnMapCoef = NULL
 

Macro Definition Documentation

◆ nrnDelete

#define nrnDelete   nrzDelete

Definition at line 175 of file rmodulon.cc.

◆ nrnSize

#define nrnSize   nrzSize

Definition at line 176 of file rmodulon.cc.

Function Documentation

◆ nlCPEatLongC()

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

Definition at line 929 of file rmodulon.cc.

930{
931 const char * start=s;
932 if (!(*s >= '0' && *s <= '9'))
933 {
934 mpz_init_set_ui(i, 1);
935 return s;
936 }
937 mpz_init(i);
938 while (*s >= '0' && *s <= '9') s++;
939 if (*s=='\0')
940 {
941 mpz_set_str(i,start,10);
942 }
943 else
944 {
945 char c=*s;
946 *s='\0';
947 mpz_set_str(i,start,10);
948 *s=c;
949 }
950 return s;
951}
int i
Definition cfEzgcd.cc:132
const CanonicalForm int s
Definition facAbsFact.cc:51

◆ nrnAdd()

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

Definition at line 218 of file rmodulon.cc.

219{
220 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
221 mpz_init(erg);
222 mpz_add(erg, (mpz_ptr)a, (mpz_ptr) b);
223 mpz_mod(erg, erg, r->modNumber);
224 return (number) erg;
225}
CanonicalForm b
Definition cfModGcd.cc:4111
#define omAllocBin(bin)
VAR omBin gmp_nrz_bin
Definition rintegers.cc:23

◆ nrnAnn()

static number nrnAnn ( number k,
const coeffs r )
static

Definition at line 549 of file rmodulon.cc.

550{
551 mpz_ptr tmp = (mpz_ptr) omAllocBin(gmp_nrz_bin);
552 mpz_init(tmp);
553 mpz_gcd(tmp, (mpz_ptr) k, r->modNumber);
554 if (mpz_cmp_si(tmp, 1)==0)
555 {
556 mpz_set_ui(tmp, 0);
557 return (number) tmp;
558 }
559 mpz_divexact(tmp, r->modNumber, tmp);
560 return (number) tmp;
561}
int k
Definition cfEzgcd.cc:99

◆ nrnCoeffIsEqual()

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

Definition at line 87 of file rmodulon.cc.

88{
89 /* test, if r is an instance of nInitCoeffs(n,parameter) */
90 ZnmInfo *info=(ZnmInfo*)parameter;
91 return (n==r->type) && (r->modExponent==info->exp)
92 && (mpz_cmp(r->modBase,info->base)==0);
93}
#define info
Definition libparse.cc:1256

◆ nrnCoeffName()

static char * nrnCoeffName ( const coeffs r)
static

Definition at line 64 of file rmodulon.cc.

65{
67 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
68 char* s = (char*) omAlloc(l);
69 l+=24;
71 s= mpz_get_str (s, 10, r->modBase);
72 int ll=0;
73 if (nCoeff_is_Zn(r))
74 {
75 if (strlen(s)<10)
76 ll=snprintf(nrnCoeffName_buff,l,"ZZ/(%s)",s);
77 else
78 ll=snprintf(nrnCoeffName_buff,l,"ZZ/bigint(%s)",s);
79 }
80 else if (nCoeff_is_Ring_PtoM(r))
81 ll=snprintf(nrnCoeffName_buff,l,"ZZ/(bigint(%s)^%lu)",s,r->modExponent);
82 assume(ll<(int)l); // otherwise nrnCoeffName_buff too small
83 omFreeSize((ADDRESS)s, l-22);
84 return nrnCoeffName_buff;
85}
void * ADDRESS
Definition auxiliary.h:120
int l
Definition cfEzgcd.cc:100
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
Definition coeffs.h:727
static FORCE_INLINE BOOLEAN nCoeff_is_Zn(const coeffs r)
Definition coeffs.h:819
#define assume(x)
Definition mod2.h:389
#define omFreeSize(addr, size)
#define omAlloc(size)
#define omFree(addr)
#define NULL
Definition omList.c:12
STATIC_VAR char * nrnCoeffName_buff
Definition rmodulon.cc:63

◆ nrnConvFactoryNSingN()

static number nrnConvFactoryNSingN ( const CanonicalForm n,
const coeffs r )
static

Definition at line 979 of file rmodulon.cc.

980{
981 return nrnInit(n.intval(),r);
982}
long intval() const
conversion functions
static number nrnInit(long i, const coeffs r)
Definition rmodulon.cc:158

◆ nrnConvSingNFactoryN()

static CanonicalForm nrnConvSingNFactoryN ( number n,
BOOLEAN setChar,
const coeffs r )
static

Definition at line 984 of file rmodulon.cc.

985{
986 if (setChar) setCharacteristic( r->ch );
987 return CanonicalForm(nrnInt( n,r ));
988}
void FACTORY_PUBLIC setCharacteristic(int c)
Definition cf_char.cc:28
factory's main class
static long nrnInt(number &n, const coeffs)
Definition rmodulon.cc:169

◆ nrnCopy()

static number nrnCopy ( number a,
const coeffs  )
static

Definition at line 148 of file rmodulon.cc.

149{
150 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
151 mpz_init_set(erg, (mpz_ptr) a);
152 return (number) erg;
153}

◆ nrnDBTest()

static BOOLEAN nrnDBTest ( number a,
const char * f,
const int l,
const coeffs r )
static

Definition at line 915 of file rmodulon.cc.

916{
917 if ( (mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
918 {
919 Warn("mod-n: out of range at %s:%d\n",f,l);
920 return FALSE;
921 }
922 return TRUE;
923}
#define TRUE
Definition auxiliary.h:101
#define FALSE
Definition auxiliary.h:97
FILE * f
Definition checklibs.c:9
#define Warn
Definition emacs.cc:77
#define mpz_sgn1(A)
Definition si_gmp.h:18

◆ nrnDiv()

static number nrnDiv ( number a,
number b,
const coeffs r )
static

Definition at line 581 of file rmodulon.cc.

582{
583 if (nrnIsZero(b,r))
584 {
586 return nrnInit(0,r);
587 }
588 else if (r->is_field)
589 {
590 number inv=nrnInvers(b,r);
591 number erg=nrnMult(a,inv,r);
592 nrnDelete(&inv,r);
593 return erg;
594 }
595 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
596 mpz_init(erg);
597 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)b))
598 {
599 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)b);
600 return (number)erg;
601 }
602 else
603 {
604 mpz_ptr gcd = (mpz_ptr)nrnGcd(a, b, r);
605 mpz_divexact(erg, (mpz_ptr)b, gcd);
606 if (!nrnIsUnit((number)erg, r))
607 {
608 WerrorS("Division not possible, even by cancelling zero divisors.");
609 nrnDelete((number*) &gcd, r);
610 nrnDelete((number*) &erg, r);
611 return (number)NULL;
612 }
613 // a / gcd(a,b) * [b / gcd (a,b)]^(-1)
614 mpz_ptr tmp = (mpz_ptr)nrnInvers((number) erg,r);
615 mpz_divexact(erg, (mpz_ptr)a, gcd);
616 mpz_mul(erg, erg, tmp);
617 nrnDelete((number*) &gcd, r);
618 nrnDelete((number*) &tmp, r);
619 mpz_mod(erg, erg, r->modNumber);
620 return (number)erg;
621 }
622}
void WerrorS(const char *s)
Definition feFopen.cc:24
const char *const nDivBy0
Definition numbers.h:89
static BOOLEAN nrnIsZero(number a, const coeffs)
Definition rmodulon.cc:242
static BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition rmodulon.cc:541
#define nrnDelete
Definition rmodulon.cc:175
static number nrnInvers(number c, const coeffs r)
Definition rmodulon.cc:255
static number nrnMult(number a, number b, const coeffs r)
Definition rmodulon.cc:195
static number nrnGcd(number a, number b, const coeffs r)
Definition rmodulon.cc:275
int gcd(int a, int b)

◆ nrnDivBy()

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

Definition at line 563 of file rmodulon.cc.

564{
565 /* b divides a iff b/gcd(a, b) is a unit in the given ring: */
566 number n = nrnGcd(a, b, r);
567 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)b, (mpz_ptr)n);
568 bool result = nrnIsUnit(n, r);
569 nrnDelete(&n, NULL);
570 return result;
571}
return result

◆ nrnDivComp()

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

Definition at line 573 of file rmodulon.cc.

574{
575 if (nrnEqual(a, b,r)) return 2;
576 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr) b)) return -1;
577 if (mpz_divisible_p((mpz_ptr) b, (mpz_ptr) a)) return 1;
578 return 0;
579}
static BOOLEAN nrnEqual(number a, number b, const coeffs)
Definition rmodulon.cc:348

◆ nrnEqual()

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

Definition at line 348 of file rmodulon.cc.

349{
350 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
351}

◆ nrnExtGcd()

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

Definition at line 327 of file rmodulon.cc.

328{
329 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
330 mpz_ptr bs = (mpz_ptr)omAllocBin(gmp_nrz_bin);
331 mpz_ptr bt = (mpz_ptr)omAllocBin(gmp_nrz_bin);
332 mpz_init(erg);
333 mpz_init(bs);
334 mpz_init(bt);
335 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
336 mpz_mod(bs, bs, r->modNumber);
337 mpz_mod(bt, bt, r->modNumber);
338 *s = (number)bs;
339 *t = (number)bt;
340 return (number)erg;
341}

◆ nrnGcd()

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

Definition at line 275 of file rmodulon.cc.

276{
277 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
278 mpz_init_set(erg, r->modNumber);
279 if (a != NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
280 mpz_gcd(erg, erg, (mpz_ptr)b);
281 if(mpz_cmp(erg,r->modNumber)==0)
282 {
283 mpz_clear(erg);
285 return nrnInit(0,r);
286 }
287 return (number)erg;
288}
#define omFreeBin(addr, bin)

◆ nrnGetUnit()

static number nrnGetUnit ( number k,
const coeffs r )
static

Definition at line 353 of file rmodulon.cc.

354{
355 if (mpz_divisible_p(r->modNumber, (mpz_ptr)k)) return nrnInit(1,r);
356
357 mpz_ptr unit = (mpz_ptr)nrnGcd(NULL, k, r);
358 mpz_tdiv_q(unit, (mpz_ptr)k, unit);
359 mpz_ptr gcd = (mpz_ptr)nrnGcd(NULL, (number)unit, r);
360 if (!nrnIsOne((number)gcd,r))
361 {
362 mpz_ptr ctmp;
363 // tmp := unit^2
364 mpz_ptr tmp = (mpz_ptr) nrnMult((number) unit,(number) unit,r);
365 // gcd_new := gcd(tmp, 0)
366 mpz_ptr gcd_new = (mpz_ptr) nrnGcd(NULL, (number) tmp, r);
367 while (!nrnEqual((number) gcd_new,(number) gcd,r))
368 {
369 // gcd := gcd_new
370 ctmp = gcd;
371 gcd = gcd_new;
372 gcd_new = ctmp;
373 // tmp := tmp * unit
374 mpz_mul(tmp, tmp, unit);
375 mpz_mod(tmp, tmp, r->modNumber);
376 // gcd_new := gcd(tmp, 0)
377 mpz_gcd(gcd_new, tmp, r->modNumber);
378 }
379 // unit := unit + modNumber / gcd_new
380 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
381 mpz_add(unit, unit, tmp);
382 mpz_mod(unit, unit, r->modNumber);
383 nrnDelete((number*) &gcd_new, r);
384 nrnDelete((number*) &tmp, r);
385 }
386 nrnDelete((number*) &gcd, r);
387 return (number)unit;
388}
static BOOLEAN nrnIsOne(number a, const coeffs)
Definition rmodulon.cc:343

◆ nrnGreater()

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

Definition at line 500 of file rmodulon.cc.

501{
502 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
503}

◆ nrnGreaterZero()

static BOOLEAN nrnGreaterZero ( number k,
const coeffs cf )
static

Definition at line 505 of file rmodulon.cc.

506{
507 if (cf->is_field)
508 {
509 if (mpz_cmp_ui(cf->modBase,2)==0)
510 {
511 return TRUE;
512 }
513 #if 0
514 mpz_t ch2; mpz_init_set(ch2, cf->modBase);
515 mpz_sub_ui(ch2,ch2,1); //cf->modBase is odd
516 mpz_divexact_ui(ch2,ch2,2);
517 if (mpz_cmp(ch2,(mpz_ptr)k)<0)
518 {
519 mpz_clear(ch2);
520 return FALSE;
521 }
522 mpz_clear(ch2);
523 #endif
524 }
525 #if 0
526 else
527 {
528 mpz_t ch2; mpz_init_set(ch2, cf->modBase);
529 mpz_tdiv_q_ui(ch2,ch2,2);
530 if (mpz_cmp(ch2,(mpz_ptr)k)<0)
531 {
532 mpz_clear(ch2);
533 return FALSE;
534 }
535 mpz_clear(ch2);
536 }
537 #endif
538 return 0 < mpz_sgn1((mpz_ptr)k);
539}
CanonicalForm cf
Definition cfModGcd.cc:4091

◆ nrnInit()

static number nrnInit ( long i,
const coeffs r )
static

Definition at line 158 of file rmodulon.cc.

159{
160 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin);
161 mpz_init_set_si(erg, i);
162 mpz_mod(erg, erg, r->modNumber);
163 return (number) erg;
164}

◆ nrnInitCfByName()

coeffs nrnInitCfByName ( char * s,
n_coeffType n )

Definition at line 33 of file rmodulon.cc.

34{
35 const char start[]="ZZ/bigint(";
36 const int start_len=strlen(start);
37 if (strncmp(s,start,start_len)==0)
38 {
39 s+=start_len;
40 mpz_t z;
41 mpz_init(z);
42 s=nEatLong(s,z);
44 info.base=z;
45 info.exp= 1;
46 while ((*s!='\0') && (*s!=')')) s++;
47 // expect ")" or ")^exp"
48 if (*s=='\0') { mpz_clear(z); return NULL; }
49 if (((*s)==')') && (*(s+1)=='^'))
50 {
51 s=s+2;
52 int i;
53 s=nEati(s,&i,0);
54 info.exp=(unsigned long)i;
55 return nInitChar(n_Znm,(void*) &info);
56 }
57 else
58 return nInitChar(n_Zn,(void*) &info);
59 }
60 else return NULL;
61}
@ n_Znm
only used if HAVE_RINGS is defined
Definition coeffs.h:45
@ n_Zn
only used if HAVE_RINGS is defined
Definition coeffs.h:44
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
Definition numbers.cc:406
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
Definition numbers.cc:665
char * nEatLong(char *s, mpz_ptr i)
extracts a long integer from s, returns the rest
Definition numbers.cc:706

◆ nrnInitChar()

BOOLEAN nrnInitChar ( coeffs r,
void * p )

Definition at line 991 of file rmodulon.cc.

992{
993 assume( (getCoeffType(r) == n_Zn) || (getCoeffType (r) == n_Znm) );
994 ZnmInfo * info= (ZnmInfo *) p;
995 r->modBase= (mpz_ptr)nrnCopy((number)info->base, r); //this circumvents the problem
996 //in bigintmat.cc where we cannot create a "legal" nrn that can be freed.
997 //If we take a copy, we can do whatever we want.
998
999 nrnInitExp (info->exp, r);
1000
1001 /* next computation may yield wrong characteristic as r->modNumber
1002 is a GMP number */
1003 r->ch = mpz_get_ui(r->modNumber);
1004
1005 r->is_field=FALSE;
1006 r->is_domain=FALSE;
1007 r->rep=n_rep_gmp;
1008
1009 r->cfInit = nrnInit;
1010 r->cfDelete = nrnDelete;
1011 r->cfCopy = nrnCopy;
1012 r->cfSize = nrnSize;
1013 r->cfInt = nrnInt;
1014 r->cfAdd = nrnAdd;
1015 r->cfInpAdd = nrnInpAdd;
1016 r->cfSub = nrnSub;
1017 r->cfMult = nrnMult;
1018 r->cfInpMult = nrnInpMult;
1019 r->cfDiv = nrnDiv;
1020 r->cfAnn = nrnAnn;
1021 r->cfIntMod = nrnMod;
1022 r->cfExactDiv = nrnDiv;
1023 r->cfInpNeg = nrnNeg;
1024 r->cfInvers = nrnInvers;
1025 r->cfDivBy = nrnDivBy;
1026 r->cfDivComp = nrnDivComp;
1027 r->cfGreater = nrnGreater;
1028 r->cfEqual = nrnEqual;
1029 r->cfIsZero = nrnIsZero;
1030 r->cfIsOne = nrnIsOne;
1031 r->cfIsMOne = nrnIsMOne;
1032 r->cfGreaterZero = nrnGreaterZero;
1033 r->cfWriteLong = nrnWrite;
1034 r->cfRead = nrnRead;
1035 r->cfPower = nrnPower;
1036 r->cfSetMap = nrnSetMap;
1037 //r->cfNormalize = ndNormalize;
1038 r->cfLcm = nrnLcm;
1039 r->cfGcd = nrnGcd;
1040 r->cfIsUnit = nrnIsUnit;
1041 r->cfGetUnit = nrnGetUnit;
1042 r->cfExtGcd = nrnExtGcd;
1043 r->cfXExtGcd = nrnXExtGcd;
1044 r->cfQuotRem = nrnQuotRem;
1045 r->cfCoeffName = nrnCoeffName;
1046 r->nCoeffIsEqual = nrnCoeffIsEqual;
1047 r->cfKillChar = nrnKillChar;
1048 r->cfQuot1 = nrnQuot1;
1049 r->cfInitMPZ = nrnInitMPZ;
1050 r->cfMPZ = nrnMPZ;
1051#if SI_INTEGER_VARIANT==2
1052 r->cfWriteFd = nrzWriteFd;
1053 r->cfReadFd = nrzReadFd;
1054#endif
1055
1056#ifdef LDEBUG
1057 r->cfDBTest = nrnDBTest;
1058#endif
1059 if ((r->modExponent==1)&&(mpz_size1(r->modBase)==1))
1060 {
1061 long p=mpz_get_si(r->modBase);
1062 if ((p<=FACTORY_MAX_PRIME)&&(p==IsPrime(p))) /*factory limit: <2^29*/
1063 {
1064 r->convFactoryNSingN=nrnConvFactoryNSingN;
1065 r->convSingNFactoryN=nrnConvSingNFactoryN;
1066 }
1067 }
1068 return FALSE;
1069}
int p
Definition cfModGcd.cc:4086
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition coeffs.h:429
@ n_rep_gmp
(mpz_ptr), see rmodulon,h
Definition coeffs.h:122
#define FACTORY_MAX_PRIME
Definition modulop.h:38
int IsPrime(int p)
Definition prime.cc:61
number nrzReadFd(const ssiInfo *d, const coeffs)
void nrzWriteFd(number n, const ssiInfo *d, const coeffs)
static coeffs nrnQuot1(number c, const coeffs r)
Definition rmodulon.cc:103
static BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
Definition rmodulon.cc:915
static void nrnKillChar(coeffs r)
Definition rmodulon.cc:95
#define nrnSize
Definition rmodulon.cc:176
static BOOLEAN nrnGreater(number a, number b, const coeffs)
Definition rmodulon.cc:500
static CanonicalForm nrnConvSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
Definition rmodulon.cc:984
static number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
Definition rmodulon.cc:327
static void nrnMPZ(mpz_t m, number &n, const coeffs)
Definition rmodulon.cc:883
static BOOLEAN nrnCoeffIsEqual(const coeffs r, n_coeffType n, void *parameter)
Definition rmodulon.cc:87
static void nrnInpMult(number &a, number b, const coeffs r)
Definition rmodulon.cc:204
void nrnWrite(number a, const coeffs)
Definition rmodulon.cc:777
static number nrnMod(number a, number b, const coeffs r)
Definition rmodulon.cc:624
static number nrnInitMPZ(mpz_t m, const coeffs r)
Definition rmodulon.cc:875
static void nrnInitExp(unsigned long m, coeffs r)
Definition rmodulon.cc:904
static number nrnAnn(number k, const coeffs r)
Definition rmodulon.cc:549
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
Definition rmodulon.cc:794
static number nrnConvFactoryNSingN(const CanonicalForm n, const coeffs r)
Definition rmodulon.cc:979
static int nrnDivComp(number a, number b, const coeffs r)
Definition rmodulon.cc:573
static const char * nrnRead(const char *s, number *a, const coeffs r)
Definition rmodulon.cc:953
static number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition rmodulon.cc:399
static number nrnQuotRem(number a, number b, number *rem, const coeffs r)
Definition rmodulon.cc:671
static number nrnCopy(number a, const coeffs)
Definition rmodulon.cc:148
static number nrnSub(number a, number b, const coeffs r)
Definition rmodulon.cc:233
static number nrnLcm(number a, number b, const coeffs r)
Definition rmodulon.cc:294
static void nrnPower(number a, int i, number *result, const coeffs r)
Definition rmodulon.cc:210
static number nrnNeg(number c, const coeffs r)
Definition rmodulon.cc:247
static number nrnGetUnit(number k, const coeffs r)
Definition rmodulon.cc:353
static char * nrnCoeffName(const coeffs r)
Definition rmodulon.cc:64
static number nrnDiv(number a, number b, const coeffs r)
Definition rmodulon.cc:581
static BOOLEAN nrnIsMOne(number a, const coeffs r)
Definition rmodulon.cc:490
static BOOLEAN nrnDivBy(number a, number b, const coeffs r)
Definition rmodulon.cc:563
static BOOLEAN nrnGreaterZero(number k, const coeffs cf)
Definition rmodulon.cc:505
static number nrnAdd(number a, number b, const coeffs r)
Definition rmodulon.cc:218
static void nrnInpAdd(number &a, number b, const coeffs r)
Definition rmodulon.cc:227
#define mpz_size1(A)
Definition si_gmp.h:17

◆ nrnInitExp()

static void nrnInitExp ( unsigned long m,
coeffs r )
static

Definition at line 904 of file rmodulon.cc.

905{
906 nrnSetExp(m, r);
907 assume (r->modNumber != NULL);
908//CF: in general, the modulus is computed somewhere. I don't want to
909// check it's size before I construct the best ring.
910// if (mpz_cmp_ui(r->modNumber,2) <= 0)
911// WarnS("nrnInitExp failed (m in Z/m too small)");
912}
int m
Definition cfEzgcd.cc:128
static void nrnSetExp(unsigned long m, coeffs r)
Definition rmodulon.cc:892

◆ nrnInitMPZ()

static number nrnInitMPZ ( mpz_t m,
const coeffs r )
static

Definition at line 875 of file rmodulon.cc.

876{
877 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
878 mpz_init_set(erg,m);
879 mpz_mod(erg, erg, r->modNumber);
880 return (number) erg;
881}

◆ nrnInpAdd()

static void nrnInpAdd ( number & a,
number b,
const coeffs r )
static

Definition at line 227 of file rmodulon.cc.

228{
229 mpz_add((mpz_ptr)a, (mpz_ptr)a, (mpz_ptr) b);
230 mpz_mod((mpz_ptr)a, (mpz_ptr)a, r->modNumber);
231}

◆ nrnInpMult()

static void nrnInpMult ( number & a,
number b,
const coeffs r )
static

Definition at line 204 of file rmodulon.cc.

205{
206 mpz_mul((mpz_ptr)a, (mpz_ptr)a, (mpz_ptr) b);
207 mpz_mod((mpz_ptr)a, (mpz_ptr)a, r->modNumber);
208}

◆ nrnInt()

static long nrnInt ( number & n,
const coeffs  )
static

Definition at line 169 of file rmodulon.cc.

170{
171 return mpz_get_si((mpz_ptr) n);
172}

◆ nrnInvers()

static number nrnInvers ( number c,
const coeffs r )
static

Definition at line 255 of file rmodulon.cc.

256{
257 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
258 mpz_init(erg);
259 if (nrnIsZero(c,r))
260 {
262 }
263 else
264 {
265 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
266 }
267 return (number) erg;
268}

◆ nrnIsMOne()

static BOOLEAN nrnIsMOne ( number a,
const coeffs r )
static

Definition at line 490 of file rmodulon.cc.

491{
492 if((r->ch==2) && (nrnIsOne(a,r))) return FALSE;
493 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
494 mpz_add_ui(t, t, 1);
495 bool erg = (0 == mpz_cmp(t, r->modNumber));
496 mpz_clear(t);
497 return erg;
498}

◆ nrnIsOne()

static BOOLEAN nrnIsOne ( number a,
const coeffs  )
static

Definition at line 343 of file rmodulon.cc.

344{
345 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
346}

◆ nrnIsUnit()

static BOOLEAN nrnIsUnit ( number a,
const coeffs r )
static

Definition at line 541 of file rmodulon.cc.

542{
543 number tmp = nrnGcd(a, (number)r->modNumber, r);
544 bool res = nrnIsOne(tmp, r);
545 nrnDelete(&tmp, r);
546 return res;
547}
CanonicalForm res
Definition facAbsFact.cc:60

◆ nrnIsZero()

static BOOLEAN nrnIsZero ( number a,
const coeffs  )
static

Definition at line 242 of file rmodulon.cc.

243{
244 return 0 == mpz_sgn1((mpz_ptr)a);
245}

◆ nrnKillChar()

static void nrnKillChar ( coeffs r)
static

Definition at line 95 of file rmodulon.cc.

96{
97 mpz_clear(r->modNumber);
98 mpz_clear(r->modBase);
99 omFreeBin((void *) r->modBase, gmp_nrz_bin);
100 omFreeBin((void *) r->modNumber, gmp_nrz_bin);
101}

◆ nrnLcm()

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

Definition at line 294 of file rmodulon.cc.

295{
296 number erg = nrnGcd(NULL, a, r);
297 number tmp = nrnGcd(NULL, b, r);
298 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
299 nrnDelete(&tmp, r);
300 return (number)erg;
301}

◆ nrnMap2toM()

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

Definition at line 714 of file rmodulon.cc.

715{
716 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
717 mpz_init(erg);
718 mpz_mul_ui(erg, nrnMapCoef, (unsigned long)from);
719 mpz_mod(erg, erg, dst->modNumber);
720 return (number)erg;
721}
STATIC_VAR mpz_ptr nrnMapCoef
Definition rmodulon.cc:707

◆ nrnMapGMP()

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

Definition at line 733 of file rmodulon.cc.

734{
735 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
736 mpz_init(erg);
737 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
738 return (number)erg;
739}

◆ nrnMapModN()

static number nrnMapModN ( number from,
const coeffs ,
const coeffs dst )
static

Definition at line 709 of file rmodulon.cc.

710{
711 return nrnMult(from, (number) nrnMapCoef, dst);
712}

◆ nrnMapQ()

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

Definition at line 741 of file rmodulon.cc.

742{
743 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
744 nlMPZ(erg, from, src);
745 mpz_mod(erg, erg, dst->modNumber);
746 return (number)erg;
747}
void nlMPZ(mpz_t m, number &n, const coeffs r)
Definition longrat.cc:2811

◆ nrnMapZ()

static number nrnMapZ ( number from,
const coeffs src,
const coeffs dst )
static

Definition at line 762 of file rmodulon.cc.

763{
764 if (SR_HDL(from) & SR_INT)
765 {
766 long f_i=SR_TO_INT(from);
767 return nrnInit(f_i,dst);
768 }
769 return nrnMapGMP(from,src,dst);
770}
#define SR_INT
Definition longrat.h:67
#define SR_TO_INT(SR)
Definition longrat.h:69
number nrnMapGMP(number from, const coeffs, const coeffs dst)
Definition rmodulon.cc:733
#define SR_HDL(A)
Definition tgb.cc:35

◆ nrnMapZp()

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

Definition at line 723 of file rmodulon.cc.

724{
725 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
726 mpz_init(erg);
727 // TODO: use npInt(...)
728 mpz_mul_si(erg, nrnMapCoef, (unsigned long)from);
729 mpz_mod(erg, erg, dst->modNumber);
730 return (number)erg;
731}
void mpz_mul_si(mpz_ptr r, mpz_srcptr s, long int si)
Definition longrat.cc:177

◆ nrnMod()

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

Definition at line 624 of file rmodulon.cc.

625{
626 /*
627 We need to return the number rr which is uniquely determined by the
628 following two properties:
629 (1) 0 <= rr < |b| (with respect to '<' and '<=' performed in Z x Z)
630 (2) There exists some k in the integers Z such that a = k * b + rr.
631 Consider g := gcd(n, |b|). Note that then |b|/g is a unit in Z/n.
632 Now, there are three cases:
633 (a) g = 1
634 Then |b| is a unit in Z/n, i.e. |b| (and also b) divides a.
635 Thus rr = 0.
636 (b) g <> 1 and g divides a
637 Then a = (a/g) * (|b|/g)^(-1) * b (up to sign), i.e. again rr = 0.
638 (c) g <> 1 and g does not divide a
639 Then denote the division with remainder of a by g as this:
640 a = s * g + t. Then t = a - s * g = a - s * (|b|/g)^(-1) * |b|
641 fulfills (1) and (2), i.e. rr := t is the correct result. Hence
642 in this third case, rr is the remainder of division of a by g in Z.
643 Remark: according to mpz_mod: a,b are always non-negative
644 */
645 mpz_ptr g = (mpz_ptr)omAllocBin(gmp_nrz_bin);
646 mpz_ptr rr = (mpz_ptr)omAllocBin(gmp_nrz_bin);
647 mpz_init(g);
648 mpz_init_set_ui(rr, 0);
649 mpz_gcd(g, (mpz_ptr)r->modNumber, (mpz_ptr)b); // g is now as above
650 if (mpz_cmp_si(g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a, g); // the case g <> 1
651 mpz_clear(g);
653 return (number)rr;
654}
g
Definition cfModGcd.cc:4098

◆ nrnMPZ()

static void nrnMPZ ( mpz_t m,
number & n,
const coeffs  )
static

Definition at line 883 of file rmodulon.cc.

884{
885 mpz_init_set(m, (mpz_ptr)n);
886}

◆ nrnMult()

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

Definition at line 195 of file rmodulon.cc.

196{
197 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
198 mpz_init(erg);
199 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr) b);
200 mpz_mod(erg, erg, r->modNumber);
201 return (number) erg;
202}

◆ nrnNeg()

static number nrnNeg ( number c,
const coeffs r )
static

Definition at line 247 of file rmodulon.cc.

248{
249 if( !nrnIsZero(c, r) )
250 // Attention: This method operates in-place.
251 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
252 return c;
253}

◆ nrnPower()

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

Definition at line 210 of file rmodulon.cc.

211{
212 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
213 mpz_init(erg);
214 mpz_powm_ui(erg, (mpz_ptr)a, i, r->modNumber);
215 *result = (number) erg;
216}

◆ nrnQuot1()

static coeffs nrnQuot1 ( number c,
const coeffs r )
static

Definition at line 103 of file rmodulon.cc.

104{
105 coeffs rr;
106 long ch = r->cfInt(c, r);
107 mpz_t a,b;
108 mpz_init_set(a, r->modNumber);
109 mpz_init_set_ui(b, ch);
110 mpz_t gcd;
111 mpz_init(gcd);
112 mpz_gcd(gcd, a,b);
113 if(mpz_cmp_ui(gcd, 1) == 0)
114 {
115 WerrorS("constant in q-ideal is coprime to modulus in ground ring");
116 WerrorS("Unable to create qring!");
117 return NULL;
118 }
119 if(r->modExponent == 1)
120 {
122 info.base = gcd;
123 info.exp = (unsigned long) 1;
124 rr = nInitChar(n_Zn, (void*)&info);
125 }
126 else
127 {
129 info.base = r->modBase;
130 int kNew = 1;
131 mpz_t baseTokNew;
132 mpz_init(baseTokNew);
133 mpz_set(baseTokNew, r->modBase);
134 while(mpz_cmp(gcd, baseTokNew) > 0)
135 {
136 kNew++;
137 mpz_mul(baseTokNew, baseTokNew, r->modBase);
138 }
139 //printf("\nkNew = %i\n",kNew);
140 info.exp = kNew;
141 mpz_clear(baseTokNew);
142 rr = nInitChar(n_Znm, (void*)&info);
143 }
144 mpz_clear(gcd);
145 return(rr);
146}
The main handler for Singular numbers which are suitable for Singular polynomials.

◆ nrnQuotRem()

static number nrnQuotRem ( number a,
number b,
number * rem,
const coeffs r )
static

Definition at line 671 of file rmodulon.cc.

672{
673 mpz_t g, aa, bb;
674 mpz_ptr qq = (mpz_ptr)omAllocBin(gmp_nrz_bin);
675 mpz_ptr rr = (mpz_ptr)omAllocBin(gmp_nrz_bin);
676 mpz_init(qq);
677 mpz_init(rr);
678 mpz_init(g);
679 mpz_init_set(aa, (mpz_ptr)a);
680 mpz_init_set(bb, (mpz_ptr)b);
681
682 mpz_gcd(g, bb, r->modNumber);
683 mpz_mod(rr, aa, g);
684 mpz_sub(aa, aa, rr);
685 mpz_gcd(g, aa, g);
686 mpz_div(aa, aa, g);
687 mpz_div(bb, bb, g);
688 mpz_div(g, r->modNumber, g);
689 mpz_invert(g, bb, g);
690 mpz_mul(qq, aa, g);
691 if (rem)
692 *rem = (number)rr;
693 else {
694 mpz_clear(rr);
696 }
697 mpz_clear(g);
698 mpz_clear(aa);
699 mpz_clear(bb);
700 return (number) qq;
701}
void rem(unsigned long *a, unsigned long *q, unsigned long p, int &dega, int degq)
Definition minpoly.cc:572

◆ nrnRead()

static const char * nrnRead ( const char * s,
number * a,
const coeffs r )
static

Definition at line 953 of file rmodulon.cc.

954{
955 mpz_ptr z = (mpz_ptr) omAllocBin(gmp_nrz_bin);
956 {
957 s = nlCPEatLongC((char *)s, z);
958 }
959 mpz_mod(z, z, r->modNumber);
960 if ((*s)=='/')
961 {
962 mpz_ptr n = (mpz_ptr) omAllocBin(gmp_nrz_bin);
963 s++;
964 s=nlCPEatLongC((char*)s,n);
965 if (!nrnIsOne((number)n,r))
966 {
967 *a=nrnDiv((number)z,(number)n,r);
968 mpz_clear(z);
969 omFreeBin((void *)z, gmp_nrz_bin);
970 mpz_clear(n);
971 omFreeBin((void *)n, gmp_nrz_bin);
972 }
973 }
974 else
975 *a = (number) z;
976 return s;
977}
static const char * nlCPEatLongC(char *s, mpz_ptr i)
Definition rmodulon.cc:929

◆ nrnSetExp()

static void nrnSetExp ( unsigned long m,
coeffs r )
static

Definition at line 892 of file rmodulon.cc.

893{
894 /* clean up former stuff */
895 if (r->modNumber != NULL) mpz_clear(r->modNumber);
896
897 r->modExponent= m;
898 r->modNumber = (mpz_ptr)omAllocBin(gmp_nrz_bin);
899 mpz_init_set (r->modNumber, r->modBase);
900 mpz_pow_ui (r->modNumber, r->modNumber, m);
901}

◆ nrnSetMap()

nMapFunc nrnSetMap ( const coeffs src,
const coeffs dst )

Definition at line 794 of file rmodulon.cc.

795{
796 /* dst = nrn */
797 if ((src->rep==n_rep_gmp) && nCoeff_is_Z(src))
798 {
799 return nrnMapZ;
800 }
801 if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Z(src)*/)
802 {
803 return nrnMapZ;
804 }
805 if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Q(src)) or Z*/
806 {
807 return nrnMapQ;
808 }
809 // Some type of Z/n ring / field
810 if (nCoeff_is_Zn(src) || nCoeff_is_Ring_PtoM(src) ||
812 {
813 if ( (!nCoeff_is_Zp(src))
814 && (mpz_cmp(src->modBase, dst->modBase) == 0)
815 && (src->modExponent == dst->modExponent)) return ndCopyMap;
816 else
817 {
818 mpz_ptr nrnMapModul = (mpz_ptr) omAllocBin(gmp_nrz_bin);
819 // Computing the n of Z/n
820 if (nCoeff_is_Zp(src))
821 {
822 mpz_init_set_si(nrnMapModul, src->ch);
823 }
824 else
825 {
826 mpz_init(nrnMapModul);
827 mpz_set(nrnMapModul, src->modNumber);
828 }
829 // nrnMapCoef = 1 in dst if dst is a subring of src
830 // nrnMapCoef = 0 in dst / src if src is a subring of dst
831 if (nrnMapCoef == NULL)
832 {
833 nrnMapCoef = (mpz_ptr) omAllocBin(gmp_nrz_bin);
834 mpz_init(nrnMapCoef);
835 }
836 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
837 {
838 mpz_set_ui(nrnMapCoef, 1);
839 }
840 else
841 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
842 {
843 mpz_divexact(nrnMapCoef, dst->modNumber, nrnMapModul);
844 mpz_ptr tmp = dst->modNumber;
845 dst->modNumber = nrnMapModul;
846 if (!nrnIsUnit((number) nrnMapCoef,dst))
847 {
848 dst->modNumber = tmp;
849 nrnDelete((number*) &nrnMapModul, dst);
850 return NULL;
851 }
852 mpz_ptr inv = (mpz_ptr) nrnInvers((number) nrnMapCoef,dst);
853 dst->modNumber = tmp;
854 mpz_mul(nrnMapCoef, nrnMapCoef, inv);
855 mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
856 nrnDelete((number*) &inv, dst);
857 }
858 else
859 {
860 nrnDelete((number*) &nrnMapModul, dst);
861 return NULL;
862 }
863 nrnDelete((number*) &nrnMapModul, dst);
864 if (nCoeff_is_Ring_2toM(src))
865 return nrnMap2toM;
866 else if (nCoeff_is_Zp(src))
867 return nrnMapZp;
868 else
869 return nrnMapModN;
870 }
871 }
872 return NULL; // default
873}
static FORCE_INLINE BOOLEAN nCoeff_is_Z(const coeffs r)
Definition coeffs.h:809
number ndCopyMap(number a, const coeffs src, const coeffs dst)
Definition numbers.cc:287
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition coeffs.h:793
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
Definition coeffs.h:724
@ n_rep_gap_rat
(number), see longrat.h
Definition coeffs.h:118
@ n_rep_gap_gmp
(), see rinteger.h, new impl.
Definition coeffs.h:119
static number nrnMap2toM(number from, const coeffs, const coeffs dst)
Definition rmodulon.cc:714
static number nrnMapZ(number from, const coeffs src, const coeffs dst)
Definition rmodulon.cc:762
static number nrnMapZp(number from, const coeffs, const coeffs dst)
Definition rmodulon.cc:723
static number nrnMapQ(number from, const coeffs src, const coeffs dst)
Definition rmodulon.cc:741
static number nrnMapModN(number from, const coeffs, const coeffs dst)
Definition rmodulon.cc:709

◆ nrnSub()

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

Definition at line 233 of file rmodulon.cc.

234{
235 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
236 mpz_init(erg);
237 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
238 mpz_mod(erg, erg, r->modNumber);
239 return (number) erg;
240}

◆ nrnWrite()

void nrnWrite ( number a,
const coeffs  )

Definition at line 777 of file rmodulon.cc.

778{
779 char *s,*z;
780 if (a==NULL)
781 {
782 StringAppendS("o");
783 }
784 else
785 {
786 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
787 s=(char*)omAlloc(l);
788 z=mpz_get_str(s,10,(mpz_ptr) a);
789 StringAppendS(z);
791 }
792}
void StringAppendS(const char *st)
Definition reporter.cc:107

◆ nrnXExtGcd()

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

Definition at line 399 of file rmodulon.cc.

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

Variable Documentation

◆ gmp_nrz_bin

EXTERN_VAR omBin gmp_nrz_bin

Definition at line 31 of file rmodulon.cc.

◆ nrnCoeffName_buff

STATIC_VAR char* nrnCoeffName_buff =NULL

Definition at line 63 of file rmodulon.cc.

◆ nrnMapCoef

STATIC_VAR mpz_ptr nrnMapCoef = NULL

Definition at line 707 of file rmodulon.cc.