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()

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

Definition at line 937 of file rmodulon.cc.

938{
939 const char * start=s;
940 if (!(*s >= '0' && *s <= '9'))
941 {
942 mpz_init_set_ui(i, 1);
943 return s;
944 }
945 mpz_init(i);
946 while (*s >= '0' && *s <= '9') s++;
947 if (*s=='\0')
948 {
949 mpz_set_str(i,start,10);
950 }
951 else
952 {
953 char c=*s;
954 *s='\0';
955 mpz_set_str(i,start,10);
956 *s=c;
957 }
958 return s;
959}
int i
Definition cfEzgcd.cc:132
const CanonicalForm int s
Definition facAbsFact.cc:51

◆ nrnAdd()

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()

number nrnAnn ( number k,
const coeffs r )
static

Definition at line 553 of file rmodulon.cc.

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

◆ nrnCoeffIsEqual()

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

Definition at line 84 of file rmodulon.cc.

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

◆ nrnCoeffName()

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;
74 {
75 ll=snprintf(nrnCoeffName_buff,l,"ZZ/bigint(%s)",s);
76 }
77 else if (nCoeff_is_Ring_PtoM(r))
78 ll=snprintf(nrnCoeffName_buff,l,"ZZ/(bigint(%s)^%lu)",s,r->modExponent);
79 assume(ll<(int)l); // otherwise nrnCoeffName_buff too small
80 omFreeSize((ADDRESS)s, l-22);
81 return nrnCoeffName_buff;
82}
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:729
static FORCE_INLINE BOOLEAN nCoeff_is_Zn(const coeffs r)
Definition coeffs.h:824
static FORCE_INLINE BOOLEAN nCoeff_is_Zp_long(const coeffs r)
Definition coeffs.h:797
#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()

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

Definition at line 987 of file rmodulon.cc.

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

◆ nrnConvSingNFactoryN()

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

Definition at line 992 of file rmodulon.cc.

993{
994 if (setChar) setCharacteristic( r->ch );
995 return CanonicalForm(nrnInt( n,r ));
996}
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()

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()

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

Definition at line 923 of file rmodulon.cc.

924{
925 if ( (mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
926 {
927 Warn("mod-n: out of range at %s:%d\n",f,l);
928 return FALSE;
929 }
930 return TRUE;
931}
#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()

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

Definition at line 589 of file rmodulon.cc.

590{
591 if (nrnIsZero(b,r))
592 {
594 return nrnInit(0,r);
595 }
596 else if (r->is_field)
597 {
598 number inv=nrnInvers(b,r);
599 number erg=nrnMult(a,inv,r);
600 nrnDelete(&inv,r);
601 return erg;
602 }
603 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
604 mpz_init(erg);
605 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)b))
606 {
607 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)b);
608 return (number)erg;
609 }
610 else
611 {
612 mpz_ptr gcd = (mpz_ptr)nrnGcd(a, b, r);
613 mpz_divexact(erg, (mpz_ptr)b, gcd);
614 if (!nrnIsUnit((number)erg, r))
615 {
616 WerrorS("Division not possible, even by cancelling zero divisors.");
617 nrnDelete((number*) &gcd, r);
618 nrnDelete((number*) &erg, r);
619 return (number)NULL;
620 }
621 // a / gcd(a,b) * [b / gcd (a,b)]^(-1)
622 mpz_ptr tmp = (mpz_ptr)nrnInvers((number) erg,r);
623 mpz_divexact(erg, (mpz_ptr)a, gcd);
624 mpz_mul(erg, erg, tmp);
625 nrnDelete((number*) &gcd, r);
626 nrnDelete((number*) &tmp, r);
627 mpz_mod(erg, erg, r->modNumber);
628 return (number)erg;
629 }
630}
void WerrorS(const char *s)
Definition feFopen.cc:24
const char *const nDivBy0
Definition numbers.h:90
static BOOLEAN nrnIsZero(number a, const coeffs)
Definition rmodulon.cc:242
static BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition rmodulon.cc:545
#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()

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

Definition at line 567 of file rmodulon.cc.

