Science Fair Project Encyclopedia
Prime factorization algorithm
A prime factorization algorithm is any algorithm (a step-by-step process) by which an integer (whole number) is "decomposed" into a product of factors that are prime numbers. The fundamental theorem of arithmetic guarantees that this decomposition is unique.
| Contents |
A simple factorization algorithm
Description
We can describe a recursive algorithm to perform such factorizations: given a number n
- if n is prime, this is the factorization, so stop here.
- if n is composite, divide n by the first prime p1. If it divides cleanly, recurse with the value n/p1. Add p1 to the list of factors obtained for n/p1 to get a factorization for n. If it does not divide cleanly, divide n by the next prime p2, and so on.
Note that we need to test only primes pi such that pi ≤ √n.
Example
- Suppose we wish to factorize the number 9438.
- 9438/2 = 4719 with a remainder of 0, so 2 is a factor. We repeat the algorithm with 4719.
- 4719/2 = 2359 with a remainder of 1, so 2 is NOT a factor.
- 4719/3 = 1573 with a remainder of 0, so 3 is a factor. We repeat the algorithm with 1573.
- The first prime number which 1573 is divisible by is the prime number 11.
- 1573/11 = 143 with a remainder of 0, so 11 is a factor. We repeat the algorithm with 143.
- Similarly 11 is the first prime number which 143 is divisible by.
- 143/11 = 13 with a remainder of 0, so 11 is a factor. We repeat the algorithm with 13.
- 13/13 = 1 with a remainder of 0, so 13 is a factor. We stop when we reached 1.
Thus working from top to bottom, we have 9438 = 2*3*11*11*13
Code
Here is the code in Python for finding the factors of numbers less than 2147483647:
from math import sqrt
def factorize(n):
def isPrime(n):
return not [x for x in xrange(2,int(sqrt(n))+1)
if n%x == 0]
primes = []
candidates = xrange(2,n+1)
candidate = 2
while not primes and candidate in candidates:
if n%candidate == 0 and isPrime(candidate):
primes = primes + [candidate] + factorize(n/candidate)
candidate += 1
return primes
print factorize(int(sys.argv[1]))
output:
python factorize.py 9438 [2, 3, 11, 11, 13]
Here is a more complex code in Python for finding the factors of any arbitrarily large number:
import sys
ListOfPrimes=[2,3,5,7,11,13,17,19]
maxindex=len(ListOfPrimes)
maxprimeinlist=ListOfPrimes[-1]
# Put Primes in a dictionary
DictPrime={}
DictPrime.fromkeys(ListOfPrimes,True)
def intsqrt(n):
""" Return the integer square root of a long number """
def intsqrt_core(digitpair,remainder,results):
# function intsqrt_core returns (results,remainder)
if digitpair<100:
currvalue=remainder*100 + digitpair
for d in range(9,-1,-1):
x=(2*10*results + d)*d
if x <= currvalue:
remainder= currvalue - x
results=results*10 + d
return(results,remainder)
else:
(results,remainder)=intsqrt_core(digitpair//100,remainder,results)
(results,remainder)=intsqrt_core(digitpair%100,remainder,results)
return(results,remainder)
(results,remainder)=intsqrt_core(n,0,0)
return results
def isPrime(n):
""" Return True if n is a prime """
if DictPrime.has_key(n):
return True
high=intsqrt(n)
for x in ListOfPrimes:
if x <= high and n%x == 0:
return False
if x >= high:
return True
x=maxprimeinlist + 2
while x<=high:
if n%x == 0:
return False
x += 2
return True
def factorize(n):
""" Factorize a integer number """
primes = []
index=0
candidate = ListOfPrimes[index]
while not primes and candidate <= n:
if n%candidate == 0 and (index < maxindex or isPrime(candidate)):
primes = primes + [candidate] + factorize(n//candidate)
index += 1
if index < maxindex:
candidate = ListOfPrimes[index]
else:
candidate += 2
return primes
def condense(L):
""" Condense result in list to prime^nth_power format """
prime,count,list=0,0,[]
for x in L:
if x == prime:
count += 1
else:
if prime != 0:
list = list + [str(prime) + '^' + str(count)]
prime,count=x,1
list = list + [str(prime) + '^' + str(count)]
return list
if __name__ == '__main__':
print condense(factorize(long(sys.argv[1])))
# Sample output
#
# python factorize.py 173248246132375748867198458668657948626531982421875
# ['3^24', '5^14', '7^33', '13^1']
Time complexity
The algorithm described above works fine for small n, but becomes impractical as n gets larger. For example, for an 18-digit (or 60 bit) number, all primes below about 1,000,000,000 may need to be tested, which is taxing even for a computer. Adding two decimal digits to the original number will multiply the computation time by 10.
The difficulty (large time complexity) of factorization makes it a suitable basis for modern cryptography.
See also: Euler's Theorem, Integer factorization, Trial division
External link
The contents of this article is licensed from www.wikipedia.org under the GNU Free Documentation License. Click here to see the transparent copy and copyright details


