#!/usr/bin/env python
# coding: utf-8
# ## The differential equation for the two-loop Ice-cream cone integral in general dimensions
# \begin{equation}
# \omega(t)= {\textbf{U}\over
# \textbf{F}^2} \left(\textbf{U}^3\over \textbf{F}^2\right)^{\epsilon}
# \end{equation}
#
# with
# \begin{align}
# \textbf{U}&:=(y_1+y_2)(x_1+z)+zx_1,\cr
# \textbf{V}&:=k_2^2y_1y_2(z+x_1)+zx_1(k_1^2y_1+k_3^2y_2),\\
# \nonumber \textbf{F}&:= (\mu_1^2y_1+\mu_2^2y_2^2+m_1^2x_1+m_2^2z)\textbf{U}-t \textbf{V}.
# \end{align}
#
# In this worksheet we present some numerical cases for the $\epsilon$-dependent differential operator with respect to $t$ for the ice-cream cone graph
# This is the generic two-loop Ice-cream cone differential equation with $\epsilon=0$ derived in [arXiv:2209.10962](https://arxiv.org/abs/2209.10962) and [arXiv:2302.14840](https://arxiv.org/abs/2302.14840)
# The differential operator is
# $$\textrm{PFIceCreamCoefficient}[2]\,Dt^2+\textrm{PFIceCreamCoefficient}[1]\,Dt+\textrm{PFIceCreamCoefficient}[0]$$
# In[1]:
PFIceCreamCoefficient = dict()
with open("PFIcecream-Coefficients.txt") as f:
for e in f.read().replace("\n", "").split(";"):
if e:
name, expr = e.split(":=")
name = name.strip()
expr = SR(expr)
if name[0] == "c":
PFIceCreamCoefficient[int(name[1:])] = expr
# In[2]:
from ore_algebra import *
OA, t, Dt = DifferentialOperators(QQ, 't')
# In[3]:
Dt,t,epsilon= var('Dt t epsilon')
# The all equal parameters $m_1=m_2=\mu_1=\mu_2=k_1^2=k_2^2=k_3^2=1$
# In[4]:
PFAllEqual=dict()
PFAllEqual[0]=(-24*t^3+38*t^4-16*t^5+2*t^6)*Dt^3+(-60*t^2+206*t^3-132*t^4+22*t^5)*Dt^2+(178*t^2-232*t^3+58*t^4)*Dt+(-64*t^2+32*t^3)
PFAllEqual[1]=(-12*t^3+7*t^4+11*t^5-7*t^6+t^7)*Dt^3+(18*t^2+95*t^3-26*t^4-37*t^5+10*t^6)*Dt^2+(48*t+53*t^2-242*t^3+5*t^4+24*t^5)*Dt+(-12-48*t-112*t^2+64*t^3+12*t^4)
PFAllEqual[2]=(24*t^2+29*t^3-17*t^4-17*t^5+5*t^6)*Dt^2+(-71*t^2-130*t^3-23*t^4+28*t^5)*Dt+(-18-64*t-48*t^2+56*t^3+26*t^4)
PFAllEqual[3]=(-12*t-40*t^2-36*t^3+8*t^5)*Dt+(-6-12*t+12*t^2+36*t^3+18*t^4)
PFAllEqual[4]=4*t + 12*t^2 + 12*t^3 + 4*t^4
# In[5]:
facPFAllEqual0=OA(PFAllEqual[0]).factor()
[x.order() for x in facPFAllEqual0]
# In[7]:
PFnum=(PFIceCreamCoefficient[2]*Dt^2+PFIceCreamCoefficient[1]*Dt+PFIceCreamCoefficient[0]).subs(m1=1,m2=1,m3=1,m4=1,p12=1,p22=1,p32=1)
# In[8]:
facPFnum=OA(PFnum).factor()
[x.order() for x in facPFnum]
# In[9]:
facPFAllEqual0[2]-9*facPFnum[1]
# In[10]:
18*OA((t-1)^2)*OA((t-3)^2)*facPFAllEqual0[1]-facPFnum[0]
# The all equal mass case $m_1=m_2=\mu_1=\mu_2=1$ with $|k_1|=3$, $|k_2|=83$ and $|k_3|=71$
# In[11]:
PF2IceCreamAllEqualMass=dict()
with open("PFIceCream-All-Equal-Mass.txt") as f:
for e in f.read().replace("\n", "").replace(" PF","PF").split(";"):
if e:
name, expr = e.split(" := ")
if name[0] == "P":
_,num=name.split("PF")
print("loading epsilon order", num)
PF2IceCreamAllEqualMass[int(num)] = SR(expr)
# In[12]:
[OA(PF2IceCreamAllEqualMass[i]).order() for i in range(5)]
# In[13]:
facPF2IceCreamAllEqualMass=OA(PF2IceCreamAllEqualMass[0]).factor()
[x.order() for x in facPF2IceCreamAllEqualMass]
# In[14]:
exp1=facPF2IceCreamAllEqualMass[1].leading_coefficient()
# In[15]:
exp2=PFIceCreamCoefficient[2].subs(m1=1,m2=1,m3=1,m4=1,p12=3^2,p22=83^2,p32=71^2)
# In[15]:
norm=(exp1/exp2).simplify_rational()
# In[16]:
PFnum=(PFIceCreamCoefficient[2]*Dt^2+PFIceCreamCoefficient[1]*Dt+PFIceCreamCoefficient[0]).subs(m1=1,m2=1,m3=1,m4=1,p12=3^2,p22=83^2,p32=71^2)
# In[90]:
facPF2IceCreamAllEqualMass[1]-OA(norm*PFnum)
# The all equal scoop mass case $m_1=m_2=1$ with $\mu_1=59$, $\mu_2=5$, $|k_1|=89$, $|k_2|=2$ and $|k_3|=11$
# In[33]:
PF2IceCreamScoopEqualMass=dict()
with open("PFIceCream-Scoop-Equal-Mass.txt") as f:
for e in f.read().replace("\n", "").replace(" PF","PF").split(";"):
if e:
name, expr = e.split(" := ")
if name[0] == "P":
_,num=name.split("PF")
print("loading epsilon order", num)
PF2IceCreamScoopEqualMass[int(num)] = SR(expr)
# In[34]:
[OA(PF2IceCreamScoopEqualMass[i]).order() for i in range(5)]
# In[93]:
facPF2IceCreamScoopEqualMass=OA(PF2IceCreamScoopEqualMass[0]).factor()
[x.order() for x in facPF2IceCreamScoopEqualMass]
# In[104]:
exp1=facPF2IceCreamScoopEqualMass[1].leading_coefficient()
exp2=PFIceCreamCoefficient[2].subs(m3=1,m4=1,m1=sqrt(59),m2=sqrt(5),p12=89^2,p22=2^2,p32=11^2)
norm=(exp1/exp2).simplify_rational(); norm
# In[109]:
PFnum=(PFIceCreamCoefficient[2]*Dt^2+PFIceCreamCoefficient[1]*Dt+PFIceCreamCoefficient[0]).subs(m3=1,m4=1,m1=sqrt(59),m2=sqrt(5),p12=89^2,p22=2^2,p32=11^2).expand()
# In[110]:
facPF2IceCreamScoopEqualMass[1]-OA(norm*PFnum)
# Generic mass configuration $|k_1|=43$, $|k_2|=5$, $|k_3|=89$, $\mu_1=53$, $\mu_2=23$, $m_1=7$ and $m_2=47$
# In[35]:
PF2IceCreamGeneric=dict()
with open("PFIceCream-Generic.txt") as f:
for e in f.read().replace("\n", "").replace(" PF","PF").split(";"):
if e:
name, expr = e.split(" := ")
if name[0] == "P":
_,num=name.split("PF")
print("loading epsilon order", num)
PF2IceCreamGeneric[int(num)] = SR(expr)
# In[36]:
[OA(PF2IceCreamGeneric[i]).order() for i in range(5)]
# This is the factorisation of the $\epsilon^0$ term
# In[7]:
facPF2IceCreamGeneric=OA(PF2IceCreamGeneric[0]).factor(verbose=True)
# In[8]:
[x.order() for x in facPF2IceCreamGeneric]
# In[128]:
#19, 7, 5, 61, 31, 61, 31
# In[134]:
exp1=facPF2IceCreamGeneric[2].leading_coefficient()
exp2=PFIceCreamCoefficient[2].subs(m3=61,m4=31,m1=sqrt(61),m2=sqrt(31),p12=19^2,p22=7^2,p32=5^2)
norm=(exp1/exp2).simplify_rational(); norm
# In[137]:
PFnum=(PFIceCreamCoefficient[2]*Dt^2+PFIceCreamCoefficient[1]*Dt+PFIceCreamCoefficient[0]).subs(m3=61,m4=31,m1=sqrt(61),m2=sqrt(31),p12=19^2,p22=7^2,p32=5^2).expand()
# In[139]:
facPF2IceCreamGeneric[2]-OA(norm*PFnum)