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

.128013buS,3_ùGL4l.(wnx/R)pOaPké0;:EhorCsD1v7c25qm6!gyd%ieft =050W0Z0#0w0Y0l0I0$0N0l0w0I0I0%010#0Y0u010406050I0c0R0R0w0G0V040d0F0l0c0{0F0p0$020w0R0u0B0$0s0Z150G0Q0c0Z0I050r12141618100u041w1D051G0r1G1I1D100W0Y0L0:0=0@0_0E0Y0U0E0l1W0E0#0~050+0b0l0Z1R0?0^011V1X1Z1X0#1)1+1%0#0b0F0W181(0G1E0#0E0:1b0I0u0w0p0_0O011-1T010!0-0Z0p1j0Z1%282a2f1/2i1+2l0R2n040a0$0x0G0F0u0F0I0Y1e1g0)260G0G0Z0N2I1w2p0p1E0r242U0#2221230W2r0_1Z0p2k2F1%1O1Q0;1.2(0Y2*0p1~1P1%0u2N1E2S2U2 11291g2:2g2^0G150l0~0K2R330 322q351/37390~0O3d2a3f2S2%013k0w3a040f3o2T103r3i0_3u3w0k3z3q333s3F0~0P3I3B3K3D3t0F383v0~0S3P3g341S3j3U3l040M3I1F2}1w2.2X0W2#3s0N1~2x0(1P1E2|0Z2~3e3,3^0)403h3$0_0y0~0)0!3,3C47010o0~0$4d3R4f0p0!0~0u0U0N0W4k462;010}040n4u3#4w0p0~0w4B3s4y0e3I4j4e4D0~0b4H3S4y0t0C3P0$4X4M4l4O040G4L3!3s0F0~0%4(4N364F4.4!2g4+040X4=4v4:044Q1x3e064Y4Z4|1/49040o1V1+4{4C4}4%503p545d1/4^0T4-5g2T5i3s0R0Y0~0A4R4f4y4V5o0 53534)3S4E044G5A5q3S4^5n2 5K4m4P4W5C4X5E5Q4~5c4*4,5Y5F0~5f2 525T5P4#5(3e5,4@5!5J5V4#5I5O5@5;4_5#5W4 5)5D4/565%0*0c0G0p5~4#60511w433 3-6g0r3:1w0#3=6l2Z2V1}1 2X0w1*6i3:1C455j0_2N0R0g0!0w0y0Z0g0E0f0~1o1q1s1u0$5z311J3f1D0v1g0w260p2G0W0z0G0z0$1+0/2k0{0Z0G0/5{1/162H0E150#0Z0q0~090n0w090t4L0*5:6@0G6_6{6}6 0n0b734L0I2Y0Y2P1p6.0$2E2G0{0!0I0m0$0J2a0/1+0:0?0$0F0h6+000c2J6Q0)0c0q0$1u0#0$0p0c0l0$0n760I0Z7S7m0p7P0l7G7I0/7K0q0t0e6+1,0x0i0H0J7N7i0:0Z1c0Y0$0)7*7Y7M2^0R0b2N0/1s7}0p007O7o7B7R0l0m060D1g0Z0!0!767%6.0Y6:770_6^247b6~04700p7g5J2^1g8f7^7$1,0u1c0/0U0G2a2$8q8s887~1P0Y7X8t018v6`0w6|8y8A8C5O766?8u798w8$7c8z0n0A8*3e0m1F6V040j8J2C8N1j2w7o7Y7P3v3U0/0I000z0N792N0$0I0F0c0/0N0*6|0$0!3(1,5z1M3{2/4f1;1Y1!1$6z3s2t2k2m0~2z0d9e0|7P0x0V241f3,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+572N0#6769aY6Aa!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

.128013buS,3_ù4l.(wnx/R)paPké0L;:horCs1vc25qmgyd%ieft =050P0S0U0t0R0j0F0V0I0j0t0F0F0W010U0R0s010406050F0c0M0M0t0D0O040d0C0j0c0;0C0n0V020t0M0s0z0V0q0S0~0D0L0c0S0F050p0{0}0 110_0s041p1w051z0p1z1B1w0_0P0R0H0)0+0-0/0B0R0N0B0j1P0B0U0@050!0b0j0S1K0,0.011O1Q1S1Q0U1Y1!1W0U0b0C0P111X0D1x0U0B0)140F0s0t0n0/0J011$1M010T0$0S0n1c0S1W2123281(2b1!2e0M2g040a0V0u0D0C0s0C0F0R17190Y1 0D0D0S0I2B1p2i0n1x0p1}2N0U1{1`1|0P2k0/1S0n2d2y1W1H1J0*1%2X0R2Z0n1@1I1W0s2G1x2L2N2^0`22192)292.0D0~0j0@0G2K2|0^2{2j2~1(30320@0J3623382L2W013d0t33040f3h2M0_3k3b0/3n3p0i3s3j2|3l3y0@0K3B1y2?1p2%2Q0P2U3l0I1@2q0X1I1x2=0S2@373I3R0Y3Z3a1L1(0v0@0Y0T3I3v3*0/0m0@0V3:3D3w3m0T0@0s0N0I0P3`3)2*010?040l442}3=3m0@0t4b3l480e3B3_3;460n0@0b4h3|480r0A3B060V4z4m3{4d4p040D4l394c460C0@0W4H4n2 4f4O4C4K0@0Q4S454Q044r1q374y4A4I3l3,040R3/4$3i4B4Y3c0@4G4:2M4=4J294L040W4N4`044|3l0M0R0@0x4s4d484w534(4A4)4P3+4^0Z0c0D0n4X4}4@4!4x5h4*3|4,2G0U5n5p53553|4E40425b46484a535w4D4q5J294j5q3E4^5R1(4u4x1p3$3Y3J5%0p3M1p0U3O5,2S2O1?1^2Q0t1Z5)3M1v3(5r0/2G0M0g0T0t0v0S0g0B0f0@1h1j1l1n0V5e2`1C381w0E0C0}1#0P230(1!0V2=0C0N0D1c2p0V2A0w6x0;0T0e0V186t0S161 0n2z0P6C0S0D0V6s0I0,6H0h6T000c2C6e0Y0c0o0V2.0M0b2G0(0l0Z0V0F6K1!2p0n0U6Z6#0V0Y0(6(0o0r0V1n6|0n0c0j0k1y6j040y1#6u6w6y1#0D0w0I5n2z0T6J6L3o0C0D0(0F007m0D0R2G6?0C0c0(0I0Z0U1#0T7u2p5e1F3U2(4d1*1R1T1V5}3l2m2d2f0@2s0d0I7A0s6|0u0O1}183I3X5}2_3!5$7X5x3-0S4/2`5j3?3^5X3x3~045H435N80470@5M7 4T4Z4g898f5Y0@4k5D5O4o5Q8i4?0/4u6g4%5v8a4,4.5U5F8q2^5E4d4 518B4d5759838b048v3i5g5h8F465y5m5o8J8p048h2^8S8o298W5A8Y8n8a5G41888e8s8O8d3!8/8D8`8j8t8l8Z8g911(4 4W8.8~4e5t8r5~8O0r5!0p7_5(2N5{3L0Z0#0%04.