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!
Note: The copyright belongs to the blog author and the blog. For the license, please see the linked original source blog.
Leave a Reply
You must be logged in to post a comment.