#define gb_next_rand() (*gb_fptr>=0?*gb_fptr--:gb_flip_cycle() ) \
#define mod_diff(x,y) (((x) -(y) ) &0x7fffffff) \
#define two_to_the_31 ((unsigned long) 0x80000000) \
/*3:*/
#line 56 "gb_flip.w"
/*4:*/
#line 74 "gb_flip.w"
static long A[56]= {-1};
/*:4*/
#line 57 "gb_flip.w"
/*5:*/
#line 86 "gb_flip.w"
long*gb_fptr= A;
/*:5*/
#line 58 "gb_flip.w"
/*7:*/
#line 133 "gb_flip.w"
#line 16 "gb_flip.ch"
long gb_flip_cycle(void)
#line 135 "gb_flip.w"
{register long*ii,*jj;
for(ii= &A[1],jj= &A[32];jj<=&A[55];ii++,jj++)
*ii= mod_diff(*ii,*jj);
for(jj= &A[1];ii<=&A[55];ii++,jj++)
*ii= mod_diff(*ii,*jj);
gb_fptr= &A[54];
return A[55];
}
/*:7*//*8:*/
#line 158 "gb_flip.w"
#line 23 "gb_flip.ch"
void gb_init_rand(long seed)
#line 161 "gb_flip.w"
{register long i;
register long prev= seed,next= 1;
seed= prev= mod_diff(prev,0);
A[55]= prev;
for(i= 21;i;i= (i+21)%55){
A[i]= next;
/*9:*/
#line 186 "gb_flip.w"
next= mod_diff(prev,next);
if(seed&1)seed= 0x40000000+(seed>>1);
else seed>>= 1;
next= mod_diff(next,seed);
/*:9*/
#line 167 "gb_flip.w"
;
prev= A[i];
}
/*10:*/
#line 223 "gb_flip.w"
(void)gb_flip_cycle();
(void)gb_flip_cycle();
(void)gb_flip_cycle();
(void)gb_flip_cycle();
(void)gb_flip_cycle();
/*:10*/
#line 170 "gb_flip.w"
;
}
/*:8*//*12:*/
#line 251 "gb_flip.w"
#line 36 "gb_flip.ch"
long gb_unif_rand(long m)
#line 254 "gb_flip.w"
{register unsigned long t= two_to_the_31-(two_to_the_31%m);
register long r;
do{
r= gb_next_rand();
}while(t<=(unsigned long)r);
return r%m;
}
/*:12*/
#line 59 "gb_flip.w"
/*:3*/
syntax highlighted by Code2HTML, v. 0.9.1