commit 8c2c44669b49e9f6bc95f08b2505b11b9b66082f
parent 821d9893f5749db996a3a384c50c75ed92bafe2e
Author: Mattias Andrée <maandree@kth.se>
Date: Fri, 13 May 2016 16:56:12 +0200
On odd/even and signum
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
M | doc/number-theory.tex | | | 90 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- |
1 file changed, 87 insertions(+), 3 deletions(-)
diff --git a/doc/number-theory.tex b/doc/number-theory.tex
@@ -1,7 +1,8 @@
\chapter{Number theory}
\label{chap:Number theory}
-TODO
+In this chapter, you will learn about the
+number theoretic functions in libzahl.
\vspace{1cm}
\minitoc
@@ -11,14 +12,97 @@ TODO
\section{Odd or even}
\label{sec:Odd or even}
-TODO % zodd zeven zodd_nonzero zeven_nonzero
+There are four functions available for testing
+the oddness and evenness of an integer:
+
+\begin{alltt}
+ int zodd(z_t a);
+ int zeven(z_t a);
+ int zodd_nonzero(z_t a);
+ int zeven_nonzero(z_t a);
+\end{alltt}
+
+\noindent
+{\tt zodd} returns 1 if {\tt a} contains an
+odd value, or 0 if {\tt a} contains an even
+number. Conversely, {\tt zeven} returns 1 if
+{\tt a} contains an even value, or 0 if {\tt a}
+contains an odd number. {\tt zodd\_nonzero} and
+{\tt zeven\_nonzero} behave exactly like {\tt zodd}
+and {\tt zeven}, respectively, but assumes that
+{\tt a} contains a non-zero value, if not
+undefined behaviour is invoked, possibly in the
+form of a segmentation fault; they are thus
+sligtly faster than {\tt zodd} and {\tt zeven}.
+
+It is discouraged to test the returned value
+against 1, we should always test against 0,
+treating all non-zero value as equivalent to 1.
+For clarity, we use also avoid testing that
+the returned value is zero, for example, rather
+than {\tt !zeven(a)} we write {\tt zodd(a)}.
\newpage
\section{Signum}
\label{sec:Signum}
-TODO % zsignum zzero
+There are two functions available for testing
+the sign of an integer, one of the can be used
+to retrieve the sign:
+
+\begin{alltt}
+ int zsignum(z_t a);
+ int zzero(z_t a);
+\end{alltt}
+
+\noindent
+{\tt zsignum} returns $-1$ if $a < 0$,
+$0$ if $a = 0$, and $+1$ if $a > 0$, that is,
+
+\vspace{1em}
+\( \displaystyle{
+ \mbox{sgn}~a = \left \lbrace \begin{array}{rl}
+ -1 & \textrm{if}~ a < 0 \\
+ 0 & \textrm{if}~ a = 0 \\
+ +1 & \textrm{if}~ a > 0
+ \end{array} \right .
+}\)
+\vspace{1em}
+
+\noindent
+It is discouraged to compare the returned value
+against $-1$ and $+1$; always compare against 0,
+for example:
+
+\begin{alltt}
+ if (zsignum(a) > 0) "positive";
+ if (zsignum(a) >= 0) "non-negative";
+ if (zsignum(a) == 0) "zero";
+ if (!zsignum(a)) "zero";
+ if (zsignum(a) <= 0) "non-positive";
+ if (zsignum(a) < 0) "negative";
+ if (zsignum(a)) "non-zero";
+\end{alltt}
+
+\noindent
+However, when we are doing arithmetic with the
+signum, we may relay on the result never being
+any other value than $-1$, $0$, and $+0$.
+For example:
+
+\begin{alltt}
+ zset(sgn, zsignum(a));
+ zadd(b, sgn);
+\end{alltt}
+
+{\tt zzero} returns 0 if $a = 0$ or 1 if
+$a \neq 0$. Like with {\tt zsignum}, avoid
+testing the returned value against 1, rather
+test that the returned value is not 0. When
+however we are doing arithmetic with the
+result, we may relay on the result never
+being any other value than 0 or 1.
\newpage