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