568{
569 if(r->is_field)
570 {
571 return !nrnIsZero(b,r);
572 }
573 /* b divides a iff b/gcd(a, b) is a unit in the given ring: */
574 number n = nrnGcd(a, b, r);
575 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)b, (mpz_ptr)n);
576 bool result = nrnIsUnit(n, r);
577 nrnDelete(&n, NULL);
578 return result;
579}
return result

◆ nrnDivComp()

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

Definition at line 581 of file rmodulon.cc.

582{
583 if (nrnEqual(a, b,r)) return 2;
584 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr) b)) return -1;
585 if (mpz_divisible_p((mpz_ptr) b, (mpz_ptr) a)) return 1;
586 return 0;
587}
static BOOLEAN nrnEqual(number a, number b, const coeffs)
Definition rmodulon.cc:352

◆ nrnEqual()

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

Definition at line 352 of file rmodulon.cc.

353{
354 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
355}

◆ nrnExtGcd()

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

Definition at line 331 of file rmodulon.cc.

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

◆ nrnGcd()

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

Definition at line 275 of file rmodulon.cc.

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

◆ nrnGetUnit()

number nrnGetUnit ( number k,
const coeffs r )
static

Definition at line 357 of file rmodulon.cc.

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

◆ nrnGreater()

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

Definition at line 504 of file rmodulon.cc.

505{
506 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
507}

◆ nrnGreaterZero()

BOOLEAN nrnGreaterZero ( number k,
const coeffs cf )
static

Definition at line 509 of file rmodulon.cc.

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

◆ nrnInit()

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:412
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
Definition numbers.cc:672
char * nEatLong(char *s, mpz_ptr i)
extracts a long integer from s, returns the rest
Definition numbers.cc:713

◆ nrnInitChar()

BOOLEAN nrnInitChar ( coeffs r,
void * p )

Definition at line 999 of file rmodulon.cc.

