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.
- passagemath_schemes/__init__.py +3 -0
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/METADATA +41 -41
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/METADATA.bak +42 -42
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/RECORD +158 -139
- passagemath_schemes-10.6.42.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 +7 -7
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-313-aarch64-linux-musl.so +0 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +18 -18
- sage/lfunctions/zero_sums.cpython-313-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-313-aarch64-linux-musl.so +0 -0
- sage/modular/arithgroup/arithgroup_perm.py +16 -16
- sage/modular/arithgroup/congroup.cpython-313-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-313-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-313-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-313-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/ambient.py +13 -20
- sage/modular/modsym/boundary.py +2 -2
- sage/modular/modsym/manin_symbol.cpython-313-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/manin_symbol_list.py +3 -7
- sage/modular/modsym/relation_matrix_pyx.cpython-313-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-313-aarch64-linux-musl.so +0 -0
- sage/schemes/elliptic_curves/padic_lseries.py +25 -13
- sage/schemes/elliptic_curves/padics.py +71 -63
- sage/schemes/elliptic_curves/period_lattice.py +78 -27
- sage/schemes/elliptic_curves/period_lattice_region.cpython-313-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.44.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-313-aarch64-linux-musl.so +0 -0
- sage/modular/modsym/p1list.pxd +0 -29
- sage/modular/modsym/p1list.pyx +0 -1372
- {passagemath_schemes-10.5.44.dist-info → passagemath_schemes-10.6.42.dist-info}/WHEEL +0 -0
|
@@ -2531,7 +2531,7 @@ class HeegnerPoints_level_disc_cond(HeegnerPoints_level, HeegnerPoints_level_dis
|
|
|
2531
2531
|
|
|
2532
2532
|
sage: len(heegner_points(389,-20,1))
|
|
2533
2533
|
4
|
|
2534
|
-
sage: QQ[sqrt(-20)].class_number()
|
|
2534
|
+
sage: QQ[sqrt(-20)].class_number() # needs sage.symbolic
|
|
2535
2535
|
2
|
|
2536
2536
|
"""
|
|
2537
2537
|
return len(self.points())
|
|
@@ -3356,7 +3356,7 @@ class HeegnerPointOnEllipticCurve(HeegnerPoint):
|
|
|
3356
3356
|
the discriminant below is strong confirmation -- but not proof
|
|
3357
3357
|
-- that this polynomial is correct::
|
|
3358
3358
|
|
|
3359
|
-
sage: f = P.numerical_approx(70)[0].
|
|
3359
|
+
sage: f = P.numerical_approx(70)[0].algebraic_dependency(6); f # needs fpylll
|
|
3360
3360
|
1225*x^6 + 1750*x^5 - 21675*x^4 - 380*x^3 + 110180*x^2 - 129720*x + 48771
|
|
3361
3361
|
sage: f.discriminant().factor() # needs fpylll
|
|
3362
3362
|
2^6 * 3^2 * 5^11 * 7^4 * 13^2 * 19^6 * 199^2 * 719^2 * 26161^2
|
|
@@ -3461,7 +3461,7 @@ class HeegnerPointOnEllipticCurve(HeegnerPoint):
|
|
|
3461
3461
|
|
|
3462
3462
|
if algorithm == 'lll':
|
|
3463
3463
|
P = self.numerical_approx(prec)
|
|
3464
|
-
f = P[0].
|
|
3464
|
+
f = P[0].algebraic_dependency(n)
|
|
3465
3465
|
if f.is_irreducible() and self._check_poly_discriminant(f):
|
|
3466
3466
|
return f.monic()
|
|
3467
3467
|
else:
|
|
@@ -3544,7 +3544,7 @@ class HeegnerPointOnEllipticCurve(HeegnerPoint):
|
|
|
3544
3544
|
sage: z = P.point_exact(200, optimize=True)
|
|
3545
3545
|
sage: z[1].charpoly()
|
|
3546
3546
|
x^12 + 6*x^11 + 90089/1715*x^10 + 71224/343*x^9 + 52563964/588245*x^8 - 483814934/588245*x^7 - 156744579/16807*x^6 - 2041518032/84035*x^5 + 1259355443184/14706125*x^4 + 3094420220918/14706125*x^3 + 123060442043827/367653125*x^2 + 82963044474852/367653125*x + 211679465261391/1838265625
|
|
3547
|
-
sage: f = P.numerical_approx(500)[1].
|
|
3547
|
+
sage: f = P.numerical_approx(500)[1].algebraic_dependency(12); f / f.leading_coefficient()
|
|
3548
3548
|
x^12 + 6*x^11 + 90089/1715*x^10 + 71224/343*x^9 + 52563964/588245*x^8 - 483814934/588245*x^7 - 156744579/16807*x^6 - 2041518032/84035*x^5 + 1259355443184/14706125*x^4 + 3094420220918/14706125*x^3 + 123060442043827/367653125*x^2 + 82963044474852/367653125*x + 211679465261391/1838265625
|
|
3549
3549
|
|
|
3550
3550
|
sage: E = EllipticCurve('5077a')
|
|
@@ -4227,13 +4227,14 @@ class KolyvaginPoint(HeegnerPoint):
|
|
|
4227
4227
|
if E.root_number() == -1:
|
|
4228
4228
|
return self._recognize_point_over_QQ(P, 2*self.index())
|
|
4229
4229
|
else:
|
|
4230
|
-
# root number +1. We use
|
|
4230
|
+
# root number +1. We use algebraic_dependency
|
|
4231
|
+
# to recognize the x
|
|
4231
4232
|
# coordinate, stick it in the appropriate quadratic
|
|
4232
4233
|
# field, then make sure that we got the right
|
|
4233
4234
|
# embedding, and if not fix things so we do.
|
|
4234
4235
|
x = P[0]
|
|
4235
4236
|
C = x.parent()
|
|
4236
|
-
f = x.
|
|
4237
|
+
f = x.algebraic_dependency(2)
|
|
4237
4238
|
K = self.quadratic_field()
|
|
4238
4239
|
roots = [r[0] for r in f.roots(K)]
|
|
4239
4240
|
if not roots:
|
|
@@ -6424,7 +6425,7 @@ def ell_heegner_point(self, D, c=ZZ(1), f=None, check=True):
|
|
|
6424
6425
|
Working out the details manually::
|
|
6425
6426
|
|
|
6426
6427
|
sage: P = E.heegner_point(-47).numerical_approx(prec=200)
|
|
6427
|
-
sage: f =
|
|
6428
|
+
sage: f = algebraic_dependency(P[0], 5); f
|
|
6428
6429
|
x^5 - x^4 + x^3 + x^2 - 2*x + 1
|
|
6429
6430
|
sage: f.discriminant().factor()
|
|
6430
6431
|
47^2
|
|
@@ -6819,6 +6820,7 @@ def _adjust_heegner_index(self, a):
|
|
|
6819
6820
|
|
|
6820
6821
|
EXAMPLES::
|
|
6821
6822
|
|
|
6823
|
+
sage: # needs sage.symbolic
|
|
6822
6824
|
sage: E = EllipticCurve('11a1')
|
|
6823
6825
|
sage: a = RIF(sqrt(2)) - RIF(1.4142135623730951)
|
|
6824
6826
|
sage: E._adjust_heegner_index(a)
|
|
@@ -7242,7 +7244,7 @@ def _heegner_forms_list(self, D, beta=None, expected_count=None):
|
|
|
7242
7244
|
-195
|
|
7243
7245
|
sage: len(E._heegner_forms_list(-195))
|
|
7244
7246
|
4
|
|
7245
|
-
sage: QQ[sqrt(-195)].class_number()
|
|
7247
|
+
sage: QQ[sqrt(-195)].class_number() # needs sage.symbolic
|
|
7246
7248
|
4
|
|
7247
7249
|
|
|
7248
7250
|
sage: E = EllipticCurve('389a')
|
|
@@ -7286,6 +7288,7 @@ def _heegner_best_tau(self, D, prec=None):
|
|
|
7286
7288
|
|
|
7287
7289
|
EXAMPLES::
|
|
7288
7290
|
|
|
7291
|
+
sage: # needs sage.symbolic
|
|
7289
7292
|
sage: E = EllipticCurve('37a')
|
|
7290
7293
|
sage: E._heegner_best_tau(-7)
|
|
7291
7294
|
1/74*sqrt(-7) - 17/74
|
|
@@ -1035,7 +1035,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
1035
1035
|
|
|
1036
1036
|
EXAMPLES::
|
|
1037
1037
|
|
|
1038
|
-
sage: # needs sage.rings.number_field
|
|
1038
|
+
sage: # needs sage.rings.number_field sage.symbolic
|
|
1039
1039
|
sage: K.<i> = QuadraticField(-1)
|
|
1040
1040
|
sage: E = EllipticCurve([0, 0, 0, 1+5*i, 3+i])
|
|
1041
1041
|
sage: H = E.height_function()
|
|
@@ -1109,7 +1109,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
1109
1109
|
|
|
1110
1110
|
In [Tho2010]_ the value is given as 0.772::
|
|
1111
1111
|
|
|
1112
|
-
sage: RealField(12)( H.B(5, 0.01) ) # needs sage.rings.number_field
|
|
1112
|
+
sage: RealField(12)( H.B(5, 0.01) ) # needs sage.rings.number_field sage.symbolic
|
|
1113
1113
|
0.777
|
|
1114
1114
|
"""
|
|
1115
1115
|
K = self.K
|
|
@@ -1320,9 +1320,9 @@ class EllipticCurveCanonicalHeight:
|
|
|
1320
1320
|
height strictly greater than 0.2, but fail to prove the same
|
|
1321
1321
|
for 0.3::
|
|
1322
1322
|
|
|
1323
|
-
sage: H.real_intersection_is_empty([H.B(n,0.2) for n in srange(1,10)], v)
|
|
1323
|
+
sage: H.real_intersection_is_empty([H.B(n,0.2) for n in srange(1,10)], v) # needs sage.symbolic
|
|
1324
1324
|
True
|
|
1325
|
-
sage: H.real_intersection_is_empty([H.B(n,0.3) for n in srange(1,10)], v)
|
|
1325
|
+
sage: H.real_intersection_is_empty([H.B(n,0.3) for n in srange(1,10)], v) # needs sage.symbolic
|
|
1326
1326
|
False
|
|
1327
1327
|
|
|
1328
1328
|
An example over a number field::
|
|
@@ -1339,9 +1339,9 @@ class EllipticCurveCanonicalHeight:
|
|
|
1339
1339
|
height strictly greater than 0.07, but fail to prove the same
|
|
1340
1340
|
for 0.08::
|
|
1341
1341
|
|
|
1342
|
-
sage: H.real_intersection_is_empty([H.B(n,0.07) for n in srange(1,5)], v) # long time, needs sage.rings.number_field
|
|
1342
|
+
sage: H.real_intersection_is_empty([H.B(n,0.07) for n in srange(1,5)], v) # long time, needs sage.rings.number_field sage.symbolic
|
|
1343
1343
|
True
|
|
1344
|
-
sage: H.real_intersection_is_empty([H.B(n,0.08) for n in srange(1,5)], v) # needs sage.rings.number_field
|
|
1344
|
+
sage: H.real_intersection_is_empty([H.B(n,0.08) for n in srange(1,5)], v) # needs sage.rings.number_field sage.symbolic
|
|
1345
1345
|
False
|
|
1346
1346
|
"""
|
|
1347
1347
|
return UnionOfIntervals.intersection([self.Sn(-B, B, k+1, v) for k,B in enumerate(Bk)]).is_empty()
|
|
@@ -1628,7 +1628,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
1628
1628
|
The array of values on the grid shows symmetry, since `\wp` is
|
|
1629
1629
|
even::
|
|
1630
1630
|
|
|
1631
|
-
sage: H.wp_on_grid(v,4)
|
|
1631
|
+
sage: H.wp_on_grid(v, 4) # needs sage.symbolic
|
|
1632
1632
|
array([[25.43920182, 5.28760943, 5.28760943, 25.43920182],
|
|
1633
1633
|
[ 6.05099485, 1.83757786, 1.83757786, 6.05099485],
|
|
1634
1634
|
[ 6.05099485, 1.83757786, 1.83757786, 6.05099485],
|
|
@@ -1636,7 +1636,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
1636
1636
|
|
|
1637
1637
|
The array of values on the half-grid::
|
|
1638
1638
|
|
|
1639
|
-
sage: H.wp_on_grid(v,4,True)
|
|
1639
|
+
sage: H.wp_on_grid(v, 4, True) # needs sage.symbolic
|
|
1640
1640
|
array([[25.43920182, 5.28760943],
|
|
1641
1641
|
[ 6.05099485, 1.83757786],
|
|
1642
1642
|
[ 6.05099485, 1.83757786],
|
|
@@ -1693,18 +1693,18 @@ class EllipticCurveCanonicalHeight:
|
|
|
1693
1693
|
for 0.03. For the first proof, using only `n=1,2,3` is not
|
|
1694
1694
|
sufficient::
|
|
1695
1695
|
|
|
1696
|
-
sage: H.complex_intersection_is_empty([H.B(n,0.02) for n in [1,2,3]], v) # long time, needs sage.rings.number_field
|
|
1696
|
+
sage: H.complex_intersection_is_empty([H.B(n, 0.02) for n in [1,2,3]], v) # long time, needs sage.rings.number_field sage.symbolic
|
|
1697
1697
|
False
|
|
1698
|
-
sage: H.complex_intersection_is_empty([H.B(n,0.02) for n in [1,2,3,4]], v) # needs sage.rings.number_field
|
|
1698
|
+
sage: H.complex_intersection_is_empty([H.B(n, 0.02) for n in [1,2,3,4]], v) # needs sage.rings.number_field sage.symbolic
|
|
1699
1699
|
True
|
|
1700
|
-
sage: H.complex_intersection_is_empty([H.B(n,0.03) for n in [1,2,3,4]], v) # long time, needs sage.rings.number_field
|
|
1700
|
+
sage: H.complex_intersection_is_empty([H.B(n, 0.03) for n in [1,2,3,4]], v) # long time, needs sage.rings.number_field sage.symbolic
|
|
1701
1701
|
False
|
|
1702
1702
|
|
|
1703
1703
|
Using `n\le6` enables us to prove the lower bound 0.03. Note
|
|
1704
1704
|
that it takes longer when the result is ``False`` than when it
|
|
1705
1705
|
is ``True``::
|
|
1706
1706
|
|
|
1707
|
-
sage: H.complex_intersection_is_empty([H.B(n,0.03) for n in [1..6]], v) # needs sage.rings.number_field
|
|
1707
|
+
sage: H.complex_intersection_is_empty([H.B(n, 0.03) for n in [1..6]], v) # needs sage.rings.number_field sage.symbolic
|
|
1708
1708
|
True
|
|
1709
1709
|
"""
|
|
1710
1710
|
from sage.schemes.elliptic_curves.period_lattice_region import PeriodicRegion
|
|
@@ -1818,11 +1818,11 @@ class EllipticCurveCanonicalHeight:
|
|
|
1818
1818
|
Using `N=5` we can prove that 0.1 is a lower bound (in fact we
|
|
1819
1819
|
only need `N=2`), but not that 0.2 is::
|
|
1820
1820
|
|
|
1821
|
-
sage: H.test_mu(0.1, 5) # needs sage.rings.number_field
|
|
1821
|
+
sage: H.test_mu(0.1, 5) # needs sage.rings.number_field sage.symbolic
|
|
1822
1822
|
B_1(0.100000000000000) = 1.51580969677387
|
|
1823
1823
|
B_2(0.100000000000000) = 0.932072561526720
|
|
1824
1824
|
True
|
|
1825
|
-
sage: H.test_mu(0.2, 5) # needs sage.rings.number_field
|
|
1825
|
+
sage: H.test_mu(0.2, 5) # needs sage.rings.number_field sage.symbolic
|
|
1826
1826
|
B_1(0.200000000000000) = 2.04612906979932
|
|
1827
1827
|
B_2(0.200000000000000) = 3.09458988474327
|
|
1828
1828
|
B_3(0.200000000000000) = 27.6251108409484
|
|
@@ -1903,7 +1903,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
1903
1903
|
given)::
|
|
1904
1904
|
|
|
1905
1905
|
sage: E = EllipticCurve([1, 0, 1, 421152067, 105484554028056]) # 60490d1
|
|
1906
|
-
sage: E.height_function().min_gr(.0001, 5)
|
|
1906
|
+
sage: E.height_function().min_gr(.0001, 5) # needs sage.symbolic
|
|
1907
1907
|
1.98684388146518
|
|
1908
1908
|
|
|
1909
1909
|
Example 10.1 from [Tho2010]_ (where a lower bound of 0.18 was
|
|
@@ -1913,7 +1913,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
1913
1913
|
sage: K.<i> = QuadraticField(-1)
|
|
1914
1914
|
sage: E = EllipticCurve([0, 0, 0, 91 - 26*i, -144 - 323*i])
|
|
1915
1915
|
sage: H = E.height_function()
|
|
1916
|
-
sage: H.min_gr(0.1, 4) # long time
|
|
1916
|
+
sage: H.min_gr(0.1, 4) # long time, needs sage.symbolic
|
|
1917
1917
|
0.1621049443313762
|
|
1918
1918
|
|
|
1919
1919
|
Example 10.2 from [Tho2010]_::
|
|
@@ -1922,7 +1922,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
1922
1922
|
sage: K.<i> = QuadraticField(-1)
|
|
1923
1923
|
sage: E = EllipticCurve([0, 1 - i, i, -i, 0])
|
|
1924
1924
|
sage: H = E.height_function()
|
|
1925
|
-
sage: H.min_gr(0.01, 5) # long time
|
|
1925
|
+
sage: H.min_gr(0.01, 5) # long time, needs sage.symbolic
|
|
1926
1926
|
0.020153685521979152
|
|
1927
1927
|
|
|
1928
1928
|
In this example the point `P=(0,0)` has height 0.023 so our
|
|
@@ -1938,10 +1938,11 @@ class EllipticCurveCanonicalHeight:
|
|
|
1938
1938
|
given)::
|
|
1939
1939
|
|
|
1940
1940
|
sage: # needs sage.rings.number_field
|
|
1941
|
+
sage: x = polygen(ZZ, 'x')
|
|
1941
1942
|
sage: K.<a> = NumberField(x^3 - 2)
|
|
1942
1943
|
sage: E = EllipticCurve([0, 0, 0, -3*a - a^2, a^2])
|
|
1943
1944
|
sage: H = E.height_function()
|
|
1944
|
-
sage: H.min_gr(0.1, 5) # long time
|
|
1945
|
+
sage: H.min_gr(0.1, 5) # long time, needs sage.symbolic
|
|
1945
1946
|
0.25
|
|
1946
1947
|
|
|
1947
1948
|
TESTS:
|
|
@@ -1949,10 +1950,11 @@ class EllipticCurveCanonicalHeight:
|
|
|
1949
1950
|
This example from the LMFDB gave problems before the fix in :issue:`8829`::
|
|
1950
1951
|
|
|
1951
1952
|
sage: # needs sage.rings.number_field
|
|
1953
|
+
sage: x = polygen(ZZ, 'x')
|
|
1952
1954
|
sage: K.<phi> = NumberField(x^2 - x - 1)
|
|
1953
1955
|
sage: E = EllipticCurve([phi + 1, -phi + 1, 1, 20*phi - 39, 196*phi + 237])
|
|
1954
1956
|
sage: H = E.height_function()
|
|
1955
|
-
sage: H.min_gr(.1, 5, verbose=True) # long time
|
|
1957
|
+
sage: H.min_gr(.1, 5, verbose=True) # long time, needs sage.symbolic
|
|
1956
1958
|
B_1(1) = 1540.199246369678
|
|
1957
1959
|
...
|
|
1958
1960
|
halving mu to 0.25 and increasing n_max to 6
|
|
@@ -2028,7 +2030,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
2028
2030
|
given)::
|
|
2029
2031
|
|
|
2030
2032
|
sage: E = EllipticCurve([1, 0, 1, 421152067, 105484554028056]) # 60490d1
|
|
2031
|
-
sage: E.height_function().min(.0001, 5)
|
|
2033
|
+
sage: E.height_function().min(.0001, 5) # needs sage.symbolic
|
|
2032
2034
|
0.0011263287309893311
|
|
2033
2035
|
|
|
2034
2036
|
Example 10.1 from [Tho2010]_ (where a lower bound of 0.18 was
|
|
@@ -2061,6 +2063,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
2061
2063
|
given)::
|
|
2062
2064
|
|
|
2063
2065
|
sage: # needs sage.rings.number_field
|
|
2066
|
+
sage: x = polygen(ZZ, 'x')
|
|
2064
2067
|
sage: K.<a> = NumberField(x^3 - 2)
|
|
2065
2068
|
sage: E = EllipticCurve([0, 0, 0, -3*a - a^2, a^2])
|
|
2066
2069
|
sage: H = E.height_function()
|
|
@@ -2071,7 +2074,7 @@ class EllipticCurveCanonicalHeight:
|
|
|
2071
2074
|
|
|
2072
2075
|
sage: E = EllipticCurve('37a')
|
|
2073
2076
|
sage: h = E.height_function()
|
|
2074
|
-
sage: h.min(.01, 5)
|
|
2077
|
+
sage: h.min(.01, 5) # needs sage.symbolic
|
|
2075
2078
|
0.03987318057488725
|
|
2076
2079
|
sage: E.gen(0).height()
|
|
2077
2080
|
0.0511114082399688
|
|
@@ -2079,12 +2082,12 @@ class EllipticCurveCanonicalHeight:
|
|
|
2079
2082
|
After base change the lower bound can decrease::
|
|
2080
2083
|
|
|
2081
2084
|
sage: K.<a> = QuadraticField(-5) # needs sage.rings.number_field
|
|
2082
|
-
sage: E.change_ring(K).height_function().min(0.5, 10) # long time, needs sage.rings.number_field
|
|
2085
|
+
sage: E.change_ring(K).height_function().min(0.5, 10) # long time, needs sage.rings.number_field sage.symbolic
|
|
2083
2086
|
0.04419417382415922
|
|
2084
2087
|
|
|
2085
2088
|
sage: E = EllipticCurve('389a')
|
|
2086
2089
|
sage: h = E.height_function()
|
|
2087
|
-
sage: h.min(0.1, 5)
|
|
2090
|
+
sage: h.min(0.1, 5) # needs sage.symbolic
|
|
2088
2091
|
0.05731275270029196
|
|
2089
2092
|
sage: [P.height() for P in E.gens()]
|
|
2090
2093
|
[0.686667083305587, 0.327000773651605]
|
|
@@ -1162,7 +1162,7 @@ def compare_via_evaluation(left, right):
|
|
|
1162
1162
|
sage: from sage.schemes.elliptic_curves.hom_composite import EllipticCurveHom_composite
|
|
1163
1163
|
sage: mu = EllipticCurveHom_composite.from_factors([phi, psi])
|
|
1164
1164
|
sage: from sage.schemes.elliptic_curves.hom import compare_via_evaluation
|
|
1165
|
-
sage: compare_via_evaluation(mu, E.scalar_multiplication(7))
|
|
1165
|
+
sage: compare_via_evaluation(mu, E.scalar_multiplication(7)) # needs sage.symbolic
|
|
1166
1166
|
True
|
|
1167
1167
|
|
|
1168
1168
|
.. SEEALSO::
|
|
@@ -1344,6 +1344,7 @@ def compute_trace_generic(phi):
|
|
|
1344
1344
|
the result for Frobenius matches
|
|
1345
1345
|
:meth:`~sage.schemes.elliptic_curves.ell_finite_field.EllipticCurve_finite_field.trace_of_frobenius`::
|
|
1346
1346
|
|
|
1347
|
+
sage: # needs sage.symbolic
|
|
1347
1348
|
sage: from sage.schemes.elliptic_curves.hom import compute_trace_generic
|
|
1348
1349
|
sage: p = random_prime(10^3)
|
|
1349
1350
|
sage: e = randrange(1, ceil(log(10^5,p)))
|
|
@@ -64,7 +64,7 @@ Equality is decided correctly (and, in some cases, much faster than
|
|
|
64
64
|
comparing :meth:`EllipticCurveHom.rational_maps`) even when distinct
|
|
65
65
|
factorizations of the same isogeny are compared::
|
|
66
66
|
|
|
67
|
-
sage: psi == EllipticCurveIsogeny(E, P) # needs sage.rings.finite_rings
|
|
67
|
+
sage: psi == EllipticCurveIsogeny(E, P) # needs sage.rings.finite_rings sage.symbolic
|
|
68
68
|
True
|
|
69
69
|
|
|
70
70
|
We can easily obtain the individual factors of the composite map::
|
|
@@ -464,7 +464,7 @@ class EllipticCurveHom_composite(EllipticCurveHom):
|
|
|
464
464
|
sage: P, = E.gens()
|
|
465
465
|
sage: phi = EllipticCurveHom_composite(E, P)
|
|
466
466
|
sage: psi = EllipticCurveHom_composite.from_factors(phi.factors())
|
|
467
|
-
sage: psi == phi
|
|
467
|
+
sage: psi == phi # needs sage.symbolic
|
|
468
468
|
True
|
|
469
469
|
|
|
470
470
|
TESTS::
|
|
@@ -479,7 +479,7 @@ class EllipticCurveHom_composite(EllipticCurveHom):
|
|
|
479
479
|
sage: E = EllipticCurve(GF(419), [1,0])
|
|
480
480
|
sage: P, = E.gens()
|
|
481
481
|
sage: phi = EllipticCurveHom_composite(E, P)
|
|
482
|
-
sage: EllipticCurveHom_composite.from_factors(phi.factors()) == phi
|
|
482
|
+
sage: EllipticCurveHom_composite.from_factors(phi.factors()) == phi # needs sage.symbolic
|
|
483
483
|
True
|
|
484
484
|
"""
|
|
485
485
|
maps = tuple(maps)
|
|
@@ -713,14 +713,14 @@ class EllipticCurveHom_composite(EllipticCurveHom):
|
|
|
713
713
|
|
|
714
714
|
::
|
|
715
715
|
|
|
716
|
-
sage: # needs sage.rings.finite_rings
|
|
716
|
+
sage: # needs sage.rings.finite_rings sage.rings.number_field sage.symbolic
|
|
717
717
|
sage: E = EllipticCurve(GF(431**2), [1,0])
|
|
718
718
|
sage: P,Q = E.gens()
|
|
719
|
-
sage: phi1 = EllipticCurveHom_composite(E, P)
|
|
720
|
-
sage: phi2 = EllipticCurveHom_composite(phi1.codomain(), phi1(Q))
|
|
721
|
-
sage: psi1 = EllipticCurveHom_composite(E, Q)
|
|
722
|
-
sage: psi2 = EllipticCurveHom_composite(psi1.codomain(), psi1(P))
|
|
723
|
-
sage: phi2 * phi1 == psi2 * psi1
|
|
719
|
+
sage: phi1 = EllipticCurveHom_composite(E, P)
|
|
720
|
+
sage: phi2 = EllipticCurveHom_composite(phi1.codomain(), phi1(Q))
|
|
721
|
+
sage: psi1 = EllipticCurveHom_composite(E, Q)
|
|
722
|
+
sage: psi2 = EllipticCurveHom_composite(psi1.codomain(), psi1(P))
|
|
723
|
+
sage: phi2 * phi1 == psi2 * psi1
|
|
724
724
|
True
|
|
725
725
|
"""
|
|
726
726
|
if op != op_EQ:
|
|
@@ -845,9 +845,9 @@ class EllipticCurveHom_composite(EllipticCurveHom):
|
|
|
845
845
|
over Finite Field of size 65537
|
|
846
846
|
To: Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5
|
|
847
847
|
over Finite Field of size 65537
|
|
848
|
-
sage: psi * phi == phi.domain().scalar_multiplication(phi.degree())
|
|
848
|
+
sage: psi * phi == phi.domain().scalar_multiplication(phi.degree()) # needs sage.symbolic
|
|
849
849
|
True
|
|
850
|
-
sage: phi * psi == psi.domain().scalar_multiplication(psi.degree())
|
|
850
|
+
sage: phi * psi == psi.domain().scalar_multiplication(psi.degree()) # needs sage.symbolic
|
|
851
851
|
True
|
|
852
852
|
"""
|
|
853
853
|
phis = (phi.dual() for phi in self._phis[::-1])
|
|
@@ -431,18 +431,18 @@ class EllipticCurveHom_frobenius(EllipticCurveHom):
|
|
|
431
431
|
sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
|
|
432
432
|
sage: E = EllipticCurve(GF(31), [0,1])
|
|
433
433
|
sage: f = EllipticCurveHom_frobenius(E)
|
|
434
|
-
sage: f.dual() * f == EllipticCurveHom_scalar(f.domain(), 31)
|
|
434
|
+
sage: f.dual() * f == EllipticCurveHom_scalar(f.domain(), 31) # needs sage.symbolic
|
|
435
435
|
True
|
|
436
|
-
sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), 31)
|
|
436
|
+
sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), 31) # needs sage.symbolic
|
|
437
437
|
True
|
|
438
438
|
|
|
439
439
|
A supersingular example::
|
|
440
440
|
|
|
441
441
|
sage: E = EllipticCurve(GF(31), [1,0])
|
|
442
442
|
sage: f = EllipticCurveHom_frobenius(E)
|
|
443
|
-
sage: f.dual() * f == EllipticCurveHom_scalar(f.domain(), 31)
|
|
443
|
+
sage: f.dual() * f == EllipticCurveHom_scalar(f.domain(), 31) # needs sage.symbolic
|
|
444
444
|
True
|
|
445
|
-
sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), 31)
|
|
445
|
+
sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), 31) # needs sage.symbolic
|
|
446
446
|
True
|
|
447
447
|
|
|
448
448
|
TESTS:
|
|
@@ -459,13 +459,13 @@ class EllipticCurveHom_frobenius(EllipticCurveHom):
|
|
|
459
459
|
....: except ArithmeticError:
|
|
460
460
|
....: pass
|
|
461
461
|
sage: f = EllipticCurveHom_frobenius(E, n)
|
|
462
|
-
sage: f.dual() * f == EllipticCurveHom_scalar(E, p**n)
|
|
462
|
+
sage: f.dual() * f == EllipticCurveHom_scalar(E, p**n) # needs sage.symbolic
|
|
463
463
|
True
|
|
464
|
-
sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), p**n)
|
|
464
|
+
sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), p**n) # needs sage.symbolic
|
|
465
465
|
True
|
|
466
|
-
sage: f.dual().dual() == f # known bug -- broken in characteristic 2,3
|
|
466
|
+
sage: f.dual().dual() == f # known bug -- broken in characteristic 2,3 # needs sage.symbolic
|
|
467
467
|
True
|
|
468
|
-
sage: p in (2,3) or f.dual().dual() == f
|
|
468
|
+
sage: p in (2,3) or f.dual().dual() == f # needs sage.symbolic
|
|
469
469
|
True
|
|
470
470
|
|
|
471
471
|
ALGORITHM:
|
|
@@ -20,7 +20,12 @@ EXAMPLES::
|
|
|
20
20
|
Sum morphism:
|
|
21
21
|
From: Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
|
|
22
22
|
To: Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101
|
|
23
|
-
Via: (Isogeny of degree 7
|
|
23
|
+
Via: (Isogeny of degree 7
|
|
24
|
+
from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
|
|
25
|
+
to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101,
|
|
26
|
+
Isogeny of degree 7
|
|
27
|
+
from Elliptic Curve defined by y^2 = x^3 + 5*x + 5 over Finite Field of size 101
|
|
28
|
+
to Elliptic Curve defined by y^2 = x^3 + 12*x + 98 over Finite Field of size 101)
|
|
24
29
|
sage: phi + phi == phi * E.scalar_multiplication(2) # needs sage.symbolic
|
|
25
30
|
True
|
|
26
31
|
sage: phi + phi + phi == phi * E.scalar_multiplication(3) # needs sage.symbolic
|
|
@@ -28,6 +33,7 @@ EXAMPLES::
|
|
|
28
33
|
|
|
29
34
|
An example of computing with a supersingular endomorphism ring::
|
|
30
35
|
|
|
36
|
+
sage: # needs sage.symbolic
|
|
31
37
|
sage: E = EllipticCurve(GF(419^2), [1,0])
|
|
32
38
|
sage: i = E.automorphisms()[-1]
|
|
33
39
|
sage: j = E.frobenius_isogeny()
|
|
@@ -47,7 +47,7 @@ However, they are certainly separable isogenies with the same kernel
|
|
|
47
47
|
and must therefore be equal *up to post-isomorphism*::
|
|
48
48
|
|
|
49
49
|
sage: isos = psi.codomain().isomorphisms(phi.codomain())
|
|
50
|
-
sage: sum(iso * psi == phi for iso in isos)
|
|
50
|
+
sage: sum(iso * psi == phi for iso in isos) # needs sage.symbolic
|
|
51
51
|
1
|
|
52
52
|
|
|
53
53
|
Just like
|
|
@@ -1034,7 +1034,7 @@ class EllipticCurveHom_velusqrt(EllipticCurveHom):
|
|
|
1034
1034
|
Elliptic-curve isogeny (using square-root Vélu) of degree 59:
|
|
1035
1035
|
From: Elliptic Curve defined by y^2 + 5*x*y + 5*y = x^3 + 5*x^2 + 5*x + 5 over Finite Field of size 101
|
|
1036
1036
|
To: Elliptic Curve defined by y^2 = x^3 + 15*x + 25 over Finite Field of size 101
|
|
1037
|
-
sage: phi == psi
|
|
1037
|
+
sage: phi == psi # needs sage.symbolic
|
|
1038
1038
|
True
|
|
1039
1039
|
"""
|
|
1040
1040
|
if op != op_EQ:
|
|
@@ -1089,13 +1089,19 @@ class EllipticCurveHom_velusqrt(EllipticCurveHom):
|
|
|
1089
1089
|
sage: K = E.cardinality() // 11 * E.gens()[0]
|
|
1090
1090
|
sage: phi = E.isogeny(K, algorithm='velusqrt'); phi
|
|
1091
1091
|
Elliptic-curve isogeny (using square-root Vélu) of degree 11:
|
|
1092
|
-
From: Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 + x + 1
|
|
1093
|
-
|
|
1092
|
+
From: Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 + x + 1
|
|
1093
|
+
over Finite Field in z2 of size 101^2
|
|
1094
|
+
To: Elliptic Curve defined by y^2 = x^3 + 39*x + 40
|
|
1095
|
+
over Finite Field in z2 of size 101^2
|
|
1094
1096
|
sage: phi.dual()
|
|
1095
|
-
Isogeny of degree 11
|
|
1096
|
-
|
|
1097
|
+
Isogeny of degree 11
|
|
1098
|
+
from Elliptic Curve defined by y^2 = x^3 + 39*x + 40
|
|
1099
|
+
over Finite Field in z2 of size 101^2
|
|
1100
|
+
to Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 + x + 1
|
|
1101
|
+
over Finite Field in z2 of size 101^2
|
|
1102
|
+
sage: phi.dual() * phi == phi.domain().scalar_multiplication(11) # needs sage.symbolic
|
|
1097
1103
|
True
|
|
1098
|
-
sage: phi * phi.dual() == phi.codomain().scalar_multiplication(11)
|
|
1104
|
+
sage: phi * phi.dual() == phi.codomain().scalar_multiplication(11) # needs sage.symbolic
|
|
1099
1105
|
True
|
|
1100
1106
|
"""
|
|
1101
1107
|
# FIXME: This code fails if the degree is divisible by the characteristic.
|
|
@@ -39,7 +39,7 @@ the endomorphism ring as scalar multiplications::
|
|
|
39
39
|
True
|
|
40
40
|
sage: (1 + omega + omega^2) == 0
|
|
41
41
|
True
|
|
42
|
-
sage: (2*omega + 1)^2 == -3
|
|
42
|
+
sage: (2*omega + 1)^2 == -3 # needs sage.symbolic
|
|
43
43
|
True
|
|
44
44
|
|
|
45
45
|
AUTHORS:
|
|
@@ -94,7 +94,7 @@ class EllipticCurveHomset(SchemeHomset_generic):
|
|
|
94
94
|
|
|
95
95
|
sage: E = EllipticCurve(GF(101), [1,1])
|
|
96
96
|
sage: H = End(E)
|
|
97
|
-
sage: TestSuite(H).run(skip='_test_elements')
|
|
97
|
+
sage: TestSuite(H).run(skip='_test_elements') # needs sage.symbolic
|
|
98
98
|
|
|
99
99
|
::
|
|
100
100
|
|
|
@@ -1142,7 +1142,7 @@ def isogenies_7_0(E, minimal_models=True):
|
|
|
1142
1142
|
to Elliptic Curve defined by y^2 + y = x^3 + (-7) over Number Field in r
|
|
1143
1143
|
with defining polynomial x^2 + 3 with r = 1.732050807568878?*I]
|
|
1144
1144
|
|
|
1145
|
-
sage: # needs sage.rings.number_field
|
|
1145
|
+
sage: # needs sage.rings.number_field sage.symbolic
|
|
1146
1146
|
sage: x = polygen(QQ, 'x')
|
|
1147
1147
|
sage: K.<a> = NumberField(x^6 + 1512*x^3 - 21168)
|
|
1148
1148
|
sage: E = EllipticCurve(K, [0,1])
|
|
@@ -19,8 +19,7 @@ from sage.rings.integer_ring import ZZ
|
|
|
19
19
|
from sage.libs.pari import pari
|
|
20
20
|
from cypari2.handle_error import PariError
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
_db = ClassicalModularPolynomialDatabase()
|
|
22
|
+
_db = None
|
|
24
23
|
|
|
25
24
|
_cache_bound = 100
|
|
26
25
|
_cache = {}
|
|
@@ -106,6 +105,7 @@ def classical_modular_polynomial(l, j=None):
|
|
|
106
105
|
sage: classical_modular_polynomial(l, j) == classical_modular_polynomial(l)(j, Y)
|
|
107
106
|
True
|
|
108
107
|
"""
|
|
108
|
+
global _db
|
|
109
109
|
l = ZZ(l)
|
|
110
110
|
|
|
111
111
|
if j is None:
|
|
@@ -118,13 +118,17 @@ def classical_modular_polynomial(l, j=None):
|
|
|
118
118
|
pass
|
|
119
119
|
|
|
120
120
|
try:
|
|
121
|
+
if _db is None:
|
|
122
|
+
from sage.databases.db_modular_polynomials import ClassicalModularPolynomialDatabase
|
|
123
|
+
_db = ClassicalModularPolynomialDatabase()
|
|
121
124
|
Phi = ZZ['X,Y'](_db[l])
|
|
122
|
-
except ValueError:
|
|
125
|
+
except (FileNotFoundError, ImportError, ValueError):
|
|
123
126
|
try:
|
|
124
127
|
pari_Phi = pari.polmodular(l)
|
|
125
128
|
except PariError:
|
|
126
129
|
raise NotImplementedError('modular polynomial is not in database and computing it on the fly is not yet implemented')
|
|
127
|
-
d = {(i, j): c for i,f in enumerate(pari_Phi)
|
|
130
|
+
d = {(i, j): c for i, f in enumerate(pari_Phi)
|
|
131
|
+
for j, c in enumerate(f)}
|
|
128
132
|
Phi = ZZ['X,Y'](d)
|
|
129
133
|
|
|
130
134
|
if l <= _cache_bound:
|
|
@@ -140,8 +144,11 @@ def classical_modular_polynomial(l, j=None):
|
|
|
140
144
|
if l in _cache:
|
|
141
145
|
return _cache[l](j, Y)
|
|
142
146
|
try:
|
|
147
|
+
if _db is None:
|
|
148
|
+
from sage.databases.db_modular_polynomials import ClassicalModularPolynomialDatabase
|
|
149
|
+
_db = ClassicalModularPolynomialDatabase()
|
|
143
150
|
Phi = _db[l]
|
|
144
|
-
except ValueError:
|
|
151
|
+
except (ValueError, ImportError, FileNotFoundError):
|
|
145
152
|
pass
|
|
146
153
|
else:
|
|
147
154
|
if l <= _cache_bound:
|
|
Binary file
|
|
@@ -127,18 +127,24 @@ class pAdicLseries(SageObject):
|
|
|
127
127
|
|
|
128
128
|
An example showing the calculation of nontrivial Teichmueller twists::
|
|
129
129
|
|
|
130
|
+
sage: # needs sage.graphs
|
|
130
131
|
sage: E = EllipticCurve('11a1')
|
|
131
132
|
sage: lp = E.padic_lseries(7)
|
|
132
|
-
sage: lp.series(4,eta=1)
|
|
133
|
-
3 + 7^3 + 6*7^4 + 3*7^5 + O(7^6)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
sage: lp.series(4,eta=
|
|
137
|
-
|
|
133
|
+
sage: lp.series(4, eta=1)
|
|
134
|
+
3 + 7^3 + 6*7^4 + 3*7^5 + O(7^6)
|
|
135
|
+
+ (2*7 + 7^2 + O(7^3))*T + (1 + 5*7^2 + O(7^3))*T^2
|
|
136
|
+
+ (4 + 4*7 + 4*7^2 + O(7^3))*T^3 + (4 + 3*7 + 7^2 + O(7^3))*T^4 + O(T^5)
|
|
137
|
+
sage: lp.series(4, eta=2)
|
|
138
|
+
5 + 6*7 + 4*7^2 + 2*7^3 + 3*7^4 + 2*7^5 + O(7^6)
|
|
139
|
+
+ (6 + 4*7 + 7^2 + O(7^3))*T + (3 + 2*7^2 + O(7^3))*T^2
|
|
140
|
+
+ (1 + 4*7 + 7^2 + O(7^3))*T^3 + (6 + 6*7 + 6*7^2 + O(7^3))*T^4 + O(T^5)
|
|
141
|
+
sage: lp.series(4, eta=3)
|
|
142
|
+
O(7^6) + (5 + 4*7 + 2*7^2 + O(7^3))*T + (6 + 5*7 + 2*7^2 + O(7^3))*T^2
|
|
143
|
+
+ (5*7 + O(7^3))*T^3 + (7 + 4*7^2 + O(7^3))*T^4 + O(T^5)
|
|
138
144
|
|
|
139
145
|
(Note that the last series vanishes at `T = 0`, which is consistent with ::
|
|
140
146
|
|
|
141
|
-
sage: E.quadratic_twist(-7).rank()
|
|
147
|
+
sage: E.quadratic_twist(-7).rank() # needs sage.graphs
|
|
142
148
|
1
|
|
143
149
|
|
|
144
150
|
This proves that `E` has rank 1 over `\QQ(\zeta_7)`.)
|
|
@@ -311,7 +317,7 @@ class pAdicLseries(SageObject):
|
|
|
311
317
|
sage: Et = E.quadratic_twist(-4)
|
|
312
318
|
sage: lpt = Et.padic_lseries(5)
|
|
313
319
|
sage: eta = lpt._quotient_of_periods_to_twist(-4)
|
|
314
|
-
sage: lpt.modular_symbol(0) == lp.modular_symbol(0,quadratic_twist=-4) / eta
|
|
320
|
+
sage: lpt.modular_symbol(0) == lp.modular_symbol(0, quadratic_twist=-4) / eta # needs sage.graphs
|
|
315
321
|
True
|
|
316
322
|
"""
|
|
317
323
|
if quadratic_twist == +1:
|
|
@@ -397,9 +403,10 @@ class pAdicLseries(SageObject):
|
|
|
397
403
|
sage: L.measure(1,2, quadratic_twist=-4, prec=15) # needs sage.graphs
|
|
398
404
|
4 + 4*5 + 4*5^2 + 3*5^3 + 2*5^4 + 5^5 + 3*5^6 + 5^8 + 2*5^9 + 3*5^12 + 2*5^13 + 4*5^14 + O(5^15)
|
|
399
405
|
|
|
406
|
+
sage: # needs sage.graphs
|
|
400
407
|
sage: E = EllipticCurve('11a1')
|
|
401
|
-
sage: a = E.quadratic_twist(-3).padic_lseries(5).measure(1,2,prec=15)
|
|
402
|
-
sage: b = E.padic_lseries(5).measure(1,2, quadratic_twist=-3,prec=15)
|
|
408
|
+
sage: a = E.quadratic_twist(-3).padic_lseries(5).measure(1,2, prec=15)
|
|
409
|
+
sage: b = E.padic_lseries(5).measure(1,2, quadratic_twist=-3, prec=15)
|
|
403
410
|
sage: a == b * E.padic_lseries(5)._quotient_of_periods_to_twist(-3)
|
|
404
411
|
True
|
|
405
412
|
"""
|
|
@@ -819,13 +826,14 @@ class pAdicLseriesOrdinary(pAdicLseries):
|
|
|
819
826
|
sage: lp = E.padic_lseries(3)
|
|
820
827
|
sage: lp.series(2, quadratic_twist=-19) # needs sage.graphs
|
|
821
828
|
2 + 2*3 + 2*3^2 + O(3^4) + (1 + O(3))*T + (1 + O(3))*T^2 + O(T^3)
|
|
822
|
-
sage: E.quadratic_twist(-19).label() # optional -- database_cremona_ellcurve
|
|
829
|
+
sage: E.quadratic_twist(-19).label() # optional -- database_cremona_ellcurve, needs sage.graphs
|
|
823
830
|
'15523a1'
|
|
824
831
|
|
|
825
832
|
This proves that the rank of '15523a1' is zero, even if ``mwrank`` cannot determine this.
|
|
826
833
|
|
|
827
834
|
We calculate the `L`-series in the nontrivial Teichmueller components::
|
|
828
835
|
|
|
836
|
+
sage: # needs sage.graphs
|
|
829
837
|
sage: L = EllipticCurve('110a1').padic_lseries(5, implementation='sage')
|
|
830
838
|
sage: for j in [0..3]: print(L.series(4, eta=j))
|
|
831
839
|
O(5^6) + (2 + 2*5 + 2*5^2 + O(5^3))*T + (5 + 5^2 + O(5^3))*T^2 + (4 + 4*5 + 2*5^2 + O(5^3))*T^3 + (1 + 5 + 3*5^2 + O(5^3))*T^4 + O(T^5)
|
|
@@ -837,16 +845,17 @@ class pAdicLseriesOrdinary(pAdicLseries):
|
|
|
837
845
|
|
|
838
846
|
sage: E = EllipticCurve("53a1")
|
|
839
847
|
sage: lp = E.padic_lseries(2)
|
|
840
|
-
sage: lp.series(7)
|
|
848
|
+
sage: lp.series(7) # needs sage.graphs
|
|
841
849
|
O(2^8) + (1 + 2^2 + 2^3 + O(2^5))*T + (1 + 2^3 + O(2^4))*T^2 + (2^2 + 2^3 + O(2^4))*T^3 + (2 + 2^2 + O(2^3))*T^4 + O(T^5)
|
|
842
850
|
|
|
843
851
|
sage: E = EllipticCurve("109a1")
|
|
844
852
|
sage: lp = E.padic_lseries(2)
|
|
845
|
-
sage: lp.series(6)
|
|
853
|
+
sage: lp.series(6) # needs sage.graphs
|
|
846
854
|
2^2 + 2^6 + O(2^7) + (2 + O(2^4))*T + O(2^3)*T^2 + (2^2 + O(2^3))*T^3 + (2 + O(2^2))*T^4 + O(T^5)
|
|
847
855
|
|
|
848
856
|
Check that twists by odd Teichmuller characters are ok (:issue:`32258`)::
|
|
849
857
|
|
|
858
|
+
sage: # needs sage.graphs
|
|
850
859
|
sage: E = EllipticCurve("443c1")
|
|
851
860
|
sage: lp = E.padic_lseries(17, implementation='num')
|
|
852
861
|
sage: l8 = lp.series(2,eta=8,prec=3)
|
|
@@ -1025,6 +1034,7 @@ class pAdicLseriesOrdinary(pAdicLseries):
|
|
|
1025
1034
|
|
|
1026
1035
|
EXAMPLES::
|
|
1027
1036
|
|
|
1037
|
+
sage: # needs sage.graphs
|
|
1028
1038
|
sage: E = EllipticCurve('11a1')
|
|
1029
1039
|
sage: Lp = E.padic_lseries(5)
|
|
1030
1040
|
sage: Lp._c_bound()
|
|
@@ -1470,6 +1480,7 @@ class pAdicLseriesSupersingular(pAdicLseries):
|
|
|
1470
1480
|
|
|
1471
1481
|
EXAMPLES::
|
|
1472
1482
|
|
|
1483
|
+
sage: # needs sage.symbolic
|
|
1473
1484
|
sage: E = EllipticCurve('14a')
|
|
1474
1485
|
sage: L = E.padic_lseries(5)
|
|
1475
1486
|
sage: phi = L.frobenius(5)
|
|
@@ -1714,6 +1725,7 @@ class pAdicLseriesSupersingular(pAdicLseries):
|
|
|
1714
1725
|
|
|
1715
1726
|
EXAMPLES::
|
|
1716
1727
|
|
|
1728
|
+
sage: # needs sage.symbolic
|
|
1717
1729
|
sage: E = EllipticCurve('43a')
|
|
1718
1730
|
sage: L = E.padic_lseries(7)
|
|
1719
1731
|
sage: L.Dp_valued_regulator(7)
|