<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% Time-stamp: &lt;2019-09-24 10:45:10 administrateur&gt;
% CrÃ©ation : 2019-08-24T14:40:52+0200

Il s'agit maintenant de fournir quelques commandes de document permettant de
crÃ©er un exemple du crible d'EratosthÃ¨ne comme ceci:
\begin{center}\label{lecrible100}
  \eratosthene{100}
  \EcrireCribleEratosthene{100}
\end{center}

Ce sera l'occasion d'Ã©voquer un des \og objets de haut niveau\fg
fourni par \Expliii. Non, je ne parle pas de programmation objet!

Une fois encore, je place le code dans un ``bÃªte''
fichier~\texttt{.tex} d'oÃ¹ les bien connus dÃ©sormais
\Macro{ExplSyntaxOn} et \Macro{ExplSyntaxOff} en dÃ©but et fin de
fichier.

\section{Buts et algorithmes}
\label{sec:butsalgo}

L'objet dont il est question est appelÃ© \English{intarray}. Il est
global et, une fois crÃ©Ã©, ne peut Ãªtre dÃ©truit\footnote{C'est du moins
  ce que je comprends Ã&nbsp; la lecture \TO que j'ai voulu rapide\TF du
  source. En tout cas \Expliii ne fournit pas d'outil pour ce
  faire.}. Dans certains langages on parle de \emph{vecteurs} mais il
s'agit ici d'un vecteur d'\glspl{entier} (relatifs) et d'entiers
seulement.  Sa taille doit Ãªtre donnÃ©e Ã&nbsp; la crÃ©ation et ne peut pas
Ãªtre changÃ©e.

Avec la commande \Macro{eratosthene}, on crÃ©e deux \emph{vecteurs
  d'entiers}. Le premier, \Macro{__ERA_dv_ia}, contient en \(n\)\ieme
place le plus petit diviseur premier de~\(n\). Le second,
\Macro{__ERA_qt_ia}, contient en \(n\)\ieme place le quotient de~\(n\)
et de ce diviseur premier dont je viens de parler.

La commande  \Macro{eratosthene} ne prend qu'un argument, un entier
naturel, qui est la taille des deux vecteurs sus-dÃ©finis.

Une fois les vecteurs crÃ©Ã©s, on pourra les utiliser pour Ã©crire le
crible d'EratosthÃ¨ne comme vu prÃ©cÃ©demment ou, pour donner un autre
exemple, obtenir la dÃ©composition d'un entier comme produit de ses
diviseurs premiers.

\section{CrÃ©ation des vecteurs}
\label{sec:creationvecteurs}

\Fragment[commande \texttt{eratosthene},
initialisation]{5}{10}{./codes/erato-def}

En \Ligne{6} j'ouvre un groupe avec \Macro{group_begin+} qui sera
fermÃ© juste avant l'accolade fermante marquant la fin de la dÃ©finition
de \Macro{eratosthene} en \Ligne{45}.

Dans ce groupe je vais crÃ©er un \emph{entier} avec
\Macro{int_new+N}. Il est crÃ©Ã© globalement mais je le dÃ©truis en
\Ligne{44} avec \Macro{cs_undefine+N}. Il ne survivra donc pas Ã&nbsp; la
macro.

Je crÃ©e Ã©galement les deux vecteurs en lignes~\(9\) et~\(10\) Ã&nbsp; l'aide
de \Macro{intarray_new+Nn} qui prend en 2\ieme argument la taille du
vecteur qui est l'argument passÃ© Ã&nbsp; \Macro{eratosthene}. Initialement
ces vecteurs ne contiennent que des zÃ©ros.

Les noms des vecteurs devraient se terminer par \texttt{_intarray}
mais je me suis permis un raccourci en \texttt{_ia}. Leurs noms
commencent avec le double soulignÃ© puisque ce sont des
\glspl{variable} \emph{privÃ©es}. \texttt{ERA} est le sigle de ce
pseudo-module.

En \Ligne{8} je donne Ã&nbsp; la \gls{variable}
\Macro{l_ERA_diviseur_max_int} la partie entiÃ¨re de la racine carrÃ©e
de la taille des vecteurs \TO valeur donnÃ©e par~|#1|\TF en
\emph{transtypant} le rÃ©sultat de l'opÃ©ration |floor(| |sqrt (| |#1|
|))| qui est un \gls{flottant} en un \gls{entier}. 

\subsection{Une commande auxiliaire}

