passagemath-modules 10.6.31rc3__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.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
  3. passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
  4. passagemath_modules-10.6.31rc3.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-82690d50.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,1745 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ Toric lattices
4
+
5
+ This module was designed as a part of the framework for toric varieties
6
+ (:mod:`~sage.schemes.toric.variety`,
7
+ :mod:`~sage.schemes.toric.fano_variety`).
8
+
9
+ All toric lattices are isomorphic to `\ZZ^n` for some `n`, but will prevent
10
+ you from doing "wrong" operations with objects from different lattices.
11
+
12
+ AUTHORS:
13
+
14
+ - Andrey Novoseltsev (2010-05-27): initial version.
15
+ - Andrey Novoseltsev (2010-07-30): sublattices and quotients.
16
+
17
+ EXAMPLES:
18
+
19
+ The simplest way to create a toric lattice is to specify its dimension only::
20
+
21
+ sage: N = ToricLattice(3)
22
+ sage: N
23
+ 3-d lattice N
24
+
25
+ While our lattice ``N`` is called exactly "N" it is a coincidence: all
26
+ lattices are called "N" by default::
27
+
28
+ sage: another_name = ToricLattice(3)
29
+ sage: another_name
30
+ 3-d lattice N
31
+
32
+ If fact, the above lattice is exactly the same as before as an object in
33
+ memory::
34
+
35
+ sage: N is another_name
36
+ True
37
+
38
+ There are actually four names associated to a toric lattice and they all must
39
+ be the same for two lattices to coincide::
40
+
41
+ sage: N, N.dual(), latex(N), latex(N.dual())
42
+ (3-d lattice N, 3-d lattice M, N, M)
43
+
44
+ Notice that the lattice dual to ``N`` is called "M" which is standard in toric
45
+ geometry. This happens only if you allow completely automatic handling of
46
+ names::
47
+
48
+ sage: another_N = ToricLattice(3, "N")
49
+ sage: another_N.dual()
50
+ 3-d lattice N*
51
+ sage: N is another_N
52
+ False
53
+
54
+ What can you do with toric lattices? Well, their main purpose is to allow
55
+ creation of elements of toric lattices::
56
+
57
+ sage: n = N([1,2,3])
58
+ sage: n
59
+ N(1, 2, 3)
60
+ sage: M = N.dual()
61
+ sage: m = M(1,2,3)
62
+ sage: m
63
+ M(1, 2, 3)
64
+
65
+ Dual lattices can act on each other::
66
+
67
+ sage: n * m
68
+ 14
69
+ sage: m * n
70
+ 14
71
+
72
+ You can also add elements of the same lattice or scale them::
73
+
74
+ sage: 2 * n
75
+ N(2, 4, 6)
76
+ sage: n * 2
77
+ N(2, 4, 6)
78
+ sage: n + n
79
+ N(2, 4, 6)
80
+
81
+ However, you cannot "mix wrong lattices" in your expressions::
82
+
83
+ sage: n + m
84
+ Traceback (most recent call last):
85
+ ...
86
+ TypeError: unsupported operand parent(s) for +:
87
+ '3-d lattice N' and '3-d lattice M'
88
+ sage: n * n
89
+ Traceback (most recent call last):
90
+ ...
91
+ TypeError: elements of the same toric lattice cannot be multiplied!
92
+ sage: n == m
93
+ False
94
+
95
+ Note that ``n`` and ``m`` are not equal to each other even though they are
96
+ both "just (1,2,3)." Moreover, you cannot easily convert elements between
97
+ toric lattices::
98
+
99
+ sage: M(n)
100
+ Traceback (most recent call last):
101
+ ...
102
+ TypeError: N(1, 2, 3) cannot be converted to 3-d lattice M!
103
+
104
+ If you really need to consider elements of one lattice as elements of another,
105
+ you can either use intermediate conversion to "just a vector"::
106
+
107
+ sage: ZZ3 = ZZ^3
108
+ sage: n_in_M = M(ZZ3(n))
109
+ sage: n_in_M
110
+ M(1, 2, 3)
111
+ sage: n == n_in_M
112
+ False
113
+ sage: n_in_M == m
114
+ True
115
+
116
+ Or you can create a homomorphism from one lattice to any other::
117
+
118
+ sage: h = N.hom(identity_matrix(3), M)
119
+ sage: h(n)
120
+ M(1, 2, 3)
121
+
122
+ .. WARNING::
123
+
124
+ While integer vectors (elements of `\ZZ^n`) are printed as ``(1,2,3)``,
125
+ in the code ``(1,2,3)`` is a :class:`tuple`, which has nothing to do
126
+ neither with vectors, nor with toric lattices, so the following is
127
+ probably not what you want while working with toric geometry objects::
128
+
129
+ sage: (1,2,3) + (1,2,3)
130
+ (1, 2, 3, 1, 2, 3)
131
+
132
+ Instead, use syntax like ::
133
+
134
+ sage: N(1,2,3) + N(1,2,3)
135
+ N(2, 4, 6)
136
+ """
137
+ # Parts of the "tutorial" above are also in toric_lattice_element.pyx.
138
+
139
+
140
+ # ****************************************************************************
141
+ # Copyright (C) 2010 Andrey Novoseltsev <novoselt@gmail.com>
142
+ # Copyright (C) 2010 William Stein <wstein@gmail.com>
143
+ #
144
+ # Distributed under the terms of the GNU General Public License (GPL)
145
+ #
146
+ # https://www.gnu.org/licenses/
147
+ # ****************************************************************************
148
+
149
+ from sage.geometry.toric_lattice_element import ToricLatticeElement
150
+ from sage.misc.lazy_import import lazy_import
151
+ lazy_import('sage.geometry.toric_plotter', 'ToricPlotter')
152
+ from sage.misc.latex import latex
153
+ from sage.structure.all import parent
154
+ from sage.structure.richcmp import (richcmp_method, richcmp, rich_to_bool,
155
+ richcmp_not_equal)
156
+ from sage.modules.fg_pid.fgp_element import FGP_Element
157
+ from sage.modules.fg_pid.fgp_module import FGP_Module_class
158
+ from sage.modules.free_module import (FreeModule_ambient_pid,
159
+ FreeModule_generic_pid,
160
+ FreeModule_submodule_pid,
161
+ FreeModule_submodule_with_basis_pid)
162
+ from sage.rings.integer_ring import ZZ
163
+ from sage.rings.rational_field import QQ
164
+ from sage.structure.factory import UniqueFactory
165
+
166
+
167
+ def is_ToricLattice(x):
168
+ r"""
169
+ Check if ``x`` is a toric lattice.
170
+
171
+ INPUT:
172
+
173
+ - ``x`` -- anything
174
+
175
+ OUTPUT: ``True`` if ``x`` is a toric lattice and ``False`` otherwise
176
+
177
+ EXAMPLES::
178
+
179
+ sage: from sage.geometry.toric_lattice import (
180
+ ....: is_ToricLattice)
181
+ sage: is_ToricLattice(1)
182
+ doctest:warning...
183
+ DeprecationWarning: The function is_ToricLattice is deprecated;
184
+ use 'isinstance(..., ToricLattice_generic)' instead.
185
+ See https://github.com/sagemath/sage/issues/38126 for details.
186
+ False
187
+ sage: N = ToricLattice(3)
188
+ sage: N
189
+ 3-d lattice N
190
+ sage: is_ToricLattice(N)
191
+ True
192
+ """
193
+ from sage.misc.superseded import deprecation
194
+ deprecation(38126,
195
+ "The function is_ToricLattice is deprecated; "
196
+ "use 'isinstance(..., ToricLattice_generic)' instead.")
197
+ return isinstance(x, ToricLattice_generic)
198
+
199
+
200
+ def is_ToricLatticeQuotient(x):
201
+ r"""
202
+ Check if ``x`` is a toric lattice quotient.
203
+
204
+ INPUT:
205
+
206
+ - ``x`` -- anything
207
+
208
+ OUTPUT: ``True`` if ``x`` is a toric lattice quotient and ``False`` otherwise
209
+
210
+ EXAMPLES::
211
+
212
+ sage: from sage.geometry.toric_lattice import (
213
+ ....: is_ToricLatticeQuotient)
214
+ sage: is_ToricLatticeQuotient(1)
215
+ doctest:warning...
216
+ DeprecationWarning: The function is_ToricLatticeQuotient is deprecated;
217
+ use 'isinstance(..., ToricLattice_quotient)' instead.
218
+ See https://github.com/sagemath/sage/issues/38126 for details.
219
+ False
220
+ sage: N = ToricLattice(3)
221
+ sage: N
222
+ 3-d lattice N
223
+ sage: is_ToricLatticeQuotient(N)
224
+ False
225
+ sage: Q = N / N.submodule([(1,2,3), (3,2,1)])
226
+ sage: Q # needs sage.libs.pari
227
+ Quotient with torsion of 3-d lattice N
228
+ by Sublattice <N(1, 2, 3), N(0, 4, 8)>
229
+ sage: is_ToricLatticeQuotient(Q)
230
+ True
231
+ """
232
+ from sage.misc.superseded import deprecation
233
+ deprecation(38126,
234
+ "The function is_ToricLatticeQuotient is deprecated; "
235
+ "use 'isinstance(..., ToricLattice_quotient)' instead.")
236
+ return isinstance(x, ToricLattice_quotient)
237
+
238
+
239
+ class ToricLatticeFactory(UniqueFactory):
240
+ r"""
241
+ Create a lattice for toric geometry objects.
242
+
243
+ INPUT:
244
+
245
+ - ``rank`` -- nonnegative integer; the only mandatory parameter
246
+
247
+ - ``name`` -- string
248
+
249
+ - ``dual_name`` -- string
250
+
251
+ - ``latex_name`` -- string
252
+
253
+ - ``latex_dual_name`` -- string
254
+
255
+ OUTPUT: lattice
256
+
257
+ A toric lattice is uniquely determined by its rank and associated names.
258
+ There are four such "associated names" whose meaning should be clear from
259
+ the names of the corresponding parameters, but the choice of default
260
+ values is a little bit involved. So here is the full description of the
261
+ "naming algorithm":
262
+
263
+ #. If no names were given at all, then this lattice will be called "N" and
264
+ the dual one "M". These are the standard choices in toric geometry.
265
+
266
+ #. If ``name`` was given and ``dual_name`` was not, then ``dual_name``
267
+ will be ``name`` followed by "*".
268
+
269
+ #. If LaTeX names were not given, they will coincide with the "usual"
270
+ names, but if ``dual_name`` was constructed automatically, the trailing
271
+ star will be typeset as a superscript.
272
+
273
+ EXAMPLES:
274
+
275
+ Let's start with no names at all and see how automatic names are given::
276
+
277
+ sage: L1 = ToricLattice(3)
278
+ sage: L1
279
+ 3-d lattice N
280
+ sage: L1.dual()
281
+ 3-d lattice M
282
+
283
+ If we give the name "N" explicitly, the dual lattice will be called "N*"::
284
+
285
+ sage: L2 = ToricLattice(3, "N")
286
+ sage: L2
287
+ 3-d lattice N
288
+ sage: L2.dual()
289
+ 3-d lattice N*
290
+
291
+ However, we can give an explicit name for it too::
292
+
293
+ sage: L3 = ToricLattice(3, "N", "M")
294
+ sage: L3
295
+ 3-d lattice N
296
+ sage: L3.dual()
297
+ 3-d lattice M
298
+
299
+ If you want, you may also give explicit LaTeX names::
300
+
301
+ sage: L4 = ToricLattice(3, "N", "M", r"\mathbb{N}", r"\mathbb{M}")
302
+ sage: latex(L4)
303
+ \mathbb{N}
304
+ sage: latex(L4.dual())
305
+ \mathbb{M}
306
+
307
+ While all four lattices above are called "N", only two of them are equal
308
+ (and are actually the same)::
309
+
310
+ sage: L1 == L2
311
+ False
312
+ sage: L1 == L3
313
+ True
314
+ sage: L1 is L3
315
+ True
316
+ sage: L1 == L4
317
+ False
318
+
319
+ The reason for this is that ``L2`` and ``L4`` have different names either
320
+ for dual lattices or for LaTeX typesetting.
321
+ """
322
+
323
+ def create_key(self, rank, name=None, dual_name=None,
324
+ latex_name=None, latex_dual_name=None):
325
+ """
326
+ Create a key that uniquely identifies this toric lattice.
327
+
328
+ See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
329
+
330
+ .. WARNING::
331
+
332
+ You probably should not use this function directly.
333
+
334
+ TESTS::
335
+
336
+ sage: ToricLattice.create_key(3)
337
+ (3, 'N', 'M', 'N', 'M')
338
+ sage: N = ToricLattice(3)
339
+ sage: loads(dumps(N)) is N
340
+ True
341
+ sage: TestSuite(N).run()
342
+ """
343
+ rank = int(rank)
344
+ # Should we use standard M and N lattices?
345
+ if name is None:
346
+ if dual_name is not None:
347
+ raise ValueError("you can name the dual lattice only if you "
348
+ "also name the original one!")
349
+ name = "N"
350
+ dual_name = "M"
351
+ if latex_name is None:
352
+ latex_name = name
353
+ # Now name and latex_name are set
354
+ # The default for latex_dual_name depends on whether dual_name was
355
+ # given or constructed, so we determine it before dual_name
356
+ if latex_dual_name is None:
357
+ latex_dual_name = (dual_name if dual_name is not None
358
+ else latex_name + "^*")
359
+ if dual_name is None:
360
+ dual_name = name + "*"
361
+ return (rank, name, dual_name, latex_name, latex_dual_name)
362
+
363
+ def create_object(self, version, key):
364
+ r"""
365
+ Create the toric lattice described by ``key``.
366
+
367
+ See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
368
+
369
+ .. WARNING::
370
+
371
+ You probably should not use this function directly.
372
+
373
+ TESTS::
374
+
375
+ sage: key = ToricLattice.create_key(3)
376
+ sage: ToricLattice.create_object(1, key)
377
+ 3-d lattice N
378
+ """
379
+ return ToricLattice_ambient(*key)
380
+
381
+
382
+ ToricLattice = ToricLatticeFactory("ToricLattice")
383
+
384
+
385
+ # Possible TODO's:
386
+ # - implement a better construction() method, which still will prohibit
387
+ # operations mixing lattices by conversion to ZZ^n
388
+ # - maybe __call__ is not the right place to prohibit conversion between
389
+ # lattices (we need it now so that morphisms behave nicely)
390
+ class ToricLattice_generic(FreeModule_generic_pid):
391
+ r"""
392
+ Abstract base class for toric lattices.
393
+ """
394
+
395
+ Element = ToricLatticeElement
396
+
397
+ # It is not recommended to override __call__ in Parent-derived objects
398
+ # since it may interfere with the coercion model. We do it here to allow
399
+ # N(1,2,3) to be interpreted as N([1,2,3]). We also prohibit N(m) where
400
+ # m is an element of another lattice. Otherwise morphisms will care only
401
+ # about dimension of lattices.
402
+ def __call__(self, *args, **kwds):
403
+ r"""
404
+ Construct a new element of ``self``.
405
+
406
+ INPUT:
407
+
408
+ - anything that can be interpreted as coordinates, except for elements
409
+ of other lattices.
410
+
411
+ OUTPUT: :class:`~sage.geometry.toric_lattice_element.ToricLatticeElement`
412
+
413
+ TESTS::
414
+
415
+ sage: N = ToricLattice(3)
416
+ sage: N.__call__([1,2,3])
417
+ N(1, 2, 3)
418
+ sage: N([1,2,3]) # indirect test
419
+ N(1, 2, 3)
420
+
421
+ The point of overriding this function was to allow writing the above
422
+ command as::
423
+
424
+ sage: N(1,2,3)
425
+ N(1, 2, 3)
426
+
427
+ We also test that the special treatment of zero still works::
428
+
429
+ sage: N(0)
430
+ N(0, 0, 0)
431
+
432
+ Quotients of toric lattices can be converted to a new toric
433
+ lattice of the appropriate dimension::
434
+
435
+ sage: N3 = ToricLattice(3, 'N3')
436
+ sage: Q = N3 / N3.span([ N3(1,2,3) ])
437
+ sage: Q.an_element() # needs sage.libs.pari
438
+ N3[1, 0, 0]
439
+ sage: N2 = ToricLattice(2, 'N2')
440
+ sage: N2( Q.an_element() ) # needs sage.libs.pari
441
+ N2(1, 0)
442
+ """
443
+ supercall = super().__call__
444
+ if args == (0, ):
445
+ # Special treatment for N(0) to return (0,...,0)
446
+ return supercall(*args, **kwds)
447
+
448
+ if (isinstance(args[0], ToricLattice_quotient_element)
449
+ and args[0].parent().is_torsion_free()):
450
+ # convert a torsion free quotient lattice
451
+ return supercall(list(args[0]), **kwds)
452
+
453
+ try:
454
+ coordinates = [ZZ(_) for _ in args]
455
+ except TypeError:
456
+ # Prohibit conversion of elements of other lattices
457
+ if (isinstance(args[0], ToricLatticeElement)
458
+ and args[0].parent().ambient_module()
459
+ is not self.ambient_module()):
460
+ raise TypeError("%s cannot be converted to %s!"
461
+ % (args[0], self))
462
+ # "Standard call"
463
+ return supercall(*args, **kwds)
464
+ # Coordinates were given without packing them into a list or a tuple
465
+ return supercall(coordinates, **kwds)
466
+
467
+ def _coerce_map_from_(self, other):
468
+ """
469
+ Return a coercion map from ``other`` to ``self``, or None.
470
+
471
+ This prevents the construction of coercion maps between
472
+ lattices with different ambient modules, so :meth:`__call__`
473
+ is invoked instead, which prohibits conversion::
474
+
475
+ sage: N = ToricLattice(3)
476
+ sage: M = N.dual()
477
+ sage: M(N(1,2,3))
478
+ Traceback (most recent call last):
479
+ ...
480
+ TypeError: N(1, 2, 3) cannot be converted to 3-d lattice M!
481
+ """
482
+ if (isinstance(other, ToricLattice_generic) and
483
+ other.ambient_module() is not self.ambient_module()):
484
+ return None
485
+ return super()._convert_map_from_(other)
486
+
487
+ def __contains__(self, point):
488
+ r"""
489
+ Check if ``point`` is an element of ``self``.
490
+
491
+ INPUT:
492
+
493
+ - ``point`` -- anything
494
+
495
+ OUTPUT: ``True`` if ``point`` is an element of ``self``, ``False``
496
+ otherwise
497
+
498
+ TESTS::
499
+
500
+ sage: N = ToricLattice(3)
501
+ sage: M = N.dual()
502
+ sage: L = ToricLattice(3, "L")
503
+ sage: 1 in N
504
+ False
505
+ sage: (1,0) in N
506
+ False
507
+ sage: (1,0,0) in N
508
+ True
509
+ sage: N(1,0,0) in N
510
+ True
511
+ sage: M(1,0,0) in N
512
+ False
513
+ sage: L(1,0,0) in N
514
+ False
515
+ sage: (1/2,0,0) in N
516
+ False
517
+ sage: (2/2,0,0) in N
518
+ True
519
+ """
520
+ try:
521
+ self(point)
522
+ except TypeError:
523
+ return False
524
+ return True
525
+
526
+ # We need to override this function, otherwise e.g. the sum of elements of
527
+ # different lattices of the same dimension will live in ZZ^n.
528
+ def construction(self):
529
+ r"""
530
+ Return the functorial construction of ``self``.
531
+
532
+ OUTPUT:
533
+
534
+ ``None``, we do not think of toric lattices as constructed from
535
+ simpler objects since we do not want to perform arithmetic involving
536
+ different lattices.
537
+
538
+ TESTS::
539
+
540
+ sage: print(ToricLattice(3).construction())
541
+ None
542
+ """
543
+ return None
544
+
545
+ def direct_sum(self, other):
546
+ r"""
547
+ Return the direct sum with ``other``.
548
+
549
+ INPUT:
550
+
551
+ - ``other`` -- a toric lattice or more general module
552
+
553
+ OUTPUT:
554
+
555
+ The direct sum of ``self`` and ``other`` as `\ZZ`-modules. If
556
+ ``other`` is a :class:`ToricLattice <ToricLatticeFactory>`,
557
+ another toric lattice will be returned.
558
+
559
+ EXAMPLES::
560
+
561
+ sage: K = ToricLattice(3, 'K')
562
+ sage: L = ToricLattice(3, 'L')
563
+ sage: N = K.direct_sum(L); N
564
+ 6-d lattice K+L
565
+ sage: N, N.dual(), latex(N), latex(N.dual())
566
+ (6-d lattice K+L, 6-d lattice K*+L*, K \oplus L, K^* \oplus L^*)
567
+
568
+ With default names::
569
+
570
+ sage: N = ToricLattice(3).direct_sum(ToricLattice(2))
571
+ sage: N, N.dual(), latex(N), latex(N.dual())
572
+ (5-d lattice N+N, 5-d lattice M+M, N \oplus N, M \oplus M)
573
+
574
+ If ``other`` is not a :class:`ToricLattice
575
+ <ToricLatticeFactory>`, fall back to sum of modules::
576
+
577
+ sage: ToricLattice(3).direct_sum(ZZ^2)
578
+ Free module of degree 5 and rank 5 over Integer Ring
579
+ Echelon basis matrix:
580
+ [1 0 0 0 0]
581
+ [0 1 0 0 0]
582
+ [0 0 1 0 0]
583
+ [0 0 0 1 0]
584
+ [0 0 0 0 1]
585
+ """
586
+ if not isinstance(other, ToricLattice_generic):
587
+ return super().direct_sum(other)
588
+
589
+ def make_name(N1, N2, use_latex=False):
590
+ if use_latex:
591
+ return latex(N1) + r' \oplus ' + latex(N2)
592
+ else:
593
+ return N1._name + '+' + N2._name
594
+
595
+ rank = self.rank() + other.rank()
596
+ name = make_name(self, other, False)
597
+ dual_name = make_name(self.dual(), other.dual(), False)
598
+ latex_name = make_name(self, other, True)
599
+ latex_dual_name = make_name(self.dual(), other.dual(), True)
600
+ return ToricLattice(rank, name, dual_name, latex_name, latex_dual_name)
601
+
602
+ def intersection(self, other):
603
+ r"""
604
+ Return the intersection of ``self`` and ``other``.
605
+
606
+ INPUT:
607
+
608
+ - ``other`` -- a toric (sub)lattice.dual
609
+
610
+ OUTPUT:
611
+
612
+ - a toric (sub)lattice.
613
+
614
+ EXAMPLES::
615
+
616
+ sage: N = ToricLattice(3)
617
+ sage: Ns1 = N.submodule([N(2,4,0), N(9,12,0)])
618
+ sage: Ns2 = N.submodule([N(1,4,9), N(9,2,0)])
619
+ sage: Ns1.intersection(Ns2)
620
+ Sublattice <N(54, 12, 0)>
621
+
622
+ Note that if one of the intersecting sublattices is a sublattice of
623
+ another, no new lattices will be constructed::
624
+
625
+ sage: N.intersection(N) is N
626
+ True
627
+ sage: Ns1.intersection(N) is Ns1
628
+ True
629
+ sage: N.intersection(Ns1) is Ns1
630
+ True
631
+ """
632
+ # Lattice-specific input check
633
+ if not isinstance(other, ToricLattice_generic):
634
+ raise TypeError("%s is not a toric lattice!" % other)
635
+ if self.ambient_module() != other.ambient_module():
636
+ raise ValueError("%s and %s have different ambient lattices!" %
637
+ (self, other))
638
+ # Construct a generic intersection, but make sure to return a lattice.
639
+ I = super().intersection(other)
640
+ if not isinstance(I, ToricLattice_generic):
641
+ I = self.ambient_module().submodule(I.basis())
642
+ return I
643
+
644
+ def quotient(self, sub, check=True,
645
+ positive_point=None, positive_dual_point=None, **kwds):
646
+ """
647
+ Return the quotient of ``self`` by the given sublattice ``sub``.
648
+
649
+ INPUT:
650
+
651
+ - ``sub`` -- sublattice of self
652
+
653
+ - ``check`` -- boolean (default: ``True``); whether or not to check that ``sub`` is
654
+ a valid sublattice
655
+
656
+ If the quotient is one-dimensional and torsion free, the
657
+ following two mutually exclusive keyword arguments are also
658
+ allowed. They decide the sign choice for the (single)
659
+ generator of the quotient lattice:
660
+
661
+ - ``positive_point`` -- a lattice point of ``self`` not in the
662
+ sublattice ``sub`` (that is, not zero in the quotient
663
+ lattice). The quotient generator will be in the same
664
+ direction as ``positive_point``.
665
+
666
+ - ``positive_dual_point`` -- a dual lattice point. The
667
+ quotient generator will be chosen such that its lift has a
668
+ positive product with ``positive_dual_point``. Note: if
669
+ ``positive_dual_point`` is not zero on the sublattice
670
+ ``sub``, then the notion of positivity will depend on the
671
+ choice of lift!
672
+
673
+ Further named arguments are passed to the constructor of a toric lattice
674
+ quotient.
675
+
676
+ EXAMPLES::
677
+
678
+ sage: N = ToricLattice(3)
679
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
680
+ sage: Q = N/Ns
681
+ sage: Q # needs sage.libs.pari
682
+ Quotient with torsion of 3-d lattice N
683
+ by Sublattice <N(1, 8, 0), N(0, 12, 0)>
684
+
685
+ Attempting to quotient one lattice by a sublattice of another
686
+ will result in a :exc:`ValueError`::
687
+
688
+ sage: N = ToricLattice(3)
689
+ sage: M = ToricLattice(3, name='M')
690
+ sage: Ms = M.submodule([M(2,4,0), M(9,12,0)])
691
+ sage: N.quotient(Ms)
692
+ Traceback (most recent call last):
693
+ ...
694
+ ValueError: M(1, 8, 0) cannot generate a sublattice of
695
+ 3-d lattice N
696
+
697
+ However, if we forget the sublattice structure, then it is
698
+ possible to quotient by vector spaces or modules constructed
699
+ from any sublattice::
700
+
701
+ sage: N = ToricLattice(3)
702
+ sage: M = ToricLattice(3, name='M')
703
+ sage: Ms = M.submodule([M(2,4,0), M(9,12,0)])
704
+ sage: N.quotient(Ms.vector_space()) # needs sage.libs.pari
705
+ Quotient with torsion of 3-d lattice N by Sublattice
706
+ <N(1, 8, 0), N(0, 12, 0)>
707
+ sage: N.quotient(Ms.sparse_module()) # needs sage.libs.pari
708
+ Quotient with torsion of 3-d lattice N by Sublattice
709
+ <N(1, 8, 0), N(0, 12, 0)>
710
+
711
+ See :class:`ToricLattice_quotient` for more examples.
712
+
713
+ TESTS:
714
+
715
+ We check that :issue:`19603` is fixed::
716
+
717
+ sage: # needs sage.geometry.polyhedron
718
+ sage: K = Cone([(1,0,0),(0,1,0)])
719
+ sage: K.lattice()
720
+ 3-d lattice N
721
+ sage: K.orthogonal_sublattice()
722
+ Sublattice <M(0, 0, 1)>
723
+ sage: K.lattice().quotient(K.orthogonal_sublattice())
724
+ Traceback (most recent call last):
725
+ ...
726
+ ValueError: M(0, 0, 1) cannot generate a sublattice of
727
+ 3-d lattice N
728
+
729
+ We can quotient by the trivial sublattice::
730
+
731
+ sage: N = ToricLattice(3)
732
+ sage: N.quotient(N.zero_submodule()) # needs sage.libs.pari
733
+ 3-d lattice, quotient of 3-d lattice N by Sublattice <>
734
+
735
+ We can quotient a lattice by itself::
736
+
737
+ sage: N = ToricLattice(3)
738
+ sage: N.quotient(N) # needs sage.libs.pari
739
+ 0-d lattice, quotient of 3-d lattice N by Sublattice
740
+ <N(1, 0, 0), N(0, 1, 0), N(0, 0, 1)>
741
+ """
742
+ return ToricLattice_quotient(self, sub, check,
743
+ positive_point, positive_dual_point, **kwds)
744
+
745
+ def saturation(self):
746
+ r"""
747
+ Return the saturation of ``self``.
748
+
749
+ OUTPUT: a :class:`toric lattice <ToricLatticeFactory>`
750
+
751
+ EXAMPLES::
752
+
753
+ sage: N = ToricLattice(3)
754
+ sage: Ns = N.submodule([(1,2,3), (4,5,6)])
755
+ sage: Ns
756
+ Sublattice <N(1, 2, 3), N(0, 3, 6)>
757
+ sage: Ns_sat = Ns.saturation()
758
+ sage: Ns_sat
759
+ Sublattice <N(1, 0, -1), N(0, 1, 2)>
760
+ sage: Ns_sat is Ns_sat.saturation()
761
+ True
762
+ """
763
+ S = super().saturation()
764
+ return S if isinstance(S, ToricLattice_generic) else self.ambient_module().submodule(S)
765
+
766
+ def span(self, gens, base_ring=ZZ, *args, **kwds):
767
+ r"""
768
+ Return the span of the given generators.
769
+
770
+ INPUT:
771
+
772
+ - ``gens`` -- list of elements of the ambient vector space of
773
+ ``self``
774
+
775
+ - ``base_ring`` -- (default: `\ZZ`) base ring for the generated module
776
+
777
+ OUTPUT: submodule spanned by ``gens``
778
+
779
+ .. NOTE::
780
+
781
+ The output need not be a submodule of ``self``, nor even of the
782
+ ambient space. It must, however, be contained in the ambient
783
+ vector space.
784
+
785
+ See also :meth:`span_of_basis`,
786
+ :meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule`,
787
+ and
788
+ :meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule_with_basis`,
789
+
790
+ EXAMPLES::
791
+
792
+ sage: N = ToricLattice(3)
793
+ sage: Ns = N.submodule([N.gen(0)])
794
+ sage: Ns.span([N.gen(1)])
795
+ Sublattice <N(0, 1, 0)>
796
+ sage: Ns.submodule([N.gen(1)])
797
+ Traceback (most recent call last):
798
+ ...
799
+ ArithmeticError: argument gens (= [N(0, 1, 0)]) does not generate a submodule of self
800
+ """
801
+ A = self.ambient_module()
802
+ if base_ring is ZZ and all(g in A for g in gens):
803
+ return ToricLattice_sublattice(A, gens)
804
+ for g in gens:
805
+ if isinstance(g, ToricLatticeElement) and g not in A:
806
+ raise ValueError("%s cannot generate a sublattice of %s"
807
+ % (g, A))
808
+ return super().span(gens, base_ring, *args, **kwds)
809
+
810
+ def span_of_basis(self, basis, base_ring=ZZ, *args, **kwds):
811
+ r"""
812
+ Return the submodule with the given ``basis``.
813
+
814
+ INPUT:
815
+
816
+ - ``basis`` -- list of elements of the ambient vector space of
817
+ ``self``
818
+
819
+ - ``base_ring`` -- (default: `\ZZ`) base ring for the generated module
820
+
821
+ OUTPUT: submodule spanned by ``basis``
822
+
823
+ .. NOTE::
824
+
825
+ The output need not be a submodule of ``self``, nor even of the
826
+ ambient space. It must, however, be contained in the ambient
827
+ vector space.
828
+
829
+ See also :meth:`span`,
830
+ :meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule`,
831
+ and
832
+ :meth:`~sage.modules.free_module.FreeModule_generic_pid.submodule_with_basis`,
833
+
834
+ EXAMPLES::
835
+
836
+ sage: N = ToricLattice(3)
837
+ sage: Ns = N.span_of_basis([(1,2,3)])
838
+ sage: Ns.span_of_basis([(2,4,0)])
839
+ Sublattice <N(2, 4, 0)>
840
+ sage: Ns.span_of_basis([(1/5,2/5,0), (1/7,1/7,0)])
841
+ Free module of degree 3 and rank 2 over Integer Ring
842
+ User basis matrix:
843
+ [1/5 2/5 0]
844
+ [1/7 1/7 0]
845
+
846
+ Of course the input basis vectors must be linearly independent::
847
+
848
+ sage: Ns.span_of_basis([(1,2,0), (2,4,0)])
849
+ Traceback (most recent call last):
850
+ ...
851
+ ValueError: The given basis vectors must be linearly independent.
852
+ """
853
+ A = self.ambient_module()
854
+ if base_ring is ZZ and all(g in A for g in basis):
855
+ return ToricLattice_sublattice_with_basis(A, basis)
856
+ for g in basis:
857
+ if isinstance(g, ToricLatticeElement) and g not in A:
858
+ raise ValueError("%s cannot generate a sublattice of %s"
859
+ % (g, A))
860
+ return super().span_of_basis(basis, base_ring, *args, **kwds)
861
+
862
+
863
+ @richcmp_method
864
+ class ToricLattice_ambient(ToricLattice_generic, FreeModule_ambient_pid):
865
+ r"""
866
+ Create a toric lattice.
867
+
868
+ See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
869
+
870
+ .. WARNING::
871
+
872
+ There should be only one toric lattice with the given rank and
873
+ associated names. Using this class directly to create toric lattices
874
+ may lead to unexpected results. Please, use :class:`ToricLattice
875
+ <ToricLatticeFactory>` to create toric lattices.
876
+
877
+ TESTS::
878
+
879
+ sage: N = ToricLattice(3, "N", "M", "N", "M")
880
+ sage: N
881
+ 3-d lattice N
882
+ sage: TestSuite(N).run()
883
+ """
884
+
885
+ Element = ToricLatticeElement
886
+
887
+ def __init__(self, rank, name, dual_name, latex_name, latex_dual_name):
888
+ r"""
889
+ See :class:`ToricLattice <ToricLatticeFactory>` for documentation.
890
+
891
+ TESTS::
892
+
893
+ sage: ToricLattice(3, "N", "M", "N", "M")
894
+ 3-d lattice N
895
+ """
896
+ super().__init__(ZZ, rank)
897
+ self._name = name
898
+ self._dual_name = dual_name
899
+ self._latex_name = latex_name
900
+ self._latex_dual_name = latex_dual_name
901
+
902
+ def _sage_input_(self, sib, coerced):
903
+ r"""
904
+ Return Sage command to reconstruct ``self``.
905
+
906
+ See :mod:`sage.misc.sage_input` for details.
907
+
908
+ EXAMPLES::
909
+
910
+ sage: N = ToricLattice(3, "N", "M", "N", "M")
911
+ sage: sage_input(N, verify=True)
912
+ # Verified
913
+ ToricLattice(3, 'N', 'M')
914
+
915
+ sage: N = ToricLattice(3, "N")
916
+ sage: sage_input(N, verify=True)
917
+ # Verified
918
+ ToricLattice(3, 'N', 'N*', 'N', 'N^*')
919
+ """
920
+ args = [self.rank(), self._name, self._dual_name]
921
+ if self._latex_name != self._name or self._latex_dual_name != self._dual_name:
922
+ args.extend([self._latex_name, self._latex_dual_name])
923
+ return sib.name('ToricLattice')(*args)
924
+
925
+ def __richcmp__(self, right, op):
926
+ r"""
927
+ Compare ``self`` and ``right``.
928
+
929
+ INPUT:
930
+
931
+ - ``right`` -- anything
932
+
933
+ OUTPUT: boolean
934
+
935
+ There is equality if ``right`` is a toric lattice of the same
936
+ dimension as ``self`` and their associated names are the
937
+ same.
938
+
939
+ TESTS::
940
+
941
+ sage: N3 = ToricLattice(3)
942
+ sage: N4 = ToricLattice(4)
943
+ sage: M3 = N3.dual()
944
+ sage: N3 < N4
945
+ True
946
+ sage: N3 > M3
947
+ True
948
+ sage: N3 == ToricLattice(3)
949
+ True
950
+ """
951
+ if self is right:
952
+ return rich_to_bool(op, 0)
953
+ if type(self) is not type(right):
954
+ return NotImplemented
955
+
956
+ lx = self.rank()
957
+ rx = right.rank()
958
+ if lx != rx:
959
+ return richcmp_not_equal(lx, rx, op)
960
+ # If lattices are the same as ZZ-modules, compare associated names
961
+ return richcmp([self._name, self._dual_name,
962
+ self._latex_name, self._latex_dual_name],
963
+ [right._name, right._dual_name,
964
+ right._latex_name, right._latex_dual_name], op)
965
+
966
+ def _latex_(self):
967
+ r"""
968
+ Return a LaTeX representation of ``self``.
969
+
970
+ OUTPUT: string
971
+
972
+ TESTS::
973
+
974
+ sage: L = ToricLattice(3, "L")
975
+ sage: L.dual()._latex_()
976
+ 'L^*'
977
+ """
978
+ return self._latex_name
979
+
980
+ def _repr_(self):
981
+ r"""
982
+ Return a string representation of ``self``.
983
+
984
+ OUTPUT: string
985
+
986
+ TESTS::
987
+
988
+ sage: L = ToricLattice(3, "L")
989
+ sage: L.dual()._repr_()
990
+ '3-d lattice L*'
991
+ """
992
+ return "%d-d lattice %s" % (self.dimension(), self._name)
993
+
994
+ def ambient_module(self):
995
+ r"""
996
+ Return the ambient module of ``self``.
997
+
998
+ OUTPUT: :class:`toric lattice <ToricLatticeFactory>`
999
+
1000
+ .. NOTE::
1001
+
1002
+ For any ambient toric lattice its ambient module is the lattice
1003
+ itself.
1004
+
1005
+ EXAMPLES::
1006
+
1007
+ sage: N = ToricLattice(3)
1008
+ sage: N.ambient_module()
1009
+ 3-d lattice N
1010
+ sage: N.ambient_module() is N
1011
+ True
1012
+ """
1013
+ return self
1014
+
1015
+ def dual(self):
1016
+ r"""
1017
+ Return the lattice dual to ``self``.
1018
+
1019
+ OUTPUT: :class:`toric lattice <ToricLatticeFactory>`
1020
+
1021
+ EXAMPLES::
1022
+
1023
+ sage: N = ToricLattice(3)
1024
+ sage: N
1025
+ 3-d lattice N
1026
+ sage: M = N.dual()
1027
+ sage: M
1028
+ 3-d lattice M
1029
+ sage: M.dual() is N
1030
+ True
1031
+
1032
+ Elements of dual lattices can act on each other::
1033
+
1034
+ sage: n = N(1,2,3)
1035
+ sage: m = M(4,5,6)
1036
+ sage: n * m
1037
+ 32
1038
+ sage: m * n
1039
+ 32
1040
+ """
1041
+ if "_dual" not in self.__dict__:
1042
+ self._dual = ToricLattice(self.rank(), self._dual_name,
1043
+ self._name, self._latex_dual_name, self._latex_name)
1044
+ return self._dual
1045
+
1046
+ def plot(self, **options):
1047
+ r"""
1048
+ Plot ``self``.
1049
+
1050
+ INPUT:
1051
+
1052
+ - any options for toric plots (see :func:`toric_plotter.options
1053
+ <sage.geometry.toric_plotter.options>`), none are mandatory.
1054
+
1055
+ OUTPUT: a plot
1056
+
1057
+ EXAMPLES::
1058
+
1059
+ sage: N = ToricLattice(3)
1060
+ sage: N.plot() # needs sage.geometry.polyhedron sage.plot
1061
+ Graphics3d Object
1062
+ """
1063
+ if "show_lattice" not in options:
1064
+ # Unless user made an explicit decision, we assume that lattice
1065
+ # should be visible no matter what is the size of the bounding box.
1066
+ options["show_lattice"] = True
1067
+ tp = ToricPlotter(options, self.degree())
1068
+ tp.adjust_options()
1069
+ return tp.plot_lattice()
1070
+
1071
+
1072
+ class ToricLattice_sublattice_with_basis(ToricLattice_generic,
1073
+ FreeModule_submodule_with_basis_pid):
1074
+ r"""
1075
+ Construct the sublattice of ``ambient`` toric lattice with given ``basis``.
1076
+
1077
+ INPUT (same as for
1078
+ :class:`~sage.modules.free_module.FreeModule_submodule_with_basis_pid`):
1079
+
1080
+ - ``ambient`` -- ambient :class:`toric lattice <ToricLatticeFactory>` for
1081
+ this sublattice
1082
+
1083
+ - ``basis`` -- list of linearly independent elements of ``ambient``, these
1084
+ elements will be used as the default basis of the constructed
1085
+ sublattice
1086
+
1087
+ - see the base class for other available options
1088
+
1089
+ OUTPUT: sublattice of a toric lattice with a user-specified basis
1090
+
1091
+ See also :class:`ToricLattice_sublattice` if you do not want to specify an
1092
+ explicit basis.
1093
+
1094
+ EXAMPLES:
1095
+
1096
+ The intended way to get objects of this class is to use
1097
+ :meth:`submodule_with_basis` method of toric lattices::
1098
+
1099
+ sage: N = ToricLattice(3)
1100
+ sage: sublattice = N.submodule_with_basis([(1,1,0), (3,2,1)])
1101
+ sage: sublattice.has_user_basis()
1102
+ True
1103
+ sage: sublattice.basis()
1104
+ [N(1, 1, 0), N(3, 2, 1)]
1105
+
1106
+ Even if you have provided your own basis, you still can access the
1107
+ "standard" one::
1108
+
1109
+ sage: sublattice.echelonized_basis()
1110
+ [N(1, 0, 1), N(0, 1, -1)]
1111
+ """
1112
+
1113
+ def _repr_(self):
1114
+ r"""
1115
+ Return a string representation of ``self``.
1116
+
1117
+ OUTPUT: string
1118
+
1119
+ TESTS::
1120
+
1121
+ sage: L = ToricLattice(3, "L")
1122
+ sage: L.submodule_with_basis([(3,2,1),(1,2,3)])
1123
+ Sublattice <L(3, 2, 1), L(1, 2, 3)>
1124
+ sage: print(L.submodule([(3,2,1),(1,2,3)])._repr_())
1125
+ Sublattice <L(1, 2, 3), L(0, 4, 8)>
1126
+ """
1127
+ s = 'Sublattice '
1128
+ s += '<'
1129
+ s += ', '.join(map(str, self.basis()))
1130
+ s += '>'
1131
+ return s
1132
+
1133
+ def _latex_(self):
1134
+ r"""
1135
+ Return a LaTeX representation of ``self``.
1136
+
1137
+ OUTPUT: string
1138
+
1139
+ TESTS::
1140
+
1141
+ sage: L = ToricLattice(3, "L")
1142
+ sage: L.submodule_with_basis([(3,2,1),(1,2,3)])._latex_()
1143
+ '\\left\\langle\\left(3,\\,2,\\,1\\right)_{L},
1144
+ \\left(1,\\,2,\\,3\\right)_{L}\\right\\rangle'
1145
+ sage: L.submodule([(3,2,1),(1,2,3)])._latex_()
1146
+ '\\left\\langle\\left(1,\\,2,\\,3\\right)_{L},
1147
+ \\left(0,\\,4,\\,8\\right)_{L}\\right\\rangle'
1148
+ """
1149
+ s = '\\left\\langle'
1150
+ s += ', '.join(b._latex_() for b in self.basis())
1151
+ s += '\\right\\rangle'
1152
+ return s
1153
+
1154
+ def dual(self):
1155
+ r"""
1156
+ Return the lattice dual to ``self``.
1157
+
1158
+ OUTPUT: a :class:`toric lattice quotient <ToricLattice_quotient>`
1159
+
1160
+ EXAMPLES::
1161
+
1162
+ sage: N = ToricLattice(3)
1163
+ sage: Ns = N.submodule([(1,1,0), (3,2,1)])
1164
+ sage: Ns.dual() # needs sage.libs.pari
1165
+ 2-d lattice, quotient of 3-d lattice M by Sublattice <M(1, -1, -1)>
1166
+ """
1167
+ if "_dual" not in self.__dict__:
1168
+ if self is not self.saturation():
1169
+ raise ValueError("only dual lattices of saturated sublattices "
1170
+ "can be constructed! Got %s." % self)
1171
+ self._dual = (self.ambient_module().dual() /
1172
+ self.basis_matrix().transpose().integer_kernel())
1173
+ self._dual._dual = self
1174
+ return self._dual
1175
+
1176
+ def plot(self, **options):
1177
+ r"""
1178
+ Plot ``self``.
1179
+
1180
+ INPUT:
1181
+
1182
+ - any options for toric plots (see :func:`toric_plotter.options
1183
+ <sage.geometry.toric_plotter.options>`), none are mandatory.
1184
+
1185
+ OUTPUT: a plot
1186
+
1187
+ EXAMPLES::
1188
+
1189
+ sage: N = ToricLattice(3)
1190
+ sage: sublattice = N.submodule_with_basis([(1,1,0), (3,2,1)])
1191
+ sage: sublattice.plot() # needs sage.geometry.polyhedron sage.plot
1192
+ Graphics3d Object
1193
+
1194
+ Now we plot both the ambient lattice and its sublattice::
1195
+
1196
+ sage: N.plot() + sublattice.plot(point_color='red') # needs sage.geometry.polyhedron sage.plot
1197
+ Graphics3d Object
1198
+ """
1199
+ if "show_lattice" not in options:
1200
+ # Unless user made an explicit decision, we assume that lattice
1201
+ # should be visible no matter what is the size of the bounding box.
1202
+ options["show_lattice"] = True
1203
+ if "lattice_filter" in options:
1204
+ old = options["lattice_filter"]
1205
+ options["lattice_filter"] = lambda pt: pt in self and old(pt)
1206
+ else:
1207
+ options["lattice_filter"] = lambda pt: pt in self
1208
+ tp = ToricPlotter(options, self.degree())
1209
+ tp.adjust_options()
1210
+ return tp.plot_lattice()
1211
+
1212
+
1213
+ class ToricLattice_sublattice(ToricLattice_sublattice_with_basis,
1214
+ FreeModule_submodule_pid):
1215
+ r"""
1216
+ Construct the sublattice of ``ambient`` toric lattice generated by ``gens``.
1217
+
1218
+ INPUT (same as for
1219
+ :class:`~sage.modules.free_module.FreeModule_submodule_pid`):
1220
+
1221
+ - ``ambient`` -- ambient :class:`toric lattice <ToricLatticeFactory>` for
1222
+ this sublattice
1223
+
1224
+ - ``gens`` -- list of elements of ``ambient`` generating the constructed
1225
+ sublattice
1226
+
1227
+ - see the base class for other available options
1228
+
1229
+ OUTPUT: sublattice of a toric lattice with an automatically chosen basis
1230
+
1231
+ See also :class:`ToricLattice_sublattice_with_basis` if you want to
1232
+ specify an explicit basis.
1233
+
1234
+ EXAMPLES:
1235
+
1236
+ The intended way to get objects of this class is to use
1237
+ :meth:`submodule` method of toric lattices::
1238
+
1239
+ sage: N = ToricLattice(3)
1240
+ sage: sublattice = N.submodule([(1,1,0), (3,2,1)])
1241
+ sage: sublattice.has_user_basis()
1242
+ False
1243
+ sage: sublattice.basis()
1244
+ [N(1, 0, 1), N(0, 1, -1)]
1245
+
1246
+ For sublattices without user-specified basis, the basis obtained above is
1247
+ the same as the "standard" one::
1248
+
1249
+ sage: sublattice.echelonized_basis()
1250
+ [N(1, 0, 1), N(0, 1, -1)]
1251
+ """
1252
+ pass
1253
+
1254
+
1255
+ class ToricLattice_quotient_element(FGP_Element):
1256
+ r"""
1257
+ Create an element of a toric lattice quotient.
1258
+
1259
+ .. WARNING::
1260
+
1261
+ You probably should not construct such elements explicitly.
1262
+
1263
+ INPUT:
1264
+
1265
+ - same as for :class:`~sage.modules.fg_pid.fgp_element.FGP_Element`.
1266
+
1267
+ OUTPUT: element of a toric lattice quotient
1268
+
1269
+ TESTS::
1270
+
1271
+ sage: N = ToricLattice(3)
1272
+ sage: sublattice = N.submodule([(1,1,0), (3,2,1)])
1273
+ sage: Q = N/sublattice
1274
+ sage: e = Q(1,2,3)
1275
+ sage: e
1276
+ N[1, 2, 3]
1277
+ sage: e2 = Q(N(2,3,3))
1278
+ sage: e2
1279
+ N[2, 3, 3]
1280
+ sage: e == e2 # needs sage.libs.pari
1281
+ True
1282
+ sage: e.vector() # needs sage.libs.pari
1283
+ (-4)
1284
+ sage: e2.vector() # needs sage.libs.pari
1285
+ (-4)
1286
+ """
1287
+
1288
+ def _latex_(self):
1289
+ r"""
1290
+ Return a LaTeX representation of ``self``.
1291
+
1292
+ OUTPUT: string
1293
+
1294
+ TESTS::
1295
+
1296
+ sage: N = ToricLattice(3)
1297
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1298
+ sage: Q = N/Ns
1299
+ sage: print(Q.gen(0)._latex_()) # needs sage.libs.pari
1300
+ \left[0,\,1,\,0\right]_{N}
1301
+ """
1302
+ return latex(self.lift()).replace("(", "[", 1).replace(")", "]", 1)
1303
+
1304
+ def _repr_(self):
1305
+ r"""
1306
+ Return a string representation of ``self``.
1307
+
1308
+ OUTPUT: string
1309
+
1310
+ TESTS::
1311
+
1312
+ sage: N = ToricLattice(3)
1313
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1314
+ sage: Q = N/Ns
1315
+ sage: print(Q.gen(0)._repr_()) # needs sage.libs.pari
1316
+ N[0, 1, 0]
1317
+ """
1318
+ return str(self.lift()).replace("(", "[", 1).replace(")", "]", 1)
1319
+
1320
+ def set_immutable(self):
1321
+ r"""
1322
+ Make ``self`` immutable.
1323
+
1324
+ OUTPUT: none
1325
+
1326
+ .. NOTE:: Elements of toric lattice quotients are always immutable, so
1327
+ this method does nothing, it is introduced for compatibility
1328
+ purposes only.
1329
+
1330
+ EXAMPLES::
1331
+
1332
+ sage: N = ToricLattice(3)
1333
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1334
+ sage: Q = N/Ns
1335
+ sage: Q.0.set_immutable() # needs sage.libs.pari
1336
+ """
1337
+ pass
1338
+
1339
+
1340
+ class ToricLattice_quotient(FGP_Module_class):
1341
+ r"""
1342
+ Construct the quotient of a toric lattice ``V`` by its sublattice ``W``.
1343
+
1344
+ INPUT:
1345
+
1346
+ - ``V`` -- ambient toric lattice
1347
+
1348
+ - ``W`` -- sublattice of ``V``
1349
+
1350
+ - ``check`` -- boolean (default: ``True``); whether to check correctness of input
1351
+ or not
1352
+
1353
+ If the quotient is one-dimensional and torsion free, the following
1354
+ two mutually exclusive keyword arguments are also allowed. They
1355
+ decide the sign choice for the (single) generator of the quotient
1356
+ lattice:
1357
+
1358
+ - ``positive_point`` -- a lattice point of ``self`` not in the
1359
+ sublattice ``sub`` (that is, not zero in the quotient
1360
+ lattice). The quotient generator will be in the same direction
1361
+ as ``positive_point``.
1362
+
1363
+ - ``positive_dual_point`` -- a dual lattice point. The quotient
1364
+ generator will be chosen such that its lift has a positive
1365
+ product with ``positive_dual_point``. Note: if
1366
+ ``positive_dual_point`` is not zero on the sublattice ``sub``,
1367
+ then the notion of positivity will depend on the choice of lift!
1368
+
1369
+ Further given named arguments are passed to the constructor of an FGP
1370
+ module.
1371
+
1372
+ OUTPUT: quotient of ``V`` by ``W``
1373
+
1374
+ EXAMPLES:
1375
+
1376
+ The intended way to get objects of this class is to use
1377
+ :meth:`quotient` method of toric lattices::
1378
+
1379
+ sage: N = ToricLattice(3)
1380
+ sage: sublattice = N.submodule([(1,1,0), (3,2,1)])
1381
+ sage: Q = N/sublattice
1382
+ sage: Q # needs sage.libs.pari
1383
+ 1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
1384
+ sage: Q.gens() # needs sage.libs.pari
1385
+ (N[1, 0, 0],)
1386
+
1387
+ Here, ``sublattice`` happens to be of codimension one in ``N``. If
1388
+ you want to prescribe the sign of the quotient generator, you can
1389
+ do either::
1390
+
1391
+ sage: Q = N.quotient(sublattice, positive_point=N(0,0,-1)); Q # needs sage.libs.pari
1392
+ 1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
1393
+ sage: Q.gens() # needs sage.libs.pari
1394
+ (N[1, 0, 0],)
1395
+
1396
+ or::
1397
+
1398
+ sage: M = N.dual()
1399
+ sage: Q = N.quotient(sublattice, positive_dual_point=M(1,0,0)); Q # needs sage.libs.pari
1400
+ 1-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 0, 1), N(0, 1, -1)>
1401
+ sage: Q.gens() # needs sage.libs.pari
1402
+ (N[1, 0, 0],)
1403
+
1404
+ TESTS::
1405
+
1406
+ sage: loads(dumps(Q)) == Q
1407
+ True
1408
+ sage: loads(dumps(Q)).gens() == Q.gens() # needs sage.libs.pari
1409
+ True
1410
+ """
1411
+
1412
+ def __init__(self, V, W, check=True, positive_point=None, positive_dual_point=None, **kwds):
1413
+ r"""
1414
+ The constructor.
1415
+
1416
+ See :class:`ToricLattice_quotient` for an explanation of the arguments.
1417
+
1418
+ EXAMPLES::
1419
+
1420
+ sage: N = ToricLattice(3)
1421
+ sage: from sage.geometry.toric_lattice import ToricLattice_quotient
1422
+ sage: ToricLattice_quotient(N, N.span([N(1,2,3)])) # needs sage.libs.pari
1423
+ 2-d lattice, quotient of 3-d lattice N by Sublattice <N(1, 2, 3)>
1424
+
1425
+ An :exc:`ArithmeticError` will be raised if ``W`` is not a
1426
+ sublattice of ``V``::
1427
+
1428
+ sage: N = ToricLattice(3)
1429
+ sage: Ns = N.submodule([N.gen(0)])
1430
+ sage: Ns
1431
+ Sublattice <N(1, 0, 0)>
1432
+ sage: Ns.span([N.gen(1)])
1433
+ Sublattice <N(0, 1, 0)>
1434
+ sage: Ns.quotient(Ns.span([N.gen(1)])) # needs sage.libs.pari
1435
+ Traceback (most recent call last):
1436
+ ...
1437
+ ArithmeticError: W must be a sublattice of V
1438
+ """
1439
+ if check:
1440
+ try:
1441
+ W = V.submodule(W)
1442
+ except (TypeError, ArithmeticError):
1443
+ raise ArithmeticError("W must be a sublattice of V")
1444
+ super().__init__(V, W, check, **kwds)
1445
+ if (positive_point, positive_dual_point) == (None, None):
1446
+ self._flip_sign_of_generator = False
1447
+ return
1448
+
1449
+ self._flip_sign_of_generator = False
1450
+ assert self.is_torsion_free() and self.ngens() == 1, \
1451
+ 'You may only specify a positive direction in the codimension one case.'
1452
+ quotient_generator = self.gen(0)
1453
+ lattice = self.V().ambient_module()
1454
+ if (positive_point is not None) and (positive_dual_point is None):
1455
+ assert positive_point in lattice, 'positive_point must be a lattice point.'
1456
+ point_quotient = self(positive_point)
1457
+ scalar_product = quotient_generator.vector()[0] * point_quotient.vector()[0]
1458
+ if scalar_product == 0:
1459
+ raise ValueError(str(positive_point)+' is zero in the quotient.')
1460
+ elif (positive_point is None) and (positive_dual_point is not None):
1461
+ assert positive_dual_point in lattice.dual(), 'positive_dual_point must be a dual lattice point.'
1462
+ scalar_product = quotient_generator.lift() * positive_dual_point
1463
+ if scalar_product == 0:
1464
+ raise ValueError(str(positive_dual_point)+' is zero on the lift of the quotient generator.')
1465
+ else:
1466
+ raise ValueError('You may not specify both positive_point and positive_dual_point.')
1467
+ self._flip_sign_of_generator = (scalar_product < 0)
1468
+
1469
+ def gens(self) -> tuple:
1470
+ """
1471
+ Return the generators of the quotient.
1472
+
1473
+ OUTPUT:
1474
+
1475
+ A tuple of :class:`ToricLattice_quotient_element` generating
1476
+ the quotient.
1477
+
1478
+ EXAMPLES::
1479
+
1480
+ sage: N = ToricLattice(3)
1481
+ sage: Q = N.quotient(N.span([N(1,2,3), N(0,2,1)]), positive_point=N(0,-1,0)) # needs sage.libs.pari
1482
+ sage: Q.gens() # needs sage.libs.pari
1483
+ (N[0, -1, 0],)
1484
+ """
1485
+ gens = self.smith_form_gens()
1486
+ if self._flip_sign_of_generator:
1487
+ assert len(gens) == 1
1488
+ return (-gens[0],)
1489
+ else:
1490
+ return gens
1491
+
1492
+ # Should be overridden in derived classes.
1493
+ Element = ToricLattice_quotient_element
1494
+
1495
+ def _element_constructor_(self, *x, **kwds):
1496
+ r"""
1497
+ Construct an element of ``self``.
1498
+
1499
+ INPUT:
1500
+
1501
+ - element of a compatible toric object (lattice, sublattice, quotient)
1502
+ or something that defines such an element (list, generic vector,
1503
+ etc.).
1504
+
1505
+ OUTPUT:
1506
+
1507
+ - :class:`toric lattice quotient element
1508
+ <ToricLattice_quotient_element>`.
1509
+
1510
+ EXAMPLES::
1511
+
1512
+ sage: N = ToricLattice(3)
1513
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1514
+ sage: Q = N/Ns
1515
+ sage: x = Q(1,2,3) # indirect doctest
1516
+ sage: x
1517
+ N[1, 2, 3]
1518
+ sage: type(x)
1519
+ <class 'sage.geometry.toric_lattice.ToricLattice_quotient_with_category.element_class'>
1520
+ sage: x is Q(x)
1521
+ True
1522
+ sage: x.parent() is Q
1523
+ True
1524
+ sage: x == Q(N(1,2,3)) # needs sage.libs.pari
1525
+ True
1526
+ sage: y = Q(3,6,3)
1527
+ sage: y
1528
+ N[3, 6, 3]
1529
+ sage: x == y # needs sage.libs.pari
1530
+ True
1531
+ """
1532
+ if len(x) == 1 and (x[0] not in ZZ or x[0] == 0):
1533
+ x = x[0]
1534
+ if parent(x) is self:
1535
+ return x
1536
+ try:
1537
+ x = x.lift()
1538
+ except AttributeError:
1539
+ pass
1540
+ try:
1541
+ return self.element_class(self, self._V(x), **kwds)
1542
+ except TypeError:
1543
+ return self.linear_combination_of_smith_form_gens(x)
1544
+
1545
+ def _latex_(self):
1546
+ r"""
1547
+ Return a LaTeX representation of ``self``.
1548
+
1549
+ OUTPUT: string
1550
+
1551
+ TESTS::
1552
+
1553
+ sage: N = ToricLattice(3)
1554
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1555
+ sage: Q = N/Ns
1556
+ sage: print(Q._latex_())
1557
+ N / \left\langle\left(1,\,8,\,0\right)_{N}, \left(0,\,12,\,0\right)_{N}\right\rangle
1558
+ sage: Ns = N.submodule([N(1,4,0)])
1559
+ sage: Q = N/Ns
1560
+ sage: print(Q._latex_())
1561
+ N / \left\langle\left(1,\,4,\,0\right)_{N}\right\rangle
1562
+ """
1563
+ return "%s / %s" % (latex(self.V()), latex(self.W()))
1564
+
1565
+ def _repr_(self):
1566
+ r"""
1567
+ Return a string representation of ``self``.
1568
+
1569
+ OUTPUT: string
1570
+
1571
+ TESTS::
1572
+
1573
+ sage: N = ToricLattice(3)
1574
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1575
+ sage: Q = N/Ns
1576
+ sage: print(Q._repr_()) # needs sage.libs.pari
1577
+ Quotient with torsion of 3-d lattice N
1578
+ by Sublattice <N(1, 8, 0), N(0, 12, 0)>
1579
+ sage: Ns = N.submodule([N(1,4,0)])
1580
+ sage: Q = N/Ns
1581
+ sage: print(Q._repr_()) # needs sage.libs.pari
1582
+ 2-d lattice, quotient of 3-d lattice N
1583
+ by Sublattice <N(1, 4, 0)>
1584
+ """
1585
+ if self.is_torsion_free():
1586
+ return "%d-d lattice, quotient of %s by %s" % (self.rank(),
1587
+ self.V(), self.W())
1588
+ else:
1589
+ return "Quotient with torsion of %s by %s" % (self.V(), self.W())
1590
+
1591
+ def _module_constructor(self, V, W, check=True):
1592
+ r"""
1593
+ Construct new quotient modules.
1594
+
1595
+ INPUT:
1596
+
1597
+ - ``V`` -- ambient toric lattice
1598
+
1599
+ - ``W`` -- sublattice of ``V``
1600
+
1601
+ - ``check`` -- boolean (default: ``True``); whether to check
1602
+ correctness of input or not
1603
+
1604
+ TESTS::
1605
+
1606
+ sage: N = ToricLattice(3)
1607
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1608
+ sage: Q = N/Ns; Q # needs sage.libs.pari
1609
+ Quotient with torsion of 3-d lattice N by Sublattice <N(1, 8, 0), N(0, 12, 0)>
1610
+ sage: Q._module_constructor(N,Ns) # needs sage.libs.pari
1611
+ Quotient with torsion of 3-d lattice N by Sublattice <N(1, 8, 0), N(0, 12, 0)>
1612
+ """
1613
+ return ToricLattice_quotient(V,W,check)
1614
+
1615
+ def base_extend(self, R):
1616
+ r"""
1617
+ Return the base change of ``self`` to the ring ``R``.
1618
+
1619
+ INPUT:
1620
+
1621
+ - ``R`` -- either `\ZZ` or `\QQ`
1622
+
1623
+ OUTPUT: ``self`` if `R=\ZZ`, quotient of the base extension of the ambient
1624
+ lattice by the base extension of the sublattice if `R=\QQ`
1625
+
1626
+ EXAMPLES::
1627
+
1628
+ sage: N = ToricLattice(3)
1629
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1630
+ sage: Q = N/Ns
1631
+ sage: Q.base_extend(ZZ) is Q
1632
+ True
1633
+ sage: Q.base_extend(QQ)
1634
+ Vector space quotient V/W of dimension 1 over Rational Field where
1635
+ V: Vector space of dimension 3 over Rational Field
1636
+ W: Vector space of degree 3 and dimension 2 over Rational Field
1637
+ Basis matrix:
1638
+ [1 0 0]
1639
+ [0 1 0]
1640
+ """
1641
+ if R is ZZ:
1642
+ return self
1643
+ if R is QQ:
1644
+ return self.V().base_extend(R) / self.W().base_extend(R)
1645
+ raise NotImplementedError("quotients of toric lattices can only be "
1646
+ "extended to ZZ or QQ, not %s!" % R)
1647
+
1648
+ def is_torsion_free(self):
1649
+ r"""
1650
+ Check if ``self`` is torsion-free.
1651
+
1652
+ OUTPUT: ``True`` if ``self`` has no torsion and ``False`` otherwise
1653
+
1654
+ EXAMPLES::
1655
+
1656
+ sage: N = ToricLattice(3)
1657
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1658
+ sage: Q = N/Ns
1659
+ sage: Q.is_torsion_free() # needs sage.libs.pari
1660
+ False
1661
+ sage: Ns = N.submodule([N(1,4,0)])
1662
+ sage: Q = N/Ns
1663
+ sage: Q.is_torsion_free() # needs sage.libs.pari
1664
+ True
1665
+ """
1666
+ return sum(self.invariants()) == 0
1667
+
1668
+ def dual(self):
1669
+ r"""
1670
+ Return the lattice dual to ``self``.
1671
+
1672
+ OUTPUT: a :class:`toric lattice quotient <ToricLattice_quotient>`
1673
+
1674
+ EXAMPLES::
1675
+
1676
+ sage: N = ToricLattice(3)
1677
+ sage: Ns = N.submodule([(1, -1, -1)])
1678
+ sage: Q = N / Ns
1679
+ sage: Q.dual()
1680
+ Sublattice <M(1, 0, 1), M(0, 1, -1)>
1681
+ """
1682
+ if "_dual" not in self.__dict__:
1683
+ self._dual = self.V().dual().submodule(
1684
+ self.W().basis_matrix().transpose().integer_kernel().gens())
1685
+ self._dual._dual = self
1686
+ return self._dual
1687
+
1688
+ def rank(self):
1689
+ r"""
1690
+ Return the rank of ``self``.
1691
+
1692
+ OUTPUT: integer; the dimension of the free part of the quotient
1693
+
1694
+ EXAMPLES::
1695
+
1696
+ sage: N = ToricLattice(3)
1697
+ sage: Ns = N.submodule([N(2,4,0), N(9,12,0)])
1698
+ sage: Q = N/Ns
1699
+ sage: Q.ngens() # needs sage.libs.pari
1700
+ 2
1701
+ sage: Q.rank()
1702
+ 1
1703
+ sage: Ns = N.submodule([N(1,4,0)])
1704
+ sage: Q = N/Ns
1705
+ sage: Q.ngens() # needs sage.libs.pari
1706
+ 2
1707
+ sage: Q.rank()
1708
+ 2
1709
+ """
1710
+ return self.V().rank() - self.W().rank()
1711
+
1712
+ dimension = rank
1713
+
1714
+ def coordinate_vector(self, x, reduce=False):
1715
+ """
1716
+ Return coordinates of ``x`` with respect to the optimized
1717
+ representation of ``self``.
1718
+
1719
+ INPUT:
1720
+
1721
+ - ``x`` -- element of ``self`` or convertible to ``self``
1722
+
1723
+ - ``reduce`` -- (default: ``False``) if ``True``, reduce coefficients
1724
+ modulo invariants
1725
+
1726
+ OUTPUT: the coordinates as a vector
1727
+
1728
+ EXAMPLES::
1729
+
1730
+ sage: # needs sage.libs.pari
1731
+ sage: N = ToricLattice(3)
1732
+ sage: Q = N.quotient(N.span([N(1,2,3), N(0,2,1)]), positive_point=N(0,-1,0))
1733
+ sage: q = Q.gen(0); q
1734
+ N[0, -1, 0]
1735
+ sage: q.vector() # indirect test
1736
+ (1)
1737
+ sage: Q.coordinate_vector(q)
1738
+ (1)
1739
+ """
1740
+ coordinates = super().coordinate_vector(x, reduce)
1741
+ if self._flip_sign_of_generator:
1742
+ assert len(coordinates) == 1, "Sign flipped for a multi-dimensional quotient!"
1743
+ return -coordinates
1744
+ else:
1745
+ return coordinates