Mathématiques pour l'informatique 5

TD 5

Nombres de Stirling et calcul de sommes

On rappelle (cf. TD 4) que les polynômes de Bell (ou de Touchard) $b_n(t)$, définis par la série génératrice exponentielle $$ b(x,t)=e^{t(e^x−1)}=\sum_{\ge 0}b_n(t)\frac{x^n}{n!}. $$ Leurs coefficients sont les nombres de Stirling de seconde espèce : $$b_n(t)=\sum_{k=0}^n S(n,k)t^k.$$

Affichez le triangle Stirling2 pour $n\le 9$ (puissances de $t$ en ordre croissant).

Écrivez un fonction calculant $S(n,k)$ au moyen de la récurrence vue en cours $$ S(n,k) = S(n-1,k-1)+kS(n-1,k),$$ avec les conditions initiales $S(0,0)=1$ et $S(n,0)=S(0,n)=0$ (voir ici).

Les nombres de Stirling de première espèce $s(n,k)$ sont les coefficients des polynômes $$t^{\underline n}=(t)_n = t(t-1)\cdots (t-n+1)$$ dont la série génératrice exponentielle est $$ (1+x)^t = \sum_{n\ge 0}{t\choose n} = \sum_{n\ge 0}(t)_n\frac{x^n}{n!}.$$ Affichez le triangle Stirling1 pour $n\le 9$.

Écrivez une fonction calculant $s(n,k)$ au moyen de la récurrence vue en cours $$ s(n,k)= s(n-1,k-1) - (n-1)s(n-1,k),$$ avec les conditions initiales $s(0,0)=1$ et $s(n,0)=s(0,n)=0$ (voir ).

In [1]:
# Modèle avec le triangle de Pascal

from sympy import *
var('x t')
Out[1]:
(x, t)
In [2]:
def C(n,k):
    if k==n==0: return 1
    elif k>n or k<0: return 0
    else: return C(n-1,k-1)+C(n-1,k)
In [3]:
for n in  range(10):
    for k in range(n+1): 
        print (C(n,k), end=' ')
    print ()
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 
1 9 36 84 126 126 84 36 9 1 
In [4]:
# Bell
B = exp(t*(exp(x)-1))
bb = series(B,x,0,10).removeO().as_poly(x)
bb
Out[4]:
$\displaystyle \operatorname{Poly}{\left( \left(\frac{t^{9}}{362880} + \frac{t^{8}}{10080} + \frac{11 t^{7}}{8640} + \frac{7 t^{6}}{960} + \frac{331 t^{5}}{17280} + \frac{37 t^{4}}{1728} + \frac{605 t^{3}}{72576} + \frac{17 t^{2}}{24192} + \frac{t}{362880}\right) x^{9} + \left(\frac{t^{8}}{40320} + \frac{t^{7}}{1440} + \frac{19 t^{6}}{2880} + \frac{5 t^{5}}{192} + \frac{27 t^{4}}{640} + \frac{23 t^{3}}{960} + \frac{127 t^{2}}{40320} + \frac{t}{40320}\right) x^{8} + \left(\frac{t^{7}}{5040} + \frac{t^{6}}{240} + \frac{t^{5}}{36} + \frac{5 t^{4}}{72} + \frac{43 t^{3}}{720} + \frac{t^{2}}{80} + \frac{t}{5040}\right) x^{7} + \left(\frac{t^{6}}{720} + \frac{t^{5}}{48} + \frac{13 t^{4}}{144} + \frac{t^{3}}{8} + \frac{31 t^{2}}{720} + \frac{t}{720}\right) x^{6} + \left(\frac{t^{5}}{120} + \frac{t^{4}}{12} + \frac{5 t^{3}}{24} + \frac{t^{2}}{8} + \frac{t}{120}\right) x^{5} + \left(\frac{t^{4}}{24} + \frac{t^{3}}{4} + \frac{7 t^{2}}{24} + \frac{t}{24}\right) x^{4} + \left(\frac{t^{3}}{6} + \frac{t^{2}}{2} + \frac{t}{6}\right) x^{3} + \left(\frac{t^{2}}{2} + \frac{t}{2}\right) x^{2} + t x + 1, x, domain=\mathbb{Q}\left[t\right] \right)}$
In [5]:
bb = bb.all_coeffs()[::-1]
bb
Out[5]:
[1,
 t,
 t**2/2 + t/2,
 t**3/6 + t**2/2 + t/6,
 t**4/24 + t**3/4 + 7*t**2/24 + t/24,
 t**5/120 + t**4/12 + 5*t**3/24 + t**2/8 + t/120,
 t**6/720 + t**5/48 + 13*t**4/144 + t**3/8 + 31*t**2/720 + t/720,
 t**7/5040 + t**6/240 + t**5/36 + 5*t**4/72 + 43*t**3/720 + t**2/80 + t/5040,
 t**8/40320 + t**7/1440 + 19*t**6/2880 + 5*t**5/192 + 27*t**4/640 + 23*t**3/960 + 127*t**2/40320 + t/40320,
 t**9/362880 + t**8/10080 + 11*t**7/8640 + 7*t**6/960 + 331*t**5/17280 + 37*t**4/1728 + 605*t**3/72576 + 17*t**2/24192 + t/362880]
