passagemath-modules 10.6.31__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of passagemath-modules might be problematic. Click here for more details.

Files changed (807) hide show
  1. passagemath_modules-10.6.31.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31.dist-info/RECORD +807 -0
  3. passagemath_modules-10.6.31.dist-info/WHEEL +6 -0
  4. passagemath_modules-10.6.31.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
  6. passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
  7. passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
  8. passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
  9. passagemath_modules.libs/libmpfr-ecd7067e.so.6.2.1 +0 -0
  10. passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
  11. passagemath_modules.libs/libquadmath-2284e583.so.0.0.0 +0 -0
  12. sage/algebras/all__sagemath_modules.py +20 -0
  13. sage/algebras/catalog.py +148 -0
  14. sage/algebras/clifford_algebra.py +3107 -0
  15. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
  16. sage/algebras/clifford_algebra_element.pxd +16 -0
  17. sage/algebras/clifford_algebra_element.pyx +997 -0
  18. sage/algebras/commutative_dga.py +4252 -0
  19. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-gnu.so +0 -0
  20. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  21. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  22. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  23. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  29. sage/algebras/finite_gca.py +528 -0
  30. sage/algebras/group_algebra.py +232 -0
  31. sage/algebras/lie_algebras/abelian.py +197 -0
  32. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  33. sage/algebras/lie_algebras/all.py +25 -0
  34. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  35. sage/algebras/lie_algebras/bch.py +177 -0
  36. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  37. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  38. sage/algebras/lie_algebras/center_uea.py +767 -0
  39. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  40. sage/algebras/lie_algebras/examples.py +683 -0
  41. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  42. sage/algebras/lie_algebras/heisenberg.py +820 -0
  43. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  44. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  47. sage/algebras/lie_algebras/morphism.py +661 -0
  48. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  49. sage/algebras/lie_algebras/onsager.py +1324 -0
  50. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  51. sage/algebras/lie_algebras/quotient.py +462 -0
  52. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  53. sage/algebras/lie_algebras/representation.py +1040 -0
  54. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  55. sage/algebras/lie_algebras/subalgebra.py +967 -0
  56. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  57. sage/algebras/lie_algebras/verma_module.py +1630 -0
  58. sage/algebras/lie_algebras/virasoro.py +1186 -0
  59. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-gnu.so +0 -0
  60. sage/algebras/octonion_algebra.pxd +20 -0
  61. sage/algebras/octonion_algebra.pyx +987 -0
  62. sage/algebras/orlik_solomon.py +907 -0
  63. sage/algebras/orlik_terao.py +779 -0
  64. sage/algebras/steenrod/all.py +7 -0
  65. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  66. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  67. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  68. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  69. sage/algebras/weyl_algebra.py +1126 -0
  70. sage/all__sagemath_modules.py +62 -0
  71. sage/calculus/all__sagemath_modules.py +19 -0
  72. sage/calculus/expr.py +205 -0
  73. sage/calculus/integration.cpython-314-x86_64-linux-gnu.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-x86_64-linux-gnu.so +0 -0
  84. sage/calculus/riemann.pyx +1521 -0
  85. sage/calculus/test_sympy.py +201 -0
  86. sage/calculus/transforms/all.py +7 -0
  87. sage/calculus/transforms/dft.py +844 -0
  88. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-gnu.so +0 -0
  89. sage/calculus/transforms/dwt.pxd +7 -0
  90. sage/calculus/transforms/dwt.pyx +160 -0
  91. sage/calculus/transforms/fft.cpython-314-x86_64-linux-gnu.so +0 -0
  92. sage/calculus/transforms/fft.pxd +12 -0
  93. sage/calculus/transforms/fft.pyx +487 -0
  94. sage/calculus/wester.py +662 -0
  95. sage/coding/abstract_code.py +1108 -0
  96. sage/coding/ag_code.py +868 -0
  97. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-gnu.so +0 -0
  98. sage/coding/ag_code_decoders.pyx +2639 -0
  99. sage/coding/all.py +15 -0
  100. sage/coding/bch_code.py +494 -0
  101. sage/coding/binary_code.cpython-314-x86_64-linux-gnu.so +0 -0
  102. sage/coding/binary_code.pxd +124 -0
  103. sage/coding/binary_code.pyx +4139 -0
  104. sage/coding/bounds_catalog.py +43 -0
  105. sage/coding/channel.py +819 -0
  106. sage/coding/channels_catalog.py +29 -0
  107. sage/coding/code_bounds.py +755 -0
  108. sage/coding/code_constructions.py +804 -0
  109. sage/coding/codes_catalog.py +111 -0
  110. sage/coding/cyclic_code.py +1329 -0
  111. sage/coding/databases.py +316 -0
  112. sage/coding/decoder.py +373 -0
  113. sage/coding/decoders_catalog.py +88 -0
  114. sage/coding/delsarte_bounds.py +709 -0
  115. sage/coding/encoder.py +390 -0
  116. sage/coding/encoders_catalog.py +64 -0
  117. sage/coding/extended_code.py +468 -0
  118. sage/coding/gabidulin_code.py +1058 -0
  119. sage/coding/golay_code.py +404 -0
  120. sage/coding/goppa_code.py +441 -0
  121. sage/coding/grs_code.py +2371 -0
  122. sage/coding/guava.py +107 -0
  123. sage/coding/guruswami_sudan/all.py +1 -0
  124. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  125. sage/coding/guruswami_sudan/interpolation.py +409 -0
  126. sage/coding/guruswami_sudan/utils.py +176 -0
  127. sage/coding/hamming_code.py +176 -0
  128. sage/coding/information_set_decoder.py +1032 -0
  129. sage/coding/kasami_codes.cpython-314-x86_64-linux-gnu.so +0 -0
  130. sage/coding/kasami_codes.pyx +351 -0
  131. sage/coding/linear_code.py +3067 -0
  132. sage/coding/linear_code_no_metric.py +1354 -0
  133. sage/coding/linear_rank_metric.py +961 -0
  134. sage/coding/parity_check_code.py +353 -0
  135. sage/coding/punctured_code.py +719 -0
  136. sage/coding/reed_muller_code.py +999 -0
  137. sage/coding/self_dual_codes.py +942 -0
  138. sage/coding/source_coding/all.py +2 -0
  139. sage/coding/source_coding/huffman.py +553 -0
  140. sage/coding/subfield_subcode.py +423 -0
  141. sage/coding/two_weight_db.py +399 -0
  142. sage/combinat/all__sagemath_modules.py +7 -0
  143. sage/combinat/cartesian_product.py +347 -0
  144. sage/combinat/family.py +11 -0
  145. sage/combinat/free_module.py +1977 -0
  146. sage/combinat/root_system/all.py +147 -0
  147. sage/combinat/root_system/ambient_space.py +527 -0
  148. sage/combinat/root_system/associahedron.py +471 -0
  149. sage/combinat/root_system/braid_move_calculator.py +143 -0
  150. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-gnu.so +0 -0
  151. sage/combinat/root_system/braid_orbit.pyx +144 -0
  152. sage/combinat/root_system/branching_rules.py +2301 -0
  153. sage/combinat/root_system/cartan_matrix.py +1245 -0
  154. sage/combinat/root_system/cartan_type.py +3069 -0
  155. sage/combinat/root_system/coxeter_group.py +162 -0
  156. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  157. sage/combinat/root_system/coxeter_type.py +681 -0
  158. sage/combinat/root_system/dynkin_diagram.py +900 -0
  159. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  160. sage/combinat/root_system/fundamental_group.py +795 -0
  161. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  162. sage/combinat/root_system/integrable_representations.py +1227 -0
  163. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  164. sage/combinat/root_system/pieri_factors.py +1147 -0
  165. sage/combinat/root_system/plot.py +1615 -0
  166. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  167. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  168. sage/combinat/root_system/root_space.py +487 -0
  169. sage/combinat/root_system/root_system.py +882 -0
  170. sage/combinat/root_system/type_A.py +348 -0
  171. sage/combinat/root_system/type_A_affine.py +227 -0
  172. sage/combinat/root_system/type_A_infinity.py +241 -0
  173. sage/combinat/root_system/type_B.py +347 -0
  174. sage/combinat/root_system/type_BC_affine.py +287 -0
  175. sage/combinat/root_system/type_B_affine.py +216 -0
  176. sage/combinat/root_system/type_C.py +317 -0
  177. sage/combinat/root_system/type_C_affine.py +188 -0
  178. sage/combinat/root_system/type_D.py +357 -0
  179. sage/combinat/root_system/type_D_affine.py +208 -0
  180. sage/combinat/root_system/type_E.py +641 -0
  181. sage/combinat/root_system/type_E_affine.py +231 -0
  182. sage/combinat/root_system/type_F.py +387 -0
  183. sage/combinat/root_system/type_F_affine.py +137 -0
  184. sage/combinat/root_system/type_G.py +293 -0
  185. sage/combinat/root_system/type_G_affine.py +132 -0
  186. sage/combinat/root_system/type_H.py +105 -0
  187. sage/combinat/root_system/type_I.py +110 -0
  188. sage/combinat/root_system/type_Q.py +150 -0
  189. sage/combinat/root_system/type_affine.py +509 -0
  190. sage/combinat/root_system/type_dual.py +704 -0
  191. sage/combinat/root_system/type_folded.py +301 -0
  192. sage/combinat/root_system/type_marked.py +748 -0
  193. sage/combinat/root_system/type_reducible.py +601 -0
  194. sage/combinat/root_system/type_relabel.py +730 -0
  195. sage/combinat/root_system/type_super_A.py +837 -0
  196. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  197. sage/combinat/root_system/weight_space.py +639 -0
  198. sage/combinat/root_system/weyl_characters.py +2238 -0
  199. sage/crypto/__init__.py +4 -0
  200. sage/crypto/all.py +28 -0
  201. sage/crypto/block_cipher/all.py +7 -0
  202. sage/crypto/block_cipher/des.py +1065 -0
  203. sage/crypto/block_cipher/miniaes.py +2171 -0
  204. sage/crypto/block_cipher/present.py +909 -0
  205. sage/crypto/block_cipher/sdes.py +1527 -0
  206. sage/crypto/boolean_function.cpython-314-x86_64-linux-gnu.so +0 -0
  207. sage/crypto/boolean_function.pxd +10 -0
  208. sage/crypto/boolean_function.pyx +1487 -0
  209. sage/crypto/cipher.py +78 -0
  210. sage/crypto/classical.py +3668 -0
  211. sage/crypto/classical_cipher.py +569 -0
  212. sage/crypto/cryptosystem.py +387 -0
  213. sage/crypto/key_exchange/all.py +7 -0
  214. sage/crypto/key_exchange/catalog.py +24 -0
  215. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  216. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  217. sage/crypto/lattice.py +312 -0
  218. sage/crypto/lfsr.py +295 -0
  219. sage/crypto/lwe.py +840 -0
  220. sage/crypto/mq/__init__.py +4 -0
  221. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  222. sage/crypto/mq/rijndael_gf.py +2345 -0
  223. sage/crypto/mq/sbox.py +7 -0
  224. sage/crypto/mq/sr.py +3344 -0
  225. sage/crypto/public_key/all.py +5 -0
  226. sage/crypto/public_key/blum_goldwasser.py +776 -0
  227. sage/crypto/sbox.cpython-314-x86_64-linux-gnu.so +0 -0
  228. sage/crypto/sbox.pyx +2090 -0
  229. sage/crypto/sboxes.py +2090 -0
  230. sage/crypto/stream.py +390 -0
  231. sage/crypto/stream_cipher.py +297 -0
  232. sage/crypto/util.py +519 -0
  233. sage/ext/all__sagemath_modules.py +1 -0
  234. sage/ext/interpreters/__init__.py +1 -0
  235. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  236. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-gnu.so +0 -0
  237. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  238. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  239. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-gnu.so +0 -0
  240. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  241. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  242. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-gnu.so +0 -0
  243. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  244. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  245. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-gnu.so +0 -0
  246. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  247. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  248. sage/geometry/all__sagemath_modules.py +5 -0
  249. sage/geometry/toric_lattice.py +1745 -0
  250. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-gnu.so +0 -0
  251. sage/geometry/toric_lattice_element.pyx +432 -0
  252. sage/groups/abelian_gps/abelian_group.py +1925 -0
  253. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  254. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  255. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  256. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  257. sage/groups/abelian_gps/element_base.py +341 -0
  258. sage/groups/abelian_gps/values.py +488 -0
  259. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  260. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  261. sage/groups/additive_abelian/all.py +4 -0
  262. sage/groups/additive_abelian/qmodnz.py +231 -0
  263. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  264. sage/groups/affine_gps/affine_group.py +535 -0
  265. sage/groups/affine_gps/all.py +1 -0
  266. sage/groups/affine_gps/catalog.py +17 -0
  267. sage/groups/affine_gps/euclidean_group.py +246 -0
  268. sage/groups/affine_gps/group_element.py +562 -0
  269. sage/groups/all__sagemath_modules.py +12 -0
  270. sage/groups/galois_group.py +479 -0
  271. sage/groups/matrix_gps/all.py +4 -0
  272. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  273. sage/groups/matrix_gps/catalog.py +26 -0
  274. sage/groups/matrix_gps/coxeter_group.py +927 -0
  275. sage/groups/matrix_gps/finitely_generated.py +487 -0
  276. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-gnu.so +0 -0
  277. sage/groups/matrix_gps/group_element.pxd +11 -0
  278. sage/groups/matrix_gps/group_element.pyx +431 -0
  279. sage/groups/matrix_gps/linear.py +440 -0
  280. sage/groups/matrix_gps/matrix_group.py +617 -0
  281. sage/groups/matrix_gps/named_group.py +296 -0
  282. sage/groups/matrix_gps/orthogonal.py +544 -0
  283. sage/groups/matrix_gps/symplectic.py +251 -0
  284. sage/groups/matrix_gps/unitary.py +436 -0
  285. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  286. sage/groups/misc_gps/argument_groups.py +1905 -0
  287. sage/groups/misc_gps/imaginary_groups.py +479 -0
  288. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  289. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-gnu.so +0 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  293. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-gnu.so +0 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  296. sage/homology/algebraic_topological_model.py +595 -0
  297. sage/homology/all.py +2 -0
  298. sage/homology/all__sagemath_modules.py +8 -0
  299. sage/homology/chain_complex.py +2148 -0
  300. sage/homology/chain_complex_homspace.py +165 -0
  301. sage/homology/chain_complex_morphism.py +629 -0
  302. sage/homology/chain_homotopy.py +604 -0
  303. sage/homology/chains.py +653 -0
  304. sage/homology/free_resolution.py +923 -0
  305. sage/homology/graded_resolution.py +567 -0
  306. sage/homology/hochschild_complex.py +756 -0
  307. sage/homology/homology_group.py +188 -0
  308. sage/homology/homology_morphism.py +422 -0
  309. sage/homology/homology_vector_space_with_basis.py +1454 -0
  310. sage/homology/koszul_complex.py +169 -0
  311. sage/homology/matrix_utils.py +205 -0
  312. sage/libs/all__sagemath_modules.py +1 -0
  313. sage/libs/gsl/__init__.py +1 -0
  314. sage/libs/gsl/airy.pxd +56 -0
  315. sage/libs/gsl/all.pxd +66 -0
  316. sage/libs/gsl/array.cpython-314-x86_64-linux-gnu.so +0 -0
  317. sage/libs/gsl/array.pxd +5 -0
  318. sage/libs/gsl/array.pyx +102 -0
  319. sage/libs/gsl/bessel.pxd +208 -0
  320. sage/libs/gsl/blas.pxd +116 -0
  321. sage/libs/gsl/blas_types.pxd +34 -0
  322. sage/libs/gsl/block.pxd +52 -0
  323. sage/libs/gsl/chebyshev.pxd +37 -0
  324. sage/libs/gsl/clausen.pxd +12 -0
  325. sage/libs/gsl/combination.pxd +47 -0
  326. sage/libs/gsl/complex.pxd +151 -0
  327. sage/libs/gsl/coulomb.pxd +30 -0
  328. sage/libs/gsl/coupling.pxd +21 -0
  329. sage/libs/gsl/dawson.pxd +12 -0
  330. sage/libs/gsl/debye.pxd +24 -0
  331. sage/libs/gsl/dilog.pxd +14 -0
  332. sage/libs/gsl/eigen.pxd +46 -0
  333. sage/libs/gsl/elementary.pxd +12 -0
  334. sage/libs/gsl/ellint.pxd +48 -0
  335. sage/libs/gsl/elljac.pxd +8 -0
  336. sage/libs/gsl/erf.pxd +32 -0
  337. sage/libs/gsl/errno.pxd +26 -0
  338. sage/libs/gsl/exp.pxd +44 -0
  339. sage/libs/gsl/expint.pxd +44 -0
  340. sage/libs/gsl/fermi_dirac.pxd +44 -0
  341. sage/libs/gsl/fft.pxd +121 -0
  342. sage/libs/gsl/fit.pxd +50 -0
  343. sage/libs/gsl/gamma.pxd +94 -0
  344. sage/libs/gsl/gegenbauer.pxd +26 -0
  345. sage/libs/gsl/histogram.pxd +176 -0
  346. sage/libs/gsl/hyperg.pxd +52 -0
  347. sage/libs/gsl/integration.pxd +69 -0
  348. sage/libs/gsl/interp.pxd +109 -0
  349. sage/libs/gsl/laguerre.pxd +24 -0
  350. sage/libs/gsl/lambert.pxd +16 -0
  351. sage/libs/gsl/legendre.pxd +90 -0
  352. sage/libs/gsl/linalg.pxd +185 -0
  353. sage/libs/gsl/log.pxd +26 -0
  354. sage/libs/gsl/math.pxd +43 -0
  355. sage/libs/gsl/matrix.pxd +143 -0
  356. sage/libs/gsl/matrix_complex.pxd +130 -0
  357. sage/libs/gsl/min.pxd +67 -0
  358. sage/libs/gsl/monte.pxd +56 -0
  359. sage/libs/gsl/ntuple.pxd +32 -0
  360. sage/libs/gsl/odeiv.pxd +70 -0
  361. sage/libs/gsl/permutation.pxd +78 -0
  362. sage/libs/gsl/poly.pxd +40 -0
  363. sage/libs/gsl/pow_int.pxd +12 -0
  364. sage/libs/gsl/psi.pxd +28 -0
  365. sage/libs/gsl/qrng.pxd +29 -0
  366. sage/libs/gsl/random.pxd +257 -0
  367. sage/libs/gsl/rng.pxd +100 -0
  368. sage/libs/gsl/roots.pxd +72 -0
  369. sage/libs/gsl/sort.pxd +36 -0
  370. sage/libs/gsl/statistics.pxd +59 -0
  371. sage/libs/gsl/sum.pxd +55 -0
  372. sage/libs/gsl/synchrotron.pxd +16 -0
  373. sage/libs/gsl/transport.pxd +24 -0
  374. sage/libs/gsl/trig.pxd +58 -0
  375. sage/libs/gsl/types.pxd +137 -0
  376. sage/libs/gsl/vector.pxd +101 -0
  377. sage/libs/gsl/vector_complex.pxd +83 -0
  378. sage/libs/gsl/wavelet.pxd +49 -0
  379. sage/libs/gsl/zeta.pxd +28 -0
  380. sage/libs/mpc/__init__.pxd +114 -0
  381. sage/libs/mpc/types.pxd +28 -0
  382. sage/libs/mpfr/__init__.pxd +299 -0
  383. sage/libs/mpfr/types.pxd +26 -0
  384. sage/libs/mpmath/__init__.py +1 -0
  385. sage/libs/mpmath/all.py +27 -0
  386. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  387. sage/libs/mpmath/utils.cpython-314-x86_64-linux-gnu.so +0 -0
  388. sage/libs/mpmath/utils.pxd +4 -0
  389. sage/libs/mpmath/utils.pyx +319 -0
  390. sage/matrix/action.cpython-314-x86_64-linux-gnu.so +0 -0
  391. sage/matrix/action.pxd +26 -0
  392. sage/matrix/action.pyx +596 -0
  393. sage/matrix/all.py +9 -0
  394. sage/matrix/args.cpython-314-x86_64-linux-gnu.so +0 -0
  395. sage/matrix/args.pxd +144 -0
  396. sage/matrix/args.pyx +1668 -0
  397. sage/matrix/benchmark.py +1258 -0
  398. sage/matrix/berlekamp_massey.py +95 -0
  399. sage/matrix/compute_J_ideal.py +926 -0
  400. sage/matrix/constructor.cpython-314-x86_64-linux-gnu.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.so +0 -0
  416. sage/matrix/matrix_cdv.pxd +4 -0
  417. sage/matrix/matrix_cdv.pyx +93 -0
  418. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  419. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  420. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  421. sage/matrix/matrix_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  422. sage/matrix/matrix_dense.pxd +5 -0
  423. sage/matrix/matrix_dense.pyx +343 -0
  424. sage/matrix/matrix_domain_dense.pxd +5 -0
  425. sage/matrix/matrix_domain_sparse.pxd +5 -0
  426. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  427. sage/matrix/matrix_double_dense.pxd +7 -0
  428. sage/matrix/matrix_double_dense.pyx +3906 -0
  429. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  430. sage/matrix/matrix_double_sparse.pxd +6 -0
  431. sage/matrix/matrix_double_sparse.pyx +248 -0
  432. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  433. sage/matrix/matrix_generic_dense.pxd +7 -0
  434. sage/matrix/matrix_generic_dense.pyx +354 -0
  435. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  436. sage/matrix/matrix_generic_sparse.pxd +7 -0
  437. sage/matrix/matrix_generic_sparse.pyx +461 -0
  438. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  441. sage/matrix/matrix_misc.py +313 -0
  442. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  443. sage/matrix/matrix_numpy_dense.pxd +14 -0
  444. sage/matrix/matrix_numpy_dense.pyx +450 -0
  445. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  446. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  447. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  448. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  449. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  450. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  451. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  452. sage/matrix/matrix_real_double_dense.pxd +7 -0
  453. sage/matrix/matrix_real_double_dense.pyx +122 -0
  454. sage/matrix/matrix_space.py +2848 -0
  455. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  456. sage/matrix/matrix_sparse.pxd +5 -0
  457. sage/matrix/matrix_sparse.pyx +1222 -0
  458. sage/matrix/matrix_window.cpython-314-x86_64-linux-gnu.so +0 -0
  459. sage/matrix/matrix_window.pxd +37 -0
  460. sage/matrix/matrix_window.pyx +242 -0
  461. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
  462. sage/matrix/misc_mpfr.pyx +80 -0
  463. sage/matrix/operation_table.py +1182 -0
  464. sage/matrix/special.py +3666 -0
  465. sage/matrix/strassen.cpython-314-x86_64-linux-gnu.so +0 -0
  466. sage/matrix/strassen.pyx +851 -0
  467. sage/matrix/symplectic_basis.py +541 -0
  468. sage/matrix/template.pxd +6 -0
  469. sage/matrix/tests.py +71 -0
  470. sage/matroids/advanced.py +77 -0
  471. sage/matroids/all.py +13 -0
  472. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  473. sage/matroids/basis_exchange_matroid.pxd +96 -0
  474. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  475. sage/matroids/basis_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  476. sage/matroids/basis_matroid.pxd +45 -0
  477. sage/matroids/basis_matroid.pyx +1217 -0
  478. sage/matroids/catalog.py +44 -0
  479. sage/matroids/chow_ring.py +473 -0
  480. sage/matroids/chow_ring_ideal.py +849 -0
  481. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  482. sage/matroids/circuit_closures_matroid.pxd +16 -0
  483. sage/matroids/circuit_closures_matroid.pyx +559 -0
  484. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  485. sage/matroids/circuits_matroid.pxd +38 -0
  486. sage/matroids/circuits_matroid.pyx +947 -0
  487. sage/matroids/constructor.py +1086 -0
  488. sage/matroids/database_collections.py +365 -0
  489. sage/matroids/database_matroids.py +5338 -0
  490. sage/matroids/dual_matroid.py +583 -0
  491. sage/matroids/extension.cpython-314-x86_64-linux-gnu.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  495. sage/matroids/flats_matroid.pxd +28 -0
  496. sage/matroids/flats_matroid.pyx +715 -0
  497. sage/matroids/gammoid.py +600 -0
  498. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  499. sage/matroids/graphic_matroid.pxd +39 -0
  500. sage/matroids/graphic_matroid.pyx +2024 -0
  501. sage/matroids/lean_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
  502. sage/matroids/lean_matrix.pxd +126 -0
  503. sage/matroids/lean_matrix.pyx +3667 -0
  504. sage/matroids/linear_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  505. sage/matroids/linear_matroid.pxd +180 -0
  506. sage/matroids/linear_matroid.pyx +6649 -0
  507. sage/matroids/matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  508. sage/matroids/matroid.pxd +243 -0
  509. sage/matroids/matroid.pyx +8759 -0
  510. sage/matroids/matroids_catalog.py +190 -0
  511. sage/matroids/matroids_plot_helpers.py +890 -0
  512. sage/matroids/minor_matroid.py +480 -0
  513. sage/matroids/minorfix.h +9 -0
  514. sage/matroids/named_matroids.py +5 -0
  515. sage/matroids/rank_matroid.py +268 -0
  516. sage/matroids/set_system.cpython-314-x86_64-linux-gnu.so +0 -0
  517. sage/matroids/set_system.pxd +38 -0
  518. sage/matroids/set_system.pyx +800 -0
  519. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  520. sage/matroids/transversal_matroid.pxd +14 -0
  521. sage/matroids/transversal_matroid.pyx +893 -0
  522. sage/matroids/union_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
  523. sage/matroids/union_matroid.pxd +20 -0
  524. sage/matroids/union_matroid.pyx +331 -0
  525. sage/matroids/unpickling.cpython-314-x86_64-linux-gnu.so +0 -0
  526. sage/matroids/unpickling.pyx +843 -0
  527. sage/matroids/utilities.py +809 -0
  528. sage/misc/all__sagemath_modules.py +20 -0
  529. sage/misc/c3.cpython-314-x86_64-linux-gnu.so +0 -0
  530. sage/misc/c3.pyx +238 -0
  531. sage/misc/compat.py +87 -0
  532. sage/misc/element_with_label.py +173 -0
  533. sage/misc/func_persist.py +79 -0
  534. sage/misc/pickle_old.cpython-314-x86_64-linux-gnu.so +0 -0
  535. sage/misc/pickle_old.pyx +19 -0
  536. sage/misc/proof.py +7 -0
  537. sage/misc/replace_dot_all.py +472 -0
  538. sage/misc/sagedoc_conf.py +168 -0
  539. sage/misc/sphinxify.py +167 -0
  540. sage/misc/test_class_pickling.py +85 -0
  541. sage/modules/all.py +42 -0
  542. sage/modules/complex_double_vector.py +25 -0
  543. sage/modules/diamond_cutting.py +380 -0
  544. sage/modules/fg_pid/all.py +1 -0
  545. sage/modules/fg_pid/fgp_element.py +456 -0
  546. sage/modules/fg_pid/fgp_module.py +2091 -0
  547. sage/modules/fg_pid/fgp_morphism.py +550 -0
  548. sage/modules/filtered_vector_space.py +1271 -0
  549. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-gnu.so +0 -0
  550. sage/modules/finite_submodule_iter.pxd +27 -0
  551. sage/modules/finite_submodule_iter.pyx +452 -0
  552. sage/modules/fp_graded/all.py +1 -0
  553. sage/modules/fp_graded/element.py +346 -0
  554. sage/modules/fp_graded/free_element.py +298 -0
  555. sage/modules/fp_graded/free_homspace.py +53 -0
  556. sage/modules/fp_graded/free_module.py +1060 -0
  557. sage/modules/fp_graded/free_morphism.py +217 -0
  558. sage/modules/fp_graded/homspace.py +563 -0
  559. sage/modules/fp_graded/module.py +1340 -0
  560. sage/modules/fp_graded/morphism.py +1990 -0
  561. sage/modules/fp_graded/steenrod/all.py +1 -0
  562. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  563. sage/modules/fp_graded/steenrod/module.py +477 -0
  564. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  565. sage/modules/fp_graded/steenrod/profile.py +241 -0
  566. sage/modules/free_module.py +8447 -0
  567. sage/modules/free_module_element.cpython-314-x86_64-linux-gnu.so +0 -0
  568. sage/modules/free_module_element.pxd +22 -0
  569. sage/modules/free_module_element.pyx +5445 -0
  570. sage/modules/free_module_homspace.py +369 -0
  571. sage/modules/free_module_integer.py +896 -0
  572. sage/modules/free_module_morphism.py +823 -0
  573. sage/modules/free_module_pseudohomspace.py +352 -0
  574. sage/modules/free_module_pseudomorphism.py +578 -0
  575. sage/modules/free_quadratic_module.py +1706 -0
  576. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  577. sage/modules/matrix_morphism.py +1745 -0
  578. sage/modules/misc.py +103 -0
  579. sage/modules/module_functors.py +192 -0
  580. sage/modules/multi_filtered_vector_space.py +719 -0
  581. sage/modules/ore_module.py +2208 -0
  582. sage/modules/ore_module_element.py +178 -0
  583. sage/modules/ore_module_homspace.py +147 -0
  584. sage/modules/ore_module_morphism.py +968 -0
  585. sage/modules/quotient_module.py +699 -0
  586. sage/modules/real_double_vector.py +22 -0
  587. sage/modules/submodule.py +255 -0
  588. sage/modules/tensor_operations.py +567 -0
  589. sage/modules/torsion_quadratic_module.py +1352 -0
  590. sage/modules/tutorial_free_modules.py +248 -0
  591. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  592. sage/modules/vector_complex_double_dense.pxd +6 -0
  593. sage/modules/vector_complex_double_dense.pyx +117 -0
  594. sage/modules/vector_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  595. sage/modules/vector_double_dense.pxd +6 -0
  596. sage/modules/vector_double_dense.pyx +604 -0
  597. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  598. sage/modules/vector_integer_dense.pxd +15 -0
  599. sage/modules/vector_integer_dense.pyx +361 -0
  600. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  601. sage/modules/vector_integer_sparse.pxd +29 -0
  602. sage/modules/vector_integer_sparse.pyx +406 -0
  603. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  604. sage/modules/vector_modn_dense.pxd +12 -0
  605. sage/modules/vector_modn_dense.pyx +394 -0
  606. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  607. sage/modules/vector_modn_sparse.pxd +21 -0
  608. sage/modules/vector_modn_sparse.pyx +298 -0
  609. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  610. sage/modules/vector_numpy_dense.pxd +15 -0
  611. sage/modules/vector_numpy_dense.pyx +304 -0
  612. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  613. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  614. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  615. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  616. sage/modules/vector_rational_dense.pxd +15 -0
  617. sage/modules/vector_rational_dense.pyx +387 -0
  618. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
  619. sage/modules/vector_rational_sparse.pxd +30 -0
  620. sage/modules/vector_rational_sparse.pyx +413 -0
  621. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  622. sage/modules/vector_real_double_dense.pxd +6 -0
  623. sage/modules/vector_real_double_dense.pyx +126 -0
  624. sage/modules/vector_space_homspace.py +430 -0
  625. sage/modules/vector_space_morphism.py +989 -0
  626. sage/modules/with_basis/all.py +15 -0
  627. sage/modules/with_basis/cell_module.py +494 -0
  628. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-gnu.so +0 -0
  629. sage/modules/with_basis/indexed_element.pxd +13 -0
  630. sage/modules/with_basis/indexed_element.pyx +1058 -0
  631. sage/modules/with_basis/invariant.py +1075 -0
  632. sage/modules/with_basis/morphism.py +1636 -0
  633. sage/modules/with_basis/representation.py +2939 -0
  634. sage/modules/with_basis/subquotient.py +685 -0
  635. sage/numerical/all__sagemath_modules.py +6 -0
  636. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-gnu.so +0 -0
  637. sage/numerical/gauss_legendre.pyx +381 -0
  638. sage/numerical/optimize.py +910 -0
  639. sage/probability/all.py +10 -0
  640. sage/probability/probability_distribution.cpython-314-x86_64-linux-gnu.so +0 -0
  641. sage/probability/probability_distribution.pyx +1242 -0
  642. sage/probability/random_variable.py +411 -0
  643. sage/quadratic_forms/all.py +4 -0
  644. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  645. sage/quadratic_forms/binary_qf.py +2042 -0
  646. sage/quadratic_forms/bqf_class_group.py +748 -0
  647. sage/quadratic_forms/constructions.py +93 -0
  648. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-gnu.so +0 -0
  649. sage/quadratic_forms/count_local_2.pyx +365 -0
  650. sage/quadratic_forms/extras.py +195 -0
  651. sage/quadratic_forms/quadratic_form.py +1753 -0
  652. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  653. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  654. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-gnu.so +0 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  656. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  657. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  658. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  659. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  660. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  661. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  662. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  663. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  664. sage/quadratic_forms/random_quadraticform.py +209 -0
  665. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-gnu.so +0 -0
  666. sage/quadratic_forms/ternary.pyx +1154 -0
  667. sage/quadratic_forms/ternary_qf.py +2027 -0
  668. sage/rings/all__sagemath_modules.py +28 -0
  669. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  670. sage/rings/asymptotic/misc.py +1252 -0
  671. sage/rings/cc.py +4 -0
  672. sage/rings/cfinite_sequence.py +1306 -0
  673. sage/rings/complex_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
  674. sage/rings/complex_conversion.pxd +8 -0
  675. sage/rings/complex_conversion.pyx +23 -0
  676. sage/rings/complex_double.cpython-314-x86_64-linux-gnu.so +0 -0
  677. sage/rings/complex_double.pxd +21 -0
  678. sage/rings/complex_double.pyx +2654 -0
  679. sage/rings/complex_mpc.cpython-314-x86_64-linux-gnu.so +0 -0
  680. sage/rings/complex_mpc.pxd +21 -0
  681. sage/rings/complex_mpc.pyx +2576 -0
  682. sage/rings/complex_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
  683. sage/rings/complex_mpfr.pxd +18 -0
  684. sage/rings/complex_mpfr.pyx +3602 -0
  685. sage/rings/derivation.py +2334 -0
  686. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  687. sage/rings/finite_rings/maps_finite_field.py +191 -0
  688. sage/rings/function_field/all__sagemath_modules.py +8 -0
  689. sage/rings/function_field/derivations.py +102 -0
  690. sage/rings/function_field/derivations_rational.py +132 -0
  691. sage/rings/function_field/differential.py +853 -0
  692. sage/rings/function_field/divisor.py +1107 -0
  693. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  694. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  695. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  696. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  697. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  698. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  699. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  700. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.so +0 -0
  703. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  704. sage/rings/invariants/all.py +4 -0
  705. sage/rings/invariants/invariant_theory.py +4597 -0
  706. sage/rings/invariants/reconstruction.py +395 -0
  707. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  708. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  709. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-gnu.so +0 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  712. sage/rings/polynomial/ore_function_element.py +952 -0
  713. sage/rings/polynomial/ore_function_field.py +1028 -0
  714. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
  715. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  716. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  717. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  718. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-gnu.so +0 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  720. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  721. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
  722. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  723. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  724. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-gnu.so +0 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  727. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-gnu.so +0 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  730. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  731. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-gnu.so +0 -0
  732. sage/rings/real_double_element_gsl.pxd +8 -0
  733. sage/rings/real_double_element_gsl.pyx +794 -0
  734. sage/rings/real_field.py +58 -0
  735. sage/rings/real_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
  736. sage/rings/real_mpfr.pxd +29 -0
  737. sage/rings/real_mpfr.pyx +6122 -0
  738. sage/rings/ring_extension.cpython-314-x86_64-linux-gnu.so +0 -0
  739. sage/rings/ring_extension.pxd +42 -0
  740. sage/rings/ring_extension.pyx +2779 -0
  741. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
  742. sage/rings/ring_extension_conversion.pxd +16 -0
  743. sage/rings/ring_extension_conversion.pyx +462 -0
  744. sage/rings/ring_extension_element.cpython-314-x86_64-linux-gnu.so +0 -0
  745. sage/rings/ring_extension_element.pxd +21 -0
  746. sage/rings/ring_extension_element.pyx +1635 -0
  747. sage/rings/ring_extension_homset.py +64 -0
  748. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-gnu.so +0 -0
  749. sage/rings/ring_extension_morphism.pxd +35 -0
  750. sage/rings/ring_extension_morphism.pyx +920 -0
  751. sage/schemes/all__sagemath_modules.py +1 -0
  752. sage/schemes/projective/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/coherent_sheaf.py +300 -0
  754. sage/schemes/projective/cohomology.py +510 -0
  755. sage/stats/all.py +15 -0
  756. sage/stats/basic_stats.py +489 -0
  757. sage/stats/distributions/all.py +7 -0
  758. sage/stats/distributions/catalog.py +34 -0
  759. sage/stats/distributions/dgs.h +50 -0
  760. sage/stats/distributions/dgs.pxd +111 -0
  761. sage/stats/distributions/dgs_bern.h +400 -0
  762. sage/stats/distributions/dgs_gauss.h +614 -0
  763. sage/stats/distributions/dgs_misc.h +104 -0
  764. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-gnu.so +0 -0
  765. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  767. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  768. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  769. sage/stats/hmm/all.py +15 -0
  770. sage/stats/hmm/chmm.cpython-314-x86_64-linux-gnu.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.so +0 -0
  773. sage/stats/hmm/distributions.pxd +29 -0
  774. sage/stats/hmm/distributions.pyx +531 -0
  775. sage/stats/hmm/hmm.cpython-314-x86_64-linux-gnu.so +0 -0
  776. sage/stats/hmm/hmm.pxd +17 -0
  777. sage/stats/hmm/hmm.pyx +1388 -0
  778. sage/stats/hmm/util.cpython-314-x86_64-linux-gnu.so +0 -0
  779. sage/stats/hmm/util.pxd +7 -0
  780. sage/stats/hmm/util.pyx +165 -0
  781. sage/stats/intlist.cpython-314-x86_64-linux-gnu.so +0 -0
  782. sage/stats/intlist.pxd +14 -0
  783. sage/stats/intlist.pyx +588 -0
  784. sage/stats/r.py +49 -0
  785. sage/stats/time_series.cpython-314-x86_64-linux-gnu.so +0 -0
  786. sage/stats/time_series.pxd +6 -0
  787. sage/stats/time_series.pyx +2546 -0
  788. sage/tensor/all.py +2 -0
  789. sage/tensor/modules/all.py +8 -0
  790. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  791. sage/tensor/modules/comp.py +5598 -0
  792. sage/tensor/modules/ext_pow_free_module.py +824 -0
  793. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  794. sage/tensor/modules/format_utilities.py +333 -0
  795. sage/tensor/modules/free_module_alt_form.py +858 -0
  796. sage/tensor/modules/free_module_automorphism.py +1207 -0
  797. sage/tensor/modules/free_module_basis.py +1074 -0
  798. sage/tensor/modules/free_module_element.py +284 -0
  799. sage/tensor/modules/free_module_homset.py +652 -0
  800. sage/tensor/modules/free_module_linear_group.py +564 -0
  801. sage/tensor/modules/free_module_morphism.py +1581 -0
  802. sage/tensor/modules/free_module_tensor.py +3289 -0
  803. sage/tensor/modules/reflexive_module.py +386 -0
  804. sage/tensor/modules/tensor_free_module.py +780 -0
  805. sage/tensor/modules/tensor_free_submodule.py +538 -0
  806. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  807. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1154 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ """
3
+ Helper code for ternary quadratic forms
4
+ """
5
+
6
+ # ****************************************************************************
7
+ # Copyright (C) 2012 Gustavo Rama
8
+ #
9
+ # This program is free software: you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation, either version 2 of the License, or
12
+ # (at your option) any later version.
13
+ # https://www.gnu.org/licenses/
14
+ # ****************************************************************************
15
+
16
+ from sage.arith.misc import gcd, inverse_mod, xgcd
17
+ from sage.matrix.constructor import matrix
18
+ from sage.misc.prandom import randint
19
+ from sage.rings.finite_rings.integer_mod import mod
20
+ from sage.rings.integer_ring import ZZ
21
+
22
+
23
+ def red_mfact(a, b):
24
+ """
25
+ Auxiliary function for reduction that finds the reduction factor of integers `a`, `b`.
26
+
27
+ INPUT:
28
+
29
+ - ``a``, ``b`` -- integers
30
+
31
+ OUTPUT: integer
32
+
33
+ EXAMPLES::
34
+
35
+ sage: from sage.quadratic_forms.ternary import red_mfact
36
+ sage: red_mfact(0, 3)
37
+ 0
38
+ sage: red_mfact(-5, 100)
39
+ 9
40
+ """
41
+
42
+ if a:
43
+ return (-b + abs(a))//(2*a)
44
+ else:
45
+ return 0
46
+
47
+
48
+ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12):
49
+ """
50
+ Find the coefficients of the equivalent unique reduced ternary form according to the conditions
51
+ of Dickson's "Studies in the Theory of Numbers", pp164-171, and the transformation matrix.
52
+ See TernaryQF.is_eisenstein_reduced for the conditions.
53
+
54
+ EXAMPLES::
55
+
56
+ sage: from sage.quadratic_forms.ternary import _reduced_ternary_form_eisenstein_with_matrix
57
+ sage: Q = TernaryQF([293, 315, 756, 908, 929, 522])
58
+ sage: qr, M = _reduced_ternary_form_eisenstein_with_matrix(293, 315, 756, 908, 929, 522)
59
+ sage: qr
60
+ (1, 2, 2, -1, 0, -1)
61
+ sage: M
62
+ [ -54 137 -38]
63
+ [ -23 58 -16]
64
+ [ 47 -119 33]
65
+ sage: Qr = TernaryQF(qr)
66
+ sage: Qr.is_eisenstein_reduced()
67
+ True
68
+ sage: Q(M) == Qr
69
+ True
70
+ """
71
+ # M = identity_matrix(3)
72
+ # M = matrix(ZZ, 3, [m11, m12, m13, m21, m22, m23, m31, m32, m33])
73
+ m11, m12, m13, m21, m22, m23, m31, m32, m33 = 1, 0, 0, 0, 1, 0, 0, 0, 1
74
+
75
+ loop = True
76
+
77
+ while loop:
78
+
79
+ # adjust
80
+ v = a1 + a2 + a23 + a13 + a12
81
+ if (v < 0):
82
+ # M *= matrix(ZZ, 3, [1, 0, 1, 0, 1, 1, 0, 0, 1])
83
+ [m13] = [m11 + m12 + m13]
84
+ [m23] = [m21 + m22 + m23]
85
+ [m33] = [m31 + m32 + m33]
86
+ a3 += v
87
+ a23 += a12 + 2*a2
88
+ a13 += a12 + 2*a1
89
+
90
+ # cuadred 12
91
+ m = red_mfact(a1, a12)
92
+ # M *= matrix(ZZ, 3, [1, m, 0, 0, 1, 0, 0, 0, 1])
93
+ [m12] = [m*m11 + m12]
94
+ [m22] = [m*m21 + m22]
95
+ [m32] = [m*m31 + m32]
96
+ t = a1*m
97
+ a12 += t
98
+ a2 += a12*m
99
+ a12 += t
100
+ a23 += a13*m
101
+
102
+ # cuadred 23
103
+ m = red_mfact(a2, a23)
104
+ # M *= matrix(ZZ, 3, [1, 0, 0, 0, 1, m, 0, 0, 1])
105
+ [m13] = [m*m12 + m13]
106
+ [m23] = [m*m22 + m23]
107
+ [m33] = [m*m32 + m33]
108
+ t = a2*m
109
+ a23 += t
110
+ a3 += a23*m
111
+ a23 += t
112
+ a13 += a12*m
113
+
114
+ # cuadred 13
115
+ m = red_mfact(a1, a13)
116
+ # M *= matrix(ZZ, 3, [1, 0, m, 0, 1, 0, 0, 0, 1])
117
+ [m13] = [m*m11 + m13]
118
+ [m23] = [m*m21 + m23]
119
+ [m33] = [m*m31 + m33]
120
+ t = a1*m
121
+ a13 += t
122
+ a3 += a13*m
123
+ a13 += t
124
+ a23 += a12*m
125
+
126
+ # order 12
127
+ if a1 > a2 or (a1 == a2 and abs(a23) > abs(a13)):
128
+ # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1])
129
+ [m11, m12, m13] = [-m12, -m11, -m13]
130
+ [m21, m22, m23] = [-m22, -m21, -m23]
131
+ [m31, m32, m33] = [-m32, -m31, -m33]
132
+ [a1, a2] = [a2, a1]
133
+ [a13, a23] = [a23, a13]
134
+
135
+ # order 23
136
+ if a2 > a3 or (a2 == a3 and abs(a13) > abs(a12)):
137
+ # M *= matrix(ZZ, 3, [-1, 0, 0, 0, 0, -1, 0, -1, 0])
138
+ [m11, m12, m13] = [-m11, -m13, -m12]
139
+ [m21, m22, m23] = [-m21, -m23, -m22]
140
+ [m31, m32, m33] = [-m31, -m33, -m32]
141
+ [a2, a3] = [a3, a2]
142
+ [a13, a12] = [a12, a13]
143
+
144
+ # order 12
145
+ if a1 > a2 or (a1 == a2 and abs(a23) > abs(a13)):
146
+ # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1])
147
+ [m11, m12, m13] = [-m12, -m11, -m13]
148
+ [m21, m22, m23] = [-m22, -m21, -m23]
149
+ [m31, m32, m33] = [-m32, -m31, -m33]
150
+ [a1, a2] = [a2, a1]
151
+ [a13, a23] = [a23, a13]
152
+
153
+ # signs
154
+ if a23*a13*a12 > 0:
155
+ # a23, a13, a12 positive
156
+
157
+ if (a23 < 0):
158
+ # M *= diagonal_matrix([-1, 1, 1])
159
+ m11 = -m11
160
+ m21 = -m21
161
+ m31 = -m31
162
+ a23 = -a23
163
+ if (a13 < 0):
164
+ # M *= diagonal_matrix([1, -1, 1])
165
+ m12 = -m12
166
+ m22 = -m22
167
+ m32 = -m32
168
+ a13 = -a13
169
+ if (a12 < 0):
170
+ # M *= diagonal_matrix([1, 1, -1])
171
+ m13 = -m13
172
+ m23 = -m23
173
+ m33 = -m33
174
+ a12 = -a12
175
+
176
+ else:
177
+ # a23, a13, a12 nonpositive
178
+
179
+ [s1, s2, s3] = [a23 > 0, a13 > 0, a12 > 0]
180
+ if (s1 + s2 + s3) % 2:
181
+ if a23 == 0:
182
+ s1 = 1
183
+ else:
184
+ if a13 == 0:
185
+ s2 = 1
186
+ else:
187
+ if (a12 == 0):
188
+ s3 = 1
189
+ if s1:
190
+ # M *= diagonal_matrix([-1, 1, 1])
191
+ m11 = -m11
192
+ m21 = -m21
193
+ m31 = -m31
194
+ a23 = -a23
195
+ if s2:
196
+ # M *= diagonal_matrix([1, -1, 1])
197
+ m12 = -m12
198
+ m22 = -m22
199
+ m32 = -m32
200
+ a13 = -a13
201
+ if s3:
202
+ # M *= diagonal_matrix([1, 1, -1])
203
+ m13 = -m13
204
+ m23 = -m23
205
+ m33 = -m33
206
+ a12 = -a12
207
+
208
+ loop = not (abs(a23) <= a2 and abs(a13) <= a1 and abs(a12) <= a1 and a1 + a2 + a23 + a13 + a12 >= 0)
209
+
210
+ # adj 3
211
+ if a1 + a2 + a23 + a13 + a12 == 0 and 2*a1 + 2*a13 + a12 > 0:
212
+ # M *= matrix(ZZ, 3, [-1, 0, 1, 0, -1, 1, 0, 0, 1])
213
+ [m11, m12, m13] = [-m11, -m12, m11 + m12 + m13]
214
+ [m21, m22, m23] = [-m21, -m22, m21 + m22 + m23]
215
+ [m31, m32, m33] = [-m31, -m32, m31 + m32 + m33]
216
+ # a3 += a1+a2+a23+a13+a12 = 0
217
+ a23 = -2*a2 - a23 - a12
218
+ a13 = -2*a1 - a13 - a12
219
+
220
+ # adj 5.12
221
+ if a1 == -a12 and a13 != 0:
222
+ # M *= matrix(ZZ, 3, [-1, -1, 0, 0, -1, 0, 0, 0, 1])
223
+ [m11, m12] = [-m11, -m11 - m12]
224
+ [m21, m22] = [-m21, -m21 - m22]
225
+ [m31, m32] = [-m31, -m31 - m32]
226
+ # a2 += a1 + a12 = 0
227
+ a23 = -a23 - a13
228
+ a13 = -a13
229
+ a12 = -a12 # = 2*a1 + a12
230
+
231
+ # adj 5.13
232
+ if a1 == -a13 and a12 != 0:
233
+ # M *= matrix(ZZ, 3, [-1, 0, -1, 0, 1, 0, 0, 0, -1])
234
+ [m11, m13] = [-m11, -m11 - m13]
235
+ [m21, m23] = [-m21, -m21 - m23]
236
+ [m31, m33] = [-m31, -m31 - m33]
237
+ # a3 += a1 + a13 = 0
238
+ a23 = -a23 - a12
239
+ a13 = -a13 # = 2*a1 + a13
240
+ a12 = -a12
241
+
242
+ # adj 5.23
243
+ if a2 == -a23 and a12 != 0:
244
+ # M *= matrix(ZZ, 3, [1, 0, 0, 0, -1, -1, 0, 0, -1])
245
+ [m12, m13] = [-m12, -m12 - m13]
246
+ [m22, m23] = [-m22, -m22 - m23]
247
+ [m32, m33] = [-m32, -m32 - m33]
248
+ # a3 += a2 + a23 = 0
249
+ a23 = -a23 # = 2*a2 + a23
250
+ a13 = -a13 - a12
251
+ a12 = -a12
252
+
253
+ # adj 4.12
254
+ if a1 == a12 and a13 > 2*a23:
255
+ # M *= matrix(ZZ, 3, [-1, -1, 0, 0, 1, 0, 0, 0, -1])
256
+ [m11, m12, m13] = [-m11, -m11 + m12, -m13]
257
+ [m21, m22, m23] = [-m21, -m21 + m22, -m23]
258
+ [m31, m32, m33] = [-m31, -m31 + m32, -m33]
259
+ # a2 += a1 - a12 = 0
260
+ a23 = -a23 + a13
261
+ # a12 = 2*a1 - a12
262
+
263
+ # adj 4.13
264
+ if a1 == a13 and a12 > 2*a23:
265
+ # M *= matrix(ZZ, 3, [-1, 0, -1, 0, -1, 0, 0, 0, 1])
266
+ [m11, m12, m13] = [-m11, -m12, -m11 + m13]
267
+ [m21, m22, m23] = [-m21, -m22, -m21 + m23]
268
+ [m31, m32, m33] = [-m31, -m32, -m31 + m33]
269
+ # a3 += a1 - a13 = 0
270
+ a23 = -a23 + a12
271
+ # a13 = 2*a1 - a13
272
+
273
+ # adj 4.23
274
+ if a2 == a23 and a12 > 2*a13:
275
+ # M *= matrix(ZZ, 3, [-1, 0, 0, 0, -1, -1, 0, 0, 1])
276
+ [m11, m12, m13] = [-m11, -m12, -m12 + m13]
277
+ [m21, m22, m23] = [-m21, -m22, -m22 + m23]
278
+ [m31, m32, m33] = [-m31, -m32, -m32 + m33]
279
+ # a3 += a2 - a23 = 0
280
+ # a23 = 2*a2 - a23
281
+ a13 = -a13 + a12
282
+
283
+ # order 12
284
+ if a1 == a2 and abs(a23) > abs(a13):
285
+ # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1])
286
+ [m11, m12, m13] = [-m12, -m11, -m13]
287
+ [m21, m22, m23] = [-m22, -m21, -m23]
288
+ [m31, m32, m33] = [-m32, -m31, -m33]
289
+ [a1, a2] = [a2, a1]
290
+ [a13, a23] = [a23, a13]
291
+
292
+ # order 23
293
+ if a2 == a3 and abs(a13) > abs(a12):
294
+ # M *= matrix(ZZ, 3, [-1, 0, 0, 0, 0, -1, 0, -1, 0])
295
+ [m11, m12, m13] = [-m11, -m13, -m12]
296
+ [m21, m22, m23] = [-m21, -m23, -m22]
297
+ [m31, m32, m33] = [-m31, -m33, -m32]
298
+ [a13, a12] = [a12, a13]
299
+
300
+ # order 12
301
+ if a1 == a2 and abs(a23) > abs(a13):
302
+ # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1])
303
+ [m11, m12, m13] = [-m12, -m11, -m13]
304
+ [m21, m22, m23] = [-m22, -m21, -m23]
305
+ [m31, m32, m33] = [-m32, -m31, -m33]
306
+ [a13, a23] = [a23, a13]
307
+
308
+ return (a1, a2, a3, a23, a13, a12), \
309
+ matrix(ZZ, 3, (m11, m12, m13, m21, m22, m23, m31, m32, m33))
310
+
311
+
312
+ def _reduced_ternary_form_eisenstein_without_matrix(a1, a2, a3, a23, a13, a12):
313
+ """
314
+ Find the coefficients of the equivalent unique reduced ternary form according to the conditions
315
+ of Dickson's "Studies in the Theory of Numbers", pp164-171.
316
+ See TernaryQF.is_eisenstein_reduced for the conditions.
317
+
318
+ EXAMPLES::
319
+
320
+ sage: from sage.quadratic_forms.ternary import _reduced_ternary_form_eisenstein_without_matrix
321
+ sage: Q = TernaryQF([293, 315, 756, 908, 929, 522])
322
+ sage: qr = _reduced_ternary_form_eisenstein_without_matrix(293, 315, 756, 908, 929, 522)
323
+ sage: qr
324
+ (1, 2, 2, -1, 0, -1)
325
+ sage: Qr = TernaryQF(qr)
326
+ sage: Qr.is_eisenstein_reduced()
327
+ True
328
+ """
329
+ loop = True
330
+
331
+ while loop:
332
+
333
+ # adjust
334
+ v = a1+a2+a23+a13+a12
335
+ if v < 0:
336
+ a3 += v
337
+ a23 += a12+2*a2
338
+ a13 += a12+2*a1
339
+
340
+ # cuadred 12
341
+ m = red_mfact(a1, a12)
342
+ t = a1*m
343
+ a12 += t
344
+ a2 += a12*m
345
+ a12 += t
346
+ a23 += a13*m
347
+
348
+ # cuadred 23
349
+ m = red_mfact(a2, a23)
350
+ t = a2*m
351
+ a23 += t
352
+ a3 += a23*m
353
+ a23 += t
354
+ a13 += a12*m
355
+
356
+ # cuadred 13
357
+ m = red_mfact(a1, a13)
358
+ t = a1*m
359
+ a13 += t
360
+ a3 += a13*m
361
+ a13 += t
362
+ a23 += a12*m
363
+
364
+ # order 12
365
+ if a1 > a2 or (a1 == a2 and abs(a23) > abs(a13)):
366
+ [a1, a2] = [a2, a1]
367
+ [a13, a23] = [a23, a13]
368
+
369
+ # order 23
370
+ if a2 > a3 or (a2 == a3 and abs(a13) > abs(a12)):
371
+ [a2, a3] = [a3, a2]
372
+ [a13, a12] = [a12, a13]
373
+
374
+ # order 12
375
+ if a1 > a2 or (a1 == a2 and abs(a23) > abs(a13)):
376
+ [a1, a2] = [a2, a1]
377
+ [a13, a23] = [a23, a13]
378
+
379
+ # signs
380
+ if a23*a13*a12 > 0:
381
+ # a23, a13, a12 positive
382
+
383
+ if a23 < 0:
384
+ a23 = -a23
385
+ if a13 < 0:
386
+ a13 = -a13
387
+ if a12 < 0:
388
+ a12 = -a12
389
+
390
+ else:
391
+ # a23, a13, a12 nonpositive
392
+
393
+ [s1, s2, s3] = [a23 > 0, a13 > 0, a12 > 0]
394
+ if (s1+s2+s3) % 2:
395
+ if a23 == 0:
396
+ s1 = 1
397
+ elif a13 == 0:
398
+ s2 = 1
399
+ elif a12 == 0:
400
+ s3 = 1
401
+ if s1:
402
+ a23 = -a23
403
+ if s2:
404
+ a13 = -a13
405
+ if s3:
406
+ a12 = -a12
407
+
408
+ loop = not (abs(a23) <= a2 and abs(a13) <= a1 and abs(a12) <= a1 and a1+a2+a23+a13+a12 >= 0)
409
+
410
+ # adj 3
411
+ if a1+a2+a23+a13+a12 == 0 and 2*a1+2*a13+a12 > 0:
412
+ # a3 += a1+a2+a23+a13+a12
413
+ a23 = -2*a2-a23-a12
414
+ a13 = -2*a1-a13-a12
415
+
416
+ # adj 5.12
417
+ if a1 == -a12 and a13 != 0:
418
+ # a2 += a1+a12
419
+ a23 = -a23-a13
420
+ a13 = -a13
421
+ a12 = -a12 # = 2*a1+a12
422
+
423
+ # adj 5.13
424
+ if a1 == -a13 and a12 != 0:
425
+ # a3 += a1+a13
426
+ a23 = -a23-a12
427
+ a13 = -a13 # = 2*a1+a13
428
+ a12 = -a12
429
+
430
+ # adj 5.23
431
+ if a2 == -a23 and a12 != 0:
432
+ # a3 += a2+a23
433
+ a23 = -a23 # = 2*a2+a23
434
+ a13 = -a13-a12
435
+ a12 = -a12
436
+
437
+ # adj 4.12
438
+ if a1 == a12 and a13 > 2*a23:
439
+ # a 2 += a1-a12
440
+ a23 = -a23 + a13
441
+ # a12 = 2*a1 - a12
442
+
443
+ # adj 4.13
444
+ if a1 == a13 and a12 > 2*a23:
445
+ # a3 += a1-a13
446
+ a23 = -a23 + a12
447
+ # a13 = 2*a1 - a13
448
+
449
+ # adj 4.23
450
+ if a2 == a23 and a12 > 2*a13:
451
+ # a3 += a2-a23
452
+ # a23 = 2*a2 - a23
453
+ a13 = -a13 + a12
454
+
455
+ # order 12
456
+ if a1 == a2 and abs(a23) > abs(a13):
457
+ [a1, a2] = [a2, a1]
458
+ [a13, a23] = [a23, a13]
459
+
460
+ # order 23
461
+ if a2 == a3 and abs(a13) > abs(a12):
462
+ [a13, a12] = [a12, a13]
463
+
464
+ # order 12
465
+ if a1 == a2 and abs(a23) > abs(a13):
466
+ [a13, a23] = [a23, a13]
467
+
468
+ return a1, a2, a3, a23, a13, a12
469
+
470
+
471
+ def primitivize(long long v0, long long v1, long long v2, p):
472
+ """
473
+ Given a 3-tuple `v` not singular mod `p`, return a primitive 3-tuple version of `v` mod `p`.
474
+
475
+ EXAMPLES::
476
+
477
+ sage: from sage.quadratic_forms.ternary import primitivize
478
+ sage: primitivize(12, 13, 14, 5)
479
+ (3, 2, 1)
480
+ sage: primitivize(12, 13, 15, 5)
481
+ (4, 1, 0)
482
+ """
483
+ if v2 % p:
484
+ v2_inv = inverse_mod(v2, p)
485
+ return v2_inv*v0 % p, v2_inv*v1 % p, 1
486
+ elif v1 % p:
487
+ return inverse_mod(v1, p)*v0 % p, 1, 0
488
+ else:
489
+ return 1, 0, 0
490
+
491
+
492
+ def evaluate(a, b, c, r, s, t, v):
493
+ """
494
+ Function to evaluate the ternary quadratic form `(a, b, c, r, s, t)` in a 3-tuple `v`.
495
+
496
+ EXAMPLES::
497
+
498
+ sage: from sage.quadratic_forms.ternary import evaluate
499
+ sage: Q = TernaryQF([1, 2, 3, -1, 0, 0])
500
+ sage: v = (1, -1, 19)
501
+ sage: Q(v)
502
+ 1105
503
+ sage: evaluate(1, 2, 3, -1, 0, 0, v)
504
+ 1105
505
+ """
506
+ return a*v[0]**2+b*v[1]**2+c*v[2]**2+r*v[2]*v[1]+s*v[2]*v[0]+t*v[1]*v[0]
507
+
508
+
509
+ def _find_zeros_mod_p_2(a, b, c, r, s, t):
510
+ """
511
+ Function to find the zeros mod 2 of a ternary quadratic form.
512
+
513
+ EXAMPLES::
514
+
515
+ sage: Q = TernaryQF([1, 2, 2, -1, 0, 0])
516
+ sage: from sage.quadratic_forms.ternary import _find_zeros_mod_p_2
517
+ sage: zeros = _find_zeros_mod_p_2(1, 2, 2, -1, 0, 0)
518
+ sage: zeros
519
+ [(0, 1, 0), (0, 0, 1), (1, 1, 1)]
520
+ sage: Q((0, 1, 0))
521
+ 2
522
+ sage: Q((0, 0, 1))
523
+ 2
524
+ sage: Q((1, 1, 1))
525
+ 4
526
+ """
527
+ zeros = []
528
+ v = (1, 0, 0)
529
+ if evaluate(a, b, c, r, s, t, v) % 2 == 0:
530
+ zeros.append(v)
531
+ for i in range(2):
532
+ v = (i, 1, 0)
533
+ if evaluate(a, b, c, r, s, t, v) % 2 == 0:
534
+ zeros.append(v)
535
+ for i in range(2):
536
+ for j in range(2):
537
+ v = (i, j, 1)
538
+ if evaluate(a, b, c, r, s, t, v) % 2 == 0:
539
+ zeros.append(v)
540
+ return zeros
541
+
542
+
543
+ def pseudorandom_primitive_zero_mod_p(a, b, c, r, s, t, p):
544
+ """
545
+ Find a zero of the form `(a, b, 1)` of the ternary quadratic form given by the coefficients `(a, b, c, r, s, t)`
546
+ mod `p`, where `p` is a odd prime that doesn't divide the discriminant.
547
+
548
+ EXAMPLES::
549
+
550
+ sage: Q = TernaryQF([1, 2, 2, -1, 0, 0])
551
+ sage: p = 1009
552
+ sage: from sage.quadratic_forms.ternary import pseudorandom_primitive_zero_mod_p
553
+ sage: v = pseudorandom_primitive_zero_mod_p(1, 2, 2, -1, 0, 0, p) # needs sage.libs.pari
554
+ sage: v[2] # needs sage.libs.pari
555
+ 1
556
+ sage: Q(v)%p # needs sage.libs.pari
557
+ 0
558
+ """
559
+ # [a, b, c, r, s, t] = Q.coefficients()
560
+ while True:
561
+
562
+ r1 = randint(0, p-1)
563
+ r2 = randint(0, p-1)
564
+ alpha = (b*r1**2+t*r1+a) % p
565
+ if alpha != 0:
566
+
567
+ beta = (2*b*r1*r2+t*r2+r*r1+s) % p
568
+ gamma = (b*r2**2+r*r2+c) % p
569
+ disc = beta**2-4*alpha*gamma
570
+ if mod(disc, p).is_square():
571
+
572
+ z = (-beta+mod(disc, p).sqrt().lift())*(2*alpha).inverse_mod(p)
573
+ return z % p, (r1*z+r2) % p, 1
574
+
575
+
576
+ def _find_zeros_mod_p_odd(long long a, long long b, long long c, long long r, long long s, long long t, long long p, v):
577
+ """
578
+ Find the zeros mod `p`, where `p` is an odd prime, of a ternary quadratic form given by its coefficients and a given zero of the form `v`.
579
+
580
+ The prime `p` does not divide the discriminant of the form.
581
+
582
+ EXAMPLES::
583
+
584
+ sage: from sage.quadratic_forms.ternary import _find_zeros_mod_p_odd
585
+ sage: Q = TernaryQF([1, 2, 2, -1, 0, 0])
586
+ sage: p = 1009
587
+ sage: v = (817, 974, 1)
588
+ sage: Q(v)%1009
589
+ 0
590
+ sage: zeros_1009 = _find_zeros_mod_p_odd(1, 2, 2, -1, 0, 0, 1009, v)
591
+ sage: len(zeros_1009)
592
+ 1010
593
+ sage: zeros_1009.sort()
594
+ sage: zeros_1009[0]
595
+ (0, 32, 1)
596
+ sage: Q((0, 32, 1))
597
+ 2018
598
+ """
599
+
600
+ cdef long long a_i
601
+ cdef long long c_i
602
+ cdef long long a_inf
603
+ cdef long long c_inf
604
+ cdef long long i
605
+ cdef long long l
606
+ cdef long long x0
607
+ cdef long long y0
608
+
609
+ zeros = [v]
610
+ x0 = v[0]
611
+ y0 = v[1]
612
+ more = False
613
+ for i in range(p):
614
+ a_i = (a*x0**2+b*i**2-2*b*i*y0+b*y0**2-t*i*x0+t*x0*y0-2*a*x0+t*i-t*y0+s*x0-r*i+r*y0+a+c-s) % p
615
+ # b_i=(-2*b*i**2+2*b*i*y0+t*i*x0+2*a*x0-2*t*i+t*y0+r*i-2*a+s)%p
616
+ if a_i == 0:
617
+ w = ((x0-1) % p, (y0-i) % p, 1)
618
+ if w == v:
619
+ more = True
620
+ else:
621
+ zeros.append(w)
622
+ else:
623
+ c_i = (b*i**2+t*i+a) % p
624
+ l = c_i*ZZ(a_i).inverse_mod(p)
625
+ w = primitivize(l*(x0-1)+1, l*(y0-i)+i, l, p)
626
+ if w[0] == v[0] and w[1] == v[1] and w[2] == v[2]:
627
+ more = True
628
+ else:
629
+ zeros.append(w)
630
+ if more:
631
+ a_inf = (a*x0**2+b*y0**2+t*x0*y0-2*b*y0-t*x0+s*x0+r*y0+b+c-r) % p
632
+ # b_inf=(2*b*y0+t*x0-2*b+r)%p
633
+ if a_inf == 0:
634
+ w = (x0 % p, (y0-1) % p, 1)
635
+ zeros.append(w)
636
+ else:
637
+ c_inf = b % p
638
+ l = c_inf*ZZ(a_inf).inverse_mod(p)
639
+ w = primitivize(l*x0, l*(y0-1)+1, l, p)
640
+ zeros.append(w)
641
+
642
+ return zeros
643
+
644
+
645
+ def _find_zeros_mod_p(a, b, c, r, s, t, p):
646
+ """
647
+ Find the zeros mod `p` of the ternary quadratic form.
648
+
649
+ The quadratic form is given by the coefficients `(a, b, c, r, s, t)`,
650
+ and `p` is a prime that does not divide the discriminant of the form.
651
+
652
+ EXAMPLES::
653
+
654
+ sage: # needs sage.libs.pari
655
+ sage: from sage.quadratic_forms.ternary import _find_zeros_mod_p
656
+ sage: Q = TernaryQF([1, 2, 2, -1, 0, 0])
657
+ sage: p = 1009
658
+ sage: zeros_1009 = _find_zeros_mod_p(1, 2, 2, -1, 0, 0, p)
659
+ sage: len(zeros_1009)
660
+ 1010
661
+ sage: zeros_1009.sort()
662
+ sage: zeros_1009[0]
663
+ (0, 32, 1)
664
+ sage: Q((0, 32, 1))
665
+ 2018
666
+ sage: zeros_2 = _find_zeros_mod_p(1, 2, 2, -1, 0, 0, 2)
667
+ sage: zeros_2
668
+ [(0, 1, 0), (0, 0, 1), (1, 1, 1)]
669
+ """
670
+ if p == 2:
671
+ return _find_zeros_mod_p_2(a, b, c, r, s, t)
672
+ v = pseudorandom_primitive_zero_mod_p(a, b, c, r, s, t, p)
673
+ return _find_zeros_mod_p_odd(a, b, c, r, s, t, p, v)
674
+
675
+
676
+ def _find_all_ternary_qf_by_level_disc(long long N, long long d):
677
+ """
678
+ Find the coefficients of all the reduced ternary quadratic forms given its discriminant d and level N.
679
+ If N|4d and d|N^2, then it may be some forms with that discriminant and level.
680
+
681
+ EXAMPLES::
682
+
683
+ sage: from sage.quadratic_forms.ternary import _find_all_ternary_qf_by_level_disc
684
+ sage: _find_all_ternary_qf_by_level_disc(44, 11)
685
+ [(1, 1, 3, 0, -1, 0), (1, 1, 4, 1, 1, 1)]
686
+ sage: _find_all_ternary_qf_by_level_disc(44, 11^2 * 16)
687
+ [(3, 15, 15, -14, -2, -2), (4, 11, 12, 0, -4, 0)]
688
+ sage: Q = TernaryQF([1, 1, 3, 0, -1, 0])
689
+ sage: Q.is_eisenstein_reduced()
690
+ True
691
+ sage: Q.reciprocal_reduced()
692
+ Ternary quadratic form with integer coefficients:
693
+ [4 11 12]
694
+ [0 -4 0]
695
+ sage: _find_all_ternary_qf_by_level_disc(44, 22)
696
+ []
697
+ sage: _find_all_ternary_qf_by_level_disc(44, 33)
698
+ Traceback (most recent call last):
699
+ ...
700
+ ValueError: There are no ternary forms of this level and discriminant
701
+ """
702
+ cdef long long a
703
+ cdef long long b
704
+ cdef long long c
705
+ cdef long long r
706
+ cdef long long s
707
+ cdef long long t
708
+ cdef long long m
709
+ cdef long long g
710
+ cdef long long u
711
+ cdef long long v
712
+ cdef long long g1
713
+ cdef long long m_q
714
+ cdef double a_max
715
+ cdef double r_max
716
+ cdef double b_max
717
+
718
+ l = []
719
+
720
+ if (4*d) % N:
721
+ raise ValueError("There are no ternary forms of this level and discriminant")
722
+ else:
723
+ m = 4*d//N
724
+
725
+ if (N**2) % d:
726
+ raise ValueError("There are no ternary forms of this level and discriminant")
727
+
728
+ a = 1
729
+ a_max = (d/2.)**(1/3.)
730
+ while a <= a_max:
731
+
732
+ [g, u, v] = xgcd(4*a, m)
733
+ g1 = (ZZ(g).squarefree_part()*g).sqrtrem()[0]
734
+ t = 0
735
+ while t <= a:
736
+
737
+ alpha = max(a, m/4/a)
738
+ b = alpha+((((u*t*t//g)-alpha)) % (m//g))
739
+ b_max = (d/2.0/a)**(1/2.)
740
+ while b <= b_max:
741
+
742
+ s = 0
743
+ beta = g//gcd(g, 2*t)
744
+ while s <= a:
745
+
746
+ r = -b+((((2*s*t*u//g)+b)) % (m//g))
747
+ if s*t == 0:
748
+ r_max = 0
749
+ else:
750
+ r_max = b
751
+ while r <= r_max:
752
+
753
+ if (d-r*s*t+a*r*r+b*s*s) % (4*a*b-t**2) == 0:
754
+
755
+ c = (d-r*s*t+a*r*r+b*s*s)//(4*a*b-t**2)
756
+ if r <= 0:
757
+ is_reduced = True
758
+ if r < -b:
759
+ is_reduced = False
760
+ elif not (b <= c and 0 <= a+b+r-s-t):
761
+ is_reduced = False
762
+ elif a == b and abs(r) > abs(s):
763
+ is_reduced = False
764
+ elif b == c and abs(s) > abs(t):
765
+ is_reduced = False
766
+ elif a+b+r-s-t == 0 and 2*a-2*s-t > 0:
767
+ is_reduced = False
768
+ elif a == t and s != 0:
769
+ is_reduced = False
770
+ elif a == s and t != 0:
771
+ is_reduced = False
772
+ elif b == -r and t != 0:
773
+ is_reduced = False
774
+ if is_reduced:
775
+ m_q = gcd((4*b*c-r**2, 4*a*c-s**2, 4*a*b-t**2, 2*s*t-4*a*r, -2*r*t+4*b*s, -2*r*s+4*c*t))
776
+ if m_q == m:
777
+ l.append((ZZ(a), ZZ(b), ZZ(c), ZZ(r), ZZ(-s), ZZ(-t)))
778
+ else:
779
+ is_reduced = True
780
+ if not (b <= c and 0 <= a+b+r+s+t):
781
+ is_reduced = False
782
+ elif a == b and abs(r) > abs(s):
783
+ is_reduced = False
784
+ elif b == c and abs(s) > abs(t):
785
+ is_reduced = False
786
+ elif a+b+r+s+t == 0 and 2*a+2*s+t > 0:
787
+ is_reduced = False
788
+ elif a == t and s > 2*r:
789
+ is_reduced = False
790
+ elif a == s and t > 2*r:
791
+ is_reduced = False
792
+ elif b == r and t > 2*s:
793
+ is_reduced = False
794
+ if is_reduced:
795
+ m_q = gcd((4*b*c-r**2, 4*a*c-s**2, 4*a*b-t**2, 2*s*t-4*a*r, 2*r*t-4*b*s, 2*r*s-4*c*t))
796
+ if m_q == m:
797
+ l.append((ZZ(a), ZZ(b), ZZ(c), ZZ(r), ZZ(s), ZZ(t)))
798
+ r += (m//g)
799
+ s += beta
800
+ b += m//g
801
+ t += g1
802
+
803
+ a += 1
804
+ return l
805
+
806
+
807
+ def _find_a_ternary_qf_by_level_disc(long long N, long long d):
808
+ """
809
+ Find the coefficients of a reduced ternary quadratic form given its discriminant d and level N.
810
+ If N|4d and d|N^2, then it may be a form with that discriminant and level.
811
+
812
+ EXAMPLES::
813
+
814
+ sage: from sage.quadratic_forms.ternary import _find_a_ternary_qf_by_level_disc
815
+ sage: _find_a_ternary_qf_by_level_disc(44, 11)
816
+ (1, 1, 3, 0, -1, 0)
817
+ sage: _find_a_ternary_qf_by_level_disc(44, 11^2 * 16)
818
+ (3, 15, 15, -14, -2, -2)
819
+ sage: Q = TernaryQF([1, 1, 3, 0, -1, 0])
820
+ sage: Q.is_eisenstein_reduced()
821
+ True
822
+ sage: Q.level()
823
+ 44
824
+ sage: Q.disc()
825
+ 11
826
+ sage: _find_a_ternary_qf_by_level_disc(44, 22)
827
+ sage: _find_a_ternary_qf_by_level_disc(44, 33)
828
+ Traceback (most recent call last):
829
+ ...
830
+ ValueError: There are no ternary forms of this level and discriminant
831
+ """
832
+ cdef long long a
833
+ cdef long long b
834
+ cdef long long c
835
+ cdef long long r
836
+ cdef long long s
837
+ cdef long long t
838
+ cdef long long m
839
+ cdef long long g
840
+ cdef long long u
841
+ cdef long long v
842
+ cdef long long g1
843
+ cdef long long m_q
844
+ cdef double a_max
845
+ cdef double r_max
846
+ cdef double b_max
847
+
848
+ if (4*d) % N:
849
+ raise ValueError("There are no ternary forms of this level and discriminant")
850
+ else:
851
+ m = 4*d//N
852
+
853
+ if (N**2) % d:
854
+ raise ValueError("There are no ternary forms of this level and discriminant")
855
+
856
+ a = 1
857
+ a_max = (d/2.)**(1/3.)
858
+ while a <= a_max:
859
+
860
+ [g, u, v] = xgcd(4*a, m)
861
+ g1 = (ZZ(g).squarefree_part()*g).sqrtrem()[0]
862
+ t = 0
863
+ while t <= a:
864
+
865
+ alpha = max(a, m/4/a)
866
+ b = alpha+((((u*t*t//g)-alpha)) % (m//g))
867
+ b_max = (d/2.0/a)**(1/2.)
868
+ while b <= b_max:
869
+
870
+ s = 0
871
+ beta = g//gcd(g, 2*t)
872
+ while s <= a:
873
+
874
+ r = -b+((((2*s*t*u//g)+b)) % (m//g))
875
+ if s*t == 0:
876
+ r_max = 0
877
+ else:
878
+ r_max = b
879
+ while r <= r_max:
880
+
881
+ if (d-r*s*t+a*r*r+b*s*s) % (4*a*b-t**2) == 0:
882
+
883
+ c = (d-r*s*t+a*r*r+b*s*s)//(4*a*b-t**2)
884
+ if r <= 0:
885
+ is_reduced = True
886
+ if r < -b:
887
+ is_reduced = False
888
+ elif not (b <= c and 0 <= a+b+r-s-t):
889
+ is_reduced = False
890
+ elif a == b and abs(r) > abs(s):
891
+ is_reduced = False
892
+ elif b == c and abs(s) > abs(t):
893
+ is_reduced = False
894
+ elif a+b+r-s-t == 0 and 2*a-2*s-t > 0:
895
+ is_reduced = False
896
+ elif a == t and s != 0:
897
+ is_reduced = False
898
+ elif a == s and t != 0:
899
+ is_reduced = False
900
+ elif b == -r and t != 0:
901
+ is_reduced = False
902
+ if is_reduced:
903
+ m_q = gcd((4*b*c-r**2, 4*a*c-s**2, 4*a*b-t**2, 2*s*t-4*a*r, -2*r*t+4*b*s, -2*r*s+4*c*t))
904
+ if m_q == m:
905
+ return ZZ(a), ZZ(b), ZZ(c), ZZ(r), ZZ(-s), ZZ(-t)
906
+ else:
907
+ is_reduced = True
908
+ if not (b <= c and 0 <= a+b+r+s+t):
909
+ is_reduced = False
910
+ elif a == b and abs(r) > abs(s):
911
+ is_reduced = False
912
+ elif b == c and abs(s) > abs(t):
913
+ is_reduced = False
914
+ elif a+b+r+s+t == 0 and 2*a+2*s+t > 0:
915
+ is_reduced = False
916
+ elif a == t and s > 2*r:
917
+ is_reduced = False
918
+ elif a == s and t > 2*r:
919
+ is_reduced = False
920
+ elif b == r and t > 2*s:
921
+ is_reduced = False
922
+ if is_reduced:
923
+ m_q = gcd((4*b*c-r**2, 4*a*c-s**2, 4*a*b-t**2, 2*s*t-4*a*r, 2*r*t-4*b*s, 2*r*s-4*c*t))
924
+ if m_q == m:
925
+ return ZZ(a), ZZ(b), ZZ(c), ZZ(r), ZZ(s), ZZ(t)
926
+ r += (m//g)
927
+ s += beta
928
+ b += m//g
929
+ t += g1
930
+
931
+ a += 1
932
+
933
+
934
+ def extend(v):
935
+ """
936
+ Return the coefficients of a matrix `M` such that `M` has determinant gcd(`v`) and the first column is `v`.
937
+
938
+ EXAMPLES::
939
+
940
+ sage: from sage.quadratic_forms.ternary import extend
941
+ sage: v = (6, 4, 12)
942
+ sage: m = extend(v)
943
+ sage: M = matrix(3, m); M
944
+ [ 6 1 0]
945
+ [ 4 1 0]
946
+ [12 0 1]
947
+ sage: M.det()
948
+ 2
949
+ sage: v = (-12, 20, 30)
950
+ sage: m = extend(v)
951
+ sage: M = matrix(3, m)
952
+ sage: M
953
+ [-12 1 0]
954
+ [ 20 -2 1]
955
+ [ 30 0 -7]
956
+ sage: M.det()
957
+ 2
958
+
959
+ TESTS::
960
+
961
+ sage: M = matrix(3, extend( (0, 0, 1) ))
962
+ sage: M.det()
963
+ 1
964
+ sage: M.column(0)
965
+ (0, 0, 1)
966
+ sage: M = matrix(3, extend( (0, 0, -2) ))
967
+ sage: M.det()
968
+ 2
969
+ sage: M.column(0)
970
+ (0, 0, -2)
971
+ """
972
+ if v[0] == v[1] == 0:
973
+ if v[2] < 0:
974
+ return v[0], 0, 1, v[1], 1, 0, v[2], 0, 0
975
+ else:
976
+ return v[0], 1, 0, v[1], 0, 1, v[2], 0, 0
977
+
978
+ b1 = xgcd(v[0], v[1])
979
+ b2 = xgcd(b1[1], b1[2])
980
+ b3 = xgcd(b1[0], v[2])
981
+
982
+ return v[0], -b1[2], -b2[1]*b3[2], v[1], b1[1], -b2[2]*b3[2], v[2], 0, b3[1]
983
+
984
+
985
+ def _find_p_neighbor_from_vec(a, b, c, r, s, t, p, v, mat=False):
986
+ """
987
+ Find the coefficients of the reduced equivalent of the p-neighbor
988
+ of the ternary quadratic given by Q = (a, b, c, r, s, t) form associated
989
+ to a given vector v satisfying:
990
+
991
+ 1. Q(v) = 0 mod p
992
+
993
+ 2. v is a non-singular point of the conic Q(v) = 0 mod p.
994
+
995
+ Reference: Gonzalo Tornaria's Thesis, Thrm 3.5, p34.
996
+
997
+ EXAMPLES::
998
+
999
+ sage: from sage.quadratic_forms.ternary import _find_p_neighbor_from_vec
1000
+ sage: Q = TernaryQF([1, 3, 3, -2, 0, -1])
1001
+ sage: Q
1002
+ Ternary quadratic form with integer coefficients:
1003
+ [1 3 3]
1004
+ [-2 0 -1]
1005
+ sage: Q.disc()
1006
+ 29
1007
+ sage: v = (9, 7, 1)
1008
+ sage: v in Q.find_zeros_mod_p(11) # needs sage.libs.pari
1009
+ True
1010
+ sage: q11, M = _find_p_neighbor_from_vec(1, 3, 3, -2, 0, -1, 11, v, mat=True)
1011
+ sage: Q11 = TernaryQF(q11)
1012
+ sage: Q11
1013
+ Ternary quadratic form with integer coefficients:
1014
+ [1 2 4]
1015
+ [-1 -1 0]
1016
+ sage: M = matrix(3, M)
1017
+ sage: M
1018
+ [ -1 -5/11 7/11]
1019
+ [ 0 -10/11 3/11]
1020
+ [ 0 -3/11 13/11]
1021
+ sage: Q(M) == Q11
1022
+ True
1023
+ """
1024
+ v0, w0, u0, v1, w1, u1, v2, w2, u2 = extend(v)
1025
+
1026
+ m00 = 2*a*v0**2 + 2*b*v1**2 + 2*c*v2**2 + 2*r*v1*v2 + 2*s*v0*v2 + 2*t*v0*v1
1027
+ m11 = 2*a*w0**2 + 2*b*w1**2 + 2*t*w0*w1
1028
+ m22 = 2*a*u0**2 + 2*b*u1**2 + 2*c*u2**2 + 2*r*u1*u2 + 2*s*u0*u2 + 2*t*u0*u1
1029
+ m01 = 2*a*v0*w0 + 2*b*v1*w1 + r*v2*w1 + s*v2*w0 + t*v0*w1 + t*v1*w0
1030
+ m02 = 2*a*u0*v0 + 2*b*u1*v1 + 2*c*u2*v2 + r*u1*v2 + r*u2*v1 + s*u0*v2 + s*u2*v0 + t*u0*v1 + t*u1*v0
1031
+ m12 = 2*a*u0*w0 + 2*b*u1*w1 + r*u2*w1 + s*u2*w0 + t*u0*w1 + t*u1*w0
1032
+
1033
+ if m02 % p:
1034
+
1035
+ m0 = (-m00/m02/2) % p**2
1036
+ m1 = (-m01/m02) % p
1037
+
1038
+ b00 = m0**2*m22/p**2 + 2*m0*m02/p**2 + m00/p**2
1039
+ b11 = m1**2*m22 + 2*m1*m12 + m11
1040
+ b22 = m22*p**2
1041
+ b01 = m0*m1*m22/p + m0*m12/p + m02*m1/p + m01/p
1042
+ b02 = m0*m22 + m02
1043
+ b12 = m1*m22*p + m12*p
1044
+
1045
+ if mat:
1046
+ q, Mr = _reduced_ternary_form_eisenstein_with_matrix(ZZ(b00/2), ZZ(b11/2), ZZ(b22/2), ZZ(b12), ZZ(b02), ZZ(b01))
1047
+ r00, r01, r02, r10, r11, r12, r20, r21, r22 = Mr.list()
1048
+ t00 = p*r20*u0 + (m0*u0/p + v0/p)*r00 + (m1*u0 + w0)*r10
1049
+ t01 = p*r21*u0 + (m0*u0/p + v0/p)*r01 + (m1*u0 + w0)*r11
1050
+ t02 = p*r22*u0 + (m0*u0/p + v0/p)*r02 + (m1*u0 + w0)*r12
1051
+ t10 = p*r20*u1 + (m0*u1/p + v1/p)*r00 + (m1*u1 + w1)*r10
1052
+ t11 = p*r21*u1 + (m0*u1/p + v1/p)*r01 + (m1*u1 + w1)*r11
1053
+ t12 = p*r22*u1 + (m0*u1/p + v1/p)*r02 + (m1*u1 + w1)*r12
1054
+ t20 = p*r20*u2 + (m0*u2/p + v2/p)*r00 + (m1*u2 + w2)*r10
1055
+ t21 = p*r21*u2 + (m0*u2/p + v2/p)*r01 + (m1*u2 + w2)*r11
1056
+ t22 = p*r22*u2 + (m0*u2/p + v2/p)*r02 + (m1*u2 + w2)*r12
1057
+ return q, (t00, t01, t02, t10, t11, t12, t20, t21, t22)
1058
+ else:
1059
+ return _reduced_ternary_form_eisenstein_without_matrix(ZZ(b00/2), ZZ(b11/2), ZZ(b22/2), ZZ(b12), ZZ(b02), ZZ(b01))
1060
+
1061
+ if m01 % p:
1062
+
1063
+ m0 = (-m00/m01/2) % p**2
1064
+ m1 = (-m02/m01) % p
1065
+
1066
+ b00 = m0**2*m11/p**2 + 2*m0*m01/p**2 + m00/p**2
1067
+ b11 = m1**2*m11 + 2*m1*m12 + m22
1068
+ b22 = m11*p**2
1069
+ b01 = m0*m1*m11/p + m0*m12/p + m01*m1/p + m02/p
1070
+ b02 = m0*m11 + m01
1071
+ b12 = m1*m11*p + m12*p
1072
+
1073
+ if mat:
1074
+ q, Mr = _reduced_ternary_form_eisenstein_with_matrix(ZZ(b00/2), ZZ(b11/2), ZZ(b22/2), ZZ(b12), ZZ(b02), ZZ(b01))
1075
+ r00, r01, r02, r10, r11, r12, r20, r21, r22 = Mr.list()
1076
+ t00 = p*r20*w0 + (m0*w0/p + v0/p)*r00 + (m1*w0 + u0)*r10
1077
+ t01 = p*r21*w0 + (m0*w0/p + v0/p)*r01 + (m1*w0 + u0)*r11
1078
+ t02 = p*r22*w0 + (m0*w0/p + v0/p)*r02 + (m1*w0 + u0)*r12
1079
+ t10 = p*r20*w1 + (m0*w1/p + v1/p)*r00 + (m1*w1 + u1)*r10
1080
+ t11 = p*r21*w1 + (m0*w1/p + v1/p)*r01 + (m1*w1 + u1)*r11
1081
+ t12 = p*r22*w1 + (m0*w1/p + v1/p)*r02 + (m1*w1 + u1)*r12
1082
+ t20 = p*r20*w2 + (m0*w2/p + v2/p)*r00 + (m1*w2 + u2)*r10
1083
+ t21 = p*r21*w2 + (m0*w2/p + v2/p)*r01 + (m1*w2 + u2)*r11
1084
+ t22 = p*r22*w2 + (m0*w2/p + v2/p)*r02 + (m1*w2 + u2)*r12
1085
+ return q, (t00, t01, t02, t10, t11, t12, t20, t21, t22)
1086
+ else:
1087
+ return _reduced_ternary_form_eisenstein_without_matrix(ZZ(b00/2), ZZ(b11/2), ZZ(b22/2), ZZ(b12), ZZ(b02), ZZ(b01))
1088
+
1089
+
1090
+ def _basic_lemma_vec(a, b, c, r, s, t, n):
1091
+ """
1092
+ Find a vector v such that the ternary quadratic form given by (a, b, c, r, s, t) evaluated at v is
1093
+ coprime with n a prime or 1.
1094
+
1095
+ EXAMPLES::
1096
+
1097
+ sage: from sage.quadratic_forms.ternary import _basic_lemma_vec
1098
+ sage: Q = TernaryQF([5, 2, 3, -1, 0, 0])
1099
+ sage: v = _basic_lemma_vec(5, 2, 3, -1, 0, 0, 5)
1100
+ sage: v
1101
+ (0, 1, 0)
1102
+ sage: Q(v)
1103
+ 2
1104
+ """
1105
+ if n == 1:
1106
+ return 0, 0, 0
1107
+
1108
+ if a % n:
1109
+ return 1, 0, 0
1110
+ elif b % n:
1111
+ return 0, 1, 0
1112
+ elif c % n:
1113
+ return 0, 0, 1
1114
+
1115
+ if r % n:
1116
+ return 0, 1, 1
1117
+ elif s % n:
1118
+ return 1, 0, 1
1119
+ elif t % n:
1120
+ return 1, 1, 0
1121
+
1122
+ raise ValueError("not primitive form")
1123
+
1124
+
1125
+ def _basic_lemma(a, b, c, r, s, t, n):
1126
+ """
1127
+ Find a number represented by the ternary quadratic form given by the coefficients (a, b, c, r, s, t)
1128
+ and coprime to the prime n.
1129
+
1130
+ EXAMPLES::
1131
+
1132
+ sage: from sage.quadratic_forms.ternary import _basic_lemma
1133
+ sage: Q = TernaryQF([5, 2, 3, -1, 0, 0])
1134
+ sage: _basic_lemma(5, 2, 3, -1, 0, 0, 5)
1135
+ 2
1136
+ """
1137
+ if n == 1:
1138
+ return 0
1139
+
1140
+ if a % n:
1141
+ return a
1142
+ elif b % n:
1143
+ return b
1144
+ elif c % n:
1145
+ return c
1146
+
1147
+ if r % n:
1148
+ return b + c + r
1149
+ elif s % n:
1150
+ return a + c + s
1151
+ elif t % n:
1152
+ return a + b + t
1153
+
1154
+ raise ValueError("not primitive form")