• Aucun résultat trouvé

la suiteA000041, juste après la suiteA000040des nombres premiers.

2.2 Formule asymptotique

Le n-ième nombre de Fibonacci noté F(n), qui au passage à l’air proche de p(n) d’après la table ci-dessous,

n 1 2 3 4 5 6 7 8 9 10 ...

F(n) 1 1 2 3 5 8 13 21 34 55 ...

possède une formule close : la formule de Binet (). Il est bien connu1que : F(n) = ϕn−(1−ϕ)n nécessairement très efficaces telles quelles car en pratique les calculs faisant intervenir les irrationnels (comme le nombre d’Or ϕ) sont difficiles à représenter exactement en machine. Et donc les calculs sont vites entachés d’erreurs, même si dans le cas de la formule de Binet le premier chiffre après la virgule permet toujours de déterminerF(n) et queϕn−(1−ϕ)n est toujours un entier. Il n’empêche, une formule close est un bon point de départ pour la recherche d’un algorithme efficace.

Le nombre de partitions est très étudié en théorie des nombres. Par exemple, il a été montré enquep(120 052 058), qui possède 12 198 chiffres, était premier. Il est aussi connu que, pour toutx∈]0,1[ :

ce qui n’est malheureusement pas une formule close (même si elle est très jolie et tient sur une ligne) à cause des sommes et produits infinis. De plus il faut choisir correcte-mentx. Et puis c’est pas vraiment la somme infinieP+

n=0p(n) qui nous intéresse...

52 CHAPITRE 2. PARTITION D’UN ENTIER Il n’y a pas de formule close connue pour p(n). Donc, contrairement àF(n), l’espoir de pouvoir calculerp(n) à l’aide d’un nombre constant d’opérations arithmétiques est relativement faible. Il existe seulement des formules asymptotiques.

Hardy et Ramanujan [HR18] ont donné enl’asymptotique suivant : p(n) ∼ 1

Parenthèse.L’indien Srinivasa Ramanujan (-) est l’auteur de fractions continues stupéfiantes comme celle-ci, liant les nombrese,πetϕ :

e2π/5 Infinity) de Matt Brown. Depuis, il y existe même une machine qui porte son nom.

D’après un article de la prestigieuse revue Nature, elle permet de trouver automatiquement des conjectures à propos de constantes fondamentales commeπ,e,ϕet des fractions conti-nues [RGM+21].

Pour revenir à l’asymptotique(2.2), l’erreur relative n’est que de1.4%pourn= 1 000, les trois premiers chiffres dep(n)étant correctes à quelques unités près. Bien sûr, par défi-nition de l’asymptotique, cette erreur diminue plusn augmente. Siegel a donné une autre formule asymptotique, publiée par Knopp [Kno81], plus complexe mais qui converge plus efficacement vers la vraie valeur que celle de Hardy-Ramanujan :

p(n) ∼ 2

Intuitivement on retrouve la formule de Hardy-Ramanujan car le terme dans l’exponentielle

π 6

24n−1tends versπ

2n/3quandnaugmente. De même le coefficient du premier terme en1/ntends vers2

Lorsque f(n) ∼g(n) cela ne signifie pas que l’écart absolu entre f(n) et g(n) est de plus en plus petit quand n devient grand et donc que la courbe de g(n) devient une

2.2. FORMULE ASYMPTOTIQUE 53 asymptote de celle de f(n), mais que l’écart relatif tend vers 0. L’écart absolu est la quantité|f(n)−g(n)|alors que l’écart relatif est|(f(n)−g(n))/g(n)|=|f(n)/g(n)−1|.

Une fonction peut avoir plusieurs asymptotiques. Par exemplen2+n+1∼n2+n, mais on a aussin2+n+1∼n2. On pourrait dire ici que le premier asymptotiquen2+nconverge plus efficacement versn2+n+ 1 que le deuxième qui estn2. En effet, en comparant les écarts absolus on a

1 = (n2+n+ 1)−(n2+n) (n2+n+ 1)−n2=n+ 1.

