2023-08-03 19:55:31 +05:30
|
|
|
from __future__ import annotations
|
2023-08-06 15:19:52 +00:00
|
|
|
from math import ceil, sqrt
|
2023-08-03 19:55:31 +05:30
|
|
|
|
2023-08-03 14:31:11 +00:00
|
|
|
|
2023-08-06 15:19:52 +00:00
|
|
|
def primeproduct(num: int) -> list[int]:
|
|
|
|
"""
|
2023-08-03 19:55:31 +05:30
|
|
|
>>> primeproduct(868)
|
|
|
|
[2, 2, 7, 31]
|
|
|
|
>>> primeproduct(9039423423423743)
|
|
|
|
[2, 2, 7, 31, 719, 12572216166097]
|
|
|
|
>>> primeproduct(0.02)
|
2023-08-06 20:48:25 +05:30
|
|
|
Traceback (most recent call last):
|
|
|
|
ValueError: invalid literal for int() with base 10: '0.02'
|
|
|
|
>>> primeproduct(-2342)
|
2023-08-03 19:55:31 +05:30
|
|
|
[]
|
2023-08-06 15:19:52 +00:00
|
|
|
"""
|
2023-08-03 14:31:11 +00:00
|
|
|
|
2023-08-06 20:48:25 +05:30
|
|
|
if num <= 1:
|
|
|
|
return []
|
2023-08-06 15:19:52 +00:00
|
|
|
|
2023-08-06 21:09:03 +05:30
|
|
|
prime_factors: list[int] = []
|
2023-08-06 20:48:25 +05:30
|
|
|
while num > 1:
|
2023-08-06 15:19:52 +00:00
|
|
|
if len(prime_factors) >= 1 and prime_factors[-1] % num == 0:
|
2023-08-06 20:48:25 +05:30
|
|
|
prime_factors.append(prime_factors[-1])
|
2023-08-06 15:19:52 +00:00
|
|
|
|
2023-08-03 19:55:31 +05:30
|
|
|
else:
|
2023-08-06 20:48:25 +05:30
|
|
|
sq = ceil(sqrt(num))
|
2023-08-03 19:55:31 +05:30
|
|
|
flag = 0
|
|
|
|
|
2023-08-06 15:19:52 +00:00
|
|
|
if prime_factors != []:
|
|
|
|
for i in range(prime_factors[-1], sq + 1, 2):
|
2023-08-06 20:48:25 +05:30
|
|
|
if num % i == 0:
|
|
|
|
num = num // i
|
|
|
|
prime_factors.append(i)
|
2023-08-03 19:55:31 +05:30
|
|
|
flag = 1
|
|
|
|
break
|
2023-08-06 15:19:52 +00:00
|
|
|
|
2023-08-03 19:55:31 +05:30
|
|
|
else:
|
2023-08-06 15:19:52 +00:00
|
|
|
while num % 2 == 0:
|
2023-08-06 20:48:25 +05:30
|
|
|
num = num // 2
|
|
|
|
prime_factors.append(2)
|
2023-08-06 15:19:52 +00:00
|
|
|
|
|
|
|
for i in range(3, sq + 1, 2):
|
2023-08-06 20:48:25 +05:30
|
|
|
if num % i == 0:
|
|
|
|
num = num // i
|
|
|
|
prime_factors.append(i)
|
2023-08-03 19:55:31 +05:30
|
|
|
flag = 1
|
|
|
|
break
|
2023-08-03 14:31:11 +00:00
|
|
|
|
2023-08-06 20:48:25 +05:30
|
|
|
if not flag and num > 1:
|
|
|
|
prime_factors.append(num)
|
|
|
|
num = 1
|
|
|
|
break
|
2023-08-06 15:19:52 +00:00
|
|
|
|
2023-08-06 20:48:25 +05:30
|
|
|
return prime_factors
|
2023-08-03 19:55:31 +05:30
|
|
|
|
2023-08-03 14:31:11 +00:00
|
|
|
|
2023-08-03 19:55:31 +05:30
|
|
|
if __name__ == "__main__":
|
|
|
|
import doctest
|
|
|
|
|
|
|
|
doctest.testmod()
|