This SageMath file accompanies the paper "Enumeration of general planar hypermaps with an alternating boundary", by Valentin Baillard, Ariane Carrance and Bertrand Eynard (more specifically the results of Section 5 on Ising quadrangulations)

Definition of the variables and of the potentials¶

In [1]:
var('x, y, A, B, t2, t4, tt2, tt4, c, t, z, g, a1, a3, b1, b3, D20, D11, D02, D22, w, f00, f02, f20, f22, fh');
In [2]:
V=-t2*x-t4*x^3
VV=V.subs(x=y,t2=tt2,t4=tt4)

Parametrization for the monochromatic boundary (Section 5.1)¶

We apply Theorem 8.3.1 from [Eynard 2016] to our specific choice of potentials

In [3]:
xparam=g*z+a1/z+a3/(z^3)
yparam=g/z+b1*z+b3*z^3
In [4]:
eq1=(V.subs(x=xparam)+c*yparam-t/(g*z)).collect(z)
eq2=(VV.subs(y=yparam)+c*xparam-t*z/g).collect(z)
In [5]:
eqcoeffs=[eq1.coefficient(z,i) for i in [-1,1,3]]+[eq2.coefficient(z,i) for i in [-3,-1,1]]
In [6]:
eqcoeffs
Out[6]:
[-3*a1^2*g*t4 - 3*a3*g^2*t4 + c*g - a1*t2 - t/g,
 -3*a1*g^2*t4 + b1*c - g*t2,
 -g^3*t4 + b3*c,
 -g^3*tt4 + a3*c,
 -3*b1*g^2*tt4 + a1*c - g*tt2,
 -3*b1^2*g*tt4 - 3*b3*g^2*tt4 + c*g - b1*tt2 - t/g]
In [7]:
sol=solve(eqcoeffs,t2,tt2,t4,tt4,t)[0]
sol
Out[7]:
[t2 == -(3*a1*b3*c - b1*c*g)/g^2,
 tt2 == -(3*a3*b1*c - a1*c*g)/g^2,
 t4 == b3*c/g^3,
 tt4 == a3*c/g^3,
 t == c*g^2 - (a1*b1 + 3*a3*b3)*c]
In [ ]:
 

Explicit master equation for $\widehat{f}$ (Section 5.2)¶

Construction of $Q$ and $E$¶

To write the sytem given by $Q=E$ on the functions $f_{ij}$ (that we want to eliminate) and $\hat{f}, \omega$, we first compute $Q$ and $E$. We have: $$Q(x,y) =\frac{-\widehat{f}}{c}\Big(V'+cy-f_{01}-\frac{xR}{\widehat{f}}\Big)\Big(\widetilde{V}'+cx-f_{10}-\frac{y\widetilde{R}}{\widehat{f}}\Big)+ \frac{1}{c^2}(\widehat{f}\omega +cxy)\big(c^2f_{00}-\widehat{P} + \frac{R\widetilde{R}}{\widehat{f}}\big)$$ with $R(x,\omega):=\langle{\frac{V'(x) - V'(A)}{x-A}\frac{1}{\omega - BA}}\rangle$ (and likewise for $\widetilde{R}$), $\widehat{P}(x,y,\omega):=\langle{\frac{V'(x) - V'(A)}{x-A}\frac{1}{\omega - BA}\frac{\widetilde{V}'(y)-\widetilde{V}'(B)}{y-B}}\rangle$

In [8]:
R=((V-V.subs(x=A))/(x-A)).full_simplify()
R
Out[8]:
-A^2*t4 - A*t4*x - t4*x^2 - t2

We remove the odd term (that gives 0 since $V$ and $\widetilde{V}$ are even) and rewrite the others with $f_{ij}$'s

In [10]:
R=R.coefficient(A,0)*f00+R.coefficient(A,2)*f20
R
Out[10]:
-(t4*x^2 + t2)*f00 - f20*t4
In [11]:
RR=R.subs(x=y,t2=tt2,t4=tt4,f20=f02)
RR
Out[11]:
-(tt4*y^2 + tt2)*f00 - f02*tt4

For $\widehat{P}$, we use the fact that $f_{11}=\omega f_{00} -t$

In [12]:
Ph=(((V-V.subs(x=A))/(x-A)).full_simplify()*((VV-VV.subs(y=B))/(y-B)).full_simplify()).expand()
Ph
Out[12]:
A^2*B^2*t4*tt4 + A*B^2*t4*tt4*x + B^2*t4*tt4*x^2 + A^2*B*t4*tt4*y + A*B*t4*tt4*x*y + B*t4*tt4*x^2*y + A^2*t4*tt4*y^2 + A*t4*tt4*x*y^2 + t4*tt4*x^2*y^2 + A^2*t4*tt2 + B^2*t2*tt4 + A*t4*tt2*x + t4*tt2*x^2 + B*t2*tt4*y + t2*tt4*y^2 + t2*tt2
In [13]:
Ph=Ph.coefficient(A,0).coefficient(B,0)*f00+Ph.coefficient(A).coefficient(B)*(w*f00-t)+Ph.coefficient(A,2).coefficient(B,0)*f20+Ph.coefficient(A,0).coefficient(B,2)*f02+Ph.coefficient(A,2).coefficient(B,2)*f22
Ph
Out[13]:
(f00*w - t)*t4*tt4*x*y + f22*t4*tt4 + (t4*tt4*x^2*y^2 + t4*tt2*x^2 + t2*tt4*y^2 + t2*tt2)*f00 + (t4*tt4*x^2 + t2*tt4)*f02 + (t4*tt4*y^2 + t4*tt2)*f20
In [14]:
Q=((-fh/c)*(V+c*y-x*R/fh)*(VV+c*x-y*RR/fh)+(1/c^2)*(fh*w+c*x*y)*(c^2*f00-Ph+R*RR/fh)).subs(f00=fh+c).full_simplify()
In [16]:
Q=Q.expand()
In [ ]:
 