Je crÃ©e maintenant, Ã&nbsp; l'intÃ©rieur de la dÃ©finition de
\Macro{eratosthene} la commande \Macro{ERA_marquer_de_a_par+nnn} que,
de fait, je n'utiliserai qu'une fois, en \Ligne{33}, et dont, par
consÃ©quent, j'aurais pu faire l'Ã©conomie, au risque d'embrouiller
considÃ©rablement le code suivant. 

\Fragment[commande \texttt{eratosthene},
auxiliaire]{12}{20}{./codes/erato-def}

Je crÃ©e cette commande localement grÃ¢ce Ã&nbsp; \Macro{cs_set+Nn}, elle ne
survivra donc pas au groupe. Je commence, dans la dÃ©finition de
\Macro{ERA_marquer_de_a_par+nnn}, par donner comme valeur Ã&nbsp; la
\gls{variable} \emph{locale} \Macro{l_tmpa_int} le quotient entier des
1\ier et 3\ieme arguments de la commande.

Puis, lignes~\(15\) Ã&nbsp;~\(19\), j'utilise \Macro{int_step_inline+nnnn}
pour accomplir le travail. C'est une boucle \POUR. L'index \TO
implicite et anonyme\TF parcourt les entiers en partant du premier
argument de cette derniÃ¨re macro jusqu'au troisiÃ¨me argument avec un
pas donnÃ© par le deuxiÃ¨me. Le 4\ieme argument est le code \emph{en
  ligne} dans lequel |#1| est l'indice de la boucle. Enfin, |#1|
serait l'indice de la boucle si on utilisait directement la macro
\Macro{int_step_inline+nnnn} au niveau du document. Ici comme je
l'utilise dans une dÃ©finition incluse elle-mÃªme dans une dÃ©finition,
je dois doubler les diÃ¨ses deux fois d'oÃ¹ le |####1| que l'on voit
dans le code.

En \Ligne{19}, j'incrÃ©mente \Macro{l_tmpa_int}. De la \Ligne{16} Ã&nbsp; la
\Ligne{18}, j'ai un test \SIALORS avec \Macro{int_compare+nNnT}:
les actions des lignes~\(17\) et~\(18\) ne seront accomplies que s'il
est vrai que la |####1|-iÃ¨me composante du vecteur \Macro{__ERA_dv_ia}
est nulle \CAD que ce nombre n'a pas encore Ã©tÃ© traitÃ©. Dans ce cas,
je place la valeur du pas~|##3| \TO c'est le plus petit diviseur
premier du nombre considÃ©rÃ©\TF Ã&nbsp; la bonne place dans le vecteur des
diviseurs et je place le quotient Ã&nbsp; la place idoine dans le vecteur
des quotients. L'incrÃ©mentation faite en-dessous me dispense de
calculer ce quotient Ã&nbsp; l'aide d'une division entiÃ¨re.

Comme le nom l'indique la macro \Macro{intarray_gset+Nnn} rÃ©alise une
affectation \textbf{g}lobale dans le vecteur donnÃ© en 1\ier argument. C'est
bien ce que je veux. Le 2\ieme argument donne l'indice, le 3\ieme la
valeur Ã&nbsp; y placer.

\subsection{Traitement des entiers pairs}
\label{sec:lespairs}

Je retourne maintenant au niveau de la dÃ©finition de la commande
\Macro{eratosthene} et je commence par traiter les nombres pairs.

\Fragment[commande \texttt{eratosthene},
nombres pairs]{23}{28}{./codes/erato-def}

Ã€ ce moment de l'action, les deux  vecteurs ne contiennent que des
zÃ©ros, cela nous dispense du test tel qu'il apparaÃ®t dans la macro
auxiliaire vue ci-dessus. De plus, le premier quotient (\(2/2\)) est
clairement~\(1\) d'oÃ¹ la \Ligne{23}.

On retrouve ensuite \Macro{int_step_inline+nnnn} pour traiter les
nombres pairs en partant de~\(2\), avec un pas de~\(2\), et en
finissant Ã&nbsp; la taille des vecteurs~|#1|.

\subsection{Traitement des entiers impairs}
\label{sec:lesimpairs}

Le traitement des entiers impairs se fera en deux Ã©tapes, la deuxiÃ¨me
Ã©tant d'une simplicitÃ© dÃ©concertante.

\Fragment[commande \texttt{eratosthene},
impairs]{31}{36}{./codes/erato-def}

Nous avons dÃ©jÃ&nbsp; vu tout ce que j'utilise ici. On notera, lignes~\(35\)
et~\(36\), la boucle permettant, en avanÃ§ant de~\(2\) en~\(2\), de
trouver le prochain nombre impair non traitÃ© avec
\Macro{int_do_until+nNnn} analogue, pour rÃ©aliser une boucle sur les
entiers, de \Macro{bool_do_until+Nn} prÃ©sentÃ©e page~\pageref{booldountilNn}. 

