import sys from fractions import Fraction as F from system import System, ERRDIMS from hosts import proof_hosts def exact_proj(t, hosts=None, order=("E3","E25","E2","b","a")): S=System(t,verbose=False); S.run(hosts if hosts is not None else proof_hosts(t)) cols={} for r in S.rows: for c in r: if c[0]=="nu" and c not in cols: cols[c]=len(cols) N=len(cols); o=N for n in order: for i in range(ERRDIMS[n]): cols[("err",n,i)]=o+i o+=ERRDIMS[n] piv={} for r in S.rows: r={cols[c]:F(v) for c,v in r.items() if v!=0} while r: c=min(r) if c in piv: pr=piv[c]; f=r[c] for cc,vv in pr.items(): nv=r.get(cc,0)-f*vv if nv: r[cc]=nv else: r.pop(cc,None) else: inv=1/r[c]; piv[c]={cc:vv*inv for cc,vv in r.items()}; break npe=sum(1 for c in piv if c>=N) res={} start=N for j,n in enumerate(order): res["/".join(order[j:])]=(o-start)-sum(1 for c in piv if c>=start) start+=ERRDIMS[n] return res, len(S.reps), S.skipped for tv in sys.argv[1:]: print(tv, exact_proj(F(tv)))