Plus Grand Commun Diviseur

Le PGCD, (ou plus grand commun diviseur), de deux entiers strictement positifs \(a\) et \(b\) est le plus grand entier positif qui divise \(a\) et \(b\).

  • Le PGCD de \(18\) et \(24\) est \(6\) ;
  • Le PGCD de \(20\) et \(10\) est \(10\) ;
  • Le PGCD de \(28\) et \(15\) est \(1\).
Division euclidienne

Si \(a\) et \(b\) sont deux entiers strictement positifs, effectuer la division euclidienne de \(a\) par \(b\) consiste à trouver deux entiers positifs \(q\) et \(r\) (appelés respectivement le quotient et le reste) tels que \(a = bq + r\) et \(0\leq r < b\).

Avec Python le reste \(r\) est la valeur de l'expression a % b.

On demande dans cet exercice d'écrire la fonction pgcd qui prend en paramètres deux entiers strictement positifs a et b et renvoie le PGCD de ces deux nombres.

Deux versions, l'une itérative et l'autre récursive, sont proposées.

Exemples
>>> pgcd(18, 24)
6
>>> pgcd(20, 10)
10
>>> pgcd(28, 15)
1
Fonction gcd interdite

Le module math propose une fonction calculant le PGCD de deux entiers.

On s'interdit d'utiliser cette fonction dans cet exercice.

Version itérative

On utilise l'algorithme d'Euclide avec \(a\) et \(b\) deux entiers strictement positifs.

  1. On détermine le reste \(r\) dans la division euclidienne de \(a\) par \(b\).

  2. Tant que \(r\) n'est pas nul, \(a\) prend la valeur de \(b\), \(b\) prend la valeur de \(r\) et on calcule le nouveau reste \(r\) dans la division euclidienne de \(a\) par \(b\).

  3. L'algorithme est terminé, le reste \(r\) est nul, et le PGCD est \(b\).

###(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

.128013s3Oo_;bcdufvgù/0lyq n7GapS!.r1Lmeh,(P2=4:Ctwk%iD5REx)é6050j0H0R0y0V0r0b0u0i0r0y0b0b0N010R0V0z010406050b0k0G0G0y0D0s040A0e0r0k0{0e0v0u020y0G0z0g0u0Y0H150D0t0k0H0b050p12141618100z041w1D051G0p1G1I1D100j0V0m0:0=0@0_0I0V0n0I0r1W0I0R0~050+0h0r0H1R0?0^011V1X1Z1X0R1)1+1%0R0h0e0j181(0D1E0R0I0:1b0b0z0y0v0_0M011-1T010l0-0H0v1j0H1%282a2f1/2i1+2l0G2n040a0u0L0D0e0z0e0b0V1e1g0)260D0D0H0i2I1w2p0v1E0p242U0R2221230j2r0_1Z0v2k2F1%1O1Q0;1.2(0V2*0v1~1P1%0z2N1E2S2U2 11291g2:2g2^0D150r0~0E2R330 322q351/37390~0M3d2a3f2S2%013k0y3a040c3o2T103r3i0_3u3w0O3z3q333s3F0~0X3I3B3K3D3t0e383v0~0%3P3g341S3j3U3l040w3I1F2}1w2.2X0j2#3s0i1~2x0(1P1E2|0H2~3e3,3^0)403h3$0_0T0~0)0l3,3C47010S0~0u4d3R4f0v0l0~0z0n0i0j4k462;010}040K4u3#4w0v0~0y4B3s4y0J3I4j4e4D0~0h4H3S4y0#0P3P0u4X4M4l4O040D4L3!3s0e0~0N4(4N364F4.4!2g4+040U4=4v4:044Q1x3e064Y4Z4|1/49040S1V1+4{4C4}4%503p545d1/4^0B4-5g2T5i3s0G0V0~0q4R4f4y4V5o0 53534)3S4E044G5A5q3S4^5n2 5K4m4P4W5C4X5E5Q4~5c4*4,5Y5F0~5f2 525T5P4#5(3e5,4@5!5J5V4#5I5O5@5;4_5#5W4 5)5D4/565%0*0k0D0v5~4#60511w433 3-6g0p3:1w0R3=6l2Z2V1}1 2X0y1*6i3:1C455j0_2N0G0f0l0y0T0H0f0I0c0~1o1q1s1u0u5z311J3f1D0d1g0y260v2G0j0$0D0$0u1+0/2k0{0H0D0/5{1/162H0I150R0H0!0~090K0y090#4L0*5:6@0D6_6{6}6 0K0h734L0b2Y0V2P1p6.0u2E2G0{0l0b0C0u0W2a0/1+0:0?0u0e0o6+000k2J6Q0)0k0!0u1u0R0u0v0k0r0u0K760b0H7S7m0v7P0r7G7I0/7K0!0#0J6+1,0L0x0Q0W7N7i0:0H1c0V0u0)7*7Y7M2^0G0h2N0/1s7}0v007O7o7B7R0r0C060Z1g0H0l0l767%6.0V6:770_6^247b6~04700v7g5J2^1g8f7^7$1,0z1c0/0n0D2a2$8q8s887~1P0V7X8t018v6`0y6|8y8A8C5O766?8u798w8$7c8z0K0q8*3e0C1F6V040F8J2C8N1j2w7o7Y7P3v3U0/0b000$0i792N0u0b0e0k0/0i0*6|0u0l3(1,5z1M3{2/4f1;1Y1!1$6z3s2t2k2m0~2z0A9e0|7P0L0s241f3,3~6z30416f9C3S574b5w4w4h044j5A8-3t4o044q4s9#2g4y4A9*633E4;9^4?1/4J6a4}6c3p9+4T6S51629}480~592ja03j5R5?9_015l5N5/9+5s5u9;9~0~a63p5*5T9+5G5_41ai9 aha93tag5`ai5Mae9`5X9|550_aCaHaEayaKaj0~4`aDaOaFaM614Y9+572N0R6769aY6Aa!azau6e3_2U9S3/3|106j0*0,0.04.
Version récursive

