passagemath-schemes 10.6.38__cp314-cp314t-macosx_13_0_arm64.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.

Potentially problematic release.


This version of passagemath-schemes might be problematic. Click here for more details.

Files changed (314) hide show
  1. passagemath_schemes/.dylibs/libflint.21.0.dylib +0 -0
  2. passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
  3. passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
  4. passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
  5. passagemath_schemes/__init__.py +3 -0
  6. passagemath_schemes-10.6.38.dist-info/METADATA +204 -0
  7. passagemath_schemes-10.6.38.dist-info/METADATA.bak +205 -0
  8. passagemath_schemes-10.6.38.dist-info/RECORD +314 -0
  9. passagemath_schemes-10.6.38.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.6.38.dist-info/top_level.txt +3 -0
  11. sage/all__sagemath_schemes.py +23 -0
  12. sage/databases/all__sagemath_schemes.py +7 -0
  13. sage/databases/cremona.py +1723 -0
  14. sage/dynamics/all__sagemath_schemes.py +2 -0
  15. sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
  16. sage/dynamics/arithmetic_dynamics/all.py +14 -0
  17. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
  18. sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
  19. sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
  20. sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
  21. sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
  22. sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
  23. sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +745 -0
  29. sage/lfunctions/pari.py +818 -0
  30. sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5135 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
  34. sage/modular/abvar/abvar_newform.py +244 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +186 -0
  37. sage/modular/abvar/cuspidal_subgroup.py +371 -0
  38. sage/modular/abvar/finite_subgroup.py +896 -0
  39. sage/modular/abvar/homology.py +720 -0
  40. sage/modular/abvar/homspace.py +998 -0
  41. sage/modular/abvar/lseries.py +415 -0
  42. sage/modular/abvar/morphism.py +935 -0
  43. sage/modular/abvar/torsion_point.py +274 -0
  44. sage/modular/abvar/torsion_subgroup.py +740 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1402 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +363 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +653 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1469 -0
  57. sage/modular/arithgroup/congroup_generic.py +628 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +267 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1066 -0
  61. sage/modular/arithgroup/tests.py +418 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3753 -0
  64. sage/modular/btquotients/pautomorphicform.py +2570 -0
  65. sage/modular/buzzard.py +100 -0
  66. sage/modular/congroup.py +29 -0
  67. sage/modular/congroup_element.py +13 -0
  68. sage/modular/cusps.py +1109 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +569 -0
  71. sage/modular/dirichlet.py +3310 -0
  72. sage/modular/drinfeld_modform/all.py +2 -0
  73. sage/modular/drinfeld_modform/element.py +446 -0
  74. sage/modular/drinfeld_modform/ring.py +773 -0
  75. sage/modular/drinfeld_modform/tutorial.py +236 -0
  76. sage/modular/etaproducts.py +1065 -0
  77. sage/modular/hecke/algebra.py +746 -0
  78. sage/modular/hecke/all.py +20 -0
  79. sage/modular/hecke/ambient_module.py +1019 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +325 -0
  82. sage/modular/hecke/hecke_operator.py +780 -0
  83. sage/modular/hecke/homspace.py +206 -0
  84. sage/modular/hecke/module.py +1767 -0
  85. sage/modular/hecke/morphism.py +174 -0
  86. sage/modular/hecke/submodule.py +989 -0
  87. sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
  88. sage/modular/hypergeometric_misc.pxd +4 -0
  89. sage/modular/hypergeometric_misc.pyx +166 -0
  90. sage/modular/hypergeometric_motive.py +2017 -0
  91. sage/modular/local_comp/all.py +2 -0
  92. sage/modular/local_comp/liftings.py +292 -0
  93. sage/modular/local_comp/local_comp.py +1071 -0
  94. sage/modular/local_comp/smoothchar.py +1825 -0
  95. sage/modular/local_comp/type_space.py +748 -0
  96. sage/modular/modform/all.py +30 -0
  97. sage/modular/modform/ambient.py +815 -0
  98. sage/modular/modform/ambient_R.py +177 -0
  99. sage/modular/modform/ambient_eps.py +306 -0
  100. sage/modular/modform/ambient_g0.py +124 -0
  101. sage/modular/modform/ambient_g1.py +204 -0
  102. sage/modular/modform/constructor.py +545 -0
  103. sage/modular/modform/cuspidal_submodule.py +708 -0
  104. sage/modular/modform/defaults.py +14 -0
  105. sage/modular/modform/eis_series.py +505 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4131 -0
  108. sage/modular/modform/find_generators.py +59 -0
  109. sage/modular/modform/half_integral.py +154 -0
  110. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  111. sage/modular/modform/j_invariant.py +47 -0
  112. sage/modular/modform/l_series_gross_zagier.py +133 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
  114. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  115. sage/modular/modform/notes.py +45 -0
  116. sage/modular/modform/numerical.py +514 -0
  117. sage/modular/modform/periods.py +14 -0
  118. sage/modular/modform/ring.py +1257 -0
  119. sage/modular/modform/space.py +1860 -0
  120. sage/modular/modform/submodule.py +118 -0
  121. sage/modular/modform/tests.py +64 -0
  122. sage/modular/modform/theta.py +110 -0
  123. sage/modular/modform/vm_basis.py +381 -0
  124. sage/modular/modform/weight1.py +220 -0
  125. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  126. sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
  127. sage/modular/modform_hecketriangle/all.py +30 -0
  128. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  129. sage/modular/modform_hecketriangle/constructor.py +416 -0
  130. sage/modular/modform_hecketriangle/element.py +351 -0
  131. sage/modular/modform_hecketriangle/functors.py +752 -0
  132. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  133. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
  135. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
  136. sage/modular/modform_hecketriangle/readme.py +1214 -0
  137. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  138. sage/modular/modform_hecketriangle/space.py +1037 -0
  139. sage/modular/modform_hecketriangle/subspace.py +423 -0
  140. sage/modular/modsym/all.py +17 -0
  141. sage/modular/modsym/ambient.py +3846 -0
  142. sage/modular/modsym/boundary.py +1420 -0
  143. sage/modular/modsym/element.py +336 -0
  144. sage/modular/modsym/g1list.py +178 -0
  145. sage/modular/modsym/ghlist.py +182 -0
  146. sage/modular/modsym/hecke_operator.py +73 -0
  147. sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
  148. sage/modular/modsym/manin_symbol.pxd +5 -0
  149. sage/modular/modsym/manin_symbol.pyx +497 -0
  150. sage/modular/modsym/manin_symbol_list.py +1295 -0
  151. sage/modular/modsym/modsym.py +400 -0
  152. sage/modular/modsym/modular_symbols.py +384 -0
  153. sage/modular/modsym/p1list.cpython-314t-darwin.so +0 -0
  154. sage/modular/modsym/p1list.pxd +29 -0
  155. sage/modular/modsym/p1list.pyx +1372 -0
  156. sage/modular/modsym/p1list_nf.py +1241 -0
  157. sage/modular/modsym/relation_matrix.py +591 -0
  158. sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
  159. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  160. sage/modular/modsym/space.py +2468 -0
  161. sage/modular/modsym/subspace.py +455 -0
  162. sage/modular/modsym/tests.py +375 -0
  163. sage/modular/multiple_zeta.py +2632 -0
  164. sage/modular/multiple_zeta_F_algebra.py +786 -0
  165. sage/modular/overconvergent/all.py +6 -0
  166. sage/modular/overconvergent/genus0.py +1878 -0
  167. sage/modular/overconvergent/hecke_series.py +1187 -0
  168. sage/modular/overconvergent/weightspace.py +778 -0
  169. sage/modular/pollack_stevens/all.py +4 -0
  170. sage/modular/pollack_stevens/distributions.py +874 -0
  171. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  172. sage/modular/pollack_stevens/manin_map.py +859 -0
  173. sage/modular/pollack_stevens/modsym.py +1593 -0
  174. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  175. sage/modular/pollack_stevens/sigma0.py +534 -0
  176. sage/modular/pollack_stevens/space.py +1076 -0
  177. sage/modular/quasimodform/all.py +3 -0
  178. sage/modular/quasimodform/element.py +845 -0
  179. sage/modular/quasimodform/ring.py +828 -0
  180. sage/modular/quatalg/all.py +3 -0
  181. sage/modular/quatalg/brandt.py +1642 -0
  182. sage/modular/ssmod/all.py +8 -0
  183. sage/modular/ssmod/ssmod.py +827 -0
  184. sage/rings/all__sagemath_schemes.py +1 -0
  185. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  186. sage/rings/polynomial/binary_form_reduce.py +585 -0
  187. sage/schemes/all.py +41 -0
  188. sage/schemes/berkovich/all.py +6 -0
  189. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  190. sage/schemes/berkovich/berkovich_space.py +748 -0
  191. sage/schemes/curves/affine_curve.py +2928 -0
  192. sage/schemes/curves/all.py +33 -0
  193. sage/schemes/curves/closed_point.py +434 -0
  194. sage/schemes/curves/constructor.py +381 -0
  195. sage/schemes/curves/curve.py +542 -0
  196. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  197. sage/schemes/curves/point.py +463 -0
  198. sage/schemes/curves/projective_curve.py +3026 -0
  199. sage/schemes/curves/zariski_vankampen.py +1932 -0
  200. sage/schemes/cyclic_covers/all.py +2 -0
  201. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  202. sage/schemes/cyclic_covers/constructor.py +137 -0
  203. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  204. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  205. sage/schemes/elliptic_curves/BSD.py +1036 -0
  206. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  207. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  208. sage/schemes/elliptic_curves/all.py +49 -0
  209. sage/schemes/elliptic_curves/cardinality.py +609 -0
  210. sage/schemes/elliptic_curves/cm.py +1102 -0
  211. sage/schemes/elliptic_curves/constructor.py +1552 -0
  212. sage/schemes/elliptic_curves/ec_database.py +175 -0
  213. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
  214. sage/schemes/elliptic_curves/ell_egros.py +459 -0
  215. sage/schemes/elliptic_curves/ell_field.py +2836 -0
  216. sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
  217. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  218. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  219. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  220. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  221. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  222. sage/schemes/elliptic_curves/ell_point.py +4787 -0
  223. sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
  224. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  225. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  226. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  227. sage/schemes/elliptic_curves/formal_group.py +760 -0
  228. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  229. sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
  230. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  231. sage/schemes/elliptic_curves/heegner.py +7335 -0
  232. sage/schemes/elliptic_curves/height.py +2109 -0
  233. sage/schemes/elliptic_curves/hom.py +1406 -0
  234. sage/schemes/elliptic_curves/hom_composite.py +934 -0
  235. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  236. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  237. sage/schemes/elliptic_curves/hom_sum.py +682 -0
  238. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  239. sage/schemes/elliptic_curves/homset.py +271 -0
  240. sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
  241. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  242. sage/schemes/elliptic_curves/jacobian.py +237 -0
  243. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  244. sage/schemes/elliptic_curves/kraus.py +1014 -0
  245. sage/schemes/elliptic_curves/lseries_ell.py +943 -0
  246. sage/schemes/elliptic_curves/mod5family.py +105 -0
  247. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  248. sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
  249. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  250. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  251. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  252. sage/schemes/elliptic_curves/padics.py +1816 -0
  253. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  254. sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
  255. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  256. sage/schemes/elliptic_curves/saturation.py +715 -0
  257. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  258. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  259. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  260. sage/schemes/hyperelliptic_curves/all.py +6 -0
  261. sage/schemes/hyperelliptic_curves/constructor.py +291 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
  265. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  266. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  267. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
  271. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  272. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
  273. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  274. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  275. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
  276. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  277. sage/schemes/jacobians/all.py +2 -0
  278. sage/schemes/overview.py +161 -0
  279. sage/schemes/plane_conics/all.py +22 -0
  280. sage/schemes/plane_conics/con_field.py +1296 -0
  281. sage/schemes/plane_conics/con_finite_field.py +158 -0
  282. sage/schemes/plane_conics/con_number_field.py +456 -0
  283. sage/schemes/plane_conics/con_rational_field.py +406 -0
  284. sage/schemes/plane_conics/con_rational_function_field.py +580 -0
  285. sage/schemes/plane_conics/constructor.py +249 -0
  286. sage/schemes/plane_quartics/all.py +2 -0
  287. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  288. sage/schemes/plane_quartics/quartic_generic.py +73 -0
  289. sage/schemes/riemann_surfaces/all.py +1 -0
  290. sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
  291. sage_wheels/share/cremona/cremona_mini.db +0 -0
  292. sage_wheels/share/ellcurves/rank0 +30427 -0
  293. sage_wheels/share/ellcurves/rank1 +31871 -0
  294. sage_wheels/share/ellcurves/rank10 +6 -0
  295. sage_wheels/share/ellcurves/rank11 +6 -0
  296. sage_wheels/share/ellcurves/rank12 +1 -0
  297. sage_wheels/share/ellcurves/rank14 +1 -0
  298. sage_wheels/share/ellcurves/rank15 +1 -0
  299. sage_wheels/share/ellcurves/rank17 +1 -0
  300. sage_wheels/share/ellcurves/rank19 +1 -0
  301. sage_wheels/share/ellcurves/rank2 +2388 -0
  302. sage_wheels/share/ellcurves/rank20 +1 -0
  303. sage_wheels/share/ellcurves/rank21 +1 -0
  304. sage_wheels/share/ellcurves/rank22 +1 -0
  305. sage_wheels/share/ellcurves/rank23 +1 -0
  306. sage_wheels/share/ellcurves/rank24 +1 -0
  307. sage_wheels/share/ellcurves/rank28 +1 -0
  308. sage_wheels/share/ellcurves/rank3 +836 -0
  309. sage_wheels/share/ellcurves/rank4 +10 -0
  310. sage_wheels/share/ellcurves/rank5 +5 -0
  311. sage_wheels/share/ellcurves/rank6 +5 -0
  312. sage_wheels/share/ellcurves/rank7 +5 -0
  313. sage_wheels/share/ellcurves/rank8 +6 -0
  314. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,786 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.combinat
