Introduction
Introduction Statistics Contact Development Disclaimer Help
On primality test, and style - libzahl - big integer library
git clone git://git.suckless.org/libzahl
Log
Files
Refs
README
LICENSE
---
commit d067895614aed8572f40da22ccea50b781cfbc0d
parent fd9c83cbb9d80a8108cd5112d12f475406b44a20
Author: Mattias Andrée <[email protected]>
Date: Fri, 13 May 2016 20:40:05 +0200
On primality test, and style
Signed-off-by: Mattias Andrée <[email protected]>
Diffstat:
M doc/arithmetic.tex | 18 ++++++------------
M doc/not-implemented.tex | 18 +++++++++---------
M doc/number-theory.tex | 96 +++++++++++++++++++++++++++--…
3 files changed, 100 insertions(+), 32 deletions(-)
---
diff --git a/doc/arithmetic.tex b/doc/arithmetic.tex
@@ -187,7 +187,7 @@ can be expressed as a simple formula
\vspace{-1em}
\[ \hspace*{-0.4cm}
a^b =
- \prod_{k \in \textbf{Z}_{+} ~:~ \left \lfloor {b \over 2^k} \hspace*{-1ex}…
+ \prod_{k \in \textbf{Z}_{+} ~:~ \left \lfloor \frac{b}{2^k} \hspace*{-1ex}…
a^{2^k}
\]
@@ -212,13 +212,10 @@ The algorithm can be expressed in psuedocode as
\hspace{-2.8ex}
\begin{minipage}{\linewidth}
\begin{algorithmic}
- \STATE $r \gets 1$
- \STATE $f \gets a$
+ \STATE $r, f \gets 1, a$
\WHILE{$b \neq 0$}
- \IF{$b \equiv 1 ~(\textrm{Mod}~ 2)$}
- \STATE $r \gets r \cdot f$
- \ENDIF
- \STATE $f \gets f^2$ \qquad \textcolor{c}{\{$f \gets f \cdot f$\}}
+ \STATE $r \gets r \cdot f$ {\bf unless} $2 \vert b$
+ \STATE $f \gets f^2$ \textcolor{c}{\{$f \gets f \cdot f$\}}
\STATE $b \gets \lfloor b / 2 \rfloor$
\ENDWHILE
\RETURN $r$
@@ -234,12 +231,9 @@ expressed as
\hspace{-2.8ex}
\begin{minipage}{\linewidth}
\begin{algorithmic}
- \STATE $r \gets 1$
- \STATE $f \gets a$
+ \STATE $r, f \gets 1, a$
\WHILE{$b \neq 0$}
- \IF{$b \equiv 1 ~(\textrm{Mod}~ 2)$}
- \STATE $r \gets r \cdot f \hspace*{-1ex}~ \mod m$
- \ENDIF
+ \STATE $r \gets r \cdot f \hspace*{-1ex}~ \mod m$ \textbf{unless} $2 \ve…
\STATE $f \gets f^2 \hspace*{-1ex}~ \mod m$
\STATE $b \gets \lfloor b / 2 \rfloor$
\ENDWHILE
diff --git a/doc/not-implemented.tex b/doc/not-implemented.tex
@@ -60,7 +60,7 @@ extgcd(z_t bézout_coeff_1, z_t bézout_coeff_2, z_t gcd
\label{sec:Least common multiple}
\( \displaystyle{
- \mbox{lcm}(a, b) = {\lvert a \cdot b \rvert \over \mbox{gcd}(a, b)}
+ \mbox{lcm}(a, b) = \frac{\lvert a \cdot b \rvert}{\mbox{gcd}(a, b)}
}\)
@@ -233,7 +233,7 @@ The resulting algorithm can be expressed
1 & \textrm{if}~ n = 0 \\
\textrm{undefined} & \textrm{otherwise}
\end{array} \right . =
- n! \sum_{i = 0}^n {(-1)^i \over i!}
+ n! \sum_{i = 0}^n \frac{(-1)^i}{i!}
}\)
@@ -286,7 +286,7 @@ The resulting algorithm can be expressed
\label{sec:Raising factorial}
\( \displaystyle{
- x^{(n)} = {(x + n - 1)! \over (x - 1)!}
+ x^{(n)} = \frac{(x + n - 1)!}{(x - 1)!}
}\), undefined for $n < 0$.
@@ -294,7 +294,7 @@ The resulting algorithm can be expressed
\label{sec:Falling factorial}
\( \displaystyle{
- (x)_n = {x! \over (x - n)!}
+ (x)_n = \frac{x!}{(x - n)!}
}\), undefined for $n < 0$.
@@ -334,9 +334,9 @@ $\Gamma(n) = (n - 1)!$, undefined for $n \le 0$.
\label{sec:Binomial coefficient}
\( \displaystyle{
- {n \choose k} = {n! \over k!(n - k)!}
- = {1 \over (n - k)!} \prod_{i = k + 1}^n i
- = {1 \over k!} \prod_{i = n - k + 1}^n i
+ \binom{n}{k} = \frac{n!}{k!(n - k)!}
+ = \frac{1}{(n - k)!} \prod_{i = k + 1}^n i
+ = \frac{1}{k!} \prod_{i = n - k + 1}^n i
}\)
@@ -344,7 +344,7 @@ $\Gamma(n) = (n - 1)!$, undefined for $n \le 0$.
\label{sec:Catalan number}
\( \displaystyle{
- C_n = \left . {2n \choose n} \middle / (n + 1) \right .
+ C_n = \left . \binom{2n}{n} \middle / (n + 1) \right .
}\)
@@ -352,7 +352,7 @@ $\Gamma(n) = (n - 1)!$, undefined for $n \le 0$.
\label{sec:Fuss-Catalan number} % not en dash
\( \displaystyle{
- A_m(p, r) = {r \over mp + r} {mp + r \choose m}
+ A_m(p, r) = \frac{r}{mp + r} \binom{mp + r}{m}
}\)
diff --git a/doc/number-theory.tex b/doc/number-theory.tex
@@ -132,7 +132,7 @@ definion ensures
\vspace{1em}
\( \displaystyle{
- {a \over \gcd(a, b)} \left \lbrace \begin{array}{rl}
+ \frac{a}{\gcd(a, b)} \left \lbrace \begin{array}{rl}
> 0 & \textrm{if}~ a < 0, b < 0 \\
< 0 & \textrm{if}~ a < 0, b > 0 \\
= 1 & \textrm{if}~ b = 0, a \neq 0 \\
@@ -143,7 +143,7 @@ definion ensures
\vspace{1em}
\noindent
-and analogously for $b \over \gcd(a,\,b)$. Note however,
+and analogously for $\frac{b}{\gcd(a,\,b)}$. Note however,
the convension $\gcd(0, 0) = 0$ is adhered. Therefore,
before dividing with $\gcd{a, b}$ you may want to check
whether $\gcd(a, b) = 0$. $\gcd(a, b)$ is calculated
@@ -156,17 +156,12 @@ the Binary GCD algorithm.
\hspace{-2.8ex}
\begin{minipage}{\linewidth}
\begin{algorithmic}
- \IF{$ab = 0$}
- \RETURN $a + b$
- \ELSIF{$a < 0$ \AND $b < 0$}
- \RETURN $-\gcd(\lvert a \rvert, \lvert b \rvert)$
- \ENDIF
+ \RETURN $a + b$ {\bf if} $ab = 0$
+ \RETURN $-\gcd(\lvert a \rvert, \lvert b \rvert)$ {\bf if} $a < 0$ \AND $b…
\STATE $s \gets \max s : 2^s \vert a, b$
\STATE $u, v \gets \lvert a \rvert \div 2^s, \lvert b \rvert \div 2^s$
\WHILE{$u \neq v$}
- \IF{$u > v$}
- \STATE $u \leftrightarrow v$
- \ENDIF
+ \STATE $v \leftrightarrow u$ {\bf if} $v < u$
\STATE $v \gets v - u$
\STATE $v \gets v \div 2^x$, where $x = \max x : 2^x \vert v$
\ENDWHILE
@@ -184,4 +179,83 @@ $\max x : 2^x \vert z$ is returned by {\tt zlsb(z)}
\section{Primality test}
\label{sec:Primality test}
-TODO % zptest
+The primality of an integer can be test with
+
+\begin{alltt}
+ enum zprimality zptest(z_t w, z_t a, int t);
+\end{alltt}
+
+\noindent
+{\tt zptest} uses Miller–Rabin primality test,
+with {\tt t} runs of its witness loop, to
+determine whether {\tt a} is prime. {\tt zptest}
+returns either
+
+\begin{itemize}
+\item {\tt PRIME} = 2:
+{\tt a} is prime. This is only returned for
+known prime numbers: 2 and 3.
+
+\item {\tt PROBABLY\_PRIME} = 1:
+{\tt a} is probably a prime. The certainty
+will be $1 - 4^{-t}$.
+
+\item {\tt NONPRIME} = 0:
+{\tt a} is either composite, non-positive, or 1.
+It is certain that {\tt a} is not prime.
+\end{itemize}
+
+If and only if {\tt NONPRIME} is returned, a
+value will be assigned to {\tt w} — unless
+{\tt w} is {\tt NULL}. This will be the witness
+of {\tt a}'s completeness. If $a \le 2$, it
+is not really composite, and the value of
+{\tt a} is copied into {\tt w}.
+
+$\gcd(w, a)$ can be used to extract a factor
+of $a$. This factor is however not necessarily,
+and unlikely so, prime, but can be composite,
+or even 1. In the latter case this becomes
+utterly useless, and therefore using this
+method for prime factorisation is a bad idea.
+
+Below is pseudocode for the Miller–Rabin primality
+test with witness return.
+
+\vspace{1em}
+\hspace{-2.8ex}
+\begin{minipage}{\linewidth}
+\begin{algorithmic}
+ \RETURN NONPRIME ($w \gets a$) {\bf if} {$a \le 1$}
+ \RETURN PRIME {\bf if} {$a \le 3$}
+ \RETURN NONPRIME ($w \gets 2$) {\bf if} {$2 \vert a$}
+ \STATE $r \gets \max r : 2^r \vert (a - 1)$
+ \STATE $d \gets (a - 1) \div 2^r$
+ \STATE {\bf repeat} $t$ {\bf times}
+
+ \hspace{2ex}
+ \begin{minipage}{\linewidth}
+ \STATE $k \xleftarrow{\$} \textbf{Z}_{a - 2} \setminus \textbf{Z}_{2}$
+ \STATE $x \gets k^d \mod a$
+ \STATE {\bf continue} {\bf if} $x = 1$ \OR $x = a - 1$
+ \STATE {\bf repeat} $r$ {\bf times or until} $x = 1$ \OR $x = a - 1$
+
+ \hspace{2ex}
+ \begin{minipage}{\linewidth}
+ \vspace{-1ex}
+ \STATE $x \gets x^2 \mod a$
+ \end{minipage}
+ \vspace{-1.5em}
+ \STATE {\bf end repeat}
+ \STATE {\bf if} $x = 1$ {\bf return} NONPRIME ($w \gets k$)
+ \end{minipage}
+ \vspace{-0.8ex}
+ \STATE {\bf end repeat}
+ \RETURN PROBABLY PRIME
+\end{algorithmic}
+\end{minipage}
+\vspace{1em}
+
+\noindent
+$\max x : 2^x \vert z$ is returned by {\tt zlsb(z)}
+\psecref{sec:Boundary}.
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.