1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

Space inflate marsenne

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-05-13 15:06:06 +02:00
parent 6e5bb3279f
commit da1165ae5d
2 changed files with 102 additions and 80 deletions

View file

@ -41,93 +41,110 @@
email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)
*/ */
#include "types.h"
#include "mersenne.h" #include "mersenne.h"
/* Period parameters */ namespace {
#define N 624
#define M 397
#define MATRIX_A 0x9908b0dfUL /* constant vector a */
#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
#define LOWER_MASK 0x7fffffffUL /* least significant r bits */
static unsigned long mt[N]; /* the array for the state vector */ // Period parameters
static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ const int N = 624;
const int M = 397;
const unsigned long MATRIX_A = 0x9908b0dfUL; // Constant vector a
const unsigned long UPPER_MASK = 0x80000000UL; // Most significant w-r bits
const unsigned long LOWER_MASK = 0x7fffffffUL; // Least significant r bits
unsigned long mt[N]; // The array for the state vector
int mti = N + 1; // mti == N+1 means mt[N] is not initialized
// Initializes mt[N] with a seed
void init_genrand(unsigned long s) {
/* initializes mt[N] with a seed */
static void init_genrand(unsigned long s)
{
mt[0]= s & 0xffffffffUL; mt[0]= s & 0xffffffffUL;
for (mti=1; mti<N; mti++) { for (mti = 1; mti < N; mti++)
mt[mti] = {
(1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti); // See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
/* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ // In the previous versions, MSBs of the seed affect
/* In the previous versions, MSBs of the seed affect */ // only MSBs of the array mt[].
/* only MSBs of the array mt[]. */ // 2002/01/09 modified by Makoto Matsumoto
/* 2002/01/09 modified by Makoto Matsumoto */ mt[mti] = 1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti;
mt[mti] &= 0xffffffffUL; mt[mti] &= 0xffffffffUL; // For > 32 bit machines
/* for >32 bit machines */ }
} }
}
/* initialize by an array with array-length */ // Initialize by an array with array-length
/* init_key is the array for initializing keys */ // init_key is the array for initializing keys
/* key_length is its length */ // key_length is its length
/* slight change for C++, 2004/2/26 */ // slight change for C++, 2004/2/26
static void init_by_array(unsigned long init_key[], int key_length) void init_by_array(unsigned long init_key[], int key_length) {
{
int i, j, k; int i = 1;
int j = 0;
int k = (N > key_length ? N : key_length);
init_genrand(19650218UL); init_genrand(19650218UL);
i=1; j=0;
k = (N>key_length ? N : key_length); for ( ; k; k--)
for (; k; k--) { {
mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + init_key[j] + j; // Non linear
+ init_key[j] + j; /* non linear */ mt[i] &= 0xffffffffUL; // For WORDSIZE > 32 machines
mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
i++; j++; i++; j++;
if (i>=N) { mt[0] = mt[N-1]; i=1; } if (i >= N)
if (j>=key_length) j=0; {
mt[0] = mt[N-1];
i = 1;
} }
for (k=N-1; k; k--) { if (j >= key_length)
mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) j = 0;
- i; /* non linear */ }
mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ for (k = N-1; k; k--)
{
mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) - i; // Non linear
mt[i] &= 0xffffffffUL; // For WORDSIZE > 32 machines
i++; i++;
if (i>=N) { mt[0] = mt[N-1]; i=1; } if (i >= N)
{
mt[0] = mt[N-1];
i = 1;
}
}
mt[0] = 0x80000000UL; // MSB is 1; assuring non-zero initial array
} }
mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ } // namespace
}
// Generates a random number on [0,0xffffffff]-interval
uint32_t genrand_int32() {
/* generates a random number on [0,0xffffffff]-interval */
uint32_t genrand_int32(void) {
unsigned long y; unsigned long y;
static unsigned long mag01[2]={0x0UL, MATRIX_A}; static unsigned long mag01[2] = {0x0UL, MATRIX_A};
/* mag01[x] = x * MATRIX_A for x=0,1 */ /* mag01[x] = x * MATRIX_A for x=0,1 */
if (mti >= N) { /* generate N words at one time */ // Generate N words at one time
if (mti >= N)
{
int kk; int kk;
if (mti == N+1) /* if init_genrand() has not been called, */ if (mti == N+1) // If init_genrand() has not been called,
init_genrand(5489UL); /* a default initial seed is used */ init_genrand(5489UL); // a default initial seed is used.
for (kk=0;kk<N-M;kk++) { for (kk = 0; kk < N-M; kk++)
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); {
y = (mt[kk] & UPPER_MASK) | (mt[kk+1] & LOWER_MASK);
mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL]; mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
} }
for (;kk<N-1;kk++) { for ( ; kk < N-1; kk++)
y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); {
y = (mt[kk] & UPPER_MASK) | (mt[kk+1] & LOWER_MASK);
mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
} }
y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); y = (mt[N-1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
mti = 0; mti = 0;
} }
y = mt[mti++]; y = mt[mti++];
/* Tempering */ // Tempering
y ^= (y >> 11); y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 7) & 0x9d2c5680UL;
y ^= (y << 15) & 0xefc60000UL; y ^= (y << 15) & 0xefc60000UL;
@ -136,14 +153,19 @@ uint32_t genrand_int32(void) {
return y; return y;
} }
uint64_t genrand_int64(void) { uint64_t genrand_int64() {
uint64_t x, y; uint64_t x, y;
x = genrand_int32(); y = genrand_int32(); x = genrand_int32();
return (x<<32)|y; y = genrand_int32();
return (x << 32) | y;
} }
void init_mersenne(void) { void init_mersenne() {
unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
unsigned long init[4] = {0x123, 0x234, 0x345, 0x456};
unsigned long length = 4;
init_by_array(init, length); init_by_array(init, length);
} }

View file

@ -32,9 +32,9 @@
//// Prototypes //// Prototypes
//// ////
extern uint32_t genrand_int32(void); extern uint32_t genrand_int32();
extern uint64_t genrand_int64(void); extern uint64_t genrand_int64();
extern void init_mersenne(void); extern void init_mersenne();
#endif // !defined(MERSENNE_H_INCLUDED) #endif // !defined(MERSENNE_H_INCLUDED)