blob: 6cc389ea6ffa4c0597874afee0f90dd75caf1bd4 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossumec758ea1991-06-04 20:36:54 +00002
Guido van Rossum1c8230b1991-12-18 13:45:17 +00003# Factorize numbers.
4# The algorithm is not efficient, but easy to understand.
5# If there are large factors, it will take forever to find them,
6# because we try all odd numbers between 3 and sqrt(n)...
Guido van Rossumec758ea1991-06-04 20:36:54 +00007
8import sys
9from math import sqrt
10
11error = 'fact.error' # exception
12
13def fact(n):
14 if n < 1: raise error # fact() argument should be >= 1
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000015 if n == 1: return [] # special case
Guido van Rossumec758ea1991-06-04 20:36:54 +000016 res = []
17 # Treat even factors special, so we can use i = i+2 later
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000018 while n%2 == 0:
Guido van Rossumec758ea1991-06-04 20:36:54 +000019 res.append(2)
20 n = n/2
21 # Try odd numbers up to sqrt(n)
Guido van Rossum3a585bb1992-03-30 11:15:49 +000022 limit = sqrt(float(n+1))
Guido van Rossumec758ea1991-06-04 20:36:54 +000023 i = 3
24 while i <= limit:
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000025 if n%i == 0:
Guido van Rossumec758ea1991-06-04 20:36:54 +000026 res.append(i)
27 n = n/i
Guido van Rossum1c8230b1991-12-18 13:45:17 +000028 limit = sqrt(n+1)
Guido van Rossumec758ea1991-06-04 20:36:54 +000029 else:
30 i = i+2
Guido van Rossum3a585bb1992-03-30 11:15:49 +000031 if n != 1:
32 res.append(n)
Guido van Rossumec758ea1991-06-04 20:36:54 +000033 return res
34
35def main():
36 if len(sys.argv) > 1:
37 for arg in sys.argv[1:]:
Guido van Rossum1c8230b1991-12-18 13:45:17 +000038 n = eval(arg)
Guido van Rossumec758ea1991-06-04 20:36:54 +000039 print n, fact(n)
40 else:
41 try:
42 while 1:
Guido van Rossum1c8230b1991-12-18 13:45:17 +000043 n = input()
Guido van Rossumec758ea1991-06-04 20:36:54 +000044 print n, fact(n)
45 except EOFError:
46 pass
47
48main()