For $E$, we have: $E(x,y)=(V'(x)+cy)(\tilde V'(y)+cx)+ \frac{1}{c}P(x,y)- ct$ with $P(x,y)=\langle\frac{V'(x)-V'(A)}{x-A}\frac{\tilde V'(y)-\tilde V'(B)}{y-B}\rangle$

In [17]:
P=(((V-V.subs(x=A))/(x-A)).full_simplify()*((VV-VV.subs(y=B))/(y-B)).full_simplify()).expand()
P
Out[17]:
A^2*B^2*t4*tt4 + A*B^2*t4*tt4*x + B^2*t4*tt4*x^2 + A^2*B*t4*tt4*y + A*B*t4*tt4*x*y + B*t4*tt4*x^2*y + A^2*t4*tt4*y^2 + A*t4*tt4*x*y^2 + t4*tt4*x^2*y^2 + A^2*t4*tt2 + B^2*t2*tt4 + A*t4*tt2*x + t4*tt2*x^2 + B*t2*tt4*y + t2*tt4*y^2 + t2*tt2

We remove the terms where the powers of $A$ and $B$ do not have the same parity, and replace the others by the corresponding $D_{ij}$, noting that $D_{00}=t$

In [20]:
P=P.coefficient(A,0).coefficient(B,0)*t+P.coefficient(A).coefficient(B)*D11+P.coefficient(A,2).coefficient(B,0)*D20+P.coefficient(A,0).coefficient(B,2)*D02+P.coefficient(A,2).coefficient(B,2)*D22
P
Out[20]:
D11*t4*tt4*x*y + D22*t4*tt4 + (t4*tt4*x^2 + t2*tt4)*D02 + (t4*tt4*y^2 + t4*tt2)*D20 + (t4*tt4*x^2*y^2 + t4*tt2*x^2 + t2*tt4*y^2 + t2*tt2)*t
In [21]:
E=(V+c*y)*(VV+c*x)+(1/c)*P-c*t
E=E.expand()
In [ ]:
 

Elimination of $f_{20}, f_{02}, f_{22}$¶

We will now eliminate the auxiliary functions $f_{20}, f_{02}, f_{22}$ from the system given by $\{[x^iy^j]E(x,y)=[x^iy^j]Q(x,y)\}, 0 \leq i, j \leq 4$ (some powers do not appear)

  • the coefficients of $x^4$ and $x^3$ (and in $y^4, y^3$) are already equal
  • the coefficients of $x^2$ and $y^2$ give a system on $f_{20}, f_{02}$
  • the coefficient of $xy$ gives an equation on $f_{22}$
In [22]:
E.coefficient(x,4)-Q.coefficient(x,4)
Out[22]:
0
In [23]:
E.coefficient(x,3)-Q.coefficient(x,3)
Out[23]:
0
In [24]:
eq2x=E.coefficient(x,2)-Q.coefficient(x,2)
eq2x
Out[24]:
-fh*t4*tt2*w/c - t4*tt2*w - f02*t4*tt4*w/c + f20*t4 + t*t4*tt2/c + D02*t4*tt4/c
In [26]:
eq2y=E.coefficient(y,2)-Q.coefficient(y,2)
In [27]:
f20s=solve([eq2x,eq2y],f20,f02)[0][0].rhs()
f02s=solve([eq2x,eq2y],f20,f02)[0][1].rhs()
f20s
Out[27]:
-((c*t2 + fh*t2)*tt4*w^2 - c*t*tt2 - D02*c*tt4 + ((c^2 + c*fh)*tt2 - (t*t2 + D20*t4)*tt4)*w)/(t4*tt4*w^2 - c^2)
In [28]:
eqxy=E.coefficient(x,1)-Q.coefficient(x,1)
eqxy
Out[28]:
fh*t4*tt4*w^2*y/c + fh^2*t4*tt4*w^2*y/c^2 - fh*t*t4*tt4*w*y/c^2 + D11*t4*tt4*y/c + f22*t4*tt4*y/c
In [29]:
f22s=solve(eqxy,f22)[0].rhs()
f22s
Out[29]:
(fh*t*w - (c*fh + fh^2)*w^2 - D11*c)/c
In [ ]:
 

Master equation on $\widehat{f}, \omega$ with the $D_{ij}$¶

We now replace $f_{20}, f_{02}, f_{22}$ by the above expressions in the constant coefficient in $Q(x,y)-E(x,y)$

