Algorithme d'Euclide

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Algorithme d'Euclide

Messagepar djiblamb » Samedi 02 Mai 2009, 10:10

Enseignant la spécialité mathématiques en TS, il y a longtemps que je souhaitais me simplifier le travail pour présenter les différentes étapes de l'algorithme d'Euclide. J'ai profité des dernières vacances pour me pencher sur le sujet, mais... j'ai besoin d'aide.
J'ai commencé, avec l'aide du package xlop et sa documentation, par écrire le bout de code qui suit :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\setlength{\parindent}{0cm}

\begin{document}
\opcopy{1733}{a}%
\opcopy{1331}{b}%
\opidiv*{a}{b}{q}{r}%
$\opprint{a}=\opprint{b}\times \opprint{q}+\opprint{r}$\\
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b}%
\opidiv*{a}{b}{q}{r}%
$\opprint{a}=\opprint{b}\times \opprint{q}+\opprint{r}$\\
\repeat

Le PGCD de $1733$ et $1331$ est donc $\opprint{b}$.
\end{document}


Tout fonctionne très bien. J'en ai ensuite fait une macro, que voici :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\setlength{\parindent}{0cm}

\newcommand{\algeucl}[2]{%
\opcopy{#1}{a}%
\opcopy{#2}{b}%
\opidiv*{a}{b}{q}{r}%
$\opprint{a}=\opprint{b}\times \opprint{q}+\opprint{r}$\\
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
$\opprint{a}=\opprint{b}\times \opprint{q}+\opprint{r}$\\
\repeat

Le PGCD de $#1$ et $#2$ est donc $\opprint{b}$.
}

\begin{document}
PGCD de $60$ et $36$ :\\

\algeucl{60}{36}\\

PGCD de $1733$ et $1331$ :\\

\algeucl{1733}{1331}
\end{document}


Toujours pas de souci.

Les ennuis ont commencé quand j'ai cherché à améliorer la présentation : utilisation du package numprint et alignement des égalités avec un environnement align. La première idée fonctionne bien en dehors d'une macro. Voici le code correspondant.

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\setlength{\parindent}{0cm}

\begin{document}
\makeatletter
\opcopy{1733}{a}%
\opcopy{1331}{b}%
\opidiv*{a}{b}{q}{r}%
$\nombre{\Op@a}=\nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}$\\
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
$\nombre{\Op@a}=\nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}$\\
\repeat

Le PGCD de $\nombre{1733}$ et $\nombre{1331}$ est donc $\nombre{\Op@b}$.
\makeatother

\end{document}


En revanche, je n'arrive pas à écrire ceci dans une macro. Le code suivant ne passe pas :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\setlength{\parindent}{0cm}

\newcommand{\algeucl}[2]{%
\makeatletter
\opcopy{#1}{a}%
\opcopy{#2}{b}%
\opidiv*{a}{b}{q}{r}%
$\nombre{\Op@a}=\nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}$\\
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
$\nombre{\Op@a}=\nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}$\\
\repeat

Le PGCD de $\nombre{#1}$ et $\nombre{#2}$ est donc $\nombre{\Op@b}$.
\makeatother
}

\begin{document}
\algeucl{1733}{1331}
\end{document}


Quelqu'un voit-il comment l'améliorer ?
Enfin, dernière bizarrerie (pour moi, qui ne maîtrise pas la langage TeX). Quand j'essaie de centrer et d'aligner les égalités obtenues, la boucle ne s'exécute pas. Voici le code qui me pose souci.

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\usepackage[fleqn]{amsmath}
\setlength{\parindent}{0cm}

\begin{document}
\makeatletter
\begin{align*}
\opcopy{1733}{a}%
\opcopy{1331}{b}%
\opidiv*{a}{b}{q}{r}%
\nombre{\Op@a} & = \nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}\\
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
\nombre{\Op@a} & = \nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}
\repeat
\end{align*}

Le PGCD de $\nombre{1733}$ et $\nombre{1331}$ est donc $\nombre{\Op@b}$.
\makeatother

\end{document}