In [6]:
bb = [bb[i]*factorial(i) for i in range(len(bb))]
bb
Out[6]:
[1,
 t,
 t**2 + t,
 t**3 + 3*t**2 + t,
 t**4 + 6*t**3 + 7*t**2 + t,
 t**5 + 10*t**4 + 25*t**3 + 15*t**2 + t,
 t**6 + 15*t**5 + 65*t**4 + 90*t**3 + 31*t**2 + t,
 t**7 + 21*t**6 + 140*t**5 + 350*t**4 + 301*t**3 + 63*t**2 + t,
 t**8 + 28*t**7 + 266*t**6 + 1050*t**5 + 1701*t**4 + 966*t**3 + 127*t**2 + t,
 t**9 + 36*t**8 + 462*t**7 + 2646*t**6 + 6951*t**5 + 7770*t**4 + 3025*t**3 + 255*t**2 + t]
In [7]:
# Stirling 2
def S(n,k):
    if k==n==0: return 1
    elif k>n or k<0: return 0
    else: return S(n-1,k-1)+k*S(n-1,k)
In [8]:
for n in  range(10):
    for k in range(n+1): 
        print (S(n,k), end=' ')
    print() 
1 
0 1 
0 1 1 
0 1 3 1 
0 1 7 6 1 
0 1 15 25 10 1 
0 1 31 90 65 15 1 
0 1 63 301 350 140 21 1 
0 1 127 966 1701 1050 266 28 1 
0 1 255 3025 7770 6951 2646 462 36 1 
In [9]:
G = (1+x)**t
gg = series(G,x,0,10).removeO().as_poly(x)
gg
Out[9]:
$\displaystyle \operatorname{Poly}{\left( \left(\frac{t^{9}}{362880} - \frac{t^{8}}{10080} + \frac{13 t^{7}}{8640} - \frac{t^{6}}{80} + \frac{1069 t^{5}}{17280} - \frac{89 t^{4}}{480} + \frac{29531 t^{3}}{90720} - \frac{761 t^{2}}{2520} + \frac{t}{9}\right) x^{9} + \left(\frac{t^{8}}{40320} - \frac{t^{7}}{1440} + \frac{23 t^{6}}{2880} - \frac{7 t^{5}}{144} + \frac{967 t^{4}}{5760} - \frac{469 t^{3}}{1440} + \frac{363 t^{2}}{1120} - \frac{t}{8}\right) x^{8} + \left(\frac{t^{7}}{5040} - \frac{t^{6}}{240} + \frac{5 t^{5}}{144} - \frac{7 t^{4}}{48} + \frac{29 t^{3}}{90} - \frac{7 t^{2}}{20} + \frac{t}{7}\right) x^{7} + \left(\frac{t^{6}}{720} - \frac{t^{5}}{48} + \frac{17 t^{4}}{144} - \frac{5 t^{3}}{16} + \frac{137 t^{2}}{360} - \frac{t}{6}\right) x^{6} + \left(\frac{t^{5}}{120} - \frac{t^{4}}{12} + \frac{7 t^{3}}{24} - \frac{5 t^{2}}{12} + \frac{t}{5}\right) x^{5} + \left(\frac{t^{4}}{24} - \frac{t^{3}}{4} + \frac{11 t^{2}}{24} - \frac{t}{4}\right) x^{4} + \left(\frac{t^{3}}{6} - \frac{t^{2}}{2} + \frac{t}{3}\right) x^{3} + \left(\frac{t^{2}}{2} - \frac{t}{2}\right) x^{2} + t x + 1, x, domain=\mathbb{Q}\left[t\right] \right)}$
In [10]:
gg = gg.all_coeffs()[::-1]
gg
Out[10]:
[1,
 t,
 t**2/2 - t/2,
 t**3/6 - t**2/2 + t/3,
 t**4/24 - t**3/4 + 11*t**2/24 - t/4,
 t**5/120 - t**4/12 + 7*t**3/24 - 5*t**2/12 + t/5,
 t**6/720 - t**5/48 + 17*t**4/144 - 5*t**3/16 + 137*t**2/360 - t/6,
 t**7/5040 - t**6/240 + 5*t**5/144 - 7*t**4/48 + 29*t**3/90 - 7*t**2/20 + t/7,
 t**8/40320 - t**7/1440 + 23*t**6/2880 - 7*t**5/144 + 967*t**4/5760 - 469*t**3/1440 + 363*t**2/1120 - t/8,
 t**9/362880 - t**8/10080 + 13*t**7/8640 - t**6/80 + 1069*t**5/17280 - 89*t**4/480 + 29531*t**3/90720 - 761*t**2/2520 + t/9]
