# Finite field F_{r**3}, the digit layout of Section 2 (k=1440), and coefficient extraction. import random, itertools class Field: def __init__(s,r,d,seed=1): s.r=r; s.d=d; rnd=random.Random(seed) while True: s.mod=[rnd.randrange(r) for _ in range(d)]+[1] if s.irred(): break def mulmod(s,a,b): r,d=s.r,s.d; res=[0]*(2*d-1) for i,x in enumerate(a): if x: for j,y in enumerate(b): res[i+j]=(res[i+j]+x*y)%r for i in range(len(res)-1,d-1,-1): c=res[i] if c: for j in range(d+1): res[i-d+j]=(res[i-d+j]-c*s.mod[j])%r return res[:d] def pw(s,a,e): res=[1]+[0]*(s.d-1); b=a[:] while e: if e&1: res=s.mulmod(res,b) b=s.mulmod(b,b); e>>=1 return res def irred(s): x=[0,1]+[0]*(s.d-2) if s.d>1 else [0] y=x for i in range(1,s.d+1): y=s.pw(y,s.r) if i