728x90
소인수란?
어떤 자연수의 인수(약수)중에서 소수인 것
소인수분해란?
1보다 큰 자연수를 소인수만의 곱으로 나타낸 것
ex) 30 -> 2 x 3 x 5
1. n까지의 소수를 찾은 후 소수를 나누어서 소인수 분해하기
# 소수 판별
def isPrime(num):
for i in range(2, math.floor(math.sqrt(num))+1):
if num % i == 0 :
return False
return True
# 소수 찾기
def findPrimes(n):
primes = []
for i in range(2, n+1): # for i in range(2, (n//2)+1) 로 개선 가능
if isPrime(i):
primes.append(i)
return primes
print('소수 리스트', findPrimes(30))
# 소인수 분해 1
def factorize(n):
factors = []
primes = findPrimes(n) # n의 소수 리스트를 추출
for i in primes:
while (n % i == 0): # 소수 중 나누어 떨어지는(약수) 수를 찾는다
factors.append(i)
n = n // i
return factors
print('소인수분해 결과', factorize(30))
2. 가장 작은 소수 2부터 나누어서 소인수 분해 하기
# 효율적인 소인수 분해
def factorize2(n):
factor = 2 #시작 소수 지정
factors = []
while (factor**2 <= n): # 에라토스테네스를 떠올리며,, 즉 루트n까지 실행
while (n % factor == 0): # 소수로 나누어 떨어지면(= 즉 약수면)
factors.append(factor) # 리스트에 추가
n = n // factor # n을 몫으로 변경
factor += 1
if n > 1 : # 1보다 크고 factor**2(4)보다 작은 경우 n은 소수임으로 append -> 2,3 경우
factors.append(n)
print('효율적인 소인수분해 결과', factorize2(30))
Q. 두 방법의 시간 차이는 얼마나 날까?
A.
숫자가 커질 수록 어마무시한 차이가 난다..
import time
start_t = time.time()
print('효율적인 소인수분해 결과', factorize2(4643623532532))
end_t = time.time() - start_t
print(end_t)
start_t = time.time()
print('소인수분해 결과', factorize(4643623532532))
end_t = time.time() - start_t
print(end_t)
출처 : Youtube 주니온TV 아무거나연구소의 코린아, 코딩하자! with 파이썬
728x90
'IT > 알고리즘' 카테고리의 다른 글
[python/알고리즘] 날짜 계산하기 (2) | 2021.05.11 |
---|---|
[python/알고리즘] 최소공배수 구하기 (0) | 2021.05.10 |
[python/알고리즘] 소수 구하기 (2) | 2021.05.06 |
[python/알고리즘] 최대 공약수 구하기 (0) | 2021.05.05 |
[python/자료구조] 동적 계획법(Dynamic Programming) (0) | 2021.03.27 |
댓글
최근에 올라온 글
TAG
- slqd
- Pandas
- 경사하강법
- SQLD
- 머신러닝
- numpy
- 딥러닝
- Max()
- MongoDB
- SQL
- 기계학습
- Programmers
- Project
- 알고리즘
- db
- Ai
- 부스트코스
- Min()
- VGGNet
- Scikit
- 파이썬
- 인공지능
- 자료구조
- 주니온
- cnn
- algorithm
- OpenCV
- sklearn
- 프로그래머스
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Total
- Today
- Yesterday
250x250