passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl

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

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 +5 -0
  4. passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
  5. passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.so +0 -0
  74. sage/calculus/integration.pyx +698 -0
  75. sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
  76. sage/calculus/interpolation.pxd +13 -0
  77. sage/calculus/interpolation.pyx +387 -0
  78. sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
  79. sage/calculus/interpolators.pyx +326 -0
  80. sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
  81. sage/calculus/ode.pxd +5 -0
  82. sage/calculus/ode.pyx +610 -0
  83. sage/calculus/riemann.cpython-314-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.so +0 -0
  401. sage/matrix/constructor.pyx +750 -0
  402. sage/matrix/docs.py +430 -0
  403. sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
  404. sage/matrix/echelon_matrix.pyx +155 -0
  405. sage/matrix/matrix.pxd +2 -0
  406. sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
  407. sage/matrix/matrix0.pxd +68 -0
  408. sage/matrix/matrix0.pyx +6324 -0
  409. sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
  410. sage/matrix/matrix1.pxd +8 -0
  411. sage/matrix/matrix1.pyx +2851 -0
  412. sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
  413. sage/matrix/matrix2.pxd +25 -0
  414. sage/matrix/matrix2.pyx +20181 -0
  415. sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.so +0 -0
  492. sage/matroids/extension.pxd +34 -0
  493. sage/matroids/extension.pyx +519 -0
  494. sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.so +0 -0
  701. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  702. sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.so +0 -0
  771. sage/stats/hmm/chmm.pyx +1595 -0
  772. sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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-aarch64-linux-musl.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,1217 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ """
3
+ Basis matroids
4
+
5
+ In a matroid, a basis is an inclusionwise maximal independent set.
6
+ The common cardinality of all bases is the rank of the matroid.
7
+ Matroids are uniquely determined by their set of bases.
8
+
9
+ This module defines the class
10
+ :class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`, which
11
+ internally represents a matroid as a set of bases. It is a subclass of
12
+ :mod:`BasisExchangeMatroid <sage.matroids.basis_exchange_matroid>`, and as
13
+ such it inherits all method from that class and from the class
14
+ :mod:`Matroid <sage.matroids.matroid>`. Additionally, it provides the
15
+ following methods:
16
+
17
+ - :meth:`is_distinguished() <sage.matroids.basis_matroid.BasisMatroid.is_distinguished>`
18
+ - :meth:`relabel() <sage.matroids.basis_matroid.BasisMatroid.relabel>`
19
+
20
+ Construction
21
+ ============
22
+
23
+ A ``BasisMatroid`` can be created from another matroid, from a list of bases,
24
+ or from a list of nonbases. For a full description of allowed inputs, see
25
+ :class:`below <sage.matroids.basis_matroid.BasisMatroid>`. It is recommended
26
+ to use the :func:`Matroid() <sage.matroids.constructor.Matroid>` function for
27
+ easy construction of a ``BasisMatroid``. For direct access to the
28
+ ``BasisMatroid`` constructor, run::
29
+
30
+ sage: from sage.matroids.advanced import *
31
+
32
+ See also :mod:`sage.matroids.advanced`.
33
+
34
+ EXAMPLES::
35
+
36
+ sage: from sage.matroids.advanced import *
37
+ sage: M1 = BasisMatroid(groundset='abcd', bases=['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
38
+ sage: M2 = Matroid(['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
39
+ sage: M1 == M2
40
+ True
41
+
42
+ Implementation
43
+ ==============
44
+
45
+ The set of bases is compactly stored in a bitset which takes
46
+ `O(binomial(N, R))` bits of space, where `N` is the cardinality of the
47
+ groundset and `R` is the rank. ``BasisMatroid`` inherits the matroid oracle
48
+ from its parent class ``BasisExchangeMatroid``, by providing the elementary
49
+ functions for exploring the base exchange graph. In addition, ``BasisMatroid``
50
+ has methods for constructing minors, duals, single-element extensions, for
51
+ testing matroid isomorphism and minor inclusion.
52
+
53
+ AUTHORS:
54
+
55
+ - Rudi Pendavingh, Stefan van Zwam (2013-04-01): initial version
56
+ """
57
+
58
+ # ****************************************************************************
59
+ # Copyright (C) 2013 Rudi Pendavingh <rudi.pendavingh@gmail.com>
60
+ # Copyright (C) 2013 Stefan van Zwam <stefanvanzwam@gmail.com>
61
+ #
62
+ # Distributed under the terms of the GNU General Public License (GPL)
63
+ # as published by the Free Software Foundation; either version 2 of
64
+ # the License, or (at your option) any later version.
65
+ # https://www.gnu.org/licenses/
66
+ # ****************************************************************************
67
+
68
+ from cpython.object cimport Py_EQ, Py_NE
69
+ from itertools import combinations
70
+ from sage.data_structures.bitset_base cimport *
71
+ from sage.misc.decorators import rename_keyword
72
+ from sage.structure.richcmp cimport rich_to_bool
73
+ from sage.matroids.matroid cimport Matroid
74
+ from sage.matroids.basis_exchange_matroid cimport BasisExchangeMatroid
75
+ from sage.matroids.set_system cimport SetSystem
76
+ from sage.matroids.utilities import cmp_elements_key
77
+
78
+ # class of general matroids, represented by their list of bases
79
+
80
+ cdef class BasisMatroid(BasisExchangeMatroid):
81
+ """
82
+ Create general matroid, stored as a set of bases.
83
+
84
+ INPUT:
85
+
86
+ - ``M`` -- matroid (optional)
87
+ - ``groundset`` -- any iterable set (optional)
88
+ - ``bases`` -- set of subsets of the ``groundset`` (optional)
89
+ - ``nonbases`` -- set of subsets of the ``groundset`` (optional)
90
+ - ``rank`` -- natural number (optional)
91
+
92
+ EXAMPLES:
93
+
94
+ The empty matroid::
95
+
96
+ sage: from sage.matroids.advanced import *
97
+ sage: M = BasisMatroid()
98
+ sage: M.groundset()
99
+ frozenset()
100
+ sage: M.full_rank()
101
+ 0
102
+
103
+ Create a BasisMatroid instance out of any other matroid::
104
+
105
+ sage: from sage.matroids.advanced import *
106
+ sage: F = matroids.catalog.Fano()
107
+ sage: M = BasisMatroid(F)
108
+ sage: F.groundset() == M.groundset()
109
+ True
110
+ sage: len(set(F.bases()).difference(M.bases()))
111
+ 0
112
+
113
+ It is possible to provide either bases or nonbases::
114
+
115
+ sage: from sage.matroids.advanced import *
116
+ sage: M1 = BasisMatroid(groundset='abc', bases=['ab', 'ac'] )
117
+ sage: M2 = BasisMatroid(groundset='abc', nonbases=['bc'])
118
+ sage: M1 == M2
119
+ True
120
+
121
+ Providing only groundset and rank creates a uniform matroid::
122
+
123
+ sage: from sage.matroids.advanced import *
124
+ sage: M1 = BasisMatroid(matroids.Uniform(2, 5))
125
+ sage: M2 = BasisMatroid(groundset=range(5), rank=2)
126
+ sage: M1 == M2
127
+ True
128
+
129
+ We do not check if the provided input forms an actual matroid::
130
+
131
+ sage: from sage.matroids.advanced import *
132
+ sage: M1 = BasisMatroid(groundset='abcd', bases=['ab', 'cd'])
133
+ sage: M1.full_rank()
134
+ 2
135
+ sage: M1.is_valid()
136
+ False
137
+ """
138
+ def __init__(self, M=None, groundset=None, bases=None, nonbases=None, rank=None):
139
+ """
140
+ See the class definition for full documentation.
141
+
142
+ EXAMPLES::
143
+
144
+ sage: from sage.matroids.advanced import *
145
+ sage: F = matroids.catalog.Fano()
146
+ sage: M = BasisMatroid(F)
147
+ sage: F.groundset() == M.groundset()
148
+ True
149
+ sage: len(set(F.bases()).difference(M.bases()))
150
+ 0
151
+
152
+ TESTS::
153
+
154
+ sage: F = matroids.catalog.Fano()
155
+ sage: M = Matroid(bases=F.bases())
156
+ sage: TestSuite(M).run()
157
+ """
158
+ cdef SetSystem NB
159
+ cdef long i
160
+ cdef mp_bitcnt_t bc
161
+
162
+ if isinstance(M, BasisMatroid):
163
+ BasisExchangeMatroid.__init__(self, groundset=(<BasisMatroid>M)._E, rank=(<BasisMatroid>M)._matroid_rank)
164
+ bitset_init(self._bb, binom[(<BasisMatroid>M)._groundset_size][(<BasisMatroid>M)._matroid_rank])
165
+ bitset_copy(self._bb, (<BasisMatroid>M)._bb)
166
+ bitset_init(self._b, (<BasisMatroid>M)._bitset_size)
167
+ bitset_copy(self._b, (<BasisMatroid>M)._b)
168
+ bitset_copy(self._current_basis, (<BasisMatroid>M)._current_basis)
169
+ self._bcount = (<BasisMatroid>M)._bcount
170
+ return
171
+
172
+ if isinstance(M, BasisExchangeMatroid):
173
+ BasisExchangeMatroid.__init__(self, groundset=(<BasisExchangeMatroid>M)._E, rank=(<BasisExchangeMatroid>M)._matroid_rank)
174
+ binom_init(len(M), M.full_rank())
175
+ bc = binom[(<BasisExchangeMatroid>M)._groundset_size][(<BasisExchangeMatroid>M)._matroid_rank]
176
+ bitset_init(self._bb, bc)
177
+ bitset_set_first_n(self._bb, bc)
178
+ NB = M.nonbases()
179
+ for i in range(len(NB)):
180
+ bitset_discard(self._bb, set_to_index(NB._subsets[i]))
181
+
182
+ bitset_init(self._b, (<BasisExchangeMatroid>M)._bitset_size)
183
+ self.reset_current_basis()
184
+ self._bcount = bc - len(NB)
185
+ return
186
+
187
+ if M is not None:
188
+ rank = M.full_rank()
189
+ nonbases = M.nonbases()
190
+ groundset = sorted(M.groundset(), key=cmp_elements_key)
191
+
192
+ if groundset is None:
193
+ groundset = frozenset()
194
+ if rank is None:
195
+ if bases is not None:
196
+ for B in bases:
197
+ rank = len(B)
198
+ break
199
+ elif nonbases is not None:
200
+ for N in nonbases:
201
+ rank = len(N)
202
+ break
203
+ else:
204
+ rank = 0
205
+
206
+ BasisExchangeMatroid.__init__(self, groundset=groundset, rank=rank)
207
+
208
+ size = len(groundset)
209
+ binom_init(size, rank)
210
+ bitset_init(self._bb, binom[size][rank])
211
+ bitset_init(self._b, max(size, 1))
212
+ bitset_clear(self._bb)
213
+
214
+ if bases is not None:
215
+ if len(bases) == 0:
216
+ raise ValueError("set of bases must be nonempty")
217
+ self._bcount = 0
218
+ for B in bases:
219
+ b = frozenset(B)
220
+ if len(b) != self._matroid_rank:
221
+ raise ValueError("basis has wrong cardinality")
222
+ if not b.issubset(self._groundset):
223
+ raise ValueError("basis is not a subset of the groundset")
224
+ self._pack(self._b, b)
225
+ i = set_to_index(self._b)
226
+ if not bitset_in(self._bb, i):
227
+ self._bcount += 1
228
+ bitset_add(self._bb, i)
229
+ else:
230
+ bitset_complement(self._bb, self._bb)
231
+ self._bcount = binom[size][rank]
232
+ if nonbases is not None:
233
+ for B in nonbases:
234
+ b = frozenset(B)
235
+ if len(b) != self._matroid_rank:
236
+ raise ValueError("nonbasis has wrong cardinality")
237
+ if not b.issubset(self._groundset):
238
+ raise ValueError("nonbasis is not a subset of the groundset")
239
+ self._pack(self._b, b)
240
+ i = set_to_index(self._b)
241
+ if bitset_in(self._bb, i):
242
+ self._bcount -= 1
243
+ bitset_discard(self._bb, i)
244
+
245
+ self.reset_current_basis()
246
+
247
+ def __dealloc__(self):
248
+ bitset_free(self._b)
249
+ bitset_free(self._bb)
250
+
251
+ # Sage special functions
252
+ def _repr_(self):
253
+ """
254
+ Return a string representation of ``self``.
255
+
256
+ EXAMPLES::
257
+
258
+ sage: from sage.matroids.advanced import *
259
+ sage: M = BasisMatroid(matroids.catalog.Fano())
260
+ sage: repr(M) # indirect doctest
261
+ 'Matroid of rank 3 on 7 elements with 28 bases'
262
+ """
263
+ return f'{Matroid._repr_(self)} with {self.bases_count()} bases'
264
+
265
+ # support for parent BasisExchangeMatroid
266
+
267
+ cdef bint _is_exchange_pair(self, long x, long y) except -1: # test if current_basis-x + y is a basis
268
+ """
269
+ Test if `B-e + f` is a basis of the current matroid.
270
+
271
+ Here ``B`` is the 'current' basis, i.e. the one returned by
272
+ ``self.basis()``, and ``e=self._E[x]``, ``f=self._E[y]``.
273
+
274
+ INPUT:
275
+
276
+ - ``x`` -- integer
277
+ - ``y`` -- integer
278
+
279
+ OUTPUT:
280
+
281
+ ``True`` if `B-e + f` is a basis, ``False`` otherwise. Here `e`, `f`
282
+ are the groundset elements which are internally named by the integers
283
+ ``x``, ``y``.
284
+
285
+ NOTE: this is an internal function, supporting the parent class
286
+ BasisExchangeMatroid of BasisMatroid.
287
+ """
288
+ bitset_copy(self._b, self._current_basis)
289
+ bitset_discard(self._b, x)
290
+ bitset_add(self._b, y)
291
+ return bitset_in(self._bb, set_to_index(self._b))
292
+
293
+ cdef reset_current_basis(self):
294
+ """
295
+ Set the current basis to the (lexicographically) first basis of the
296
+ matroid.
297
+ """
298
+ index_to_set(self._current_basis, bitset_first(self._bb), self._matroid_rank, self._groundset_size) # set current basis of parent BasisExchangeMatroid
299
+
300
+ # a function that is very efficient for this class
301
+
302
+ cpdef bint _is_basis(self, frozenset X) noexcept:
303
+ """
304
+ Test if input is a basis.
305
+
306
+ INPUT:
307
+
308
+ - ``X`` -- an object with Python's ``frozenset`` interface containing
309
+ a subset of ``self.groundset()``
310
+
311
+ .. WARNING::
312
+
313
+ This method assumes that ``X`` has the right size to be a basis,
314
+ i.e. ``len(X) == self.full_rank()``. Otherwise its behavior is
315
+ undefined.
316
+
317
+ OUTPUT: boolean
318
+
319
+ EXAMPLES::
320
+
321
+ sage: M = Matroid(bases=matroids.catalog.Vamos().bases())
322
+ sage: M._is_basis(frozenset(['a', 'b', 'c', 'e']))
323
+ True
324
+ sage: M._is_basis(frozenset(['a', 'b', 'c', 'd']))
325
+ False
326
+ """
327
+ self._pack(self._b, X)
328
+ return bitset_in(self._bb, set_to_index(self._b))
329
+
330
+ # dual and minors
331
+
332
+ cpdef dual(self):
333
+ r"""
334
+ Return the dual of the matroid.
335
+
336
+ Let `M` be a matroid with groundset `E`. If `B` is the set of bases
337
+ of `M`, then the set `\{E - b : b \in B\}` is the set of bases of
338
+ another matroid, the *dual* of `M`.
339
+
340
+ EXAMPLES::
341
+
342
+ sage: M = Matroid(bases=matroids.catalog.Pappus().bases())
343
+ sage: M.dual()
344
+ Matroid of rank 6 on 9 elements with 75 bases
345
+
346
+ ALGORITHM:
347
+
348
+ A BasisMatroid on `n` elements and of rank `r` is stored as a
349
+ bitvector of length `\binom{n}{r}`. The `i`-th bit in this vector
350
+ indicates that the `i`-th `r`-set in the lexicographic enumeration of
351
+ `r`-subsets of the groundset is a basis. Reversing this bitvector
352
+ yields a bitvector that indicates whether the complement of an
353
+ `(n - r)`-set is a basis, i.e. gives the bitvector of the bases of the
354
+ dual.
355
+ """
356
+ cdef long i, N
357
+ cdef BasisMatroid D
358
+ D = BasisMatroid(groundset=self._E, rank=self.full_corank())
359
+ N = binom[self._groundset_size][self._matroid_rank]
360
+ for i in range(N):
361
+ if not bitset_in(self._bb, i):
362
+ bitset_discard(D._bb, N - i - 1)
363
+ D.reset_current_basis()
364
+ D._reset_invariants()
365
+ D._bcount = self._bcount
366
+ return D
367
+
368
+ cpdef _minor(self, contractions, deletions):
369
+ """
370
+ Return a minor.
371
+
372
+ INPUT:
373
+
374
+ - ``contractions`` -- an object with Python's ``frozenset`` interface
375
+ containing a subset of ``self.groundset()``
376
+ - ``deletions`` -- an object with Python's ``frozenset`` interface
377
+ containing a subset of ``self.groundset()``
378
+
379
+ .. NOTE::
380
+
381
+ This method does NOT do any checks. Besides the assumptions above,
382
+ we assume the following:
383
+
384
+ - ``contractions`` is independent
385
+ - ``deletions`` is coindependent
386
+ - ``contractions`` and ``deletions`` are disjoint.
387
+
388
+ OUTPUT: matroid
389
+
390
+ EXAMPLES::
391
+
392
+ sage: from sage.matroids.advanced import *
393
+ sage: M = BasisMatroid(matroids.catalog.Vamos())
394
+ sage: M._minor(contractions=frozenset(['a']), deletions=frozenset(['b', 'c']))
395
+ Matroid of rank 3 on 5 elements with 10 bases
396
+ """
397
+ E = self.groundset() - (contractions | deletions)
398
+ mr = self.full_rank() - len(contractions)
399
+ NB = [frozenset(B) for B in combinations(E, mr) if not self._is_basis(contractions | frozenset(B))]
400
+ return BasisMatroid(groundset=E, nonbases=NB, rank=mr)
401
+
402
+ cpdef truncation(self):
403
+ r"""
404
+ Return a rank-1 truncation of the matroid.
405
+
406
+ Let `M` be a matroid of rank `r`. The *truncation* of `M` is the
407
+ matroid obtained by declaring all subsets of size `r` dependent. It
408
+ can be obtained by adding an element freely to the span of the matroid
409
+ and then contracting that element.
410
+
411
+ OUTPUT: matroid
412
+
413
+ .. SEEALSO::
414
+
415
+ :meth:`M.extension() <sage.matroids.matroid.Matroid.extension>`,
416
+ :meth:`M.contract() <sage.matroids.matroid.Matroid.contract>`
417
+
418
+ EXAMPLES::
419
+
420
+ sage: M = Matroid(bases=matroids.catalog.N2().bases())
421
+ sage: M.truncation()
422
+ Matroid of rank 5 on 12 elements with 702 bases
423
+ sage: M.whitney_numbers2()
424
+ [1, 12, 66, 190, 258, 99, 1]
425
+ sage: M.truncation().whitney_numbers2()
426
+ [1, 12, 66, 190, 258, 1]
427
+ """
428
+ if self.full_rank() == 0:
429
+ return None
430
+ return BasisMatroid(groundset=self._E, nonbases=self.dependent_sets(self.full_rank() - 1), rank=self.full_rank() - 1)
431
+
432
+ cpdef _extension(self, e, H):
433
+ r"""
434
+ Extend the matroid by a new element.
435
+
436
+ The result is a matroid on ``self.groundset() + {element}``, where
437
+ ``element`` is contained in exactly the hyperplanes of ``self``
438
+ specified by ``hyperplanes``.
439
+
440
+ INPUT:
441
+
442
+ - ``element`` -- a hashable object not in ``self.groundset()``
443
+ - ``hyperplanes`` -- the set of hyperplanes of a linear subclass of ``self``
444
+
445
+ OUTPUT: matroid
446
+
447
+ EXAMPLES::
448
+
449
+ sage: from sage.matroids.advanced import *
450
+ sage: M = BasisMatroid(matroids.Uniform(3, 5))
451
+ sage: H = M.hyperplanes()
452
+ sage: M._extension('x', [H[0]])
453
+ Matroid of rank 3 on 6 elements with 19 bases
454
+ sage: M._extension('x', [H[0], H[1]])
455
+ Matroid of rank 3 on 6 elements with 18 bases
456
+ sage: M._extension('x', H)
457
+ Matroid of rank 3 on 6 elements with 10 bases
458
+ sage: len([M._extension('x', mc) for mc in M.linear_subclasses()])
459
+ 32
460
+ """
461
+ cdef bint found
462
+ cdef frozenset B
463
+ if self.full_rank() == 0:
464
+ return BasisMatroid(groundset=self._E + (e,), bases=[set()])
465
+
466
+ BB = self.bases()
467
+ BT = self.independent_sets(self.full_rank() - 1)
468
+ se = set([e])
469
+ BE = []
470
+ for B in BT:
471
+ found = False
472
+ for hyp in H:
473
+ if B.issubset(hyp):
474
+ found = True
475
+ break
476
+ if not found:
477
+ BE.append(B | se)
478
+ BE += BB
479
+ return BasisMatroid(groundset=self._E + (e,), bases=BE)
480
+
481
+ cpdef _with_coloop(self, e):
482
+ r"""
483
+ Return the matroid that arises by adding an element `e` to the
484
+ groundset, that is a coloop of the resulting matroid.
485
+
486
+ INPUT:
487
+
488
+ - ``e`` -- the label of the new element; assumed to be outside the
489
+ current groundset
490
+
491
+ OUTPUT: the extension of this matroid by a coloop
492
+
493
+ EXAMPLES::
494
+
495
+ sage: from sage.matroids.advanced import *
496
+ sage: M = BasisMatroid(matroids.catalog.Fano())
497
+ sage: M
498
+ Matroid of rank 3 on 7 elements with 28 bases
499
+ sage: M._with_coloop('x')
500
+ Matroid of rank 4 on 8 elements with 28 bases
501
+ """
502
+ cdef frozenset se = frozenset([e])
503
+ return BasisMatroid(groundset=self._E + (e,), bases=[B | se for B in self.bases()])
504
+
505
+ @rename_keyword(deprecation=37775, l='mapping')
506
+ def relabel(self, mapping):
507
+ r"""
508
+ Return an isomorphic matroid with relabeled groundset.
509
+
510
+ The output is obtained by relabeling each element `e` by
511
+ ``mapping[e]``, where ``mapping`` is a given injective map. If
512
+ ``mapping[e]`` is not defined, then the identity map is assumed.
513
+
514
+ INPUT:
515
+
516
+ - ``mapping`` -- a Python object such that ``mapping[e]`` is the new
517
+ label of `e`
518
+
519
+ OUTPUT: matroid
520
+
521
+ EXAMPLES::
522
+
523
+ sage: from sage.matroids.advanced import BasisMatroid
524
+ sage: M = BasisMatroid(matroids.catalog.Fano())
525
+ sage: sorted(M.groundset())
526
+ ['a', 'b', 'c', 'd', 'e', 'f', 'g']
527
+ sage: N = M.relabel({'a': 0, 'g': 'x'})
528
+ sage: from sage.matroids.utilities import cmp_elements_key
529
+ sage: sorted(N.groundset(), key=cmp_elements_key)
530
+ [0, 'b', 'c', 'd', 'e', 'f', 'x']
531
+ sage: N.is_isomorphic(M)
532
+ True
533
+
534
+ TESTS::
535
+
536
+ sage: from sage.matroids.advanced import BasisMatroid
537
+ sage: M = BasisMatroid(matroids.catalog.Fano())
538
+ sage: f = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7}
539
+ sage: N = M.relabel(f)
540
+ sage: for S in powerset(M.groundset()):
541
+ ....: assert M.rank(S) == N.rank([f[x] for x in S])
542
+ """
543
+ d = self._relabel_map(mapping)
544
+ E = [d[x] for x in self.groundset()]
545
+ B = [[d[y] for y in x] for x in self.bases()]
546
+ M = BasisMatroid(groundset=E, bases=B)
547
+ return M
548
+
549
+ # enumeration
550
+
551
+ cpdef bases_count(self):
552
+ r"""
553
+ Return the number of bases of the matroid.
554
+
555
+ OUTPUT: integer
556
+
557
+ EXAMPLES::
558
+
559
+ sage: M = Matroid(bases=matroids.catalog.Fano().bases())
560
+ sage: M
561
+ Matroid of rank 3 on 7 elements with 28 bases
562
+ sage: M.bases_count()
563
+ 28
564
+ """
565
+ if self._bcount is None:
566
+ self._bcount = bitset_len(self._bb)
567
+ return self._bcount
568
+
569
+ cpdef SetSystem bases(self):
570
+ r"""
571
+ Return the bases of the matroid.
572
+
573
+ A *basis* is a maximal independent set.
574
+
575
+ OUTPUT: iterable containing all bases of the matroid
576
+
577
+ EXAMPLES::
578
+
579
+ sage: M = Matroid(bases=matroids.catalog.Fano().bases())
580
+ sage: M
581
+ Matroid of rank 3 on 7 elements with 28 bases
582
+ sage: len(M.bases())
583
+ 28
584
+ """
585
+ cdef long r, n
586
+ r = self.full_rank()
587
+ n = len(self)
588
+ cdef SetSystem BB
589
+ BB = SetSystem(self._E, capacity=bitset_len(self._bb))
590
+ cdef long b
591
+ b = bitset_first(self._bb)
592
+ while b >= 0:
593
+ index_to_set(self._b, b, r, n)
594
+ BB._append(self._b)
595
+ b = bitset_next(self._bb, b + 1)
596
+ return BB
597
+
598
+ cpdef SetSystem nonbases(self):
599
+ r"""
600
+ Return the nonbases of the matroid.
601
+
602
+ A *nonbasis* is a set with cardinality ``self.full_rank()`` that is
603
+ not a basis.
604
+
605
+ OUTPUT: iterable containing the nonbases of the matroid
606
+
607
+ .. SEEALSO::
608
+
609
+ :meth:`Matroid.basis() <sage.matroids.matroid.Matroid.basis>`
610
+
611
+ EXAMPLES::
612
+
613
+ sage: M = Matroid(bases=matroids.catalog.Fano().bases())
614
+ sage: M
615
+ Matroid of rank 3 on 7 elements with 28 bases
616
+ sage: len(M.nonbases())
617
+ 7
618
+ """
619
+ if self._nonbases is not None:
620
+ return self._nonbases
621
+ cdef long r, n
622
+ r = self.full_rank()
623
+ n = len(self)
624
+ cdef bitset_t bb_comp
625
+ bitset_init(bb_comp, binom[self._groundset_size][self._matroid_rank])
626
+ bitset_complement(bb_comp, self._bb)
627
+ cdef SetSystem NB
628
+ NB = SetSystem(self._E, capacity=bitset_len(bb_comp))
629
+ cdef long b
630
+ b = bitset_first(bb_comp)
631
+ while b >= 0:
632
+ index_to_set(self._b, b, r, n)
633
+ NB._append(self._b)
634
+ b = bitset_next(bb_comp, b + 1)
635
+ bitset_free(bb_comp)
636
+ self._nonbases = NB
637
+ return NB
638
+
639
+ # isomorphism test
640
+
641
+ cpdef _bases_invariant(self):
642
+ """
643
+ Return an isomorphism invariant based on the incidences of groundset
644
+ elements with bases.
645
+
646
+ OUTPUT: integer
647
+
648
+ EXAMPLES::
649
+
650
+ sage: from sage.matroids.advanced import *
651
+ sage: M = BasisMatroid(matroids.catalog.Fano())
652
+ sage: N = BasisMatroid(matroids.catalog.Fano())
653
+ sage: M._bases_invariant() == N._bases_invariant()
654
+ True
655
+ """
656
+ if self._bases_invariant_var is not None:
657
+ return self._bases_invariant_var
658
+ cdef long i, j
659
+ cdef list bc
660
+ cdef dict bi
661
+ bc = [0 for i in range(len(self))]
662
+ for i in range(binom[self._groundset_size][self._matroid_rank]):
663
+ if not bitset_in(self._bb, i):
664
+ index_to_set(self._b, i, self._matroid_rank, self._groundset_size)
665
+ j = bitset_first(self._b)
666
+ while j >= 0:
667
+ bc[j] += 1
668
+ j = bitset_next(self._b, j + 1)
669
+ bi = {}
670
+ for e in range(len(self)):
671
+ if bc[e] in bi:
672
+ bi[bc[e]].append(e)
673
+ else:
674
+ bi[bc[e]] = [e]
675
+ self._bases_invariant_var = hash(tuple([(c, len(bi[c])) for c in sorted(bi, key=cmp_elements_key)]))
676
+ self._bases_partition_var = SetSystem(self._E, [[self._E[e] for e in bi[c]] for c in sorted(bi, key=cmp_elements_key)])
677
+ return self._bases_invariant_var
678
+
679
+ cpdef _bases_partition(self):
680
+ """
681
+ Return an ordered partition based on the incidences of groundset
682
+ elements with bases.
683
+
684
+ EXAMPLES::
685
+
686
+ sage: from sage.matroids.advanced import *
687
+ sage: M = BasisMatroid(matroids.catalog.Vamos())
688
+ sage: [sorted(p) for p in M._bases_partition()]
689
+ [['c', 'd', 'g', 'h'], ['a', 'b', 'e', 'f']]
690
+ """
691
+ self._bases_invariant()
692
+ return self._bases_partition_var
693
+
694
+ cpdef _bases_invariant2(self):
695
+ """
696
+ Return an isomorphism invariant of the matroid.
697
+
698
+ Compared to ``BasisMatroid._bases_invariant()`` this invariant
699
+ distinguishes more frequently between nonisomorphic matroids but
700
+ takes more time to compute.
701
+ See also :meth:`<BasisMatroid.basis_partition2>`.
702
+
703
+ OUTPUT: integer isomorphism invariant
704
+
705
+ EXAMPLES::
706
+
707
+ sage: from sage.matroids.advanced import *
708
+ sage: M = BasisMatroid(matroids.catalog.Fano())
709
+ sage: N = BasisMatroid(matroids.catalog.NonFano())
710
+ sage: M._bases_invariant2() == N._bases_invariant2()
711
+ False
712
+ """
713
+ if self._bases_invariant2_var is None:
714
+ CP = self.nonbases()._equitable_partition(self._bases_partition())
715
+ self._bases_partition2_var = CP[0]
716
+ self._bases_invariant2_var = CP[2]
717
+ return self._bases_invariant2_var
718
+
719
+ cpdef _bases_partition2(self):
720
+ """
721
+ Return an equitable partition which refines
722
+ :meth:`<BasisMatroid._bases_partition2>`.
723
+
724
+ EXAMPLES::
725
+
726
+ sage: from sage.matroids.advanced import *
727
+ sage: M = BasisMatroid(matroids.catalog.Vamos())
728
+ sage: [sorted(p) for p in M._bases_partition2()]
729
+ [['c', 'd', 'g', 'h'], ['a', 'b', 'e', 'f']]
730
+ """
731
+ self._bases_invariant2()
732
+ return self._bases_partition2_var
733
+
734
+ cpdef _bases_invariant3(self):
735
+ """
736
+ Return a number characteristic for the construction of
737
+ :meth:`<BasisMatroid._bases_partition3>`.
738
+
739
+ EXAMPLES::
740
+
741
+ sage: from sage.matroids.advanced import *
742
+ sage: M = BasisMatroid(matroids.catalog.Vamos())
743
+ sage: N = BasisMatroid(matroids.catalog.Vamos())
744
+ sage: M._bases_invariant3() == N._bases_invariant3()
745
+ True
746
+ """
747
+ if self._bases_invariant3_var is None:
748
+ CP = self.nonbases()._heuristic_partition(self._bases_partition2())
749
+ self._bases_partition3_var = CP[0]
750
+ self._bases_invariant3_var = CP[2]
751
+ return self._bases_invariant3_var
752
+
753
+ cpdef _bases_partition3(self):
754
+ """
755
+ Return an ordered partition into singletons which refines an equitable
756
+ partition of the matroid.
757
+
758
+ The purpose of this partition is to heuristically find an isomorphism
759
+ between two matroids, by lining up their respective
760
+ heuristic_partitions.
761
+
762
+ EXAMPLES::
763
+
764
+ sage: from sage.matroids.advanced import *
765
+ sage: M = BasisMatroid(matroids.catalog.Vamos())
766
+ sage: N = BasisMatroid(matroids.catalog.Vamos())
767
+ sage: PM = M._bases_partition3()
768
+ sage: PN = N._bases_partition3()
769
+ sage: morphism = {}
770
+ sage: for i in range(len(M)): morphism[min(PM[i])] = min(PN[i])
771
+ sage: M._is_isomorphism(N, morphism)
772
+ True
773
+ """
774
+ self._bases_invariant3()
775
+ return self._bases_partition3_var
776
+
777
+ cdef _reset_invariants(self):
778
+ """
779
+ Remove all precomputed invariants.
780
+ """
781
+ self._bcount = None
782
+ self._nonbases = None
783
+ self._bases_invariant_var = None
784
+ self._bases_partition_var = None
785
+ self._bases_invariant2_var = None
786
+ self._bases_partition2_var = None
787
+ self._bases_invariant3_var = None
788
+ self._bases_partition3_var = None
789
+ self._flush()
790
+
791
+ cpdef bint is_distinguished(self, e) noexcept:
792
+ """
793
+ Return whether ``e`` is a 'distinguished' element of the groundset.
794
+
795
+ The set of distinguished elements is an isomorphism invariant. Each
796
+ matroid has at least one distinguished element. The typical
797
+ application of this method is the execution of an orderly algorithm
798
+ for generating all matroids up to isomorphism in a minor-closed class,
799
+ by successively enumerating the single-element extensions and
800
+ coextensions of the matroids generated so far.
801
+
802
+ INPUT:
803
+
804
+ - ``e`` -- element of the groundset
805
+
806
+ OUTPUT: boolean
807
+
808
+ .. SEEALSO::
809
+
810
+ :meth:`M.extensions() <sage.matroids.matroid.Matroid.extensions>`,
811
+ :meth:`M.linear_subclasses() <sage.matroids.matroid.Matroid.linear_subclasses>`,
812
+ :mod:`sage.matroids.extension <sage.matroids.extension>`
813
+
814
+ EXAMPLES::
815
+
816
+ sage: from sage.matroids.advanced import *
817
+ sage: M = BasisMatroid(matroids.catalog.N1())
818
+ sage: sorted([e for e in M.groundset() if M.is_distinguished(e)])
819
+ ['c', 'g', 'h', 'j']
820
+ """
821
+ P = self._bases_partition()
822
+ p = P[0]
823
+ if e not in p:
824
+ return False
825
+ if len(p) == 1:
826
+ return True
827
+
828
+ SP = self._bases_partition2()
829
+ q = p
830
+ for q2 in SP:
831
+ if q2.issubset(p) and len(q2) < len(q):
832
+ q = q2
833
+ return e in q
834
+
835
+ cpdef _is_relaxation(self, other, morphism):
836
+ """
837
+ Return if the application of a groundset morphism to this matroid
838
+ yields a relaxation of the given matroid.
839
+
840
+ `M` is a relaxation of `N` if the set of bases of `M` is a superset of the
841
+ bases of `N`.
842
+
843
+ This method assumes that ``self`` and ``other`` have the same rank
844
+ and does not check this condition.
845
+
846
+ INPUT:
847
+
848
+ - ``other`` -- basisMatroid
849
+ - ``morphism`` -- dictionary with sends each element of the
850
+ groundset of this matroid to a distinct element of the groundset
851
+ of ``other``
852
+
853
+ OUTPUT: ``True`` if ``morphism[self]`` is a relaxation of ``other``;
854
+ ``False`` otherwise
855
+
856
+ EXAMPLES::
857
+
858
+ sage: from sage.matroids.advanced import *
859
+ sage: M = BasisMatroid(matroids.catalog.NonFano())
860
+ sage: N = BasisMatroid(matroids.catalog.Fano())
861
+ sage: m = {e:e for e in M.groundset()}
862
+ sage: M._is_relaxation(N, m)
863
+ True
864
+ sage: N._is_relaxation(M, m)
865
+ False
866
+ """
867
+ cdef long i, j
868
+ cdef bitset_t b2
869
+ cdef bitset_t bb_comp
870
+
871
+ bitset_init(bb_comp, binom[self._groundset_size][self._matroid_rank])
872
+ bitset_complement(bb_comp, self._bb)
873
+
874
+ bitset_init(b2, max(len(self), 1))
875
+ morph = [(<BasisMatroid>other)._idx[morphism[self._E[i]]] for i in range(len(self))]
876
+ i = bitset_first(bb_comp)
877
+ while i != -1:
878
+ index_to_set(self._b, i, self._matroid_rank, self._groundset_size)
879
+ bitset_clear(b2)
880
+ j = bitset_first(self._b)
881
+ while j != -1:
882
+ bitset_add(b2, <mp_bitcnt_t> morph[j])
883
+ j = bitset_next(self._b, j + 1)
884
+ if bitset_in((<BasisMatroid>other)._bb, set_to_index(b2)):
885
+ bitset_free(b2)
886
+ bitset_free(bb_comp)
887
+ return False
888
+ i = bitset_next(bb_comp, i + 1)
889
+ bitset_free(b2)
890
+ bitset_free(bb_comp)
891
+ return True
892
+
893
+ cpdef _is_isomorphism(self, other, morphism):
894
+ """
895
+ Version of :meth:`is_isomorphism` that does no type checking.
896
+
897
+ This method assumes that ``self`` and ``other`` have the same rank
898
+ and does not check this condition.
899
+
900
+ INPUT:
901
+
902
+ - ``other`` -- matroid
903
+ - ``morphism`` -- dictionary mapping the groundset of ``self`` to
904
+ the groundset of ``other``
905
+
906
+ OUTPUT: boolean
907
+
908
+ .. SEEALSO::
909
+
910
+ :meth:`<sage.matroids.matroid.Matroid.is_isomorphism>`.
911
+
912
+ EXAMPLES::
913
+
914
+ sage: from sage.matroids.advanced import *
915
+ sage: M = BasisMatroid(matroids.catalog.NonFano())
916
+ sage: N = BasisMatroid(matroids.catalog.Fano())
917
+ sage: m = {e:e for e in M.groundset()}
918
+ sage: M._is_relaxation(N, m)
919
+ True
920
+ sage: M._is_isomorphism(N, m)
921
+ False
922
+ """
923
+ if not isinstance(other, BasisMatroid):
924
+ ot = BasisMatroid(other)
925
+ else:
926
+ ot = other
927
+ return self.bases_count() == (<BasisMatroid>ot).bases_count() and self._is_relaxation(ot, morphism)
928
+
929
+ cpdef _isomorphism(self, other):
930
+ """
931
+ Return isomorphism from ``self`` to ``other``, if one exists.
932
+
933
+ INPUT:
934
+
935
+ - ``other`` -- matroid
936
+
937
+ OUTPUT: dictionary or ``None``
938
+
939
+ .. NOTE::
940
+
941
+ Internal version that does no input checking.
942
+
943
+ EXAMPLES::
944
+
945
+ sage: from sage.matroids.advanced import *
946
+ sage: M = BasisMatroid(matroids.Wheel(3))
947
+ sage: N = BasisMatroid(matroids.CompleteGraphic(4)) # needs sage.graphs
948
+ sage: morphism = M._isomorphism(N) # needs sage.graphs
949
+ sage: M._is_isomorphism(N, morphism) # needs sage.graphs
950
+ True
951
+ sage: M = BasisMatroid(matroids.catalog.NonFano())
952
+ sage: N = BasisMatroid(matroids.catalog.Fano())
953
+ sage: M._isomorphism(N) is not None
954
+ False
955
+ """
956
+ if not isinstance(other, BasisMatroid):
957
+ return self.isomorphism(BasisMatroid(other))
958
+ if self is other:
959
+ return {e: e for e in self.groundset()}
960
+ if len(self) != len(other):
961
+ return None
962
+ if self.full_rank() != other.full_rank():
963
+ return None
964
+ if self.full_rank() == 0:
965
+ return {self.groundset_list()[i]: other.groundset_list()[i] for i in range(len(self))}
966
+ if self.bases_count() != other.bases_count():
967
+ return None
968
+
969
+ if self._bases_invariant() != other._bases_invariant():
970
+ return None
971
+ PS = self._bases_partition()
972
+ PO = other._bases_partition()
973
+ if len(PS) == len(self) and len(PO) == len(other):
974
+ morphism = {}
975
+ for i in range(len(self)):
976
+ morphism[min(PS[i])] = min(PO[i])
977
+ if self._is_relaxation(other, morphism):
978
+ return morphism
979
+ else:
980
+ return None
981
+
982
+ if self._bases_invariant2() != other._bases_invariant2():
983
+ return None
984
+ PS = self._bases_partition2()
985
+ PO = other._bases_partition2()
986
+ if len(PS) == len(self) and len(PO) == len(other):
987
+ morphism = {}
988
+ for i in range(len(self)):
989
+ morphism[min(PS[i])] = min(PO[i])
990
+ if self._is_relaxation(other, morphism):
991
+ return morphism
992
+ else:
993
+ return None
994
+
995
+ if self._bases_invariant3() == other._bases_invariant3():
996
+ PHS = self._bases_partition3()
997
+ PHO = other._bases_partition3()
998
+ morphism = {}
999
+ for i in range(len(self)):
1000
+ morphism[min(PHS[i])] = min(PHO[i])
1001
+ if self._is_relaxation(other, morphism):
1002
+ return morphism
1003
+
1004
+ return self.nonbases()._isomorphism(other.nonbases(), PS, PO)
1005
+
1006
+ cpdef _is_isomorphic(self, other, certificate=False):
1007
+ """
1008
+ Return if this matroid is isomorphic to the given matroid.
1009
+
1010
+ INPUT:
1011
+
1012
+ - ``other`` -- matroid
1013
+ - ``certificate`` -- boolean (default: ``False``)
1014
+
1015
+ OUTPUT: boolean, and, if ``certificate = True``, a dictionary giving
1016
+ the isomorphism or ``None``
1017
+
1018
+ .. NOTE::
1019
+
1020
+ Internal version that does no input checking.
1021
+
1022
+ EXAMPLES::
1023
+
1024
+ sage: from sage.matroids.advanced import *
1025
+ sage: M = BasisMatroid(matroids.catalog.NonFano())
1026
+ sage: N = BasisMatroid(matroids.catalog.Fano())
1027
+ sage: M._is_isomorphic(N)
1028
+ False
1029
+ sage: M._is_isomorphic(N, certificate=True)
1030
+ (False, None)
1031
+ """
1032
+ if certificate:
1033
+ return self._is_isomorphic(other), self._isomorphism(other)
1034
+ if not isinstance(other, BasisMatroid):
1035
+ return BasisExchangeMatroid._is_isomorphic(self, other)
1036
+ if self is other:
1037
+ return True
1038
+ if len(self) != len(other):
1039
+ return False
1040
+ if self.full_rank() != other.full_rank():
1041
+ return False
1042
+ if self.full_rank() == 0:
1043
+ return True
1044
+ if self.bases_count() != other.bases_count():
1045
+ return False
1046
+ if self.full_rank() < 2 or self.full_corank() < 2:
1047
+ return True # number of bases then determines matroid up to isomorphism
1048
+
1049
+ if self._bases_invariant() != other._bases_invariant():
1050
+ return False
1051
+ PS = self._bases_partition()
1052
+ PO = other._bases_partition()
1053
+ if len(PS) == len(self) and len(PO) == len(other):
1054
+ morphism = {}
1055
+ for i in range(len(self)):
1056
+ morphism[min(PS[i])] = min(PO[i])
1057
+ return self._is_relaxation(other, morphism)
1058
+
1059
+ if self._bases_invariant2() != other._bases_invariant2():
1060
+ return False
1061
+ PS = self._bases_partition2()
1062
+ PO = other._bases_partition2()
1063
+ if len(PS) == len(self) and len(PO) == len(other):
1064
+ morphism = {}
1065
+ for i in range(len(self)):
1066
+ morphism[min(PS[i])] = min(PO[i])
1067
+ return self._is_relaxation(other, morphism)
1068
+
1069
+ if self._bases_invariant3() == other._bases_invariant3():
1070
+ PHS = self._bases_partition3()
1071
+ PHO = other._bases_partition3()
1072
+ morphism = {}
1073
+ for i in range(len(self)):
1074
+ morphism[min(PHS[i])] = min(PHO[i])
1075
+ if self._is_relaxation(other, morphism):
1076
+ return True
1077
+
1078
+ return self.nonbases()._isomorphism(other.nonbases(), PS, PO) is not None
1079
+
1080
+ def __hash__(self):
1081
+ r"""
1082
+ Return an invariant of the matroid.
1083
+
1084
+ This function is called when matroids are added to a set. It is very
1085
+ desirable to override it so it can distinguish matroids on the same
1086
+ groundset, which is a very typical use case!
1087
+
1088
+ .. WARNING::
1089
+
1090
+ This method is linked to ``__richcmp__`` (in Cython) and ``__cmp__``
1091
+ or ``__eq__``/``__ne__`` (in Python). If you override one, you
1092
+ should (and, in Cython, \emph{must}) override the other!
1093
+
1094
+ EXAMPLES::
1095
+
1096
+ sage: from sage.matroids.advanced import *
1097
+ sage: M = BasisMatroid(matroids.catalog.Fano())
1098
+ sage: N = BasisMatroid(matroids.catalog.Fano().dual()).dual()
1099
+ sage: O = BasisMatroid(matroids.catalog.NonFano())
1100
+ sage: hash(M) == hash(N)
1101
+ True
1102
+ sage: hash(M) == hash(O)
1103
+ False
1104
+ """
1105
+ return hash((self.groundset(), self.bases_count(), self._weak_invariant()))
1106
+
1107
+ def __richcmp__(left, right, int op):
1108
+ r"""
1109
+ Compare two matroids.
1110
+
1111
+ We take a very restricted view on equality: the objects need to be of
1112
+ the exact same type (so no subclassing) and the internal data need to
1113
+ be the same. For BasisMatroids, this means that the groundsets and the
1114
+ sets of bases of the two matroids are equal.
1115
+
1116
+ EXAMPLES::
1117
+
1118
+ sage: from sage.matroids.advanced import *
1119
+ sage: M = BasisMatroid(matroids.catalog.Pappus())
1120
+ sage: N = BasisMatroid(matroids.catalog.NonPappus())
1121
+ sage: M == N
1122
+ False
1123
+ """
1124
+ if op not in [Py_EQ, Py_NE]:
1125
+ return NotImplemented
1126
+ if type(left) is not type(right):
1127
+ return NotImplemented
1128
+ if left.equals(right):
1129
+ return rich_to_bool(op, 0)
1130
+ else:
1131
+ return rich_to_bool(op, 1)
1132
+
1133
+ def __reduce__(self):
1134
+ """
1135
+ Save the matroid for later reloading.
1136
+
1137
+ OUTPUT:
1138
+
1139
+ A tuple ``(unpickle, (version, data))``, where ``unpickle`` is the
1140
+ name of a function that, when called with ``(version, data)``,
1141
+ produces a matroid isomorphic to ``self``. ``version`` is an integer
1142
+ (currently 0) and ``data`` is a tuple ``(E, R, name, BB)`` where
1143
+ ``E`` is the groundset of the matroid, ``R`` is the rank, ``name`` is a
1144
+ custom name, and ``BB`` is the bitpacked list of bases, as pickled by
1145
+ Sage's ``bitset_pickle``.
1146
+
1147
+ EXAMPLES::
1148
+
1149
+ sage: from sage.matroids.advanced import *
1150
+ sage: M = BasisMatroid(matroids.catalog.Vamos())
1151
+ sage: M == loads(dumps(M)) # indirect doctest
1152
+ True
1153
+ sage: M.rename('Vamos')
1154
+ sage: loads(dumps(M))
1155
+ Vamos
1156
+ """
1157
+ import sage.matroids.unpickling
1158
+ BB = bitset_pickle(self._bb)
1159
+ data = (self._E, self._matroid_rank, self.get_custom_name(), BB)
1160
+ version = 0
1161
+ return sage.matroids.unpickling.unpickle_basis_matroid, (version, data)
1162
+
1163
+ cdef long binom[2956][33] # Cached binomial table
1164
+
1165
+ cdef binom_init(long N, long K):
1166
+ """
1167
+ Fill up the cached binomial table.
1168
+ """
1169
+ cdef long bin
1170
+ if binom[0][0] != 1:
1171
+ binom[0][0] = 1
1172
+ binom[0][1] = 0
1173
+ for n in range(1, 2955):
1174
+ bin = 1
1175
+ k = 0
1176
+ while bin < 2 ** 32 and k <= 32 and k <= n:
1177
+ binom[n][k] = bin
1178
+ k += 1
1179
+ bin = binom[n - 1][k - 1] + binom[n - 1][k]
1180
+ while k < 33:
1181
+ binom[n][k] = 0
1182
+ k += 1
1183
+
1184
+ if N > 2954:
1185
+ raise ValueError("BasisMatroid: size of groundset exceeds 2954") # if n > 2954 and k > 2, then binomial(n, k) > 2^32
1186
+ if K > 32:
1187
+ raise ValueError("BasisMatroid: rank exceeds 32") # if n > 2954 and k > 2, then binomial(n, k) > 2^32
1188
+ if binom[N][K] == 0:
1189
+ raise ValueError("BasisMatroid: number of potential bases would exceed 2^32")
1190
+
1191
+ cdef long set_to_index(bitset_t S) noexcept:
1192
+ """
1193
+ Compute the rank of a set of integers amongst the sets of integers
1194
+ of the same cardinality.
1195
+ """
1196
+ cdef long index = 0
1197
+ cdef long count = 1
1198
+ cdef long s
1199
+ s = bitset_first(S)
1200
+ while s >= 0:
1201
+ index += binom[s][count]
1202
+ count += 1
1203
+ s = bitset_next(S, s + 1)
1204
+ return index
1205
+
1206
+ cdef index_to_set(bitset_t S, long index, long k, long n):
1207
+ r"""
1208
+ Compute the k-subset of `\{0, ..., n-1\}` of rank index.
1209
+ """
1210
+ bitset_clear(S)
1211
+ cdef long s = n
1212
+ while s > 0:
1213
+ s -= 1
1214
+ if binom[s][k] <= index:
1215
+ index = index - binom[s][k]
1216
+ k = k - 1
1217
+ bitset_add(S, s)