Notez qu’ici on compare des écarts qui sont des fonctions de n. En toute généralité, il n’y a pas de raison, comme dans cet exemple, d’en avoir un qui est toujours mieux que l’autre. Il pourrait se passer qu’un est meilleur jusqu’à unn0et qu’ensuite cela s’inverse, voir que cela oscile.

L’idée de la notion d’asymptotique est de ne retenir que le terme principal, le plus grand lorsque n → +∞, afin de simplifier l’expression. On peut montrer que si f(n)∼g(n) alors f(n) =Θ(g(n)). Le contraire est faux, si l’on considère par exemple les fonctionsn2 et 2n2.

Une notion que l’on va croiser, et qui est reliée à celle d’asymptotique, est celle-ci.

On dit que «f(n) est en petit-odeg(n) », et on le notef(n) =o(g(n)), si

Comme le montrent les exemples précédents, une fonction comme p(n) peut avoir plusieurs équivalents asymptotiques. En fait, pour ce chapitre, peu importe la finesse des asymptotiques sur p(n). On retiendra surtout que p(n) est exponentielle en

n, ce qui peut s’écrire :

p(n) = 2Θ(

n) . Parenthèse.Mais pourquoi peut-on écrire quep(n) = 2Θ(

n)? Tout d’abord (et par défini-tion), parce quep(n) = 2O(

n)etp(n) = 2Ω(

n). Ensuite, pour toute constantec ec On a également pour toutes constantesa, b, c

a·nb·ec

54 CHAPITRE 2. PARTITION D’UN ENTIER En combinant l’asymptotiquep(n)a·nbec

nde la formule d’Hardy-Ramanujan, avec les constancesa= 1/(4

Essayons la recherche exhaustive pour calculer p(n). Le plus simple est de générer toutes les partitions puis de les compter. Comme pour Tchisla au paragraphe 1.3, il faut un moyen de représenter une partition via un codage. Cela va permettre de lister les partitions en générant tous les codes possibles.

Pour partitionner un ensemble de billes, disons supposées alignées, on peut décou-per cet alignement en intervalles, en insérant (ou pas) une séparation entre deux billes consécutives. Par exemple, la partition 7 = 3 + 2 + 1 + 1 = pourrait être représentée par le découpage - - | - | | , utilisant les symboles « | » ou « - » pour signaler une séparation ou une non-séparation entre deux billes. En oubliant les billes et en ne gardant que les symboles de séparation/non-séparation, on peut coder le dé-coupage par un mot binaire den−1 bits, car chacune des billes sauf la dernière est suivi d’un des deux symboles.

3 + 2 + 1 + 1 - - | - | | 0 0 1 0 1 1

Lister tous les découpages possibles pour unndonné revient donc à énumérer tous les mots binaires de n−1 bits, ce qu’on peut facilement réaliser grâce à l’algorithme d’incrémentation vu page15. Chaque mot binaire doit cependant être testé afin de dé-terminer s’il représente une nouvelle partition. En effet, plusieurs découpages peuvent correspondent à la même partition. Par exemple, 001011 (= 3 + 2 + 1 + 1) et 110010 (= 1 + 1 + 3 + 2) représentent la même partition den= 7.

On peut extraire les parts correspondantes d’un découpage codé par un mot binaire B en découpant le mot B1 (B suivi d’un dernier 1 fictif) devant chacun de ses 1. Par exemple, pourn= 10 etB1 = 001,01,0001,1, on obtient les parts 3,2,4,1, soit la parti-tion 10 = 4 + 3 + 2 + 1. Trier les parts par ordre décroissant revient à considérer le plus grand code d’une partition. Cela donne un moyen assez simple de détecter si le code d’une partition est le plus grand (en vérifiant que ses parts sont dans l’ordre décrois-sant) et de le comptabiliser le cas échéant.

[Exercice. Ecrire enCune fonctionbool is_partition(int n,int B[])renvoyanttrue si et seulement si un découpage, codé par un tableauB[]de0,1, représente une partition de n (ordre décroissant des parts). On pourra supposer B[] de taille suffisante pour y insérer un1terminal.]

2.4. RÉCURRENCE 55