% Time-stamp: <2019-08-26 11:48:16 administrateur> % ReCréation : 2019-08-23T10:40:31+0200 \ExplSyntaxOn \NewDocumentCommand{ \eratosthene } { m } { \group_begin: \int_new:N \l_ERA_diviseur_max_int \int_set:Nn \l_ERA_diviseur_max_int { \fp_to_int:n { floor( sqrt ( #1 ))} } \intarray_new:Nn \__ERA_qt_ia { #1 } \intarray_new:Nn \__ERA_dv_ia { #1 } % commande auxiliaire -------------------------------------------------------- \cs_set:Nn \ERA_marquer_de_a_par:nnn { \int_set:Nn \l_tmpa_int { ##1 / ##3} \int_step_inline:nnnn { ##1 } { ##3 } { ##2 } { \int_compare:nNnT { \intarray_item:Nn \__ERA_dv_ia { ####1 } } = { 0 } { \intarray_gset:Nnn \__ERA_dv_ia { ####1 } { ##3 } \intarray_gset:Nnn \__ERA_qt_ia { ####1 } { \l_tmpa_int } } \int_incr:N \l_tmpa_int } } % ---------------------------------------------------------------------------- % marquer les pairs \int_set:Nn \l_tmpa_int { 1 } \int_step_inline:nnnn { 2 } { 2 } { #1 } { \intarray_gset:Nnn \__ERA_dv_ia { ##1 } { 2 } \intarray_gset:Nnn \__ERA_qt_ia { ##1 } { \l_tmpa_int } \int_incr:N \l_tmpa_int } % marquer les impairs jusqu'à racine de #1 \int_set:Nn \l_tmpb_int { 3 } \int_while_do:nNnn { \l_tmpb_int } < { \l_ERA_diviseur_max_int } { \ERA_marquer_de_a_par:nnn { \l_tmpb_int } { #1 } { \l_tmpb_int } \int_do_until:nNnn {\intarray_item:Nn \__ERA_dv_ia { \l_tmpb_int }} = { 0 } { \int_add:Nn \l_tmpb_int { 2 } } } % marquer les derniers impairs \int_step_inline:nnnn { 3 } { 2 } { #1 } { \int_compare:nNnT { \intarray_item:Nn \__ERA_dv_ia { ##1 } } = { 0 } { \intarray_gset:Nnn \__ERA_dv_ia { ##1 } { ##1 } \intarray_gset:Nnn \__ERA_qt_ia { ##1 } { 1 } } } % nettoyage \cs_undefine:N \l_ERA_diviseur_max_int \group_end: } %%% ----------------------------------------------------------------------- \cs_new:Nn \ERA_presenter_nieme:n { \group_begin: \int_set:Nn \l_tmpa_int { \intarray_item:Nn \__ERA_qt_ia { #1 } } \int_set:Nn \l_tmpb_int { \int_mod:nn { #1 } { 10 } } \framebox[4em] {\strut \footnotesize \int_compare:nNnTF { \l_tmpa_int } = { 1 } {\textbf} % premier {\textcolor{gray}} % composé {\int_to_arabic:n { #1 }} \int_compare:nNnT { \l_tmpa_int } > { 1 } { \int_set:Nn \l_tmpa_int { \intarray_item:Nn \__ERA_dv_ia { #1 } } ~\({}^{\langle \int_to_arabic:n { \l_tmpa_int } \rangle}\) } } \kern-\fboxrule % saut de paragraphe tous les 10 \int_compare:nNnT { \l_tmpb_int } = { 0 } { \par \nointerlineskip \kern-\fboxrule \noindent } \group_end: } \NewDocumentCommand { \EcrireCribleEratosthene } { m }{ \par \noindent \int_step_inline:nn { #1 } { \ERA_presenter_nieme:n {##1} } } \NewDocumentCommand { \EcrireDiviseurs } { s m } { \group_begin: \int_new:N \l_ERA_nv_qt_int % quotient \int_set:Nn \l_ERA_nv_qt_int { #2 } \int_new:N \l_ERA_vx_dv_int % ancient diviseur \int_set:Nn \l_ERA_vx_dv_int { 0 } \int_new:N \l_ERA_nv_dv_int % nouveau diviseur \int_set:Nn \l_ERA_nv_dv_int { \intarray_item:Nn \__ERA_dv_ia { #2 } } \IfBooleanF{#1}{\par} \( \int_to_arabic:n { #2 } = \int_while_do:nNnn { \l_ERA_nv_qt_int } > { 1 } { \int_compare:nNnT { \l_ERA_vx_dv_int } > { 0 } { \times } \int_to_arabic:n { \l_ERA_nv_dv_int } \int_set:Nn \l_ERA_vx_dv_int { \l_ERA_nv_dv_int } \int_set:Nn \l_ERA_nv_qt_int { \intarray_item:Nn \__ERA_qt_ia { \l_ERA_nv_qt_int } } \int_set:Nn \l_ERA_nv_dv_int { \intarray_item:Nn \__ERA_dv_ia { \l_ERA_nv_qt_int } } } \) \cs_undefine:N \l_ERA_nv_qt_int \cs_undefine:N \l_ERA_vx_dv_int \cs_undefine:N \l_ERA_nv_dv_int \group_end: } \ExplSyntaxOff %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: