def padic_gauss_sum(a, p, f, prec=20, factored=False, algorithm='pari', parent=None): # Copied from Sage from sage.rings.padics.factory import Zp from sage.rings.all import PolynomialRing q = p**f a = a % (q - 1) if parent is None: R = Zp(p, prec) else: R = parent out = -R.one() if a != 0: t = R(1 / (q - 1)) for i in range(f): out *= (a * t).gamma(algorithm) a = (a * p) % (q - 1) s = sum(a.digits(base=p)) if factored: return (s, out) X = PolynomialRing(R, name='X').gen() pi = R.ext(X**(p - 1) + p, names='pi').gen() out *= pi**s return out
def gauss_sum(a, p, f, prec=20, factored=False, algorithm='pari', parent=None): r""" Return the Gauss sum `g_q(a)` as a `p`-adic number. The Gauss sum `g_q(a)` is defined by .. MATH:: g_q(a)= \sum_{u\in F_q^*} \omega(u)^{-a} \zeta_q^u, where `q = p^f`, `\omega` is the Teichmüller character and `\zeta_q` is some arbitrary choice of primitive `q`-th root of unity. The computation is adapted from the main theorem in Alain Robert's paper *The Gross-Koblitz formula revisited*, Rend. Sem. Mat. Univ. Padova 105 (2001), 157--170. Let `p` be a prime, `f` a positive integer, `q=p^f`, and `\pi` be the unique root of `f(x) = x^{p-1}+p` congruent to `\zeta_p - 1` modulo `(\zeta_p - 1)^2`. Let `0\leq a < q-1`. Then the Gross-Koblitz formula gives us the value of the Gauss sum `g_q(a)` as a product of `p`-adic Gamma functions as follows: .. MATH:: g_q(a) = -\pi^s \prod_{0\leq i < f} \Gamma_p(a^{(i)}/(q-1)), where `s` is the sum of the digits of `a` in base `p` and the `a^{(i)}` have `p`-adic expansions obtained from cyclic permutations of that of `a`. INPUT: - ``a`` -- integer - ``p`` -- prime - ``f`` -- positive integer - ``prec`` -- positive integer (optional, 20 by default) - ``factored`` - boolean (optional, False by default) - ``algorithm`` - flag passed to p-adic Gamma function (optional, "pari" by default) OUTPUT: If ``factored`` is ``False``, returns a `p`-adic number in an Eisenstein extension of `\QQ_p`. This number has the form `pi^e * z` where `pi` is as above, `e` is some nonnegative integer, and `z` is an element of `\ZZ_p`; if ``factored`` is ``True``, the pair `(e,z)` is returned instead, and the Eisenstein extension is not formed. .. NOTE:: This is based on GP code written by Adriana Salerno. EXAMPLES: In this example, we verify that `g_3(0) = -1`:: sage: from sage.rings.padics.misc import gauss_sum sage: -gauss_sum(0,3,1) 1 + O(pi^40) Next, we verify that `g_5(a) g_5(-a) = 5 (-1)^a`:: sage: from sage.rings.padics.misc import gauss_sum sage: gauss_sum(2,5,1)^2-5 O(pi^84) sage: gauss_sum(1,5,1)*gauss_sum(3,5,1)+5 O(pi^84) Finally, we compute a non-trivial value:: sage: from sage.rings.padics.misc import gauss_sum sage: gauss_sum(2,13,2) 6*pi^2 + 7*pi^14 + 11*pi^26 + 3*pi^62 + 6*pi^74 + 3*pi^86 + 5*pi^98 + pi^110 + 7*pi^134 + 9*pi^146 + 4*pi^158 + 6*pi^170 + 4*pi^194 + pi^206 + 6*pi^218 + 9*pi^230 + O(pi^242) sage: gauss_sum(2,13,2,prec=5,factored=True) (2, 6 + 6*13 + 10*13^2 + O(13^5)) .. SEEALSO:: - :func:`sage.arith.misc.gauss_sum` for general finite fields - :meth:`sage.modular.dirichlet.DirichletCharacter.gauss_sum` for prime finite fields - :meth:`sage.modular.dirichlet.DirichletCharacter.gauss_sum_numerical` for prime finite fields """ from sage.rings.padics.factory import Zp from sage.rings.all import PolynomialRing q = p**f a = a % (q - 1) if parent is None: R = Zp(p, prec) else: R = parent out = -R.one() if a != 0: t = R(1 / (q - 1)) for i in range(f): out *= (a * t).gamma(algorithm) a = (a * p) % (q - 1) s = sum(a.digits(base=p)) if factored: return s, out X = PolynomialRing(R, name='X').gen() pi = R.ext(X**(p - 1) + p, names='pi').gen() out *= pi**s return out
def gauss_sum(a, p, f, prec=20, factored=False, algorithm='pari', parent=None): r""" Return the Gauss sum `g_q(a)` as a `p`-adic number. The Gauss sum `g_q(a)` is defined by .. MATH:: g_q(a)= \sum_{u\in F_q^*} \omega(u)^{-a} \zeta_q^u, where `q = p^f`, `\omega` is the Teichmüller character and `\zeta_q` is some arbitrary choice of primitive `q`-th root of unity. The computation is adapted from the main theorem in Alain Robert's paper *The Gross-Koblitz formula revisited*, Rend. Sem. Mat. Univ. Padova 105 (2001), 157--170. Let `p` be a prime, `f` a positive integer, `q=p^f`, and `\pi` be the unique root of `f(x) = x^{p-1}+p` congruent to `\zeta_p - 1` modulo `(\zeta_p - 1)^2`. Let `0\leq a < q-1`. Then the Gross-Koblitz formula gives us the value of the Gauss sum `g_q(a)` as a product of `p`-adic Gamma functions as follows: .. MATH:: g_q(a) = -\pi^s \prod_{0\leq i < f} \Gamma_p(a^{(i)}/(q-1)), where `s` is the sum of the digits of `a` in base `p` and the `a^{(i)}` have `p`-adic expansions obtained from cyclic permutations of that of `a`. INPUT: - ``a`` -- integer - ``p`` -- prime - ``f`` -- positive integer - ``prec`` -- positive integer (optional, 20 by default) - ``factored`` - boolean (optional, False by default) - ``algorithm`` - flag passed to p-adic Gamma function (optional, "pari" by default) OUTPUT: If ``factored`` is ``False``, returns a `p`-adic number in an Eisenstein extension of `\QQ_p`. This number has the form `pi^e * z` where `pi` is as above, `e` is some nonnegative integer, and `z` is an element of `\ZZ_p`; if ``factored`` is ``True``, the pair `(e,z)` is returned instead, and the Eisenstein extension is not formed. .. NOTE:: This is based on GP code written by Adriana Salerno. EXAMPLES: In this example, we verify that `g_3(0) = -1`:: sage: from sage.rings.padics.misc import gauss_sum sage: -gauss_sum(0,3,1) 1 + O(pi^40) Next, we verify that `g_5(a) g_5(-a) = 5 (-1)^a`:: sage: from sage.rings.padics.misc import gauss_sum sage: gauss_sum(2,5,1)^2-5 O(pi^84) sage: gauss_sum(1,5,1)*gauss_sum(3,5,1)+5 O(pi^84) Finally, we compute a non-trivial value:: sage: from sage.rings.padics.misc import gauss_sum sage: gauss_sum(2,13,2) 6*pi^2 + 7*pi^14 + 11*pi^26 + 3*pi^62 + 6*pi^74 + 3*pi^86 + 5*pi^98 + pi^110 + 7*pi^134 + 9*pi^146 + 4*pi^158 + 6*pi^170 + 4*pi^194 + pi^206 + 6*pi^218 + 9*pi^230 + O(pi^242) sage: gauss_sum(2,13,2,prec=5,factored=True) (2, 6 + 6*13 + 10*13^2 + O(13^5)) .. SEEALSO:: - :func:`sage.arith.misc.gauss_sum` for general finite fields - :meth:`sage.modular.dirichlet.DirichletCharacter.gauss_sum` for prime finite fields - :meth:`sage.modular.dirichlet.DirichletCharacter.gauss_sum_numerical` for prime finite fields """ from sage.rings.padics.factory import Zp from sage.rings.all import PolynomialRing q = p**f a = a % (q-1) if parent is None: R = Zp(p, prec) else: R = parent out = -R.one() if a != 0: t = R(1/(q-1)) for i in range(f): out *= (a*t).gamma(algorithm) a = (a*p) % (q-1) s = sum(a.digits(base=p)) if factored: return(s, out) X = PolynomialRing(R, name='X').gen() pi = R.ext(X**(p - 1) + p, names='pi').gen() out *= pi**s return out