passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_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 (808) hide show
  1. passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
  2. passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -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-0cd532bd.so.1 +0 -0
  6. passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
  7. passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
  8. passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
  9. passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
  10. passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
  11. passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
  12. passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
  13. sage/algebras/all__sagemath_modules.py +20 -0
  14. sage/algebras/catalog.py +148 -0
  15. sage/algebras/clifford_algebra.py +3107 -0
  16. sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  17. sage/algebras/clifford_algebra_element.pxd +16 -0
  18. sage/algebras/clifford_algebra_element.pyx +997 -0
  19. sage/algebras/commutative_dga.py +4252 -0
  20. sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
  21. sage/algebras/exterior_algebra_groebner.pxd +55 -0
  22. sage/algebras/exterior_algebra_groebner.pyx +727 -0
  23. sage/algebras/finite_dimensional_algebras/all.py +2 -0
  24. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
  25. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  26. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
  27. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
  28. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
  29. sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
  30. sage/algebras/finite_gca.py +528 -0
  31. sage/algebras/group_algebra.py +232 -0
  32. sage/algebras/lie_algebras/abelian.py +197 -0
  33. sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
  34. sage/algebras/lie_algebras/all.py +25 -0
  35. sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
  36. sage/algebras/lie_algebras/bch.py +177 -0
  37. sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
  38. sage/algebras/lie_algebras/bgg_resolution.py +232 -0
  39. sage/algebras/lie_algebras/center_uea.py +767 -0
  40. sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
  41. sage/algebras/lie_algebras/examples.py +683 -0
  42. sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
  43. sage/algebras/lie_algebras/heisenberg.py +820 -0
  44. sage/algebras/lie_algebras/lie_algebra.py +1562 -0
  45. sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
  46. sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
  47. sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
  48. sage/algebras/lie_algebras/morphism.py +661 -0
  49. sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
  50. sage/algebras/lie_algebras/onsager.py +1324 -0
  51. sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
  52. sage/algebras/lie_algebras/quotient.py +462 -0
  53. sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
  54. sage/algebras/lie_algebras/representation.py +1040 -0
  55. sage/algebras/lie_algebras/structure_coefficients.py +459 -0
  56. sage/algebras/lie_algebras/subalgebra.py +967 -0
  57. sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
  58. sage/algebras/lie_algebras/verma_module.py +1630 -0
  59. sage/algebras/lie_algebras/virasoro.py +1186 -0
  60. sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
  61. sage/algebras/octonion_algebra.pxd +20 -0
  62. sage/algebras/octonion_algebra.pyx +987 -0
  63. sage/algebras/orlik_solomon.py +907 -0
  64. sage/algebras/orlik_terao.py +779 -0
  65. sage/algebras/steenrod/all.py +7 -0
  66. sage/algebras/steenrod/steenrod_algebra.py +4258 -0
  67. sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
  68. sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
  69. sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
  70. sage/algebras/weyl_algebra.py +1126 -0
  71. sage/all__sagemath_modules.py +62 -0
  72. sage/calculus/all__sagemath_modules.py +19 -0
  73. sage/calculus/expr.py +205 -0
  74. sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
  75. sage/calculus/integration.pyx +698 -0
  76. sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
  77. sage/calculus/interpolation.pxd +13 -0
  78. sage/calculus/interpolation.pyx +387 -0
  79. sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
  80. sage/calculus/interpolators.pyx +326 -0
  81. sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
  82. sage/calculus/ode.pxd +5 -0
  83. sage/calculus/ode.pyx +610 -0
  84. sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
  85. sage/calculus/riemann.pyx +1521 -0
  86. sage/calculus/test_sympy.py +201 -0
  87. sage/calculus/transforms/all.py +7 -0
  88. sage/calculus/transforms/dft.py +844 -0
  89. sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
  90. sage/calculus/transforms/dwt.pxd +7 -0
  91. sage/calculus/transforms/dwt.pyx +160 -0
  92. sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
  93. sage/calculus/transforms/fft.pxd +12 -0
  94. sage/calculus/transforms/fft.pyx +487 -0
  95. sage/calculus/wester.py +662 -0
  96. sage/coding/abstract_code.py +1108 -0
  97. sage/coding/ag_code.py +868 -0
  98. sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
  99. sage/coding/ag_code_decoders.pyx +2639 -0
  100. sage/coding/all.py +15 -0
  101. sage/coding/bch_code.py +494 -0
  102. sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
  103. sage/coding/binary_code.pxd +124 -0
  104. sage/coding/binary_code.pyx +4139 -0
  105. sage/coding/bounds_catalog.py +43 -0
  106. sage/coding/channel.py +819 -0
  107. sage/coding/channels_catalog.py +29 -0
  108. sage/coding/code_bounds.py +755 -0
  109. sage/coding/code_constructions.py +804 -0
  110. sage/coding/codes_catalog.py +111 -0
  111. sage/coding/cyclic_code.py +1329 -0
  112. sage/coding/databases.py +316 -0
  113. sage/coding/decoder.py +373 -0
  114. sage/coding/decoders_catalog.py +88 -0
  115. sage/coding/delsarte_bounds.py +709 -0
  116. sage/coding/encoder.py +390 -0
  117. sage/coding/encoders_catalog.py +64 -0
  118. sage/coding/extended_code.py +468 -0
  119. sage/coding/gabidulin_code.py +1058 -0
  120. sage/coding/golay_code.py +404 -0
  121. sage/coding/goppa_code.py +441 -0
  122. sage/coding/grs_code.py +2371 -0
  123. sage/coding/guava.py +107 -0
  124. sage/coding/guruswami_sudan/all.py +1 -0
  125. sage/coding/guruswami_sudan/gs_decoder.py +897 -0
  126. sage/coding/guruswami_sudan/interpolation.py +409 -0
  127. sage/coding/guruswami_sudan/utils.py +176 -0
  128. sage/coding/hamming_code.py +176 -0
  129. sage/coding/information_set_decoder.py +1032 -0
  130. sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
  131. sage/coding/kasami_codes.pyx +351 -0
  132. sage/coding/linear_code.py +3067 -0
  133. sage/coding/linear_code_no_metric.py +1354 -0
  134. sage/coding/linear_rank_metric.py +961 -0
  135. sage/coding/parity_check_code.py +353 -0
  136. sage/coding/punctured_code.py +719 -0
  137. sage/coding/reed_muller_code.py +999 -0
  138. sage/coding/self_dual_codes.py +942 -0
  139. sage/coding/source_coding/all.py +2 -0
  140. sage/coding/source_coding/huffman.py +553 -0
  141. sage/coding/subfield_subcode.py +423 -0
  142. sage/coding/two_weight_db.py +399 -0
  143. sage/combinat/all__sagemath_modules.py +7 -0
  144. sage/combinat/cartesian_product.py +347 -0
  145. sage/combinat/family.py +11 -0
  146. sage/combinat/free_module.py +1977 -0
  147. sage/combinat/root_system/all.py +147 -0
  148. sage/combinat/root_system/ambient_space.py +527 -0
  149. sage/combinat/root_system/associahedron.py +471 -0
  150. sage/combinat/root_system/braid_move_calculator.py +143 -0
  151. sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
  152. sage/combinat/root_system/braid_orbit.pyx +144 -0
  153. sage/combinat/root_system/branching_rules.py +2301 -0
  154. sage/combinat/root_system/cartan_matrix.py +1245 -0
  155. sage/combinat/root_system/cartan_type.py +3069 -0
  156. sage/combinat/root_system/coxeter_group.py +162 -0
  157. sage/combinat/root_system/coxeter_matrix.py +1261 -0
  158. sage/combinat/root_system/coxeter_type.py +681 -0
  159. sage/combinat/root_system/dynkin_diagram.py +900 -0
  160. sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
  161. sage/combinat/root_system/fundamental_group.py +795 -0
  162. sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
  163. sage/combinat/root_system/integrable_representations.py +1227 -0
  164. sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
  165. sage/combinat/root_system/pieri_factors.py +1147 -0
  166. sage/combinat/root_system/plot.py +1615 -0
  167. sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
  168. sage/combinat/root_system/root_lattice_realizations.py +4628 -0
  169. sage/combinat/root_system/root_space.py +487 -0
  170. sage/combinat/root_system/root_system.py +882 -0
  171. sage/combinat/root_system/type_A.py +348 -0
  172. sage/combinat/root_system/type_A_affine.py +227 -0
  173. sage/combinat/root_system/type_A_infinity.py +241 -0
  174. sage/combinat/root_system/type_B.py +347 -0
  175. sage/combinat/root_system/type_BC_affine.py +287 -0
  176. sage/combinat/root_system/type_B_affine.py +216 -0
  177. sage/combinat/root_system/type_C.py +317 -0
  178. sage/combinat/root_system/type_C_affine.py +188 -0
  179. sage/combinat/root_system/type_D.py +357 -0
  180. sage/combinat/root_system/type_D_affine.py +208 -0
  181. sage/combinat/root_system/type_E.py +641 -0
  182. sage/combinat/root_system/type_E_affine.py +231 -0
  183. sage/combinat/root_system/type_F.py +387 -0
  184. sage/combinat/root_system/type_F_affine.py +137 -0
  185. sage/combinat/root_system/type_G.py +293 -0
  186. sage/combinat/root_system/type_G_affine.py +132 -0
  187. sage/combinat/root_system/type_H.py +105 -0
  188. sage/combinat/root_system/type_I.py +110 -0
  189. sage/combinat/root_system/type_Q.py +150 -0
  190. sage/combinat/root_system/type_affine.py +509 -0
  191. sage/combinat/root_system/type_dual.py +704 -0
  192. sage/combinat/root_system/type_folded.py +301 -0
  193. sage/combinat/root_system/type_marked.py +748 -0
  194. sage/combinat/root_system/type_reducible.py +601 -0
  195. sage/combinat/root_system/type_relabel.py +730 -0
  196. sage/combinat/root_system/type_super_A.py +837 -0
  197. sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
  198. sage/combinat/root_system/weight_space.py +639 -0
  199. sage/combinat/root_system/weyl_characters.py +2238 -0
  200. sage/crypto/__init__.py +4 -0
  201. sage/crypto/all.py +28 -0
  202. sage/crypto/block_cipher/all.py +7 -0
  203. sage/crypto/block_cipher/des.py +1065 -0
  204. sage/crypto/block_cipher/miniaes.py +2171 -0
  205. sage/crypto/block_cipher/present.py +909 -0
  206. sage/crypto/block_cipher/sdes.py +1527 -0
  207. sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
  208. sage/crypto/boolean_function.pxd +10 -0
  209. sage/crypto/boolean_function.pyx +1487 -0
  210. sage/crypto/cipher.py +78 -0
  211. sage/crypto/classical.py +3668 -0
  212. sage/crypto/classical_cipher.py +569 -0
  213. sage/crypto/cryptosystem.py +387 -0
  214. sage/crypto/key_exchange/all.py +7 -0
  215. sage/crypto/key_exchange/catalog.py +24 -0
  216. sage/crypto/key_exchange/diffie_hellman.py +323 -0
  217. sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
  218. sage/crypto/lattice.py +312 -0
  219. sage/crypto/lfsr.py +295 -0
  220. sage/crypto/lwe.py +840 -0
  221. sage/crypto/mq/__init__.py +4 -0
  222. sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
  223. sage/crypto/mq/rijndael_gf.py +2345 -0
  224. sage/crypto/mq/sbox.py +7 -0
  225. sage/crypto/mq/sr.py +3344 -0
  226. sage/crypto/public_key/all.py +5 -0
  227. sage/crypto/public_key/blum_goldwasser.py +776 -0
  228. sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
  229. sage/crypto/sbox.pyx +2090 -0
  230. sage/crypto/sboxes.py +2090 -0
  231. sage/crypto/stream.py +390 -0
  232. sage/crypto/stream_cipher.py +297 -0
  233. sage/crypto/util.py +519 -0
  234. sage/ext/all__sagemath_modules.py +1 -0
  235. sage/ext/interpreters/__init__.py +1 -0
  236. sage/ext/interpreters/all__sagemath_modules.py +2 -0
  237. sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
  238. sage/ext/interpreters/wrapper_cc.pxd +30 -0
  239. sage/ext/interpreters/wrapper_cc.pyx +252 -0
  240. sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
  241. sage/ext/interpreters/wrapper_cdf.pxd +26 -0
  242. sage/ext/interpreters/wrapper_cdf.pyx +245 -0
  243. sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
  244. sage/ext/interpreters/wrapper_rdf.pxd +23 -0
  245. sage/ext/interpreters/wrapper_rdf.pyx +221 -0
  246. sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
  247. sage/ext/interpreters/wrapper_rr.pxd +28 -0
  248. sage/ext/interpreters/wrapper_rr.pyx +335 -0
  249. sage/geometry/all__sagemath_modules.py +5 -0
  250. sage/geometry/toric_lattice.py +1745 -0
  251. sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
  252. sage/geometry/toric_lattice_element.pyx +432 -0
  253. sage/groups/abelian_gps/abelian_group.py +1925 -0
  254. sage/groups/abelian_gps/abelian_group_element.py +164 -0
  255. sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
  256. sage/groups/abelian_gps/dual_abelian_group.py +421 -0
  257. sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
  258. sage/groups/abelian_gps/element_base.py +341 -0
  259. sage/groups/abelian_gps/values.py +488 -0
  260. sage/groups/additive_abelian/additive_abelian_group.py +476 -0
  261. sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
  262. sage/groups/additive_abelian/all.py +4 -0
  263. sage/groups/additive_abelian/qmodnz.py +231 -0
  264. sage/groups/additive_abelian/qmodnz_element.py +349 -0
  265. sage/groups/affine_gps/affine_group.py +535 -0
  266. sage/groups/affine_gps/all.py +1 -0
  267. sage/groups/affine_gps/catalog.py +17 -0
  268. sage/groups/affine_gps/euclidean_group.py +246 -0
  269. sage/groups/affine_gps/group_element.py +562 -0
  270. sage/groups/all__sagemath_modules.py +12 -0
  271. sage/groups/galois_group.py +479 -0
  272. sage/groups/matrix_gps/all.py +4 -0
  273. sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
  274. sage/groups/matrix_gps/catalog.py +26 -0
  275. sage/groups/matrix_gps/coxeter_group.py +927 -0
  276. sage/groups/matrix_gps/finitely_generated.py +487 -0
  277. sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
  278. sage/groups/matrix_gps/group_element.pxd +11 -0
  279. sage/groups/matrix_gps/group_element.pyx +431 -0
  280. sage/groups/matrix_gps/linear.py +440 -0
  281. sage/groups/matrix_gps/matrix_group.py +617 -0
  282. sage/groups/matrix_gps/named_group.py +296 -0
  283. sage/groups/matrix_gps/orthogonal.py +544 -0
  284. sage/groups/matrix_gps/symplectic.py +251 -0
  285. sage/groups/matrix_gps/unitary.py +436 -0
  286. sage/groups/misc_gps/all__sagemath_modules.py +1 -0
  287. sage/groups/misc_gps/argument_groups.py +1905 -0
  288. sage/groups/misc_gps/imaginary_groups.py +479 -0
  289. sage/groups/perm_gps/all__sagemath_modules.py +1 -0
  290. sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
  291. sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
  292. sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
  293. sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
  294. sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
  295. sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
  296. sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
  297. sage/homology/algebraic_topological_model.py +595 -0
  298. sage/homology/all.py +2 -0
  299. sage/homology/all__sagemath_modules.py +8 -0
  300. sage/homology/chain_complex.py +2148 -0
  301. sage/homology/chain_complex_homspace.py +165 -0
  302. sage/homology/chain_complex_morphism.py +629 -0
  303. sage/homology/chain_homotopy.py +604 -0
  304. sage/homology/chains.py +653 -0
  305. sage/homology/free_resolution.py +923 -0
  306. sage/homology/graded_resolution.py +567 -0
  307. sage/homology/hochschild_complex.py +756 -0
  308. sage/homology/homology_group.py +188 -0
  309. sage/homology/homology_morphism.py +422 -0
  310. sage/homology/homology_vector_space_with_basis.py +1454 -0
  311. sage/homology/koszul_complex.py +169 -0
  312. sage/homology/matrix_utils.py +205 -0
  313. sage/libs/all__sagemath_modules.py +1 -0
  314. sage/libs/gsl/__init__.py +1 -0
  315. sage/libs/gsl/airy.pxd +56 -0
  316. sage/libs/gsl/all.pxd +66 -0
  317. sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
  318. sage/libs/gsl/array.pxd +5 -0
  319. sage/libs/gsl/array.pyx +102 -0
  320. sage/libs/gsl/bessel.pxd +208 -0
  321. sage/libs/gsl/blas.pxd +116 -0
  322. sage/libs/gsl/blas_types.pxd +34 -0
  323. sage/libs/gsl/block.pxd +52 -0
  324. sage/libs/gsl/chebyshev.pxd +37 -0
  325. sage/libs/gsl/clausen.pxd +12 -0
  326. sage/libs/gsl/combination.pxd +47 -0
  327. sage/libs/gsl/complex.pxd +151 -0
  328. sage/libs/gsl/coulomb.pxd +30 -0
  329. sage/libs/gsl/coupling.pxd +21 -0
  330. sage/libs/gsl/dawson.pxd +12 -0
  331. sage/libs/gsl/debye.pxd +24 -0
  332. sage/libs/gsl/dilog.pxd +14 -0
  333. sage/libs/gsl/eigen.pxd +46 -0
  334. sage/libs/gsl/elementary.pxd +12 -0
  335. sage/libs/gsl/ellint.pxd +48 -0
  336. sage/libs/gsl/elljac.pxd +8 -0
  337. sage/libs/gsl/erf.pxd +32 -0
  338. sage/libs/gsl/errno.pxd +26 -0
  339. sage/libs/gsl/exp.pxd +44 -0
  340. sage/libs/gsl/expint.pxd +44 -0
  341. sage/libs/gsl/fermi_dirac.pxd +44 -0
  342. sage/libs/gsl/fft.pxd +121 -0
  343. sage/libs/gsl/fit.pxd +50 -0
  344. sage/libs/gsl/gamma.pxd +94 -0
  345. sage/libs/gsl/gegenbauer.pxd +26 -0
  346. sage/libs/gsl/histogram.pxd +176 -0
  347. sage/libs/gsl/hyperg.pxd +52 -0
  348. sage/libs/gsl/integration.pxd +69 -0
  349. sage/libs/gsl/interp.pxd +109 -0
  350. sage/libs/gsl/laguerre.pxd +24 -0
  351. sage/libs/gsl/lambert.pxd +16 -0
  352. sage/libs/gsl/legendre.pxd +90 -0
  353. sage/libs/gsl/linalg.pxd +185 -0
  354. sage/libs/gsl/log.pxd +26 -0
  355. sage/libs/gsl/math.pxd +43 -0
  356. sage/libs/gsl/matrix.pxd +143 -0
  357. sage/libs/gsl/matrix_complex.pxd +130 -0
  358. sage/libs/gsl/min.pxd +67 -0
  359. sage/libs/gsl/monte.pxd +56 -0
  360. sage/libs/gsl/ntuple.pxd +32 -0
  361. sage/libs/gsl/odeiv.pxd +70 -0
  362. sage/libs/gsl/permutation.pxd +78 -0
  363. sage/libs/gsl/poly.pxd +40 -0
  364. sage/libs/gsl/pow_int.pxd +12 -0
  365. sage/libs/gsl/psi.pxd +28 -0
  366. sage/libs/gsl/qrng.pxd +29 -0
  367. sage/libs/gsl/random.pxd +257 -0
  368. sage/libs/gsl/rng.pxd +100 -0
  369. sage/libs/gsl/roots.pxd +72 -0
  370. sage/libs/gsl/sort.pxd +36 -0
  371. sage/libs/gsl/statistics.pxd +59 -0
  372. sage/libs/gsl/sum.pxd +55 -0
  373. sage/libs/gsl/synchrotron.pxd +16 -0
  374. sage/libs/gsl/transport.pxd +24 -0
  375. sage/libs/gsl/trig.pxd +58 -0
  376. sage/libs/gsl/types.pxd +137 -0
  377. sage/libs/gsl/vector.pxd +101 -0
  378. sage/libs/gsl/vector_complex.pxd +83 -0
  379. sage/libs/gsl/wavelet.pxd +49 -0
  380. sage/libs/gsl/zeta.pxd +28 -0
  381. sage/libs/mpc/__init__.pxd +114 -0
  382. sage/libs/mpc/types.pxd +28 -0
  383. sage/libs/mpfr/__init__.pxd +299 -0
  384. sage/libs/mpfr/types.pxd +26 -0
  385. sage/libs/mpmath/__init__.py +1 -0
  386. sage/libs/mpmath/all.py +27 -0
  387. sage/libs/mpmath/all__sagemath_modules.py +1 -0
  388. sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
  389. sage/libs/mpmath/utils.pxd +4 -0
  390. sage/libs/mpmath/utils.pyx +319 -0
  391. sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
  392. sage/matrix/action.pxd +26 -0
  393. sage/matrix/action.pyx +596 -0
  394. sage/matrix/all.py +9 -0
  395. sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
  396. sage/matrix/args.pxd +144 -0
  397. sage/matrix/args.pyx +1668 -0
  398. sage/matrix/benchmark.py +1258 -0
  399. sage/matrix/berlekamp_massey.py +95 -0
  400. sage/matrix/compute_J_ideal.py +926 -0
  401. sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
  402. sage/matrix/constructor.pyx +750 -0
  403. sage/matrix/docs.py +430 -0
  404. sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  405. sage/matrix/echelon_matrix.pyx +155 -0
  406. sage/matrix/matrix.pxd +2 -0
  407. sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
  408. sage/matrix/matrix0.pxd +68 -0
  409. sage/matrix/matrix0.pyx +6324 -0
  410. sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
  411. sage/matrix/matrix1.pxd +8 -0
  412. sage/matrix/matrix1.pyx +2851 -0
  413. sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
  414. sage/matrix/matrix2.pxd +25 -0
  415. sage/matrix/matrix2.pyx +20181 -0
  416. sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
  417. sage/matrix/matrix_cdv.pxd +4 -0
  418. sage/matrix/matrix_cdv.pyx +93 -0
  419. sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  420. sage/matrix/matrix_complex_double_dense.pxd +5 -0
  421. sage/matrix/matrix_complex_double_dense.pyx +98 -0
  422. sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
  423. sage/matrix/matrix_dense.pxd +5 -0
  424. sage/matrix/matrix_dense.pyx +343 -0
  425. sage/matrix/matrix_domain_dense.pxd +5 -0
  426. sage/matrix/matrix_domain_sparse.pxd +5 -0
  427. sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  428. sage/matrix/matrix_double_dense.pxd +7 -0
  429. sage/matrix/matrix_double_dense.pyx +3906 -0
  430. sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  431. sage/matrix/matrix_double_sparse.pxd +6 -0
  432. sage/matrix/matrix_double_sparse.pyx +248 -0
  433. sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
  434. sage/matrix/matrix_generic_dense.pxd +7 -0
  435. sage/matrix/matrix_generic_dense.pyx +354 -0
  436. sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  437. sage/matrix/matrix_generic_sparse.pxd +7 -0
  438. sage/matrix/matrix_generic_sparse.pyx +461 -0
  439. sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  440. sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
  441. sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
  442. sage/matrix/matrix_misc.py +313 -0
  443. sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  444. sage/matrix/matrix_numpy_dense.pxd +14 -0
  445. sage/matrix/matrix_numpy_dense.pyx +450 -0
  446. sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  447. sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
  448. sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
  449. sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
  450. sage/matrix/matrix_polynomial_dense.pxd +5 -0
  451. sage/matrix/matrix_polynomial_dense.pyx +5341 -0
  452. sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  453. sage/matrix/matrix_real_double_dense.pxd +7 -0
  454. sage/matrix/matrix_real_double_dense.pyx +122 -0
  455. sage/matrix/matrix_space.py +2848 -0
  456. sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  457. sage/matrix/matrix_sparse.pxd +5 -0
  458. sage/matrix/matrix_sparse.pyx +1222 -0
  459. sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
  460. sage/matrix/matrix_window.pxd +37 -0
  461. sage/matrix/matrix_window.pyx +242 -0
  462. sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  463. sage/matrix/misc_mpfr.pyx +80 -0
  464. sage/matrix/operation_table.py +1182 -0
  465. sage/matrix/special.py +3666 -0
  466. sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
  467. sage/matrix/strassen.pyx +851 -0
  468. sage/matrix/symplectic_basis.py +541 -0
  469. sage/matrix/template.pxd +6 -0
  470. sage/matrix/tests.py +71 -0
  471. sage/matroids/advanced.py +77 -0
  472. sage/matroids/all.py +13 -0
  473. sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  474. sage/matroids/basis_exchange_matroid.pxd +96 -0
  475. sage/matroids/basis_exchange_matroid.pyx +2344 -0
  476. sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  477. sage/matroids/basis_matroid.pxd +45 -0
  478. sage/matroids/basis_matroid.pyx +1217 -0
  479. sage/matroids/catalog.py +44 -0
  480. sage/matroids/chow_ring.py +473 -0
  481. sage/matroids/chow_ring_ideal.py +849 -0
  482. sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  483. sage/matroids/circuit_closures_matroid.pxd +16 -0
  484. sage/matroids/circuit_closures_matroid.pyx +559 -0
  485. sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  486. sage/matroids/circuits_matroid.pxd +38 -0
  487. sage/matroids/circuits_matroid.pyx +947 -0
  488. sage/matroids/constructor.py +1086 -0
  489. sage/matroids/database_collections.py +365 -0
  490. sage/matroids/database_matroids.py +5338 -0
  491. sage/matroids/dual_matroid.py +583 -0
  492. sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
  493. sage/matroids/extension.pxd +34 -0
  494. sage/matroids/extension.pyx +519 -0
  495. sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  496. sage/matroids/flats_matroid.pxd +28 -0
  497. sage/matroids/flats_matroid.pyx +715 -0
  498. sage/matroids/gammoid.py +600 -0
  499. sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  500. sage/matroids/graphic_matroid.pxd +39 -0
  501. sage/matroids/graphic_matroid.pyx +2024 -0
  502. sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
  503. sage/matroids/lean_matrix.pxd +126 -0
  504. sage/matroids/lean_matrix.pyx +3667 -0
  505. sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  506. sage/matroids/linear_matroid.pxd +180 -0
  507. sage/matroids/linear_matroid.pyx +6649 -0
  508. sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
  509. sage/matroids/matroid.pxd +243 -0
  510. sage/matroids/matroid.pyx +8759 -0
  511. sage/matroids/matroids_catalog.py +190 -0
  512. sage/matroids/matroids_plot_helpers.py +890 -0
  513. sage/matroids/minor_matroid.py +480 -0
  514. sage/matroids/minorfix.h +9 -0
  515. sage/matroids/named_matroids.py +5 -0
  516. sage/matroids/rank_matroid.py +268 -0
  517. sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
  518. sage/matroids/set_system.pxd +38 -0
  519. sage/matroids/set_system.pyx +800 -0
  520. sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  521. sage/matroids/transversal_matroid.pxd +14 -0
  522. sage/matroids/transversal_matroid.pyx +893 -0
  523. sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
  524. sage/matroids/union_matroid.pxd +20 -0
  525. sage/matroids/union_matroid.pyx +331 -0
  526. sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
  527. sage/matroids/unpickling.pyx +843 -0
  528. sage/matroids/utilities.py +809 -0
  529. sage/misc/all__sagemath_modules.py +20 -0
  530. sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
  531. sage/misc/c3.pyx +238 -0
  532. sage/misc/compat.py +87 -0
  533. sage/misc/element_with_label.py +173 -0
  534. sage/misc/func_persist.py +79 -0
  535. sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
  536. sage/misc/pickle_old.pyx +19 -0
  537. sage/misc/proof.py +7 -0
  538. sage/misc/replace_dot_all.py +472 -0
  539. sage/misc/sagedoc_conf.py +168 -0
  540. sage/misc/sphinxify.py +167 -0
  541. sage/misc/test_class_pickling.py +85 -0
  542. sage/modules/all.py +42 -0
  543. sage/modules/complex_double_vector.py +25 -0
  544. sage/modules/diamond_cutting.py +380 -0
  545. sage/modules/fg_pid/all.py +1 -0
  546. sage/modules/fg_pid/fgp_element.py +456 -0
  547. sage/modules/fg_pid/fgp_module.py +2091 -0
  548. sage/modules/fg_pid/fgp_morphism.py +550 -0
  549. sage/modules/filtered_vector_space.py +1271 -0
  550. sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
  551. sage/modules/finite_submodule_iter.pxd +27 -0
  552. sage/modules/finite_submodule_iter.pyx +452 -0
  553. sage/modules/fp_graded/all.py +1 -0
  554. sage/modules/fp_graded/element.py +346 -0
  555. sage/modules/fp_graded/free_element.py +298 -0
  556. sage/modules/fp_graded/free_homspace.py +53 -0
  557. sage/modules/fp_graded/free_module.py +1060 -0
  558. sage/modules/fp_graded/free_morphism.py +217 -0
  559. sage/modules/fp_graded/homspace.py +563 -0
  560. sage/modules/fp_graded/module.py +1340 -0
  561. sage/modules/fp_graded/morphism.py +1990 -0
  562. sage/modules/fp_graded/steenrod/all.py +1 -0
  563. sage/modules/fp_graded/steenrod/homspace.py +65 -0
  564. sage/modules/fp_graded/steenrod/module.py +477 -0
  565. sage/modules/fp_graded/steenrod/morphism.py +404 -0
  566. sage/modules/fp_graded/steenrod/profile.py +241 -0
  567. sage/modules/free_module.py +8447 -0
  568. sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
  569. sage/modules/free_module_element.pxd +22 -0
  570. sage/modules/free_module_element.pyx +5445 -0
  571. sage/modules/free_module_homspace.py +369 -0
  572. sage/modules/free_module_integer.py +896 -0
  573. sage/modules/free_module_morphism.py +823 -0
  574. sage/modules/free_module_pseudohomspace.py +352 -0
  575. sage/modules/free_module_pseudomorphism.py +578 -0
  576. sage/modules/free_quadratic_module.py +1706 -0
  577. sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
  578. sage/modules/matrix_morphism.py +1745 -0
  579. sage/modules/misc.py +103 -0
  580. sage/modules/module_functors.py +192 -0
  581. sage/modules/multi_filtered_vector_space.py +719 -0
  582. sage/modules/ore_module.py +2208 -0
  583. sage/modules/ore_module_element.py +178 -0
  584. sage/modules/ore_module_homspace.py +147 -0
  585. sage/modules/ore_module_morphism.py +968 -0
  586. sage/modules/quotient_module.py +699 -0
  587. sage/modules/real_double_vector.py +22 -0
  588. sage/modules/submodule.py +255 -0
  589. sage/modules/tensor_operations.py +567 -0
  590. sage/modules/torsion_quadratic_module.py +1352 -0
  591. sage/modules/tutorial_free_modules.py +248 -0
  592. sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  593. sage/modules/vector_complex_double_dense.pxd +6 -0
  594. sage/modules/vector_complex_double_dense.pyx +117 -0
  595. sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  596. sage/modules/vector_double_dense.pxd +6 -0
  597. sage/modules/vector_double_dense.pyx +604 -0
  598. sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  599. sage/modules/vector_integer_dense.pxd +15 -0
  600. sage/modules/vector_integer_dense.pyx +361 -0
  601. sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  602. sage/modules/vector_integer_sparse.pxd +29 -0
  603. sage/modules/vector_integer_sparse.pyx +406 -0
  604. sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
  605. sage/modules/vector_modn_dense.pxd +12 -0
  606. sage/modules/vector_modn_dense.pyx +394 -0
  607. sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  608. sage/modules/vector_modn_sparse.pxd +21 -0
  609. sage/modules/vector_modn_sparse.pyx +298 -0
  610. sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
  611. sage/modules/vector_numpy_dense.pxd +15 -0
  612. sage/modules/vector_numpy_dense.pyx +304 -0
  613. sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
  614. sage/modules/vector_numpy_integer_dense.pxd +7 -0
  615. sage/modules/vector_numpy_integer_dense.pyx +54 -0
  616. sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
  617. sage/modules/vector_rational_dense.pxd +15 -0
  618. sage/modules/vector_rational_dense.pyx +387 -0
  619. sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
  620. sage/modules/vector_rational_sparse.pxd +30 -0
  621. sage/modules/vector_rational_sparse.pyx +413 -0
  622. sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
  623. sage/modules/vector_real_double_dense.pxd +6 -0
  624. sage/modules/vector_real_double_dense.pyx +126 -0
  625. sage/modules/vector_space_homspace.py +430 -0
  626. sage/modules/vector_space_morphism.py +989 -0
  627. sage/modules/with_basis/all.py +15 -0
  628. sage/modules/with_basis/cell_module.py +494 -0
  629. sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
  630. sage/modules/with_basis/indexed_element.pxd +13 -0
  631. sage/modules/with_basis/indexed_element.pyx +1058 -0
  632. sage/modules/with_basis/invariant.py +1075 -0
  633. sage/modules/with_basis/morphism.py +1636 -0
  634. sage/modules/with_basis/representation.py +2939 -0
  635. sage/modules/with_basis/subquotient.py +685 -0
  636. sage/numerical/all__sagemath_modules.py +6 -0
  637. sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
  638. sage/numerical/gauss_legendre.pyx +381 -0
  639. sage/numerical/optimize.py +910 -0
  640. sage/probability/all.py +10 -0
  641. sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
  642. sage/probability/probability_distribution.pyx +1242 -0
  643. sage/probability/random_variable.py +411 -0
  644. sage/quadratic_forms/all.py +4 -0
  645. sage/quadratic_forms/all__sagemath_modules.py +15 -0
  646. sage/quadratic_forms/binary_qf.py +2042 -0
  647. sage/quadratic_forms/bqf_class_group.py +748 -0
  648. sage/quadratic_forms/constructions.py +93 -0
  649. sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
  650. sage/quadratic_forms/count_local_2.pyx +365 -0
  651. sage/quadratic_forms/extras.py +195 -0
  652. sage/quadratic_forms/quadratic_form.py +1753 -0
  653. sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
  654. sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
  655. sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
  656. sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
  657. sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
  658. sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
  659. sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
  660. sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
  661. sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
  662. sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
  663. sage/quadratic_forms/quadratic_form__theta.py +352 -0
  664. sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
  665. sage/quadratic_forms/random_quadraticform.py +209 -0
  666. sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
  667. sage/quadratic_forms/ternary.pyx +1154 -0
  668. sage/quadratic_forms/ternary_qf.py +2027 -0
  669. sage/rings/all__sagemath_modules.py +28 -0
  670. sage/rings/asymptotic/all__sagemath_modules.py +1 -0
  671. sage/rings/asymptotic/misc.py +1252 -0
  672. sage/rings/cc.py +4 -0
  673. sage/rings/cfinite_sequence.py +1306 -0
  674. sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  675. sage/rings/complex_conversion.pxd +8 -0
  676. sage/rings/complex_conversion.pyx +23 -0
  677. sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
  678. sage/rings/complex_double.pxd +21 -0
  679. sage/rings/complex_double.pyx +2654 -0
  680. sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
  681. sage/rings/complex_mpc.pxd +21 -0
  682. sage/rings/complex_mpc.pyx +2576 -0
  683. sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  684. sage/rings/complex_mpfr.pxd +18 -0
  685. sage/rings/complex_mpfr.pyx +3602 -0
  686. sage/rings/derivation.py +2334 -0
  687. sage/rings/finite_rings/all__sagemath_modules.py +1 -0
  688. sage/rings/finite_rings/maps_finite_field.py +191 -0
  689. sage/rings/function_field/all__sagemath_modules.py +8 -0
  690. sage/rings/function_field/derivations.py +102 -0
  691. sage/rings/function_field/derivations_rational.py +132 -0
  692. sage/rings/function_field/differential.py +853 -0
  693. sage/rings/function_field/divisor.py +1107 -0
  694. sage/rings/function_field/drinfeld_modules/action.py +199 -0
  695. sage/rings/function_field/drinfeld_modules/all.py +1 -0
  696. sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
  697. sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
  698. sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
  699. sage/rings/function_field/drinfeld_modules/homset.py +420 -0
  700. sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
  701. sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
  702. sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
  703. sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
  704. sage/rings/function_field/khuri_makdisi.pyx +935 -0
  705. sage/rings/invariants/all.py +4 -0
  706. sage/rings/invariants/invariant_theory.py +4597 -0
  707. sage/rings/invariants/reconstruction.py +395 -0
  708. sage/rings/polynomial/all__sagemath_modules.py +17 -0
  709. sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
  710. sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
  711. sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
  712. sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
  713. sage/rings/polynomial/ore_function_element.py +952 -0
  714. sage/rings/polynomial/ore_function_field.py +1028 -0
  715. sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  716. sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
  717. sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
  718. sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
  719. sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
  720. sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
  721. sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
  722. sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
  723. sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
  724. sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
  725. sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
  726. sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
  727. sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
  728. sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
  729. sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
  730. sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
  731. sage/rings/polynomial/skew_polynomial_ring.py +908 -0
  732. sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
  733. sage/rings/real_double_element_gsl.pxd +8 -0
  734. sage/rings/real_double_element_gsl.pyx +794 -0
  735. sage/rings/real_field.py +58 -0
  736. sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
  737. sage/rings/real_mpfr.pxd +29 -0
  738. sage/rings/real_mpfr.pyx +6122 -0
  739. sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
  740. sage/rings/ring_extension.pxd +42 -0
  741. sage/rings/ring_extension.pyx +2779 -0
  742. sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
  743. sage/rings/ring_extension_conversion.pxd +16 -0
  744. sage/rings/ring_extension_conversion.pyx +462 -0
  745. sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
  746. sage/rings/ring_extension_element.pxd +21 -0
  747. sage/rings/ring_extension_element.pyx +1635 -0
  748. sage/rings/ring_extension_homset.py +64 -0
  749. sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
  750. sage/rings/ring_extension_morphism.pxd +35 -0
  751. sage/rings/ring_extension_morphism.pyx +920 -0
  752. sage/schemes/all__sagemath_modules.py +1 -0
  753. sage/schemes/projective/all__sagemath_modules.py +1 -0
  754. sage/schemes/projective/coherent_sheaf.py +300 -0
  755. sage/schemes/projective/cohomology.py +510 -0
  756. sage/stats/all.py +15 -0
  757. sage/stats/basic_stats.py +489 -0
  758. sage/stats/distributions/all.py +7 -0
  759. sage/stats/distributions/catalog.py +34 -0
  760. sage/stats/distributions/dgs.h +50 -0
  761. sage/stats/distributions/dgs.pxd +111 -0
  762. sage/stats/distributions/dgs_bern.h +400 -0
  763. sage/stats/distributions/dgs_gauss.h +614 -0
  764. sage/stats/distributions/dgs_misc.h +104 -0
  765. sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
  766. sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
  767. sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
  768. sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
  769. sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
  770. sage/stats/hmm/all.py +15 -0
  771. sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
  772. sage/stats/hmm/chmm.pyx +1595 -0
  773. sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
  774. sage/stats/hmm/distributions.pxd +29 -0
  775. sage/stats/hmm/distributions.pyx +531 -0
  776. sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
  777. sage/stats/hmm/hmm.pxd +17 -0
  778. sage/stats/hmm/hmm.pyx +1388 -0
  779. sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
  780. sage/stats/hmm/util.pxd +7 -0
  781. sage/stats/hmm/util.pyx +165 -0
  782. sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
  783. sage/stats/intlist.pxd +14 -0
  784. sage/stats/intlist.pyx +588 -0
  785. sage/stats/r.py +49 -0
  786. sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
  787. sage/stats/time_series.pxd +6 -0
  788. sage/stats/time_series.pyx +2546 -0
  789. sage/tensor/all.py +2 -0
  790. sage/tensor/modules/all.py +8 -0
  791. sage/tensor/modules/alternating_contr_tensor.py +761 -0
  792. sage/tensor/modules/comp.py +5598 -0
  793. sage/tensor/modules/ext_pow_free_module.py +824 -0
  794. sage/tensor/modules/finite_rank_free_module.py +3589 -0
  795. sage/tensor/modules/format_utilities.py +333 -0
  796. sage/tensor/modules/free_module_alt_form.py +858 -0
  797. sage/tensor/modules/free_module_automorphism.py +1207 -0
  798. sage/tensor/modules/free_module_basis.py +1074 -0
  799. sage/tensor/modules/free_module_element.py +284 -0
  800. sage/tensor/modules/free_module_homset.py +652 -0
  801. sage/tensor/modules/free_module_linear_group.py +564 -0
  802. sage/tensor/modules/free_module_morphism.py +1581 -0
  803. sage/tensor/modules/free_module_tensor.py +3289 -0
  804. sage/tensor/modules/reflexive_module.py +386 -0
  805. sage/tensor/modules/tensor_free_module.py +780 -0
  806. sage/tensor/modules/tensor_free_submodule.py +538 -0
  807. sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
  808. sage/tensor/modules/tensor_with_indices.py +1043 -0
