My Project  UNKNOWN_GIT_VERSION
Data Structures | Functions
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 18 of file rmodulon.h.

Data Fields
mpz_ptr base
int exp

Function Documentation

◆ nrnInitCfByName()

coeffs nrnInitCfByName ( char *  name,
n_coeffType  n 
)

Definition at line 58 of file rmodulon.cc.

59 {
60  const char start[]="ZZ/bigint(";
61  const int start_len=strlen(start);
62  if (strncmp(s,start,start_len)==0)
63  {
64  s+=start_len;
65  mpz_t z;
66  mpz_init(z);
67  s=nEatLong(s,z);
68  ZnmInfo info;
69  info.base=z;
70  info.exp= 1;
71  while ((*s!='\0') && (*s!=')')) s++;
72  // expect ")" or ")^exp"
73  if (*s=='\0') { mpz_clear(z); return NULL; }
74  if (((*s)==')') && (*(s+1)=='^'))
75  {
76  s=s+2;
77  s=nEati(s,&(info.exp),0);
78  return nInitChar(n_Znm,(void*) &info);
79  }
80  else
81  return nInitChar(n_Zn,(void*) &info);
82  }
83  else return NULL;
84 }
@ n_Znm
only used if HAVE_RINGS is defined
Definition: coeffs.h:46
@ n_Zn
only used if HAVE_RINGS is defined
Definition: coeffs.h:45
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
Definition: numbers.cc:350
const CanonicalForm int s
Definition: facAbsFact.cc:55
const ExtensionInfo & info
< [in] sqrfree poly
char * nEatLong(char *s, mpz_ptr i)
extracts a long integer from s, returns the rest
Definition: numbers.cc:652
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
Definition: numbers.cc:631
#define NULL
Definition: omList.c:10

