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.
Files changed (312) hide show
  1. passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
  2. passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
  3. passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
  4. passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
  5. passagemath_schemes/__init__.py +3 -0
  6. passagemath_schemes-10.8.1a4.dist-info/METADATA +203 -0
  7. passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
  8. passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
  9. passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.8.1a4.dist-info/top_level.txt +3 -0
  11. sage/all__sagemath_schemes.py +23 -0
  12. sage/databases/all__sagemath_schemes.py +7 -0
  13. sage/databases/cremona.py +1723 -0
  14. sage/dynamics/all__sagemath_schemes.py +2 -0
  15. sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
  16. sage/dynamics/arithmetic_dynamics/all.py +14 -0
  17. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
  18. sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
  19. sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
  20. sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
  21. sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
  22. sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
  23. sage/dynamics/arithmetic_dynamics/projective_ds.py +9556 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +727 -0
  29. sage/lfunctions/pari.py +971 -0
  30. sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5132 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
  34. sage/modular/abvar/abvar_newform.py +246 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +187 -0
  37. sage/modular/abvar/cuspidal_subgroup.py +371 -0
  38. sage/modular/abvar/finite_subgroup.py +896 -0
  39. sage/modular/abvar/homology.py +721 -0
  40. sage/modular/abvar/homspace.py +989 -0
  41. sage/modular/abvar/lseries.py +415 -0
  42. sage/modular/abvar/morphism.py +935 -0
  43. sage/modular/abvar/torsion_point.py +274 -0
  44. sage/modular/abvar/torsion_subgroup.py +741 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1406 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +361 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +659 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1491 -0
  57. sage/modular/arithgroup/congroup_generic.py +630 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +266 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1067 -0
  61. sage/modular/arithgroup/tests.py +425 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3736 -0
  64. sage/modular/btquotients/pautomorphicform.py +2564 -0
  65. sage/modular/buzzard.py +100 -0
  66. sage/modular/congroup.py +29 -0
  67. sage/modular/congroup_element.py +13 -0
  68. sage/modular/cusps.py +1107 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +571 -0
  71. sage/modular/dirichlet.py +3310 -0
  72. sage/modular/drinfeld_modform/all.py +2 -0
  73. sage/modular/drinfeld_modform/element.py +446 -0
  74. sage/modular/drinfeld_modform/ring.py +773 -0
  75. sage/modular/drinfeld_modform/tutorial.py +236 -0
  76. sage/modular/etaproducts.py +1076 -0
  77. sage/modular/hecke/algebra.py +725 -0
  78. sage/modular/hecke/all.py +19 -0
  79. sage/modular/hecke/ambient_module.py +994 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +302 -0
  82. sage/modular/hecke/hecke_operator.py +736 -0
  83. sage/modular/hecke/homspace.py +185 -0
  84. sage/modular/hecke/module.py +1744 -0
  85. sage/modular/hecke/morphism.py +139 -0
  86. sage/modular/hecke/submodule.py +970 -0
  87. sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
  88. sage/modular/hypergeometric_misc.pxd +4 -0
  89. sage/modular/hypergeometric_misc.pyx +166 -0
  90. sage/modular/hypergeometric_motive.py +2020 -0
  91. sage/modular/local_comp/all.py +2 -0
  92. sage/modular/local_comp/liftings.py +292 -0
  93. sage/modular/local_comp/local_comp.py +1070 -0
  94. sage/modular/local_comp/smoothchar.py +1825 -0
  95. sage/modular/local_comp/type_space.py +748 -0
  96. sage/modular/modform/all.py +30 -0
  97. sage/modular/modform/ambient.py +817 -0
  98. sage/modular/modform/ambient_R.py +177 -0
  99. sage/modular/modform/ambient_eps.py +306 -0
  100. sage/modular/modform/ambient_g0.py +120 -0
  101. sage/modular/modform/ambient_g1.py +199 -0
  102. sage/modular/modform/constructor.py +545 -0
  103. sage/modular/modform/cuspidal_submodule.py +708 -0
  104. sage/modular/modform/defaults.py +14 -0
  105. sage/modular/modform/eis_series.py +487 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4105 -0
  108. sage/modular/modform/half_integral.py +154 -0
  109. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  110. sage/modular/modform/j_invariant.py +47 -0
  111. sage/modular/modform/l_series_gross_zagier.py +127 -0
  112. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  114. sage/modular/modform/notes.py +45 -0
  115. sage/modular/modform/numerical.py +514 -0
  116. sage/modular/modform/periods.py +14 -0
  117. sage/modular/modform/ring.py +1257 -0
  118. sage/modular/modform/space.py +1859 -0
  119. sage/modular/modform/submodule.py +118 -0
  120. sage/modular/modform/tests.py +64 -0
  121. sage/modular/modform/theta.py +110 -0
  122. sage/modular/modform/vm_basis.py +380 -0
  123. sage/modular/modform/weight1.py +221 -0
  124. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  125. sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
  126. sage/modular/modform_hecketriangle/all.py +30 -0
  127. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  128. sage/modular/modform_hecketriangle/constructor.py +416 -0
  129. sage/modular/modform_hecketriangle/element.py +351 -0
  130. sage/modular/modform_hecketriangle/functors.py +752 -0
  131. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  132. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  133. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
  135. sage/modular/modform_hecketriangle/readme.py +1214 -0
  136. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  137. sage/modular/modform_hecketriangle/space.py +1037 -0
  138. sage/modular/modform_hecketriangle/subspace.py +423 -0
  139. sage/modular/modsym/all.py +17 -0
  140. sage/modular/modsym/ambient.py +3844 -0
  141. sage/modular/modsym/boundary.py +1420 -0
  142. sage/modular/modsym/element.py +336 -0
  143. sage/modular/modsym/g1list.py +178 -0
  144. sage/modular/modsym/ghlist.py +182 -0
  145. sage/modular/modsym/hecke_operator.py +73 -0
  146. sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
  147. sage/modular/modsym/manin_symbol.pxd +5 -0
  148. sage/modular/modsym/manin_symbol.pyx +497 -0
  149. sage/modular/modsym/manin_symbol_list.py +1291 -0
  150. sage/modular/modsym/modsym.py +400 -0
  151. sage/modular/modsym/modular_symbols.py +384 -0
  152. sage/modular/modsym/p1list_nf.py +1241 -0
  153. sage/modular/modsym/relation_matrix.py +591 -0
  154. sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
  155. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  156. sage/modular/modsym/space.py +2468 -0
  157. sage/modular/modsym/subspace.py +455 -0
  158. sage/modular/modsym/tests.py +376 -0
  159. sage/modular/multiple_zeta.py +2635 -0
  160. sage/modular/multiple_zeta_F_algebra.py +789 -0
  161. sage/modular/overconvergent/all.py +6 -0
  162. sage/modular/overconvergent/genus0.py +1879 -0
  163. sage/modular/overconvergent/hecke_series.py +1187 -0
  164. sage/modular/overconvergent/weightspace.py +776 -0
  165. sage/modular/pollack_stevens/all.py +4 -0
  166. sage/modular/pollack_stevens/distributions.py +874 -0
  167. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  168. sage/modular/pollack_stevens/manin_map.py +856 -0
  169. sage/modular/pollack_stevens/modsym.py +1590 -0
  170. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  171. sage/modular/pollack_stevens/sigma0.py +534 -0
  172. sage/modular/pollack_stevens/space.py +1078 -0
  173. sage/modular/quasimodform/all.py +3 -0
  174. sage/modular/quasimodform/element.py +846 -0
  175. sage/modular/quasimodform/ring.py +826 -0
  176. sage/modular/quatalg/all.py +3 -0
  177. sage/modular/quatalg/brandt.py +1642 -0
  178. sage/modular/ssmod/all.py +8 -0
  179. sage/modular/ssmod/ssmod.py +827 -0
  180. sage/rings/all__sagemath_schemes.py +1 -0
  181. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  182. sage/rings/polynomial/binary_form_reduce.py +585 -0
  183. sage/schemes/all.py +41 -0
  184. sage/schemes/berkovich/all.py +6 -0
  185. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  186. sage/schemes/berkovich/berkovich_space.py +700 -0
  187. sage/schemes/curves/affine_curve.py +2924 -0
  188. sage/schemes/curves/all.py +33 -0
  189. sage/schemes/curves/closed_point.py +434 -0
  190. sage/schemes/curves/constructor.py +397 -0
  191. sage/schemes/curves/curve.py +542 -0
  192. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  193. sage/schemes/curves/point.py +463 -0
  194. sage/schemes/curves/projective_curve.py +3203 -0
  195. sage/schemes/curves/weighted_projective_curve.py +106 -0
  196. sage/schemes/curves/zariski_vankampen.py +1931 -0
  197. sage/schemes/cyclic_covers/all.py +2 -0
  198. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  199. sage/schemes/cyclic_covers/constructor.py +137 -0
  200. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  201. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  202. sage/schemes/elliptic_curves/BSD.py +991 -0
  203. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  204. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  205. sage/schemes/elliptic_curves/all.py +49 -0
  206. sage/schemes/elliptic_curves/cardinality.py +609 -0
  207. sage/schemes/elliptic_curves/cm.py +1103 -0
  208. sage/schemes/elliptic_curves/constructor.py +1530 -0
  209. sage/schemes/elliptic_curves/ec_database.py +175 -0
  210. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
  211. sage/schemes/elliptic_curves/ell_egros.py +457 -0
  212. sage/schemes/elliptic_curves/ell_field.py +2837 -0
  213. sage/schemes/elliptic_curves/ell_finite_field.py +3249 -0
  214. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  215. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  216. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  217. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  218. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  219. sage/schemes/elliptic_curves/ell_point.py +4944 -0
  220. sage/schemes/elliptic_curves/ell_rational_field.py +7184 -0
  221. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  222. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  223. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  224. sage/schemes/elliptic_curves/formal_group.py +760 -0
  225. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  226. sage/schemes/elliptic_curves/gal_reps_number_field.py +1663 -0
  227. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  228. sage/schemes/elliptic_curves/heegner.py +7328 -0
  229. sage/schemes/elliptic_curves/height.py +2108 -0
  230. sage/schemes/elliptic_curves/hom.py +1788 -0
  231. sage/schemes/elliptic_curves/hom_composite.py +1084 -0
  232. sage/schemes/elliptic_curves/hom_fractional.py +544 -0
  233. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  234. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  235. sage/schemes/elliptic_curves/hom_sum.py +681 -0
  236. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  237. sage/schemes/elliptic_curves/homset.py +271 -0
  238. sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
  239. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  240. sage/schemes/elliptic_curves/jacobian.py +247 -0
  241. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  242. sage/schemes/elliptic_curves/kraus.py +1014 -0
  243. sage/schemes/elliptic_curves/lseries_ell.py +915 -0
  244. sage/schemes/elliptic_curves/mod5family.py +105 -0
  245. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  246. sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
  247. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  248. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  249. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  250. sage/schemes/elliptic_curves/padics.py +1816 -0
  251. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  252. sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
  253. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  254. sage/schemes/elliptic_curves/saturation.py +716 -0
  255. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  256. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  257. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  258. sage/schemes/hyperelliptic_curves/all.py +6 -0
  259. sage/schemes/hyperelliptic_curves/constructor.py +369 -0
  260. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
  261. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  265. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  266. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
  267. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
  271. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  272. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  273. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
  274. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  275. sage/schemes/jacobians/all.py +2 -0
  276. sage/schemes/overview.py +161 -0
  277. sage/schemes/plane_conics/all.py +22 -0
  278. sage/schemes/plane_conics/con_field.py +1296 -0
  279. sage/schemes/plane_conics/con_finite_field.py +158 -0
  280. sage/schemes/plane_conics/con_number_field.py +456 -0
  281. sage/schemes/plane_conics/con_rational_field.py +406 -0
  282. sage/schemes/plane_conics/con_rational_function_field.py +581 -0
  283. sage/schemes/plane_conics/constructor.py +249 -0
  284. sage/schemes/plane_quartics/all.py +2 -0
  285. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  286. sage/schemes/plane_quartics/quartic_generic.py +53 -0
  287. sage/schemes/riemann_surfaces/all.py +1 -0
  288. sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
  289. sage_wheels/share/cremona/cremona_mini.db +0 -0
  290. sage_wheels/share/ellcurves/rank0 +30427 -0
  291. sage_wheels/share/ellcurves/rank1 +31871 -0
  292. sage_wheels/share/ellcurves/rank10 +6 -0
  293. sage_wheels/share/ellcurves/rank11 +6 -0
  294. sage_wheels/share/ellcurves/rank12 +1 -0
  295. sage_wheels/share/ellcurves/rank14 +1 -0
  296. sage_wheels/share/ellcurves/rank15 +1 -0
  297. sage_wheels/share/ellcurves/rank17 +1 -0
  298. sage_wheels/share/ellcurves/rank19 +1 -0
  299. sage_wheels/share/ellcurves/rank2 +2388 -0
  300. sage_wheels/share/ellcurves/rank20 +1 -0
  301. sage_wheels/share/ellcurves/rank21 +1 -0
  302. sage_wheels/share/ellcurves/rank22 +1 -0
  303. sage_wheels/share/ellcurves/rank23 +1 -0
  304. sage_wheels/share/ellcurves/rank24 +1 -0
  305. sage_wheels/share/ellcurves/rank28 +1 -0
  306. sage_wheels/share/ellcurves/rank3 +836 -0
  307. sage_wheels/share/ellcurves/rank4 +10 -0
  308. sage_wheels/share/ellcurves/rank5 +5 -0
  309. sage_wheels/share/ellcurves/rank6 +5 -0
  310. sage_wheels/share/ellcurves/rank7 +5 -0
  311. sage_wheels/share/ellcurves/rank8 +6 -0
  312. 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)