Skip to content

Instantly share code, notes, and snippets.

@PM2Ring
Created October 19, 2016 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PM2Ring/2cea95b4f2bf1f34a3a9488238bf0243 to your computer and use it in GitHub Desktop.
Save PM2Ring/2cea95b4f2bf1f34a3a9488238bf0243 to your computer and use it in GitHub Desktop.
Generate all factors of a number
#!/usr/bin/env python3
''' Generate all factors of m
Written by PM 2Ring 2016.10.20
'''
import sys
from itertools import product
from functools import reduce
from operator import mul
def potential_primes():
yield from (2, 3)
n = 5
while True:
yield from (n, n+2)
n += 6
def factorize(m):
""" Put prime factors of m into a list of tuples (p, power) """
seq = []
for p in potential_primes():
if p*p > m:
seq.append((m, 1))
break
r = m % p
if not r:
k = 0
while not r:
m //= p
k += 1
r = m % p
seq.append((p, k))
if m == 1:
break
return seq
def allfactors(m):
# Transpose the (p, power) list to get a tuple of prime factors
# and a tuple of the corresponding powers
pr, pw = zip(*factorize(m))
# iterate over all combinations of the valid powers for each prime
result = [reduce(mul, (u**v for u, v in zip(pr, t)))
for t in product(*[range(v+1) for v in pw])]
result.sort()
return result
def main():
m = int(sys.argv[1]) if len(sys.argv) > 1 else 120
print(allfactors(m))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment