excel - Choose a, c, m in Linear Congruential Generator -
i looking implement linear congruential generator in excel.
as know, must choose parameter of lcg a, c, m, , z0.
wikipedia says that
the period of general lcg @ m, , choices of factor less that. lcg have full period seed values if , if:
m , offset c relatively prime, - 1 divisible prime factors of m, - 1 divisible 4 if m divisible 4.
also,
m, 0 < m – "modulus" a, 0 < < m – "multiplier" c, 0 < c < m – "increment" z0, 0 < z0 < m – "seed" or "start value"
i need choose values, want z0 initial value 10113383, , rest random. nah, values has specified period , guaranteed no collisions duration of period?
i've tried put values, a=13, c=911, m=11584577 , looks no collisions. i'm not sure if break rules or not.
i regularly teach number theory , cryptography course have built library of programs in vba , python. using these, needed write 1 more:
function gcd(num1 long, num2 long) long dim long dim b long = num1 b = num2 dim r long r = 1 until r = 0 r = mod b = b b = r loop gcd = end function sub helper_factor(byval n long, byval p long, factors collection) 'takes passed collection , adds array of form '(q,k) q >= p smallest prime divisor of n 'p assumed odd 'the function called in such way 'the first divisor found automatically prime dim q long, k long q = p while q <= sqr(n) if n mod q = 0 k = 1 while n mod q ^ k = 0 k = k + 1 loop k = k - 1 'went 1 step far factors.add array(q, k) helper_factor n / q ^ k, q + 2, factors exit sub end if q = q + 2 loop 'if here n prime - add factor factors.add array(n, 1) end sub function factor(byval n long) collection dim factors new collection dim k long while n mod 2 ^ k = 0 k = k + 1 loop k = k - 1 if k > 0 n = n / 2 ^ k factors.add array(2, k) end if if n > 1 helper_factor n, 3, factors set factor = factors end function function displayfactors(n long) string dim factors collection dim long, p long, k long dim sfactors variant set factors = factor(n) redim sfactors(1 factors.count) = 1 factors.count p = factors(i)(0) k = factors(i)(1) sfactors(i) = p & iif(k > 1, "^" & k, "") next displayfactors = join(sfactors, "*") end function function maxperiod(a long, c long, m long) boolean 'assumes 0 < a,c < m dim factors collection dim p long, long if gcd(c, m) > 1 exit function 'with default value of false if m mod 4 = 0 , (a - 1) mod 4 > 0 exit function 'else: set factors = factor(m) = 1 factors.count p = factors(i)(0) if p < m , (a - 1) mod p > 0 exit function next 'if survive here: maxperiod = true end function
for example, in intermediate window can check:
?maxperiod(13,911,11584577) true
so seem in luck
Comments
Post a Comment