def _basic_integral(self, a, j): r""" Return `\int_{a+pZ_p} (z-{a})^j d\Phi(0-infty)`. See formula in section 9.2 of [PS2011]_ INPUT: - ``a`` -- integer in range(p) - ``j`` -- integer in range(self.symbol().precision_relative()) EXAMPLES:: sage: from sage.modular.pollack_stevens.padic_lseries import pAdicLseries sage: E = EllipticCurve('11a3') sage: L = E.padic_lseries(5, implementation="pollackstevens", precision=4) #long time sage: L._basic_integral(1,2) # long time 2*5^2 + 5^3 + O(5^4) """ symb = self.symbol() M = symb.precision_relative() if j > M: raise PrecisionError("Too many moments requested") p = self.prime() ap = symb.Tq_eigenvalue(p) D = self._quadratic_twist ap = ap * kronecker(D, p) K = pAdicField(p, M) symb_twisted = symb.evaluate_twisted(a, D) return sum( binomial(j, r) * ((a - ZZ(K.teichmuller(a)))**(j - r)) * (p**r) * symb_twisted.moment(r) for r in range(j + 1)) / ap
def _basic_integral(self, a, j): r""" Return `\int_{a+pZ_p} (z-{a})^j d\Phi(0-infty)` -- see formula [Pollack-Stevens, sec 9.2] INPUT: - ``a`` -- integer in range(p) - ``j`` -- integer in range(self.symbol().precision_relative()) EXAMPLES:: sage: from sage.modular.pollack_stevens.padic_lseries import pAdicLseries sage: E = EllipticCurve('11a3') sage: L = E.padic_lseries(5, implementation="pollackstevens", precision=4) #long time sage: L._basic_integral(1,2) # long time 2*5^2 + 5^3 + O(5^4) """ symb = self.symbol() M = symb.precision_relative() if j > M: raise PrecisionError("Too many moments requested") p = self.prime() ap = symb.Tq_eigenvalue(p) D = self._quadratic_twist ap = ap * kronecker(D, p) K = pAdicField(p, M) symb_twisted = symb.evaluate_twisted(a, D) return ( sum( binomial(j, r) * ((a - ZZ(K.teichmuller(a))) ** (j - r)) * (p ** r) * symb_twisted.moment(r) for r in range(j + 1) ) / ap )
def supersingular_D(prime): r""" Return a fundamental discriminant `D` of an imaginary quadratic field, where the given prime does not split. See Silverman's Advanced Topics in the Arithmetic of Elliptic Curves, page 184, exercise 2.30(d). INPUT: - prime -- integer, prime OUTPUT: - D -- integer, negative EXAMPLES: These examples return *supersingular discriminants* for 7, 15073 and 83401:: sage: supersingular_D(7) -4 sage: supersingular_D(15073) -15 sage: supersingular_D(83401) -7 AUTHORS: - David Kohel - [email protected] - Iftikhar Burhanuddin - [email protected] """ if not Integer(prime).is_prime(): raise ValueError("%s is not a prime" % prime) # Making picking D more intelligent D = -1 while True: Dmod4 = D % 4 if Dmod4 in (0, 1) and kronecker(D, prime) != 1: return D D -= 1
def supersingular_D(prime): r""" This function returns a fundamental discriminant `D` of an imaginary quadratic field, where the given prime does not split (see Silverman's Advanced Topics in the Arithmetic of Elliptic Curves, page 184, exercise 2.30(d).) INPUT: - prime -- integer, prime OUTPUT: D -- integer, negative EXAMPLES: These examples return *supersingular discriminants* for 7, 15073 and 83401:: sage: supersingular_D(7) -4 sage: supersingular_D(15073) -15 sage: supersingular_D(83401) -7 AUTHORS: - David Kohel - [email protected] - Iftikhar Burhanuddin - [email protected] """ if not(rings.Integer(prime).is_prime()): raise ValueError("%s is not a prime"%prime) #Making picking D more intelligent D = -1 while True: Dmod4 = rings.Mod(D,4) if Dmod4 in (0,1) and (kronecker(D,prime) != 1): return D D = D - 1
def mass__by_Siegel_densities(self, odd_algorithm="Pall", even_algorithm="Watson"): """ Gives the mass of transformations (det 1 and -1). WARNING: THIS IS BROKEN RIGHT NOW... =( Optional Arguments: - When p > 2 -- odd_algorithm = "Pall" (only one choice for now) - When p = 2 -- even_algorithm = "Kitaoka" or "Watson" REFERENCES: - Nipp's Book "Tables of Quaternary Quadratic Forms". - Papers of Pall (only for p>2) and Watson (for `p=2` -- tricky!). - Siegel, Milnor-Hussemoller, Conway-Sloane Paper IV, Kitoaka (all of which have problems...) EXAMPLES:: sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1]) sage: m = Q.mass__by_Siegel_densities(); m 1/384 sage: m - (2^Q.dim() * factorial(Q.dim()))^(-1) 0 :: sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1]) sage: m = Q.mass__by_Siegel_densities(); m 1/48 sage: m - (2^Q.dim() * factorial(Q.dim()))^(-1) 0 """ ## Setup n = self.dim() s = (n - 1) // 2 if n % 2 != 0: char_d = squarefree_part(2 * self.det()) ## Accounts for the det as a QF else: char_d = squarefree_part(self.det()) ## Form the generic zeta product generic_prod = ZZ(2) * (pi)**(-ZZ(n) * (n + 1) / 4) ########################################## generic_prod *= (self.det())**( ZZ(n + 1) / 2) ## ***** This uses the Hessian Determinant ******** ########################################## #print "gp1 = ", generic_prod generic_prod *= prod([gamma__exact(ZZ(j) / 2) for j in range(1, n + 1)]) #print "\n---", [(ZZ(j)/2, gamma__exact(ZZ(j)/2)) for j in range(1,n+1)] #print "\n---", prod([gamma__exact(ZZ(j)/2) for j in range(1,n+1)]) #print "gp2 = ", generic_prod generic_prod *= prod([zeta__exact(ZZ(j)) for j in range(2, 2 * s + 1, 2)]) #print "\n---", [zeta__exact(ZZ(j)) for j in range(2, 2*s+1, 2)] #print "\n---", prod([zeta__exact(ZZ(j)) for j in range(2, 2*s+1, 2)]) #print "gp3 = ", generic_prod if (n % 2 == 0): generic_prod *= quadratic_L_function__exact(n // 2, ZZ(-1)**(n // 2) * char_d) #print " NEW = ", ZZ(1) * quadratic_L_function__exact(n/2, (-1)**(n/2) * char_d) #print #print "gp4 = ", generic_prod #print "generic_prod =", generic_prod ## Determine the adjustment factors adj_prod = ZZ.one() for p in prime_divisors(2 * self.det()): ## Cancel out the generic factors p_adjustment = prod([1 - ZZ(p)**(-j) for j in range(2, 2 * s + 1, 2)]) if (n % 2 == 0): p_adjustment *= (1 - kronecker( (-1)**(n // 2) * char_d, p) * ZZ(p)**(-n // 2)) #print " EXTRA = ", ZZ(1) * (1 - kronecker((-1)**(n/2) * char_d, p) * ZZ(p)**(-n/2)) #print "Factor to cancel the generic one:", p_adjustment ## Insert the new mass factors if p == 2: if even_algorithm == "Kitaoka": p_adjustment = p_adjustment / self.Kitaoka_mass_at_2() elif even_algorithm == "Watson": p_adjustment = p_adjustment / self.Watson_mass_at_2() else: raise TypeError( "There is a problem -- your even_algorithm argument is invalid. Try again. =(" ) else: if odd_algorithm == "Pall": p_adjustment = p_adjustment / self.Pall_mass_density_at_odd_prime( p) else: raise TypeError( "There is a problem -- your optional arguments are invalid. Try again. =(" ) #print "p_adjustment for p =", p, "is", p_adjustment ## Put them together (cumulatively) adj_prod *= p_adjustment #print "Cumulative adj_prod =", adj_prod ## Extra adjustment for the case of a 2-dimensional form. #if (n == 2): # generic_prod *= 2 ## Return the mass mass = generic_prod * adj_prod return mass
def supersingular_j(FF): r""" Return a supersingular j-invariant over the finite field FF. INPUT: - ``FF`` -- finite field with p^2 elements, where p is a prime number OUTPUT: - finite field element -- a supersingular j-invariant defined over the finite field FF EXAMPLES: The following examples calculate supersingular j-invariants for a few finite fields:: sage: supersingular_j(GF(7^2, 'a')) 6 Observe that in this example the j-invariant is not defined over the prime field:: sage: supersingular_j(GF(15073^2, 'a')) 4443*a + 13964 sage: supersingular_j(GF(83401^2, 'a')) 67977 AUTHORS: - David Kohel -- [email protected] - Iftikhar Burhanuddin -- [email protected] """ if not (FF.is_field()) or not (FF.is_finite()): raise ValueError("%s is not a finite field" % FF) prime = FF.characteristic() if not (Integer(prime).is_prime()): raise ValueError("%s is not a prime" % prime) if not (Integer(FF.cardinality())) == Integer(prime**2): raise ValueError("%s is not a quadratic extension" % FF) if kronecker(-1, prime) != 1: j_invss = 1728 # (2^2 * 3)^3 elif kronecker(-2, prime) != 1: j_invss = 8000 # (2^2 * 5)^3 elif kronecker(-3, prime) != 1: j_invss = 0 # 0^3 elif kronecker(-7, prime) != 1: j_invss = 16581375 # (3 * 5 * 17)^3 elif kronecker(-11, prime) != 1: j_invss = -32768 # -(2^5)^3 elif kronecker(-19, prime) != 1: j_invss = -884736 # -(2^5 * 3)^3 elif kronecker(-43, prime) != 1: j_invss = -884736000 # -(2^6 * 3 * 5)^3 elif kronecker(-67, prime) != 1: j_invss = -147197952000 # -(2^5 * 3 * 5 * 11)^3 elif kronecker(-163, prime) != 1: j_invss = -262537412640768000 # -(2^6 * 3 * 5 * 23 * 29)^3 else: D = supersingular_D(prime) hc_poly = FF['x'](pari(D).polclass()) root_hc_poly_list = list(hc_poly.roots()) j_invss = root_hc_poly_list[0][0] return FF(j_invss)
def mass__by_Siegel_densities(self, odd_algorithm="Pall", even_algorithm="Watson"): """ Gives the mass of transformations (det 1 and -1). WARNING: THIS IS BROKEN RIGHT NOW... =( Optional Arguments: - When p > 2 -- odd_algorithm = "Pall" (only one choice for now) - When p = 2 -- even_algorithm = "Kitaoka" or "Watson" REFERENCES: - Nipp's Book "Tables of Quaternary Quadratic Forms". - Papers of Pall (only for p>2) and Watson (for `p=2` -- tricky!). - Siegel, Milnor-Hussemoller, Conway-Sloane Paper IV, Kitoaka (all of which have problems...) EXAMPLES:: sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1,1]) sage: m = Q.mass__by_Siegel_densities(); m 1/384 sage: m - (2^Q.dim() * factorial(Q.dim()))^(-1) 0 :: sage: Q = DiagonalQuadraticForm(ZZ, [1,1,1]) sage: m = Q.mass__by_Siegel_densities(); m 1/48 sage: m - (2^Q.dim() * factorial(Q.dim()))^(-1) 0 """ ## Setup n = self.dim() s = (n-1) // 2 if n % 2 != 0: char_d = squarefree_part(2*self.det()) ## Accounts for the det as a QF else: char_d = squarefree_part(self.det()) ## Form the generic zeta product generic_prod = ZZ(2) * (pi)**(-ZZ(n) * (n+1) / 4) ########################################## generic_prod *= (self.det())**(ZZ(n+1)/2) ## ***** This uses the Hessian Determinant ******** ########################################## #print "gp1 = ", generic_prod generic_prod *= prod([gamma__exact(ZZ(j)/2) for j in range(1,n+1)]) #print "\n---", [(ZZ(j)/2, gamma__exact(ZZ(j)/2)) for j in range(1,n+1)] #print "\n---", prod([gamma__exact(ZZ(j)/2) for j in range(1,n+1)]) #print "gp2 = ", generic_prod generic_prod *= prod([zeta__exact(ZZ(j)) for j in range(2, 2*s+1, 2)]) #print "\n---", [zeta__exact(ZZ(j)) for j in range(2, 2*s+1, 2)] #print "\n---", prod([zeta__exact(ZZ(j)) for j in range(2, 2*s+1, 2)]) #print "gp3 = ", generic_prod if (n % 2 == 0): generic_prod *= quadratic_L_function__exact(n//2, ZZ(-1)**(n//2) * char_d) #print " NEW = ", ZZ(1) * quadratic_L_function__exact(n/2, (-1)**(n/2) * char_d) #print #print "gp4 = ", generic_prod #print "generic_prod =", generic_prod ## Determine the adjustment factors adj_prod = ZZ.one() for p in prime_divisors(2 * self.det()): ## Cancel out the generic factors p_adjustment = prod([1 - ZZ(p)**(-j) for j in range(2, 2*s+1, 2)]) if (n % 2 == 0): p_adjustment *= (1 - kronecker((-1)**(n//2) * char_d, p) * ZZ(p)**(-n//2)) #print " EXTRA = ", ZZ(1) * (1 - kronecker((-1)**(n/2) * char_d, p) * ZZ(p)**(-n/2)) #print "Factor to cancel the generic one:", p_adjustment ## Insert the new mass factors if p == 2: if even_algorithm == "Kitaoka": p_adjustment = p_adjustment / self.Kitaoka_mass_at_2() elif even_algorithm == "Watson": p_adjustment = p_adjustment / self.Watson_mass_at_2() else: raise TypeError("There is a problem -- your even_algorithm argument is invalid. Try again. =(") else: if odd_algorithm == "Pall": p_adjustment = p_adjustment / self.Pall_mass_density_at_odd_prime(p) else: raise TypeError("There is a problem -- your optional arguments are invalid. Try again. =(") #print "p_adjustment for p =", p, "is", p_adjustment ## Put them together (cumulatively) adj_prod *= p_adjustment #print "Cumulative adj_prod =", adj_prod ## Extra adjustment for the case of a 2-dimensional form. #if (n == 2): # generic_prod *= 2 ## Return the mass mass = generic_prod * adj_prod return mass
def supersingular_j(FF): r""" This function returns a supersingular j-invariant over the finite field FF. INPUT: - ``FF`` -- finite field with p^2 elements, where p is a prime number OUTPUT: finite field element -- a supersingular j-invariant defined over the finite field FF EXAMPLES: The following examples calculate supersingular j-invariants for a few finite fields:: sage: supersingular_j(GF(7^2, 'a')) 6 Observe that in this example the j-invariant is not defined over the prime field:: sage: supersingular_j(GF(15073^2, 'a')) 4443*a + 13964 sage: supersingular_j(GF(83401^2, 'a')) 67977 AUTHORS: - David Kohel -- [email protected] - Iftikhar Burhanuddin -- [email protected] """ if not(FF.is_field()) or not(FF.is_finite()): raise ValueError("%s is not a finite field"%FF) prime = FF.characteristic() if not(rings.Integer(prime).is_prime()): raise ValueError("%s is not a prime"%prime) if not(rings.Integer(FF.cardinality())) == rings.Integer(prime**2): raise ValueError("%s is not a quadratic extension"%FF) if kronecker(-1, prime) != 1: j_invss = 1728 #(2^2 * 3)^3 elif kronecker(-2, prime) != 1: j_invss = 8000 #(2^2 * 5)^3 elif kronecker(-3, prime) != 1: j_invss = 0 #0^3 elif kronecker(-7, prime) != 1: j_invss = 16581375 #(3 * 5 * 17)^3 elif kronecker(-11, prime) != 1: j_invss = -32768 #-(2^5)^3 elif kronecker(-19, prime) != 1: j_invss = -884736 #-(2^5 * 3)^3 elif kronecker(-43, prime) != 1: j_invss = -884736000 #-(2^6 * 3 * 5)^3 elif kronecker(-67, prime) != 1: j_invss = -147197952000 #-(2^5 * 3 * 5 * 11)^3 elif kronecker(-163, prime) != 1: j_invss = -262537412640768000 #-(2^6 * 3 * 5 * 23 * 29)^3 else: D = supersingular_D(prime) hc_poly = FF['x'](pari(D).polclass()) root_hc_poly_list = list(hc_poly.roots()) j_invss = root_hc_poly_list[0][0] return FF(j_invss)