-Hermite approximants}
A given rational function F(z)∈k(z) over a field k can be written as a power series f(z) in the completion k((z)) of k(z) at the place (z). It thus is a good approximation of f(z) in the sense that F(z) is equal to f(z) up to infinite order.
Padé-Hermite approximants deal with the converse. Given a (formal) power series f(z)∈k[[z]] and some non- negative integers nP and nQ, find polynomials P(z), Q(z)∈k[z] of degrees at most nP and nQ, respectively, such that P(z) * f(z) - Q(z) = O(znP + nQ + 1) holds. In other words, P/Q(z) is an approximation for f(z) for polynomials P and Q of limited degree in z. In this notation the pair [P, Q] is known as the Padé-Hermite approximant for the power series tuple (f, - 1).
The idea of approximating one power series by two polynomials can be extended to approximating several power series at the same time as follows. Consider the vector underline(f)T:= (f1, f2, ..., fm)T in the m-dimensional vector space k((z))m over a power series ring. Let underline(n)=(n1, n2, ..., nm) be an m-tuple of non-negative integers. A Padé-Hermite approximant of underline(f)T(z) of type underline(n) is a non-zero vector of polynomials underline(P)=(P1, P2, ..., Pm) in k[z]m such that underline(P).underline(f)T = O(zN) , N=n1 + n2 + ... + nm + m - 1, is satisfied. A non-trivial Padé-Hermite approximant always exists. The approximant is contained in the sub-space V_(underline(f), N)={ underline(Q)∈k[z]m : underline(Q).underline(f)T = O(zN)}.
The implementation of Padé-Hermite approximants is based on [Der94] and [BL94]. They are implemented in Magma as sequences rather than vectors.
A Padé-Hermite approximant to some sequence of power series does not have to be unique. They can be ordered according to their maximum degree and their type of sequence. A sequence underline(P)=[P1, P2, ..., Pm] is of degree i if the maximum of the weak degrees of P1, P2, ..., Pm is i. An extension of the definition maximum degree is when a distortion of non-negative integers underline(d)=[d1, d2, ..., dm] on the degrees is allowed. In this case the maximum degree is defined as the maximum of deg(Pi) - di. The type of underline(P) identifies the last Pi in underline(P) whose weak degree equals the maximum degree of underline(P). Again a distortion on the degrees is allowed.
The Padé-Hermite approximant of underline(f) can be seen as an element of the free module k[z]m of rank m, or as an element of the sub-space V_(underline(f), N).
A free sub-model V⊂k[z]m is generated by m polynomial vectors underline(Q)i, 1=1, 2, ..., m, such that underline(Q)1(z), underline(Q)2(z), ..., underline(Q)m(z) form a minimal vector sequence of V. Such a sequence is defined as a sequence S of m vectors in V, such that S[i] is a non-trivial polynomial vector in V of minimal degree of type i, for i=1, 2, ..., m. A minimal vector sequence is not unique.
Two variations on a minimal vector sequence are implemented. The first allows a distortion as an attribute. The sequence is the based on the distorted maximal degree. The second attribute sets the positive power p of z in each of the underline(Q)i as follows. Instead of considering underline(Q)i(z) for each i, one considers underline(Q)i(zp).
Distortion: SeqEnum Default: []
MaximumDegree returns the degree of a sequence of polynomials or power series, defined as the maximum of the degrees of f[i] - d[i], where d is the distortion. The value -infinity is returned in the case that f is weakly equal to the zero-sequence.
> S<u> := PowerSeriesRing(Rationals()); > f := [u+u^2, 2+u^2+u^3,0]; > MaximumDegree(f); 3 > MaximumDegree(f:Distortion:=[]); 3 > MaximumDegree(f:Distortion:=[0,2,1]); 2 > MaximumDegree([S|0,0]); -Infinity > MaximumDegree([O(u)]); -Infinity
Distortion: SeqEnum Default: []
Returns the highest index i for those f[i] whose (distorted) degree is weakly equal to the maximum of the degrees of all entries. The second integer returned is the maximum degree of the sequence.
> S<u> := PowerSeriesRing(Rationals()); > f := [u+u^2, 2+u^2+u^3,0]; > TypeOfSequence(f); 2 3 > TypeOfSequence(f:Distortion:=[]); 2 3 > TypeOfSequence(f:Distortion:=[0,2,1]); 1 2 > TypeOfSequence([S|0,0]); 2 -Infinity
Distortion: SeqEnum Default: []
Power: RngIntElt Default: 1
A minimal sequence of vectors underline(Q)1, underline(Q)2, ..., underline(Q)m with respect to the sequence f of length m whose entries are polynomials or power series. The order of underline(Q)i.f is at least m.
> S<u> := PowerSeriesRing(Rationals()); > f := [u+u^2, 2+u^2+u^3]; > seq := MinimalVectorSequence(f, 2); > seq; [ (u 0), ( -1 1/2*u) ] > sums := [&+([Q[i]*f[i]: i in [1..#f]]) : Q in seq]; > sums; [ u^2 + u^3, -u^2 + 1/2*u^3 + 1/2*u^4 ] > seq := MinimalVectorSequence(f,3); > #seq eq 2, seq[1], seq[2]; true (u^2 0) (-1 + u 1/2*u)
> L<x> := PolynomialRing(Rationals()); > f := [1+x, 3-x^2, 5+x+x^3-x^5]; > seq := MinimalVectorSequence(f, 10); > seq[1]; (-2*x^2 + 6 -2*x - 2 0) > sums := [&+([Q[i]*f[i]: i in [1..#f]]) : Q in seq]; > sums; [ 0, 0, x^10 ]
> S<u> := PowerSeriesRing(Rationals()); > f := [2*u^4,2+u^3+u^6]; > seq := MinimalVectorSequence(f, 10); > seq; [ (1/2*u^6 0), (-1/2 - 1/4*u^3 1/2*u^4) ] > sums := [&+([Q[i]*f[i]: i in [1..#f]]) : Q in seq]; > sums; [ u^10, 1/2*u^10 ]
> S<u> := PowerSeriesRing(Rationals()); > f := [1+u-7*u^2, 6-3*u+1/2*u^2-u^3, 5-u+u^2]; > seq := MinimalVectorSequence(f, 5); > [&+([Q[i]*f[i]: i in [1..#f]]) : Q in seq]; [ 0, u^5, 0 ] > seq := MinimalVectorSequence(f, 5:Distortion:=[2,0,1]); > [&+([Q[i]*f[i]: i in [1..#f]]) : Q in seq]; [ -7/2*u^5, u^5, 0 ] > p:=2; > seq := MinimalVectorSequence(f, 5:Distortion:=[2,0,1], Power:=p); > sums := [&+([Q[i]*f[i]: i in [1..#f]]) : Q in seq]; > sums; > mp:= map<S->S| x :-> (IsWeaklyZero(x) select 0 > else &+([Coefficient(x,i)*(S.1)^(p*i) : i in Exponents(x)])) > + (ISA(Type(v),RngIntElt) select O((S.1)^(p*v)) > else S!0 where v := AbsolutePrecision(x))>; > sums := [&+([mp(Q[i])*f[i]: i in [1..#f]]) : Q in seq]; > sums; [ u^6 + u^7 - 7*u^8, u^5 - 23/3*u^6, -5/3*u^5 + 35/3*u^6 ]
The Padé-Hermite approximant of type underline(d)=[d1, d2, ..., dm] with respect to the tuple underline(f)T∈k((z))m is an element of the space V_(underline(f), N)={ underline(Q)∈k[z]m : underline(Q).underline(f)T = O(zN)} for N equal to d1 + d2 + ... + dm + m - 1. This space is generated by the vectors in the minimal vector sequence with respect to underline(f) with distortion underline(d). The routine PadeHermiteApproximant returns one that is smallest with respect to the degree on sequences. The input sequence underline(f) must be a sequence of polynomial ring elements, or be a power series sequence. While the Padé Hermite approximants theoretically are polynomials, Magma returns them as elements of the same ring the entries of underline(f) are contained in.
A variant of the Padé-Hermite approximant is when the exponent in the order term is set rather that the type of the sequence. It is also possible to let underline(f) be a sequence such that its entries themselves are vectors of polynomials or power series.
Power: RngIntElt Default: 1
Returns a Padé-Hermite form underline(P) of f with distortion d, smallest with respect to the degree on sequences, and the corresponding minimal vector sequence. The third argument returned is the order in the order term of underline(P).f.
> S<u> := PowerSeriesRing(Rationals()); > f := [1,u,u/(1-u^4)+u^10+O(u^16),u/(1+u^4)+u^12+O(u^16)]; > pade, padebasis, ord := PadeHermiteApproximant(f,[2,2,2,2]); > pade, ord; ( u -1 0 0) 11 > BaseRing(Parent(pade)) eq S; true > MinimalVectorSequence(f,10); [ ( u -1 0 0), ( 0 u^4 -1/2 1/2), ( 0 1 - u^4 -1/2 + u^4 -1/2), ( 0 -u 1/2*u 1/2*u) ] > > p := 2; > seq := MinimalVectorSequence(f,10: Distortion :=[2,2,2,2],Power := p); > seq; [ (u^5 0 0 0), ( 0 u^2 -1/2 1/2), ( 0 1 - u^2 -1/2 + u^2 -1/2), ( 0 -u 1/2*u 1/2*u) ] > mp:= map<S->S| x :-> (IsWeaklyZero(x) select 0 > else &+([Coefficient(x,i)*(S.1)^(p*i) : i in Exponents(x)])) > + (ISA(Type(v),RngIntElt) select O((S.1)^(p*v)) > else S!0 where v := AbsolutePrecision(x))>; > sums := [&+([mp(Q[i])*f[i]: i in [1..#f]]) : Q in seq]; > [Valuation(v) : v in sums]; [ 10, 10, 10, 11 ] > sums; [ u^10, -1/2*u^10 + 1/2*u^12 - u^13 + O(u^16), -1/2*u^10 - 1/2*u^12 + u^13 + u^14 + O(u^16), u^11 + 1/2*u^12 + 1/2*u^14 + O(u^18) ]
> S<u> := PowerSeriesRing(Rationals()); > f := [1,u, -1-u^4-2*u^8+u^10+u^11-u^12+O(u^16),-u-u^5-u^9-u^14-u^15+O(u^16)]; > dist:=[2,2,3,3]; > seq := MinimalVectorSequence(f,13:Distortion:=dist); > pade, padebasis, ord := PadeHermiteApproximant(f,dist); > pade, ord; (-u 1 0 0) 13 > padebasis; [ (-u 1 0 0), (1/2*u -1/2*u^4 1/2*u + 1/2*u^3 + 1/2*u^4 -1/2*u^2 - 1/2*u^3 - u^4), (-1/2 1/2*u^3 -1/2 - 1/2*u^2 - 1/2*u^3 - u^4 1/2*u + 1/2*u^2 + 2*u^3), ( -u 0 0 -1 + u^4) ] > padebasis eq seq; true > [[Valuation(w[i]): i in [1..Degree(w)]] : w in seq]; [ [ 1, 0, Infinity, Infinity ], [ 1, 4, 1, 2 ], [ 0, 3, 0, 1 ], [ 1, Infinity, Infinity, 0 ] ] > [[MaximumDegree([w[i]])-dist[i]: i in [1..Degree(w)] ] : w in seq]; [ [ -1, -2, -Infinity, -Infinity ], [ -1, 2, 1, 1 ], [ -2, 1, 1, 0 ], [ -1, -Infinity, -Infinity, 1 ] ] > p:=2; > seq := MinimalVectorSequence(f,12:Distortion:=dist,Power:=p); > seq; [ ( u - u^3 0 u - 2*u^3 0), (-1 - u + u^2 -u^3 -1 - u + 2*u^2 + u^3 -u^3), (u + u^2 - u^3 0 u + u^2 - 2*u^3 - u^4 0), ( 0 1 0 1 - u^2) ] > seq[1]-seq[3]; ( -u^2 0 -u^2 + u^4 0) > mp:= map<S->S| x :-> (IsWeaklyZero(x) select 0 > else &+([Coefficient(x,i)*(S.1)^(p*i) : i in Exponents(x)])) > + (ISA(Type(v),RngIntElt) select O((S.1)^(p*v)) > else S!0 where v := AbsolutePrecision(x))>; > [Valuation(&+([mp(Q[i])*f[i]: i in [1..#f]])) : Q in seq]; [ 12, 12, 13, 13 ]
> S<u> := PowerSeriesRing(Rationals()); > f := [1,u,-1-u^4-2*u^8+u^10+O(u^12),-u-u^5-u^9+u^10+O(u^12)]; > dist := [2,2,3,3]; > seq := MinimalVectorSequence(f,12: Distortion := dist); > [[MaximumDegree([w[i]])-dist[i]: i in [1..Degree(w)] ] : w in seq]; [ [ -1, -2, -Infinity, -Infinity ], [ -2, 1, 0, 0 ], [ -Infinity, -Infinity, 1, 0 ], [ -1, -Infinity, 0, 1 ] ] > [Valuation(&+([(Q[i])*f[i]: i in [1..#f]]) ) : Q in seq]; [ Infinity, 12, 12, 12 ] > [MaximumDegree([ &+([(Q[i])*f[i]: i in [1..#f]]) ]) : Q in seq]; [ -Infinity, -Infinity, 14, -Infinity ] > PadeHermiteApproximant(f,[2,2,3,3]); > p := 2; > seq := MinimalVectorSequence(f,12:Distortion:=[2,2,3,3],Power:=p); > seq; [ ( 1 - u^2 -1 1 - 2*u^2 -1 + u^2), ( 0 -u^4 0 -u^4), ( -u -1 -u + u^3 -1 + u^2), ( 0 u 0 u - u^3) ] > [[MaximumDegree([w[i]])-dist[i]: i in [1..Degree(w)] ] : w in seq]; [ [ 0, -2, -1, -1 ], [ -Infinity, 2, -Infinity, 1 ], [ -1, -2, 0, -1 ], [ -Infinity, -1, -Infinity, 0 ] ] > mp:= map<S->S| x :-> (IsWeaklyZero(x) select 0 > else &+([Coefficient(x,i)*(S.1)^(p*i) : i in Exponents(x)])) > + (ISA(Type(v),RngIntElt) select O((S.1)^(p*v)) > else S!0 where v := AbsolutePrecision(x))>; > > [Valuation(&+([mp(Q[i])*f[i]: i in [1..#f]])) : Q in seq]; [ 12, 13, 12, 12 ]
Power: RngIntElt Default: 1
Returns a Padé-Hermite form of minimal degree in the corresponding minimal vector sequence, such that its inproduct with f has order at least m. The second argument returned is the corresponding minimal vector sequence.
> S<u> := PowerSeriesRing(Rationals()); > f := [Vector([1]), Vector([u])]; > pade, seq := PadeHermiteApproximant(f,3); Calculating the Pade'-Hermite approximant for the sequence [ 1, u ] with order term 3 and power 1 . > pade; ( u -1) > seq; [ ( u -1), ( 0 u^2) ] > mat := Matrix([Eltseq(v): v in f]); > pade*mat; (0) > PadeHermiteApproximant([1,u],5); ( u -1) [ ( u -1), ( 0 u^4) ] > PadeHermiteApproximant(f,3:Power:=2); > g:= [Vector([1,0,0]), Vector([0,1,0]), Vector([1+u,2+u^2,u^3])]; > pade := PadeHermiteApproximant(g,5); Calculating the Pade'-Hermite approximant for the sequence [ 1, u, 1 + 2*u + u^3 + u^7 + u^11 ] with order term 15 and power 3 . > pade; (-u^3 - u^4 -2*u^3 u^3) > pade*Matrix([Eltseq(v): v in g]); ( 0 u^5 u^6)
> S<u> := PowerSeriesRing(Rationals()); > f := [Sin(u), Cos(u), Exp(u)]; > [Valuation(f[i]) : i in [1..#f]], [Degree(f[i]) : i in [1..#f]]; [ 1, 0, 0 ] [ 19, 20, 20 ] > [AbsolutePrecision(f[i]) : i in [1..#f]]; [ 21, 22, 21 ] > dist := [3,2,5]; > pade, seq, ord := PadeHermiteApproximant(f,dist); > 1/420*pade; (-1275 - 255*u + 45*u^2 + 5*u^3 120 + 495*u + 75*u^2 -120 + 900*u - 600*u^2 + 160*u^3 - 20*u^4 + u^5) > ord eq &+(dist)+#f-1, ord; true 12 > [Degree(pade[i]) : i in [1..Degree(pade)]]; [ 3, 2, 5 ] > g:= [Cos(2*u)*(u+1)+3,Cos(u)^2+u*Cos(u)+1,Cos(2*u)+1,Cos(u)]; > pade, basis := PadeHermiteApproximant(g,20); > 131/75880*pade; ( 2 -4 + 2*u -3*u 4*u - 2*u^2) > h := [ 1+u^2-u^7+u^12, Sin(u), Exp(u) ]; > dist:=[3,1,2]; > seq := MinimalVectorSequence(h,8:Distortion := dist); > sums := [&+([Q[i]*h[i]: i in [1..#f]]) : Q in seq]; > [Valuation(s) : s in sums]; [ 8, 8, 8 ] > [[MaximumDegree([w[i]]): i in [1..Degree(w)] ] : w in seq]; [ [ 4, 1, 2 ], [ 4, 2, 2 ], [ 3, 1, 2 ] ] > [[MaximumDegree([w[i]])-dist[i]: i in [1..Degree(w)] ] : w in seq]; [ [ 1, 0, 0 ], [ 1, 1, 0 ], [ 0, 0, 0 ] ]