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

.128013:Lpbv%(40i2Dedmx3;s7= 1Eo5w_lSnatf)OhùR6qcrg,.GéyP!Cku/050o0n0H0G0k0D0t0w0Q0D0G0t0t0v010H0k0d010406050t0$0p0p0G0R0X040E0z0D0$0{0z0F0w020G0p0d0s0w0N0n150R0P0$0n0t050%12141618100d041w1D051G0%1G1I1D100o0k0f0:0=0@0_0L0k0S0L0D1W0L0H0~050+0e0D0n1R0?0^011V1X1Z1X0H1)1+1%0H0e0z0o181(0R1E0H0L0:1b0t0d0G0F0_0l011-1T010I0-0n0F1j0n1%282a2f1/2i1+2l0p2n040a0w0Y0R0z0d0z0t0k1e1g0)260R0R0n0Q2I1w2p0F1E0%242U0H2221230o2r0_1Z0F2k2F1%1O1Q0;1.2(0k2*0F1~1P1%0d2N1E2S2U2 11291g2:2g2^0R150D0~0x2R330 322q351/37390~0l3d2a3f2S2%013k0G3a040r3o2T103r3i0_3u3w0i3z3q333s3F0~0A3I3B3K3D3t0z383v0~0O3P3g341S3j3U3l040u3I1F2}1w2.2X0o2#3s0Q1~2x0(1P1E2|0n2~3e3,3^0)403h3$0_0#0~0)0I3,3C47010B0~0w4d3R4f0F0I0~0d0S0Q0o4k462;010}040h4u3#4w0F0~0G4B3s4y0T3I4j4e4D0~0e4H3S4y0J0b3P0w4X4M4l4O040R4L3!3s0z0~0v4(4N364F4.4!2g4+040g4=4v4:044Q1x3e064Y4Z4|1/49040B1V1+4{4C4}4%503p545d1/4^0Z4-5g2T5i3s0p0k0~0j4R4f4y4V5o0 53534)3S4E044G5A5q3S4^5n2 5K4m4P4W5C4X5E5Q4~5c4*4,5Y5F0~5f2 525T5P4#5(3e5,4@5!5J5V4#5I5O5@5;4_5#5W4 5)5D4/565%0*0$0R0F5~4#60511w433 3-6g0%3:1w0H3=6l2Z2V1}1 2X0G1*6i3:1C455j0_2N0p0C0I0G0#0n0C0L0r0~1o1q1s1u0w5z311J3f1D0K1g0G260F2G0o0W0R0W0w1+0/2k0{0n0R0/5{1/162H0L150H0n0q0~090h0G090J4L0*5:6@0R6_6{6}6 0h0e734L0t2Y0k2P1p6.0w2E2G0{0I0t0U0w0m2a0/1+0:0?0w0z0M6+000$2J6Q0)0$0q0w1u0H0w0F0$0D0w0h760t0n7S7m0F7P0D7G7I0/7K0q0J0T6+1,0Y0V0!0m7N7i0:0n1c0k0w0)7*7Y7M2^0p0e2N0/1s7}0F007O7o7B7R0D0U060y1g0n0I0I767%6.0k6:770_6^247b6~04700F7g5J2^1g8f7^7$1,0d1c0/0S0R2a2$8q8s887~1P0k7X8t018v6`0G6|8y8A8C5O766?8u798w8$7c8z0h0j8*3e0U1F6V040c8J2C8N1j2w7o7Y7P3v3U0/0t000W0Q792N0w0t0z0$0/0Q0*6|0w0I3(1,5z1M3{2/4f1;1Y1!1$6z3s2t2k2m0~2z0E9e0|7P0Y0X241f3,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+572N0H6769aY6Aa!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

.128013:Lpbv%(40i2edmx3;s= 1o5w_lSnatf)hùR,qcrg.éyPCku/050n0m0E0D0k0A0s0u0M0A0D0s0s0t010E0k0d010406050s0V0o0o0D0N0R040B0w0A0V0;0w0C0u020D0o0d0r0u0J0m0~0N0L0V0m0s050W0{0}0 110_0d041p1w051z0W1z1B1w0_0n0k0f0)0+0-0/0H0k0O0H0A1P0H0E0@050!0e0A0m1K0,0.011O1Q1S1Q0E1Y1!1W0E0e0w0n111X0N1x0E0H0)140s0d0D0C0/0l011$1M010F0$0m0C1c0m1W2123281(2b1!2e0o2g040a0u0S0N0w0d0w0s0k17190Y1 0N0N0m0M2B1p2i0C1x0W1}2N0E1{1`1|0n2k0/1S0C2d2y1W1H1J0*1%2X0k2Z0C1@1I1W0d2G1x2L2N2^0`22192)292.0N0~0A0@0v2K2|0^2{2j2~1(30320@0l3623382L2W013d0D33040q3h2M0_3k3b0/3n3p0i3s3j2|3l3y0@0x3B1y2?1p2%2Q0n2U3l0M1@2q0X1I1x2=0m2@373I3R0Y3Z3a1L1(0U0@0Y0F3I3v3*0/0y0@0u3:3D3w3m0F0@0d0O0M0n3`3)2*010?040h442}3=3m0@0D4b3l480K3B3_3;460C0@0e4h3|480G0b3B060u4z4m3{4d4p040N4l394c460w0@0t4H4n2 4f4O4C4K0@0g4S454Q044r1q374y4A4I3l3,040k3/4$3i4B4Y3c0@4G4:2M4=4J294L040t4N4`044|3l0o0k0@0j4s4d484w534(4A4)4P3+4^0Z0V0N0C4X4}4@4!4x5h4*3|4,2G0E5n5p53553|4E40425b46484a535w4D4q5J294j5q3E4^5R1(4u4x1p3$3Y3J5%0W3M1p0E3O5,2S2O1?1^2Q0D1Z5)3M1v3(5r0/2G0o0z0F0D0U0m0z0H0q0@1h1j1l1n0u5e2`1C381w0T0w0}1#0n230(1!0u2=0w0O0N1c2p0u2A0Q6x0;0F0K0u186t0m161 0C2z0n6C0m0N0u6s0M0,6H0I6T000V2C6e0Y0V0p0u2.0o0e2G0(0h0Z0u0s6K1!2p0C0E6Z6#0u0Y0(6(0p0G0u1n6|0C0V0A0P1y6j040c1#6u6w6y1#0N0Q0M5n2z0F6J6L3o0w0N0(0s007m0N0k2G6?0w0V0(0M0Z0E1#0F7u2p5e1F3U2(4d1*1R1T1V5}3l2m2d2f0@2s0B0M7A0d6|0S0R1}183I3X5}2_3!5$7X5x3-0m4/2`5j3?3^5X3x3~045H435N80470@5M7 4T4Z4g898f5Y0@4k5D5O4o5Q8i4?0/4u6g4%5v8a4,4.5U5F8q2^5E4d4 518B4d5759838b048v3i5g5h8F465y5m5o8J8p048h2^8S8o298W5A8Y8n8a5G41888e8s8O8d3!8/8D8`8j8t8l8Z8g911(4 4W8.8~4e5t8r5~8O0G5!0W7_5(2N5{3L0Z0#0%04.