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,542 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
"""
|
|
3
|
+
Routines for Conway and pseudo-Conway polynomials
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- David Roe
|
|
8
|
+
|
|
9
|
+
- Jean-Pierre Flori
|
|
10
|
+
|
|
11
|
+
- Peter Bruin
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from sage.misc.fast_methods import WithEqualityById
|
|
15
|
+
from sage.misc.lazy_import import lazy_import
|
|
16
|
+
from sage.structure.sage_object import SageObject
|
|
17
|
+
from sage.rings.finite_rings.finite_field_constructor import FiniteField
|
|
18
|
+
from sage.rings.integer import Integer
|
|
19
|
+
|
|
20
|
+
lazy_import('sage.databases.conway', 'ConwayPolynomials')
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def conway_polynomial(p, n):
|
|
24
|
+
"""
|
|
25
|
+
Return the Conway polynomial of degree `n` over ``GF(p)``.
|
|
26
|
+
|
|
27
|
+
If the requested polynomial is not known, this function raises a
|
|
28
|
+
:exc:`RuntimeError` exception.
|
|
29
|
+
|
|
30
|
+
INPUT:
|
|
31
|
+
|
|
32
|
+
- ``p`` -- prime number
|
|
33
|
+
|
|
34
|
+
- ``n`` -- positive integer
|
|
35
|
+
|
|
36
|
+
OUTPUT:
|
|
37
|
+
|
|
38
|
+
- the Conway polynomial of degree `n` over the finite field
|
|
39
|
+
``GF(p)``, loaded from a table.
|
|
40
|
+
|
|
41
|
+
.. NOTE::
|
|
42
|
+
|
|
43
|
+
The first time this function is called a table is read from
|
|
44
|
+
disk, which takes a fraction of a second. Subsequent calls do
|
|
45
|
+
not require reloading the table.
|
|
46
|
+
|
|
47
|
+
See also the ``ConwayPolynomials()`` object, which is the table of
|
|
48
|
+
Conway polynomials used by this function.
|
|
49
|
+
|
|
50
|
+
EXAMPLES::
|
|
51
|
+
|
|
52
|
+
sage: conway_polynomial(2,5) # needs conway_polynomials
|
|
53
|
+
x^5 + x^2 + 1
|
|
54
|
+
sage: conway_polynomial(101,5) # needs conway_polynomials
|
|
55
|
+
x^5 + 2*x + 99
|
|
56
|
+
sage: conway_polynomial(97,101) # needs conway_polynomials
|
|
57
|
+
Traceback (most recent call last):
|
|
58
|
+
...
|
|
59
|
+
RuntimeError: requested Conway polynomial not in database.
|
|
60
|
+
"""
|
|
61
|
+
(p, n) = (int(p), int(n))
|
|
62
|
+
R = FiniteField(p)['x']
|
|
63
|
+
try:
|
|
64
|
+
return R(ConwayPolynomials()[p][n])
|
|
65
|
+
except KeyError:
|
|
66
|
+
raise RuntimeError("requested Conway polynomial not in database.")
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def exists_conway_polynomial(p, n):
|
|
70
|
+
"""
|
|
71
|
+
Check whether the Conway polynomial of degree `n` over ``GF(p)``
|
|
72
|
+
is known.
|
|
73
|
+
|
|
74
|
+
INPUT:
|
|
75
|
+
|
|
76
|
+
- ``p`` -- prime number
|
|
77
|
+
|
|
78
|
+
- ``n`` -- positive integer
|
|
79
|
+
|
|
80
|
+
OUTPUT:
|
|
81
|
+
|
|
82
|
+
- boolean: ``True`` if the Conway polynomial of degree `n` over
|
|
83
|
+
``GF(p)`` is in the database, ``False`` otherwise.
|
|
84
|
+
|
|
85
|
+
If the Conway polynomial is in the database, it can be obtained
|
|
86
|
+
using the command ``conway_polynomial(p,n)``.
|
|
87
|
+
|
|
88
|
+
EXAMPLES::
|
|
89
|
+
|
|
90
|
+
sage: exists_conway_polynomial(2,3) # needs conway_polynomials
|
|
91
|
+
True
|
|
92
|
+
sage: exists_conway_polynomial(2,-1)
|
|
93
|
+
False
|
|
94
|
+
sage: exists_conway_polynomial(97,200)
|
|
95
|
+
False
|
|
96
|
+
sage: exists_conway_polynomial(6,6)
|
|
97
|
+
False
|
|
98
|
+
"""
|
|
99
|
+
try:
|
|
100
|
+
return ConwayPolynomials().has_polynomial(p,n)
|
|
101
|
+
except ImportError:
|
|
102
|
+
return False
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class PseudoConwayLattice(WithEqualityById, SageObject):
|
|
106
|
+
r"""
|
|
107
|
+
A pseudo-Conway lattice over a given finite prime field.
|
|
108
|
+
|
|
109
|
+
The Conway polynomial `f_n` of degree `n` over `\Bold{F}_p` is
|
|
110
|
+
defined by the following four conditions:
|
|
111
|
+
|
|
112
|
+
- `f_n` is irreducible.
|
|
113
|
+
|
|
114
|
+
- In the quotient field `\Bold{F}_p[x]/(f_n)`, the element
|
|
115
|
+
`x\bmod f_n` generates the multiplicative group.
|
|
116
|
+
|
|
117
|
+
- The minimal polynomial of `(x\bmod f_n)^{\frac{p^n-1}{p^m-1}}`
|
|
118
|
+
equals the Conway polynomial `f_m`, for every divisor `m` of
|
|
119
|
+
`n`.
|
|
120
|
+
|
|
121
|
+
- `f_n` is lexicographically least among all such polynomials,
|
|
122
|
+
under a certain ordering.
|
|
123
|
+
|
|
124
|
+
The final condition is needed only in order to make the Conway
|
|
125
|
+
polynomial unique. We define a pseudo-Conway lattice to be any
|
|
126
|
+
family of polynomials, indexed by the positive integers,
|
|
127
|
+
satisfying the first three conditions.
|
|
128
|
+
|
|
129
|
+
INPUT:
|
|
130
|
+
|
|
131
|
+
- ``p`` -- prime number
|
|
132
|
+
|
|
133
|
+
- ``use_database`` -- boolean. If ``True``, use actual Conway
|
|
134
|
+
polynomials whenever they are available in the database. If
|
|
135
|
+
``False``, always compute pseudo-Conway polynomials.
|
|
136
|
+
|
|
137
|
+
EXAMPLES::
|
|
138
|
+
|
|
139
|
+
sage: # needs sage.rings.finite_rings
|
|
140
|
+
sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice
|
|
141
|
+
sage: PCL = PseudoConwayLattice(2, use_database=False)
|
|
142
|
+
sage: PCL.polynomial(3) # random
|
|
143
|
+
x^3 + x + 1
|
|
144
|
+
|
|
145
|
+
TESTS::
|
|
146
|
+
|
|
147
|
+
sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice
|
|
148
|
+
sage: PCL = PseudoConwayLattice(3)
|
|
149
|
+
sage: hash(PCL) # random
|
|
150
|
+
8738829832350
|
|
151
|
+
|
|
152
|
+
sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice
|
|
153
|
+
sage: PseudoConwayLattice(3) == PseudoConwayLattice(3)
|
|
154
|
+
False
|
|
155
|
+
sage: PseudoConwayLattice(3) != PseudoConwayLattice(3)
|
|
156
|
+
True
|
|
157
|
+
sage: P = PseudoConwayLattice(5)
|
|
158
|
+
sage: P == P
|
|
159
|
+
True
|
|
160
|
+
sage: P != P
|
|
161
|
+
False
|
|
162
|
+
"""
|
|
163
|
+
def __init__(self, p, use_database=True):
|
|
164
|
+
"""
|
|
165
|
+
TESTS::
|
|
166
|
+
|
|
167
|
+
sage: # needs sage.rings.finite_rings
|
|
168
|
+
sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice
|
|
169
|
+
sage: PCL = PseudoConwayLattice(3)
|
|
170
|
+
sage: PCL.polynomial(3) # random
|
|
171
|
+
x^3 + 2*x + 1
|
|
172
|
+
|
|
173
|
+
sage: # needs sage.rings.finite_rings
|
|
174
|
+
sage: PCL = PseudoConwayLattice(5, use_database=False)
|
|
175
|
+
sage: PCL.polynomial(12) # random
|
|
176
|
+
x^12 + 4*x^11 + 2*x^10 + 4*x^9 + 2*x^8 + 2*x^7 + 4*x^6 + x^5 + 2*x^4 + 2*x^2 + x + 2
|
|
177
|
+
sage: PCL.polynomial(6) # random
|
|
178
|
+
x^6 + x^5 + 4*x^4 + 3*x^3 + 3*x^2 + 2*x + 2
|
|
179
|
+
sage: PCL.polynomial(11) # random
|
|
180
|
+
x^11 + x^6 + 3*x^3 + 4*x + 3
|
|
181
|
+
"""
|
|
182
|
+
self.p = p
|
|
183
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
184
|
+
self.ring = PolynomialRing(FiniteField(p), 'x')
|
|
185
|
+
if use_database:
|
|
186
|
+
try:
|
|
187
|
+
C = ConwayPolynomials()
|
|
188
|
+
except ImportError:
|
|
189
|
+
self.nodes = {}
|
|
190
|
+
else:
|
|
191
|
+
self.nodes = {n: self.ring(C.polynomial(p, n))
|
|
192
|
+
for n in C.degrees(p)}
|
|
193
|
+
else:
|
|
194
|
+
self.nodes = {}
|
|
195
|
+
|
|
196
|
+
def polynomial(self, n):
|
|
197
|
+
r"""
|
|
198
|
+
Return the pseudo-Conway polynomial of degree `n` in this
|
|
199
|
+
lattice.
|
|
200
|
+
|
|
201
|
+
INPUT:
|
|
202
|
+
|
|
203
|
+
- ``n`` -- positive integer
|
|
204
|
+
|
|
205
|
+
OUTPUT: a pseudo-Conway polynomial of degree `n` for the prime `p`
|
|
206
|
+
|
|
207
|
+
ALGORITHM:
|
|
208
|
+
|
|
209
|
+
Uses an algorithm described in [HL1999]_, modified to find
|
|
210
|
+
pseudo-Conway polynomials rather than Conway polynomials. The
|
|
211
|
+
major difference is that we stop as soon as we find a
|
|
212
|
+
primitive polynomial.
|
|
213
|
+
|
|
214
|
+
EXAMPLES::
|
|
215
|
+
|
|
216
|
+
sage: # needs sage.rings.finite_rings
|
|
217
|
+
sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice
|
|
218
|
+
sage: PCL = PseudoConwayLattice(2, use_database=False)
|
|
219
|
+
sage: PCL.polynomial(3) # random
|
|
220
|
+
x^3 + x + 1
|
|
221
|
+
sage: PCL.polynomial(4) # random
|
|
222
|
+
x^4 + x^3 + 1
|
|
223
|
+
sage: PCL.polynomial(60) # random
|
|
224
|
+
x^60 + x^59 + x^58 + x^55 + x^54 + x^53 + x^52 + x^51 + x^48 + x^46 + x^45 + x^42 + x^41 + x^39 + x^38 + x^37 + x^35 + x^32 + x^31 + x^30 + x^28 + x^24 + x^22 + x^21 + x^18 + x^17 + x^16 + x^15 + x^14 + x^10 + x^8 + x^7 + x^5 + x^3 + x^2 + x + 1
|
|
225
|
+
"""
|
|
226
|
+
if n in self.nodes:
|
|
227
|
+
return self.nodes[n]
|
|
228
|
+
|
|
229
|
+
p = self.p
|
|
230
|
+
n = Integer(n)
|
|
231
|
+
|
|
232
|
+
if n == 1:
|
|
233
|
+
f = self.ring.gen() - FiniteField(p).multiplicative_generator()
|
|
234
|
+
self.nodes[1] = f
|
|
235
|
+
return f
|
|
236
|
+
|
|
237
|
+
# Work in an arbitrary field K of order p**n.
|
|
238
|
+
K = FiniteField(p**n, names='a')
|
|
239
|
+
|
|
240
|
+
# TODO: something like the following
|
|
241
|
+
# gcds = [n.gcd(d) for d in self.nodes.keys()]
|
|
242
|
+
# xi = { m: (...) for m in gcds }
|
|
243
|
+
xi = {q: self.polynomial(n//q).any_root(K, n//q, assume_squarefree=True, assume_equal_deg=True)
|
|
244
|
+
for q in n.prime_divisors()}
|
|
245
|
+
|
|
246
|
+
# The following is needed to ensure that in the concrete instantiation
|
|
247
|
+
# of the "new" extension all previous choices are compatible.
|
|
248
|
+
_frobenius_shift(K, xi)
|
|
249
|
+
|
|
250
|
+
# Construct a compatible element having order the lcm of orders
|
|
251
|
+
q, x = xi.popitem()
|
|
252
|
+
v = p**(n//q) - 1
|
|
253
|
+
for q, xitem in xi.items():
|
|
254
|
+
w = p**(n//q) - 1
|
|
255
|
+
g, alpha, beta = v.xgcd(w)
|
|
256
|
+
x = x**beta * xitem**alpha
|
|
257
|
+
v = v.lcm(w)
|
|
258
|
+
|
|
259
|
+
r = p**n - 1
|
|
260
|
+
# Get the missing part of the order to be primitive
|
|
261
|
+
g = r // v
|
|
262
|
+
# Iterate through g-th roots of x until a primitive one is found
|
|
263
|
+
z = x.nth_root(g)
|
|
264
|
+
root = K.multiplicative_generator()**v
|
|
265
|
+
while z.multiplicative_order() != r:
|
|
266
|
+
z *= root
|
|
267
|
+
# The following should work but tries to create a huge list
|
|
268
|
+
# whose length overflows Python's ints for large parameters
|
|
269
|
+
#Z = x.nth_root(g, all=True)
|
|
270
|
+
#for z in Z:
|
|
271
|
+
# if z.multiplicative_order() == r:
|
|
272
|
+
# break
|
|
273
|
+
f = z.minimal_polynomial()
|
|
274
|
+
self.nodes[n] = f
|
|
275
|
+
return f
|
|
276
|
+
|
|
277
|
+
def check_consistency(self, n):
|
|
278
|
+
"""
|
|
279
|
+
Check that the pseudo-Conway polynomials of degree dividing
|
|
280
|
+
`n` in this lattice satisfy the required compatibility
|
|
281
|
+
conditions.
|
|
282
|
+
|
|
283
|
+
EXAMPLES::
|
|
284
|
+
|
|
285
|
+
sage: # needs sage.rings.finite_rings
|
|
286
|
+
sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice
|
|
287
|
+
sage: PCL = PseudoConwayLattice(2, use_database=False)
|
|
288
|
+
sage: PCL.check_consistency(6)
|
|
289
|
+
sage: PCL.check_consistency(60) # long time
|
|
290
|
+
"""
|
|
291
|
+
p = self.p
|
|
292
|
+
K = FiniteField(p**n, modulus=self.polynomial(n), names='a')
|
|
293
|
+
a = K.gen()
|
|
294
|
+
for m in n.divisors():
|
|
295
|
+
assert (a**((p**n-1)//(p**m-1))).minimal_polynomial() == self.polynomial(m)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _find_pow_of_frobenius(p, n, x, y):
|
|
299
|
+
"""
|
|
300
|
+
Find the power of Frobenius which yields `x` when applied to `y`.
|
|
301
|
+
|
|
302
|
+
INPUT:
|
|
303
|
+
|
|
304
|
+
- ``p`` -- prime number
|
|
305
|
+
|
|
306
|
+
- ``n`` -- positive integer
|
|
307
|
+
|
|
308
|
+
- ``x`` -- an element of a field `K` of `p^n` elements so that
|
|
309
|
+
the multiplicative order of `x` is `p^n - 1`
|
|
310
|
+
|
|
311
|
+
- ``y`` -- an element of `K` with the same minimal polynomial as `x`
|
|
312
|
+
|
|
313
|
+
OUTPUT: an element `i` of the integers modulo `n` such that `x = y^{p^i}`
|
|
314
|
+
|
|
315
|
+
EXAMPLES::
|
|
316
|
+
|
|
317
|
+
sage: # needs sage.rings.finite_rings
|
|
318
|
+
sage: from sage.rings.finite_rings.conway_polynomials import _find_pow_of_frobenius
|
|
319
|
+
sage: K.<a> = GF(3^14)
|
|
320
|
+
sage: x = K.multiplicative_generator()
|
|
321
|
+
sage: y = x^27
|
|
322
|
+
sage: _find_pow_of_frobenius(3, 14, x, y)
|
|
323
|
+
11
|
|
324
|
+
"""
|
|
325
|
+
from .integer_mod import mod
|
|
326
|
+
for i in range(n):
|
|
327
|
+
if x == y:
|
|
328
|
+
break
|
|
329
|
+
y = y**p
|
|
330
|
+
else:
|
|
331
|
+
raise RuntimeError("No appropriate power of Frobenius found")
|
|
332
|
+
return mod(i, n)
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def _crt_non_coprime(running, a):
|
|
336
|
+
"""
|
|
337
|
+
Extension of the ``crt`` method of ``IntegerMod`` to the case of
|
|
338
|
+
non-relatively prime modulus.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: from sage.rings.finite_rings.conway_polynomials import _crt_non_coprime
|
|
343
|
+
sage: a = _crt_non_coprime(mod(14, 18), mod(20,30)); a
|
|
344
|
+
50
|
|
345
|
+
sage: a.modulus()
|
|
346
|
+
90
|
|
347
|
+
sage: _crt_non_coprime(mod(13, 18), mod(20,30))
|
|
348
|
+
Traceback (most recent call last):
|
|
349
|
+
...
|
|
350
|
+
AssertionError
|
|
351
|
+
"""
|
|
352
|
+
g = running.modulus().gcd(a.modulus())
|
|
353
|
+
if g == 1:
|
|
354
|
+
return running.crt(a)
|
|
355
|
+
else:
|
|
356
|
+
assert running % g == a % g
|
|
357
|
+
running_modulus = running.modulus()
|
|
358
|
+
a_modulus = a.modulus()
|
|
359
|
+
for qq in g.prime_divisors():
|
|
360
|
+
a_val_unit = a_modulus.val_unit(qq)
|
|
361
|
+
running_val_unit = running_modulus.val_unit(qq)
|
|
362
|
+
if a_val_unit[0] > running_val_unit[0]:
|
|
363
|
+
running_modulus = running_val_unit[1]
|
|
364
|
+
else:
|
|
365
|
+
a_modulus = a_val_unit[1]
|
|
366
|
+
return (running % running_modulus).crt(a % a_modulus)
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def _frobenius_shift(K, generators, check_only=False):
|
|
370
|
+
"""
|
|
371
|
+
Given a field `K` of degree `n` over ``GF(p)`` and a dictionary
|
|
372
|
+
holding, for each divisor `q` of `n`, an element with minimal
|
|
373
|
+
polynomial a pseudo-Conway polynomial of degree `n/q`, modify
|
|
374
|
+
these generators into a compatible system.
|
|
375
|
+
|
|
376
|
+
Such a system of generators is said to be compatible if for each
|
|
377
|
+
pair of prime divisors `q_1` and `q_2` and each common divisor `m`
|
|
378
|
+
of `n/q_1` and `n/q_2`, the equality
|
|
379
|
+
|
|
380
|
+
``generators[q1]^((p^(n/q1)-1)/(p^m-1)) == generators[q2]^((p^(n/q2)-1)/(p^m-1))``
|
|
381
|
+
|
|
382
|
+
holds.
|
|
383
|
+
|
|
384
|
+
INPUT:
|
|
385
|
+
|
|
386
|
+
- ``K`` -- a finite field of degree `n` over its prime field
|
|
387
|
+
|
|
388
|
+
- ``generators`` -- dictionary, indexed by prime divisors `q` of
|
|
389
|
+
`n`, whose entries are elements of `K` satisfying the `n/q`
|
|
390
|
+
pseudo-Conway polynomial
|
|
391
|
+
|
|
392
|
+
- ``check_only`` -- if ``True``, just check that the given
|
|
393
|
+
generators form a compatible system
|
|
394
|
+
|
|
395
|
+
EXAMPLES::
|
|
396
|
+
|
|
397
|
+
sage: # needs sage.libs.ntl sage.rings.finite_rings
|
|
398
|
+
sage: R.<x> = GF(2)[]
|
|
399
|
+
sage: f30 = x^30 + x^28 + x^27 + x^25 + x^24 + x^20 + x^19 + x^18 + x^16 + x^15 + x^12 + x^10 + x^7 + x^2 + 1
|
|
400
|
+
sage: f20 = x^20 + x^19 + x^15 + x^13 + x^12 + x^11 + x^9 + x^8 + x^7 + x^4 + x^2 + x + 1
|
|
401
|
+
sage: f12 = x^12 + x^10 + x^9 + x^8 + x^4 + x^2 + 1
|
|
402
|
+
sage: K.<a> = GF(2^60, modulus='first_lexicographic')
|
|
403
|
+
sage: x30 = f30.roots(K, multiplicities=False)[0]
|
|
404
|
+
sage: x20 = f20.roots(K, multiplicities=False)[0]
|
|
405
|
+
sage: x12 = f12.roots(K, multiplicities=False)[0]
|
|
406
|
+
sage: generators = {2: x30, 3: x20, 5: x12}
|
|
407
|
+
sage: from sage.rings.finite_rings.conway_polynomials import _frobenius_shift, _find_pow_of_frobenius
|
|
408
|
+
sage: _frobenius_shift(K, generators)
|
|
409
|
+
sage: _find_pow_of_frobenius(2, 30, x30, generators[2])
|
|
410
|
+
0
|
|
411
|
+
sage: _find_pow_of_frobenius(2, 20, x20, generators[3])
|
|
412
|
+
13
|
|
413
|
+
sage: _find_pow_of_frobenius(2, 12, x12, generators[5])
|
|
414
|
+
8
|
|
415
|
+
"""
|
|
416
|
+
if len(generators) == 1:
|
|
417
|
+
return generators
|
|
418
|
+
p = K.characteristic()
|
|
419
|
+
n = K.degree()
|
|
420
|
+
compatible = {}
|
|
421
|
+
from .integer_mod import mod
|
|
422
|
+
for m in n.divisors():
|
|
423
|
+
compatible[m] = {}
|
|
424
|
+
for q, x in generators.items():
|
|
425
|
+
for m in (n//q).divisors():
|
|
426
|
+
compatible[m][q] = x**((p**(n//q)-1)//(p**m-1))
|
|
427
|
+
if check_only:
|
|
428
|
+
for m in n.divisors():
|
|
429
|
+
try:
|
|
430
|
+
q, x = compatible[m].popitem()
|
|
431
|
+
except KeyError:
|
|
432
|
+
break
|
|
433
|
+
for xx in compatible[m].values():
|
|
434
|
+
assert x == xx
|
|
435
|
+
return
|
|
436
|
+
crt = {}
|
|
437
|
+
qlist = sorted(generators.keys())
|
|
438
|
+
for j in range(1, len(qlist)):
|
|
439
|
+
for i in range(j):
|
|
440
|
+
crt[(i, j)] = []
|
|
441
|
+
for m in n.divisors():
|
|
442
|
+
mqlist = sorted(compatible[m].keys())
|
|
443
|
+
for k in range(1,len(mqlist)):
|
|
444
|
+
j = qlist.index(mqlist[k])
|
|
445
|
+
i = qlist.index(mqlist[k-1])
|
|
446
|
+
crt[(i,j)].append(_find_pow_of_frobenius(p, m, compatible[m][qlist[j]], compatible[m][qlist[i]]))
|
|
447
|
+
for i, j in list(crt):
|
|
448
|
+
L = crt[(i,j)]
|
|
449
|
+
running = mod(0, 1)
|
|
450
|
+
for a in L:
|
|
451
|
+
running = _crt_non_coprime(running, a)
|
|
452
|
+
crt[(i,j)] = [(mod(running, qq**(running.modulus().valuation(qq))),
|
|
453
|
+
running.modulus().valuation(qq)) for qq in qlist]
|
|
454
|
+
crt[(j,i)] = [(-a, level) for a, level in crt[(i,j)]]
|
|
455
|
+
# Let x_j be the power of Frobenius we apply to generators[qlist[j]], for 0 < j < len(qlist)
|
|
456
|
+
# We have some direct conditions on the x_j: x_j reduces to each entry in crt[(0,j)].
|
|
457
|
+
# But we also have the equations x_j - x_i reduces to each entry in crt[(i,j)].
|
|
458
|
+
# We solve for x_j one prime at a time. For each prime, we have an equations of the form
|
|
459
|
+
# x_j - x_i = c_ij. The modulus of the currently known value of x_j, x_i and c_ij will all be powers
|
|
460
|
+
# (possibly 0, possibly different) of the same prime.
|
|
461
|
+
|
|
462
|
+
# We can set x_0=0 everywhere, can get an initial setting of x_j from the c_0j.
|
|
463
|
+
# We go through prime by prime.
|
|
464
|
+
import bisect
|
|
465
|
+
frob_powers = [mod(0, 1) for _ in qlist]
|
|
466
|
+
|
|
467
|
+
def find_leveller(qindex, level, x, xleveled, searched, i):
|
|
468
|
+
searched[i] = True
|
|
469
|
+
crt_possibles = []
|
|
470
|
+
for j in range(1,len(qlist)):
|
|
471
|
+
if i == j:
|
|
472
|
+
continue
|
|
473
|
+
if crt[(i,j)][qindex][1] >= level:
|
|
474
|
+
if xleveled[j]:
|
|
475
|
+
return [j]
|
|
476
|
+
elif j not in searched:
|
|
477
|
+
crt_possibles.append(j)
|
|
478
|
+
for j in crt_possibles:
|
|
479
|
+
path = find_leveller(qindex, level, x, xleveled, searched, j)
|
|
480
|
+
if path is not None:
|
|
481
|
+
path.append(j)
|
|
482
|
+
return path
|
|
483
|
+
return None
|
|
484
|
+
|
|
485
|
+
def propagate_levelling(qindex, level, x, xleveled, i):
|
|
486
|
+
for j in range(1, len(qlist)):
|
|
487
|
+
if i == j:
|
|
488
|
+
continue
|
|
489
|
+
if not xleveled[j] and crt[(i,j)][qindex][1] >= level:
|
|
490
|
+
newxj = x[i][0] + crt[(i,j)][qindex][0]
|
|
491
|
+
x[j] = (newxj, min(x[i][1], crt[(i,j)][qindex][1]))
|
|
492
|
+
xleveled[j] = True
|
|
493
|
+
propagate_levelling(qindex, level, x, xleveled, j)
|
|
494
|
+
|
|
495
|
+
for qindex in range(len(qlist)):
|
|
496
|
+
q = qlist[qindex]
|
|
497
|
+
# We include the initial 0 to match up our indexing with crt.
|
|
498
|
+
x = [0] + [crt[(0,j)][qindex] for j in range(1,len(qlist))]
|
|
499
|
+
# We first check that our equations are consistent and
|
|
500
|
+
# determine which powers of q occur as moduli.
|
|
501
|
+
levels = []
|
|
502
|
+
for j in range(2, len(qlist)):
|
|
503
|
+
for i in range(j):
|
|
504
|
+
# we need crt[(0,j)] = crt[(0,i)] + crt[(i,j)]
|
|
505
|
+
if i != 0:
|
|
506
|
+
assert x[j][0] == x[i][0] + crt[(i,j)][qindex][0]
|
|
507
|
+
level = crt[(i,j)][qindex][1]
|
|
508
|
+
if level > 0:
|
|
509
|
+
ins = bisect.bisect_left(levels,level)
|
|
510
|
+
if ins == len(levels):
|
|
511
|
+
levels.append(level)
|
|
512
|
+
elif levels[ins] != level:
|
|
513
|
+
levels.insert(ins, level)
|
|
514
|
+
for level in levels:
|
|
515
|
+
xleveled = [0] + [x[i][1] >= level for i in range(1,len(qlist))]
|
|
516
|
+
while True:
|
|
517
|
+
try:
|
|
518
|
+
i = xleveled.index(False, 1)
|
|
519
|
+
searched = {}
|
|
520
|
+
levelling_path = find_leveller(qindex, level, x, xleveled, searched, i)
|
|
521
|
+
if levelling_path is None:
|
|
522
|
+
# Any lift will work, since there are no constraints.
|
|
523
|
+
x[i] = (mod(x[i][0].lift(), q**level), level)
|
|
524
|
+
xleveled[i] = True
|
|
525
|
+
propagate_levelling(qindex, level, x, xleveled, i)
|
|
526
|
+
else:
|
|
527
|
+
levelling_path.append(i)
|
|
528
|
+
for m in range(1,len(path)):
|
|
529
|
+
# This point on the path may have already
|
|
530
|
+
# been leveled in a previous propagation.
|
|
531
|
+
if not xleveled[path[m]]:
|
|
532
|
+
newx = x[path[m-1]][0] + crt[(path[m-1],path[m])][qindex][0]
|
|
533
|
+
x[path[m]] = (newx, min(x[path[m-1]][1], crt[(path[m-1],path[m])][qindex][1]))
|
|
534
|
+
xleveled[path[m]] = True
|
|
535
|
+
propagate_levelling(qindex, level, x, xleveled, path[m])
|
|
536
|
+
except ValueError:
|
|
537
|
+
break
|
|
538
|
+
for j in range(1,len(qlist)):
|
|
539
|
+
frob_powers[j] = frob_powers[j].crt(x[j][0])
|
|
540
|
+
for j in range(1, len(qlist)):
|
|
541
|
+
generators[qlist[j]] = generators[qlist[j]]**(p**(-frob_powers[j]).lift())
|
|
542
|
+
_frobenius_shift(K, generators, check_only=True)
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
from sage.structure.element cimport CommutativeRingElement
|
|
3
|
+
from sage.structure.sage_object cimport SageObject
|
|
4
|
+
|
|
5
|
+
cdef class FiniteRingElement(CommutativeRingElement):
|
|
6
|
+
pass
|
|
7
|
+
|
|
8
|
+
cdef class FinitePolyExtElement(FiniteRingElement):
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
cdef class Cache_base(SageObject):
|
|
12
|
+
cpdef FinitePolyExtElement fetch_int(self, number)
|