%md # Asymptotics and analytic combinatorics in SageMath Daniel Krenn <sagemath@danielkrenn.at> Part of the lecture on Analytic Combinatorics, Uppsala University, 2019-05-09
18176/9
%md ## Introduction
Introduction
5/9 + 2019
918176
5.parent()
Integer Ring
(5/9).parent()
Rational Field
(2/1).parent()
Rational Field
ZZ(2/1).parent()
Integer Ring
2.is_unit()
False
QQ(2).is_unit()
True
%typeset_mode True sqrt(2)
2
%typeset_mode False sqrt(2).parent()
Symbolic Ring
P.<z> = QQ[] P
Univariate Polynomial Ring in z over Rational Field
%typeset_mode True 1/(1-z)
z−1−1
%typeset_mode False (1/(1-z)).parent()
Fraction Field of Univariate Polynomial Ring in z over Rational Field
P.<z> = QQ[[]] P
Power Series Ring in z over Rational Field
%typeset_mode True 1/(1-z)
1+z+z2+z3+z4+z5+z6+z7+z8+z9+z10+z11+z12+z13+z14+z15+z16+z17+z18+z19+O(z20)
1/(1-z) * (1-z)
1 + O(z^20)
SR(1/(1-z))
1+1z+1z2+1z3+1z4+1z5+1z6+1z7+1z8+1z9+1z10+1z11+1z12+1z13+1z14+1z15+1z16+1z17+1z18+1z19+O(z20)
SR(1/(1-z)) - SR(1/(1-z)) # don't use the Symbolic Ring!!!
0
%md ## Asymptotic Expansion
Asymptotic Expansion
A.<n> = AsymptoticRing('QQ^n * n^ZZ * log(n)^ZZ', QQ, default_prec=8)
1/2^n + n + O(1/n)
n+O(n−1)
(n^2 + O(n)) * (n^3 + 3*n + O(1/n))
n5+O(n4)
log(n+1)
log(n)+n−1−21n−2+31n−3−41n−4+51n−5−61n−6+71n−7−81n−8+O(n−9)
# we have to extend the asymptotic ring to include "e" SCR = SR.subring(no_variables=True) A.<n> = AsymptoticRing('QQ^n * n^ZZ * log(n)^ZZ', SCR, default_prec=8)
exp(1+1/n^2)
e+en−2+21en−4+61en−6+241en−8+1201en−10+7201en−12+50401en−14+O(n−16)
pi^(1+1/n^2)
π+πlog(π)n−2+21πlog(π)2n−4+61πlog(π)3n−6+241πlog(π)4n−8+1201πlog(π)5n−10+7201πlog(π)6n−12+50401πlog(π)7n−14+O(n−16)
(1 + 1/n)^n
e−21en−1+2411en−2−167en−3+57602447en−4−2304959en−5+580608238043en−6−16588867223en−7+O(n−8)
exp(O(1/n))
1+O(n−1)
%md ## Harmonic Numbers
Harmonic Numbers
[harmonic_number(n) for n in srange(10)]
[0, 1, 23, 611, 1225, 60137, 2049, 140363, 280761, 25207129]
[sum(1/k for k in srange(1, n+1)) for n in srange(10)]
[0, 1, 23, 611, 1225, 60137, 2049, 140363, 280761, 25207129]
asymptotic_expansions.HarmonicNumber('n', precision=10)
log(n)+γE+21n−1−121n−2+1201n−4−2521n−6+2401n−8−1321n−10+32760691n−12−121n−14+O(n−16)
H_n_plus_1 = asymptotic_expansions.SingularityAnalysis('n', zeta=1, alpha=1, beta=1, precision=10) H_n_plus_1
log(n)+γE+23n−1−1213n−2+n−3−120119n−4+O(n−5log(n))
n = H_n_plus_1.parent().gen() H_n_plus_1.subs(n=n-1)
log(n)+γE+21n−1−121n−2+1201n−4+O(n−5log(n))
def H(z): return -log(1-z) / (1-z)
P.<z> = QQ[[]] H(z)
z+23z2+611z3+1225z4+60137z5+2049z6+140363z7+280761z8+25207129z9+25207381z10+2772083711z11+2772086021z12+3603601145993z13+3603601171733z14+3603601195757z15+7207202436559z16+1225224042142223z17+408408014274301z18+77597520275295799z19+O(z20)
A.coefficients_of_generating_function(H, [1], precision=10, return_singular_expansions=True)
(log(n)+γE+21n−1−121n−2+1201n−4+O(n−5log(n)), {1:Tlog(T)})
%md ## Catalan Numbers
Catalan Numbers
[catalan_number(n) for n in srange(10)]
[1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862]
[binomial(2*n, n) / (n+1) for n in srange(10)]
[1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862]
b_2n_n = asymptotic_expansions.Binomial_kn_over_n('n', k=2, precision=10) b_2n_n
π14nn−21−8π14nn−23+128π14nn−25+1024π54nn−27−32768π214nn−29−262144π3994nn−211+4194304π8694nn−213+33554432π393254nn−215−2147483648π3344774nn−217−17179869184π287174034nn−219+274877906944π596971834nn−221+2199023255552π84003724354nn−223−70368744177664π344292919054nn−225−562949953421312π71992556119954nn−227+9007199254740992π146315945760454nn−229+72057594037927936π42512069670629254nn−231−9223372036854775808π687874205963671654nn−233+O(4nn−235)
n = b_2n_n.parent().gen() b_2n_n / (n+1)
π14nn−23−8π94nn−25+128π1454nn−27−1024π11554nn−29+32768π369394nn−211−262144π2959114nn−213+4194304π47354454nn−215−33554432π378442354nn−217+2147483648π24216965634nn−219−17179869184π194022899074nn−221+274877906944π3104963356954nn−223−2199023255552π24755703131254nn−225+70368744177664π791838207280954nn−227−562949953421312π6406698214367554nn−229+9007199254740992π102653487375641254nn−231−72057594037927936π778715829334500754nn−233+9223372036854775808π98987751948852424354nn−235+O(4nn−237)
def C(z): return (1 - sqrt(1-4*z)) / (2*z)
P.<z> = QQ[[]]
C(z)
1+z+2z2+5z3+14z4+42z5+132z6+429z7+1430z8+4862z9+16796z10+58786z11+208012z12+742900z13+2674440z14+9694845z15+35357670z16+129644790z17+477638700z18+O(z19)
A.coefficients_of_generating_function(C, singularities=[1/4], precision=10)
π14nn−23−8π94nn−25+128π1454nn−27−1024π11554nn−29+32768π369394nn−211−262144π2959114nn−213+4194304π47354454nn−215−33554432π378442354nn−217+2147483648π24216965634nn−219−17179869184π194022899074nn−221+O(4nn−11)
P.<z> = LazyPowerSeriesRing(QQ) P
Lazy Power Series Ring over Rational Field
C = P() C.define(1 + z*C^2) C
Uninitialized lazy power series
C.compute_coefficients(10) C
1 + z + 2*z^2 + 5*z^3 + 14*z^4 + 42*z^5 + 132*z^6 + 429*z^7 + 1430*z^8 + 4862*z^9 + 16796*z^10 + O(x^11)
def Phi(u): return 1+u^2
expression1 = asymptotic_expansions.InverseFunctionAnalysis('n', phi=Phi, period=2, precision=10)
n = expression1.parent().gen() expression1.subs(n=2*n+1).map_coefficients(lambda c: c.simplify())
π14nn−23−8π94nn−25+128π1454nn−27−1024π11554nn−29+O(4nn−211)
%md ## Runs in Words
Runs in Words
def denominator(z, k): return 1 - 2*z + z^(k+1)
P.<z> = QQ[]
denominator(z, 2).roots(CIF)
[(−1.618033988749895?, 1), (0.618033988749895?, 1), (1, 1)]
sorted(denominator(z, 2).roots(CIF), key=lambda (z0, m): abs(z0))
[(0.618033988749895?, 1), (1, 1), (−1.618033988749895?, 1)]
def dominant_singularity(k): return sorted(denominator(z, k).roots(CIF), key=lambda (z0, m): abs(z0))[0][0]
[dominant_singularity(k) for k in srange(1, 10)]
[1, 0.618033988749895?, 0.543689012692077?, 0.518790063675884?, 0.508660391642005?, 0.504138258361656?, 0.502017055178166?, 0.500994177922890?, 0.500493118286553?]
%md What if $k\to\infty$?
What if k→∞?
A.<k> = AsymptoticRing('QQ^k * k^ZZ', QQ)
# we start with some first estimate z0 = 1/2 + O((3/5)^k)
# fix point equation def f(z): return (1+z^(k+1)) / 2
f(z0)
21+41(21)k+O((103)kk)
f(f(z0))
21+41(21)k+81(41)kk+81(41)k+O((203)kk2)
f(f(f(z0)))
21+41(21)k+81(41)kk+81(41)k+323(81)kk2+325(81)kk+161(81)k+O((403)kk3)
f(f(f(f(z0))))
21+41(21)k+81(41)kk+81(41)k+323(81)kk2+325(81)kk+161(81)k+121(161)kk3+163(161)kk2+9613(161)kk+321(161)k+O((803)kk4)