8 #ifndef CRYPTOPP_MERSENNE_TWISTER_H
9 #define CRYPTOPP_MERSENNE_TWISTER_H
30 template <
unsigned int K,
unsigned int M,
unsigned int N,
unsigned int F, word32 S>
34 CRYPTOPP_STATIC_CONSTEXPR
const char* StaticAlgorithmName() {
return (S==5489 ?
"MT19937ar" : (S==4537 ?
"MT19937" :
"MT19937x")); }
57 ::memcpy(&temp, input,
STDMIN(
sizeof(temp), length));
75 for (
size_t i=0; i < size/4; i++, output += 4)
77 temp = NextMersenneWord();
78 memcpy(output, &temp, 4);
90 temp = NextMersenneWord();
93 case 3: output[2] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 1);
94 case 2: output[1] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 2);
95 case 1: output[0] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 3);
break;
110 const word32 range = max-min;
111 if (range == 0xffffffffL)
112 return NextMersenneWord();
118 value =
Crop(NextMersenneWord(), maxBits);
119 }
while (value > range);
138 void Reset(word32 seed)
144 for (
unsigned int i = 1; i < N+1; i++)
145 m_state[i] = word32(F * (m_state[i-1] ^ (m_state[i-1] >> 30)) + i);
152 word32 NextMersenneWord()
154 if (m_idx >= N) { Twist(); }
156 word32 temp = m_state[m_idx++];
158 temp ^= (temp >> 11);
159 temp ^= (temp << 7) & 0x9D2C5680;
160 temp ^= (temp << 15) & 0xEFC60000;
162 return temp ^ (temp >> 18);
168 static const word32 magic[2]={0x0UL, K};
172 for (kk=0;kk<N-M;kk++)
174 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
175 m_state[kk] = m_state[kk+M] ^ (temp >> 1) ^ magic[temp & 0x1UL];
180 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
181 m_state[kk] = m_state[kk+(M-N)] ^ (temp >> 1) ^ magic[temp & 0x1UL];
184 temp = (m_state[N-1] & 0x80000000)|(m_state[0] & 0x7FFFFFFF);
185 m_state[N-1] = m_state[M-1] ^ (temp >> 1) ^ magic[temp & 0x1UL];
211 #if CRYPTOPP_DOXYGEN_PROCESSING
225 #if CRYPTOPP_DOXYGEN_PROCESSING
233 #endif // CRYPTOPP_MERSENNE_TWISTER_H