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,1682 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.libs.gap sage.libs.pari sage.libs.singular sage.symbolic
|
|
3
|
+
r"""
|
|
4
|
+
Common Interface Functionality
|
|
5
|
+
|
|
6
|
+
See the examples in the other sections for how to use specific
|
|
7
|
+
interfaces. The interface classes all derive from the generic
|
|
8
|
+
interface that is described in this section.
|
|
9
|
+
|
|
10
|
+
AUTHORS:
|
|
11
|
+
|
|
12
|
+
- William Stein (2005): initial version
|
|
13
|
+
|
|
14
|
+
- William Stein (2006-03-01): got rid of infinite loop on startup if
|
|
15
|
+
client system missing
|
|
16
|
+
|
|
17
|
+
- Felix Lawrence (2009-08-21): edited ._sage_() to support lists and float exponents in foreign notation.
|
|
18
|
+
|
|
19
|
+
- Simon King (2010-09-25): Expect._local_tmpfile() depends on
|
|
20
|
+
Expect.pid() and is cached; Expect.quit() clears that cache,
|
|
21
|
+
which is important for forking.
|
|
22
|
+
|
|
23
|
+
- Jean-Pierre Flori (2010,2011): Split non Pexpect stuff into a parent class.
|
|
24
|
+
|
|
25
|
+
- Simon King (2015): Improve pickling for InterfaceElement
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
# ****************************************************************************
|
|
29
|
+
# Copyright (C) 2005 William Stein <wstein@gmail.com>
|
|
30
|
+
#
|
|
31
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
32
|
+
#
|
|
33
|
+
# This code is distributed in the hope that it will be useful,
|
|
34
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
35
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
36
|
+
# General Public License for more details.
|
|
37
|
+
#
|
|
38
|
+
# The full text of the GPL is available at:
|
|
39
|
+
#
|
|
40
|
+
# https://www.gnu.org/licenses/
|
|
41
|
+
# ****************************************************************************
|
|
42
|
+
|
|
43
|
+
import operator
|
|
44
|
+
|
|
45
|
+
from sage.structure.sage_object import SageObject
|
|
46
|
+
from sage.structure.parent_base import ParentWithBase
|
|
47
|
+
from sage.structure.element import Element, parent
|
|
48
|
+
from sage.structure.richcmp import rich_to_bool
|
|
49
|
+
|
|
50
|
+
from sage.misc.fast_methods import WithEqualityById
|
|
51
|
+
from sage.misc.instancedoc import instancedoc
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class AsciiArtString(str):
|
|
55
|
+
def __repr__(self):
|
|
56
|
+
return str(self)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class Interface(WithEqualityById, ParentWithBase):
|
|
60
|
+
"""
|
|
61
|
+
Interface interface object.
|
|
62
|
+
|
|
63
|
+
.. NOTE::
|
|
64
|
+
|
|
65
|
+
Two interfaces compare equal if and only if they are identical
|
|
66
|
+
objects (this is a critical constraint so that caching of
|
|
67
|
+
representations of objects in interfaces works
|
|
68
|
+
correctly). Otherwise they are never equal.
|
|
69
|
+
"""
|
|
70
|
+
def __init__(self, name):
|
|
71
|
+
"""
|
|
72
|
+
Initialize ``self``.
|
|
73
|
+
|
|
74
|
+
EXAMPLES::
|
|
75
|
+
|
|
76
|
+
sage: Maxima() == maxima
|
|
77
|
+
False
|
|
78
|
+
sage: maxima == maxima
|
|
79
|
+
True
|
|
80
|
+
|
|
81
|
+
sage: Maxima() != maxima
|
|
82
|
+
True
|
|
83
|
+
sage: maxima != maxima
|
|
84
|
+
False
|
|
85
|
+
"""
|
|
86
|
+
self.__name = name
|
|
87
|
+
self.__coerce_name = '_' + name.lower() + '_'
|
|
88
|
+
self.__seq = -1
|
|
89
|
+
self._available_vars = []
|
|
90
|
+
self._seed = None
|
|
91
|
+
ParentWithBase.__init__(self, self)
|
|
92
|
+
|
|
93
|
+
def _repr_(self):
|
|
94
|
+
return self.__name.capitalize()
|
|
95
|
+
|
|
96
|
+
def name(self, new_name=None):
|
|
97
|
+
return self.__name
|
|
98
|
+
|
|
99
|
+
def get_seed(self):
|
|
100
|
+
"""
|
|
101
|
+
Return the seed used to set the random number generator in
|
|
102
|
+
this interface.
|
|
103
|
+
|
|
104
|
+
The seed is initialized as ``None`` but should be set when the
|
|
105
|
+
interface starts.
|
|
106
|
+
|
|
107
|
+
EXAMPLES::
|
|
108
|
+
|
|
109
|
+
sage: s = Singular()
|
|
110
|
+
sage: s.set_seed(107)
|
|
111
|
+
107
|
|
112
|
+
sage: s.get_seed()
|
|
113
|
+
107
|
|
114
|
+
"""
|
|
115
|
+
return self._seed
|
|
116
|
+
|
|
117
|
+
def rand_seed(self):
|
|
118
|
+
"""
|
|
119
|
+
Return a random seed that can be put into ``set_seed`` function
|
|
120
|
+
for any interpreter.
|
|
121
|
+
|
|
122
|
+
This should be overridden if the particular interface needs
|
|
123
|
+
something other than a small positive integer.
|
|
124
|
+
|
|
125
|
+
EXAMPLES::
|
|
126
|
+
|
|
127
|
+
sage: from sage.interfaces.interface import Interface
|
|
128
|
+
sage: i = Interface("")
|
|
129
|
+
sage: i.rand_seed() # random
|
|
130
|
+
318491487
|
|
131
|
+
|
|
132
|
+
sage: s = Singular()
|
|
133
|
+
sage: s.rand_seed() # random
|
|
134
|
+
365260051
|
|
135
|
+
"""
|
|
136
|
+
import sage.doctest
|
|
137
|
+
if sage.doctest.DOCTEST_MODE:
|
|
138
|
+
# set the random seed through the current randstate
|
|
139
|
+
from sage.misc.randstate import current_randstate
|
|
140
|
+
seed = current_randstate().seed()
|
|
141
|
+
else:
|
|
142
|
+
from sage.misc.randstate import randstate
|
|
143
|
+
seed = randstate().seed()
|
|
144
|
+
|
|
145
|
+
return seed & 0x1FFFFFFF
|
|
146
|
+
|
|
147
|
+
def set_seed(self, seed=None):
|
|
148
|
+
"""
|
|
149
|
+
Set the random seed for the interpreter and return the new
|
|
150
|
+
value of the seed.
|
|
151
|
+
|
|
152
|
+
This is dependent on which interpreter so must be implemented
|
|
153
|
+
in each separately. For examples see gap.py or singular.py.
|
|
154
|
+
|
|
155
|
+
If seed is ``None`` then should generate a random seed.
|
|
156
|
+
|
|
157
|
+
EXAMPLES::
|
|
158
|
+
|
|
159
|
+
sage: s = Singular()
|
|
160
|
+
sage: s.set_seed(1)
|
|
161
|
+
1
|
|
162
|
+
sage: [s.random(1,10) for i in range(5)]
|
|
163
|
+
[8, 10, 4, 9, 1]
|
|
164
|
+
|
|
165
|
+
sage: from sage.interfaces.interface import Interface
|
|
166
|
+
sage: i = Interface("")
|
|
167
|
+
sage: i.set_seed()
|
|
168
|
+
Traceback (most recent call last):
|
|
169
|
+
...
|
|
170
|
+
NotImplementedError: This interpreter did not implement a set_seed function
|
|
171
|
+
"""
|
|
172
|
+
raise NotImplementedError("This interpreter did not implement a set_seed function")
|
|
173
|
+
|
|
174
|
+
def interact(self):
|
|
175
|
+
r"""
|
|
176
|
+
This allows you to interactively interact with the child
|
|
177
|
+
interpreter.
|
|
178
|
+
|
|
179
|
+
Press :kbd:`Ctrl` + :kbd:`D` or type 'quit' or 'exit' to exit and
|
|
180
|
+
return to Sage.
|
|
181
|
+
|
|
182
|
+
.. NOTE::
|
|
183
|
+
|
|
184
|
+
This is completely different than the console() member
|
|
185
|
+
function. The console function opens a new copy of the
|
|
186
|
+
child interpreter, whereas the interact function gives you
|
|
187
|
+
interactive access to the interpreter that is being used by
|
|
188
|
+
Sage. Use sage(xxx) or interpretername(xxx) to pull objects
|
|
189
|
+
in from sage to the interpreter.
|
|
190
|
+
"""
|
|
191
|
+
from sage.repl.interpreter import interface_shell_embed
|
|
192
|
+
shell = interface_shell_embed(self)
|
|
193
|
+
try:
|
|
194
|
+
ipython = get_ipython()
|
|
195
|
+
except NameError:
|
|
196
|
+
shell()
|
|
197
|
+
else:
|
|
198
|
+
shell(local_ns=dict(ipython.user_ns))
|
|
199
|
+
|
|
200
|
+
def _pre_interact(self):
|
|
201
|
+
pass
|
|
202
|
+
|
|
203
|
+
def _post_interact(self):
|
|
204
|
+
pass
|
|
205
|
+
|
|
206
|
+
def cputime(self) -> float:
|
|
207
|
+
"""
|
|
208
|
+
CPU time since this process started running.
|
|
209
|
+
"""
|
|
210
|
+
raise NotImplementedError
|
|
211
|
+
|
|
212
|
+
def read(self, filename):
|
|
213
|
+
r"""
|
|
214
|
+
EXAMPLES::
|
|
215
|
+
|
|
216
|
+
sage: filename = tmp_filename()
|
|
217
|
+
sage: f = open(filename, 'w')
|
|
218
|
+
sage: _ = f.write('x = 2\n')
|
|
219
|
+
sage: f.close()
|
|
220
|
+
sage: octave.read(filename) # optional - octave
|
|
221
|
+
sage: octave.get('x') # optional - octave
|
|
222
|
+
' 2'
|
|
223
|
+
sage: import os
|
|
224
|
+
sage: os.unlink(filename)
|
|
225
|
+
"""
|
|
226
|
+
self.eval(self._read_in_file_command(filename))
|
|
227
|
+
|
|
228
|
+
def _read_in_file_command(self, filename):
|
|
229
|
+
raise NotImplementedError
|
|
230
|
+
|
|
231
|
+
def eval(self, code, **kwds):
|
|
232
|
+
"""
|
|
233
|
+
Evaluate code in an interface.
|
|
234
|
+
|
|
235
|
+
This method needs to be implemented in sub-classes.
|
|
236
|
+
|
|
237
|
+
Note that it is not always to be expected that
|
|
238
|
+
it returns a non-empty string. In contrast,
|
|
239
|
+
:meth:`get` is supposed to return the result of applying
|
|
240
|
+
a print command to the object so that the output is easier
|
|
241
|
+
to parse.
|
|
242
|
+
|
|
243
|
+
Likewise, the method :meth:`_eval_line` for evaluation of a single
|
|
244
|
+
line, often makes sense to be overridden.
|
|
245
|
+
"""
|
|
246
|
+
raise NotImplementedError
|
|
247
|
+
|
|
248
|
+
_eval_line = eval
|
|
249
|
+
|
|
250
|
+
def execute(self, *args, **kwds):
|
|
251
|
+
return self.eval(*args, **kwds)
|
|
252
|
+
|
|
253
|
+
def __call__(self, x, name=None):
|
|
254
|
+
r"""
|
|
255
|
+
Create a new object in ``self`` from ``x``.
|
|
256
|
+
|
|
257
|
+
The object ``X`` returned can be used like any Sage object, and
|
|
258
|
+
wraps an object in ``self``. The standard arithmetic operators
|
|
259
|
+
work. Moreover if ``foo`` is a function then::
|
|
260
|
+
|
|
261
|
+
``X.foo(y,z,...)``
|
|
262
|
+
|
|
263
|
+
calls ``foo(X, y, z, ...)`` and returns the corresponding object.
|
|
264
|
+
|
|
265
|
+
EXAMPLES::
|
|
266
|
+
|
|
267
|
+
sage: gp(2)
|
|
268
|
+
2
|
|
269
|
+
sage: gp('2')
|
|
270
|
+
2
|
|
271
|
+
sage: a = gp(2); gp(a) is a
|
|
272
|
+
True
|
|
273
|
+
|
|
274
|
+
TESTS:
|
|
275
|
+
|
|
276
|
+
Check conversion of Booleans (:issue:`28705`)::
|
|
277
|
+
|
|
278
|
+
sage: giac(True) # needs giac
|
|
279
|
+
true
|
|
280
|
+
sage: maxima(True)
|
|
281
|
+
true
|
|
282
|
+
"""
|
|
283
|
+
cls = self._object_class()
|
|
284
|
+
|
|
285
|
+
# Handle the case when x is an object
|
|
286
|
+
# in some interface.
|
|
287
|
+
if isinstance(x, InterfaceElement):
|
|
288
|
+
if x.parent() is self:
|
|
289
|
+
return x
|
|
290
|
+
|
|
291
|
+
# We convert x into an object in this
|
|
292
|
+
# interface by first going through Sage.
|
|
293
|
+
try:
|
|
294
|
+
return self(x._sage_())
|
|
295
|
+
except (NotImplementedError, TypeError):
|
|
296
|
+
pass
|
|
297
|
+
|
|
298
|
+
if isinstance(x, str):
|
|
299
|
+
return cls(self, x, name=name)
|
|
300
|
+
try:
|
|
301
|
+
# Special methods do not and should not have an option to
|
|
302
|
+
# set the name directly, as the identifier assigned by the
|
|
303
|
+
# interface should stay consistent. An identifier with a
|
|
304
|
+
# user-assigned name might change its value, so we return a
|
|
305
|
+
# new element.
|
|
306
|
+
result = self._coerce_from_special_method(x)
|
|
307
|
+
return result if name is None else result.name(new_name=name)
|
|
308
|
+
except TypeError:
|
|
309
|
+
raise
|
|
310
|
+
except AttributeError:
|
|
311
|
+
pass
|
|
312
|
+
try:
|
|
313
|
+
result = self._coerce_impl(x, use_special=False)
|
|
314
|
+
return result if name is None else result.name(new_name=name)
|
|
315
|
+
except TypeError as msg:
|
|
316
|
+
try:
|
|
317
|
+
return cls(self, str(x), name=name)
|
|
318
|
+
except TypeError:
|
|
319
|
+
raise TypeError(msg)
|
|
320
|
+
|
|
321
|
+
def _coerce_from_special_method(self, x):
|
|
322
|
+
"""
|
|
323
|
+
Try to coerce to ``self`` by calling a special underscore method.
|
|
324
|
+
|
|
325
|
+
If no such method is defined, raises an :exc:`AttributeError` instead
|
|
326
|
+
of a :exc:`TypeError`.
|
|
327
|
+
"""
|
|
328
|
+
s = '_%s_' % self.name()
|
|
329
|
+
if s == '_maxima_lib_':
|
|
330
|
+
s = '_maxima_'
|
|
331
|
+
if s == '_pari_':
|
|
332
|
+
s = '_gp_'
|
|
333
|
+
try:
|
|
334
|
+
return (x.__getattribute__(s))(self)
|
|
335
|
+
except AttributeError:
|
|
336
|
+
return self(x._interface_init_())
|
|
337
|
+
|
|
338
|
+
def _coerce_impl(self, x, use_special=True):
|
|
339
|
+
r"""
|
|
340
|
+
Coerce pure Python types via corresponding Sage objects.
|
|
341
|
+
|
|
342
|
+
TESTS:
|
|
343
|
+
|
|
344
|
+
Check that python type ``complex`` can be converted (:issue:`31775`)::
|
|
345
|
+
|
|
346
|
+
sage: giac(complex(I))**2 # should not return `j^2` # needs giac
|
|
347
|
+
-1
|
|
348
|
+
"""
|
|
349
|
+
if isinstance(x, bool):
|
|
350
|
+
return self(self._true_symbol() if x else self._false_symbol())
|
|
351
|
+
elif isinstance(x, int):
|
|
352
|
+
from sage.rings.integer import Integer
|
|
353
|
+
return self(Integer(x))
|
|
354
|
+
elif isinstance(x, float):
|
|
355
|
+
from sage.rings.real_double import RDF
|
|
356
|
+
return self(RDF(x))
|
|
357
|
+
elif isinstance(x, complex):
|
|
358
|
+
from sage.rings.complex_double import CDF
|
|
359
|
+
return self(CDF(x))
|
|
360
|
+
if use_special:
|
|
361
|
+
try:
|
|
362
|
+
return self._coerce_from_special_method(x)
|
|
363
|
+
except AttributeError:
|
|
364
|
+
pass
|
|
365
|
+
|
|
366
|
+
if isinstance(x, (list, tuple)):
|
|
367
|
+
A = []
|
|
368
|
+
z = []
|
|
369
|
+
cls = self._object_class()
|
|
370
|
+
for v in x:
|
|
371
|
+
if isinstance(v, cls):
|
|
372
|
+
A.append(v.name())
|
|
373
|
+
z.append(v)
|
|
374
|
+
else:
|
|
375
|
+
w = self(v)
|
|
376
|
+
A.append(w.name())
|
|
377
|
+
z.append(w)
|
|
378
|
+
X = ','.join(A)
|
|
379
|
+
r = self.new('%s%s%s' % (self._left_list_delim(), X, self._right_list_delim()))
|
|
380
|
+
r.__sage_list = z # do this to avoid having the entries of the list be garbage collected
|
|
381
|
+
return r
|
|
382
|
+
|
|
383
|
+
raise TypeError("unable to coerce element into %s" % self.name())
|
|
384
|
+
|
|
385
|
+
def new(self, code):
|
|
386
|
+
return self(code)
|
|
387
|
+
|
|
388
|
+
###################################################################
|
|
389
|
+
# these should all be appropriately overloaded by the derived class
|
|
390
|
+
###################################################################
|
|
391
|
+
|
|
392
|
+
def _left_list_delim(self):
|
|
393
|
+
return "["
|
|
394
|
+
|
|
395
|
+
def _right_list_delim(self):
|
|
396
|
+
return "]"
|
|
397
|
+
|
|
398
|
+
def _left_func_delim(self):
|
|
399
|
+
return "("
|
|
400
|
+
|
|
401
|
+
def _right_func_delim(self):
|
|
402
|
+
return ")"
|
|
403
|
+
|
|
404
|
+
def _assign_symbol(self):
|
|
405
|
+
return "="
|
|
406
|
+
|
|
407
|
+
def _equality_symbol(self):
|
|
408
|
+
raise NotImplementedError
|
|
409
|
+
|
|
410
|
+
# For efficiency purposes, you should definitely override these
|
|
411
|
+
# in your derived class.
|
|
412
|
+
def _true_symbol(self):
|
|
413
|
+
try:
|
|
414
|
+
return self.__true_symbol
|
|
415
|
+
except AttributeError:
|
|
416
|
+
self.__true_symbol = self.get('1 %s 1' % self._equality_symbol())
|
|
417
|
+
return self.__true_symbol
|
|
418
|
+
|
|
419
|
+
def _false_symbol(self):
|
|
420
|
+
try:
|
|
421
|
+
return self.__false_symbol
|
|
422
|
+
except AttributeError:
|
|
423
|
+
self.__false_symbol = self.get('1 %s 2' % self._equality_symbol())
|
|
424
|
+
return self.__false_symbol
|
|
425
|
+
|
|
426
|
+
def _lessthan_symbol(self):
|
|
427
|
+
return '<'
|
|
428
|
+
|
|
429
|
+
def _greaterthan_symbol(self):
|
|
430
|
+
return '>'
|
|
431
|
+
|
|
432
|
+
def _inequality_symbol(self):
|
|
433
|
+
return '!='
|
|
434
|
+
|
|
435
|
+
def _relation_symbols(self):
|
|
436
|
+
"""
|
|
437
|
+
Return a dictionary with operators as the keys and their
|
|
438
|
+
string representation as the values.
|
|
439
|
+
|
|
440
|
+
EXAMPLES::
|
|
441
|
+
|
|
442
|
+
sage: import operator
|
|
443
|
+
sage: symbols = mathematica._relation_symbols()
|
|
444
|
+
sage: symbols[operator.eq]
|
|
445
|
+
'=='
|
|
446
|
+
"""
|
|
447
|
+
return {operator.eq: self._equality_symbol(),
|
|
448
|
+
operator.ne: self._inequality_symbol(),
|
|
449
|
+
operator.lt: self._lessthan_symbol(),
|
|
450
|
+
operator.le: "<=",
|
|
451
|
+
operator.gt: self._greaterthan_symbol(),
|
|
452
|
+
operator.ge: ">="}
|
|
453
|
+
|
|
454
|
+
def _exponent_symbol(self):
|
|
455
|
+
"""
|
|
456
|
+
Return the symbol used to denote ``*10^`` in floats, e.g 'e' in 1.5e6.
|
|
457
|
+
|
|
458
|
+
EXAMPLES::
|
|
459
|
+
|
|
460
|
+
sage: from sage.interfaces.expect import Expect
|
|
461
|
+
sage: Expect('nonexistent_interface', 'fake')._exponent_symbol()
|
|
462
|
+
'e'
|
|
463
|
+
"""
|
|
464
|
+
return 'e'
|
|
465
|
+
|
|
466
|
+
############################################################
|
|
467
|
+
# Functions for working with variables.
|
|
468
|
+
# The first three must be overloaded by derived classes,
|
|
469
|
+
# and the definition depends a lot on the class. But
|
|
470
|
+
# the functionality one gets from this is very nice.
|
|
471
|
+
############################################################
|
|
472
|
+
|
|
473
|
+
def set(self, var, value):
|
|
474
|
+
"""
|
|
475
|
+
Set the variable var to the given value.
|
|
476
|
+
"""
|
|
477
|
+
cmd = '%s%s%s;' % (var, self._assign_symbol(), value)
|
|
478
|
+
self.eval(cmd)
|
|
479
|
+
|
|
480
|
+
def get(self, var):
|
|
481
|
+
"""
|
|
482
|
+
Get the value of the variable var.
|
|
483
|
+
|
|
484
|
+
Note that this needs to be overridden in some interfaces,
|
|
485
|
+
namely when getting the string representation of an object
|
|
486
|
+
requires an explicit print command.
|
|
487
|
+
"""
|
|
488
|
+
return self.eval(var)
|
|
489
|
+
|
|
490
|
+
def get_using_file(self, var):
|
|
491
|
+
r"""
|
|
492
|
+
Return the string representation of the variable var in self,
|
|
493
|
+
possibly using a file. Use this if var has a huge string
|
|
494
|
+
representation, since it may be way faster.
|
|
495
|
+
|
|
496
|
+
.. warning::
|
|
497
|
+
|
|
498
|
+
In fact unless a special derived class implements this, it
|
|
499
|
+
will *not* be any faster. This is the case for this class
|
|
500
|
+
if you're reading it through introspection and seeing this.
|
|
501
|
+
"""
|
|
502
|
+
return self.get(var)
|
|
503
|
+
|
|
504
|
+
def clear(self, var):
|
|
505
|
+
"""
|
|
506
|
+
Clear the variable named var.
|
|
507
|
+
"""
|
|
508
|
+
self._available_vars.append(var)
|
|
509
|
+
|
|
510
|
+
def _next_var_name(self):
|
|
511
|
+
if len(self._available_vars) != 0:
|
|
512
|
+
v = self._available_vars[0]
|
|
513
|
+
del self._available_vars[0]
|
|
514
|
+
return v
|
|
515
|
+
self.__seq += 1
|
|
516
|
+
return "sage%s" % self.__seq
|
|
517
|
+
|
|
518
|
+
def _create(self, value, name=None):
|
|
519
|
+
name = self._next_var_name() if name is None else name
|
|
520
|
+
self.set(name, value)
|
|
521
|
+
return name
|
|
522
|
+
|
|
523
|
+
def _object_class(self):
|
|
524
|
+
"""
|
|
525
|
+
EXAMPLES::
|
|
526
|
+
|
|
527
|
+
sage: from sage.interfaces.expect import Expect
|
|
528
|
+
sage: Expect._object_class(maxima)
|
|
529
|
+
<class 'sage.interfaces.expect.ExpectElement'>
|
|
530
|
+
"""
|
|
531
|
+
return InterfaceElement
|
|
532
|
+
|
|
533
|
+
def _function_class(self):
|
|
534
|
+
"""
|
|
535
|
+
EXAMPLES::
|
|
536
|
+
|
|
537
|
+
sage: from sage.interfaces.interface import Interface
|
|
538
|
+
sage: Interface._function_class(maxima)
|
|
539
|
+
<class 'sage.interfaces.interface.InterfaceFunction'>
|
|
540
|
+
"""
|
|
541
|
+
return InterfaceFunction
|
|
542
|
+
|
|
543
|
+
def _function_element_class(self):
|
|
544
|
+
"""
|
|
545
|
+
EXAMPLES::
|
|
546
|
+
|
|
547
|
+
sage: from sage.interfaces.interface import Interface
|
|
548
|
+
sage: Interface._function_element_class(maxima)
|
|
549
|
+
<class 'sage.interfaces.interface.InterfaceFunctionElement'>
|
|
550
|
+
"""
|
|
551
|
+
return InterfaceFunctionElement
|
|
552
|
+
|
|
553
|
+
def _convert_args_kwds(self, args=None, kwds=None):
|
|
554
|
+
"""
|
|
555
|
+
Convert all of the ``args`` and ``kwds`` to be elements of this
|
|
556
|
+
interface.
|
|
557
|
+
|
|
558
|
+
EXAMPLES::
|
|
559
|
+
|
|
560
|
+
sage: args = [5]
|
|
561
|
+
sage: kwds = {'x': 6}
|
|
562
|
+
sage: args, kwds = gap._convert_args_kwds(args, kwds)
|
|
563
|
+
sage: args
|
|
564
|
+
[5]
|
|
565
|
+
sage: list(map(type, args))
|
|
566
|
+
[<class 'sage.interfaces.gap.GapElement'>]
|
|
567
|
+
sage: type(kwds['x'])
|
|
568
|
+
<class 'sage.interfaces.gap.GapElement'>
|
|
569
|
+
"""
|
|
570
|
+
args = [] if args is None else args
|
|
571
|
+
kwds = {} if kwds is None else kwds
|
|
572
|
+
if not isinstance(args, list):
|
|
573
|
+
args = [args]
|
|
574
|
+
for i, arg in enumerate(args):
|
|
575
|
+
if not isinstance(arg, InterfaceElement) or arg.parent() is not self:
|
|
576
|
+
args[i] = self(arg)
|
|
577
|
+
for key, value in kwds.items():
|
|
578
|
+
if not isinstance(value, InterfaceElement) or value.parent() is not self:
|
|
579
|
+
kwds[key] = self(value)
|
|
580
|
+
|
|
581
|
+
return args, kwds
|
|
582
|
+
|
|
583
|
+
def _check_valid_function_name(self, function):
|
|
584
|
+
"""
|
|
585
|
+
Check to see if function is a valid function name in this
|
|
586
|
+
interface. If it is not, an exception is raised. Otherwise, nothing
|
|
587
|
+
is done.
|
|
588
|
+
|
|
589
|
+
EXAMPLES::
|
|
590
|
+
|
|
591
|
+
sage: gap._check_valid_function_name('SymmetricGroup')
|
|
592
|
+
sage: gap._check_valid_function_name('')
|
|
593
|
+
Traceback (most recent call last):
|
|
594
|
+
...
|
|
595
|
+
ValueError: function name must be nonempty
|
|
596
|
+
sage: gap._check_valid_function_name('__foo')
|
|
597
|
+
Traceback (most recent call last):
|
|
598
|
+
...
|
|
599
|
+
AttributeError
|
|
600
|
+
"""
|
|
601
|
+
if function == '':
|
|
602
|
+
raise ValueError("function name must be nonempty")
|
|
603
|
+
if function[:2] == "__":
|
|
604
|
+
raise AttributeError
|
|
605
|
+
|
|
606
|
+
def function_call(self, function, args=None, kwds=None):
|
|
607
|
+
"""
|
|
608
|
+
EXAMPLES::
|
|
609
|
+
|
|
610
|
+
sage: maxima.quad_qags(x, x, 0, 1, epsrel=1e-4)
|
|
611
|
+
[0.5,5.5511151231257...e-15,21,0]
|
|
612
|
+
sage: maxima.function_call('quad_qags', [x, x, 0, 1], {'epsrel':'1e-4'})
|
|
613
|
+
[0.5,5.5511151231257...e-15,21,0]
|
|
614
|
+
"""
|
|
615
|
+
args, kwds = self._convert_args_kwds(args, kwds)
|
|
616
|
+
self._check_valid_function_name(function)
|
|
617
|
+
s = self._function_call_string(function,
|
|
618
|
+
[s.name() for s in args],
|
|
619
|
+
['%s=%s' % (key, value.name()) for key, value in kwds.items()])
|
|
620
|
+
return self.new(s)
|
|
621
|
+
|
|
622
|
+
def _function_call_string(self, function, args, kwds):
|
|
623
|
+
"""
|
|
624
|
+
Return the string used to make function calls.
|
|
625
|
+
|
|
626
|
+
EXAMPLES::
|
|
627
|
+
|
|
628
|
+
sage: maxima._function_call_string('diff', ['f(x)', 'x'], [])
|
|
629
|
+
'diff(f(x),x)'
|
|
630
|
+
"""
|
|
631
|
+
return "%s(%s)" % (function, ",".join(list(args) + list(kwds)))
|
|
632
|
+
|
|
633
|
+
def call(self, function_name, *args, **kwds):
|
|
634
|
+
return self.function_call(function_name, args, kwds)
|
|
635
|
+
|
|
636
|
+
def _contains(self, v1, v2):
|
|
637
|
+
raise NotImplementedError
|
|
638
|
+
|
|
639
|
+
def __getattr__(self, attrname):
|
|
640
|
+
"""
|
|
641
|
+
TESTS::
|
|
642
|
+
|
|
643
|
+
sage: from sage.structure.parent_base import ParentWithBase
|
|
644
|
+
sage: from sage.interfaces.singular import singular
|
|
645
|
+
sage: ParentWithBase.__getattribute__(singular, '_coerce_map_from_')
|
|
646
|
+
<bound method Singular._coerce_map_from_ of Singular>
|
|
647
|
+
"""
|
|
648
|
+
try:
|
|
649
|
+
return ParentWithBase.__getattribute__(self, attrname)
|
|
650
|
+
except AttributeError:
|
|
651
|
+
if attrname[:1] == "_":
|
|
652
|
+
raise
|
|
653
|
+
return self._function_class()(self, attrname)
|
|
654
|
+
|
|
655
|
+
def console(self):
|
|
656
|
+
raise NotImplementedError
|
|
657
|
+
|
|
658
|
+
def help(self, s):
|
|
659
|
+
return AsciiArtString('No help on %s available' % s)
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
@instancedoc
|
|
663
|
+
class InterfaceFunction(SageObject):
|
|
664
|
+
"""
|
|
665
|
+
Interface function.
|
|
666
|
+
"""
|
|
667
|
+
def __init__(self, parent, name):
|
|
668
|
+
self._parent = parent
|
|
669
|
+
self._name = name
|
|
670
|
+
|
|
671
|
+
def _repr_(self):
|
|
672
|
+
return "%s" % self._name
|
|
673
|
+
|
|
674
|
+
def __call__(self, *args, **kwds):
|
|
675
|
+
return self._parent.function_call(self._name, list(args), kwds)
|
|
676
|
+
|
|
677
|
+
def _instancedoc_(self):
|
|
678
|
+
"""
|
|
679
|
+
EXAMPLES::
|
|
680
|
+
|
|
681
|
+
sage: gp.gcd.__doc__
|
|
682
|
+
'gcd(x,{y}): greatest common divisor of x and y.'
|
|
683
|
+
"""
|
|
684
|
+
M = self._parent
|
|
685
|
+
return M.help(self._name)
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
@instancedoc
|
|
689
|
+
class InterfaceFunctionElement(SageObject):
|
|
690
|
+
"""
|
|
691
|
+
Interface function element.
|
|
692
|
+
"""
|
|
693
|
+
def __init__(self, obj, name):
|
|
694
|
+
self._obj = obj
|
|
695
|
+
self._name = name
|
|
696
|
+
|
|
697
|
+
def _repr_(self):
|
|
698
|
+
return "%s" % self._name
|
|
699
|
+
|
|
700
|
+
def __call__(self, *args, **kwds):
|
|
701
|
+
return self._obj.parent().function_call(self._name, [self._obj] + list(args), kwds)
|
|
702
|
+
|
|
703
|
+
def help(self):
|
|
704
|
+
print(self.__doc__)
|
|
705
|
+
|
|
706
|
+
def _instancedoc_(self):
|
|
707
|
+
"""
|
|
708
|
+
EXAMPLES::
|
|
709
|
+
|
|
710
|
+
sage: gp(2).gcd.__doc__
|
|
711
|
+
'gcd(x,{y}): greatest common divisor of x and y.'
|
|
712
|
+
"""
|
|
713
|
+
M = self._obj.parent()
|
|
714
|
+
return M.help(self._name)
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
def is_InterfaceElement(x):
|
|
718
|
+
"""
|
|
719
|
+
Return ``True`` if ``x`` is of type :class:`InterfaceElement`.
|
|
720
|
+
|
|
721
|
+
EXAMPLES::
|
|
722
|
+
|
|
723
|
+
sage: from sage.interfaces.interface import is_InterfaceElement
|
|
724
|
+
sage: is_InterfaceElement(2)
|
|
725
|
+
doctest:...: DeprecationWarning: the function is_InterfaceElement is deprecated; use isinstance(x, sage.interfaces.abc.InterfaceElement) instead
|
|
726
|
+
See https://github.com/sagemath/sage/issues/34804 for details.
|
|
727
|
+
False
|
|
728
|
+
"""
|
|
729
|
+
from sage.misc.superseded import deprecation
|
|
730
|
+
deprecation(34804, "the function is_InterfaceElement is deprecated; use isinstance(x, sage.interfaces.abc.InterfaceElement) instead")
|
|
731
|
+
|
|
732
|
+
return isinstance(x, InterfaceElement)
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
@instancedoc
|
|
736
|
+
class InterfaceElement(Element):
|
|
737
|
+
"""
|
|
738
|
+
Interface element.
|
|
739
|
+
"""
|
|
740
|
+
def __init__(self, parent, value, is_name=False, name=None):
|
|
741
|
+
Element.__init__(self, parent)
|
|
742
|
+
self._create = value
|
|
743
|
+
if parent is None:
|
|
744
|
+
return # means "invalid element"
|
|
745
|
+
# idea: Joe Wetherell -- try to find out if the output
|
|
746
|
+
# is too long and if so get it using file, otherwise
|
|
747
|
+
# don't.
|
|
748
|
+
|
|
749
|
+
if is_name:
|
|
750
|
+
self._name = value
|
|
751
|
+
else:
|
|
752
|
+
try:
|
|
753
|
+
self._name = parent._create(value, name=name)
|
|
754
|
+
except (TypeError, RuntimeError, ValueError) as x:
|
|
755
|
+
raise TypeError(x)
|
|
756
|
+
|
|
757
|
+
def _latex_(self):
|
|
758
|
+
# return "\\begin{verbatim}%s\\end{verbatim}"%self
|
|
759
|
+
string = str(self)
|
|
760
|
+
if '|' not in string:
|
|
761
|
+
delim = '|'
|
|
762
|
+
elif '#' not in string:
|
|
763
|
+
delim = '#'
|
|
764
|
+
elif '@' not in string:
|
|
765
|
+
delim = '@'
|
|
766
|
+
elif '~' not in string:
|
|
767
|
+
delim = '~'
|
|
768
|
+
return "\\verb%s%s%s" % (delim, string, delim)
|
|
769
|
+
|
|
770
|
+
def __iter__(self):
|
|
771
|
+
for i in range(1, len(self) + 1):
|
|
772
|
+
yield self[i]
|
|
773
|
+
|
|
774
|
+
def __len__(self):
|
|
775
|
+
"""
|
|
776
|
+
Call self.sage() and return the length of that sage object.
|
|
777
|
+
|
|
778
|
+
This approach is inefficient - each interface should override
|
|
779
|
+
this method with one that calls the external program's length
|
|
780
|
+
function.
|
|
781
|
+
|
|
782
|
+
EXAMPLES::
|
|
783
|
+
|
|
784
|
+
sage: len(gp([1,2,3]))
|
|
785
|
+
3
|
|
786
|
+
|
|
787
|
+
AUTHORS:
|
|
788
|
+
|
|
789
|
+
- Felix Lawrence (2009-08-21)
|
|
790
|
+
"""
|
|
791
|
+
return len(self.sage())
|
|
792
|
+
|
|
793
|
+
def __reduce__(self):
|
|
794
|
+
"""
|
|
795
|
+
The default linearisation is to return ``self``'s parent,
|
|
796
|
+
which will then get the items returned by :meth:`_reduce`
|
|
797
|
+
as arguments to reconstruct the element.
|
|
798
|
+
|
|
799
|
+
EXAMPLES::
|
|
800
|
+
|
|
801
|
+
sage: G = gap.SymmetricGroup(6)
|
|
802
|
+
sage: loads(dumps(G)) == G # indirect doctest
|
|
803
|
+
True
|
|
804
|
+
sage: y = gap(34)
|
|
805
|
+
sage: loads(dumps(y))
|
|
806
|
+
34
|
|
807
|
+
sage: type(_)
|
|
808
|
+
<class 'sage.interfaces.gap.GapElement'>
|
|
809
|
+
sage: y = singular(34)
|
|
810
|
+
sage: loads(dumps(y))
|
|
811
|
+
34
|
|
812
|
+
sage: type(_)
|
|
813
|
+
<class 'sage.interfaces.singular.SingularElement'>
|
|
814
|
+
sage: G = gap.PolynomialRing(QQ, ['x'])
|
|
815
|
+
sage: loads(dumps(G))
|
|
816
|
+
PolynomialRing( Rationals, ["x"] )
|
|
817
|
+
sage: S = singular.ring(0, ('x'))
|
|
818
|
+
sage: loads(dumps(S))
|
|
819
|
+
polynomial ring, over a field, global ordering
|
|
820
|
+
// coefficients: QQ...
|
|
821
|
+
// number of vars : 1
|
|
822
|
+
// block 1 : ordering lp
|
|
823
|
+
// : names x
|
|
824
|
+
// block 2 : ordering C
|
|
825
|
+
|
|
826
|
+
Here are further examples of pickling of interface elements::
|
|
827
|
+
|
|
828
|
+
sage: loads(dumps(gp('"abc"')))
|
|
829
|
+
abc
|
|
830
|
+
sage: loads(dumps(gp([1,2,3])))
|
|
831
|
+
[1, 2, 3]
|
|
832
|
+
sage: loads(dumps(pari('"abc"')))
|
|
833
|
+
"abc"
|
|
834
|
+
sage: loads(dumps(pari([1,2,3])))
|
|
835
|
+
[1, 2, 3]
|
|
836
|
+
sage: loads(dumps(r('"abc"'))) # optional - rpy2
|
|
837
|
+
[1] "abc"
|
|
838
|
+
sage: loads(dumps(r([1,2,3]))) # optional - rpy2
|
|
839
|
+
[1] 1 2 3
|
|
840
|
+
sage: loads(dumps(maxima([1,2,3])))
|
|
841
|
+
[1,2,3]
|
|
842
|
+
|
|
843
|
+
Unfortunately, strings in maxima can't be pickled yet::
|
|
844
|
+
|
|
845
|
+
sage: loads(dumps(maxima('"abc"')))
|
|
846
|
+
Traceback (most recent call last):
|
|
847
|
+
...
|
|
848
|
+
TypeError: unable to make sense of Maxima expression '"abc"' in Sage
|
|
849
|
+
"""
|
|
850
|
+
return self.parent(), (self._reduce(),)
|
|
851
|
+
|
|
852
|
+
def _reduce(self):
|
|
853
|
+
"""
|
|
854
|
+
Helper for pickling.
|
|
855
|
+
|
|
856
|
+
By default, if ``self`` is a string, then the representation of
|
|
857
|
+
that string is returned (not the string itself). Otherwise,
|
|
858
|
+
it is attempted to return the corresponding Sage object.
|
|
859
|
+
If this fails with a :exc:`NotImplementedError`, the string
|
|
860
|
+
representation of ``self`` is returned instead.
|
|
861
|
+
|
|
862
|
+
EXAMPLES::
|
|
863
|
+
|
|
864
|
+
sage: S = singular.ring(0, ('x'))
|
|
865
|
+
sage: S._reduce()
|
|
866
|
+
Univariate Polynomial Ring in x over Rational Field
|
|
867
|
+
sage: G = gap.PolynomialRing(QQ, ['x'])
|
|
868
|
+
sage: G._reduce()
|
|
869
|
+
'PolynomialRing( Rationals, ["x"] )'
|
|
870
|
+
sage: G.sage()
|
|
871
|
+
Traceback (most recent call last):
|
|
872
|
+
...
|
|
873
|
+
NotImplementedError: Unable to parse output: PolynomialRing( Rationals, ["x"] )
|
|
874
|
+
sage: singular('"abc"')._reduce()
|
|
875
|
+
"'abc'"
|
|
876
|
+
sage: singular('1')._reduce()
|
|
877
|
+
1
|
|
878
|
+
|
|
879
|
+
TESTS:
|
|
880
|
+
|
|
881
|
+
Special care has to be taken with strings. Since for example `r("abc")` will be
|
|
882
|
+
interpreted as the R-command abc (not a string in R), we have to reduce to
|
|
883
|
+
`"'abc'"` instead. That is dependant on the Elements ``is_string`` function to
|
|
884
|
+
be implemented correctly. This has gone wrong in the past and remained uncaught
|
|
885
|
+
by the doctests because the original identifier was reused. This test makes sure
|
|
886
|
+
that does not happen again::
|
|
887
|
+
|
|
888
|
+
sage: # optional - rpy2
|
|
889
|
+
sage: a = r("'abc'")
|
|
890
|
+
sage: b = dumps(a)
|
|
891
|
+
sage: r.set(a.name(), 0) # make sure that identifier reuse
|
|
892
|
+
....: # does not accidentally lead to success
|
|
893
|
+
sage: loads(b)
|
|
894
|
+
[1] "abc"
|
|
895
|
+
"""
|
|
896
|
+
if self.is_string():
|
|
897
|
+
return repr(self.sage())
|
|
898
|
+
try:
|
|
899
|
+
return self.sage()
|
|
900
|
+
except NotImplementedError:
|
|
901
|
+
return repr(self)
|
|
902
|
+
|
|
903
|
+
def __call__(self, *args):
|
|
904
|
+
self._check_valid()
|
|
905
|
+
P = self.parent()
|
|
906
|
+
return getattr(P, self.name())(*args)
|
|
907
|
+
|
|
908
|
+
def __contains__(self, x):
|
|
909
|
+
P = self._check_valid()
|
|
910
|
+
if not isinstance(x, InterfaceElement) or x.parent() is not self.parent():
|
|
911
|
+
x = P.new(x)
|
|
912
|
+
return P._contains(x.name(), self.name())
|
|
913
|
+
|
|
914
|
+
def _instancedoc_(self):
|
|
915
|
+
"""
|
|
916
|
+
EXAMPLES::
|
|
917
|
+
|
|
918
|
+
sage: gp(2).__doc__
|
|
919
|
+
'2'
|
|
920
|
+
"""
|
|
921
|
+
return str(self)
|
|
922
|
+
|
|
923
|
+
def __hash__(self):
|
|
924
|
+
"""
|
|
925
|
+
Return the hash of ``self``. This is a default implementation of hash
|
|
926
|
+
which just takes the hash of the string of ``self``.
|
|
927
|
+
"""
|
|
928
|
+
return hash('%s' % self)
|
|
929
|
+
|
|
930
|
+
def _richcmp_(self, other, op):
|
|
931
|
+
"""
|
|
932
|
+
Comparison of interface elements.
|
|
933
|
+
|
|
934
|
+
NOTE:
|
|
935
|
+
|
|
936
|
+
GAP has a special role here. It may in some cases raise an error
|
|
937
|
+
when comparing objects, which is unwanted in Python. We catch
|
|
938
|
+
these errors. Moreover, GAP does not recognise certain objects as
|
|
939
|
+
equal even if there definitions are identical.
|
|
940
|
+
|
|
941
|
+
NOTE:
|
|
942
|
+
|
|
943
|
+
This methods need to be overridden if the subprocess would
|
|
944
|
+
not return a string representation of a boolean value unless
|
|
945
|
+
an explicit print command is used.
|
|
946
|
+
|
|
947
|
+
TESTS:
|
|
948
|
+
|
|
949
|
+
Here are examples in which GAP succeeds with a comparison::
|
|
950
|
+
|
|
951
|
+
sage: gap('SymmetricGroup(8)')==gap('SymmetricGroup(8)')
|
|
952
|
+
True
|
|
953
|
+
sage: gap('SymmetricGroup(8)')>gap('AlternatingGroup(8)')
|
|
954
|
+
False
|
|
955
|
+
sage: gap('SymmetricGroup(8)')<gap('AlternatingGroup(8)')
|
|
956
|
+
True
|
|
957
|
+
|
|
958
|
+
Here, GAP fails to compare, and so ``False`` is returned.
|
|
959
|
+
In previous Sage versions, this example actually resulted
|
|
960
|
+
in an error; compare :issue:`5962`.
|
|
961
|
+
::
|
|
962
|
+
|
|
963
|
+
sage: gap('DihedralGroup(8)')==gap('DihedralGroup(8)')
|
|
964
|
+
False
|
|
965
|
+
"""
|
|
966
|
+
P = self._check_valid()
|
|
967
|
+
try:
|
|
968
|
+
if P.eval("%s %s %s" % (self.name(), P._equality_symbol(),
|
|
969
|
+
other.name())) == P._true_symbol():
|
|
970
|
+
return rich_to_bool(op, 0)
|
|
971
|
+
except RuntimeError:
|
|
972
|
+
pass
|
|
973
|
+
try:
|
|
974
|
+
if P.eval("%s %s %s" % (self.name(), P._lessthan_symbol(), other.name())) == P._true_symbol():
|
|
975
|
+
return rich_to_bool(op, -1)
|
|
976
|
+
except RuntimeError:
|
|
977
|
+
pass
|
|
978
|
+
try:
|
|
979
|
+
if P.eval("%s %s %s" % (self.name(), P._greaterthan_symbol(), other.name())) == P._true_symbol():
|
|
980
|
+
return rich_to_bool(op, 1)
|
|
981
|
+
except Exception:
|
|
982
|
+
pass
|
|
983
|
+
|
|
984
|
+
return NotImplemented
|
|
985
|
+
|
|
986
|
+
def is_string(self):
|
|
987
|
+
"""
|
|
988
|
+
Tell whether this element is a string.
|
|
989
|
+
|
|
990
|
+
By default, the answer is negative.
|
|
991
|
+
"""
|
|
992
|
+
return False
|
|
993
|
+
|
|
994
|
+
def _matrix_(self, R):
|
|
995
|
+
raise NotImplementedError
|
|
996
|
+
|
|
997
|
+
def _vector_(self, R):
|
|
998
|
+
raise NotImplementedError
|
|
999
|
+
|
|
1000
|
+
def _check_valid(self):
|
|
1001
|
+
"""
|
|
1002
|
+
Check that this object is valid, i.e., the session in which this
|
|
1003
|
+
object is defined is still running. This is relevant for
|
|
1004
|
+
interpreters that can't be interrupted via ctrl-C, hence get
|
|
1005
|
+
restarted.
|
|
1006
|
+
"""
|
|
1007
|
+
try:
|
|
1008
|
+
P = self.parent()
|
|
1009
|
+
if P is None:
|
|
1010
|
+
raise ValueError("The %s session in which this object was defined is no longer running." % P.name())
|
|
1011
|
+
except AttributeError:
|
|
1012
|
+
raise ValueError("The session in which this object was defined is no longer running.")
|
|
1013
|
+
return P
|
|
1014
|
+
|
|
1015
|
+
def __del__(self):
|
|
1016
|
+
try:
|
|
1017
|
+
self._check_valid()
|
|
1018
|
+
except ValueError:
|
|
1019
|
+
return
|
|
1020
|
+
if hasattr(self, '_name'):
|
|
1021
|
+
P = self.parent()
|
|
1022
|
+
if P is not None:
|
|
1023
|
+
P.clear(self._name)
|
|
1024
|
+
|
|
1025
|
+
def _sage_repr(self):
|
|
1026
|
+
"""
|
|
1027
|
+
Return a sage-friendly string representation of the object.
|
|
1028
|
+
|
|
1029
|
+
Some programs use different notation to Sage, e.g. Mathematica
|
|
1030
|
+
writes lists with {} instead of []. This method calls repr(self)
|
|
1031
|
+
then converts the foreign notation into Sage's notation.
|
|
1032
|
+
|
|
1033
|
+
OUTPUT:
|
|
1034
|
+
|
|
1035
|
+
A string representation of the object that is ready for
|
|
1036
|
+
sage_eval().
|
|
1037
|
+
|
|
1038
|
+
EXAMPLES::
|
|
1039
|
+
|
|
1040
|
+
sage: repr(mathematica([1,2,3])) # optional - mathematica
|
|
1041
|
+
'{1, 2, 3}'
|
|
1042
|
+
sage: mathematica([1,2,3])._sage_repr() # optional - mathematica
|
|
1043
|
+
'[1, 2, 3]'
|
|
1044
|
+
|
|
1045
|
+
::
|
|
1046
|
+
|
|
1047
|
+
sage: gp(10.^80)._sage_repr()
|
|
1048
|
+
'1.0000000000000000000000000000000000000e80'
|
|
1049
|
+
sage: mathematica('10.^80')._sage_repr() # optional - mathematica
|
|
1050
|
+
'1.e80'
|
|
1051
|
+
|
|
1052
|
+
AUTHORS:
|
|
1053
|
+
|
|
1054
|
+
- Felix Lawrence (2009-08-21)
|
|
1055
|
+
"""
|
|
1056
|
+
# TO DO: this could use file transfers when self.is_remote()
|
|
1057
|
+
|
|
1058
|
+
string = repr(self).replace('\n', ' ').replace('\r', '')
|
|
1059
|
+
# Translate the external program's function notation to Sage's
|
|
1060
|
+
lfd = self.parent()._left_func_delim()
|
|
1061
|
+
if '(' != lfd:
|
|
1062
|
+
string = string.replace(lfd, '(')
|
|
1063
|
+
rfd = self.parent()._right_func_delim()
|
|
1064
|
+
if ')' != rfd:
|
|
1065
|
+
string = string.replace(rfd, ')')
|
|
1066
|
+
# Translate the external program's list formatting to Sage's
|
|
1067
|
+
lld = self.parent()._left_list_delim()
|
|
1068
|
+
if '[' != lld:
|
|
1069
|
+
string = string.replace(lld, '[')
|
|
1070
|
+
rld = self.parent()._right_list_delim()
|
|
1071
|
+
if ']' != rld:
|
|
1072
|
+
string = string.replace(rld, ']')
|
|
1073
|
+
# Translate the external program's exponent formatting
|
|
1074
|
+
expl = self.parent()._exponent_symbol()
|
|
1075
|
+
if 'e' != expl:
|
|
1076
|
+
string = string.replace(expl, 'e')
|
|
1077
|
+
return string
|
|
1078
|
+
|
|
1079
|
+
def _sage_(self):
|
|
1080
|
+
"""
|
|
1081
|
+
Attempt to return a Sage version of this object.
|
|
1082
|
+
This is a generic routine that just tries to evaluate
|
|
1083
|
+
the repr(self).
|
|
1084
|
+
|
|
1085
|
+
EXAMPLES::
|
|
1086
|
+
|
|
1087
|
+
sage: gp(1/2)._sage_()
|
|
1088
|
+
1/2
|
|
1089
|
+
sage: _.parent()
|
|
1090
|
+
Rational Field
|
|
1091
|
+
|
|
1092
|
+
AUTHORS:
|
|
1093
|
+
|
|
1094
|
+
- William Stein
|
|
1095
|
+
|
|
1096
|
+
- Felix Lawrence (2009-08-21)
|
|
1097
|
+
"""
|
|
1098
|
+
string = self._sage_repr()
|
|
1099
|
+
try:
|
|
1100
|
+
from sage.misc.sage_eval import sage_eval
|
|
1101
|
+
|
|
1102
|
+
return sage_eval(string)
|
|
1103
|
+
except Exception:
|
|
1104
|
+
raise NotImplementedError("Unable to parse output: %s" % string)
|
|
1105
|
+
|
|
1106
|
+
def sage(self, *args, **kwds):
|
|
1107
|
+
"""
|
|
1108
|
+
Attempt to return a Sage version of this object.
|
|
1109
|
+
|
|
1110
|
+
This method does nothing more than calling :meth:`_sage_`,
|
|
1111
|
+
simply forwarding any additional arguments.
|
|
1112
|
+
|
|
1113
|
+
EXAMPLES::
|
|
1114
|
+
|
|
1115
|
+
sage: gp(1/2).sage()
|
|
1116
|
+
1/2
|
|
1117
|
+
sage: _.parent()
|
|
1118
|
+
Rational Field
|
|
1119
|
+
sage: singular.lib("matrix")
|
|
1120
|
+
sage: R = singular.ring(0, '(x,y,z)', 'dp')
|
|
1121
|
+
sage: singular.matrix(2,2).sage()
|
|
1122
|
+
[0 0]
|
|
1123
|
+
[0 0]
|
|
1124
|
+
"""
|
|
1125
|
+
return self._sage_(*args, **kwds)
|
|
1126
|
+
|
|
1127
|
+
def __repr__(self):
|
|
1128
|
+
"""
|
|
1129
|
+
To obtain the string representation, it is first checked whether
|
|
1130
|
+
the element is still valid. Then, if ``self._cached_repr`` is
|
|
1131
|
+
a string then it is returned. Otherwise, ``self._repr_()``
|
|
1132
|
+
is called (and the result is cached, if ``self._cached_repr``
|
|
1133
|
+
evaluates to ``True``).
|
|
1134
|
+
|
|
1135
|
+
If the string obtained so far contains ``self._name``, then it
|
|
1136
|
+
is replaced by ``self``'s custom name, if available.
|
|
1137
|
+
|
|
1138
|
+
To implement a custom string representation, override the method
|
|
1139
|
+
``_repr_``, but do not override this double underscore method.
|
|
1140
|
+
|
|
1141
|
+
EXAMPLES:
|
|
1142
|
+
|
|
1143
|
+
Here is one example showing that the string representation will
|
|
1144
|
+
be cached when requested::
|
|
1145
|
+
|
|
1146
|
+
sage: from sage.interfaces.maxima_lib import maxima_lib
|
|
1147
|
+
sage: M = maxima_lib('sqrt(2) + 1/3')
|
|
1148
|
+
sage: M._cached_repr
|
|
1149
|
+
True
|
|
1150
|
+
sage: repr(M) is repr(M) # indirect doctest
|
|
1151
|
+
True
|
|
1152
|
+
sage: M._cached_repr
|
|
1153
|
+
'sqrt(2)+1/3'
|
|
1154
|
+
sage: M
|
|
1155
|
+
sqrt(2)+1/3
|
|
1156
|
+
|
|
1157
|
+
If the interface breaks then it is reflected in the string representation::
|
|
1158
|
+
|
|
1159
|
+
sage: s = singular('2')
|
|
1160
|
+
sage: s
|
|
1161
|
+
2
|
|
1162
|
+
sage: singular.quit()
|
|
1163
|
+
sage: s
|
|
1164
|
+
(invalid Singular object -- The singular session in which this object was defined is no longer running.)
|
|
1165
|
+
"""
|
|
1166
|
+
try:
|
|
1167
|
+
self._check_valid()
|
|
1168
|
+
except ValueError as msg:
|
|
1169
|
+
return '(invalid {} object -- {})'.format(self.parent() or type(self), msg)
|
|
1170
|
+
cr = getattr(self, '_cached_repr', None)
|
|
1171
|
+
if isinstance(cr, str):
|
|
1172
|
+
s = cr
|
|
1173
|
+
else:
|
|
1174
|
+
s = self._repr_()
|
|
1175
|
+
if self._name in s and self.get_custom_name() is not None:
|
|
1176
|
+
s = s.replace(self._name, self.get_custom_name())
|
|
1177
|
+
if cr:
|
|
1178
|
+
self._cached_repr = s
|
|
1179
|
+
return s
|
|
1180
|
+
|
|
1181
|
+
def _repr_(self):
|
|
1182
|
+
"""
|
|
1183
|
+
Default implementation of a helper method for string representation.
|
|
1184
|
+
|
|
1185
|
+
It is supposed that immediately before calling this method,
|
|
1186
|
+
the validity of ``self``'s parent was confirmed. So, when you
|
|
1187
|
+
override this method, you can assume that the parent is valid.
|
|
1188
|
+
|
|
1189
|
+
TESTS:
|
|
1190
|
+
|
|
1191
|
+
In :issue:`22501`, several string representation methods have been
|
|
1192
|
+
removed in favour of using the default implementation. The corresponding
|
|
1193
|
+
tests have been moved here::
|
|
1194
|
+
|
|
1195
|
+
sage: gap(SymmetricGroup(8)) # indirect doctest
|
|
1196
|
+
SymmetricGroup( [ 1 .. 8 ] )
|
|
1197
|
+
sage: gap(2)
|
|
1198
|
+
2
|
|
1199
|
+
sage: x = var('x')
|
|
1200
|
+
sage: giac(x) # needs giac
|
|
1201
|
+
sageVARx
|
|
1202
|
+
sage: giac(5) # needs giac
|
|
1203
|
+
5
|
|
1204
|
+
sage: M = matrix(QQ,2,range(4))
|
|
1205
|
+
sage: giac(M) # needs giac
|
|
1206
|
+
[[0,1],[2,3]]
|
|
1207
|
+
sage: x = var('x') # optional - maple
|
|
1208
|
+
sage: maple(x) # optional - maple
|
|
1209
|
+
x
|
|
1210
|
+
sage: maple(5) # optional - maple
|
|
1211
|
+
5
|
|
1212
|
+
sage: M = matrix(QQ,2,range(4)) # optional - maple
|
|
1213
|
+
sage: maple(M) # optional - maple
|
|
1214
|
+
Matrix(2, 2, [[0,1],[2,3]])
|
|
1215
|
+
sage: maxima('sqrt(2) + 1/3')
|
|
1216
|
+
sqrt(2)+1/3
|
|
1217
|
+
sage: mupad.package('"MuPAD-Combinat"') # optional - mupad-Combinat
|
|
1218
|
+
sage: S = mupad.examples.SymmetricFunctions(); S # optional - mupad-Combinat
|
|
1219
|
+
examples::SymmetricFunctions(Dom::ExpressionField())
|
|
1220
|
+
"""
|
|
1221
|
+
P = self.parent()
|
|
1222
|
+
try:
|
|
1223
|
+
if self._get_using_file:
|
|
1224
|
+
return P.get_using_file(self._name).rstrip()
|
|
1225
|
+
except AttributeError:
|
|
1226
|
+
return self.parent().get(self._name).rstrip()
|
|
1227
|
+
|
|
1228
|
+
def __getattr__(self, attrname):
|
|
1229
|
+
try:
|
|
1230
|
+
P = self._check_valid()
|
|
1231
|
+
except ValueError:
|
|
1232
|
+
raise AttributeError(attrname)
|
|
1233
|
+
if attrname[:1] == "_":
|
|
1234
|
+
raise AttributeError
|
|
1235
|
+
return P._function_element_class()(self, attrname)
|
|
1236
|
+
|
|
1237
|
+
def get_using_file(self):
|
|
1238
|
+
"""
|
|
1239
|
+
Return this element's string representation using a file. Use this
|
|
1240
|
+
if ``self`` has a huge string representation. It'll be way faster.
|
|
1241
|
+
|
|
1242
|
+
EXAMPLES::
|
|
1243
|
+
|
|
1244
|
+
sage: a = maxima(str(2^1000))
|
|
1245
|
+
sage: a.get_using_file()
|
|
1246
|
+
'10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376'
|
|
1247
|
+
"""
|
|
1248
|
+
try:
|
|
1249
|
+
self._check_valid()
|
|
1250
|
+
except ValueError as msg:
|
|
1251
|
+
return '(invalid {} object -- {})'.format(self.parent() or type(self), msg)
|
|
1252
|
+
return self.parent().get_using_file(self._name)
|
|
1253
|
+
|
|
1254
|
+
def hasattr(self, attrname):
|
|
1255
|
+
"""
|
|
1256
|
+
Return whether the given attribute is already defined by this
|
|
1257
|
+
object, and in particular is not dynamically generated.
|
|
1258
|
+
|
|
1259
|
+
EXAMPLES::
|
|
1260
|
+
|
|
1261
|
+
sage: m = maxima('2')
|
|
1262
|
+
sage: m.hasattr('integral')
|
|
1263
|
+
True
|
|
1264
|
+
sage: m.hasattr('gcd')
|
|
1265
|
+
False
|
|
1266
|
+
"""
|
|
1267
|
+
return not isinstance(getattr(self, attrname), (InterfaceFunctionElement, InterfaceElement))
|
|
1268
|
+
|
|
1269
|
+
def attribute(self, attrname):
|
|
1270
|
+
"""
|
|
1271
|
+
If this wraps the object x in the system, this returns the object
|
|
1272
|
+
x.attrname. This is useful for some systems that have object
|
|
1273
|
+
oriented attribute access notation.
|
|
1274
|
+
|
|
1275
|
+
EXAMPLES::
|
|
1276
|
+
|
|
1277
|
+
sage: g = gap('SO(1,4,7)')
|
|
1278
|
+
sage: k = g.InvariantQuadraticForm()
|
|
1279
|
+
sage: k.attribute('matrix')
|
|
1280
|
+
[ [ 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7) ], [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ],
|
|
1281
|
+
[ 0*Z(7), 0*Z(7), Z(7), 0*Z(7) ], [ 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0 ] ]
|
|
1282
|
+
|
|
1283
|
+
::
|
|
1284
|
+
|
|
1285
|
+
sage: e = gp('ellinit([0,-1,1,-10,-20])')
|
|
1286
|
+
sage: e.attribute('j')
|
|
1287
|
+
-122023936/161051
|
|
1288
|
+
"""
|
|
1289
|
+
P = self._check_valid()
|
|
1290
|
+
return P('%s.%s' % (self.name(), attrname))
|
|
1291
|
+
|
|
1292
|
+
def __getitem__(self, n):
|
|
1293
|
+
P = self._check_valid()
|
|
1294
|
+
if not isinstance(n, tuple):
|
|
1295
|
+
return P.new('%s[%s]' % (self._name, n))
|
|
1296
|
+
else:
|
|
1297
|
+
return P.new('%s[%s]' % (self._name, str(n)[1:-1]))
|
|
1298
|
+
|
|
1299
|
+
def __int__(self):
|
|
1300
|
+
"""
|
|
1301
|
+
EXAMPLES::
|
|
1302
|
+
|
|
1303
|
+
sage: int(maxima('1'))
|
|
1304
|
+
1
|
|
1305
|
+
sage: type(_)
|
|
1306
|
+
<... 'int'>
|
|
1307
|
+
"""
|
|
1308
|
+
return int(repr(self))
|
|
1309
|
+
|
|
1310
|
+
def bool(self):
|
|
1311
|
+
"""
|
|
1312
|
+
Convert this element to a boolean.
|
|
1313
|
+
|
|
1314
|
+
EXAMPLES::
|
|
1315
|
+
|
|
1316
|
+
sage: singular(0).bool()
|
|
1317
|
+
False
|
|
1318
|
+
sage: singular(1).bool()
|
|
1319
|
+
True
|
|
1320
|
+
"""
|
|
1321
|
+
return bool(self)
|
|
1322
|
+
|
|
1323
|
+
def __bool__(self):
|
|
1324
|
+
"""
|
|
1325
|
+
Return whether this element is not ``False``.
|
|
1326
|
+
|
|
1327
|
+
.. NOTE::
|
|
1328
|
+
|
|
1329
|
+
This method needs to be overridden if the subprocess would
|
|
1330
|
+
not return a string representation of a boolean value unless
|
|
1331
|
+
an explicit print command is used.
|
|
1332
|
+
|
|
1333
|
+
EXAMPLES::
|
|
1334
|
+
|
|
1335
|
+
sage: bool(maxima(0))
|
|
1336
|
+
False
|
|
1337
|
+
sage: bool(maxima(1))
|
|
1338
|
+
True
|
|
1339
|
+
|
|
1340
|
+
TESTS:
|
|
1341
|
+
|
|
1342
|
+
By default this returns ``True`` for elements that are considered to be
|
|
1343
|
+
not ``False`` by the interface (:issue:`28705`)::
|
|
1344
|
+
|
|
1345
|
+
sage: bool(giac('"a"')) # needs giac
|
|
1346
|
+
True
|
|
1347
|
+
"""
|
|
1348
|
+
P = self._check_valid()
|
|
1349
|
+
cmd = '%s %s %s' % (self._name, P._equality_symbol(),
|
|
1350
|
+
P._false_symbol())
|
|
1351
|
+
return P.eval(cmd) != P._true_symbol()
|
|
1352
|
+
|
|
1353
|
+
def __float__(self):
|
|
1354
|
+
"""
|
|
1355
|
+
EXAMPLES::
|
|
1356
|
+
|
|
1357
|
+
sage: m = maxima('1/2')
|
|
1358
|
+
sage: m.__float__()
|
|
1359
|
+
0.5
|
|
1360
|
+
sage: float(m)
|
|
1361
|
+
0.5
|
|
1362
|
+
"""
|
|
1363
|
+
return float(repr(self))
|
|
1364
|
+
|
|
1365
|
+
def _integer_(self, ZZ=None):
|
|
1366
|
+
"""
|
|
1367
|
+
EXAMPLES::
|
|
1368
|
+
|
|
1369
|
+
sage: m = maxima('1')
|
|
1370
|
+
sage: m._integer_()
|
|
1371
|
+
1
|
|
1372
|
+
sage: _.parent()
|
|
1373
|
+
Integer Ring
|
|
1374
|
+
sage: QQ(m)
|
|
1375
|
+
1
|
|
1376
|
+
"""
|
|
1377
|
+
from sage.rings.integer import Integer
|
|
1378
|
+
return Integer(repr(self))
|
|
1379
|
+
|
|
1380
|
+
def _rational_(self):
|
|
1381
|
+
"""
|
|
1382
|
+
EXAMPLES::
|
|
1383
|
+
|
|
1384
|
+
sage: m = maxima('1/2')
|
|
1385
|
+
sage: m._rational_()
|
|
1386
|
+
1/2
|
|
1387
|
+
sage: _.parent()
|
|
1388
|
+
Rational Field
|
|
1389
|
+
sage: QQ(m)
|
|
1390
|
+
1/2
|
|
1391
|
+
"""
|
|
1392
|
+
from sage.rings.rational import Rational
|
|
1393
|
+
return Rational(repr(self))
|
|
1394
|
+
|
|
1395
|
+
def name(self, new_name=None):
|
|
1396
|
+
"""
|
|
1397
|
+
Return the name of ``self``. If ``new_name`` is passed in, then this
|
|
1398
|
+
function returns a new object identical to ``self`` whose name is
|
|
1399
|
+
``new_name``.
|
|
1400
|
+
|
|
1401
|
+
Note that this can overwrite existing variables in the system.
|
|
1402
|
+
|
|
1403
|
+
EXAMPLES::
|
|
1404
|
+
|
|
1405
|
+
sage: # optional - rpy2
|
|
1406
|
+
sage: x = r([1,2,3]); x
|
|
1407
|
+
[1] 1 2 3
|
|
1408
|
+
sage: x.name()
|
|
1409
|
+
'sage...'
|
|
1410
|
+
sage: x = r([1,2,3]).name('x'); x
|
|
1411
|
+
[1] 1 2 3
|
|
1412
|
+
sage: x.name()
|
|
1413
|
+
'x'
|
|
1414
|
+
|
|
1415
|
+
::
|
|
1416
|
+
|
|
1417
|
+
sage: s5 = gap.SymmetricGroup(5).name('s5')
|
|
1418
|
+
sage: s5
|
|
1419
|
+
SymmetricGroup( [ 1 .. 5 ] )
|
|
1420
|
+
sage: s5.name()
|
|
1421
|
+
's5'
|
|
1422
|
+
"""
|
|
1423
|
+
if new_name is not None:
|
|
1424
|
+
if not isinstance(new_name, str):
|
|
1425
|
+
raise TypeError("new_name must be a string")
|
|
1426
|
+
p = self.parent()
|
|
1427
|
+
p.set(new_name, self._name)
|
|
1428
|
+
return p._object_class()(p, new_name, is_name=True)
|
|
1429
|
+
|
|
1430
|
+
return self._name
|
|
1431
|
+
|
|
1432
|
+
def gen(self, n):
|
|
1433
|
+
P = self._check_valid()
|
|
1434
|
+
return P.new('%s.%s' % (self._name, int(n)))
|
|
1435
|
+
|
|
1436
|
+
def _operation(self, operation, other=None):
|
|
1437
|
+
r"""
|
|
1438
|
+
Return the result of applying the binary operation
|
|
1439
|
+
``operation`` on the arguments ``self`` and ``other``, or the
|
|
1440
|
+
unary operation on ``self`` if ``other`` is not given.
|
|
1441
|
+
|
|
1442
|
+
This is a utility function which factors out much of the
|
|
1443
|
+
commonality used in the arithmetic operations for interface
|
|
1444
|
+
elements.
|
|
1445
|
+
|
|
1446
|
+
INPUT:
|
|
1447
|
+
|
|
1448
|
+
- ``operation`` -- string representing the operation
|
|
1449
|
+
being performed; for example, '*', or '1/'
|
|
1450
|
+
|
|
1451
|
+
- ``other`` -- the other operand; if ``other`` is ``None``,
|
|
1452
|
+
then the operation is assumed to be unary rather than binary
|
|
1453
|
+
|
|
1454
|
+
OUTPUT: an interface element
|
|
1455
|
+
|
|
1456
|
+
EXAMPLES::
|
|
1457
|
+
|
|
1458
|
+
sage: a = gp('23')
|
|
1459
|
+
sage: b = gp('5')
|
|
1460
|
+
sage: a._operation('%', b)
|
|
1461
|
+
3
|
|
1462
|
+
sage: a._operation('19+')
|
|
1463
|
+
42
|
|
1464
|
+
sage: a._operation('!@#$%')
|
|
1465
|
+
Traceback (most recent call last):
|
|
1466
|
+
...
|
|
1467
|
+
TypeError: Error executing code in GP:...
|
|
1468
|
+
"""
|
|
1469
|
+
P = self._check_valid()
|
|
1470
|
+
if other is None:
|
|
1471
|
+
cmd = '%s %s' % (operation, self._name)
|
|
1472
|
+
else:
|
|
1473
|
+
cmd = '%s %s %s' % (self._name, operation, other._name)
|
|
1474
|
+
try:
|
|
1475
|
+
return P.new(cmd)
|
|
1476
|
+
except Exception as msg:
|
|
1477
|
+
raise TypeError(msg)
|
|
1478
|
+
|
|
1479
|
+
def _add_(self, right):
|
|
1480
|
+
"""
|
|
1481
|
+
EXAMPLES::
|
|
1482
|
+
|
|
1483
|
+
sage: f = maxima.cos(x)
|
|
1484
|
+
sage: g = maxima.sin(x)
|
|
1485
|
+
sage: f + g
|
|
1486
|
+
sin(_SAGE_VAR_x)+cos(_SAGE_VAR_x)
|
|
1487
|
+
sage: f + 2
|
|
1488
|
+
cos(_SAGE_VAR_x)+2
|
|
1489
|
+
sage: 2 + f
|
|
1490
|
+
cos(_SAGE_VAR_x)+2
|
|
1491
|
+
|
|
1492
|
+
::
|
|
1493
|
+
|
|
1494
|
+
sage: x,y = var('x,y')
|
|
1495
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1496
|
+
sage: g = maxima.function('x','-cos(x)')
|
|
1497
|
+
sage: f+g
|
|
1498
|
+
sin(x)-cos(x)
|
|
1499
|
+
sage: f+3
|
|
1500
|
+
sin(x)+3
|
|
1501
|
+
|
|
1502
|
+
The Maxima variable ``x`` is different from the Sage symbolic variable::
|
|
1503
|
+
|
|
1504
|
+
sage: (f+maxima.cos(x))
|
|
1505
|
+
sin(x)+cos(_SAGE_VAR_x)
|
|
1506
|
+
sage: (f+maxima.cos(y))
|
|
1507
|
+
sin(x)+cos(_SAGE_VAR_y)
|
|
1508
|
+
|
|
1509
|
+
Note that you may get unexpected results when calling symbolic expressions
|
|
1510
|
+
and not explicitly giving the variables::
|
|
1511
|
+
|
|
1512
|
+
sage: (f+maxima.cos(x))(2)
|
|
1513
|
+
cos(_SAGE_VAR_x)+sin(2)
|
|
1514
|
+
sage: (f+maxima.cos(y))(2)
|
|
1515
|
+
cos(_SAGE_VAR_y)+sin(2)
|
|
1516
|
+
"""
|
|
1517
|
+
return self._operation("+", right)
|
|
1518
|
+
|
|
1519
|
+
def _sub_(self, right):
|
|
1520
|
+
"""
|
|
1521
|
+
EXAMPLES::
|
|
1522
|
+
|
|
1523
|
+
sage: f = maxima.cos(x)
|
|
1524
|
+
sage: g = maxima.sin(x)
|
|
1525
|
+
sage: f - g
|
|
1526
|
+
cos(_SAGE_VAR_x)-sin(_SAGE_VAR_x)
|
|
1527
|
+
sage: f - 2
|
|
1528
|
+
cos(_SAGE_VAR_x)-2
|
|
1529
|
+
sage: 2 - f
|
|
1530
|
+
2-cos(_SAGE_VAR_x)
|
|
1531
|
+
|
|
1532
|
+
::
|
|
1533
|
+
|
|
1534
|
+
sage: x,y = var('x,y')
|
|
1535
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1536
|
+
|
|
1537
|
+
The Maxima variable ``x`` is different from the Sage symbolic variable::
|
|
1538
|
+
|
|
1539
|
+
sage: (f-maxima.cos(x))
|
|
1540
|
+
sin(x)-cos(_SAGE_VAR_x)
|
|
1541
|
+
sage: (f-maxima.cos(y))
|
|
1542
|
+
sin(x)-cos(_SAGE_VAR_y)
|
|
1543
|
+
|
|
1544
|
+
Note that you may get unexpected results when calling symbolic expressions
|
|
1545
|
+
and not explicitly giving the variables::
|
|
1546
|
+
|
|
1547
|
+
sage: (f-maxima.cos(x))(2)
|
|
1548
|
+
sin(2)-cos(_SAGE_VAR_x)
|
|
1549
|
+
sage: (f-maxima.cos(y))(2)
|
|
1550
|
+
sin(2)-cos(_SAGE_VAR_y)
|
|
1551
|
+
"""
|
|
1552
|
+
return self._operation('-', right)
|
|
1553
|
+
|
|
1554
|
+
def _neg_(self):
|
|
1555
|
+
"""
|
|
1556
|
+
EXAMPLES::
|
|
1557
|
+
|
|
1558
|
+
sage: f = maxima('sin(x)')
|
|
1559
|
+
sage: -f
|
|
1560
|
+
-sin(x)
|
|
1561
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1562
|
+
sage: -f
|
|
1563
|
+
-sin(x)
|
|
1564
|
+
"""
|
|
1565
|
+
return self._operation('-')
|
|
1566
|
+
|
|
1567
|
+
def _mul_(self, right):
|
|
1568
|
+
"""
|
|
1569
|
+
EXAMPLES::
|
|
1570
|
+
|
|
1571
|
+
sage: f = maxima.cos(x)
|
|
1572
|
+
sage: g = maxima.sin(x)
|
|
1573
|
+
sage: f*g
|
|
1574
|
+
cos(_SAGE_VAR_x)*sin(_SAGE_VAR_x)
|
|
1575
|
+
sage: 2*f
|
|
1576
|
+
2*cos(_SAGE_VAR_x)
|
|
1577
|
+
|
|
1578
|
+
::
|
|
1579
|
+
|
|
1580
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1581
|
+
sage: g = maxima('cos(x)') # not a function!
|
|
1582
|
+
sage: f*g
|
|
1583
|
+
cos(x)*sin(x)
|
|
1584
|
+
sage: _(2)
|
|
1585
|
+
cos(2)*sin(2)
|
|
1586
|
+
|
|
1587
|
+
::
|
|
1588
|
+
|
|
1589
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1590
|
+
sage: g = maxima('cos(x)')
|
|
1591
|
+
sage: g*f
|
|
1592
|
+
cos(x)*sin(x)
|
|
1593
|
+
sage: _(2)
|
|
1594
|
+
cos(2)*sin(2)
|
|
1595
|
+
sage: 2*f
|
|
1596
|
+
2*sin(x)
|
|
1597
|
+
"""
|
|
1598
|
+
return self._operation('*', right)
|
|
1599
|
+
|
|
1600
|
+
def _div_(self, right):
|
|
1601
|
+
"""
|
|
1602
|
+
EXAMPLES::
|
|
1603
|
+
|
|
1604
|
+
sage: f = maxima.cos(x)
|
|
1605
|
+
sage: g = maxima.sin(x)
|
|
1606
|
+
sage: f/g
|
|
1607
|
+
cos(_SAGE_VAR_x)/sin(_SAGE_VAR_x)
|
|
1608
|
+
sage: f/2
|
|
1609
|
+
cos(_SAGE_VAR_x)/2
|
|
1610
|
+
|
|
1611
|
+
::
|
|
1612
|
+
|
|
1613
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1614
|
+
sage: g = maxima('cos(x)')
|
|
1615
|
+
sage: f/g
|
|
1616
|
+
sin(x)/cos(x)
|
|
1617
|
+
sage: _(2)
|
|
1618
|
+
sin(2)/cos(2)
|
|
1619
|
+
|
|
1620
|
+
::
|
|
1621
|
+
|
|
1622
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1623
|
+
sage: g = maxima('cos(x)')
|
|
1624
|
+
sage: g/f
|
|
1625
|
+
cos(x)/sin(x)
|
|
1626
|
+
sage: _(2)
|
|
1627
|
+
cos(2)/sin(2)
|
|
1628
|
+
sage: 2/f
|
|
1629
|
+
2/sin(x)
|
|
1630
|
+
"""
|
|
1631
|
+
return self._operation("/", right)
|
|
1632
|
+
|
|
1633
|
+
def __invert__(self):
|
|
1634
|
+
"""
|
|
1635
|
+
EXAMPLES::
|
|
1636
|
+
|
|
1637
|
+
sage: f = maxima('sin(x)')
|
|
1638
|
+
sage: ~f
|
|
1639
|
+
1/sin(x)
|
|
1640
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1641
|
+
sage: ~f
|
|
1642
|
+
1/sin(x)
|
|
1643
|
+
"""
|
|
1644
|
+
return self._operation('1/')
|
|
1645
|
+
|
|
1646
|
+
def _mod_(self, right):
|
|
1647
|
+
"""
|
|
1648
|
+
EXAMPLES::
|
|
1649
|
+
|
|
1650
|
+
sage: f = gp("x^3 + x")
|
|
1651
|
+
sage: g = gp("2*x + 1")
|
|
1652
|
+
sage: f % g
|
|
1653
|
+
-5/8
|
|
1654
|
+
"""
|
|
1655
|
+
return self._operation("%", right)
|
|
1656
|
+
|
|
1657
|
+
def __pow__(self, n):
|
|
1658
|
+
"""
|
|
1659
|
+
EXAMPLES::
|
|
1660
|
+
|
|
1661
|
+
sage: a = maxima('2')
|
|
1662
|
+
sage: a^(3/4)
|
|
1663
|
+
2^(3/4)
|
|
1664
|
+
|
|
1665
|
+
::
|
|
1666
|
+
|
|
1667
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1668
|
+
sage: g = maxima('-cos(x)')
|
|
1669
|
+
sage: f^g
|
|
1670
|
+
1/sin(x)^cos(x)
|
|
1671
|
+
|
|
1672
|
+
::
|
|
1673
|
+
|
|
1674
|
+
sage: f = maxima.function('x','sin(x)')
|
|
1675
|
+
sage: g = maxima('-cos(x)') # not a function
|
|
1676
|
+
sage: g^f
|
|
1677
|
+
(-cos(x))^sin(x)
|
|
1678
|
+
"""
|
|
1679
|
+
P = self._check_valid()
|
|
1680
|
+
if parent(n) is not P:
|
|
1681
|
+
n = P(n)
|
|
1682
|
+
return self._operation("^", n)
|