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
|
@@ -162,7 +162,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
162
162
|
[(52 : 111 : 1)]
|
|
163
163
|
sage: EK = E.base_extend(K)
|
|
164
164
|
sage: EK.gens() # needs eclib
|
|
165
|
-
|
|
165
|
+
((52 : 111 : 1),)
|
|
166
166
|
"""
|
|
167
167
|
E = super().base_extend(R)
|
|
168
168
|
if isinstance(E, EllipticCurve_number_field):
|
|
@@ -1064,7 +1064,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1064
1064
|
|
|
1065
1065
|
return self.local_data(P, proof, algorithm).minimal_model()
|
|
1066
1066
|
|
|
1067
|
-
def has_good_reduction(self, P):
|
|
1067
|
+
def has_good_reduction(self, P) -> bool:
|
|
1068
1068
|
r"""
|
|
1069
1069
|
Return ``True`` if this elliptic curve has good reduction at the prime `P`.
|
|
1070
1070
|
|
|
@@ -1099,7 +1099,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1099
1099
|
"""
|
|
1100
1100
|
return self.local_data(P).has_good_reduction()
|
|
1101
1101
|
|
|
1102
|
-
def has_bad_reduction(self, P):
|
|
1102
|
+
def has_bad_reduction(self, P) -> bool:
|
|
1103
1103
|
r"""
|
|
1104
1104
|
Return ``True`` if this elliptic curve has bad reduction at the prime `P`.
|
|
1105
1105
|
|
|
@@ -1134,7 +1134,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1134
1134
|
"""
|
|
1135
1135
|
return self.local_data(P).has_bad_reduction()
|
|
1136
1136
|
|
|
1137
|
-
def has_multiplicative_reduction(self, P):
|
|
1137
|
+
def has_multiplicative_reduction(self, P) -> bool:
|
|
1138
1138
|
r"""
|
|
1139
1139
|
Return ``True`` if this elliptic curve has (bad) multiplicative
|
|
1140
1140
|
reduction at the prime `P`.
|
|
@@ -1170,7 +1170,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1170
1170
|
"""
|
|
1171
1171
|
return self.local_data(P).has_multiplicative_reduction()
|
|
1172
1172
|
|
|
1173
|
-
def has_split_multiplicative_reduction(self, P):
|
|
1173
|
+
def has_split_multiplicative_reduction(self, P) -> bool:
|
|
1174
1174
|
r"""
|
|
1175
1175
|
Return ``True`` if this elliptic curve has (bad) split multiplicative reduction at the prime `P`.
|
|
1176
1176
|
|
|
@@ -1200,7 +1200,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1200
1200
|
"""
|
|
1201
1201
|
return self.local_data(P).has_split_multiplicative_reduction()
|
|
1202
1202
|
|
|
1203
|
-
def has_nonsplit_multiplicative_reduction(self, P):
|
|
1203
|
+
def has_nonsplit_multiplicative_reduction(self, P) -> bool:
|
|
1204
1204
|
r"""
|
|
1205
1205
|
Return ``True`` if this elliptic curve has (bad) non-split
|
|
1206
1206
|
multiplicative reduction at the prime `P`.
|
|
@@ -1231,7 +1231,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1231
1231
|
"""
|
|
1232
1232
|
return self.local_data(P).has_nonsplit_multiplicative_reduction()
|
|
1233
1233
|
|
|
1234
|
-
def has_additive_reduction(self, P):
|
|
1234
|
+
def has_additive_reduction(self, P) -> bool:
|
|
1235
1235
|
r"""
|
|
1236
1236
|
Return ``True`` if this elliptic curve has (bad) additive reduction at
|
|
1237
1237
|
the prime `P`.
|
|
@@ -1296,7 +1296,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1296
1296
|
|
|
1297
1297
|
return self.local_data(P, proof).tamagawa_number()
|
|
1298
1298
|
|
|
1299
|
-
def tamagawa_numbers(self):
|
|
1299
|
+
def tamagawa_numbers(self) -> list:
|
|
1300
1300
|
"""
|
|
1301
1301
|
Return a list of all Tamagawa numbers for all prime divisors of the
|
|
1302
1302
|
conductor (in order).
|
|
@@ -1775,7 +1775,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1775
1775
|
K.ideal(1))
|
|
1776
1776
|
return Cl(I)
|
|
1777
1777
|
|
|
1778
|
-
def has_global_minimal_model(self):
|
|
1778
|
+
def has_global_minimal_model(self) -> bool:
|
|
1779
1779
|
r"""
|
|
1780
1780
|
Return whether this elliptic curve has a global minimal model.
|
|
1781
1781
|
|
|
@@ -1902,7 +1902,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1902
1902
|
y^2 + a*x*y = x^3 + a*x^2 + (3*a+8)*x + (4*a+3) over Number Field
|
|
1903
1903
|
in a with defining polynomial x^2 - 10 has no global minimal model!
|
|
1904
1904
|
For a semi-global minimal model use semi_global=True
|
|
1905
|
-
sage: E.global_minimal_model(semi_global=True)
|
|
1905
|
+
sage: E.global_minimal_model(semi_global=True) # needs sage.symbolic
|
|
1906
1906
|
Elliptic Curve defined by
|
|
1907
1907
|
y^2 + a*x*y = x^3 + a*x^2 + (3*a+8)*x + (4*a+3) over Number Field in a
|
|
1908
1908
|
with defining polynomial x^2 - 10
|
|
@@ -1910,6 +1910,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
1910
1910
|
An example of a curve with everywhere good reduction but which
|
|
1911
1911
|
has no model with unit discriminant::
|
|
1912
1912
|
|
|
1913
|
+
sage: # needs sage.symbolic
|
|
1913
1914
|
sage: x = polygen(QQ)
|
|
1914
1915
|
sage: K.<a> = NumberField(x^2 - x - 16)
|
|
1915
1916
|
sage: K.class_number()
|
|
@@ -2375,9 +2376,9 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
2375
2376
|
sage: K.<a> = NumberField(x^2 + 23, 'a')
|
|
2376
2377
|
sage: E = EllipticCurve(K,[0,0,0,101,0])
|
|
2377
2378
|
sage: E.gens() # needs eclib
|
|
2378
|
-
|
|
2379
|
+
((23831509/8669448*a - 2867471/8669448 : 76507317707/18049790736*a - 424166479633/18049790736 : 1),
|
|
2379
2380
|
(-2031032029/969232392*a + 58813561/969232392 : -15575984630401/21336681877488*a + 451041199309/21336681877488 : 1),
|
|
2380
|
-
(-186948623/4656964 : 549438861195/10049728312*a : 1)
|
|
2381
|
+
(-186948623/4656964 : 549438861195/10049728312*a : 1))
|
|
2381
2382
|
|
|
2382
2383
|
It can happen that no points are found if the height bounds
|
|
2383
2384
|
used in the search are too small (see :issue:`10745`)::
|
|
@@ -2386,11 +2387,11 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
2386
2387
|
sage: K.<t> = NumberField(x^4 + x^2 - 7)
|
|
2387
2388
|
sage: E = EllipticCurve(K, [1, 0, 5*t^2 + 16, 0, 0])
|
|
2388
2389
|
sage: E.gens(lim1=1, lim3=1)
|
|
2389
|
-
|
|
2390
|
+
()
|
|
2390
2391
|
sage: E.rank()
|
|
2391
2392
|
1
|
|
2392
2393
|
sage: gg = E.gens(lim3=13); gg # long time (about 4s)
|
|
2393
|
-
|
|
2394
|
+
((... : 1),)
|
|
2394
2395
|
|
|
2395
2396
|
Check that the point found has infinite order, and that it is on the curve::
|
|
2396
2397
|
|
|
@@ -2405,7 +2406,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
2405
2406
|
sage: K.<t> = NumberField(x^2 - 17)
|
|
2406
2407
|
sage: E = EllipticCurve(K, [-4, 0])
|
|
2407
2408
|
sage: E.gens() # needs eclib
|
|
2408
|
-
|
|
2409
|
+
((-1/2*t + 1/2 : -1/2*t + 1/2 : 1), (-t + 3 : -2*t + 10 : 1))
|
|
2409
2410
|
sage: E.rank()
|
|
2410
2411
|
2
|
|
2411
2412
|
|
|
@@ -2417,7 +2418,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
2417
2418
|
sage: EK.rank()
|
|
2418
2419
|
0
|
|
2419
2420
|
sage: EK.gens() # needs eclib
|
|
2420
|
-
|
|
2421
|
+
()
|
|
2421
2422
|
|
|
2422
2423
|
IMPLEMENTATION:
|
|
2423
2424
|
|
|
@@ -2427,10 +2428,10 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
2427
2428
|
PARI/GP scripts from http://www.math.unicaen.fr/~simon/.
|
|
2428
2429
|
"""
|
|
2429
2430
|
try:
|
|
2430
|
-
return self.gens_quadratic(**kwds)
|
|
2431
|
+
return tuple(self.gens_quadratic(**kwds))
|
|
2431
2432
|
except ValueError:
|
|
2432
2433
|
self.simon_two_descent(**kwds)
|
|
2433
|
-
return self._known_points
|
|
2434
|
+
return tuple(self._known_points)
|
|
2434
2435
|
|
|
2435
2436
|
def period_lattice(self, embedding):
|
|
2436
2437
|
r"""
|
|
@@ -3187,7 +3188,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
3187
3188
|
sage: c6c = -124369 + 15988*(1 + s)/2
|
|
3188
3189
|
sage: E = EllipticCurve_from_c4c6(c4, c6)
|
|
3189
3190
|
sage: Ec = EllipticCurve_from_c4c6(c4c, c6c)
|
|
3190
|
-
sage: E.is_isogenous(Ec)
|
|
3191
|
+
sage: E.is_isogenous(Ec) # needs sage.symbolic
|
|
3191
3192
|
True
|
|
3192
3193
|
|
|
3193
3194
|
Check that :issue:`17295` is fixed::
|
|
@@ -3198,7 +3199,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
3198
3199
|
sage: Ec = EllipticCurve(k, [3*s*(4 - 5*s), -2*s*(2 - 14*s + 11*s^2)])
|
|
3199
3200
|
sage: EK = E.base_extend(K)
|
|
3200
3201
|
sage: EcK = Ec.base_extend(K)
|
|
3201
|
-
sage: EK.is_isogenous(EcK) # long time (about 3.5 s)
|
|
3202
|
+
sage: EK.is_isogenous(EcK) # long time (about 3.5 s) # needs sage.symbolic
|
|
3202
3203
|
True
|
|
3203
3204
|
"""
|
|
3204
3205
|
if not isinstance(other, EllipticCurve_generic):
|
|
@@ -3596,7 +3597,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
3596
3597
|
return ZZ.zero()
|
|
3597
3598
|
|
|
3598
3599
|
@cached_method
|
|
3599
|
-
def has_cm(self):
|
|
3600
|
+
def has_cm(self) -> bool:
|
|
3600
3601
|
"""
|
|
3601
3602
|
Return whether or not this curve has a CM `j`-invariant.
|
|
3602
3603
|
|
|
@@ -3637,7 +3638,7 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
3637
3638
|
return not self.cm_discriminant().is_zero()
|
|
3638
3639
|
|
|
3639
3640
|
@cached_method
|
|
3640
|
-
def has_rational_cm(self, field=None):
|
|
3641
|
+
def has_rational_cm(self, field=None) -> bool:
|
|
3641
3642
|
r"""
|
|
3642
3643
|
Return whether or not this curve has CM defined over its
|
|
3643
3644
|
base field or a given extension.
|
|
@@ -4194,9 +4195,9 @@ class EllipticCurve_number_field(EllipticCurve_field):
|
|
|
4194
4195
|
|
|
4195
4196
|
sage: # needs database_cremona_mini_ellcurve
|
|
4196
4197
|
sage: E = EllipticCurve("11a1")
|
|
4197
|
-
sage: E.rational_points(bound=5)
|
|
4198
|
+
sage: E.rational_points(bound=5) # needs sage.symbolic
|
|
4198
4199
|
[(0 : 1 : 0), (5 : 5 : 1)]
|
|
4199
|
-
sage: E.rational_points(bound=6)
|
|
4200
|
+
sage: E.rational_points(bound=6) # long time # needs sage.symbolic
|
|
4200
4201
|
[(0 : 1 : 0), (5 : -6 : 1), (5 : 5 : 1)]
|
|
4201
4202
|
|
|
4202
4203
|
An example over a number field::
|
|
@@ -275,8 +275,8 @@ class EllipticCurvePoint(AdditiveGroupElement,
|
|
|
275
275
|
....: if xs:
|
|
276
276
|
....: pts.append(E(choice(xs), y, z))
|
|
277
277
|
sage: P, Q = pts
|
|
278
|
-
sage: R = P + Q
|
|
279
|
-
sage: for d in N.divisors():
|
|
278
|
+
sage: R = P + Q # not tested (:issue:`39191`)
|
|
279
|
+
sage: for d in N.divisors(): # not tested (:issue:`39191`)
|
|
280
280
|
....: if d > 1:
|
|
281
281
|
....: assert R.change_ring(Zmod(d)) == P.change_ring(Zmod(d)) + Q.change_ring(Zmod(d))
|
|
282
282
|
"""
|
|
@@ -790,7 +790,7 @@ class EllipticCurvePoint_field(EllipticCurvePoint,
|
|
|
790
790
|
|
|
791
791
|
additive_order = order
|
|
792
792
|
|
|
793
|
-
def __bool__(self):
|
|
793
|
+
def __bool__(self) -> bool:
|
|
794
794
|
"""
|
|
795
795
|
Return ``True`` if this is not the zero point on the curve.
|
|
796
796
|
|
|
@@ -808,7 +808,7 @@ class EllipticCurvePoint_field(EllipticCurvePoint,
|
|
|
808
808
|
"""
|
|
809
809
|
return bool(self._coords[2])
|
|
810
810
|
|
|
811
|
-
def has_order(self, n):
|
|
811
|
+
def has_order(self, n) -> bool:
|
|
812
812
|
r"""
|
|
813
813
|
Test if this point has order exactly `n`.
|
|
814
814
|
|
|
@@ -907,7 +907,7 @@ class EllipticCurvePoint_field(EllipticCurvePoint,
|
|
|
907
907
|
self._order = n
|
|
908
908
|
return ret
|
|
909
909
|
|
|
910
|
-
def has_finite_order(self):
|
|
910
|
+
def has_finite_order(self) -> bool:
|
|
911
911
|
"""
|
|
912
912
|
Return ``True`` if this point has finite additive order as an
|
|
913
913
|
element of the group of points on this curve.
|
|
@@ -937,7 +937,7 @@ class EllipticCurvePoint_field(EllipticCurvePoint,
|
|
|
937
937
|
|
|
938
938
|
is_finite_order = has_finite_order # for backward compatibility
|
|
939
939
|
|
|
940
|
-
def has_infinite_order(self):
|
|
940
|
+
def has_infinite_order(self) -> bool:
|
|
941
941
|
"""
|
|
942
942
|
Return ``True`` if this point has infinite additive order as an element
|
|
943
943
|
of the group of points on this curve.
|
|
@@ -2417,11 +2417,11 @@ class EllipticCurvePoint_field(EllipticCurvePoint,
|
|
|
2417
2417
|
raise ValueError("The point P must be n-torsion")
|
|
2418
2418
|
|
|
2419
2419
|
# NOTE: Pari returns the non-reduced Tate pairing, so we
|
|
2420
|
-
# must perform the
|
|
2420
|
+
# must perform the exponentiation ourselves using the supplied
|
|
2421
2421
|
# k value
|
|
2422
2422
|
ePQ = pari.elltatepairing(E, P, Q, n)
|
|
2423
2423
|
exp = Integer((q**k - 1)/n)
|
|
2424
|
-
return K(ePQ**exp)
|
|
2424
|
+
return K(ePQ**exp) # Cast the PARI type back to the base ring
|
|
2425
2425
|
|
|
2426
2426
|
def ate_pairing(self, Q, n, k, t, q=None):
|
|
2427
2427
|
r"""
|
|
@@ -2816,7 +2816,7 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
2816
2816
|
|
|
2817
2817
|
additive_order = order
|
|
2818
2818
|
|
|
2819
|
-
def has_finite_order(self):
|
|
2819
|
+
def has_finite_order(self) -> bool:
|
|
2820
2820
|
"""
|
|
2821
2821
|
Return ``True`` iff this point has finite order on the elliptic curve.
|
|
2822
2822
|
|
|
@@ -2839,7 +2839,7 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
2839
2839
|
return True
|
|
2840
2840
|
return self.order() != oo
|
|
2841
2841
|
|
|
2842
|
-
def has_infinite_order(self):
|
|
2842
|
+
def has_infinite_order(self) -> bool:
|
|
2843
2843
|
r"""
|
|
2844
2844
|
Return ``True`` iff this point has infinite order on the elliptic curve.
|
|
2845
2845
|
|
|
@@ -3037,7 +3037,7 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
3037
3037
|
gxdd = gxd.derivative()
|
|
3038
3038
|
return (e(gxd(self[0])) > 0 and e(gxdd(self[0])) > 0)
|
|
3039
3039
|
|
|
3040
|
-
def has_good_reduction(self, P=None):
|
|
3040
|
+
def has_good_reduction(self, P=None) -> bool:
|
|
3041
3041
|
r"""
|
|
3042
3042
|
Return ``True`` iff this point has good reduction modulo a prime.
|
|
3043
3043
|
|
|
@@ -3770,7 +3770,7 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
3770
3770
|
|
|
3771
3771
|
Examples 2 and 3 from [Sil1988]_::
|
|
3772
3772
|
|
|
3773
|
-
sage: # needs sage.rings.number_field
|
|
3773
|
+
sage: # needs sage.rings.number_field sage.symbolic
|
|
3774
3774
|
sage: x = polygen(ZZ, 'x')
|
|
3775
3775
|
sage: K.<i> = NumberField(x^2 + 1)
|
|
3776
3776
|
sage: E = EllipticCurve(K, [0,0,4,6*i,0]); E
|
|
@@ -3783,8 +3783,6 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
3783
3783
|
0
|
|
3784
3784
|
sage: P.non_archimedean_local_height(K.ideal(1-2*i))
|
|
3785
3785
|
0
|
|
3786
|
-
|
|
3787
|
-
sage: # needs sage.rings.number_field
|
|
3788
3786
|
sage: Q = E.lift_x(-9/4); Q
|
|
3789
3787
|
(-9/4 : 27/8*i - 4 : 1)
|
|
3790
3788
|
sage: Q.non_archimedean_local_height(K.ideal(1+i))
|
|
@@ -3800,13 +3798,13 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
3800
3798
|
|
|
3801
3799
|
sage: E = EllipticCurve([0, 0, 0, -36, 0])
|
|
3802
3800
|
sage: P = E([-3, 9])
|
|
3803
|
-
sage: P.non_archimedean_local_height()
|
|
3801
|
+
sage: P.non_archimedean_local_height() # needs sage.symbolic
|
|
3804
3802
|
-log(3)
|
|
3805
3803
|
|
|
3806
3804
|
Local heights of torsion points can be nonzero (unlike the
|
|
3807
3805
|
global height)::
|
|
3808
3806
|
|
|
3809
|
-
sage: # needs sage.rings.number_field
|
|
3807
|
+
sage: # needs sage.rings.number_field sage.symbolic
|
|
3810
3808
|
sage: K.<i> = QuadraticField(-1)
|
|
3811
3809
|
sage: E = EllipticCurve([0, 0, 0, K(1), 0])
|
|
3812
3810
|
sage: P = E(i, 0)
|
|
@@ -3815,12 +3813,13 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
3815
3813
|
|
|
3816
3814
|
TESTS::
|
|
3817
3815
|
|
|
3818
|
-
sage: Q.non_archimedean_local_height(prec=100) # needs sage.rings.number_field
|
|
3816
|
+
sage: Q.non_archimedean_local_height(prec=100) # needs sage.rings.number_field sage.symbolic
|
|
3819
3817
|
1.3862943611198906188344642429
|
|
3820
|
-
sage: (3*Q).non_archimedean_local_height() # needs sage.rings.number_field
|
|
3818
|
+
sage: (3*Q).non_archimedean_local_height() # needs sage.rings.number_field sage.symbolic
|
|
3821
3819
|
1/2*log(75923153929839865104)
|
|
3822
3820
|
|
|
3823
3821
|
sage: # needs sage.rings.number_field
|
|
3822
|
+
sage: x = polygen(ZZ, 'x')
|
|
3824
3823
|
sage: F.<a> = NumberField(x^4 + 2*x^3 + 19*x^2 + 18*x + 288)
|
|
3825
3824
|
sage: F.ring_of_integers().basis()
|
|
3826
3825
|
[1, 5/6*a^3 + 1/6*a, 1/6*a^3 + 1/6*a^2, a^3]
|
|
@@ -3831,20 +3830,20 @@ class EllipticCurvePoint_number_field(EllipticCurvePoint_field):
|
|
|
3831
3830
|
(-1/6*a^2 - 1/6*a - 1 : a : 1)
|
|
3832
3831
|
sage: P[0].is_integral()
|
|
3833
3832
|
True
|
|
3834
|
-
sage: P.non_archimedean_local_height()
|
|
3833
|
+
sage: P.non_archimedean_local_height() # needs sage.symbolic
|
|
3835
3834
|
0
|
|
3836
3835
|
|
|
3837
3836
|
This shows that the bug reported at :issue:`13951` has been fixed::
|
|
3838
3837
|
|
|
3839
3838
|
sage: E = EllipticCurve([0,17])
|
|
3840
3839
|
sage: P = E(2,5)
|
|
3841
|
-
sage: P.non_archimedean_local_height(2)
|
|
3840
|
+
sage: P.non_archimedean_local_height(2) # needs sage.symbolic
|
|
3842
3841
|
-2/3*log(2)
|
|
3843
3842
|
|
|
3844
3843
|
This shows that the bug reported at :issue:`36834` (incorrect
|
|
3845
3844
|
value when the model is not integral) has been fixed::
|
|
3846
3845
|
|
|
3847
|
-
sage: # needs sage.rings.number_field
|
|
3846
|
+
sage: # needs sage.rings.number_field sage.symbolic
|
|
3848
3847
|
sage: K.<a> = QuadraticField(84131656042917)
|
|
3849
3848
|
sage: E = EllipticCurve(K, [0, 0, 0, -5482707841/48, -244634179112639/864])
|
|
3850
3849
|
sage: P = E(349189/12, 1/2*a)
|
|
@@ -4673,7 +4672,7 @@ class EllipticCurvePoint_finite_field(EllipticCurvePoint_field):
|
|
|
4673
4672
|
|
|
4674
4673
|
return ZZ(k % p)
|
|
4675
4674
|
|
|
4676
|
-
def has_finite_order(self):
|
|
4675
|
+
def has_finite_order(self) -> bool:
|
|
4677
4676
|
r"""
|
|
4678
4677
|
Return ``True`` if this point has finite additive order as an element
|
|
4679
4678
|
of the group of points on this curve.
|
|
@@ -1726,9 +1726,9 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
1726
1726
|
sage: E = EllipticCurve("974b1")
|
|
1727
1727
|
sage: r = E.rank(); r
|
|
1728
1728
|
0
|
|
1729
|
-
sage: E.analytic_rank_upper_bound(max_Delta=1, root_number='ignore')
|
|
1729
|
+
sage: E.analytic_rank_upper_bound(max_Delta=1, root_number='ignore') # needs sage.symbolic
|
|
1730
1730
|
1
|
|
1731
|
-
sage: E.analytic_rank_upper_bound(max_Delta=1.3, root_number='ignore')
|
|
1731
|
+
sage: E.analytic_rank_upper_bound(max_Delta=1.3, root_number='ignore') # needs sage.symbolic
|
|
1732
1732
|
0
|
|
1733
1733
|
|
|
1734
1734
|
Knowing the root number of `E` allows us to use smaller Delta values
|
|
@@ -1736,7 +1736,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
1736
1736
|
|
|
1737
1737
|
::
|
|
1738
1738
|
|
|
1739
|
-
sage: E.analytic_rank_upper_bound(max_Delta=0.6, root_number='compute')
|
|
1739
|
+
sage: E.analytic_rank_upper_bound(max_Delta=0.6, root_number='compute') # needs sage.symbolic
|
|
1740
1740
|
0
|
|
1741
1741
|
|
|
1742
1742
|
There are a small number of curves which have pathologically low-lying
|
|
@@ -1751,9 +1751,9 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
1751
1751
|
sage: E = EllipticCurve([0, -1, 0, -7460362000712, -7842981500851012704])
|
|
1752
1752
|
sage: N, r = E.conductor(), E.analytic_rank(); N, r
|
|
1753
1753
|
(256944, 0)
|
|
1754
|
-
sage: E.analytic_rank_upper_bound(max_Delta=1, adaptive=False)
|
|
1754
|
+
sage: E.analytic_rank_upper_bound(max_Delta=1, adaptive=False) # needs sage.symbolic
|
|
1755
1755
|
2
|
|
1756
|
-
sage: E.analytic_rank_upper_bound(max_Delta=2, adaptive=False)
|
|
1756
|
+
sage: E.analytic_rank_upper_bound(max_Delta=2, adaptive=False) # needs sage.symbolic
|
|
1757
1757
|
2
|
|
1758
1758
|
|
|
1759
1759
|
This method is can be called on curves with large conductor.
|
|
@@ -1761,7 +1761,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
1761
1761
|
::
|
|
1762
1762
|
|
|
1763
1763
|
sage: E = EllipticCurve([-2934,19238])
|
|
1764
|
-
sage: E.analytic_rank_upper_bound()
|
|
1764
|
+
sage: E.analytic_rank_upper_bound() # needs sage.symbolic
|
|
1765
1765
|
1
|
|
1766
1766
|
|
|
1767
1767
|
And it can bound rank on curves with *very* large conductor, so long as
|
|
@@ -1777,7 +1777,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
1777
1777
|
sage: E = EllipticCurve([1, -1, 1, a4, a6])
|
|
1778
1778
|
sage: bad_primes = [2, 3, 5, 7, 11, 13, 17, 19, 48463]
|
|
1779
1779
|
sage: N = 3455601108357547341532253864901605231198511505793733138900595189472144724781456635380154149870961231592352897621963802238155192936274322687070
|
|
1780
|
-
sage: E.analytic_rank_upper_bound(max_Delta=2.37, adaptive=False, # long time
|
|
1780
|
+
sage: E.analytic_rank_upper_bound(max_Delta=2.37, adaptive=False, # long time, needs sage.symbolic
|
|
1781
1781
|
....: N=N, root_number=1,
|
|
1782
1782
|
....: bad_primes=bad_primes, ncpus=2)
|
|
1783
1783
|
32
|
|
@@ -2367,6 +2367,15 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
2367
2367
|
sage: P = E.lift_x(10/9)
|
|
2368
2368
|
sage: set(E.gens()) <= set([P,-P]) # needs eclib
|
|
2369
2369
|
True
|
|
2370
|
+
|
|
2371
|
+
Check that :issue:`38813` has been fixed::
|
|
2372
|
+
|
|
2373
|
+
sage: # long time
|
|
2374
|
+
sage: E = EllipticCurve([-127^2,0])
|
|
2375
|
+
sage: l = E.gens(use_database=False, algorithm='pari', pari_effort=4); l # random
|
|
2376
|
+
[(611429153205013185025/9492121848205441 : 15118836457596902442737698070880/924793900700594415341761 : 1)]
|
|
2377
|
+
sage: a = E(611429153205013185025/9492121848205441, 15118836457596902442737698070880/924793900700594415341761)
|
|
2378
|
+
sage: assert len(l) == 1 and ((l[0] - a).is_finite_order() or (l[0] + a).is_finite_order())
|
|
2370
2379
|
"""
|
|
2371
2380
|
if proof is None:
|
|
2372
2381
|
from sage.structure.proof.proof import get_flag
|
|
@@ -2419,14 +2428,15 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
2419
2428
|
True
|
|
2420
2429
|
|
|
2421
2430
|
sage: E = EllipticCurve([-127^2,0])
|
|
2422
|
-
sage: E.gens(use_database=False, algorithm='pari',pari_effort=4) #
|
|
2431
|
+
sage: E.gens(use_database=False, algorithm='pari', pari_effort=4) # long time, needs eclib # random
|
|
2423
2432
|
[(611429153205013185025/9492121848205441 : 15118836457596902442737698070880/924793900700594415341761 : 1)]
|
|
2424
2433
|
|
|
2425
2434
|
TESTS::
|
|
2426
2435
|
|
|
2436
|
+
sage: E = EllipticCurve([-127^2,0])
|
|
2427
2437
|
sage: P = E.lift_x(611429153205013185025/9492121848205441)
|
|
2428
|
-
sage: ge = set(E.gens(use_database=False, algorithm='pari', pari_effort=4)) # needs eclib
|
|
2429
|
-
sage: ge <= set([P+T for T in E.torsion_points()] # needs eclib
|
|
2438
|
+
sage: ge = set(E.gens(use_database=False, algorithm='pari', pari_effort=4)) # long time, needs eclib
|
|
2439
|
+
sage: ge <= set([P+T for T in E.torsion_points()] # long time, needs eclib
|
|
2430
2440
|
....: + [-P+T for T in E.torsion_points()])
|
|
2431
2441
|
True
|
|
2432
2442
|
"""
|
|
@@ -3402,7 +3412,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
3402
3412
|
self.__tamagawa_product = Integer(self.pari_mincurve().ellglobalred()[2].sage())
|
|
3403
3413
|
return self.__tamagawa_product
|
|
3404
3414
|
|
|
3405
|
-
def real_components(self):
|
|
3415
|
+
def real_components(self) -> int:
|
|
3406
3416
|
r"""
|
|
3407
3417
|
Return the number of real components.
|
|
3408
3418
|
|
|
@@ -3420,7 +3430,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
3420
3430
|
"""
|
|
3421
3431
|
return 2 if self.discriminant() > 0 else 1
|
|
3422
3432
|
|
|
3423
|
-
def has_good_reduction_outside_S(self, S=None):
|
|
3433
|
+
def has_good_reduction_outside_S(self, S=None) -> bool:
|
|
3424
3434
|
r"""
|
|
3425
3435
|
Test if this elliptic curve has good reduction outside ``S``.
|
|
3426
3436
|
|
|
@@ -4420,7 +4430,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
4420
4430
|
else:
|
|
4421
4431
|
return Integer(e.ellrootno(p))
|
|
4422
4432
|
|
|
4423
|
-
def has_cm(self):
|
|
4433
|
+
def has_cm(self) -> bool:
|
|
4424
4434
|
r"""
|
|
4425
4435
|
Return whether or not this curve has a CM `j`-invariant.
|
|
4426
4436
|
|
|
@@ -4486,7 +4496,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
4486
4496
|
except KeyError:
|
|
4487
4497
|
raise ValueError("%s does not have CM" % self)
|
|
4488
4498
|
|
|
4489
|
-
def has_rational_cm(self, field=None):
|
|
4499
|
+
def has_rational_cm(self, field=None) -> bool:
|
|
4490
4500
|
r"""
|
|
4491
4501
|
Return whether or not this curve has CM defined over `\QQ`
|
|
4492
4502
|
or the given field.
|
|
@@ -6014,7 +6024,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
6014
6024
|
The bug reported on :issue:`22719` is now fixed::
|
|
6015
6025
|
|
|
6016
6026
|
sage: E = EllipticCurve("141d1")
|
|
6017
|
-
sage: E.integral_points() # needs eclib
|
|
6027
|
+
sage: E.integral_points() # needs eclib sage.symbolic
|
|
6018
6028
|
[(0 : -1 : 1), (2 : -2 : 1)]
|
|
6019
6029
|
"""
|
|
6020
6030
|
xmin = pari(xmin)
|
|
@@ -6090,7 +6100,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
6090
6100
|
::
|
|
6091
6101
|
|
|
6092
6102
|
sage: E = EllipticCurve([0,0,1,-7,6])
|
|
6093
|
-
sage: a = E.integral_points(both_signs=True); a # needs eclib
|
|
6103
|
+
sage: a = E.integral_points(both_signs=True); a # needs eclib sage.symbolic
|
|
6094
6104
|
[(-3 : -1 : 1), (-3 : 0 : 1), (-2 : -4 : 1), (-2 : 3 : 1), (-1 : -4 : 1),
|
|
6095
6105
|
(-1 : 3 : 1), (0 : -3 : 1), (0 : 2 : 1), (1 : -1 : 1), (1 : 0 : 1),
|
|
6096
6106
|
(2 : -1 : 1), (2 : 0 : 1), (3 : -4 : 1), (3 : 3 : 1), (4 : -7 : 1),
|
|
@@ -6102,7 +6112,7 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
6102
6112
|
|
|
6103
6113
|
An example with negative discriminant::
|
|
6104
6114
|
|
|
6105
|
-
sage: EllipticCurve('900d1').integral_points()
|
|
6115
|
+
sage: EllipticCurve('900d1').integral_points() # needs eclib sage.symbolic
|
|
6106
6116
|
[(-11 : -27 : 1), (-4 : -34 : 1), (4 : -18 : 1), (16 : -54 : 1)]
|
|
6107
6117
|
|
|
6108
6118
|
Another example with rank 5 and no torsion points::
|
|
@@ -6111,29 +6121,29 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
6111
6121
|
sage: P1 = E.point((540,1188)); P2 = E.point((576,1836))
|
|
6112
6122
|
sage: P3 = E.point((468,3132)); P4 = E.point((612,3132))
|
|
6113
6123
|
sage: P5 = E.point((432,4428))
|
|
6114
|
-
sage: a = E.integral_points([P1,P2,P3,P4,P5]); len(a) # long time (18s on sage.math, 2011)
|
|
6124
|
+
sage: a = E.integral_points([P1,P2,P3,P4,P5]); len(a) # long time (18s on sage.math, 2011), needs sage.symbolic
|
|
6115
6125
|
54
|
|
6116
6126
|
|
|
6117
6127
|
TESTS:
|
|
6118
6128
|
|
|
6119
6129
|
The bug reported on :issue:`4525` is now fixed::
|
|
6120
6130
|
|
|
6121
|
-
sage: EllipticCurve('91b1').integral_points()
|
|
6131
|
+
sage: EllipticCurve('91b1').integral_points() # needs eclib sage.symbolic
|
|
6122
6132
|
[(-1 : -4 : 1), (1 : -1 : 1), (3 : -5 : 1)]
|
|
6123
6133
|
|
|
6124
6134
|
::
|
|
6125
6135
|
|
|
6126
|
-
sage: [len(e.integral_points(both_signs=False)) for e in cremona_curves([11..100])] # long time (15s on sage.math, 2011)
|
|
6136
|
+
sage: [len(e.integral_points(both_signs=False)) for e in cremona_curves([11..100])] # long time (15s on sage.math, 2011), needs eclib sage.symbolic
|
|
6127
6137
|
[2, 0, 2, 3, 2, 1, 3, 0, 2, 4, 2, 4, 3, 0, 0, 1, 2, 1, 2, 0, 2, 1, 0, 1, 3, 3, 1, 1, 4, 2, 3, 2, 0, 0, 5, 3, 2, 2, 1, 1, 1, 0, 1, 3, 0, 1, 0, 1, 1, 3, 6, 1, 2, 2, 2, 0, 0, 2, 3, 1, 2, 2, 1, 1, 0, 3, 2, 1, 0, 1, 0, 1, 3, 3, 1, 1, 5, 1, 0, 1, 1, 0, 1, 2, 0, 2, 0, 1, 1, 3, 1, 2, 2, 4, 4, 2, 1, 0, 0, 5, 1, 0, 1, 2, 0, 2, 2, 0, 0, 0, 1, 0, 3, 1, 5, 1, 2, 4, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 0, 0, 1, 0, 1, 1, 4, 1, 0, 1, 1, 0, 4, 2, 0, 1, 1, 2, 3, 1, 1, 1, 1, 6, 2, 1, 1, 0, 2, 0, 6, 2, 0, 4, 2, 2, 0, 0, 1, 2, 0, 2, 1, 0, 3, 1, 2, 1, 4, 6, 3, 2, 1, 0, 2, 2, 0, 0, 5, 4, 1, 0, 0, 1, 0, 2, 2, 0, 0, 2, 3, 1, 3, 1, 1, 0, 1, 0, 0, 1, 2, 2, 0, 2, 0, 0, 1, 2, 0, 0, 4, 1, 0, 1, 1, 0, 1, 2, 0, 1, 4, 3, 1, 2, 2, 1, 1, 1, 1, 6, 3, 3, 3, 3, 1, 1, 1, 1, 1, 0, 7, 3, 0, 1, 3, 2, 1, 0, 3, 2, 1, 0, 2, 2, 6, 0, 0, 6, 2, 2, 3, 3, 5, 5, 1, 0, 6, 1, 0, 3, 1, 1, 2, 3, 1, 2, 1, 1, 0, 1, 0, 1, 0, 5, 5, 2, 2, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1]
|
|
6128
6138
|
|
|
6129
6139
|
The bug reported at :issue:`4897` is now fixed::
|
|
6130
6140
|
|
|
6131
|
-
sage: [P[0] for P in EllipticCurve([0,0,0,-468,2592]).integral_points()]
|
|
6141
|
+
sage: [P[0] for P in EllipticCurve([0,0,0,-468,2592]).integral_points()] # needs sage.symbolic
|
|
6132
6142
|
[-24, -18, -14, -6, -3, 4, 6, 18, 21, 24, 36, 46, 102, 168, 186, 381, 1476, 2034, 67246]
|
|
6133
6143
|
|
|
6134
6144
|
See :issue:`22063`::
|
|
6135
6145
|
|
|
6136
|
-
sage: for n in [67,71,74,91]: # long time
|
|
6146
|
+
sage: for n in [67,71,74,91]: # long time, needs sage.symbolic
|
|
6137
6147
|
....: assert 4*n^6 + 4*n^2 in [P[0] for P in EllipticCurve([0,0,0,2,n^2]).integral_points()]
|
|
6138
6148
|
|
|
6139
6149
|
ALGORITHM:
|
|
@@ -6552,31 +6562,31 @@ class EllipticCurve_rational_field(EllipticCurve_number_field):
|
|
|
6552
6562
|
|
|
6553
6563
|
::
|
|
6554
6564
|
|
|
6555
|
-
sage: a = E.S_integral_points([2,3]) # needs eclib
|
|
6556
|
-
sage: len(a) # needs eclib
|
|
6565
|
+
sage: a = E.S_integral_points([2,3]) # needs eclib sage.symbolic
|
|
6566
|
+
sage: len(a) # needs eclib sage.symbolic
|
|
6557
6567
|
43
|
|
6558
6568
|
|
|
6559
6569
|
An example with negative discriminant::
|
|
6560
6570
|
|
|
6561
|
-
sage: EllipticCurve('900d1').S_integral_points([17], both_signs=True) # needs eclib
|
|
6571
|
+
sage: EllipticCurve('900d1').S_integral_points([17], both_signs=True) # needs eclib sage.symbolic
|
|
6562
6572
|
[(-11 : -27 : 1), (-11 : 27 : 1), (-4 : -34 : 1), (-4 : 34 : 1), (4 : -18 : 1),
|
|
6563
6573
|
(4 : 18 : 1), (2636/289 : -98786/4913 : 1), (2636/289 : 98786/4913 : 1),
|
|
6564
6574
|
(16 : -54 : 1), (16 : 54 : 1)]
|
|
6565
6575
|
|
|
6566
6576
|
Output checked with Magma (corrected in 3 cases)::
|
|
6567
6577
|
|
|
6568
|
-
sage: [len(e.S_integral_points([2], both_signs=False)) for e in cremona_curves([11..100])]
|
|
6578
|
+
sage: [len(e.S_integral_points([2], both_signs=False)) for e in cremona_curves([11..100])] # long time (17s on sage.math, 2011) # needs eclib sage.symbolic
|
|
6569
6579
|
[2, 0, 2, 3, 3, 1, 3, 1, 3, 5, 3, 5, 4, 1, 1, 2, 2, 2, 3, 1, 2, 1, 0, 1, 3, 3, 1, 1, 5, 3, 4, 2, 1, 1, 5, 3, 2, 2, 1, 1, 1, 0, 1, 3, 0, 1, 0, 1, 1, 3, 7, 1, 3, 3, 3, 1, 1, 2, 3, 1, 2, 3, 1, 2, 1, 3, 3, 1, 1, 1, 0, 1, 3, 3, 1, 1, 7, 1, 0, 1, 1, 0, 1, 2, 0, 3, 1, 2, 1, 3, 1, 2, 2, 4, 5, 3, 2, 1, 1, 6, 1, 0, 1, 3, 1, 3, 3, 1, 1, 1, 1, 1, 3, 1, 5, 1, 2, 4, 1, 1, 1, 1, 1, 0, 1, 0, 2, 2, 0, 0, 1, 0, 1, 1, 6, 1, 0, 1, 1, 0, 4, 3, 1, 2, 1, 2, 3, 1, 1, 1, 1, 8, 3, 1, 2, 1, 2, 0, 8, 2, 0, 6, 2, 3, 1, 1, 1, 3, 1, 3, 2, 1, 3, 1, 2, 1, 6, 9, 3, 3, 1, 1, 2, 3, 1, 1, 5, 5, 1, 1, 0, 1, 1, 2, 3, 1, 1, 2, 3, 1, 3, 1, 1, 1, 1, 0, 0, 1, 3, 3, 1, 3, 1, 1, 2, 2, 0, 0, 6, 1, 0, 1, 1, 1, 1, 3, 1, 2, 6, 3, 1, 2, 2, 1, 1, 1, 1, 7, 5, 4, 3, 3, 1, 1, 1, 1, 1, 1, 8, 5, 1, 1, 3, 3, 1, 1, 3, 3, 1, 1, 2, 3, 6, 1, 1, 7, 3, 3, 4, 5, 9, 6, 1, 0, 7, 1, 1, 3, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 7, 8, 2, 3, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1]
|
|
6570
6580
|
|
|
6571
6581
|
An example from [PZGH1999]_::
|
|
6572
6582
|
|
|
6573
6583
|
sage: E = EllipticCurve([0,0,0,-172,505])
|
|
6574
|
-
sage: E.rank(), len(E.S_integral_points([3,5,7])) # long time (5s on sage.math, 2011) # needs eclib
|
|
6584
|
+
sage: E.rank(), len(E.S_integral_points([3,5,7])) # long time (5s on sage.math, 2011) # needs eclib sage.symbolic
|
|
6575
6585
|
(4, 72)
|
|
6576
6586
|
|
|
6577
6587
|
This is curve "7690e1" which failed until :issue:`4805` was fixed::
|
|
6578
6588
|
|
|
6579
|
-
sage: EllipticCurve([1,1,1,-301,-1821]).S_integral_points([13,2]) # needs eclib
|
|
6589
|
+
sage: EllipticCurve([1,1,1,-301,-1821]).S_integral_points([13,2]) # needs eclib sage.symbolic
|
|
6580
6590
|
[(-13 : -4 : 1), (-9 : -12 : 1), (-7 : 2 : 1), (21 : -52 : 1),
|
|
6581
6591
|
(23 : -76 : 1), (63 : -516 : 1), (71 : -620 : 1), (87 : -844 : 1),
|
|
6582
6592
|
(2711 : -142540 : 1), (7323 : -630376 : 1), (17687 : -2361164 : 1)]
|
|
@@ -553,7 +553,7 @@ class EllipticCurveFormalGroup(SageObject):
|
|
|
553
553
|
# note that the following formula differs from the one in Silverman page 119.
|
|
554
554
|
# See github issue 9646 for the explanation and justification.
|
|
555
555
|
t3 = -t1 - t2 - \
|
|
556
|
-
(a1*lam + a3*lam2 + a2*nu + 2*a4*lam*nu + 3*a6*lam2*nu) /
|
|
556
|
+
(a1*lam + a3*lam2 + a2*nu + 2*a4*lam*nu + 3*a6*lam2*nu) / \
|
|
557
557
|
(1 + a2*lam + a4*lam2 + a6*lam3)
|
|
558
558
|
inv = self.inverse(prec)
|
|
559
559
|
|