3
+ r"""
4
+ F-algebra for motivic multiple zeta values.
5
+
6
+ This is a commutative algebra, defined as the tensor product of the
7
+ polynomial algebra over one generator `f_2` by the shuffle algebra in
8
+ infinitely many generators indexed by odd integers and denoted by
9
+ `f_3`, `f_5`, ... It serves as an auxiliary algebra in the study of
10
+ the ring of motivic multiple zeta values.
11
+
12
+ Here we provide a basic direct implementation, endowed with the
13
+ motivic coproduct.
14
+
15
+ The similar algebra where the shuffle algebra has generators
16
+ `f_1, f_3, f_5, \ldots` is now also available. The implementation is even more
17
+ general, allowing any positive odd integer as start index.
18
+
19
+ AUTHORS:
20
+
21
+ - Frédéric Chapoton (2022-09): Initial version
22
+ """
23
+ # ****************************************************************************
24
+ # Copyright (C) 2022 Frédéric Chapoton <chapoton-unistra-fr>
25
+ #
26
+ # Distributed under the terms of the GNU General Public License (GPL)
27
+ # https://www.gnu.org/licenses/
28
+ # ****************************************************************************
29
+ from __future__ import annotations
30
+ from collections.abc import Iterator
31
+
32
+ from sage.arith.misc import bernoulli
33
+ from sage.categories.rings import Rings
34
+ from sage.categories.bialgebras_with_basis import BialgebrasWithBasis
35
+ from sage.combinat.free_module import CombinatorialFreeModule
36
+ from sage.combinat.words.words import Words
37
+ from sage.combinat.words.finite_word import FiniteWord_class
38
+ from sage.combinat.words.shuffle_product import ShuffleProduct_w1w2 as shuffle
39
+ from sage.misc.cachefunc import cached_method
40
+ from sage.misc.lazy_attribute import lazy_attribute
41
+ from sage.sets.integer_range import IntegerRange
42
+ from sage.rings.integer_ring import ZZ
43
+ from sage.sets.non_negative_integers import NonNegativeIntegers
44
+ from sage.rings.infinity import Infinity
45
+ from sage.modules.free_module_element import vector
46
+
47
+
48
+ def W_Odds(start=3):
49
+ r"""
50
+ Indexing set for the odd generators.
51
+
52
+ This is the set of pairs
53
+ (integer power of `f_2`, word in `s, s+2, s+4, \ldots`)
54
+ where `s` is the chosen odd start index.
55
+
56
+ INPUT:
57
+
58
+ - ``start`` -- (default: ``3``) odd start index for odd generators
59
+
60
+ EXAMPLES::
61
+
62
+ sage: from sage.modular.multiple_zeta_F_algebra import W_Odds
63
+ sage: W_Odds(3)
64
+ Finite words over {3, 5, ...}
65
+ """
66
+ return Words(IntegerRange(start, Infinity, 2), infinite=False)
67
+
68
+
69
+ def str_to_index(x: str) -> tuple:
70
+ r"""
71
+ Convert a string to an index.
72
+
73
+ Every letter ``'2'`` contributes to the power of `f_2`. Other letters
74
+ are odd and define a word in `f_1, f_3, f_5, \ldots`
75
+
76
+ Usually the letters ``'2'`` form a prefix of the input.
77
+
78
+ EXAMPLES::
79
+
80
+ sage: from sage.modular.multiple_zeta_F_algebra import str_to_index
81
+ sage: str_to_index("22357")
82
+ (2, [3, 5, 7])
83
+
84
+ sage: str_to_index("22317")
85
+ (2, [3, 1, 7])
86
+ """
87
+ p = x.count("2")
88
+ w = [int(i) for i in x if i != '2']
89
+ return (p, w)
90
+
91
+
92
+ def basis_f_odd_iterator(n, start=3) -> Iterator[tuple]:
93
+ r"""
94
+ Return an iterator over compositions of `n` with odd parts.
95
+
96
+ Let `s` be the chosen odd start index. The allowed parts are the
97
+ odd integers at least equal to `s`, in the set `s,s+2,s+4,s+6,\ldots`.
98
+
99
+ This set of compositions is used to index a basis.
100
+
101
+ INPUT:
102
+
103
+ - ``n`` -- integer
104
+
105
+ - ``start`` -- odd integer (default: `3`); start index for odd generators
106
+
107
+ EXAMPLES::
108
+
109
+ sage: from sage.modular.multiple_zeta_F_algebra import basis_f_odd_iterator
110
+ sage: [list(basis_f_odd_iterator(i)) for i in range(2,9)]
111
+ [[], [(3,)], [], [(5,)], [(3, 3)], [(7,)], [(5, 3), (3, 5)]]
112
+ sage: list(basis_f_odd_iterator(14))
113
+ [(11, 3),
114
+ (5, 3, 3, 3),
115
+ (3, 5, 3, 3),
116
+ (3, 3, 5, 3),
117
+ (9, 5),
118
+ (3, 3, 3, 5),
119
+ (7, 7),
120
+ (5, 9),
121
+ (3, 11)]
122
+ """
123
+ if n == 0:
124
+ yield ()
125
+ return
126
+ if n % 2 and n >= start:
127
+ yield (n,)
128
+ for k in range(start, n, 2):
129
+ for word in basis_f_odd_iterator(n - k, start=start):
130
+ yield word + (k, )
131
+
132
+
133
+ def basis_f_iterator(n, start=3) -> Iterator[tuple]:
134
+ r"""
135
+ Return an iterator for decompositions of `n` using `2` and odd integers.
136
+
137
+ Let `s` be the chosen odd start index. The allowed odd parts are the
138
+ odd integers at least equal to `s`, in the set `s,s+2,s+4,s+6,\ldots`.
139
+
140
+ The means that each term is made of a power of 2 and a composition
141
+ of the remaining integer with parts in `(s,s+2,s+4,\ldots)`.
142
+
143
+ This set is indexing a basis of the homogeneous component of weight ``n``.
144
+
145
+ INPUT:
146
+
147
+ - ``n`` -- integer
148
+
149
+ - ``start`` -- (default: `3`) odd start index for odd generators
150
+
151
+ Each term is returned as a pair (integer, word) where
152
+ the integer is the exponent of 2.
153
+
154
+ EXAMPLES::
155
+
156
+ sage: from sage.modular.multiple_zeta_F_algebra import basis_f_iterator
157
+ sage: [list(basis_f_iterator(i)) for i in range(2,9)]
158
+ [[(1, word: )],
159
+ [(0, word: 3)],
160
+ [(2, word: )],
161
+ [(0, word: 5), (1, word: 3)],
162
+ [(0, word: 33), (3, word: )],
163
+ [(0, word: 7), (1, word: 5), (2, word: 3)],
164
+ [(0, word: 53), (0, word: 35), (1, word: 33), (4, word: )]]
165
+ sage: list(basis_f_iterator(11))
166
+ [(0, word: 11),
167
+ (0, word: 533),
168
+ (0, word: 353),
169
+ (0, word: 335),
170
+ (1, word: 9),
171
+ (1, word: 333),
172
+ (2, word: 7),
173
+ (3, word: 5),
174
+ (4, word: 3)]
175
+
176
+ TESTS::
177
+
178
+ sage: list(basis_f_iterator(0))
179
+ [(0, word: )]
180
+ sage: list(basis_f_iterator(3, start=1))
181
+ [(0, word: 3), (0, word: 111), (1, word: 1)]
182
+ """
183
+ wodds = W_Odds(start)
184
+ for k in range(n // 2 + 1):
185
+ for word in basis_f_odd_iterator(n - 2 * k, start):
186
+ yield (k, wodds(word, check=False))
187
+
188
+
189
+ def morphism_constructor(data: dict, start=3):
190
+ r"""
191
+ Build a morphism from the F-algebra to some codomain.
192
+
193
+ Let `s` be the chosen odd start index.
194
+
195
+ INPUT:
196
+
197
+ - ``data`` -- dictionary with integer keys containing the images of
198
+ `f_2, f_s, f_{s+2}, f_{s+4}, \ldots`
199
+
200
+ - ``start`` -- (default: 3) start index for odd generators
201
+
202
+ OUTPUT: the unique morphism defined by the dictionary ``data``
203
+
204
+ The codomain must be a zinbiel algebra, namely have both a
205
+ commutative associative product ``*`` and a zinbiel product
206
+ available as ``half_product``.
207
+
208
+ EXAMPLES::
209
+
210
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra, morphism_constructor
211
+ sage: Z = Multizeta
212
+ sage: D = {2: Z(2), 3: Z(3)}
213
+ sage: rho = morphism_constructor(D)
214
+ sage: F = rho.domain()
215
+ sage: rho(F("2"))
216
+ ζ(2)
217
+ sage: rho(F("3"))
218
+ ζ(3)
219
+ sage: rho(F("33"))
220
+ 6*ζ(1,5) + 3*ζ(2,4) + ζ(3,3)
221
+ sage: rho(F("23"))
222
+ 6*ζ(1,4) + 3*ζ(2,3) + ζ(3,2)
223
+ """
224
+ im_f2 = data[2]
225
+ codomain = im_f2.parent()
226
+ domain = F_algebra(codomain.base_ring(), start=start)
227
+
228
+ def morphism_on_basis(pw):
229
+ p, w = pw
230
+ if not w:
231
+ return im_f2**p
232
+ v = im_f2**p * data[w[-1]]
233
+ for letter in w[-2::-1]:
234
+ v = codomain.half_product(data[letter], v)
235
+ return v
236
+
237
+ return domain._module_morphism(morphism_on_basis, codomain=codomain)
238
+
239
+
240
+ class F_algebra(CombinatorialFreeModule):
241
+ r"""
242
+ Auxiliary algebra for the study of motivic multiple zeta values.
243
+
244
+ INPUT:
245
+
246
+ - ``R`` -- ring
247
+
248
+ - ``start`` -- (default: ``3``) odd start index for odd generators
249
+
250
+ EXAMPLES::
251
+
252
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
253
+ sage: F = F_algebra(QQ); F
254
+ F-ring over Rational Field
255
+ sage: F.base_ring()
256
+ Rational Field
257
+ sage: F.is_commutative()
258
+ True
259
+ sage: TestSuite(F).run()
260
+
261
+ sage: f2 = F("2")
262
+ sage: f3 = F("3")
263
+ sage: f5 = F("5")
264
+
265
+ sage: s = f2*f3+f5; s
266
+ f5 + f2*f3
267
+ """
268
+ def __init__(self, R, start=3) -> None:
269
+ r"""
270
+ Initialize ``self``.
271
+
272
+ INPUT:
273
+
274
+ - ``R`` -- base ring
275
+
276
+ - ``start`` -- (default: ``3``) odd start index for odd generators
277
+
278
+ EXAMPLES::
279
+
280
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
281
+ sage: F = F_algebra(QQ); F
282
+ F-ring over Rational Field
283
+
284
+ TESTS::
285
+
286
+ sage: F_algebra(24)
287
+ Traceback (most recent call last):
288
+ ...
289
+ TypeError: argument R must be a ring
290
+ """
291
+ if R not in Rings():
292
+ raise TypeError("argument R must be a ring")
293
+ if not start % 2 and start > 0:
294
+ raise ValueError("argument start must be odd and positive")
295
+ self._start = start
296
+ Indices = NonNegativeIntegers().cartesian_product(W_Odds(start))
297
+ cat = BialgebrasWithBasis(R).Commutative().Graded()
298
+ CombinatorialFreeModule.__init__(self, R, Indices,
299
+ latex_prefix='', prefix='f',
300
+ category=cat)
301
+
302
+ def _repr_term(self, pw) -> str:
303
+ r"""
304
+ Return the custom representation of terms.
305
+
306
+ Each monomial is written as a power of `f_2` times a word
307
+ in `f_1, f_3, f_5, \ldots`.
308
+
309
+ EXAMPLES::
310
+
311
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
312
+ sage: F = F_algebra(QQ)
313
+ sage: f2 = F.gen(2)
314
+ sage: f3 = F.gen(3)
315
+ sage: f5 = F.gen(5)
316
+ sage: f2*f3+f5+f2**2 # indirect doctest
317
+ f5 + f2*f3 + f2^2
318
+ """
319
+ p, w = pw
320
+ if not p:
321
+ if not w:
322
+ return "1"
323
+ resu = ""
324
+ elif p == 1:
325
+ resu = "f2"
326
+ else:
327
+ resu = f"f2^{p}"
328
+ if p and w:
329
+ resu += "*"
330
+ return resu + "".join(f"f{i}" for i in w)
331
+
332
+ def _repr_(self) -> str:
333
+ r"""
334
+ Text representation of this algebra.
335
+
336
+ EXAMPLES::
337
+
338
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
339
+ sage: F = F_algebra(ZZ)
340
+ sage: F # indirect doctest
341
+ F-ring over Integer Ring
342
+ """
343
+ return f"F-ring over {self.base_ring()}"
344
+
345
+ @cached_method
346
+ def one_basis(self):
347
+ r"""
348
+ Return the pair (0, empty word), which index of `1` of this algebra.
349
+
350
+ EXAMPLES::
351
+
352
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
353
+ sage: A = F_algebra(QQ)
354
+ sage: A.one_basis()
355
+ (0, word: )
356
+ """
357
+ return self.basis().keys()((0, []))
358
+
359
+ def product_on_basis(self, pw1, pw2):
360
+ r"""
361
+ Return the product of basis elements ``pw1`` and ``pw2``.
362
+
363
+ INPUT:
364
+
365
+ - ``pw1``, ``pw2`` -- basis elements
366
+
367
+ EXAMPLES::
368
+
369
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
370
+ sage: A = F_algebra(QQ)
371
+ sage: W = A.basis().keys()
372
+ sage: A.product(A("23"), A("25")) # indirect doctest
373
+ f2^2*f3f5 + f2^2*f5f3
374
+ """
375
+ p1, w1 = pw1
376
+ p2, w2 = pw2
377
+ p = p1 + p2
378
+ return self.sum_of_monomials((p, u) for u in w1.shuffle(w2))
379
+
380
+ def half_product_on_basis(self, pw1, pw2):
381
+ r"""
382
+ Return the half product of basis elements ``pw1`` and ``pw2``.
383
+
384
+ This is an extension of the zinbiel product of the shuffle algebra.
385
+
386
+ INPUT:
387
+
388
+ - ``pw1``, ``pw2`` -- basis elements
389
+
390
+ EXAMPLES::
391
+
392
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
393
+ sage: A = F_algebra(QQ)
394
+ sage: W = A.basis().keys()
395
+ sage: t = A.half_product(A("23"), A("25")); t # indirect doctest
396
+ f2^2*f3f5
397
+
398
+ TESTS::
399
+
400
+ sage: [list(pw[1]) for pw, cf in t]
401
+ [[3, 5]]
402
+ """
403
+ p1, w1 = pw1
404
+ p2, w2 = pw2
405
+ p = p1 + p2
406
+ if not w1:
407
+ return self.basis()[(p, w2)]
408
+ letter = w1[:1]
409
+ return self.sum_of_monomials((p, letter + u)
410
+ for u in w1[1:].shuffle(w2))
411
+
412
+ @lazy_attribute
413
+ def half_product(self):
414
+ r"""
415
+ Return the `<` product.
416
+
417
+ EXAMPLES::
418
+
419
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
420
+ sage: A = F_algebra(QQ)
421
+ sage: W = A.basis().keys()
422
+ sage: A.half_product(A("235"), A("227"))
423
+ f2^3*f3f5f7 + f2^3*f3f7f5
424
+ """
425
+ half = self.half_product_on_basis
426
+ return self._module_morphism(self._module_morphism(half, position=0,
427
+ codomain=self),
428
+ position=1)
429
+
430
+ def gen(self, i):
431
+ r"""
432
+ Return the generator of the F ring over `\QQ`.
433
+
434
+ INPUT:
435
+
436
+ - ``i`` -- nonnegative integer (at least 2)
437
+
438
+ If ``i`` is odd, this returns a single generator `f_i` of the free
439
+ shuffle algebra.
440
+
441
+ Otherwise, it returns an appropriate multiple of a power of `f_2`.
442
+
443
+ EXAMPLES::
444
+
445
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
446
+ sage: A = F_algebra(QQ)
447
+ sage: [A.gen(i) for i in range(2,8)]
448
+ [f2, f3, 2/5*f2^2, f5, 8/35*f2^3, f7]
449
+ """
450
+ f2 = self.monomial(self._indices((1, [])))
451
+ if i == 2:
452
+ return f2
453
+ # now i odd >= start
454
+ if i % 2:
455
+ return self.monomial(self._indices((0, [i])))
456
+ # now powers of f2
457
+ i = i // 2
458
+ B = bernoulli(2 * i) * (-1)**(i - 1)
459
+ B *= ZZ(2)**(3 * i - 1) * ZZ(3)**i / ZZ(2 * i).factorial()
460
+ return B * f2**i
461
+
462
+ def _an_element_(self):
463
+ """
464
+ Return a typical element.
465
+
466
+ EXAMPLES::
467
+
468
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
469
+ sage: F = F_algebra(ZZ)
470
+ sage: F.an_element()
471
+ 3*f2*f3f5 + f2*f5f3
472
+ """
473
+ return self("253") + 3 * self("235")
474
+
475
+ def some_elements(self) -> list:
476
+ """
477
+ Return some typical elements.
478
+
479
+ EXAMPLES::
480
+
481
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
482
+ sage: F = F_algebra(ZZ)
483
+ sage: F.some_elements()
484
+ [0, 1, f2, f3 + f5]
485
+ """
486
+ return [self.zero(), self.one(), self.gen(2),
487
+ self.gen(3) + self.gen(5)]
488
+
489
+ def coproduct_on_basis(self, pw):
490
+ r"""
491
+ Return the coproduct of the basis element indexed by the pair ``pw``.
492
+
493
+ The coproduct is given by deconcatenation on the shuffle part,
494
+ and extended by the value
495
+
496
+ .. MATH::
497
+
498
+ \Delta(f_2) = 1 \otimes f_2.
499
+
500
+ INPUT:
501
+
502
+ - ``pw`` -- an index
503
+
504
+ EXAMPLES::
505
+
506
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
507
+ sage: F = F_algebra(QQ)
508
+ sage: W = F.basis().keys()
509
+ sage: F.coproduct_on_basis(W((1,[])))
510
+ 1 # f2
511
+ sage: F.coproduct_on_basis(W((0,[3])))
512
+ 1 # f3 + f3 # 1
513
+ sage: F.coproduct_on_basis(W((1,[3])))
514
+ 1 # f2*f3 + f3 # f2
515
+ sage: F.coproduct_on_basis(W((0,[3,5])))
516
+ 1 # f3f5 + f3 # f5 + f3f5 # 1
517
+ sage: F.coproduct_on_basis(W((0,[])))
518
+ 1 # 1
519
+
520
+ TESTS::
521
+
522
+ sage: F = F_algebra(QQ)
523
+ sage: S = F.an_element(); S
524
+ 3*f2*f3f5 + f2*f5f3
525
+ sage: F.coproduct(S)
526
+ 3*1 # f2*f3f5 + 1 # f2*f5f3 + 3*f3 # f2*f5 + 3*f3f5 # f2
527
+ + f5 # f2*f3 + f5f3 # f2
528
+ """
529
+ p, w = pw
530
+ TS = self.tensor_square()
531
+ return TS.sum_of_monomials(((0, w[:i]), (p, w[i:]))
532
+ for i in range(len(w) + 1))
533
+
534
+ def degree_on_basis(self, pw):
535
+ """
536
+ Return the degree of the element ``w``.
537
+
538
+ This is the sum of the power of `f_2` and the indices in the word.
539
+
540
+ EXAMPLES::
541
+
542
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
543
+ sage: A = F_algebra(QQ)
544
+ sage: [A.degree_on_basis(x.leading_support()) for x in A.some_elements() if x != 0]
545
+ [0, 1, 5]
546
+ """
547
+ p, w = pw
548
+ return ZZ(p + sum(w))
549
+
550
+ def homogeneous_from_vector(self, vec, N):
551
+ """
552
+ Convert back a vector to an element of the F-algebra.
553
+
554
+ INPUT:
555
+
556
+ - ``vec`` -- a vector with coefficients in some base ring
557
+
558
+ - ``N`` -- integer; the homogeneous weight
559
+
560
+ OUTPUT: a homogeneous element of :func:`F_ring` over this base ring
561
+
562
+ .. SEEALSO:: :meth:`F_algebra.homogeneous_to_vector`
563
+
564
+ EXAMPLES::
565
+
566
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
567
+ sage: F = F_algebra(QQ)
568
+ sage: F.homogeneous_from_vector((4,5),6)
569
+ 4*f3f3 + 5*f2^3
570
+ sage: _.homogeneous_to_vector()
571
+ (4, 5)
572
+ """
573
+ if isinstance(vec, (list, tuple)):
574
+ vec = vector(vec)
575
+ return self.sum(cf * self.monomial(bi)
576
+ for cf, bi in zip(vec, basis_f_iterator(N, self._start)))
577
+
578
+ def _element_constructor_(self, x):
579
+ r"""
580
+ Convert ``x`` into ``self``.
581
+
582
+ EXAMPLES::
583
+
584
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
585
+ sage: R = F_algebra(QQ)
586
+ sage: R("3")
587
+ f3
588
+ sage: R("2")
589
+ f2
590
+ sage: R("2235")
591
+ f2^2*f3f5
592
+ """
593
+ if isinstance(x, (str, FiniteWord_class)):
594
+ return self.monomial(self._indices(str_to_index(x)))
595
+
596
+ P = x.parent()
597
+ if isinstance(P, F_algebra):
598
+ if P is self:
599
+ return x
600
+ if P is not self.base_ring():
601
+ return self.element_class(self, x.monomial_coefficients())
602
+
603
+ R = self.base_ring()
604
+ # coercion via base ring
605
+ x = R(x)
606
+ if x == 0:
607
+ return self.element_class(self, {})
608
+ return self.from_base_ring_from_one_basis(x)
609
+
610
+ def _coerce_map_from_(self, R):
611
+ r"""
612
+ Return ``True`` if there is a coercion from ``R`` into ``self``
613
+ and ``False`` otherwise.
614
+
615
+ The things that coerce into ``self`` are
616
+
617
+ - an ``F_algebra`` over a base with a coercion
618
+ map into ``self.base_ring()``.
619
+
620
+ - Anything with a coercion into ``self.base_ring()``.
621
+
622
+ EXAMPLES::
623
+
624
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
625
+ sage: F = F_algebra(GF(7)); F
626
+ F-ring over Finite Field of size 7
627
+
628
+ Elements of the algebra itself canonically coerce in::
629
+
630
+ sage: F.coerce(F("2")*F("3")) # indirect doctest
631
+ f2*f3
632
+
633
+ Elements of the integers coerce in, since there is a coerce map
634
+ from `\ZZ` to GF(7)::
635
+
636
+ sage: F.coerce(1) # indirect doctest
637
+ 1
638
+
639
+ There is no coerce map from `\QQ` to `\GF{7}`::
640
+
641
+ sage: F.coerce(2/3) # indirect doctest
642
+ Traceback (most recent call last):
643
+ ...
644
+ TypeError: no canonical coercion from Rational Field
645
+ to F-ring over Finite Field of size 7
646
+
647
+ Elements of the base ring coerce in::
648
+
649
+ sage: F.coerce(GF(7)(5))
650
+ 5
651
+
652
+ The algebra over `\ZZ` coerces in, since
653
+ `\ZZ` coerces to `\GF{7}`::
654
+
655
+ sage: G = F_algebra(ZZ)
656
+ sage: Gx,Gy = G.gen(2), G.gen(3)
657
+ sage: z = F.coerce(Gx**2 * Gy);z
658
+ f2^2*f3
659
+ sage: z.parent() is F
660
+ True
661
+
662
+ However, `\GF{7}` does not coerce to `\ZZ`, so the
663
+ algebra over `\GF{7}` does not coerce to the one over `\ZZ`::
664
+
665
+ sage: G.coerce(F("2"))
666
+ Traceback (most recent call last):
667
+ ...
668
+ TypeError: no canonical coercion from F-ring over Finite Field
669
+ of size 7 to F-ring over Integer Ring
670
+
671
+ TESTS::
672
+
673
+ sage: F = F_algebra(ZZ)
674
+ sage: G = F_algebra(QQ)
675
+
676
+ sage: F._coerce_map_from_(G)
677
+ False
678
+ sage: G._coerce_map_from_(F)
679
+ True
680
+
681
+ sage: F._coerce_map_from_(QQ)
682
+ False
683
+ sage: G._coerce_map_from_(QQ)
684
+ True
685
+
686
+ sage: F.has_coerce_map_from(PolynomialRing(ZZ, 3, 'x,y,z'))
687
+ False
688
+ """
689
+ if isinstance(R, F_algebra):
690
+ return self.base_ring().has_coerce_map_from(R.base_ring())
691
+
692
+ return self.base_ring().has_coerce_map_from(R)
693
+
694
+ class Element(CombinatorialFreeModule.Element):
695
+ def coefficient(self, w):
696
+ """
697
+ Return the coefficient of the given index.
698
+
699
+ EXAMPLES::
700
+
701
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
702
+ sage: F = F_algebra(QQ)
703
+ sage: S = F.an_element(); S
704
+ 3*f2*f3f5 + f2*f5f3
705
+ sage: S.coefficient("235")
706
+ 3
707
+ sage: S.coefficient((1,[5,3]))
708
+ 1
709
+ """
710
+ if isinstance(w, str):
711
+ w = str_to_index(w)
712
+ w = self.parent()._indices(w)
713
+ return super().coefficient(w)
714
+
715
+ def homogeneous_to_vector(self):
716
+ """
717
+ Convert an homogeneous element to a vector.
718
+
719
+ This is using a fixed enumeration of the basis.
720
+
721
+ OUTPUT: a vector with coefficients in the base ring
722
+
723
+ .. SEEALSO:: :meth:`F_algebra.homogeneous_from_vector`
724
+
725
+ EXAMPLES::
726
+
727
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
728
+ sage: F = F_algebra(QQ)
729
+ sage: f2 = F("2")
730
+ sage: x = f2**4 + 34 * F("233")
731
+ sage: x.homogeneous_to_vector()
732
+ (0, 0, 34, 1)
733
+ sage: x.coefficients()
734
+ [34, 1]
735
+
736
+ TESTS::
737
+
738
+ sage: x = F.monomial(F._indices((0,[11]))); x
739
+ f11
740
+ sage: x.homogeneous_to_vector()
741
+ (1, 0, 0, 0, 0, 0, 0, 0, 0)
742
+ """
743
+ F = self.parent()
744
+ BR = F.base_ring()
745
+ if not self:
746
+ return vector(BR, [])
747
+ a, b = next(iter(self))[0]
748
+ N = 2 * a + sum(int(x) for x in b)
749
+ return vector(BR, [self.coefficient(b)
750
+ for b in basis_f_iterator(N, F._start)])
751
+
752
+ def without_f2(self):
753
+ """
754
+ Remove all terms containing a power of `f_2`.
755
+
756
+ EXAMPLES::
757
+
758
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
759
+ sage: F = F_algebra(QQ)
760
+ sage: t = 4 * F("35") + F("27")
761
+ sage: t.without_f2()
762
+ 4*f3f5
763
+ """
764
+ F = self.parent()
765
+ return F._from_dict({(0, w): cf for (p, w), cf in self if not p})
766
+
767
+ def single_valued(self):
768
+ """
769
+ Return the single-valued version of ``self``.
770
+
771
+ EXAMPLES::
772
+
773
+ sage: from sage.modular.multiple_zeta_F_algebra import F_algebra
774
+ sage: F = F_algebra(QQ)
775
+ sage: t = 4 * F("2") + F("3")
776
+ sage: t.single_valued()
777
+ 2*f3
778
+ sage: t = 4 * F("35") + F("27")
779
+ sage: t.single_valued()
780
+ 8*f3f5 + 8*f5f3
781
+ """
782
+ F = self.parent()
783
+ no_f2 = self.without_f2()
784
+ return F.sum_of_terms(((0, w), cf)
785
+ for (a, b), cf in no_f2.coproduct()
786
+ for w in shuffle(a[1], b[1].reversal(), False))