passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. passagemath_categories-10.6.32.dist-info/METADATA +156 -0
  2. passagemath_categories-10.6.32.dist-info/RECORD +719 -0
  3. passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
  4. passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
  5. passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
  6. passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
  7. passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  8. sage/all__sagemath_categories.py +28 -0
  9. sage/arith/all.py +38 -0
  10. sage/arith/constants.pxd +27 -0
  11. sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
  12. sage/arith/functions.pxd +4 -0
  13. sage/arith/functions.pyx +221 -0
  14. sage/arith/misc.py +6552 -0
  15. sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
  16. sage/arith/multi_modular.pxd +39 -0
  17. sage/arith/multi_modular.pyx +994 -0
  18. sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
  19. sage/arith/rational_reconstruction.pxd +4 -0
  20. sage/arith/rational_reconstruction.pyx +115 -0
  21. sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
  22. sage/arith/srange.pyx +571 -0
  23. sage/calculus/all__sagemath_categories.py +2 -0
  24. sage/calculus/functional.py +481 -0
  25. sage/calculus/functions.py +151 -0
  26. sage/categories/additive_groups.py +73 -0
  27. sage/categories/additive_magmas.py +1044 -0
  28. sage/categories/additive_monoids.py +114 -0
  29. sage/categories/additive_semigroups.py +184 -0
  30. sage/categories/affine_weyl_groups.py +238 -0
  31. sage/categories/algebra_ideals.py +95 -0
  32. sage/categories/algebra_modules.py +96 -0
  33. sage/categories/algebras.py +349 -0
  34. sage/categories/algebras_with_basis.py +377 -0
  35. sage/categories/all.py +160 -0
  36. sage/categories/aperiodic_semigroups.py +29 -0
  37. sage/categories/associative_algebras.py +47 -0
  38. sage/categories/bialgebras.py +101 -0
  39. sage/categories/bialgebras_with_basis.py +414 -0
  40. sage/categories/bimodules.py +206 -0
  41. sage/categories/chain_complexes.py +268 -0
  42. sage/categories/classical_crystals.py +480 -0
  43. sage/categories/coalgebras.py +405 -0
  44. sage/categories/coalgebras_with_basis.py +232 -0
  45. sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
  46. sage/categories/coercion_methods.pyx +52 -0
  47. sage/categories/commutative_additive_groups.py +104 -0
  48. sage/categories/commutative_additive_monoids.py +45 -0
  49. sage/categories/commutative_additive_semigroups.py +48 -0
  50. sage/categories/commutative_algebra_ideals.py +87 -0
  51. sage/categories/commutative_algebras.py +94 -0
  52. sage/categories/commutative_ring_ideals.py +58 -0
  53. sage/categories/commutative_rings.py +736 -0
  54. sage/categories/complete_discrete_valuation.py +293 -0
  55. sage/categories/complex_reflection_groups.py +145 -0
  56. sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
  57. sage/categories/coxeter_group_algebras.py +186 -0
  58. sage/categories/coxeter_groups.py +3402 -0
  59. sage/categories/crystals.py +2628 -0
  60. sage/categories/cw_complexes.py +216 -0
  61. sage/categories/dedekind_domains.py +137 -0
  62. sage/categories/discrete_valuation.py +325 -0
  63. sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
  64. sage/categories/division_rings.py +114 -0
  65. sage/categories/domains.py +95 -0
  66. sage/categories/drinfeld_modules.py +789 -0
  67. sage/categories/dual.py +42 -0
  68. sage/categories/enumerated_sets.py +1146 -0
  69. sage/categories/euclidean_domains.py +271 -0
  70. sage/categories/examples/algebras_with_basis.py +102 -0
  71. sage/categories/examples/all.py +1 -0
  72. sage/categories/examples/commutative_additive_monoids.py +130 -0
  73. sage/categories/examples/commutative_additive_semigroups.py +199 -0
  74. sage/categories/examples/coxeter_groups.py +8 -0
  75. sage/categories/examples/crystals.py +236 -0
  76. sage/categories/examples/cw_complexes.py +163 -0
  77. sage/categories/examples/facade_sets.py +187 -0
  78. sage/categories/examples/filtered_algebras_with_basis.py +204 -0
  79. sage/categories/examples/filtered_modules_with_basis.py +154 -0
  80. sage/categories/examples/finite_coxeter_groups.py +252 -0
  81. sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
  82. sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
  83. sage/categories/examples/finite_enumerated_sets.py +208 -0
  84. sage/categories/examples/finite_monoids.py +150 -0
  85. sage/categories/examples/finite_semigroups.py +190 -0
  86. sage/categories/examples/finite_weyl_groups.py +191 -0
  87. sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
  88. sage/categories/examples/graded_modules_with_basis.py +168 -0
  89. sage/categories/examples/graphs.py +122 -0
  90. sage/categories/examples/hopf_algebras_with_basis.py +145 -0
  91. sage/categories/examples/infinite_enumerated_sets.py +190 -0
  92. sage/categories/examples/lie_algebras.py +352 -0
  93. sage/categories/examples/lie_algebras_with_basis.py +196 -0
  94. sage/categories/examples/magmas.py +162 -0
  95. sage/categories/examples/manifolds.py +94 -0
  96. sage/categories/examples/monoids.py +144 -0
  97. sage/categories/examples/posets.py +178 -0
  98. sage/categories/examples/semigroups.py +580 -0
  99. sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  100. sage/categories/examples/semigroups_cython.pyx +221 -0
  101. sage/categories/examples/semirings.py +249 -0
  102. sage/categories/examples/sets_cat.py +706 -0
  103. sage/categories/examples/sets_with_grading.py +101 -0
  104. sage/categories/examples/with_realizations.py +542 -0
  105. sage/categories/fields.py +991 -0
  106. sage/categories/filtered_algebras.py +63 -0
  107. sage/categories/filtered_algebras_with_basis.py +548 -0
  108. sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
  109. sage/categories/filtered_modules.py +210 -0
  110. sage/categories/filtered_modules_with_basis.py +1209 -0
  111. sage/categories/finite_complex_reflection_groups.py +1506 -0
  112. sage/categories/finite_coxeter_groups.py +1138 -0
  113. sage/categories/finite_crystals.py +103 -0
  114. sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
  115. sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
  116. sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
  117. sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
  118. sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
  119. sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
  120. sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
  121. sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
  122. sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
  123. sage/categories/finite_enumerated_sets.py +769 -0
  124. sage/categories/finite_fields.py +252 -0
  125. sage/categories/finite_groups.py +256 -0
  126. sage/categories/finite_lattice_posets.py +242 -0
  127. sage/categories/finite_monoids.py +316 -0
  128. sage/categories/finite_permutation_groups.py +339 -0
  129. sage/categories/finite_posets.py +1994 -0
  130. sage/categories/finite_semigroups.py +136 -0
  131. sage/categories/finite_sets.py +93 -0
  132. sage/categories/finite_weyl_groups.py +39 -0
  133. sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
  134. sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
  135. sage/categories/finitely_generated_magmas.py +57 -0
  136. sage/categories/finitely_generated_semigroups.py +214 -0
  137. sage/categories/function_fields.py +76 -0
  138. sage/categories/g_sets.py +77 -0
  139. sage/categories/gcd_domains.py +65 -0
  140. sage/categories/generalized_coxeter_groups.py +94 -0
  141. sage/categories/graded_algebras.py +85 -0
  142. sage/categories/graded_algebras_with_basis.py +258 -0
  143. sage/categories/graded_bialgebras.py +32 -0
  144. sage/categories/graded_bialgebras_with_basis.py +32 -0
  145. sage/categories/graded_coalgebras.py +65 -0
  146. sage/categories/graded_coalgebras_with_basis.py +51 -0
  147. sage/categories/graded_hopf_algebras.py +41 -0
  148. sage/categories/graded_hopf_algebras_with_basis.py +169 -0
  149. sage/categories/graded_lie_algebras.py +91 -0
  150. sage/categories/graded_lie_algebras_with_basis.py +44 -0
  151. sage/categories/graded_lie_conformal_algebras.py +74 -0
  152. sage/categories/graded_modules.py +133 -0
  153. sage/categories/graded_modules_with_basis.py +329 -0
  154. sage/categories/graphs.py +138 -0
  155. sage/categories/group_algebras.py +430 -0
  156. sage/categories/groupoid.py +94 -0
  157. sage/categories/groups.py +667 -0
  158. sage/categories/h_trivial_semigroups.py +64 -0
  159. sage/categories/hecke_modules.py +185 -0
  160. sage/categories/highest_weight_crystals.py +980 -0
  161. sage/categories/hopf_algebras.py +219 -0
  162. sage/categories/hopf_algebras_with_basis.py +309 -0
  163. sage/categories/infinite_enumerated_sets.py +115 -0
  164. sage/categories/integral_domains.py +203 -0
  165. sage/categories/j_trivial_semigroups.py +29 -0
  166. sage/categories/kac_moody_algebras.py +82 -0
  167. sage/categories/kahler_algebras.py +203 -0
  168. sage/categories/l_trivial_semigroups.py +63 -0
  169. sage/categories/lambda_bracket_algebras.py +280 -0
  170. sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
  171. sage/categories/lattice_posets.py +89 -0
  172. sage/categories/left_modules.py +49 -0
  173. sage/categories/lie_algebras.py +1070 -0
  174. sage/categories/lie_algebras_with_basis.py +261 -0
  175. sage/categories/lie_conformal_algebras.py +350 -0
  176. sage/categories/lie_conformal_algebras_with_basis.py +147 -0
  177. sage/categories/lie_groups.py +73 -0
  178. sage/categories/loop_crystals.py +1290 -0
  179. sage/categories/magmas.py +1189 -0
  180. sage/categories/magmas_and_additive_magmas.py +149 -0
  181. sage/categories/magmatic_algebras.py +365 -0
  182. sage/categories/manifolds.py +352 -0
  183. sage/categories/matrix_algebras.py +40 -0
  184. sage/categories/metric_spaces.py +387 -0
  185. sage/categories/modular_abelian_varieties.py +78 -0
  186. sage/categories/modules.py +989 -0
  187. sage/categories/modules_with_basis.py +2794 -0
  188. sage/categories/monoid_algebras.py +38 -0
  189. sage/categories/monoids.py +739 -0
  190. sage/categories/noetherian_rings.py +87 -0
  191. sage/categories/number_fields.py +242 -0
  192. sage/categories/ore_modules.py +189 -0
  193. sage/categories/partially_ordered_monoids.py +49 -0
  194. sage/categories/permutation_groups.py +63 -0
  195. sage/categories/pointed_sets.py +42 -0
  196. sage/categories/polyhedra.py +74 -0
  197. sage/categories/poor_man_map.py +270 -0
  198. sage/categories/posets.py +722 -0
  199. sage/categories/principal_ideal_domains.py +270 -0
  200. sage/categories/quantum_group_representations.py +543 -0
  201. sage/categories/quotient_fields.py +728 -0
  202. sage/categories/r_trivial_semigroups.py +45 -0
  203. sage/categories/regular_crystals.py +898 -0
  204. sage/categories/regular_supercrystals.py +170 -0
  205. sage/categories/right_modules.py +49 -0
  206. sage/categories/ring_ideals.py +74 -0
  207. sage/categories/rings.py +1904 -0
  208. sage/categories/rngs.py +175 -0
  209. sage/categories/schemes.py +393 -0
  210. sage/categories/semigroups.py +1060 -0
  211. sage/categories/semirings.py +71 -0
  212. sage/categories/semisimple_algebras.py +114 -0
  213. sage/categories/sets_with_grading.py +235 -0
  214. sage/categories/shephard_groups.py +43 -0
  215. sage/categories/signed_tensor.py +120 -0
  216. sage/categories/simplicial_complexes.py +134 -0
  217. sage/categories/simplicial_sets.py +1206 -0
  218. sage/categories/super_algebras.py +149 -0
  219. sage/categories/super_algebras_with_basis.py +144 -0
  220. sage/categories/super_hopf_algebras_with_basis.py +126 -0
  221. sage/categories/super_lie_conformal_algebras.py +193 -0
  222. sage/categories/super_modules.py +229 -0
  223. sage/categories/super_modules_with_basis.py +193 -0
  224. sage/categories/supercommutative_algebras.py +99 -0
  225. sage/categories/supercrystals.py +406 -0
  226. sage/categories/tensor.py +110 -0
  227. sage/categories/topological_spaces.py +170 -0
  228. sage/categories/triangular_kac_moody_algebras.py +439 -0
  229. sage/categories/tutorial.py +58 -0
  230. sage/categories/unique_factorization_domains.py +318 -0
  231. sage/categories/unital_algebras.py +426 -0
  232. sage/categories/vector_bundles.py +159 -0
  233. sage/categories/vector_spaces.py +357 -0
  234. sage/categories/weyl_groups.py +853 -0
  235. sage/combinat/all__sagemath_categories.py +34 -0
  236. sage/combinat/backtrack.py +180 -0
  237. sage/combinat/combinat.py +2269 -0
  238. sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  239. sage/combinat/combinat_cython.pxd +6 -0
  240. sage/combinat/combinat_cython.pyx +390 -0
  241. sage/combinat/combination.py +796 -0
  242. sage/combinat/combinatorial_map.py +416 -0
  243. sage/combinat/composition.py +2192 -0
  244. sage/combinat/dlx.py +510 -0
  245. sage/combinat/integer_lists/__init__.py +7 -0
  246. sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
  247. sage/combinat/integer_lists/base.pxd +16 -0
  248. sage/combinat/integer_lists/base.pyx +713 -0
  249. sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
  250. sage/combinat/integer_lists/invlex.pxd +4 -0
  251. sage/combinat/integer_lists/invlex.pyx +1650 -0
  252. sage/combinat/integer_lists/lists.py +328 -0
  253. sage/combinat/integer_lists/nn.py +48 -0
  254. sage/combinat/integer_vector.py +1818 -0
  255. sage/combinat/integer_vector_weighted.py +413 -0
  256. sage/combinat/matrices/all__sagemath_categories.py +5 -0
  257. sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
  258. sage/combinat/matrices/dancing_links.pyx +1159 -0
  259. sage/combinat/matrices/dancing_links_c.h +380 -0
  260. sage/combinat/matrices/dlxcpp.py +136 -0
  261. sage/combinat/partition.py +10070 -0
  262. sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
  263. sage/combinat/partitions.pyx +743 -0
  264. sage/combinat/permutation.py +10168 -0
  265. sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
  266. sage/combinat/permutation_cython.pxd +11 -0
  267. sage/combinat/permutation_cython.pyx +407 -0
  268. sage/combinat/q_analogues.py +1090 -0
  269. sage/combinat/ranker.py +268 -0
  270. sage/combinat/subset.py +1561 -0
  271. sage/combinat/subsets_hereditary.py +202 -0
  272. sage/combinat/subsets_pairwise.py +184 -0
  273. sage/combinat/tools.py +63 -0
  274. sage/combinat/tuple.py +348 -0
  275. sage/data_structures/all.py +2 -0
  276. sage/data_structures/all__sagemath_categories.py +2 -0
  277. sage/data_structures/binary_matrix.pxd +138 -0
  278. sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
  279. sage/data_structures/binary_search.pxd +3 -0
  280. sage/data_structures/binary_search.pyx +66 -0
  281. sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
  282. sage/data_structures/bitset.pxd +40 -0
  283. sage/data_structures/bitset.pyx +2385 -0
  284. sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
  285. sage/data_structures/bitset_base.pxd +926 -0
  286. sage/data_structures/bitset_base.pyx +117 -0
  287. sage/data_structures/bitset_intrinsics.h +487 -0
  288. sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  289. sage/data_structures/blas_dict.pxd +12 -0
  290. sage/data_structures/blas_dict.pyx +469 -0
  291. sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
  292. sage/data_structures/list_of_pairs.pxd +16 -0
  293. sage/data_structures/list_of_pairs.pyx +122 -0
  294. sage/data_structures/mutable_poset.py +3312 -0
  295. sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
  296. sage/data_structures/pairing_heap.h +346 -0
  297. sage/data_structures/pairing_heap.pxd +88 -0
  298. sage/data_structures/pairing_heap.pyx +1464 -0
  299. sage/data_structures/sparse_bitset.pxd +62 -0
  300. sage/data_structures/stream.py +5070 -0
  301. sage/databases/all__sagemath_categories.py +7 -0
  302. sage/databases/sql_db.py +2236 -0
  303. sage/ext/all__sagemath_categories.py +3 -0
  304. sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
  305. sage/ext/fast_callable.pxd +4 -0
  306. sage/ext/fast_callable.pyx +2746 -0
  307. sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
  308. sage/ext/fast_eval.pxd +1 -0
  309. sage/ext/fast_eval.pyx +102 -0
  310. sage/ext/interpreters/__init__.py +1 -0
  311. sage/ext/interpreters/all__sagemath_categories.py +2 -0
  312. sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
  313. sage/ext/interpreters/wrapper_el.pxd +18 -0
  314. sage/ext/interpreters/wrapper_el.pyx +148 -0
  315. sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
  316. sage/ext/interpreters/wrapper_py.pxd +17 -0
  317. sage/ext/interpreters/wrapper_py.pyx +133 -0
  318. sage/functions/airy.py +937 -0
  319. sage/functions/all.py +97 -0
  320. sage/functions/bessel.py +2102 -0
  321. sage/functions/error.py +784 -0
  322. sage/functions/exp_integral.py +1529 -0
  323. sage/functions/gamma.py +1087 -0
  324. sage/functions/generalized.py +672 -0
  325. sage/functions/hyperbolic.py +747 -0
  326. sage/functions/hypergeometric.py +1156 -0
  327. sage/functions/jacobi.py +1705 -0
  328. sage/functions/log.py +1402 -0
  329. sage/functions/min_max.py +338 -0
  330. sage/functions/orthogonal_polys.py +3106 -0
  331. sage/functions/other.py +2303 -0
  332. sage/functions/piecewise.py +1505 -0
  333. sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
  334. sage/functions/prime_pi.pyx +262 -0
  335. sage/functions/special.py +1212 -0
  336. sage/functions/spike_function.py +278 -0
  337. sage/functions/transcendental.py +690 -0
  338. sage/functions/trig.py +1062 -0
  339. sage/functions/wigner.py +726 -0
  340. sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  341. sage/geometry/abc.pyx +82 -0
  342. sage/geometry/all__sagemath_categories.py +1 -0
  343. sage/groups/all__sagemath_categories.py +11 -0
  344. sage/groups/generic.py +1733 -0
  345. sage/groups/groups_catalog.py +113 -0
  346. sage/groups/perm_gps/all__sagemath_categories.py +1 -0
  347. sage/groups/perm_gps/partn_ref/all.py +1 -0
  348. sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
  349. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
  350. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
  351. sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
  352. sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
  353. sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
  354. sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
  355. sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
  356. sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
  357. sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
  358. sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
  359. sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
  360. sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
  361. sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
  362. sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
  363. sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
  364. sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
  365. sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
  366. sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
  367. sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
  368. sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
  369. sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
  370. sage/interfaces/abc.py +140 -0
  371. sage/interfaces/all.py +58 -0
  372. sage/interfaces/all__sagemath_categories.py +1 -0
  373. sage/interfaces/expect.py +1643 -0
  374. sage/interfaces/interface.py +1682 -0
  375. sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
  376. sage/interfaces/process.pxd +5 -0
  377. sage/interfaces/process.pyx +288 -0
  378. sage/interfaces/quit.py +167 -0
  379. sage/interfaces/sage0.py +604 -0
  380. sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
  381. sage/interfaces/sagespawn.pyx +308 -0
  382. sage/interfaces/tab_completion.py +101 -0
  383. sage/misc/all__sagemath_categories.py +78 -0
  384. sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
  385. sage/misc/allocator.pxd +6 -0
  386. sage/misc/allocator.pyx +47 -0
  387. sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
  388. sage/misc/binary_tree.pxd +29 -0
  389. sage/misc/binary_tree.pyx +537 -0
  390. sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
  391. sage/misc/callable_dict.pyx +89 -0
  392. sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
  393. sage/misc/citation.pyx +159 -0
  394. sage/misc/converting_dict.py +293 -0
  395. sage/misc/defaults.py +129 -0
  396. sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
  397. sage/misc/derivative.pyx +223 -0
  398. sage/misc/functional.py +2005 -0
  399. sage/misc/html.py +589 -0
  400. sage/misc/latex.py +2673 -0
  401. sage/misc/latex_macros.py +236 -0
  402. sage/misc/latex_standalone.py +1833 -0
  403. sage/misc/map_threaded.py +38 -0
  404. sage/misc/mathml.py +76 -0
  405. sage/misc/method_decorator.py +88 -0
  406. sage/misc/mrange.py +755 -0
  407. sage/misc/multireplace.py +41 -0
  408. sage/misc/object_multiplexer.py +92 -0
  409. sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
  410. sage/misc/parser.pyx +1107 -0
  411. sage/misc/random_testing.py +264 -0
  412. sage/misc/rest_index_of_methods.py +377 -0
  413. sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
  414. sage/misc/search.pxd +2 -0
  415. sage/misc/search.pyx +68 -0
  416. sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
  417. sage/misc/stopgap.pyx +95 -0
  418. sage/misc/table.py +853 -0
  419. sage/monoids/all__sagemath_categories.py +1 -0
  420. sage/monoids/indexed_free_monoid.py +1071 -0
  421. sage/monoids/monoid.py +82 -0
  422. sage/numerical/all__sagemath_categories.py +1 -0
  423. sage/numerical/backends/all__sagemath_categories.py +1 -0
  424. sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  425. sage/numerical/backends/generic_backend.pxd +61 -0
  426. sage/numerical/backends/generic_backend.pyx +1893 -0
  427. sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
  428. sage/numerical/backends/generic_sdp_backend.pxd +38 -0
  429. sage/numerical/backends/generic_sdp_backend.pyx +755 -0
  430. sage/parallel/all.py +6 -0
  431. sage/parallel/decorate.py +575 -0
  432. sage/parallel/map_reduce.py +1997 -0
  433. sage/parallel/multiprocessing_sage.py +76 -0
  434. sage/parallel/ncpus.py +35 -0
  435. sage/parallel/parallelism.py +364 -0
  436. sage/parallel/reference.py +47 -0
  437. sage/parallel/use_fork.py +333 -0
  438. sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
  439. sage/rings/abc.pxd +31 -0
  440. sage/rings/abc.pyx +526 -0
  441. sage/rings/algebraic_closure_finite_field.py +1154 -0
  442. sage/rings/all__sagemath_categories.py +91 -0
  443. sage/rings/big_oh.py +227 -0
  444. sage/rings/continued_fraction.py +2754 -0
  445. sage/rings/continued_fraction_gosper.py +220 -0
  446. sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
  447. sage/rings/factorint.pyx +295 -0
  448. sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
  449. sage/rings/fast_arith.pxd +21 -0
  450. sage/rings/fast_arith.pyx +535 -0
  451. sage/rings/finite_rings/all__sagemath_categories.py +9 -0
  452. sage/rings/finite_rings/conway_polynomials.py +542 -0
  453. sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  454. sage/rings/finite_rings/element_base.pxd +12 -0
  455. sage/rings/finite_rings/element_base.pyx +1176 -0
  456. sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  457. sage/rings/finite_rings/finite_field_base.pxd +7 -0
  458. sage/rings/finite_rings/finite_field_base.pyx +2171 -0
  459. sage/rings/finite_rings/finite_field_constructor.py +827 -0
  460. sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
  461. sage/rings/finite_rings/galois_group.py +154 -0
  462. sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  463. sage/rings/finite_rings/hom_finite_field.pxd +23 -0
  464. sage/rings/finite_rings/hom_finite_field.pyx +856 -0
  465. sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
  466. sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
  467. sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
  468. sage/rings/finite_rings/homset.py +357 -0
  469. sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
  470. sage/rings/finite_rings/integer_mod.pxd +56 -0
  471. sage/rings/finite_rings/integer_mod.pyx +4586 -0
  472. sage/rings/finite_rings/integer_mod_limits.h +11 -0
  473. sage/rings/finite_rings/integer_mod_ring.py +2044 -0
  474. sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
  475. sage/rings/finite_rings/residue_field.pxd +30 -0
  476. sage/rings/finite_rings/residue_field.pyx +1811 -0
  477. sage/rings/finite_rings/stdint.pxd +19 -0
  478. sage/rings/fraction_field.py +1452 -0
  479. sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
  480. sage/rings/fraction_field_element.pyx +1357 -0
  481. sage/rings/function_field/all.py +7 -0
  482. sage/rings/function_field/all__sagemath_categories.py +2 -0
  483. sage/rings/function_field/constructor.py +218 -0
  484. sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
  485. sage/rings/function_field/element.pxd +11 -0
  486. sage/rings/function_field/element.pyx +1008 -0
  487. sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
  488. sage/rings/function_field/element_rational.pyx +513 -0
  489. sage/rings/function_field/extensions.py +230 -0
  490. sage/rings/function_field/function_field.py +1468 -0
  491. sage/rings/function_field/function_field_rational.py +1005 -0
  492. sage/rings/function_field/ideal.py +1155 -0
  493. sage/rings/function_field/ideal_rational.py +629 -0
  494. sage/rings/function_field/jacobian_base.py +826 -0
  495. sage/rings/function_field/jacobian_hess.py +1053 -0
  496. sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
  497. sage/rings/function_field/maps.py +1039 -0
  498. sage/rings/function_field/order.py +281 -0
  499. sage/rings/function_field/order_basis.py +586 -0
  500. sage/rings/function_field/order_rational.py +576 -0
  501. sage/rings/function_field/place.py +426 -0
  502. sage/rings/function_field/place_rational.py +181 -0
  503. sage/rings/generic.py +320 -0
  504. sage/rings/homset.py +332 -0
  505. sage/rings/ideal.py +1885 -0
  506. sage/rings/ideal_monoid.py +215 -0
  507. sage/rings/infinity.py +1890 -0
  508. sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
  509. sage/rings/integer.pxd +45 -0
  510. sage/rings/integer.pyx +7874 -0
  511. sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
  512. sage/rings/integer_ring.pxd +8 -0
  513. sage/rings/integer_ring.pyx +1693 -0
  514. sage/rings/laurent_series_ring.py +931 -0
  515. sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  516. sage/rings/laurent_series_ring_element.pxd +11 -0
  517. sage/rings/laurent_series_ring_element.pyx +1927 -0
  518. sage/rings/lazy_series.py +7815 -0
  519. sage/rings/lazy_series_ring.py +4356 -0
  520. sage/rings/localization.py +1043 -0
  521. sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
  522. sage/rings/morphism.pxd +39 -0
  523. sage/rings/morphism.pyx +3299 -0
  524. sage/rings/multi_power_series_ring.py +1145 -0
  525. sage/rings/multi_power_series_ring_element.py +2184 -0
  526. sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
  527. sage/rings/noncommutative_ideals.pyx +423 -0
  528. sage/rings/number_field/all__sagemath_categories.py +1 -0
  529. sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
  530. sage/rings/number_field/number_field_base.pxd +8 -0
  531. sage/rings/number_field/number_field_base.pyx +507 -0
  532. sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
  533. sage/rings/number_field/number_field_element_base.pxd +6 -0
  534. sage/rings/number_field/number_field_element_base.pyx +36 -0
  535. sage/rings/number_field/number_field_ideal.py +3550 -0
  536. sage/rings/padics/all__sagemath_categories.py +4 -0
  537. sage/rings/padics/local_generic.py +1670 -0
  538. sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
  539. sage/rings/padics/local_generic_element.pxd +5 -0
  540. sage/rings/padics/local_generic_element.pyx +1017 -0
  541. sage/rings/padics/misc.py +256 -0
  542. sage/rings/padics/padic_generic.py +1911 -0
  543. sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
  544. sage/rings/padics/pow_computer.pxd +38 -0
  545. sage/rings/padics/pow_computer.pyx +671 -0
  546. sage/rings/padics/precision_error.py +24 -0
  547. sage/rings/polynomial/all__sagemath_categories.py +25 -0
  548. sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  549. sage/rings/polynomial/commutative_polynomial.pxd +6 -0
  550. sage/rings/polynomial/commutative_polynomial.pyx +24 -0
  551. sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
  552. sage/rings/polynomial/cyclotomic.pyx +404 -0
  553. sage/rings/polynomial/flatten.py +711 -0
  554. sage/rings/polynomial/ideal.py +102 -0
  555. sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
  556. sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
  557. sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  558. sage/rings/polynomial/laurent_polynomial.pxd +18 -0
  559. sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
  560. sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
  561. sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
  562. sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
  563. sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
  564. sage/rings/polynomial/multi_polynomial.pxd +12 -0
  565. sage/rings/polynomial/multi_polynomial.pyx +3082 -0
  566. sage/rings/polynomial/multi_polynomial_element.py +2570 -0
  567. sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
  568. sage/rings/polynomial/multi_polynomial_ring.py +947 -0
  569. sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
  570. sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
  571. sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
  572. sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
  573. sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
  574. sage/rings/polynomial/polydict.pxd +45 -0
  575. sage/rings/polynomial/polydict.pyx +2701 -0
  576. sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
  577. sage/rings/polynomial/polynomial_compiled.pxd +59 -0
  578. sage/rings/polynomial/polynomial_compiled.pyx +509 -0
  579. sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
  580. sage/rings/polynomial/polynomial_element.pxd +64 -0
  581. sage/rings/polynomial/polynomial_element.pyx +13255 -0
  582. sage/rings/polynomial/polynomial_element_generic.py +1637 -0
  583. sage/rings/polynomial/polynomial_fateman.py +97 -0
  584. sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
  585. sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
  586. sage/rings/polynomial/polynomial_ring.py +3784 -0
  587. sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
  588. sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
  589. sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
  590. sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
  591. sage/rings/polynomial/polynomial_singular_interface.py +549 -0
  592. sage/rings/polynomial/symmetric_ideal.py +989 -0
  593. sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
  594. sage/rings/polynomial/symmetric_reduction.pxd +8 -0
  595. sage/rings/polynomial/symmetric_reduction.pyx +669 -0
  596. sage/rings/polynomial/term_order.py +2279 -0
  597. sage/rings/polynomial/toy_buchberger.py +449 -0
  598. sage/rings/polynomial/toy_d_basis.py +387 -0
  599. sage/rings/polynomial/toy_variety.py +362 -0
  600. sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
  601. sage/rings/power_series_mpoly.pxd +9 -0
  602. sage/rings/power_series_mpoly.pyx +161 -0
  603. sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
  604. sage/rings/power_series_poly.pxd +10 -0
  605. sage/rings/power_series_poly.pyx +1317 -0
  606. sage/rings/power_series_ring.py +1441 -0
  607. sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  608. sage/rings/power_series_ring_element.pxd +12 -0
  609. sage/rings/power_series_ring_element.pyx +3028 -0
  610. sage/rings/puiseux_series_ring.py +487 -0
  611. sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
  612. sage/rings/puiseux_series_ring_element.pxd +7 -0
  613. sage/rings/puiseux_series_ring_element.pyx +1055 -0
  614. sage/rings/qqbar_decorators.py +167 -0
  615. sage/rings/quotient_ring.py +1598 -0
  616. sage/rings/quotient_ring_element.py +979 -0
  617. sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
  618. sage/rings/rational.pxd +20 -0
  619. sage/rings/rational.pyx +4284 -0
  620. sage/rings/rational_field.py +1730 -0
  621. sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
  622. sage/rings/real_double.pxd +16 -0
  623. sage/rings/real_double.pyx +2218 -0
  624. sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
  625. sage/rings/real_lazy.pxd +30 -0
  626. sage/rings/real_lazy.pyx +1773 -0
  627. sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
  628. sage/rings/ring.pxd +30 -0
  629. sage/rings/ring.pyx +850 -0
  630. sage/rings/semirings/all.py +3 -0
  631. sage/rings/semirings/non_negative_integer_semiring.py +107 -0
  632. sage/rings/semirings/tropical_mpolynomial.py +972 -0
  633. sage/rings/semirings/tropical_polynomial.py +997 -0
  634. sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
  635. sage/rings/semirings/tropical_semiring.pyx +676 -0
  636. sage/rings/semirings/tropical_variety.py +1701 -0
  637. sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
  638. sage/rings/sum_of_squares.pxd +3 -0
  639. sage/rings/sum_of_squares.pyx +336 -0
  640. sage/rings/tests.py +504 -0
  641. sage/schemes/affine/affine_homset.py +508 -0
  642. sage/schemes/affine/affine_morphism.py +1574 -0
  643. sage/schemes/affine/affine_point.py +460 -0
  644. sage/schemes/affine/affine_rational_point.py +308 -0
  645. sage/schemes/affine/affine_space.py +1264 -0
  646. sage/schemes/affine/affine_subscheme.py +592 -0
  647. sage/schemes/affine/all.py +25 -0
  648. sage/schemes/all__sagemath_categories.py +5 -0
  649. sage/schemes/generic/algebraic_scheme.py +2092 -0
  650. sage/schemes/generic/all.py +5 -0
  651. sage/schemes/generic/ambient_space.py +400 -0
  652. sage/schemes/generic/divisor.py +465 -0
  653. sage/schemes/generic/divisor_group.py +313 -0
  654. sage/schemes/generic/glue.py +84 -0
  655. sage/schemes/generic/homset.py +820 -0
  656. sage/schemes/generic/hypersurface.py +234 -0
  657. sage/schemes/generic/morphism.py +2107 -0
  658. sage/schemes/generic/point.py +237 -0
  659. sage/schemes/generic/scheme.py +1190 -0
  660. sage/schemes/generic/spec.py +199 -0
  661. sage/schemes/product_projective/all.py +6 -0
  662. sage/schemes/product_projective/homset.py +236 -0
  663. sage/schemes/product_projective/morphism.py +517 -0
  664. sage/schemes/product_projective/point.py +568 -0
  665. sage/schemes/product_projective/rational_point.py +550 -0
  666. sage/schemes/product_projective/space.py +1301 -0
  667. sage/schemes/product_projective/subscheme.py +466 -0
  668. sage/schemes/projective/all.py +24 -0
  669. sage/schemes/projective/proj_bdd_height.py +453 -0
  670. sage/schemes/projective/projective_homset.py +718 -0
  671. sage/schemes/projective/projective_morphism.py +2792 -0
  672. sage/schemes/projective/projective_point.py +1484 -0
  673. sage/schemes/projective/projective_rational_point.py +569 -0
  674. sage/schemes/projective/projective_space.py +2571 -0
  675. sage/schemes/projective/projective_subscheme.py +1574 -0
  676. sage/sets/all.py +17 -0
  677. sage/sets/cartesian_product.py +376 -0
  678. sage/sets/condition_set.py +525 -0
  679. sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
  680. sage/sets/disjoint_set.pxd +36 -0
  681. sage/sets/disjoint_set.pyx +998 -0
  682. sage/sets/disjoint_union_enumerated_sets.py +625 -0
  683. sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
  684. sage/sets/family.pxd +12 -0
  685. sage/sets/family.pyx +1556 -0
  686. sage/sets/finite_enumerated_set.py +406 -0
  687. sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
  688. sage/sets/finite_set_map_cy.pxd +34 -0
  689. sage/sets/finite_set_map_cy.pyx +708 -0
  690. sage/sets/finite_set_maps.py +591 -0
  691. sage/sets/image_set.py +448 -0
  692. sage/sets/integer_range.py +829 -0
  693. sage/sets/non_negative_integers.py +241 -0
  694. sage/sets/positive_integers.py +93 -0
  695. sage/sets/primes.py +188 -0
  696. sage/sets/real_set.py +2760 -0
  697. sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
  698. sage/sets/recursively_enumerated_set.pxd +31 -0
  699. sage/sets/recursively_enumerated_set.pyx +2082 -0
  700. sage/sets/set.py +2083 -0
  701. sage/sets/set_from_iterator.py +1021 -0
  702. sage/sets/totally_ordered_finite_set.py +329 -0
  703. sage/symbolic/all__sagemath_categories.py +1 -0
  704. sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
  705. sage/symbolic/function.pxd +29 -0
  706. sage/symbolic/function.pyx +1488 -0
  707. sage/symbolic/symbols.py +56 -0
  708. sage/tests/all__sagemath_categories.py +1 -0
  709. sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
  710. sage/tests/cython.pyx +37 -0
  711. sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
  712. sage/tests/stl_vector.pyx +171 -0
  713. sage/typeset/all.py +6 -0
  714. sage/typeset/ascii_art.py +295 -0
  715. sage/typeset/character_art.py +789 -0
  716. sage/typeset/character_art_factory.py +572 -0
  717. sage/typeset/symbols.py +334 -0
  718. sage/typeset/unicode_art.py +183 -0
  719. sage/typeset/unicode_characters.py +101 -0
@@ -0,0 +1,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)