factors.py
#!/usr/bin/env python
#
# Find & show factorization.
# Author: Yotam Medini [email protected] -- Created: 2006/January/30
#
import sys
def gcd(m, n):
if m < n:
t = m; m = n; n = t; # swap
# Now we have: m >= n >= 0
while n > 0: # Euclid
remainder = m % n
m = n
n = remainder
return m
def lcm(m, n):
return (m*n)/gcd(m, n)
def factorize(n):
factors = []
b = 2
curr_divisor = 0; # strt with dummy
while n > 1:
if n % b == 0:
if b == curr_divisor:
# We already divided n by b.
# So we look at the last 2-tuple,
# and increase the power by 1. (b,p) ===> (b,p+1)
last_bp = factors[-1]
bp = (b, last_bp[1] + 1)
factors[-1] = bp
else:
# We got a new prime divisor!
factors += [(b,1)]
curr_divisor = b
n /= b # Exacly like: n = n / b
else:
b += 1 # try another divisor
return factors
def factors2str(factors_list):
if len(factors_list) == 0:
s = "2^0"
else:
s = ""
pre_mult = ""
for bp in factors_list:
b = bp[0]
p = bp[1]
b_power_p = "%d^%d" % (b, p)
s += pre_mult + b_power_p
pre_mult = " * "
return s
def factors_show(n, name):
fl = factorize(n)
fs = factors2str(fl)
sys.stdout.write("%-8s = %18d = %s\n" % (name, n, fs))
def usage_exit(a0, rc):
sys.stderr.write(
"""
Usage:
%s <number1> <number2>
"""[1:] % a0)
sys.exit(rc)
# Begin program
if len(sys.argv) != 3:
usage_exit(sys.argv[0], 1)
a = int(sys.argv[1])
b = int(sys.argv[2])
factors_show(a, "a")
factors_show(b, "b")
factors_show(a*b, "ab")
factors_show(gcd(a,b), "gcd(a,b)")
factors_show(lcm(a,b), "lcm(a,b)")
sys.exit(0)
Generated by GNU enscript 1.6.4.