TD : Entiers - dénombrement

Exercice 1

> sum(k^2,k=1..n);

1/3*(n+1)^3-1/2*(n+1)^2+1/6*n+1/6

> factor(");

1/6*n*(n+1)*(2*n+1)

> sum(k^3,k=1..n);

1/4*(n+1)^4-1/2*(n+1)^3+1/4*(n+1)^2

> factor(");

1/4*n^2*(n+1)^2

Exercices 2 et 3

> seq(3^(2*n+1)+2^(n+2) mod 7,n=0..30);

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...

> seq(2^(2*n)+15*n-1 mod 9,n=0..30);

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...

Exercice 4

> sum(sum(i*j,j=i..n),i=1..n);

1/4*n^2*(n+1)^2-1/4*n^2*(n+1)+1/4*n*(n+1)^2-1/4*n*(...
1/4*n^2*(n+1)^2-1/4*n^2*(n+1)+1/4*n*(n+1)^2-1/4*n*(...

> factor(");

1/24*n*(3*n+1)*(n+2)*(n+1)

> sum(sum((i+j)^2,j=i..n),i=1..n);

-1/6*n*(n+1)+1/3*n+1/2+1/3*(n+1)*n^3+1/2*n^2*(n+1)^...
-1/6*n*(n+1)+1/3*n+1/2+1/3*(n+1)*n^3+1/2*n^2*(n+1)^...

> factor(");

1/12*n*(n+1)*(7*n^2+13*n+4)

Exercice 6

> irem(1789,10),iquo(1789,10);

9, 178

> phi:=n->if n<=9 then n else irem(n,10)+phi(iquo(n,10)) fi;

phi := proc (n) options operator, arrow; if n <= 9 ...
phi := proc (n) options operator, arrow; if n <= 9 ...
phi := proc (n) options operator, arrow; if n <= 9 ...
phi := proc (n) options operator, arrow; if n <= 9 ...

> phi(1515);

12

> N:=4444^4444:

> evalf(ln(N)/ln(10));

16210.70788

La représentation décimale de N possède donc 16211 chiffres...

> phi(N);

Error, (in phi) too many levels of recursion

Pas très surprenant : on va la refaire en itératif...

> phi2:=proc(n)
local reste,compt;
reste:=n;
compt:=0;
while reste>0 do
compt:=compt+irem(reste,10);
reste:=iquo(reste,10) od;
RETURN(compt+reste)
end:

> phi2(1515);

12

> phi2(N);

72601

> phi2(");

16

> phi2(");

7

Exercice 9

> ni:=product(365-i,i=0..44);

ni := 118633755334056743264506284899679945484529619...
ni := 118633755334056743264506284899679945484529619...

> evalf(ni/365^45);

.5902410053e-1

> 1-";

.9409758995

C'est la probabilité pour qu'au moins deux personnes parmi 45 aient même date anniversaire...

> limit((n^2)!/(n^2-2*n)!/(n^2)^(2*n),n=infinity);

exp(-2)

> evalf(");

.1353352832

> limit((n^2)!/(n^2-3*n)!/(n^2)^(3*n),n=infinity);

exp(-9/2)

> evalf(");

.1110899654e-1

Permutations : exercices 11 et 14

Générons l'ensemble des permutations

> insere:=(l,it,pos)->[seq(l[j],j=1..pos-1),it,seq(l[j],j=pos..nops(l))];

Warning, `j` in call to `seq` is not local

Warning, `j` in call to `seq` is not local

insere := proc (l, it, pos) options operator, arrow...

> insere([12,3,5],2,1);

[2, 12, 3, 5]

> insere([12,3,5],2,2);

[12, 2, 3, 5]

> insere([12,3,5],2,3);

[12, 3, 2, 5]

> insere([12,3,5],2,4);

[12, 3, 5, 2]

> permut:=proc(n)
local prec,res;
if n=1 then RETURN([[1]]) fi;
prec:=permut(n-1);
res:=NULL;
for k from n to 1 by -1 do
for l from 1 to (n-1)! do res:=res,insere(prec[l],n,k) od od;
RETURN([res])
end;

Warning, `k` is implicitly declared local

Warning, `l` is implicitly declared local

permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...
permut := proc (n) local prec, res, k, l; if n = 1 ...

> permut(4);

[[1, 2, 3, 4], [2, 1, 3, 4], [1, 3, 2, 4], [2, 3, 1...
[[1, 2, 3, 4], [2, 1, 3, 4], [1, 3, 2, 4], [2, 3, 1...
[[1, 2, 3, 4], [2, 1, 3, 4], [1, 3, 2, 4], [2, 3, 1...
[[1, 2, 3, 4], [2, 1, 3, 4], [1, 3, 2, 4], [2, 3, 1...

> nops(");

24

Nombre moyen de points fixes (exo 14)

> points_fixes:=proc(l)
local k,r;
r:=0;
for k from 1 to nops(l) do if l[k]=k then r:=r+1 fi od;
RETURN(r);
end;

points_fixes := proc (l) local k, r; r := 0; for k ...
points_fixes := proc (l) local k, r; r := 0; for k ...
points_fixes := proc (l) local k, r; r := 0; for k ...
points_fixes := proc (l) local k, r; r := 0; for k ...

> points_fixes([2,1,3,4]);

2

> total_points_fixes:=proc(n)
local l,r;
l:=permut(n);
r:=0;
for k from 1 to n! do r:=r+points_fixes(l[k]) od;
RETURN(r)
end;

Warning, `k` is implicitly declared local

total_points_fixes := proc (n) local l, r, k; l := ...
total_points_fixes := proc (n) local l, r, k; l := ...
total_points_fixes := proc (n) local l, r, k; l := ...
total_points_fixes := proc (n) local l, r, k; l := ...
total_points_fixes := proc (n) local l, r, k; l := ...
total_points_fixes := proc (n) local l, r, k; l := ...
total_points_fixes := proc (n) local l, r, k; l := ...

> total_points_fixes(5);

120

> seq(total_points_fixes(n),n=1..7);

1, 2, 6, 24, 120, 720, 5040

> seq(k!,k=0..7);

1, 1, 2, 6, 24, 120, 720, 5040

Nombre moyen de dérangements (exo 11)

> nb_derangements:=proc(n)
local l,r;
l:=permut(n);
r:=0;
for k from 1 to n! do if points_fixes(l[k])=0 then r:=r+1 fi od;
RETURN(r)
end;

Warning, `k` is implicitly declared local

nb_derangements := proc (n) local l, r, k; l := per...
nb_derangements := proc (n) local l, r, k; l := per...
nb_derangements := proc (n) local l, r, k; l := per...
nb_derangements := proc (n) local l, r, k; l := per...
nb_derangements := proc (n) local l, r, k; l := per...
nb_derangements := proc (n) local l, r, k; l := per...
nb_derangements := proc (n) local l, r, k; l := per...

> nb_derangements(5);

44

> seq(nb_derangements(i)/i!,i=1..7);

0, 1/2, 1/3, 3/8, 11/30, 53/144, 103/280

> evalf(");

0, .5000000000, .3333333333, .3750000000, .36666666...
0, .5000000000, .3333333333, .3750000000, .36666666...

> evalf(exp(-1));

.3678794412

Exercice 15

> sum((-1)^k*binomial(n,k),k=0..n);

0

> sum(k*binomial(n,k),k=0..n);

1/2*2^n*n

> sum((-1)^(k+1)*k*binomial(n,k),k=0..n);

0

> sum(k*(k-1)*binomial(n,k),k=0..n);

1/4*2^n*n*(n-1)

Exercice 16

> sum(k^2*binomial(n,k),k=0..n);

1/2*2^n*n+1/4*2^n*n*(n-1)

> factor(");

1/4*n*2^n*(n+1)

Exercice 17

> sum(binomial(p+i,p),i=0..k);

(k+1)/(p+1)*binomial(p+k+1,p)

> convert(",GAMMA);

(k+1)/(p+1)*GAMMA(p+k+2)/GAMMA(p+1)/GAMMA(k+2)

> convert(binomial(p+k+1,p+1),GAMMA);

GAMMA(p+k+2)/GAMMA(p+2)/GAMMA(k+1)

> simplify("-"");

0

Il s'agit d'une suite "hyper-géométrique" : on dispose d'algorithmes pour "calculer" de telles sommes.

Cela dit, pour le 18, je n'ai pas réussi à m'en sortir.

Exercice 19

> Q:=n->add((-1)^k*binomial(2^n-k,k),k=0..2^n):

Warning, `k` in call to `add` is not local

> seq(Q(n),n=0..10);

1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1

> R:=p->add((-1)^k*binomial(p-k,k),k=0..p):

Warning, `k` in call to `add` is not local

> seq(R(p),p=0..30);

1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, 1, 0, -1...