In [30]:
eq=(E.coefficient(x,0).coefficient(y,0)-Q.coefficient(x,0).coefficient(y,0)).numerator()
In [31]:
eq=eq.subs(f20=f20s,f02=f02s,f22=f22s).numerator().full_simplify().factor()
In [32]:
eq.full_simplify()
Out[32]:
fh^2*t*t4^3*tt4^3*w^6 - (c*fh^2 + fh^3)*t4^3*tt4^3*w^7 - c^8*t - (D11*c*fh*t4^3*tt4^3 + ((c^2*fh + c*fh^2)*t2*t4^2*tt2 + (c^4*fh - c^3*fh^2 - 2*c^2*fh^3)*t4^2)*tt4^2)*w^5 - ((c^3*fh + c^2*fh^2)*t4^2*tt2^2*tt4 - (D22*c^2*t4^3 + (D02*c^2 + D02*c*fh)*t2*t4^2)*tt4^3 + ((c^3*fh + c^2*fh^2)*t2^2*t4 + (c^4 + 2*c^2*fh^2)*t*t4^2 - ((c^2 + 2*c*fh)*t*t2*t4^2 + (D20*c^2 + D20*c*fh)*t4^3)*tt2)*tt4^2)*w^4 - ((D02*c*t*t2*t4^2 + D02*D20*c*t4^3)*tt4^3 - ((c^3 + 2*c^2*fh)*t*t2^2*t4 + (2*D11*c^3*fh + (D20*c^3 + 2*D20*c^2*fh)*t2)*t4^2 - (D20*c*t*t4^3 - (D02*c^3 + 2*D02*c^2*fh - c*t^2*t2)*t4^2)*tt2)*tt4^2 - ((c^3 + 2*c^2*fh)*t*t4^2*tt2^2 - (c^5 + 2*c^4*fh + c^3*fh^2)*t2*t4*tt2 + (2*c^6*fh + c^5*fh^2 - c^4*fh^3)*t4)*tt4)*w^3 - (D02^2*c^2*t4^2*tt4^3 + (c^6 + c^5*fh)*t4*tt2^2 + (D20^2*c^2*t4^3 + 2*D02*c^2*t*t4^2*tt2 + 2*(D22*c^4 + D20*c^2*t*t2)*t4^2 - (D02*c^3*fh*t2 - c^2*t^2*t2^2)*t4)*tt4^2 + (c^2*t^2*t4^2*tt2^2 + (c^6 + c^5*fh)*t2^2 - (2*c^6 + c^4*fh^2)*t*t4 - (D20*c^3*fh*t4^2 + 2*(c^4 + c^3*fh)*t*t2*t4)*tt2)*tt4)*w^2 + (c^6*t*t2 + D20*c^6*t4)*tt2 + (D02*c^6*t2 + D22*c^6*t4)*tt4 - (c^8*fh + c^7*fh^2 - c^5*t*t4*tt2^2 + (c^7 + c^6*fh)*t2*tt2 + (D02*c^3*t*t2*t4 + D02*D20*c^3*t4^2)*tt4^2 - (c^5*t*t2^2 - (D11*c^5*fh - D20*c^5*t2)*t4 - (D20*c^3*t*t4^2 - (D02*c^5 - c^3*t^2*t2)*t4)*tt2)*tt4)*w
In [33]:
eq.degree(fh)
Out[33]:
3
In [34]:
eq.degree(w)
Out[34]:
7
In [ ]:
 

Explicit expressions for the $D_{ij}$¶

  • We directly have $D_{20}$ as the coefficient of $x^{-3}$ in $cY(x)$
  • We split $D_{11}$ as $(1/c)\left(t^2+t_2D_{20}+t_4D_{4}\right)$
  • We split $D_{22}$ as $(1/c^2)\left(t^3+t_4D_{20}^2+3tt_2D_{20}+(t_2^2+3tt_4)D_{40}+2t_2t_4D_{60}+t_4^2D_{80}\right)$
  • We extract the coefficients of $x^{-3}$, $x^{-5}$, $x^{-7}$, $x^{-9}$ in $cY(x)$ from xparam, yparam by Lagrange inversion (we actually perform Lagrange inversion between $x^{-1}$ and $u=z^{-1}$ as it is slightly simpler)
In [36]:
var('u');
In [37]:
Upsilon=c*yparam.subs(z=u^(-1))
In [38]:
Uprime=diff(Upsilon,u)
In [39]:
Phi=((xparam/z).collect(z)).subs(z=u^(-1))
In [40]:
D20s=(1/3)*(Uprime*Phi^3).collect(u).coefficient(u,2)
D20s
Out[40]:
-a1^3*b3*c - a1^2*b1*c*g - 6*a1*a3*b3*c*g - a3*b1*c*g^2 + a1*c*g^3
In [42]:
D40s=(1/5)*(Uprime*Phi^5).collect(u).coefficient(u,4)
D60s=(1/7)*(Uprime*Phi^7).collect(u).coefficient(u,6)
D80s=(1/9)*(Uprime*Phi^9).collect(u).coefficient(u,8)
In [43]:
D11s=(1/c)*(t^2+t2*D20s+t4*D40s).subs(sol).factor()
D11s
Out[43]:
-(a1*a3*b1*b3 - 3*a3^2*b3^2 + a3*b1^2*g + a1^2*b3*g + a1*b1*g^2 + 5*a3*b3*g^2 - g^4)*c
In [45]:
D02s=D20s.subs(a1=b1,a3=b3,b1=a1,b3=a3)
D02s
Out[45]:
-a3*b1^3*c - a1*b1^2*c*g - 6*a3*b1*b3*c*g - a1*b3*c*g^2 + b1*c*g^3
In [46]:
D22s=(1/c^2)*(t^3+t4*D20s^2+3*t*t2*D20s+(t2^2+3*t*t4)*D40s+2*t2*t4*D60s+t4^2*D80s).subs(sol).factor()
D22s
Out[46]:
-(a1^2*a3*b1^2*b3 - 2*a1*a3^2*b1*b3^2 + a3^3*b3^3 + a1*a3*b1^3*g + a1^3*b1*b3*g + 2*a3^2*b1^2*b3*g + 2*a1^2*a3*b3^2*g + a1^2*b1^2*g^2 + 11*a1*a3*b1*b3*g^2 - 4*a3^2*b3^2*g^2 + 2*a3*b1^2*g^3 + 2*a1^2*b3*g^3 + 6*a3*b3*g^4 - g^6)*c
In [ ]:
 

Master equations for $(\omega,\widehat{f})$ and $(\zeta,\lambda)$¶

We now replace the $D_{ij}$ and $t, t_i,\widetilde{t}_j$ by their expressions in terms of $c,\gamma,\alpha_k,\beta_\ell$

