Nombre de partitions d'un entier

On considère qu'une somme doit comporter au moins un terme et que l'ordre des termes ne compte pas. Ainsi :

  • il y a \(3\) façons d'écrire \(3\) comme une somme :

    • \(3 = 3\),
    • \(3 = 2 + 1\) ;
    • \(3 = 1 + 1 + 1\) ;
  • il y a \(7\) façons d'écrire \(5\) comme une somme :

    • \(5 = 5\) ;
    • \(5 = 4 + 1\) ;
    • \(5 = 3 + 2\) ;
    • \(5 = 3 + 1 + 1\) ;
    • \(5 = 2 + 2 + 1\) ;
    • \(5 = 2 + 1 + 1 + 1\) ;
    • \(5 = 1 + 1 + 1 + 1 + 1\).

Écrire une fonction nb_sommes qui prend un paramètre entier 0 < n <= 42 et qui renvoie le nombre de façons d'écrire n comme une somme, sans compter l'ordre.

Exemples
>>> nb_sommes(3)
3
>>> nb_sommes(5)
7
Indice 1
  • Toujours commencer par dénombrer à la main les premiers cas.

  • Bien ranger les cas ; faire des figures.

Indice 2

Il est recommandé de construire une fonction auxiliaire nb_k_sommes qui prend en paramètres deux entiers n et k et renvoie le nombre de façons d'écrire n comme une somme de k termes.

Ainsi, nb_sommes(n) sera la somme pour k allant de 1 à n de nb_k_sommes(n, k).

On remarquera que :

  • n < k ne donne aucune somme ;
  • k == 1 donne une unique somme.
Indice 3

Pour dénombrer nb_k_sommes(n, k), on fera deux cas :

  • Les sommes dont le plus petit terme est 1. Combien ont-elles de termes restants et pour quelle somme ? Un calcul récursif est alors possible...

  • Les sommes dont tous les termes sont supérieurs à 1. On pourra enlever 1 à chaque terme, ce qui donne une somme égale à ??? en ??? parties. Et réciproquement. Ce qui permet de dénombrer ce cas de manière récursive également.

Par exemple, parmi les sommes de \(10\) termes égales à \(50\), il y a :

  • des sommes de \(9\) termes valant toutes \(49\) auxquelles on ajoute \(1\) ;
  • des sommes de \(10\) termes valant toutes \(40\) auxquelles on ajoute \(10\) fois \(1\).

On en déduit : nb_k_sommes(50, 10) = nb_k_sommes(49, 9) + nb_k_sommes(40, 10).

Indice 4

