32 #ifndef MCKL_RANDOMC_THREEFRY_H 33 #define MCKL_RANDOMC_THREEFRY_H 38 #error __STDC_CONSTANT_MACROS not defined before #include<stdint.h> 143 if (++ctr->
v[0] != 0) {
146 if (++ctr->
v[1] != 0) {
153 if (++ctr->
v[0] != 0) {
156 if (++ctr->
v[1] != 0) {
159 if (++ctr->
v[2] != 0) {
162 if (++ctr->
v[3] != 0) {
169 if (++ctr->
v[0] != 0) {
172 if (++ctr->
v[1] != 0) {
179 if (++ctr->
v[0] != 0) {
182 if (++ctr->
v[1] != 0) {
185 if (++ctr->
v[2] != 0) {
188 if (++ctr->
v[3] != 0) {
196 par->
v[0] = key->
v[0];
197 par->
v[1] = key->
v[1];
200 par->
v[2] ^= par->
v[0];
201 par->
v[2] ^= par->
v[1];
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];
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];
222 par->
v[0] = key->
v[0];
223 par->
v[1] = key->
v[1];
225 par->
v[2] =
UINT64_C(0x1BD11BDAA9FC1A22);
226 par->
v[2] ^= par->
v[0];
227 par->
v[2] ^= par->
v[1];
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];
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];
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];
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];
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];
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];
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];
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];
288 state->
v[0] += par->
v[i0];
289 state->
v[1] += par->
v[i1];
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];
307 state->
v[0] += par->
v[i0];
308 state->
v[1] += par->
v[i1];
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];
478 rng->
key.
v[0] = seed;
492 rng->
key.
v[0] = seed;
506 rng->
key.
v[0] = seed;
520 rng->
key.
v[0] = seed;
531 if (rng->
index == 2) {
544 if (rng->
index == 4) {
557 if (rng->
index == 2) {
570 if (rng->
index == 4) {
579 #endif // MCKL_RANDOMC_THREEFRY_H
mckl_threefry2x64_key_t key
mckl_threefry4x64_ctr_t state
static void mckl_threefry2x64_initpar(const mckl_threefry2x64_key_t *key, mckl_threefry2x64_par_t *par)
static void mckl_threefry4x64_init(mckl_threefry4x64 *rng, uint64_t seed)
Initialize Threefry4x64 RNG state.
Threefry4x64 counter type.
mckl_threefry4x64_ctr_t ctr
static void mckl_threefry4x32_init(mckl_threefry4x32 *rng, uint32_t seed)
Initialize Threefry4x32 RNG state.
static void mckl_threefry2x32_init(mckl_threefry2x32 *rng, uint32_t seed)
Initialize Threefry2x32 RNG state.
static void mckl_threefry2x32_inc(mckl_threefry2x32_ctr_t *ctr)
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.
mckl_threefry2x64_ctr_t ctr
static void mckl_threefry4x64_inc(mckl_threefry4x64_ctr_t *ctr)
static void mckl_threefry2x64_init(mckl_threefry2x64 *rng, uint64_t seed)
Initialize Threefry2x64 RNG state.
Threefry2x64 counter type.
static void mckl_threefry2x32_initpar(const mckl_threefry2x32_key_t *key, mckl_threefry2x32_par_t *par)
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)
static uint32_t mckl_threefry2x32_rand(mckl_threefry2x32 *rng)
Generate random 32-bit integers from Threefry2x32 RNG.
mckl_threefry2x32_ctr_t ctr
static void mckl_threefry2x32_rotate(mckl_threefry2x32_ctr_t *state, uint32_t r)
mckl_threefry2x32_key_t key
Threefry4x32 counter type.
static void mckl_threefry4x32_inc(mckl_threefry4x32_ctr_t *ctr)
static void mckl_threefry2x64_rotate(mckl_threefry2x64_ctr_t *state, uint64_t r)
Threefry2x32 counter type.
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)
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.
static void mckl_threefry4x32_initpar(const mckl_threefry4x32_key_t *key, mckl_threefry4x32_par_t *par)
static void mckl_threefry2x32_insertkey(mckl_threefry2x32_ctr_t *state, const mckl_threefry2x32_par_t *par, uint32_t inc, int i0, int i1)
static void mckl_threefry4x32_rotate(mckl_threefry4x32_ctr_t *state, uint32_t r0, uint32_t r2, int i0, int i2)
static uint64_t mckl_threefry2x64_rand(mckl_threefry2x64 *rng)
Generate random 64-bit integers from Threefry2x64 RNG.
mckl_threefry4x32_ctr_t ctr
mckl_threefry2x64_ctr_t state
mckl_threefry2x32_ctr_t state
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.
static void mckl_threefry2x64_insertkey(mckl_threefry2x64_ctr_t *state, const mckl_threefry2x64_par_t *par, uint64_t inc, int i0, int i1)
mckl_threefry4x64_key_t key
static uint64_t mckl_threefry4x64_rand(mckl_threefry4x64 *rng)
Generate random 64-bit integers from Threefry4x64 RNG.
static void mckl_threefry2x64_inc(mckl_threefry2x64_ctr_t *ctr)
Threefry4x64 RNG state structure.
static uint32_t mckl_threefry4x32_rand(mckl_threefry4x32 *rng)
Generate random 32-bit integers from Threefry4x32 RNG.
mckl_threefry4x32_key_t key
Threefry2x64 RNG state structure.
Threefry4x32 RNG state structure.
static void mckl_threefry4x64_initpar(const mckl_threefry4x64_key_t *key, mckl_threefry4x64_par_t *par)
Threefry2x32 RNG state structure.
mckl_threefry4x32_ctr_t state
static void mckl_threefry4x64_rotate(mckl_threefry4x64_ctr_t *state, uint64_t r0, uint64_t r2, int i0, int i2)
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.