"""Exhaustive fourth-row loci over each affine seed, exact rational phases.""" from fractions import Fraction as Q from itertools import combinations from functools import lru_cache from collections import Counter from pathlib import Path import json,time,sys from torus_solver import solve_torus from families import family ROOT=Path(__file__).resolve().parent def patterns(): out=[] for tri in combinations(range(7),3): rest=[i for i in range(7) if i not in tri] for j in rest[1:]: pair=(rest[0],j);other=tuple(i for i in rest if i not in pair) for ori in [1,-1]: out.append(((tri[1],tri[0],(2*ori)%6),(tri[2],tri[0],(4*ori)%6),(pair[1],pair[0],3),(other[1],other[0],3))) return out PAT=patterns() def det(M): if not M:return 1 if len(M)==1:return M[0][0] return sum((-1)**j*M[0][j]*det([r[:j]+r[j+1:] for r in M[1:]]) for j in range(len(M))) @lru_cache(None) def chart(B): d=len(B[0]) if d==0:return (),tuple(() for _ in B) piv=next((p for p in combinations(range(len(B)),d) if abs(det([list(B[i]) for i in p]))==1),None) if piv is None:raise RuntimeError(('No unimodular coordinate chart',B)) M=[list(B[i]) for i in piv];D=det(M) inv=[[(-1)**(i+j)*det([r[:i]+r[i+1:] for k,r in enumerate(M) if k!=j])//D for j in range(d)] for i in range(d)] C=tuple(tuple(sum(row[k]*inv[k][j] for k in range(d)) for j in range(d)) for row in B) return piv,C def canonical(c,B): B=tuple(tuple(v) for v in B);piv,C=chart(B) cc=tuple((v-sum(row[k]*c[piv[k]] for k in range(len(piv))))%1 for v,row in zip(c,C)) return cc,C,piv def contains(big,small): bc,B,p=big;sc,S,_=small if len(S[0])>len(p):return False for i,row in enumerate(B): if (sc[i]-bc[i]-sum(v*sc[j] for v,j in zip(row,p)))%1:return False if any(v!=sum(row[k]*S[j][h] for k,j in enumerate(p)) for h,v in enumerate(S[i])):return False return True @lru_cache(None) def solve_cached(A,b,n): if n==0:return (((),()),) if all(x%1==0 for x in b) else () return tuple(solve_torus(A,b,n)) class Graph: def __init__(self,d): self.d=d;self.p=list(range(7));self.c=[0]*7;self.B=[(0,)*d for _ in range(7)];self.eq={} def clone(self): g=Graph(self.d);g.p=self.p.copy();g.c=self.c.copy();g.B=self.B.copy();g.eq=self.eq.copy();return g def find(self,i): c=0;b=[0]*self.d while self.p[i]!=i: c+=self.c[i];b=[x+y for x,y in zip(b,self.B[i])];i=self.p[i] return i,c%6,tuple(b) def add(self,i,j,c,b): ri,ci,bi=self.find(i);rj,cj,bj=self.find(j) c=(c-ci+cj)%6;b=tuple(x-y+z for x,y,z in zip(b,bi,bj)) if ri==rj: if not any(b):return c==0 if next(v for v in b if v)<0:c=(-c)%6;b=tuple(-v for v in b) if b in self.eq:return self.eq[b]==c self.eq[b]=c;return True if ri