In [48]:
eqwf=eq.subs(D20=D20s,D02=D02s,D11=D11s,D22=D22s).subs(sol).numerator().factor()

We then perform the transformation from $(\omega, \widehat{f})$ to $(\zeta, \lambda)$, with

  • $\lambda=\hat{f}\omega$
  • $\zeta=\omega+\frac{\gamma^6}{\alpha_3\beta_3\omega}$
In [49]:
var('l, zt');

We straightforwardly substitute $\widehat{f}$ by $\lambda/\omega$

In [50]:
eql=eqwf.subs(fh=l/w).numerator()
In [51]:
eql.variables()
Out[51]:
(a1, a3, b1, b3, c, g, l, w)
In [52]:
eql.degree(l)
Out[52]:
3
In [53]:
eql.degree(w)
Out[53]:
6

We then take the resultant between the equation on $\omega,\lambda$ and the equation on $\omega, \zeta$

In [54]:
eqzf=(zt-w-g^6/(a3*b3*w)).numerator()
eqzf
Out[54]:
-g^6 - a3*b3*w^2 + a3*b3*w*zt
In [57]:
eqzl=eql.resultant(eqzf,w).factor()

The resultant we compute is actually a square (up to a multiplicative constant), so we have to extract its squareroot

In [58]:
eqzl.number_of_operands()
Out[58]:
5
In [59]:
eqlz.operands()[0]
Out[59]:
(a3^5*b1^6*b3^2*c^3*g^3 + a1^6*a3^2*b3^5*c^3*g^3 - 4*a1*a3^4*b1^5*b3^2*c^3*g^4 - 6*a3^5*b1^4*b3^3*c^3*g^4 - 4*a1^5*a3^2*b1*b3^4*c^3*g^4 - 6*a1^4*a3^3*b3^5*c^3*g^4 + 6*a1^2*a3^3*b1^4*b3^2*c^3*g^5 + 6*a1^4*a3^2*b1^2*b3^3*c^3*g^5 + 20*a1*a3^4*b1^3*b3^3*c^3*g^5 + 20*a1^3*a3^3*b1*b3^4*c^3*g^5 + 9*a3^5*b1^2*b3^4*c^3*g^5 + 9*a1^2*a3^4*b3^5*c^3*g^5 - 8*a1^3*a3^2*b1^3*b3^2*c^3*g^6 + 4*a3^4*b1^4*b3^2*c^3*g^6 - 48*a1^2*a3^3*b1^2*b3^3*c^3*g^6 + 4*a1^4*a3^2*b3^4*c^3*g^6 - 40*a1*a3^4*b1*b3^4*c^3*g^6 - 4*a3^5*b3^5*c^3*g^6 + a1^2*a3^2*b1^4*b3*c^3*g^7 + a1^4*a3*b1^2*b3^2*c^3*g^7 - 4*a3^4*b1^2*b3^3*c^3*g^7 - 4*a1^2*a3^3*b3^4*c^3*g^7 - 2*a3^3*b1^4*b3*c^3*g^8 + 24*a1^2*a3^2*b1^2*b3^2*c^3*g^8 - 2*a1^4*a3*b3^3*c^3*g^8 + 72*a1*a3^3*b1*b3^3*c^3*g^8 + 16*a3^4*b3^4*c^3*g^8 - 4*a1*a3^2*b1^3*b3*c^3*g^9 - 4*a1^3*a3*b1*b3^2*c^3*g^9 - 18*a3^3*b1^2*b3^2*c^3*g^9 - 18*a1^2*a3^2*b3^3*c^3*g^9 - 24*a1*a3^2*b1*b3^2*c^3*g^10 - 24*a3^3*b3^3*c^3*g^10 + 12*a3^2*b1^2*b3*c^3*g^11 + 12*a1^2*a3*b3^2*c^3*g^11 - 8*a1*a3*b1*b3*c^3*g^12 + 16*a3^2*b3^2*c^3*g^12 + a3*b1^2*c^3*g^13 + a1^2*b3*c^3*g^13 - 4*a3*b3*c^3*g^14 + a1^3*a3^4*b1^3*b3^4*c^3*zt - 2*a1^2*a3^4*b1^4*b3^3*c^3*g*zt - 2*a1^4*a3^3*b1^2*b3^4*c^3*g*zt - 3*a1*a3^5*b1^3*b3^4*c^3*g*zt - 3*a1^3*a3^4*b1*b3^5*c^3*g*zt + a1*a3^4*b1^5*b3^2*c^3*g^2*zt + 4*a1^3*a3^3*b1^3*b3^3*c^3*g^2*zt + 4*a3^5*b1^4*b3^3*c^3*g^2*zt + a1^5*a3^2*b1*b3^4*c^3*g^2*zt + 12*a1^2*a3^4*b1^2*b3^4*c^3*g^2*zt + 4*a1^4*a3^3*b3^5*c^3*g^2*zt + 9*a1*a3^5*b1*b3^5*c^3*g^2*zt - 2*a1^2*a3^3*b1^4*b3^2*c^3*g^3*zt - 2*a1^4*a3^2*b1^2*b3^3*c^3*g^3*zt - 9*a1*a3^4*b1^3*b3^3*c^3*g^3*zt - 9*a1^3*a3^3*b1*b3^4*c^3*g^3*zt - 12*a3^5*b1^2*b3^4*c^3*g^3*zt - 12*a1^2*a3^4*b3^5*c^3*g^3*zt + a1^3*a3^2*b1^3*b3^2*c^3*g^4*zt - 4*a3^4*b1^4*b3^2*c^3*g^4*zt - 4*a1^4*a3^2*b3^4*c^3*g^4*zt + 4*a1*a3^4*b1*b3^4*c^3*g^4*zt + 11*a1*a3^3*b1^3*b3^2*c^3*g^5*zt + 11*a1^3*a3^2*b1*b3^3*c^3*g^5*zt + 20*a3^4*b1^2*b3^3*c^3*g^5*zt + 20*a1^2*a3^3*b3^4*c^3*g^5*zt - 12*a1^2*a3^2*b1^2*b3^2*c^3*g^6*zt - 34*a1*a3^3*b1*b3^3*c^3*g^6*zt + a1*a3^2*b1^3*b3*c^3*g^7*zt + a1^3*a3*b1*b3^2*c^3*g^7*zt - 4*a3^3*b1^2*b3^2*c^3*g^7*zt - 4*a1^2*a3^2*b3^3*c^3*g^7*zt + 20*a1*a3^2*b1*b3^2*c^3*g^8*zt - 4*a3^2*b1^2*b3*c^3*g^9*zt - 4*a1^2*a3*b3^2*c^3*g^9*zt + a1*a3*b1*b3*c^3*g^10*zt - 6*a3^4*b1^4*b3^2*c^2*g^4*l - 6*a1^4*a3^2*b3^4*c^2*g^4*l + 14*a1*a3^3*b1^3*b3^2*c^2*g^5*l + 14*a1^3*a3^2*b1*b3^3*c^2*g^5*l + 18*a3^4*b1^2*b3^3*c^2*g^5*l + 18*a1^2*a3^3*b3^4*c^2*g^5*l - 20*a1^2*a3^2*b1^2*b3^2*c^2*g^6*l - 56*a1*a3^3*b1*b3^3*c^2*g^6*l - 12*a3^4*b3^4*c^2*g^6*l + 2*a1*a3^2*b1^3*b3*c^2*g^7*l + 2*a1^3*a3*b1*b3^2*c^2*g^7*l + 24*a1*a3^2*b1*b3^2*c^2*g^8*l + 20*a3^3*b3^3*c^2*g^8*l - 2*a3^2*b1^2*b3*c^2*g^9*l - 2*a1^2*a3*b3^2*c^2*g^9*l - 4*a3^2*b3^2*c^2*g^10*l - 4*a3*b3*c^2*g^12*l + a1^2*a3^4*b1^2*b3^4*c^3*zt^2 - 2*a1*a3^5*b1*b3^5*c^3*zt^2 + a3^6*b3^6*c^3*zt^2 - 2*a1*a3^4*b1^3*b3^3*c^3*g*zt^2 - 2*a1^3*a3^3*b1*b3^4*c^3*g*zt^2 + 2*a3^5*b1^2*b3^4*c^3*g*zt^2 + 2*a1^2*a3^4*b3^5*c^3*g*zt^2 + a3^4*b1^4*b3^2*c^3*g^2*zt^2 + 4*a1^2*a3^3*b1^2*b3^3*c^3*g^2*zt^2 + a1^4*a3^2*b3^4*c^3*g^2*zt^2 + 2*a1*a3^4*b1*b3^4*c^3*g^2*zt^2 - 4*a3^5*b3^5*c^3*g^2*zt^2 - 2*a1*a3^3*b1^3*b3^2*c^3*g^3*zt^2 - 2*a1^3*a3^2*b1*b3^3*c^3*g^3*zt^2 - 4*a3^4*b1^2*b3^3*c^3*g^3*zt^2 - 4*a1^2*a3^3*b3^4*c^3*g^3*zt^2 + a1^2*a3^2*b1^2*b3^2*c^3*g^4*zt^2 + 2*a1*a3^3*b1*b3^3*c^3*g^4*zt^2 + 6*a3^4*b3^4*c^3*g^4*zt^2 + 2*a3^3*b1^2*b3^2*c^3*g^5*zt^2 + 2*a1^2*a3^2*b3^3*c^3*g^5*zt^2 - 2*a1*a3^2*b1*b3^2*c^3*g^6*zt^2 - 4*a3^3*b3^3*c^3*g^6*zt^2 + a3^2*b3^2*c^3*g^8*zt^2 - 3*a1*a3^4*b1^3*b3^3*c^2*g*l*zt - 3*a1^3*a3^3*b1*b3^4*c^2*g*l*zt + a3^4*b1^4*b3^2*c^2*g^2*l*zt + 12*a1^2*a3^3*b1^2*b3^3*c^2*g^2*l*zt + a1^4*a3^2*b3^4*c^2*g^2*l*zt + 18*a1*a3^4*b1*b3^4*c^2*g^2*l*zt - 5*a1*a3^3*b1^3*b3^2*c^2*g^3*l*zt - 5*a1^3*a3^2*b1*b3^3*c^2*g^3*l*zt - 15*a3^4*b1^2*b3^3*c^2*g^3*l*zt - 15*a1^2*a3^3*b3^4*c^2*g^3*l*zt + 2*a1^2*a3^2*b1^2*b3^2*c^2*g^4*l*zt - 4*a1*a3^3*b1*b3^3*c^2*g^4*l*zt + 14*a3^3*b1^2*b3^2*c^2*g^5*l*zt + 14*a1^2*a3^2*b3^3*c^2*g^5*l*zt - 14*a1*a3^2*b1*b3^2*c^2*g^6*l*zt + a3^2*b1^2*b3*c^2*g^7*l*zt + a1^2*a3*b3^2*c^2*g^7*l*zt + 9*a3^3*b1^2*b3^2*c*g^5*l^2 + 9*a1^2*a3^2*b3^3*c*g^5*l^2 - 16*a1*a3^2*b1*b3^2*c*g^6*l^2 - 12*a3^3*b3^3*c*g^6*l^2 + a3^2*b1^2*b3*c*g^7*l^2 + a1^2*a3*b3^2*c*g^7*l^2 + 4*a3^2*b3^2*c*g^8*l^2 - a1*a3^4*b1*b3^4*c^2*l*zt^2 + 3*a3^5*b3^5*c^2*l*zt^2 - a3^4*b1^2*b3^3*c^2*g*l*zt^2 - a1^2*a3^3*b3^4*c^2*g*l*zt^2 + 8*a1*a3^3*b1*b3^3*c^2*g^2*l*zt^2 - 5*a3^4*b3^4*c^2*g^2*l*zt^2 - 3*a3^3*b1^2*b3^2*c^2*g^3*l*zt^2 - 3*a1^2*a3^2*b3^3*c^2*g^3*l*zt^2 + a1*a3^2*b1*b3^2*c^2*g^4*l*zt^2 + a3^3*b3^3*c^2*g^4*l*zt^2 + a3^2*b3^2*c^2*g^6*l*zt^2 + 9*a1*a3^3*b1*b3^3*c*g^2*l^2*zt - 3*a3^3*b1^2*b3^2*c*g^3*l^2*zt - 3*a1^2*a3^2*b3^3*c*g^3*l^2*zt + a1*a3^2*b1*b3^2*c*g^4*l^2*zt - 4*a3^2*b3^2*c*g^6*l^2*zt - 4*a3^2*b3^2*g^6*l^3 + a1*a3^3*b1*b3^3*c*l^2*zt^2 + 3*a3^4*b3^4*c*l^2*zt^2 - a3^3*b3^3*c*g^2*l^2*zt^2 + a3^3*b3^3*c*l^2*zt^3 + a3^3*b3^3*l^3*zt^2)^2
In [60]:
eqzl/(eqzl.operands()[0])
Out[60]:
a3^3*b3^3*c^12*g^18
In [61]:
eq4zl=eqzl.operands()[0].operands()[0]

