# Hypergeometric motives#

This is largely a port of the corresponding package in Magma. One important conventional difference: the motivic parameter $$t$$ has been replaced with $$1/t$$ to match the classical literature on hypergeometric series. (E.g., see [BeukersHeckman])

The computation of Euler factors is currently only supported for primes $$p$$ of good reduction. That is, it is required that $$v_p(t) = v_p(t-1) = 0$$.

AUTHORS:

• Frédéric Chapoton

• Kiran S. Kedlaya

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([30], [1,2,3,5]))
sage: H.alpha_beta()
([1/30, 7/30, 11/30, 13/30, 17/30, 19/30, 23/30, 29/30],
[0, 1/5, 1/3, 2/5, 1/2, 3/5, 2/3, 4/5])
sage: H.M_value() == 30**30 / (15**15 * 10**10 * 6**6)
True
sage: H.euler_factor(2, 7)
T^8 + T^5 + T^3 + 1


REFERENCES:

class sage.modular.hypergeometric_motive.HypergeometricData(cyclotomic=None, alpha_beta=None, gamma_list=None)#

Bases: object

Creation of hypergeometric motives.

INPUT:

three possibilities are offered, each describing a quotient of products of cyclotomic polynomials.

• cyclotomic – a pair of lists of nonnegative integers, each integer $$k$$ represents a cyclotomic polynomial $$\Phi_k$$

• alpha_beta – a pair of lists of rationals, each rational represents a root of unity

• gamma_list – a pair of lists of nonnegative integers, each integer $$n$$ represents a polynomial $$x^n - 1$$

In the last case, it is also allowed to send just one list of signed integers where signs indicate to which part the integer belongs to.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(cyclotomic=([2],[1]))
Hypergeometric data for [1/2] and [0]

sage: Hyp(alpha_beta=([1/2],[0]))
Hypergeometric data for [1/2] and [0]
sage: Hyp(alpha_beta=([1/5,2/5,3/5,4/5],[0,0,0,0]))
Hypergeometric data for [1/5, 2/5, 3/5, 4/5] and [0, 0, 0, 0]

sage: Hyp(gamma_list=([5],[1,1,1,1,1]))
Hypergeometric data for [1/5, 2/5, 3/5, 4/5] and [0, 0, 0, 0]
sage: Hyp(gamma_list=([5,-1,-1,-1,-1,-1]))
Hypergeometric data for [1/5, 2/5, 3/5, 4/5] and [0, 0, 0, 0]

H_value(p, f, t, ring=None)#

Return the trace of the Frobenius, computed in terms of Gauss sums using the hypergeometric trace formula.

INPUT:

• $$p$$ – a prime number

• $$f$$ – an integer such that $$q = p^f$$

• $$t$$ – a rational parameter

• ring – optional (default UniversalCyclotomicfield)

The ring could be also ComplexField(n) or QQbar.

OUTPUT:

an integer

Warning

This is apparently working correctly as can be tested using ComplexField(70) as value ring.

Using instead UniversalCyclotomicfield, this is much slower than the $$p$$-adic version padic_H_value().

EXAMPLES:

With values in the UniversalCyclotomicField (slow):

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/2]*4,[0]*4))
sage: [H.H_value(3,i,-1) for i in range(1,3)]
[0, -12]
sage: [H.H_value(5,i,-1) for i in range(1,3)]
[-4, 276]
sage: [H.H_value(7,i,-1) for i in range(1,3)]  # not tested
[0, -476]
sage: [H.H_value(11,i,-1) for i in range(1,3)]  # not tested
[0, -4972]
sage: [H.H_value(13,i,-1) for i in range(1,3)]  # not tested
[-84, -1420]


With values in ComplexField:

sage: [H.H_value(5,i,-1, ComplexField(60)) for i in range(1,3)]
[-4, 276]


Check issue from trac ticket #28404:

sage: H1 = Hyp(cyclotomic=([1,1,1],[6,2]))
sage: H2 = Hyp(cyclotomic=([6,2],[1,1,1]))
sage: [H1.H_value(5,1,i) for i in range(2,5)]
[1, -4, -4]
sage: [H2.H_value(5,1,QQ(i)) for i in range(2,5)]
[-4, 1, -4]


