 # Integer Factorization Algorithms: A Comparative Analysis

Integer factorization consists of breaking down a composite number into its prime factors, a crucial aspect of cryptography, number theory, and computer science. Various integer factorization algorithms have been developed, each with strengths and limitations.

1. Trial Division
2. Pollard’s Rho Algorithm
4. General Number Field Sieve Algorithm

We evaluate the computational efficiency of each algorithm, provide examples and use cases, and showcase the algorithms using Python code.

## 1. Trial Division Algorithm

The Trial Division Algorithm is the simplest and most straightforward integer factorization algorithm. It involves sequentially dividing the number n by each integer less than its square root and testing if it is a factor. If a factor is found, the algorithm returns it, and if no factor is found, n is prime.

The algorithm can be represented mathematically as:

import random
import math
import time

# This method find the GCD (Greatest Common Divisor) of two numbers
# -----------------------------------------------------------------
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a

# This method factorizes a large composite number N
# -------------------------------------------------
def factor(N):
for a in range(2, math.ceil(math.sqrt(N-1))):
if gcd(a, N) > 1:
print (str(a) + " is a factor of " + str(N))
return a

return 1

# TEST method
start_time = time.time()
factor(9999973 * 9999991)
end_time = time.time()
print("Elpased time = " + str(end_time - start_time))


While the Trial Division Algorithm is easy to implement, it is computationally inefficient for large numbers since it has a time complexity of: $O(\sqrt{n})$

Factoring 9999973 * 9999991 consumes around 4 seconds on my laptop. We will use this number as a benchmark for comparing the remaining algorithms.

## 2. Pollard’s Rho Algorithm

Pollard’s Rho Algorithm is a probabilistic algorithm for factoring composite integers. It is based on the idea of “random walks” on a cyclic group of integers modulo n.

from math import gcd
import time

def pollard_rho(n):
x = 2
y = 2
d = 1
while d == 1:
x = f(x, n)
y = f(f(y, n), n)
d = gcd(abs(x - y), n)
if d == n:
return None
return d, n // d

def f(x, n):
return (x**2 + 1) % n

start_time = time.time()
print (pollard_rho(9999973 * 9999991))
end_time = time.time()
print("Elpased time = " + str(end_time - start_time))


The algorithm starts by selecting two random integers x and y, and a random function f(x) that operates on integers modulo n. It then repeatedly applies the function f(x) to x, and the function f(f(y)) to y, until it finds a non-trivial common factor d of n using the greatest common divisor function gcd(a, b).

The algorithm works on the principle that if we generate a sequence of integers xi, yi such that xi ≡ yi mod d for some non-trivial factor d of n, then eventually, xi and yi will meet and gcd(abs(xi - yi), n) will be a non-trivial factor of n. This is because the sequence xi and yi can be thought of as “random walks” on a cyclic group of integers modulo n, and they will likely intersect at some point if n has non-trivial factors.

The random function f(x) is chosen to be a simple, computationally efficient function that is difficult to predict. One popular choice is the function f(x) = (x2 + 1) mod n, which is easy to compute but difficult to predict for large n. The choice of function can affect the algorithm’s running time and success rate, and different functions may be more effective for different numbers.

Pollard’s Rho Algorithm has a running time of O(sqrt(n)) on average, making it much faster than brute-force methods for factoring large composite numbers. However, it is a probabilistic algorithm and may fail to find a non-trivial factor even if one exists. To increase the probability of success, the algorithm can be run multiple times with different random seeds and functions or combined with other factorization algorithms.

Pollard’s Rho algorithm takes about 0.003 seconds, an improvement of 1,333%.

## 3. General Number Field Sieve Algorithm

The General Number Field Sieve (GNFS) algorithm is currently the fastest known algorithm for factoring large integers. It was first proposed by John Pollard in 1970 and later improved by Carl Pomerance and Richard Crandall in 1988. The algorithm finds smooth numbers in a large interval and then uses linear algebra to find the factors.

### 3.1 Description of General Number Field Sieve Algorithm

The GNFS algorithm is a two-stage algorithm. The first stage involves finding a set of smooth numbers in a large interval. The second stage involves using linear algebra to find the factors of the factored integer.

In the first stage, the algorithm selects a large smoothness bound B and finds two integers, x and y, such that x2 = y2 (mod n), where n is the factored integer. The algorithm then constructs a polynomial of degree B using these two integers and uses sieving to find a set of B-smooth numbers. These B-smooth numbers are used in the second stage of the algorithm.

In the second stage, the algorithm constructs a matrix using the B-smooth numbers found in the first stage. The matrix has dimensions of (r+s) x r, where r is the number of prime factors of the smooth numbers and s is a parameter that depends on the size of the numbers being factored. The algorithm then uses Gaussian elimination to solve the matrix and find the factors of the factored integer.

### 3.2 Computational efficiency and limitations

The GNFS algorithm is currently the most efficient algorithm for factoring large integers. However, running requires a significant amount of memory and processing power. The time complexity of the algorithm is of the order of: $O(\exp((1/3) \times (\log(n))^{1/3} \times (\log(\log(n)))^{2/3}))$

This means the algorithm is polynomial but still very slow for large integers.

### 3.3 Examples and use cases

The GNFS algorithm has been used to factor several large integers, including RSA-768, which was factored in 2009 using a distributed computing network. The algorithm has also been used to factor the largest known Fermat number, F12, which has 155 digits.

## 4. Comparison of Algorithms

Regarding integer factorization, there are several algorithms to choose from. The table below compares the computational efficiency and limitations of each algorithm.

### 4.1 Examples and use cases

The choice of algorithm depends on the size and structure of the integer being factored. For small primes, trial division is the most efficient algorithm. Pollard’s Rho and the Quadratic Sieve are efficient for larger integers but have limitations. The General Number Field Sieve is the most efficient algorithm for factoring large integers, but it requires significant memory and processing power.

## 5. Conclusion

In conclusion, integer factorization is a fundamental problem in computer science and has many practical applications, particularly in cryptography. Several algorithms are available for integer factorization, each with advantages and limitations. The choice of algorithm largely depends on the size of the number to be factored in and the available computing resources. It is important to choose the right algorithm to ensure efficient and timely factorization of large integers.

For small to medium-sized integers, Pollard’s Rho algorithm is recommended. For integers that are too large for trial division but too small for the GNFS, the Quadratic Sieve algorithm is recommended. For very large integers, the GNFS is the most efficient algorithm.

Research in integer factorization is ongoing to improve the efficiency of existing algorithms and develop new ones. Future directions in integer factorization research include:

• Improving the polynomial selection process in the GNFS to reduce the running time of the algorithm
• Developing new algorithms that are faster and more efficient than existing ones
• Exploring quantum algorithms for integer factorization

## One Comment

1. Vassilly Voinov says:

See Voinov, V. (2023) A simple enumerative polynomial-time algorithm for the prime factorization. CABJ 23(2), pp.1-6