python3 -c 'from fractions import Fraction as F def add(x,y): return (x[0]-(-y[0]),x[1]-(-y[1])) def neg(x): return (-x[0],-x[1]) def sub(x,y): return (x[0]-y[0],x[1]-y[1]) def mul(x,y): return (x[0]*y[0],x[0]*y[1]-(-x[1]*y[0])) def div(x,y): return (x[0]/y[0],(x[1]*y[0]-x[0]*y[1])/(y[0]*y[0])) def sm(*xs): return xs[0] if len(xs)==1 else add(xs[0],sm(*xs[1:])) def fadd(x,y): return x-(-y) def fm(*xs): return xs[0] if len(xs)==1 else fadd(xs[0],fm(*xs[1:])) def cn(x): return (F(x),F(0)) def lg(x,p): return p*x[1]/x[0] def det2(m): return sub(mul(m[0][0],m[1][1]),mul(m[0][1],m[1][0])) def solve2(m,r): return (div(sub(mul(r[0],m[1][1]),mul(m[0][1],r[1])),det2(m)),div(sub(mul(m[0][0],r[1]),mul(r[0],m[1][0])),det2(m))) def det3(m): return sm(mul(m[0][0],sub(mul(m[1][1],m[2][2]),mul(m[1][2],m[2][1]))),neg(mul(m[0][1],sub(mul(m[1][0],m[2][2]),mul(m[1][2],m[2][0])))),mul(m[0][2],sub(mul(m[1][0],m[2][1]),mul(m[1][1],m[2][0])))) def rep0(m,r): return ((r[0],m[0][1],m[0][2]),(r[1],m[1][1],m[1][2]),(r[2],m[2][1],m[2][2])) def rep1(m,r): return ((m[0][0],r[0],m[0][2]),(m[1][0],r[1],m[1][2]),(m[2][0],r[2],m[2][2])) def rep2(m,r): return ((m[0][0],m[0][1],r[0]),(m[1][0],m[1][1],r[1]),(m[2][0],m[2][1],r[2])) def solve3(m,r): return (div(det3(rep0(m,r)),det3(m)),div(det3(rep1(m,r)),det3(m)),div(det3(rep2(m,r)),det3(m))) def tr(m): return tuple(tuple(x) for x in zip(*m)) def mm(A,B): return tuple(tuple(sm(*tuple(mul(A[i][k],B[k][j]) for k in range(len(B)))) for j in range(len(B[0]))) for i in range(len(A))) def mv(A,v): return tuple(sm(*tuple(mul(A[i][k],v[k]) for k in range(len(v)))) for i in range(len(A))) def addp(P,Q): return tuple(sm(P[i],Q[i]) for i in range(len(P))) def subp(P,Q): return tuple(sub(P[i],Q[i]) for i in range(len(P))) def sump(*Ps): return Ps[0] if len(Ps)==1 else addp(Ps[0],sump(*Ps[1:])) def mulsc(c,P): return tuple(mul(c,x) for x in P) def mulp(P,Q): return tuple(sm(*tuple(mul(P[k],Q[i-k]) for k in range(max(0,i-len(Q)-(-1)),min(i,len(P)-1)-(-1)))) for i in range(len(P)-(-len(Q))-1)) def cons(x,L): return (x,*L) def hv(P,x,i): return (P[0],) if i==0 else (lambda R: cons(sm(P[i],R[0]),R[1:]))(mulp(x,hv(P,x,i-1))) def ip(P,Q): return sm(*tuple(div(mul(P[k],Q[j]),cn(F(k-(-j)-(-1)))) for k in range(len(P)) for j in range(len(Q)))) def step(la,de): return (lambda W: (lambda D: (lambda J: (lambda E: (sub(la,E[0]),sub(de,E[1])))(solve2(J,(sub(ip(W,one),tt0),sub(ip(W,zp),tt1)))))(((ip(zp,D),ip(one,D)),(ip(z2p,D),ip(zp,D)))))(hv(DP,(de,la),2)))(hv(FG,(de,la),3)) def fmt(xs,k): return tuple((c[k].numerator,c[k].denominator) for c in xs) s=(F(0),F(1)) A=((cn(1),s,cn(1)),(add(cn(2),s),cn(2),cn(2)),(neg(s),mul(cn(2),s),cn(2)),(add(cn(1),s),add(cn(-2),s),cn(1))) ys=(sub(cn(F(23,6)),s),add(cn(F(4,3)),mul(cn(F(3,2)),s)),sub(cn(1),mul(cn(2),s)),add(cn(F(-5,6)),mul(cn(3),s))) ws=solve3(mm(tr(A),A),mv(tr(A),ys)) w1,w2,rho=ws w3=sub(cn(1),add(w1,w2)) assert w1[0]==F(1,3) and w2[0]==F(1,3) and w3[0]==F(1,3) and rho[0]==F(1,2) aa1=(F(1,3),F(1,3)*fm(lg(w1,F(3,4)),lg(w2,F(1,4)))) aa2=(F(1,3),F(1,3)*fm(lg(w1,F(1,4)),lg(w2,F(1,2)),lg(w3,F(1,4)))) aa3=(F(1,3),F(1,3)*fm(lg(w2,F(1,4)),lg(w3,F(3,4)))) ss=sm(aa1,aa2,aa3) wb1=div(aa1,ss) wb2=div(aa2,ss) wb3=div(aa3,ss) g1=(add(cn(1),s),cn(1),s,add(cn(1),s)) g2=(mul(cn(2),s),sub(cn(1),s),add(cn(1),s),cn(1)) g3=(s,cn(0),s,cn(1)) cc=(cn(1),s,cn(1),neg(s)) FG=sump(mulsc(wb1,g1),mulsc(wb2,g2),mulsc(wb3,g3),mulsc(rho,cc)) tt0=add(cn(F(61,36)),mul(cn(F(403,216)),s)) tt1=add(cn(F(377,360)),mul(cn(F(1739,1728)),s)) DP=(FG[1],mul(cn(2),FG[2]),mul(cn(3),FG[3])) one=(cn(1),) zp=(cn(0),cn(1)) z2p=(cn(0),cn(0),cn(1)) lam,dl=step(cn(1),cn(0)) lam,dl=step(lam,dl) lam,dl=step(lam,dl) assert lam[0]==F(1) and dl[0]==F(0) K=(cn(1),rho,sub(lam,dl)) Gref=sump(mulsc(rho,g1),mulsc(sub(cn(1),rho),g2)) FGs=hv(FG,(dl,lam),3) Dp=subp(FGs,Gref) H=mulp(K,Dp) N0=(cn(1),dl) N1=(cn(0),cn(1),lam) G=((ip(N0,N0),ip(N0,N1)),(ip(N1,N0),ip(N1,N1))) cc2=solve2(G,(ip(H,N0),ip(H,N1))) c0,c1=cc2 Rp=subp(subp(H,mulsc(c0,N0)),mulsc(c1,N1)) Dc=Rp[4] Pi=tuple(div(x,Dc) for x in Rp) O=(w1,w2,w3,rho,lam,dl,Pi[0],Pi[1],Pi[2],Pi[3],Pi[4],Pi[5]) print(fmt(Pi,0),fmt(O,1))'