Aller au contenu

Nombre de partitions d'un entier

Le cadre

On considรจre ici qu'une somme peut comporter un terme ou plus, que l'ordre des termes ne compte pas, de plus, les termes doivent รชtre des entiers strictement positifs. 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.

Exercice

Coder une fonction nb_sommes qui prend un paramรจtre entier strictement positif n et qui renvoie le nombre de faรงons d'รฉcrire n comme une somme, sans compter l'ordre.

Contraintes
  • 0<n<128
  • Modules math et functools interdits
  • Code source limitรฉ ร  2000 caractรจres

Indice

  • Toujours commencer par dรฉnombrer ร  la main les premiers cas.

  • Bien ranger les cas, par catรฉgorie ; faire des figures.

  • Trouver une formule ร  partir des cas bien rangรฉs.

Aide

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.

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 adjoint 1 ;
  • des sommes de 10 termes valant toutes 40 auxquelles on ajoute 10 fois 1 (ร  chaque terme).

On en dรฉduit : nb_k_sommes(50, 10) = nb_k_sommes(49, 9) + nb_k_sommes(40, 10).

Il faudra utiliser de la mรฉmoรฏsation pour que le code soit assez rapide.

Guide
๐Ÿ Script Python
mรฉmo = dict()

def nb_k_sommes(n, k):
    if (n, k) not in mรฉmo:
        if n < ...:
            mรฉmo[(n, k)] = ...
        elif k == ...:
            mรฉmo[(n, k)] = ...
        else:
            mรฉmo[(n, k)] = nb_k_sommes(..., ...) + nb_k_sommes(..., ...)
    return mรฉmo[...]


def nb_sommes(n):
    return sum(nb_k_sommes(n, ...) for ... in range(..., ...))
# mem = ... # Identifiant et contenu ร  choisir
def nb_sommes(n):
"Renvoie le nombre de faรงons d'รฉcrire `n` comme une somme, sans compter l'ordre"
...
# Tests
assert nb_sommes(3) == 3
assert nb_sommes(5) == 7
ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”ื”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
###(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)
rounded
>>> 
 
