#define KK 100 /* the long lag */ #define LL 37 /* the short lag */ #define MM (1<<30) /* the modulus */ #define mod_diff(x,y) (x-y)&(MM-1) /* subtraction mod MM */ long ran_x[KK]; /* the generator state */ void ran_array(aa,n) /* put n new random numbers in aa */ long *aa; /* destination */ int n; /* array length (must be at least KK) */ { register int i,j; for (j=0;j=MM) ss-=MM-2; /* cyclic shift 29 bits */ } for (;j0;j--) x[j+j]=x[j]; /* "square" */ for (j=KK+KK-2;j>KK-LL;j-=2) x[KK+KK-1-j]=evenize(x[j]); for (j=KK+KK-2;j>=KK;j--) if(is_odd(x[j])) { x[j-(KK-LL)]=mod_diff(x[j-(KK-LL)],x[j]); x[j-KK]=mod_diff(x[j-KK],x[j]); } if (is_odd(ss)) { /* "multiply by z" */ for (j=KK;j>0;j--) x[j]=x[j-1]; x[0]=x[KK]; /* shift the buffer cyclically */ if (is_odd(x[KK])) x[LL]=mod_diff(x[LL],x[KK]); } if (ss) ss>>=1; else t--; } for (j=0;j