#!/usr/bin/python from array import array from operator import mod, sub def eea(a,b): v1 = [a,1,0] v2 = [b,0,1] while v2[0]<>0: p = v1[0]//v2[0] v2, v1 = map(sub,v1,[p*vi for vi in v2]), v2 return v1 def minv(m,k): v = eea(m,k) if v[1]>=0: return v[1] else: return k+v[1] def duprims(n): if n==2: return [2] elif n<2: return [] s=range(3,n+1,2) mroot = n ** 0.5 half=(n+1)/2-1 i=0 m=3 while m <= mroot: if s[i]: j=(m*m-3)/2 s[j]=0 while jval: tot-=val cnt+=1 return cnt def euc(ar0, ar1): while ar0>0: rx=ar1%ar0 ar1=ar0 ar0=rx return ar1 def dulogs(rad): tot=2 logs=array('H', [0]*rad) ind=1 while tot!=1: logs[tot]=ind tot<<=1 if tot>rad: tot-=rad ind+=1 return logs def ducons(): lst=duprims(20000) lcm=1 mxm=1 rng=1 rads=[] lrads=[] mxms=[] lcms=[] logss=[] rngs=[] linvs=[] rcnt=0 for rad in lst[3:]: cnt=ducnt(rad) if cnt==rad-1: lrad=cnt>>1 if (lrad&1)==1 and euc(lrad, lcm)==1: rads.append(rad) gcd=euc(rad-1, rng) rng=rng*(rad-1)/gcd rngs.append(rng) mxms.append(mxm) lrads.append(lrad) logss.append(dulogs(rad)) lcms.append(lcm) xres=lcm%lrad linvs.append(minv(xres, lrad)) mxm*=rad lcm*=lrad rcnt+=1 return (rads, lrads,linvs, lcms, rngs, mxms, logss) def man(): print 'from array import array''' rads=cons[0] print 'rads=array(\'H\',', rads, ')' lrads=cons[1] print 'lrads=array(\'H\',', lrads, ')' linvs=cons[2] print 'linvs=', linvs lcms=cons[3] print 'lcms=', lcms rngs=cons[4] print 'rngs=', rngs mxms=cons[5] print 'mxms=', mxms logss=cons[6] print 'logss=', logss cons=ducons() man()