REFERENCES:

M_value()#

Return the $$M$$ coefficient that appears in the trace formula.

OUTPUT:

a rational

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/6,1/3,2/3,5/6],[1/8,3/8,5/8,7/8]))
sage: H.M_value()
729/4096
sage: Hyp(alpha_beta=(([1/2,1/2,1/2,1/2],[0,0,0,0]))).M_value()
256
sage: Hyp(cyclotomic=([5],[1,1,1,1])).M_value()
3125

alpha()#

Return the first tuple of rational arguments.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).alpha()
[1/2]

alpha_beta()#

Return the pair of lists of rational arguments.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).alpha_beta()
([1/2], [0])

beta()#

Return the second tuple of rational arguments.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).beta()
[0]

canonical_scheme(t=None)#

Return the canonical scheme.

This is a scheme that contains this hypergeometric motive in its cohomology.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([3],[4]))
sage: H.gamma_list()
[-1, 2, 3, -4]
sage: H.canonical_scheme()
Spectrum of Quotient of Multivariate Polynomial Ring
in X0, X1, Y0, Y1 over Fraction Field of Univariate Polynomial Ring
in t over Rational Field by the ideal
(X0 + X1 - 1, Y0 + Y1 - 1, (-t)*X0^2*X1^3 + 27/64*Y0*Y1^4)

sage: H = Hyp(gamma_list=[-2, 3, 4, -5])
sage: H.canonical_scheme()
Spectrum of Quotient of Multivariate Polynomial Ring
in X0, X1, Y0, Y1 over Fraction Field of Univariate Polynomial Ring
in t over Rational Field by the ideal
(X0 + X1 - 1, Y0 + Y1 - 1, (-t)*X0^3*X1^4 + 1728/3125*Y0^2*Y1^5)


REFERENCES:

[Kat1991], section 5.4

cyclotomic_data()#

Return the pair of tuples of indices of cyclotomic polynomials.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).cyclotomic_data()
([2], [1])

defining_polynomials()#

Return the pair of products of cyclotomic polynomials.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/4,3/4],[0,0])).defining_polynomials()
(x^2 + 1, x^2 - 2*x + 1)

degree()#

Return the degree.

This is the sum of the Hodge numbers.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).degree()
1
sage: Hyp(gamma_list=([2,2,4],[8])).degree()
4
sage: Hyp(cyclotomic=([5,6],[1,1,2,2,3])).degree()
6
sage: Hyp(cyclotomic=([3,8],[1,1,1,2,6])).degree()
6
sage: Hyp(cyclotomic=([3,3],[2,2,4])).degree()
4

euler_factor(t, p, cache_p=False)#

Return the Euler factor of the motive $$H_t$$ at prime $$p$$.

INPUT:

• $$t$$ – rational number, not 0 or 1

• $$p$$ – prime number of good reduction

OUTPUT:

a polynomial

See [Benasque2009] for explicit examples of Euler factors.

For odd weight, the sign of the functional equation is +1. For even weight, the sign is computed by a recipe found in 11.1 of [Watkins].

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/2]*4,[0]*4))
sage: H.euler_factor(-1, 5)
15625*T^4 + 500*T^3 - 130*T^2 + 4*T + 1

sage: H = Hyp(gamma_list=[-6,-1,4,3])
sage: H.weight(), H.degree()
(1, 2)
sage: t = 189/125
sage: [H.euler_factor(1/t,p) for p in [11,13,17,19,23,29]]
[11*T^2 + 4*T + 1,
13*T^2 + 1,
17*T^2 + 1,
19*T^2 + 1,
23*T^2 + 8*T + 1,
29*T^2 + 2*T + 1]

