diff --git a/slides/cours_2.md b/slides/cours_2.md index ae24e44ed5a47172370a135a8ca02a0769edb813..660bf8184e15e88a3c1bca0a25bc600d7c0ce712 100644 --- a/slides/cours_2.md +++ b/slides/cours_2.md @@ -264,7 +264,7 @@ Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a ```C int ppcm(int a, int b) { for (i in [1, b]) { - if a * i is divisible by b { + if a * i est divisible par b { return a * i } } @@ -312,153 +312,6 @@ int main() { } ``` -# Le calcul du PGCD (1/5) -## Définition - -Le plus grand commun diviseur (PGCD) de deux nombres entiers non nuls est le -plus grand entier qui les divise en même temps. - -## Exemples: - -```C -PGCD(3, 4) = 1, -PGCD(4, 6) = 2, -PGCD(5, 15) = 5. -``` - -. . . - -## 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 basse -$$ -PGCD(36, 90)=2^{\min{1,2}}\cdot 3^{\min{2,2}}\cdot 5^{\min{0,1}}=18. -$$ - -# Le calcul du PGCD (2/5) - -## Algorithme - -Par groupe de 3 (5-10min): - -* réfléchissez à un algorithme alternatif donnant le PGCD de deux nombres; -* écrivez l'algorithme en pseudo-code. - -. . . - -## Exemple d'algorithme - -```C -PGCD(36, 90): -90 % 36 != 0 // otherwise 36 would be PGCD -90 % 35 != 0 // otherwise 35 would be PGCD -90 % 34 != 0 // otherwise 34 would be PGCD -... -90 % 19 != 0 // otherwise 19 would be PGCD -90 % 18 == 0 // The end! -``` - -* 18 modulos, 18 assignations, et 18 comparaisons. - -# Le calcul du PGCD (3/5) - -## Transcrivez cet exemple en algorithme (groupe de 3) et codez-le (5-10min)! - -. . . - -## Optimisation - -* Combien d'additions / comparaisons au pire? -* Un moyen de le rendre plus efficace? - -. . . - -## Tentative de correction - -```C -void main() { - int n = 90, m = 78; - int gcd = 1; - for (int div = n; div >= 2; div--) { // div = m, sqrt(n) - if (n % div == 0 && m % div == 0) { - gcd = div; - break; - } - } - printf("Le pgcd de %d et %d est %d\n", n, m, gcd); -} -``` - -# Le calcul du PGCD (4/5) - -## Réusinage: l'algorithme d'Euclide - -`Dividende = Diviseur * Quotient + Reste` - -```C -PGCD(35, 60): -35 = 60 * 0 + 35 // 60 -> 35, 35 -> 60 -60 = 35 * 1 + 25 // 35 -> 60, 25 -> 35 -35 = 25 * 1 + 10 // 25 -> 35, 20 -> 25 -25 = 10 * 2 + 5 // 10 -> 25, 5 -> 10 -10 = 5 * 2 + 0 // PGCD = 5! -``` - -. . . - -## Algorithme - -Par groupe de 3 (5-10min): - -* analysez l'exemple ci-dessus; -* transcrivez le en pseudo-code. - -# Le calcul du PGCD (5/5) - -## Pseudo-code - -```C -int pgcd(int a, int b) { - tmp_n = n - tmp_m = m - while (tmp_m does not divide tmp_n) { - tmp = tmp_n - tmp_n = tmp_m - tmp_m = tmp modulo tmp_m - } - return tmp_m -} -``` - -# Le code du PGCD de 2 nombres - -## Implémentez le pseudo-code et postez le code sur matrix (5min). - -. . . - -## Un corrigé possible - -```C -#include <stdio.h> -void main() { - int n = 90; - int m = 78; - printf("n = %d et m = %d\n", n, m); - 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); -} -```