The final equation eq4lz has degree 3 in $\zeta$ and in $\lambda$

In [63]:
eq4zl.degree(zt)
Out[63]:
3
In [65]:
eq4zl.degree(l)
Out[65]:
3
In [ ]:
 
In [ ]:
 

The symmetric case (Section 5.3)¶

Equation in $(\zeta,\lambda)$ in the symmetric case¶

We specialize the parameters to be symmetric: a factor of degree 1 in $\zeta$ (and constant in $\lambda$) pops out in the equation on $\lambda, \zeta$, so that the actual equation is only of degree 2 in $\zeta$.

In [66]:
eq4zlsym=eq4zl.subs(b1=a1,b3=a3).factor()
In [67]:
eq4zlsym.number_of_operands()
Out[67]:
3
In [68]:
eq4zlsym.operands()[1]
Out[68]:
2*g^3 + a3*zt
In [69]:
eq4zlsym.operands()[2]
Out[69]:
a3
In [70]:
eqzlsym=eq4zlsym.operands()[0]
In [71]:
eqzlsym
Out[71]:
a1^6*a3^6*c^3 - 4*a1^6*a3^5*c^3*g - 6*a1^4*a3^7*c^3*g + 6*a1^6*a3^4*c^3*g^2 + 20*a1^4*a3^6*c^3*g^2 + 9*a1^2*a3^8*c^3*g^2 - 4*a1^6*a3^3*c^3*g^3 - 20*a1^4*a3^5*c^3*g^3 - 20*a1^2*a3^7*c^3*g^3 - 2*a3^9*c^3*g^3 + a1^6*a3^2*c^3*g^4 - 4*a1^2*a3^6*c^3*g^4 + 10*a1^4*a3^3*c^3*g^5 + 36*a1^2*a3^5*c^3*g^5 + 8*a3^7*c^3*g^5 - 4*a1^4*a3^2*c^3*g^6 - 18*a1^2*a3^4*c^3*g^6 - 12*a1^2*a3^3*c^3*g^7 - 12*a3^5*c^3*g^7 + 12*a1^2*a3^2*c^3*g^8 - 4*a1^2*a3*c^3*g^9 + 8*a3^3*c^3*g^9 + a1^2*c^3*g^10 - 2*a3*c^3*g^11 + a1^4*a3^6*c^3*zt - 2*a1^2*a3^8*c^3*zt + a3^10*c^3*zt - 4*a1^4*a3^5*c^3*g*zt + 4*a1^2*a3^7*c^3*g*zt + 6*a1^4*a3^4*c^3*g^2*zt + 2*a1^2*a3^6*c^3*g^2*zt - 4*a3^8*c^3*g^2*zt - 4*a1^4*a3^3*c^3*g^3*zt - 8*a1^2*a3^5*c^3*g^3*zt + a1^4*a3^2*c^3*g^4*zt + 2*a1^2*a3^4*c^3*g^4*zt + 6*a3^6*c^3*g^4*zt + 4*a1^2*a3^3*c^3*g^5*zt - 2*a1^2*a3^2*c^3*g^6*zt - 4*a3^4*c^3*g^6*zt + a3^2*c^3*g^8*zt - 6*a1^4*a3^5*c^2*g*l + 14*a1^4*a3^4*c^2*g^2*l + 18*a1^2*a3^6*c^2*g^2*l - 10*a1^4*a3^3*c^2*g^3*l - 28*a1^2*a3^5*c^2*g^3*l - 6*a3^7*c^2*g^3*l + 2*a1^4*a3^2*c^2*g^4*l + 12*a1^2*a3^3*c^2*g^5*l + 10*a3^5*c^2*g^5*l - 2*a1^2*a3^2*c^2*g^6*l - 2*a3^3*c^2*g^7*l - 2*a3*c^2*g^9*l - a1^2*a3^6*c^2*l*zt + 3*a3^8*c^2*l*zt - 2*a1^2*a3^5*c^2*g*l*zt + 8*a1^2*a3^4*c^2*g^2*l*zt - 5*a3^6*c^2*g^2*l*zt - 6*a1^2*a3^3*c^2*g^3*l*zt + a1^2*a3^2*c^2*g^4*l*zt + a3^4*c^2*g^4*l*zt + a3^2*c^2*g^6*l*zt + 9*a1^2*a3^4*c*g^2*l^2 - 8*a1^2*a3^3*c*g^3*l^2 - 6*a3^5*c*g^3*l^2 + a1^2*a3^2*c*g^4*l^2 + 2*a3^3*c*g^5*l^2 + a1^2*a3^4*c*l^2*zt + 3*a3^6*c*l^2*zt - a3^4*c*g^2*l^2*zt - 2*a3^3*c*g^3*l^2*zt - 2*a3^3*g^3*l^3 + a3^4*c*l^2*zt^2 + a3^4*l^3*zt
In [72]:
eqzlsym.degree(zt)
Out[72]:
2
In [73]:
eqzlsym.degree(l)
Out[73]:
3
In [ ]:
 