In [12]:
gg = [gg[i]*factorial(i) for i in range(len(gg))]
gg
Out[12]:
[1,
 t,
 t**2 - t,
 t**3 - 3*t**2 + 2*t,
 t**4 - 6*t**3 + 11*t**2 - 6*t,
 t**5 - 10*t**4 + 35*t**3 - 50*t**2 + 24*t,
 t**6 - 15*t**5 + 85*t**4 - 225*t**3 + 274*t**2 - 120*t,
 t**7 - 21*t**6 + 175*t**5 - 735*t**4 + 1624*t**3 - 1764*t**2 + 720*t,
 t**8 - 28*t**7 + 322*t**6 - 1960*t**5 + 6769*t**4 - 13132*t**3 + 13068*t**2 - 5040*t,
 t**9 - 36*t**8 + 546*t**7 - 4536*t**6 + 22449*t**5 - 67284*t**4 + 118124*t**3 - 109584*t**2 + 40320*t]
In [13]:
# s(n,k)
for p in gg: print (p.as_poly(t).all_coeffs()[::-1])
[1]
[0, 1]
[0, -1, 1]
[0, 2, -3, 1]
[0, -6, 11, -6, 1]
[0, 24, -50, 35, -10, 1]
[0, -120, 274, -225, 85, -15, 1]
[0, 720, -1764, 1624, -735, 175, -21, 1]
[0, -5040, 13068, -13132, 6769, -1960, 322, -28, 1]
[0, 40320, -109584, 118124, -67284, 22449, -4536, 546, -36, 1]
In [14]:
# Stirling 1
def s(n,k):
    if k==n==0: return 1
    elif k>n or k<0: return 0
    else: return s(n-1,k-1)-(n-1)*s(n-1,k)
In [15]:
for n in  range(10):
    for k in range(n+1): 
        print (s(n,k), end=' ')
    print ()
1 
0 1 
0 -1 1 
0 2 -3 1 
0 -6 11 -6 1 
0 24 -50 35 -10 1 
0 -120 274 -225 85 -15 1 
0 720 -1764 1624 -735 175 -21 1 
0 -5040 13068 -13132 6769 -1960 322 -28 1 
0 40320 -109584 118124 -67284 22449 -4536 546 -36 1 

Calcul de sommes

On a vu que l'opération "intégrale discrète" $$\Sigma_a^b f(t)\delta t := \sum_{k=a}^{b-1} f(k)$$ était à l'opérateur de différence finie ce que l'intégrale ordinaire est à la dérivée : $$ \Sigma_a^b f(t)\delta t = F(b)-F(a)\ {\rm si}\ \Delta F(t):=F(t+1)-F(t)=f(t)$$ et aussi que $$\Sigma_0^n t^{\underline n} \delta t = \frac {t^{\underline{n+1}}}{n+1}$$

Sachant que $$t^n = \sum_{k=1}^n S(n,k) t^{\underline k}$$ on a donc $$S_p(n):=\sum_{k=0}^{n-1}k^p = \Sigma_0^n t^p\delta t = \Sigma_0^n \sum_{j=1}^p S(p,j)t^{\underline j}\delta t$$ $$ = \left.\sum_{j=1}^p S(p,j)\frac {t^{\underline{j+1} }}{j+1}\right|_{t=n}$$ et il ne reste plus qu'à redévelopper les $t^{\underline {j+1}}$ au moyen des nombres de Stirling de première espèce (ou plus brutalement, avec la fonction expand).

Utilisez vos nombres de Stirling pour donner l'expression des polynômes $S_p(t)$ pour $p$ de 1 à 8. Présentez les résultats sous forme factorisée.

In [18]:
from functools import reduce
def fallpow(n):
    return reduce(lambda u,v:u*v, [t-i for i in range(n)])

