# Automation: static array for the sieve of Eratosthenes

I would like to produce one simple array of numbers from 1 to 100 of dimension 10*10, where 1 will not be displayed.

In Sieve of Eratosthenes in tikz there are pretty animations, but what I need is only one static array that will be used by students for experimenting with the sieve of Eratosthenes.

-
In my answer to Sieve of Eratosthenes in tikz I provide methods to print grids of numbers. If you don't want the algorithm executed you can just disable that. Basically you just need to execute the call to DrawGridWithNumbers –  Peter Grill Oct 11 '12 at 9:57
Good change. Thanks ! –  projetmbc Oct 11 '12 at 10:12

Here is the relevant portion from the Sieve of Eratosthenes in tikz needed to produce just the initial the grid.

## Code:

\documentclass{article}
\usepackage{xstring}%         String comparison
\usepackage{tikz}%
\usetikzlibrary{calc}

\def\NumOfColumns{10}%
\def\NumOfRows{10}%

%%% Extracted from % http://tex.stackexchange.com/questions/44673/sieve-of-eratosthenes-in-tikz

%%% Step 1: Create a list of integers 2...n
%%%
\newcommand*{\DrawGridWithNumbers}{%
\begin{scope}[draw=gray, thick]% Add numbers to each node
\draw  (0,-1) -- ($(0,-\NumOfRows-1)$);
\foreach \col in {1,...,\NumOfColumns} {%
\draw  (\col,-1) -- ($(\col,-\NumOfRows-1)$);

\draw  (0,-1) -- (\NumOfColumns,-1);
\foreach \row in {1,...,\NumOfRows}{%
\pgfmathtruncatemacro{\value}{\col+\NumOfColumns*(\row-1)}
\IfEq{\value}{1}{
%% Suppress number 1 from being printed since first
%% step of Sieve of Eratosthenes algorithm is to
%% create a list of integers 2...n
}{
\node at ($(\col,-\row)-(0.5,0.5)$) {\textbf{\value}};
}
\draw (0,-\row-1) -- (\NumOfColumns,-\row-1);
}
}
\end{scope}
}

\begin{document}
\begin{tikzpicture}
\DrawGridWithNumbers;
\end{tikzpicture}
\end{document}

-
I know, next time I'll post the tikz answer and you can do the picture mode one. –  David Carlisle Oct 11 '12 at 10:11
@DavidCarlisle: :-) The tikz answer is just much faster, even if it is more characters. –  Peter Grill Oct 11 '12 at 10:12

\documentclass{article}

\begin{document}

\fbox{\begin{picture}(230,220)
\global\count1=0
\multiput(10,180)(0,-20){10}{%
\multiput(10,10)(20,0){10}{%
\framebox(15,15){\ifnum\count1>1 \the\count1 \fi}
}}
\end{picture}}

\end{document}

-

"Variatio delectat", a solution using a simple tabular environment:

\documentclass{article}
\usepackage{array}
\newsavebox\CellBox
\begin{document}
\begingroup
\makeatletter
\setlength{\tabcolsep}{.5\tabcolsep}%
\sbox\CellBox{100}%
\sbox\strutbox{%
\vrule
height.5\dimexpr\wd\CellBox+2\tabcolsep+\ht\CellBox-\dp\CellBox\relax
depth.5\dimexpr\wd\CellBox+2\tabcolsep-\ht\CellBox+\dp\CellBox\relax
width0pt%
}%
\begin{tabular}{|*{10}{>{\centering}p{\wd\CellBox}|}}
\hline &%
\toks@{}%
\count@=1%
\@whilenum\count@<99 \do{%
\toks@\expandafter{%
\the\expandafter\toks@
\the\expandafter\expandafter\expandafter\count@
\ifnum1\expandafter\@cdr\the\count@\@nil=10 %
\expandafter\tabularnewline
\expandafter\hline
\else
\expandafter&%
\fi
}%
}%
\the\toks@
100\tabularnewline\hline
\end{tabular}%
\endgroup
\end{document}


Also it is not difficult to save vertical space, using a rectangular form:

\documentclass{article}
\usepackage{array}
\newsavebox\CellBox
\begin{document}
\begingroup
\makeatletter
\setlength{\tabcolsep}{.5\tabcolsep}%
\sbox\CellBox{100}%
\sbox\strutbox{%
\vrule
height\dimexpr\ht\CellBox+\tabcolsep\relax
depth\dimexpr\dp\CellBox+\tabcolsep\relax
width0pt%
}%
\begin{tabular}{|*{10}{>{\centering}p{\wd\CellBox}|}}
\hline &%
\toks@{}%
\count@=1%
\@whilenum\count@<99 \do{%
\toks@\expandafter{%
\the\expandafter\toks@
\the\expandafter\expandafter\expandafter\count@
\ifnum1\expandafter\@cdr\the\count@\@nil=10 %
\expandafter\tabularnewline
\expandafter\hline
\else
\expandafter&%
\fi
}%
}%
\the\toks@
100\tabularnewline\hline
\end{tabular}%
\endgroup
\end{document}


-
Not so easy to understand... –  projetmbc Oct 11 '12 at 21:24

I think that LuaTeX is ideal for such tasks. Below is a ConTeXt solution which should be easy to translate to LaTeX (it just sets the elements in a table).

\startsetups table:square
\setupTABLE[width=2em, height=2em, align={middle,lohi}]
\stopsetups

\starttext
\startluacode
context.bTABLE({"setups=table:square"})
local flag; flag = false;
for i=0,9 do
context.bTR()
for j=1,10 do
context.bTD()
if flag then
context.math(i*10 + j)
else
flag = true
end
context.eTD()
end
context.eTR()
end
context.eTABLE()
\stopluacode

\stoptext


The biggest advantage is that the code is easy to read and understand. Using a "normal" programming language also makes it easy to add more bells and whistles. For example, here is a version that highlights the primes. I use a naive algorithm to check for a prime, and simply set the background color if the number is a prime.

\startsetups table:square
\setupTABLE[width=2em, height=2em, align={middle,lohi}, background=color]
\stopsetups

\startluacode
-- This is a naive implementation just for illustration
thirddata = thirddata or {}
function thirddata.isPrime(num)
if (num == 2) then
return true
end

if (num <= 1) or (num % 2 == 0) then
return false
end

for i = 3, num^(1/2), 2 do
if  num % i  == 0 then
return false
end
end

return true
end

\stopluacode

\starttext
\startTEXpage[offset=3mm]
\startluacode
context.bTABLE({"setups=table:square"})
local flag; flag = false;

local function setBackground(boolean)
if boolean then
return "backgroundcolor=lightred"
else
return ""
end
end

for i=0,9 do
context.bTR()
for j=1,10 do
context.bTD({setBackground(thirddata.isPrime(i*10 + j))})
if flag then
context.math(i*10 + j)
else
flag = true
end
context.eTD()
end
context.eTR()
end
context.eTABLE()
\stopluacode
\stopTEXpage

\stoptext


Again, the main advantage of LuaTeX is the readability of the code.

-

A straightforward solution just using \numexpr to add one to a variable \x and print it in each cell:

\documentclass{article}

\usepackage{array}
\newcommand{\tabstrut}{\vrule height 1.25em depth 0.5em width 0pt}

\begin{document}

\xdef\x{0}
\begin{tabular}{|*{10}{>{\tabstrut\xdef\x{\the\numexpr\x+1\relax}\ifnum\x=1 \else\x\fi}c|}}
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
&&&&&&&&&\\
\hline
\end{tabular}

\end{document}

-
This is very neat indeed! –  percusse Oct 12 '12 at 8:14