Hi everyone!
The task of finding the minimum linear recurrence for the given starting sequence is typically solved with the Berlekamp-Massey algorithm. In this article I would like to highlight another possible approach, with the use of the extended Euclidean algorithm.
Tl'dr.
The procedure below is essentially a formalization of the extended Euclidean algorithm done on F(x) and xm+1.
If you need to find the minimum linear recurrence for a given sequence F0,F1,…,Fm, do the following:
Let F(x)=Fm+Fm−1x+⋯+F0xm be the generating function of the reversed F.
Compute the sequence of remainders r−2,r−1,r0,…,rk such that r−2=F(x), r−1=xm+1 and
Let ak(x) be a polynomial such that rk=rk−2−akrk−1.
Compute the auxiliary sequence q−2,q−1,q0,…,qk such that q−2=1, q−1=0 and
Pick k to be the first index such that degrk<degqk. Let qk(x)=a0xd−d∑k=1akxd−k, then it also holds that
for any n≥d and d is the minimum possible. Thus, qk(x) divided by a0 is the characteristic polynomial of the minimum linear for F.
More generally, one can say for such k that
Linear recurrence interpolation
In the previous article on linear recurrences we derived that the generating function of the linear recurrence always looks like
where P(x) and Q(x) are polynomials and degP<degQ. In this representation, Q(x)=1−d∑k=1akxk corresponds to
Typical competitive programming task of recovering linear recurrence is formulated as follows:
Find Linear Recurrence. You're given F0,…,Fm. Find a1,…,ad with minimum d such that Fn=d∑k=1akFn−k.
In formal power series terms it means that we're given F(x)=F0+F1x+⋯+Fmxm and we need to find P(x)Q(x) such that
and d is the minimum possible. Note that in this particular problem it is not required for ad to be 0, hence degQ≤d.
In this terms, as we will see later, what the problem asks us to find is essentially the Padé approximant of F(x).
Padé approximants
Given a formal power series f(x)=∞∑k=0fkxk, its Padé approximant of order [p/q] is the rational function
such that f(x)Q(x)≡P(x)(modxp+q+1). The Padé approximant is denoted [p/q]f(x)=R(x).
For normalization purposes, we will demand bq=1.
Explanation: The definition of Padé approximants requires some normalization, as you could obtain different representations of the same rational function by multiplying its numerator and denominator with the same polynomial. Most commonly used normalization is b0=1. However, to guarantee q=degQ and to easier deal with possible trailing zeros in the recurrence, we will use the normalization bq=1.
These definitions are different in terms of whether the Padé approximant for the given normalization exists. However, when degP<degQ, they're equivalent in a sense that when Q(x)=1−b1x−⋯−bqxq defines the linear recurrence
the reversed polynomial xqQ(x−1)=bq−bq−1x−⋯−xq defines the recurrence
Thus to find the first kind recurrence for F0,F1,…,Fm, we could find the second kind recurrence for Fm,Fm−1,…,F0 instead.
Online Judge — Rational Approximation. Given f(x), compute p(x) and q(x) of degrees at most m−1 and n−1 such that
Extended Euclidean algorithm
Let's look again on the condition
It translates into the following Bézout's identity:
where K(x) is a formal power series. When P(x) is divisible by gcd(F(x),xm+1) the solution to this equation can be found with the extended Euclidean algorithm. Turns out, the extended Euclidean algorithm can also be used to enumerate all [p/q]F with p+q=m.
Formalizing the algorithm
Let's formalize the extended Euclidean algorithm of A(x) and B(x). Starting with r−2=A and r−1=B, we compute the sequence
If you're familiar with continued fractions, you could recognize, that this sequence corresponds to the representation
Same as with rational numbers, for such sequence it is possible to define the sequence of convergents
starting with
Now, one can prove the following identity:
In other words, we get three sequences rk, pk and qk that define a family of solutions to the Bézout's identity.
Using A(x)=xm+1 and B(x)=F(x), we conclude that
Enumerating approximants
Let's estimate the degrees of rk and qk to estimate how they relate with Padé approximants.
It follows from the recurrence that degqk−degqk−1=degak=degrk−2−degrk−1, therefore
and
Multiplying both the numerator and the denominator of (−1)krkqk by 1,x,x2,…,xak+1−1, we get the Padé approximants [p/q]F for all q from degqk to degqk+ak+1−1=degqk+1−1, while also maintaining the inequality p≤m−q.
Joining it together for all qk we see that all [(m−q)/q]F for q from 0 to m are covered.
Thus, if you find k such that degqk≤q and degqk+1>q, assuming p+q=m, it will hold that
Finding the linear recurrence
In this notion, the minimum recurrence is defined by the first k such that degrk<degqk and has a characteristic polynomial qk.
I have implemented the O(n2) algorithm as a part of my polynomial algorithms library:
// Returns the characteristic polynomial
// of the minimum linear recurrence for
// the first d+1 elements of the sequence
poly min_rec(int d = deg()) const {
// R1 = reversed (Q(x) mod x^{d+1}), R2 = x^{d+1}
auto R1 = mod_xk(d + 1).reverse(d + 1), R2 = xk(d + 1);
auto Q1 = poly(T(1)), Q2 = poly(T(0));
while(!R2.is_zero()) {
auto [a, nR] = R1.divmod(R2); // R1 = a*R2 + nR, deg nR < deg R2
tie(R1, R2) = make_tuple(R2, nR);
tie(Q1, Q2) = make_tuple(Q2, Q1 + a * Q2);
if(R2.deg() < Q2.deg()) {
return Q2 / Q2.lead(); // guarantee that the highest coefficient is 1
}
}
assert(0);
}
You can see this Library Judge submission for further details.
Also here is a library-free version, if you prefer it.
Half-GCD algorithm
The notion above provides the basis to construct the O(nlog2n) divide and conquer algorithm of computing gcd(P,Q) in polynomials and finding the minimum linear recurrence. I have a truly marvelous demonstration of this proposition that this margin is, unfortunately, too narrow to contain. I hope, I will be able to formalize the process for good and write an article about it sometime...
As a teaser, here's an example of the problem, that (probably) requires Half-GCD:
Library Checker — Inv of Polynomials. You're given f(x) and h(x). Compute f−1(x) modulo h(x).
Let f(x)h(x)=[a0;a1,…,ak] and pk−1qk−1=[a0;a1,…,ak−1], then fqk−1−hpk−1=(−1)k−2rk=(−1)k−2gcd(f,p).
Therefore, if rk=gcd(f,h) is non-constant, the inverse doesn't exist. Otherwise, the inverse is (−1)k−2qk−1(x).
In the problem, n≤5⋅104, therefore you need to do something better than O(n2) Euclidean algorithm.