Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# -*- coding: utf-8 -*- 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:
- [BeukersHeckman]_
- [Benasque2009]_
- [Kat1991]_
- [MagmaHGM]_
- [Fedorov2015]_
- [Roberts2017]_
- [Roberts2015]_
- [BeCoMe]_
- [Watkins]_
""" #***************************************************************************** # Copyright (C) 2017 Frédéric Chapoton # Kiran S. Kedlaya <kskedl@gmail.com> # # Distributed under the terms of the GNU General Public License (GPL) # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # http://www.gnu.org/licenses/ #*****************************************************************************
r""" 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
.. MATH::
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
TESTS::
sage: characteristic_polynomial_from_traces([-36], 4, 17, 3, 1) Traceback (most recent call last): ... ValueError: not enough traces were given """ raise ValueError('i and d may not both be odd')
r""" 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 """ if euler_phi(i) <= d]
""" 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] """
""" 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 :func:`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] """ else:
""" 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 :func:`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([1/6, 1/3, 1/2, 2/3, 5/6, 1]) [1, 2, 3, 6] sage: alpha_to_cyclotomic([1/3,2/3,1/2]) [2, 3] """ except ValueError: raise ValueError("multiplicities not balanced")
""" 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] """
""" 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} """
r""" 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]) """
sorted(d for d in resu for k in range(-resu[d])))
r""" 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] """ raise ValueError('overlapping parameters not allowed') msg = 'not the same degree: {} != {}'.format(up_deg, deg) raise ValueError(msg) raise ValueError('alpha and beta not of the same length')
else: for v in cyclo_down) else: for v in cyclo_up)
""" Return the string representation.
This displays the rational arguments of the roots of unity.
EXAMPLES::
sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp sage: Hyp(alpha_beta=([1/2],[0])) Hypergeometric data for [1/2] and [0] """
r""" 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: Hyp(cyclotomic=([6],[1,2])).twist().cyclotomic_data() ([3], [1, 2]) """
""" 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] """
""" Return a primitive version.
.. SEEALSO::
:meth:`is_primitive`, :meth:`primitive_index`,
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 """
r""" 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`.
.. SEEALSO::
:meth:`weight`, :meth:`hodge_numbers`
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]
""" sum(1 for b in beta if 1 - b <= x)) else: sum(1 for b in beta if b <= x))
""" 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 """
""" Return the degree.
This is the sum of the Hodge numbers.
.. SEEALSO::
:meth:`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 """
""" 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) """
""" Return the pair of lists 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]) """
""" 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]) """
""" Return the `M` coefficient that appears in the trace formula.
OUTPUT:
a rational
.. SEEALSO:: :meth:`canonical_scheme`
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 """
r""" Return the dictionary `\{v: \gamma_v\}` for the expression
.. MATH::
\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} """
r""" 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] """
""" Return whether two data are equal.
EXAMPLES::
sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp sage: H1 = Hyp(alpha_beta=([1/2],[0])) sage: H2 = Hyp(cyclotomic=([6,2],[1,1,1])) sage: H1 == H1 True sage: H1 == H2 False """ self._beta == other._beta)
""" Return whether two data are unequal.
EXAMPLES::
sage: from sage.modular.hypergeometric_motive import HypergeometricData as Hyp sage: H1 = Hyp(alpha_beta=([1/2],[0])) sage: H2 = Hyp(cyclotomic=([6,2],[1,1,1])) sage: H1 != H1 False sage: H1 != H2 True """
""" Return whether this data is primitive.
.. SEEALSO::
:meth:`primitive_index`, :meth:`primitive_data`
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 """
""" Return the primitive index.
.. SEEALSO::
:meth:`is_primitive`, :meth:`primitive_data`
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 """
""" 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:
- [Roberts2017]_ """
""" Return the Hodge numbers.
.. SEEALSO::
:meth:`degree`, :meth:`hodge_polynomial`
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:
- [Fedorov2015]_ """ else:
""" Return the Hodge polynomial.
.. SEEALSO::
:meth:`hodge_numbers`
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 """
(T**z(a) - 1) // (T - 1) for a in set(alpha))
""" Return the `p`-adic trace of Frobenius, computed using the Gross-Koblitz formula.
INPUT:
- `p` -- a prime number
- `f` -- an integer such that `q = p^f`
- `t` -- a rational parameter
- ``prec`` -- precision (optional, default 20)
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 sage: H.padic_H_value(13,1,1/t) 0
REFERENCES:
- [MagmaHGM]_ """ H = self.swap_alpha_beta() return(H.padic_H_value(p, f, ~t, prec))
# also: D = (self.weight() + 1 - m[0]) // 2
(-p)**(sum(gauss_table[(v * r) % (q - 1)][0] * gv for v, gv in gamma.items()) // (p - 1)) * prod(gauss_table[(v * r) % (q - 1)][1] ** gv for v, gv in gamma.items()) * teich ** r for r in range(q - 1))
""" 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 :meth:`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]
REFERENCES:
- [BeCoMe]_ (Theorem 1.3) - [Benasque2009]_ """ H = self.swap_alpha_beta() return(H.H_value(p, f, ~t, ring))
# also: D = (self.weight() + 1 - m[0]) // 2
prod(gauss_table[(-v * r) % (q - 1)] ** gv for v, gv in gamma.items()) * teich ** r for r in range(q - 1))
""" 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
- ``degree`` -- optional integer (default 0)
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]
TESTS::
sage: H1 = Hyp(alpha_beta=([1,1,1],[1/2,1/2,1/2])) sage: H2 = H1.swap_alpha_beta() sage: H1.euler_factor(-1, 3) 27*T^3 + 3*T^2 + T + 1 sage: H2.euler_factor(-1, 3) 27*T^3 + 3*T^2 + T + 1 sage: H = Hyp(alpha_beta=([0,0,0,1/3,2/3],[1/2,1/5,2/5,3/5,4/5])) sage: H.euler_factor(5,7) 16807*T^5 - 686*T^4 - 105*T^3 - 15*T^2 - 2*T + 1
REFERENCES:
- [Roberts2015]_ - [Watkins]_ """
raise ValueError('wrong t') raise ValueError('p not prime') raise NotImplementedError('p is wild') raise NotImplementedError('p is tame') # now p is good
else:
""" 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 """
|