◆ 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  nrnInitExp (info->exp, r);
1008 
1009  /* next computation may yield wrong characteristic as r->modNumber
1010  is a GMP number */
1011  r->ch = mpz_get_ui(r->modNumber);
1012 
1013  r->is_field=FALSE;
1014  r->is_domain=FALSE;
1015  r->rep=n_rep_gmp;
1016 
1017 
1018  r->cfCoeffString = nrnCoeffString;
1019 
1020  r->cfInit = nrnInit;
1021  r->cfDelete = nrnDelete;
1022  r->cfCopy = nrnCopy;
1023  r->cfSize = nrnSize;
1024  r->cfInt = nrnInt;
1025  r->cfAdd = nrnAdd;
1026  r->cfSub = nrnSub;
1027  r->cfMult = nrnMult;
1028  r->cfDiv = nrnDiv;
1029  r->cfAnn = nrnAnn;
1030  r->cfIntMod = nrnMod;
1031  r->cfExactDiv = nrnDiv;
1032  r->cfInpNeg = nrnNeg;
1033  r->cfInvers = nrnInvers;
1034  r->cfDivBy = nrnDivBy;
1035  r->cfDivComp = nrnDivComp;
1036  r->cfGreater = nrnGreater;
1037  r->cfEqual = nrnEqual;
1038  r->cfIsZero = nrnIsZero;
1039  r->cfIsOne = nrnIsOne;
1040  r->cfIsMOne = nrnIsMOne;
1041  r->cfGreaterZero = nrnGreaterZero;
1042  r->cfWriteLong = nrnWrite;
1043  r->cfRead = nrnRead;
1044  r->cfPower = nrnPower;
1045  r->cfSetMap = nrnSetMap;
1046  //r->cfNormalize = ndNormalize;
1047  r->cfLcm = nrnLcm;
1048  r->cfGcd = nrnGcd;
1049  r->cfIsUnit = nrnIsUnit;
1050  r->cfGetUnit = nrnGetUnit;
1051  r->cfExtGcd = nrnExtGcd;
1052  r->cfXExtGcd = nrnXExtGcd;
1053  r->cfQuotRem = nrnQuotRem;
1054  r->cfCoeffName = nrnCoeffName;
1055  r->cfCoeffWrite = nrnCoeffWrite;
1056  r->nCoeffIsEqual = nrnCoeffIsEqual;
1057  r->cfKillChar = nrnKillChar;
1058  r->cfQuot1 = nrnQuot1;
1059 #if SI_INTEGER_VARIANT==2
1060  r->cfWriteFd = nrzWriteFd;
1061  r->cfReadFd = nrzReadFd;
1062 #endif
1063 
1064 #ifdef LDEBUG
1065  r->cfDBTest = nrnDBTest;
1066 #endif
1067  if ((r->modExponent==1)&&(mpz_size1(r->modBase)==1))
1068  {
1069  long p=mpz_get_si(r->modBase);
1070  if ((p<=FACTORY_MAX_PRIME)&&(p==IsPrime(p))) /*factory limit: <2^29*/
1071  {
1072  r->convFactoryNSingN=nrnConvFactoryNSingN;
1073  r->convSingNFactoryN=nrnConvSingNFactoryN;
1074  }
1075  }
1076  return FALSE;
1077 }
#define FALSE
Definition: auxiliary.h:94
int p
Definition: cfModGcd.cc:4019
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition: coeffs.h:421
@ n_rep_gmp
(mpz_ptr), see rmodulon,h
Definition: coeffs.h:115
#define assume(x)
Definition: mod2.h:390
#define FACTORY_MAX_PRIME
Definition: modulop.h:30
int IsPrime(int p)
Definition: prime.cc:61
number nrzReadFd(const ssiInfo *d, const coeffs)
Definition: rintegers.cc:586
void nrzWriteFd(number n, const ssiInfo *d, const coeffs)
Definition: rintegers.cc:580
static const char * nrnRead(const char *s, number *a, const coeffs r)
Definition: rmodulon.cc:961
static coeffs nrnQuot1(number c, const coeffs r)
Definition: rmodulon.cc:133
static number nrnInit(long i, const coeffs r)
Definition: rmodulon.cc:188
static void nrnKillChar(coeffs r)
Definition: rmodulon.cc:125
BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
Definition: rmodulon.cc:923
#define nrnSize
Definition: rmodulon.cc:206
static BOOLEAN nrnGreater(number a, number b, const coeffs)
Definition: rmodulon.cc:514
static BOOLEAN nrnIsZero(number a, const coeffs)
Definition: rmodulon.cc:263
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:341
static BOOLEAN nrnCoeffIsEqual(const coeffs r, n_coeffType n, void *parameter)
Definition: rmodulon.cc:105
void nrnWrite(number a, const coeffs)
Definition: rmodulon.cc:777
static number nrnMod(number a, number b, const coeffs r)
Definition: rmodulon.cc:615
static void nrnInitExp(unsigned long m, coeffs r)
Definition: rmodulon.cc:912
static number nrnAnn(number k, const coeffs r)
Definition: rmodulon.cc:545
static char * nrnCoeffName(const coeffs r)
Definition: rmodulon.cc:87
static BOOLEAN nrnIsUnit(number a, const coeffs r)
Definition: rmodulon.cc:537
static void nrnCoeffWrite(const coeffs r, BOOLEAN)
Definition: rmodulon.cc:36
#define nrnDelete
Definition: rmodulon.cc:205
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
Definition: rmodulon.cc:815
static number nrnInvers(number c, const coeffs r)
Definition: rmodulon.cc:276
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:569
static number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
Definition: rmodulon.cc:413
static BOOLEAN nrnEqual(number a, number b, const coeffs)
Definition: rmodulon.cc:362
static number nrnQuotRem(number a, number b, number *rem, const coeffs r)
Definition: rmodulon.cc:670
static long nrnInt(number &n, const coeffs)
Definition: rmodulon.cc:199
static BOOLEAN nrnIsOne(number a, const coeffs)
Definition: rmodulon.cc:357
static number nrnCopy(number a, const coeffs)
Definition: rmodulon.cc:178
static number nrnSub(number a, number b, const coeffs r)
Definition: rmodulon.cc:254
static number nrnLcm(number a, number b, const coeffs r)
Definition: rmodulon.cc:308
static void nrnPower(number a, int i, number *result, const coeffs r)
Definition: rmodulon.cc:237
static number nrnMult(number a, number b, const coeffs r)
Definition: rmodulon.cc:228
static number nrnNeg(number c, const coeffs r)
Definition: rmodulon.cc:268
static char * nrnCoeffString(const coeffs r)
Definition: rmodulon.cc:113
static number nrnGetUnit(number k, const coeffs r)
Definition: rmodulon.cc:367
static number nrnDiv(number a, number b, const coeffs r)
Definition: rmodulon.cc:577
static BOOLEAN nrnIsMOne(number a, const coeffs r)
Definition: rmodulon.cc:504
static BOOLEAN nrnDivBy(number a, number b, const coeffs r)
Definition: rmodulon.cc:559
static BOOLEAN nrnGreaterZero(number k, const coeffs cf)
Definition: rmodulon.cc:519
static number nrnAdd(number a, number b, const coeffs r)
Definition: rmodulon.cc:245
static number nrnGcd(number a, number b, const coeffs r)
Definition: rmodulon.cc:289
#define mpz_size1(A)
Definition: si_gmp.h:12

