Week 3 of the first phase of this coding period is coming to an end. The week started with a bad note, given that I had fallen sick due to travelling. But the work in Week 2, and the meeting with Sartaj on 11th of June helped me to progress smoothly. This week was spent mostly in completing the following deliverables.

  • This week was spent mostly in deciding the ways to implement the various operations in Formal Power Series. I started with convolution since I felt that was the only operation which didn’t require a tough recursive implementation. Discrete convolution, or specifically Cauchy Product of two infinite series goes as following –


Keeping this in mind, Sartaj and I decided to first make a boiler-plate function convolve which will take in two functions, f(x) and g(x) and an order term and will return the convolved formal power series, truncated upto the order term. I then came up with PR #17017, which does this following operations –

>>> f1, f2 = fps(sin(x)), fps(exp(x))
>>> f1.convolute(f2, x, order=6)
x + x**2 + x**3/3 - x**5/12 + O(x**6)

Note that no FormalPowerSeries object is being returned as of now. We will deal with that in the upcoming PR.

  • After pushing in the PR, Sartaj suggested to turn all the implementations in the convolve functions inot sequence-based implemetations, since Sequences in general should also cache the coefficients and speed for later calls as well. I used the convolution function in sympy.discrete.convolutions and have implemented linear, cyclic, dyadic and subset convolution as of now in convolve function of formal power series. Some examples are –
>>> from sympy import fps, sin, exp, convolution
>>> from sympy.abc import x
>>> f1 = fps(sin(x))
>>> f2 = fps(exp(x))

>>> f1.convolve(f2, x, 4)
x + x**2 + x**3/3 + O(x**4)

>>> f1.convolve(f2, x, 4, cycle=4)
11*x/12 + 35*x**2/36 + x**3/3 + O(x**4)

>>> f1.convolve(f2, x, 6, dyadic=True)
4667/4800 + 2641*x/2880 + x**3/3 + x**4/60 + x**5/20 + O(x**6)

>>> f1.convolve(f2, x, 6, subset=True)
x + x**3/3 + x**5/20 + O(x**6)

The PR is in a position of receiving final reviews and getting merged !!

  • In the meeting with Sartaj, we also discussed how we can decide upon the implementation of composition and inversion of formal power series. We decided that we should create a FiniteFormalPowerSeries class inherited from FormalPowerSeries and use that for implementing the various operations, so that common functions can be re-used. Soon, I will be implementing a PR for the above mentioned topics.

That’s it for Week 3 !! See you in the next week.