Une autre manière de décrire l'algorithme d'Euclide est de dire que si \(r\) est le reste dans la division euclidienne de \(a\) par \(b\) alors:

  • si \(r=0\) alors le PGCD de \(a\) et \(b\) est \(b\);
  • si \(r\neq 0\) alors le PGCD de \(a\) et \(b\) est le PGCD de \(b\) et \(r\).

###(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

.128013s3o_;bcdufvgù/0lyq napS.r1Lmeh,(P2=4:Ctwk%i5Rx)é050i0D0N0v0R0q0b0t0h0q0v0b0b0J010N0R0w010406050b0j0C0C0v0z0r040x0d0q0j0;0d0u0t020v0C0w0f0t0T0D0~0z0s0j0D0b050o0{0}0 110_0w041p1w051z0o1z1B1w0_0i0R0l0)0+0-0/0E0R0m0E0q1P0E0N0@050!0g0q0D1K0,0.011O1Q1S1Q0N1Y1!1W0N0g0d0i111X0z1x0N0E0)140b0w0v0u0/0I011$1M010k0$0D0u1c0D1W2123281(2b1!2e0C2g040a0t0H0z0d0w0d0b0R17190Y1 0z0z0D0h2B1p2i0u1x0o1}2N0N1{1`1|0i2k0/1S0u2d2y1W1H1J0*1%2X0R2Z0u1@1I1W0w2G1x2L2N2^0`22192)292.0z0~0q0@0A2K2|0^2{2j2~1(30320@0I3623382L2W013d0v33040c3h2M0_3k3b0/3n3p0K3s3j2|3l3y0@0S3B1y2?1p2%2Q0i2U3l0h1@2q0X1I1x2=0D2@373I3R0Y3Z3a1L1(0P0@0Y0k3I3v3*0/0O0@0t3:3D3w3m0k0@0w0m0h0i3`3)2*010?040G442}3=3m0@0v4b3l480F3B3_3;460u0@0g4h3|480V0L3B060t4z4m3{4d4p040z4l394c460d0@0J4H4n2 4f4O4C4K0@0Q4S454Q044r1q374y4A4I3l3,040R3/4$3i4B4Y3c0@4G4:2M4=4J294L040J4N4`044|3l0C0R0@0p4s4d484w534(4A4)4P3+4^0Z0j0z0u4X4}4@4!4x5h4*3|4,2G0N5n5p53553|4E40425b46484a535w4D4q5J294j5q3E4^5R1(4u4x1p3$3Y3J5%0o3M1p0N3O5,2S2O1?1^2Q0v1Z5)3M1v3(5r0/2G0C0e0k0v0P0D0e0E0c0@1h1j1l1n0t5e2`1C381w0M0d0}1#0i230(1!0t2=0d0m0z1c2p0t2A0W6x0;0k0F0t186t0D161 0u2z0i6C0D0z0t6s0h0,6H0n6T000j2C6e0Y0j0U0t2.0C0g2G0(0G0Z0t0b6K1!2p0u0N6Z6#0t0Y0(6(0U0V0t1n6|0u0j0q0y1y6j040B1#6u6w6y1#0z0W0h5n2z0k6J6L3o0d0z0(0b007m0z0R2G6?0d0j0(0h0Z0N1#0k7u2p5e1F3U2(4d1*1R1T1V5}3l2m2d2f0@2s0x0h7A0w6|0H0r1}183I3X5}2_3!5$7X5x3-0D4/2`5j3?3^5X3x3~045H435N80470@5M7 4T4Z4g898f5Y0@4k5D5O4o5Q8i4?0/4u6g4%5v8a4,4.5U5F8q2^5E4d4 518B4d5759838b048v3i5g5h8F465y5m5o8J8p048h2^8S8o298W5A8Y8n8a5G41888e8s8O8d3!8/8D8`8j8t8l8Z8g911(4 4W8.8~4e5t8r5~8O0V5!0o7_5(2N5{3L0Z0#0%04.