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

.128013buS-[,3_4l(wn/8p)aPk0;:hors1v7c256mgyd]i9eft =+050M0Q0S0s0O0k0B0T0F0k0s0B0B0U010S0O0q010406050B0c0J0J0s0A0L040d0z0k0c0:0z0n050o0`0|0~100^0q04191g051j0o1j1l1g0^0M0O0D0(0*0,0.0y0O0K0y0k1z0y0S0?050Z0b0k0Q1u0+0-011y1A1C1A0S1I1K1G0S0b0z0M101H0A1h0S0y0(130B0q0s0n0.0G011M1w010R0#0Q0n0s0J0Q1G1.1:1^1O1{1K1~200?0a0T0t0A0z0q0z0B0O160n0T0X1,0A0A0Q0F2l19230n1h0o1*2y0S1(1%1)0M250.1C0n1}2i1G1r1t0)1N2I0O2K0n1!1s1G0q2r1h2w2y2$0_1/2m2Q1_2V0A0}0k0?0T0C2v2*0@2)242,1O2.2:2=0G2^1:2`2w2H012 0s2;040T0h332x0^362}0.393b0T0j3f352*373l2=0H3p3h3r3j380z2/3a2=0I3w2{2+1v2~3B303c0E3G3i3J3k3L3D3c0p3P3y3R3A3C3m0P3X2|3Z3t040C0v3(3I2R3!3M0C2@1a2_3x3)3;3+0C323_343{3:2-3T3b0C3e413g3H3s460?0C3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0M2F370F1!211h4z1k4x2(4v4E0X2#3Y3}0?200J0z3p0T4c3z0z0?0U4W4Y3*0b0?1r2t3p4(3;0=040l0r3w064q3z0u4+0Q0R4.3Q3;0m2=504Q2-0R0?0n0b0i0u0i0B0z0|0Q0B554k1O4;0l5k442~595p374;0g4%512-0?0u5t3z4;0r0x3w0T5I4X5y1O4|040O4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0z53042V0S5:5q5=5@2T5{3s4S0Q4U5-4:0?5G4p5J6a5S5;015N5P603z0n5!2$6c5|014!04020k0S0w6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0f5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0r0N6v3;6p4$6X6R0J0O0?3.696F6Y5M0?0Q1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0B0Q7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0e7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0V7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0S0c0A7+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*040A1:0K7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0Q2y2Zaf4y1s4A2B2D2z1Z1#2B0s1Jai0o4z0^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

.128013buS-[,3_4l(wn/8p)aPk0;:hors1v7c256mgyd]i9eft =+050M0Q0S0s0O0k0B0T0F0k0s0B0B0U010S0O0q010406050B0c0J0J0s0A0L040d0z0k0c0:0z0n050o0`0|0~100^0q04191g051j0o1j1l1g0^0M0O0D0(0*0,0.0y0O0K0y0k1z0y0S0?050Z0b0k0Q1u0+0-011y1A1C1A0S1I1K1G0S0b0z0M101H0A1h0S0y0(130B0q0s0n0.0G011M1w010R0#0Q0n0s0J0Q1G1.1:1^1O1{1K1~200?0a0T0t0A0z0q0z0B0O160n0T0X1,0A0A0Q0F2l19230n1h0o1*2y0S1(1%1)0M250.1C0n1}2i1G1r1t0)1N2I0O2K0n1!1s1G0q2r1h2w2y2$0_1/2m2Q1_2V0A0}0k0?0T0C2v2*0@2)242,1O2.2:2=0G2^1:2`2w2H012 0s2;040T0h332x0^362}0.393b0T0j3f352*373l2=0H3p3h3r3j380z2/3a2=0I3w2{2+1v2~3B303c0E3G3i3J3k3L3D3c0p3P3y3R3A3C3m0P3X2|3Z3t040C0v3(3I2R3!3M0C2@1a2_3x3)3;3+0C323_343{3:2-3T3b0C3e413g3H3s460?0C3o4a3q3|453#4f3v4i434d4m3,3F4i1i2!192O2B0M2F370F1!211h4z1k4x2(4v4E0X2#3Y3}0?200J0z3p0T4c3z0z0?0U4W4Y3*0b0?1r2t3p4(3;0=040l0r3w064q3z0u4+0Q0R4.3Q3;0m2=504Q2-0R0?0n0b0i0u0i0B0z0|0Q0B554k1O4;0l5k442~595p374;0g4%512-0?0u5t3z4;0r0x3w0T5I4X5y1O4|040O4 4i5K565m0?5o4v5L3k5s5X5T0.5v5x5$385A5C3Z5E5)5l0.0z53042V0S5:5q5=5@2T5{3s4S0Q4U5-4:0?5G4p5J6a5S5;015N5P603z0n5!2$6c5|014!04020k0S0w6h3*5,5#6d4;682$066b6E6m61044T4V6y6n4;0f5W2(5Y5+5^651_5(5R4/5z045B6L5u0?0r0N6v3;6p4$6X6R0J0O0?3.696F6Y5M0?0Q1C5Q6l6`5Z6!6+1_6-6.706:6=3,6U5U046B3`6F6b716S6J7c5%0?6O7m6S186$5D0?5w6/5*6j737t5.6(6*7x6d6-741O6;4f5H6_6R5N6}0B0Q7q6A7M7h5I7j7z7l7B66047p7#6Z7s6Q5*6W787y6x7,6z7D7I5=4#7^7r5b5d5f5h5j7)7d6P2_7Y6k2_6G4Z0?0e7{7K7b827n047w7/6d7z6#8k6n6p8c7F6n8e3^7=6M6(7{6p0V7{7z5a5c5e5g20818w6%4=7q8D8z8b8C7;856R7.88867A8K7u044@6^7X7O0?2r0S0c0A7+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*040A1:0K7S9h5n7q8u9T8d7a8v9+8p0?8B8s6H9.7j5E8$6C194N0Q2y2Zaf4y1s4A2B2D2z1Z1#2B0s1Jai0o4z0^av0Y0!0$04.