반응형
from typing import List
import math
from time import time
from tqdm import tqdm
def get_primes_under_siev(n: int) -> List[int]:
root_n = int(math.sqrt(n))
siev = {}
siev[0] = siev[1] = 0
siev[2] = 1
for i in range(2, root_n + 1):
# print(i)
if siev.get(i, 1):
for j in range(i + i, n + 1, i):
siev[j] = 0
# print(siev)
primes = [n for n in range(2, n + 1) if siev.get(n, 1)]
return primes
def factorize(n: int) -> List[int]:
root_n = int(math.sqrt(n)) + 1
primes = get_primes_under_siev(root_n)
factors = []
for p in primes:
if n % p == 0:
while n % p == 0:
factors.append(p)
n //= p
if n == 1:
break
return factors
def solve_siev2():
t0 = time()
BIGNUM = 317584931803
factors = factorize(BIGNUM)
print(factors[-1])
print(f"took {time() - t0:.3f} sec")
if __name__ == "__main__":
solve_siev2()
에라토스테네스의 체 방법으로 어떤 수 이하의 모든 소수를 구한다.
큰 수를 위 방법으로 구한 소수들로 쭉 나누어 본다.
728x90
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[EP 018] 삼각형 배열에서 지나간 수의 합을 최대로 하는 경로를 구하기 (0) | 2020.11.24 |
---|---|
[EP0010] 백만이하 소수의 합 (0) | 2020.11.24 |
[EP 023] 두 과잉수의 합으로 나타낼 수 없는 모든 수의 합 (0) | 2020.11.23 |
[EP 092] T(n) = n의 각 자리수의 제곱의 합. T(T(T(..(n)...))) = n 이 되는 n은 1과 89 (0) | 2020.11.20 |
[EP 005] least common multiple for a list of numbers (0) | 2020.11.18 |