MCKL
Monte Carlo Kernel Library
threefry.h
Go to the documentation of this file.
1 //============================================================================
2 // MCKL/include/mckl/randomc/threefry.h
3 //----------------------------------------------------------------------------
4 // MCKL: Monte Carlo Kernel Library
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013-2018, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef MCKL_RANDOMC_THREEFRY_H
33 #define MCKL_RANDOMC_THREEFRY_H
34 
35 #include <mckl/internal/config.h>
36 
37 #ifndef UINT32_C
38 #error __STDC_CONSTANT_MACROS not defined before #include<stdint.h>
39 #endif
40 
43 typedef struct {
44  uint32_t v[2];
46 
49 typedef struct {
50  uint32_t v[4];
52 
55 typedef struct {
56  uint64_t v[2];
58 
61 typedef struct {
62  uint64_t v[4];
64 
67 typedef struct {
68  uint32_t v[2];
70 
73 typedef struct {
74  uint32_t v[4];
76 
79 typedef struct {
80  uint64_t v[2];
82 
85 typedef struct {
86  uint64_t v[4];
88 
89 typedef struct {
90  uint32_t v[3];
92 
93 typedef struct {
94  uint32_t v[5];
96 
97 typedef struct {
98  uint64_t v[3];
100 
101 typedef struct {
102  uint64_t v[5];
104 
107 typedef struct {
113 
116 typedef struct {
122 
125 typedef struct {
131 
134 typedef struct {
140 
142 {
143  if (++ctr->v[0] != 0) {
144  return;
145  }
146  if (++ctr->v[1] != 0) {
147  return;
148  }
149 }
150 
152 {
153  if (++ctr->v[0] != 0) {
154  return;
155  }
156  if (++ctr->v[1] != 0) {
157  return;
158  }
159  if (++ctr->v[2] != 0) {
160  return;
161  }
162  if (++ctr->v[3] != 0) {
163  return;
164  }
165 }
166 
168 {
169  if (++ctr->v[0] != 0) {
170  return;
171  }
172  if (++ctr->v[1] != 0) {
173  return;
174  }
175 }
176 
178 {
179  if (++ctr->v[0] != 0) {
180  return;
181  }
182  if (++ctr->v[1] != 0) {
183  return;
184  }
185  if (++ctr->v[2] != 0) {
186  return;
187  }
188  if (++ctr->v[3] != 0) {
189  return;
190  }
191 }
192 
193 static inline void mckl_threefry2x32_initpar(
195 {
196  par->v[0] = key->v[0];
197  par->v[1] = key->v[1];
198 
199  par->v[2] = UINT32_C(0x1BD11BDA);
200  par->v[2] ^= par->v[0];
201  par->v[2] ^= par->v[1];
202 }
203 
204 static inline void mckl_threefry4x32_initpar(
206 {
207  par->v[0] = key->v[0];
208  par->v[1] = key->v[1];
209  par->v[2] = key->v[2];
210  par->v[3] = key->v[3];
211 
212  par->v[4] = UINT32_C(0x1BD11BDA);
213  par->v[4] ^= par->v[0];
214  par->v[4] ^= par->v[1];
215  par->v[4] ^= par->v[2];
216  par->v[4] ^= par->v[3];
217 }
218 
219 static inline void mckl_threefry2x64_initpar(
221 {
222  par->v[0] = key->v[0];
223  par->v[1] = key->v[1];
224 
225  par->v[2] = UINT64_C(0x1BD11BDAA9FC1A22);
226  par->v[2] ^= par->v[0];
227  par->v[2] ^= par->v[1];
228 }
229 
230 static inline void mckl_threefry4x64_initpar(
232 {
233  par->v[0] = key->v[0];
234  par->v[1] = key->v[1];
235  par->v[2] = key->v[2];
236  par->v[3] = key->v[3];
237 
238  par->v[4] = UINT64_C(0x1BD11BDAA9FC1A22);
239  par->v[4] ^= par->v[0];
240  par->v[4] ^= par->v[1];
241  par->v[4] ^= par->v[2];
242  par->v[4] ^= par->v[3];
243 }
244 
245 static inline void mckl_threefry2x32_rotate(
247 {
248  state->v[0] += state->v[1];
249  state->v[1] = ((state->v[1]) << r) | ((state->v[1]) >> (32 - r));
250  state->v[1] ^= state->v[0];
251 }
252 
253 static inline void mckl_threefry4x32_rotate(
254  mckl_threefry4x32_ctr_t *state, uint32_t r0, uint32_t r2, int i0, int i2)
255 {
256  state->v[0] += state->v[i0];
257  state->v[i0] = ((state->v[i0]) << r0) | ((state->v[i0]) >> (32 - r0));
258  state->v[i0] ^= state->v[0];
259 
260  state->v[2] += state->v[i2];
261  state->v[i2] = ((state->v[i2]) << r2) | ((state->v[i2]) >> (32 - r2));
262  state->v[i2] ^= state->v[2];
263 }
264 
265 static inline void mckl_threefry2x64_rotate(
267 {
268  state->v[0] += state->v[1];
269  state->v[1] = ((state->v[1]) << r) | ((state->v[1]) >> (64 - r));
270  state->v[1] ^= state->v[0];
271 }
272 
273 static inline void mckl_threefry4x64_rotate(
274  mckl_threefry4x64_ctr_t *state, uint64_t r0, uint64_t r2, int i0, int i2)
275 {
276  state->v[0] += state->v[i0];
277  state->v[i0] = ((state->v[i0]) << r0) | ((state->v[i0]) >> (64 - r0));
278  state->v[i0] ^= state->v[0];
279 
280  state->v[2] += state->v[i2];
281  state->v[i2] = ((state->v[i2]) << r2) | ((state->v[i2]) >> (64 - r2));
282  state->v[i2] ^= state->v[2];
283 }
284 
286  const mckl_threefry2x32_par_t *par, uint32_t inc, int i0, int i1)
287 {
288  state->v[0] += par->v[i0];
289  state->v[1] += par->v[i1];
290  state->v[1] += inc;
291 }
292 
294  const mckl_threefry4x32_par_t *par, uint32_t inc, int i0, int i1, int i2,
295  int i3)
296 {
297  state->v[0] += par->v[i0];
298  state->v[1] += par->v[i1];
299  state->v[2] += par->v[i2];
300  state->v[3] += par->v[i3];
301  state->v[3] += inc;
302 }
303 
305  const mckl_threefry2x64_par_t *par, uint64_t inc, int i0, int i1)
306 {
307  state->v[0] += par->v[i0];
308  state->v[1] += par->v[i1];
309  state->v[1] += inc;
310 }
311 
313  const mckl_threefry4x64_par_t *par, uint64_t inc, int i0, int i1, int i2,
314  int i3)
315 {
316  state->v[0] += par->v[i0];
317  state->v[1] += par->v[i1];
318  state->v[2] += par->v[i2];
319  state->v[3] += par->v[i3];
320  state->v[3] += inc;
321 }
322 
325 static inline void mckl_threefry2x32_gen(const mckl_threefry2x32_ctr_t *ctr,
327 {
328  *state = *ctr;
330  mckl_threefry2x32_initpar(key, &par);
331 
332  mckl_threefry2x32_insertkey(state, &par, 0, 0, 1);
333  mckl_threefry2x32_rotate(state, 13);
334  mckl_threefry2x32_rotate(state, 15);
335  mckl_threefry2x32_rotate(state, 26);
336  mckl_threefry2x32_rotate(state, 6);
337  mckl_threefry2x32_insertkey(state, &par, 1, 1, 2);
338  mckl_threefry2x32_rotate(state, 17);
339  mckl_threefry2x32_rotate(state, 29);
340  mckl_threefry2x32_rotate(state, 16);
341  mckl_threefry2x32_rotate(state, 24);
342  mckl_threefry2x32_insertkey(state, &par, 2, 2, 0);
343  mckl_threefry2x32_rotate(state, 13);
344  mckl_threefry2x32_rotate(state, 15);
345  mckl_threefry2x32_rotate(state, 26);
346  mckl_threefry2x32_rotate(state, 6);
347  mckl_threefry2x32_insertkey(state, &par, 3, 0, 1);
348  mckl_threefry2x32_rotate(state, 17);
349  mckl_threefry2x32_rotate(state, 29);
350  mckl_threefry2x32_rotate(state, 16);
351  mckl_threefry2x32_rotate(state, 24);
352  mckl_threefry2x32_insertkey(state, &par, 4, 1, 2);
353  mckl_threefry2x32_rotate(state, 13);
354  mckl_threefry2x32_rotate(state, 15);
355  mckl_threefry2x32_rotate(state, 26);
356  mckl_threefry2x32_rotate(state, 6);
357  mckl_threefry2x32_insertkey(state, &par, 5, 2, 0);
358 }
359 
362 static inline void mckl_threefry4x32_gen(const mckl_threefry4x32_ctr_t *ctr,
364 {
365  *state = *ctr;
367  mckl_threefry4x32_initpar(key, &par);
368 
369  mckl_threefry4x32_insertkey(state, &par, 0, 0, 1, 2, 3);
370  mckl_threefry4x32_rotate(state, 10, 26, 1, 3);
371  mckl_threefry4x32_rotate(state, 11, 21, 3, 1);
372  mckl_threefry4x32_rotate(state, 13, 27, 1, 3);
373  mckl_threefry4x32_rotate(state, 23, 5, 3, 1);
374  mckl_threefry4x32_insertkey(state, &par, 1, 1, 2, 3, 4);
375  mckl_threefry4x32_rotate(state, 6, 20, 1, 3);
376  mckl_threefry4x32_rotate(state, 17, 11, 3, 1);
377  mckl_threefry4x32_rotate(state, 25, 10, 1, 3);
378  mckl_threefry4x32_rotate(state, 18, 20, 3, 1);
379  mckl_threefry4x32_insertkey(state, &par, 2, 2, 3, 4, 0);
380  mckl_threefry4x32_rotate(state, 10, 26, 1, 3);
381  mckl_threefry4x32_rotate(state, 11, 21, 3, 1);
382  mckl_threefry4x32_rotate(state, 13, 27, 1, 3);
383  mckl_threefry4x32_rotate(state, 23, 5, 3, 1);
384  mckl_threefry4x32_insertkey(state, &par, 3, 3, 4, 0, 1);
385  mckl_threefry4x32_rotate(state, 6, 20, 1, 3);
386  mckl_threefry4x32_rotate(state, 17, 11, 3, 1);
387  mckl_threefry4x32_rotate(state, 25, 10, 1, 3);
388  mckl_threefry4x32_rotate(state, 18, 20, 3, 1);
389  mckl_threefry4x32_insertkey(state, &par, 4, 4, 0, 1, 2);
390  mckl_threefry4x32_rotate(state, 10, 26, 1, 3);
391  mckl_threefry4x32_rotate(state, 11, 21, 3, 1);
392  mckl_threefry4x32_rotate(state, 13, 27, 1, 3);
393  mckl_threefry4x32_rotate(state, 23, 5, 3, 1);
394  mckl_threefry4x32_insertkey(state, &par, 5, 0, 1, 2, 3);
395 }
396 
399 static inline void mckl_threefry2x64_gen(const mckl_threefry2x64_ctr_t *ctr,
401 {
402  *state = *ctr;
404  mckl_threefry2x64_initpar(key, &par);
405 
406  mckl_threefry2x64_insertkey(state, &par, 0, 0, 1);
407  mckl_threefry2x64_rotate(state, 16);
408  mckl_threefry2x64_rotate(state, 42);
409  mckl_threefry2x64_rotate(state, 12);
410  mckl_threefry2x64_rotate(state, 31);
411  mckl_threefry2x64_insertkey(state, &par, 1, 1, 2);
412  mckl_threefry2x64_rotate(state, 16);
413  mckl_threefry2x64_rotate(state, 32);
414  mckl_threefry2x64_rotate(state, 24);
415  mckl_threefry2x64_rotate(state, 21);
416  mckl_threefry2x64_insertkey(state, &par, 2, 2, 0);
417  mckl_threefry2x64_rotate(state, 16);
418  mckl_threefry2x64_rotate(state, 42);
419  mckl_threefry2x64_rotate(state, 12);
420  mckl_threefry2x64_rotate(state, 31);
421  mckl_threefry2x64_insertkey(state, &par, 3, 0, 1);
422  mckl_threefry2x64_rotate(state, 16);
423  mckl_threefry2x64_rotate(state, 32);
424  mckl_threefry2x64_rotate(state, 24);
425  mckl_threefry2x64_rotate(state, 21);
426  mckl_threefry2x64_insertkey(state, &par, 4, 1, 2);
427  mckl_threefry2x64_rotate(state, 16);
428  mckl_threefry2x64_rotate(state, 42);
429  mckl_threefry2x64_rotate(state, 12);
430  mckl_threefry2x64_rotate(state, 31);
431  mckl_threefry2x64_insertkey(state, &par, 5, 2, 0);
432 }
433 
436 static inline void mckl_threefry4x64_gen(const mckl_threefry4x64_ctr_t *ctr,
438 {
439  *state = *ctr;
441  mckl_threefry4x64_initpar(key, &par);
442 
443  mckl_threefry4x64_insertkey(state, &par, 0, 0, 1, 2, 3);
444  mckl_threefry4x64_rotate(state, 14, 16, 1, 3);
445  mckl_threefry4x64_rotate(state, 52, 57, 3, 1);
446  mckl_threefry4x64_rotate(state, 23, 40, 1, 3);
447  mckl_threefry4x64_rotate(state, 5, 37, 3, 1);
448  mckl_threefry4x64_insertkey(state, &par, 1, 1, 2, 3, 4);
449  mckl_threefry4x64_rotate(state, 25, 33, 1, 3);
450  mckl_threefry4x64_rotate(state, 46, 12, 3, 1);
451  mckl_threefry4x64_rotate(state, 58, 22, 1, 3);
452  mckl_threefry4x64_rotate(state, 32, 32, 3, 1);
453  mckl_threefry4x64_insertkey(state, &par, 2, 2, 3, 4, 0);
454  mckl_threefry4x64_rotate(state, 14, 16, 1, 3);
455  mckl_threefry4x64_rotate(state, 52, 57, 3, 1);
456  mckl_threefry4x64_rotate(state, 23, 40, 1, 3);
457  mckl_threefry4x64_rotate(state, 5, 37, 3, 1);
458  mckl_threefry4x64_insertkey(state, &par, 3, 3, 4, 0, 1);
459  mckl_threefry4x64_rotate(state, 25, 33, 1, 3);
460  mckl_threefry4x64_rotate(state, 46, 12, 3, 1);
461  mckl_threefry4x64_rotate(state, 58, 22, 1, 3);
462  mckl_threefry4x64_rotate(state, 32, 32, 3, 1);
463  mckl_threefry4x64_insertkey(state, &par, 4, 4, 0, 1, 2);
464  mckl_threefry4x64_rotate(state, 14, 16, 1, 3);
465  mckl_threefry4x64_rotate(state, 52, 57, 3, 1);
466  mckl_threefry4x64_rotate(state, 23, 40, 1, 3);
467  mckl_threefry4x64_rotate(state, 5, 37, 3, 1);
468  mckl_threefry4x64_insertkey(state, &par, 5, 0, 1, 2, 3);
469 }
470 
473 static inline void mckl_threefry2x32_init(
474  mckl_threefry2x32 *rng, uint32_t seed)
475 {
476  rng->ctr.v[0] = 0;
477  rng->ctr.v[1] = 0;
478  rng->key.v[0] = seed;
479  rng->key.v[1] = 0;
480  rng->index = 2;
481 }
482 
485 static inline void mckl_threefry4x32_init(
486  mckl_threefry4x32 *rng, uint32_t seed)
487 {
488  rng->ctr.v[0] = 0;
489  rng->ctr.v[1] = 0;
490  rng->ctr.v[2] = 0;
491  rng->ctr.v[3] = 0;
492  rng->key.v[0] = seed;
493  rng->key.v[1] = 0;
494  rng->key.v[2] = 0;
495  rng->key.v[3] = 0;
496  rng->index = 4;
497 }
498 
501 static inline void mckl_threefry2x64_init(
502  mckl_threefry2x64 *rng, uint64_t seed)
503 {
504  rng->ctr.v[0] = 0;
505  rng->ctr.v[1] = 0;
506  rng->key.v[0] = seed;
507  rng->key.v[1] = 0;
508  rng->index = 2;
509 }
510 
513 static inline void mckl_threefry4x64_init(
514  mckl_threefry4x64 *rng, uint64_t seed)
515 {
516  rng->ctr.v[0] = 0;
517  rng->ctr.v[1] = 0;
518  rng->ctr.v[2] = 0;
519  rng->ctr.v[3] = 0;
520  rng->key.v[0] = seed;
521  rng->key.v[1] = 0;
522  rng->key.v[2] = 0;
523  rng->key.v[3] = 0;
524  rng->index = 4;
525 }
526 
530 {
531  if (rng->index == 2) {
532  mckl_threefry2x32_inc(&rng->ctr);
533  mckl_threefry2x32_gen(&rng->ctr, &rng->key, &rng->state);
534  rng->index = 0;
535  }
536 
537  return rng->state.v[rng->index++];
538 }
539 
543 {
544  if (rng->index == 4) {
545  mckl_threefry4x32_inc(&rng->ctr);
546  mckl_threefry4x32_gen(&rng->ctr, &rng->key, &rng->state);
547  rng->index = 0;
548  }
549 
550  return rng->state.v[rng->index++];
551 }
552 
556 {
557  if (rng->index == 2) {
558  mckl_threefry2x64_inc(&rng->ctr);
559  mckl_threefry2x64_gen(&rng->ctr, &rng->key, &rng->state);
560  rng->index = 0;
561  }
562 
563  return rng->state.v[rng->index++];
564 }
565 
569 {
570  if (rng->index == 4) {
571  mckl_threefry4x64_inc(&rng->ctr);
572  mckl_threefry4x64_gen(&rng->ctr, &rng->key, &rng->state);
573  rng->index = 0;
574  }
575 
576  return rng->state.v[rng->index++];
577 }
578 
579 #endif // MCKL_RANDOMC_THREEFRY_H
#define UINT64_C(x)
Definition: opencl.h:44
mckl_threefry2x64_key_t key
Definition: threefry.h:128
mckl_threefry4x64_ctr_t state
Definition: threefry.h:135
static void mckl_threefry2x64_initpar(const mckl_threefry2x64_key_t *key, mckl_threefry2x64_par_t *par)
Definition: threefry.h:219
static void mckl_threefry4x64_init(mckl_threefry4x64 *rng, uint64_t seed)
Initialize Threefry4x64 RNG state.
Definition: threefry.h:513
Threefry4x64 counter type.
Definition: threefry.h:61
mckl_threefry4x64_ctr_t ctr
Definition: threefry.h:136
static void mckl_threefry4x32_init(mckl_threefry4x32 *rng, uint32_t seed)
Initialize Threefry4x32 RNG state.
Definition: threefry.h:485
static void mckl_threefry2x32_init(mckl_threefry2x32 *rng, uint32_t seed)
Initialize Threefry2x32 RNG state.
Definition: threefry.h:473
static void mckl_threefry2x32_inc(mckl_threefry2x32_ctr_t *ctr)
Definition: threefry.h:141
static void mckl_threefry4x64_gen(const mckl_threefry4x64_ctr_t *ctr, const mckl_threefry4x64_key_t *key, mckl_threefry4x64_ctr_t *state)
Generate Threefry4x64 RNG state.
Definition: threefry.h:436
mckl_threefry2x64_ctr_t ctr
Definition: threefry.h:127
static void mckl_threefry4x64_inc(mckl_threefry4x64_ctr_t *ctr)
Definition: threefry.h:177
static void mckl_threefry2x64_init(mckl_threefry2x64 *rng, uint64_t seed)
Initialize Threefry2x64 RNG state.
Definition: threefry.h:501
Threefry2x64 counter type.
Definition: threefry.h:55
uint uint32_t
Definition: opencl.h:41
static void mckl_threefry2x32_initpar(const mckl_threefry2x32_key_t *key, mckl_threefry2x32_par_t *par)
Definition: threefry.h:193
static void mckl_threefry4x64_insertkey(mckl_threefry4x64_ctr_t *state, const mckl_threefry4x64_par_t *par, uint64_t inc, int i0, int i1, int i2, int i3)
Definition: threefry.h:312
ulong uint64_t
Definition: opencl.h:42
static uint32_t mckl_threefry2x32_rand(mckl_threefry2x32 *rng)
Generate random 32-bit integers from Threefry2x32 RNG.
Definition: threefry.h:529
mckl_threefry2x32_ctr_t ctr
Definition: threefry.h:109
static void mckl_threefry2x32_rotate(mckl_threefry2x32_ctr_t *state, uint32_t r)
Definition: threefry.h:245
mckl_threefry2x32_key_t key
Definition: threefry.h:110
uint32_t index
Definition: threefry.h:120
Threefry4x32 counter type.
Definition: threefry.h:49
static void mckl_threefry4x32_inc(mckl_threefry4x32_ctr_t *ctr)
Definition: threefry.h:151
uint64_t index
Definition: threefry.h:138
static void mckl_threefry2x64_rotate(mckl_threefry2x64_ctr_t *state, uint64_t r)
Definition: threefry.h:265
Threefry2x32 counter type.
Definition: threefry.h:43
static void mckl_threefry4x32_insertkey(mckl_threefry4x32_ctr_t *state, const mckl_threefry4x32_par_t *par, uint32_t inc, int i0, int i1, int i2, int i3)
Definition: threefry.h:293
static void mckl_threefry2x32_gen(const mckl_threefry2x32_ctr_t *ctr, const mckl_threefry2x32_key_t *key, mckl_threefry2x32_ctr_t *state)
Generate Threefry2x32 RNG state.
Definition: threefry.h:325
static void mckl_threefry4x32_initpar(const mckl_threefry4x32_key_t *key, mckl_threefry4x32_par_t *par)
Definition: threefry.h:204
static void mckl_threefry2x32_insertkey(mckl_threefry2x32_ctr_t *state, const mckl_threefry2x32_par_t *par, uint32_t inc, int i0, int i1)
Definition: threefry.h:285
static void mckl_threefry4x32_rotate(mckl_threefry4x32_ctr_t *state, uint32_t r0, uint32_t r2, int i0, int i2)
Definition: threefry.h:253
static uint64_t mckl_threefry2x64_rand(mckl_threefry2x64 *rng)
Generate random 64-bit integers from Threefry2x64 RNG.
Definition: threefry.h:555
mckl_threefry4x32_ctr_t ctr
Definition: threefry.h:118
uint32_t index
Definition: threefry.h:111
Threefry2x32 key type.
Definition: threefry.h:67
mckl_threefry2x64_ctr_t state
Definition: threefry.h:126
mckl_threefry2x32_ctr_t state
Definition: threefry.h:108
static void mckl_threefry4x32_gen(const mckl_threefry4x32_ctr_t *ctr, const mckl_threefry4x32_key_t *key, mckl_threefry4x32_ctr_t *state)
Generate Threefry4x32 RNG state.
Definition: threefry.h:362
Threefry4x32 key type.
Definition: threefry.h:73
static void mckl_threefry2x64_insertkey(mckl_threefry2x64_ctr_t *state, const mckl_threefry2x64_par_t *par, uint64_t inc, int i0, int i1)
Definition: threefry.h:304
mckl_threefry4x64_key_t key
Definition: threefry.h:137
static uint64_t mckl_threefry4x64_rand(mckl_threefry4x64 *rng)
Generate random 64-bit integers from Threefry4x64 RNG.
Definition: threefry.h:568
static void mckl_threefry2x64_inc(mckl_threefry2x64_ctr_t *ctr)
Definition: threefry.h:167
uint64_t index
Definition: threefry.h:129
Threefry4x64 RNG state structure.
Definition: threefry.h:134
static uint32_t mckl_threefry4x32_rand(mckl_threefry4x32 *rng)
Generate random 32-bit integers from Threefry4x32 RNG.
Definition: threefry.h:542
mckl_threefry4x32_key_t key
Definition: threefry.h:119
Threefry2x64 key type.
Definition: threefry.h:79
Threefry2x64 RNG state structure.
Definition: threefry.h:125
#define UINT32_C(x)
Definition: opencl.h:43
Threefry4x64 key type.
Definition: threefry.h:85
Threefry4x32 RNG state structure.
Definition: threefry.h:116
static void mckl_threefry4x64_initpar(const mckl_threefry4x64_key_t *key, mckl_threefry4x64_par_t *par)
Definition: threefry.h:230
Threefry2x32 RNG state structure.
Definition: threefry.h:107
mckl_threefry4x32_ctr_t state
Definition: threefry.h:117
static void mckl_threefry4x64_rotate(mckl_threefry4x64_ctr_t *state, uint64_t r0, uint64_t r2, int i0, int i2)
Definition: threefry.h:273
static void mckl_threefry2x64_gen(const mckl_threefry2x64_ctr_t *ctr, const mckl_threefry2x64_key_t *key, mckl_threefry2x64_ctr_t *state)
Generate Threefry2x64 RNG state.
Definition: threefry.h:399