% 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:
