DS6-C copie
DS6-C copie
DS6-C copie
Question 1.
n o
a) À toute application f ∈ F (~1, n, {0, 1}) associons l’ensemble Af = k ∈ ~1, n f (k) = 1 . Alors l’application f 7→ Af
est l’application réciproque de A 7→ χA .
Xn
b) Par unicité de la décomposition d’un entier en base 2, l’application (b1 , . . . , bn ) 7−→ bk 2k−1 est une bijection de
n n
{0, 1} vers ~0, 2 − 1. k=1
Par ailleurs, il est clair que l’application f 7−→ f (1), . . . , f (n) est une bijection de F (~1, n, {0, 1}) vers {0, 1}n . On en
X n
déduit, car la composée de plusieurs bijections est encore une bijection, que l’application φ : A 7−→ χA(k)2k−1
k=1
réalise une bijection entre Pn et ~0, 2n − 1.
Question 2.
a) On définit la fonction :
b) On dispose de la relation : Pn = Pn−1 ∪ (n ⊕ Pn−1 ) (cette union étant disjointe). En effet, Pn−1 est l’ensemble des
parties de ~1, n qui ne contiennent pas n, et n ⊕ Pn−1 celles qui le contiennent. Par ailleurs, P0 = {∅} ; on en déduit
la fonction :
let rec parties1 = function
| 0 −> [[]]
| n −> let q = parties1 (n−1) in q @ (ajoute n q) ;;
Montrons par récurrence sur n que parties1 n retourne la liste des éléments de Pn rangés par ordre croissant.
– C’est clair si n = 0.
– Si n > 1, supposons le résultat acquis au rang n − 1. Par hypothèse de récurrence, q est rangé par ordre croissant.
Soit A ∈ Pn−1 . Puisque n < A on a φ(n ⊕ A) = 2n−1 + φ(A). De ceci il résulte que ajoute n q retourne une liste
d’ensembles rangés par ordre croissant. Or pour tout (A, B) ∈ Pn−1 × (n ⊕ Pn−1 ),
n−1
X
φ(A) 6 2k−1 = 2n − 1 < 2n 6 φ(B).
k=1
Ceci montre que q @ (ajoute n q) est encore rangé par ordre croissant.
Question 3.
a) On obtient successivement :
A1 = {4}, A2 = {3, 4}, A3 = {2, 3, 4}, A4 = {1, 2, 3, 4}, A5 = {1, 3, 4}, A6 = {2, 4}, A7 = {1, 2, 4},
A8 = {1, 4}, A9 = {3}, A10 = {2, 3}, A11 = {1, 2, 3}, A12 = {1, 3}, A13 = {2}, A14 = {1, 2},
A15 = {1}, A16 = ∅.
n o
b) Montrons par récurrence sur n ∈ N∗ que A1 , . . . , A2n sont définis, que A2n = ∅, et que Pn = Ap p ∈ ~1, 2n .
page 1
– C’est clair si n = 1 car alors A1 = {1}, A2 = ∅.
– Si n > 2, supposons le résultat acquis au rang n − 1. On a A1 = {n} et A2 = {n − 1, n} = A01 ∪ {n}, en notant
A01 = {n − 1}. Par hypothèse de récurrence, A01 , . . . , A02n−1 −1 sont définis, constituent les éléments de Pn−1 \ {∅}, et
A02n−1 −1 = {1}. On en déduit que A1 , . . . , A2n−1 sont définis, constituent les éléments de n ⊕ Pn−1 , et A2n−1 = {1, n}.
Mais alors A2n−1 +1 = {n − 1}, et en appliquant de nouveau l’hypothèse de récurrence, on en déduit que
A2n−1 +1 , . . . , A2n−1 +2n−1 sont définis, constituent les éléments de Pn−1 , et A2n = ∅.
Sachant que Pn−1 ∪ (n ⊕ Pn−1 ) = Pn , on peut conclure quant au résultat au rang n.
Question 4.
a) Il est naturel d’opérer par filtrage :
let parties2 n =
let rec aux = function
| [] −> [[]]
| a −> a::(aux (suivant a))
in aux [n] ;;
Question 5.
a) ci (σ) est le nombre d’entiers j strictement supérieurs à i qui apparaissent avant i dans la liste hσ(1), . . . , σ(n)i. Ainsi :
Question 6.
a) On obtient successivement : `5 = h5i, `4 = h5, 4i, `3 = h5, 3, 4i, `2 = h5, 3, 2, 4i, `1 = h5, 3, 2, 4, 1i.
b) Il est clair que `1 est une liste de longueur n formée des n premiers entiers naturels non nuls, donc représente une
permutation. Montrons pour tout k ∈ ~1, n que ck (`1 ) = γk .
– Si k = 1, on sait que `1 est de la forme ha1 , . . . , aγ1 , 1, aγ1 +1 , . . . , an−1 i, chaque ai étant supérieur ou égal à 2 (1 vient
d’être inséré après l’élément d’ordre γ1 ). On a donc bien c1 (`1 ) = γ1 .
– Si k > 1, la définition de ck montre que l’on peut supprimer de la liste `1 les entiers inférieurs strictement à
k sans modifier la valeur de ck (`1 ). Autrement dit, ck (`1 ) = ck (`k ), et cette dernière valeur, comme pour le cas
k = 1, vaut clairement γk .
Ainsi, c(`1 ) = (γ1 , . . . , γn ).
c) Nous venons de montrer que l’application d : γ 7→ `1 vérifie : c ◦ d = IdKn ; autrement dit, elle est injective. Sachant
que card Sn = n! = card Kn , il s’agit en fait d’une bijection, et c = d −1 .
page 2
Question 7.
a) On définit :
b) Nous allons utiliser une fonction auxiliaire aux k qui calcule la liste `k lorsque k ∈ ~1, n.
let genere c =
let n = vect_length c in
let rec aux = function
| k when k = n −> [n]
| k −> let l = aux (k+1) in insere k c.(k−1) l
in aux 1 ;;
On notera que ck est stocké dans la case c.(k−1) car les vecteurs sont indexés à partir de 0.
Question 8.
a) On peut bien entendu procéder par récurrence, ou bien faire un calcul direct par télescopage :
j
X j
X j
X
k.k! = (k + 1 − 1).k! = ((k + 1)! − k!) = (j + 1)! − 1.
k=0 k=0 k=0
b) Si p ∈ ~1, n!−1, il existe un unique entier j ∈ ~1, n−1 tel que j! 6 p 6 (j +1)!−1. Une condition nécessaire d’existence
de la décomposition est que dj+1 = · · · = dn = 0 car si l’une de ces valeurs est non nulle la somme dépasse (j + 1)!.
j−1
X
Par ailleurs, si une telle décomposition existe on a : p = dj j! + dk k!, et la question précédente montre que
j−1 k=1
p
X
06 dk k! 6 j! − 1. Ceci prouve que dj est le quotient de la division euclidienne de p par j!, soit dj = .
j!
k=1
c) Ce qui précède assure l’unicité d’une telle décomposition, à supposer qu’elle existe. Nous allons prouver son
existence en raisonnant par récurrence sur p.
– Si p = 0, on a clairement d1 = · · · = dn−1 = 0.
p
– Si p > 0, supposons le résultat acquis jusqu’au rang p − 1. Par hypothèse de récurrence, p − j! (l’entier j
j−1 j!
p
X
étant celui défini à la question précédente) admet une unique décomposition dk k!, et en posant dj = , on
j!
k=0
j
X (j + 1)!
obtient bien p = dk k! avec dj < = j + 1.
j!
k=1
Question 9.
a) On définit la fonction :
b) Pour tout j ∈ ~1, n, posons uj−1 = juj + d˜j−1 avec d˜j−1 ∈ ~0, j − 1 (autrement dit, d˜j−1 est le reste de la division
euclidienne de uj−1 par j). Il s’agit de prouver que d˜ = d.
n
X n−1
X
On a (j − 1)!uj−1 = j!uj + d˜j−1 (j − 1)! donc par télescopage u0 − n!un = d˜j−1 (j − 1)! = d˜k k!.
j=1 k=0
Sachant que u0 = p, il suffit de prouver que un = 0 et d’invoquer l’unicité de la décomposition établie à la question 8
pour en déduire que d˜ = d.
n! − 1 1
Or il est aisé d’établir par récurrence que 0 6 uj 6 , donc 0 6 un 6 1 − et s’agissant d’un entier, un = 0.
j! n!
page 3
On en déduit la fonction :
let lehmer n p =
let d = make_vect n 0 in
let u = ref p in
for j = 1 to n − 1 do
u := !u / j ;
d.(n−1−j) <− !u mod (j+1)
done ;
d ;;
Question 10. La question 8 établit une bijection entre un entier p ∈ ~0, n! − 1 et un n-uplet (dn−1 , dn−2 , . . . , d1 , d0 ) ∈ Kn .
Compte tenu de la question 6, l’application f : p 7−→ c−1 (dn−1 , . . . , d1 , d0 ) réalise une bijection entre ~0, n! − 1 et Sn .
Il s’agit donc d’énumérer les permutations f (0), f (1), . . . , f (n! − 1).
let permutations n =
let fact = factorielle n in
let rec aux = function
| p when p = fact −> []
| p −> let q = aux (p+1)
and t = genere (lehmer n p)
in t::q
in aux 0 ;;
page 4