passagemath-schemes 10.5.48__cp312-cp312-musllinux_1_2_aarch64.whl → 10.6.47__cp312-cp312-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.
Potentially problematic release.
This version of passagemath-schemes might be problematic. Click here for more details.
- passagemath_schemes/__init__.py +3 -0
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/METADATA +42 -42
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/METADATA.bak +43 -43
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.dist-info}/RECORD +159 -140
- passagemath_schemes-10.6.47.dist-info/top_level.txt +3 -0
- passagemath_schemes.libs/{libflint-7dd7ad94.so.19.0.0 → libflint-edf7fb90.so.22.0.0} +0 -0
- passagemath_schemes.libs/{libgcc_s-69c45f16.so.1 → libgcc_s-2d945d6c.so.1} +0 -0
- passagemath_schemes.libs/{libgmp-8e78bd9b.so.10.5.0 → libgmp-28992bcb.so.10.5.0} +0 -0
- passagemath_schemes.libs/{libgmpxx-e6de26f1.so.4.7.0 → libgmpxx-fecb01a9.so.4.7.0} +0 -0
- passagemath_schemes.libs/{libmpfr-5ff10580.so.6.2.1 → libmpfr-1fc8ea36.so.6.2.2} +0 -0
- passagemath_schemes.libs/{libstdc++-1f1a71be.so.6.0.33 → libstdc++-85f2cd6d.so.6.0.33} +0 -0
- sage/all__sagemath_schemes.py +3 -2
- sage/databases/all__sagemath_schemes.py +0 -10
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +4 -4
- sage/dynamics/arithmetic_dynamics/generic_ds.py +3 -3
- sage/dynamics/arithmetic_dynamics/projective_ds.py +6 -6
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-aarch64-linux-musl.so +0 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +18 -18
- sage/lfunctions/zero_sums.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/abvar/abvar.py +12 -11
- sage/modular/abvar/constructor.py +3 -3
- sage/modular/abvar/cuspidal_subgroup.py +5 -6
- sage/modular/abvar/finite_subgroup.py +20 -18
- sage/modular/abvar/homology.py +1 -2
- sage/modular/abvar/homspace.py +1 -1
- sage/modular/abvar/lseries.py +3 -3
- sage/modular/abvar/morphism.py +1 -1
- sage/modular/abvar/torsion_point.py +1 -1
- sage/modular/abvar/torsion_subgroup.py +1 -1
- sage/modular/arithgroup/arithgroup_element.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/arithgroup_perm.py +16 -16
- sage/modular/arithgroup/congroup.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/congroup_gamma0.py +2 -2
- sage/modular/arithgroup/congroup_gamma1.py +4 -4
- sage/modular/arithgroup/congroup_gammaH.py +2 -2
- sage/modular/arithgroup/congroup_generic.py +2 -3
- sage/modular/arithgroup/congroup_sl2z.py +3 -3
- sage/modular/arithgroup/farey_symbol.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1 -2
- sage/modular/btquotients/btquotient.py +4 -5
- sage/modular/btquotients/pautomorphicform.py +2 -2
- sage/modular/cusps.py +6 -4
- sage/modular/cusps_nf.py +7 -8
- sage/modular/dirichlet.py +34 -43
- sage/modular/drinfeld_modform/element.py +4 -4
- sage/modular/drinfeld_modform/ring.py +12 -12
- sage/modular/drinfeld_modform/tutorial.py +1 -1
- sage/modular/hecke/algebra.py +7 -5
- sage/modular/hecke/ambient_module.py +2 -2
- sage/modular/hecke/element.py +7 -2
- sage/modular/hecke/module.py +9 -9
- sage/modular/hecke/submodule.py +6 -8
- sage/modular/hypergeometric_misc.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/hypergeometric_misc.pyx +3 -2
- sage/modular/hypergeometric_motive.py +2 -2
- sage/modular/local_comp/local_comp.py +19 -11
- sage/modular/local_comp/type_space.py +10 -8
- sage/modular/modform/ambient.py +4 -3
- sage/modular/modform/cuspidal_submodule.py +2 -2
- sage/modular/modform/element.py +72 -72
- sage/modular/modform/half_integral.py +1 -1
- sage/modular/modform/l_series_gross_zagier.py +3 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +5 -2
- sage/modular/modform/ring.py +10 -12
- sage/modular/modform/space.py +18 -21
- sage/modular/modform/weight1.py +1 -2
- sage/modular/modform_hecketriangle/abstract_ring.py +7 -14
- sage/modular/modform_hecketriangle/abstract_space.py +63 -66
- sage/modular/modform_hecketriangle/graded_ring_element.py +11 -12
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +82 -84
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +2 -2
- sage/modular/modform_hecketriangle/readme.py +9 -11
- sage/modular/modform_hecketriangle/series_constructor.py +10 -18
- sage/modular/modform_hecketriangle/space.py +29 -30
- sage/modular/modform_hecketriangle/subspace.py +9 -7
- sage/modular/modsym/all.py +2 -2
- sage/modular/modsym/ambient.py +13 -20
- sage/modular/modsym/boundary.py +2 -2
- sage/modular/modsym/manin_symbol.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/manin_symbol_list.py +3 -7
- sage/modular/modsym/relation_matrix_pyx.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/space.py +10 -22
- sage/modular/modsym/subspace.py +5 -7
- sage/modular/multiple_zeta.py +11 -13
- sage/modular/multiple_zeta_F_algebra.py +4 -6
- sage/modular/overconvergent/genus0.py +5 -4
- sage/modular/overconvergent/hecke_series.py +2 -2
- sage/modular/pollack_stevens/distributions.py +2 -2
- sage/modular/pollack_stevens/fund_domain.py +26 -29
- sage/modular/pollack_stevens/manin_map.py +15 -10
- sage/modular/pollack_stevens/modsym.py +18 -18
- sage/modular/quasimodform/element.py +10 -10
- sage/modular/quasimodform/ring.py +22 -22
- sage/modular/ssmod/ssmod.py +5 -12
- sage/rings/polynomial/binary_form_reduce.py +1 -1
- sage/schemes/curves/affine_curve.py +4 -4
- sage/schemes/curves/plane_curve_arrangement.py +28 -24
- sage/schemes/elliptic_curves/BSD.py +1 -1
- sage/schemes/elliptic_curves/addition_formulas_ring.py +4 -0
- sage/schemes/elliptic_curves/cm.py +1 -1
- sage/schemes/elliptic_curves/constructor.py +3 -3
- sage/schemes/elliptic_curves/ell_egros.py +1 -1
- sage/schemes/elliptic_curves/ell_field.py +57 -46
- sage/schemes/elliptic_curves/ell_finite_field.py +138 -26
- sage/schemes/elliptic_curves/ell_local_data.py +9 -9
- sage/schemes/elliptic_curves/ell_number_field.py +25 -24
- sage/schemes/elliptic_curves/ell_point.py +21 -22
- sage/schemes/elliptic_curves/ell_rational_field.py +38 -28
- sage/schemes/elliptic_curves/formal_group.py +1 -1
- sage/schemes/elliptic_curves/heegner.py +11 -8
- sage/schemes/elliptic_curves/height.py +26 -23
- sage/schemes/elliptic_curves/hom.py +2 -1
- sage/schemes/elliptic_curves/hom_composite.py +11 -11
- sage/schemes/elliptic_curves/hom_frobenius.py +8 -8
- sage/schemes/elliptic_curves/hom_sum.py +7 -1
- sage/schemes/elliptic_curves/hom_velusqrt.py +13 -7
- sage/schemes/elliptic_curves/homset.py +2 -2
- sage/schemes/elliptic_curves/isogeny_small_degree.py +1 -1
- sage/schemes/elliptic_curves/mod_poly.py +12 -5
- sage/schemes/elliptic_curves/mod_sym_num.cpython-312-aarch64-linux-musl.so +0 -0
- sage/schemes/elliptic_curves/padic_lseries.py +25 -13
- sage/schemes/elliptic_curves/padics.py +71 -62
- sage/schemes/elliptic_curves/period_lattice.py +78 -27
- sage/schemes/elliptic_curves/period_lattice_region.cpython-312-aarch64-linux-musl.so +0 -0
- sage/schemes/elliptic_curves/sha_tate.py +1 -1
- sage/schemes/elliptic_curves/weierstrass_morphism.py +2 -2
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +1 -1
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +1 -1
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +10 -20
- sage/schemes/jacobians/abstract_jacobian.py +1 -1
- sage/schemes/plane_conics/con_field.py +42 -42
- sage/schemes/plane_conics/con_rational_field.py +1 -1
- sage/schemes/riemann_surfaces/riemann_surface.py +8 -8
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- sage_wheels/share/ellcurves/rank9 +7 -0
- passagemath_schemes-10.5.48.dist-info/top_level.txt +0 -2
- sage/databases/db_modular_polynomials.py +0 -250
- sage/databases/stein_watkins.py +0 -363
- sage/modular/modsym/p1list.cpython-312-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/p1list.pxd +0 -29
- sage/modular/modsym/p1list.pyx +0 -1372
- {passagemath_schemes-10.5.48.dist-info → passagemath_schemes-10.6.47.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
|
-
#
|
|
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:
|
|
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
|
|
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
|
|
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)
|
|
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))
|
|
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
|
-
|
|
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
|
-
|
|
1776
|
-
|
|
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
|
|
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
|
|
2598
|
-
|
|
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
|
|
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
|
|
691
|
-
in Number Field in
|
|
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
|
|
694
|
-
order is
|
|
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
|
|
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='
|
|
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
|
-
|
|
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
|
|
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
|
|
1636
|
-
`e` of the `\ell`-volcano containing `
|
|
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 `
|
|
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
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
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,
|
|
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
|
|
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
|
|
1727
|
+
return ZZ.zero()
|
|
1679
1728
|
j0 = [j,j,j]
|
|
1680
|
-
h =
|
|
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
|
|
3179
|
-
exceeding ``bound``
|
|
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
|
|
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
|
|
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 ==
|
|
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
|
-
|
|
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
|