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

.1280132mhS)cle-P=3tfnp_:avgby;s560or 1(]k8+[4iwu7d9,/050S0i0n0t0O0h0z0F0g0h0t0z0z0l010n0O0q010406050z0Q0c0c0t0E0x040e0D0h0Q0:0D0p050V0`0|0~100^0q04051g191j0V1g0^0S0O0u0(0*0,0.0d0O0v0d0h1x0d0n0?050Z0w0h0i1s0+0-011w1y1A1y0n1G1I1E0n0E1h0n0d0(130z0q0t0p0.0b011K1u010o0#0i0p0t0c0i1E1%1)1.1M1;1I1@1_0?0a0F0k0E0D0q0D0z0O160p0F0X1#0E0E0i0g2e191|0p1h0V1Z2r1W1Y1X1F0S1~0.1A0p1?2b1E1p1r0)1L2B0O2D0p0D2H1E0q2k1h2p2r2V0_1(2f2J1/2O0E0}0h0?0F0G2o2Z0@2Y1}2#1M2%2)2+0b2.1)2:2p2A012^0t2*040F0m2|2q0^2 2?0.32340F0N382~2Z303e2+0A3i3a3k3c310D2(332+0B3p2;2!1t2@3u2_350R3z3b3C3d3E3w350K3I3r3K3t3v3f0T3Q2=3S3m040G0C3X3B2K3T3F0G2-1a2/3q3Y3*3!0G2{3/2}3;3)2$3M340G373`393A3l3 0?0G3h433j3=3~3U483o4b3|464f3#3y4b1k2T192H2u0S1Y2z3s0g2P1`1h4s1i4q2X4o4y0X2U3R3?0?1_0c0D3i0F453s0D0?0l4Q4S3Z0w0?1p2m3i4Y3*0=040H0f3p064j3s0J4#0i0o4(3J3*0P2+4`4K2$0o0?0p0w0r0J0r0z0D0|0i0z4 4d1M4+0H5e3}2@535j304+0U4X4{2$0?0J5n3s4+0f0s3p0F5C4R5s1M4?040O4_4b5E505g0?5i4o5F3d5m5R5N0.5p5r5W315u5w3S5y5Z5f0.0D4}042O0n5*5k5,5.2M5=3l4M0i4O5%4*0?5A4i5D645M5+015H5J5`3s0p5U2V665?014U04020h0n0y6b3Z5$5V674+622V06656y6g5{044N4P6s6h4+0M5Q2X5S5#5/5 1/5Y5L4)5t045v6F5o0?0f0I6p3*6j4W6R6L0c0O0?3%636z6S5G0?0i1A5K6f6;5T6U6#1/6%6(6`6*6,3#6O5O046v3:6z656{6M6D765X0?6I7g6M186W5x0?5q6)5!6d6}7n5(6Y6!7r676%6~1M6+485B6:6L5H6@0z0i7k6u7G7b5C7d7t7f7v60047j7V6T7m6K5!6Q727s6r7$6t7x7C5,4V7/7l5557595b5d7Z776J2/7S6e2/6A4T0?0j7=7E757|7h047q7)677t6V8e6h6j867z6h883.7,6G6Y7=6j0L7=7t5456585a1_7{8q6X4,7k8x8t858w7+7 6L7(82807u8E7o044.6/7R7I0?2k0n0Q0E7#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=5H0o3u8|8h9P7A5^9w357S4!040E1)0v7M9b5h7k8o9N87748p9#8j0?8v8m6B9(7d5y8W6w194H0i2r2Sa94r1q4t2u2x2s0t1Hac0V4s0^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 : 10/10

.1280132mhS)cle-P=3tfnp_:avgby;s560or 1(]k8+[4iwu7d9,/050S0i0n0t0O0h0z0F0g0h0t0z0z0l010n0O0q010406050z0Q0c0c0t0E0x040e0D0h0Q0:0D0p050V0`0|0~100^0q04051g191j0V1g0^0S0O0u0(0*0,0.0d0O0v0d0h1x0d0n0?050Z0w0h0i1s0+0-011w1y1A1y0n1G1I1E0n0E1h0n0d0(130z0q0t0p0.0b011K1u010o0#0i0p0t0c0i1E1%1)1.1M1;1I1@1_0?0a0F0k0E0D0q0D0z0O160p0F0X1#0E0E0i0g2e191|0p1h0V1Z2r1W1Y1X1F0S1~0.1A0p1?2b1E1p1r0)1L2B0O2D0p0D2H1E0q2k1h2p2r2V0_1(2f2J1/2O0E0}0h0?0F0G2o2Z0@2Y1}2#1M2%2)2+0b2.1)2:2p2A012^0t2*040F0m2|2q0^2 2?0.32340F0N382~2Z303e2+0A3i3a3k3c310D2(332+0B3p2;2!1t2@3u2_350R3z3b3C3d3E3w350K3I3r3K3t3v3f0T3Q2=3S3m040G0C3X3B2K3T3F0G2-1a2/3q3Y3*3!0G2{3/2}3;3)2$3M340G373`393A3l3 0?0G3h433j3=3~3U483o4b3|464f3#3y4b1k2T192H2u0S1Y2z3s0g2P1`1h4s1i4q2X4o4y0X2U3R3?0?1_0c0D3i0F453s0D0?0l4Q4S3Z0w0?1p2m3i4Y3*0=040H0f3p064j3s0J4#0i0o4(3J3*0P2+4`4K2$0o0?0p0w0r0J0r0z0D0|0i0z4 4d1M4+0H5e3}2@535j304+0U4X4{2$0?0J5n3s4+0f0s3p0F5C4R5s1M4?040O4_4b5E505g0?5i4o5F3d5m5R5N0.5p5r5W315u5w3S5y5Z5f0.0D4}042O0n5*5k5,5.2M5=3l4M0i4O5%4*0?5A4i5D645M5+015H5J5`3s0p5U2V665?014U04020h0n0y6b3Z5$5V674+622V06656y6g5{044N4P6s6h4+0M5Q2X5S5#5/5 1/5Y5L4)5t045v6F5o0?0f0I6p3*6j4W6R6L0c0O0?3%636z6S5G0?0i1A5K6f6;5T6U6#1/6%6(6`6*6,3#6O5O046v3:6z656{6M6D765X0?6I7g6M186W5x0?5q6)5!6d6}7n5(6Y6!7r676%6~1M6+485B6:6L5H6@0z0i7k6u7G7b5C7d7t7f7v60047j7V6T7m6K5!6Q727s6r7$6t7x7C5,4V7/7l5557595b5d7Z776J2/7S6e2/6A4T0?0j7=7E757|7h047q7)677t6V8e6h6j867z6h883.7,6G6Y7=6j0L7=7t5456585a1_7{8q6X4,7k8x8t858w7+7 6L7(82807u8E7o044.6/7R7I0?2k0n0Q0E7#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=5H0o3u8|8h9P7A5^9w357S4!040E1)0v7M9b5h7k8o9N87748p9#8j0?8v8m6B9(7d5y8W6w194H0i2r2Sa94r1q4t2u2x2s0t1Hac0V4s0^am0Y0!0$04.