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.
- passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.8.1a4.dist-info/METADATA +203 -0
- passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
- passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
- passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
- passagemath_schemes-10.8.1a4.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9556 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +727 -0
- sage/lfunctions/pari.py +971 -0
- sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5132 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
- sage/modular/abvar/abvar_newform.py +246 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +187 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +721 -0
- sage/modular/abvar/homspace.py +989 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +741 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1406 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +361 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +659 -0
- sage/modular/arithgroup/congroup_gammaH.py +1491 -0
- sage/modular/arithgroup/congroup_generic.py +630 -0
- sage/modular/arithgroup/congroup_sl2z.py +266 -0
- sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1067 -0
- sage/modular/arithgroup/tests.py +425 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3736 -0
- sage/modular/btquotients/pautomorphicform.py +2564 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1107 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +571 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1076 -0
- sage/modular/hecke/algebra.py +725 -0
- sage/modular/hecke/all.py +19 -0
- sage/modular/hecke/ambient_module.py +994 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +302 -0
- sage/modular/hecke/hecke_operator.py +736 -0
- sage/modular/hecke/homspace.py +185 -0
- sage/modular/hecke/module.py +1744 -0
- sage/modular/hecke/morphism.py +139 -0
- sage/modular/hecke/submodule.py +970 -0
- sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2020 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1070 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +817 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +120 -0
- sage/modular/modform/ambient_g1.py +199 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +487 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4105 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +127 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1859 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +380 -0
- sage/modular/modform/weight1.py +221 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3844 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1291 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +376 -0
- sage/modular/multiple_zeta.py +2635 -0
- sage/modular/multiple_zeta_F_algebra.py +789 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1879 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +776 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +856 -0
- sage/modular/pollack_stevens/modsym.py +1590 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1078 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +846 -0
- sage/modular/quasimodform/ring.py +826 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +700 -0
- sage/schemes/curves/affine_curve.py +2924 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +397 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3203 -0
- sage/schemes/curves/weighted_projective_curve.py +106 -0
- sage/schemes/curves/zariski_vankampen.py +1931 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +991 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1103 -0
- sage/schemes/elliptic_curves/constructor.py +1530 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
- sage/schemes/elliptic_curves/ell_egros.py +457 -0
- sage/schemes/elliptic_curves/ell_field.py +2837 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3249 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4944 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7184 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1663 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7328 -0
- sage/schemes/elliptic_curves/height.py +2108 -0
- sage/schemes/elliptic_curves/hom.py +1788 -0
- sage/schemes/elliptic_curves/hom_composite.py +1084 -0
- sage/schemes/elliptic_curves/hom_fractional.py +544 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +681 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +247 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +915 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +716 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +369 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +581 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +53 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- 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))
|