divsfact.py

#!/usr/bin/env python
#
# Find divisors in show their factorization.
# Author:  Yotam Medini  [email protected] -- Created: 2006/February/26
#

import sys

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):
    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 = %8d = %s\n" % (name, n, fs))


def usage_exit(a0, rc):
    sys.stderr.write(
"""
Usage:
  %s <number>
"""[1:] % a0)
    sys.exit(rc)


# Begin program
if len(sys.argv) != 2:
    usage_exit(sys.argv[0], 1)
N = int(sys.argv[1])
factors_show(N, "N")
sys.stdout.write("Divisors:\n")
nd = 0
d = 1
while d <= N:         # Check all numbers d,  such that  1 <= d <= N
    if N % d == 0:
        # d is a divisor, so show it
        nd += 1
        name = " d[%2d]" % nd
        factors_show(d, name)
    d += 1
sys.stdout.write("%d has %d divisors\n" % (N, nd))
sys.exit(0)


Generated by GNU enscript 1.6.4.