python3 - <<'PY' T=112 M=[(-2,5,-1),(-1,-4,3),(0,4,-3),(1,2,2),(2,-5,1),(-2,1,-4),(1,-4,-2),(2,3,-3)] def md(a,m): return a-(a//m)*m r=17 s=41 q=73 R=[] S=[] Q=[] for i in range(72): r=md(5*r+3*s+7*i+11,97) s=md(2*r+7*s+q+5*i+13,89) q=md(3*r+s+5*q+11*i+17,83) R.append(r) S.append(s) Q.append(q) t=[20+i+i//4 for i in range(72)] x=[4+md(7*R[i]+3*S[i]+5*Q[i]+2*i,23) for i in range(72)] y=[3+md(5*R[i]+2*S[i]+7*Q[i]+3*i,17) for i in range(72)] p=[1 if md(R[i]+2*S[i]+Q[i]+i,6) in (0,1,4) else -1 for i in range(72)] P=[[0]*88 for h in range(8)] N=[[0]*88 for h in range(8)] LP=[[-1000]*88 for h in range(8)] LM=[[-1000]*88 for h in range(8)] A=[0]*8 O=[0]*8 J=[0]*8 C=[0]*8 D=[0]*8 H=0 TERMS=[] for i in range(72): for h in range(8): om,xi,eta=M[h] u=x[i]+((T-t[i])*(om*(y[i]-11)+xi))//128 v=y[i]+((T-t[i])*(-om*(x[i]-15)+eta))//128 if u<0 or u>30 or v<0 or v>22: zz=0 else: a=u//3 b=v//3 k=a*8+b if p[i]==1: last=LP[h][k] else: last=LM[h][k] if t[i]-last<=7: zz=1 if p[i]==1 else 2 else: P0=P[h][k] N0=N[h][k] d=P0-N0 m=P0+N0 zz=3 if p[i]==1 else 4 if p[i]==1: P[h][k]=P0+1 LP[h][k]=t[i] else: N[h][k]=N0+1 LM[h][k]=t[i] A[h]+=1 if m==0: O[h]+=1 J[h]+=p[i] C[h]+=2*p[i]*d+1 if (p[i]==1 and N0>0) or (p[i]==-1 and P0>0): D[h]+=1 term=19*(i+1)+23*(h+1)+11*(u+32)+13*(v+32)+17*(zz+1)+C[h]+7*A[h]+5*O[h]+3*D[h]+J[h]+72 TERMS.append(term) H=md(37*H+term,9973) H1=0 for tt in TERMS: H1=md(37*H1+tt,9973) nn=len(TERMS) H2=0 for k in range(nn): H2=(H2+pow(37,nn-1-k,9973)*(TERMS[k]%9973))%9973 print('H',H,H1,H2,'terms',TERMS[0],TERMS[1],TERMS[-1]) PY