1000{
1001 assume( (getCoeffType(r) == n_Zn) || (getCoeffType (r) == n_Znm) );
1002 ZnmInfo * info= (ZnmInfo *) p;
1003 r->modBase= (mpz_ptr)nrnCopy((number)info->base, r); //this circumvents the problem
1004 //in bigintmat.cc where we cannot create a "legal" nrn that can be freed.
1005 //If we take a copy, we can do whatever we want.
1006
1007 if (info->exp==1) r->type=n_Zn;
1008
1009 nrnInitExp (info->exp, r);
1010
1011 /* next computation may yield wrong characteristic as r->modNumber
1012 is a GMP number */
1013 r->ch = mpz_get_ui(r->modNumber);
1014
1015 r->is_field=FALSE;
1016 r->is_domain=FALSE;
1017 if(r->modExponent==1)
1018 {
1019 if (mpz_probab_prime_p(r->modNumber,15)>0)
1020 {
1021 r->is_field=TRUE;
1022 r->is_domain=TRUE;
1023 }
1024 }
1025 r->rep=n_rep_gmp;
1026
1027 r->cfInit = nrnInit;
1028 r->cfDelete = nrnDelete;
1029 r->cfCopy = nrnCopy;
1030 r->cfSize = nrnSize;
1031 r->cfInt = nrnInt;
1032 r->cfAdd = nrnAdd;
1033 r->cfInpAdd = nrnInpAdd;
1034 r->cfSub = nrnSub;
1035 r->cfMult = nrnMult;
1036 r->cfInpMult = nrnInpMult;
1037 r->cfDiv = nrnDiv;
1038 r->cfAnn = nrnAnn;
1039 r->cfIntMod = nrnMod;
1040 r->cfExactDiv = nrnDiv;
1041 r->cfInpNeg = nrnNeg;
1042 r->cfInvers = nrnInvers;
1043 r->cfDivBy = nrnDivBy;
1044 r->cfDivComp = nrnDivComp;
1045 r->cfGreater = nrnGreater;
1046 r->cfEqual = nrnEqual;
1047 r->cfIsZero = nrnIsZero;
1048 r->cfIsOne = nrnIsOne;
1049 r->cfIsMOne = nrnIsMOne;
1050 r->cfGreaterZero = nrnGreaterZero;
1051 r->cfWriteLong = nrnWrite;
1052 r->cfRead = nrnRead;
1053 r->cfPower = nrnPower;
1054 r->cfSetMap = nrnSetMap;
1055 //r->cfNormalize = ndNormalize;
1056 r->cfLcm = nrnLcm;
1057 r->cfGcd = nrnGcd;
1058 r->cfIsUnit = nrnIsUnit;
1059 r->cfGetUnit = nrnGetUnit;
1060 r->cfExtGcd = nrnExtGcd;
1061 r->cfXExtGcd = nrnXExtGcd;
1062 r->cfQuotRem = nrnQuotRem;
1063 r->cfCoeffName = nrnCoeffName;
1064 r->nCoeffIsEqual = nrnCoeffIsEqual;
1065 r->cfKillChar = nrnKillChar;
1066 r->cfQuot1 = nrnQuot1;
1067 r->cfInitMPZ = nrnInitMPZ;
1068 r->cfMPZ = nrnMPZ;
1069#if SI_INTEGER_VARIANT==2
1070 r->cfWriteFd = nrzWriteFd;
1071 r->cfWriteFd_S = nrzWriteFd_S;
1072 r->cfReadFd = nrzReadFd;
1073 r->cfReadFd_S = nrzReadFd_S;
1074#endif
1075
1076#ifdef LDEBUG
1077 r->cfDBTest = nrnDBTest;
1078#endif
1079 if ((r->modExponent==1)&&(mpz_size1(r->modBase)==1))
1080 {
1081 long p=mpz_get_si(r->modBase);
1082 if ((p<=FACTORY_MAX_PRIME)&&(p==IsPrime(p))) /*factory limit: <2^29*/
1083 {
1084 r->convFactoryNSingN=nrnConvFactoryNSingN;
1085 r->convSingNFactoryN=nrnConvSingNFactoryN;
1086 }
1087 }
1088 return FALSE;
1089}
int p
Definition cfModGcd.cc:4086
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition coeffs.h:431
@ 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_S(number n, const coeffs)
number nrzReadFd_S(char **s, const coeffs)
void nrzWriteFd(number n, const ssiInfo *d, const coeffs)
static coeffs nrnQuot1(number c, const coeffs r)
Definition rmodulon.cc:100
static BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
Definition rmodulon.cc:923
static void nrnKillChar(coeffs r)
Definition rmodulon.cc:92
#define nrnSize
Definition rmodulon.cc:176
static BOOLEAN nrnGreater(number a, number b, const coeffs)
Definition rmodulon.cc:504
static CanonicalForm nrnConvSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
Definition rmodulon.cc:992
static number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
Definition rmodulon.cc:331
static void nrnMPZ(mpz_t m, number &n, const coeffs)
Definition rmodulon.cc:891
static BOOLEAN nrnCoeffIsEqual(const coeffs r, n_coeffType n, void *parameter)
Definition rmodulon.cc:84
static void nrnInpMult(number &a, number b, const coeffs r)
Definition rmodulon.cc:204
void nrnWrite(number a, const coeffs)
Definition rmodulon.cc:785
static number nrnMod(number a, number b, const coeffs r)
Definition rmodulon.cc:632
static number nrnInitMPZ(mpz_t m, const coeffs r)
Definition rmodulon.cc:883
static void nrnInitExp(unsigned long m, coeffs r)
Definition rmodulon.cc:912
static number nrnAnn(number k, const coeffs r)
Definition rmodulon.cc:553
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
Definition rmodulon.cc:802
static number nrnConvFactoryNSingN(const CanonicalForm n, const coeffs r)
Definition rmodulon.cc:987
static int nrnDivComp(number a, number b, const coeffs r)
Definition rmodulon.cc:581
static const char * nrnRead(const char *s, number *a, const coeffs r)
Definition rmodulon.cc:961
static number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition rmodulon.cc:403
static number nrnQuotRem(number a, number b, number *rem, const coeffs r)
Definition rmodulon.cc:679
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:298
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:357
static char * nrnCoeffName(const coeffs r)
Definition rmodulon.cc:64
static number nrnDiv(number a, number b, const coeffs r)
Definition rmodulon.cc:589
static BOOLEAN nrnIsMOne(number a, const coeffs r)
Definition rmodulon.cc:494
static BOOLEAN nrnDivBy(number a, number b, const coeffs r)
Definition rmodulon.cc:567
static BOOLEAN nrnGreaterZero(number k, const coeffs cf)
Definition rmodulon.cc:509
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()

