## The Mastery of Computer Programming: Primary Algorithms - Sykalo Eugene 2023

# Integer factorization

Arithmetic Algorithms

## Introduction to Integer Factorization

Integer factorization is the process of finding the prime factors of a given integer. This is an important problem in computer programming, as it has many applications in fields like cryptography, number theory, and computer security.

In cryptography, integer factorization is used for the creation and breaking of cryptographic codes. For example, the security of RSA encryption depends on the difficulty of factoring large integers into their prime factors. In number theory, integer factorization is used to solve Diophantine equations, which are equations that involve integer coefficients.

The problem of integer factorization is considered to be a difficult problem, as there is no known algorithm that can factor an arbitrary integer in polynomial time. However, there are many algorithms that can factor integers efficiently for certain classes of integers. These algorithms use various techniques, such as trial division, sieving, and number theory.

In this chapter, we will discuss several algorithms for integer factorization, including the trial division algorithm, Fermat's factorization algorithm, Pollard's Rho algorithm, the quadratic sieve algorithm, and the elliptic curve factorization algorithm. Each of these algorithms has its own advantages and disadvantages, and is suited for different types of integers. By understanding these algorithms, you will be able to choose the best method for factoring a given integer in a particular situation.

## Trial Division Algorithm

The trial division algorithm is the most basic method for finding the factors of an integer. The algorithm works by dividing the integer by each integer from 2 up to the square root of the integer, checking if each division is exact. If a divisor is found, it is a factor of the integer. If no divisor is found up to the square root of the integer, then the integer is prime.

The trial division algorithm is easy to understand and implement, but it is not efficient for factoring large integers. The time complexity of the algorithm is O(sqrt(n)), where n is the integer being factored. This means that the algorithm becomes much slower as the size of the integer increases.

The trial division algorithm can be improved by using various techniques, such as skipping even numbers and using precomputed prime numbers. However, even with these improvements, the algorithm is not practical for factoring large integers.

Despite its limitations, the trial division algorithm is still useful in certain situations. For example, it can be used to quickly determine if a small integer is prime. It can also be used as a first step in more advanced factoring algorithms, such as the Pollard's Rho algorithm and the quadratic sieve algorithm.

## Fermat's Factorization Algorithm

Fermat's factorization algorithm is a more advanced method for finding the factors of an integer than the trial division algorithm. The algorithm works by expressing the integer as the difference of two squares, and then factoring this difference using the difference of squares formula. If the resulting factors are non-trivial, then they are factors of the original integer. If the resulting factors are trivial, then the algorithm fails.

The difference of squares formula is:

a^2 - b^2 = (a + b)(a - b)

To use Fermat's factorization algorithm, we first express the integer as a difference of squares:

n = a^2 - b^2

We can rewrite this as:

n = (a + b)(a - b)

If n has non-trivial factors, then one of the factors must be of the form (a + b) and the other must be of the form (a - b). We can solve for a and b using the following equations:

a = (n + b^2)^0.5 b = (a^2 - n)^0.5

We start with a value of b that is close to the square root of n. We then calculate a using the first equation, and b using the second equation. We repeat this process until we find factors of n.

Fermat's factorization algorithm is faster than the trial division algorithm for large integers, but it is still relatively slow compared to more advanced algorithms like the quadratic sieve algorithm. However, it is useful in situations where the integer has a small number of factors or where the factors are close together.

## Pollard's Rho Algorithm

Pollard's Rho algorithm is a widely used algorithm for integer factorization. The algorithm works by randomly generating a sequence of integers, and then looking for a cycle in the sequence. The cycle can be used to find factors of the integer being factored.

The sequence is generated using a function of the form:

f(x) = (x^2 + c) mod n

where x is the current term in the sequence, c is a random constant, and n is the integer being factored. The function is applied repeatedly to generate the sequence.

If the sequence contains a repeated term, then there is a cycle in the sequence. The cycle can be used to find factors of n using the following formula:

gcd(x_i - x_j, n)

where x_i and x_j are terms in the cycle.

Pollard's Rho algorithm is much faster than the trial division algorithm and Fermat's factorization algorithm for large integers. Its time complexity is O(sqrt(p)), where p is the smallest prime factor of the integer being factored. This means that the algorithm becomes much faster as the size of the smallest prime factor decreases.

Pollard's Rho algorithm can be improved by using various techniques, such as Brent's variant and the Montgomery reduction method. These techniques can improve the speed and efficiency of the algorithm.

Pollard's Rho algorithm is widely used in applications like cryptography and computer security. It is also used as a building block in more advanced factoring algorithms, such as the quadratic sieve algorithm and the general number field sieve algorithm.

## Quadratic Sieve Algorithm

The quadratic sieve algorithm is a powerful method for finding the factors of large integers. The algorithm works by finding a set of integers that share a certain property, and then using these integers to construct a set of equations. These equations can then be solved to find the factors of the original integer.

The first step in the quadratic sieve algorithm is to find a set of integers that share a certain property. These integers are called smooth numbers, and they have factors that are all small primes. To find these numbers, we start by choosing a set of primes, called the factor base. We then choose a set of integers, called the sieve interval, that contains the integer we want to factor.

Next, we sieve the sieve interval by dividing each integer in the interval by the primes in the factor base. If the resulting quotient has only small prime factors, then the integer is a smooth number. We record the smooth numbers and their factorizations, and discard the rest of the integers in the sieve interval.

Once we have found a sufficient number of smooth numbers, we can construct a set of equations using the logarithms of the smooth numbers. These equations can be solved using linear algebra to find the factors of the original integer.

The quadratic sieve algorithm is much faster than the trial division algorithm, Fermat's factorization algorithm, and Pollard's Rho algorithm for large integers. Its time complexity is approximately O(exp(sqrt(log(n) log(log(n))))), where n is the integer being factored. This means that the algorithm becomes much faster as the size of the integer increases.

The quadratic sieve algorithm can be improved by using various techniques, such as the multiple polynomial quadratic sieve and the number field sieve. These techniques can improve the speed and efficiency of the algorithm.

The quadratic sieve algorithm is widely used in applications like cryptography and computer security. It is one of the most powerful methods for factoring large integers, and is the method used to factor many of the RSA challenge numbers.

## Elliptic Curve Factorization Algorithm

The elliptic curve factorization algorithm is an advanced method for finding the factors of an integer. The algorithm is based on the fact that the set of points on an elliptic curve over a finite field forms a group, and that this group has certain properties that can be used to factor integers.

To use the elliptic curve factorization algorithm, we first choose an elliptic curve over a finite field, and a point on the curve. We then generate a sequence of points on the curve by repeatedly adding the chosen point to itself. The resulting sequence of points forms a subgroup of the group of points on the curve.

We then choose a random integer k, and calculate the kth multiple of the chosen point using the group operation. We can also calculate the kth multiple of the points in the sequence using the same method. If we find two points in the sequence that have the same x-coordinate, then we have found a non-trivial factor of the integer being factored.

The elliptic curve factorization algorithm is much faster than the trial division algorithm, Fermat's factorization algorithm, Pollard's Rho algorithm, and the quadratic sieve algorithm for large integers. Its time complexity is approximately O(exp(sqrt(log(n) log(log(n))))), where n is the integer being factored. This means that the algorithm becomes much faster as the size of the integer increases.

The elliptic curve factorization algorithm can be improved by using various techniques, such as the Lenstra elliptic curve factorization algorithm and the Williams p+1 algorithm. These techniques can improve the speed and efficiency of the algorithm.

The elliptic curve factorization algorithm is widely used in applications like cryptography and computer security. It is one of the most powerful methods for factoring large integers, and is the method used to factor many of the RSA challenge numbers.