Guido van Rossum | 41ffccb | 1993-04-01 20:50:35 +0000 | [diff] [blame] | 1 | #! /usr/local/bin/python |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 2 | |
Guido van Rossum | 1c8230b | 1991-12-18 13:45:17 +0000 | [diff] [blame] | 3 | # 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 Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 7 | |
| 8 | import sys |
| 9 | from math import sqrt |
| 10 | |
| 11 | error = 'fact.error' # exception |
| 12 | |
| 13 | def fact(n): |
| 14 | if n < 1: raise error # fact() argument should be >= 1 |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 15 | if n == 1: return [] # special case |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 16 | res = [] |
| 17 | # Treat even factors special, so we can use i = i+2 later |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 18 | while n%2 == 0: |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 19 | res.append(2) |
| 20 | n = n/2 |
| 21 | # Try odd numbers up to sqrt(n) |
Guido van Rossum | 3a585bb | 1992-03-30 11:15:49 +0000 | [diff] [blame] | 22 | limit = sqrt(float(n+1)) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 23 | i = 3 |
| 24 | while i <= limit: |
Guido van Rossum | bdfcfcc | 1992-01-01 19:35:13 +0000 | [diff] [blame] | 25 | if n%i == 0: |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 26 | res.append(i) |
| 27 | n = n/i |
Guido van Rossum | 1c8230b | 1991-12-18 13:45:17 +0000 | [diff] [blame] | 28 | limit = sqrt(n+1) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 29 | else: |
| 30 | i = i+2 |
Guido van Rossum | 3a585bb | 1992-03-30 11:15:49 +0000 | [diff] [blame] | 31 | if n != 1: |
| 32 | res.append(n) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 33 | return res |
| 34 | |
| 35 | def main(): |
| 36 | if len(sys.argv) > 1: |
| 37 | for arg in sys.argv[1:]: |
Guido van Rossum | 1c8230b | 1991-12-18 13:45:17 +0000 | [diff] [blame] | 38 | n = eval(arg) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 39 | print n, fact(n) |
| 40 | else: |
| 41 | try: |
| 42 | while 1: |
Guido van Rossum | 1c8230b | 1991-12-18 13:45:17 +0000 | [diff] [blame] | 43 | n = input() |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 44 | print n, fact(n) |
| 45 | except EOFError: |
| 46 | pass |
| 47 | |
| 48 | main() |