정의: 1과 자신 이외의 양의 정수로 나누어 떨어지지 않는 수
응용: 소수 판별, 소수 나열, 소인수 분해, 최대공약수
정의: 두 수의 가장 큰 공약수를 GCD, 가장 작은 공배수를 LCM이라고 함
응용: 유클리드 알고리즘으로 GCD 계산, LCM(a,b) = a*b/GCD(a,b) 관계로 LCM 계산
정의: 주어진 정수 n에 대해 나머지 값에만 관심을 갖는 연산
응용: 큰 수 연산의 오버플로 방지, 암호학, 고속 거듭제곱
(줄여서 mod)
Euclidean algorithm
정의: GCD 계산을 확장하여 ax + by = GCD(a, b) 형태의 해 (x, y) 찾기
응용: 모듈러 역원 계산, 선형 디오판틴 방정식의 해
정의: p가 소수이고 a가 p의 배수가 아닐 때, a^(p-1) ≡ 1 mod p 성립
응용: 모듈러 연산의 거듭제곱 계산, 소수 판별 (페르마 테스트)
정의: 서로소인 모듈러 값들에 대한 연립 나머지 방정식의 해 찾기
응용: 큰 수 연산, 동시 합동 시스템
재귀에서 쓰는 방법. 큰 문제를 작은 문제들로 쪼개서
brute force attack. 모든 방법을 시도
퀵소트랑 비슷. 트리구조. 탐색 범위를 줄여가면서. 업앤다운 게임. 정렬 되있을때만 쓸 수 있겠다.
그럼 퀵소트 같은 경우에는 이분탐색 plus 분할정복 이겠다.
정의: 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법
응용: 임의의 집합(set)에서 주어진 기준(criterion)대로 원소의 순서를 선택하는 문제를 푸는데에 적합(N-Queen,부분집합의 합, 0-1 배낭문제, etc)
미로찾기 문제를 생각하면 막다른 길을 만났을 때 스택을 이용해서 해결할 수 있었다.
이 문제를 트리 탐색 문제로 해석하면
백트랙킹에는 상태공간트리(State Space Tree)가 있어야한다.
최적화 문제라면 모든 상태공간 트리를 DFS로 방문해야 한다.
유망함(promising) : 하위 노드가 해답을 발견할 가능성이 있으면 promising. 아니면 nonpromising.
가지치기(pruning) : 방문중인 노드가 유망한지 체크. 유망하지 않으면 부모 노드로 되돌아감.(백트랙킹)
- 유망하지 않으면 하위 트리를 가지치기함
- 가지치기한 상태(pruned state): 방문한 노드의 방문하지 않은 하위 트리
일반적인 백트랙킹 알고리즘
def checknode (node v):
node u
if promising(v):
if (v에 해답이 있으면)
해답을 출력;
else
for (v의 모든 자식 노드 u에 대해서)
checknode(u)