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

.128013ur6km c;piy/72tP)=lh0sebwS_53(-av,1:[n84dg+9]of050P0x0p0G0k0t0w0g0h0t0G0w0w0s010p0k0j010406050w0b0f0f0G0c0l040A0U0t0b0:0U0M050m0`0|0~100^0j04191g051j0m1j1l1g0^0P0k0H0(0*0,0.0u0k0Q0u0t1z0u0p0?050Z0y0t0x1u0+0-011y1A1C1A0p1I1K1G0p0y0U0P101H0c1h0p0u0(130w0j0G0M0.0o011M1w010V0#0x0M0G0f0x1G1.1:1^1O1{1K1~200?0a0g0q0c0U0j0U0w0k160M0g0X1,0c0c0x0h2l19230M1h0m1*2y0p1(1%1)0P250.1C0M1}2i1G1r1t0)1N2I0k2K0M1!1s1G0j2r1h2w2y2$0_1/2m2Q1_2V0c0}0t0?0g0J2v2*0@2)242,1O2.2:2=0o2^1:2`2w2H012 0G2;040g0D332x0^362}0.393b0g0O3f352*373l2=0C3p3h3r3j380U2/3a2=0d3w2{2+1v2~3B303c0n3G3i3J3k3L3D3c0N3P3y3R3A3C3m0S3X2|3Z3t040J0v3(3I2R3!3M0J2@1a2_3x3)3;3+0J323_343{3:2-3T3b0J3e413g3H3s460?0J3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0P2F370h1!211h4z1k4x2(4v4E0X2#3Y3}0?200f0U3p0g4c3z0U0?0s4W4Y3*0y0?1r2t3p4(3;0=040E0r3w064q3z0e4+0x0V4.3Q3;0z2=504Q2-0V0?0M0y0B0e0B0w0U0|0x0w554k1O4;0E5k442~595p374;0I4%512-0?0e5t3z4;0r0K3w0g5I4X5y1O4|040k4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0U53042V0p5:5q5=5@2T5{3s4S0x4U5-4:0?5G4p5J6a5S5;015N5P603z0M5!2$6c5|014!04020t0p0i6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0L5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0r0T6v3;6p4$6X6R0f0k0?3.696F6Y5M0?0x1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0w0x7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0F7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0R7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0p0b0c7+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{5N0V3B928n9V7G5~9C3c7Y4*040c1:0Q7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0x2y2Zaf4y1s4A2B2D2z1Z1#2B0G1Jai0m4z0^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

.128013ur6km c;piy/72tP)=lh0sebwS_53(-av,1:[n84dg+9]of050P0x0p0G0k0t0w0g0h0t0G0w0w0s010p0k0j010406050w0b0f0f0G0c0l040A0U0t0b0:0U0M050m0`0|0~100^0j04191g051j0m1j1l1g0^0P0k0H0(0*0,0.0u0k0Q0u0t1z0u0p0?050Z0y0t0x1u0+0-011y1A1C1A0p1I1K1G0p0y0U0P101H0c1h0p0u0(130w0j0G0M0.0o011M1w010V0#0x0M0G0f0x1G1.1:1^1O1{1K1~200?0a0g0q0c0U0j0U0w0k160M0g0X1,0c0c0x0h2l19230M1h0m1*2y0p1(1%1)0P250.1C0M1}2i1G1r1t0)1N2I0k2K0M1!1s1G0j2r1h2w2y2$0_1/2m2Q1_2V0c0}0t0?0g0J2v2*0@2)242,1O2.2:2=0o2^1:2`2w2H012 0G2;040g0D332x0^362}0.393b0g0O3f352*373l2=0C3p3h3r3j380U2/3a2=0d3w2{2+1v2~3B303c0n3G3i3J3k3L3D3c0N3P3y3R3A3C3m0S3X2|3Z3t040J0v3(3I2R3!3M0J2@1a2_3x3)3;3+0J323_343{3:2-3T3b0J3e413g3H3s460?0J3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0P2F370h1!211h4z1k4x2(4v4E0X2#3Y3}0?200f0U3p0g4c3z0U0?0s4W4Y3*0y0?1r2t3p4(3;0=040E0r3w064q3z0e4+0x0V4.3Q3;0z2=504Q2-0V0?0M0y0B0e0B0w0U0|0x0w554k1O4;0E5k442~595p374;0I4%512-0?0e5t3z4;0r0K3w0g5I4X5y1O4|040k4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0U53042V0p5:5q5=5@2T5{3s4S0x4U5-4:0?5G4p5J6a5S5;015N5P603z0M5!2$6c5|014!04020t0p0i6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0L5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0r0T6v3;6p4$6X6R0f0k0?3.696F6Y5M0?0x1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0w0x7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0F7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0R7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0p0b0c7+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{5N0V3B928n9V7G5~9C3c7Y4*040c1:0Q7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0x2y2Zaf4y1s4A2B2D2z1Z1#2B0G1Jai0m4z0^av0Y0!0$04.