// README FILE // Pohlig-Hellman pseudorandom number generator with pseudorandom skip // 32-bit implementation // The period of each generator is P > 2^62 = 4.6e18 // The generator seeds itself on the first call using time in microseconds since 1/1/1970 // and the processid and number of processes in MPI implementation // Each process is assigned an independent safe prime modulus in [2^31 .. 2^32] // a safe prime n is a prime such that (n-1)/2 is also prime // // Files randomph.cpp and randomph.h should be included // and main.c or main.cpp must reference #include "randomph.h" //32-bit Pohlig-Hellman pseudorandom number generator with pseudorandom skip. // Returns double uniformly distributed on (0..1) double randomph(void); // returns state of generator // integerparameters[0]=m; // integerparameters[1]=s; // integerparameters[2]=c; // integerparameters[3]=n; // integerparameters[4]=e; // integerparameters[5]=p; // integerparameters[6]=a; void getparameters_randomph(unsigned long * integerparameters); //initialize generator, done automatically on the first call to randomph void init_randomph(void); //reinitialize generator with parameters m,s,n. // e,p,a are not changeable in this implementation // m=integerparameters[0]; // s=integerparameters[1]; // c=integerparameters[2]; // n=integerparameters[3]; //e=integerparameters[4]; //p=integerparameters[5]; //a=integerparameters[6]; void init_randomph(unsigned long * integerparameters); // returns x^ e mod n for x,e,n < 2^32 unsigned long powermod(unsigned long x, unsigned long e, unsigned long n); // Rabin-Miller primality test for n<2^32 // TRUE = 1 , FALSE = 0 int primeq(unsigned long n); // tests to see if n is a safe prime for n<2^32 // TRUE = 1 , FALSE = 0 int safeprimeq(unsigned long n); // selects the next prime above n if offset = +1, // jth prime above n if offset = +j // selects the next prime below n if offset = -1, // jth prime below n if offset = -j unsigned long nextprime(unsigned long n, long offset); // selects the next safe prime above n if offset = +1, // jth safe prime above n if offset = +j // selects the next safe prime below n if offset = -1, // jth safe prime below n if offset = -j unsigned long nextsafeprime(unsigned long n, long offset); //returns one of 3060794 safe primes between 2^31 and 2^32 starting near 2^32 // with 0 <= i < 3060794 // safeprime(0) = 4294967087 is the largest safe prime below 2^32 // safeprime(3060793) = 2147483783 is the smallest safe prime above 2^31 unsigned long safeprime(long i);