My Project
Loading...
Searching...
No Matches
rmodulon.h File Reference
#include "misc/auxiliary.h"
#include "coeffs/coeffs.h"
#include "coeffs/rintegers.h"

Go to the source code of this file.

Data Structures

struct  ZnmInfo

Functions

BOOLEAN nrnInitChar (coeffs r, void *)
number nrnMapGMP (number from, const coeffs, const coeffs dst)
nMapFunc nrnSetMap (const coeffs src, const coeffs dst)
coeffs nrnInitCfByName (char *name, n_coeffType n)

Data Structure Documentation

◆ ZnmInfo

struct ZnmInfo

Definition at line 17 of file rmodulon.h.

Data Fields
mpz_ptr base
unsigned long exp

Function Documentation

◆ nrnInitCfByName()

coeffs nrnInitCfByName ( char * name,
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}
int i
Definition cfEzgcd.cc:132
@ 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
const CanonicalForm int s
Definition facAbsFact.cc:51
#define info
Definition libparse.cc:1256
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
#define NULL
Definition omList.c:12

◆ 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}
#define TRUE
Definition auxiliary.h:101
#define FALSE
Definition auxiliary.h:97
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 assume(x)
Definition mod2.h:389
#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 number nrnInit(long i, const coeffs r)
Definition rmodulon.cc:158
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 BOOLEAN nrnIsZero(number a, const coeffs)
Definition rmodulon.cc:242
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
static BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition rmodulon.cc:545
#define nrnDelete
Definition rmodulon.cc:175
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
Definition rmodulon.cc:802
static number nrnInvers(number c, const coeffs r)
Definition rmodulon.cc:255
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 BOOLEAN nrnEqual(number a, number b, const coeffs)
Definition rmodulon.cc:352
static number nrnQuotRem(number a, number b, number *rem, const coeffs r)
Definition rmodulon.cc:679
static long nrnInt(number &n, const coeffs)
Definition rmodulon.cc:169
static BOOLEAN nrnIsOne(number a, const coeffs)
Definition rmodulon.cc:347
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 nrnMult(number a, number b, const coeffs r)
Definition rmodulon.cc:195
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 number nrnGcd(number a, number b, const coeffs r)
Definition rmodulon.cc:275
static void nrnInpAdd(number &a, number b, const coeffs r)
Definition rmodulon.cc:227
#define mpz_size1(A)
Definition si_gmp.h:17

◆ 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}
#define omAllocBin(bin)
VAR omBin gmp_nrz_bin
Definition rintegers.cc:23

◆ 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_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(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_VAR mpz_ptr nrnMapCoef
Definition rmodulon.cc:715
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