From 6054527634cced21e763b606c00e8fddb677c1af Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Mon, 27 Sep 2021 23:48:02 +0200 Subject: [PATCH] added gitlab-ci and corrected typo --- .gitlab-ci.yml | 59 ++++++++++++++ slides/cours_2.md | 195 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 206 insertions(+), 48 deletions(-) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..5c8b965 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,59 @@ +image: omalaspinas/pandoc:latest + +variables: + GIT_SUBMODULE_STRATEGY: recursive + + +before_script: + ## + ## Install ssh-agent if not already installed, it is required by Docker. + ## (change apt-get to yum if you use an RPM-based image) + ## + - 'which ssh-agent || (pacman -S --noconfirm openssh)' + - 'which rsync || (pacman -S --noconfirm rsync)' + + + ## + ## Run ssh-agent (inside the build environment) + ## + - eval $(ssh-agent -s) + + ## + ## Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store + ## We're using tr to fix line endings which makes ed25519 keys work + ## without extra base64 encoding. + ## https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556 + ## + - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null + + ## + ## Create the SSH directory and give it the right permissions + ## + - mkdir -p ~/.ssh + - chmod 700 ~/.ssh + + ## + ## Add host id to known_hosts + ## + - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts + - chmod 644 ~/.ssh/known_hosts + + + +build_only: + script: + - cd slides + - make + - make deploy + - rsync -avz algo_cours ur1bg_malas@ur1bg.ftp.infomaniak.com:web/malaspinas/ + +build_artifacts: + script: + - cd slides + - make + artifacts: + paths: + - "*.pdf" + - "*.html" + only: + - tags diff --git a/slides/cours_2.md b/slides/cours_2.md index e3fedbf..e900174 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/6) +# Le calcul du PPCM (1/5) ## Définition @@ -86,14 +86,15 @@ $$ $$ On garde tous les premiers à la puissance la plus élevée $$ -PPCM(36, 45)=2^2\cdot 3^2\cdot 5=180. +PPCM(36, 90)=2^2\cdot 3^2\cdot 5=180. $$ -# Le calcul du PPCM (2/6) +# Le calcul du PPCM (2/5) ## Exemple d'algorithme ```C +PPCM(36, 90): 36 < 90 // 36 + 36 72 < 90 // 72 + 36 108 > 90 // 90 + 90 @@ -112,10 +113,8 @@ $$ ## et codez-le! -. . . - -# Le calcul du PPCM (3/6) +# Le calcul du PPCM (3/5) ## Tentative de correction @@ -134,15 +133,17 @@ int main() { } ``` -Combien d'additions / comparaisons au pire? +. . . + +* Combien d'additions / comparaisons au pire? -# Le calcul du PPCM (4/6) +# Le calcul du PPCM (4/5) -## Comment décrire une fonction qui ferait ce calcul (arguments, sorties)? +## Réusinage: Comment décrire une fonction qui ferait ce calcul (arguments, sorties)? . . . -En `C` on pourrait le décrire comme +En `C` on pourrait la décrire comme ```C int ppcm(int a, int b); // La **signature** de cette fonction @@ -154,34 +155,12 @@ int ppcm(int a, int b); // La **signature** de cette fonction Par groupe de 3: -* réfléchissez à un algorithme donnant le PPCM de deux nombres; +* réfléchissez à un algorithme alternatif donnant le PPCM de deux nombres; * écrivez l'algorithme en pseudo-code. -# Le calcul du PPCM (5/6) +# Le calcul du PPCM (5/5) -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) +## Indication 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`. @@ -192,6 +171,8 @@ Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a <!-- $$ --> <!-- ou encore $p / a = i$ et $p / b = j$. --> +. . . + ## Pseudo-code ```C @@ -218,7 +199,7 @@ int ppcm(int a, int b) { #include <stdlib.h> int main() { - int n = 15,m = 12; + int n = 15, m = 12; int i = 1; while (n * i % m != 0) { i++; @@ -247,34 +228,152 @@ int main() { } ``` -# Le PGCD +# Le calcul du PGCD (1/N) + +## 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 -#include <stdio.h> -void main() { - int n = 90; - int m = 78; - printf("n = %d et m = %d\n", n, m); +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/6) + +## Algorithme + +Par groupe de 3: + +* réfléchissez à un algorithme alternatif donnant le PPCM de deux nombres; +* écrivez l'algorithme en pseudo-code. - // algorithme naif +. . . + +## 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/6) + +## Transcrivez cet exemple en algorithme (groupe de 3) et codez-le! + +. . . + +## 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--) { + 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); + printf("Le pgcd de %d et %d est %d\n", n, m, gcd); +} +``` - // algorithme d'Euclide +# Le calcul du PGCD (4/6) + +## 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: + +* analysez l'exemple ci-dessus; +* transcrivez le en pseudo-code. + +# Le calcul du PGCD (5/6) + +## 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. + +. . . + +## 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) { + 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); } - ``` + -- GitLab