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 : 5/5

.12801356/dmsyaoP[(nk,bg+p3v4;cu_wh)8r]:tl =i7S1-9fe02050e0T0I0i0M0J0g0K0y0J0i0g0g0L010I0M0t010406050g0z0f0f0i0F0h040O0j0J0z0:0j0n050d0`0|0~100^0t04051g191j0d1g0^0e0M0v0(0*0,0.0C0M0r0C0J1x0C0I0?050Z0q0J0T1s0+0-011w1y1A1y0I1G1I1E0I0F1h0I0C0(130g0t0i0n0.0V011K1u010S0#0T0n0i0f0T1E1%1)1.1M1;1I1@1_0?0a0K0k0F0j0t0j0g0M160n0K0X1#0F0F0T0y2e191|0n1h0d1Z2r1W1Y1X1F0e1~0.1A0n1?2b1E1p1r0)1L2B0M2D0n0j2H1E0t2k1h2p2r2V0_1(2f2J1/2O0F0}0J0?0K0P2o2Z0@2Y1}2#1M2%2)2+0V2.1)2:2p2A012^0i2*040K0u2|2q0^2 2?0.32340K0w382~2Z303e2+0b3i3a3k3c310j2(332+0c3p2;2!1t2@3u2_350N3z3b3C3d3E3w350E3I3r3K3t3v3f0R3Q2=3S3m040P0U3X3B2K3T3F0P2-1a2/3q3Y3*3!0P2{3/2}3;3)2$3M340P373`393A3l3 0?0P3h433j3=3~3U483o4b3|464f3#3y4b1k2T192H2u0e1Y2z3s0y2P1`1h4s1i4q2X4o4y0X2U3R3?0?1_0f0j3i0K453s0j0?0L4Q4S3Z0q0?1p2m3i4Y3*0=040m0D3p064j3s0o4#0T0S4(3J3*0B2+4`4K2$0S0?0n0q0A0o0A0g0j0|0T0g4 4d1M4+0m5e3}2@535j304+0p4X4{2$0?0o5n3s4+0D0H3p0K5C4R5s1M4?040M4_4b5E505g0?5i4o5F3d5m5R5N0.5p5r5W315u5w3S5y5Z5f0.0j4}042O0I5*5k5,5.2M5=3l4M0T4O5%4*0?5A4i5D645M5+015H5J5`3s0n5U2V665?014U04020J0I0x6b3Z5$5V674+622V06656y6g5{044N4P6s6h4+0l5Q2X5S5#5/5 1/5Y5L4)5t045v6F5o0?0D0G6p3*6j4W6R6L0f0M0?3%636z6S5G0?0T1A5K6f6;5T6U6#1/6%6(6`6*6,3#6O5O046v3:6z656{6M6D765X0?6I7g6M186W5x0?5q6)5!6d6}7n5(6Y6!7r676%6~1M6+485B6:6L5H6@0g0T7k6u7G7b5C7d7t7f7v60047j7V6T7m6K5!6Q727s6r7$6t7x7C5,4V7/7l5557595b5d7Z776J2/7S6e2/6A4T0?0Q7=7E757|7h047q7)677t6V8e6h6j867z6h883.7,6G6Y7=6j0s7=7t5456585a1_7{8q6X4,7k8x8t858w7+7 6L7(82807u8E7o044.6/7R7I0?2k0I0z0F7#8Q6L7T5}6E8T7w7X7~2}8R8)8?8O7p8L8S8N7%7.4i4:7d5H0X6_8~675.4R8a31525/557_8C7N5P8H818_8 8V793{64938!0Y8%8^2q834Z0?1b9i8G9b8x7@8A7`9C8=2q8@9C8d8*7*8}9m7-8V7=5H0S3u8|8h9P7A5^9w357S4!040F1)0r7M9b5h7k8o9N87748p9#8j0?8v8m6B9(7d5y8W6w194H0T2r2Sa94r1q4t2u2x2s0i1Hac0d4s0^am0Y0!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 : 5/5

