Select Git revision
Array.pmod
yarrow-test.c 5.71 KiB
#include "yarrow.h"
#include "macros.h"
#include "testutils.h"
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Lagged fibonacci sequence as described in Knuth 3.6 */
#define KK 100
#define LL 37
#define MM (1UL << 30)
#define TT 70
uint32_t ran_x[KK];
unsigned ran_index;
static void
ran_init(uint32_t seed)
{
uint32_t t,j;
uint32_t x[2*KK - 1];
uint32_t ss = (seed + 2) & (MM-2);
for (j = 0; j<KK; j++)
{
x[j] = ss;
ss <<= 1; if (ss >= MM) ss -= (MM-2);
}
for (;j< 2*KK-1; j++)
x[j] = 0;
x[1]++;
ss = seed & (MM-1);
for (t = TT-1; t; )
{
for (j = KK-1; j>0; j--)
x[j+j] = x[j];
for (j = 2*KK-2; j > KK-LL; j-= 2)
x[2*KK-1-j] = x[j] & ~1;
for (j = 2*KK-2; j>=KK; j--)
if (x[j] & 1)
{
x[j-(KK-LL)] = (x[j - (KK-LL)] - x[j]) & (MM-1);
x[j-KK] = (x[j-KK] - x[j]) & (MM-1);
}
if (ss & 1)
{
for (j=KK; j>0; j--)
x[j] = x[j-1];
x[0] = x[KK];
if (x[KK] & 1)
x[LL] = (x[LL] - x[KK]) & (MM-1);
}
if (ss)
ss >>= 1;
else
t--;
}
for (j=0; j<LL; j++)
ran_x[j+KK-LL] = x[j];
for (; j<KK; j++)
ran_x[j-LL] = x[j];
ran_index = 0;