![如何在 LaTeX 中生成素数列表](https://linux22.com/image/275784/%E5%A6%82%E4%BD%95%E5%9C%A8%20LaTeX%20%E4%B8%AD%E7%94%9F%E6%88%90%E7%B4%A0%E6%95%B0%E5%88%97%E8%A1%A8.png)
我想编写一个 LaTeX 脚本,生成以下数字之间的所有素数n和米, 在哪里n<米。我该怎么做?我觉得这应该不难,但我似乎无法编程。
答案1
\documentclass{article}
%
\makeatletter
\def\primes#1#2{{%
\def\comma{\def\comma{, }}%
\count@\@ne\@tempcntb#2\relax\@curtab#1\relax
\@primes}}
\def\@primes{\loop\advance\count@\@ne
\expandafter\ifx\csname p-\the\count@\endcsname\relax
\ifnum\@tempcntb<\count@\else
\ifnum\count@<\@curtab\else\comma\the\count@\fi\fi\else\repeat
\@tempcnta\count@\loop\advance\@tempcnta\count@
\expandafter\let\csname p-\the\@tempcnta\endcsname\@ne
\ifnum\@tempcnta<\@tempcntb\repeat
\ifnum\@tempcntb>\count@\expandafter\@primes\fi}
\makeatother
%
\begin{document}
\primes{1}{10}
\primes{1}{100}
\primes{1}{1000}
\primes{900}{1000}
\end{document}
答案2
DE Knuth 自己在第 218 页上完成了这项工作TeXbook:
\newif\ifprime \newif\ifunknown % boolean variables
\newcount\n \newcount\p \newcount\d \newcount\a % integer variables
\def\primes#1{2,~3% assume that #1 is at least 3
\n=#1 \advance\n by-2 % n more to go
\p=5 % odd primes starting with p
\loop\ifnum\n>0 \printifprime\advance\p by2 \repeat}
\def\printp{, % we will invoke \printp if p is prime
\ifnum\n=1 and~\fi % ‘and’ precedes the last value
\number\p \advance\n by -1 }
\def\printifprime{\testprimality \ifprime\printp\fi}
\def\testprimality{{\d=3 \global\primetrue
\loop\trialdivision \ifunknown\advance\d by2 \repeat}}
\def\trialdivision{\a=\p \divide\a by\d
\ifnum\a>\d \unknowntrue\else\unknownfalse\fi
\multiply\a by\d
\ifnum\a=\p \global\primefalse\unknownfalse\fi}
The first 100 prime numbers are \primes{100}
The first 1000 prime numbers are \primes{1000}
\bye
在提供上述宏之前,他写道:
前 30 个素数是 2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97、101、103、107、109 和 113。您可能不会对这个事实感到吃惊;但您可能会惊讶地发现,上一个句子的排版方式是 前 30 个素数是 。TeX 通过扩展宏完成了所有计算,因此作者非常肯定上面给出的素数列表几乎没有排版
\primes{30}
错误\primes
。
答案3
该解决方案利用了\pgfmathisprime
Alain Matthestkz-euclide
包提供的宏。
\documentclass{article}
\usepackage{tkz-euclide}
\newif\ifcomma
\newcommand{\primes}[2]{%
\commafalse%
\foreach\numb in {#1,...,#2}{%
\pgfmathisprime{\numb}%
\ifnum\pgfmathresult=1
\ifcomma, \numb\else\numb\global\commatrue\fi%
\fi%
}%
}
\begin{document}
\primes{1}{10}
\primes{1}{100}
\primes{1}{1000}
\primes{900}{1000}
\end{document}
答案4
DE Knuth 还给出了他最喜欢的素数算法的一个版本Metafont 书籍(第 173 页),我们可以使用它来元帖子将它们可视化,与乌兰姆螺旋。
prologues := 3; outputtemplate := "%j%c.eps";
% see D.E.Knuth, The Metafont Book, p.173
numeric p[]; boolean n_is_prime; p[1]=2; k:=1;
for n=3 step 2 until infinity:
n_is_prime := true;
for j=2 upto k:
if n mod p[j]=0: n_is_prime := false; fi
exitif n/p[j] < p[j];
endfor
if n_is_prime: p[incr k] := n; exitif k=62; fi
endfor fi
%
beginfig(1);
draw fullcircle scaled 480 withcolor .673 red;
for r=0 upto 9:
draw fullcircle scaled 2(40+20r) withcolor .7 white;
if r>1: drawarrow origin -- right scaled 240 rotated (12*p[2+r]) withcolor .7 white; fi
endfor
for k=1 upto 62:
label(decimal p[k], right scaled (40 + 20 floor(p[k]/30)) rotated (p[k]*12));
endfor
endfig;
end