I actually have one feature request myself: I'd like to have a method that
finds power series solutions to given equations and initial conditions.
For example, in FriCAS I can do
(3) -> fm f == f * (1-q*z) - f.(q*z)*(y*q*z+y)- f.(q*z)*q*z*f - y*q*z
(4) -> res := seriesSolve(fm, [0])$UTSSOL(EXPR INT, UFPS EXPR INT, UFPS
SMPEXPR EXPR INT);
(5) -> res
(5)
3 2 2
q y q y + q y 2
- ------- x + ---------------------- x
q y - 1 3 2 2
q y + (- q - q)y + 1
+
...
Of course, very often we can easily rewrite the equation so that it fits
into the "f = L.undefined(); f.define" scheme, and of course, we can use
pencil and paper, too.
Martin
On Thursday, 15 September 2022 at 11:03:57 UTC+2 Martin R wrote:
> Dear all,
>
> in the past few months, Travis and I have worked on a reimplementation of
> lazy formal power series. With https://trac.sagemath.org/ticket/32367
> its design and implementation
> is now well-developed, and powerful enough so that I'd like to briefly
> present it here.
>
> If you notice any shortcomings or have further feature requests, I am
> happy to hear of them! Note that there are several other tickets on the
> same topic (all with keyword "LazyPowerSeries"), which are not yet merged,
> but almost ready.
>
> What is it all about?
>
> For us, a 'lazy' series ring is an 'exact' implementation of the concept
> of formal power series. The adjective 'lazy' means that a coefficient is
> only computed on demand, whereas 'exact' means that you do not have to
> worry about precision (up to the exactness of the base ring) - in
> principle, all the coefficients can be accessed. By default, the first few
> coefficients will be printed, and the number of coefficients printed can be
> set by a global option.
>
> We have implemented several such rings:
>
> sage: L.<z> = LazyLaurentSeriesRing(QQ)
> sage: P.<q,t> = LazyPowerSeriesRing(QQ)
> sage: D = LazyDirichletSeriesRing(QQ, "s")
> sage: s = SymmetricFunctions(QQ).s(); S = LazySymmetricFunctions(s)
> sage: nc = NonCommutativeSymmetricFunctions(QQ).Complete(); NC =
> nc.formal_series_ring() # or anything in GradedAlgebrasWithBasis
>
> ----
> Please note that, in particular, the LazyPowerSeriesRing in
> sage/combinat/species/series.py and the LazyLaurentSeriesRing in
> sage/rings/lazy_laurent_series.py have been replaced.
> ----
>
> For all of these, all the operations you might expect should be available.
> For example:
>
> sage: sin(z)^2 + cos(z)^2
> 1 + O(z^7)
>
> sage: (1/sinh(z) + 1/cosh(z))*exp(-z)
> z^-1 - 2/3*z + 14/45*z^3 - 124/945*z^5 + O(z^6)
>
> sage: f = L(lambda n: Partitions(n).cardinality(), valuation=0)
> sage: f
> 1 + z + 2*z^2 + 3*z^3 + 5*z^4 + 7*z^5 + 11*z^6 + O(z^7)
>
> sage: ~f # the Euler function (see ticket #34381)
> 1 - z - z^2 + z^5 + O(z^7)
>
> We can efficiently compute with multivariate power series:
>
> sage: exp(q*log(1/(1-t)))
> 1 + q*t + 1/2*q*t^2 + (1/2*q^2*t^2+1/3*q*t^3) + (1/2*q^2*t^3+1/4*q*t^4) +
> (1/6*q^3*t^3+11/24*q^2*t^4+1/5*q*t^5) + O(q,t)^7
>
> Dirichlet series look and behave quite differently, but the machinery
> behind is very similar:
>
> sage: D(moebius)^-1
> 1 + 1/(2^s) + 1/(3^s) + 1/(4^s) + 1/(5^s) + 1/(6^s) + 1/(7^s) + O(1/(8^s))
>
> Finally, we can compute with symmetric functions of unbounded degree. In
> particular, plethysms are supported:
>
> sage: H = S(lambda n: s[n])
> sage: H(H-1)
> s[] + s[1] + 2*s[2] + (s[2,1]+3*s[3]) + (2*s[2,2]+2*s[3,1]+5*s[4]) +
> (s[2,2,1]+4*s[3,2]+5*s[4,1]+7*s[5]) +
> (2*s[2,2,2]+2*s[3,2,1]+2*s[3,3]+s[4,1,1]+10*s[4,2]+8*s[5,1]+11*s[6]) + O^7
>
> One important feature, which works for all of these, is the possibility to
> define series via implicit equations:
>
> sage: b = P.undefined(valuation=1)
> sage: b.define(q + t/(1-b))
> sage: b[5]
> q^4*t + 10*q^3*t^2 + 30*q^2*t^3 + 35*q*t^4 + 14*t^5
>
> This feature also works with several series that depend on each other:
>
> sage: f = L.undefined(0)
> sage: g = L.undefined(0)
> sage: f.define(1 + z*g^3)
> sage: g.define(1 + z*f^2)
> sage: f
> 1 + z + 3*z^2 + 9*z^3 + 34*z^4 + 132*z^5 + 546*z^6 + O(z^7)
> sage: g
> 1 + z + 2*z^2 + 7*z^3 + 24*z^4 + 95*z^5 + 386*z^6 + O(z^7)
>
> Again, comments are very welcome!
>
> Best wishes,
>
> Martin
--
You received this message because you are subscribed to the Google Groups
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sage-devel/fde10d38-5a57-48d2-a0f8-35036930ef46n%40googlegroups.com.