◆ nrnMapGMP()

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

Definition at line 732 of file rmodulon.cc.

733 {
734  mpz_ptr erg = (mpz_ptr)omAllocBin(gmp_nrz_bin);
735  mpz_init(erg);
736  mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
737  return (number)erg;
738 }
#define omAllocBin(bin)
Definition: omAllocDecl.h:205
omBin gmp_nrz_bin
Definition: rintegers.cc:31

◆ nrnSetMap()

nMapFunc nrnSetMap ( const coeffs  src,
const coeffs  dst 
)

Definition at line 815 of file rmodulon.cc.

816 {
817  /* dst = nrn */
818  if ((src->rep==n_rep_gmp) && nCoeff_is_Z(src))
819  {
820  return nrnMapZ;
821  }
822  if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Z(src)*/)
823  {
824  return nrnMapZ;
825  }
826  if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Q(src)) or Z*/
827  {
828  return nrnMapQ;
829  }
830  // Some type of Z/n ring / field
831  if (nCoeff_is_Zn(src) || nCoeff_is_Ring_PtoM(src) ||
832  nCoeff_is_Ring_2toM(src) || nCoeff_is_Zp(src))
833  {
834  if ( (!nCoeff_is_Zp(src))
835  && (mpz_cmp(src->modBase, dst->modBase) == 0)
836  && (src->modExponent == dst->modExponent)) return ndCopyMap;
837  else
838  {
839  mpz_ptr nrnMapModul = (mpz_ptr) omAllocBin(gmp_nrz_bin);
840  // Computing the n of Z/n
841  if (nCoeff_is_Zp(src))
842  {
843  mpz_init_set_si(nrnMapModul, src->ch);
844  }
845  else
846  {
847  mpz_init(nrnMapModul);
848  mpz_set(nrnMapModul, src->modNumber);
849  }
850  // nrnMapCoef = 1 in dst if dst is a subring of src
851  // nrnMapCoef = 0 in dst / src if src is a subring of dst
852  if (nrnMapCoef == NULL)
853  {
854  nrnMapCoef = (mpz_ptr) omAllocBin(gmp_nrz_bin);
855  mpz_init(nrnMapCoef);
856  }
857  if (mpz_divisible_p(nrnMapModul, dst->modNumber))
858  {
859  mpz_set_ui(nrnMapCoef, 1);
860  }
861  else
862  if (mpz_divisible_p(dst->modNumber,nrnMapModul))
863  {
864  mpz_divexact(nrnMapCoef, dst->modNumber, nrnMapModul);
865  mpz_ptr tmp = dst->modNumber;
866  dst->modNumber = nrnMapModul;
867  if (!nrnIsUnit((number) nrnMapCoef,dst))
868  {
869  dst->modNumber = tmp;
870  nrnDelete((number*) &nrnMapModul, dst);
871  return NULL;
872  }
873  mpz_ptr inv = (mpz_ptr) nrnInvers((number) nrnMapCoef,dst);
874  dst->modNumber = tmp;
875  mpz_mul(nrnMapCoef, nrnMapCoef, inv);
876  mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
877  nrnDelete((number*) &inv, dst);
878  }
879  else
880  {
881  nrnDelete((number*) &nrnMapModul, dst);
882  return NULL;
883  }
884  nrnDelete((number*) &nrnMapModul, dst);
885  if (nCoeff_is_Ring_2toM(src))
886  return nrnMap2toM;
887  else if (nCoeff_is_Zp(src))
888  return nrnMapZp;
889  else
890  return nrnMapModN;
891  }
892  }
893  return NULL; // default
894 }
static FORCE_INLINE BOOLEAN nCoeff_is_Z(const coeffs r)
Definition: coeffs.h:838
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
Definition: coeffs.h:749
static FORCE_INLINE BOOLEAN nCoeff_is_Zn(const coeffs r)
Definition: coeffs.h:848
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
Definition: coeffs.h:822
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
Definition: coeffs.h:746
@ n_rep_gap_rat
(number), see longrat.h
Definition: coeffs.h:111
@ n_rep_gap_gmp
(), see rinteger.h, new impl.
Definition: coeffs.h:112
number ndCopyMap(number a, const coeffs aRing, const coeffs r)
Definition: numbers.cc:252
static number nrnMap2toM(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:713
static mpz_ptr nrnMapCoef
Definition: rmodulon.cc:706
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:722
static number nrnMapQ(number from, const coeffs src, const coeffs dst)
Definition: rmodulon.cc:740
static number nrnMapModN(number from, const coeffs, const coeffs dst)
Definition: rmodulon.cc:708