sage: H = Hyp(cyclotomic=([6,2],[1,1,1]))
sage: H.weight(), H.degree()
(2, 3)
sage: [H.euler_factor(1/4,p) for p in [5,7,11,13,17,19]]
[125*T^3 + 20*T^2 + 4*T + 1,
343*T^3 - 42*T^2 - 6*T + 1,
-1331*T^3 - 22*T^2 + 2*T + 1,
-2197*T^3 - 156*T^2 + 12*T + 1,
4913*T^3 + 323*T^2 + 19*T + 1,
6859*T^3 - 57*T^2 - 3*T + 1]

sage: H = Hyp(alpha_beta=([1/12,5/12,7/12,11/12],[0,1/2,1/2,1/2]))
sage: H.weight(), H.degree()
(2, 4)
sage: t = -5
sage: [H.euler_factor(1/t,p) for p in [11,13,17,19,23,29]]
[-14641*T^4 - 1210*T^3 + 10*T + 1,
-28561*T^4 - 2704*T^3 + 16*T + 1,
-83521*T^4 - 4046*T^3 + 14*T + 1,
130321*T^4 + 14440*T^3 + 969*T^2 + 40*T + 1,
279841*T^4 - 25392*T^3 + 1242*T^2 - 48*T + 1,
707281*T^4 - 7569*T^3 + 696*T^2 - 9*T + 1]


This is an example of higher degree:

sage: H = Hyp(cyclotomic=([11], [7, 12]))
sage: H.euler_factor(2, 13)
371293*T^10 - 85683*T^9 + 26364*T^8 + 1352*T^7 - 65*T^6 + 394*T^5 - 5*T^4 + 8*T^3 + 12*T^2 - 3*T + 1
sage: H.euler_factor(2, 19) # long time
2476099*T^10 - 651605*T^9 + 233206*T^8 - 77254*T^7 + 20349*T^6 - 4611*T^5 + 1071*T^4 - 214*T^3 + 34*T^2 - 5*T + 1


REFERENCES:

gamma_array()#

Return the dictionary $$\{v: \gamma_v\}$$ for the expression

$\prod_v (T^v - 1)^{\gamma_v}$

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).gamma_array()
{1: -2, 2: 1}
sage: Hyp(cyclotomic=([6,2],[1,1,1])).gamma_array()
{1: -3, 3: -1, 6: 1}

gamma_list()#

Return a list of integers describing the $$x^n - 1$$ factors.

Each integer $$n$$ stands for $$(x^{|n|} - 1)^{\operatorname{sgn}(n)}$$.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).gamma_list()
[-1, -1, 2]

sage: Hyp(cyclotomic=([6,2],[1,1,1])).gamma_list()
[-1, -1, -1, -3, 6]

sage: Hyp(cyclotomic=([3],[4])).gamma_list()
[-1, 2, 3, -4]

gauss_table(p, f, prec)#

Return (and cache) a table of Gauss sums used in the trace formula.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([3],[4]))
sage: H.gauss_table(2, 2, 4)
(4, [1 + 2 + 2^2 + 2^3, 1 + 2 + 2^2 + 2^3, 1 + 2 + 2^2 + 2^3])

gauss_table_full()#

Return a dict of all stored tables of Gauss sums.

The result is passed by reference, and is an attribute of the class; consequently, modifying the result has global side effects. Use with caution.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([3],[4]))
sage: H.euler_factor(2, 7, cache_p=True)
7*T^2 - 3*T + 1
sage: H.gauss_table_full()[(7, 1)]
(2, array('l', [-1, -29, -25, -48, -47, -22]))


Clearing cached values:

sage: H = Hyp(cyclotomic=([3],[4]))
sage: H.euler_factor(2, 7, cache_p=True)
7*T^2 - 3*T + 1
sage: d = H.gauss_table_full()
sage: d.clear() # Delete all entries of this dict
sage: H1 = Hyp(cyclotomic=([5],[12]))
sage: d1 = H1.gauss_table_full()
sage: len(d1.keys()) # No cached values
0

has_symmetry_at_one()#

If True, the motive H(t=1) is a direct sum of two motives.

Note that simultaneous exchange of (t,1/t) and (alpha,beta) always gives the same motive.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=[[1/2]*16,[0]*16]).has_symmetry_at_one()
True


REFERENCES:

hodge_function(x)#