fallpow(4)
Out[18]:
$\displaystyle t \left(t - 3\right) \left(t - 2\right) \left(t - 1\right)$
In [19]:
def sumpow(p):
    return factor(sum([S(p,j)*fallpow(j+1)*Rational(1,j+1) for j in range(1,p+1)]))

Le résultat devra ressembler à ceci :

>>> for p in range(1,5): print (sumpow(p))

t*(t - 1)/2
t*(t - 1)*(2*t - 1)/6
t**2*(t - 1)**2/4
t*(t - 1)*(2*t - 1)*(3*t**2 - 3*t - 1)/30
In [20]:
for p in range(1,9): print (sumpow(p))
t*(t - 1)/2
t*(t - 1)*(2*t - 1)/6
t**2*(t - 1)**2/4
t*(t - 1)*(2*t - 1)*(3*t**2 - 3*t - 1)/30
t**2*(t - 1)**2*(2*t**2 - 2*t - 1)/12
t*(t - 1)*(2*t - 1)*(3*t**4 - 6*t**3 + 3*t + 1)/42
t**2*(t - 1)**2*(3*t**4 - 6*t**3 - t**2 + 4*t + 2)/24
t*(t - 1)*(2*t - 1)*(5*t**6 - 15*t**5 + 5*t**4 + 15*t**3 - t**2 - 9*t - 3)/90
In [21]:
# Un test
S4 = (t*(t - 1)*(2*t - 1)*(3*t**2 - 3*t - 1)/30).as_poly()
S4
Out[21]:
$\displaystyle \operatorname{Poly}{\left( \frac{1}{5} t^{5} - \frac{1}{2} t^{4} + \frac{1}{3} t^{3} - \frac{1}{30} t, t, domain=\mathbb{Q} \right)}$
In [22]:
# Un petit test pour voir

for n in range(1,10): 
    print (sum([k**4 for k in range(n)]), S4.eval(n))
0 0
1 1
17 17
98 98
354 354
979 979
2275 2275
4676 4676
8772 8772

Sommes de puissances et polynômes de Bernoulli

Les polynômes de Bernoulli sont définis par la série génératrice exponentielle (TD 4)

$$B(x,t)=\sum_{n\ge 0}B_n(t)\frac{x^n}{n!} = \frac{xe^{tx}}{e^x-1}$$

D'après le calcul vu en cours, on doit avoir $$S_p(n)=\frac{B_{p+1}(n)-B_{p+1}(0)}{p+1}\ \text{et aussi}\ S(x,n)=\sum_{p\ge 0}S_p(n)\frac{x^p}{p!}=\frac{e^{nx}-1}{e^x-1}.$$ Calculez les premiers polynômes de Bernoulli, recalculez les sommes $S_p(t)$ par cette méthode, et comparez à vos résultats précédents.

In [23]:
Be = x*exp(t*x)/(exp(x)-1)
be = series(Be,x,0,10).removeO().as_poly(x).all_coeffs()[::-1]
In [24]:
be = [be[i]*factorial(i) for i in range(len(be))]
be
Out[24]:
[1,
 t - 1/2,
 t**2 - t + 1/6,
 t**3 - 3*t**2/2 + t/2,
 t**4 - 2*t**3 + t**2 - 1/30,
 t**5 - 5*t**4/2 + 5*t**3/3 - t/6,
 t**6 - 3*t**5 + 5*t**4/2 - t**2/2 + 1/42,
 t**7 - 7*t**6/2 + 7*t**5/2 - 7*t**3/6 + t/6,
 t**8 - 4*t**7 + 14*t**6/3 - 7*t**4/3 + 2*t**2/3 - 1/30,
 t**9 - 9*t**8/2 + 6*t**7 - 21*t**5/5 + 2*t**3 - 3*t/10]
In [25]:
def sumpow2(p):
    return factor((be[p+1]-be[p+1].as_poly(t).eval(0))*Rational(1,p+1))
In [26]:
for i in range(8): print (sumpow2(i))
t
t*(t - 1)/2
t*(t - 1)*(2*t - 1)/6
t**2*(t - 1)**2/4
t*(t - 1)*(2*t - 1)*(3*t**2 - 3*t - 1)/30
t**2*(t - 1)**2*(2*t**2 - 2*t - 1)/12
t*(t - 1)*(2*t - 1)*(3*t**4 - 6*t**3 + 3*t + 1)/42
t**2*(t - 1)**2*(3*t**4 - 6*t**3 - t**2 + 4*t + 2)/24