Il faudra utiliser de la mémoïsation pour que le code soit assez rapide.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013,n w-5e9(]38m=0p)rhk[uois;cb/6S1vt_dg:ay24P+fl7050K0h0I0N0y0U0z0d0B0U0N0z0z0o010I0y0q010406050z0w0n0n0N0s0O040F0x0U0w0:0x0c050D0`0|0~100^0q04191g051j0D1j1l1g0^0K0y0H0(0*0,0.0t0y0L0t0U1z0t0I0?050Z0C0U0h1u0+0-011y1A1C1A0I1I1K1G0I0C0x0K101H0s1h0I0t0(130z0q0N0c0.0P011M1w010T0#0h0c0N0n0h1G1.1:1^1O1{1K1~200?0a0d0R0s0x0q0x0z0y160c0d0X1,0s0s0h0B2l19230c1h0D1*2y0I1(1%1)0K250.1C0c1}2i1G1r1t0)1N2I0y2K0c1!1s1G0q2r1h2w2y2$0_1/2m2Q1_2V0s0}0U0?0d0G2v2*0@2)242,1O2.2:2=0P2^1:2`2w2H012 0N2;040d0l332x0^362}0.393b0d0Q3f352*373l2=0g3p3h3r3j380x2/3a2=0E3w2{2+1v2~3B303c0V3G3i3J3k3L3D3c0m3P3y3R3A3C3m0i3X2|3Z3t040G0p3(3I2R3!3M0G2@1a2_3x3)3;3+0G323_343{3:2-3T3b0G3e413g3H3s460?0G3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0K2F370B1!211h4z1k4x2(4v4E0X2#3Y3}0?200n0x3p0d4c3z0x0?0o4W4Y3*0C0?1r2t3p4(3;0=040j0r3w064q3z0u4+0h0T4.3Q3;0e2=504Q2-0T0?0c0C0J0u0J0z0x0|0h0z554k1O4;0j5k442~595p374;0b4%512-0?0u5t3z4;0r0M3w0d5I4X5y1O4|040y4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0x53042V0I5:5q5=5@2T5{3s4S0h4U5-4:0?5G4p5J6a5S5;015N5P603z0c5!2$6c5|014!04020U0I0A6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0v5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0r0k6v3;6p4$6X6R0n0y0?3.696F6Y5M0?0h1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0z0h7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0f7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0S7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0I0w0s7+8W6R7Z636K8Z7C7%84348X8/8|8U7v8R8Y8T7-7@4p4_7j5N0X6 946d5@4X8g38585^5b7 8I7T5V8N878 958#7f426a998*0Y8-8~2x894)0?1b9o8M9h8D7}8G809I8{2x8}9I8j8:7:939s7?8#7{5N0T3B928n9V7G5~9C3c7Y4*040s1:0L7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0h2y2Zaf4y1s4A2B2D2z1Z1#2B0N1Jai0D4z0^av0Y0!0$04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013,n w-5e9(]38m=0p)rhk[uois;cb/6S1vt_dg:ay24P+fl7050K0h0I0N0y0U0z0d0B0U0N0z0z0o010I0y0q010406050z0w0n0n0N0s0O040F0x0U0w0:0x0c050D0`0|0~100^0q04191g051j0D1j1l1g0^0K0y0H0(0*0,0.0t0y0L0t0U1z0t0I0?050Z0C0U0h1u0+0-011y1A1C1A0I1I1K1G0I0C0x0K101H0s1h0I0t0(130z0q0N0c0.0P011M1w010T0#0h0c0N0n0h1G1.1:1^1O1{1K1~200?0a0d0R0s0x0q0x0z0y160c0d0X1,0s0s0h0B2l19230c1h0D1*2y0I1(1%1)0K250.1C0c1}2i1G1r1t0)1N2I0y2K0c1!1s1G0q2r1h2w2y2$0_1/2m2Q1_2V0s0}0U0?0d0G2v2*0@2)242,1O2.2:2=0P2^1:2`2w2H012 0N2;040d0l332x0^362}0.393b0d0Q3f352*373l2=0g3p3h3r3j380x2/3a2=0E3w2{2+1v2~3B303c0V3G3i3J3k3L3D3c0m3P3y3R3A3C3m0i3X2|3Z3t040G0p3(3I2R3!3M0G2@1a2_3x3)3;3+0G323_343{3:2-3T3b0G3e413g3H3s460?0G3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0K2F370B1!211h4z1k4x2(4v4E0X2#3Y3}0?200n0x3p0d4c3z0x0?0o4W4Y3*0C0?1r2t3p4(3;0=040j0r3w064q3z0u4+0h0T4.3Q3;0e2=504Q2-0T0?0c0C0J0u0J0z0x0|0h0z554k1O4;0j5k442~595p374;0b4%512-0?0u5t3z4;0r0M3w0d5I4X5y1O4|040y4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0x53042V0I5:5q5=5@2T5{3s4S0h4U5-4:0?5G4p5J6a5S5;015N5P603z0c5!2$6c5|014!04020U0I0A6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0v5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0r0k6v3;6p4$6X6R0n0y0?3.696F6Y5M0?0h1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0z0h7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0f7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0S7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0I0w0s7+8W6R7Z636K8Z7C7%84348X8/8|8U7v8R8Y8T7-7@4p4_7j5N0X6 946d5@4X8g38585^5b7 8I7T5V8N878 958#7f426a998*0Y8-8~2x894)0?1b9o8M9h8D7}8G809I8{2x8}9I8j8:7:939s7?8#7{5N0T3B928n9V7G5~9C3c7Y4*040s1:0L7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0h2y2Zaf4y1s4A2B2D2z1Z1#2B0N1Jai0D4z0^av0Y0!0$04.