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,779 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
r"""
|
|
4
|
+
Elements of Quotients of Univariate Polynomial Rings
|
|
5
|
+
|
|
6
|
+
EXAMPLES: We create a quotient of a univariate polynomial ring over
|
|
7
|
+
`\ZZ`.
|
|
8
|
+
|
|
9
|
+
::
|
|
10
|
+
|
|
11
|
+
sage: R.<x> = ZZ[]
|
|
12
|
+
sage: S.<a> = R.quotient(x^3 + 3*x - 1)
|
|
13
|
+
sage: 2 * a^3
|
|
14
|
+
-6*a + 2
|
|
15
|
+
|
|
16
|
+
Next we make a univariate polynomial ring over
|
|
17
|
+
`\ZZ[x]/(x^3+3x-1)`.
|
|
18
|
+
|
|
19
|
+
::
|
|
20
|
+
|
|
21
|
+
sage: S1.<y> = S[]
|
|
22
|
+
|
|
23
|
+
And, we quotient out that by `y^2 + a`.
|
|
24
|
+
|
|
25
|
+
::
|
|
26
|
+
|
|
27
|
+
sage: T.<z> = S1.quotient(y^2 + a)
|
|
28
|
+
|
|
29
|
+
In the quotient `z^2` is `-a`.
|
|
30
|
+
|
|
31
|
+
::
|
|
32
|
+
|
|
33
|
+
sage: z^2
|
|
34
|
+
-a
|
|
35
|
+
|
|
36
|
+
And since `a^3 = -3x + 1`, we have::
|
|
37
|
+
|
|
38
|
+
sage: z^6
|
|
39
|
+
3*a - 1
|
|
40
|
+
|
|
41
|
+
::
|
|
42
|
+
|
|
43
|
+
sage: R.<x> = PolynomialRing(Integers(9))
|
|
44
|
+
sage: S.<a> = R.quotient(x^4 + 2*x^3 + x + 2)
|
|
45
|
+
sage: a^100
|
|
46
|
+
7*a^3 + 8*a + 7
|
|
47
|
+
|
|
48
|
+
::
|
|
49
|
+
|
|
50
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
51
|
+
sage: S.<a> = R.quotient(x^3 - 2)
|
|
52
|
+
sage: a
|
|
53
|
+
a
|
|
54
|
+
sage: a^3
|
|
55
|
+
2
|
|
56
|
+
|
|
57
|
+
For the purposes of comparison in Sage the quotient element
|
|
58
|
+
`a^3` is equal to `x^3`. This is because when the
|
|
59
|
+
comparison is performed, the right element is coerced into the
|
|
60
|
+
parent of the left element, and `x^3` coerces to
|
|
61
|
+
`a^3`.
|
|
62
|
+
|
|
63
|
+
::
|
|
64
|
+
|
|
65
|
+
sage: a == x
|
|
66
|
+
True
|
|
67
|
+
sage: a^3 == x^3
|
|
68
|
+
True
|
|
69
|
+
sage: x^3
|
|
70
|
+
x^3
|
|
71
|
+
sage: S(x^3)
|
|
72
|
+
2
|
|
73
|
+
|
|
74
|
+
AUTHORS:
|
|
75
|
+
|
|
76
|
+
- William Stein
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
#*****************************************************************************
|
|
80
|
+
# Copyright (C) 2005, 2007 William Stein <wstein@gmail.com>
|
|
81
|
+
#
|
|
82
|
+
# This program is free software: you can redistribute it and/or modify
|
|
83
|
+
# it under the terms of the GNU General Public License as published by
|
|
84
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
85
|
+
# (at your option) any later version.
|
|
86
|
+
# http://www.gnu.org/licenses/
|
|
87
|
+
#*****************************************************************************
|
|
88
|
+
|
|
89
|
+
from sage.structure.element import CommutativeRingElement
|
|
90
|
+
from sage.structure.richcmp import richcmp
|
|
91
|
+
import sage.rings.polynomial.polynomial_singular_interface as polynomial_singular_interface
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class PolynomialQuotientRingElement(polynomial_singular_interface.Polynomial_singular_repr, CommutativeRingElement):
|
|
95
|
+
"""
|
|
96
|
+
Element of a quotient of a polynomial ring.
|
|
97
|
+
|
|
98
|
+
EXAMPLES::
|
|
99
|
+
|
|
100
|
+
sage: P.<x> = QQ[]
|
|
101
|
+
sage: Q.<xi> = P.quo([(x^2 + 1)])
|
|
102
|
+
sage: xi^2
|
|
103
|
+
-1
|
|
104
|
+
sage: singular(xi) # needs sage.libs.singular
|
|
105
|
+
xi
|
|
106
|
+
sage: (singular(xi)*singular(xi)).NF('std(0)') # needs sage.libs.singular
|
|
107
|
+
-1
|
|
108
|
+
"""
|
|
109
|
+
def __init__(self, parent, polynomial, check=True):
|
|
110
|
+
"""
|
|
111
|
+
Create an element of the quotient of a polynomial ring.
|
|
112
|
+
|
|
113
|
+
INPUT:
|
|
114
|
+
|
|
115
|
+
- ``parent`` -- a quotient of a polynomial ring
|
|
116
|
+
|
|
117
|
+
- ``polynomial`` -- a polynomial
|
|
118
|
+
|
|
119
|
+
- ``check`` -- boolean (default: ``True``); whether or not to
|
|
120
|
+
verify that x is a valid element of the polynomial ring and reduced
|
|
121
|
+
(mod the modulus).
|
|
122
|
+
"""
|
|
123
|
+
from sage.rings.polynomial.polynomial_quotient_ring import PolynomialQuotientRing_generic
|
|
124
|
+
from sage.rings.polynomial.polynomial_element import Polynomial
|
|
125
|
+
|
|
126
|
+
CommutativeRingElement.__init__(self, parent)
|
|
127
|
+
if check:
|
|
128
|
+
if not isinstance(parent, PolynomialQuotientRing_generic):
|
|
129
|
+
raise TypeError("parent must be a polynomial quotient ring")
|
|
130
|
+
|
|
131
|
+
if not isinstance(polynomial, Polynomial):
|
|
132
|
+
raise TypeError("polynomial must be a polynomial")
|
|
133
|
+
|
|
134
|
+
if polynomial not in parent.polynomial_ring():
|
|
135
|
+
raise TypeError("polynomial must be in the polynomial ring of the parent")
|
|
136
|
+
|
|
137
|
+
f = parent.modulus()
|
|
138
|
+
if polynomial.degree() >= f.degree() and polynomial.degree() >= 0:
|
|
139
|
+
try:
|
|
140
|
+
polynomial %= f
|
|
141
|
+
except AttributeError:
|
|
142
|
+
A = polynomial
|
|
143
|
+
B = f
|
|
144
|
+
R = A
|
|
145
|
+
P = B.parent()
|
|
146
|
+
Q = P(0)
|
|
147
|
+
X = P.gen()
|
|
148
|
+
while R.degree() >= B.degree():
|
|
149
|
+
S = P(R.leading_coefficient()/B.leading_coefficient()) * X**(R.degree()-B.degree())
|
|
150
|
+
Q = Q + S
|
|
151
|
+
R = R - S*B
|
|
152
|
+
polynomial = R
|
|
153
|
+
self._polynomial = polynomial
|
|
154
|
+
|
|
155
|
+
def _im_gens_(self, codomain, im_gens, base_map=None):
|
|
156
|
+
"""
|
|
157
|
+
Return the image of this element under the morphism defined by
|
|
158
|
+
``im_gens`` in ``codomain``, where elements of the
|
|
159
|
+
base ring are mapped by ``base_map``.
|
|
160
|
+
|
|
161
|
+
EXAMPLES::
|
|
162
|
+
|
|
163
|
+
sage: # needs sage.rings.number_field
|
|
164
|
+
sage: Zx.<x> = ZZ[]
|
|
165
|
+
sage: K.<i> = NumberField(x^2 + 1)
|
|
166
|
+
sage: cc = K.hom([-i])
|
|
167
|
+
sage: S.<y> = K[]
|
|
168
|
+
sage: Q.<q> = S.quotient(y^2*(y-1)*(y-i))
|
|
169
|
+
sage: T.<t> = S.quotient(y*(y+1))
|
|
170
|
+
sage: phi = Q.hom([t+1], base_map=cc)
|
|
171
|
+
sage: phi(q)
|
|
172
|
+
t + 1
|
|
173
|
+
sage: phi(i*q)
|
|
174
|
+
-i*t - i
|
|
175
|
+
"""
|
|
176
|
+
return self._polynomial._im_gens_(codomain, im_gens, base_map=base_map)
|
|
177
|
+
|
|
178
|
+
def __hash__(self):
|
|
179
|
+
return hash(self._polynomial)
|
|
180
|
+
|
|
181
|
+
def __reduce__(self):
|
|
182
|
+
"""
|
|
183
|
+
EXAMPLES::
|
|
184
|
+
|
|
185
|
+
sage: R.<x> = QQ[]
|
|
186
|
+
sage: S.<a> = R.quotient(2*x^3 + 3/2*x -1/3)
|
|
187
|
+
sage: 2 * a^3
|
|
188
|
+
-3/2*a + 1/3
|
|
189
|
+
sage: loads(dumps(2*a^3)) == 2*a^3
|
|
190
|
+
True
|
|
191
|
+
"""
|
|
192
|
+
return self.__class__, (self.parent(), self._polynomial, False)
|
|
193
|
+
|
|
194
|
+
def _repr_(self):
|
|
195
|
+
r"""
|
|
196
|
+
EXAMPLES::
|
|
197
|
+
|
|
198
|
+
sage: R.<x> = QQ[]
|
|
199
|
+
sage: S.<a> = R.quotient(3*x^3 + 3/2*x -1/3)
|
|
200
|
+
sage: 3 * a^3 + S.modulus()
|
|
201
|
+
-3/2*a + 1/3
|
|
202
|
+
"""
|
|
203
|
+
# We call _repr since _repr_ does not have a name variable.
|
|
204
|
+
# This is very fragile!
|
|
205
|
+
return self._polynomial._repr(self.parent().variable_name())
|
|
206
|
+
|
|
207
|
+
def _latex_(self):
|
|
208
|
+
r"""
|
|
209
|
+
EXAMPLES::
|
|
210
|
+
|
|
211
|
+
sage: R.<x> = QQ[]
|
|
212
|
+
sage: S.<a> = R.quotient(3*x^3 + 3/2*x -1/3)
|
|
213
|
+
sage: latex(a*(3 * a^3) + S.modulus())
|
|
214
|
+
-\frac{3}{2} a^{2} + \frac{1}{3} a
|
|
215
|
+
"""
|
|
216
|
+
return self._polynomial._latex_(self.parent().variable_name())
|
|
217
|
+
|
|
218
|
+
def __pari__(self):
|
|
219
|
+
"""
|
|
220
|
+
Pari representation of this quotient element.
|
|
221
|
+
|
|
222
|
+
EXAMPLES::
|
|
223
|
+
|
|
224
|
+
sage: R.<x> = QQ[]
|
|
225
|
+
sage: I = R.ideal(x^10)
|
|
226
|
+
sage: S.<xb> = R.quo(I)
|
|
227
|
+
sage: pari(xb)^10
|
|
228
|
+
Mod(0, x^10)
|
|
229
|
+
"""
|
|
230
|
+
return self._polynomial.__pari__().Mod(self.parent().modulus())
|
|
231
|
+
|
|
232
|
+
##################################################
|
|
233
|
+
# Arithmetic
|
|
234
|
+
##################################################
|
|
235
|
+
|
|
236
|
+
def _mul_(self, right):
|
|
237
|
+
"""
|
|
238
|
+
Return the product of two polynomial ring quotient elements.
|
|
239
|
+
|
|
240
|
+
EXAMPLES::
|
|
241
|
+
|
|
242
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
243
|
+
sage: S.<a> = R.quotient(x^3-2)
|
|
244
|
+
sage: (a^2 - 4) * (a+2)
|
|
245
|
+
2*a^2 - 4*a - 6
|
|
246
|
+
"""
|
|
247
|
+
R = self.parent()
|
|
248
|
+
prod = self._polynomial * right._polynomial
|
|
249
|
+
return self.__class__(R, prod, check=False)
|
|
250
|
+
|
|
251
|
+
def _sub_(self, right):
|
|
252
|
+
"""
|
|
253
|
+
Return the difference of two polynomial ring quotient elements.
|
|
254
|
+
|
|
255
|
+
EXAMPLES::
|
|
256
|
+
|
|
257
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
258
|
+
sage: S.<a> = R.quotient(x^3 - 2)
|
|
259
|
+
sage: (a^2 - 4) - (a+2)
|
|
260
|
+
a^2 - a - 6
|
|
261
|
+
sage: int(1) - a
|
|
262
|
+
-a + 1
|
|
263
|
+
"""
|
|
264
|
+
return self.__class__(self.parent(),
|
|
265
|
+
self._polynomial - right._polynomial, check=False)
|
|
266
|
+
|
|
267
|
+
def _add_(self, right):
|
|
268
|
+
"""
|
|
269
|
+
Return the sum of two polynomial ring quotient elements.
|
|
270
|
+
|
|
271
|
+
EXAMPLES::
|
|
272
|
+
|
|
273
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
274
|
+
sage: S.<a> = R.quotient(x^3 - 2)
|
|
275
|
+
sage: (a^2 - 4) + (a+2)
|
|
276
|
+
a^2 + a - 2
|
|
277
|
+
sage: int(1) + a
|
|
278
|
+
a + 1
|
|
279
|
+
"""
|
|
280
|
+
return self.__class__(self.parent(),
|
|
281
|
+
self._polynomial + right._polynomial, check=False)
|
|
282
|
+
|
|
283
|
+
def _div_(self, right):
|
|
284
|
+
"""
|
|
285
|
+
Return the quotient of two polynomial ring quotient elements.
|
|
286
|
+
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
290
|
+
sage: S.<a> = R.quotient(x^3 - 2)
|
|
291
|
+
sage: (a^2 - 4) / (a+2)
|
|
292
|
+
a - 2
|
|
293
|
+
"""
|
|
294
|
+
return self * ~right
|
|
295
|
+
|
|
296
|
+
def __neg__(self):
|
|
297
|
+
return self.__class__(self.parent(), -self._polynomial)
|
|
298
|
+
|
|
299
|
+
def _richcmp_(self, other, op):
|
|
300
|
+
"""
|
|
301
|
+
Compare this element with something else, where equality testing
|
|
302
|
+
coerces the object on the right, if possible (and necessary).
|
|
303
|
+
|
|
304
|
+
EXAMPLES::
|
|
305
|
+
|
|
306
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
307
|
+
sage: S.<a> = R.quotient(x^3 - 2)
|
|
308
|
+
sage: (a^2 - 4) / (a+2) == a - 2
|
|
309
|
+
True
|
|
310
|
+
sage: a^2 - 4 == a
|
|
311
|
+
False
|
|
312
|
+
"""
|
|
313
|
+
return richcmp(self._polynomial, other._polynomial, op)
|
|
314
|
+
|
|
315
|
+
def __getitem__(self, n):
|
|
316
|
+
return self._polynomial[n]
|
|
317
|
+
|
|
318
|
+
def __int__(self):
|
|
319
|
+
"""
|
|
320
|
+
Coerce this element to an int if possible.
|
|
321
|
+
|
|
322
|
+
EXAMPLES::
|
|
323
|
+
|
|
324
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
325
|
+
sage: S.<a> = R.quotient(x^3 - 2)
|
|
326
|
+
sage: int(S(10))
|
|
327
|
+
10
|
|
328
|
+
sage: int(a)
|
|
329
|
+
Traceback (most recent call last):
|
|
330
|
+
...
|
|
331
|
+
TypeError: cannot convert nonconstant polynomial
|
|
332
|
+
"""
|
|
333
|
+
return int(self._polynomial)
|
|
334
|
+
|
|
335
|
+
def is_unit(self):
|
|
336
|
+
"""
|
|
337
|
+
Return ``True`` if ``self`` is invertible.
|
|
338
|
+
|
|
339
|
+
.. WARNING::
|
|
340
|
+
|
|
341
|
+
Only implemented when the base ring is a field.
|
|
342
|
+
|
|
343
|
+
EXAMPLES::
|
|
344
|
+
|
|
345
|
+
sage: R.<x> = QQ[]
|
|
346
|
+
sage: S.<y> = R.quotient(x^2 + 2*x + 1)
|
|
347
|
+
sage: (2*y).is_unit()
|
|
348
|
+
True
|
|
349
|
+
sage: (y + 1).is_unit()
|
|
350
|
+
False
|
|
351
|
+
|
|
352
|
+
TESTS:
|
|
353
|
+
|
|
354
|
+
Raise an exception if the base ring is not a field
|
|
355
|
+
(see :issue:`13303`)::
|
|
356
|
+
|
|
357
|
+
sage: Z16x.<x> = Integers(16)[]
|
|
358
|
+
sage: S.<y> = Z16x.quotient(x^2 + x + 1)
|
|
359
|
+
sage: (2*y).is_unit()
|
|
360
|
+
Traceback (most recent call last):
|
|
361
|
+
...
|
|
362
|
+
NotImplementedError: The base ring (=Ring of integers modulo 16) is not a field
|
|
363
|
+
|
|
364
|
+
Check that :issue:`29469` is fixed::
|
|
365
|
+
|
|
366
|
+
sage: S(3).is_unit()
|
|
367
|
+
True
|
|
368
|
+
"""
|
|
369
|
+
if self._polynomial.is_zero():
|
|
370
|
+
return False
|
|
371
|
+
if self._polynomial.is_one():
|
|
372
|
+
return True
|
|
373
|
+
try:
|
|
374
|
+
if self._polynomial.is_unit():
|
|
375
|
+
return True
|
|
376
|
+
except NotImplementedError:
|
|
377
|
+
pass
|
|
378
|
+
|
|
379
|
+
parent = self.parent()
|
|
380
|
+
base = parent.base_ring()
|
|
381
|
+
if not base.is_field():
|
|
382
|
+
raise NotImplementedError("The base ring (=%s) is not a field" % base)
|
|
383
|
+
g = parent.modulus().gcd(self._polynomial)
|
|
384
|
+
return g.degree() == 0
|
|
385
|
+
|
|
386
|
+
def __invert__(self):
|
|
387
|
+
"""
|
|
388
|
+
Return the inverse of this element.
|
|
389
|
+
|
|
390
|
+
EXAMPLES::
|
|
391
|
+
|
|
392
|
+
sage: R.<x> = QQ[]
|
|
393
|
+
sage: S.<y> = R.quotient(x^2 + 2*x + 1)
|
|
394
|
+
sage: (2*y)^(-1)
|
|
395
|
+
-1/2*y - 1
|
|
396
|
+
|
|
397
|
+
Raises a :exc:`ZeroDivisionError` if this element is not a unit::
|
|
398
|
+
|
|
399
|
+
sage: (y+1)^(-1)
|
|
400
|
+
Traceback (most recent call last):
|
|
401
|
+
...
|
|
402
|
+
ArithmeticError: element is non-invertible
|
|
403
|
+
|
|
404
|
+
TESTS:
|
|
405
|
+
|
|
406
|
+
An element is not invertible if the base ring is not a field
|
|
407
|
+
(see :issue:`13303`) (the test no longer makes sense when inversion is
|
|
408
|
+
implemented for this particular base ring, need better test)::
|
|
409
|
+
|
|
410
|
+
sage: Z16x.<x> = Integers(16)[]
|
|
411
|
+
sage: S.<y> = Z16x.quotient(x^2 + x + 1)
|
|
412
|
+
sage: (2*y)^(-1)
|
|
413
|
+
Traceback (most recent call last):
|
|
414
|
+
...
|
|
415
|
+
ArithmeticError: element is non-invertible
|
|
416
|
+
sage: (2*y+1)^(-1) # this cannot raise ValueError because...
|
|
417
|
+
10*y + 5
|
|
418
|
+
sage: (2*y+1) * (10*y+5) # the element is in fact invertible
|
|
419
|
+
1
|
|
420
|
+
|
|
421
|
+
Check that :issue:`29469` is fixed::
|
|
422
|
+
|
|
423
|
+
sage: ~S(3)
|
|
424
|
+
11
|
|
425
|
+
"""
|
|
426
|
+
P = self.parent()
|
|
427
|
+
try:
|
|
428
|
+
return type(self)(P, self._polynomial.inverse_mod(P.modulus()), check=False)
|
|
429
|
+
except ValueError as e:
|
|
430
|
+
if e.args[0] == "Impossible inverse modulo":
|
|
431
|
+
raise ZeroDivisionError(f"element {self} of quotient polynomial ring not invertible")
|
|
432
|
+
else:
|
|
433
|
+
raise NotImplementedError
|
|
434
|
+
|
|
435
|
+
def field_extension(self, names):
|
|
436
|
+
r"""
|
|
437
|
+
Given a polynomial with base ring a quotient ring, return a
|
|
438
|
+
3-tuple: a number field defined by the same polynomial, a
|
|
439
|
+
homomorphism from its parent to the number field sending the
|
|
440
|
+
generators to one another, and the inverse isomorphism.
|
|
441
|
+
|
|
442
|
+
INPUT:
|
|
443
|
+
|
|
444
|
+
- ``names`` -- name of generator of output field
|
|
445
|
+
|
|
446
|
+
OUTPUT:
|
|
447
|
+
|
|
448
|
+
- field
|
|
449
|
+
|
|
450
|
+
- homomorphism from ``self`` to field
|
|
451
|
+
|
|
452
|
+
- homomorphism from field to ``self``
|
|
453
|
+
|
|
454
|
+
EXAMPLES::
|
|
455
|
+
|
|
456
|
+
sage: # needs sage.rings.number_field
|
|
457
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
458
|
+
sage: S.<alpha> = R.quotient(x^3 - 2)
|
|
459
|
+
sage: F.<a>, f, g = alpha.field_extension()
|
|
460
|
+
sage: F
|
|
461
|
+
Number Field in a with defining polynomial x^3 - 2
|
|
462
|
+
sage: a = F.gen()
|
|
463
|
+
sage: f(alpha)
|
|
464
|
+
a
|
|
465
|
+
sage: g(a)
|
|
466
|
+
alpha
|
|
467
|
+
|
|
468
|
+
Over a finite field, the corresponding field extension is not a
|
|
469
|
+
number field::
|
|
470
|
+
|
|
471
|
+
sage: # needs sage.rings.finite_rings sage.rings.number_field
|
|
472
|
+
sage: R.<x> = GF(25,'b')['x']
|
|
473
|
+
sage: S.<a> = R.quo(x^3 + 2*x + 1)
|
|
474
|
+
sage: F.<b>, g, h = a.field_extension()
|
|
475
|
+
sage: h(b^2 + 3)
|
|
476
|
+
a^2 + 3
|
|
477
|
+
sage: g(x^2 + 2)
|
|
478
|
+
b^2 + 2
|
|
479
|
+
|
|
480
|
+
We do an example involving a relative number field::
|
|
481
|
+
|
|
482
|
+
sage: # needs sage.rings.number_field
|
|
483
|
+
sage: R.<x> = QQ['x']
|
|
484
|
+
sage: K.<a> = NumberField(x^3 - 2)
|
|
485
|
+
sage: S.<X> = K['X']
|
|
486
|
+
sage: Q.<b> = S.quo(X^3 + 2*X + 1)
|
|
487
|
+
sage: F, g, h = b.field_extension('c')
|
|
488
|
+
|
|
489
|
+
Another more awkward example::
|
|
490
|
+
|
|
491
|
+
sage: # needs sage.rings.number_field
|
|
492
|
+
sage: R.<x> = QQ['x']
|
|
493
|
+
sage: K.<a> = NumberField(x^3 - 2)
|
|
494
|
+
sage: S.<X> = K['X']
|
|
495
|
+
sage: f = (X+a)^3 + 2*(X+a) + 1
|
|
496
|
+
sage: f
|
|
497
|
+
X^3 + 3*a*X^2 + (3*a^2 + 2)*X + 2*a + 3
|
|
498
|
+
sage: Q.<z> = S.quo(f)
|
|
499
|
+
sage: F.<w>, g, h = z.field_extension()
|
|
500
|
+
sage: c = g(z)
|
|
501
|
+
sage: f(c)
|
|
502
|
+
0
|
|
503
|
+
sage: h(g(z))
|
|
504
|
+
z
|
|
505
|
+
sage: g(h(w))
|
|
506
|
+
w
|
|
507
|
+
|
|
508
|
+
AUTHORS:
|
|
509
|
+
|
|
510
|
+
- Craig Citro (2006-08-06)
|
|
511
|
+
|
|
512
|
+
- William Stein (2006-08-06)
|
|
513
|
+
"""
|
|
514
|
+
#TODO: is the return order backwards from the magma convention?
|
|
515
|
+
|
|
516
|
+
## We do another example over $\ZZ$::
|
|
517
|
+
##
|
|
518
|
+
## sage: R.<x> = ZZ['x']
|
|
519
|
+
## sage: S.<a> = R.quo(x^3 - 2)
|
|
520
|
+
## sage: F.<b>, g, h = a.field_extension()
|
|
521
|
+
## sage: h(b^2 + 3)
|
|
522
|
+
## a^2 + 3
|
|
523
|
+
## sage: g(x^2 + 2)
|
|
524
|
+
## a^2 + 2
|
|
525
|
+
##
|
|
526
|
+
## Note that the homomorphism is not defined on the entire
|
|
527
|
+
## ''domain''. (Allowing creation of such functions may be
|
|
528
|
+
## disallowed in a future version of Sage.):: <----- INDEED!
|
|
529
|
+
##
|
|
530
|
+
## sage: h(1/3)
|
|
531
|
+
## Traceback (most recent call last):
|
|
532
|
+
## ...
|
|
533
|
+
## TypeError: Unable to coerce rational (=1/3) to an Integer.
|
|
534
|
+
##
|
|
535
|
+
## Note that the parent ring must be an integral domain::
|
|
536
|
+
##
|
|
537
|
+
## sage: R.<x> = GF(25,'b')['x']
|
|
538
|
+
## sage: S.<a> = R.quo(x^3 - 2)
|
|
539
|
+
## sage: F, g, h = a.field_extension()
|
|
540
|
+
## Traceback (most recent call last):
|
|
541
|
+
## ...
|
|
542
|
+
## ValueError: polynomial must be irreducible
|
|
543
|
+
|
|
544
|
+
R = self.parent()
|
|
545
|
+
x = R.gen()
|
|
546
|
+
|
|
547
|
+
F = R.modulus().root_field(names)
|
|
548
|
+
alpha = F.gen()
|
|
549
|
+
|
|
550
|
+
f = R.hom([alpha], F, check=False)
|
|
551
|
+
|
|
552
|
+
from sage.rings.number_field.number_field_rel import NumberField_relative
|
|
553
|
+
if isinstance(F, NumberField_relative):
|
|
554
|
+
|
|
555
|
+
base_map = F.base_field().hom([R.base_ring().gen()])
|
|
556
|
+
g = F.Hom(R)(x, base_map)
|
|
557
|
+
|
|
558
|
+
else:
|
|
559
|
+
g = F.hom([x], R, check=False)
|
|
560
|
+
|
|
561
|
+
return F, f, g
|
|
562
|
+
|
|
563
|
+
def charpoly(self, var):
|
|
564
|
+
"""
|
|
565
|
+
The characteristic polynomial of this element, which is by
|
|
566
|
+
definition the characteristic polynomial of right multiplication by
|
|
567
|
+
this element.
|
|
568
|
+
|
|
569
|
+
INPUT:
|
|
570
|
+
|
|
571
|
+
- ``var`` -- string; the variable name
|
|
572
|
+
|
|
573
|
+
EXAMPLES::
|
|
574
|
+
|
|
575
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
576
|
+
sage: S.<a> = R.quo(x^3 -389*x^2 + 2*x - 5)
|
|
577
|
+
sage: a.charpoly('X') # needs sage.modules
|
|
578
|
+
X^3 - 389*X^2 + 2*X - 5
|
|
579
|
+
"""
|
|
580
|
+
return self.matrix().charpoly(var)
|
|
581
|
+
|
|
582
|
+
def fcp(self, var='x'):
|
|
583
|
+
"""
|
|
584
|
+
Return the factorization of the characteristic polynomial of this
|
|
585
|
+
element.
|
|
586
|
+
|
|
587
|
+
EXAMPLES::
|
|
588
|
+
|
|
589
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
590
|
+
sage: S.<a> = R.quotient(x^3 -389*x^2 + 2*x - 5)
|
|
591
|
+
sage: a.fcp('x') # needs sage.modules
|
|
592
|
+
x^3 - 389*x^2 + 2*x - 5
|
|
593
|
+
sage: S(1).fcp('y') # needs sage.modules
|
|
594
|
+
(y - 1)^3
|
|
595
|
+
"""
|
|
596
|
+
return self.charpoly(var).factor()
|
|
597
|
+
|
|
598
|
+
def lift(self):
|
|
599
|
+
"""
|
|
600
|
+
Return lift of this polynomial quotient ring element to the unique
|
|
601
|
+
equivalent polynomial of degree less than the modulus.
|
|
602
|
+
|
|
603
|
+
EXAMPLES::
|
|
604
|
+
|
|
605
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
606
|
+
sage: S.<a> = R.quotient(x^3 - 2)
|
|
607
|
+
sage: b = a^2 - 3
|
|
608
|
+
sage: b
|
|
609
|
+
a^2 - 3
|
|
610
|
+
sage: b.lift()
|
|
611
|
+
x^2 - 3
|
|
612
|
+
"""
|
|
613
|
+
return self._polynomial
|
|
614
|
+
|
|
615
|
+
def __iter__(self):
|
|
616
|
+
return iter(self.list())
|
|
617
|
+
|
|
618
|
+
def list(self, copy=True):
|
|
619
|
+
"""
|
|
620
|
+
Return list of the elements of ``self``, of length the same as the
|
|
621
|
+
degree of the quotient polynomial ring.
|
|
622
|
+
|
|
623
|
+
EXAMPLES::
|
|
624
|
+
|
|
625
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
626
|
+
sage: S.<a> = R.quotient(x^3 + 2*x - 5)
|
|
627
|
+
sage: a^10
|
|
628
|
+
-134*a^2 - 35*a + 300
|
|
629
|
+
sage: (a^10).list()
|
|
630
|
+
[300, -35, -134]
|
|
631
|
+
"""
|
|
632
|
+
v = self._polynomial.list(copy=False)
|
|
633
|
+
R = self.parent()
|
|
634
|
+
n = R.degree()
|
|
635
|
+
return v + [R.base_ring()(0)]*(n - len(v))
|
|
636
|
+
|
|
637
|
+
def matrix(self):
|
|
638
|
+
"""
|
|
639
|
+
The matrix of right multiplication by this element on the power
|
|
640
|
+
basis for the quotient ring.
|
|
641
|
+
|
|
642
|
+
EXAMPLES::
|
|
643
|
+
|
|
644
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
645
|
+
sage: S.<a> = R.quotient(x^3 + 2*x - 5)
|
|
646
|
+
sage: a.matrix() # needs sage.modules
|
|
647
|
+
[ 0 1 0]
|
|
648
|
+
[ 0 0 1]
|
|
649
|
+
[ 5 -2 0]
|
|
650
|
+
"""
|
|
651
|
+
# Multiply each power of field generator on the right by this
|
|
652
|
+
# element, then return the matrix whose rows are the
|
|
653
|
+
# coefficients of the result.
|
|
654
|
+
try:
|
|
655
|
+
return self.__matrix
|
|
656
|
+
except AttributeError:
|
|
657
|
+
R = self.parent()
|
|
658
|
+
v = []
|
|
659
|
+
x = R.gen()
|
|
660
|
+
a = R(1)
|
|
661
|
+
d = R.degree()
|
|
662
|
+
for _ in range(d):
|
|
663
|
+
v += (a*self).list()
|
|
664
|
+
a *= x
|
|
665
|
+
S = R.base_ring()
|
|
666
|
+
import sage.matrix.matrix_space
|
|
667
|
+
M = sage.matrix.matrix_space.MatrixSpace(S, d)
|
|
668
|
+
self.__matrix = M(v)
|
|
669
|
+
return self.__matrix
|
|
670
|
+
|
|
671
|
+
def minpoly(self):
|
|
672
|
+
"""
|
|
673
|
+
The minimal polynomial of this element, which is by definition the
|
|
674
|
+
minimal polynomial of the :meth:`matrix` of this element.
|
|
675
|
+
|
|
676
|
+
ALGORITHM: Use
|
|
677
|
+
:meth:`~sage.rings.polynomial.polynomial_zz_pex.Polynomial_ZZ_pEX.minpoly_mod`
|
|
678
|
+
if possible, otherwise compute the minimal polynomial of the :meth:`matrix`.
|
|
679
|
+
|
|
680
|
+
EXAMPLES::
|
|
681
|
+
|
|
682
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
683
|
+
sage: S.<a> = R.quotient(x^3 + 2*x - 5)
|
|
684
|
+
sage: (a + 123).minpoly() # needs sage.modules
|
|
685
|
+
x^3 - 369*x^2 + 45389*x - 1861118
|
|
686
|
+
sage: (a + 123).matrix().minpoly() # needs sage.modules
|
|
687
|
+
x^3 - 369*x^2 + 45389*x - 1861118
|
|
688
|
+
|
|
689
|
+
One useful application of this function is to compute a minimal
|
|
690
|
+
polynomial of a finite-field element over an intermediate extension,
|
|
691
|
+
rather than the absolute minimal polynomial over the prime field::
|
|
692
|
+
|
|
693
|
+
sage: # needs sage.rings.finite_rings
|
|
694
|
+
sage: F2.<i> = GF((431,2), modulus=[1,0,1])
|
|
695
|
+
sage: F6.<u> = F2.extension(3)
|
|
696
|
+
sage: (u + 1).minpoly() # needs sage.modules
|
|
697
|
+
x^6 + 425*x^5 + 19*x^4 + 125*x^3 + 189*x^2 + 239*x + 302
|
|
698
|
+
sage: ext = F6.over(F2) # needs sage.modules
|
|
699
|
+
sage: ext(u + 1).minpoly() # indirect doctest # needs sage.modules # random
|
|
700
|
+
x^3 + (396*i + 428)*x^2 + (80*i + 39)*x + 9*i + 178
|
|
701
|
+
|
|
702
|
+
TESTS:
|
|
703
|
+
|
|
704
|
+
We make sure that the previous example works on random examples::
|
|
705
|
+
|
|
706
|
+
sage: # long time, needs sage.rings.finite_rings
|
|
707
|
+
sage: p = random_prime(50)
|
|
708
|
+
sage: K.<u> = GF((p, randrange(1,20)))
|
|
709
|
+
sage: L.<v> = K.extension(randrange(2,20))
|
|
710
|
+
sage: LK = L.over(K)
|
|
711
|
+
sage: a = L.random_element()
|
|
712
|
+
sage: poly = LK(a).minpoly() # indirect doctest
|
|
713
|
+
sage: poly(a)
|
|
714
|
+
0
|
|
715
|
+
sage: abs_deg = a.minpoly().degree()
|
|
716
|
+
sage: poly.degree() == abs_deg // gcd(abs_deg, K.degree())
|
|
717
|
+
True
|
|
718
|
+
"""
|
|
719
|
+
poly = self.lift()
|
|
720
|
+
try:
|
|
721
|
+
return poly.minpoly_mod(self.parent().modulus())
|
|
722
|
+
except AttributeError:
|
|
723
|
+
pass
|
|
724
|
+
return self.matrix().minpoly()
|
|
725
|
+
|
|
726
|
+
def norm(self):
|
|
727
|
+
"""
|
|
728
|
+
The norm of this element, which is the determinant of the matrix of right
|
|
729
|
+
multiplication by this element.
|
|
730
|
+
|
|
731
|
+
EXAMPLES::
|
|
732
|
+
|
|
733
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
734
|
+
sage: S.<a> = R.quotient(x^3 - 389*x^2 + 2*x - 5)
|
|
735
|
+
sage: a.norm() # needs sage.modules
|
|
736
|
+
5
|
|
737
|
+
"""
|
|
738
|
+
return self.matrix().determinant()
|
|
739
|
+
|
|
740
|
+
def trace(self):
|
|
741
|
+
"""
|
|
742
|
+
The trace of this element, which is the trace of the matrix of
|
|
743
|
+
right multiplication by this element.
|
|
744
|
+
|
|
745
|
+
EXAMPLES::
|
|
746
|
+
|
|
747
|
+
sage: R.<x> = PolynomialRing(QQ)
|
|
748
|
+
sage: S.<a> = R.quotient(x^3 - 389*x^2 + 2*x - 5)
|
|
749
|
+
sage: a.trace() # needs sage.modules
|
|
750
|
+
389
|
|
751
|
+
"""
|
|
752
|
+
return self.matrix().trace()
|
|
753
|
+
|
|
754
|
+
def rational_reconstruction(self, *args, **kwargs):
|
|
755
|
+
r"""
|
|
756
|
+
Compute a rational reconstruction of this polynomial quotient
|
|
757
|
+
ring element to its cover ring.
|
|
758
|
+
|
|
759
|
+
This method is a thin convenience wrapper around
|
|
760
|
+
:meth:`Polynomial.rational_reconstruction`.
|
|
761
|
+
|
|
762
|
+
EXAMPLES::
|
|
763
|
+
|
|
764
|
+
sage: # needs sage.rings.finite_rings
|
|
765
|
+
sage: R.<x> = GF(65537)[]
|
|
766
|
+
sage: m = (x^11 + 25345*x^10 + 10956*x^9 + 13873*x^8 + 23962*x^7
|
|
767
|
+
....: + 17496*x^6 + 30348*x^5 + 7440*x^4 + 65438*x^3 + 7676*x^2
|
|
768
|
+
....: + 54266*x + 47805)
|
|
769
|
+
sage: f = (20437*x^10 + 62630*x^9 + 63241*x^8 + 12820*x^7 + 42171*x^6
|
|
770
|
+
....: + 63091*x^5 + 15288*x^4 + 32516*x^3 + 2181*x^2 + 45236*x + 2447)
|
|
771
|
+
sage: f_mod_m = R.quotient(m)(f)
|
|
772
|
+
sage: f_mod_m.rational_reconstruction()
|
|
773
|
+
(51388*x^5 + 29141*x^4 + 59341*x^3 + 7034*x^2 + 14152*x + 23746,
|
|
774
|
+
x^5 + 15208*x^4 + 19504*x^3 + 20457*x^2 + 11180*x + 28352)
|
|
775
|
+
"""
|
|
776
|
+
m = self.parent().modulus()
|
|
777
|
+
R = m.parent()
|
|
778
|
+
f = R(self._polynomial)
|
|
779
|
+
return f.rational_reconstruction(m, *args, **kwargs)
|