Rational parametrization for $(\zeta,\lambda)$¶

The discriminant of eqzlsym (as a quadratic polynomial in $\zeta$), seen as a polynomial in $\lambda$, has only 2 simple roots, and the rest are double roots. Thus, we can perform a Zhukovsky transformation

In [75]:
discr=(eqzlsym.coefficient(zt,1)^2-4*eqzlsym.coefficient(zt,0)*eqzlsym.coefficient(zt,2)).factor()
discr
Out[75]:
(a1*a3^2*c + a3^3*c - 2*a1*a3*c*g - a3^2*c*g + a1*c*g^2 - a3*c*g^2 + c*g^3 + a3*l)^2*(a1*a3^2*c - a3^3*c - 2*a1*a3*c*g + a3^2*c*g + a1*c*g^2 + a3*c*g^2 - c*g^3 - a3*l)^2*(a1^2*c + 2*a1*a3*c + a3^2*c + 2*a1*c*g + 2*a3*c*g + c*g^2 + l)*(a1^2*c - 2*a1*a3*c + a3^2*c - 2*a1*c*g + 2*a3*c*g + c*g^2 + l)*a3^4
In [76]:
dblpoles=discr.operands()[0].operands()[0]*discr.operands()[1].operands()[0]*a3^2
In [77]:
discr.operands()[2]
Out[77]:
a1^2*c + 2*a1*a3*c + a3^2*c + 2*a1*c*g + 2*a3*c*g + c*g^2 + l
In [78]:
ls1=l-discr.operands()[2]
discr.subs(l=ls1)
Out[78]:
0
In [79]:
ls2=l-discr.operands()[3]
discr.subs(l=ls2)
Out[79]:
0
In [80]:
var('H');
In [82]:
lH=(ls1+ls2)/2+(ls1-ls2)/4*(H+1/H)
lH.factor()
Out[82]:
-(H*a1 + a3 + g)*(H*a3 + H*g + a1)*c/H
In [83]:
smppoles=((ls1-ls2)/4*(H-1/H))

