blob: a05e76a44f2119995a2dc7298467d282154c79b1 [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001/* Mersenne Twister pseudo-random number generator functions.
2
3 THE FUNCTIONS IN THIS FILE ARE FOR INTERNAL USE ONLY. THEY'RE ALMOST
4 CERTAIN TO BE SUBJECT TO INCOMPATIBLE CHANGES OR DISAPPEAR COMPLETELY IN
5 FUTURE GNU MP RELEASES.
6
7Copyright 2002, 2003, 2006 Free Software Foundation, Inc.
8
9This file is part of the GNU MP Library.
10
11The GNU MP Library is free software; you can redistribute it and/or modify
12it under the terms of either:
13
14 * the GNU Lesser General Public License as published by the Free
15 Software Foundation; either version 3 of the License, or (at your
16 option) any later version.
17
18or
19
20 * the GNU General Public License as published by the Free Software
21 Foundation; either version 2 of the License, or (at your option) any
22 later version.
23
24or both in parallel, as here.
25
26The GNU MP Library is distributed in the hope that it will be useful, but
27WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
28or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
29for more details.
30
31You should have received copies of the GNU General Public License and the
32GNU Lesser General Public License along with the GNU MP Library. If not,
33see https://www.gnu.org/licenses/. */
34
35#include <stdio.h> /* for NULL */
36
37#include "gmp-impl.h"
38#include "randmt.h"
39
40
41/* This code implements the Mersenne Twister pseudorandom number generator
42 by Takuji Nishimura and Makoto Matsumoto. The buffer initialization
43 function is different in order to permit seeds greater than 2^32-1.
44
45 This file contains a special __gmp_randinit_mt_noseed which excludes the
46 seeding function from the gmp_randfnptr_t routines. This is for use by
47 mpn_random and mpn_random2 on the global random generator. MT seeding
48 uses mpz functions, and we don't want mpn routines dragging mpz functions
49 into the link. */
50
51
52/* Default seed to use when the generator is not initialized. */
53#define DEFAULT_SEED 5489 /* was 4357 */
54
55/* Tempering masks. */
56#define MASK_1 0x9D2C5680
57#define MASK_2 0xEFC60000
58
59/* Initial state of buffer when initialized with default seed. */
60static const gmp_uint_least32_t default_state[N] =
61{
62 0xD247B233,0x9E5AA8F1,0x0FFA981B,0x9DCB0980,0x74200F2B,0xA576D044,
63 0xE9F05ADF,0x1538BFF5,0x59818BBF,0xCF9E58D8,0x09FCE032,0x6A1C663F,
64 0x5116E78A,0x69B3E0FA,0x6D92D665,0xD0A8BE98,0xF669B734,0x41AC1B68,
65 0x630423F1,0x4B8D6B8A,0xC2C46DD7,0x5680747D,0x43703E8F,0x3B6103D2,
66 0x49E5EB3F,0xCBDAB4C1,0x9C988E23,0x747BEE0B,0x9111E329,0x9F031B5A,
67 0xECCA71B9,0x2AFE4EF8,0x8421C7ED,0xAC89AFF1,0xAED90DF3,0x2DD74F01,
68 0x14906A13,0x75873FA9,0xFF83F877,0x5028A0C9,0x11B4C41D,0x7CAEDBC4,
69 0x8672D0A7,0x48A7C109,0x8320E59F,0xBC0B3D5F,0x75A30886,0xF9E0D128,
70 0x41AF7580,0x239BB94D,0xC67A3C81,0x74EEBD6E,0xBC02B53C,0x727EA449,
71 0x6B8A2806,0x5853B0DA,0xBDE032F4,0xCE234885,0x320D6145,0x48CC053F,
72 0x00DBC4D2,0xD55A2397,0xE1059B6F,0x1C3E05D1,0x09657C64,0xD07CB661,
73 0x6E982E34,0x6DD1D777,0xEDED1071,0xD79DFD65,0xF816DDCE,0xB6FAF1E4,
74 0x1C771074,0x311835BD,0x18F952F7,0xF8F40350,0x4ECED354,0x7C8AC12B,
75 0x31A9994D,0x4FD47747,0xDC227A23,0x6DFAFDDF,0x6796E748,0x0C6F634F,
76 0xF992FA1D,0x4CF670C9,0x067DFD31,0xA7A3E1A5,0x8CD7D9DF,0x972CCB34,
77 0x67C82156,0xD548F6A8,0x045CEC21,0xF3240BFB,0xDEF656A7,0x43DE08C5,
78 0xDAD1F92F,0x3726C56B,0x1409F19A,0x942FD147,0xB926749C,0xADDC31B8,
79 0x53D0D869,0xD1BA52FE,0x6722DF8C,0x22D95A74,0x7DC1B52A,0x1DEC6FD5,
80 0x7262874D,0x0A725DC9,0xE6A8193D,0xA052835A,0xDC9AD928,0xE59EBB90,
81 0x70DBA9FF,0xD612749D,0x5A5A638C,0x6086EC37,0x2A579709,0x1449EA3A,
82 0xBC8E3C06,0x2F900666,0xFBE74FD1,0x6B35B911,0xF8335008,0xEF1E979D,
83 0x738AB29D,0xA2DC0FDC,0x7696305D,0xF5429DAC,0x8C41813B,0x8073E02E,
84 0xBEF83CCD,0x7B50A95A,0x05EE5862,0x00829ECE,0x8CA1958C,0xBE4EA2E2,
85 0x4293BB73,0x656F7B23,0x417316D8,0x4467D7CF,0x2200E63B,0x109050C8,
86 0x814CBE47,0x36B1D4A8,0x36AF9305,0x308327B3,0xEBCD7344,0xA738DE27,
87 0x5A10C399,0x4142371D,0x64A18528,0x0B31E8B2,0x641057B9,0x6AFC363B,
88 0x108AD953,0x9D4DA234,0x0C2D9159,0x1C8A1A1F,0x310C66BA,0x87AA1070,
89 0xDAC832FF,0x0A433422,0x7AF15812,0x2D8D9BD0,0x995A25E9,0x25326CAC,
90 0xA34384DB,0x4C8421CC,0x4F0315EC,0x29E8649E,0xA7732D6F,0x2E94D3E3,
91 0x7D98A340,0x397C4D74,0x659DB4DE,0x747D4E9A,0xD9DB8435,0x4659DBE9,
92 0x313E6DC5,0x29D104DC,0x9F226CBA,0x452F18B0,0xD0BC5068,0x844CA299,
93 0x782B294E,0x4AE2EB7B,0xA4C475F8,0x70A81311,0x4B3E8BCC,0x7E20D4BA,
94 0xABCA33C9,0x57BE2960,0x44F9B419,0x2E567746,0x72EB757A,0x102CC0E8,
95 0xB07F32B9,0xD0DABD59,0xBA85AD6B,0xF3E20667,0x98D77D81,0x197AFA47,
96 0x518EE9AC,0xE10CE5A2,0x01CF2C2A,0xD3A3AF3D,0x16DDFD65,0x669232F8,
97 0x1C50A301,0xB93D9151,0x9354D3F4,0x847D79D0,0xD5FE2EC6,0x1F7B0610,
98 0xFA6B90A5,0xC5879041,0x2E7DC05E,0x423F1F32,0xEF623DDB,0x49C13280,
99 0x98714E92,0xC7B6E4AD,0xC4318466,0x0737F312,0x4D3C003F,0x9ACC1F1F,
100 0x5F1C926D,0x085FA771,0x185A83A2,0xF9AA159D,0x0B0B0132,0xF98E7A43,
101 0xCD9EBDBE,0x0190CB29,0x10D93FB6,0x3B8A4D97,0x66A65A41,0xE43E766F,
102 0x77BE3C41,0xB9686364,0xCB36994D,0x6846A287,0x567E77F7,0x36178DD8,
103 0xBDE6B1F2,0xB6EFDC64,0x82950324,0x42053F47,0xC09BE51C,0x0942D762,
104 0x35F92C7F,0x367DEC61,0x6EE3D983,0xDBAAF78A,0x265D2C47,0x8EB4BF5C,
105 0x33B232D7,0xB0137E77,0x373C39A7,0x8D2B2E76,0xC7510F01,0x50F9E032,
106 0x7B1FDDDB,0x724C2AAE,0xB10ECB31,0xCCA3D1B8,0x7F0BCF10,0x4254BBBD,
107 0xE3F93B97,0x2305039B,0x53120E22,0x1A2F3B9A,0x0FDDBD97,0x0118561E,
108 0x0A798E13,0x9E0B3ACD,0xDB6C9F15,0xF512D0A2,0x9E8C3A28,0xEE2184AE,
109 0x0051EC2F,0x2432F74F,0xB0AA66EA,0x55128D88,0xF7D83A38,0x4DAE8E82,
110 0x3FDC98D6,0x5F0BD341,0x7244BE1D,0xC7B48E78,0x2D473053,0x43892E20,
111 0xBA0F1F2A,0x524D4895,0x2E10BCB1,0x4C372D81,0x5C3E50CD,0xCF61CC2E,
112 0x931709AB,0x81B3AEFC,0x39E9405E,0x7FFE108C,0x4FBB3FF8,0x06ABE450,
113 0x7F5BF51E,0xA4E3CDFD,0xDB0F6C6F,0x159A1227,0x3B9FED55,0xD20B6F7F,
114 0xFBE9CC83,0x64856619,0xBF52B8AF,0x9D7006B0,0x71165BC6,0xAE324AEE,
115 0x29D27F2C,0x794C2086,0x74445CE2,0x782915CC,0xD4CE6886,0x3289AE7C,
116 0x53DEF297,0x4185F7ED,0x88B72400,0x3C09DC11,0xBCE3AAB6,0x6A75934A,
117 0xB267E399,0x000DF1BF,0x193BA5E2,0xFA3E1977,0x179E14F6,0x1EEDE298,
118 0x691F0B06,0xB84F78AC,0xC1C15316,0xFFFF3AD6,0x0B457383,0x518CD612,
119 0x05A00F3E,0xD5B7D275,0x4C5ECCD7,0xE02CD0BE,0x5558E9F2,0x0C89BBF0,
120 0xA3D96227,0x2832D2B2,0xF667B897,0xD4556554,0xF9D2F01F,0xFA1E3FAE,
121 0x52C2E1EE,0xE5451F31,0x7E849729,0xDABDB67A,0x54BF5E7E,0xF831C271,
122 0x5F1A17E3,0x9D140AFE,0x92741C47,0x48CFABCE,0x9CBBE477,0x9C3EE57F,
123 0xB07D4C39,0xCC21BCE2,0x697708B1,0x58DA2A6B,0x2370DB16,0x6E641948,
124 0xACC5BD52,0x868F24CC,0xCA1DB0F5,0x4CADA492,0x3F443E54,0xC4A4D5E9,
125 0xF00AD670,0xE93C86E0,0xFE90651A,0xDDE532A3,0xA66458DF,0xAB7D7151,
126 0x0E2E775F,0xC9109F99,0x8D96D59F,0x73CEF14C,0xC74E88E9,0x02712DC0,
127 0x04F41735,0x2E5914A2,0x59F4B2FB,0x0287FC83,0x80BC0343,0xF6B32559,
128 0xC74178D4,0xF1D99123,0x383CCC07,0xACC0637D,0x0863A548,0xA6FCAC85,
129 0x2A13EFF0,0xAF2EEDB1,0x41E72750,0xE0C6B342,0x5DA22B46,0x635559E0,
130 0xD2EA40AC,0x10AA98C0,0x19096497,0x112C542B,0x2C85040C,0xA868E7D0,
131 0x6E260188,0xF596D390,0xC3BB5D7A,0x7A2AA937,0xDFD15032,0x6780AE3B,
132 0xDB5F9CD8,0x8BD266B0,0x7744AF12,0xB463B1B0,0x589629C9,0xE30DBC6E,
133 0x880F5569,0x209E6E16,0x9DECA50C,0x02987A57,0xBED3EA57,0xD3A678AA,
134 0x70DD030D,0x0CFD9C5D,0x92A18E99,0xF5740619,0x7F6F0A7D,0x134CAF9A,
135 0x70F5BAE4,0x23DCA7B5,0x4D788FCD,0xC7F07847,0xBCF77DA1,0x9071D568,
136 0xFC627EA1,0xAE004B77,0x66B54BCB,0x7EF2DAAC,0xDCD5AC30,0xB9BDF730,
137 0x505A97A7,0x9D881FD3,0xADB796CC,0x94A1D202,0x97535D7F,0x31EC20C0,
138 0xB1887A98,0xC1475069,0xA6F73AF3,0x71E4E067,0x46A569DE,0xD2ADE430,
139 0x6F0762C7,0xF50876F4,0x53510542,0x03741C3E,0x53502224,0xD8E54D60,
140 0x3C44AB1A,0x34972B46,0x74BFA89D,0xD7D768E0,0x37E605DC,0xE13D1BDF,
141 0x5051C421,0xB9E057BE,0xB717A14C,0xA1730C43,0xB99638BE,0xB5D5F36D,
142 0xE960D9EA,0x6B1388D3,0xECB6D3B6,0xBDBE8B83,0x2E29AFC5,0x764D71EC,
143 0x4B8F4F43,0xC21DDC00,0xA63F657F,0x82678130,0xDBF535AC,0xA594FC58,
144 0x942686BC,0xBD9B657B,0x4A0F9B61,0x44FF184F,0x38E10A2F,0x61910626,
145 0x5E247636,0x7106D137,0xC62802F0,0xBD1D1F00,0x7CC0DCB2,0xED634909,
146 0xDC13B24E,0x9799C499,0xD77E3D6A,0x14773B68,0x967A4FB7,0x35EECFB1,
147 0x2A5110B8,0xE2F0AF94,0x9D09DEA5,0x20255D27,0x5771D34B,0xE1089EE4,
148 0x246F330B,0x8F7CAEE5,0xD3064712,0x75CAFBEE,0xB94F7028,0xED953666,
149 0x5D1975B4,0x5AF81271,0x13BE2025,0x85194659,0x30805331,0xEC9D46C0,
150 0xBC027C36,0x2AF84188,0xC2141B80,0xC02B1E4A,0x04D36177,0xFC50E9D7,
151 0x39CE79DA,0x917E0A00,0xEF7A0BF4,0xA98BD8D1,0x19424DD2,0x9439DF1F,
152 0xC42AF746,0xADDBE83E,0x85221F0D,0x45563E90,0x9095EC52,0x77887B25,
153 0x8AE46064,0xBD43B71A,0xBB541956,0x7366CF9D,0xEE8E1737,0xB5A727C9,
154 0x5076B3E7,0xFC70BACA,0xCE135B75,0xC4E91AA3,0xF0341911,0x53430C3F,
155 0x886B0824,0x6BB5B8B7,0x33E21254,0xF193B456,0x5B09617F,0x215FFF50,
156 0x48D97EF1,0x356479AB,0x6EA9DDC4,0x0D352746,0xA2F5CE43,0xB226A1B3,
157 0x1329EA3C,0x7A337CC2,0xB5CCE13D,0x563E3B5B,0x534E8E8F,0x561399C9,
158 0xE1596392,0xB0F03125,0x4586645B,0x1F371847,0x94EAABD1,0x41F97EDD,
159 0xE3E5A39B,0x71C774E2,0x507296F4,0x5960133B,0x7852C494,0x3F5B2691,
160 0xA3F87774,0x5A7AF89E,0x17DA3F28,0xE9D9516D,0xFCC1C1D5,0xE4618628,
161 0x04081047,0xD8E4DB5F,0xDC380416,0x8C4933E2,0x95074D53,0xB1B0032D,
162 0xCC8102EA,0x71641243,0x98D6EB6A,0x90FEC945,0xA0914345,0x6FAB037D,
163 0x70F49C4D,0x05BF5B0E,0x927AAF7F,0xA1940F61,0xFEE0756F,0xF815369F,
164 0x5C00253B,0xF2B9762F,0x4AEB3CCC,0x1069F386,0xFBA4E7B9,0x70332665,
165 0x6BCA810E,0x85AB8058,0xAE4B2B2F,0x9D120712,0xBEE8EACB,0x776A1112
166};
167
168void
169__gmp_mt_recalc_buffer (gmp_uint_least32_t mt[])
170{
171 gmp_uint_least32_t y;
172 int kk;
173
174 for (kk = 0; kk < N - M; kk++)
175 {
176 y = (mt[kk] & 0x80000000) | (mt[kk + 1] & 0x7FFFFFFF);
177 mt[kk] = mt[kk + M] ^ (y >> 1) ^ ((y & 0x01) != 0 ? MATRIX_A : 0);
178 }
179 for (; kk < N - 1; kk++)
180 {
181 y = (mt[kk] & 0x80000000) | (mt[kk + 1] & 0x7FFFFFFF);
182 mt[kk] = mt[kk - (N - M)] ^ (y >> 1) ^ ((y & 0x01) != 0 ? MATRIX_A : 0);
183 }
184
185 y = (mt[N - 1] & 0x80000000) | (mt[0] & 0x7FFFFFFF);
186 mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ ((y & 0x01) != 0 ? MATRIX_A : 0);
187}
188
189
190/* Get nbits bits of output from the generator into dest.
191 Note that Mersenne Twister is designed to produce outputs in
192 32-bit words. */
193void
194__gmp_randget_mt (gmp_randstate_t rstate, mp_ptr dest, unsigned long int nbits)
195{
196 gmp_uint_least32_t y;
197 int rbits;
198 mp_size_t i;
199 mp_size_t nlimbs;
200 int *pmti;
201 gmp_uint_least32_t *mt;
202
203 pmti = &((gmp_rand_mt_struct *) RNG_STATE (rstate))->mti;
204 mt = ((gmp_rand_mt_struct *) RNG_STATE (rstate))->mt;
205
206 nlimbs = nbits / GMP_NUMB_BITS;
207 rbits = nbits % GMP_NUMB_BITS;
208
209#define NEXT_RANDOM \
210 do \
211 { \
212 if (*pmti >= N) \
213 { \
214 __gmp_mt_recalc_buffer (mt); \
215 *pmti = 0; \
216 } \
217 y = mt[(*pmti)++]; \
218 y ^= (y >> 11); \
219 y ^= (y << 7) & MASK_1; \
220 y ^= (y << 15) & MASK_2; \
221 y ^= (y >> 18); \
222 } \
223 while (0)
224
225
226 /* Handle the common cases of 32- or 64-bit limbs with fast,
227 optimized routines, and the rest of cases with a general
228 routine. In all cases, no more than 31 bits are rejected
229 for the last limb so that every version of the code is
230 consistent with the others. */
231
232#if (GMP_NUMB_BITS == 32)
233
234 for (i = 0; i < nlimbs; i++)
235 {
236 NEXT_RANDOM;
237 dest[i] = (mp_limb_t) y;
238 }
239 if (rbits)
240 {
241 NEXT_RANDOM;
242 dest[nlimbs] = (mp_limb_t) (y & ~(ULONG_MAX << rbits));
243 }
244
245#else /* GMP_NUMB_BITS != 32 */
246#if (GMP_NUMB_BITS == 64)
247
248 for (i = 0; i < nlimbs; i++)
249 {
250 NEXT_RANDOM;
251 dest[i] = (mp_limb_t) y;
252 NEXT_RANDOM;
253 dest[i] |= (mp_limb_t) y << 32;
254 }
255 if (rbits)
256 {
257 if (rbits < 32)
258 {
259 NEXT_RANDOM;
260 dest[nlimbs] = (mp_limb_t) (y & ~(ULONG_MAX << rbits));
261 }
262 else
263 {
264 NEXT_RANDOM;
265 dest[nlimbs] = (mp_limb_t) y;
266 if (rbits > 32)
267 {
268 NEXT_RANDOM;
269 dest[nlimbs] |=
270 ((mp_limb_t) (y & ~(ULONG_MAX << (rbits-32)))) << 32;
271 }
272 }
273 }
274
275#else /* GMP_NUMB_BITS != 64 */
276
277 {
278 /* Fall back to a general algorithm. This algorithm works by
279 keeping a pool of up to 64 bits (2 outputs from MT) acting
280 as a shift register from which bits are consumed as needed.
281 Bits are consumed using the LSB bits of bitpool_l, and
282 inserted via bitpool_h and shifted to the right place. */
283
284 gmp_uint_least32_t bitpool_h = 0;
285 gmp_uint_least32_t bitpool_l = 0;
286 int bits_in_pool = 0; /* Holds number of valid bits in the pool. */
287 int bits_to_fill; /* Holds total number of bits to put in
288 destination. */
289 int bitidx; /* Holds the destination bit position. */
290 mp_size_t nlimbs2; /* Number of whole+partial limbs to fill. */
291
292 nlimbs2 = nlimbs + (rbits != 0);
293
294 for (i = 0; i < nlimbs2; i++)
295 {
296 bitidx = 0;
297 if (i < nlimbs)
298 bits_to_fill = GMP_NUMB_BITS;
299 else
300 bits_to_fill = rbits;
301
302 dest[i] = CNST_LIMB (0);
303 while (bits_to_fill >= 32) /* Process whole 32-bit blocks first. */
304 {
305 if (bits_in_pool < 32) /* Need more bits. */
306 {
307 /* 64-bit right shift. */
308 NEXT_RANDOM;
309 bitpool_h = y;
310 bitpool_l |= (bitpool_h << bits_in_pool) & 0xFFFFFFFF;
311 if (bits_in_pool == 0)
312 bitpool_h = 0;
313 else
314 bitpool_h >>= 32 - bits_in_pool;
315 bits_in_pool += 32; /* We've got 32 more bits. */
316 }
317
318 /* Fill a 32-bit chunk. */
319 dest[i] |= ((mp_limb_t) bitpool_l) << bitidx;
320 bitpool_l = bitpool_h;
321 bits_in_pool -= 32;
322 bits_to_fill -= 32;
323 bitidx += 32;
324 }
325
326 /* Cover the case where GMP_NUMB_BITS is not a multiple of 32. */
327 if (bits_to_fill != 0)
328 {
329 if (bits_in_pool < bits_to_fill)
330 {
331 NEXT_RANDOM;
332 bitpool_h = y;
333 bitpool_l |= (bitpool_h << bits_in_pool) & 0xFFFFFFFF;
334 if (bits_in_pool == 0)
335 bitpool_h = 0;
336 else
337 bitpool_h >>= 32 - bits_in_pool;
338 bits_in_pool += 32;
339 }
340
341 dest[i] |= (((mp_limb_t) bitpool_l
342 & ~(~CNST_LIMB (0) << bits_to_fill))
343 << bitidx);
344 bitpool_l = ((bitpool_l >> bits_to_fill)
345 | (bitpool_h << (32 - bits_to_fill))) & 0xFFFFFFFF;
346 bitpool_h >>= bits_to_fill;
347 bits_in_pool -= bits_to_fill;
348 }
349 }
350 }
351
352#endif /* GMP_NUMB_BITS != 64 */
353#endif /* GMP_NUMB_BITS != 32 */
354}
355
356void
357__gmp_randclear_mt (gmp_randstate_t rstate)
358{
359 (*__gmp_free_func) ((void *) RNG_STATE (rstate),
360 ALLOC (rstate->_mp_seed) * GMP_LIMB_BYTES);
361}
362
363void __gmp_randiset_mt (gmp_randstate_ptr, gmp_randstate_srcptr);
364
365static const gmp_randfnptr_t Mersenne_Twister_Generator_Noseed = {
366 NULL,
367 __gmp_randget_mt,
368 __gmp_randclear_mt,
369 __gmp_randiset_mt
370};
371
372void
373__gmp_randiset_mt (gmp_randstate_ptr dst, gmp_randstate_srcptr src)
374{
375 const mp_size_t sz = ((sizeof (gmp_rand_mt_struct) - 1) / GMP_LIMB_BYTES) + 1;
376 gmp_rand_mt_struct *dstp, *srcp;
377 mp_size_t i;
378
379 /* Set the generator functions. */
380 RNG_FNPTR (dst) = RNG_FNPTR(src);
381
382 /* Allocate the MT-specific state. */
383 dstp = (gmp_rand_mt_struct *) __GMP_ALLOCATE_FUNC_LIMBS (sz);
384 RNG_STATE (dst) = (mp_ptr) dstp;
385 ALLOC (dst->_mp_seed) = sz; /* Initialize alloc field to placate Camm. */
386
387 /* Copy state. */
388 srcp = (gmp_rand_mt_struct *) RNG_STATE (src);
389 for (i = 0; i < N; i++)
390 dstp->mt[i] = srcp->mt[i];
391
392 dstp->mti = srcp->mti;
393}
394
395void
396__gmp_randinit_mt_noseed (gmp_randstate_ptr dst)
397{
398 const mp_size_t sz = ((sizeof (gmp_rand_mt_struct) - 1) / GMP_LIMB_BYTES) + 1;
399 gmp_rand_mt_struct *dstp;
400 mp_size_t i;
401
402 /* Set the generator functions. */
403 RNG_FNPTR (dst) = (void *) &Mersenne_Twister_Generator_Noseed;
404
405 /* Allocate the MT-specific state. */
406 dstp = (gmp_rand_mt_struct *) __GMP_ALLOCATE_FUNC_LIMBS (sz);
407 RNG_STATE (dst) = (mp_ptr) dstp;
408 ALLOC (dst->_mp_seed) = sz; /* Initialize alloc field to placate Camm. */
409
410 /* Set state for default seed. */
411 for (i = 0; i < N; i++)
412 dstp->mt[i] = default_state[i];
413
414 dstp->mti = WARM_UP % N;
415}