15 장. 알고리즘의 설계 알고리즘 설계 학습목표 기본 패턴 패턴의 한계점 일곱 가지 패턴의 알고리즘 설계 기법을 이해한다. 각 설계 기법의 장단점을 이해한다. 각 설계 기법이 지닌 시간적 복잡도를 이해한다. P, NP의 정의를 이해한다.
알고리즘 설계 접근방법 분할정복 알고리즘(Divide-and-Conquer Algorithm) 탐욕 알고리즘(Greedy Algorithm) 동적 프로그래밍 알고리즘(Dynamic-Programming Algorithm) 확률적 알고리즘(Probabilistic Algorithm) 백 트랙 알고리즘(Backtracking Algorithm) 최적 분기 알고리즘(Branch-and-Bound Algorithm) 억지 접근 알고리즘(Brute-Force Algorithm)
저명인사의 문제 저명인사(Celebrity) “자신은 다른 사람을 모르지만, 다른 모든 사람들은 자신을 아는 그런 사람” “‘저 사람 아십니까?’ 라는 예스/노 질문만을 반복하여 그들 중 저명인사가 있는지를 밝히고 있다면 누구인지를 밝히라”는 문제 만약 저명인사가 있다면 두 사람 이상일 수는 없음.
저명인사의 문제 억지 접근 방식(Brute-force Approach) A, B, C 세 사람을 가정하고, 각자에게 가능한 질문을 모두 던짐. A에게 B를 아느냐, C를 아느냐 라고 두 번의 질문. 질문의 회수는 3인 * (3-1) 질문/인 = 6. N 명의 사람이라면 N(N-1) 번의 질문 마구잡이로 접근 효율이고 뭐고 일단 돌아가는 것이 중요하니 힘으로 밀어 붙이거나 몸으로 때우자는 식으로 문제 해결에 접근
저명인사의 문제 후보자 제거 방식 저명인사 후보의 검증 억지 접근 방식 누가 저명인사가 아닌지를 추적. A에게 B를 아느냐고 했을 때 답이 “그렇다"이면 A는 저명인사가 아님. 답이 ”아니다“이면 이번에는 B가 저명인사가 아님. 질문 한번에 한명씩 저명인사 후보에서 탈락. N 명이라면 (N-1)번의 질문 저명인사 후보의 검증 E에 대해서 검증이 필요. 나머지 A, B, C, D에게 E를 아느냐는 질문. 반대로 E에게 A, B, C, D를 아느냐고 다시 질문. 2(N-1)에 해당. 억지 접근 방식 그보다 좋은 알고리즘이 나올 때까지 유효함. 억지접근 알고리즘의 효율이 O(N2). 후보자 제거방식 알고리즘의 효율은 O(N)
거스름 동전 문제 거스름 동전문제 “주어진 잔돈을 동전으로 거슬러 줄 때 어떻게 하면 동전의 개수를 최소화 할 수 있는가”
거스름 동전 문제 500원, 100원, 50원, 10원짜리 동전 단위 거슬러 줘야할 돈이 270원 100원짜리 2개, 50원짜리 1개, 10원짜리 2개. 총 동전의 개수는 5개 될 수 있는 대로 일단 고액권을 최대한 사용 CoinChange { while (CurrentSum < DesiredChange) 돌려준 돈이 거스름 돈보다 작을 동안 { Pick the Largest Coin 가장 단위가 큰 동전을 선택 if (CurrentSum + Coin > DesiredChange) 돌려준 돈 + 동전 > 거스름 돈 { Reject the Coin; 그 동전은 포기 Do not Pick the Coin Again; 다시는 그 동전을 선택하지 않음 } else CurrentSum += Coin; 그 동전을 선택하여 돌려준 돈을 증가시킴 } }
거스름 동전 문제 탐욕 알고리즘(Greedy Algorithm) 개구리 도약(Leap Frog) 탐욕 알고리즘과 최적값 일단 큰 돈부터 먼저 줘 나가면 나중에 전체 개수가 최소가 될 것 아니냐 순간순간 목전에 보이는 이득(Local Optimum)을 취하면 그 결과가 전체적으로 봐서도 최대의 이득(Global Optimum)과 연결되는 것이 아니냐 개구리 도약(Leap Frog) 어떤 나라에서 50원, 40원, 30원, 10원 동전을 사용 70원을 거슬러 줄 때 탐욕 알고리즘은 50원 1개, 10원 2개 해서 총 3개 40원 1개, 30원 1개 해서 총 2개가 최적. 작은 단위 동전 두개를 합친 금액이 큰 단위 동전 금액을 초과하는 현상 탐욕 알고리즘과 최적값 전지적(全知的) 관점에서 문제 해결 방법을 찾을 수는 없음. 어떤 문제에서는 탐욕 알고리즘이 최적의 결과를 초래. 예를 들어 크루스칼 알고리즘 최적은 못되고 그냥 괜찮을 정도로 최적에 가까운 결과. 또는 아예 최적 근처에도 못 미치는 결과
파일 압축 파일 압축 고정길이 압축 가변길이 압축 복원의 문제 손실압축(損失, Lossy Compression)과 무손실 압축(無損失, Lossless Compression): 텍스트 압축은 무손실 압축이어야 함. 고정길이 압축 (Fixed-Length Compression) 과 가변길이 압축 (Variable-Length Compression) 고정길이 압축 “ABRACADABRA” . 알파벳 26 문자만으로 구성되어 있다면 5비트만으로 충분. A가 알파벳 첫 글자이므로 00001, B는 00010으로 표현. 고정 비트를 할당하면 이 문장은 11개의 문자이므로 총 55비트로 표현 가변길이 압축 글자별 빈도는 A:5, B:2, C:1, D:1, R:2. 가장 많이 나타나는 것을 가장 짧은 비트로 가져가면 전체 길이가 줄어든다. A = 0, B = 1, R = 01, C = 10, D = 11 로 표시하면 ABRAC.... = 0101010... 으로 압축 복원의 문제 0101010의 첫 비트만 읽으면 0으로써 A를 의미. 2 비트를 한번에 읽으면 R을 의미. 첫 문자가 A인지 R인지 판단불가 어떤 문자의 비트열이 다른 문자의 비트열의 앞부분에 해당할 때 그 문자를 다른 문자의 접두사라고 부름. 접두사 관계를 없애는 것이 관건
트라이 A = 11, B = 00, C = 010, D = 10, R = 011 트라이 아무런 접두사 관계도 존재하지 않음. 복원 결과는 유일. 트라이 모든 레코드가 외부 노드에 분포 접두사 관계가 존재할 수 없음. 왼쪽 트라이에서 문자 A는 이진 코드 1, 문자 D는 001을 나타냄.
허프만 트라이 허프만 트리 또는 트라이가 전체 비트수를 최소화 압축대상 텍스트에 나타나는 문자의 빈도를 조사. “ABBAAAACRDRFFFB“의 빈도는 A:5, B:3, C:1, D:1, R:2, F:3 빈도가 가장 낮은 C와 D를 외부 노드로 만들고 그 둘의 빈도를 합쳐서 새로운 루트로 구성. 다시 빈도가 가장 낮은 한 쌍을 찾음. 현재 C, D가 합쳐진 루트도 대상에 포함. C, D의 루트와 R이 빈도 2로서 가장 작으므로 이 두 개를 합쳐서 빈도 4인 새로운 루트가 생성됨. 단계별로 최소 빈도 쌍을 결합해서 새로운 루트를 생성. 텍스트 비트열과 함께, 받는 쪽에서 이를 복원할 수 있도록 각 문자별 비트 값을 나타내는 도표를 같이 전송
허프만 트라이 접근 방법 가장 처음에 가장 낮은 빈도 쌍을 택한 이유는 뒤로 갈수록 새로운 레벨이 추가되기 때문. 처음에 택한 쌍은 루트에서 가장 멀어짐. 코드가 가장 길어짐. 일종의 탐욕 알고리즘 압축률 입력 데이터의 내용에 따라 달라짐. 모든 글자가 완전히 동일한 빈도로 출현한다면 허프만 트리는 고정길이 문자열과 동일한 결과
배낭 문제 금고털이의 고민 전제조건 금고 안에는 N 개의 서로 다른 크기와 값의 물건 배낭(Knapsack)의 크기는 M으로 제한 배낭 속에 어떤 물건들을 집어넣어야 훔쳐온 물건 값이 최대로 되겠는가 전제조건 잘라서 담을 수는 없음. 제로-원 배낭문제(Zero-One Knapsack Problem)
배낭 문제 일단 A 물건만 가지고 있다고 가정 배낭 크기가 1부터 10까지 증가할 때 배낭 크기를 인덱스로 하는 배열 K Max 필드에는 해당 크기의 배낭에 담아 넣은 물건들의 최대값 Last 필드에는 마지막에 집어넣은 물건 K[1]의 Max 값은 0. 배낭 크기가 1 이므로 크기 3인 A가 들어갈 수 없음. k[3]에서 1 개가 들어가므로 Max 필드에는 4. Last 필드에는 방금 넣은 물건인 A를 표시. k[6]에서 배낭크기가 6이므로 이제 A가 2개 들어갈 수 있음. Max 값은 8. 마지막 두 번째로 들어간 물건은 A. Items Size Value/Item A 3 4 B 5 C 7 10 1 2 3 4 5 6 7 8 9 10 Max[i] 12 Last[i] A
배낭 문제 B 물건으로 확장 마지막에 B를 넣되 이전 구성에 비해 최대가 아니면 그대로 둠. B의 크기가 4이니 K[3]까지는 B를 집어넣을 수 없음. K[4]에서 이전 Max 값은 4로서 마지막에 집어넣은 것은 A 이를 B로 대치하면 Max 값은 Value of B + Max[4 - Size of B] = 5 + Max[0] = 5 이는 현재의 Max[4]인 4보다 크므로 Max 값을 5로 변경. Last는 B로 변경 K[8]에서 Value of B + Max[8 - Size of B] = 5 + Max[4] = 10. 이는 8보다 크므로 Max 값을 10으로 변경하고 Last는 B로 변경. Items Size Value/Item A 3 4 B 5 C 7 10 1 2 3 4 5 6 7 8 9 10 Max[i] 4 →5 4→5 8→9 8→10 12 12→13 Last[i] A B
배낭 문제 C 물건으로 확장 배낭크기 10 최대값 14. 가장 마지막에 들어간 것은 C 그 직전에 들어간 것은 배낭크기 (10 - Size of C)에서 마지막에 들어간 것. 즉Last[3]인 A Items Size Value/Item A 3 4 B 5 C 7 10 1 2 3 4 5 6 7 8 9 10 Max[i] 12 14 Last[i] A B C
동적 프로그래밍 알고리즘 동적 프로그래밍 기법(Dynamic Programming Method) 배낭 문제 생각하기 복잡할 정도로 문제가 커질 때 아주 작은 부분문제(Subproblem)를 풀고 그 상태에서의 최적값을 기록 이 최적값을 바탕으로 해서 조금 더 문제 크기를 확장 이러한 과정을 반복함으로써 아주 큰 문제의 해결책에 이름. 와샬 알고리즘(Warshall Algorithm), 플로이드 알고리즘(Floyd Algorithm) 배낭 문제 도표를 이용하여 최적값을 추적 문제 크기가 커질 때마다 최적값을 조금씩 변경 문제를 풀 때에는 항상 그 직전 상태에서 알려진 최적값을 이용.
최대 최소의 문제 최대 최소의 문제(Max-Min Problem) 배열 내에 정렬 안 된 숫자 값이 최대인 것과 최소인 것을 찾아라 왼쪽 반에서 최대 최소를 찾는 문제와 오른쪽 반에서 최대 최소를 찾는 문제 바로 해결될 정도로 문제가 작아질 때까지 계속 문제를 반으로 분할 왼쪽 반에서 최대, 최소가 (20, 5)이고, 오른쪽 반에서 최대, 최소가 (100, 12)라면 당연히 전체의 최대, 최소는 (100, 5). 작은 문제의 해결책을 조합하면 큰 문제의 해결책으로 이어짐. 분할정복 알고리즘(Divide and Conquer Algorithm) 주어진 문제를 그보다 크기가 작은 부분문제(Subproblem)로 나누어 해결 이진탐색, 쾌속정렬, 합병정렬 등 재귀호출과 직결됨. 호출 시마다 문제의 크기가 줄어들음.
분할정복 알고리즘 분할정복의 문제점 코드 15-2: 재귀호출에 의한 피보나치 int Fibonacci(int n) { if (n < 2) 베이스 케이스 return 1; F(0) = F(1) = 1 else return (Fibonacci(n-1) + Fibonacci(n-2)); } 분할정복의 문제점 부분문제의 해결책이 큰 문제의 해결책으로 이어지지 않을 수 있음. K번째 작은 수를 찾는 문제를 왼쪽 반에서 찾는 문제와 오른쪽 반에서 찾는 문제로 분할할 경우. 부분문제의 수가 너무 많아짐. 잘못하면 상식적인 시간 안에 알고리즘이 종료될 수 없음. F(4) = F(3) + F(2)에 의해 F(4)의 문제가 F(3)의 문제와 F(2)의 문제로 분할될 때, F(3)과 F(2)는 사실상 서로 의존적인 문제. F(2) 계산결과는 F(3) = F(2) + F(1)의 계산에 재사용 가능. 재사용하지 않으면 계산의 중복에 의해 알고리즘의 효율이 저하됨.
분할정복 알고리즘 동적 프로그래밍 동적 프로그래밍과 분할정복 코드 15-3: 반복문에 의한 피보나치 int Fibonacci(int n) { int F[Max]; n 보다 큰 숫자를 배열 크기로 F[0] = 1; F[1] = 1; 수열의 처음 두 숫자 for (int i = 2; i <= n; i++) F[2]부터 n까지 F[i] = F[i-2] + F[i-1]; 앞에서 뒤로 채워나감 return (F[i]); 배열의 마지막 요소를 돌려줌 } 동적 프로그래밍 F[0], F[1]을 바탕으로 F[2]를 구함. 다시 F[1], F[2]를 바탕으로 F[3]을 구함. 배낭문제(Knapsack Problem) 해결과 유사 동적 프로그래밍과 분할정복 주어진 문제를 작은 문제로 환원한다는 측면에서 유사 분할정복 기법에서는 재사용이라는 개념이 존재하지 않음. 동적 프로그래밍에서는 부분문제에 대한 해결책은 반드시 기록하고 재사용
동적 프로그래밍 동적 프로그래밍 상향식(바텀 업, Bottom Up) 동적 프로그래밍 배낭 문제나 반복문에 의한 피보나치 문제가 들어오기 전에 미리 필요한 계산을 해 놓음 하향식(탑 다운, Top Down) 동적 프로그래밍 큰 문제를 해결하는 도중에 작은 문제 해결책을 재사용 코드 15-2: 재귀호출에 의한 피보나치(하향식 동적 프로그래밍) for (i = 0; i <= n; i++) 값이 이미 알려져 있는지를 불리언 배열 A에 저장 A[i] = FALSE: 모두 안 알려진 걸로 초기화 int Fibonacci(int n) { if (A[n] = = TRUE) 이미 계산된 값이 있으면 return B[n]; 그 값을 재사용 else { if (n < 2) 베이스 케이스 return 1; else { in temp = Fibonacci(n-1) + Fibonacci(n-2); 결과 값을 계산하여 B[n] = temp; 그 값을 배열 B에 저장 A[n] = TRUE; 알려진 값임을 표시 return temp; 재귀호출 결과를 리턴 ]
행렬의 연속곱셈 행렬의 곱셈 곱셉의 횟수 교환법칙(交換, Associative Law)이 성립 ABC = (AB)C = A(BC) 4×2 행렬(4행 2열)과 2×3 행렬(2행 3열)을 곱하면 결과행렬은 4×3 앞 행렬의 열과 뒤 행렬의 행 수가 반드시 일치 곱셉의 횟수 결과행렬을 구하는 데에는 총 4×2×3 = 24번의 곱셈이 필요 결과행렬의 엔트리 수가 4×3인데 각각의 엔트리를 구하는 데에는 2번의 곱셈을 실행 행렬의 연속곱셈 문제는 곱하는 순서를 어떻게 하는 것이 가장 빠르겠느냐 하는 문제다.
행렬의 연속곱셈 ABCDEF ((((AB)C)D)E)F 의 순서로 곱했을 때 필요한 곱셈의 횟수 앞에서 뒤로 곱하면 곱셈의 수는 총 84번 뒤에서 앞으로 곱하면 곱셈의 수는 총 69회 곱셈 횟수는 계산시간과 정밀도를 좌우함. 결과행렬의 차원 곱셈 수 A = 4×2 B = 2×3 AB = 4×3 24 C = 3×1 ABC = 4×1 12 D = 1×2 ABCD = 4×2 8 E = 2×2 ABCDE = 4×2 16 F = 2×3 ABCDEF = 4×3
행렬의 연속곱셈 대각선 방향으로 채워나감 AB에는 24번의 곱셈, BC의 계산에는 6번의 곱셈 현재 채워진 것보다 한 칸 위의 것을 대각선 방향으로 처리. * 표시한 엔트리는 ABC를 계산하는데 필요한 곱셈의 횟수 (AB)C의 비용 = (AB)의 계산비용 + C의 계산비용 + 두개를 곱하는 비용 = 24 + 0 + 4×3×1 = 36 A(BC)의 비용 = A의 계산비용 + (BC)의 계산비용 + 두개를 곱하는 비용 = 0 + 6 + 4×2×1 = 14. 최소비용 계산 과정에 이전 지식을 활용. (AB)나 (BC)의 계산비용은 도표에 나와 있음. 괄호 안에 (B)라고 한 것은 두 번째 곱하는 행렬 그룹의 첫 번째 것이 B라는 의미. A B C D E F 24(B) * 14(B) 6(C) 6(D) 4(E) 12(F)
행렬의 연속곱셈 한 칸 위의 대각선 ** 표시한 엔트리는 ABCD의 최소값 A(BCD) = 0 + 10 + 4×2×2 = 26 A B C D E F 24(B) 14(B) **22(D) 6(C) 10(D) 6(D) 4(E) 10(F) 12(F)
행렬의 연속곱셈 한 칸 위의 대각선 대표적인 동적 프로그래밍 기법 오른쪽 위의 엔트리인 36이 ABCDEF를 계산하기 위한 최소 곱셈횟수 괄호안의 순서를 역추적 하면 곱셈의 순서는 (A(BC))((DE)F) 대표적인 동적 프로그래밍 기법 상향식 동적 프로그래밍 A B C D E F 24(B) 14(B) 22(D) 26(D) 36(D) 6(C) 10(D) 14(D) 6(D) 19(D) 4(E) 10(F) 12(F)
중간값보다 큰 숫자 찾기 중간값보다 큰 숫자 찾기 해결책 I 정렬 안 된 숫자에서 중간값보다 큰 숫자를 하나 찾기 32, 83, 16, 1, 20 이면 중간값은 20이 된다. 따라서 32나 83 중 아무거나 선택 해결책 I 최대값은 당연히 중간값보다 크다. 최대값을 찾기. 대략 (N-1)번의 비교 배열의 중간을 지나자마자 계산을 멈춤. 왼쪽 반 정도에서 가장 큰 것이면 전체적으로 보아서 중간값보다는 큼. 대략 (N-1)/2의 비교. 이러한 알고리즘은 이렇게 이렇게 하면 반드시 해결책이 나온다 라는 접근 방법으로서 결정적 알고리즘(Deterministic Algorithm)
중간값보다 큰 숫자 찾기 해결책 II 확률적 알고리즘(Probabilistic Algorithm) 확률적으로 정답이 나오게 하겠다 나열된 숫자 중 아무거나 하나 고르면 그것이 메디안보다 클 확률은 ½ 아무거나 두 개를 골라서 큰 것을 취함. 메디안 보다 클 확률은 ¾. k 개의 숫자 중 가장 큰 것을 선택한다면 그것이 메디안보다 클 확률은 1-(1/2k). k가 10이라면 확률은 .999로 거의 1에 가까움. 확률적 알고리즘(Probabilistic Algorithm) 몬테카를로 알고리즘(Monte Carlo Algorithm) 작은 확률을 가지고 틀릴 수 있지만 실행시간은 결정적 알고리즘보다 작다.
색칠 문제 흰 공이 J개 들은 주머니가 K 개 있다. 공 하나하나를 모두 꺼내서 색칠을 한 후에 다시 넣되, 빨강이나 파랑 중의 한 가지 색만을 칠하도록 되어있다. 모든 주머니가 최소한 1개 이상의 빨간 공과 1개 이상의 파란 공을 가지도록 색칠하려면 어떻게 해야 하는가. 단, J와 K 사이에는 K×(1/2J) ≤1/4 이라는 관계를 전제로 한다. 방법 아무 주머니에 있는 공이나 꺼내서 하나는 빨강, 하나는 파랑으로 칠함. 공이 빨강일 확률이나 파랑일 확률이나 모두 ½ 어떤 주머니의 공 J 개가 모두 빨강일 확률은 (1/2J). K 개 주머니 중 한 주머니라도 모두 빨간 공만 있을 확률은 여기에 K×(1/2J) 문제의 조건에 의해서 이 값은 1/4 이하. 파란 공에 대해서도 동일한 논리가 성립하니 결과적으로 어떤 주머니 안에 모두 빨간 공만 있거나 아니면 모두 파란 공만 있을 확률은 1/2 이하. 확률적 알고리즘 라스베가스 알고리즘(Las Vegas Algorithm) 만약 원하는 결과가 나오지 않으면 제대로된 결과가 나올 때까지 이러한 방법을 반복. 몬테카를로 알고리즘이 정답을 보장 못하는데 비해 이 방법은 정답을 보장. 알고리즘의 실행시간은 운에 달려 있음
과반수 찾기 문제 과반수 찾기 문제(Majority Finding Problem) 방법 I 방법 II N개의 요소로 구성된 리스트에서 어떤 아이템이 N/2번 이상 나오면 그 아이템을 과반수 아이템이라 함. 과반수 아이템을 찾되 만약 그러한 것이 없으면 없다 라고 말하라는 문제 방법 I 주어진 숫자를 인덱스로 하는 배열을 사용 리스트를 스캔 해 나가면서 해당 숫자를 인덱스로 하는 배열 요소 값을 증가 숫자 5가 나오면 A[5]에 카운트 값을 1을 추가. 이 방법의 효율은 O(N).어떤 큰 숫자가 튀어나올지 예상하기 어렵기 때문에 배열의 최대 인덱스를 잡기가 어려움. 방법 II 정렬한 후에 같은 숫자가 계속해서 몇 번 나오는지 확인 N/2 번 이상이면 과반수 아이템이 되고, 그렇지 않으면 과반수 아이템이 없음. 효율은 O(NlogN)
과반수 찾기 문제 방법 III 메디안을 찾는 문제 정렬했을 때 과반수 아이템은 A, B, C의 모습. 만약 과반수 아이템이 존재한다면 그 아이템은 정렬된 배열의 메디안 위치에 있음. 메디안(k = N/2 번째로 작은 숫자)을 찾는 문제 k가 작다면 스캔 할 때마다 가장 작은 수를 골라내되 이를 k번 반복. O(kN) 정렬한 다음에 k 번째 작은 수를 골라냄. O(NlogN) 4 장에서 설명한 파티션을 사용. O(N) 메디안 위치에 존재하더라도 과반수 아이템이 아닐 수 있음. 과반수인지를 확인하기 위해서는 그것이 리스트에 몇 번 나타나는지를 세어야 하고 따라서 추가로 O(N) 작업이 필요
과반수 찾기 문제 방법 IV 방법 V 여러가지 알고리즘 확률적으로 접근 아무거나 골라서 그것이 N/2번 이상 나타나면 됨. 그러나 이 경우에는 과반수 아이템을 선택할 확률이 높아진다는 아무런 보장이 없음. 방법 V 저명인사의 문제처럼 후보자를 제거 두 개의 서로 다른 숫자가 나타나면 그 숫자를 상쇄시켜 없앰. 과반수 아이템이라면 그것과 다른 것을 일대일로 상쇄해도 살아남아야 함. 살아남았다고 모두 과반수 아이템은 아니므로 살아남은 숫자를 대상으로 전체에서 몇 번 나타나는지를 다시 확인. 제거하는데 O(N), 확인하는데 O(N) 여러가지 알고리즘 어떤 알고리즘이 절대적으로 최선이라고 주장할 수는 없다. 우리가 아직 모르고 있는, 더 나은 해결방식이 있을 수 있기 때문이다.
8-퀸 문제 퀸(Queen) 동양 장기의 차(車)에 해당. 대각선상에 놓은 것도 공격 “8×8 체스 판에서 8 개의 퀸을 놓되 서로 공격할 수 없는 위치에 놓아보라” * 표시된 곳에 놓인 두 개의 퀸이 서로 대각선 상에 놓여있음.
8-퀸 문제 퀸 서로 다른 행과 서로 다른 열에 놓여야 함. 열(Column) 번호를 1, 2, 3, ... 으로 할 때, 각 열의 몇 번째 행에 놓아야 하는지를 p(i)로 표시 이 문제는 1부터 8까지의 수를 어떤 순서로 도표의 p(i)에 채워 넣는가의 문제 i 1 2 3 4 5 6 7 8 p(i)
8-퀸 문제 복잡도 p(1)에 들어갈 수 있는 숫자는 8가지 중의 하나. 각각에 대해, p(2)에 들어갈 수 있는 숫자는 7개 중의 하나. 경우의 수는 8! = 40320 N×N 크기의 체스 판에 N개의 퀸을 배치하는 문제라면 경우의 수는 N! 컴퓨터로 풀기에는 비 상식적 시간(Unreasonable Time)이 소요 N = 25라면 25! 개의 경우. 25!은 대략 26자리 숫자로서 1 MIPS(Millions of Instruction per Second) 컴퓨터 성능을 가정했을 때 실행시간이 대략 5 × 1011 년 정도가 된다. 초 다항식 알고리즘(Super-Polynomial Time Algorithm) 시간적 복잡도가 N의 로그함수, 1차함수, 2차함수, ..., k차함수 등으로 표시될 때 그 알고리즘을 다항식 알고리즘(Polynomial Time Algorithm) 다항식 알고리즘으로 해결할 수 있는 문제를 처리가능 문제(Tractable Problem). 이에 걸리는 시간을 상식적인 시간(Reasonable Time) 시간적 복잡도가 5N, N!, NN 등의 시간을 요할 때 그 알고리즘을 초 다항식 알고리즘이라 함 초다항식 알고리즘으로 해결할 수 있는 문제를 처리 불가능 문제(Intractable Problem). 이에 걸리는 시간을 비상식적인 시간(Unreasonable Time) O(2N) 알고리즘이라면 N이 100일때 실행 시간은 4×1016 년 정도. 문제를 풀 수 있다는 사실과 컴퓨터로 처리할 수 있다는 사실은 별 개의 것
8-퀸 문제 8-퀸 문제 모든 경우를 모두 시도(소모적 탐색, Exhaustive Search) 하려면 일반적으로 처리 불가능 문제 탐색 방법을 조직화하여 시도의 횟수를 조금 더 줄임. 퀸이 서로 대각선에 놓이지 않게 하려면 두 개의 퀸이 놓인 행의 차이값과 열이 차이값이 서로 달라야 함. 즉, |p(i) - p(j)| ≠ (i - j) 방법 1 단계: 임의의 자리에 새로운 퀸을 놓는다. 2 단계: 이 위치가 기존의 퀸들과 서로 공격하지 못하는 위치이면 가. 이 퀸이 마지막 퀸이면 실행을 종료한다. 나. 그렇지 않으면 1단계로 간다. 3 단계: 이 위치가 기존의 퀸들과 서로 공격하는 위치이면 이전에 가장 최근에 놓은 퀸으로 백 트랙 한다. 1 단계를 반복한다.
8-퀸 문제 p(4) p(5) p(6) p(7) p(8) 비고 1 *2 |p(5)-p(4)| = 5 - 4 **4 4 2 *2 |p(5)-p(4)| = 5 - 4 **4 4 2 |p(6)-p(1)| = 6 - 1 6 |p(6)-p(3)| = 6 - 3 8 |p(7)-p(5)| = 7 - 5 ***8 백 트랙 |p(8)-p(3)| = 8 - 3 처리 완료
결정 트리 결정트리(Decision Tree) 또는 상태공간 트리(State Space Tree) 트리의 노드는 부분해(部分解, Partial Solution)를 의미. 간선(Edge)은 선택사항을 의미 표의 첫 줄의 상태는 p(1), p(2), p(3), p(4)가 각각 7, 5, 3, 1인 경로를 따라옴. p(5)로서 2, 4, 6, 8 중 어느 것을 선택 하느냐에 따라서 트리의 간선은 네 개로 갈라짐. 가장 왼쪽 간선인 2를 선택하여 따라 갔으나 해당 위치는 다른 퀸과 대각선 위치가 되므로 문제의 답이 될 수 없음. 표의 **에서 의 두 번째 간선인 4를 선택.
백 트래킹 알고리즘 백 트래킹 알고리즘 조직적으로 가능한 모든 경로를 시도하되 더 이상 갈 수 있는 곳이 없으면 이전 상태로 백 트랙(Backtrack, 되돌리기) 백트래킹과 깊이우선 탐색과의 차이 어떤 노드에서 출발하는 경로가 해결책으로 이어질 것 같지 않으면 더 이상 그 경로를 따라가지 않음으로서 시도의 횟수를 줄임. (Prunning) 깊이우선 탐색이 모든 경로를 추적하는데 비해 백 트래킹은 불필요한 경로를 조기에 차단. 깊이우선 탐색을 가하기에는 경우의 수가 너무나 많음. 즉, N! 가지의 경우의 수를 가진 문제에 대해 깊이우선 탐색을 가하면 당연히 처리 불가능한 문제. 백 트래킹 알고리즘을 적용하면 일반적으로 경우의 수가 줄어들지만 이 역시 최악의 경우에는 여전히 지수함수 시간(Exponential Time)을 요하므로 처리 불가능 백 트래킹 알고리즘의 효율 문제가 처리 가능한 것으로 돌아서는가 아닌가는 운에 따름. 컴퓨터 처리능력의 한계로 인해 모든 경우를 다 해 볼 수는 없음. 단계 별로 많은 가능성이 제거된다면 당연히 경우의 수가 줄게 되고 따라서 상식적인 시간에 정답을 발견 몇 번 시도해서 우연히 따라가 본 길이 제대로 놓은 것이 되면 최선.
할당 문제 A, B, C, D 네 사람이 1, 2, 3, 4 네 가지 일 최소 비용 1 2 3 4 A 11 12 18 40 B 일 종류마다 사람마다 인건비가 다름. “사람마다 일 하나씩 할당하되 총 비용이 최소가 되도록 하라” 8-퀸 문제처럼 N!의 문제다. N 개의 일 중 하나를 A가 맡으면 B는 나머지 (N-1)개 중의 하나, C는 그 나머지 (N-2) 개 중의 하나… 최소 비용 무조건 최소 인건비만을 선택하면 최소값은 11 + 12 + 13 + 22 = 58 A-1, B-2, C-3, D-4 식으로 아무렇게나 배정하면 비용은 11 + 15 + 19 + 28 = 73 최소비용은 반드시 아무렇게나 선택한 비용보다는 작아야 한다 최소비용은 [58 - 73]의 범위에 있다 1 2 3 4 A 11 12 18 40 B 14 15 13 22 C 17 19 23 D 20 28
할당 문제 8-퀸 문제와 마찬가지로 경우별로 추적 부분 해를 쌓아나가되 필요하다면 백 트랙 A에게 1, 2, 3, 4 번 일을 할당할 때 각각의 최소비용 A-1: 최소비용 = 11(고정) + 14 + 13 + 22 = 60 A-2: 최소비용 = 11 + 12(고정) + 13 + 22 = 58 A-3: 최소비용 = 11 + 14 + 18(고정) + 22 = 65 A-4: 최소비용 = 11 + 14 + 13 + 40(고정) = 78 2, 3, 4번 일에 대해 맡을 사람이 중복되는지 무관하게 무조건 최소 비용 A-4 노드는 제거. 왜냐하면 [58 - 73]이라는 범위를 벗어남 최소비용이 가장 적을 것 같은 할당은 A-2. 일단 A-2로 진행. A-2 상태에서 가능한 할당은 B-1, B-3, B-4. A-2, B-1: 최소비용 = 12(고정) + 14(고정) + 19 + 23 = 68 A-2, B-3: 최소비용 = 12(고정) + 13(고정) + 11 + 23 = 59 A-2, B-4: 최소비용 = 12(고정) + 22(고정) + 11 + 19 = 64 다시 가장 작은 비용인 A-2, B-3을 따라감. A-2, B-3, C-1: 최소비용 = 12(고정) + 13(고정) + 11(고정) + 28(고정) = 64 A-2, B-3, C-4: 최소비용 = 12(고정) + 13(고정) + 23(고정) + 17(고정) = 65
할당 문제 이 비용들은 A-1을 선택했을 때의 최소비용인 60보다 큼. 이번에는 A-1을 따라감. 같은 방법을 반복하면 최종비용은 A-1, B-3, C-4, D-2 로서 61
최적분기 알고리즘 알고리즘에서 거론되는 문제 할당 알고리즘 결정문제(Decision Problem) 답이 “그렇다” 또는 “아니다”가 되게 물어보는 문제 최적화 문제(Optimization Problem) 목적으로 하는 값(목적함수, Objective Function)을 최소화 또는 최대화하는 방법을 묻는 문제 최적화 문제를 결정문제로 바꿀 수 있음. “비용을 59 이하로 할 수 있느냐 없느냐”라고 바꾸면 결정문제 할당 알고리즘 기본적으로는 백 트랙 알고리즘. 백 트랙 알고리즘은 가능성이 있느냐 없느냐만을 따짐. 최적 분기(Branch-and-Bound) 알고리즘 최적화 문제를 해결. 목적함수 값이 타당성이 있느냐 없느냐를 사용하여 불필요한 경로를 더 많이 제거 최적값을 향해서 분기가 일어나는 알고리즘 백 트랙 알고리즘과 마찬가지로 많은 경우에 좋은 해결방법이 되지만 최악의 경우 실행시간은 비상식적 시간.
세일즈맨 여행의 문제 세일즈맨 여행의 문제(Traveling Salesman Problem) 어떤 도시에서 출발해서 다시 그 자리로 되돌아오되, 모든 도시를 정확히 한번씩만 지나가야 한다. 이러한 조건 하에서 여행비용이 최소가 되는 경로를 찾아내라.
세일즈맨 여행의 문제 복잡도 O(N!). N 개의 도시 중 하나를 선택해서 출발해야 하므로 일단 N개의 경우 기본적으로 처리 불가능 문제 1 2 3 4 15 8 20 12 9 13 5 10 17 16
세일즈맨 여행의 문제 상태공간 트리 4개의 도시를 가정할 때 상태공간 트리 1에서 출발하여 나머지 도시를 모두 돌고 다시 1로 돌아올 때 가능한 경우 C(1, {2, 3, 4})는 1에서 출발하여 2, 3, 4 도시를 도는 비용 C12 + C(2, {3, 4})는 1에서 2를 일단 먼저 가는 비용에 2에서 출발하여 3, 4 도시를 도는 비용을 합한 것 문제는 레벨 2의 세 개의 노드 중 어떤 것이 최소 비용인가의 문제. 내부 노드의 값은 그 것을 루트로 하는 아래 서브트리 노드 값 중 최소값을 선택해야 함.
세일즈맨 여행의 문제 동적 프로그래밍 기법으로 접근 동적 프로그래밍, 백 트랙, 최적 분기 2에서 출발하는 C(2, {1, 3, 4})의 비용을 계산하는 과정에서는 C{4, {3})의 계산을 요함. 이 계산은 위 그림의 C24 + C(4, {3})에서도 행해짐. 동적 프로그램 기법을 사용하면 이러한 중복된 계산을 배제 효율은 O(N22N)으로 O(N!)보다는 좋아지지만 여전히 처리 불가능 문제 동적 프로그래밍, 백 트랙, 최적 분기 정확한 최적 해(Exact Optimum Solution)를 구하는 알고리즘 방법을 사용하여 풀리기만 하면 정확히 가장 최적인 답을 구할 수 있음. 처리 불가능 문제에 대해 이러한 알고리즘을 가하면 그 효율이 보장 안됨. 운이 따르면 상식적인 시간이지만 그렇지 않으면 수백 년.
세일즈맨 여행의 문제 조건의 완화 학습 (휴리스틱, Heuristic) 알고리즘 두 가지 접근방식 먼저 1에서 출발하여 갈 수 있는 곳을 가되 가장 싼 곳으로. 다시 거기서 가장 싼 곳으로 가기를 반복. 그 결과는 1-3-4-2-1로서 비용은 8 + 5 + 17 + 15 = 45 다른 도시에서 출발하여 같은 방법 적용. 2-4-1-3-2가 비용 39로서 최소경로. 학습 (휴리스틱, Heuristic) 알고리즘 가능한 몇 가지를 학습해 보고 그 중 제일 좋은 것을 선택 예에서는 탐욕 알고리즘(Greedy Algorithm)을 적용하여 학습 절대적인 최적값이 아니라 상대적인 최적값을 구한다는 점에서 학습 알고리즘은 근사적 알고리즘(Approximation Algorithm) 반드시 상식적인 시간(Reasonable Time) 안에 해결하는 것이 보장 결과에 대해서는 최적임을 보장하기 어려움. 두 가지 접근방식 동적 프로그래밍이나 백 트랙 또는 최적 분기를 사용하여 실행시간은 운에 맡기되 최적의 답안을 얻어냄. 학습 알고리즘을 사용하여 정해진 시간 내에 결과를 얻되 최적은 아닐지 몰라도 그냥 만족스러운 답안을 얻어냄.
스케쥴링 문제 스케줄링 문제(Scheduling Problem) 일마다 처리하는데 걸리는 시간이 서로 다름. 프로세서는 어느 순간에 한가지 일밖에 할 수 없음. 최소 시간 안에 모든 일을 처리할 수 있도록 프로세서 별로 일을 할당하라 간트 차트(Gantt Chart) i 1 2 3 4 5 6 Ji
스케쥴링 문제 임의로 일 순서를 1, 4, 6, 5, 3, 2로 나열: 총 9시간 처리시간이 긴 것부터 나열하면 3, 2, 5, 1, 4, 6: 총 8시간 가장 오래 걸리는 일이 8 시간이므로 최소 시간이 이보다 작을 수는 없다. 따라서 이것이 최적 답안이 된다. i 1 2 3 4 5 6 Ji 8
스케쥴링 문제 학습 알고리즘 처리시간이 긴 것부터 나열하는 것이 항상 최적으로 이어지지는 않음. 처리시간이 긴 것부터 나열하면 총 7 시간이지만, 실제의 최적 스케줄은 총 6 시간 i 1 2 3 4 5 Ji
표현식의 만족 문제 부울 변수의 조합으로 표현된 조건문 조건문이 논리적으로 만족되는 경우가 있느냐 없느냐는 결정 문제 (A or (Not B) or (Not C)) 라는 표현 전체가 참(TRUE)이 되는 A, B, C 값이 하나라도 있느냐 A = FALSE, B = TRUE, C = FALSE 라면 이 표현의 값은 (FALSE or (Not TRUE) or (Not FALSE)) = TRUE 변수 값이 TRUE 일 때와 FALSE 일 때를 모두 감안하여야 하므로 변수가 N개라면 경우의 수는 2N 재수가 좋아서 몇 번 시도 만에 결과 값이 TRUE가 나오면 그만 그러나, 노(No)라고 단언하기 전까지는 2N 가지의 모든 경우를 검증 현재까지 알려진 가장 빠른 알고리즘이 지수함수 알고리즘 학습 알고리즘 또는 백 트랙이나 동적 프로그래밍 등의 알고리즘을 가할 여지가 없음.
유효 컬러링 문제 유효 컬러링(Valid Coloring) 그래프 정점에 색깔을 칠하되 서로 인접한 두 정점의 색깔이 서로 다르도록 칠한 것 “주어진 그래프를 유효하게 칠하기 위해서는 몇 개의 색깔이 필요한가”라고 물어보면 최적화 문제 “주어진 그래프를 3개 이하의 색깔로 유효하게 칠할 수 있겠는가”라고 물어보면 결정문제. 3-컬러링 문제(Three Coloring Problem) 왼쪽 그래프는 Yes, 오른쪽 그래프는 No. 상태공간 트리에 의한 백 트래킹 적용가능. 일반적으로 지수함수 시간이 요구됨.
P의 문제, NP의 문제 전제조건 P의 문제, NP의 문제를 논할 때에는 모든 문제를 결정문제로 바꾼 상태에서 판단. 명확하기 때문. P의 문제 다항식 시간(Polynomial Time) 안에 풀 수 있는 문제 처리 가능한 문제 즉, O(NK) 시간 안에 풀 수 있는 문제 NP의 문제 초 다항식 시간(Super-Polynomial Time)을 요하는 문제 처리 불가능한 문제, 즉 지수함수 시간이나 팩토리알 시간을 요하는 문제 NP는 비 결정적 다항식(非 決定的, Nondeterministic Polynomial)의 약자 항상 다항식이 아니고 운이 좋으면 다항식 시간에 풀 수 있다는 의미 할당 문제를 푸는데 있어서 처음에 깊이우선 탐색한 경로가 우연히 최적의 답으로 이어지는 경로였다면 다항식 시간 내에 답을 얻을 수 있음. NP의 문제에서 어떤 답이 나오면 그것이 정답인지에 대한 증명도 다항식 시간. CNF-만족의 문제 같으면 우연히 처음 추측한 변수별 트루, 폴스 값이 전체 표현을 트루로 만들 경우가 존재. 이것이 정답인지는 당연히 그 값을 전체 표현에 넣어서 그 결과가 트루라는 것만 보이면 되고, 이 과정은 다항식 시간이면 됨.
P의 문제, NP의 문제 P의 문제, NP의 문제 문제에 대한 해법을 전제 최단경로의 문제는 다항식 시간 알고리즘을 이미 갖고 있기 때문 NP의 문제라고 했을지라도 다항식 시간 안에 풀 수 있는 알고리즘이 개발되면 그 문제는 P의 문제로 바뀜.
P의 문제, NP의 문제 P의 문제, NP의 문제 문제의 성격이 실제로는 P인데 우리가 아직 답을 몰라서 NP의 문제라고 부르고 있을 수도 있음. P의 문제와 NP의 문제가 본질적으로 완전히 동일한 종류가 아닌가 하는 질문. P = NP? NP의 문제 중에서도 일련의 문제들은 본질적으로 다른 문제의 해결책과 연관되어 있음. 모든 NP 문제를 합친 것만큼 어려운(NP Hard) 문제들을 NPC(NP-Complete) 문제라고 함. 세일즈맨 여행의 문제, CNF-만족의 문제. 3-컬러링 문제 등 지수함수적인 시간을 요하는 약 1,000 개 정도의 NPC 문제들이 존재
P의 문제, NP의 문제 P의 문제, NP의 문제 NPC 문제 중 하나의 문제만 다항식 시간 안에 풀 수 있는 방법이 고안되면 나머지 모든 NP의 문제도 다항식 시간 안에 풀 수 있음. 사상(Mapping)에 의함. 문제 A를 푸는 방법에 문제 B를 푸는 방법을 사상시킬 수 있기 때문 사상에 걸리는 시간은 다항식 시간(Polynomial Time Reduction). 하나의 문제를 다항식 시간에 풀 수 있으면 이를 다항식 시간 안에 다른 문제를 푸는 방법으로 변형시킨 다음에 변형된 방법을 써서 다른 문제도 다항식 시간에 풀 수 있음.
P의 문제, NP의 문제 해밀턴 경로 (Hamiltonian Path) 다이익스트라 알고리즘: O(N2) 알고리즘 (b)는 (a)의 모든 간선에 가중치 -1을 할당. 모든 노드 사이에 최단경로 알고리즘을 적용하여 그 결과경로의 길이가 -(N-1)이면 그것이 해밀턴 경로에 해당. 따라서 (b)의 문제가 해결되면 이는 (a)의 문제가 해결됨을 의미. (b)의 문제에 대한 해결책을 (a)의 문제에 대한 해결책으로 사상할 수 있음. (b)의 문제가 다이익스트라 알고리즘으로 해결된다면 NP 문제인 (a)의 문제가 해결됨. 그러나 가중치를 음수로 할 경우에 다이익스트라 알고리즘은 제대로 동작하지 않음.
소수 검증문제 소수 검증문제(Primality Test Problem) 150자리 수를 지닌 소수 K를 만들어보라 1과 자신 이외에는 아무런 약수가 없는 자연수. 숫자 K가 소수인지 판단하라 1부터 K까지 모든 숫자로 K를 나눠봄. 억지접근(Brute Force) 방법 주어진 숫자의 자리수를 데이터 크기 N이라고 정의하면 자릿수 N이 하나 증가할 때마다 나누어 봐야할 숫자가 10배씩 증가 지수함수적인 알고리즘으로서 문제는 처리 불가능한 NP의 문제 150자리 수를 지닌 소수 K를 만들어보라 150 자리 숫자 중 임의로 하나를 선택. 소수인지를 검증해야 함. 수억년. K/2에서 중단해도 수억년의 반. 확률적 알고리즘 0과 K 사이의 숫자 중 임의의 숫자 P를 선택해서 K를 P로 나누었을 때 나누어 떨어지지 않는다면 K가 소수일 확률은 1/2이하 임의의 숫자 200개를 선택해서 나누었을 때 모두 나누어 떨어지지 않는 다면 숫자 K가 소수일 확률은 (1/2)200이하 다항식 시간에 실행 가능. 결과가 정답임을 보장하지는 못하는 몬테카를로 알고리즘
인수찾기 문제 인수찾기 문제(Factor Finding Problem) 더욱 어려움. 어떤 숫자가 주어졌을 때 그 숫자를 두 개의 인수의 곱으로 나타내라. 숫자 K가 주어졌을 때 K = A × B가 되도록 A, B를 구하는 문제 자리 수를 N으로 볼 때 실행시간은 지수 함수적으로 증가 때에 따라서는 이 조건을 만족하는 A, B가 단 한 쌍만 존재 소수의 검증문제와는 달리 확률적 알고리즘마저 존재하지 않음.
암호화 알고리즘 암호화(Cryptography) 서명(Signature, Digital Signature)의 문제 비즈니스, 군사적, 개인적인 목적 평문(Plain Text) 대신에 암호문(Cypher Text)을 주고받음 도청(Eavesdropping)된 메시지의 해독(Deciphering)을 어렵게 함. 서명(Signature, Digital Signature)의 문제 수신자로서는 그 메시지가 반드시 발신자가 보냈음을 확신한다. 발신자로서 그런 메시지를 보낸 적이 없다고 부인할 수 없어야 한다. 수신자가 받은 메시지를 조작한 후, 마치 발신자가 보낸 것처럼 하여 타인에게 보낼 수 없어야 한다.
암호화 알고리즘 A, B, C, D 사이의 암호화 교신 서류함에 자물쇠가 채워져 있는 상태에서 그 열쇠를 A, B, C, D 네 사람이 모두 갖고 있으면 이들 외에 타인들은 서류함에 들은 내용을 볼 수가 없다. A가 C에게 보낼 서류가 있으면 자신의 키를 사용하여 자물쇠를 열고 서류를 집어넣고 잠금. B가 서류를 꺼내고 내용을 바꾸어 마치 A가 보내는 것처럼 하여 다시 넣으면 C는 바뀐 서류를 보게 됨. 서명의 문제 A-B, A-C, A-D 등 모든 쌍(Pair) 간에 서로 다른 자물쇠와 키 세트를 가져야 함. 신입사원 하나가 들어오면 나머지 모든 사원과 서로 교신하기 위한 자물쇠와 키가 필요. 현실적으로 어려운 일.
암호화 알고리즘 공개 키 암호화(Public Key Cryptography) A, B, C, D 각각이 자신만의 자물쇠와 키를 구입하되, 자물쇠에 자신의 이름을 써서 서류함 앞에 놓아두고 공개 B가 A에게 서류를 전하는 경우. B는 서류를 함 속에 넣은 다음에 A의 자물쇠로 잠금. 자물쇠를 열 수 있는 것은 A 뿐. 공개되는 것은 자물쇠이며, 키는 여전히 개인만 간직함.
암호화 알고리즘 공개 키 암호화(Public Key Cryptography) 자물쇠로 잠그는 작업은 암호화(Encryption) 열쇠로 여는 작업은 해독(Decryption) 조건 DECRA(ENCRA(M)) = M은 반드시 만족. 메시지 M에 대해서 A의 자물쇠로 암호화한 것을 A의 열쇠로 해독하면 반드시 원래의 메시지 M이 복원되어야 함. ENCRA를 가지고 DECRA를 추정하기 어려워야 함. 자물쇠인 ENCRA 는 공개된 함수이므로 비교적 쉽게 계산되도록 하지만, DECRA 는 A의 키가 없으면 거의 계산이 불가능하도록 함. ENCRA(DECRA(M)) = M 이 만족되어야 함.
암호화 알고리즘 B가 A에게 메시지를 보낼 때 B는 일단 자신의 키를 가한 다음에 A의 자물쇠로 잠금. ENCRB는 B의 자물쇠에 해당하는 것으로서 공개된 함수. 그런데 만약 DECRB(“attack")가 B가 보낸 것이 아니라면 B의 자물쇠인 ENCRB로 풀리지 않음. B가 보낼 메시지에 일단 DECRB를 가한 이유는 나중에 받는 사람이 ENCRB 를 가해 봄으로써 보낸 사람이 B가 맞는지를 확인하기 위한 것
암호화 알고리즘 RSA(Rivest, Shamir, Adleman) 알고리즘 조건을 만족하는 ENCR, DECR 함수는 어떻게 만들 것인가. 소수 검증의 문제와 인수 찾기 문제 사이에 존재하는 복잡도 차이를 이용 150자리 정도 되는 두 개의 매우 큰 소수 P, Q를 몬테카를로 알고리즘에 의해 구한 뒤, N = P×Q 가 되도록 한다. 300자리 정도 되는 K를 선택하되 그 K가 (P-1)(Q-1)과 서로 소(Mutually Prime)가 되도록 한다. 다음, K×G % (P-1)(Q-1) = 1이 되는 G를 계산한다. 자물쇠를 나타내는 <G, N>은 공개 <K>는 공개되지 않는 개인별 비밀 키 공개 자물쇠인 N을 계산하는 과정 즉, P와 Q를 계산하는 과정은 몬테카를로 알고리즘에 의해 다항식 시간에 계산가능. 만약 공개된 N으로부터 그 인수인 P, Q를 추측할 수 있다면, 역시 공개된 G를 사용하여 비밀 키인 K를 추정할 수 있다. 그러나 N으로부터 P, Q를 추정하는 문제 즉, 공개된 자물쇠로부터 비밀 키를 찾는 것은 인수 찾기 문제로서 처리 불가능 문제. 이점이 바로 RSG 암호화의 요체임.
암호화 알고리즘 RSA(Rivest, Shamir, Adleman) 알고리즘 암호화 해독과정 암호화 과정은 매우 단순 암호화에 걸리는 시간을 다항식 시간으로 메시지 M의 비트 값을 잘라서 블록으로 만들되 각 블록 내부의 값이 0..(N-1) 사이가 되게 함. 공개된 자물쇠인 <G, N>을 사용하여 블록별로 암호문을 만들되 암호문 H = ENCR(M) = MG % N으로 함. H는 MG을 N으로 나눈 나머지이므로 그 몫을 m이라 하면 H = MG - mN 해독과정 비밀키인 K를 사용하여 이 암호문을 해독하는 과정 DECR(H) = HK % N = (MG - mN)K % N (암호문 작성방법에 의해) = MGK % N (이항정리에 의해) = M (조건 ‘나’에 의해)