Automate the code for Topological recursion
Let me start by giving a brief idea of the recursion. This recursion generate bunch of meromorphic function, and the recursion depend on two variables. Let call the variable g,n. Let me state the recursion Wg,n(z1,…zn)=Resz=0(Wg−1,n+1(z,−z,z2,…,zn))+∑g1+g2=g∑n1+n2=n+1Wg1,n1(z,Part1)Wg2,n2(−z,Part2) where Part1 and Part2 are disjoint set whose unioun is z2,…,zn The recursion is on Euler characteristics, so Euler characteristics on the LHS is 2g−2+n and on the RHS notice that for all the tuples g′,n′ , 2g′−2+n′<2g−2+n.
This is continuation of the post I made, we have few examples of computation here of the above definition. https://ask.sagemath.org/question/626...
var('b,z1,z2,z3');
def y(z):
return 2*arcsinh( z / (sqrt(2)*b) ) / sqrt(z^2 + 2*b^2)
def K(z):
return 1 / z / (y(z) - y(-z))
def W02(z1, z2):
return 1 / (z1 - z2)^2
def W03(z1, z2, z3):
var('w03') # use w03 only locally inside this function
E = ( K(w03) / (w03 - z1) \
* ( W02(w03, z2) * W02(-w03, z3) +
W02(w03, z3) * W02(-w03, z2) )
)
return E.residue(w03 == 0).canonicalize_radical()
def W11(z1):
var('w11') # use w11 only locally inside this function
E = K(w11) / (w11 - z1) * W02(w11, -w11)
return E.residue(w11 == 0).canonicalize_radical()
def W12(z1, z2):
var('w12') # use w only locally inside this function
E = ( K(w12) / (w12 - z1) \
* ( W03(w12, -w12, z2)
+ W02( w12, z2) * W11(-w12)
+ W02(-w12, z2) * W11( w12) )
)
return E.residue(w12 == 0).canonicalize_radical()
I want to automatise the above code, so I wrote a pseudo code, if someone can help me to complete it. My code goes as follows
var('b,z1,z2,z3')
def y(z):
return 2*arcsinh( z / (sqrt(2)*b) ) / sqrt(z^2 + 2*b^2)
def K(z):
return 1 / z / (y(z) - y(-z))
def W02(0,2,L):
return 1/(L[0]-L[1])**2
def W(g,n,L):
z,z1=var('z,z1')
P=[var('z_%d' % i) for i in range(2,n+1)] # Set of variable for {z2, \ldots zn}
E = 0
for parts in Partitions(n+1,2):
for par in SetPartitions(P, 2):
E = E + W(g,par[0], par.append(z)) * W(0, par[1].append(-z))
if g > 0:
E = E + W(g-1,n+,L.append(z,-z))
return (K(z)*E).residue(z == 0).canonicalize_radical()
I did not read in details but
W(g,par[0], par.append(z))
cought my eye. Note thatpar.aapend(z)
evaluates toNone
, whileW()
seems to expect a list as a third argument. Perhaps, you wantpar+[z]
rather thanpar.append(z)
here.