passagemath-categories 10.6.32__cp314-cp314t-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.
Files changed (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. sage/typeset/unicode_characters.py +101 -0
@@ -0,0 +1,739 @@
1
+ # sage_setup: distribution = sagemath-categories
2
+ # sage.doctest: needs sage.groups
3
+ r"""
4
+ Double cosets
5
+
6
+ This module implements a general algorithm for computing double coset problems
7
+ for pairs of objects. The class of objects in question must be some kind
8
+ of structure for which an isomorphism is a permutation in $S_n$ for some $n$,
9
+ which we call here the order of the object. Given objects $X$ and $Y$,
10
+ the program returns an isomorphism in list permutation form if $X \cong Y$, and
11
+ a NULL pointer otherwise.
12
+
13
+ In order to take advantage of the algorithms in this module for a specific kind
14
+ of object, one must implement (in Cython) three functions which will be specific
15
+ to the kind of objects in question. Pointers to these functions are passed to
16
+ the main function of the module, which is \code{double_coset}. For specific
17
+ examples of implementations of these functions, see any of the files in
18
+ \code{sage.groups.perm_gps.partn_ref} beginning with "refinement." They are:
19
+
20
+ A. \code{refine_and_return_invariant}:
21
+
22
+ Signature:
23
+
24
+ \code{int refine_and_return_invariant(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len)}
25
+
26
+ This function should split up cells in the partition at the top of the
27
+ partition stack in such a way that any automorphism that respects the
28
+ partition also respects the resulting partition. The array
29
+ cells_to_refine_by is a list of the beginning positions of some cells which
30
+ have been changed since the last refinement. It is not necessary to use
31
+ this in an implementation of this function, but it will affect performance.
32
+ One should consult \code{refinement_graphs} for more details and ideas for
33
+ particular implementations.
34
+
35
+ Output:
36
+
37
+ An integer $I$ invariant under the orbits of $S_n$. That is, if
38
+ $\gamma \in S_n$, then
39
+ $$ I(G, PS, cells_to_refine_by) = I( \gamma(G), \gamma(PS), \gamma(cells_to_refine_by) ) .$$
40
+
41
+
42
+ B. \code{compare_structures}:
43
+
44
+ Signature:
45
+
46
+ \code{int compare_structures(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree)}
47
+
48
+ This function must implement a total ordering on the set of objects of fixed
49
+ order. Return:
50
+ -1 if \code{gamma_1^{-1}(S1) < gamma_2^{-1}(S2)},
51
+ 0 if \code{gamma_1^{-1}(S1) == gamma_2^{-1}(S2)},
52
+ 1 if \code{gamma_1^{-1}(S1) > gamma_2^{-1}(S2)}.
53
+
54
+ Important note:
55
+
56
+ The permutations are thought of as being input in inverse form, and this can
57
+ lead to subtle bugs. One is encouraged to consult existing implementations
58
+ to make sure the right thing is being done: this is so that you can avoid
59
+ *actually* needing to compute the inverse.
60
+
61
+ C. \code{all_children_are_equivalent}:
62
+
63
+ Signature:
64
+
65
+ \code{bint all_children_are_equivalent(PartitionStack *PS, void *S)}
66
+
67
+ This function must return False unless it is the case that each discrete
68
+ partition finer than the top of the partition stack is equivalent to the
69
+ others under some automorphism of S. The converse need not hold: if this is
70
+ indeed the case, it still may return False. This function is originally used
71
+ as a consequence of Lemma 2.25 in [1].
72
+
73
+ EXAMPLES::
74
+
75
+ sage: import sage.groups.perm_gps.partn_ref.double_coset
76
+
77
+ REFERENCE:
78
+
79
+ - [1] McKay, Brendan D. Practical Graph Isomorphism. Congressus Numerantium,
80
+ Vol. 30 (1981), pp. 45-87.
81
+
82
+ - [2] Leon, Jeffrey. Permutation Group Algorithms Based on Partitions, I:
83
+ Theory and Algorithms. J. Symbolic Computation, Vol. 12 (1991), pp.
84
+ 533-583.
85
+ """
86
+
87
+ #*****************************************************************************
88
+ # Copyright (C) 2006 - 2011 Robert L. Miller <rlmillster@gmail.com>
89
+ #
90
+ # This program is free software: you can redistribute it and/or modify
91
+ # it under the terms of the GNU General Public License as published by
92
+ # the Free Software Foundation, either version 2 of the License, or
93
+ # (at your option) any later version.
94
+ # http://www.gnu.org/licenses/
95
+ #*****************************************************************************
96
+
97
+ from cysignals.memory cimport sig_calloc
98
+
99
+ from sage.groups.perm_gps.partn_ref.data_structures cimport *
100
+ from sage.data_structures.bitset_base cimport *
101
+
102
+ # Functions
103
+
104
+ cdef bint all_children_are_equivalent_trivial(PartitionStack *PS, void *S) noexcept:
105
+ return 0
106
+
107
+ cdef int refine_and_return_invariant_trivial(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len) noexcept:
108
+ return 0
109
+
110
+ cdef int compare_perms(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree) noexcept:
111
+ cdef list MS1 = <list> S1
112
+ cdef list MS2 = <list> S2
113
+ cdef int i, j
114
+ for i in range(degree):
115
+ j = int_cmp(MS1[gamma_1[i]], MS2[gamma_2[i]])
116
+ if j != 0:
117
+ return j
118
+ return 0
119
+
120
+
121
+ def coset_eq(list perm1=[0,1,2,3,4,5], list perm2=[1,2,3,4,5,0], list gens=[[1,2,3,4,5,0]]):
122
+ """
123
+ Given a group G generated by the given generators, tests whether the given
124
+ permutations are in the same right coset of G. Tests nontrivial input group
125
+ when using double_coset. If they are, return an element g so that
126
+ g.perm1 = perm2 (composing left to right).
127
+
128
+ TESTS::
129
+
130
+ sage: from sage.groups.perm_gps.partn_ref.double_coset import coset_eq
131
+ sage: coset_eq()
132
+ [5, 0, 1, 2, 3, 4]
133
+ sage: gens = [[1,2,3,0]]
134
+ sage: reps = [[0,1,2,3]]
135
+ sage: for p in SymmetricGroup(4):
136
+ ....: p = [p(i)-1 for i in range(1,5)]
137
+ ....: found = False
138
+ ....: for r in reps:
139
+ ....: if coset_eq(p, r, gens):
140
+ ....: found = True
141
+ ....: break
142
+ ....: if not found:
143
+ ....: reps.append(p)
144
+ sage: len(reps)
145
+ 6
146
+ sage: gens = [[1,0,2,3],[0,1,3,2]]
147
+ sage: reps = [[0,1,2,3]]
148
+ sage: for p in SymmetricGroup(4):
149
+ ....: p = [p(i)-1 for i in range(1,5)]
150
+ ....: found = False
151
+ ....: for r in reps:
152
+ ....: if coset_eq(p, r, gens):
153
+ ....: found = True
154
+ ....: break
155
+ ....: if not found:
156
+ ....: reps.append(p)
157
+ sage: len(reps)
158
+ 6
159
+ sage: gens = [[1,2,0,3]]
160
+ sage: reps = [[0,1,2,3]]
161
+ sage: for p in SymmetricGroup(4):
162
+ ....: p = [p(i)-1 for i in range(1,5)]
163
+ ....: found = False
164
+ ....: for r in reps:
165
+ ....: if coset_eq(p, r, gens):
166
+ ....: found = True
167
+ ....: break
168
+ ....: if not found:
169
+ ....: reps.append(p)
170
+ sage: len(reps)
171
+ 8
172
+ """
173
+ cdef int i, n = len(perm1)
174
+ assert all(len(g) == n for g in gens+[perm2])
175
+ cdef PartitionStack *part = PS_new(n, 1)
176
+ cdef int *c_perm = <int *> sig_malloc(n * sizeof(int))
177
+ cdef StabilizerChain *group = SC_new(n, 1)
178
+ cdef int *isomorphism = <int *> sig_malloc(n * sizeof(int))
179
+ if part is NULL or c_perm is NULL or group is NULL or isomorphism is NULL:
180
+ sig_free(c_perm)
181
+ PS_dealloc(part)
182
+ SC_dealloc(group)
183
+ sig_free(isomorphism)
184
+ raise MemoryError
185
+ for g in gens:
186
+ for i from 0 <= i < n:
187
+ c_perm[i] = g[i]
188
+ SC_insert(group, 0, c_perm, 1)
189
+ for i from 0 <= i < n:
190
+ c_perm[i] = i
191
+ cdef bint isomorphic = double_coset(<void *> perm1, <void *> perm2, part, c_perm, n, &all_children_are_equivalent_trivial, &refine_and_return_invariant_trivial, &compare_perms, group, NULL, isomorphism)
192
+ sig_free(c_perm)
193
+ PS_dealloc(part)
194
+ SC_dealloc(group)
195
+ if isomorphic:
196
+ x = [isomorphism[i] for i from 0 <= i < n]
197
+ else:
198
+ x = False
199
+ sig_free(isomorphism)
200
+ return x
201
+
202
+
203
+ cdef dc_work_space *allocate_dc_work_space(int n) noexcept:
204
+ r"""
205
+ Allocate work space for the double_coset function. It can be
206
+ input to the function in which case it must be deallocated after the
207
+ function is called.
208
+ """
209
+ cdef int *int_array
210
+
211
+ cdef dc_work_space *work_space
212
+ work_space = <dc_work_space *> sig_malloc(sizeof(dc_work_space))
213
+ if work_space is NULL:
214
+ return NULL
215
+
216
+ work_space.degree = n
217
+ int_array = <int *> sig_malloc((n*n + # for perm_stack
218
+ 5*n # for int_array
219
+ )*sizeof(int))
220
+ work_space.group1 = SC_new(n)
221
+ work_space.group2 = SC_new(n)
222
+ work_space.current_ps = PS_new(n, 0)
223
+ work_space.first_ps = PS_new(n, 0)
224
+ work_space.bitset_array = <bitset_t *> sig_calloc((n + 2*len_of_fp_and_mcr + 1), sizeof(bitset_t))
225
+ work_space.orbits_of_subgroup = OP_new(n)
226
+ work_space.perm_stack = NULL
227
+
228
+ if int_array is NULL or \
229
+ work_space.group1 is NULL or \
230
+ work_space.group2 is NULL or \
231
+ work_space.current_ps is NULL or \
232
+ work_space.first_ps is NULL or \
233
+ work_space.bitset_array is NULL or \
234
+ work_space.orbits_of_subgroup is NULL:
235
+ sig_free(int_array)
236
+ deallocate_dc_work_space(work_space)
237
+ return NULL
238
+
239
+ work_space.perm_stack = int_array
240
+ work_space.int_array = int_array + n*n
241
+
242
+ cdef int i
243
+ for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
244
+ work_space.bitset_array[i].bits = NULL
245
+ try:
246
+ for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
247
+ bitset_init(work_space.bitset_array[i], n)
248
+ except MemoryError:
249
+ deallocate_dc_work_space(work_space)
250
+ return NULL
251
+ return work_space
252
+
253
+ cdef void deallocate_dc_work_space(dc_work_space *work_space) noexcept:
254
+ r"""
255
+ Deallocate work space for the double_coset function.
256
+ """
257
+ if work_space is NULL:
258
+ return
259
+ cdef int i, n = work_space.degree
260
+ if work_space.bitset_array is not NULL:
261
+ for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
262
+ bitset_free(work_space.bitset_array[i])
263
+ sig_free(work_space.perm_stack)
264
+ SC_dealloc(work_space.group1)
265
+ SC_dealloc(work_space.group2)
266
+ PS_dealloc(work_space.current_ps)
267
+ PS_dealloc(work_space.first_ps)
268
+ sig_free(work_space.bitset_array)
269
+ OP_dealloc(work_space.orbits_of_subgroup)
270
+ sig_free(work_space)
271
+
272
+ cdef int double_coset(void *S1, void *S2, PartitionStack *partition1, int *ordering2,
273
+ int n, bint (*all_children_are_equivalent)(PartitionStack *PS, void *S) noexcept,
274
+ int (*refine_and_return_invariant)(PartitionStack *PS, void *S,
275
+ int *cells_to_refine_by, int ctrb_len) noexcept,
276
+ int (*compare_structures)(int *gamma_1, int *gamma_2, void *S1, void *S2,
277
+ int degree) noexcept,
278
+ StabilizerChain *input_group,
279
+ dc_work_space *work_space_prealloc, int *isom) except -1:
280
+ """
281
+ Traverse the search space for double coset calculation.
282
+
283
+ INPUT:
284
+ - ``S1``, ``S2`` -- pointers to the structures
285
+ - ``partition1`` -- PartitionStack of depth 0 and degree n,
286
+ whose first partition is of the points of S1
287
+ - ``ordering2`` -- an ordering of the points of S2 representing a second partition
288
+ - ``n`` -- the number of points (points are assumed to be 0,1,...,n-1)
289
+ - ``all_children_are_equivalent`` -- pointer to a function
290
+ INPUT:
291
+ - ``PS`` -- pointer to a partition stack
292
+ - ``S`` -- pointer to the structure
293
+ OUTPUT:
294
+ bint; returns True if it can be determined that all refinements below
295
+ the current one will result in an equivalent discrete partition
296
+ - ``refine_and_return_invariant`` -- pointer to a function
297
+ INPUT:
298
+ - ``PS`` -- pointer to a partition stack
299
+ -n``S`` -- pointer to the structure
300
+ - ``alpha`` -- an array consisting of numbers, which indicate the starting
301
+ positions of the cells to refine against (will likely be modified)
302
+ OUTPUT:
303
+ integer; returns an invariant under application of arbitrary permutations
304
+ compare_structures -- pointer to a function
305
+ INPUT:
306
+ - ``gamma_1``, ``gamma_2`` -- (list) permutations of the points of S1 and S2
307
+ - ``S1``, ``S2`` -- pointers to the structures
308
+ - ``degree`` -- degree of gamma_1 and 2
309
+ OUTPUT:
310
+ integer; 0 if gamma_1(S1) = gamma_2(S2), otherwise -1 or 1 (see docs for cmp),
311
+ such that the set of all structures is well-ordered
312
+ - ``input_group`` -- either a specified group to limit the search to,
313
+ or NULL for the full symmetric group
314
+ - ``isom`` -- space to store the isomorphism to,
315
+ or NULL if isomorphism is not needed
316
+
317
+ .. NOTE::
318
+
319
+ The partition ``partition1`` and the resulting partition from
320
+ ``ordering2`` *must* satisfy the property that in each cell, the
321
+ smallest element occurs first!
322
+
323
+ OUTPUT: ``1`` if ``S1`` and ``S2`` are isomorphic, otherwise ``0``
324
+ """
325
+ cdef PartitionStack *current_ps
326
+ cdef PartitionStack *first_ps
327
+ cdef PartitionStack *left_ps
328
+ cdef int first_meets_current = -1
329
+ cdef int current_kids_are_same = 1
330
+ cdef int first_kids_are_same
331
+
332
+ cdef int *indicators
333
+
334
+ cdef OrbitPartition *orbits_of_subgroup
335
+ cdef OrbitPartition *orbits_of_supergroup
336
+ cdef int subgroup_primary_orbit_size = 0
337
+ cdef int minimal_in_primary_orbit
338
+
339
+ cdef bitset_t *fixed_points_of_generators # i.e. fp
340
+ cdef bitset_t *minimal_cell_reps_of_generators # i.e. mcr
341
+ cdef int len_of_fp_and_mcr = 100
342
+ cdef int index_in_fp_and_mcr = -1
343
+
344
+ cdef bitset_t *vertices_to_split
345
+ cdef bitset_t *vertices_have_been_reduced
346
+ cdef int *permutation
347
+ cdef int *id_perm
348
+ cdef int *cells_to_refine_by
349
+ cdef int *vertices_determining_current_stack
350
+ cdef int *perm_stack
351
+ cdef StabilizerChain *group
352
+ cdef StabilizerChain *old_group
353
+ cdef StabilizerChain *tmp_gp
354
+
355
+ cdef int i, j, k, ell, b
356
+ cdef bint automorphism
357
+ cdef bint new_vertex, mem_err = 0
358
+
359
+ if n == 0:
360
+ return 0
361
+
362
+ if work_space_prealloc is not NULL:
363
+ work_space = work_space_prealloc
364
+ else:
365
+ work_space = allocate_dc_work_space(n)
366
+ if work_space is NULL:
367
+ raise MemoryError
368
+
369
+ # Allocate:
370
+ if input_group is not NULL:
371
+ perm_stack = work_space.perm_stack
372
+ group = work_space.group1
373
+ old_group = work_space.group2
374
+ orbits_of_supergroup = input_group.OP_scratch
375
+ SC_copy_nomalloc(group, input_group, n)
376
+ SC_identify(perm_stack, n)
377
+
378
+ current_ps = work_space.current_ps
379
+ first_ps = work_space.first_ps
380
+ orbits_of_subgroup = work_space.orbits_of_subgroup
381
+
382
+ indicators = work_space.int_array
383
+ permutation = work_space.int_array + n
384
+ id_perm = work_space.int_array + 2 * n
385
+ cells_to_refine_by = work_space.int_array + 3 * n
386
+ vertices_determining_current_stack = work_space.int_array + 4 * n
387
+
388
+ fixed_points_of_generators = work_space.bitset_array
389
+ minimal_cell_reps_of_generators = work_space.bitset_array + len_of_fp_and_mcr
390
+ vertices_to_split = work_space.bitset_array + 2*len_of_fp_and_mcr
391
+ vertices_have_been_reduced = work_space.bitset_array + 2*len_of_fp_and_mcr + n
392
+
393
+ if work_space_prealloc is not NULL:
394
+ OP_clear(orbits_of_subgroup)
395
+
396
+ bitset_zero(vertices_have_been_reduced[0])
397
+ left_ps = partition1
398
+
399
+ cdef bint possible = 1
400
+ cdef bint unknown = 1
401
+
402
+ # set up the identity permutation
403
+ for i in range(n):
404
+ id_perm[i] = i
405
+ if ordering2 is NULL:
406
+ ordering2 = id_perm
407
+
408
+ # Copy reordering of left_ps coming from ordering2 to current_ps.
409
+ memcpy(current_ps.entries, ordering2, n * sizeof(int))
410
+ memcpy(current_ps.levels, left_ps.levels, n * sizeof(int))
411
+ current_ps.depth = left_ps.depth
412
+
413
+ # default values of "infinity"
414
+ for i from 0 <= i < n:
415
+ indicators[i] = -1
416
+
417
+ # Our first refinement needs to check every cell of the partition,
418
+ # so cells_to_refine_by needs to be a list of pointers to each cell.
419
+ j = 1
420
+ cells_to_refine_by[0] = 0
421
+ for i from 0 < i < n:
422
+ if left_ps.levels[i-1] == 0:
423
+ cells_to_refine_by[j] = i
424
+ j += 1
425
+ if input_group is NULL:
426
+ k = refine_and_return_invariant(left_ps, S1, cells_to_refine_by, j)
427
+ else:
428
+ k = refine_also_by_orbits(left_ps, S1, refine_and_return_invariant,
429
+ cells_to_refine_by, j, group, perm_stack)
430
+ j = 1
431
+ cells_to_refine_by[0] = 0
432
+ for i from 0 < i < n:
433
+ if current_ps.levels[i-1] == 0:
434
+ cells_to_refine_by[j] = i
435
+ j += 1
436
+ if input_group is NULL:
437
+ j = refine_and_return_invariant(current_ps, S2, cells_to_refine_by, j)
438
+ else:
439
+ j = refine_also_by_orbits(current_ps, S2, refine_and_return_invariant,
440
+ cells_to_refine_by, j, group, perm_stack)
441
+ if k != j:
442
+ possible = 0
443
+ unknown = 0
444
+ elif not stacks_are_equivalent(left_ps, current_ps):
445
+ possible = 0
446
+ unknown = 0
447
+ else:
448
+ PS_move_all_mins_to_front(current_ps)
449
+
450
+ # Refine down to a discrete partition
451
+ while not PS_is_discrete(left_ps):
452
+ i = left_ps.depth
453
+ k = PS_first_smallest(left_ps, vertices_to_split[i]) # writes to vertices_to_split, but this is never used
454
+ if input_group is not NULL:
455
+ OP_clear(orbits_of_supergroup)
456
+ for j from i <= j < group.base_size:
457
+ for ell from 0 <= ell < group.num_gens[j]:
458
+ OP_merge_list_perm(orbits_of_supergroup, group.generators[j] + n*ell)
459
+ b = orbits_of_supergroup.mcr[OP_find(orbits_of_supergroup, perm_stack[i*n + k])]
460
+ tmp_gp = group
461
+ group = old_group
462
+ old_group = tmp_gp
463
+ if SC_insert_base_point_nomalloc(group, old_group, i, b):
464
+ mem_err = 1
465
+ break
466
+ indicators[i] = split_point_and_refine_by_orbits(left_ps, k, S1, refine_and_return_invariant, cells_to_refine_by, group, perm_stack)
467
+ else:
468
+ indicators[i] = split_point_and_refine(left_ps, k, S1, refine_and_return_invariant, cells_to_refine_by)
469
+ bitset_unset(vertices_have_been_reduced[0], left_ps.depth)
470
+
471
+ if not mem_err:
472
+ while not PS_is_discrete(current_ps) and possible:
473
+ i = current_ps.depth
474
+ vertices_determining_current_stack[i] = PS_first_smallest(current_ps, vertices_to_split[i])
475
+ if input_group is not NULL:
476
+ if group.parents[i][perm_stack[n*i + vertices_determining_current_stack[i]]] == -1:
477
+ possible = 0
478
+ while possible:
479
+ i = current_ps.depth
480
+ if input_group is not NULL:
481
+ j = split_point_and_refine_by_orbits(current_ps, vertices_determining_current_stack[i],
482
+ S2, refine_and_return_invariant, cells_to_refine_by, group, perm_stack)
483
+ else:
484
+ j = split_point_and_refine(current_ps,
485
+ vertices_determining_current_stack[i], S2,
486
+ refine_and_return_invariant, cells_to_refine_by)
487
+ if indicators[i] != j:
488
+ possible = 0
489
+ elif not stacks_are_equivalent(left_ps, current_ps):
490
+ possible = 0
491
+ else:
492
+ PS_move_all_mins_to_front(current_ps)
493
+ if not all_children_are_equivalent(current_ps, S2):
494
+ current_kids_are_same = current_ps.depth + 1
495
+ break
496
+ current_ps.depth -= 1
497
+ while current_ps.depth >= 0: # not possible, so look for another
498
+ i = current_ps.depth
499
+ j = vertices_determining_current_stack[i] + 1
500
+ j = bitset_next(vertices_to_split[i], j)
501
+ if j == -1:
502
+ current_ps.depth -= 1 # backtrack
503
+ else:
504
+ possible = 1
505
+ vertices_determining_current_stack[i] = j
506
+ break # found another
507
+ if possible:
508
+ if input_group is NULL:
509
+ if compare_structures(left_ps.entries, current_ps.entries, S1, S2, n) == 0:
510
+ unknown = 0
511
+ else:
512
+ PS_get_perm_from(left_ps, current_ps, permutation)
513
+ if SC_contains(group, 0, permutation, 0) and compare_structures(permutation, id_perm, S1, S2, n) == 0:
514
+ # TODO: might be slight optimization for containment using perm_stack
515
+ unknown = 0
516
+ if unknown:
517
+ first_meets_current = current_ps.depth
518
+ first_kids_are_same = current_ps.depth
519
+ PS_copy_from_to(current_ps, first_ps)
520
+ current_ps.depth -= 1
521
+
522
+ if mem_err:
523
+ if work_space_prealloc is NULL:
524
+ deallocate_dc_work_space(work_space)
525
+ raise MemoryError
526
+
527
+ # Main loop:
528
+ while possible and unknown and current_ps.depth != -1:
529
+
530
+ # I. Search for a new vertex to split, and update subgroup information
531
+ new_vertex = 0
532
+ if current_ps.depth > first_meets_current:
533
+ # If we are not at a node of the first stack, reduce size of
534
+ # vertices_to_split by using the symmetries we already know.
535
+ if not bitset_check(vertices_have_been_reduced[0], current_ps.depth):
536
+ for i from 0 <= i <= index_in_fp_and_mcr:
537
+ j = 0
538
+ while j < current_ps.depth and bitset_check(fixed_points_of_generators[i], vertices_determining_current_stack[j]):
539
+ j += 1
540
+ # If each vertex split so far is fixed by generator i,
541
+ # then remove elements of vertices_to_split which are
542
+ # not minimal in their orbits under generator i.
543
+ if j == current_ps.depth:
544
+ for k from 0 <= k < n:
545
+ if bitset_check(vertices_to_split[current_ps.depth], k) and not bitset_check(minimal_cell_reps_of_generators[i], k):
546
+ bitset_flip(vertices_to_split[current_ps.depth], k)
547
+ bitset_flip(vertices_have_been_reduced[0], current_ps.depth)
548
+ # Look for a new point to split.
549
+ i = vertices_determining_current_stack[current_ps.depth] + 1
550
+ i = bitset_next(vertices_to_split[current_ps.depth], i)
551
+ if i != -1:
552
+ # There is a new point.
553
+ vertices_determining_current_stack[current_ps.depth] = i
554
+ new_vertex = 1
555
+ else:
556
+ # No new point: backtrack.
557
+ current_ps.depth -= 1
558
+ else:
559
+ # If we are at a node of the first stack, the above reduction
560
+ # will not help. Also, we must update information about
561
+ # primary orbits here.
562
+ if current_ps.depth < first_meets_current:
563
+ # If we are done searching under this part of the first
564
+ # stack, then first_meets_current is one higher, and we
565
+ # are looking at a new primary orbit (corresponding to a
566
+ # larger subgroup in the stabilizer chain).
567
+ first_meets_current = current_ps.depth
568
+ for i from 0 <= i < n:
569
+ if bitset_check(vertices_to_split[current_ps.depth], i):
570
+ minimal_in_primary_orbit = i
571
+ break
572
+ while True:
573
+ i = vertices_determining_current_stack[current_ps.depth]
574
+ # This was the last point to be split here.
575
+ # If it is in the same orbit as minimal_in_primary_orbit,
576
+ # then count it as an element of the primary orbit.
577
+ if OP_find(orbits_of_subgroup, i) == OP_find(orbits_of_subgroup, minimal_in_primary_orbit):
578
+ subgroup_primary_orbit_size += 1
579
+ # Look for a new point to split.
580
+ i += 1
581
+ i = bitset_next(vertices_to_split[current_ps.depth], i)
582
+ if i != -1:
583
+ # There is a new point.
584
+ vertices_determining_current_stack[current_ps.depth] = i
585
+ if orbits_of_subgroup.mcr[OP_find(orbits_of_subgroup, i)] == i:
586
+ new_vertex = 1
587
+ break
588
+ else:
589
+ # No new point: backtrack.
590
+ # Note that now, we are backtracking up the first stack.
591
+ vertices_determining_current_stack[current_ps.depth] = -1
592
+ # If every choice of point to split gave something in the
593
+ # (same!) primary orbit, then all children of the first
594
+ # stack at this point are equivalent.
595
+ j = 0
596
+ for i in range(n):
597
+ if bitset_check(vertices_to_split[current_ps.depth], i):
598
+ j += 1
599
+ if j == subgroup_primary_orbit_size and first_kids_are_same == current_ps.depth+1:
600
+ first_kids_are_same = current_ps.depth
601
+ # Backtrack.
602
+ subgroup_primary_orbit_size = 0
603
+ current_ps.depth -= 1
604
+ break
605
+ if not new_vertex:
606
+ continue
607
+
608
+ if current_kids_are_same > current_ps.depth + 1:
609
+ current_kids_are_same = current_ps.depth + 1
610
+
611
+ # II. Refine down to a discrete partition, or until
612
+ # we leave the part of the tree we are interested in
613
+ while True:
614
+ i = current_ps.depth
615
+ while True:
616
+ if input_group is not NULL:
617
+ k = split_point_and_refine_by_orbits(current_ps,
618
+ vertices_determining_current_stack[i], S2,
619
+ refine_and_return_invariant, cells_to_refine_by,
620
+ group, perm_stack)
621
+ update_perm_stack(group, current_ps.depth, vertices_determining_current_stack[i], perm_stack)
622
+ else:
623
+ k = split_point_and_refine(current_ps,
624
+ vertices_determining_current_stack[i], S2,
625
+ refine_and_return_invariant, cells_to_refine_by)
626
+ PS_move_all_mins_to_front(current_ps)
627
+ if indicators[i] != k:
628
+ possible = 0
629
+ elif not stacks_are_equivalent(left_ps, current_ps):
630
+ possible = 0
631
+ if PS_is_discrete(current_ps):
632
+ break
633
+ vertices_determining_current_stack[current_ps.depth] = PS_first_smallest(current_ps, vertices_to_split[current_ps.depth])
634
+ if input_group is not NULL:
635
+ if group.parents[current_ps.depth][perm_stack[n*current_ps.depth + vertices_determining_current_stack[current_ps.depth]]] == -1:
636
+ possible = 0
637
+ if not possible:
638
+ j = vertices_determining_current_stack[i] + 1
639
+ j = bitset_next(vertices_to_split[i], j)
640
+ if j == -1:
641
+ break
642
+ else:
643
+ possible = 1
644
+ vertices_determining_current_stack[i] = j
645
+ current_ps.depth -= 1 # reset for next refinement
646
+ else:
647
+ break
648
+ if not possible:
649
+ break
650
+ if PS_is_discrete(current_ps):
651
+ break
652
+ bitset_unset(vertices_have_been_reduced[0], current_ps.depth)
653
+ if not all_children_are_equivalent(current_ps, S2):
654
+ current_kids_are_same = current_ps.depth + 1
655
+
656
+ # III. Check for automorphisms and isomorphisms
657
+ automorphism = 0
658
+ if possible:
659
+ PS_get_perm_from(first_ps, current_ps, permutation)
660
+ if compare_structures(permutation, id_perm, S2, S2, n) == 0:
661
+ if input_group is NULL or SC_contains(group, 0, permutation, 0):
662
+ # TODO: might be slight optimization for containment using perm_stack
663
+ automorphism = 1
664
+ if not automorphism and possible:
665
+ # if we get here, discrete must be true
666
+ if current_ps.depth != left_ps.depth:
667
+ possible = 0
668
+ elif input_group is NULL:
669
+ if compare_structures(left_ps.entries, current_ps.entries, S1, S2, n) == 0:
670
+ unknown = 0
671
+ break
672
+ else:
673
+ possible = 0
674
+ else:
675
+ PS_get_perm_from(left_ps, current_ps, permutation)
676
+ if SC_contains(group, 0, permutation, 0) and compare_structures(permutation, id_perm, S1, S2, n) == 0:
677
+ # TODO: might be slight optimization for containment using perm_stack
678
+ unknown = 0
679
+ break
680
+ else:
681
+ possible = 0
682
+ if automorphism:
683
+ if index_in_fp_and_mcr < len_of_fp_and_mcr - 1:
684
+ index_in_fp_and_mcr += 1
685
+ bitset_zero(fixed_points_of_generators[index_in_fp_and_mcr])
686
+ bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
687
+ for i in range(n):
688
+ if permutation[i] == i:
689
+ bitset_set(fixed_points_of_generators[index_in_fp_and_mcr], i)
690
+ bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
691
+ else:
692
+ bitset_unset(fixed_points_of_generators[index_in_fp_and_mcr], i)
693
+ k = i
694
+ j = permutation[i]
695
+ while j != i:
696
+ if j < k:
697
+ k = j
698
+ j = permutation[j]
699
+ if k == i:
700
+ bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
701
+ else:
702
+ bitset_unset(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
703
+ current_ps.depth = first_meets_current
704
+ if OP_merge_list_perm(orbits_of_subgroup, permutation): # if permutation made orbits coarser
705
+ if orbits_of_subgroup.mcr[OP_find(orbits_of_subgroup, minimal_in_primary_orbit)] != minimal_in_primary_orbit:
706
+ continue # main loop
707
+ if bitset_check(vertices_have_been_reduced[0], current_ps.depth):
708
+ bitset_and(vertices_to_split[current_ps.depth], vertices_to_split[current_ps.depth], minimal_cell_reps_of_generators[index_in_fp_and_mcr])
709
+ continue # main loop
710
+ if not possible:
711
+ possible = 1
712
+ i = current_ps.depth
713
+ current_ps.depth = current_kids_are_same-1
714
+ if i == current_kids_are_same:
715
+ continue # main loop
716
+ if index_in_fp_and_mcr < len_of_fp_and_mcr - 1:
717
+ index_in_fp_and_mcr += 1
718
+ bitset_zero(fixed_points_of_generators[index_in_fp_and_mcr])
719
+ bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
720
+ j = current_ps.depth
721
+ current_ps.depth = i # just for mcr and fixed functions...
722
+ for i from 0 <= i < n:
723
+ if PS_is_mcr(current_ps, i):
724
+ bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
725
+ if PS_is_fixed(current_ps, i):
726
+ bitset_set(fixed_points_of_generators[index_in_fp_and_mcr], i)
727
+ current_ps.depth = j
728
+ if bitset_check(vertices_have_been_reduced[0], current_ps.depth):
729
+ bitset_and(vertices_to_split[current_ps.depth], vertices_to_split[current_ps.depth], minimal_cell_reps_of_generators[index_in_fp_and_mcr])
730
+
731
+ # End of main loop.
732
+ if possible and not unknown and isom is not NULL:
733
+ for i from 0 <= i < n:
734
+ isom[left_ps.entries[i]] = current_ps.entries[i]
735
+
736
+ # Deallocate:
737
+ if work_space_prealloc is NULL:
738
+ deallocate_dc_work_space(work_space)
739
+ return 1 if (possible and not unknown) else 0