Skip to content

Commit

Permalink
update Quasimodularity
Browse files Browse the repository at this point in the history
  • Loading branch information
blociss committed Oct 30, 2024
1 parent 806d4e8 commit 128a2fd
Show file tree
Hide file tree
Showing 10 changed files with 192 additions and 49 deletions.
1 change: 0 additions & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,4 @@ version = "0.1.1"
[deps]
Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
Nemo = "2edaba10-b0f1-5616-af89-8c11ac63239a"
Revise = "295af30f-e4ad-537b-8983-00126c2a3abe"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
4 changes: 2 additions & 2 deletions docs/make.jl
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ makedocs(;
#"Quasimodular" =>"Feynman Integral/Feynman.md"
"Quasimodular" =>[
"quasimodular.md",
"quasimodular_psi.md"
]
"quasimodular_psi.md",
],
],
)

Expand Down
37 changes: 22 additions & 15 deletions docs/src/quasimodular.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ Consider the Caterpillar 3 graph

![alt text](img/Cartepillar3.png)

We define first a polynomial ring in one variable $q$.

```jldoctest quasi
julia> R,q=polynomial_ring(QQ,["q"])
(Multivariate polynomial ring in 1 variable over QQ, Nemo.QQMPolyRingElem[q])
```

```jldoctest quasi
julia> G = FeynmanGraph([(1, 3), (1, 2), (1, 2), (2, 4), (3, 4), (3,4)] )
FeynmanGraph([(1, 3), (1, 2), (1, 2), (2, 4), (3, 4), (3, 4)])
Expand All @@ -42,29 +49,30 @@ julia> F=FeynmanIntegral(G)
FeynmanIntegral(FeynmanGraph([(1, 3), (1, 2), (1, 2), (2, 4), (3, 4), (3, 4)]), Dict{Symbol, Dict{Vector{Int64}, Nemo.QQMPolyRingElem}}(), (Multivariate polynomial ring in 14 variables over QQ, Nemo.QQMPolyRingElem[x[1], x[2], x[3], x[4]], Nemo.QQMPolyRingElem[q[1], q[2], q[3], q[4], q[5], q[6]], Nemo.QQMPolyRingElem[z[1], z[2], z[3], z[4]]))
```

We compute the sum of all Feynman Integral of degree up to 6.

We compute the sum of all Feynman Integral of degree up to $m=\text{number\_of\_monomials}(\text{weightmax}) $
where weightmax$=6g-6$ where $g$ is the genus of the graph .
Here $g=3$ so weightmax$=6g-6=12$

```jldoctest quasi
julia> Iq=substitute(feynman_integral_degree_sum(F,6))
886656*q[1]^12 + 182272*q[1]^10 + 25344*q[1]^8 + 1792*q[1]^6 + 32*q[1]^4
julia> weightmax=12;
```

To express the Feynman Integral Iq in term of Eisenstein series $E_2, E_4, E_6$, we define a polynomial ring in q

