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

.12801342ny6g3p )rPv1-=;oa_ckmiu5(,e:ts]Shl970w[bf8+/d050V0D0F0t0y0K0G0j0v0K0t0G0G0q010F0y0i010406050G0z0x0x0t0l0e040I0s0K0z0:0s0d050U0`0|0~100^0i04191g051j0U1j1l1g0^0V0y0n0(0*0,0.0J0y0g0J0K1z0J0F0?050Z0Q0K0D1u0+0-011y1A1C1A0F1I1K1G0F0Q0s0V101H0l1h0F0J0(130G0i0t0d0.0c011M1w010R0#0D0d0t0x0D1G1.1:1^1O1{1K1~200?0a0j0m0l0s0i0s0G0y160d0j0X1,0l0l0D0v2l19230d1h0U1*2y0F1(1%1)0V250.1C0d1}2i1G1r1t0)1N2I0y2K0d1!1s1G0i2r1h2w2y2$0_1/2m2Q1_2V0l0}0K0?0j0o2v2*0@2)242,1O2.2:2=0c2^1:2`2w2H012 0t2;040j0h332x0^362}0.393b0j0b3f352*373l2=0A3p3h3r3j380s2/3a2=0f3w2{2+1v2~3B303c0M3G3i3J3k3L3D3c0S3P3y3R3A3C3m0L3X2|3Z3t040o0N3(3I2R3!3M0o2@1a2_3x3)3;3+0o323_343{3:2-3T3b0o3e413g3H3s460?0o3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0V2F370v1!211h4z1k4x2(4v4E0X2#3Y3}0?200x0s3p0j4c3z0s0?0q4W4Y3*0Q0?1r2t3p4(3;0=040B0k3w064q3z0w4+0D0R4.3Q3;0O2=504Q2-0R0?0d0Q0u0w0u0G0s0|0D0G554k1O4;0B5k442~595p374;0C4%512-0?0w5t3z4;0k0E3w0j5I4X5y1O4|040y4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0s53042V0F5:5q5=5@2T5{3s4S0D4U5-4:0?5G4p5J6a5S5;015N5P603z0d5!2$6c5|014!04020K0F0r6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0P5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0k0H6v3;6p4$6X6R0x0y0?3.696F6Y5M0?0D1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0G0D7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0p7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0T7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0F0z0l7+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{5N0R3B928n9V7G5~9C3c7Y4*040l1:0g7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0D2y2Zaf4y1s4A2B2D2z1Z1#2B0t1Jai0U4z0^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

.12801342ny6g3p )rPv1-=;oa_ckmiu5(,e:ts]Shl970w[bf8+/d050V0D0F0t0y0K0G0j0v0K0t0G0G0q010F0y0i010406050G0z0x0x0t0l0e040I0s0K0z0:0s0d050U0`0|0~100^0i04191g051j0U1j1l1g0^0V0y0n0(0*0,0.0J0y0g0J0K1z0J0F0?050Z0Q0K0D1u0+0-011y1A1C1A0F1I1K1G0F0Q0s0V101H0l1h0F0J0(130G0i0t0d0.0c011M1w010R0#0D0d0t0x0D1G1.1:1^1O1{1K1~200?0a0j0m0l0s0i0s0G0y160d0j0X1,0l0l0D0v2l19230d1h0U1*2y0F1(1%1)0V250.1C0d1}2i1G1r1t0)1N2I0y2K0d1!1s1G0i2r1h2w2y2$0_1/2m2Q1_2V0l0}0K0?0j0o2v2*0@2)242,1O2.2:2=0c2^1:2`2w2H012 0t2;040j0h332x0^362}0.393b0j0b3f352*373l2=0A3p3h3r3j380s2/3a2=0f3w2{2+1v2~3B303c0M3G3i3J3k3L3D3c0S3P3y3R3A3C3m0L3X2|3Z3t040o0N3(3I2R3!3M0o2@1a2_3x3)3;3+0o323_343{3:2-3T3b0o3e413g3H3s460?0o3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0V2F370v1!211h4z1k4x2(4v4E0X2#3Y3}0?200x0s3p0j4c3z0s0?0q4W4Y3*0Q0?1r2t3p4(3;0=040B0k3w064q3z0w4+0D0R4.3Q3;0O2=504Q2-0R0?0d0Q0u0w0u0G0s0|0D0G554k1O4;0B5k442~595p374;0C4%512-0?0w5t3z4;0k0E3w0j5I4X5y1O4|040y4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0s53042V0F5:5q5=5@2T5{3s4S0D4U5-4:0?5G4p5J6a5S5;015N5P603z0d5!2$6c5|014!04020K0F0r6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0P5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0k0H6v3;6p4$6X6R0x0y0?3.696F6Y5M0?0D1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0G0D7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0p7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0T7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0F0z0l7+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{5N0R3B928n9V7G5~9C3c7Y4*040l1:0g7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0D2y2Zaf4y1s4A2B2D2z1Z1#2B0t1Jai0U4z0^av0Y0!0$04.