The symmetry $H\leftrightarrow \frac{1}{H}$ leaves $\lambda(H)$ unchanged and exchanges the two solutions to the quadratic equation in $\zeta$: we pick the convention that will give $\omega\to\infty$ for $H\to\infty$, which imposes the choice of $\zeta(H)$, which is zHp below

In [90]:
zHp=((-eqzlsym.coefficient(zt,1)+dblpoles*smppoles)/(2*eqzlsym.coefficient(zt,2))).subs(l=lH).full_simplify()
In [91]:
zHm=((-eqzlsym.coefficient(zt,1)-dblpoles*smppoles)/(2*eqzlsym.coefficient(zt,2))).subs(l=lH).full_simplify()
In [92]:
(lH/zHp).taylor(H,oo,0)
Out[92]:
-c
In [93]:
(lH/zHm).taylor(H,oo,0)
Out[93]:
-1/2*(a1*a3^2*c + a1*a3*c*g)*H/g^3 + 1/4*(9*a1^2*a3^2*c - 2*a3*c*g^3 + (a1^2 - 4*a3^2)*c*g^2 - 2*(4*a1^2*a3 + a3^3)*c*g)/g^4
In [ ]:
 

Rational parametrization for $(\omega,\widehat{f})$¶

The equation eqzf relating $\zeta$ to $\omega$ is a quadratic equation whose discriminant (which is quadratic in $\zeta$) is also amenable to a Zhukovsky transformation when $\zeta$ is replaced by $\zeta(H)$: we express $H$ as a rational function of the second Zhukovsky variable $h$, and thus the relevant root $\omega(h)$ of eqzf, as well as $\widehat{f}(h)=\lambda(H(h))/\omega(h)$, are rational functions of $h$.

