By popular demand, here is the Sieve of Eratosthenes written in Plain TeX.
\newcount\cm\cm100
\newcount\ci
\newcount\cj
\def\prime{prime}
\def\composite{composite}
\def\set#1#2{\global\expandafter\let\csname s\number#1\endcsname#2}
\def\get#1{\csname s\number#1\endcsname}
\def\doprime{%
\set\ci\prime
\cj\ci
\loop
\advance\cj\ci
\ifnum\cj<\cm
\set\cj\composite
\repeat
}
\ci2
\loop\ifnum\ci<\cm
\expandafter\ifx\csname s\number\ci\endcsname\relax
\begingroup
\doprime
\endgroup
\fi
\advance\ci1
\repeat
% Print them
\ci2
\loop\ifnum\ci<\cm
\number\ci: \get\ci\endgraf
\advance\ci1
\repeat
\bye
Replacing
\begingroup
with
\let\outerbody\body
and
\endgroup
with
\let\body\outerbody
, you can test even more numbers due to the difference in hash space and save space. Of course, you can test twice as many if you don't bother testing the even numbers.
\newcount\cm\cm300000
\newcount\ci
\newcount\cj
\def\prime{prime}
\def\composite{composite}
\def\set#1#2{\global\expandafter\let\csname s\number#1\endcsname#2}
\def\get#1{\csname s\number#1\endcsname}
\def\doprime{%
\set\ci\prime
\cj\ci
\loop
\advance\cj\ci
\advance\cj\ci
\ifnum\cj<\cm
\ifodd\cj
\set\cj\composite
\fi
\repeat
}
\set2\prime
\ci3
\loop\ifnum\ci<\cm
\expandafter\ifx\csname s\number\ci\endcsname\relax
\let\outerbody\body
\doprime
\let\body\outerbody
\fi
\advance\ci2
\repeat
% Print them
2: \prime\par
\ci3
\loop\ifnum\ci<\cm
\number\ci: \ifodd\ci\get\ci\else\composite\fi\endgraf
\advance\ci1
\repeat
\bye
Hendrik Vogt
pointed out that Knuth wrote a different prime computing function in TeX that appears in
The TeXbook on page 218. Thanks!
If this was done by James Hartman call your Mom.
ReplyDelete