void nrnInitExp ( unsigned long m,
coeffs r )
static

Definition at line 912 of file rmodulon.cc.

913{
914 nrnSetExp(m, r);
915 assume (r->modNumber != NULL);
916//CF: in general, the modulus is computed somewhere. I don't want to
917// check it's size before I construct the best ring.
918// if (mpz_cmp_ui(r->modNumber,2) <= 0)
919// WarnS("nrnInitExp failed (m in Z/m too small)");
920}
int m
Definition cfEzgcd.cc:128
static void nrnSetExp(unsigned long m, coeffs r)
Definition rmodulon.cc:900

◆ nrnInitMPZ()

number nrnInitMPZ ( mpz_t m,
const coeffs r )
static

Definition at line 883 of file rmodulon.cc.

884{
885 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
886 mpz_init_set(erg,m);
887 mpz_mod(erg, erg, r->modNumber);
888 return (number) erg;
889}

◆ nrnInpAdd()

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()

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()

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()

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()

BOOLEAN nrnIsMOne ( number a,
const coeffs r )
static

Definition at line 494 of file rmodulon.cc.

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

◆ nrnIsOne()

BOOLEAN nrnIsOne ( number a,
const coeffs  )
static

Definition at line 347 of file rmodulon.cc.

348{
349 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
350}

◆ nrnIsUnit()

BOOLEAN nrnIsUnit ( number a,
const coeffs r )
static

Definition at line 545 of file rmodulon.cc.

546{
547 number tmp = nrnGcd(a, (number)r->modNumber, r);
548 bool res = nrnIsOne(tmp, r);
549 nrnDelete(&tmp, r);
550 return res;
551}
CanonicalForm res
Definition facAbsFact.cc:60

◆ nrnIsZero()

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()

void nrnKillChar ( coeffs r)
static

Definition at line 92 of file rmodulon.cc.

93{
94 mpz_clear(r->modNumber);
95 mpz_clear(r->modBase);
96 omFreeBin((void *) r->modBase, gmp_nrz_bin);
97 omFreeBin((void *) r->modNumber, gmp_nrz_bin);
98}

◆ nrnLcm()

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

Definition at line 298 of file rmodulon.cc.

299{
300 number erg = nrnGcd(NULL, a, r);
301 number tmp = nrnGcd(NULL, b, r);
302 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
303 nrnDelete(&tmp, r);
304 return (number)erg;
305}

◆ nrnMap2toM()

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

Definition at line 722 of file rmodulon.cc.

723{
724 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
725 mpz_init(erg);
726 mpz_mul_ui(erg, nrnMapCoef, (unsigned long)from);
727 mpz_mod(erg, erg, dst->modNumber);
728 return (number)erg;
729}
STATIC_VAR mpz_ptr nrnMapCoef
Definition rmodulon.cc:715

◆ nrnMapGMP()

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

Definition at line 741 of file rmodulon.cc.

742{
743 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
744 mpz_init(erg);
745 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
746 return (number)erg;
747}

◆ nrnMapModN()

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

Definition at line 717 of file rmodulon.cc.

718{
719 return nrnMult(from, (number) nrnMapCoef, dst);
720}

◆ nrnMapQ()

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

Definition at line 749 of file rmodulon.cc.

750{
751 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
752 nlMPZ(erg, from, src);
753 mpz_mod(erg, erg, dst->modNumber);
754 return (number)erg;
755}
void nlMPZ(mpz_t m, number &n, const coeffs r)
get numerator as mpz_t
Definition longrat.cc:2791

◆ nrnMapZ()

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

Definition at line 770 of file rmodulon.cc.

