8 #ifndef CRYPTOPP_MERSENNE_TWISTER_H 9 #define CRYPTOPP_MERSENNE_TWISTER_H 25 template <
unsigned int K,
unsigned int M,
unsigned int N,
unsigned int F,
unsigned long S>
36 for (
unsigned int i = 1; i < N+1; i++)
37 m_state[i] = word32(F * (m_state[i-1] ^ (m_state[i-1] >> 30)) + i);
51 for (
size_t i=0; i < size/4; i++, output += 4)
53 #if defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS) && defined(IS_LITTLE_ENDIAN) 54 *((word32*)output) =
ByteReverse(NextMersenneWord());
55 #elif defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS) 56 *((word32*)output) = NextMersenneWord();
58 temp = NextMersenneWord();
59 output[3] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 0);
60 output[2] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 1);
61 output[1] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 2);
62 output[0] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 3);
70 *((
volatile word32*)&temp) = 0;
75 temp = NextMersenneWord();
78 case 3: output[2] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 1);
79 case 2: output[1] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 2);
80 case 1: output[0] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 3);
break;
82 default: assert(0); ;;
86 *((
volatile word32*)&temp) = 0;
95 const word32 range = max-min;
96 if (range == 0xffffffffL)
97 return NextMersenneWord();
103 value =
Crop(NextMersenneWord(), maxBits);
104 }
while (value > range);
127 word32 NextMersenneWord()
129 if (m_idx >= N) { Twist(); }
131 word32 temp = m_state[m_idx++];
133 temp ^= (temp >> 11);
134 temp ^= (temp << 7) & 0x9D2C5680;
135 temp ^= (temp << 15) & 0xEFC60000;
137 return temp ^ (temp >> 18);
143 static const unsigned long magic[2]={0x0UL, K};
147 for (kk=0;kk<N-M;kk++)
149 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
150 m_state[kk] = m_state[kk+M] ^ (temp >> 1) ^ magic[temp & 0x1UL];
155 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
156 m_state[kk] = m_state[kk+(M-N)] ^ (temp >> 1) ^ magic[temp & 0x1UL];
159 temp = (m_state[N-1] & 0x80000000)|(m_state[0] & 0x7FFFFFFF);
160 m_state[N-1] = m_state[M-1] ^ (temp >> 1) ^ magic[temp & 0x1UL];
166 *((
volatile word32*)&temp) = 0;
190 #endif // CRYPTOPP_MERSENNE_TWISTER_H Utility functions for the Crypto++ library.
MersenneTwister< 0x9908B0DF, 397, 624, 0x10DCD, 4537 > MT19937
Original MT19937 generator provided in the ACM paper.
Mersenne Twister class for Monte-Carlo simulations.
Abstract base classes that provide a uniform interface to this library.
Interface for random number generators.
Classes and functions for secure memory allocations.
T Crop(T value, size_t bits)
Truncates the value to the specified number of bits.
void DiscardBytes(size_t n)
Generate and discard n bytes.
void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
MersenneTwister< 0x9908B0DF, 397, 624, 0x6C078965, 5489 > MT19937ar
Updated MT19937 generator adapted to provide an array for initialization.
T1 RoundUpToMultipleOf(const T1 &n, const T2 &m)
Rounds a value up to a multiple of a second value.
Crypto++ library namespace.
word32 GenerateWord32(word32 min=0, word32 max=0xffffffffL)
Generate a random 32-bit word in the range min to max, inclusive.
byte ByteReverse(byte value)
Reverses bytes in a 8-bit value.
unsigned int BitPrecision(const T &value)
Returns the number of bits required for a value.
MersenneTwister(unsigned long seed=S)
Construct a Mersenne Twister.