素因数分解
def prime_factorize(n):
"""
:return: dict{prime: exponent}
"""
f = defaultdict(lambda: 0)
f[2] = len(bin(n & -n)) - 3
i = 3
k = n >> f[2]
while 1 < k and i * i <= k:
while True:
d, m = divmod(k, i)
if m == 0:
f[i] += 1
k = d
else:
break
i += 2
if k > 1:
f[k] = 1
return f