mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-02-25 10:28:39 +00:00
Update prime_factorization_fast.py
This commit is contained in:
parent
a94659c1b0
commit
c18681669a
@ -1,7 +1,66 @@
|
||||
from __future__ import annotations
|
||||
from math import ceil, sqrt
|
||||
import time
|
||||
|
||||
def timer(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
start = time.time()
|
||||
result = func(*args, **kwargs)
|
||||
print(result)
|
||||
end = time.time()
|
||||
print(f"{func.__name__} took {end - start:.6f} seconds to execute.")
|
||||
return result
|
||||
return wrapper
|
||||
|
||||
@timer
|
||||
def prime_factors(n: int) -> list[int]:
|
||||
"""
|
||||
Returns prime factors of n as a list.
|
||||
|
||||
>>> prime_factors(0)
|
||||
[]
|
||||
>>> prime_factors(100)
|
||||
[2, 2, 5, 5]
|
||||
>>> prime_factors(2560)
|
||||
[2, 2, 2, 2, 2, 2, 2, 2, 2, 5]
|
||||
>>> prime_factors(10**-2)
|
||||
[]
|
||||
>>> prime_factors(0.02)
|
||||
[]
|
||||
>>> x = prime_factors(10**241) # doctest: +NORMALIZE_WHITESPACE
|
||||
>>> x == [2]*241 + [5]*241
|
||||
True
|
||||
>>> prime_factors(10**-354)
|
||||
[]
|
||||
>>> prime_factors('hello')
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: '<=' not supported between instances of 'int' and 'str'
|
||||
>>> prime_factors([1,2,'hello'])
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: '<=' not supported between instances of 'int' and 'list'
|
||||
|
||||
"""
|
||||
if not isinstance(n, int):
|
||||
raise TypeError("Input must be an integer")
|
||||
|
||||
if n <= 0:
|
||||
return []
|
||||
|
||||
i = 2
|
||||
factors = []
|
||||
while i * i <= n:
|
||||
if n % i:
|
||||
i += 1
|
||||
else:
|
||||
n //= i
|
||||
factors.append(i)
|
||||
if n > 1:
|
||||
factors.append(n)
|
||||
return factors
|
||||
|
||||
@timer
|
||||
def primeproduct(num: int) -> list[int]:
|
||||
"""
|
||||
>>> primeproduct(868)
|
||||
@ -14,6 +73,8 @@ def primeproduct(num: int) -> list[int]:
|
||||
>>> primeproduct(-2342)
|
||||
[]
|
||||
"""
|
||||
if not isinstance(num, int):
|
||||
raise TypeError("Input must be an integer")
|
||||
|
||||
if num <= 1:
|
||||
return []
|
||||
@ -22,7 +83,6 @@ def primeproduct(num: int) -> list[int]:
|
||||
while num > 1:
|
||||
if len(prime_factors) >= 1 and prime_factors[-1] % num == 0:
|
||||
prime_factors.append(prime_factors[-1])
|
||||
|
||||
else:
|
||||
sq = ceil(sqrt(num))
|
||||
flag = 0
|
||||
@ -34,28 +94,23 @@ def primeproduct(num: int) -> list[int]:
|
||||
prime_factors.append(i)
|
||||
flag = 1
|
||||
break
|
||||
|
||||
else:
|
||||
while num % 2 == 0:
|
||||
num = num // 2
|
||||
prime_factors.append(2)
|
||||
|
||||
for i in range(3, sq + 1, 2):
|
||||
if num % i == 0:
|
||||
num = num // i
|
||||
prime_factors.append(i)
|
||||
flag = 1
|
||||
break
|
||||
|
||||
if not flag and num > 1:
|
||||
prime_factors.append(num)
|
||||
num = 1
|
||||
break
|
||||
|
||||
return prime_factors
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
||||
n = int(input('enter number: ').strip())
|
||||
primeproduct(n)
|
||||
prime_factors(n)
|
||||
|
Loading…
x
Reference in New Issue
Block a user