blob: c76474c0fd8ed7f527cea63b853e7c340d27ad37 [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
Guido van Rossumec758ea1991-06-04 20:36:54 +000011def fact(n):
Benjamin Petersond7b03282008-09-13 15:58:53 +000012 if n < 1: raise ValueError # fact() argument should be >= 1
Tim Peterse6ddc8b2004-07-18 05:56:09 +000013 if n == 1: return [] # special case
14 res = []
15 # Treat even factors special, so we can use i = i+2 later
16 while n%2 == 0:
17 res.append(2)
Benjamin Petersond7b03282008-09-13 15:58:53 +000018 n = n//2
Tim Peterse6ddc8b2004-07-18 05:56:09 +000019 # Try odd numbers up to sqrt(n)
20 limit = sqrt(float(n+1))
21 i = 3
22 while i <= limit:
23 if n%i == 0:
24 res.append(i)
Benjamin Petersond7b03282008-09-13 15:58:53 +000025 n = n//i
Tim Peterse6ddc8b2004-07-18 05:56:09 +000026 limit = sqrt(n+1)
27 else:
28 i = i+2
29 if n != 1:
30 res.append(n)
31 return res
Guido van Rossumec758ea1991-06-04 20:36:54 +000032
33def main():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000034 if len(sys.argv) > 1:
35 for arg in sys.argv[1:]:
36 n = eval(arg)
Collin Winter6f2df4d2007-07-17 20:59:35 +000037 print(n, fact(n))
Tim Peterse6ddc8b2004-07-18 05:56:09 +000038 else:
39 try:
40 while 1:
Collin Winter6f2df4d2007-07-17 20:59:35 +000041 n = eval(input())
42 print(n, fact(n))
Tim Peterse6ddc8b2004-07-18 05:56:09 +000043 except EOFError:
44 pass
Guido van Rossumec758ea1991-06-04 20:36:54 +000045
Johannes Gijsbers7a8c43e2004-09-11 16:34:35 +000046if __name__ == "__main__":
47 main()