프로그래머가 보는 수학 - 소인수분해
2022. 5. 22. 17:17ㆍ카테고리 없음
728x90
사전지식 : https://aaaag.tistory.com/19
프로그래머가 보는 수학 - 거듭제곱
거듭제곱 : 같은 수나 문자를 반복해서 곱하는 것 더보기 3² == 3 * 3 3의 제곱이라 읽는다 지수는 작게 써져있는 숫자를 지수라 한다(2) 밑은 크게 써져있는 숫자를 밑이라 한다(3) 더보기 5⁴ == 5 *
aaaag.tistory.com
사전지식 : https://aaaag.tistory.com/22
프로그래머가 보는 수학 - 인수와 소인수
사전지식 : https://aaaag.tistory.com/20 프로그래머가 보는 수학 - 약수와 배수 약수 : 어떤 수가 나누어 떨어지는 수 더보기 8 == 1,2,4,8의 약수 나누어 떨어진다라는 말의 의미 : 어느 숫자로 나누었을
aaaag.tistory.com
소인수분해 : 자연수를 소인수들의 곱으로 표현한 것
[예1]

30을 소인수분해 할 경우
- 12 == 2² * 3
- 자연수를 소수가 나올 때까지 계속 나눈다

- 30을 소인수분해 할 경우
- 30 % 5= 6
- 6 % 2 = 3
- 2 * 3 * 5 == 30
프로그래밍 구현
# -*- coding: utf-8 -*-
import sys
number = int(input())
resultTuple = ()
value = 2
maxValue = number
while(True):
result = maxValue % value
#result가 0일경우 소수
if result == 0:
resultTuple = resultTuple + (value,)
maxValue = int(maxValue / value)
continue
#나누는수가 나누어야될 값보다 커졌다면 break
elif value >= maxValue:
break
#0이 아닐경우 다음 나누는수 증가
else:
value = value + 1
continue
if len(resultTuple) == 1:
sys.exit(0)
print(f"prime factorization : {resultTuple}")
소인수분해로 약수 구하기
- 공식 : 주어진 수를 소인수분해 한 다음 각각 거듭제곱의 약수를 모두 구한 다음 서로 곱한다.
[예1]
- 108의 약수를 구할경우 소인수분해 하면 2² * 3³
- 2²의 약수는 1, 2, 4 == 1, 2, 2²
- 3³의 약수는 1, 3, 9, 27 == 1, 3, 3², 3³
x | 1 | 3 == 3¹ | 9 == 3² | 27 == 3³ |
---|---|---|---|---|
1 | 1 | 3 | 9 | 27 |
2 == 2¹ | 2 | 6 | 18 | 54 |
4 == 2² | 4 | 12 | 36 | 108 |
- 약수는 1, 2, 3, 4, 6, 9, 12, 18, 27, 36, 54, 108 이다
- 테이블의 가로 세로의 값은 1을 포함한 지수의 값을 1씩 증가시킨 약수들이다
[예2]
- 2250의 약수를 구할경우 소인수분해 하면 2 * 3² * 5³
- 2의 약수는 1, 2 == 1, 2
- 3의 약수는 1, 3, 9 == 1, 3, 3²
- 5의 약수는 1, 5, 25, 125 == 1, 5, 5², 5³
- 2와 3의 약수를 곱한다
x | 1 | 3 == 3¹ | 9 == 3² |
---|---|---|---|
1 | 1 | 3 | 9 |
2 == 2¹ | 2 | 6 | 18 |
- 2와 3의 곱으로 나온 약수와 5의 약수를 곱한다
x | 1 | 5 == 5¹ | 25 == 5² | 125 == 5³ |
---|---|---|---|---|
1 | 1 | 5 | 25 | 125 |
2 | 2 | 10 | 50 | 250 |
3 | 3 | 15 | 75 | 375 |
6 | 6 | 30 | 150 | 750 |
9 | 9 | 45 | 225 | 1,125 |
18 | 18 | 90 | 450 | 2,250 |
- 약수는 1, 2, 3, 5, 6, 9, 10, 15, 18, 25, 30, 45, 50, 75, 90, 125, 150, 225, 250, 375, 450, 750, 1125, 2250 이다
프로그래밍 구현
# -*- coding: utf-8 -*-
import sys
def PrimeFactorization():
number = int(input())
resultDic = {}
value = 2
maxValue = number
while(True):
result = maxValue % value
#result가 0일경우 소수
if result == 0:
if value in resultDic:
#resultDic[value] = resultDic[value] + 1
addValue = resultDic[value][-1] * value
resultDic[value] = resultDic[value] + [addValue]
else:
#resultDic[value] = 1
resultDic[value] = [1, value]
maxValue = int(maxValue / value)
continue
#나누는수가 나누어야될 값보다 커졌다면 break
elif value >= maxValue:
break
#0이 아닐경우 다음 나누는수 증가
else:
value = value + 1
continue
return resultDic
resultDic = PrimeFactorization()
resultPopItem = resultDic.popitem()[1]
if len(resultDic) == 0:
print(f"{resultPopItem}")
sys.exit(0)
resultList = []
for valuesList in resultDic.values():
if len(resultList) != 0:
resultPopItem = resultList.copy()
resultList.clear()
for lValue in valuesList:
for rValue in resultPopItem:
result = lValue * rValue
resultList.append(result)
resultList.sort()
print(f"{resultList}")
소인수분해로 약수 개수 구하기
- 공식 : 각 소인수의 지수들마다 +1 한 다음 서로 곱한다.
[예1]
- 18의 약수는 2 * 3²
- 2 * 3²을 공식대로 하면 (1 + 1) * (2 + 1) = 약수의 개수
- 약수의 개수는 6개
프로그래밍 구현
# -*- coding: utf-8 -*-
import sys
def PrimeFactorization():
number = int(input())
resultDic = {}
value = 2
maxValue = number
while(True):
result = maxValue % value
#result가 0일경우 소수
if result == 0:
if value in resultDic:
resultDic[value] = resultDic[value] + 1
else:
resultDic[value] = 1
maxValue = int(maxValue / value)
continue
#나누는수가 나누어야될 값보다 커졌다면 break
elif value >= maxValue:
break
#0이 아닐경우 다음 나누는수 증가
else:
value = value + 1
continue
return resultDic
resultDic = PrimeFactorization()
#최소한의 약수 개수 == 소수
resultPopItem = resultDic.popitem()[1] + 1
if len(resultDic) == 0:
print(f"{resultPopItem}")
sys.exit(0)
resultList = 0
for value in resultDic.values():
if resultList != 0:
resultPopItem = resultList
resultList = 0
resultList = (value + 1) * resultPopItem
print(f"{resultList}")