Evaluate the Hodge polygon as a function.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([6,10],[3,12]))
sage: H.hodge_function(3)
2
sage: H.hodge_function(4)
4

hodge_numbers()#

Return the Hodge numbers.

degree(), hodge_polynomial(), hodge_polygon()

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([3],[6]))
sage: H.hodge_numbers()
[1, 1]

sage: H = Hyp(cyclotomic=([4],[1,2]))
sage: H.hodge_numbers()
[2]

sage: H = Hyp(gamma_list=([8,2,2,2],[6,4,3,1]))
sage: H.hodge_numbers()
[1, 2, 2, 1]

sage: H = Hyp(gamma_list=([5],[1,1,1,1,1]))
sage: H.hodge_numbers()
[1, 1, 1, 1]

sage: H = Hyp(gamma_list=[6,1,-4,-3])
sage: H.hodge_numbers()
[1, 1]

sage: H = Hyp(gamma_list=[-3]*4 + [1]*12)
sage: H.hodge_numbers()
[1, 1, 1, 1, 1, 1, 1, 1]


REFERENCES:

hodge_polygon_vertices()#

Return the vertices of the Hodge polygon.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([6,10],[3,12]))
sage: H.hodge_polygon_vertices()
[(0, 0), (1, 0), (3, 2), (5, 6), (6, 9)]
sage: H = Hyp(cyclotomic=([2,2,2,2,3,3,3,6,6],[1,1,4,5,9]))
sage: H.hodge_polygon_vertices()
[(0, 0), (1, 0), (4, 3), (7, 9), (10, 18), (13, 30), (14, 35)]

hodge_polynomial()#

Return the Hodge polynomial.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([6,10],[3,12]))
sage: H.hodge_polynomial()
(T^3 + 2*T^2 + 2*T + 1)/T^2
sage: H = Hyp(cyclotomic=([2,2,2,2,3,3,3,6,6],[1,1,4,5,9]))
sage: H.hodge_polynomial()
(T^5 + 3*T^4 + 3*T^3 + 3*T^2 + 3*T + 1)/T^2

is_primitive()#

Return whether this data is primitive.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(cyclotomic=([3],[4])).is_primitive()
True
sage: Hyp(gamma_list=[-2, 4, 6, -8]).is_primitive()
False
sage: Hyp(gamma_list=[-3, 6, 9, -12]).is_primitive()
False

padic_H_value(p, f, t, prec=None, cache_p=False)#

Return the $$p$$-adic trace of Frobenius, computed using the Gross-Koblitz formula.

If left unspecified, $$prec$$ is set to the minimum $$p$$-adic precision needed to recover the Euler factor.

If $$cache_p$$ is True, then the function caches an intermediate result which depends only on $$p$$ and $$f$$. This leads to a significant speedup when iterating over $$t$$.

INPUT:

• $$p$$ – a prime number

• $$f$$ – an integer such that $$q = p^f$$

• $$t$$ – a rational parameter

• prec – precision (optional)

• cache_p - a boolean

OUTPUT:

an integer

EXAMPLES:

From Benasque report [Benasque2009], page 8:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/2]*4,[0]*4))
sage: [H.padic_H_value(3,i,-1) for i in range(1,3)]
[0, -12]
sage: [H.padic_H_value(5,i,-1) for i in range(1,3)]
[-4, 276]
sage: [H.padic_H_value(7,i,-1) for i in range(1,3)]
[0, -476]
sage: [H.padic_H_value(11,i,-1) for i in range(1,3)]
[0, -4972]


From [Roberts2015] (but note conventions regarding $$t$$):

sage: H = Hyp(gamma_list=[-6,-1,4,3])
sage: t = 189/125
0


REFERENCES:

primitive_data()#

Return a primitive version.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([3],[4]))
sage: H2 = Hyp(gamma_list=[-2, 4, 6, -8])
sage: H2.primitive_data() == H
True

primitive_index()#

Return the primitive index.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(cyclotomic=([3],[4])).primitive_index()
1
sage: Hyp(gamma_list=[-2, 4, 6, -8]).primitive_index()
2
sage: Hyp(gamma_list=[-3, 6, 9, -12]).primitive_index()
3