In [95]:
disw=(eqzf.coefficient(w,1)^2-4*eqzf.coefficient(w,2)*eqzf.coefficient(w,0)).subs(b3=a3).factor()
In [96]:
dHp=disw.subs(zt=zHp).factor()
dHp
Out[96]:
(H*a1*a3 + H*a1*g + 4*a3*g)*(H*a1*a3 + 3*a3*g - g^2)^2*(H*a1*a3 + a3*g + g^2)^2*H*a1*(a3 + g)/(H*a1 + a3 + g)^4
In [101]:
dblpolew=dHp.operands()[1].operands()[0]*dHp.operands()[2].operands()[0]/(dHp.operands()[3].operands()[0])^2
dblpolew
Out[101]:
(H*a1*a3 + 3*a3*g - g^2)*(H*a1*a3 + a3*g + g^2)/(H*a1 + a3 + g)^2
In [97]:
var('h');
In [98]:
H1=(H-(dHp.operands()[0])/dHp.operands()[0].coefficient(H,1)).full_simplify()
dHp.operands()[0].subs(H=H1).full_simplify()
Out[98]:
0
In [99]:
H2=0
dHp.subs(H=H2)
Out[99]:
0
In [100]:
Hh=(H1+H2)/2+(H2-H1)/4*(h+1/h)
Hh.normalize()
Out[100]:
(a3*g*h^2 - 2*a3*g*h + a3*g)/((a1*a3 + a1*g)*h)
In [102]:
(dHp/(dblpolew^2)).subs(H=Hh).factor()
Out[102]:
a3^2*g^2*(h + 1)^2*(h - 1)^2/h^2
In [103]:
smppolew=a3*g*(h-1/h)
In [104]:
(smppolew^2).factor()
Out[104]:
a3^2*g^2*(h + 1)^2*(h - 1)^2/h^2
In [105]:
sqdiswh=smppolew*dblpolew.subs(H=Hh)
In [ ]:
 

The rational parametrization of $\omega,\widehat{f}$ for symmetric Ising quadrangulations:

We pick the solution whb of $\zeta(\omega)=\zeta(H(h))$, that satisfies $\omega\to\infty$ when $h \to \infty$

In [106]:
whb=((-eqzf.coefficient(w,1).subs(zt=zHp,b3=a3).subs(H=Hh)-sqdiswh)/(2*eqzf.coefficient(w,2).subs(zt=zHp,b3=a3).subs(H=Hh))).factor()
In [107]:
whb
Out[107]:
(a3*h + g)^2*g^3*h/((g*h + a3)^2*a3)
In [108]:
fhhb=(lH.subs(H=Hh)/whb).factor()
fhhb
Out[108]:
-(a3*g*h^2 + a1^2*h - 2*a3*g*h + a3*g)*(g*h + a3)^3*c/((a3*h + g)*g^4*(h - 1)^2*h^2)
In [ ]:
 

Non-corationality of $(\omega,\widehat{f})$ and $(x,y)$ when imposing the "kernel relation" $\omega\widehat{f}=-cxy$¶

We write the algebraic relation $\lambda(H)=-c\xi(Z)$ with $x(z)y(z)=\xi(z^2)$: if we could have a joint rational parametrization of $(\omega,\hat{f}(\omega))$ and $x,Y(x)$, then necessarily this relation on $H$ and $Z$ would correspond to a rational curve (i.e. would admit a rational parametrization), since the parametrizations in $h$ and $z$ are proper.

In [109]:
eqHz=(lH+c*(xparam*yparam).subs(b1=a1,b3=a3)).numerator().factor()
eqHz
Out[109]:
(H*a3*g*z^8 + H*a1*a3*z^6 + H*a1*g*z^6 - H^2*a1*a3*z^4 - H^2*a1*g*z^4 - 2*H*a3*g*z^4 - a1*a3*z^4 - a1*g*z^4 + H*a1*a3*z^2 + H*a1*g*z^2 + H*a3*g)*c
In [110]:
var('Z');
eqHZ=eqHz.subs(z=Z^(1/2)).factor()
In [111]:
eqHZ
Out[111]:
(H*Z^4*a3*g - H^2*Z^2*a1*a3 + H*Z^3*a1*a3 - H^2*Z^2*a1*g + H*Z^3*a1*g - 2*H*Z^2*a3*g + H*Z*a1*a3 - Z^2*a1*a3 + H*Z*a1*g - Z^2*a1*g + H*a3*g)*c
In [112]:
discHZ=(eqHZ.coefficient(H,1)^2-4*eqHZ.coefficient(H,0)*eqHZ.coefficient(H,2)).factor()
discHZ
Out[112]:
(Z^2*a3*g + Z*a1*a3 + Z*a1*g + 2*Z*a3*g + a3*g)*(Z^2*a3*g + Z*a1*a3 + Z*a1*g - 2*Z*a3*g + a3*g)*(Z + 1)^2*(Z - 1)^2*c^2
In [113]:
solve((Z^2*a3*g + Z*a1*a3 + Z*a1*g + 2*Z*a3*g + a3*g)*(Z^2*a3*g + Z*a1*a3 + Z*a1*g - 2*Z*a3*g + a3*g),Z)
Out[113]:
[Z == -1/2*(a1*a3 + (a1 + 2*a3)*g + sqrt(a1^2*a3^2 + (a1^2 + 4*a1*a3)*g^2 + 2*(a1^2*a3 + 2*a1*a3^2)*g))/(a3*g),
 Z == -1/2*(a1*a3 + (a1 + 2*a3)*g - sqrt(a1^2*a3^2 + (a1^2 + 4*a1*a3)*g^2 + 2*(a1^2*a3 + 2*a1*a3^2)*g))/(a3*g),
 Z == -1/2*(a1*a3 + (a1 - 2*a3)*g + sqrt(a1^2*a3^2 + (a1^2 - 4*a1*a3)*g^2 + 2*(a1^2*a3 - 2*a1*a3^2)*g))/(a3*g),
 Z == -1/2*(a1*a3 + (a1 - 2*a3)*g - sqrt(a1^2*a3^2 + (a1^2 - 4*a1*a3)*g^2 + 2*(a1^2*a3 - 2*a1*a3^2)*g))/(a3*g)]
In [ ]:
 
In [ ]:
 
In [ ]: