passagemath-schemes 10.8.1a4__cp314-cp314t-macosx_13_0_arm64.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/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.8.1a4.dist-info/METADATA +203 -0
- passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
- passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
- passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
- passagemath_schemes-10.8.1a4.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9556 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +727 -0
- sage/lfunctions/pari.py +971 -0
- sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5132 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
- sage/modular/abvar/abvar_newform.py +246 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +187 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +721 -0
- sage/modular/abvar/homspace.py +989 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +741 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1406 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +361 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +659 -0
- sage/modular/arithgroup/congroup_gammaH.py +1491 -0
- sage/modular/arithgroup/congroup_generic.py +630 -0
- sage/modular/arithgroup/congroup_sl2z.py +266 -0
- sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1067 -0
- sage/modular/arithgroup/tests.py +425 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3736 -0
- sage/modular/btquotients/pautomorphicform.py +2564 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1107 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +571 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1076 -0
- sage/modular/hecke/algebra.py +725 -0
- sage/modular/hecke/all.py +19 -0
- sage/modular/hecke/ambient_module.py +994 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +302 -0
- sage/modular/hecke/hecke_operator.py +736 -0
- sage/modular/hecke/homspace.py +185 -0
- sage/modular/hecke/module.py +1744 -0
- sage/modular/hecke/morphism.py +139 -0
- sage/modular/hecke/submodule.py +970 -0
- sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2020 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1070 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +817 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +120 -0
- sage/modular/modform/ambient_g1.py +199 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +487 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4105 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +127 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1859 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +380 -0
- sage/modular/modform/weight1.py +221 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3844 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1291 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +376 -0
- sage/modular/multiple_zeta.py +2635 -0
- sage/modular/multiple_zeta_F_algebra.py +789 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1879 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +776 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +856 -0
- sage/modular/pollack_stevens/modsym.py +1590 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1078 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +846 -0
- sage/modular/quasimodform/ring.py +826 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +700 -0
- sage/schemes/curves/affine_curve.py +2924 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +397 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3203 -0
- sage/schemes/curves/weighted_projective_curve.py +106 -0
- sage/schemes/curves/zariski_vankampen.py +1931 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +991 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1103 -0
- sage/schemes/elliptic_curves/constructor.py +1530 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
- sage/schemes/elliptic_curves/ell_egros.py +457 -0
- sage/schemes/elliptic_curves/ell_field.py +2837 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3249 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4944 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7184 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1663 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7328 -0
- sage/schemes/elliptic_curves/height.py +2108 -0
- sage/schemes/elliptic_curves/hom.py +1788 -0
- sage/schemes/elliptic_curves/hom_composite.py +1084 -0
- sage/schemes/elliptic_curves/hom_fractional.py +544 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +681 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +247 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +915 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +716 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +369 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +581 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +53 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
- 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
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
r"""
|
|
3
|
+
Projective plane conics over `\QQ`
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Marco Streng (2010-07-20)
|
|
8
|
+
|
|
9
|
+
- Nick Alexander (2008-01-08)
|
|
10
|
+
"""
|
|
11
|
+
# ****************************************************************************
|
|
12
|
+
# Copyright (C) 2008 Nick Alexander <ncalexander@gmail.com>
|
|
13
|
+
# Copyright (C) 2009/2010 Marco Streng <marco.streng@gmail.com>
|
|
14
|
+
#
|
|
15
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
16
|
+
#
|
|
17
|
+
# This code is distributed in the hope that it will be useful,
|
|
18
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
20
|
+
# General Public License for more details.
|
|
21
|
+
#
|
|
22
|
+
# The full text of the GPL is available at:
|
|
23
|
+
#
|
|
24
|
+
# https://www.gnu.org/licenses/
|
|
25
|
+
# ****************************************************************************
|
|
26
|
+
|
|
27
|
+
import sage.rings.abc
|
|
28
|
+
|
|
29
|
+
from sage.arith.functions import lcm
|
|
30
|
+
from sage.arith.misc import hilbert_symbol
|
|
31
|
+
from sage.matrix.constructor import Matrix
|
|
32
|
+
from sage.misc.lazy_import import lazy_import
|
|
33
|
+
from sage.rings.integer_ring import ZZ
|
|
34
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
35
|
+
from sage.rings.rational_field import QQ
|
|
36
|
+
from sage.schemes.projective.projective_space import ProjectiveSpace
|
|
37
|
+
from sage.structure.element import InfinityElement
|
|
38
|
+
from sage.structure.sequence import Sequence
|
|
39
|
+
|
|
40
|
+
lazy_import('sage.quadratic_forms.qfsolve', ['qfsolve', 'qfparam'])
|
|
41
|
+
|
|
42
|
+
from .con_number_field import ProjectiveConic_number_field
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ProjectiveConic_rational_field(ProjectiveConic_number_field):
|
|
46
|
+
r"""
|
|
47
|
+
Create a projective plane conic curve over `\QQ`.
|
|
48
|
+
|
|
49
|
+
See ``Conic`` for full documentation.
|
|
50
|
+
|
|
51
|
+
EXAMPLES::
|
|
52
|
+
|
|
53
|
+
sage: P.<X, Y, Z> = QQ[]
|
|
54
|
+
sage: Conic(X^2 + Y^2 - 3*Z^2)
|
|
55
|
+
Projective Conic Curve over Rational Field defined by X^2 + Y^2 - 3*Z^2
|
|
56
|
+
|
|
57
|
+
TESTS::
|
|
58
|
+
|
|
59
|
+
sage: Conic([2, 1, -1])._test_pickling()
|
|
60
|
+
"""
|
|
61
|
+
def __init__(self, A, f):
|
|
62
|
+
r"""
|
|
63
|
+
See ``Conic`` for full documentation.
|
|
64
|
+
|
|
65
|
+
EXAMPLES::
|
|
66
|
+
|
|
67
|
+
sage: Conic([1, 1, 1])
|
|
68
|
+
Projective Conic Curve over Rational Field defined by x^2 + y^2 + z^2
|
|
69
|
+
"""
|
|
70
|
+
ProjectiveConic_number_field.__init__(self, A, f)
|
|
71
|
+
|
|
72
|
+
def has_rational_point(self, point=False, obstruction=False,
|
|
73
|
+
algorithm='default', read_cache=True) -> bool:
|
|
74
|
+
r"""
|
|
75
|
+
Return ``True`` if and only if ``self`` has a point defined over `\QQ`.
|
|
76
|
+
|
|
77
|
+
If ``point`` and ``obstruction`` are both ``False`` (default), then
|
|
78
|
+
the output is a boolean ``out`` saying whether ``self`` has a
|
|
79
|
+
rational point.
|
|
80
|
+
|
|
81
|
+
If ``point`` or ``obstruction`` is ``True``, then the output is
|
|
82
|
+
a pair ``(out, S)``, where ``out`` is as above and the following
|
|
83
|
+
holds:
|
|
84
|
+
|
|
85
|
+
- if ``point`` is ``True`` and ``self`` has a rational point,
|
|
86
|
+
then ``S`` is a rational point,
|
|
87
|
+
|
|
88
|
+
- if ``obstruction`` is ``True`` and ``self`` has no rational point,
|
|
89
|
+
then ``S`` is a prime such that no rational point exists
|
|
90
|
+
over the completion at ``S`` or `-1` if no point exists over `\RR`.
|
|
91
|
+
|
|
92
|
+
Points and obstructions are cached, whenever they are found.
|
|
93
|
+
Cached information is used if and only if ``read_cache`` is ``True``.
|
|
94
|
+
|
|
95
|
+
ALGORITHM:
|
|
96
|
+
|
|
97
|
+
The parameter ``algorithm``
|
|
98
|
+
specifies the algorithm to be used:
|
|
99
|
+
|
|
100
|
+
- ``'qfsolve'`` -- use PARI/GP function :pari:`qfsolve`
|
|
101
|
+
|
|
102
|
+
- ``'rnfisnorm'`` -- use PARI's function :pari:`rnfisnorm`
|
|
103
|
+
(cannot be combined with ``obstruction = True``)
|
|
104
|
+
|
|
105
|
+
- ``'local'`` -- check if a local solution exists for all primes
|
|
106
|
+
and infinite places of `\QQ` and apply the Hasse principle
|
|
107
|
+
(cannot be combined with ``point = True``)
|
|
108
|
+
|
|
109
|
+
- ``'default'`` -- use ``'qfsolve'``
|
|
110
|
+
|
|
111
|
+
- ``'magma'`` (requires Magma to be installed) --
|
|
112
|
+
delegates the task to the Magma computer algebra system.
|
|
113
|
+
|
|
114
|
+
EXAMPLES::
|
|
115
|
+
|
|
116
|
+
sage: # needs sage.libs.pari
|
|
117
|
+
sage: C = Conic(QQ, [1, 2, -3])
|
|
118
|
+
sage: C.has_rational_point(point=True)
|
|
119
|
+
(True, (1 : 1 : 1))
|
|
120
|
+
sage: D = Conic(QQ, [1, 3, -5])
|
|
121
|
+
sage: D.has_rational_point(point=True)
|
|
122
|
+
(False, 3)
|
|
123
|
+
sage: P.<X,Y,Z> = QQ[]
|
|
124
|
+
sage: E = Curve(X^2 + Y^2 + Z^2); E
|
|
125
|
+
Projective Conic Curve over Rational Field defined by X^2 + Y^2 + Z^2
|
|
126
|
+
sage: E.has_rational_point(obstruction=True)
|
|
127
|
+
(False, -1)
|
|
128
|
+
|
|
129
|
+
The following would not terminate quickly with
|
|
130
|
+
``algorithm = 'rnfisnorm'`` ::
|
|
131
|
+
|
|
132
|
+
sage: C = Conic(QQ, [1, 113922743, -310146482690273725409])
|
|
133
|
+
sage: C.has_rational_point(point=True) # needs sage.libs.pari
|
|
134
|
+
(True, (-76842858034579/5424 : -5316144401/5424 : 1))
|
|
135
|
+
sage: C.has_rational_point(algorithm='local', read_cache=False)
|
|
136
|
+
True
|
|
137
|
+
sage: C.has_rational_point(point=True, algorithm='magma', # optional - magma
|
|
138
|
+
....: read_cache=False)
|
|
139
|
+
(True, (30106379962113/7913 : 12747947692/7913 : 1))
|
|
140
|
+
|
|
141
|
+
TESTS:
|
|
142
|
+
|
|
143
|
+
Create a bunch of conics over `\QQ`, check if ``has_rational_point`` runs without errors
|
|
144
|
+
and returns consistent answers for all algorithms. Check if all points returned are valid. ::
|
|
145
|
+
|
|
146
|
+
sage: # needs sage.libs.pari
|
|
147
|
+
sage: l = Sequence(cartesian_product_iterator([[-1, 0, 1] for i in range(6)]))
|
|
148
|
+
sage: c = [Conic(QQ, a) for a in l if a != [0,0,0] and a != (0,0,0,0,0,0)]
|
|
149
|
+
sage: d = []
|
|
150
|
+
sage: d = [[C] + [C.has_rational_point(algorithm=algorithm, read_cache=False, # long time (7 s)
|
|
151
|
+
....: obstruction=(algorithm != 'rnfisnorm'),
|
|
152
|
+
....: point=(algorithm != 'local'))
|
|
153
|
+
....: for algorithm in ['local', 'qfsolve', 'rnfisnorm']]
|
|
154
|
+
....: for C in c[::10]]
|
|
155
|
+
sage: assert all(e[1][0] == e[2][0] and e[1][0] == e[3][0] for e in d)
|
|
156
|
+
sage: assert all(e[0].defining_polynomial()(Sequence(e[i][1])) == 0 for e in d for i in [2,3] if e[1][0])
|
|
157
|
+
"""
|
|
158
|
+
if read_cache:
|
|
159
|
+
if self._rational_point is not None:
|
|
160
|
+
if point or obstruction:
|
|
161
|
+
return True, self._rational_point
|
|
162
|
+
else:
|
|
163
|
+
return True
|
|
164
|
+
if self._local_obstruction is not None:
|
|
165
|
+
if point or obstruction:
|
|
166
|
+
return False, self._local_obstruction
|
|
167
|
+
else:
|
|
168
|
+
return False
|
|
169
|
+
if (not point) and self._finite_obstructions == [] and \
|
|
170
|
+
self._infinite_obstructions == []:
|
|
171
|
+
if obstruction:
|
|
172
|
+
return True, None
|
|
173
|
+
return True
|
|
174
|
+
if self.has_singular_point():
|
|
175
|
+
if point:
|
|
176
|
+
return self.has_singular_point(point=True)
|
|
177
|
+
if obstruction:
|
|
178
|
+
return True, None
|
|
179
|
+
return True
|
|
180
|
+
if algorithm == 'default' or algorithm == 'qfsolve':
|
|
181
|
+
M = self.symmetric_matrix()
|
|
182
|
+
M *= lcm([t.denominator() for t in M.list()])
|
|
183
|
+
pt = qfsolve(M)
|
|
184
|
+
if pt in ZZ:
|
|
185
|
+
if self._local_obstruction is None:
|
|
186
|
+
self._local_obstruction = pt
|
|
187
|
+
if point or obstruction:
|
|
188
|
+
return False, pt
|
|
189
|
+
return False
|
|
190
|
+
pt = self.point([pt[0], pt[1], pt[2]])
|
|
191
|
+
if point or obstruction:
|
|
192
|
+
return True, pt
|
|
193
|
+
return True
|
|
194
|
+
ret = ProjectiveConic_number_field.has_rational_point(
|
|
195
|
+
self, point=point,
|
|
196
|
+
obstruction=obstruction,
|
|
197
|
+
algorithm=algorithm,
|
|
198
|
+
read_cache=read_cache)
|
|
199
|
+
if point or obstruction:
|
|
200
|
+
from sage.categories.map import Map
|
|
201
|
+
from sage.categories.rings import Rings
|
|
202
|
+
if isinstance(ret[1], Map) and ret[1].category_for().is_subcategory(Rings()):
|
|
203
|
+
# ret[1] is a morphism of Rings
|
|
204
|
+
ret[1] = -1
|
|
205
|
+
return ret
|
|
206
|
+
|
|
207
|
+
def is_locally_solvable(self, p) -> bool:
|
|
208
|
+
r"""
|
|
209
|
+
Return ``True`` if and only if ``self`` has a solution over the
|
|
210
|
+
`p`-adic numbers.
|
|
211
|
+
|
|
212
|
+
Here `p` is a prime number or equals
|
|
213
|
+
`-1`, infinity, or `\RR` to denote the infinite place.
|
|
214
|
+
|
|
215
|
+
EXAMPLES::
|
|
216
|
+
|
|
217
|
+
sage: # needs sage.libs.pari
|
|
218
|
+
sage: C = Conic(QQ, [1,2,3])
|
|
219
|
+
sage: C.is_locally_solvable(-1)
|
|
220
|
+
False
|
|
221
|
+
sage: C.is_locally_solvable(2)
|
|
222
|
+
False
|
|
223
|
+
sage: C.is_locally_solvable(3)
|
|
224
|
+
True
|
|
225
|
+
sage: C.is_locally_solvable(QQ.hom(RR))
|
|
226
|
+
False
|
|
227
|
+
sage: D = Conic(QQ, [1, 2, -3])
|
|
228
|
+
sage: D.is_locally_solvable(infinity)
|
|
229
|
+
True
|
|
230
|
+
sage: D.is_locally_solvable(RR)
|
|
231
|
+
True
|
|
232
|
+
"""
|
|
233
|
+
from sage.categories.map import Map
|
|
234
|
+
from sage.categories.rings import Rings
|
|
235
|
+
|
|
236
|
+
D, T = self.diagonal_matrix()
|
|
237
|
+
abc = [D[j, j] for j in range(3)]
|
|
238
|
+
if abc[2] == 0:
|
|
239
|
+
return True
|
|
240
|
+
a = -abc[0] / abc[2]
|
|
241
|
+
b = -abc[1] / abc[2]
|
|
242
|
+
if isinstance(p, (sage.rings.abc.RealField, InfinityElement)):
|
|
243
|
+
p = -1
|
|
244
|
+
elif isinstance(p, Map) and p.category_for().is_subcategory(Rings()):
|
|
245
|
+
# p is a morphism of Rings
|
|
246
|
+
if p.domain() is QQ and isinstance(p.codomain(), sage.rings.abc.RealField):
|
|
247
|
+
p = -1
|
|
248
|
+
else:
|
|
249
|
+
raise TypeError("p (=%s) needs to be a prime of base field "
|
|
250
|
+
"B ( =`QQ`) in is_locally_solvable" % p)
|
|
251
|
+
if hilbert_symbol(a, b, p) == -1:
|
|
252
|
+
if self._local_obstruction is None:
|
|
253
|
+
self._local_obstruction = p
|
|
254
|
+
return False
|
|
255
|
+
return True
|
|
256
|
+
|
|
257
|
+
def local_obstructions(self, finite=True, infinite=True, read_cache=True):
|
|
258
|
+
r"""
|
|
259
|
+
Return the sequence of finite primes and/or infinite places
|
|
260
|
+
such that ``self`` is locally solvable at those primes and places.
|
|
261
|
+
|
|
262
|
+
The infinite place is denoted `-1`.
|
|
263
|
+
|
|
264
|
+
The parameters ``finite`` and ``infinite`` (both ``True`` by
|
|
265
|
+
default) are used to specify whether to look at finite and/or
|
|
266
|
+
infinite places.
|
|
267
|
+
|
|
268
|
+
Note that ``finite = True`` involves factorization of the determinant
|
|
269
|
+
of ``self``, hence may be slow.
|
|
270
|
+
|
|
271
|
+
Local obstructions are cached. The parameter ``read_cache`` specifies
|
|
272
|
+
whether to look at the cache before computing anything.
|
|
273
|
+
|
|
274
|
+
EXAMPLES::
|
|
275
|
+
|
|
276
|
+
sage: # needs sage.libs.pari
|
|
277
|
+
sage: Conic(QQ, [1, 1, 1]).local_obstructions()
|
|
278
|
+
[2, -1]
|
|
279
|
+
sage: Conic(QQ, [1, 2, -3]).local_obstructions()
|
|
280
|
+
[]
|
|
281
|
+
sage: Conic(QQ, [1, 2, 3, 4, 5, 6]).local_obstructions()
|
|
282
|
+
[41, -1]
|
|
283
|
+
"""
|
|
284
|
+
obs0 = []
|
|
285
|
+
obs1 = []
|
|
286
|
+
if infinite:
|
|
287
|
+
if read_cache and self._infinite_obstructions is not None:
|
|
288
|
+
obs0 = self._infinite_obstructions
|
|
289
|
+
else:
|
|
290
|
+
if not self.is_locally_solvable(-1):
|
|
291
|
+
obs0 = [-1]
|
|
292
|
+
self._infinite_obstructions = obs0
|
|
293
|
+
if finite:
|
|
294
|
+
if read_cache and self._finite_obstructions is not None:
|
|
295
|
+
obs1 = self._finite_obstructions
|
|
296
|
+
else:
|
|
297
|
+
candidates = []
|
|
298
|
+
if self.determinant() != 0:
|
|
299
|
+
for a in self.symmetric_matrix().list():
|
|
300
|
+
if a != 0:
|
|
301
|
+
for f in a.factor():
|
|
302
|
+
if f[1] < 0 and f[0] not in candidates:
|
|
303
|
+
candidates.append(f[0])
|
|
304
|
+
for f0, f1 in (2 * self.determinant()).factor():
|
|
305
|
+
if f1 > 0 and f0 not in candidates:
|
|
306
|
+
candidates.append(f0)
|
|
307
|
+
for b in candidates:
|
|
308
|
+
if not self.is_locally_solvable(b):
|
|
309
|
+
obs1.append(b)
|
|
310
|
+
self._infinite_obstructions = obs1
|
|
311
|
+
obs = obs1 + obs0
|
|
312
|
+
if finite and infinite:
|
|
313
|
+
assert len(obs) % 2 == 0
|
|
314
|
+
return obs
|
|
315
|
+
|
|
316
|
+
def parametrization(self, point=None, morphism=True):
|
|
317
|
+
r"""
|
|
318
|
+
Return a parametrization `f` of ``self`` together with the
|
|
319
|
+
inverse of `f`.
|
|
320
|
+
|
|
321
|
+
If ``point`` is specified, then that point is used
|
|
322
|
+
for the parametrization. Otherwise, use ``self.rational_point()``
|
|
323
|
+
to find a point.
|
|
324
|
+
|
|
325
|
+
If ``morphism`` is ``True``, then `f` is returned in the form
|
|
326
|
+
of a Scheme morphism. Otherwise, it is a tuple of polynomials
|
|
327
|
+
that gives the parametrization.
|
|
328
|
+
|
|
329
|
+
ALGORITHM:
|
|
330
|
+
|
|
331
|
+
Uses the PARI/GP function :pari:`qfparam`.
|
|
332
|
+
|
|
333
|
+
EXAMPLES::
|
|
334
|
+
|
|
335
|
+
sage: # needs sage.libs.pari
|
|
336
|
+
sage: c = Conic([1,1,-1])
|
|
337
|
+
sage: c.parametrization()
|
|
338
|
+
(Scheme morphism:
|
|
339
|
+
From: Projective Space of dimension 1 over Rational Field
|
|
340
|
+
To: Projective Conic Curve over Rational Field defined by x^2 + y^2 - z^2
|
|
341
|
+
Defn: Defined on coordinates by sending (x : y) to
|
|
342
|
+
(2*x*y : x^2 - y^2 : x^2 + y^2),
|
|
343
|
+
Scheme morphism:
|
|
344
|
+
From: Projective Conic Curve over Rational Field defined by x^2 + y^2 - z^2
|
|
345
|
+
To: Projective Space of dimension 1 over Rational Field
|
|
346
|
+
Defn: Defined on coordinates by sending (x : y : z) to
|
|
347
|
+
(1/2*x : -1/2*y + 1/2*z))
|
|
348
|
+
|
|
349
|
+
An example with ``morphism = False`` ::
|
|
350
|
+
|
|
351
|
+
sage: # needs sage.libs.pari
|
|
352
|
+
sage: R.<x,y,z> = QQ[]
|
|
353
|
+
sage: C = Curve(7*x^2 + 2*y*z + z^2)
|
|
354
|
+
sage: p, i = C.parametrization(morphism=False); (p, i)
|
|
355
|
+
([-2*x*y, x^2 + 7*y^2, -2*x^2], [-1/2*x, 1/7*y + 1/14*z])
|
|
356
|
+
sage: C.defining_polynomial()(p)
|
|
357
|
+
0
|
|
358
|
+
sage: i[0](p) / i[1](p)
|
|
359
|
+
x/y
|
|
360
|
+
|
|
361
|
+
A :exc:`ValueError` is raised if ``self`` has no rational point ::
|
|
362
|
+
|
|
363
|
+
sage: # needs sage.libs.pari
|
|
364
|
+
sage: C = Conic(x^2 + 2*y^2 + z^2)
|
|
365
|
+
sage: C.parametrization()
|
|
366
|
+
Traceback (most recent call last):
|
|
367
|
+
...
|
|
368
|
+
ValueError: Conic Projective Conic Curve over Rational Field defined
|
|
369
|
+
by x^2 + 2*y^2 + z^2 has no rational points over Rational Field!
|
|
370
|
+
|
|
371
|
+
A :exc:`ValueError` is raised if ``self`` is not smooth ::
|
|
372
|
+
|
|
373
|
+
sage: # needs sage.libs.pari
|
|
374
|
+
sage: C = Conic(x^2 + y^2)
|
|
375
|
+
sage: C.parametrization()
|
|
376
|
+
Traceback (most recent call last):
|
|
377
|
+
...
|
|
378
|
+
ValueError: The conic self (=Projective Conic Curve over Rational Field defined
|
|
379
|
+
by x^2 + y^2) is not smooth, hence does not have a parametrization.
|
|
380
|
+
"""
|
|
381
|
+
if (self._parametrization is not None) and not point:
|
|
382
|
+
par = self._parametrization
|
|
383
|
+
else:
|
|
384
|
+
if not self.is_smooth():
|
|
385
|
+
raise ValueError("The conic self (=%s) is not smooth, hence does not have a parametrization." % self)
|
|
386
|
+
if point is None:
|
|
387
|
+
point = self.rational_point()
|
|
388
|
+
point = Sequence(point)
|
|
389
|
+
Q = PolynomialRing(QQ, 'x,y')
|
|
390
|
+
x, y = Q.gens()
|
|
391
|
+
gens = self.ambient_space().gens()
|
|
392
|
+
M = self.symmetric_matrix()
|
|
393
|
+
M *= lcm([t.denominator() for t in M.list()])
|
|
394
|
+
par1 = qfparam(M, point)
|
|
395
|
+
B = Matrix([[par1[i][j] for j in range(3)] for i in range(3)])
|
|
396
|
+
# self is in the image of B and does not lie on a line,
|
|
397
|
+
# hence B is invertible
|
|
398
|
+
A = B.inverse()
|
|
399
|
+
par2 = [sum([A[i, j] * gens[j] for j in range(3)]) for i in [1, 0]]
|
|
400
|
+
par = ([Q(pol(x / y) * y**2) for pol in par1], par2)
|
|
401
|
+
if self._parametrization is None:
|
|
402
|
+
self._parametrization = par
|
|
403
|
+
if not morphism:
|
|
404
|
+
return par
|
|
405
|
+
P1 = ProjectiveSpace(self.base_ring(), 1, 'x,y')
|
|
406
|
+
return P1.hom(par[0], self), self.Hom(P1)(par[1], check=False)
|