Introduction
Introduction Statistics Contact Development Disclaimer Help
Add exercise: [13] Modular generalised power towers - libzahl - big integer lib…
git clone git://git.suckless.org/libzahl
Log
Files
Refs
README
LICENSE
---
commit 18a0e23b2f2e37c56c4f0f9a3dd56c1c619a4468
parent 7e8ea5ca2505686932b489e0aa1df0b3f0433e19
Author: Mattias Andrée <[email protected]>
Date: Sat, 30 Jul 2016 00:28:41 +0200
Add exercise: [13] Modular generalised power towers
Signed-off-by: Mattias Andrée <[email protected]>
Diffstat:
M doc/exercises.tex | 71 +++++++++++++++++++++++++++++…
1 file changed, 70 insertions(+), 1 deletion(-)
---
diff --git a/doc/exercises.tex b/doc/exercises.tex
@@ -290,6 +290,18 @@ You can assume $b > 0$ and $m > 0$. You can also assume
unique pointers.
+
+\item {[\textit{13}]} \textbf{Modular generalised power towers}
+
+{\small\textit{This problem requires a working
+solution for ``Modular tetration''.}}
+
+Modify your solution for ``Modular tetration'' to
+evaluate any expression on the forms
+$a^b,~a^{b^c},~a^{b^{c^d}},~\ldots \text{ mod } m$.
+
+
+
\end{enumerate}
@@ -715,7 +727,7 @@ tetra(z_t r, z_t b, unsigned long n)
\{
zsetu(r, 1);
while (n--)
- pow(r, b, r);
+ zpow(r, b, r);
\}
\end{alltt}
\vspace{-1em}
@@ -802,4 +814,61 @@ modtetra(z_t r, z_t b, unsigned long n, z_t m)
+\item \textbf{Modular generalised power towers}
+
+Instead of the signature
+
+\vspace{-1em}
+\begin{alltt}
+ void modtetra(z_t r, z_t b, unsigned long n, z_t m);
+\end{alltt}
+\vspace{-1em}
+
+\noindent
+you want to use the signature
+
+\vspace{-1em}
+\begin{alltt}
+ void modtower_(z_t r, z_t *a, size_t n, z_t m);
+\end{alltt}
+\vspace{-1em}
+
+Instead of using, \texttt{b} (in \texttt{modtetra}),
+use \texttt{*a}. At every recursion, instead of
+passing on \texttt{a}, pass on \texttt{a + 1}.
+
+The function \texttt{tetra} is modified into
+
+\vspace{-1em}
+\begin{alltt}
+ void tower(z_t r, z_t *a, size_t n)
+ \{
+ zsetu(r, 1);
+ while (n--);
+ zpow(r, a[n], r);
+ \}
+\end{alltt}
+\vspace{-1em}
+
+\noindent
+\texttt{cmp\_tetra} is changed analogously.
+
+To avoid problems in the evaluation, define
+
+\vspace{-1em}
+\begin{alltt}
+ void modtower(z_t r, z_t *a, size_t n, z_t m);
+\end{alltt}
+\vspace{-1em}
+
+\noindent
+which cuts the power short at the first element
+of of \texttt{a} that equals 1. For example, if
+$a = \{2, 3, 4, 5, 1, 2, 3\}$, and $n = 7$
+($n = |a|$), then \texttt{modtower}, sets $n = 4$,
+and effectively $a = \{2, 3, 4, 5\}$. After this
+\texttt{modtower} calls \texttt{modtower\_}.
+
+
+
\end{enumerate}
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.