Vous êtes sur la page 1sur 2

Une Solution au Probleme des Partitions par Recurrence

Senez Titus - ecole polytechnique - 2017

Probleme des partitions


On appelle nombre de partitions dun entier n le nombre decritures differentes
de cet entier comme une somme dentiers naturels differents de 0, et on le note
p(n)
Par exemple, le nombre de partitions de 4 est 5 car

4 = 4
= 1+1+1+1
= 1+1+2
= 2+2
= 1+3

Dans la suite, on ecrira toujours une partition dans lordre croissant des chiffres
qui la compose pour sassurer de lunicite de lecriture dune partition.

Methode pour trouver les partitions dun nombre


Pour explorer toutes les partitions dun nombre n, remarquons que lon peut
ecrire ce nombre sous la forme:

n = 0 + (n 0)
= 1 + (n 1)
= 2 + (n 2)
..
.
= bn/2c + (n bn/2c)

Cela constitue le debut du developpement de n en partitions. On ne developpe


que jusqua bn/2c car ensuite on retombe sur des developpements deja realises.
On peut refaire le meme developpement sur les valeurs n 1, n 2,..., et
ainsi de suite jusqua ce quon ne puisse plus pousser le developpement plus
loin. Ainsi on obtient toutes les partitions, mais si on procede ainsi on risque
dobtenir plusieurs fois les memes developpements, et den compter en trop. Il
faut alors ecrire un developpement comme on la dit, par ordre croissant des
chiffres composant le developpement.
Pour ce faire, on introduit p(n, k), qui est le nombre de partitions de n secrivant
avec des entiers superieurs ou egaux a k.
Ainsi, dapres la methode de developpement decrite au-dessus:

p(n, 1) = 1 + p(n 1, 1) + p(n 2, 2) + ... + p(n bn/2c, bn/2c)

Car dapres le developpement du debut du paragraphe, lorsque lon ecrit n =


k (n k), on redeveloppe ensuite n k avec des valeurs superieures ou egales

1
a k pour que le developpement de n reste croissant. De maniere plus generale:
bn/2c
X
p(n, k) = 1 + p(n p, p)
p=k

On a les conditions initiales :

n 1, f (n, n) = 1
k 1, f (1, k) = 1

Implementation en Python
def p(n,k):
if n == 1:
return 1
elif k == n:
return 1
else:
res = 1
for p in range(k,n//2 + 1):
res += f(n-p,p)
return res
On trouve ainsi p(n) fort du fait que p(n) = p(n, 1)

Vous aimerez peut-être aussi