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)
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

.128013[(lbsS]et-ph4rd;5f1890uma"ov+w7g,_/3=in 6k:)y 2Pc030j0c0d0t0G07090O0R070t09090F0u0d0G0f0u020I03090r0s0s0t0i0N020a0v070r0+0v0H030D0=0@0_0{0:0f02031b141e0D1b0:0j0G0w0!0$0'0)0g0G0A0g071s0g0d0.030V08070c1n0%0(0u1r1t1v1t0d1B1D1z0d0i1c0d0g0!0~090f0t0H0)0P0u1F1p0u0m0X0c0H0t0s0c1z1Y1!1(1H1+1D1.1:0.040O0Q0i0v0f0v090G110H0O0T1W0i0i0c0R28141?0H1c0D1U2l1R1T1S1A0j1^0)1v0H1-251z1k1m0#1G2v0G2x0H0v2B1z0f2e1c2j2l2P0;1Z292D1)2I0i0^070.0O0n2i2T0/2S1@2V1H2X2Z2#0P2'1!2)2j2u0u2.0t2!020O0E2=2k0:2^2,0)2{2}0O0h312@2T2_372#0l3b333d352`0v2Y2|2#0J3i2*2U1o2-3n2/2~0z3s343v363x3p2~0o3B3k3D3m3o380p3J2+3L3f020n0q3Q3u2E3M3y0n2%152(3j3R3Z3T0n2;3'2?3)3Y2W3F2}0n303/323t3e3@0.0n3a3{3c3*3?3N403h433;3~473U3r431f2N142B2o0j1T2t3l0R2J1;1c4k1d4i2R4g4q0T2O3K3+0.1:0s0v3b0O3}3l0v0.0F4I4K3S080.1k2g3b4Q3Z0-02060M3i0I4b3l0K4T0c0m4P3C3+0m0.0H080C0K0C090v0@0c094W4/1)4Z06504C2W4=55451H4Z0B4.562-0.0K593=5b0.0M0L3i0O5q4J511H4*020G4-435s5f0)535j3e584g5t5C0.5d5z4X57025i5H5B0u4Z4$5M5I0u0v0y4=0v0d5e5a0)5Z0.2G5'5k364E0c4G5E3l4Z5o4a5r5{5A5(0u5v5x5-5F02135W5S4M0200070d0k623l0H5h5?3L5^5p5|6m5N5g024F4H5R5~4Z05546t5.2`5G2R5X5c6e3S6h6y2_5U0b6F3Z684O665~0s0G0.3W5`6m5}6z5v0c1v5y2P6Y635Q6'6o5)4N6P6+5X6S406i4Y0.5_2P0I6X5|6,6A6q5;6s6C5S6v6x745~6g646@525K6M5O6*2(6 6K7f1H6O7l0)6=3U6l6n5X6!0Y0c7c5l026`3(6}5{6 7a6r7y5J026w7I7065786z6E6Q6z7a7h2?7j5m6L7S2_7n7!6f4=4@4_4{4}4 6I5@0.777i5X7a7O2(6(4L0.0e7o0u7q3%7P6J7e7%6G5P7~687}853Z807M5U880.0x7~7@7)4`4|1:7-827/4!7M7@8g028a6:5S7U8e848y796H8q6j5m7s7`3L5v2e0d0r0i7^2?8K4D715=7.8H7K7;7W7?6B7=758C7_7F8F8'6u7Y4%4(8L4+6%8*7?4;644@7+8o8B8s8X8U8R2k7X025n8J6 8M0U8P932~7F4S02168 8!948$8{4^8m7,9j8t8%8#8(025L8D7T8,9u8.967~5v0m3n8j9A2k8T1)5*5w9d9L2-9g0i1!0A7x917d908G8c6T7r9X7z9x8^5S8d8b9M8h9I7b9'7J0M5V6{144z0c2l2M9|4j1l4l2o2r2m0t1C9 0D4k0:a90U0W0Y02.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

.128013[(lbsS]et-ph4rd;5f1890uma"ov+w7g,_/3=in 6k:)y 2Pc030j0c0d0t0G07090O0R070t09090F0u0d0G0f0u020I03090r0s0s0t0i0N020a0v070r0+0v0H030D0=0@0_0{0:0f02031b141e0D1b0:0j0G0w0!0$0'0)0g0G0A0g071s0g0d0.030V08070c1n0%0(0u1r1t1v1t0d1B1D1z0d0i1c0d0g0!0~090f0t0H0)0P0u1F1p0u0m0X0c0H0t0s0c1z1Y1!1(1H1+1D1.1:0.040O0Q0i0v0f0v090G110H0O0T1W0i0i0c0R28141?0H1c0D1U2l1R1T1S1A0j1^0)1v0H1-251z1k1m0#1G2v0G2x0H0v2B1z0f2e1c2j2l2P0;1Z292D1)2I0i0^070.0O0n2i2T0/2S1@2V1H2X2Z2#0P2'1!2)2j2u0u2.0t2!020O0E2=2k0:2^2,0)2{2}0O0h312@2T2_372#0l3b333d352`0v2Y2|2#0J3i2*2U1o2-3n2/2~0z3s343v363x3p2~0o3B3k3D3m3o380p3J2+3L3f020n0q3Q3u2E3M3y0n2%152(3j3R3Z3T0n2;3'2?3)3Y2W3F2}0n303/323t3e3@0.0n3a3{3c3*3?3N403h433;3~473U3r431f2N142B2o0j1T2t3l0R2J1;1c4k1d4i2R4g4q0T2O3K3+0.1:0s0v3b0O3}3l0v0.0F4I4K3S080.1k2g3b4Q3Z0-02060M3i0I4b3l0K4T0c0m4P3C3+0m0.0H080C0K0C090v0@0c094W4/1)4Z06504C2W4=55451H4Z0B4.562-0.0K593=5b0.0M0L3i0O5q4J511H4*020G4-435s5f0)535j3e584g5t5C0.5d5z4X57025i5H5B0u4Z4$5M5I0u0v0y4=0v0d5e5a0)5Z0.2G5'5k364E0c4G5E3l4Z5o4a5r5{5A5(0u5v5x5-5F02135W5S4M0200070d0k623l0H5h5?3L5^5p5|6m5N5g024F4H5R5~4Z05546t5.2`5G2R5X5c6e3S6h6y2_5U0b6F3Z684O665~0s0G0.3W5`6m5}6z5v0c1v5y2P6Y635Q6'6o5)4N6P6+5X6S406i4Y0.5_2P0I6X5|6,6A6q5;6s6C5S6v6x745~6g646@525K6M5O6*2(6 6K7f1H6O7l0)6=3U6l6n5X6!0Y0c7c5l026`3(6}5{6 7a6r7y5J026w7I7065786z6E6Q6z7a7h2?7j5m6L7S2_7n7!6f4=4@4_4{4}4 6I5@0.777i5X7a7O2(6(4L0.0e7o0u7q3%7P6J7e7%6G5P7~687}853Z807M5U880.0x7~7@7)4`4|1:7-827/4!7M7@8g028a6:5S7U8e848y796H8q6j5m7s7`3L5v2e0d0r0i7^2?8K4D715=7.8H7K7;7W7?6B7=758C7_7F8F8'6u7Y4%4(8L4+6%8*7?4;644@7+8o8B8s8X8U8R2k7X025n8J6 8M0U8P932~7F4S02168 8!948$8{4^8m7,9j8t8%8#8(025L8D7T8,9u8.967~5v0m3n8j9A2k8T1)5*5w9d9L2-9g0i1!0A7x917d908G8c6T7r9X7z9x8^5S8d8b9M8h9I7b9'7J0M5V6{144z0c2l2M9|4j1l4l2o2r2m0t1C9 0D4k0:a90U0W0Y02.