sign(t, p)#

Return the sign of the functional equation for the Euler factor of the motive $$H_t$$ at the prime $$p$$.

For odd weight, the sign of the functional equation is +1. For even weight, the sign is computed by a recipe found in 11.1 of [Watkins] (when 0 is not in alpha).

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(cyclotomic=([6,2],[1,1,1]))
sage: H.weight(), H.degree()
(2, 3)
sage: [H.sign(1/4,p) for p in [5,7,11,13,17,19]]
[1, 1, -1, -1, 1, 1]

sage: H = Hyp(alpha_beta=([1/12,5/12,7/12,11/12],[0,1/2,1/2,1/2]))
sage: H.weight(), H.degree()
(2, 4)
sage: t = -5
sage: [H.sign(1/t,p) for p in [11,13,17,19,23,29]]
[-1, -1, -1, 1, 1, 1]


We check that trac ticket #28404 is fixed:

sage: H = Hyp(cyclotomic=([1,1,1],[6,2]))
sage: [H.sign(4,p) for p in [5,7,11,13,17,19]]
[1, 1, -1, -1, 1, 1]

swap_alpha_beta()#

Return the hypergeometric data with alpha and beta exchanged.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/2],[0]))
sage: H.swap_alpha_beta()
Hypergeometric data for [0] and [1/2]

trace(p, f, t, prec=None, cache_p=False)#

Return the $$p$$-adic trace of Frobenius, computed using the Gross-Koblitz formula.

If left unspecified, $$prec$$ is set to the minimum $$p$$-adic precision needed to recover the Euler factor.

If $$cache_p$$ is True, then the function caches an intermediate result which depends only on $$p$$ and $$f$$. This leads to a significant speedup when iterating over $$t$$.

INPUT:

• $$p$$ – a prime number

• $$f$$ – an integer such that $$q = p^f$$

• $$t$$ – a rational parameter

• prec – precision (optional)

• cache_p - a boolean

OUTPUT:

an integer

EXAMPLES:

From Benasque report [Benasque2009], page 8:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/2]*4,[0]*4))
sage: [H.padic_H_value(3,i,-1) for i in range(1,3)]
[0, -12]
sage: [H.padic_H_value(5,i,-1) for i in range(1,3)]
[-4, 276]
sage: [H.padic_H_value(7,i,-1) for i in range(1,3)]
[0, -476]
sage: [H.padic_H_value(11,i,-1) for i in range(1,3)]
[0, -4972]


From [Roberts2015] (but note conventions regarding $$t$$):

sage: H = Hyp(gamma_list=[-6,-1,4,3])
sage: t = 189/125
0


REFERENCES:

twist()#

Return the twist of this data.

This is defined by adding $$1/2$$ to each rational in $$\alpha$$ and $$\beta$$.

This is an involution.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/2],[0]))
sage: H.twist()
Hypergeometric data for [0] and [1/2]
sage: H.twist().twist() == H
True

sage: Hyp(cyclotomic=([6],[1,2])).twist().cyclotomic_data()
([3], [1, 2])

weight()#

Return the motivic weight of this motivic data.

EXAMPLES:

With rational inputs:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(alpha_beta=([1/2],[0])).weight()
0
sage: Hyp(alpha_beta=([1/4,3/4],[0,0])).weight()
1
sage: Hyp(alpha_beta=([1/6,1/3,2/3,5/6],[0,0,1/4,3/4])).weight()
1
sage: H = Hyp(alpha_beta=([1/6,1/3,2/3,5/6],[1/8,3/8,5/8,7/8]))
sage: H.weight()
1


With cyclotomic inputs:

sage: Hyp(cyclotomic=([6,2],[1,1,1])).weight()
2
sage: Hyp(cyclotomic=([6],[1,2])).weight()
0
sage: Hyp(cyclotomic=([8],[1,2,3])).weight()
0
sage: Hyp(cyclotomic=([5],[1,1,1,1])).weight()
3
sage: Hyp(cyclotomic=([5,6],[1,1,2,2,3])).weight()
1
sage: Hyp(cyclotomic=([3,8],[1,1,1,2,6])).weight()
2
sage: Hyp(cyclotomic=([3,3],[2,2,4])).weight()
1


