In [1]:
def factorize(x):
if x <= 1 or divmod(x, 1)[1] != 0:
raise ValueError
factors = []
f = 2
while f * f <= x:
if x % f == 0:
factors.append(f)
x //= f
else:
f += 1
if x > 1:
factors.append(x)
return factors
In [2]:
n = 52
factorize(n)
Out[2]:
In [3]:
known_good_output = factorize(n)
In [4]:
def largest_factor(x):
return factorize(x)[-1]
In [5]:
largest_factor(n)
Out[5]:
In [6]:
largest_factor(int('1'*4))
Out[6]:
In [7]:
def test_largest_factor_52():
assert(largest_factor(52) == 13)
In [8]:
n = 52
%timeit factorize(n)
In [9]:
def factorize(x):
if x <= 1 or divmod(x, 1)[1] != 0:
raise ValueError
factors = []
f = 2
while f * f <= x:
if x % f == 0:
factors.append(f)
x //= f
else:
if f > 2:
f += 2
else:
f = 3
if x > 1:
factors.append(x)
return factors
In [10]:
n = 52
assert known_good_output == factorize(n)
%timeit factorize(n)
In [11]:
1.25 % 1, -1.25 % 1, 2 % 1
Out[11]:
In [12]:
import math
def foo(n):
%timeit int(n) != n
%timeit n % 1 != 0
%timeit math.modf(n)[0] != 0
%timeit divmod(n, 1)[1] != 0
%timeit n != math.trunc(n)
%timeit n != math.floor(n)
%timeit n != math.ceil(n)
In [13]:
foo(1.5)
In [14]:
foo(1234)
Of the above, n != int(n) is the most readable. It's not terribly slow, so it is used below.
In [15]:
def factorize(x):
if x <= 1 or x != int(x):
raise ValueError
factors = []
f = 2
while f * f <= x:
if x % f == 0:
factors.append(f)
x //= f
else:
if f > 2:
f += 2
else:
f = 3
if x > 1:
factors.append(x)
return factors
In [16]:
n = 52
assert known_good_output == factorize(n)
%timeit factorize(n)
In [17]:
def factorize(x):
if x <= 1 or x != int(x):
raise ValueError
factors = []
f = 2
while x > 1:
if x % f == 0:
factors.append(f)
x //= f
else:
f += 1
return factors
In [18]:
n = 52
assert known_good_output == factorize(n)
%timeit factorize(n)
In [19]:
def factorize(x):
if x <= 1 or x != int(x):
raise ValueError
factors = []
f = 2
while x > 1:
if x % f == 0:
factors.append(f)
x //= f
else:
if f == 2:
f = 3
else:
f += 2
return factors
In [20]:
n = 52
assert known_good_output == factorize(n)
%timeit factorize(n)
In [21]:
def factorize(x):
if x <= 1 or x != int(x):
raise ValueError
factors = []
f = 2
while x > 1:
while x % f == 0:
factors.append(f)
x //= f
else:
if f == 2:
f = 3
else:
f += 2
return factors
In [22]:
n = 52
assert known_good_output == factorize(n)
%timeit factorize(n)