Pardon d'avoir été si long. D'avance merci pour vos idées.
djib.
djiblamb
Hecto-utilisateur
 
Messages: 89
Inscription: Samedi 27 Septembre 2008, 09:58
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Algorithme d'Euclide

Messagepar rebouxo » Samedi 02 Mai 2009, 19:54

Je te conseille d'aller sur f.c.t.t le groupe usenet. Jean-Côme (le papa de xlop) y rôde souvent. Il pourra répondre à tes questions.

Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6799
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Algorithme d'Euclide

Messagepar pg » Samedi 02 Mai 2009, 20:27

Pour ton premier problème, il faut mettre \makeatletter et \makeatother en dehors de ta commande (à l'intérieur, ils ne font rien, car les catcodes sont déjà figés) :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\setlength{\parindent}{0cm}

\makeatletter
\newcommand{\algeucl}[2]{%
\opcopy{#1}{a}%
\opcopy{#2}{b}%
\opidiv*{a}{b}{q}{r}%
$\nombre{\Op@a}=\nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}$\\
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
$\nombre{\Op@a}=\nombre{\Op@b}\times \nombre{\Op@q}+\nombre{\Op@r}$\\
\repeat

Le PGCD de $\nombre{#1}$ et $\nombre{#2}$ est donc $\nombre{\Op@b}$.
}
\makeatother

\begin{document}
\algeucl{1733}{1331}
\end{document}


Pour ton deuxième problème, on peut contourner la difficulté en écrivant, à chaque étape, ce que l'on veut écrire dans une macro \tampon qui va contenir ce que l'on veut mettre dans align* et ensuite seulement imprimer le align* :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\usepackage[fleqn]{amsmath}
\setlength{\parindent}{0cm}

\newcommand*\eaddto[2]{%
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}
\newcommand{\tampon}{}

\begin{document}
\makeatletter
\renewcommand{\tampon}{}
\opcopy{1733}{a}%
\opcopy{1331}{b}%
\opidiv*{a}{b}{q}{r}%
\eaddto\tampon{
\noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
\edef\nombrea{\Op@a}
\edef\nombreb{\Op@b}
\edef\nombreq{\Op@q}
\edef\nombrer{\Op@r}
\eaddto\tampon{\cr \noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\repeat
\begin{align*}
\tampon
\end{align*}

Le PGCD de $\nombre{1733}$ et $\nombre{1331}$ est donc $\nombre{\Op@b}$.
\makeatother

\end{document}
pg
Modérateur
 
Messages: 2584
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Algorithme d'Euclide

Messagepar djiblamb » Dimanche 03 Mai 2009, 10:03

Merci beaucoup à pg pour ces contributions éclairées. J'aurais été bien incapable de résoudre le second problème.
Tout fonctionne parfaitement. Du coup, j'ai tout mis dans une macro, que voici :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\usepackage[fleqn]{amsmath}
\setlength{\parindent}{0cm}

\newcommand*\eaddto[2]{%
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}
\newcommand{\tampon}{}
\makeatletter
\newcommand{\algeucl}[2]{%
\renewcommand{\tampon}{}
\opcopy{#1}{a}%
\opcopy{#2}{b}%
\opidiv*{a}{b}{q}{r}%
\eaddto\tampon{
\noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
\edef\nombrea{\Op@a}
\edef\nombreb{\Op@b}
\edef\nombreq{\Op@q}
\edef\nombrer{\Op@r}
\eaddto\tampon{\cr \noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\repeat
\begin{align*}
\tampon
\end{align*}

Le PGCD de $\nombre{#1}$ et $\nombre{#2}$ est donc $\nombre{\Op@b}$.
}
\makeatother
\begin{document}
\algeucl{1597}{987}
\end{document}


Encore merci.
JBL
djiblamb
Hecto-utilisateur
 
Messages: 89
Inscription: Samedi 27 Septembre 2008, 09:58
Statut actuel: Actif et salarié | Enseignant

Re: Algorithme d'Euclide

Messagepar GMaths » Mercredi 06 Mai 2009, 06:38

une suggestion :

ajouter :

\vspace*{-\baselineskip} % pour supprimer la ligne blanche


avant :

\begin{align*}\tampon\end{align*}


pour, comme le dit le commentaire, supprimer la ligne blanche...
quelle ligne blanche ? tester cela, pour la voir :

Code: Tout sélectionner
\fbox{\begin{minipage}{7cm}\algeucl{1597}{687}\end{minipage}}
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Algorithme d'Euclide

Messagepar pg » Mercredi 06 Mai 2009, 09:02

Tu peux aussi essayer un \noindent. Pas tout à fait équivalent, mais le résultat sera meilleur si on met du texte juste avant la commande \algeucl comme dans :

Code: Tout sélectionner
L'algorithme d'Euclide s'écrit
\algeucl{1597}{987}
pg
Modérateur
 
Messages: 2584
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Algorithme d'Euclide

Messagepar GMaths » Mercredi 06 Mai 2009, 12:20

pg a écrit:Tu peux aussi essayer un \noindent. Pas tout à fait équivalent, mais le résultat sera meilleur si on met du texte juste avant la commande \algeucl comme dans :

Code: Tout sélectionner
L'algorithme d'Euclide s'écrit
\algeucl{1597}{987}


euh... je n'ai pas essayé mais je doute, si tu remplaces ma ligne

Code: Tout sélectionner
\vspace*{-\baselineskip} % pour supprimer la ligne blanche


par

Code: Tout sélectionner
\noindent


que tu n'aies pas une ligne blanche entre "L'algorithme d'Euclide s'écrit" et la première égalité.
Mais je n'ai pas essayé... ou je n'ai peut-être pas compris ce que tu veux dire.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Algorithme d'Euclide

Messagepar pg » Mercredi 06 Mai 2009, 12:48

GMaths a écrit:je doute [...] que tu n'aies pas une ligne blanche entre "L'algorithme d'Euclide s'écrit" et la première égalité.


Essaye et tu verra :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\usepackage[fleqn]{amsmath}
\setlength{\parindent}{0cm}

\newcommand*\eaddto[2]{%
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}
\newcommand{\tampon}{}
\makeatletter
\newcommand{\algeucl}[2]{%
\renewcommand{\tampon}{}
\opcopy{#1}{a}%
\opcopy{#2}{b}%
\opidiv*{a}{b}{q}{r}%
\eaddto\tampon{
\noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
\edef\nombrea{\Op@a}
\edef\nombreb{\Op@b}
\edef\nombreq{\Op@q}
\edef\nombrer{\Op@r}
\eaddto\tampon{\cr \noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\repeat
%\vspace*{-\baselineskip}
\noindent
\begin{align*}
\tampon
\end{align*}

Le PGCD de $\nombre{#1}$ et $\nombre{#2}$ est donc $\nombre{\Op@b}$.
}
\makeatother
\begin{document}

L'algorithme d'Euclide s'écrit
\algeucl{30}{13}

L'algorithme d'Euclide s'écrit

\algeucl{30}{13}

\end{document}


En commentant le \noindent, une ligne blanche apparaît dans le deuxième cas (mais pas dans le premier) :

align_seul.png
align_seul.png (20.89 Kio) Vu 630 fois


Si on commente le \noindent et décommente le \vspace*{-\baselineskip}, il n'y a pas assez d'espace dans le premier cas (mais le second est correct) :

align_vspace.png
align_vspace.png (20.64 Kio) Vu 629 fois


Avec le \noindent, les deux cas fournissent le même espacement :

align_noindent.png
align_noindent.png (20.7 Kio) Vu 631 fois
pg
Modérateur
 
Messages: 2584
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Algorithme d'Euclide

Messagepar GMaths » Mercredi 06 Mai 2009, 13:03

Il me semblait bien que l'on ne parlait pas de la même chose. ;-)

Ce qui me convient moi, c'est un environnement qui ne me laisse pas de ligne blanche !
Je ne veux pas de cette ligne intermédiaire que tu as dans 5 des 6 cas.
(Le cas qui me convient, c'est celui où il n'y a pas assez d'espace, dis tu. ;-))

C'est facile d'en ajouter quand on en veut une...
... mais avoir un environnement qui t'en mets une systématiquement, cela me semble
gênant.

Les goûts et les couleurs... :mrgreen:

Ma "déformation" vient probablement du fait que l'on est limité en crédit photocopie dans mon bahut. :lol:
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Algorithme d'Euclide

Messagepar pg » Mercredi 06 Mai 2009, 13:14

L'espace avant et après align n'est pas une ligne blanche (au moins au sens de TeX), juste de l'espace, alors que, si on utilise un align juste au début d'une minipage, il y a à la fois une ligne blanche et de l'espace.

Si tu veux supprimer les espaces avant ou après align, la solution avec \noindent fonctionnera à condition de changer aussi (au moins localement, sinon mettre dans la préambule) \abovedisplayskip et compagnie :

Code: Tout sélectionner
\documentclass[a4paper,12pt]{article}
\usepackage[frenchb]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xlop}
\usepackage{numprint}
\usepackage[fleqn]{amsmath}
\setlength{\parindent}{0cm}

\newcommand*\eaddto[2]{%
   \edef\tmp{#2}%
   \expandafter\addto
   \expandafter#1%
   \expandafter{\tmp}%
}
\newcommand{\tampon}{}
\makeatletter
\newcommand{\algeucl}[2]{%
\renewcommand{\tampon}{}
\opcopy{#1}{a}%
\opcopy{#2}{b}%
\opidiv*{a}{b}{q}{r}%
\eaddto\tampon{
\noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\loop
\opcmp{r}{0}\ifopneq %
\opcopy{b}{a} \opcopy{r}{b} %
\opidiv*{a}{b}{q}{r}%
\edef\nombrea{\Op@a}
\edef\nombreb{\Op@b}
\edef\nombreq{\Op@q}
\edef\nombrer{\Op@r}
\eaddto\tampon{\cr \noexpand\nombre{\Op@a} & = \noexpand\nombre{\Op@b}\times \noexpand\nombre{\Op@q}+\noexpand\nombre{\Op@r}}
\repeat
\noindent\begingroup
\abovedisplayskip=0pt
\abovedisplayshortskip=0pt
\belowdisplayskip=0pt
\belowdisplayshortskip=0pt
\begin{align*}
\tampon
\end{align*}\endgroup

Le PGCD de $\nombre{#1}$ et $\nombre{#2}$ est donc $\nombre{\Op@b}$.
}
\makeatother
\begin{document}

L'algorithme d'Euclide s'écrit
\algeucl{30}{13}

L'algorithme d'Euclide s'écrit

\algeucl{30}{13}

Essai avec minipage

\begin{minipage}{7cm}
\algeucl{30}{13}
\end{minipage}

\end{document}


Voici le résultat (un peu serré à mon goût, mettre 3pt au lieu de 0pt serait probablement mieux) :

align_nospace.png
align_nospace.png (28.87 Kio) Vu 605 fois
pg
Modérateur
 
Messages: 2584
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Algorithme d'Euclide

Messagepar GMaths » Mercredi 06 Mai 2009, 13:17

GMaths a écrit:(Le cas qui me convient, c'est celui où il n'y a pas assez d'espace, dis tu. ;-))


peut-être pas assez, ok, par rapport à la distance entre les équations qui suivent ...
... mais c'est ajustable

et l'essentiel, pour moi, est que

Code: Tout sélectionner
\fbox{\begin{minipage}{7cm}\algeucl{1597}{687}\end{minipage}}


ne me donne pas de ligne blanche en début de cadre.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: Algorithme d'Euclide

Messagepar GMaths » Mercredi 06 Mai 2009, 13:20

Je viens de lire l'autre message déposé entre temps : je relis et je teste, merci. :-)
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Ahrefs [Bot], Baidu [Spider], Bing [Bot], DotBot [Crawler], Grapeshot [Crawler], Yandex [Bot] et 23 invités