diff --git a/src/doc/en/reference/references/index.rst b/src/doc/en/reference/references/index.rst index 5a7eb0a163c..b8ee7d75e9a 100644 --- a/src/doc/en/reference/references/index.rst +++ b/src/doc/en/reference/references/index.rst @@ -1180,6 +1180,9 @@ REFERENCES: moduli spaces to Feynman integrals*, in Contemporary Mathematics vol 539, pages 27-52, 2011. +.. [Bro2013] Francis Brown, *Single-valued motivic periods and multiple zeta + values*, Forum Math. Sigma 2 (2014), :doi:`10.1017/fms.2014.18`. + .. [Bro2016] \A.E. Brouwer, Personal communication, 2016. diff --git a/src/sage/modular/multiple_zeta.py b/src/sage/modular/multiple_zeta.py index 6fd43f34560..b3674b5df78 100644 --- a/src/sage/modular/multiple_zeta.py +++ b/src/sage/modular/multiple_zeta.py @@ -1083,9 +1083,15 @@ def iterated(self): return self.parent().iterated(self) def single_valued(self): - """ + r""" Return the single-valued version of ``self``. + This is the projection map onto the sub-algebra of + single-valued motivic multiple zeta values, as defined by + F. Brown in [Bro2013]_. + + This morphism of algebras sends in particular `\zeta(2)` to `0`. + EXAMPLES:: sage: M = Multizetas(QQ) @@ -1108,13 +1114,7 @@ def single_valued(self): sage: Z(5,3).single_valued() == 14*Z(3)*Z(5) True """ - phi_im = self.phi() - zin = phi_im.parent() - phi_no_f2 = phi_im.without_f2() - sv = zin.sum_of_terms(((0, w), cf) - for (a, b), cf in phi_no_f2.coproduct() - for w in shuffle(a[1], b[1].reversal(), False)) - return rho_inverse(sv) + return rho_inverse(self.phi().single_valued()) def simplify(self): """ diff --git a/src/sage/modular/multiple_zeta_F_algebra.py b/src/sage/modular/multiple_zeta_F_algebra.py index 39e7dcad4e7..f2b21b9e668 100644 --- a/src/sage/modular/multiple_zeta_F_algebra.py +++ b/src/sage/modular/multiple_zeta_F_algebra.py @@ -31,6 +31,7 @@ from sage.combinat.free_module import CombinatorialFreeModule from sage.combinat.words.words import Words from sage.combinat.words.finite_word import FiniteWord_class +from sage.combinat.words.shuffle_product import ShuffleProduct_w1w2 as shuffle from sage.misc.cachefunc import cached_method from sage.misc.lazy_attribute import lazy_attribute from sage.sets.integer_range import IntegerRange @@ -715,9 +716,30 @@ def without_f2(self): sage: from sage.modular.multiple_zeta_F_algebra import F_algebra sage: F = F_algebra(QQ) - sage: t = 4*F("35")+F("27") + sage: t = 4 * F("35") + F("27") sage: t.without_f2() 4*f3f5 """ F = self.parent() return F._from_dict({(0, w): cf for (p, w), cf in self if not p}) + + def single_valued(self): + """ + Return the single-valued version of ``self``. + + EXAMPLES:: + + sage: from sage.modular.multiple_zeta_F_algebra import F_algebra + sage: F = F_algebra(QQ) + sage: t = 4 * F("2") + F("3") + sage: t.single_valued() + 2*f3 + sage: t = 4 * F("35") + F("27") + sage: t.single_valued() + 8*f3f5 + 8*f5f3 + """ + F = self.parent() + no_f2 = self.without_f2() + return F.sum_of_terms(((0, w), cf) + for (a, b), cf in no_f2.coproduct() + for w in shuffle(a[1], b[1].reversal(), False))