www.pudn.com > calc.rar > random.c


#include  
 
#define USL unsigned long int 
#define L0 2147483648 
 
USL RANDOMm(USL x); 
main() 
{ 
	USL i, n, j; 
 
	printf("enter n > 0\n"); 
	scanf("%lu", &n); 
	j = 63434341; 
	for (i = 0; i < n; i++) 
	{ 
		j = RANDOMm(j); 
		printf("%lu\n", j); 
	} 
	return; 
} 
 
unsigned long RUSSm(USL a, USL b, USL c, USL p) 
/* 
 *  input: unsigned long ints a, b, c, p, with p > 0. 
 * output: a + b * c (mod p). 
 * Russian Peasant multiplication algorithm. Uses the identities 
 * RUSSm(a, b, 2 * c, p) = RUSSm(a, 2 * b, c, p), 
 * RUSSm(a, b, c + 1, p) = RUSSm(a + b, b, c, p). 
 * If a, b, c and p are less than 2^32, * so is RUSSm(a, b, c, p). 
 * From H. Luneburg, "On the Rational Normal Form of * Endomorphisms", 
 * B.I. WissenSchaftsverlag, Mannheim/Wien/Zurich, 1987, pp 18-19. 
 * Luneburg's restriction to 2*p<2^32 removed by krm on 18/4/94. 
 */ 
{ 
	a = a % p; 
	b = b % p; 
	c = c % p; 
	while (c) 
	{ 
		while (!(c & 1)) 
		{ 
			c = c >> 1; 
	 		b = (b < p - b) ? (b << 1) % p : (b - (p - b)) % p; 
		} 
		c--; 
		a = (a < p - b) ? a + b : a - (p - b); 
	} 
	return a; 
} 
 
unsigned long RANDOMm(USL x) 
/* 
 * input: unsigned int x, output:a "random number" a * x + c (mod m). 
 * a = 1001, m = R0 = 65536, c = 65; 
 * From H. Luneburg, "On the Rational Normal Form of Endomorphisms", 
 * B.I. WissenSchaftsverlag, Mannheim/Wien/Zurich, 1987. 
 * See Knuth Vol 2, Theorem A, p. 16. 
 */ 
{ 
	unsigned long a, c, m; 
		 
	m = L0; 
	a = 1001; 
	c = 65; 
	return RUSSm(c, a, x, m); 
}