I am writing a document in which I needed to include the description of the Number Field Sieve (NFS) algorithm as mentioned in the book by Crandall and Pomerance. The algorithm's pseudo code is lengthy enough to fill an A4 page, and I am facing the following two problems:
- The white spaces around the algorithm do not seem to be properly distributed; causing the algorithm to get chopped, instead of naturally proceeding on the next page, meanwhile covering the page number!
-
The arrangement of the contents in previous pages is altered in such an unexpected way; a blank page is left, the sections/subsections look improperly spaced (scattered).
\documentclass{article} \usepackage{fullpage} \usepackage{amssymb} % for some mathematical symbols \usepackage[format=hang, font=small, labelfont=bf]{caption} % makes the table caption in bold \usepackage{mathtools} % for cieling function paranthesis \usepackage{float} % for fixing the position of the tables and figures \usepackage[ruled, vlined, algosection, norelsize]{algorithm2e} % The algorithms writing \SetAlFnt{\sf} % Set the algorithms font style to sans serif \begin{document} \begin{algorithm}[H] \caption{Number Field Sieve \label{alg:NFS}} %\DontPrintSemicolon \SetKwBlock{Setup}{Setup}{} \SetKwBlock{TheSieve}{The Sieve}{} \SetKwBlock{TheMatrix}{The Matrix}{} \SetKwBlock{LinearAlgebra}{Linear Algebra}{} \SetKwBlock{SquareRoots}{Square Roots}{} \SetKwBlock{Factorization}{Factorization}{} \SetAlFnt{\small \sf} \KwIn{An odd composite number $N$ that is not a power.} \KwOut{A nontrivial factorization of $N$} { \BlankLine \nl \Setup { $d = \left \lfloor 3 \left(\frac{\ln N}{\ln \ln N} \right)^{\frac{1}{3}} \right \rfloor$ \tcp*[r]{This $d$ has $d^{2d^2} < N$.} $B = \left \lfloor \exp((\frac{8}{9})^{1/3} (\ln N)^{1/3} (\ln \ln N)^{2/3}) \right \rfloor$ \tcp*[r]{Note that both $d$ and $B$ can be tuned to taste.} $m = \lfloor N^{1/d} \rfloor$\; Write $N$ in base $m$: $N = m^d + c_{d-1}m^{d-1} + \ldots + c_0$\; $f(x) = x^d + c_{d-1}x^{d-1} + \ldots + c_0$ \tcp*[r]{Establish the polynomial $f$.} Attempt to factor $f(x)$ into irreducible polynomials in $\mathbb{Z}[x]$ using the factoring algorithm in \cite{Lenstra et al. 1982} or a variant such as \cite{Cohen 2000}(p. 139)\; If $f(x)$ has the nontrivial factorization $g(x)h(x)$, return the (also nontrivial) factorization $N = g(m)h(m)$\; $F(x,y) = x^d + c_{d-1}x^{d-1}y + \ldots + c_0y^d$ \tcp*[r]{Establish the polynomial $F$.} $G(x, y) = x - my$\; \For {$(\text{prime } p \leq B)$} { compute the set $R(p) = \{ r \in [0, p-1]: f(r) \equiv 0 \pmod p \}$\; } $k =\lfloor 3\lg N \rfloor$\; Compute the first $k$ primes $q_1, \ldots, q_k > B$ such that $R(q_j)$ contains some element $s_j$ with $f'(x_j) \not \equiv 0 \pmod {q_j}$ storing the $k$ pairs $(q_j, s_j)$\; $B' = \sum_{p \leq B}\#R(p)$\; $V = 1 + \pi(B) + B' + k$\; $M = B$\; } \BlankLine \nl \TheSieve { Use a sieve to find a set $\mathcal{S}'$ of coprime integer pairs $(a, b)$ with $0 < |a|, b \leq M$, and $F(a, b)G(a, b)$ being $B$-smooth, until $\#\mathcal{S}' > V$, or failing this, increase $M$ and try again, or goto \textrm{\bf Setup} and increase $B$\; } \BlankLine \nl \TheMatrix { \tcp*[f]{We shall build a $\#\mathcal{S}' \times V$ binary matrix, one row per $(a, b)$ pair.} \tcp*[f]{We shall compute $\vec{v}(a - b\alpha)$, the binary exponent vector for $a - b\alpha$ having $V$ bits (coordinates) as follows:}\\ Set the first bit of $\vec{v}$ to $1$ if $G(a, b) < 0$, else set this bit to 0\; \tcp*[f]{The next $\pi(B)$ bits depend on the primes $p \leq B$: Define $p^\gamma$ as the power of $p$ in the prime factorization of $|G(a, b)|$.}\\ Set the bit for $p$ to $1$ if $\gamma$ is odd, else set this bit to 0\; \tcp*[f]{The next $B'$ bits are to correspond to the pairs $p, r$ where $p$ is a prime not exceeding $B$ and $r \in R(p)$.}\\ Set the bit for $p, r$ to $1$ if $v_{p, r}(a - b\alpha)$ is odd, else set it to 0\; \tcp*[f]{Next, the last $k$ bits correspond to the pairs $q_j, s_j$.}\\ Set the bit for $q_j, s_j$ to $1$ if $\left( \frac{a - bs_j}{q_j} \right)$ is $-1$, else set it to 0\; Install the exponent vector $\vec{v}(a - b\alpha)$ as the next row of the matrix\; } \BlankLine \nl \LinearAlgebra { By some method of linear algebra, find a nonempty subset $\mathcal{S}$ of $\mathcal{S}'$ such that $\sum_{(a, b) \in \mathcal{S}} \vec{v}(a - b\alpha)$ is the $0$-vector $(\bmod{2})$\; } \BlankLine \nl \SquareRoots { Use the known prime factorization of the integer square $\prod_{(a, b) \in \mathcal{S}}(a - bm)$ to find a residue $v \mod n$ with $\prod_{(a, b) \in \mathcal{S}}(a - bm) \equiv v^2 \pmod{N}$\; By the suitable method to find the square root $\gamma$ in $\mathbb{Z}[\alpha]$ of $f'(\alpha)^2 \prod_{(a, b) \in \mathcal{S}}(a - b\alpha)$, and, via a simple replacement $\alpha \to m$, compute $u = \phi(\gamma)\pmod{N}$\; } \BlankLine \nl \Factorization { return $\gcd((u - f'(m)v), n)$\; } } \end{algorithm} \end{document}
Best Answer
From the
algorithm2e
documentation:Give more sensible placement options for a large floating environment:
tbp
.But now the float is still too big for the page (which causes it to be pushed far later in the document as you mentioned in a comment). You have three options:
Because options 1 and 2 are dependent on your algorithm and field, I've shown option 3 here. But I think option 1 or 2 would be preferable for a real algorithm/document.
All I did was change your line
to
and here is the result (page 1 of 1 for this MWE, no leading blank page and no overfull boxes or float too large warnings in the log file):