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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
#*****************************************************************************
|
|
3
|
+
# Copyright (C) 2006 - 2011 Robert L. Miller <rlmillster@gmail.com>
|
|
4
|
+
#
|
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
|
7
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
# http://www.gnu.org/licenses/
|
|
10
|
+
#*****************************************************************************
|
|
11
|
+
|
|
12
|
+
from sage.data_structures.bitset_base cimport *
|
|
13
|
+
|
|
14
|
+
from libc.string cimport memcpy
|
|
15
|
+
from libc.stdlib cimport rand
|
|
16
|
+
from sage.libs.gmp.mpz cimport *
|
|
17
|
+
|
|
18
|
+
from cysignals.memory cimport sig_free
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
cdef enum:
|
|
22
|
+
# The following is for the automorphism group computation, says what the
|
|
23
|
+
# length of fixed point and minimal cell representative arrays should be,
|
|
24
|
+
# which are used to prune the search tree under known symmetries.
|
|
25
|
+
# Increasing this may make certain automorphism_group_and_canonical_label
|
|
26
|
+
# computations faster for incredibly large groups.
|
|
27
|
+
len_of_fp_and_mcr = 100
|
|
28
|
+
|
|
29
|
+
cdef struct OrbitPartition:
|
|
30
|
+
# Disjoint set data structure for representing the orbits of the generators
|
|
31
|
+
# so far found. Also keeps track of the minimum elements of the cells and
|
|
32
|
+
# their sizes.
|
|
33
|
+
int degree
|
|
34
|
+
int num_cells
|
|
35
|
+
int *parent
|
|
36
|
+
int *rank
|
|
37
|
+
int *mcr # minimum cell representatives - only valid at the root of a cell
|
|
38
|
+
int *size # also only valid at the root of a cell
|
|
39
|
+
|
|
40
|
+
cdef struct PartitionStack:
|
|
41
|
+
# Representation of a node of the search tree. A sequence of partitions of
|
|
42
|
+
# length depth + 1, each of which is finer than the last. Partition k is
|
|
43
|
+
# represented as PS.entries in order, broken up immediately after each
|
|
44
|
+
# entry of levels which is at most k.
|
|
45
|
+
int *entries
|
|
46
|
+
int *levels
|
|
47
|
+
int depth
|
|
48
|
+
int degree
|
|
49
|
+
|
|
50
|
+
cdef struct StabilizerChain:
|
|
51
|
+
# A representation of a permutation group acting on 0, 1, ..., degree-1.
|
|
52
|
+
int degree
|
|
53
|
+
int base_size
|
|
54
|
+
|
|
55
|
+
int *orbit_sizes
|
|
56
|
+
int *num_gens # dimension of generator cube on each level
|
|
57
|
+
int *array_size # size of space to hold generators on each level (number of permutations)
|
|
58
|
+
|
|
59
|
+
int **base_orbits #
|
|
60
|
+
int **parents # three n*n squares, orbits and tree structures
|
|
61
|
+
int **labels #
|
|
62
|
+
|
|
63
|
+
int **generators # generators for each level,
|
|
64
|
+
int **gen_inverses # and their inverses
|
|
65
|
+
|
|
66
|
+
bitset_s gen_used
|
|
67
|
+
bitset_s gen_is_id
|
|
68
|
+
int *perm_scratch
|
|
69
|
+
OrbitPartition *OP_scratch
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# OrbitPartition (OP)
|
|
73
|
+
|
|
74
|
+
cdef OrbitPartition *OP_new(int n) noexcept
|
|
75
|
+
|
|
76
|
+
cdef void OP_dealloc(OrbitPartition *OP) noexcept
|
|
77
|
+
|
|
78
|
+
cdef inline int OP_copy_from_to(OrbitPartition *OP, OrbitPartition *OP2) noexcept:
|
|
79
|
+
"""
|
|
80
|
+
Copy all data from OP to OP2, we suppose that
|
|
81
|
+
|
|
82
|
+
- OP2.degree == OP.degree
|
|
83
|
+
- OP2.num_cells == OP.num_cells
|
|
84
|
+
"""
|
|
85
|
+
memcpy(OP2.parent, OP.parent, OP.degree * sizeof(int))
|
|
86
|
+
memcpy(OP2.rank, OP.rank, OP.degree * sizeof(int))
|
|
87
|
+
memcpy(OP2.mcr, OP.mcr, OP.degree * sizeof(int))
|
|
88
|
+
memcpy(OP2.size, OP.size, OP.degree * sizeof(int))
|
|
89
|
+
|
|
90
|
+
cdef inline OrbitPartition *OP_copy(OrbitPartition *OP) noexcept:
|
|
91
|
+
"""
|
|
92
|
+
Allocate and return a pointer to a copy of a OrbitPartition of degree n.
|
|
93
|
+
|
|
94
|
+
Returns a null pointer in the case of an allocation failure.
|
|
95
|
+
"""
|
|
96
|
+
cdef OrbitPartition *OP2 = OP_new(OP.degree)
|
|
97
|
+
if OP is NULL:
|
|
98
|
+
raise MemoryError("MemoryError allocating OrbitPartition in copy method")
|
|
99
|
+
|
|
100
|
+
OP_copy_from_to(OP, OP2)
|
|
101
|
+
return OP2
|
|
102
|
+
|
|
103
|
+
cdef OP_string(OrbitPartition *OP)
|
|
104
|
+
|
|
105
|
+
cdef inline void OP_clear(OrbitPartition *OP) noexcept:
|
|
106
|
+
cdef int i, n = OP.degree
|
|
107
|
+
for i from 0 <= i < n:
|
|
108
|
+
OP.parent[i] = i
|
|
109
|
+
OP.rank[i] = 0
|
|
110
|
+
OP.mcr[i] = i
|
|
111
|
+
OP.size[i] = 1
|
|
112
|
+
|
|
113
|
+
cdef inline int OP_find(OrbitPartition *OP, int n) noexcept:
|
|
114
|
+
"""
|
|
115
|
+
Report the representative ("root") of the cell which contains n.
|
|
116
|
+
"""
|
|
117
|
+
if OP.parent[n] == n:
|
|
118
|
+
return n
|
|
119
|
+
else:
|
|
120
|
+
OP.parent[n] = OP_find(OP, OP.parent[n])
|
|
121
|
+
return OP.parent[n]
|
|
122
|
+
|
|
123
|
+
cdef inline void OP_join(OrbitPartition *OP, int m, int n) noexcept:
|
|
124
|
+
"""
|
|
125
|
+
Join the cells containing m and n, if they are different.
|
|
126
|
+
"""
|
|
127
|
+
cdef int m_root = OP_find(OP, m)
|
|
128
|
+
cdef int n_root = OP_find(OP, n)
|
|
129
|
+
if OP.rank[m_root] > OP.rank[n_root]:
|
|
130
|
+
OP.parent[n_root] = m_root
|
|
131
|
+
OP.mcr[m_root] = min(OP.mcr[m_root], OP.mcr[n_root])
|
|
132
|
+
OP.size[m_root] += OP.size[n_root]
|
|
133
|
+
elif OP.rank[m_root] < OP.rank[n_root]:
|
|
134
|
+
OP.parent[m_root] = n_root
|
|
135
|
+
OP.mcr[n_root] = min(OP.mcr[m_root], OP.mcr[n_root])
|
|
136
|
+
OP.size[n_root] += OP.size[m_root]
|
|
137
|
+
elif m_root != n_root:
|
|
138
|
+
OP.parent[n_root] = m_root
|
|
139
|
+
OP.mcr[m_root] = min(OP.mcr[m_root], OP.mcr[n_root])
|
|
140
|
+
OP.size[m_root] += OP.size[n_root]
|
|
141
|
+
OP.rank[m_root] += 1
|
|
142
|
+
if m_root != n_root:
|
|
143
|
+
OP.num_cells -= 1
|
|
144
|
+
|
|
145
|
+
cdef void OP_make_set(OrbitPartition *OP) noexcept
|
|
146
|
+
|
|
147
|
+
cdef inline int OP_merge_list_perm(OrbitPartition *OP, int *gamma) noexcept:
|
|
148
|
+
"""
|
|
149
|
+
Joins the cells of OP which intersect the same orbit of gamma.
|
|
150
|
+
|
|
151
|
+
INPUT:
|
|
152
|
+
|
|
153
|
+
- ``gamma`` - an integer array representing ``i -> gamma[i]``.
|
|
154
|
+
|
|
155
|
+
OUTPUT:
|
|
156
|
+
|
|
157
|
+
- 1 -- something changed
|
|
158
|
+
- 0 -- orbits of gamma all contained in cells of OP
|
|
159
|
+
"""
|
|
160
|
+
cdef int i, i_root, gamma_i_root, changed = 0
|
|
161
|
+
for i from 0 <= i < OP.degree:
|
|
162
|
+
if gamma[i] == i:
|
|
163
|
+
continue
|
|
164
|
+
i_root = OP_find(OP, i)
|
|
165
|
+
gamma_i_root = OP_find(OP, gamma[i])
|
|
166
|
+
if i_root != gamma_i_root:
|
|
167
|
+
changed = 1
|
|
168
|
+
OP_join(OP, i_root, gamma_i_root)
|
|
169
|
+
return changed
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# PartitionStack (PS)
|
|
173
|
+
|
|
174
|
+
cdef inline int PS_copy_from_to(PartitionStack *PS, PartitionStack *PS2) noexcept:
|
|
175
|
+
"""
|
|
176
|
+
Copy all data from PS to PS2.
|
|
177
|
+
"""
|
|
178
|
+
PS2.depth = PS.depth
|
|
179
|
+
PS2.degree = PS.degree
|
|
180
|
+
memcpy(PS2.entries, PS.entries, 2*PS.degree * sizeof(int) )
|
|
181
|
+
|
|
182
|
+
cdef inline bint PS_is_discrete(PartitionStack *PS) noexcept:
|
|
183
|
+
"""
|
|
184
|
+
Return whether the deepest partition consists only of singleton cells.
|
|
185
|
+
"""
|
|
186
|
+
cdef int i
|
|
187
|
+
for i from 0 <= i < PS.degree:
|
|
188
|
+
if PS.levels[i] > PS.depth:
|
|
189
|
+
return 0
|
|
190
|
+
return 1
|
|
191
|
+
|
|
192
|
+
cdef inline int PS_num_cells(PartitionStack *PS) noexcept:
|
|
193
|
+
"""
|
|
194
|
+
Return the number of cells.
|
|
195
|
+
"""
|
|
196
|
+
cdef int i, ncells = 0
|
|
197
|
+
for i from 0 <= i < PS.degree:
|
|
198
|
+
if PS.levels[i] <= PS.depth:
|
|
199
|
+
ncells += 1
|
|
200
|
+
return ncells
|
|
201
|
+
|
|
202
|
+
cdef inline void PS_move_min_to_front(PartitionStack *PS, int start, int end) noexcept:
|
|
203
|
+
"""
|
|
204
|
+
Makes sure that the first element of the segment of entries i with
|
|
205
|
+
start <= i <= end is minimal.
|
|
206
|
+
"""
|
|
207
|
+
cdef int i, min_loc = start, minimum = PS.entries[start]
|
|
208
|
+
for i from start < i <= end:
|
|
209
|
+
if PS.entries[i] < minimum:
|
|
210
|
+
min_loc = i
|
|
211
|
+
minimum = PS.entries[i]
|
|
212
|
+
if min_loc != start:
|
|
213
|
+
PS.entries[min_loc] = PS.entries[start]
|
|
214
|
+
PS.entries[start] = minimum
|
|
215
|
+
|
|
216
|
+
cdef inline bint PS_is_mcr(PartitionStack *PS, int m) noexcept:
|
|
217
|
+
"""
|
|
218
|
+
Return whether PS.elements[m] (not m!) is the smallest element of its cell.
|
|
219
|
+
"""
|
|
220
|
+
return m == 0 or PS.levels[m-1] <= PS.depth
|
|
221
|
+
|
|
222
|
+
cdef inline bint PS_is_fixed(PartitionStack *PS, int m) noexcept:
|
|
223
|
+
"""
|
|
224
|
+
Return whether PS.elements[m] (not m!) is in a singleton cell, assuming
|
|
225
|
+
PS_is_mcr(PS, m) is already true.
|
|
226
|
+
"""
|
|
227
|
+
return PS.levels[m] <= PS.depth
|
|
228
|
+
|
|
229
|
+
cdef inline int PS_clear(PartitionStack *PS) noexcept:
|
|
230
|
+
"""
|
|
231
|
+
Set the current partition to the first shallower one, i.e. forgets about
|
|
232
|
+
boundaries between cells that are new to the current level.
|
|
233
|
+
"""
|
|
234
|
+
cdef int i, cur_start = 0
|
|
235
|
+
for i from 0 <= i < PS.degree:
|
|
236
|
+
if PS.levels[i] == PS.depth:
|
|
237
|
+
PS.levels[i] += 1
|
|
238
|
+
if PS.levels[i] < PS.depth:
|
|
239
|
+
PS_move_min_to_front(PS, cur_start, i)
|
|
240
|
+
cur_start = i+1
|
|
241
|
+
|
|
242
|
+
cdef inline int PS_move_all_mins_to_front(PartitionStack *PS) noexcept:
|
|
243
|
+
"""
|
|
244
|
+
Move minimal cell elements to the front of each cell.
|
|
245
|
+
"""
|
|
246
|
+
cdef int i, cur_start = 0
|
|
247
|
+
for i from 0 <= i < PS.degree:
|
|
248
|
+
if PS.levels[i] <= PS.depth:
|
|
249
|
+
PS_move_min_to_front(PS, cur_start, i)
|
|
250
|
+
cur_start = i+1
|
|
251
|
+
|
|
252
|
+
cdef inline int PS_get_perm_from(PartitionStack *PS1, PartitionStack *PS2, int *gamma) noexcept:
|
|
253
|
+
"""
|
|
254
|
+
Store the permutation determined by PS2[i] -> PS1[i] for each i, where PS[i]
|
|
255
|
+
denotes the entry of the `i`-th cell of the discrete partition PS.
|
|
256
|
+
"""
|
|
257
|
+
cdef int i
|
|
258
|
+
for i from 0 <= i < PS1.degree:
|
|
259
|
+
gamma[PS2.entries[i]] = PS1.entries[i]
|
|
260
|
+
|
|
261
|
+
cdef PartitionStack *PS_new(int n, bint unit_partition) noexcept
|
|
262
|
+
|
|
263
|
+
cdef PartitionStack *PS_copy(PartitionStack *PS) noexcept
|
|
264
|
+
|
|
265
|
+
cdef void PS_dealloc(PartitionStack *PS) noexcept
|
|
266
|
+
|
|
267
|
+
cdef PS_print(PartitionStack *PS)
|
|
268
|
+
|
|
269
|
+
cdef void PS_unit_partition(PartitionStack *PS) noexcept
|
|
270
|
+
|
|
271
|
+
cdef int PS_first_smallest(PartitionStack *PS, bitset_t b, int *second_pos=?) noexcept
|
|
272
|
+
|
|
273
|
+
cdef PartitionStack *PS_from_list(list L) noexcept
|
|
274
|
+
|
|
275
|
+
cdef list PS_singletons(PartitionStack * part)
|
|
276
|
+
|
|
277
|
+
cdef int PS_all_new_cells(PartitionStack *PS, bitset_t** nonsingletons_ptr) noexcept
|
|
278
|
+
|
|
279
|
+
cdef inline bint stacks_are_equivalent(PartitionStack *PS1, PartitionStack *PS2) noexcept:
|
|
280
|
+
cdef int i, j, depth = min(PS1.depth, PS2.depth)
|
|
281
|
+
for i from 0 <= i < PS1.degree:
|
|
282
|
+
if PS1.levels[i] == PS2.levels[i]:
|
|
283
|
+
continue
|
|
284
|
+
elif ((PS1.levels[i] <= depth < PS2.levels[i])
|
|
285
|
+
or (PS2.levels[i] <= depth < PS1.levels[i])):
|
|
286
|
+
return 0
|
|
287
|
+
return 1
|
|
288
|
+
|
|
289
|
+
cdef int sort_by_function(PartitionStack *PS, int start, int *degrees) noexcept
|
|
290
|
+
|
|
291
|
+
cdef inline int PS_split_point(PartitionStack *PS, int v) noexcept:
|
|
292
|
+
"""
|
|
293
|
+
Detaches the point v from the cell it is in, putting the singleton cell
|
|
294
|
+
of just v in front. Returns the position where v is now located.
|
|
295
|
+
"""
|
|
296
|
+
cdef int i = 0, index_of_v
|
|
297
|
+
while PS.entries[i] != v:
|
|
298
|
+
i += 1
|
|
299
|
+
index_of_v = i
|
|
300
|
+
while PS.levels[i] > PS.depth:
|
|
301
|
+
i += 1
|
|
302
|
+
if (index_of_v == 0 or PS.levels[index_of_v-1] <= PS.depth) \
|
|
303
|
+
and PS.levels[index_of_v] > PS.depth:
|
|
304
|
+
# if v is first (make sure v is not already alone)
|
|
305
|
+
PS_move_min_to_front(PS, index_of_v+1, i)
|
|
306
|
+
PS.levels[index_of_v] = PS.depth
|
|
307
|
+
return index_of_v
|
|
308
|
+
else:
|
|
309
|
+
# If v is not at front, i.e. v is not minimal in its cell,
|
|
310
|
+
# then move_min_to_front is not necessary since v will swap
|
|
311
|
+
# with the first before making its own cell, leaving it at
|
|
312
|
+
# the front of the other.
|
|
313
|
+
i = index_of_v
|
|
314
|
+
while i != 0 and PS.levels[i-1] > PS.depth:
|
|
315
|
+
i -= 1
|
|
316
|
+
PS.entries[index_of_v] = PS.entries[i+1] # move the second element to v
|
|
317
|
+
PS.entries[i+1] = PS.entries[i] # move the first (min) to second
|
|
318
|
+
PS.entries[i] = v # place v first
|
|
319
|
+
PS.levels[i] = PS.depth
|
|
320
|
+
return i
|
|
321
|
+
|
|
322
|
+
cdef inline int split_point_and_refine(PartitionStack *PS, int v, void *S,
|
|
323
|
+
int (*refine_and_return_invariant)
|
|
324
|
+
(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len) noexcept,
|
|
325
|
+
int *cells_to_refine_by) noexcept:
|
|
326
|
+
"""
|
|
327
|
+
Make the partition stack one longer by copying the last partition in the
|
|
328
|
+
stack, split off a given point, and refine. Return the invariant given by
|
|
329
|
+
the refinement function.
|
|
330
|
+
|
|
331
|
+
INPUT:
|
|
332
|
+
- ``PS`` -- the partition stack to refine
|
|
333
|
+
- ``v`` -- the point to split
|
|
334
|
+
- ``S`` -- the structure
|
|
335
|
+
- ``refine_and_return_invariant`` -- the refinement function provided
|
|
336
|
+
- ``cells_to_refine_by`` -- an array, contents ignored
|
|
337
|
+
- ``group`` -- the containing group, NULL for full S_n
|
|
338
|
+
- ``perm_stack`` -- represents a partial traversal decomposition for group
|
|
339
|
+
"""
|
|
340
|
+
PS.depth += 1
|
|
341
|
+
PS_clear(PS)
|
|
342
|
+
cells_to_refine_by[0] = PS_split_point(PS, v)
|
|
343
|
+
return refine_and_return_invariant(PS, S, cells_to_refine_by, 1)
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
# StabilizerChain (SC)
|
|
347
|
+
|
|
348
|
+
cdef StabilizerChain *SC_new(int n, bint init_gens=?) noexcept
|
|
349
|
+
|
|
350
|
+
cdef int SC_realloc_gens(StabilizerChain *SC, int level, int size) noexcept
|
|
351
|
+
|
|
352
|
+
cdef void SC_dealloc(StabilizerChain *SC) noexcept
|
|
353
|
+
|
|
354
|
+
cdef int SC_copy_nomalloc(StabilizerChain *SC_dest, StabilizerChain *SC,
|
|
355
|
+
int level) noexcept
|
|
356
|
+
|
|
357
|
+
cdef StabilizerChain *SC_alternating_group(int n) noexcept
|
|
358
|
+
|
|
359
|
+
cdef int SC_insert_and_sift(StabilizerChain *SC, int level, int *pi,
|
|
360
|
+
int num_perms, bint sift) noexcept
|
|
361
|
+
|
|
362
|
+
cdef int SC_insert_base_point_nomalloc(StabilizerChain *SC_dest,
|
|
363
|
+
StabilizerChain *SC, int level, int p) noexcept
|
|
364
|
+
|
|
365
|
+
cdef inline int SC_perm_is_identity(int *perm, int degree) noexcept:
|
|
366
|
+
for i from 0 <= i < degree:
|
|
367
|
+
if perm[i] != i:
|
|
368
|
+
break
|
|
369
|
+
else:
|
|
370
|
+
return 1
|
|
371
|
+
return 0
|
|
372
|
+
|
|
373
|
+
cdef inline void SC_mult_perms(int *out, int *first, int *second, int degree) noexcept:
|
|
374
|
+
"""
|
|
375
|
+
DON'T DO THIS WITH out == second!
|
|
376
|
+
"""
|
|
377
|
+
cdef int i
|
|
378
|
+
for i from 0 <= i < degree:
|
|
379
|
+
out[i] = second[first[i]]
|
|
380
|
+
|
|
381
|
+
cdef inline void SC_invert_perm(int *out, int *input, int degree) noexcept:
|
|
382
|
+
"""
|
|
383
|
+
DON'T DO THIS WITH out == in!
|
|
384
|
+
"""
|
|
385
|
+
cdef int i
|
|
386
|
+
for i from 0 <= i < degree:
|
|
387
|
+
out[input[i]] = i
|
|
388
|
+
|
|
389
|
+
cdef inline void SC_identify(int *perm, int degree) noexcept:
|
|
390
|
+
cdef int i
|
|
391
|
+
for i from 0 <= i < degree:
|
|
392
|
+
perm[i] = i
|
|
393
|
+
|
|
394
|
+
cdef inline void SC_add_base_point(StabilizerChain *SC, int b) noexcept:
|
|
395
|
+
"""
|
|
396
|
+
Add base point b to the end of SC. Assumes b is not already in the base.
|
|
397
|
+
"""
|
|
398
|
+
cdef int i, n = SC.degree
|
|
399
|
+
SC.orbit_sizes[SC.base_size] = 1
|
|
400
|
+
SC.num_gens[SC.base_size] = 0
|
|
401
|
+
SC.base_orbits[SC.base_size][0] = b
|
|
402
|
+
for i from 0 <= i < n:
|
|
403
|
+
SC.parents[SC.base_size][i] = -1
|
|
404
|
+
SC.parents[SC.base_size][b] = b
|
|
405
|
+
SC.labels[SC.base_size][b] = 0
|
|
406
|
+
SC.base_size += 1
|
|
407
|
+
|
|
408
|
+
cdef inline int SC_cleanup(StabilizerChain *SC) noexcept:
|
|
409
|
+
"""
|
|
410
|
+
Remove redundant base elements from SC.
|
|
411
|
+
|
|
412
|
+
Returns 1 if nothing changed, and 2 in case of an allocation failure.
|
|
413
|
+
"""
|
|
414
|
+
cdef int old, new = 0, i, n = SC.degree
|
|
415
|
+
for old from 0 <= old < SC.base_size:
|
|
416
|
+
if SC.orbit_sizes[old] != 1:
|
|
417
|
+
if old != new:
|
|
418
|
+
# copy row old to row new
|
|
419
|
+
SC.orbit_sizes[new] = SC.orbit_sizes[old]
|
|
420
|
+
SC.num_gens[new] = SC.num_gens[old]
|
|
421
|
+
if SC.array_size[new] < SC.array_size[old]:
|
|
422
|
+
if SC_realloc_gens(SC, new, max(SC.array_size[old], 2*SC.array_size[new])):
|
|
423
|
+
return 2
|
|
424
|
+
memcpy(SC.base_orbits[new], SC.base_orbits[old], n * sizeof(int))
|
|
425
|
+
memcpy(SC.parents[new], SC.parents[old], n * sizeof(int))
|
|
426
|
+
memcpy(SC.labels[new], SC.labels[old], n * sizeof(int))
|
|
427
|
+
memcpy(SC.generators[new], SC.generators[old], n*SC.num_gens[old] * sizeof(int))
|
|
428
|
+
memcpy(SC.gen_inverses[new], SC.gen_inverses[old], n*SC.num_gens[old] * sizeof(int))
|
|
429
|
+
new += 1
|
|
430
|
+
old = SC.base_size
|
|
431
|
+
SC.base_size = new
|
|
432
|
+
return (old == new)
|
|
433
|
+
|
|
434
|
+
cdef inline void SC_compose_up_to_base(StabilizerChain *SC, int level, int x, int *perm) noexcept:
|
|
435
|
+
"""
|
|
436
|
+
Repeatedly compose the given perm by labels on the Schreier tree, starting
|
|
437
|
+
with x, until the base is reached. The composition is stored to perm.
|
|
438
|
+
"""
|
|
439
|
+
cdef int b = SC.base_orbits[level][0], n = SC.degree
|
|
440
|
+
cdef int *label
|
|
441
|
+
cdef int label_no
|
|
442
|
+
while x != b:
|
|
443
|
+
label_no = SC.labels[level][x]
|
|
444
|
+
if label_no < 0:
|
|
445
|
+
label_no = -label_no - 1
|
|
446
|
+
label = SC.gen_inverses[level] + n*label_no
|
|
447
|
+
else:
|
|
448
|
+
label_no = label_no - 1
|
|
449
|
+
label = SC.generators[level] + n*label_no
|
|
450
|
+
x = SC.parents[level][x]
|
|
451
|
+
SC_mult_perms(perm, perm, label, n)
|
|
452
|
+
|
|
453
|
+
cdef inline void SC_scan(StabilizerChain *SC, int level, int x, int gen_index, int *gen, int sign) noexcept:
|
|
454
|
+
"""
|
|
455
|
+
See whether the point x is moved to a point outside the
|
|
456
|
+
tree by gen, and if so add it to the tree (arc label is gen_inv).
|
|
457
|
+
|
|
458
|
+
gen_index - where in the generator array the generator is located
|
|
459
|
+
gen - points to the generator
|
|
460
|
+
gen_inv - points to the inverse
|
|
461
|
+
sign - whether to take SC.generators or SC.gen_inverses to go *up* the tree
|
|
462
|
+
"""
|
|
463
|
+
cdef int y = gen[x], n = SC.degree
|
|
464
|
+
if SC.parents[level][y] == -1:
|
|
465
|
+
SC.base_orbits[level][SC.orbit_sizes[level]] = y
|
|
466
|
+
SC.orbit_sizes[level] += 1
|
|
467
|
+
SC.parents[level][y] = x
|
|
468
|
+
SC.labels[level][y] = sign*(gen_index+1)
|
|
469
|
+
|
|
470
|
+
cdef inline int SC_insert(StabilizerChain *SC, int level, int *pi, int num_perms) noexcept:
|
|
471
|
+
"""
|
|
472
|
+
Add permutations in pi to the stabilizer chain. The array pi is a sequence
|
|
473
|
+
of num_perms permutations, each in list representation, hence pi should be
|
|
474
|
+
at least length SC.degree*num_perms. There must be at most SC.degree perms.
|
|
475
|
+
(Simply call the function again if you want to add more.)
|
|
476
|
+
|
|
477
|
+
The variable ``level`` is used for recursion. From the outside, should be
|
|
478
|
+
set to zero. On the inside, used to bring the data structure up to date of
|
|
479
|
+
level ``level``, given that it is up to date on ``level + 1``.
|
|
480
|
+
|
|
481
|
+
Return values:
|
|
482
|
+
0 - No errors.
|
|
483
|
+
1 - Allocation failure.
|
|
484
|
+
"""
|
|
485
|
+
return SC_insert_and_sift(SC, level, pi, num_perms, 1)
|
|
486
|
+
|
|
487
|
+
cdef inline int SC_update_tree(StabilizerChain *SC, int level, int *pi, int num_perms) noexcept:
|
|
488
|
+
return SC_insert_and_sift(SC, level, pi, num_perms, 0)
|
|
489
|
+
|
|
490
|
+
cdef inline void SC_order(StabilizerChain *SC, int i, mpz_t order) noexcept:
|
|
491
|
+
"""
|
|
492
|
+
Give the order of the stabilizer of base points up to but not including the
|
|
493
|
+
`i`-th, storing it to ``order``, which must be already initialized.
|
|
494
|
+
|
|
495
|
+
To get the order of the full group, let ``i = 0``.
|
|
496
|
+
"""
|
|
497
|
+
cdef int k
|
|
498
|
+
mpz_set_si(order, 1)
|
|
499
|
+
for k from i <= k < SC.base_size:
|
|
500
|
+
mpz_mul_si(order, order, SC.orbit_sizes[k])
|
|
501
|
+
|
|
502
|
+
cdef inline bint SC_contains(StabilizerChain *SC, int level, int *pi, bint modify) noexcept:
|
|
503
|
+
"""
|
|
504
|
+
Test whether pi is in the level-th stabilizer.
|
|
505
|
+
|
|
506
|
+
Assumes that pi stabilizes the first level base points.
|
|
507
|
+
"""
|
|
508
|
+
cdef int b, i, j, x, n = SC.degree
|
|
509
|
+
cdef int *perm
|
|
510
|
+
if modify:
|
|
511
|
+
perm = pi
|
|
512
|
+
else:
|
|
513
|
+
perm = SC.perm_scratch
|
|
514
|
+
memcpy(perm, pi, n*sizeof(int))
|
|
515
|
+
for i from level <= i < SC.base_size:
|
|
516
|
+
b = SC.base_orbits[i][0]
|
|
517
|
+
x = perm[b]
|
|
518
|
+
if x == b:
|
|
519
|
+
continue
|
|
520
|
+
if SC.parents[i][x] == -1:
|
|
521
|
+
return 0
|
|
522
|
+
SC_compose_up_to_base(SC, i, x, perm)
|
|
523
|
+
return SC_perm_is_identity(perm, n)
|
|
524
|
+
|
|
525
|
+
cdef inline void SC_random_element(StabilizerChain *SC, int level, int *perm) noexcept:
|
|
526
|
+
"""
|
|
527
|
+
Give a random element of the level-th stabilizer. For a random element of the
|
|
528
|
+
whole group, set level to 0. Must have level < SC.base_size.
|
|
529
|
+
"""
|
|
530
|
+
cdef int i, x, n = SC.degree
|
|
531
|
+
SC_identify(perm, n)
|
|
532
|
+
for i from level <= i < SC.base_size:
|
|
533
|
+
x = SC.base_orbits[i][rand() % SC.orbit_sizes[i]]
|
|
534
|
+
SC_compose_up_to_base(SC, i, x, perm)
|
|
535
|
+
|
|
536
|
+
cdef int compute_relabeling(StabilizerChain *group,
|
|
537
|
+
StabilizerChain *scratch_group,
|
|
538
|
+
int *permutation, int *relabeling) noexcept
|
|
539
|
+
|
|
540
|
+
cdef inline void update_perm_stack(StabilizerChain *group, int level, int point,
|
|
541
|
+
int *perm_stack) noexcept:
|
|
542
|
+
"""
|
|
543
|
+
Ensure that perm_stack[level] is gamma_0^{-1}...gamma_{level-1}^{-1}, where
|
|
544
|
+
each gamma_i represents the coset representative at the `i`-th level determined
|
|
545
|
+
by our current position in the search tree.
|
|
546
|
+
|
|
547
|
+
For internal use within the automorphism group, canonical label and double
|
|
548
|
+
coset functions, to be called after refinement (level = depth after refinement).
|
|
549
|
+
"""
|
|
550
|
+
cdef int n = group.degree
|
|
551
|
+
memcpy(perm_stack + n*level, perm_stack + n*(level-1), n*sizeof(int))
|
|
552
|
+
SC_compose_up_to_base(group, level-1, perm_stack[n*(level-1) + point], perm_stack + n*level)
|
|
553
|
+
|
|
554
|
+
cdef inline int split_point_and_refine_by_orbits(PartitionStack *PS, int v,
|
|
555
|
+
void *S, int (*refine_and_return_invariant)
|
|
556
|
+
(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len) noexcept,
|
|
557
|
+
int *cells_to_refine_by, StabilizerChain *SC, int *perm_stack) noexcept:
|
|
558
|
+
""" """
|
|
559
|
+
PS.depth += 1
|
|
560
|
+
PS_clear(PS)
|
|
561
|
+
cells_to_refine_by[0] = PS_split_point(PS, v)
|
|
562
|
+
update_perm_stack(SC, PS.depth, v, perm_stack)
|
|
563
|
+
return refine_also_by_orbits(PS, S, refine_and_return_invariant, cells_to_refine_by, 1, SC, perm_stack)
|
|
564
|
+
|
|
565
|
+
cdef int refine_by_orbits(PartitionStack *PS, StabilizerChain *SC,
|
|
566
|
+
int *perm_stack, int *cells_to_refine_by, int *ctrb_len) noexcept
|
|
567
|
+
|
|
568
|
+
cdef inline int refine_also_by_orbits(PartitionStack *PS, void *S,
|
|
569
|
+
int (*refine_and_return_invariant)
|
|
570
|
+
(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len) noexcept,
|
|
571
|
+
int *cells_to_refine_by, int ctrb_len, StabilizerChain *SC, int *perm_stack) noexcept:
|
|
572
|
+
""" """
|
|
573
|
+
cdef int inv
|
|
574
|
+
inv = refine_by_orbits(PS, SC, perm_stack, cells_to_refine_by, &ctrb_len)
|
|
575
|
+
inv += refine_and_return_invariant(PS, S, cells_to_refine_by, ctrb_len)
|
|
576
|
+
return inv
|