9 #ifndef CRYPTOPP_MERSENNE_TWISTER_H
10 #define CRYPTOPP_MERSENNE_TWISTER_H
30 template <
unsigned int K,
unsigned int M,
unsigned int N,
unsigned int F,
unsigned long S>
41 for (
unsigned int i = 1; i < N+1; i++)
42 m_state[i] = word32(F * (m_state[i-1] ^ (m_state[i-1] >> 30)) + i);
56 for (
size_t i=0; i < size/4; i++, output += 4)
58 #if defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS) && defined(IS_LITTLE_ENDIAN)
59 *((word32*)output) =
ByteReverse(NextMersenneWord());
60 #elif defined(CRYPTOPP_ALLOW_UNALIGNED_DATA_ACCESS)
61 *((word32*)output) = NextMersenneWord();
63 temp = NextMersenneWord();
64 output[3] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 0);
65 output[2] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 1);
66 output[1] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 2);
67 output[0] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 3);
75 *((
volatile word32*)&temp) = 0;
80 temp = NextMersenneWord();
83 case 3: output[2] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 1);
84 case 2: output[1] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 2);
85 case 1: output[0] = CRYPTOPP_GET_BYTE_AS_BYTE(temp, 3);
break;
91 *((
volatile word32*)&temp) = 0;
100 const word32 range = max-min;
101 if (range == 0xffffffffL)
102 return NextMersenneWord();
108 value =
Crop(NextMersenneWord(), maxBits);
109 }
while (value > range);
132 word32 NextMersenneWord()
134 if (m_idx >= N) { Twist(); }
136 word32 temp = m_state[m_idx++];
138 temp ^= (temp >> 11);
139 temp ^= (temp << 7) & 0x9D2C5680;
140 temp ^= (temp << 15) & 0xEFC60000;
142 return temp ^ (temp >> 18);
148 static const unsigned long magic[2]={0x0UL, K};
152 for (kk=0;kk<N-M;kk++)
154 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
155 m_state[kk] = m_state[kk+M] ^ (temp >> 1) ^ magic[temp & 0x1UL];
160 temp = (m_state[kk] & 0x80000000)|(m_state[kk+1] & 0x7FFFFFFF);
161 m_state[kk] = m_state[kk+(M-N)] ^ (temp >> 1) ^ magic[temp & 0x1UL];
164 temp = (m_state[N-1] & 0x80000000)|(m_state[0] & 0x7FFFFFFF);
165 m_state[N-1] = m_state[M-1] ^ (temp >> 1) ^ magic[temp & 0x1UL];
171 *((
volatile word32*)&temp) = 0;
190 #if CRYPTOPP_DOXYGEN_PROCESSING
203 #if CRYPTOPP_DOXYGEN_PROCESSING
211 #endif // CRYPTOPP_MERSENNE_TWISTER_H