```jldoctest quasi
julia> R,q=polynomial_ring(QQ,["q"])
(Multivariate polynomial ring in 1 variable over QQ, Nemo.QQMPolyRingElem[q])
```
julia> m = number_of_monomial(weightmax)
22
```
Since $m=22$, we need to compute the Feynman integral degree sum up to at least degree $m=22$. This results in Iq=substitute(feynman_integral_degree_sum(F,m)).
We get Iq as following
```jldoctest quasi
julia> Iqq=886656*q[1]^12 + 182272*q[1]^10 + 25344*q[1]^8 + 1792*q[1]^6 + 32*q[1]^4
886656*q^12 + 182272*q^10 + 25344*q^8 + 1792*q^6 + 32*q^4
julia> Iq=61425005056*q[1]^46+43646419584*q[1]^44+29331341312*q[1]^42+20067375616*q[1]^40 + 12961886976*q[1]^38 + 8490271392*q[1]^36 + 5225373696*q[1]^34 + 3233267712*q[1]^32 + 1875116544*q[1]^30 + 1079026432*q[1]^28 + 577972224*q[1]^26 + 302347264*q[1]^24 + 145337600*q[1]^22 + 66497472*q[1]^20 + 27353088*q[1]^18 + 10246144*q[1]^16 + 3294720*q[1]^14 + 886656*q[1]^12 + 182272*q[1]^10 + 25344*q[1]^8 + 1792*q[1]^6 + 32*q[1]^4;
```

we compute quasimodular form of Iq :
We can now express the Feynman Integral Iq in term of Eisenstein series $E_2, E_4, E_6$ by call the quasimodular form of Iq :

```jldoctest quasi
julia> quasimodular_form(Iqq,12)
julia> quasimodularity_form(Iq,weightmax)
(1//93312, -3*E2^6 + 6*E2^4*E4 + 4*E2^3*E6 - 3*E2^2*E4^2 - 12*E2*E4*E6 + 4*E4^3 + 4*E6^2)
```

Expand All @@ -74,7 +82,7 @@ Consider the Star graph $K_ {1,3}$ .

![alt text](img/star_graph.png)

We want to find the quasimodular form of the sum of Feynman Integral $Iq$ up to degree 6.
We want to find the quasimodular form of the sum of Feynman Integral $Iq$ up to degree 22.

We define first a polynomial ring in one variable $q$.

Expand All @@ -86,8 +94,7 @@ julia> R,q=polynomial_ring(QQ,["q"])
The sum of Feynman Integral up to degree 6 is:

```jldoctest form
julia> Iq= 843264*q[1]^12 + 165888*q[1]^10 + 20736*q[1]^8 + 1152*q[1]^6
843264*q^12 + 165888*q^10 + 20736*q^8 + 1152*q^6
julia> Iq=67007616768*q[1]^46+47407680000*q[1]^44+31871766528*q[1]^42+21710052864*q[1]^40 + 14037577344*q[1]^38 + 9136115712*q[1]^36 + 5629741056*q[1]^34 + 3459760128*q[1]^32 + 2005675776*q[1]^30 + 1145207808*q[1]^28 + 612956160*q[1]^26 + 317058048*q[1]^24 + 152150400*q[1]^22 + 68594688*q[1]^20 + 28035072*q[1]^18 + 10285056*q[1]^16 + 3255552*q[1]^14 + 843264*q[1]^12 + 165888*q[1]^10 + 20736*q[1]^8 + 1152*q[1]^6;
```

The quasimodular form of $Iq$ is then:
Expand Down
25 changes: 17 additions & 8 deletions docs/src/quasimodular_psi.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,27 +32,34 @@ Consider the Graph with vertex contribution

```jldoctest quasi
julia> G = FeynmanGraph( [(1, 2), (2, 3), (3, 1)])
FeynmanGraph( [(1, 2), (2, 3), (3, 1)])
FeynmanGraph([(1, 2), (2, 3), (3, 1)])
```

We then define the FeynmanIntegral type.

```jldoctest quasi
julia> F=FeynmanIntegral(G)
FeynmanIntegral(FeynmanGraph( [(1, 2), (2, 3), (3, 1)]), Dict{Symbol, Dict{Vector{Int64}, Nemo.QQMPolyRingElem}}(), (Multivariate polynomial ring in 9 variables over QQ, Nemo.QQMPolyRingElem[x[1], x[2], x[3]], Nemo.QQMPolyRingElem[q[1], q[2], q[3]], Nemo.QQMPolyRingElem[z[1], z[2],z[3]]))
FeynmanIntegral(FeynmanGraph([(1, 2), (2, 3), (3, 1)]), Dict{Symbol, Dict{Vector{Int64}, Nemo.QQMPolyRingElem}}(), (Multivariate polynomial ring in 9 variables over QQ, Nemo.QQMPolyRingElem[x[1], x[2], x[3]], Nemo.QQMPolyRingElem[q[1], q[2], q[3]], Nemo.QQMPolyRingElem[z[1], z[2], z[3]]))
```

We compute the sum of all Feynman Integral of degree up to $m=\text{number\_of\_monomials}(\text{weightmax}) $
where weightmax$=2(r+\sum_{i=1}^{n} g_i)$ with $r$ the number of edges and $g_i$ satifying $h^1(\Gamma)+\sum_{i=1}^{n} g_i=g$ .
Suppose $gg=[1,0,0]$, we have r=3; so
weightmax$=2(3+1)=8$

```jldoctest quasi
julia> g =[1,0,0];
```
```jldoctest quasi
julia> weightmax=8;
julia> m=number_of_monomials(weightmax)
10
```

```jldoctest quasi
julia> m = number_of_monomial(weightmax)
10
```


We computed then the Feynman Integral sum up to the degree $m=10$

```jldoctest quasi
Expand All @@ -77,14 +84,14 @@ Consider the Graph with loop at the vertex 1 .

```jldoctest quasi
julia> G = FeynmanGraph( [(1, 1),(1, 2), (2, 3), (3, 1)])
FeynmanGraph( [(1, 2), (2, 3), (3, 1)])
FeynmanGraph([(1, 1), (1, 2), (2, 3), (3, 1)])
```

We then define the FeynmanIntegral type.

```jldoctest quasi
julia> F=FeynmanIntegral(G)
FeynmanIntegral(FeynmanGraph( [(1, 1),(1, 2), (2, 3), (3, 1)]), Dict{Symbol, Dict{Vector{Int64}, Nemo.QQMPolyRingElem}}(), (Multivariate polynomial ring in 10 variables over QQ, Nemo.QQMPolyRingElem[x[1], x[2], x[3]], Nemo.QQMPolyRingElem[q[1], q[2], q[3], q[4]], Nemo.QQMPolyRingElem[z[1], z[2],z[3]]))
FeynmanIntegral(FeynmanGraph([(1, 1), (1, 2), (2, 3), (3, 1)]), Dict{Symbol, Dict{Vector{Int64}, Nemo.QQMPolyRingElem}}(), (Multivariate polynomial ring in 10 variables over QQ, Nemo.QQMPolyRingElem[x[1], x[2], x[3]], Nemo.QQMPolyRingElem[q[1], q[2], q[3], q[4]], Nemo.QQMPolyRingElem[z[1], z[2], z[3]]))
```

We compute the sum of all Feynman Integral of degree up to $m=\text{number\_of\_monomials}(\text{weightmax}) $.
Expand All @@ -93,7 +100,10 @@ weightmax$=2(4+0)=8$.

```jldoctest quasi
julia> weightmax=8;
julia> m=number_of_monomials(weightmax)
```

```jldoctest quasi
julia> m=number_of_monomial(weightmax)
10
```

Expand All @@ -112,4 +122,3 @@ we compute quasimodular form of Iq :
julia> quasimodularity_form(Iq,weightmax)
(1//6912, E2^4 - E2^3 - 3*E2^2*E4 + 3*E2*E4 + 2*E2*E6 - 2*E6)
```

120 changes: 120 additions & 0 deletions quasimodular_pcopy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
```@meta
CurrentModule = GromovWitten
DocTestSetup = quote
using GromovWitten
end
```

# Quasimodular

In this module, we compute the solution of the system $Ax=b$, where $A$ is a matrix from homogeneous Eisenstein series $E_2, E_4, E_6$ and $b$
from the Feynman Integral $I(q)$
The solution is of the form (factor, coefficients) where coefficients is a vector of rationals numbers.
Given a Feynman Integral

```math
I(q)=\sum_{n=1}^{d} a_i q^{d},
```

we compute the coefficients $b_{i,j,k}$ such that

```math
I(q)=\sum_{\substack{i,j,k \in \mathbb{N}_0 \\ 2i+4j+6k=d}} b_{i,j,k} E_2^i E_4^j E_6^k
```

## Example

### Graph with vertex contribution

Consider the Graph with vertex contribution

![alt text](img/graph_with_vertex1.png)

```jldoctest quasi
julia> G = FeynmanGraph( [(1, 2), (2, 3), (3, 1)])
FeynmanGraph([(1, 2), (2, 3), (3, 1)])
```

We then define the FeynmanIntegral type.

```jldoctest quasi
julia> F=FeynmanIntegral(G)
FeynmanIntegral(FeynmanGraph([(1, 2), (2, 3), (3, 1)]), Dict{Symbol, Dict{Vector{Int64}, Nemo.QQMPolyRingElem}}(), (Multivariate polynomial ring in 9 variables over QQ, Nemo.QQMPolyRingElem[x[1], x[2], x[3]], Nemo.QQMPolyRingElem[q[1], q[2], q[3]], Nemo.QQMPolyRingElem[z[1], z[2], z[3]]))
```

We compute the sum of all Feynman Integral of degree up to $m=\text{number\_of\_monomials}(\text{weightmax}) $
where weightmax$=2(r+\sum_{i=1}^{n} g_i)$ with $r$ the number of edges and $g_i$ satifying $h^1(\Gamma)+\sum_{i=1}^{n} g_i=g$ .
Suppose $gg=[1,0,0]$, we have r=3; so
weightmax$=2(3+1)=8$

```jldoctest quasi
julia> weightmax=8;
```

```jldoctest quasi
julia> m = number_of_monomial(weightmax)
10
```


We computed then the Feynman Integral sum up to the degree $m=10$

```jldoctest quasi
julia> Iq=substitute(feynman_integral_degree_sum(F, m,g))
56250*q[1]^20 + 121581//4*q[1]^18 + 18480*q[1]^16 + 8330*q[1]^14 + 4428*q[1]^12 + 3075//2*q[1]^10 + 556*q[1]^8 + 117*q[1]^6 + 15*q[1]^4 + 1//4*q[1]^2
```

We can now express the Feynman Integral Iq in term of Eisenstein series $E_2, E_4, E_6$ by call the

we compute quasimodular form of Iq :

```jldoctest quasi
julia> quasimodularity_form(Iq,weightmax)
(1//6912, E2^3 + 2*E2^2*E4 - 3*E2*E4 - 4*E2*E6 + 2*E4^2 + 2*E6)
```

### Graph with loop at the vertex 1

Consider the Graph with loop at the vertex 1 .

![alt text](img/graph_loop.png)

```jldoctest quasi
julia> G = FeynmanGraph( [(1, 1),(1, 2), (2, 3), (3, 1)])
FeynmanGraph( [(1, 2), (2, 3), (3, 1)])
```

We then define the FeynmanIntegral type.

```jldoctest quasi
julia> F=FeynmanIntegral(G)
FeynmanIntegral(FeynmanGraph( [(1, 1),(1, 2), (2, 3), (3, 1)]), Dict{Symbol, Dict{Vector{Int64}, Nemo.QQMPolyRingElem}}(), (Multivariate polynomial ring in 10 variables over QQ, Nemo.QQMPolyRingElem[x[1], x[2], x[3]], Nemo.QQMPolyRingElem[q[1], q[2], q[3], q[4]], Nemo.QQMPolyRingElem[z[1], z[2],z[3]]))
```

We compute the sum of all Feynman Integral of degree up to $m=\text{number\_of\_monomials}(\text{weightmax}) $.
Here $gg=[0,0,0]$, and r=4; so
weightmax$=2(4+0)=8$.

```jldoctest quasi
julia> weightmax=8;
julia> m=number_of_monomial(weightmax)
10
```

We computed then the Feynman Integral sum up to the degree $m=10$

```jldoctest quasi
julia> Iq=substitute(feynman_integral_degree_sum(F, m))
67500*q[1]^20 + 36774*q[1]^18 + 20640*q[1]^16 + 9996*q[1]^14 + 4320*q[1]^12 + 1650*q[1]^10 + 456*q[1]^8 + 90*q[1]^6 + 6*q[1]^4
```

We can now express the Feynman Integral Iq in term of Eisenstein series $E_2, E_4, E_6$ by call the

we compute quasimodular form of Iq :

```jldoctest quasi
julia> quasimodularity_form(Iq,weightmax)
(1//6912, E2^4 - E2^3 - 3*E2^2*E4 + 3*E2*E4 + 2*E2*E6 - 2*E6)
```

2 changes: 1 addition & 1 deletion src/GromovWitten.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module GromovWitten
using Nemo

import Combinatorics: permutations
export number_of_monomial
export next_partition, combination
export count_member
export cache_integral_result
Expand Down Expand Up @@ -59,7 +60,6 @@ export substitute
export sum_of_coeff
export sum_of_divisor_powers
export vector_to_monomial
export number_of_monomials
include("graph.jl")
include("coeftermV.jl")
include("coefterm.jl")
Expand Down
18 changes: 18 additions & 0 deletions src/graph.jl
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,21 @@ end
function feynman_integral(G::FeynmanGraph)
return FeynmanIntegral(G)
end


function number_of_monomial(weightmax)
w = [2, 4, 6]
count = 0
for e2 in 0:weightmax
for e4 in 0:weightmax
for e6 in 0:weightmax
degree = w[1] * e2 + w[2] * e4 + w[3] * e6
if 0 < degree <= weightmax
count += 1
end
end
end
end

return count
end
17 changes: 0 additions & 17 deletions src/quasimodular.jl
Original file line number Diff line number Diff line change
@@ -1,21 +1,4 @@

function number_of_monomials(weightmax)
w = [2, 4, 6]
count = 0
for e2 in 0:weightmax
for e4 in 0:weightmax
for e6 in 0:weightmax
degree = w[1] * e2 + w[2] * e4 + w[3] * e6
if 0 < degree <= weightmax
count += 1
end
end
end
end

return count
end

#=function filter_term(pols::Union{QQMPolyRingElem, Int64}, variables::Vector{QQMPolyRingElem}, power::Vector{Int64})
T = parent(variables[1])
if typeof(pols) <: Integer
Expand Down
6 changes: 3 additions & 3 deletions test/quasimod.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@testset "quasimod.jl" begin
w = [2, 4, 6]
d = 12
@test number_of_monomials( d) == 22
@test number_of_monomial( d) == 22
import Nemo: QQFieldElem
S, (E2, E4, E6) = polynomial_ring(QQ, ["E2", "E4", "E6"])
R, q = polynomial_ring(QQ, ["q"])
Expand Down Expand Up @@ -114,7 +114,7 @@

F = FeynmanIntegral(ve)
weightmax=12
m=number_of_monomials(6)
m=number_of_monomial(6)
Iq=61425005056*q[1]^46+43646419584*q[1]^44+29331341312*q[1]^42+20067375616*q[1]^40 + 12961886976*q[1]^38 + 8490271392*q[1]^36 + 5225373696*q[1]^34 + 3233267712*q[1]^32 + 1875116544*q[1]^30 + 1079026432*q[1]^28 + 577972224*q[1]^26 + 302347264*q[1]^24 + 145337600*q[1]^22 + 66497472*q[1]^20 + 27353088*q[1]^18 + 10246144*q[1]^16 + 3294720*q[1]^14 + 886656*q[1]^12 + 182272*q[1]^10 + 25344*q[1]^8 + 1792*q[1]^6 + 32*q[1]^4
result=quasimodular_form(Iq,weightmax)
@test result == expected_result
Expand All @@ -126,7 +126,7 @@

F = FeynmanIntegral(ve)
weightmax=6
m=number_of_monomials(6)
m=number_of_monomial(6)
Iq=substitute(feynman_integral_degree_sum(F, m))
result=quasimodularity_form(Iq,weightmax)
@test result == expected_result
Expand Down
11 changes: 9 additions & 2 deletions z_install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ ve = [(1, 2), (1, 2), (1, 2)]

F = FeynmanIntegral(ve)
weightmax=6
m=number_of_monomials(6)
m=number_of_monomial(6)
Iq=substitute(feynman_integral_degree_sum(F, m))
quasimodular_form(Iq,weightmax)
quasimodularity_form(Iq,weightmax)

$ julia --project=docs/
pkg> instantiate
pkg> dev .
pkg> up
julia> include("docs/make.jl")
julia> include("test/runtests.jl")

0 comments on commit 128a2fd

Please sign in to comment.