ГОСТ Р ИСО 28640 - 2012
Часть 2. Modulus = 2A3 l-l = 2147483647
#undcf MULTIPLIER
«undcf INCREMENT
#undcf NBIT
#dcfinc NBIT 15
«define MASK ( ( l« N B I T )-l)
«define MASK2 ( (1«2*NBIT> -I)
«define MULTIPLIER 210000534IUL
«define MULTIPLlER_LO (MULTIPLIER & MASK)
«define MULTIPLIER.HI (MULTIPLIER » NBIT)
Static unsigned long statc31 ;
long lcong31 ( void )
unsigned long xlo, xhi :
unsigned long zO. zl. /2 ;
xlo = statc3l & MASK ;
xhi = statc31 » NBIT :
zO = xlo * M U LTIPLIER S ;/* ISbit * ISbit => 30bit */
zl = xlo * MULTIPLIER_H1+ xhi * M U LTIPLIER S ;
/*■
ISbit * 16bit " 2 => 32bit */
z2 = xhi *■MULTIPLIER.HI :/• I6bit * !6bit => 32bit */
zO += (zl & MASK) « NBIT :
z2 += (zl » NBIT) + (zO » (2*NB1T)) ;
zO = (zO & MASK2) I((z2&!) « (2*NB1T)) ;
z2 » = I :
statc31 = zO + z2 :
if (statc3l>=0x7fffffffUL) statc31 -* 0x7fffffffUL :
I* Это число нс должно превышать 2*0x7fffffffUL */
return (long) statc31 ;
I
void init_lcong31 (unsigned long s)
1
if ( s == 0UL ) s=!9660809UL :/* начальное число нс должно быть 0 *>
s = s % 0x7fffffffUL ;
statc3! = s :
38