With gamma list input:

sage: Hyp(gamma_list=([8,2,2,2],[6,4,3,1])).weight()
3

wild_primes()#

Return the wild primes.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: Hyp(cyclotomic=([3],[4])).wild_primes()
[2, 3]
sage: Hyp(cyclotomic=([2,2,2,2,3,3,3,6,6],[1,1,4,5,9])).wild_primes()
[2, 3, 5]

zigzag(x, flip_beta=False)#

Count alpha’s at most x minus beta’s at most x.

This function is used to compute the weight and the Hodge numbers. With $$flip_beta$$ set to True, replace each $$b$$ in $$\beta$$ with $$1-b$$.

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp
sage: H = Hyp(alpha_beta=([1/6,1/3,2/3,5/6],[1/8,3/8,5/8,7/8]))
sage: [H.zigzag(x) for x in [0, 1/3, 1/2]]
[0, 1, 0]
sage: H = Hyp(cyclotomic=([5],[1,1,1,1]))
sage: [H.zigzag(x) for x in [0,1/6,1/4,1/2,3/4,5/6]]
[-4, -4, -3, -2, -1, 0]

sage.modular.hypergeometric_motive.alpha_to_cyclotomic(alpha)#

Convert from a list of rationals arguments to a list of integers.

The input represents arguments of some roots of unity.

The output represent a product of cyclotomic polynomials with exactly the given roots. Note that the multiplicity of $$r/s$$ in the list must be independent of $$r$$; otherwise, a ValueError will be raised.

This is the inverse of cyclotomic_to_alpha().

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import alpha_to_cyclotomic
sage: alpha_to_cyclotomic([0])
[1]
sage: alpha_to_cyclotomic([1/2])
[2]
sage: alpha_to_cyclotomic([1/5,2/5,3/5,4/5])
[5]
sage: alpha_to_cyclotomic([0, 1/6, 1/3, 1/2, 2/3, 5/6])
[1, 2, 3, 6]
sage: alpha_to_cyclotomic([1/3,2/3,1/2])
[2, 3]

sage.modular.hypergeometric_motive.capital_M(n)#

Auxiliary function, used to describe the canonical scheme.

INPUT:

• n – an integer

OUTPUT:

a rational

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import capital_M
sage: [capital_M(i) for i in range(1,8)]
[1, 4, 27, 64, 3125, 432, 823543]

sage.modular.hypergeometric_motive.characteristic_polynomial_from_traces(traces, d, q, i, sign)#

Given a sequence of traces $$t_1, \dots, t_k$$, return the corresponding characteristic polynomial with Weil numbers as roots.

The characteristic polynomial is defined by the generating series

$P(T) = \exp\left(- \sum_{k\geq 1} t_k \frac{T^k}{k}\right)$

and should have the property that reciprocals of all roots have absolute value $$q^{i/2}$$.

INPUT:

• traces – a list of integers $$t_1, \dots, t_k$$

• d – the degree of the characteristic polynomial

• q – power of a prime number

• i – integer, the weight in the motivic sense

• sign – integer, the sign

OUTPUT:

a polynomial

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import characteristic_polynomial_from_traces
sage: characteristic_polynomial_from_traces([1, 1], 1, 3, 0, -1)
-T + 1
sage: characteristic_polynomial_from_traces([25], 1, 5, 4, -1)
-25*T + 1

sage: characteristic_polynomial_from_traces([3], 2, 5, 1, 1)
5*T^2 - 3*T + 1
sage: characteristic_polynomial_from_traces([1], 2, 7, 1, 1)
7*T^2 - T + 1

sage: characteristic_polynomial_from_traces([20], 3, 29, 2, 1)
24389*T^3 - 580*T^2 - 20*T + 1
sage: characteristic_polynomial_from_traces([12], 3, 13, 2, -1)
-2197*T^3 + 156*T^2 - 12*T + 1