@@ -0,0 +1,1086 @@
1
+ # sage_setup: distribution = sagemath-modules
2
+ r"""
3
+ Matroid construction
4
+
5
+ Theory
6
+ ======
7
+
8
+ Matroids are combinatorial structures that capture the abstract properties
9
+ of (linear/algebraic/...) dependence. Formally, a matroid is a pair
10
+ `M = (E, I)` of a finite set `E`, the *groundset*, and a collection of
11
+ subsets `I`, the independent sets, subject to the following axioms:
12
+
13
+ * `I` contains the empty set
14
+ * If `X` is a set in `I`, then each subset of `X` is in `I`
15
+ * If two subsets `X`, `Y` are in `I`, and `|X| > |Y|`, then there exists
16
+ `x \in X - Y` such that `Y + \{x\}` is in `I`.
17
+
18
+ See the :wikipedia:`Wikipedia article on matroids <Matroid>` for more theory
19
+ and examples. Matroids can be obtained from many types of mathematical
20
+ structures, and Sage supports a number of them.
21
+
22
+ There are two main entry points to Sage's matroid functionality. The object
23
+ :class:`matroids. <sage.matroids.matroids_catalog>` contains a number of
24
+ constructors for well-known matroids. The function
25
+ :func:`Matroid() <sage.matroids.constructor.Matroid>` allows you to define
26
+ your own matroids from a variety of sources. We briefly introduce both below;
27
+ follow the links for more comprehensive documentation.
28
+
29
+ Each matroid object in Sage comes with a number of built-in operations. An
30
+ overview can be found in the documentation of
31
+ :mod:`the abstract matroid class <sage.matroids.matroid>`.
32
+
33
+ Built-in matroids
34
+ =================
35
+
36
+ For built-in matroids, do the following:
37
+
38
+ * Within a Sage session, type ``matroids.`` (Do not press :kbd:`Enter`,
39
+ and do not forget the final period ".")
40
+ * Hit :kbd:`Tab`.
41
+
42
+ You will see a list of methods which will construct matroids. For example::
43
+
44
+ sage: M = matroids.Wheel(4)
45
+ sage: M.is_connected()
46
+ True
47
+
48
+ or::
49
+
50
+ sage: U36 = matroids.Uniform(3, 6)
51
+ sage: U36.equals(U36.dual())
52
+ True
53
+
54
+ A number of special matroids are collected under a ``catalog`` submenu.
55
+ To see which, type ``matroids.catalog.<tab>`` as above::
56
+
57
+ sage: F7 = matroids.catalog.Fano()
58
+ sage: len(F7.nonspanning_circuits())
59
+ 7
60
+
61
+ Constructing matroids
62
+ =====================
63
+
64
+ To define your own matroid, use the function
65
+ :func:`Matroid() <sage.matroids.constructor.Matroid>`. This function attempts
66
+ to interpret its arguments to create an appropriate matroid. The input
67
+ arguments are documented in detail
68
+ :func:`below <sage.matroids.constructor.Matroid>`.
69
+
70
+ EXAMPLES::
71
+
72
+ sage: A = Matrix(GF(2), [[1, 0, 0, 0, 1, 1, 1],
73
+ ....: [0, 1, 0, 1, 0, 1, 1],
74
+ ....: [0, 0, 1, 1, 1, 0, 1]])
75
+ sage: M = Matroid(A)
76
+ sage: M.is_isomorphic(matroids.catalog.Fano())
77
+ True
78
+
79
+ sage: M = Matroid(graphs.PetersenGraph()) # needs sage.graphs
80
+ sage: M.rank() # needs sage.graphs
81
+ 9
82
+
83
+ AUTHORS:
84
+
85
+ - Rudi Pendavingh, Michael Welsh, Stefan van Zwam (2013-04-01): initial
86
+ version
87
+
88
+ Functions
89
+ =========
90
+ """
91
+
92
+ # ****************************************************************************
93
+ # Copyright (C) 2013 Rudi Pendavingh <rudi.pendavingh@gmail.com>
94
+ # Copyright (C) 2013 Michael Welsh <michael@welsh.co.nz>
95
+ # Copyright (C) 2013 Stefan van Zwam <stefanvanzwam@gmail.com>
96
+ #
97
+ #
98
+ # Distributed under the terms of the GNU General Public License (GPL)
99
+ # as published by the Free Software Foundation; either version 2 of
100
+ # the License, or (at your option) any later version.
101
+ # https://www.gnu.org/licenses/
102
+ # ****************************************************************************
103
+
104
+
105
+ from itertools import combinations
106
+ from sage.matrix.constructor import matrix
107
+ from sage.misc.lazy_import import lazy_import
108
+ from sage.structure.element import Matrix
109
+ from sage.rings.integer_ring import ZZ
110
+ from sage.rings.rational_field import QQ
111
+ from sage.categories.fields import Fields
112
+ from sage.categories.rings import Rings
113
+ from sage.rings.finite_rings.finite_field_base import FiniteField
114
+ import sage.matroids.matroid
115
+ import sage.matroids.utilities
116
+
117
+ lazy_import('sage.combinat.posets.lattices', 'FiniteLatticePoset')
118
+ lazy_import('sage.matroids.basis_matroid', 'BasisMatroid')
119
+ lazy_import('sage.matroids.circuit_closures_matroid', 'CircuitClosuresMatroid')
120
+ lazy_import('sage.matroids.circuits_matroid', 'CircuitsMatroid')
121
+ lazy_import('sage.matroids.flats_matroid', 'FlatsMatroid')
122
+ lazy_import('sage.matroids.graphic_matroid', 'GraphicMatroid')
123
+ lazy_import('sage.matroids.linear_matroid',
124
+ ['LinearMatroid', 'RegularMatroid', 'BinaryMatroid',
125
+ 'TernaryMatroid', 'QuaternaryMatroid'])
126
+ lazy_import('sage.matroids.rank_matroid', 'RankMatroid')
127
+
128
+
129
+ def Matroid(groundset=None, data=None, **kwds):
130
+ r"""
131
+ Construct a matroid.
132
+
133
+ Matroids are combinatorial structures that capture the abstract properties
134
+ of (linear/algebraic/...) dependence. Formally, a matroid is a pair
135
+ `M = (E, I)` of a finite set `E`, the *groundset*, and a collection of
136
+ subsets `I`, the independent sets, subject to the following axioms:
137
+
138
+ * `I` contains the empty set
139
+ * If `X` is a set in `I`, then each subset of `X` is in `I`
140
+ * If two subsets `X`, `Y` are in `I`, and `|X| > |Y|`, then there exists
141
+ `x \in X - Y` such that `Y + \{x\}` is in `I`.
142
+
143
+ See the :wikipedia:`Wikipedia article on matroids <Matroid>` for more
144
+ theory and examples. Matroids can be obtained from many types of
145
+ mathematical structures, and Sage supports a number of them.
146
+
147
+ There are two main entry points to Sage's matroid functionality. For
148
+ built-in matroids, do the following:
149
+
150
+ * Within a Sage session, type "matroids." (Do not press :kbd:`Enter`, and do
151
+ not forget the final period ".")
152
+ * Hit :kbd:`Tab`.
153
+
154
+ You will see a list of methods which will construct matroids. For
155
+ example::
156
+
157
+ sage: F7 = matroids.catalog.Fano()
158
+ sage: len(F7.nonspanning_circuits())
159
+ 7
160
+
161
+ or::
162
+
163
+ sage: U36 = matroids.Uniform(3, 6)
164
+ sage: U36.equals(U36.dual())
165
+ True
166
+
167
+ To define your own matroid, use the function ``Matroid()``.
168
+ This function attempts to interpret its arguments to create an appropriate
169
+ matroid. The following named arguments are supported:
170
+
171
+ INPUT:
172
+
173
+ - ``groundset`` -- (optional) the groundset of the matroid; if not
174
+ provided, the function attempts to determine a groundset from the data
175
+
176
+ Exactly one of the following inputs must be given (where ``data``
177
+ must be a positional argument and anything else must be a keyword
178
+ argument):
179
+
180
+ - ``data`` -- a graph or a matrix or a RevLex-Index string or a list
181
+ of independent sets containing all bases or a matroid
182
+ - ``bases`` -- the list of bases (maximal independent sets) of the
183
+ matroid
184
+ - ``independent_sets`` -- the list of independent sets of the matroid
185
+ - ``circuits`` -- the list of circuits of the matroid
186
+ - ``nonspanning_circuits`` -- the list of nonspanning circuits of the
187
+ matroid
188
+ - ``flats`` -- the dictionary, list, or lattice of flats of the matroid
189
+ - ``graph`` -- a graph, whose edges form the elements of the matroid
190
+ - ``matrix`` -- a matrix representation of the matroid
191
+ - ``reduced_matrix`` -- a reduced representation of the matroid: if
192
+ ``reduced_matrix = A``
193
+ then the matroid is represented by `[I\ \ A]` where `I` is an
194
+ appropriately sized identity matrix
195
+ - ``morphism`` -- a morphism representation of the matroid
196
+ - ``reduced_morphism`` -- a reduced morphism representation of the matroid
197
+ - ``rank_function`` -- a function that computes the rank of each subset;
198
+ can only be provided together with a groundset
199
+ - ``circuit_closures`` -- either a list of tuples ``(k, C)`` with ``C``
200
+ the closure of a circuit, and ``k`` the rank of ``C``, or a dictionary
201
+ ``D`` with ``D[k]`` the set of closures of rank-``k`` circuits
202
+ - ``revlex`` -- the encoding as a string of ``0`` and ``*`` symbols;
203
+ used by [Mat2012]_ and explained in [MMIB2012]_
204
+ - ``matroid`` -- an object that is already a matroid; useful only with the
205
+ ``regular`` option
206
+
207
+ Further options:
208
+
209
+ - ``regular`` -- boolean (default: ``False``); if ``True``,
210
+ output a
211
+ :class:`RegularMatroid <sage.matroids.linear_matroid.RegularMatroid>`
212
+ instance such that, *if* the input defines a valid regular matroid, then
213
+ the output represents this matroid. Note that this option can be
214
+ combined with any type of input.
215
+ - ``ring`` -- any ring. If provided, and the input is a ``matrix`` or
216
+ ``reduced_matrix``, output will be a linear matroid over the ring or
217
+ field ``ring``.
218
+ - ``field`` -- any field. Same as ``ring``, but only fields are allowed
219
+ - ``check`` -- boolean (default: ``True``); if ``True`` and
220
+ ``regular`` is ``True``, the output is checked to make sure it is a valid
221
+ regular matroid
222
+
223
+ .. WARNING::
224
+
225
+ Except for regular matroids, the input is not checked for validity. If
226
+ your data does not correspond to an actual matroid, the behavior of
227
+ the methods is undefined and may cause strange errors. To ensure you
228
+ have a matroid, run
229
+ :meth:`M.is_valid() <sage.matroids.matroid.Matroid.is_valid>`.
230
+
231
+ .. NOTE::
232
+
233
+ The ``Matroid()`` method will return instances of type
234
+ :class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`,
235
+ :class:`CircuitsMatroid <sage.matroids.circuits_matroid.CircuitsMatroid>`,
236
+ :class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`,
237
+ :class:`CircuitClosuresMatroid <sage.matroids.circuit_closures_matroid.CircuitClosuresMatroid>`,
238
+ :class:`LinearMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
239
+ :class:`BinaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
240
+ :class:`TernaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
241
+ :class:`QuaternaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
242
+ :class:`RegularMatroid <sage.matroids.linear_matroid.LinearMatroid>`, or
243
+ :class:`RankMatroid <sage.matroids.rank_matroid.RankMatroid>`. To
244
+ import these classes (and other useful functions) directly into Sage's
245
+ main namespace, type::
246
+
247
+ sage: from sage.matroids.advanced import *
248
+
249
+ See :mod:`sage.matroids.advanced <sage.matroids.advanced>`.
250
+
251
+ EXAMPLES:
252
+
253
+ Note that in these examples we will often use the fact that strings are
254
+ iterable in these examples. So we type ``'abcd'`` to denote the list
255
+ ``['a', 'b', 'c', 'd']``.
256
+
257
+ #. List of bases:
258
+
259
+ All of the following inputs are allowed, and equivalent::
260
+
261
+ sage: M1 = Matroid(groundset='abcd', bases=['ab', 'ac', 'ad',
262
+ ....: 'bc', 'bd', 'cd'])
263
+ sage: M2 = Matroid(bases=['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
264
+ sage: M3 = Matroid(['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
265
+ sage: M4 = Matroid('abcd', ['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
266
+ sage: M5 = Matroid('abcd', bases=[['a', 'b'], ['a', 'c'],
267
+ ....: ['a', 'd'], ['b', 'c'],
268
+ ....: ['b', 'd'], ['c', 'd']])
269
+ sage: M1 == M2
270
+ True
271
+ sage: M1 == M3
272
+ True
273
+ sage: M1 == M4
274
+ True
275
+ sage: M1 == M5
276
+ True
277
+
278
+ We do not check if the provided input forms an actual matroid::
279
+
280
+ sage: M1 = Matroid(groundset='abcd', bases=['ab', 'cd'])
281
+ sage: M1.full_rank()
282
+ 2
283
+ sage: M1.is_valid()
284
+ False
285
+
286
+ Bases may be repeated::
287
+
288
+ sage: M1 = Matroid(['ab', 'ac'])
289
+ sage: M2 = Matroid(['ab', 'ac', 'ab'])
290
+ sage: M1 == M2
291
+ True
292
+
293
+ #. List of independent sets:
294
+
295
+ ::
296
+
297
+ sage: M1 = Matroid(groundset='abcd',
298
+ ....: independent_sets=['', 'a', 'b', 'c', 'd', 'ab',
299
+ ....: 'ac', 'ad', 'bc', 'bd', 'cd'])
300
+
301
+ We only require that the list of independent sets contains each basis
302
+ of the matroid; omissions of smaller independent sets and
303
+ repetitions are allowed::
304
+
305
+ sage: M1 = Matroid(bases=['ab', 'ac'])
306
+ sage: M2 = Matroid(independent_sets=['a', 'ab', 'b', 'ab', 'a',
307
+ ....: 'b', 'ac'])
308
+ sage: M1 == M2
309
+ True
310
+
311
+ #. List of circuits:
312
+
313
+ ::
314
+
315
+ sage: M1 = Matroid(groundset='abc', circuits=['bc'])
316
+
317
+ A matroid specified by a list of circuits gets converted to a
318
+ :class:`CircuitsMatroid <sage.matroids.circuits_matroid.CircuitsMatroid>`
319
+ internally::
320
+
321
+ sage: from sage.matroids.circuits_matroid import CircuitsMatroid
322
+ sage: M2 = CircuitsMatroid(Matroid(bases=['ab', 'ac']))
323
+ sage: M1 == M2
324
+ True
325
+
326
+ sage: M = Matroid(groundset='abcd', circuits=['abc', 'abd', 'acd',
327
+ ....: 'bcd'])
328
+ sage: type(M)
329
+ <class 'sage.matroids.circuits_matroid.CircuitsMatroid'>
330
+
331
+ Strange things can happen if the input does not satisfy the circuit
332
+ axioms, and these can be caught by the
333
+ :meth:`is_valid() <sage.matroids.circuits_matroid.CircuitsMatroid.is_valid>`
334
+ method. So please check that your input makes sense!
335
+
336
+ ::
337
+
338
+ sage: M = Matroid('abcd', circuits=['ab', 'acd'])
339
+ sage: M.is_valid()
340
+ False
341
+
342
+ #. Flats:
343
+
344
+ Given a dictionary of flats indexed by their rank, we get a
345
+ :class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`::
346
+
347
+ sage: # needs sage.graphs
348
+ sage: M = Matroid(flats={0: [''], 1: ['a', 'b'], 2: ['ab']})
349
+ sage: M.is_isomorphic(matroids.Uniform(2, 2)) and M.is_valid()
350
+ True
351
+ sage: type(M)
352
+ <class 'sage.matroids.flats_matroid.FlatsMatroid'>
353
+
354
+ If instead we simply provide a list of flats, then the class computes
355
+ and stores the lattice of flats upon definition. This can be
356
+ time-consuming, but after it's done we benefit from some faster methods
357
+ (e.g., :meth:`is_valid() <sage.matroids.flats_matroid.FlatsMatroid.is_valid>`)::
358
+
359
+ sage: # needs sage.graphs
360
+ sage: M = Matroid(flats=['', 'a', 'b', 'ab'])
361
+ sage: for i in range(M.rank() + 1): # print flats by rank
362
+ ....: print(f'{i}: {sorted([sorted(F) for F in M.flats(i)], key=str)}')
363
+ 0: [[]]
364
+ 1: [['a'], ['b']]
365
+ 2: [['a', 'b']]
366
+ sage: M.is_valid()
367
+ True
368
+ sage: type(M)
369
+ <class 'sage.matroids.flats_matroid.FlatsMatroid'>
370
+
371
+ Finally, we can also directly provide a lattice of flats::
372
+
373
+ sage: # needs sage.graphs
374
+ sage: from sage.combinat.posets.lattices import LatticePoset
375
+ sage: flats = [frozenset(F) for F in powerset('ab')]
376
+ sage: L_M = LatticePoset((flats, lambda x, y: x < y))
377
+ sage: M = Matroid(L_M)
378
+ sage: M.is_isomorphic(matroids.Uniform(2, 2)) and M.is_valid()
379
+ True
380
+ sage: type(M)
381
+ <class 'sage.matroids.flats_matroid.FlatsMatroid'>
382
+
383
+ #. Graph:
384
+
385
+ Sage has great support for graphs, see :mod:`sage.graphs.graph`.
386
+
387
+ ::
388
+
389
+ sage: G = graphs.PetersenGraph() # needs sage.graphs
390
+ sage: Matroid(G) # needs sage.graphs
391
+ Graphic matroid of rank 9 on 15 elements
392
+
393
+ If each edge has a unique label, then those are used as the ground set
394
+ labels::
395
+
396
+ sage: G = Graph([(0, 1, 'a'), (0, 2, 'b'), (1, 2, 'c')]) # needs sage.graphs
397
+ sage: M = Matroid(G) # needs sage.graphs
398
+ sage: sorted(M.groundset()) # needs sage.graphs
399
+ ['a', 'b', 'c']
400
+
401
+ If there are parallel edges, then integers are used for the ground set.
402
+ If there are no edges in parallel, and is not a complete list of labels,
403
+ or the labels are not unique, then vertex tuples are used::
404
+
405
+ sage: # needs sage.graphs
406
+ sage: G = Graph([(0, 1, 'a'), (0, 2, 'b'), (1, 2, 'b')])
407
+ sage: M = Matroid(G)
408
+ sage: sorted(M.groundset())
409
+ [(0, 1), (0, 2), (1, 2)]
410
+ sage: H = Graph([(0, 1, 'a'), (0, 2, 'b'), (1, 2, 'b'), (1, 2, 'c')],
411
+ ....: multiedges=True)
412
+ sage: N = Matroid(H)
413
+ sage: sorted(N.groundset())
414
+ [0, 1, 2, 3]
415
+
416
+ The GraphicMatroid object forces its graph to be connected. If a
417
+ disconnected graph is used as input, it will connect the components::
418
+
419
+ sage: # needs sage.graphs
420
+ sage: G1 = graphs.CycleGraph(3); G2 = graphs.DiamondGraph()
421
+ sage: G = G1.disjoint_union(G2)
422
+ sage: M = Matroid(G); M
423
+ Graphic matroid of rank 5 on 8 elements
424
+ sage: M.graph()
425
+ Looped multi-graph on 6 vertices
426
+ sage: M.graph().is_connected()
427
+ True
428
+ sage: M.is_connected()
429
+ False
430
+
431
+
432
+ If the keyword ``regular`` is set to ``True``, the output will instead
433
+ be an instance of :class:`RegularMatroid`.
434
+
435
+ ::
436
+
437
+ sage: G = Graph([(0, 1), (0, 2), (1, 2)]) # needs sage.graphs
438
+ sage: M = Matroid(G, regular=True); M # needs sage.graphs
439
+ Regular matroid of rank 2 on 3 elements with 3 bases
440
+
441
+ Note: if a groundset is specified, we assume it is in the same order
442
+ as
443
+ :meth:`G.edge_iterator() <sage.graphs.generic_graph.GenericGraph.edge_iterator>`
444
+ provides::
445
+
446
+ sage: G = Graph([(0, 1), (0, 2), (0, 2), (1, 2)], multiedges=True) # needs sage.graphs
447
+ sage: M = Matroid('abcd', G) # needs sage.graphs
448
+ sage: M.rank(['b', 'c']) # needs sage.graphs
449
+ 1
450
+
451
+ As before,
452
+ if no edge labels are present and the graph is simple, we use the
453
+ tuples ``(i, j)`` of endpoints. If that fails, we simply use a list
454
+ ``[0..m-1]`` ::
455
+
456
+ sage: G = Graph([(0, 1), (0, 2), (1, 2)]) # needs sage.graphs
457
+ sage: M = Matroid(G, regular=True) # needs sage.graphs
458
+ sage: sorted(M.groundset()) # needs sage.graphs
459
+ [(0, 1), (0, 2), (1, 2)]
460
+
461
+ sage: G = Graph([(0, 1), (0, 2), (0, 2), (1, 2)], multiedges=True) # needs sage.graphs
462
+ sage: M = Matroid(G, regular=True) # needs sage.graphs
463
+ sage: sorted(M.groundset()) # needs sage.graphs
464
+ [0, 1, 2, 3]
465
+
466
+ When the ``graph`` keyword is used, a variety of inputs can be
467
+ converted to a graph automatically. The following uses a graph6 string
468
+ (see the :class:`Graph <sage.graphs.graph.Graph>` method's
469
+ documentation)::
470
+
471
+ sage: Matroid(graph=':I`AKGsaOs`cI]Gb~') # needs sage.graphs
472
+ Graphic matroid of rank 9 on 17 elements
473
+
474
+ However, this method is no more clever than ``Graph()``::
475
+
476
+ sage: Matroid(graph=41/2) # needs sage.graphs
477
+ Traceback (most recent call last):
478
+ ...
479
+ ValueError: This input cannot be turned into a graph
480
+
481
+ #. Matrix:
482
+
483
+ The basic input is a
484
+ :mod:`Sage matrix <sage.matrix.constructor>`::
485
+
486
+ sage: A = Matrix(GF(2), [[1, 0, 0, 1, 1, 0],
487
+ ....: [0, 1, 0, 1, 0, 1],
488
+ ....: [0, 0, 1, 0, 1, 1]])
489
+ sage: M = Matroid(matrix=A)
490
+ sage: M.is_isomorphic(matroids.CompleteGraphic(4)) # needs sage.graphs
491
+ True
492
+
493
+ Various shortcuts are possible::
494
+
495
+ sage: M1 = Matroid(matrix=[[1, 0, 0, 1, 1, 0],
496
+ ....: [0, 1, 0, 1, 0, 1],
497
+ ....: [0, 0, 1, 0, 1, 1]], ring=GF(2))
498
+ sage: M2 = Matroid(reduced_matrix=[[1, 1, 0],
499
+ ....: [1, 0, 1],
500
+ ....: [0, 1, 1]], ring=GF(2))
501
+ sage: M3 = Matroid(groundset=[0, 1, 2, 3, 4, 5],
502
+ ....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
503
+ ....: ring=GF(2))
504
+ sage: A = Matrix(GF(2), [[1, 1, 0], [1, 0, 1], [0, 1, 1]])
505
+ sage: M4 = Matroid([0, 1, 2, 3, 4, 5], A)
506
+ sage: M1 == M2
507
+ True
508
+ sage: M1 == M3
509
+ True
510
+ sage: M1 == M4
511
+ True
512
+
513
+ However, with unnamed arguments the input has to be a ``Matrix``
514
+ instance, or the function will try to interpret it as a set of bases::
515
+
516
+ sage: Matroid([0, 1, 2], [[1, 0, 1], [0, 1, 1]])
517
+ Traceback (most recent call last):
518
+ ...
519
+ ValueError: basis has wrong cardinality
520
+
521
+ If the groundset size equals number of rows plus number of columns, an
522
+ identity matrix is prepended. Otherwise the groundset size must equal
523
+ the number of columns::
524
+
525
+ sage: A = Matrix(GF(2), [[1, 1, 0], [1, 0, 1], [0, 1, 1]])
526
+ sage: M = Matroid([0, 1, 2], A)
527
+ sage: N = Matroid([0, 1, 2, 3, 4, 5], A)
528
+ sage: M.rank()
529
+ 2
530
+ sage: N.rank()
531
+ 3
532
+
533
+ We automatically create an optimized subclass, if available::
534
+
535
+ sage: Matroid([0, 1, 2, 3, 4, 5],
536
+ ....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
537
+ ....: field=GF(2))
538
+ Binary matroid of rank 3 on 6 elements, type (2, 7)
539
+ sage: Matroid([0, 1, 2, 3, 4, 5],
540
+ ....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
541
+ ....: field=GF(3))
542
+ Ternary matroid of rank 3 on 6 elements, type 0-
543
+ sage: Matroid([0, 1, 2, 3, 4, 5], # needs sage.rings.finite_rings
544
+ ....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
545
+ ....: field=GF(4, 'x'))
546
+ Quaternary matroid of rank 3 on 6 elements
547
+ sage: Matroid([0, 1, 2, 3, 4, 5], # needs sage.graphs
548
+ ....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
549
+ ....: field=GF(2), regular=True)
550
+ Regular matroid of rank 3 on 6 elements with 16 bases
551
+
552
+ Otherwise the generic LinearMatroid class is used::
553
+
554
+ sage: Matroid([0, 1, 2, 3, 4, 5],
555
+ ....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
556
+ ....: field=GF(83))
557
+ Linear matroid of rank 3 on 6 elements represented over the Finite
558
+ Field of size 83
559
+
560
+ An integer matrix is automatically converted to a matrix over `\QQ`.
561
+ If you really want integers, you can specify the ring explicitly::
562
+
563
+ sage: A = Matrix([[1, 1, 0], [1, 0, 1], [0, 1, -1]])
564
+ sage: A.base_ring()
565
+ Integer Ring
566
+ sage: M = Matroid([0, 1, 2, 3, 4, 5], A)
567
+ sage: M.base_ring()
568
+ Rational Field
569
+ sage: M = Matroid([0, 1, 2, 3, 4, 5], A, ring=ZZ)
570
+ sage: M.base_ring()
571
+ Integer Ring
572
+
573
+ A morphism representation of a :class:`LinearMatroid` can also be used as
574
+ input::
575
+
576
+ sage: M = matroids.catalog.Fano()
577
+ sage: A = M.representation(order=True); A
578
+ Generic morphism:
579
+ From: Free module generated by {'a', 'b', 'c', 'd', 'e', 'f', 'g'} over
580
+ Finite Field of size 2
581
+ To: Free module generated by {0, 1, 2} over Finite Field of size 2
582
+ sage: A._unicode_art_matrix()
583
+ a b c d e f g
584
+ 0⎛1 0 0 0 1 1 1⎞
585
+ 1⎜0 1 0 1 0 1 1⎟
586
+ 2⎝0 0 1 1 1 0 1⎠
587
+ sage: N = Matroid(A); N
588
+ Binary matroid of rank 3 on 7 elements, type (3, 0)
589
+ sage: N.groundset()
590
+ frozenset({'a', 'b', 'c', 'd', 'e', 'f', 'g'})
591
+ sage: M == N
592
+ True
593
+
594
+ The keywords ``morphism`` and ``reduced_morphism`` are also available::
595
+
596
+ sage: # needs sage.rings.finite_rings
597
+ sage: M = matroids.catalog.RelaxedNonFano("abcdefg")
598
+ sage: A = M.representation(order=True, reduced=True); A
599
+ Generic morphism:
600
+ From: Free module generated by {'d', 'e', 'f', 'g'} over
601
+ Finite Field in w of size 2^2
602
+ To: Free module generated by {'a', 'b', 'c'} over
603
+ Finite Field in w of size 2^2
604
+ sage: A._unicode_art_matrix()
605
+ d e f g
606
+ a⎛1 1 0 1⎞
607
+ b⎜1 0 1 1⎟
608
+ c⎝0 1 w 1⎠
609
+ sage: N = Matroid(reduced_morphism=A); N
610
+ Quaternary matroid of rank 3 on 7 elements
611
+ sage: N.groundset()
612
+ frozenset({'a', 'b', 'c', 'd', 'e', 'f', 'g'})
613
+ sage: M == N
614
+ True
615
+
616
+ #. Rank function:
617
+
618
+ Any function mapping subsets to integers can be used as input::
619
+
620
+ sage: def f(X):
621
+ ....: return min(len(X), 2)
622
+ sage: M = Matroid('abcd', rank_function=f)
623
+ sage: M
624
+ Matroid of rank 2 on 4 elements
625
+ sage: M.is_isomorphic(matroids.Uniform(2, 4))
626
+ True
627
+
628
+ #. Circuit closures:
629
+
630
+ This is often a really concise way to specify a matroid. The usual way
631
+ is a dictionary of lists::
632
+
633
+ sage: M = Matroid(circuit_closures={3: ['edfg', 'acdg', 'bcfg',
634
+ ....: 'cefh', 'afgh', 'abce', 'abdf', 'begh', 'bcdh', 'adeh'],
635
+ ....: 4: ['abcdefgh']})
636
+ sage: M.equals(matroids.catalog.P8())
637
+ True
638
+
639
+ You can also input tuples `(k, X)` where `X` is the closure of a
640
+ circuit, and `k` the rank of `X`::
641
+
642
+ sage: M = Matroid(circuit_closures=[(2, 'abd'), (3, 'abcdef'),
643
+ ....: (2, 'bce')])
644
+ sage: M.equals(matroids.catalog.Q6()) # needs sage.rings.finite_rings
645
+ True
646
+
647
+ #. RevLex-Index:
648
+
649
+ This requires the ``groundset`` to be given and also needs a
650
+ additional keyword argument ``rank`` to specify the rank of the
651
+ matroid::
652
+
653
+ sage: M = Matroid("abcdef", "000000******0**", rank=4); M
654
+ Matroid of rank 4 on 6 elements with 8 bases
655
+ sage: list(M.bases())
656
+ [frozenset({'a', 'b', 'd', 'f'}),
657
+ frozenset({'a', 'c', 'd', 'f'}),
658
+ frozenset({'b', 'c', 'd', 'f'}),
659
+ frozenset({'a', 'b', 'e', 'f'}),
660
+ frozenset({'a', 'c', 'e', 'f'}),
661
+ frozenset({'b', 'c', 'e', 'f'}),
662
+ frozenset({'b', 'd', 'e', 'f'}),
663
+ frozenset({'c', 'd', 'e', 'f'})]
664
+
665
+ Only the ``0`` symbols really matter, any symbol can be used
666
+ instead of ``*``:
667
+
668
+ sage: Matroid("abcdefg", revlex='0++++++++0++++0+++++0+--++----+--++', rank=4)
669
+ Matroid of rank 4 on 7 elements with 31 bases
670
+
671
+ It is checked that the input makes sense (but not that it
672
+ defines a matroid)::
673
+
674
+ sage: Matroid("abcdef", "000000******0**")
675
+ Traceback (most recent call last):
676
+ ...
677
+ TypeError: for RevLex-Index, the rank needs to be specified
678
+ sage: Matroid("abcdef", "000000******0**", rank=3)
679
+ Traceback (most recent call last):
680
+ ...
681
+ ValueError: expected string of length 20 (6 choose 3), got 15
682
+ sage: M = Matroid("abcdef", "*0000000000000*", rank=4); M
683
+ Matroid of rank 4 on 6 elements with 2 bases
684
+ sage: M.is_valid()
685
+ False
686
+
687
+ #. Matroid:
688
+
689
+ Most of the time, the matroid itself is returned::
690
+
691
+ sage: M = matroids.catalog.Fano()
692
+ sage: N = Matroid(M)
693
+ sage: N is M
694
+ True
695
+
696
+ But it can be useful with the ``regular`` option::
697
+
698
+ sage: M = Matroid(circuit_closures={2:['adb', 'bec', 'cfa',
699
+ ....: 'def'], 3:['abcdef']})
700
+ sage: N = Matroid(M, regular=True); N # needs sage.graphs
701
+ Regular matroid of rank 3 on 6 elements with 16 bases
702
+ sage: M == N # needs sage.graphs
703
+ False
704
+ sage: M.is_isomorphic(N) # needs sage.graphs
705
+ True
706
+ sage: Matrix(N) # random # needs sage.graphs
707
+ [1 0 0 1 1 0]
708
+ [0 1 0 1 1 1]
709
+ [0 0 1 0 1 1]
710
+
711
+ The ``regular`` option::
712
+
713
+ sage: M = Matroid(reduced_matrix=[[1, 1, 0], # needs sage.graphs
714
+ ....: [1, 0, 1],
715
+ ....: [0, 1, 1]], regular=True); M
716
+ Regular matroid of rank 3 on 6 elements with 16 bases
717
+
718
+ sage: M.is_isomorphic(matroids.CompleteGraphic(4)) # needs sage.graphs
719
+ True
720
+
721
+ By default we check if the resulting matroid is actually regular. To
722
+ increase speed, this check can be skipped::
723
+
724
+ sage: M = matroids.catalog.Fano()
725
+ sage: N = Matroid(M, regular=True) # needs sage.graphs
726
+ Traceback (most recent call last):
727
+ ...
728
+ ValueError: input is not a valid regular matroid
729
+ sage: N = Matroid(M, regular=True, check=False); N # needs sage.graphs
730
+ Regular matroid of rank 3 on 7 elements with 32 bases
731
+
732
+ sage: N.is_valid() # needs sage.graphs
733
+ False
734
+
735
+ Sometimes the output is regular, but represents a different matroid
736
+ from the one you intended::
737
+
738
+ sage: M = Matroid(Matrix(GF(3), [[1, 0, 1, 1], [0, 1, 1, 2]]))
739
+ sage: N = Matroid(Matrix(GF(3), [[1, 0, 1, 1], [0, 1, 1, 2]]), # needs sage.graphs
740
+ ....: regular=True)
741
+ sage: N.is_valid() # needs sage.graphs
742
+ True
743
+ sage: N.is_isomorphic(M) # needs sage.graphs
744
+ False
745
+
746
+ TESTS::
747
+
748
+ sage: Matroid()
749
+ Traceback (most recent call last):
750
+ ...
751
+ TypeError: no input data given for Matroid()
752
+ sage: Matroid("abc", bases=["abc"], foo='bar')
753
+ Traceback (most recent call last):
754
+ ...
755
+ TypeError: ...Matroid() got an unexpected keyword argument 'foo'
756
+ sage: Matroid(data=["x"], matrix=Matrix(1,1))
757
+ Traceback (most recent call last):
758
+ ...
759
+ TypeError: ...Matroid() got an unexpected keyword argument 'matrix'
760
+ sage: Matroid(bases=["x"], matrix=Matrix(1,1))
761
+ Traceback (most recent call last):
762
+ ...
763
+ TypeError: ...Matroid() got an unexpected keyword argument 'matrix'
764
+ sage: Matroid(Matrix(1,1), ring=ZZ, field=QQ)
765
+ Traceback (most recent call last):
766
+ ...
767
+ TypeError: ...Matroid() got an unexpected keyword argument 'ring'
768
+ sage: Matroid(rank_function=lambda X: len(X))
769
+ Traceback (most recent call last):
770
+ ...
771
+ TypeError: for rank functions, the groundset needs to be specified
772
+ sage: Matroid(matroid='rubbish')
773
+ Traceback (most recent call last):
774
+ ...
775
+ TypeError: input 'rubbish' is not a matroid
776
+ """
777
+ # process options
778
+ want_regular = kwds.pop('regular', False)
779
+ check = kwds.pop('check', True)
780
+
781
+ base_ring = None
782
+ if 'field' in kwds:
783
+ base_ring = kwds.pop('field')
784
+ if check and base_ring not in Fields():
785
+ raise TypeError("{} is not a field".format(base_ring))
786
+ elif 'ring' in kwds:
787
+ base_ring = kwds.pop('ring')
788
+ if check and base_ring not in Rings():
789
+ raise TypeError("{} is not a ring".format(base_ring))
790
+
791
+ # "key" is the kind of data we got
792
+ key = None
793
+ if data is None:
794
+ for k in ['bases', 'independent_sets', 'circuits',
795
+ 'nonspanning_circuits', 'flats', 'graph', 'matrix',
796
+ 'reduced_matrix', 'morphism', 'reduced_morphism',
797
+ 'rank_function', 'revlex', 'circuit_closures', 'matroid']:
798
+ if k in kwds:
799
+ data = kwds.pop(k)
800
+ key = k
801
+ break
802
+ else:
803
+ # Assume that the single positional argument was actually
804
+ # the data (instead of the groundset)
805
+ data = groundset
806
+ groundset = None
807
+
808
+ if key is None:
809
+ try:
810
+ from sage.graphs.graph import Graph
811
+ except ImportError:
812
+ Graph = ()
813
+ if isinstance(data, Graph):
814
+ key = 'graph'
815
+ elif isinstance(data, Matrix) or (
816
+ isinstance(data, tuple) and isinstance(data[0], Matrix)):
817
+ key = 'matrix'
818
+ elif isinstance(data, sage.modules.with_basis.morphism.ModuleMorphism) or (
819
+ isinstance(data, tuple) and
820
+ isinstance(data[0], sage.modules.with_basis.morphism.ModuleMorphism)):
821
+ key = 'morphism'
822
+ elif isinstance(data, sage.matroids.matroid.Matroid):
823
+ key = 'matroid'
824
+ elif isinstance(data, str):
825
+ key = 'revlex'
826
+ elif isinstance(data, (dict, FiniteLatticePoset)):
827
+ key = 'flats'
828
+ elif data is None:
829
+ raise TypeError("no input data given for Matroid()")
830
+ else:
831
+ key = 'independent_sets'
832
+
833
+ # Bases:
834
+ if key == 'bases':
835
+ if groundset is None:
836
+ groundset = set()
837
+ for B in data:
838
+ groundset.update(B)
839
+ M = BasisMatroid(groundset=groundset, bases=data)
840
+
841
+ # Independent sets:
842
+ elif key == 'independent_sets':
843
+ # Convert to list of bases first
844
+ rk = -1
845
+ bases = []
846
+ for I in data:
847
+ if len(I) == rk:
848
+ bases.append(I)
849
+ elif len(I) > rk:
850
+ bases = [I]
851
+ rk = len(I)
852
+ if groundset is None:
853
+ groundset = set()
854
+ for B in bases:
855
+ groundset.update(B)
856
+ M = BasisMatroid(groundset=groundset, bases=bases)
857
+
858
+ # Circuits:
859
+ elif key == 'circuits':
860
+ # Convert to list of bases first
861
+ # Determine groundset (note that this cannot detect coloops)
862
+ if groundset is None:
863
+ groundset = set()
864
+ for C in data:
865
+ groundset.update(C)
866
+ M = CircuitsMatroid(groundset=groundset, circuits=data)
867
+
868
+ # Nonspanning circuits:
869
+ elif key == 'nonspanning_circuits':
870
+ try:
871
+ rk = kwds.pop("rank")
872
+ except TypeError:
873
+ raise TypeError("the rank needs to be specified alongside the " +
874
+ "nonspanning circuits")
875
+ # Determine groundset (note that this cannot detect coloops)
876
+ if groundset is None:
877
+ groundset = set()
878
+ for C in data:
879
+ groundset.update(C)
880
+ # Construct the basis matroid of appropriate rank. Note: slow!
881
+ B = [] # bases
882
+ for b in combinations(groundset, rk):
883
+ flag = True
884
+ for C in data:
885
+ if set(b) >= set(C):
886
+ flag = False
887
+ break
888
+ if flag:
889
+ B += [list(b)]
890
+ # convert to circuits matroid defined by non-spanning circuits
891
+ M = CircuitsMatroid(
892
+ BasisMatroid(groundset=groundset, bases=B),
893
+ nsc_defined=True
894
+ )
895
+
896
+ # Flats
897
+ elif key == 'flats':
898
+ # Determine groundset
899
+ if groundset is None:
900
+ groundset = set()
901
+ if isinstance(data, dict):
902
+ for i in data:
903
+ for F in data[i]:
904
+ groundset.update(F)
905
+ else: # iterable of flats (including lattice)
906
+ for F in data:
907
+ groundset.update(F)
908
+ M = FlatsMatroid(groundset=groundset, flats=data)
909
+
910
+ # Graphs:
911
+ elif key == 'graph':
912
+ from sage.graphs.graph import Graph
913
+
914
+ if isinstance(data, sage.graphs.generic_graph.GenericGraph):
915
+ G = data
916
+ else:
917
+ G = Graph(data)
918
+ # Decide on the groundset
919
+ m = G.num_edges()
920
+ if groundset is None:
921
+ # 1. Attempt to use edge labels.
922
+ sl = G.edge_labels()
923
+ if len(sl) == len(set(sl)):
924
+ groundset = sl
925
+ # 2. If simple, use vertex tuples
926
+ elif not G.has_multiple_edges():
927
+ groundset = [(i, j) for i, j, k in G.edge_iterator()]
928
+ else:
929
+ # 3. Use numbers
930
+ groundset = list(range(m))
931
+ if want_regular:
932
+ # Construct the incidence matrix
933
+ # NOTE: we are not using Sage's built-in method because
934
+ # 1) we would need to fix the loops anyway
935
+ # 2) Sage will sort the columns, making it impossible to keep labels!
936
+ V = G.vertices(sort=True)
937
+ n = G.num_verts()
938
+ A = matrix(ZZ, n, m, 0)
939
+ mm = 0
940
+ for i, j, k in G.edge_iterator():
941
+ A[V.index(i), mm] = -1
942
+ A[V.index(j), mm] += 1 # So loops get 0
943
+ mm += 1
944
+ M = RegularMatroid(matrix=A, groundset=groundset)
945
+ want_regular = False # Save some time, since result is already regular
946
+ else:
947
+ M = GraphicMatroid(G, groundset=groundset)
948
+
949
+ # Matrices:
950
+ elif key in ['matrix', 'reduced_matrix', 'morphism', 'reduced_morphism']:
951
+ A = data
952
+ is_reduced = (key == 'reduced_matrix' or key == 'reduced_morphism')
953
+ if isinstance(data, tuple):
954
+ A = data[0]
955
+ if key == 'matrix' or key == 'reduced_matrix':
956
+ if groundset is None:
957
+ groundset = data[1]
958
+ if is_reduced:
959
+ groundset += data[2]
960
+ if key == 'morphism' or key == 'reduced_morphism':
961
+ if groundset is None:
962
+ groundset = list(A.domain().basis().keys())
963
+ if is_reduced:
964
+ groundset = list(A.codomain().basis().keys()) + groundset
965
+ A = A.matrix()
966
+
967
+ # Fix the representation
968
+ if not isinstance(A, Matrix):
969
+ if base_ring is not None:
970
+ A = matrix(base_ring, A)
971
+ else:
972
+ A = matrix(A)
973
+
974
+ # Fix the ring
975
+ if base_ring is not None:
976
+ if A.base_ring() is not base_ring:
977
+ A = A.change_ring(base_ring)
978
+ elif A.base_ring() is ZZ and not want_regular: # Usually a rational matrix is intended, we presume.
979
+ A = A.change_ring(QQ)
980
+ base_ring = QQ
981
+ else:
982
+ base_ring = A.base_ring()
983
+
984
+ # Check groundset
985
+ if groundset is not None:
986
+ if not is_reduced:
987
+ if len(groundset) == A.ncols():
988
+ pass
989
+ elif len(groundset) == A.nrows() + A.ncols():
990
+ is_reduced = True
991
+ else:
992
+ raise ValueError("groundset size does not correspond to matrix size")
993
+ elif is_reduced:
994
+ if len(groundset) == A.nrows() + A.ncols():
995
+ pass
996
+ else:
997
+ raise ValueError("groundset size does not correspond to matrix size")
998
+
999
+ if is_reduced:
1000
+ kw = dict(groundset=groundset, reduced_matrix=A)
1001
+ else:
1002
+ kw = dict(groundset=groundset, matrix=A)
1003
+
1004
+ if isinstance(base_ring, FiniteField):
1005
+ q = base_ring.order()
1006
+ else:
1007
+ q = 0
1008
+
1009
+ if q == 2:
1010
+ M = BinaryMatroid(**kw)
1011
+ elif q == 3:
1012
+ M = TernaryMatroid(**kw)
1013
+ elif q == 4:
1014
+ M = QuaternaryMatroid(**kw)
1015
+ else:
1016
+ M = LinearMatroid(ring=base_ring, **kw)
1017
+
1018
+ # Rank functions:
1019
+ elif key == 'rank_function':
1020
+ if groundset is None:
1021
+ raise TypeError('for rank functions, the groundset needs to be specified')
1022
+ M = RankMatroid(groundset=groundset, rank_function=data)
1023
+
1024
+ # RevLex-Index:
1025
+ elif key == "revlex":
1026
+ if groundset is None:
1027
+ raise TypeError('for RevLex-Index, the groundset needs to be specified')
1028
+ try:
1029
+ rk = kwds.pop("rank")
1030
+ except KeyError:
1031
+ raise TypeError('for RevLex-Index, the rank needs to be specified')
1032
+
1033
+ groundset = tuple(groundset)
1034
+ data = tuple(data)
1035
+ rk = int(rk)
1036
+ N = len(groundset)
1037
+
1038
+ def revlex_sort_key(s):
1039
+ return tuple(reversed(s))
1040
+ subsets = sorted(combinations(range(N), rk), key=revlex_sort_key)
1041
+ if len(data) != len(subsets):
1042
+ raise ValueError("expected string of length %s (%s choose %s), got %s" %
1043
+ (len(subsets), N, rk, len(data)))
1044
+ bases = [[groundset[c] for c in subsets[i]]
1045
+ for i, x in enumerate(data) if x != '0']
1046
+ M = BasisMatroid(groundset=groundset, bases=bases)
1047
+
1048
+ # Circuit closures:
1049
+ elif key == 'circuit_closures':
1050
+ if isinstance(data, dict):
1051
+ CC = data
1052
+ else:
1053
+ # Convert to dictionary
1054
+ CC = {}
1055
+ for X in data:
1056
+ if X[0] not in CC:
1057
+ CC[X[0]] = []
1058
+ CC[X[0]].append(X[1])
1059
+
1060
+ if groundset is None:
1061
+ groundset = set()
1062
+ for X in CC.values():
1063
+ for Y in X:
1064
+ groundset.update(Y)
1065
+
1066
+ M = CircuitClosuresMatroid(groundset=groundset, circuit_closures=CC)
1067
+
1068
+ # Matroids:
1069
+ elif key == 'matroid':
1070
+ if not isinstance(data, sage.matroids.matroid.Matroid):
1071
+ raise TypeError("input {!r} is not a matroid".format(data))
1072
+ M = data
1073
+
1074
+ else:
1075
+ raise AssertionError("unknown key %r" % key)
1076
+
1077
+ # All keywords should be used
1078
+ for k in kwds:
1079
+ raise TypeError("Matroid() got an unexpected keyword argument '{}'".format(k))
1080
+
1081
+ if want_regular:
1082
+ M = sage.matroids.utilities.make_regular_matroid_from_matroid(M)
1083
+ if check and not M.is_valid():
1084
+ raise ValueError('input is not a valid regular matroid')
1085
+
1086
+ return M