+\subsection{Big Integers} \label{Big Integers}
+Computer hardware implements operations for fixed size integers. The base is $\beta = 2$ and the digits
+are {0, 1}. The most significant bit can be reserved for the sign instead of a digit.
+We can construct larger size integers by considering some sequence of fixed size integers to be
+individual digits. In practice we will still be limited by the memory and processing time required
+1for ``big'' integers.
+
+For example, we can represent $5682_{10}$ as a single 16 bit digit or as the sum of two 8 bit digits. Each
+digit is being written in base 2 or 10 because there is not a universal base with $\ge 2^8$ unique symbols.
+\begin{align*}
+ 5682_{10} &= 1011000110010_2 = 10110_2 \times 2^{8} + 110010_{2} \times 2^{0}
+\end{align*}
+
+When performing an operation involving two $m$ digit integers, the result will in general require at most $2m$ digits. A straight forward big integer implementation merely needs to allocate memory for leading zeroes
+
+Big Integers are implemented on the CPU as part of the standard for several languages including Python\cite{python_pep0237} and Java\cite{java_bigint}. Most implementations are based on the GNU Multiple Precision library (GMP) \cite{gmp2014}. There have also been implementations of Big Integer arithmetic for GPUs\cite{zhao2010GPUMP}.
+
+ During this project a custom Big Integer type was implemented, but was found to be vastly inferior to the GMP implementation\cite{documentsArbitraryIntegers}.
+
+