如何在 LaTeX 中生成素数列表

如何在 LaTeX 中生成素数列表

我想编写一个 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

该解决方案利用了\pgfmathisprimeAlain 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

相关内容