sage: characteristic_polynomial_from_traces([36,7620], 4, 17, 3, 1)
24137569*T^4 - 176868*T^3 - 3162*T^2 - 36*T + 1
sage: characteristic_polynomial_from_traces([-4,276], 4, 5, 3, 1)
15625*T^4 + 500*T^3 - 130*T^2 + 4*T + 1
sage: characteristic_polynomial_from_traces([4,-276], 4, 5, 3, 1)
15625*T^4 - 500*T^3 + 146*T^2 - 4*T + 1
sage: characteristic_polynomial_from_traces([22, 484], 4, 31, 2, -1)
-923521*T^4 + 21142*T^3 - 22*T + 1

sage.modular.hypergeometric_motive.cyclotomic_to_alpha(cyclo)#

Convert a list of indices of cyclotomic polynomials to a list of rational numbers.

The input represents a product of cyclotomic polynomials.

The output is the list of arguments of the roots of the given product of cyclotomic polynomials.

This is the inverse of alpha_to_cyclotomic().

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import cyclotomic_to_alpha
sage: cyclotomic_to_alpha([1])
[0]
sage: cyclotomic_to_alpha([2])
[1/2]
sage: cyclotomic_to_alpha([5])
[1/5, 2/5, 3/5, 4/5]
sage: cyclotomic_to_alpha([1,2,3,6])
[0, 1/6, 1/3, 1/2, 2/3, 5/6]
sage: cyclotomic_to_alpha([2,3])
[1/3, 1/2, 2/3]

sage.modular.hypergeometric_motive.cyclotomic_to_gamma(cyclo_up, cyclo_down)#

Convert a quotient of products of cyclotomic polynomials to a quotient of products of polynomials $$x^n - 1$$.

INPUT:

• cyclo_up – list of indices of cyclotomic polynomials in the numerator

• cyclo_down – list of indices of cyclotomic polynomials in the denominator

OUTPUT:

a dictionary mapping an integer $$n$$ to the power of $$x^n - 1$$ that appears in the given product

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import cyclotomic_to_gamma
sage: cyclotomic_to_gamma([6], [1])
{2: -1, 3: -1, 6: 1}

sage.modular.hypergeometric_motive.enumerate_hypergeometric_data(d, weight=None)#

Return an iterator over parameters of hypergeometric motives (up to swapping).

INPUT:

• d – the degree

• weight – optional integer, to specify the motivic weight

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import enumerate_hypergeometric_data as enum
sage: l = [H for H in enum(6, weight=2) if H.hodge_numbers()[0] == 1]
sage: len(l)
112

sage.modular.hypergeometric_motive.gamma_list_to_cyclotomic(galist)#

Convert a quotient of products of polynomials $$x^n - 1$$ to a quotient of products of cyclotomic polynomials.

INPUT:

• galist – a list of integers, where an integer $$n$$ represents the power $$(x^{|n|} - 1)^{\operatorname{sgn}(n)}$$

OUTPUT:

a pair of list of integers, where $$k$$ represents the cyclotomic polynomial $$\Phi_k$$

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import gamma_list_to_cyclotomic
sage: gamma_list_to_cyclotomic([-1, -1, 2])
([2], [1])

sage: gamma_list_to_cyclotomic([-1, -1, -1, -3, 6])
([2, 6], [1, 1, 1])

sage: gamma_list_to_cyclotomic([-1, 2, 3, -4])
([3], [4])

sage: gamma_list_to_cyclotomic([8,2,2,2,-6,-4,-3,-1])
([2, 2, 8], [3, 3, 6])

sage.modular.hypergeometric_motive.possible_hypergeometric_data(d, weight=None)#

Return the list of possible parameters of hypergeometric motives (up to swapping).

INPUT:

• d – the degree

• weight – optional integer, to specify the motivic weight

EXAMPLES:

sage: from sage.modular.hypergeometric_motive import possible_hypergeometric_data as P
sage: [len(P(i,weight=2)) for i in range(1, 7)]
[0, 0, 10, 30, 93, 234]