Skip to content

Commit b21bffb

Browse files
committed
implement E_polynomial of hypergeometric motive
1 parent 3dd953c commit b21bffb

File tree

1 file changed

+66
-2
lines changed

1 file changed

+66
-2
lines changed

src/sage/modular/hypergeometric_motive.py

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
from sage.combinat.integer_vector_weighted import WeightedIntegerVectors
6666
from sage.functions.generalized import sgn
6767
from sage.functions.log import log
68-
from sage.functions.other import floor, ceil
68+
from sage.functions.other import floor, ceil, frac
6969
from sage.misc.cachefunc import cached_method
7070
from sage.misc.functional import cyclotomic_polynomial
7171
from sage.misc.misc_c import prod
@@ -74,14 +74,15 @@
7474
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing
7575
from sage.rings.integer_ring import ZZ
7676
from sage.rings.padics.padic_generic_element import gauss_table
77-
from sage.rings.polynomial.polynomial_ring import polygen
77+
from sage.rings.polynomial.polynomial_ring import polygen, polygens
7878
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
7979
from sage.rings.power_series_ring import PowerSeriesRing
8080
from sage.rings.rational_field import QQ
8181
from sage.schemes.generic.spec import Spec
8282
from sage.rings.finite_rings.finite_field_constructor import GF
8383
from sage.rings.universal_cyclotomic_field import UniversalCyclotomicField
8484

85+
8586
def characteristic_polynomial_from_traces(traces, d, q, i, sign):
8687
r"""
8788
Given a sequence of traces `t_1, \dots, t_k`, return the
@@ -899,6 +900,69 @@ def hodge_polygon_vertices(self):
899900
lst.append((lst[-1][0] + hn[i], lst[-1][1] + i * hn[i]))
900901
return lst
901902

903+
def E_polynomial(self):
904+
"""
905+
Return the E-polynomial of ``self``.
906+
907+
This is a bivariate polynomial.
908+
909+
The algorithm is taken from [FRV2019]_.
910+
911+
REFERENCES:
912+
913+
- [FRV2019] Fernando Rodriguez Villegas, *Mixed Hodge numbers
914+
and factorial ratios*, https://arxiv.org/abs/1907.02722
915+
916+
EXAMPLES::
917+
918+
sage: from sage.modular.hypergeometric_motive import HypergeometricData
919+
sage: H = HypergeometricData(gamma_list=[-30,-1,6,10,15])
920+
sage: H.E_polynomial()
921+
8*u*v + 7*u + 7*v + 8
922+
923+
sage: H = HypergeometricData(gamma_list=(-11, -2, 1, 3, 4, 5))
924+
sage: H.E_polynomial()
925+
5*u^2*v + 5*u*v^2 + u*v + 1
926+
927+
sage: H = HypergeometricData(gamma_list=(-63, -8, -2, 1, 4, 16, 21, 31))
928+
sage: H.E_polynomial()
929+
21*u^3*v^2 + 21*u^2*v^3 + u^3*v + 23*u^2*v^2 + u*v^3 + u^2*v + u*v^2 + 2*u*v + 1
930+
"""
931+
gamma = self.gamma_list()
932+
ell = len(gamma)
933+
934+
gamma_plus = [g for g in gamma if g > 0]
935+
gamma_minus = [g for g in gamma if g < 0]
936+
937+
domain = set(d for g in gamma for d in divisors(g.abs()))
938+
939+
m_plus = {d: len([1 for g in gamma_plus if not g % d])
940+
for d in domain}
941+
942+
m_minus = {d: len([1 for g in gamma_minus if not g % d])
943+
for d in domain}
944+
945+
u, v = polygens(ZZ, 'u,v')
946+
uqv = u / v
947+
uv = u * v
948+
949+
A = u.parent()
950+
delta_sharp_N = {d: A.sum(uqv**sum(frac(j * gi / d) for gi in gamma)
951+
for j in d.coprime_integers(d))
952+
for d in domain}
953+
954+
loop = [(d, m_plus[d], m_minus[d]) for d in domain]
955+
956+
delta_sharp = sum((uqv**m - uqv**p) // (uqv - 1) * v**(ell - 1)
957+
* delta_sharp_N[d]
958+
for d, p, m in loop if m > p)
959+
960+
delta_zero = sum((uv**min(m, p) - 1) // (uv - 1) * v**(ell - m - p)
961+
* delta_sharp_N[d]
962+
for d, p, m in loop)
963+
964+
return (delta_sharp + delta_zero - 1).numerator() // (u * v)
965+
902966
def M_value(self):
903967
"""
904968
Return the `M` coefficient that appears in the trace formula.

0 commit comments

Comments
 (0)