La derniÃ¨re boucle traite les nombres impairs qui n'ont pas encore Ã©tÃ©
vus. On pourrait amÃ©liorer la chose en commenÃ§ant avec le premier
impair non-vu, une fois encore je laisse Ã§a en exercice!  

\Fragment[commande \texttt{eratosthene}]{39}{42}{./codes/erato-def}

\section{Deux exemples d'utilisation}
\label{sec:utilisationcrible}

Les deux vecteurs ayant Ã©tÃ© crÃ©Ã©s, on peut les utiliser. Je donne deux
exemples: l'Ã©criture du \og crible\fg, l'Ã©criture d'un nombre comme
produit de ses facteurs premiers \TO version amÃ©liorable\TF.

\subsection{Ã‰criture du crible}
\label{sec:ecriturecrible}

Je prÃ©sente maintenant la commande permettant de crÃ©er le tableau
prÃ©sentÃ© en page~\pageref{lecrible100}.

\Fragment[Ã©criture du crible, commande de
document]{69}{70}{./codes/erato-def}

L'unique argument de \Macro{EcrireCribleEratosthene} doit Ãªtre un
entier positif plus petit que la taille des deux vecteurs crÃ©Ã©s
auparavant sinon on aura une erreur d'accÃ¨s aux vecteurs dÃ» Ã&nbsp; un
indice hors bornes.

Bien entendu, cette commande se contente de refiler le boulot Ã&nbsp; la
commande interne \Macro{ERA_presenter_nieme+n} par l'intermÃ©diaire de
la boucle \Macro{int_step_inline+nn}.

Soulevons le capot.

\Fragment[Ã©criture du crible, commande interne]{50}{67}{./codes/erato-def}

Pour la crÃ©ation du tableau, je copie servilement le code que fourni
Christian \textsc{Tellechea} dans~\autocite{tellechea}. J'utilise
quand mÃªme la macro \Macro{framebox} fournie par \LaTeXe{} car
personne n'est obligÃ© de rÃ©inventer la roue chaque matin!

\subsection{DÃ©composition d'un nombre en facteurs premiers}
\label{sec:facteurspremiers}

Regardons Ã&nbsp; prÃ©sent la commande permettant d'obtenir:
\EcrireDiviseurs{78} \qquad \EcrireDiviseurs*{75} \qquad
\EcrireDiviseurs*{64}
\par\noindent
avec le code
\par\noindent
|\EcrireDiviseurs{78}| |\qquad| |\EcrireDiviseurs*{75}| |\qquad| |\EcrireDiviseurs*{64}|.

Voici le code: 
\Fragment[facteurs premiers]{73}{96}{./codes/erato-def}

Comme on l'aura remarquÃ©, la commande \Macro{EcrireDiviseurs} admet
une variante Ã©toilÃ©e. On l'obtient facilement avec
\Macro{NewDocumentCommand} en donnant comme descriptif de 1\ier
argument le~|s| que l'on voit en \Ligne{73}.

Avec \Macro{IfBooleanF} de la \Ligne{82}, on ne place un saut de
paragraphe \TO avec \Macro{par}\TF que s'il n'y a \textsb{pas}
d'Ã©toile.

Pour rÃ©agir Ã&nbsp; la prÃ©sence ou l'absence d'un lexÃ¨me \TO une Ã©toile~|*|
avec le descripteur d'argument~|s|, n'importe quel lexÃ¨me avec~|t| \TF
on dispose Ã©galement de \Macro{IfBooleanT} et de \Macro{IfBooleanTF}.

On retrouve les mÃªmes techniques de crÃ©ation d'\glspl{entier} dans un
groupe et leur destruction en sortie du corps de la dÃ©finition de la
commande. J'Ã©vite les entiers de brouillon fournis par \Expliii{} car
je prÃ©fÃ¨re, pour ne pas me perdre, des noms plus explicites. De toute
faÃ§on, j'ai besoin d'au moins trois entiers locaux. On devrait pouvoir
Ã©crire la dÃ©composition de \(75\) sous la forme \(75=3\times5^{2}\) Ã&nbsp;
l'aide d'un \gls{entier} supplÃ©mentaire. LÃ&nbsp; encore, l'exercice etc.


%%% Local Variables:
%%% mode: latex
%%% TeX-master: "dun19expl3"
%%% End:
</pre></body></html>