"""Independent Gram-matrix checks for the classical roots of T495."""
import json,sys,time
import numberdb.sage as numberdb
from sage.rings.integer_ring import ZZ
from sage.matrix.constructor import matrix
from sage.libs.pari.all import pari


def gram(family,n):
    if family=='Z':return matrix(ZZ,n,n,lambda i,j:int(i==j))
    edges=list(zip(range(n-1),range(1,n)))
    if family=='D':edges=edges[:-1]+[(n-3,n-1)]
    if family=='E':edges=[(0,2),(1,3)]+[(i,i+1) for i in range(2,n-1)]
    a=[[2*int(i==j) for j in range(n)] for i in range(n)]
    for i,j in edges:a[i][j]=a[j][i]=-1
    return matrix(ZZ,a)


def compute():
    control=pari(gram('Z',2)).qfauto()
    assert int(control[0])==8
    assert int(pari(matrix(ZZ,[[2,-1],[-1,2]])).qfauto()[0])==12
    print('Known controls: square order 8, hexagonal order 12',flush=True)
    results={};dual_checks=0;generator_count=0
    for family, dimensions in [('Z',range(1,25)),('A',range(1,25)),('D',range(4,25)),('E',(6,7,8))]:
        for n in dimensions:
            g=pari(gram(family,n));auto=g.qfauto();order=int(auto[0]);results[family+','+str(n)]=order
            for u in auto[1]:
                assert u.mattranspose()*g*u==g
                assert abs(u.matdet())==1
                assert u.mattranspose()*(3*g)*u==3*g
                generator_count+=1
                if family!='Z':
                    h=u**-1; h=h.mattranspose();dual=g**-1
                    assert h.mattranspose()*dual*h==dual
            if (family=='A' and n>=3) or (family=='D' and n>=5) or (family=='E' and n in (6,7)):
                results[family+'*,'+str(n)]=order;dual_checks+=1
        print('FINISHED',family,flush=True)
    print('ROOT_RESULTS',json.dumps(results),flush=True)
    print('Validated',generator_count,'integral isometry generators;',dual_checks,'dual orders via contragredience',flush=True)
    return results

if __name__=='__main__':compute()
