not-implemented.tex - libzahl - big integer library
 (HTM) git clone git://git.suckless.org/libzahl
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       not-implemented.tex (19552B)
       ---
            1 \chapter{Not implemented}
            2 \label{chap:Not implemented}
            3 
            4 In this chapter we maintain a list of
            5 features we have chosen not to implement at
            6 the moment, but may add when libzahl matures,
            7 but to a separate library that could be made
            8 to support multiple bignum libraries. Functions
            9 listed herein will only be implemented if it
           10 is shown that it would be overwhelmingly
           11 advantageous. For each feature, a sample
           12 implementation or a mathematical expression
           13 on which you can base your implementation is
           14 included. The sample implementations create
           15 temporary integer references to simplify the
           16 examples. You should try to use dedicated
           17 variables; in case of recursion, a robust
           18 program should store temporary variables on
           19 a stack, so they can be cleaned up if
           20 something happens.
           21 
           22 Research problems, like prime factorisation
           23 and discrete logarithms, do not fit in the
           24 scope of bignum libraries % Unless they are extraordinarily bloated with vague mission-scope, like systemd.
           25 and therefore do not fit into libzahl,
           26 and will not be included in this chapter.
           27 Operators and functions that grow so
           28 ridiculously fast that a tiny lookup table
           29 can be constructed to cover all practical
           30 input will also not be included in this
           31 chapter, nor in libzahl.
           32 
           33 \vspace{1cm}
           34 \minitoc
           35 
           36 
           37 \newpage
           38 \section{Extended greatest common divisor}
           39 \label{sec:Extended greatest common divisor}
           40 
           41 \begin{alltt}
           42 void
           43 extgcd(z_t bézout_coeff_1, z_t bézout_coeff_2, z_t gcd
           44        z_t quotient_1, z_t quotient_2, z_t a, z_t b)
           45 \{
           46 #define old_r gcd
           47 #define old_s bézout_coeff_1
           48 #define old_t bézout_coeff_2
           49 #define s quotient_2
           50 #define t quotient_1
           51     z_t r, q, qs, qt;
           52     int odd = 0;
           53     zinit(r), zinit(q), zinit(qs), zinit(qt);
           54     zset(r, b), zset(old_r, a);
           55     zseti(s, 0), zseti(old_s, 1);
           56     zseti(t, 1), zseti(old_t, 0);
           57     while (!zzero(r)) \{
           58         odd ^= 1;
           59         zdivmod(q, old_r, old_r, r), zswap(old_r, r);
           60         zmul(qs, q, s), zsub(old_s, old_s, qs);
           61         zmul(qt, q, t), zsub(old_t, old_t, qt);
           62         zswap(old_s, s), zswap(old_t, t);
           63     \}
           64     odd ? abs(s, s) : abs(t, t);
           65     zfree(r), zfree(q), zfree(qs), zfree(qt);
           66 \}
           67 \end{alltt}
           68 
           69 Perhaps you are asking yourself ``wait a minute,
           70 doesn't the extended Euclidean algorithm only
           71 have three outputs if you include the greatest
           72 common divisor, what is this shenanigans?''
           73 No\footnote{Well, technically yes, but it calculates
           74 two values for free in the same ways as division
           75 calculates the remainder for free.}, it has five
           76 outputs, most implementations just ignore two of
           77 them. If this confuses you, or you want to know
           78 more about this, I refer you to Wikipeida.
           79 
           80 
           81 \newpage
           82 \section{Least common multiple}
           83 \label{sec:Least common multiple}
           84 
           85 \( \displaystyle{
           86     \mbox{lcm}(a, b) = \frac{\lvert a \cdot b \rvert}{\mbox{gcd}(a, b)}
           87 }\)
           88 \vspace{1em}
           89 
           90 $\mbox{lcm}(a, b)$ is undefined when $a$ or
           91 $b$ is zero, because division by zero is
           92 undefined. Note however that $\mbox{gcd}(a, b)$
           93 is only zero when both $a$ and $b$ is zero.
           94 
           95 \newpage
           96 \section{Modular multiplicative inverse}
           97 \label{sec:Modular multiplicative inverse}
           98 
           99 \begin{alltt}
          100 int
          101 modinv(z_t inv, z_t a, z_t m)
          102 \{
          103     z_t x, _1, _2, _3, gcd, mabs, apos;
          104     int invertible, aneg = zsignum(a) < 0;
          105     zinit(x), zinit(_1), zinit(_2), zinit(_3), zinit(gcd);
          106     *mabs = *m;
          107     zabs(mabs, mabs);
          108     if (aneg) \{
          109         zinit(apos);
          110         zset(apos, a);
          111         if (zcmpmag(apos, mabs))
          112             zmod(apos, apos, mabs);
          113         zadd(apos, apos, mabs);
          114     \}
          115     extgcd(inv, _1, _2, _3, gcd, apos, mabs);
          116     if ((invertible = !zcmpi(gcd, 1))) \{
          117         if (zsignum(inv) < 0)
          118             (zsignum(m) < 0 ? zsub : zadd)(x, x, m);
          119         zswap(x, inv);
          120     \}
          121     if (aneg)
          122         zfree(apos);
          123     zfree(x), zfree(_1), zfree(_2), zfree(_3), zfree(gcd);
          124     return invertible;
          125 \}
          126 \end{alltt}
          127 
          128 
          129 \newpage
          130 \section{Random prime number generation}
          131 \label{sec:Random prime number generation}
          132 
          133 TODO
          134 
          135 
          136 \newpage
          137 \section{Symbols}
          138 \label{sec:Symbols}
          139 
          140 \subsection{Legendre symbol}
          141 \label{sec:Legendre symbol}
          142 
          143 \( \displaystyle{
          144   \left ( \frac{a}{p} \right ) \equiv a^{\frac{p - 1}{2}} ~(\text{Mod}~p),~
          145   \left ( \frac{a}{p} \right ) \in \{-1,~0,~1\},~
          146   p \in \textbf{P},~ p > 2
          147 }\)
          148 \vspace{1em}
          149 
          150 \noindent
          151 That is, unless $\displaystyle{a^{\frac{p - 1}{2}} \mod p \le 1}$,
          152 $\displaystyle{a^{\frac{p - 1}{2}} \mod p = p - 1}$, so
          153 $\displaystyle{\left ( \frac{a}{p} \right ) = -1}$.
          154 
          155 It should be noted that
          156 \( \displaystyle{
          157   \left ( \frac{a}{p} \right ) = 
          158   \left ( \frac{a ~\text{Mod}~ p}{p} \right ),
          159 }\)
          160 so a compressed lookup table can be used for small $p$.
          161 
          162 
          163 \subsection{Jacobi symbol}
          164 \label{sec:Jacobi symbol}
          165 
          166 \( \displaystyle{
          167   \left ( \frac{a}{n} \right ) = 
          168   \prod_k \left ( \frac{a}{p_k} \right )^{n_k},
          169 }\)
          170 where $\displaystyle{n = \prod_k p_k^{n_k} > 0}$,
          171 and $p_k \in \textbf{P}$.
          172 \vspace{1em}
          173 
          174 Like the Legendre symbol, the Jacobi symbol is $n$-periodic over $a$.
          175 If $n$, is prime, the Jacobi symbol is the Legendre symbol, but
          176 the Jacobi symbol is defined for all odd numbers $n$, where the
          177 Legendre symbol is defined only for odd primes $n$.
          178 
          179 Use the following algorithm to calculate the Jacobi symbol:
          180 
          181 \vspace{1em}
          182 \hspace{-2.8ex}
          183 \begin{minipage}{\linewidth}
          184 \begin{algorithmic}
          185     \STATE $a \gets a \mod n$
          186     \STATE $r \gets \mbox{lsb}~ a$
          187     \STATE $a \gets a \cdot 2^{-r}$
          188     \STATE \(\displaystyle{
          189       r \gets \left \lbrace \begin{array}{rl}
          190         1 &
          191           \text{if}~ n \equiv 1, 7 ~(\text{Mod}~ 8)
          192           ~\text{or}~ r \equiv 0 ~(\text{Mod}~ 2) \\
          193         -1 & \text{otherwise} \\
          194       \end{array} \right .
          195     }\)
          196     \IF{$a = 1$}
          197         \RETURN $r$
          198     \ELSIF{$\gcd(a, n) \neq 1$}
          199         \RETURN $0$
          200     \ENDIF
          201     \STATE $(a, n) = (n, a)$
          202     \STATE \textbf{start over}
          203 \end{algorithmic}
          204 \end{minipage}
          205 
          206 
          207 \subsection{Kronecker symbol}
          208 \label{sec:Kronecker symbol}
          209 
          210 The Kronecker symbol
          211 $\displaystyle{\left ( \frac{a}{n} \right )}$
          212 is a generalisation of the Jacobi symbol,
          213 where $n$ can be any integer. For positive
          214 odd $n$, the Kronecker symbol is equal to
          215 the Jacobi symbol. For even $n$, the
          216 Kronecker symbol is $2n$-periodic over $a$,
          217 the Kronecker symbol is zero for all
          218 $(a, n)$ with both $a$ and $n$ are even.
          219 
          220 \vspace{1em}
          221 \noindent
          222 \( \displaystyle{
          223     \left ( \frac{a}{2^k \cdot n} \right ) =
          224     \left ( \frac{a}{n} \right ) \cdot \left ( \frac{a}{2} \right )^k,
          225 }\)
          226 where
          227 \( \displaystyle{
          228     \left ( \frac{a}{2} \right ) =
          229     \left \lbrace \begin{array}{rl}
          230         1  & \text{if}~ a \equiv 1, 7 ~(\text{Mod}~ 8) \\
          231         -1 & \text{if}~ a \equiv 3, 5 ~(\text{Mod}~ 8) \\
          232         0  & \text{otherwise}
          233     \end{array} \right .
          234 }\)
          235 
          236 \vspace{1em}
          237 \noindent
          238 \( \displaystyle{
          239     \left ( \frac{-a}{n} \right ) =
          240     \left ( \frac{a}{n} \right ) \cdot \left ( \frac{a}{-1} \right ),
          241 }\)
          242 where
          243 \( \displaystyle{
          244     \left ( \frac{a}{-1} \right ) =
          245     \left \lbrace \begin{array}{rl}
          246         1  & \text{if}~ a \ge 0 \\
          247         -1 & \text{if}~ a < 0
          248     \end{array} \right .
          249 }\)
          250 \vspace{1em}
          251 
          252 \noindent
          253 However, for $n = 0$, the symbol is defined as
          254 
          255 \vspace{1em}
          256 \noindent
          257 \( \displaystyle{
          258     \left ( \frac{a}{0} \right ) =
          259     \left \lbrace \begin{array}{rl}
          260         1 & \text{if}~ a = \pm 1 \\
          261         0 & \text{otherwise.}
          262     \end{array} \right .
          263 }\)
          264 
          265 
          266 \subsection{Power residue symbol}
          267 \label{sec:Power residue symbol}
          268 
          269 TODO
          270 
          271 
          272 \subsection{Pochhammer \emph{k}-symbol}
          273 \label{sec:Pochhammer k-symbol}
          274 
          275 \( \displaystyle{
          276     (x)_{n,k} = \prod_{i = 1}^n (x + (i - 1)k)
          277 }\)
          278 
          279 
          280 \newpage
          281 \section{Logarithm}
          282 \label{sec:Logarithm}
          283 
          284 TODO
          285 
          286 
          287 \newpage
          288 \section{Roots}
          289 \label{sec:Roots}
          290 
          291 TODO
          292 
          293 
          294 \newpage
          295 \section{Modular roots}
          296 \label{sec:Modular roots}
          297 
          298 TODO % Square: Cipolla's algorithm, Pocklington's algorithm, Tonelli–Shanks algorithm
          299 
          300 
          301 \newpage
          302 \section{Combinatorial}
          303 \label{sec:Combinatorial}
          304 
          305 \subsection{Factorial}
          306 \label{sec:Factorial}
          307 
          308 \( \displaystyle{
          309     n! = \left \lbrace \begin{array}{ll}
          310         \displaystyle{\prod_{i = 1}^n i} & \textrm{if}~ n \ge 0 \\
          311         \textrm{undefined} & \textrm{otherwise}
          312     \end{array} \right .
          313 }\)
          314 \vspace{1em}
          315 
          316 This can be implemented much more efficiently
          317 than using the naïve method, and is a very
          318 important function for many combinatorial
          319 applications, therefore it may be implemented
          320 in the future if the demand is high enough.
          321 
          322 An efficient, yet not optimal, implementation
          323 of factorials that about halves the number of
          324 required multiplications compared to the naïve
          325 method can be derived from the observation
          326 
          327 \vspace{1em}
          328 \( \displaystyle{
          329     n! = n!! ~ \lfloor n / 2 \rfloor! ~ 2^{\lfloor n / 2 \rfloor}
          330 }\), $n$ odd.
          331 \vspace{1em}
          332 
          333 \noindent
          334 The resulting algorithm can be expressed as
          335 
          336 \begin{alltt}
          337    void
          338    fact(z_t r, uint64_t n)
          339    \{
          340        z_t p, f, two;
          341        uint64_t *ns, s = 1, i = 1;
          342        zinit(p), zinit(f), zinit(two);
          343        zseti(r, 1), zseti(p, 1), zseti(f, n), zseti(two, 2);
          344        ns = alloca(zbits(f) * sizeof(*ns));
          345        while (n > 1) \{
          346            if (n & 1) \{
          347                ns[i++] = n;
          348                s += n >>= 1;
          349            \} else \{
          350                zmul(r, r, (zsetu(f, n), f));
          351                n -= 1;
          352            \}
          353        \}
          354        for (zseti(f, 1); i-- > 0; zmul(r, r, p);)
          355            for (n = ns[i]; zcmpu(f, n); zadd(f, f, two))
          356                zmul(p, p, f);
          357        zlsh(r, r, s);
          358        zfree(two), zfree(f), zfree(p);
          359    \}
          360 \end{alltt}
          361 
          362 
          363 \subsection{Subfactorial}
          364 \label{sec:Subfactorial}
          365 
          366 \( \displaystyle{
          367     !n = \left \lbrace \begin{array}{ll}
          368       n(!(n - 1)) + (-1)^n & \textrm{if}~ n > 0 \\
          369       1 & \textrm{if}~ n = 0 \\
          370       \textrm{undefined} & \textrm{otherwise}
          371     \end{array} \right . =
          372     n! \sum_{i = 0}^n \frac{(-1)^i}{i!}
          373 }\)
          374 
          375 
          376 \subsection{Alternating factorial}
          377 \label{sec:Alternating factorial}
          378 
          379 \( \displaystyle{
          380     \mbox{af}(n) = \sum_{i = 1}^n {(-1)^{n - i} i!}
          381 }\)
          382 
          383 
          384 \subsection{Multifactorial}
          385 \label{sec:Multifactorial}
          386 
          387 \( \displaystyle{
          388     n!^{(k)} = \left \lbrace \begin{array}{ll}
          389       1 & \textrm{if}~ n = 0 \\
          390       n & \textrm{if}~ 0 < n \le k \\
          391       n((n - k)!^{(k)}) & \textrm{if}~ n > k \\
          392       \textrm{undefined} & \textrm{otherwise}
          393     \end{array} \right .
          394 }\)
          395 
          396 
          397 \subsection{Quadruple factorial}
          398 \label{sec:Quadruple factorial}
          399 
          400 \( \displaystyle{
          401     (4n - 2)!^{(4)}
          402 }\)
          403 
          404 
          405 \subsection{Superfactorial}
          406 \label{sec:Superfactorial}
          407 
          408 \( \displaystyle{
          409     \mbox{sf}(n) = \prod_{k = 1}^n k^{1 + n - k}
          410 }\), undefined for $n < 0$.
          411 
          412 
          413 \subsection{Hyperfactorial}
          414 \label{sec:Hyperfactorial}
          415 
          416 \( \displaystyle{
          417     H(n) = \prod_{k = 1}^n k^k
          418 }\), undefined for $n < 0$.
          419 
          420 
          421 \subsection{Raising factorial}
          422 \label{sec:Raising factorial}
          423 
          424 \( \displaystyle{
          425     x^{(n)} = \frac{(x + n - 1)!}{(x - 1)!}
          426 }\), undefined for $n < 0$.
          427 
          428 
          429 \subsection{Falling factorial}
          430 \label{sec:Falling factorial}
          431 
          432 \( \displaystyle{
          433     (x)_n = \frac{x!}{(x - n)!}
          434 }\), undefined for $n < 0$.
          435 
          436 
          437 \subsection{Primorial}
          438 \label{sec:Primorial}
          439 
          440 \( \displaystyle{
          441     n\# = \prod_{\lbrace i \in \textbf{P} ~:~ i \le n \rbrace} i
          442 }\)
          443 \vspace{1em}
          444 
          445 \noindent
          446 \( \displaystyle{
          447     p_n\# = \prod_{i \in \textbf{P}_{\pi(n)}} i
          448 }\)
          449 
          450 
          451 \subsection{Gamma function}
          452 \label{sec:Gamma function}
          453 
          454 $\Gamma(n) = (n - 1)!$, undefined for $n \le 0$.
          455 
          456 
          457 \subsection{K-function}
          458 \label{sec:K-function}
          459 
          460 \( \displaystyle{
          461     K(n) = \left \lbrace \begin{array}{ll}
          462       \displaystyle{\prod_{i = 1}^{n - 1} i^i}  & \textrm{if}~ n \ge 0 \\
          463       1 & \textrm{if}~ n = -1 \\
          464       0 & \textrm{otherwise (result is truncated)}
          465     \end{array} \right .
          466 }\)
          467 
          468 
          469 \subsection{Binomial coefficient}
          470 \label{sec:Binomial coefficient}
          471 
          472 \( \displaystyle{
          473     \binom{n}{k} = \frac{n!}{k!(n - k)!}
          474     = \frac{1}{(n - k)!} \prod_{i = k + 1}^n i
          475     = \frac{1}{k!} \prod_{i = n - k + 1}^n i
          476 }\)
          477 
          478 
          479 \subsection{Catalan number}
          480 \label{sec:Catalan number}
          481 
          482 \( \displaystyle{
          483     C_n = \left . \binom{2n}{n} \middle / (n + 1) \right .
          484 }\)
          485 
          486 
          487 \subsection{Fuss–Catalan number}
          488 \label{sec:Fuss-Catalan number} % not en dash
          489 
          490 \( \displaystyle{
          491     A_m(p, r) = \frac{r}{mp + r} \binom{mp + r}{m}
          492 }\)
          493 
          494 
          495 \newpage
          496 \section{Fibonacci numbers}
          497 \label{sec:Fibonacci numbers}
          498 
          499 Fibonacci numbers can be computed efficiently
          500 using the following algorithm:
          501 
          502 \begin{alltt}
          503    static void
          504    fib_ll(z_t f, z_t g, z_t n)
          505    \{
          506        z_t a, k;
          507        int odd;
          508        if (zcmpi(n, 1) <= 0) \{
          509            zseti(f, !zzero(n));
          510            zseti(f, zzero(n));
          511            return;
          512        \}
          513        zinit(a), zinit(k);
          514        zrsh(k, n, 1);
          515        if (zodd(n)) \{
          516            odd = zodd(k);
          517            fib_ll(a, g, k);
          518            zadd(f, a, a);
          519            zadd(k, f, g);
          520            zsub(f, f, g);
          521            zmul(f, f, k);
          522            zseti(k, odd ? -2 : +2);
          523            zadd(f, f, k);
          524            zadd(g, g, g);
          525            zadd(g, g, a);
          526            zmul(g, g, a);
          527        \} else \{
          528            fib_ll(g, a, k);
          529            zadd(f, a, a);
          530            zadd(f, f, g);
          531            zmul(f, f, g);
          532            zsqr(a, a);
          533            zsqr(g, g);
          534            zadd(g, a);
          535        \}
          536        zfree(k), zfree(a);
          537    \}
          538 \end{alltt}
          539 
          540 \newpage
          541 \begin{alltt}
          542    void
          543    fib(z_t f, z_t n)
          544    \{
          545        z_t tmp, k;
          546        zinit(tmp), zinit(k);
          547        zset(k, n);
          548        fib_ll(f, tmp, k);
          549        zfree(k), zfree(tmp);
          550    \}
          551 \end{alltt}
          552 
          553 \noindent
          554 This algorithm is based on the rules
          555 
          556 \vspace{1em}
          557 \( \displaystyle{
          558     F_{2k + 1} = 4F_k^2 - F_{k - 1}^2 + 2(-1)^k = (2F_k + F_{k-1})(2F_k - F_{k-1}) + 2(-1)^k
          559 }\)
          560 \vspace{1em}
          561 
          562 \( \displaystyle{
          563     F_{2k} = F_k \cdot (F_k + 2F_{k - 1})
          564 }\)
          565 \vspace{1em}
          566 
          567 \( \displaystyle{
          568     F_{2k - 1} = F_k^2 + F_{k - 1}^2
          569 }\)
          570 \vspace{1em}
          571 
          572 \noindent
          573 Each call to {\tt fib\_ll} returns $F_n$ and $F_{n - 1}$
          574 for any input $n$. $F_{k}$ is only correctly returned
          575 for $k \ge 0$. $F_n$ and $F_{n - 1}$ is used for
          576 calculating $F_{2n}$ or $F_{2n + 1}$. The algorithm
          577 can be sped up with a larger lookup table than one
          578 covering just the base cases. Alternatively, a naïve
          579 calculation could be used for sufficiently small input.
          580 
          581 
          582 \newpage
          583 \section{Lucas numbers}
          584 \label{sec:Lucas numbers}
          585 
          586 Lucas [lyk\textscripta] numbers can be calculated by utilising
          587 {\tt fib\_ll} from \secref{sec:Fibonacci numbers}:
          588 
          589 \begin{alltt}
          590    void
          591    lucas(z_t l, z_t n)
          592    \{
          593        z_t k;
          594        int odd;
          595        if (zcmp(n, 1) <= 0) \{
          596            zset(l, 1 + zzero(n));
          597            return;
          598        \}
          599        zinit(k);
          600        zrsh(k, n, 1);
          601        if (zeven(n)) \{
          602            lucas(l, k);
          603            zsqr(l, l);
          604            zseti(k, zodd(k) ? +2 : -2);
          605            zadd(l, k);
          606        \} else \{
          607            odd = zodd(k);
          608            fib_ll(l, k, k);
          609            zadd(l, l, l);
          610            zadd(l, l, k);
          611            zmul(l, l, k);
          612            zseti(k, 5);
          613            zmul(l, l, k);
          614            zseti(k, odd ? +4 : -4);
          615            zadd(l, l, k);
          616        \}
          617        zfree(k);
          618    \}
          619 \end{alltt}
          620 
          621 \noindent
          622 This algorithm is based on the rules
          623 
          624 \vspace{1em}
          625 \( \displaystyle{
          626     L_{2k} = L_k^2 - 2(-1)^k
          627 }\)
          628 \vspace{1ex}
          629 
          630 \( \displaystyle{
          631     L_{2k + 1} = 5F_{k - 1} \cdot (2F_k + F_{k - 1}) - 4(-1)^k
          632 }\)
          633 \vspace{1em}
          634 
          635 \noindent
          636 Alternatively, the function can be implemented
          637 trivially using the rule
          638 
          639 \vspace{1em}
          640 \( \displaystyle{
          641     L_k = F_k + 2F_{k - 1}
          642 }\)
          643 
          644 
          645 \newpage
          646 \section{Bit operation}
          647 \label{sec:Bit operation unimplemented}
          648 
          649 \subsection{Bit scanning}
          650 \label{sec:Bit scanning}
          651 
          652 Scanning for the next set or unset bit can be
          653 trivially implemented using {\tt zbtest}. A
          654 more efficient, although not optimally efficient,
          655 implementation would be
          656 
          657 \begin{alltt}
          658    size_t
          659    bscan(z_t a, size_t whence, int direction, int value)
          660    \{
          661        size_t ret;
          662        z_t t;
          663        zinit(t);
          664        value ? zset(t, a) : znot(t, a);
          665        ret = direction < 0
          666            ? (ztrunc(t, t, whence + 1), zbits(t) - 1)
          667            : (zrsh(t, t, whence), zlsb(t) + whence);
          668        zfree(t);
          669        return ret;
          670    \}
          671 \end{alltt}
          672 
          673 
          674 \subsection{Population count}
          675 \label{sec:Population count}
          676 
          677 The following function can be used to compute
          678 the population count, the number of set bits,
          679 in an integer, counting the sign bit:
          680 
          681 \begin{alltt}
          682    size_t
          683    popcount(z_t a)
          684    \{
          685        size_t i, ret = zsignum(a) < 0;
          686        for (i = 0; i < a->used; i++) \{
          687            ret += __builtin_popcountll(a->chars[i]);
          688        \}
          689        return ret;
          690    \}
          691 \end{alltt}
          692 
          693 \noindent
          694 It requires a compiler extension; if it's not
          695 available, there are other ways to computer the
          696 population count for a word: manually bit-by-bit,
          697 or with a fully unrolled
          698 
          699 \begin{alltt}
          700    int s;
          701    for (s = 1; s < 64; s <<= 1)
          702        w = (w >> s) + w;
          703 \end{alltt}
          704 
          705 
          706 \subsection{Hamming distance}
          707 \label{sec:Hamming distance}
          708 
          709 A simple way to compute the Hamming distance,
          710 the number of differing bits between two
          711 numbers is with the function
          712 
          713 \begin{alltt}
          714    size_t
          715    hammdist(z_t a, z_t b)
          716    \{
          717        size_t ret;
          718        z_t t;
          719        zinit(t);
          720        zxor(t, a, b);
          721        ret = popcount(t);
          722        zfree(t);
          723        return ret;
          724    \}
          725 \end{alltt}
          726 
          727 \noindent
          728 The performance of this function could
          729 be improved by comparing character by
          730 character manually using {\tt zxor}.
          731 
          732 
          733 \newpage
          734 \section{Miscellaneous}
          735 \label{sec:Miscellaneous}
          736 
          737 
          738 \subsection{Character retrieval}
          739 \label{sec:Character retrieval}
          740 
          741 \begin{alltt}
          742 uint64_t
          743 getu(z_t a)
          744 \{
          745     return zzero(a) ? 0 : a->chars[0];
          746 \}
          747 \end{alltt}
          748 
          749 \subsection{Fit test}
          750 \label{sec:Fit test}
          751 
          752 Some libraries have functions for testing
          753 whether a big integer is small enough to
          754 fit into an intrinsic type. Since libzahl
          755 does not provide conversion to intrinsic
          756 types this is irrelevant. But additionally,
          757 it can be implemented with a single
          758 one-line macro that does not have any
          759 side-effects.
          760 
          761 \begin{alltt}
          762    #define fits_in(a, type)  (zbits(a) <= 8 * sizeof(type))
          763    \textcolor{c}{/* \textrm{Just be sure the type is integral.} */}
          764 \end{alltt}
          765 
          766 
          767 \subsection{Reference duplication}
          768 \label{sec:Reference duplication}
          769 
          770 This could be useful for creating duplicates
          771 with modified sign, but only if neither
          772 {\tt r} nor {\tt a} will be modified whilst
          773 both are in use. Because it is unsafe,
          774 fairly simple to create an implementation
          775 with acceptable performance — {\tt *r = *a},
          776 — and probably seldom useful, this has not
          777 been implemented.
          778 
          779 \begin{alltt}
          780    void
          781    refdup(z_t r, z_t a)
          782    \{
          783        \textcolor{c}{/* \textrm{Almost fully optimised, but perfectly portable} *r = *a; */}
          784        r->sign    = a->sign;
          785        r->used    = a->used;
          786        r->alloced = a->alloced;
          787        r->chars   = a->chars;
          788    \}
          789 \end{alltt}
          790 
          791 
          792 \subsection{Variadic initialisation}
          793 \label{sec:Variadic initialisation}
          794 
          795 Most bignum libraries have variadic functions
          796 for initialisation and uninitialisation. This
          797 is not available in libzahl, because it is
          798 not useful enough and has performance overhead.
          799 And what's next, support {\tt va\_list},
          800 variadic addition, variadic multiplication,
          801 power towers, set manipulation? Anyone can
          802 implement variadic wrapper for {\tt zinit} and
          803 {\tt zfree} if they really need it. But if
          804 you want to avoid the overhead, you can use
          805 something like this:
          806 
          807 \begin{alltt}
          808    /* \textrm{Call like this:} MANY(zinit, (a), (b), (c)) */
          809    #define MANY(f, ...)  (_MANY1(f, __VA_ARGS__,,,,,,,,,))
          810    
          811    #define _MANY1(f, a, ...)  (void)f a, _MANY2(f, __VA_ARGS__)
          812    #define _MANY2(f, a, ...)  (void)f a, _MANY3(f, __VA_ARGS__)
          813    #define _MANY3(f, a, ...)  (void)f a, _MANY4(f, __VA_ARGS__)
          814    #define _MANY4(f, a, ...)  (void)f a, _MANY5(f, __VA_ARGS__)
          815    #define _MANY5(f, a, ...)  (void)f a, _MANY6(f, __VA_ARGS__)
          816    #define _MANY6(f, a, ...)  (void)f a, _MANY7(f, __VA_ARGS__)
          817    #define _MANY7(f, a, ...)  (void)f a, _MANY8(f, __VA_ARGS__)
          818    #define _MANY8(f, a, ...)  (void)f a, _MANY9(f, __VA_ARGS__)
          819    #define _MANY9(f, a, ...)  (void)f a
          820 \end{alltt}