x
x
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 : โˆž/โˆž
.9888.128013y@ร -รฏ ;akรช?s_v3รนhbP,Te[6N1LxFARnfujcรจm4.wS!2tl]+5รฉOรงVgroEICd0/98)p:7i=(`Mq050-0x0U0j0_0V0n0h0L0V0j0n0n0`010U0_0?010406050n0J0N0N0j0(0c040R0)0V0J1f0)0H0h020j0N0?0i0h0G0x1p0(0~0J0x0n050/1m1o1q1s1k0?04051X1Q1!0/1X1k0-0_0p17191b1d0s0_0%0s0V1=0s0U1i05120t0V0x1-1a1c011;1?1^1?0U1~201|0U0(1Y0U0s221/010I140x0H1D0x01171v0n0?0j0H1d0T1|2v2x2j242m202p0N2r040b0h0u0(0)0?0)0n0_1y1A102t0(0(0x0L2V1Q2C0H1Y0/2h2+2e2g2f1}0-2E1d1^0H2o2S1|1*1,18232^0_2`0H0)2~1|0?2!1Y2)2+3c1l2w1A302k350(1p0V1i0h0B2(3g1j3f2D3i243k3m3o0T3r2x3t2)2@013y0j3n040h0q3C2*1k3F3w1d3I3K0h0O3O3E3g3G3U3o0Y3Y3Q3!3S3H0)3l3J3o0z3)3u3h1.3x3.3z3L0^3?3R3_3T3{3:3L0;3 3+413-3/3V0:473v493$040B0.4e3^314a3|0B3q1R3s3*4f4n4h0B3B4s3D4u4m3j433K0B3N4A3P3@3#4F1i0B3X4J3Z4v4E4b4O3(4R1#3a1Q2~2.0-2g2?3,0L362K0 1+1Y390x3b3s3Y054,104@4T3x1i2J0N3Y0h4L3,0)1i0`53554g0t1i1*2$4_404n1h040{0=3)4C3G0k5e0x0I5h484n0Q3o5v4~3T0I1i0H0t0o0k0o0n0)1o1O5A4D245k0{5O3#5E5T3,5k0v5a5i3j1i0k5W495k0=0@3)0h5/545#245r040_5u4R5;5w2k5R5)4w5V4Y5=1d5Y5!5}4 045(6368651i5n5{5b4n0)5y04350U675B016k1i336p5P3T501J605~1i5-4R065:6G5|6q5@5_6v5U6m6M561i020V0U0i6P4g5%6A5Q6C5.6H6%6i2k5@2!0U0J0(0H6W4n0N0_1i4k6E6%5/6)5?1i0x1^5`3c6I6w3H6Y6h646r5859786d016?4O6Z6e046D3c6F6{6G6}1d6+116.6:7d6q7g4i6$6(795@700n0x7i015k7l4t7o7p790H6y526c6q5k0y5S7S757P6O7X3G667w7Y773e795+0W6;2k57047c737q766m5G5I5K5M1P7#5X1i7W7+7e7Z7v7@797;0f7/247y4r847T1i5Z7(6N6b887e8a8c1d8e7H5+8q7a040X8v867{5J5L2J7 8g755 806X7!8n6q8p8k3,7Z8m4^7,8i8z7*8T7e8u6`5:7^7s6-6/8W04518t1i7V7H868.048j8M7)6a8?0=7.6E5p3,5@10728Y6q6l548J4w5D7`8C7~8?83958`879h7$6f7K4B7N7e0n2A04011I0H0p0)0_21200h350N0t2!0h2X0I0j0#1z160-000Z0L0(0_9G0|0H0|2t5M0h0J2`0h7}2J0v9%2x164,1E0U0x0(0h0V003.0-2!017A745q1i6,7u8z5d041S9f8;5E8B9(5N996B5la88L9k818@8+8S3D7^8!8_9 040I3.al8v6s5^9j3D9~8Qa40(2x0%7Gad6!afaI8r6@7zaL7I8V8P498saS6j1i8yaV5$ahan8U040=6g7m1Q4{4?4Za.0/4$1Q0U4(a?2;2,0j1 a:4$1W4}752!0N0o9J0k0x0o0s0q1i1I1K1M1O0h9n2*1#3t2~3G0j0-0N1z2U0_1z0h33at1i1Wbnbpbr2V0f1f0U2c040$1q0_2x9:0h0j0p2#9!9$0j1x9G0N0Z2h4-bkb00*1A2!390Z7F0H12b-9?bgab9N217^bK2h1p9:0D1i090{0H09a*3s0h2oaB49b_0sb{0xb}04b 0kc2539:3l1O9*bPbR9#9HbL0%aE9Z2X0E9;2!0n9*9.2JbObQ0L9?0j9%8Db@79c9cbcdb 0^0h0`3M0h0X0h0TcU3pcV0Bch5{0{abc51A1l2e1z0%044Q0nc-0Hc/0h2w0(1f1O6g1(4/2 49261@1_1{4;4!3e4Ya-3L5:030hdedg7n5/dh6G031k0/dba/2+a 1Z040!1A0?0x1xbO0J1b0_0h0t1a0L0J209=0L11bNb)0(b+2o122Vc*c74ncM0jb|b~0{cQcS0OcYcX0Xc#c3an1%bl1+3Gd3281`38d84^da4-dcdjdfdfdie0dmdle2dma,d}dq4#4:b$0Ucq9G1M00149%000j0%2U9H009#21c)0)0rb:c_1w16cs2x2?cjcC1Oeec,2Pc@c:2(c?c/0Pb#dteHc.040w0s0Z3.0M2JeLeIc^0@0h0C219D9F212Xc`bFbt0Hb?dV2kdXdZcec0c$73c6b^9Sb`dYccd!cgd-2*c_1qc|16eF0h0Z0%3JdA9C5Le,9H21e/bs9Mfme@24e_f4e{c1f73L0-1zee19exdB0heA0He.fa9zc5c=fefg9B0efs1dfucO0{f63YeOd/b00}fBeI9-cJb/bYa|1^9=fD0N0lcC2!19dT2XdPdH2Z2odLcDbRdLeeaF9B2X0p1NfZc 1Xe)16fo2Ve?f02Ucaf3fVfx53dx0JbQb/bUdC9%e-0Ze+2!dKcJ98c dI3t1^04gccI7~fr4`d}7vdbdUeDbgfAb/9B0?eyfGaEfI0hgQfMeefffhfRgL4|6bdb9*11170x9*2R6.g!0)dzg+4?g-d}bv0H0I0Z9Sdy9=g`fOg)54dbgNd}fZgF1kgF0,f*ee0L3JdHdJewgxe-escJgghbe84|gP9;8E9HfBewgVfFfHeChz21fdg(0V0hg*dbg~hx2X1p0H0_0M9G0%gwh33J210m05gDhg0_1tdDg|6m1B6T1GhQ4?9*ej0H000cbOdAdH9$9J9L0Hheh+h*h,had}0kcR3phwh@bvhMh`h|cHehergudI21i1bue%bffm160Bi4gEh+0R331z9*2016b=guf9c{emdRdU100J0D17dYff3.9z165-h)05gFh.h?3Lfd7FdIgPbM0his1p0D0_0N1n9*bu1wdD2o0V0MbQ3pi=1A0)0tc|b/ilgee;gKhvdog gSfCfngWhGg!hIg$i8g,0f4rgO0{g:f{1g2Pbf2Jb-0=iwi6iZid3Lh`fd2w169Bi%hMc6b.eei,0ji.i:0Ni~c*i`i|g2bN4=6?hW214,0V1z2`jRj0j2eej4fKf_b@hb0h0f0hi!hBgT21g#i-i/fhfdjzj9hx0{dLi@fr9@2x0L9z0H9$iMi.eYj!1vj%0xjw1Qhf1QiW0/kn0/kpkriW1Xdv0h6,2Pgpj{0(0Mfc0D0j2$1JiKf:f=21f{6.2!0HdLg93ta;ecd0bAbqhUf_aF9;by1ZkYbCe;bE2UbH0}0Zbq0g0ndYj6bU0U5Lk^iscncFh.hl0L0saHdpf!eQi/0%bO6T1d0a2s3,0U0Q1J0)0K6@9%0(0L1:2a0?0n0@0/do0-i30K0n101^0p0(0P2`0U0/1?0/0K100Lb70-2,libqll0d0B0Y0Piv0.0/23110n1R0p0%0/0T0z0j0.0P0nl)2sbF201d0@0Q1qhUc@0@010/3L0,dMes2#dTfd9#0_jtiKg@f/bgccdxc{0n0P54l9lb0Uldlf49lhljll2s0nlolq0UlslulwlylA701+lElGlI0slKlMlOlQmt0_lUlWlYl!1bl$l(l*l,l.l:l=g!k.0xl_l{6/330%l m1ePkwdwdyj,1f1^7F9=cp0-9Q3.f3g^9I1z2$j60S0h0+jI1Acc0_c=fng`9=k`k|1fm{cG0hbXk=k@m7ee9$4,e=9;bQ9=iknt9;1233211MbM2U0ZepbM9Q0Z10b-161GiDfE16f{1Jjum^14ndb+kT1)0Vbl0U3beM040F0pbMiJ8Fn+4#n)1)4(0L00jDgW9JkafQfe9R9Tg=17n{fNnib{ma1NcAo6ee2ekEc50I2ml20xfZ0-4(1)n)eReJ2Oj0i`eZ1Rn=a;n@0 4(0Afn1a9!m_nd9;bS0h0Kngepcc2q0H9*k@0J0I9%dD9xfF0l9:9-0j2wa}oO0DgVoaoJc`9J2UkJj`0hatkR2V2`nW0h0S4#oo4#n%1)d;3,d?d52B7e2G2o2q1i2M0Ro20?ee0u0cbZazbj4=b13d4^dp7C7Z0I2P7R8G3G978;pu9#2$0)2u7HpAaP0k7Zi/2Rc{8+l2l45o7^fI1i0dpQaHa+7C5s94a$7epIpy8Q9b5F9d8Ea7aP8=aP5+bi1j9p6qpU04pWkHpR8#6|p!0493pH5zp;p,aahtp:p*8Kpmb19lakaZ69ambja%5,9}p`756Kp$f8pT62aq6Q046S6Uavp?6#q17M8%a07t8*qjaM6^qp8$q3mFqt3Lqv8{qL8w0`7?c47^aUqd5jqE7m7MqP7e8(a2qWq$7L6{qH047EpYai5*q)q=q+q@a1qKqxqeqa9eqDaKq%a!qffS8w8bq:aN8fq{q(qir361qVrl7:1irero8drg8|awaX8+p-7|qbr79gp%p{qwq!89rqqCr9aJ8^rH858XrE8H6f5oqqarr1rbpTa4a6rCagrzp.acrL7jrDqmrPa#r.8hrkrOrFrnriaefyrc5@at0(rKr@75ax6uqW5Fa0k$qcr`rt7hr7rNaAq#ruqW7;aYrs6xr:qgaja)3?k2a:poeb0pkUdsa;11131504.