diff --git a/slides/cours_2.md b/slides/cours_2.md index 1180dbb8211aa15e779a1b894728044d37e32c52..5f8b46f4266dcb9d8b7aef997369244a213592a5 100644 --- a/slides/cours_2.md +++ b/slides/cours_2.md @@ -59,7 +59,7 @@ int main() { - Initialisation, addition et multiplication de matrices - Couverture de la reine -# Le calcul du PPCM (1/2) +# Le calcul du PPCM (1/6) ## Définition @@ -69,12 +69,75 @@ nombres. Exemples: -```bash +```C PPCM(3, 4) = 12, PPCM(4, 6) = 12, PPCM(5, 15) = 15. ``` +. . . + +## Mathématiquement + +Décomposition en nombres premiers: + +$$ +36 = 2^2\cdot 3^2,\quad 90=2\cdot 5\cdot 3^2, +$$ +On garde tous les premiers à la puissance la plus élevée +$$ +PPCM(36, 45)=2^2\cdot 3^2\cdot 5=180. +$$ + +# Le calcul du PPCM (2/6) + +## Exemple d'algorithme + +```C +36 < 90 // 36 + 36 +72 < 90 // 72 + 36 +108 > 90 // 90 + 90 +108 < 180 // 108 + 36 +144 < 180 // 144 + 36 +180 = 180 // The End! +``` + +* 5 additions, 5 assignations, et 6 comparaisons. + +. . . + +## Transcrivez cet exemple en algorithme (groupe de 3) + +. . . + +## et codez-le! + +. . . + + +# Le calcul du PPCM (3/6) + +## Tentative de correction + +```C +int main() { + int m = 15, n = 12; + int mult_m = m, mult_n = n; + while (mult_m != mult_n) { + if (mult_m > mult_n) { + mult_n += n; + } else { + mult_m += m; + } + } + printf("Le ppcm de %d et %d est %d\n", n, m, mult_m); +} +``` + +Combien d'additions / comparaisons au pire? + +# Le calcul du PPCM (4/6) + ## Comment décrire une fonction qui ferait ce calcul (arguments, sorties)? . . . @@ -94,7 +157,31 @@ Par groupe de 3: * réfléchissez à un algorithme donnant le PPCM de deux nombres; * écrivez l'algorithme en pseudo-code. -# Le calcul du PPCM (1/2) +# Le calcul du PPCM (5/6) + +Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a +* i = b * j` ou encore `p / a = i` et `p / b = j`. + +<!-- Si un nombre, $p$, est multiple de $a$ et de $b$ alors il peut s'écrire --> +<!-- $$ --> +<!-- p = a \cdot i = b \cdot j, --> +<!-- $$ --> +<!-- ou encore $p / a = i$ et $p / b = j$. --> + +## Pseudo-code + +```C +int ppcm(int a, int b) { + for (i in [1, b]) { + if a * i is divisible by b { + return a * i + } + } +} +``` + + +# Le calcul du PPCM (6/6) Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a * i = b * j` ou encore `p / a = i` et `p / b = j`. @@ -160,3 +247,33 @@ int main() { } ``` + +```C +#include <stdio.h> +void main() { + int n = 90; + int m = 78; + printf("n = %d et m = %d\n", n, m); + + // algorithme naif + int gcd = 1; + for (int div = n; div >= 2; div--) { + if (n % div == 0 && m % div == 0) { + gcd = div; + break; + } + } + printf("Le pgcd de %d et %d est %d\n",n,m,gcd); + + // algorithme d'Euclide + int tmp_n = n; + int tmp_m = m; + while (tmp_n % tmp_m > 0) { + int tmp = tmp_n; + tmp_n = tmp_m; + tmp_m = tmp%tmp_m; + } + printf("Le pgcd de %d et %d est %d\n", n, m, tmp_m); +} + +```