passagemath-schemes 10.5.44__cp313-cp313-musllinux_1_2_aarch64.whl → 10.6.42__cp313-cp313-musllinux_1_2_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. passagemath_schemes/__init__.py +3 -0
  2. {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/METADATA +41 -41
  3. {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/METADATA.bak +42 -42
  4. {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/RECORD +158 -139
  5. passagemath_schemes-10.6.42.dist-info/top_level.txt +3 -0
  6. passagemath_schemes.libs/{libflint-7dd7ad94.so.19.0.0 → libflint-edf7fb90.so.22.0.0} +0 -0
  7. passagemath_schemes.libs/{libgcc_s-69c45f16.so.1 → libgcc_s-2d945d6c.so.1} +0 -0
  8. passagemath_schemes.libs/{libgmp-8e78bd9b.so.10.5.0 → libgmp-28992bcb.so.10.5.0} +0 -0
  9. passagemath_schemes.libs/{libgmpxx-e6de26f1.so.4.7.0 → libgmpxx-fecb01a9.so.4.7.0} +0 -0
  10. passagemath_schemes.libs/{libmpfr-5ff10580.so.6.2.1 → libmpfr-1fc8ea36.so.6.2.2} +0 -0
  11. passagemath_schemes.libs/{libstdc++-1f1a71be.so.6.0.33 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
  12. sage/all__sagemath_schemes.py +3 -2
  13. sage/databases/all__sagemath_schemes.py +0 -10
  14. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +4 -4
  15. sage/dynamics/arithmetic_dynamics/generic_ds.py +3 -3
  16. sage/dynamics/arithmetic_dynamics/projective_ds.py +7 -7
  17. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-313-aarch64-linux-musl.so +0 -0
  18. sage/dynamics/arithmetic_dynamics/wehlerK3.py +18 -18
  19. sage/lfunctions/zero_sums.cpython-313-aarch64-linux-musl.so +0 -0
  20. sage/modular/abvar/abvar.py +12 -11
  21. sage/modular/abvar/constructor.py +3 -3
  22. sage/modular/abvar/cuspidal_subgroup.py +5 -6
  23. sage/modular/abvar/finite_subgroup.py +20 -18
  24. sage/modular/abvar/homology.py +1 -2
  25. sage/modular/abvar/homspace.py +1 -1
  26. sage/modular/abvar/lseries.py +3 -3
  27. sage/modular/abvar/morphism.py +1 -1
  28. sage/modular/abvar/torsion_point.py +1 -1
  29. sage/modular/abvar/torsion_subgroup.py +1 -1
  30. sage/modular/arithgroup/arithgroup_element.cpython-313-aarch64-linux-musl.so +0 -0
  31. sage/modular/arithgroup/arithgroup_perm.py +16 -16
  32. sage/modular/arithgroup/congroup.cpython-313-aarch64-linux-musl.so +0 -0
  33. sage/modular/arithgroup/congroup_gamma0.py +2 -2
  34. sage/modular/arithgroup/congroup_gamma1.py +4 -4
  35. sage/modular/arithgroup/congroup_gammaH.py +2 -2
  36. sage/modular/arithgroup/congroup_generic.py +2 -3
  37. sage/modular/arithgroup/congroup_sl2z.py +3 -3
  38. sage/modular/arithgroup/farey_symbol.cpython-313-aarch64-linux-musl.so +0 -0
  39. sage/modular/arithgroup/farey_symbol.pyx +1 -2
  40. sage/modular/btquotients/btquotient.py +4 -5
  41. sage/modular/btquotients/pautomorphicform.py +2 -2
  42. sage/modular/cusps.py +6 -4
  43. sage/modular/cusps_nf.py +7 -8
  44. sage/modular/dirichlet.py +34 -43
  45. sage/modular/drinfeld_modform/element.py +4 -4
  46. sage/modular/drinfeld_modform/ring.py +12 -12
  47. sage/modular/drinfeld_modform/tutorial.py +1 -1
  48. sage/modular/hecke/algebra.py +7 -5
  49. sage/modular/hecke/ambient_module.py +2 -2
  50. sage/modular/hecke/element.py +7 -2
  51. sage/modular/hecke/module.py +9 -9
  52. sage/modular/hecke/submodule.py +6 -8
  53. sage/modular/hypergeometric_misc.cpython-313-aarch64-linux-musl.so +0 -0
  54. sage/modular/hypergeometric_misc.pyx +3 -2
  55. sage/modular/hypergeometric_motive.py +2 -2
  56. sage/modular/local_comp/local_comp.py +19 -11
  57. sage/modular/local_comp/type_space.py +10 -8
  58. sage/modular/modform/ambient.py +4 -3
  59. sage/modular/modform/cuspidal_submodule.py +2 -2
  60. sage/modular/modform/element.py +72 -72
  61. sage/modular/modform/half_integral.py +1 -1
  62. sage/modular/modform/l_series_gross_zagier.py +3 -0
  63. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-313-aarch64-linux-musl.so +0 -0
  64. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +5 -2
  65. sage/modular/modform/ring.py +10 -12
  66. sage/modular/modform/space.py +18 -21
  67. sage/modular/modform/weight1.py +1 -2
  68. sage/modular/modform_hecketriangle/abstract_ring.py +7 -14
  69. sage/modular/modform_hecketriangle/abstract_space.py +63 -66
  70. sage/modular/modform_hecketriangle/graded_ring_element.py +11 -12
  71. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +82 -84
  72. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +2 -2
  73. sage/modular/modform_hecketriangle/readme.py +9 -11
  74. sage/modular/modform_hecketriangle/series_constructor.py +10 -18
  75. sage/modular/modform_hecketriangle/space.py +29 -30
  76. sage/modular/modform_hecketriangle/subspace.py +9 -7
  77. sage/modular/modsym/ambient.py +13 -20
  78. sage/modular/modsym/boundary.py +2 -2
  79. sage/modular/modsym/manin_symbol.cpython-313-aarch64-linux-musl.so +0 -0
  80. sage/modular/modsym/manin_symbol_list.py +3 -7
  81. sage/modular/modsym/relation_matrix_pyx.cpython-313-aarch64-linux-musl.so +0 -0
  82. sage/modular/modsym/space.py +10 -22
  83. sage/modular/modsym/subspace.py +5 -7
  84. sage/modular/multiple_zeta.py +11 -13
  85. sage/modular/multiple_zeta_F_algebra.py +4 -6
  86. sage/modular/overconvergent/genus0.py +5 -4
  87. sage/modular/overconvergent/hecke_series.py +2 -2
  88. sage/modular/pollack_stevens/distributions.py +2 -2
  89. sage/modular/pollack_stevens/fund_domain.py +26 -29
  90. sage/modular/pollack_stevens/manin_map.py +15 -10
  91. sage/modular/pollack_stevens/modsym.py +18 -18
  92. sage/modular/quasimodform/element.py +10 -10
  93. sage/modular/quasimodform/ring.py +22 -22
  94. sage/modular/ssmod/ssmod.py +5 -12
  95. sage/rings/polynomial/binary_form_reduce.py +1 -1
  96. sage/schemes/curves/affine_curve.py +4 -4
  97. sage/schemes/curves/plane_curve_arrangement.py +28 -24
  98. sage/schemes/elliptic_curves/BSD.py +1 -1
  99. sage/schemes/elliptic_curves/addition_formulas_ring.py +4 -0
  100. sage/schemes/elliptic_curves/cm.py +1 -1
  101. sage/schemes/elliptic_curves/constructor.py +3 -3
  102. sage/schemes/elliptic_curves/ell_egros.py +1 -1
  103. sage/schemes/elliptic_curves/ell_field.py +57 -46
  104. sage/schemes/elliptic_curves/ell_finite_field.py +138 -26
  105. sage/schemes/elliptic_curves/ell_local_data.py +9 -9
  106. sage/schemes/elliptic_curves/ell_number_field.py +25 -24
  107. sage/schemes/elliptic_curves/ell_point.py +21 -22
  108. sage/schemes/elliptic_curves/ell_rational_field.py +38 -28
  109. sage/schemes/elliptic_curves/formal_group.py +1 -1
  110. sage/schemes/elliptic_curves/heegner.py +11 -8
  111. sage/schemes/elliptic_curves/height.py +26 -23
  112. sage/schemes/elliptic_curves/hom.py +2 -1
  113. sage/schemes/elliptic_curves/hom_composite.py +11 -11
  114. sage/schemes/elliptic_curves/hom_frobenius.py +8 -8
  115. sage/schemes/elliptic_curves/hom_sum.py +7 -1
  116. sage/schemes/elliptic_curves/hom_velusqrt.py +13 -7
  117. sage/schemes/elliptic_curves/homset.py +2 -2
  118. sage/schemes/elliptic_curves/isogeny_small_degree.py +1 -1
  119. sage/schemes/elliptic_curves/mod_poly.py +12 -5
  120. sage/schemes/elliptic_curves/mod_sym_num.cpython-313-aarch64-linux-musl.so +0 -0
  121. sage/schemes/elliptic_curves/padic_lseries.py +25 -13
  122. sage/schemes/elliptic_curves/padics.py +71 -63
  123. sage/schemes/elliptic_curves/period_lattice.py +78 -27
  124. sage/schemes/elliptic_curves/period_lattice_region.cpython-313-aarch64-linux-musl.so +0 -0
  125. sage/schemes/elliptic_curves/sha_tate.py +1 -1
  126. sage/schemes/elliptic_curves/weierstrass_morphism.py +2 -2
  127. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +1 -1
  128. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +1 -1
  129. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +10 -20
  130. sage/schemes/jacobians/abstract_jacobian.py +1 -1
  131. sage/schemes/plane_conics/con_field.py +42 -42
  132. sage/schemes/plane_conics/con_rational_field.py +1 -1
  133. sage/schemes/riemann_surfaces/riemann_surface.py +8 -8
  134. sage_wheels/share/cremona/cremona_mini.db +0 -0
  135. sage_wheels/share/ellcurves/rank0 +30427 -0
  136. sage_wheels/share/ellcurves/rank1 +31871 -0
  137. sage_wheels/share/ellcurves/rank10 +6 -0
  138. sage_wheels/share/ellcurves/rank11 +6 -0
  139. sage_wheels/share/ellcurves/rank12 +1 -0
  140. sage_wheels/share/ellcurves/rank14 +1 -0
  141. sage_wheels/share/ellcurves/rank15 +1 -0
  142. sage_wheels/share/ellcurves/rank17 +1 -0
  143. sage_wheels/share/ellcurves/rank19 +1 -0
  144. sage_wheels/share/ellcurves/rank2 +2388 -0
  145. sage_wheels/share/ellcurves/rank20 +1 -0
  146. sage_wheels/share/ellcurves/rank21 +1 -0
  147. sage_wheels/share/ellcurves/rank22 +1 -0
  148. sage_wheels/share/ellcurves/rank23 +1 -0
  149. sage_wheels/share/ellcurves/rank24 +1 -0
  150. sage_wheels/share/ellcurves/rank28 +1 -0
  151. sage_wheels/share/ellcurves/rank3 +836 -0
  152. sage_wheels/share/ellcurves/rank4 +10 -0
  153. sage_wheels/share/ellcurves/rank5 +5 -0
  154. sage_wheels/share/ellcurves/rank6 +5 -0
  155. sage_wheels/share/ellcurves/rank7 +5 -0
  156. sage_wheels/share/ellcurves/rank8 +6 -0
  157. sage_wheels/share/ellcurves/rank9 +7 -0
  158. passagemath_schemes-10.5.44.dist-info/top_level.txt +0 -2
  159. sage/databases/db_modular_polynomials.py +0 -250
  160. sage/databases/stein_watkins.py +0 -363
  161. sage/modular/modsym/p1list.cpython-313-aarch64-linux-musl.so +0 -0
  162. sage/modular/modsym/p1list.pxd +0 -29
  163. sage/modular/modsym/p1list.pyx +0 -1372
  164. {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/WHEEL +0 -0
@@ -10,7 +10,7 @@ This module defines the class :class:`EllipticCurve_field`, based on
10
10
  #
11
11
  # Distributed under the terms of the GNU General Public License (GPL)
12
12
  #
13
- # http://www.gnu.org/licenses/
13
+ # https://www.gnu.org/licenses/
14
14
  # *****************************************************************************
15
15
 
16
16
  import sage.rings.abc
@@ -31,7 +31,7 @@ from . import ell_generic
31
31
 
32
32
  class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurve_field):
33
33
 
34
- def __init__(self, R, data, category=None):
34
+ def __init__(self, R, data, category=None) -> None:
35
35
  r"""
36
36
  Constructor for elliptic curves over fields.
37
37
 
@@ -67,7 +67,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
67
67
  # j=0=1728, but I have never worked them out or seen them used!
68
68
  #
69
69
 
70
- def genus(self):
70
+ def genus(self) -> Integer:
71
71
  """
72
72
  Return 1 for elliptic curves.
73
73
 
@@ -210,19 +210,19 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
210
210
  raise ValueError("twisting parameter D must be nonzero when characteristic is not 2")
211
211
 
212
212
  if char != 2:
213
- b2,b4,b6,b8 = self.b_invariants()
213
+ b2, b4, b6, b8 = self.b_invariants()
214
214
  # E is isomorphic to [0,b2,0,8*b4,16*b6]
215
- return EllipticCurve(K,[0,b2*D,0,8*b4*D**2,16*b6*D**3])
215
+ return EllipticCurve(K, [0, b2*D, 0, 8*b4*D**2, 16*b6*D**3])
216
216
 
217
217
  # now char==2
218
- if self.j_invariant() != 0: # iff a1!=0
219
- a1,a2,a3,a4,a6 = self.ainvs()
220
- E0 = self.change_weierstrass_model(a1,a3/a1,0,(a1**2*a4+a3**2)/a1**3)
218
+ if self.j_invariant() != 0: # iff a1!=0
219
+ a1, a2, a3, a4, a6 = self.ainvs()
220
+ E0 = self.change_weierstrass_model(a1, a3/a1, 0, (a1**2*a4+a3**2)/a1**3)
221
221
  # which has the form = [1,A2,0,0,A6]
222
222
  assert E0.a1() == K(1)
223
223
  assert E0.a3() == K(0)
224
224
  assert E0.a4() == K(0)
225
- return EllipticCurve(K,[1,E0.a2()+D,0,0,E0.a6()])
225
+ return EllipticCurve(K, [1, E0.a2() + D, 0, 0, E0.a6()])
226
226
  else:
227
227
  raise ValueError("Quadratic twist not implemented in char 2 when j=0")
228
228
 
@@ -262,7 +262,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
262
262
  2
263
263
  """
264
264
  f = self.division_polynomial(Integer(2))
265
- n = len(f.roots())+1
265
+ n = len(f.roots()) + 1
266
266
  return Integer(n).ord(Integer(2))
267
267
 
268
268
  def quartic_twist(self, D):
@@ -304,10 +304,10 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
304
304
  if D.is_zero():
305
305
  raise ValueError("quartic twist requires a nonzero argument")
306
306
 
307
- c4,c6 = self.c_invariants()
307
+ c4, c6 = self.c_invariants()
308
308
  # E is isomorphic to [0,0,0,-27*c4,0]
309
309
  assert c6 == 0
310
- return EllipticCurve(K,[0,0,0,-27*c4*D,0])
310
+ return EllipticCurve(K, [0, 0, 0, -27 * c4 * D, 0])
311
311
 
312
312
  def sextic_twist(self, D):
313
313
  r"""
@@ -350,10 +350,10 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
350
350
  if D.is_zero():
351
351
  raise ValueError("Sextic twist requires a nonzero argument")
352
352
 
353
- c4,c6 = self.c_invariants()
353
+ c4, c6 = self.c_invariants()
354
354
  # E is isomorphic to [0,0,0,0,-54*c6]
355
355
  assert c4 == 0
356
- return EllipticCurve(K,[0,0,0,0,-54*c6*D])
356
+ return EllipticCurve(K, [0, 0, 0, 0, -54 * c6 * D])
357
357
 
358
358
  def is_quadratic_twist(self, other):
359
359
  r"""
@@ -474,12 +474,12 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
474
474
  elif char == 3:
475
475
  if j == 0:
476
476
  raise NotImplementedError("not implemented in characteristic 3 for curves of j-invariant 0")
477
- D = E.b2()/F.b2()
477
+ D = E.b2() / F.b2()
478
478
 
479
479
  else:
480
480
  # now char!=2,3:
481
- c4E,c6E = E.c_invariants()
482
- c4F,c6F = F.c_invariants()
481
+ c4E, c6E = E.c_invariants()
482
+ c4F, c6F = F.c_invariants()
483
483
 
484
484
  if j == 0:
485
485
  um = c6E/c6F
@@ -572,7 +572,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
572
572
  raise NotImplementedError("not implemented in characteristic 3")
573
573
  else:
574
574
  # now char!=2,3:
575
- D = F.c4()/E.c4()
575
+ D = F.c4() / E.c4()
576
576
 
577
577
  if D.is_zero():
578
578
  return D
@@ -641,7 +641,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
641
641
  raise NotImplementedError("not implemented in characteristic 3")
642
642
  else:
643
643
  # now char!=2,3:
644
- D = F.c6()/E.c6()
644
+ D = F.c6() / E.c6()
645
645
 
646
646
  if D.is_zero():
647
647
  return D
@@ -650,7 +650,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
650
650
 
651
651
  return D
652
652
 
653
- def descend_to(self, K, f=None):
653
+ def descend_to(self, K, f=None) -> list:
654
654
  r"""
655
655
  Given an elliptic curve ``self`` defined over a field `L` and a
656
656
  subfield `K` of `L`, return all elliptic curves over `K` which
@@ -786,33 +786,33 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
786
786
  raise NotImplementedError("Not implemented in positive characteristic")
787
787
 
788
788
  if jK == 0:
789
- t = -54*self.c6()
789
+ t = -54 * self.c6()
790
790
  try:
791
- dlist = t.descend_mod_power(K,6)
791
+ dlist = t.descend_mod_power(K, 6)
792
792
  # list of d in K such that t/d is in L*^6
793
793
  except AttributeError:
794
794
  raise NotImplementedError("Not implemented over %s" % L)
795
- Elist = [EllipticCurve([0,0,0,0,d]) for d in dlist]
795
+ Elist = [EllipticCurve([0, 0, 0, 0, d]) for d in dlist]
796
796
  elif jK == 1728:
797
- t = -27*self.c4()
797
+ t = -27 * self.c4()
798
798
  try:
799
- dlist = t.descend_mod_power(K,4)
799
+ dlist = t.descend_mod_power(K, 4)
800
800
  # list of d in K such that t/d is in L*^4
801
801
  except AttributeError:
802
802
  raise NotImplementedError("Not implemented over %s" % L)
803
- Elist = [EllipticCurve([0,0,0,d,0]) for d in dlist]
803
+ Elist = [EllipticCurve([0, 0, 0, d, 0]) for d in dlist]
804
804
  else:
805
805
  c4, c6 = self.c_invariants()
806
- t = c6/c4
806
+ t = c6 / c4
807
807
  try:
808
- dlist = t.descend_mod_power(K,2)
808
+ dlist = t.descend_mod_power(K, 2)
809
809
  # list of d in K such that t/d is in L*^2
810
810
  except AttributeError:
811
811
  raise NotImplementedError("Not implemented over %s" % L)
812
- c = -27*jK/(jK-1728) # =-27c4^3/c6^2
812
+ c = -27*jK/(jK-1728) # =-27c4^3/c6^2
813
813
  a4list = [c*d**2 for d in dlist]
814
- a6list = [2*a4*d for a4,d in zip(a4list,dlist)]
815
- Elist = [EllipticCurve([0,0,0,a4,a6]) for a4,a6 in zip(a4list,a6list)]
814
+ a6list = [2*a4*d for a4, d in zip(a4list, dlist)]
815
+ Elist = [EllipticCurve([0, 0, 0, a4, a6]) for a4, a6 in zip(a4list, a6list)]
816
816
 
817
817
  if K is QQ:
818
818
  Elist = [E.minimal_model() for E in Elist]
@@ -1098,7 +1098,8 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
1098
1098
  # The Galois group of the X-coordinates is a subgroup of GL(2,n)/{-1,+1}.
1099
1099
  if F in NumberFields():
1100
1100
  from sage.misc.misc_c import prod
1101
- deg_mult = F.degree() * prod(l * (l+1) * (l-1)**2 * l**(4*(e-1)) for l,e in n.factor()) // 2
1101
+ deg_mult = F.degree() * prod(l * (l+1) * (l-1)**2 * l**(4*(e-1))
1102
+ for l, e in n.factor()) // 2
1102
1103
  K, F_to_K = f.splitting_field(names, degree_multiple=deg_mult, map=True, **kwds)
1103
1104
  elif F in FiniteFields():
1104
1105
  K, F_to_K = f.splitting_field('u', map=True, **kwds)
@@ -1554,10 +1555,14 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
1554
1555
  Period lattice associated to Elliptic Curve defined by y^2 = x^3 + x + 6 over Rational Field
1555
1556
  sage: EllipticCurve(RR, [1, 6]).period_lattice()
1556
1557
  Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 6.00000000000000 over Real Field with 53 bits of precision
1558
+ sage: EllipticCurve(RDF, [1, 6]).period_lattice()
1559
+ Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.0*x + 6.0 over Real Double Field
1557
1560
  sage: EllipticCurve(RealField(100), [1, 6]).period_lattice()
1558
1561
  Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.0000000000000000000000000000*x + 6.0000000000000000000000000000 over Real Field with 100 bits of precision
1559
1562
  sage: EllipticCurve(CC, [1, 6]).period_lattice()
1560
1563
  Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 6.00000000000000 over Complex Field with 53 bits of precision
1564
+ sage: EllipticCurve(CDF, [1, 6]).period_lattice()
1565
+ Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.0*x + 6.0 over Complex Double Field
1561
1566
  sage: EllipticCurve(ComplexField(100), [1, 6]).period_lattice()
1562
1567
  Period lattice associated to Elliptic Curve defined by y^2 = x^3 + 1.0000000000000000000000000000*x + 6.0000000000000000000000000000 over Complex Field with 100 bits of precision
1563
1568
  sage: EllipticCurve(AA, [1, 6]).period_lattice()
@@ -1589,7 +1594,8 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
1589
1594
  Given a point `P` on this curve which generates a rational subgroup,
1590
1595
  return the kernel polynomial of that subgroup as a polynomial over
1591
1596
  the base field of the curve.
1592
- (The point `P` itself may be defined over an extension.)
1597
+
1598
+ The point `P` itself may be defined over an extension.
1593
1599
 
1594
1600
  EXAMPLES::
1595
1601
 
@@ -1772,8 +1778,12 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
1772
1778
 
1773
1779
  from sage.schemes.elliptic_curves.isogeny_small_degree import _least_semi_primitive
1774
1780
  a = _least_semi_primitive(l)
1775
- mul_a = lambda x: self._multiple_x_numerator(a, x=x) / self._multiple_x_denominator(a, x=x)
1776
- x_mod = lambda g: g.parent().quotient(g).gen()
1781
+
1782
+ def mul_a(x):
1783
+ return self._multiple_x_numerator(a, x=x) / self._multiple_x_denominator(a, x=x)
1784
+
1785
+ def x_mod(g):
1786
+ return g.parent().quotient(g).gen()
1777
1787
 
1778
1788
  fs = [f]
1779
1789
  m = l//2//f.degree()
@@ -1786,7 +1796,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
1786
1796
 
1787
1797
  return prod(fs)
1788
1798
 
1789
- def isogenies_prime_degree(self, l=None, max_l=31):
1799
+ def isogenies_prime_degree(self, l=None, max_l=31) -> list:
1790
1800
  """
1791
1801
  Return a list of all separable isogenies (up to post-composition with
1792
1802
  isomorphisms) of given prime degree(s) with domain equal to ``self``,
@@ -2111,6 +2121,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2111
2121
 
2112
2122
  ::
2113
2123
 
2124
+ sage: # needs sage.symbolic
2114
2125
  sage: E = EllipticCurve(GF(next_prime(2^32)), j=1728)
2115
2126
  sage: sorted([phi.codomain().j_invariant() for phi in E.isogenies_degree(11 * 17 * 19^2)])
2116
2127
  [1348157279, 1348157279, 1713365879, 1713365879, 3153894341, 3153894341,
@@ -2124,6 +2135,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2124
2135
  not use a ``set`` or any hash-based data structure, as hashing
2125
2136
  isogenies is slow::
2126
2137
 
2138
+ sage: # needs sage.symbolic
2127
2139
  sage: import itertools
2128
2140
  sage: all_distinct = lambda arr: all(x != y for x, y in itertools.combinations(arr, 2))
2129
2141
  sage: K.<z> = GF((19, 2))
@@ -2183,7 +2195,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2183
2195
  To: Elliptic Curve defined by y^2 = x^3 + 4294967267*x + 112 over Finite Field of size 4294967311]
2184
2196
  sage: all(isog.domain() is E for isog in _)
2185
2197
  True
2186
- sage: all(isog.domain() is E for isog in E.isogenies_degree(2^5, _intermediate=True))
2198
+ sage: all(isog.domain() is E for isog in E.isogenies_degree(2^5, _intermediate=True)) # needs sage.symbolic
2187
2199
  True
2188
2200
 
2189
2201
  The following curve has no degree-`53` isogenies, so the code is quick::
@@ -2243,7 +2255,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2243
2255
  # self -> E2
2244
2256
  yield psi
2245
2257
 
2246
- def is_isogenous(self, other, field=None):
2258
+ def is_isogenous(self, other, field=None) -> bool:
2247
2259
  """
2248
2260
  Return whether or not ``self`` is isogenous to ``other``.
2249
2261
 
@@ -2569,7 +2581,6 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2569
2581
  sage: G3.vertices(sort=True)
2570
2582
  ['0', '0*', '1', '1*']
2571
2583
  """
2572
-
2573
2584
  from warnings import warn
2574
2585
  from sage.matrix.constructor import Matrix
2575
2586
 
@@ -2586,7 +2597,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2586
2597
  Es = [self] # list of curves in graph
2587
2598
  A = [] # adjacency matrix
2588
2599
  labels = [] # list of vertex labels
2589
- for (i, E) in enumerate(Es):
2600
+ for i, E in enumerate(Es):
2590
2601
  if 0 < curve_max < len(Es):
2591
2602
  warn('Isogeny graph contains more than '
2592
2603
  + str(curve_max) + ' curves.')
@@ -2594,8 +2605,8 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2594
2605
 
2595
2606
  r = [0] * len(Es) # adjacency matrix row
2596
2607
  for C in [I.codomain() for I in E.isogenies_prime_degree(l)]:
2597
- j = next((k for (k, F) in enumerate(Es) if C.is_isomorphic(F)),
2598
- -1) # index of curve isomorphic to codomain of isogeny
2608
+ j = next((k for k, F in enumerate(Es) if C.is_isomorphic(F)),
2609
+ -1) # index of curve isomorphic to codomain of isogeny
2599
2610
  if j >= 0:
2600
2611
  r[j] += 1
2601
2612
  else:
@@ -2610,7 +2621,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2610
2621
  # regardless of the starting vertex.
2611
2622
  if not directed and E.j_invariant() in [0, 1728]:
2612
2623
  m = len(E.automorphisms()) / 2 # multiplicity of out-edges
2613
- r = [v if k == i else v / m for (k, v) in enumerate(r)]
2624
+ r = [v if k == i else v / m for k, v in enumerate(r)]
2614
2625
 
2615
2626
  A.append(r)
2616
2627
  if label_by_j:
@@ -2633,7 +2644,7 @@ class EllipticCurve_field(ell_generic.EllipticCurve_generic, ProjectivePlaneCurv
2633
2644
  GL = G.relabel(labels, inplace=False)
2634
2645
  return GL
2635
2646
 
2636
- def endomorphism_ring_is_commutative(self):
2647
+ def endomorphism_ring_is_commutative(self) -> bool:
2637
2648
  r"""
2638
2649
  Check whether the endomorphism ring of this elliptic curve
2639
2650
  *over its base field* is commutative.
@@ -2800,12 +2811,12 @@ def point_of_order(E, n):
2800
2811
  if n == 1:
2801
2812
  return E(0)
2802
2813
 
2803
- l,m = n.is_prime_power(get_data=True)
2814
+ l, m = n.is_prime_power(get_data=True)
2804
2815
  if not m:
2805
2816
  raise NotImplementedError('only prime-power orders are currently supported')
2806
2817
 
2807
2818
  xpoly = E.division_polynomial(n).radical()
2808
- xpoly //= E.division_polynomial(n//l).radical()
2819
+ xpoly //= E.division_polynomial(n // l).radical()
2809
2820
  if xpoly.degree() < 1: # supersingular and l == p
2810
2821
  raise ValueError('curve does not have any points of the specified order')
2811
2822
 
@@ -683,27 +683,31 @@ class EllipticCurve_finite_field(EllipticCurve_field):
683
683
  This computes the curve cardinality, which may be
684
684
  time-consuming.
685
685
 
686
+ .. SEEALSO::
687
+
688
+ :meth:`endomorphism_order`
689
+
686
690
  EXAMPLES::
687
691
 
688
692
  sage: E = EllipticCurve(GF(11),[3,3])
689
693
  sage: E.frobenius_order()
690
- Order of conductor 2 generated by phi
691
- in Number Field in phi with defining polynomial x^2 - 4*x + 11
694
+ Order of conductor 2 generated by pi
695
+ in Number Field in pi with defining polynomial x^2 - 4*x + 11
692
696
 
693
- For some supersingular curves, Frobenius is in Z and the Frobenius
694
- order is Z::
697
+ For some supersingular curves, Frobenius is in `\ZZ` and the Frobenius
698
+ order is `\ZZ`::
695
699
 
696
700
  sage: # needs sage.rings.finite_rings
697
701
  sage: E = EllipticCurve(GF(25,'a'),[0,0,0,0,1])
698
702
  sage: R = E.frobenius_order()
699
703
  sage: R
700
704
  Order generated by []
701
- in Number Field in phi with defining polynomial x + 5
705
+ in Number Field in pi with defining polynomial x + 5
702
706
  sage: R.degree()
703
707
  1
704
708
  """
705
709
  f = self.frobenius_polynomial().factor()[0][0]
706
- return ZZ.extension(f,names='phi')
710
+ return ZZ.extension(f, names='pi')
707
711
 
708
712
  def frobenius(self):
709
713
  r"""
@@ -720,7 +724,7 @@ class EllipticCurve_finite_field(EllipticCurve_field):
720
724
 
721
725
  sage: E = EllipticCurve(GF(11),[3,3])
722
726
  sage: E.frobenius()
723
- phi
727
+ pi
724
728
  sage: E.frobenius().minpoly()
725
729
  x^2 - 4*x + 11
726
730
 
@@ -1345,7 +1349,7 @@ class EllipticCurve_finite_field(EllipticCurve_field):
1345
1349
  """
1346
1350
  return not is_j_supersingular(self.j_invariant(), proof=proof)
1347
1351
 
1348
- def has_order(self, value, num_checks=8):
1352
+ def has_order(self, value, num_checks=8) -> bool:
1349
1353
  r"""
1350
1354
  Return ``True`` if the curve has order ``value``.
1351
1355
 
@@ -1621,7 +1625,11 @@ class EllipticCurve_finite_field(EllipticCurve_field):
1621
1625
 
1622
1626
  def height_above_floor(self, ell, e):
1623
1627
  r"""
1624
- Return the height of the `j`-invariant of this ordinary elliptic curve on its `\ell`-volcano.
1628
+ Return the height of the `j`-invariant of this elliptic curve on its `\ell`-volcano.
1629
+
1630
+ The curve must have a rational endomorphism ring of rank 2: This includes all
1631
+ ordinary elliptic curves over finite fields as well as those supersingular
1632
+ elliptic curves with Frobenius not in `\ZZ`.
1625
1633
 
1626
1634
  INPUT:
1627
1635
 
@@ -1632,12 +1640,12 @@ class EllipticCurve_finite_field(EllipticCurve_field):
1632
1640
 
1633
1641
  .. NOTE::
1634
1642
 
1635
- For an ordinary `E/\GF{q}`, and a prime `\ell`, the height
1636
- `e` of the `\ell`-volcano containing `j(E)` is the `\ell`-adic
1643
+ For a suitable `E/\GF{q}`, and a prime `\ell`, the height
1644
+ `e` of the `\ell`-volcano containing `E` is the `\ell`-adic
1637
1645
  valuation of the conductor of the order generated by the
1638
- Frobenius `\pi_E`; the height of `j(E)` on its
1646
+ `\GF{q}`-Frobenius `\pi_E`; the height of `E` on its
1639
1647
  ell-volcano is the `\ell`-adic valuation of the conductor
1640
- of the order `\text{End}(E)`.
1648
+ of the order `\text{End}_{\GF{q}}(E)`.
1641
1649
 
1642
1650
  ALGORITHM:
1643
1651
 
@@ -1654,10 +1662,51 @@ class EllipticCurve_finite_field(EllipticCurve_field):
1654
1662
  sage: E.height_above_floor(2,8)
1655
1663
  5
1656
1664
  """
1665
+ pi = self.frobenius()
1666
+ if pi in ZZ:
1667
+ raise ValueError("{} has a (rational) endomorphism ring of rank 4".format(self))
1668
+
1669
+ e = ZZ(e)
1670
+ if not e:
1671
+ return ZZ.zero()
1672
+
1657
1673
  if self.is_supersingular():
1658
- raise ValueError("{} is not ordinary".format(self))
1659
- if e == 0:
1660
- return 0
1674
+ if ell == self.base_field().characteristic():
1675
+ # In this (exceptional) case, the Frobenius can always be divided
1676
+ # by the maximal possible power of the characteristic. The reason
1677
+ # is that Frobenius must be of the form phi o [p^k] where phi is
1678
+ # a purely inseparable isogeny of degree 1 or p, hence this [p^k]
1679
+ # can always be divided out while retaining an endomorphism.
1680
+ assert self.base_field().cardinality().valuation(ell) >= 2*e
1681
+ return e
1682
+
1683
+ # In the supersingular case, the j-invariant alone does not determine
1684
+ # the level in the volcano. (The underlying reason is that there can
1685
+ # be multiple non-F_q-isomorphic curves with a given j-invariant in
1686
+ # the isogeny graph.)
1687
+ # Example: y^2 = x^3 ± x over F_p with p congruent to 3 modulo 4 have
1688
+ # distinct (rational) endomorphism rings.
1689
+ # Thus we run the "probing the depths" algorithm with F_q-isomorphism
1690
+ # classes of curves instead.
1691
+ E0 = [self] * 3
1692
+ E1 = [phi.codomain() for phi in self.isogenies_prime_degree(ell)]
1693
+ assert E1
1694
+ if len(E1) == 1:
1695
+ return ZZ.zero()
1696
+ assert len(E1) == ell + 1
1697
+ h = ZZ.one()
1698
+ while True:
1699
+ for i in range(3):
1700
+ isogs = E1[i].isogenies_prime_degree(ell)
1701
+ try:
1702
+ step = next(phi for phi in isogs if not phi.codomain().is_isomorphic(E0[i]))
1703
+ except StopIteration:
1704
+ return h
1705
+ E0[i], E1[i] = step.domain(), step.codomain()
1706
+ h += 1
1707
+ assert h <= e
1708
+ raise AssertionError('unreachable code -- this is a bug')
1709
+
1661
1710
  j = self.j_invariant()
1662
1711
  if j in [0, 1728]:
1663
1712
  return e
@@ -1665,19 +1714,19 @@ class EllipticCurve_finite_field(EllipticCurve_field):
1665
1714
  x = polygen(F)
1666
1715
  from sage.rings.polynomial.polynomial_ring import polygens
1667
1716
  from sage.schemes.elliptic_curves.mod_poly import classical_modular_polynomial
1668
- X, Y = polygens(F, "X, Y", 2)
1717
+ X, Y = polygens(F, 'X,Y')
1669
1718
  phi = classical_modular_polynomial(ell)(X, Y)
1670
1719
  j1 = phi([x,j]).roots(multiplicities=False)
1671
1720
  nj1 = len(j1)
1672
1721
  on_floor = self.two_torsion_rank() < 2 if ell == 2 else nj1 <= ell
1673
1722
  if on_floor:
1674
- return 0
1723
+ return ZZ.zero()
1675
1724
  if e == 1 or nj1 != ell+1: # double roots can only happen at the surface
1676
1725
  return e
1677
1726
  if nj1 < 3:
1678
- return 0
1727
+ return ZZ.zero()
1679
1728
  j0 = [j,j,j]
1680
- h = 1
1729
+ h = ZZ.one()
1681
1730
  while True:
1682
1731
  for i in range(3):
1683
1732
  r = (phi([x,j1[i]])//(x-j0[i])).roots(multiplicities=False)
@@ -1762,6 +1811,69 @@ class EllipticCurve_finite_field(EllipticCurve_field):
1762
1811
  return (v//cs[0])**2 * D0
1763
1812
  raise ValueError("Incorrect class number {}".format(h))
1764
1813
 
1814
+ def endomorphism_order(self):
1815
+ r"""
1816
+ Return a quadratic order isomorphic to the endomorphism ring
1817
+ of this elliptic curve, assuming the order has rank two.
1818
+
1819
+ .. NOTE::
1820
+
1821
+ In the future, this method will hopefully be extended to return a
1822
+ :class:`~sage.algebras.quatalg.quaternion_algebra.QuaternionOrder`
1823
+ object in the rank-4 case, but this has not been implemented yet.
1824
+
1825
+ .. SEEALSO::
1826
+
1827
+ :meth:`frobenius_order`
1828
+
1829
+ EXAMPLES::
1830
+
1831
+ sage: E = EllipticCurve(GF(11), [3,3])
1832
+ sage: E.endomorphism_order()
1833
+ Maximal Order generated by 1/2*pi + 1/2 in Number Field in pi with defining polynomial x^2 - 4*x + 11
1834
+
1835
+ It also works for supersingular elliptic curves provided that Frobenius
1836
+ is not in `\ZZ`::
1837
+
1838
+ sage: E = EllipticCurve(GF(11), [1,0])
1839
+ sage: E.is_supersingular()
1840
+ True
1841
+ sage: E.endomorphism_order()
1842
+ Order of conductor 2 generated by pi in Number Field in pi with defining polynomial x^2 + 11
1843
+
1844
+ ::
1845
+
1846
+ sage: E = EllipticCurve(GF(11), [-1,0])
1847
+ sage: E.is_supersingular()
1848
+ True
1849
+ sage: E.endomorphism_order()
1850
+ Maximal Order generated by 1/2*pi + 1/2 in Number Field in pi with defining polynomial x^2 + 11
1851
+
1852
+ There are some exceptional cases where Frobenius itself is divisible
1853
+ by the characteristic::
1854
+
1855
+ sage: EllipticCurve([GF(7^2).gen(), 0]).endomorphism_order()
1856
+ Gaussian Integers generated by 1/7*pi in Number Field in pi with defining polynomial x^2 + 49
1857
+ sage: EllipticCurve(GF(3^5), [1, 0]).endomorphism_order()
1858
+ Order of conductor 2 generated by 1/9*pi in Number Field in pi with defining polynomial x^2 + 243
1859
+ sage: EllipticCurve(GF(7^3), [-1, 0]).endomorphism_order()
1860
+ Maximal Order generated by 1/14*pi + 1/2 in Number Field in pi with defining polynomial x^2 + 343
1861
+ """
1862
+ pi = self.frobenius()
1863
+ if pi in ZZ:
1864
+ raise NotImplementedError('the rank-4 case is not supported yet')
1865
+
1866
+ O = self.frobenius_order()
1867
+ f0 = O.conductor()
1868
+
1869
+ f = 1
1870
+ for l,e in f0.factor():
1871
+ h = self.height_above_floor(l, e)
1872
+ f *= l**(e-h)
1873
+
1874
+ K = O.number_field()
1875
+ return K.order_of_conductor(f)
1876
+
1765
1877
  def twists(self):
1766
1878
  r"""
1767
1879
  Return a list of `k`-isomorphism representatives of all
@@ -2704,7 +2816,7 @@ def special_supersingular_curve(F, q=None, *, endomorphism=False):
2704
2816
  sage: pi = E.frobenius_isogeny()
2705
2817
  sage: pi.codomain() is pi.domain() is E
2706
2818
  True
2707
- sage: pi * endo == -endo * pi
2819
+ sage: pi * endo == -endo * pi # needs sage.symbolic
2708
2820
  True
2709
2821
 
2710
2822
  Also try it when `q` is given:
@@ -2733,7 +2845,7 @@ def special_supersingular_curve(F, q=None, *, endomorphism=False):
2733
2845
  sage: pi = E.frobenius_isogeny()
2734
2846
  sage: pi.codomain() is pi.domain() is E
2735
2847
  True
2736
- sage: pi * endo == -endo * pi
2848
+ sage: pi * endo == -endo * pi # needs sage.symbolic
2737
2849
  True
2738
2850
 
2739
2851
  .. NOTE::
@@ -3175,13 +3287,13 @@ def EllipticCurve_with_prime_order(N):
3175
3287
 
3176
3288
  def abs_products_under(bound):
3177
3289
  """
3178
- This function returns an iterator of all numbers with absolute value not
3179
- exceeding ``bound`` expressable as product of distinct elements in ``S``
3180
- in ascending order.
3290
+ This function returns an iterator of all numbers with absolute
3291
+ value not exceeding ``bound`` expressible as product of
3292
+ distinct elements in ``S`` in ascending order.
3181
3293
  """
3182
3294
  import heapq
3183
3295
  hq = [(1, 1, -1)]
3184
- while len(hq):
3296
+ while hq:
3185
3297
  abs_n, n, idx = heapq.heappop(hq)
3186
3298
  yield n
3187
3299
  for nxt in range(idx + 1, len(S)):
@@ -532,7 +532,7 @@ class EllipticCurveLocalData(SageObject):
532
532
  """
533
533
  return self._reduction_type
534
534
 
535
- def has_good_reduction(self):
535
+ def has_good_reduction(self) -> bool:
536
536
  r"""
537
537
  Return ``True`` if there is good reduction.
538
538
 
@@ -553,7 +553,7 @@ class EllipticCurveLocalData(SageObject):
553
553
  """
554
554
  return self._reduction_type is None
555
555
 
556
- def has_bad_reduction(self):
556
+ def has_bad_reduction(self) -> bool:
557
557
  r"""
558
558
  Return ``True`` if there is bad reduction.
559
559
 
@@ -576,7 +576,7 @@ class EllipticCurveLocalData(SageObject):
576
576
  """
577
577
  return self._reduction_type is not None
578
578
 
579
- def has_multiplicative_reduction(self):
579
+ def has_multiplicative_reduction(self) -> bool:
580
580
  r"""
581
581
  Return ``True`` if there is multiplicative reduction.
582
582
 
@@ -601,9 +601,9 @@ class EllipticCurveLocalData(SageObject):
601
601
  sage: [(p,E.local_data(p).has_multiplicative_reduction()) for p in [P17a,P17b]]
602
602
  [(Fractional ideal (4*a^2 - 2*a + 1), False), (Fractional ideal (2*a + 1), False)]
603
603
  """
604
- return self._reduction_type in (-1,+1)
604
+ return self._reduction_type in (-1, 1)
605
605
 
606
- def has_split_multiplicative_reduction(self):
606
+ def has_split_multiplicative_reduction(self) -> bool:
607
607
  r"""
608
608
  Return ``True`` if there is split multiplicative reduction.
609
609
 
@@ -626,9 +626,9 @@ class EllipticCurveLocalData(SageObject):
626
626
  [(Fractional ideal (4*a^2 - 2*a + 1), False),
627
627
  (Fractional ideal (2*a + 1), False)]
628
628
  """
629
- return self._reduction_type == +1
629
+ return self._reduction_type == 1
630
630
 
631
- def has_nonsplit_multiplicative_reduction(self):
631
+ def has_nonsplit_multiplicative_reduction(self) -> bool:
632
632
  r"""
633
633
  Return ``True`` if there is non-split multiplicative reduction.
634
634
 
@@ -652,7 +652,7 @@ class EllipticCurveLocalData(SageObject):
652
652
  """
653
653
  return self._reduction_type == -1
654
654
 
655
- def has_additive_reduction(self):
655
+ def has_additive_reduction(self) -> bool:
656
656
  r"""
657
657
  Return ``True`` if there is additive reduction.
658
658
 
@@ -679,7 +679,7 @@ class EllipticCurveLocalData(SageObject):
679
679
  r"""
680
680
  Tate's algorithm for an elliptic curve over a number field.
681
681
 
682
- Computes both local reduction data at a prime ideal and a
682
+ This computes both local reduction data at a prime ideal and a
683
683
  local minimal model.
684
684
 
685
685
  The model is not required to be integral on input. If `P` is