.12801356/dmsyaoP[(nk,bg+p3v4;cu_wh)8r]:tl =i7S1-9fe02050e0T0I0i0M0J0g0K0y0J0i0g0g0L010I0M0t010406050g0z0f0f0i0F0h040O0j0J0z0:0j0n050d0`0|0~100^0t04051g191j0d1g0^0e0M0v0(0*0,0.0C0M0r0C0J1x0C0I0?050Z0q0J0T1s0+0-011w1y1A1y0I1G1I1E0I0F1h0I0C0(130g0t0i0n0.0V011K1u010S0#0T0n0i0f0T1E1%1)1.1M1;1I1@1_0?0a0K0k0F0j0t0j0g0M160n0K0X1#0F0F0T0y2e191|0n1h0d1Z2r1W1Y1X1F0e1~0.1A0n1?2b1E1p1r0)1L2B0M2D0n0j2H1E0t2k1h2p2r2V0_1(2f2J1/2O0F0}0J0?0K0P2o2Z0@2Y1}2#1M2%2)2+0V2.1)2:2p2A012^0i2*040K0u2|2q0^2 2?0.32340K0w382~2Z303e2+0b3i3a3k3c310j2(332+0c3p2;2!1t2@3u2_350N3z3b3C3d3E3w350E3I3r3K3t3v3f0R3Q2=3S3m040P0U3X3B2K3T3F0P2-1a2/3q3Y3*3!0P2{3/2}3;3)2$3M340P373`393A3l3 0?0P3h433j3=3~3U483o4b3|464f3#3y4b1k2T192H2u0e1Y2z3s0y2P1`1h4s1i4q2X4o4y0X2U3R3?0?1_0f0j3i0K453s0j0?0L4Q4S3Z0q0?1p2m3i4Y3*0=040m0D3p064j3s0o4#0T0S4(3J3*0B2+4`4K2$0S0?0n0q0A0o0A0g0j0|0T0g4 4d1M4+0m5e3}2@535j304+0p4X4{2$0?0o5n3s4+0D0H3p0K5C4R5s1M4?040M4_4b5E505g0?5i4o5F3d5m5R5N0.5p5r5W315u5w3S5y5Z5f0.0j4}042O0I5*5k5,5.2M5=3l4M0T4O5%4*0?5A4i5D645M5+015H5J5`3s0n5U2V665?014U04020J0I0x6b3Z5$5V674+622V06656y6g5{044N4P6s6h4+0l5Q2X5S5#5/5 1/5Y5L4)5t045v6F5o0?0D0G6p3*6j4W6R6L0f0M0?3%636z6S5G0?0T1A5K6f6;5T6U6#1/6%6(6`6*6,3#6O5O046v3:6z656{6M6D765X0?6I7g6M186W5x0?5q6)5!6d6}7n5(6Y6!7r676%6~1M6+485B6:6L5H6@0g0T7k6u7G7b5C7d7t7f7v60047j7V6T7m6K5!6Q727s6r7$6t7x7C5,4V7/7l5557595b5d7Z776J2/7S6e2/6A4T0?0Q7=7E757|7h047q7)677t6V8e6h6j867z6h883.7,6G6Y7=6j0s7=7t5456585a1_7{8q6X4,7k8x8t858w7+7 6L7(82807u8E7o044.6/7R7I0?2k0I0z0F7#8Q6L7T5}6E8T7w7X7~2}8R8)8?8O7p8L8S8N7%7.4i4:7d5H0X6_8~675.4R8a31525/557_8C7N5P8H818_8 8V793{64938!0Y8%8^2q834Z0?1b9i8G9b8x7@8A7`9C8=2q8@9C8d8*7*8}9m7-8V7=5H0S3u8|8h9P7A5^9w357S4!040F1)0r7M9b5h7k8o9N87748p9#8j0?8v8m6B9(7d5y8W6w194H0T2r2Sa94r1q4t2u2x2s0i1Hac0d4s0^am0Y0!0$04.