771{
772 if (SR_HDL(from) & SR_INT)
773 {
774 long f_i=SR_TO_INT(from);
775 return nrnInit(f_i,dst);
776 }
777 return nrnMapGMP(from,src,dst);
778}
#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:741
#define SR_HDL(A)
Definition tgb.cc:35

◆ nrnMapZp()

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

Definition at line 731 of file rmodulon.cc.

732{
733 mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
734 mpz_init(erg);
735 // TODO: use npInt(...)
736 mpz_mul_si(erg, nrnMapCoef, (unsigned long)from);
737 mpz_mod(erg, erg, dst->modNumber);
738 return (number)erg;
739}
void mpz_mul_si(mpz_ptr r, mpz_srcptr s, long int si)
Definition longrat.cc:177

◆ nrnMod()

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

Definition at line 632 of file rmodulon.cc.

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

◆ nrnMPZ()

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

Definition at line 891 of file rmodulon.cc.

892{
893 mpz_init_set(m, (mpz_ptr)n);
894}

◆ nrnMult()

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()

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()

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()

coeffs nrnQuot1 ( number c,
const coeffs r )
static

Definition at line 100 of file rmodulon.cc.

101{
102 coeffs rr;
103 long ch = r->cfInt(c, r);
104 mpz_t a,b;
105 mpz_init_set(a, r->modNumber);
106 mpz_init_set_ui(b, ch);
107 mpz_t gcd;
108 mpz_init(gcd);
109 mpz_gcd(gcd, a,b);
110 if(mpz_cmp_ui(gcd, 1) == 0)
111 {
112 WerrorS("constant in q-ideal is coprime to modulus in ground ring");
113 WerrorS("Unable to create qring!");
114 return NULL;
115 }
116 if(r->modExponent == 1)
117 {
119 info.base = gcd;
120 info.exp = (unsigned long) 1;
121 rr = nInitChar(n_Zn, (void*)&info);
122 }
123 else
124 {
126 info.base = r->modBase;
127 int kNew = 1;
128 mpz_t baseTokNew;
129 mpz_init(baseTokNew);
130 mpz_set(baseTokNew, r->modBase);
131 while(mpz_cmp(gcd, baseTokNew) > 0)
132 {
133 kNew++;
134 mpz_mul(baseTokNew, baseTokNew, r->modBase);
135 }
136 //printf("\nkNew = %i\n",kNew);
137 info.exp = kNew;
138 mpz_clear(baseTokNew);
139 if (kNew==1)
140 rr = nInitChar(n_Zn, (void*)&info);
141 else
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()

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

Definition at line 679 of file rmodulon.cc.

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

◆ nrnRead()

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

Definition at line 961 of file rmodulon.cc.

962{
963 mpz_ptr z = (mpz_ptr) omAllocBin(gmp_nrz_bin);
964 {
965 s = nlCPEatLongC((char *)s, z);
966 }
967 mpz_mod(z, z, r->modNumber);
968 if ((*s)=='/')
969 {
970 mpz_ptr n = (mpz_ptr) omAllocBin(gmp_nrz_bin);
971 s++;
972 s=nlCPEatLongC((char*)s,n);
973 if (!nrnIsOne((number)n,r))
974 {
975 *a=nrnDiv((number)z,(number)n,r);
976 mpz_clear(z);
977 omFreeBin((void *)z, gmp_nrz_bin);
978 mpz_clear(n);
979 omFreeBin((void *)n, gmp_nrz_bin);
980 }
981 }
982 else
983 *a = (number) z;
984 return s;
985}
static const char * nlCPEatLongC(char *s, mpz_ptr i)
Definition rmodulon.cc:937

◆ nrnSetExp()

void nrnSetExp ( unsigned long m,
coeffs r )
static

Definition at line 900 of file rmodulon.cc.

901{
902 /* clean up former stuff */
903 if (r->modNumber != NULL) mpz_clear(r->modNumber);
904
905 r->modExponent= m;
906 r->modNumber = (mpz_ptr)omAllocBin(gmp_nrz_bin);
907 mpz_init_set (r->modNumber, r->modBase);
908 mpz_pow_ui (r->modNumber, r->modNumber, m);
909}

◆ nrnSetMap()

nMapFunc nrnSetMap ( const coeffs src,
const coeffs dst )

Definition at line 802 of file rmodulon.cc.

803{
804 /* dst = nrn */
805 if ((src->rep==n_rep_gmp) && nCoeff_is_Z(src))
806 {
807 return nrnMapZ;
808 }
809 if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Z(src)*/)
810 {
811 return nrnMapZ;
812 }
813 if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Q(src)) or Z*/
814 {
815 return nrnMapQ;
816 }
817 // Some type of Z/n ring / field
818 if (nCoeff_is_Zn(src) || nCoeff_is_Ring_PtoM(src) ||
820 {
821 if ( (!nCoeff_is_Zp(src))
822 && (mpz_cmp(src->modBase, dst->modBase) == 0)
823 && (src->modExponent == dst->modExponent)) return ndCopyMap;
824 else
825 {
826 mpz_ptr nrnMapModul = (mpz_ptr) omAllocBin(gmp_nrz_bin);
827 // Computing the n of Z/n
828 if (nCoeff_is_Zp(src))
829 {
830 mpz_init_set_si(nrnMapModul, src->ch);
831 }
832 else
833 {
834 mpz_init(nrnMapModul);
835 mpz_set(nrnMapModul, src->modNumber);
836 }
837 // nrnMapCoef = 1 in dst if dst is a subring of src
838 // nrnMapCoef = 0 in dst / src if src is a subring of dst
839 if (nrnMapCoef == NULL)
840 {
841 nrnMapCoef = (mpz_ptr) omAllocBin(gmp_nrz_bin);
842 mpz_init(nrnMapCoef);
843 }
844 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
845 {
846 mpz_set_ui(nrnMapCoef, 1);
847 }
848 else
849 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
850 {
851 mpz_divexact(nrnMapCoef, dst->modNumber, nrnMapModul);
852 mpz_ptr tmp = dst->modNumber;
853 dst->modNumber = nrnMapModul;
854 if (!nrnIsUnit((number) nrnMapCoef,dst))
855 {
856 dst->modNumber = tmp;
857 nrnDelete((number*) &nrnMapModul, dst);
858 return NULL;
859 }
860 mpz_ptr inv = (mpz_ptr) nrnInvers((number) nrnMapCoef,dst);
861 dst->modNumber = tmp;
862 mpz_mul(nrnMapCoef, nrnMapCoef, inv);
863 mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
864 nrnDelete((number*) &inv, dst);
865 }
866 else
867 {
868 nrnDelete((number*) &nrnMapModul, dst);
869 return NULL;
870 }
871 nrnDelete((number*) &nrnMapModul, dst);
872 if (nCoeff_is_Ring_2toM(src))
873 return nrnMap2toM;
874 else if (nCoeff_is_Zp(src))
875 return nrnMapZp;
876 else
877 return nrnMapModN;
878 }
879 }
880 return NULL; // default
881}
static FORCE_INLINE BOOLEAN nCoeff_is_Z(const coeffs r)
Definition coeffs.h:814
number ndCopyMap(number a, const coeffs src, const coeffs dst)
Definition numbers.cc:293
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition coeffs.h:794
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
Definition coeffs.h:726
@ 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:722
static number nrnMapZ(number from, const coeffs src, const coeffs dst)
Definition rmodulon.cc:770
static number nrnMapZp(number from, const coeffs, const coeffs dst)
Definition rmodulon.cc:731
static number nrnMapQ(number from, const coeffs src, const coeffs dst)
Definition rmodulon.cc:749
static number nrnMapModN(number from, const coeffs, const coeffs dst)
Definition rmodulon.cc:717

◆ nrnSub()

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

786{
787 char *s,*z;
788 if (a==NULL)
789 {
790 StringAppendS("o");
791 }
792 else
793 {
794 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
795 s=(char*)omAlloc(l);
796 z=mpz_get_str(s,10,(mpz_ptr) a);
797 StringAppendS(z);
799 }
800}
void StringAppendS(const char *st)
Definition reporter.cc:107

◆ nrnXExtGcd()

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

Definition at line 403 of file rmodulon.cc.

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