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

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

reactjs - React router and this.props.children - how to pass state to this.props.children -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -