빌드 날짜: 2026-08-29

이 문서를 읽는 방법

이 문서는 MIT 6.042 교재 Mathematics for Computer Science(Lehman·Leighton·Meyer, 2017년판, 1,006쪽)를 따라 정리한 자습서다. 컴퓨터과학에 쓰이는 수학을 증명 가능한 형태로 다시 세우는 것이 목표다.

다른 기초 과목 문서와 이 문서의 차이는 한 문장으로 적을 수 있다. 다른 문서가 도구를 쓰는 법을 다룬다면, 이 문서는 그 도구가 왜 옳은지 증명하는 법을 다룬다. 그래서 예제의 중심이 계산이 아니라 증명이다.

무엇을 알고 있어야 하는가

이 사이트의 기초 수학 문서를 끝냈다면 준비가 됐다. 프로그래밍 경험은 도움이 되지만 필수는 아니다.

기초수학이 이 도구들을 소개했다면 이 문서는 그것을 형식화한다. 겹치는 자리에서는 되풀이하지 않고 그 문서로 연결한다.

다른 문서와 무엇이 겹치고 무엇이 다른가

소재가 겹치는 문서가 여럿 있다. 어느 쪽을 읽어야 하는지 미리 적어 둔다.

소재쓰는 법을 보려면이 문서에서 보는 것
증명 기법기초수학 3장공리에서 출발하는 형식, 정렬성 원리, 구조적 귀납법
집합·함수·관계기초수학 4장관계의 성질, 부분순서, 동치관계와 분할
점근 표기알고리즘 3장정확한 정의와 증명, 합의 적분 근사, 스털링 근사
그래프알고리즘 8·9장구조 정리의 증명 — 오일러 공식, 색칠, 매칭, 연결도
정수론과 RSA알고리즘 16장RSA 가 왜 되돌아오는가 — 오일러 정리까지의 증명
확률과 기댓값기초수학 12장, 통계학 3~6장유한 확률공간에서 엄밀하게, 기댓값의 선형성, 편차 한계
점화식알고리즘 3·10장선형 점화식을 실제로 풀기, 마스터 정리의 증명

이 문서가 지키려는 약속

권장 순서와 장별 난이도

다섯 덩어리다. 3~10장(증명)은 반드시 순서대로 읽어야 한다. 뒤의 모든 장이 그 어휘를 쓴다. 11장 이후는 덩어리 단위로 순서를 바꿀 수 있다.

주제난이도예상 시간앞에 필요한 장
3증명이란 무엇인가★★5시간-
4정렬성 원리★★4시간3
5논리식★★5시간3
6수학적 자료형★★5시간3, 5
7귀납법★★★5시간4
8상태 기계★★★5시간7
9재귀적 자료형★★★5시간7
10무한집합★★★★5시간6, 9
11정수론★★★7시간4, 7, 8
12방향 그래프와 부분순서★★★6시간6, 7
13통신망★★4시간12
14단순 그래프★★★6시간12
15평면 그래프★★★5시간9, 14
16합과 점근★★★6시간7
17셈의 규칙★★★6시간6, 12
18생성함수★★★★5시간16, 17
19사건과 확률 공간★★5시간17
20조건부확률★★★6시간19
21확률변수★★★6시간20
22평균에서 벗어나기★★★★6시간21
23무작위 행보★★★5시간12, 22
24점화식★★★5시간16, 18

총 122시간 남짓이다. 하루 2시간이면 두 달이 넘는 분량이고, 이 사이트의 기초 과목 문서 가운데 가장 크다. MIT 에서는 한 학기 과목이다.

가장 걸리는 곳을 미리 알려 둔다. 10장의 대각선 논법과 정지 문제, 18장의 생성함수, 22장의 체르노프 한계다. 세 곳 모두 앞 장의 도구를 한꺼번에 쓰기 때문에 걸린다. 막히면 그 장을 붙들지 말고 앞 장의 해당 절로 돌아가는 편이 빠르다.

원서에는 각 장마다 연습문제가 수십 개씩 있다. 이 문서의 예제는 그중 대표적인 것을 골라 풀이를 붙인 것이다. 원서에는 풀이가 없으니, 더 풀고 싶으면 원서의 해당 장 뒤쪽을 보면 된다.

이 문서의 표기 규약

참고문서

원서와 강의

함께 보면 좋은 책

확인과 실습

증명이란 무엇인가

이 문서의 주제는 증명이다. 그러니 첫 장에서 할 일은 그 낱말의 뜻을 정하는 것이다. 답할 질문은 셋이다. 증명은 무엇에서 출발하는가. 한 걸음을 옮길 때 무엇이 허락되는가. 그리고 다 쓴 결과를 어떤 모양으로 종이에 적는가.

기초수학의 명제 장을 읽고 왔다면 직접증명·대우증명·귀류법·수학적 귀납법을 이미 써 봤을 것이다. 이 장은 그 도구를 다시 가르치지 않는다. 대신 그 도구들이 어디에 놓여 있는지를 밝힌다. 무엇을 증명 없이 받아들이기로 했는지, 어떤 규칙으로 한 줄에서 다음 줄로 넘어가는지, 왜 그렇게 적는 것이 옳은지다. 되풀이가 아니라 형식화다. 필요하면 기초수학 문서로 돌아가 도구 자체를 복습하고 오면 된다.

이 장이 세우는 어휘는 문서 끝까지 쓰인다. 뒤의 어느 장에서든 "증명하라"는 말이 나오면 그 뜻은 이 장에서 정한 것이다.

명제와 술어

명제(proposition)는 참인지 거짓인지가 정해지는 문장이다. 참·거짓이 정해지기만 하면 되고, 우리가 지금 그 답을 아는지는 상관없다.

이 조건은 느슨해 보이지만 꽤 많은 것을 걸러낸다. "창문을 닫아라"는 명제가 아니다. "지금은 다섯 시다"도 명제가 아니다 — 언제 말하느냐에 따라 답이 달라진다.

문제는 참·거짓이 정해져 있다는 것과 그것을 알아낼 수 있다는 것이 완전히 다르다는 데 있다. 다음 주장을 보자.

n 이 음이 아닌 정수일 때 p(n)=n2+n+41 은 언제나 소수다.

p(0)=41 은 소수다. p(1)=43, p(2)=47, p(3)=53 도 소수다. 계속 확인해 보면 p(39)=1601 까지 마흔 개가 모두 소수다. 그런데

p(40)=402+40+41=1681=41×41 이라 소수가 아니다. 주장은 거짓이다.

초록 칸 마흔 개가 모두 소수인데도 주장은 거짓이다. 오일러의 추측은 218년 뒤에야 아주 큰 반례로 무너졌다. 유한한 표본이 아무것도 보장하지 않는다는 것을 두 사례가 함께 말한다
<초록 칸 마흔 개가 모두 소수인데도 주장은 거짓이다. 오일러의 추측은 218년 뒤에야 아주 큰 반례로 무너졌다. 유한한 표본이 아무것도 보장하지 않는다는 것을 두 사례가 함께 말한다>[원본 보기]

이것이 이 문서 전체의 출발점이다. 무한히 많은 경우에 대한 주장은 유한한 표본으로 확인할 수 없다. 표본을 얼마나 크게 잡든 마찬가지다. 그림의 아래쪽 사례가 더 극적이다. 오일러는 1769년에 a4+b4+c4=d4 을 만족하는 양의 정수가 없다고 추측했고, 218년 동안 아무도 반례를 찾지 못했다. 1987년에 나온 반례는 a=95800, b=217519, c=414560, d=422481 이었다.

이런 "모든 것에 대한" 주장이 워낙 흔해서 기호가 따로 있다. 위의 주장은 이렇게 적는다.

nN.p(n) 은 소수다

는 "모든", N 은 음이 아닌 정수 전체, 은 "의 원소다"라고 읽는다. N 뒤의 마침표는 구절을 나누는 구두점일 뿐이다. 이 기호들은 5장에서 제대로 다룬다.

술어 — 변수를 담은 명제

술어(predicate)는 참·거짓이 변수의 값에 달려 있는 문장이다. "n 은 제곱수다"가 그런 문장이다. n 이 무엇인지 모르면 참·거짓을 말할 수 없고, n=4 를 넣으면 참인 명제가, n=5 를 넣으면 거짓인 명제가 된다.

술어에는 이름을 붙여 P(n) 처럼 적는다.

P(n)::="n 은 제곱수다"

여기서 ::= 는 "정의에 의해 같다"는 뜻이다. 그냥 = 를 써도 되지만, 이 등호가 정의라는 것을 알려 주면 읽는 사람이 편하다. 이 문서는 정의를 세울 때 ::= 를 쓴다.

표기가 함수와 똑같이 생겨서 헷갈리기 쉽다. 술어 P(n) 은 참 또는 거짓이고, 함수 p(n)=n2+n+41 은 수다. 그래서 P(4)+1 은 뜻이 없고 p(4)P(4) 도 뜻이 없다. 프로그램에서 정수와 참·거짓을 섞어 쓰면 형(type) 오류가 나는 것과 같은 이야기다. 5장에서 논리식을 다룰 때 이 구별이 실제로 걸린다.

예제 1

Q(x)::="x>3" 이고 q(x)=x3 이라 하자. 다음 중 뜻이 있는 것은 어느 것인가. (가) Q(5) (나) Q(5)+1 (다) q(5)Q(5) (라) Q(q(5))

풀이 보기

(가) 뜻이 있다. 5>3 이므로 참이다. (나) 뜻이 없다 — 진리값에 1 을 더할 수는 없다. (다) 뜻이 없다 — 는 진리값 둘을 받는데 q(5)=2 는 수다. (라) 뜻이 있다. q(5)=2 이고 Q(2) 는 "2>3", 즉 거짓이다.

잔소리처럼 보이지만 이 구별이 5장에서 실제로 걸린다. 술어를 세울 때는 그것이 진리값을 낸다는 것을 분명히 해 두어야 한다. 프로그램에서 형(type)을 맞추는 것과 같은 일이다.

예제 2

다음 중 어느 것이 명제이고 어느 것이 술어인가. 명제인 것은 참·거짓을 유한한 계산으로 판정할 수 있는지도 답하라. (가) 2100+1 은 소수다 (나) n2n (다) 모든 nN 에 대하여 n2n 이다 (라) 2보다 큰 모든 짝수는 두 소수의 합이다.

풀이 보기

판정 기준은 하나다. 변수가 자유롭게 남아 있는가.

(가) 명제다. 2100+1 은 정해진 수이고 소수인지 아닌지도 정해져 있다. 유한한 계산으로 판정할 수 있다 — 사람이 손으로 하기는 어렵지만 컴퓨터는 금방 한다(소수가 아니다).

(나) 술어다. n 이 정해지지 않았다. n=2 를 넣으면 참, n=0.5 를 넣으면 거짓이다.

(다) 명제다. nNn 을 묶었기 때문이다. 그리고 참이다. 다만 유한한 계산으로 판정할 수는 없다 — 확인할 n 이 무한히 많다. 그래서 증명이 필요하다.

(라) 명제다. 이것이 골드바흐 추측이고, 1018 까지 참임이 확인되었지만 참인지 거짓인지 아무도 모른다. 참·거짓이 정해져 있다는 것과 우리가 안다는 것이 다르다는 점을 (라)가 보여 준다.

(가)와 (다)의 차이를 눈여겨보자. 둘 다 명제인데 한쪽은 계산으로 끝나고 다른 쪽은 끝나지 않는다. 이 문서가 다루는 것은 (다)와 (라) 쪽이다.

공리에서 출발한다

증명은 무엇에서 출발하는가. 어떤 명제를 증명하려면 이미 참으로 인정된 것이 있어야 하고, 그 이미 참인 것은 또 어디서 왔는지 물을 수 있다. 이 물음을 계속 밀면 끝이 있어야 하는데, 그 끝에 놓는 것이 공리(axiom)증명하지 않고 참으로 받아들이는 명제다. 기원전 300년경 알렉산드리아의 유클리드가 이 방식을 만들었다. 그는 다섯 개의 가정에서 출발했다. "두 점 사이에는 직선이 하나 있다" 같은, 부정하기 어려워 보이는 것들이다. 여기서 출발해 나머지 기하를 모두 끌어냈다.

그렇게 공리와 앞서 증명한 명제에서 논리 규칙만으로 목표 명제에 이르는 일련의 연역이 증명이다. 이 방식을 공리적 방법(axiomatic method)이라 하고, 오늘날 수학은 전부 이 위에 서 있다.

왼쪽 두 상자만 증명 없이 받아들이는 것이고, 오른쪽은 모두 그 위에 쌓인다. 정리에서 다시 규칙으로 돌아가는 화살표가 있는 것이 요점이다 — 한 번 증명한 정리는 다음 증명의 재료가 된다
<왼쪽 두 상자만 증명 없이 받아들이는 것이고, 오른쪽은 모두 그 위에 쌓인다. 정리에서 다시 규칙으로 돌아가는 화살표가 있는 것이 요점이다 — 한 번 증명한 정리는 다음 증명의 재료가 된다>[원본 보기]

증명이 붙은 명제를 부르는 이름이 몇 가지 있다. 뜻이 딱 갈리는 것은 아니고 큰 몸통 안에서의 역할을 알려 주는 정도다. 좋은 보조정리는 원래 그것으로 증명하려던 정리보다 오히려 중요해지는 일도 흔하다.

이름역할
정리(theorem)증명을 붙인 중요한 명제
보조정리(lemma)뒤의 증명에 쓰려고 미리 세워 두는 명제
계(corollary)정리에서 몇 걸음이면 따라 나오는 명제
추측(conjecture)참일 것 같지만 아직 증명되지 않은 명제

이 문서가 쓰는 공리

현대 수학은 ZFC(선택 공리를 포함한 체르멜로-프렝켈 공리계)라는 아홉 개 안팎의 집합론 공리에서 출발하면 사실상 모든 수학을 끌어낼 수 있다는 것을 알고 있다. 그러나 실용적으로는 너무 원시적이다. ZFC 에서 2+2=4 를 형식적으로 증명하려면 2만 단계가 넘는다는 계산이 있다. 기계어로 프로그램을 쓰는 것과 비슷하다.

그래서 이 문서는 고등학교 수학에서 익숙한 사실 전부를 공리로 삼는다. 정수의 사칙연산 규칙, 부등식의 성질, 실수의 성질 같은 것들이다. 출발이 빨라지는 대신 대가가 있다. 증명 중간에 "이 작은 사실은 증명해야 하나, 그냥 써도 되나" 하는 순간이 온다.

그 경계에는 절대적인 답이 없다. 무엇을 가정해도 되는지는 상황과 읽는 사람에 달려 있다. 지침은 하나다 — 무엇을 가정했는지 밝혀라. 밝혀 놓으면 읽는 사람이 그 가정을 의심할 수 있고, 밝히지 않으면 증명에 구멍이 있어도 아무도 알아채지 못한다.

추론 규칙과 건전성

한 걸음을 옮길 때 허락되는 것을 추론 규칙(inference rule)이라 한다. 가장 기본적인 것이 전건 긍정(modus ponens)이다. P 의 증명과 PQ 의 증명이 있으면 Q 의 증명이 된다는 규칙이다.

추론 규칙은 위아래로 나눠 적는 관례가 있다. 위가 전제, 아래가 결론이다.

P,PQQ

규칙에 요구되는 성질은 하나다. 건전(sound)해야 한다. 전제를 모두 참으로 만드는 어떤 진리값 배정도 결론을 참으로 만들어야 한다는 뜻이다. 건전한 규칙만 쓰고 공리가 참이면, 증명해서 얻은 것은 모두 참이다.

예제 3

다음 세 규칙 중 건전한 것은 어느 것인가.

()PQ,QRPR()¬P¬QQP()¬P¬QPQ

풀이 보기

건전하지 않다는 것을 보이는 방법은 전제가 참이고 결론이 거짓인 배정 하나를 내놓는 것이다. 건전하다는 것을 보이려면 그런 배정이 없음을 확인해야 한다.

(가) 건전하다. 전제가 둘 다 참이라 하자. PR 가 거짓이려면 P 가 참이고 R 가 거짓이어야 한다. P 가 참이고 PQ 가 참이니 Q 가 참이고, Q 가 참이고 QR 가 참이니 R 도 참이다. R 가 거짓이라는 것과 어긋난다.

(나) 건전하다. ¬P¬Q 의 대우가 바로 QP 이고, 조건문과 그 대우는 진리값이 언제나 같다.

(다) 건전하지 않다. P 에 참, Q 에 거짓을 배정하자. 그러면 ¬P 가 거짓이므로 전제 ¬P¬Q 는 참이다. 그런데 결론 PQ 는 거짓이다.

(다)는 조건문을 그 이(inverse)와 혼동한 것이다. 이 혼동이 잘못된 증명의 가장 흔한 원인이고, 5장에서 진리표로 다시 확인한다.

예제 4

기초수학에서 2 가 무리수임을 증명할 때 "2=n/d 를 기약분수로 쓸 수 있다"는 말로 시작했다. 이것은 공리인가, 정리인가?

풀이 보기

공리로 받아들일 만한 것처럼 보이지만 정리다. 그리고 그 증명은 전혀 뻔하지 않다.

무엇을 주장하는지 정확히 적어 보자. "임의의 양의 정수 m, n 에 대하여 m/n 을 서로소인 두 양의 정수의 비로 쓸 수 있다." 이것은 모든 분수에 대한 주장이므로 유한한 확인으로는 끝나지 않는다.

증명은 4장의 정렬성 원리로 한다. 그러니 기초수학의 그 증명은 이름 없는 정리 하나에 조용히 의지하고 있었던 셈이다.

이것이 앞 절의 지침이 말하는 상황이다. 가정을 밝혀 두면 나중에 그 자리를 메울 수 있다. 밝히지 않으면 구멍인지도 모르고 지나간다. 이 문서에서 "쓸 수 있다", "당연히" 같은 말을 만나면 그 자리를 의심하는 습관을 들이는 것이 좋다.

함의를 증명한다

수학의 정리는 대부분 "P 이면 Q 이다" 꼴이다. 이런 명제를 함의(implication)라 하고 PQ 로 적는다. 이차방정식의 해 공식도, 골드바흐 추측도 이 꼴로 다시 쓸 수 있다.

왼쪽에서 목표의 모양을 읽고 오른쪽으로 가면 종이에 쓸 첫 문장까지 정해진다. 아래 두 메모가 이 그림에서 가장 실전 가치가 높다
<왼쪽에서 목표의 모양을 읽고 오른쪽으로 가면 종이에 쓸 첫 문장까지 정해진다. 아래 두 메모가 이 그림에서 가장 실전 가치가 높다>[원본 보기]

방법 1 — 가정을 손에 쥔다

종이에 "P 라고 가정하자"라고 쓰고, 거기서 Q 까지 밀고 간다. 가장 먼저 시도할 방법이다.

여기서 강조할 것은 방법이 아니라 순서다. 증명을 쓰기 전에 밑작업(scratchwork)이 있다. 밑작업은 엉망이어도 좋다. 막다른 길, 이상한 그림, 지운 자리가 있어도 된다. 그러나 밑작업과 최종 증명을 섞어 내지는 마라.

예제 5

0x2 이면 x3+4x+1>0 임을 증명하라.

증명

먼저 밑작업이다. x=0 이면 좌변은 1 이니 성립한다. x 가 커지면 4x 는 커지고 x3 은 작아지는데, x=1 에서 4x=4 이고 x3=1 이니 아직 4x 가 이긴다. x2 를 넘어야 x3 이 이길 것 같다. 그러면 [0,2] 에서 x3+4x 가 음이 아니고, 거기에 1 을 더하면 양수다.

이 어림을 확실한 것으로 바꾸려면 x3+4x 의 부호를 직접 읽을 수 있는 모양으로 만들어야 한다. 인수분해가 그 길이다.

x3+4x=x(2x)(2+x)

뼈대가 이것이다. 세 인수가 모두 음이 아니면 곱도 음이 아니고, 거기에 1 을 더하면 양수다. 이제 증명을 쓴다.

왼쪽 곡선은 밑작업이고 오른쪽 세 줄이 증명이다. 그림은 어디를 봐야 하는지 알려 주지만 구간 안의 무한히 많은 x 를 확인해 주지는 않는다
<왼쪽 곡선은 밑작업이고 오른쪽 세 줄이 증명이다. 그림은 어디를 봐야 하는지 알려 주지만 구간 안의 무한히 많은 x 를 확인해 주지는 않는다>[원본 보기]

증명. 0x2 라 가정하자. 그러면 x0 이고, 2x0 이고, 2+x2>0 이다. 음이 아닌 수들의 곱은 음이 아니므로

x(2x)(2+x)0

이고, 양변에 1 을 더하면 x(2x)(2+x)+1>0 이다. 왼쪽을 전개하면 x3+4x+1>0 이다. 증명이 끝났다.

최종 증명에 "x 가 커지면" 같은 어림은 한 줄도 들어가지 않았다. 밑작업은 왜 참인지 알아내는 데 필요했고, 증명은 예외가 없다는 것을 보이는 데 필요하다. 둘은 하는 일이 다르다.

방법 2 — 대우를 증명한다

PQ 대신 ¬Q¬P 를 증명한다. 두 명제의 진리값은 언제나 같으므로 하나를 보이면 다른 하나가 따라온다. 종이에는 "대우를 증명한다"고 먼저 쓰고 대우를 적은 뒤, 방법 1 과 똑같이 진행한다.

고르는 기준은 재주가 아니다. 어느 쪽 가정이 식으로 적히는가다.

예제 6

r 이 무리수이면 r 도 무리수임을 증명하라.

증명

가정과 결론을 나란히 놓아 보자. 가정은 "r 이 두 정수의 비가 아니다", 결론은 "r 이 두 정수의 비가 아니다"다. 부정이 양쪽에 다 있어 손댈 곳이 없다.

대우를 보자. "r 이 유리수이면 r 도 유리수다." 이쪽은 가정이 식으로 적힌다. 부정 둘이 모두 사라졌다는 것이 대우를 고를 이유다.

증명. 대우를 증명한다. r 이 유리수라 하자. 그러면 어떤 정수 m, n 에 대하여

r=mn

로 쓸 수 있다. 양변을 제곱하면

r=m2n2

이고 m2n2 은 정수이므로 r 는 유리수다. 대우가 참이므로 원래 명제도 참이다.

증명이 세 줄로 끝났다. 원래 명제를 직접 공격했다면 "두 정수의 비가 아닌 수의 제곱근"에서 시작해야 했고, 거기서 나아갈 길이 보이지 않는다.

동치를 증명한다

두 명제가 서로를 함의하면 동치라 하고 "P 인 것은 Q 인 것과 필요충분하다"고 말한다. 영어의 "if and only if"를 줄여 iff라고 쓰는 것이 관례다. 기호로는 PQ 다.

방법은 둘이다. 양방향으로 나눠 증명하거나, 동치 사슬을 만든다.

방법 1 — 두 방향을 따로 증명한다

PQ 를 보이고, 그다음 QP 를 보인다. 각 방향은 앞 절의 두 방법 중 하나로 처리한다. 두 방향의 사정이 다를 때 이 방법을 쓴다.

예제 7

정수 n 에 대하여 "n 이 짝수인 것은 n2 이 짝수인 것과 필요충분하다"를 증명하라.

증명

두 방향을 각각 보고 어느 방법이 맞는지 정한다.

왼쪽에서 오른쪽(n 이 짝수 → n2 이 짝수)은 가정이 식으로 적힌다. 짝수는 n=2k 다. 직접증명이다.

오른쪽에서 왼쪽(n2 이 짝수 → n 이 짝수)은 가정이 손대기 어렵다. n2=2k 에서 n 에 대한 정보를 끌어내려면 제곱근을 다뤄야 한다. 반면 결론의 부정 "n 이 홀수"는 n=2k+1 로 적힌다. 대우증명이다.

증명. 두 방향을 차례로 보인다.

먼저 n 이 짝수라 하자. 어떤 정수 k 에 대하여 n=2k 이므로 n2=4k2=2(2k2) 이고, 괄호 안이 정수이므로 n2 은 짝수다.

다음으로 반대 방향을 대우로 보인다. 대우는 "n 이 홀수이면 n2 도 홀수다"이다. n=2k+1 이라 하면

n2=4k2+4k+1=2(2k2+2k)+1

이고 괄호 안이 정수이므로 n2 은 홀수다.

두 방향이 모두 성립하므로 두 명제는 동치다.

한 정리 안에서 두 방향에 서로 다른 방법을 썼다. "iff 증명은 두 문제다"라고 생각하는 편이 안전하다. 한 방향만 보이고 끝내는 것이 iff 답안에서 가장 흔한 실수다.

방법 2 — 동치 사슬을 만든다

P 에서 출발해 동치인 명제를 이어 붙여 Q 까지 간다.

PR1R2Q

모든 단계가 동치여야 한다는 것이 조건이다. 한 단계라도 한쪽 방향만 성립하면 사슬이 끊긴다. 성공하면 짧고 깔끔한 증명이 나온다.

예제 8

x1,x2,,xn 의 평균을 μ, 표준편차를 σ 라 하자.

σ::=(x1μ)2+(x2μ)2++(xnμ)2n

표준편차가 0 인 것은 모든 값이 평균과 같은 것과 필요충분함을 증명하라.

증명

뼈대는 이렇다. 제곱근이 0 이려면 안이 0 이어야 하고, 음이 아닌 것들의 합이 0 이려면 각각이 0 이어야 한다. 두 단계가 모두 동치이므로 사슬로 이을 수 있다.

증명. 동치 사슬을 만든다.

σ=0 이다.

제곱근 안이 0 이다. 0 은 제곱근이 0 인 유일한 수이기 때문이다.

(x1μ)2++(xnμ)2=0. 분모 n 은 양수이므로 분자만 보면 된다.

좌변의 모든 항이 0 이다. 실수의 제곱은 음이 아니므로 음이 아닌 수들의 합이 0 인 것은 각 항이 0 인 것과 같다.

모든 i 에 대하여 xi=μ 다. (xiμ)2=0 인 것은 xi=μ 인 것과 같기 때문이다.

사슬이 끝났다.

마다 왜 그 단계가 양방향인지를 한마디씩 붙였다는 데 주의하자. 이 한마디가 빠지면 사슬은 계산 나열이 되고, 어느 단계가 한쪽 방향뿐인지 아무도 알 수 없다.

경우 나누기

복잡한 증명을 경우로 쪼개 각각을 따로 증명하는 것이 경우 나누기다. 어렵지 않은 방법이지만 두 가지를 반드시 지켜야 한다.

두 번째가 진짜 함정이다. 경우가 "P 이거나 P 가 아니다" 꼴이면 확인할 것이 없지만, 늘 그렇게 단순하지는 않다.

예제 9

임의의 실수 r, s 에 대하여 max(r,s)+min(r,s)=r+s 임을 증명하라.

증명

maxmin 은 어느 쪽이 큰지에 따라 값이 갈린다. 바로 그 갈림을 경우로 잡으면 두 함수가 사라진다.

증명. 경우를 나눈다.

경우 1: rs. 그러면 max(r,s)=s 이고 min(r,s)=r 이므로 좌변은 s+r=r+s 다.

경우 2: r>s. 그러면 max(r,s)=r 이고 min(r,s)=s 이므로 좌변은 r+s 다.

두 실수는 rs 이거나 r>s 이므로 경우가 빠짐없다. 두 경우 모두 등식이 성립하니 증명이 끝났다.

경우 1 에서 r=s 도 포함된다는 점을 확인해 두자. r=s 일 때 maxmin 이 모두 같은 값이 되어 아무 문제가 없다. 만약 경우를 r<sr>s 로 나눴다면 r=s 가 빠져 증명이 되지 않는다. 부등호에 등호를 어느 쪽에 붙이는지가 빈틈을 만든다.

예제 10

어떤 두 사람은 서로 만난 적이 있거나 없다. 세 사람이 서로 모두 만난 적이 있으면 그 셋을 클럽이라 하고, 서로 아무도 만난 적이 없으면 낯선 무리라 하자. 여섯 사람이 모이면 그 안에 3인 클럽이나 3인 낯선 무리가 반드시 있음을 증명하라.

증명

뼈대는 이렇다. 한 사람을 고르고, 나머지 다섯을 그와 만난 쪽과 안 만난 쪽으로 가른다. 다섯을 둘로 나누면 한쪽은 반드시 3명 이상이다.

가운데 패널과 오른쪽 패널이 경우 2 의 두 갈래다. 셋 중 서로 만난 짝이 있거나 없거나 둘 중 하나뿐이므로 빠지는 경우가 없다
<가운데 패널과 오른쪽 패널이 경우 2 의 두 갈래다. 셋 중 서로 만난 짝이 있거나 없거나 둘 중 하나뿐이므로 빠지는 경우가 없다>[원본 보기]

증명. 경우 나누기로 증명한다. 여섯 사람 중 한 명을 x 라 하자. 경우는 둘이다.

경우 1: x 를 만난 사람이 3명 이상이다.

경우 2: x 를 만나지 않은 사람이 3명 이상이다.

경우가 빠짐없는지 먼저 확인한다. x 를 뺀 다섯 사람을 "x 를 만난 쪽"과 "안 만난 쪽"으로 나누면 두 무리의 크기를 합쳐 5 이므로 한쪽은 3 이상이다. 확인이 끝났다.

경우 1 을 보자. x 를 만난 세 사람을 잡는다. 다시 두 갈래다.

경우 1.1: 그 셋 중 서로 만난 짝이 하나도 없다. 그러면 그 셋이 3인 낯선 무리다.

경우 1.2: 그 셋 중 서로 만난 짝이 있다. 그 두 사람은 각각 x 를 만났고 서로도 만났으므로 x 와 함께 3인 클럽이다.

어느 갈래에서도 주장이 성립하므로 경우 1 에서 주장이 성립한다.

경우 2 는 "만났다"와 "만나지 않았다"를 맞바꾸면 경우 1 과 글자만 다른 논증이 된다. x 를 만나지 않은 세 사람 중 서로 만나지 않은 짝이 있으면 x 와 함께 3인 낯선 무리이고, 없으면 그 셋이 3인 클럽이다.

두 경우 모두에서 주장이 성립하므로 증명이 끝났다.

경우 2 를 "대칭이므로 같다"고 넘기지 않고 한 줄로라도 무엇이 어디에 대응하는지 적었다는 점을 눈여겨보자. 진짜 대칭인지 확인하는 것도 증명의 일부다.

예제 11

무리수를 무리수 지수로 올렸을 때 결과가 유리수가 될 수 있는가? 22 를 보고 답하라.

증명

뼈대가 특이하다. 22 가 유리수인지 아닌지 우리는 모른다. 그런데 어느 쪽이어도 주장이 성립한다. 그러니 두 경우로 나누면 끝난다.

증명. 경우를 나눈다.

경우 1: 22 가 유리수다. 그러면 a=b=2 가 찾던 예다. 2 가 무리수임은 이미 알고 있다.

경우 2: 22 가 무리수다. 그러면 a=22, b=2 로 잡는다. 계산하면

ab=(22)2=222=22=2

이고 2 는 유리수다. 두 밑은 모두 무리수다.

어느 경우에도 그런 무리수 쌍이 존재하므로 증명이 끝났다.

이 증명에는 이상한 점이 있다. 존재한다는 것은 보였는데 어느 것인지는 말하지 못했다. 이런 증명을 비구성적(nonconstructive) 증명이라 한다. 답을 손에 쥐고 싶다면 다른 증명이 필요하다. 실은 a=2, b=2log23 을 잡으면 ab=3 이 되는데, 이 b 가 무리수임을 따로 보여야 한다.

귀류법

증명하려는 명제를 부정한 것을 참이라 가정하고 거기서 모순을 끌어낸다. 모순이 나왔다는 것은 처음 가정이 틀렸다는 뜻이고, 따라서 원래 명제가 참이다.

종이에는 "모순을 이끌어 낸다"고 먼저 쓴다. PQ 를 귀류법으로 증명하려면 ¬(PQ)P¬Q 를 쓴다. 즉 P¬Q 를 함께 가정한다. 대우증명이 ¬Q 하나만 가정하는 것과 여기서 갈린다.

"그런 것은 존재하지 않는다" 꼴의 주장은 대개 귀류법으로 증명한다. 없는 것을 하나씩 확인할 수는 없기 때문이다.

오른쪽 라벨이 줄마다 하는 일이다. 계획을 밝히는 첫 줄, 모순을 명시하는 줄, 결론을 직접 적는 마지막 줄 — 이 셋이 빠지면 읽는 사람은 증명이 끝났는지도 알 수 없다
<오른쪽 라벨이 줄마다 하는 일이다. 계획을 밝히는 첫 줄, 모순을 명시하는 줄, 결론을 직접 적는 마지막 줄 — 이 셋이 빠지면 읽는 사람은 증명이 끝났는지도 알 수 없다>[원본 보기]

예제 12

양의 정수 n 에 대하여 log7n 은 정수이거나 무리수임을 증명하라. 쓰는 정수·소수의 성질은 명시하라.

증명

뼈대는 이렇다. "정수이거나 무리수"를 부정하면 "정수가 아닌 유리수"가 된다. 그 하나만 막으면 된다.

쓰는 사실은 하나다. 소수 p 가 어떤 정수의 거듭제곱을 나누면 그 정수 자체를 나눈다. 즉 7nb 를 나누면 7n 을 나눈다. 이것은 11장에서 증명한다.

증명. 모순을 이끌어 낸다. log7n 이 정수가 아닌 유리수라 하자. 그러면 서로소인 양의 정수 a, b

log7n=ab,b2

라 쓸 수 있다. b=1 이면 log7n 이 정수가 되어 가정에 어긋나므로 b2 다. 로그의 정의로 옮기면

n=7a/bnb=7a

이다. 우변이 7 의 거듭제곱이므로 7nb 를 나누고, 위의 사실에 의해 7n 을 나눈다. 그러니 n 을 소인수분해하면 7 만 나온다. 만약 다른 소수 q7n 을 나눈다면 qnb=7a 도 나누는데, 7a7 아닌 소수로 나누어지지 않는다.

따라서 어떤 양의 정수 k 에 대하여 n=7k 이고

nb=7kb=7akb=aab=k

이다. 그런데 k 는 정수이므로 log7n 이 정수가 되어 처음 가정에 어긋난다. 모순이다.

따라서 log7n 은 정수이거나 무리수다.

"쓰는 사실을 명시하라"는 요구를 지킨 자리가 둘째 문단이다. 그 사실 없이는 7nb 에서 7n 으로 넘어갈 수 없다. 증명에서 진짜 무게를 지는 한 줄이 어디인지 알아 두는 것이 그 증명을 이해했다는 뜻이다.

예제 13

3+2 가 무리수임을 증명하라. 3 이 무리수임은 써도 좋다.

증명

뼈대는 이렇다. 3+2 가 유리수라 하면 32 도 유리수가 되고, 둘을 더하면 23 이 유리수가 되어 이미 아는 사실에 어긋난다. 여기서 쓰는 열쇠는 (3+2)(32)=32=1 이다.

증명. 모순을 이끌어 낸다. 3+2 가 유리수라 하고 3+2=q 라 하자. q>0 이다. 위의 곱셈에서

32=13+2=1q

이고, 유리수의 역수는 유리수이므로 32 도 유리수다. 두 식을 더하면

(3+2)+(32)=23=q+1q

이다. 우변은 유리수의 합이므로 유리수이고, 따라서 3=12(q+1q) 도 유리수다. 그런데 3 은 무리수다. 모순이다.

따라서 3+2 는 무리수다.

이 증명이 쓴 수법을 기억해 둘 만하다. 다루기 어려운 수를 다루기 쉬운 짝과 곱해 유리수를 만든다. 32 를 켤레(conjugate)라 하고, 무리수를 다룰 때 자주 쓴다.

좋은 증명이란

증명의 목적은 둘이다. 참임을 절대적으로 보증하는 것과, 읽는 사람을 이해시키는 것이다. 앞의 것만 필요하다면 기계가 검사할 수 있는 형식 증명으로 충분하겠지만, 그런 증명을 읽고 무언가를 이해한 사람은 없다.

그래서 논리적으로 맞다는 것만으로는 부족하다. 좋은 증명은 명확해야 한다. 두 성질은 대개 함께 온다. 잘 쓴 증명이 옳을 확률이 더 높다 — 잘 쓴 글에서는 실수를 숨길 곳이 없기 때문이다.

왼쪽 점선 상자에 걸리는 자리가 증명이 무너지기 쉬운 자리다. 특히 마지막 두 줄 — ‘자명하다’ 로 넘어간 자리와 결론을 독자에게 맡긴 자리를 의심하라
<왼쪽 점선 상자에 걸리는 자리가 증명이 무너지기 쉬운 자리다. 특히 마지막 두 줄 — ‘자명하다’ 로 넘어간 자리와 결론을 독자에게 맡긴 자리를 의심하라>[원본 보기]

그림의 다섯째 줄을 따로 강조해 둔다. "자명하다", "명백히", "쉽게 알 수 있듯" 같은 말을 어려운 자리를 넘기려고 쓰지 마라. 그리고 남의 증명에서 이런 말을 만나면 경계하라. 그 자리가 증명의 약한 고리인 경우가 많다.

무엇을 무엇이라 부를지도 고정된 것이 아니다. 전문 학술지의 증명은 그 분야 전문가 몇 사람 말고는 읽을 수 없고, 반대로 이 문서 앞부분의 증명은 전문 수학자에게는 지루하게 늘어진 것으로 보일 것이다. 어느 쪽도 틀린 것이 아니다. 읽는 사람을 정하고 그에게 맞춰 쓰는 것이 옳다.

잘못된 증명에서 틀린 단계 찾기

증명처럼 보이지만 증명이 아닌 것을 가짜 증명(bogus proof)이라 한다. 결론이 거짓인 것도 있고, 결론은 맞는데 도달한 방법이 틀린 것도 있다. 뒤쪽이 더 위험하다.

가짜 증명에서 틀린 단계를 찾는 연습이 이 과목에서 가장 효과가 좋다. 각 줄이 앞 줄에서 정말로 따라 나오는지 보는 눈이 생긴다. 이 문서는 장마다 하나씩 이런 문제를 둔다.

오류 찾기

음이 아닌 실수 a, b 에 대하여 산술평균이 기하평균 이상이라는 것, 즉 a+b2ab 는 참인 사실이다. 다음 "증명"은 무엇이 문제인가. 어떻게 고치면 되는가.

a+b2ab이므로a+b2ab이므로a2+2ab+b24ab이므로a22ab+b20이므로(ab)20이고 이것은 참이다.

ab 는 실수이고 실수의 제곱은 음이 아니므로 마지막 줄은 참이다. 따라서 명제가 증명되었다.

풀이 보기

계산은 한 줄도 틀리지 않았다. 그런데 증명이 아니다.

틀린 곳은 첫 줄이다. 첫 줄이 증명하려는 명제 그 자체인데 그것을 참이라 놓고 시작했다. 그다음 줄들은 "명제가 참이라면 (ab)20 이다"를 보인 것이고, 이것은 명제 → 참인 사실 꼴이다.

그런데 함의는 그 방향으로 쓸 수 없다. 앞 절의 건전성 예제로 돌아가면 이유가 분명하다. PQQ 가 참이어도 P 는 알 수 없다. 실제로 거짓인 명제에서 출발해도 참인 결론에 도달할 수 있다. 1=2 에서 출발해 양변에 0 을 곱하면 0=0 이라는 참인 식이 나오는 것과 같다.

고치는 방법은 순서를 뒤집는 것이다. 참인 사실에서 출발해 명제로 내려온다.

증명. ab 는 실수이므로 (ab)20 이다. 전개하면 a22ab+b20 이고, 양변에 4ab 를 더하면 a2+2ab+b24ab, 즉 (a+b)24ab 다. a,b0 이므로 a+b0 이고 양변의 음이 아닌 제곱근을 취하면 a+b2ab, 양변을 2 로 나누면 a+b2ab 다.

이 오류를 순환 논증 또는 "결론을 가정하기"라 한다. 밑작업에서는 원래 이렇게 거꾸로 더듬어 간다. 문제는 그 밑작업을 그대로 증명이라고 낸 것이다. 밑작업을 뒤집어 다시 쓰는 일까지가 증명이다.

덧붙여, 뒤집은 증명에서 "양변의 음이 아닌 제곱근을 취한다"는 단계에 a+b0 이 필요했다는 것도 확인해 두자. 원래 "증명"은 이 조건을 어디서도 쓰지 않았다. 조건이 쓰이지 않는 증명은 대개 무언가 빠뜨린 증명이다.

오류 찾기

다음 "증명"은 1=1 을 보였다고 주장한다. 틀린 단계를 정확히 지적하라.

1=1=(1)(1)=11=(1)2=1

풀이 보기

등호가 다섯 개 있으니 하나씩 본다.

1=1 은 참이다. 1=(1)(1) 도 참이다. (1)(1)=1 이니까.

셋째 등호 (1)(1)=11 이 틀렸다. ab=ab 라는 규칙은 a0 이고 b0 일 때만 성립한다. 여기서는 둘 다 음수다.

넷째와 다섯째 등호는 셋째가 이미 무너졌으므로 따질 필요가 없다. 다만 (1)2=1 자체는 복소수에서 i2=1 이니 문제가 아니다.

여기서 얻을 것은 규칙의 적용 조건이다. ab=ab 를 음이 아닌 실수에 대해서는 증명할 수 있다. 양변을 제곱하면 곱셈의 교환·결합법칙만으로 (ab)2=ab 가 나오고, 양쪽 모두 음이 아니므로 제곱이 같으면 값이 같다.

마지막 단계에서 "음이 아니다"를 썼다는 데 주의하자. 음수까지 허용하면 (3)2=32 이지만 33 이다. 익숙한 규칙일수록 조건을 잊기 쉽다.

이 장에서 새로 나온 것

기호·용어
공리(axiom)증명 없이 참으로 받아들이는 명제. 이 문서는 고등학교 수학의 익숙한 사실을 공리로 쓴다
추론 규칙참인 것에서 참인 것을 뽑아내는 절차. 건전해야 한다
건전하다(sound)전제를 참으로 만드는 어떤 배정도 결론을 참으로 만든다
정리·보조정리·계증명이 붙은 명제. 큰 몸통 안에서의 역할이 다르다
술어(predicate)참·거짓이 변수에 달린 문장. P(n) 으로 적는다
::=정의에 의해 같다
xS집합 S 의 모든 x 에 대하여
N음이 아닌 정수 전체 — 0 을 포함한다
iffif and only if. 필요충분. 기호로는 또는
비구성적 증명존재를 보이지만 어느 것인지 지목하지 못하는 증명
가짜 증명(bogus proof)증명처럼 보이지만 어느 단계가 근거 없는 논증

챙겨 갈 것은 다섯이다.

다음 장에서는 이 장에서 조용히 쓰고 넘어간 사실 하나를 제대로 증명한다. "분수를 기약분수로 쓸 수 있다"는 것이다. 도구는 정렬성 원리이고, 그 발상은 "가장 작은 반례를 잡는다"는 한 줄로 요약된다.

정렬성 원리

이 장은 문장 하나에서 출발한다.

음이 아닌 정수로 된 공집합이 아닌 집합은 반드시 최소 원소를 갖는다.

이것을 정렬성 원리(Well Ordering Principle)라 하고, 줄여서 WOP라 쓴다.

너무 당연해서 무슨 말을 할 것이 있는지 의아할 것이다. 이 장에서 답할 것은 셋이다. 이 문장이 왜 당연하지 않은가 — 즉 조건 하나만 빼도 어디서 무너지는가. 이것이 어떻게 증명 방법이 되는가. 그리고 그 방법이 무엇을 증명하는가.

3장에서 미뤄 둔 빚이 하나 있다. "분수를 기약분수로 쓸 수 있다"는 사실을 증명하지 않고 썼다. 그 빚을 이 장에서 갚는다.

가져오는 것은 3장의 증명 형식 전부다. 특히 귀류법을 계속 쓴다. 이 장의 방법은 사실상 "귀류법 + 최소 원소"이기 때문이다.

이 문장이 왜 당연하지 않은가

정렬성 원리의 문장에는 조건이 둘 붙어 있다. 공집합이 아니어야 하고, 음이 아닌 정수여야 한다. 둘 다 없으면 안 된다.

공집합은 원소가 하나도 없으니 최소 원소도 없다. 이건 시시한 예외다. 뒤의 조건이 진짜다.

둘째 줄은 왼쪽으로 끝없이 이어져 최소가 없고, 셋째 줄은 0 에 끝없이 다가가지만 0 이 집합에 없어 최소가 없다. 첫째 줄만 왼쪽 끝을 갖는다
<둘째 줄은 왼쪽으로 끝없이 이어져 최소가 없고, 셋째 줄은 0 에 끝없이 다가가지만 0 이 집합에 없어 최소가 없다. 첫째 줄만 왼쪽 끝을 갖는다>[원본 보기]

음의 정수 집합에는 최소 원소가 없다. 어떤 음의 정수를 잡아도 그보다 작은 음의 정수가 있다.

더 흥미로운 것은 셋째 줄이다. 양의 유리수 집합에도 최소 원소가 없다. 어떤 양의 유리수 q 를 잡아도 q/2 가 더 작은 양의 유리수다. 정수에서는 이것이 불가능하다. 정수 사이에는 틈이 있어서 아래로 내려가다 보면 반드시 0 에 걸린다.

그래서 정렬성 원리는 "아무 수 집합에나 성립하는 시시한 사실"이 아니라 음이 아닌 정수만이 가진 성질이다. 이 성질이 이 문서에서 여러 번 결정적인 일을 한다.

예제 16

다음 실수 집합 중 어느 것이 "공집합이 아닌 모든 부분집합이 최소 원소를 갖는다"는 성질을 만족하는가. (가) {5,6,7,8,} (나) {3,2,1,0,1,2,} (다) {1/2,1/3,1/4,} (라) {0,1/2,2/3,3/4,}, 즉 {n/(n+1):nN} (마) {1,2,3}

풀이 보기

판정 기준은 어떤 부분집합을 잡아도 왼쪽 끝이 있는가다. 집합 자체에 최소 원소가 있는 것으로는 부족하다.

(가) 만족한다. 각 원소에서 5 를 빼면 음이 아닌 정수 집합이 되고, 부분집합을 잡아도 마찬가지다.

(나) 만족한다. 같은 이유다. 하계가 있는 정수 집합이면 된다.

(다) 만족하지 않는다. 집합 전체를 부분집합으로 잡으면 최소 원소가 없다. 1/n 을 잡아도 1/(n+1) 이 더 작다.

(라) 만족한다. 이것이 헷갈리는 예다. 원소들은 1 을 향해 올라가고 있고, 아래쪽으로는 0 에서 딱 멈춘다. 어떤 부분집합을 잡아도 그 안에서 n 이 가장 작은 원소가 왼쪽 끝이다. n 은 음이 아닌 정수이므로 그런 n 이 반드시 있다.

(마) 만족한다. 유한집합의 공집합이 아닌 부분집합은 유한하고, 유한집합에는 최소 원소가 있다. 이 사실 자체도 증명이 필요하고, 이 장 뒤에서 증명한다.

(다)와 (라)를 나란히 놓고 보자. 둘 다 유리수의 무한집합인데 한쪽은 되고 한쪽은 안 된다. "정수인가"가 기준이 아니라 "아래로 끝없이 내려갈 수 있는가"가 기준이다.

예제 17

정렬성 원리를 써서 다음을 증명하라. (가) 하계를 갖는 정수 집합은 공집합이 아닌 모든 부분집합이 최소 원소를 갖는다. (나) 상계를 갖는 공집합이 아닌 정수 집합은 최대 원소를 갖는다. 여기서 집합 S하계는 모든 sS 에 대해 bs 인 수 b 이고, 상계sb 인 수 b 다. 하계와 상계가 S 에 들어 있어야 하는 것은 아니다.

증명

뼈대는 둘 다 평행이동이다. 정렬성 원리는 음이 아닌 정수에만 쓸 수 있으니, 문제의 집합을 옮겨서 음이 아닌 정수 집합으로 만든다.

(가) 증명. 정수 집합 S 가 실수 하계 b 를 갖는다고 하자. b 를 내림하여 얻은 정수 n=bS 의 하계다. 이제 T::={sn:sS} 를 보자. 모든 sn 이므로 T 는 음이 아닌 정수 집합이다.

S 의 공집합이 아닌 부분집합 A 를 아무거나 잡자. 그러면 {an:aA} 는 음이 아닌 정수로 된 공집합이 아닌 집합이므로 WOP 에 의해 최소 원소 m 을 갖는다. 그러면 m+nA 의 최소 원소다.

(나) 증명. 부호를 뒤집으면 (가)로 돌아간다. S 가 상계 b 를 갖는다고 하고 S::={s:sS} 를 보자. 모든 sb 이므로 모든 sb 이고, 따라서 bS 의 하계다. (가)에 의해 S 는 최소 원소 m 을 갖고, 그러면 mS 의 최대 원소다.

두 증명이 한 일은 정렬성 원리를 쓸 수 있는 모양으로 문제를 옮긴 것이 전부다. 이 수법은 앞으로도 계속 쓴다. 공리는 좁게 진술해 두고, 필요할 때마다 문제를 그 모양으로 옮긴다.

정렬성 원리로 증명한다

미뤄 둔 빚 — 기약분수

3장에서 2 가 무리수임을 증명할 때 "2=n/d 를 기약분수로 쓸 수 있다"고 했다. 그 말은 다음 정리를 쓴 것이다.

정리. 임의의 양의 정수 m, n 에 대하여 분수 m/n기약분수로 쓸 수 있다. 즉 공통 소인수가 없는 두 양의 정수 m/n 로 쓸 수 있다.

예제 18

위 정리를 증명하라.

증명

뼈대는 이렇다. 기약분수로 쓸 수 없는 분수가 있다고 하면, 그중 분자가 가장 작은 것을 잡을 수 있다. 그런데 그것을 약분하면 분자가 더 작은 반례가 나온다.

왜 분자를 보는가. 우리가 최소 원소를 잡을 수 있는 것은 음이 아닌 정수 집합뿐이다. 분수 자체를 모아 놓으면 앞 절에서 본 대로 최소 원소가 없을 수 있다. 그래서 분수의 집합이 아니라 분자의 집합을 만든다. 이것이 WOP 증명에서 가장 중요한 판단이다.

증명. 모순을 이끌어 낸다. 기약분수로 쓸 수 없는 분수가 있다고 가정하고, 그런 분수들의 분자를 모아

C::={mZ+:어떤 n>0 에 대해 m/n 을 기약분수로 쓸 수 없다}

라 하자. 가정에 의해 C 는 공집합이 아니고, 양의 정수 집합이므로 WOP 에 의해 최소 원소 m0 을 갖는다. C 의 정의에 따라 어떤 n0>0 이 있어

m0n0 을 기약분수로 쓸 수 없다.

기약분수로 쓸 수 없으니 m0n0 에는 공통 소인수 p>1 이 있다. 그런데

m0/pn0/p=m0n0

이므로 왼쪽 분수를 기약분수로 쓸 수 있다면 그것이 곧 m0/n0 의 기약분수 표현이 된다. 오른쪽을 기약분수로 쓸 수 없으니 왼쪽도 쓸 수 없다.

그러면 C 의 정의에 따라 m0/pC 다. 그런데 p>1 이므로 m0/p<m0 이고, 이는 m0C 의 최소 원소라는 데 어긋난다. 모순이다.

따라서 C 는 공집합이고, 기약분수로 쓸 수 없는 분수는 없다.

이 증명이 알려 주는 것이 하나 더 있다. 우리는 정렬성 원리를 진작부터 몰래 쓰고 있었다. 기약분수라는 말을 쓸 때마다 이 정리를 쓴 것이다.

증명의 정형

앞의 증명은 우연히 그 모양이 된 것이 아니다. 정렬성 원리로 "모든 음이 아닌 정수 n 에 대해 P(n) 이 참"임을 증명하는 정형(template)이 있다.

다섯 단계 중 ①②③⑤ 는 문제가 바뀌어도 문장이 거의 같다. ④ 만 매번 다르다. 그래서 WOP 증명을 쓰는 일은 ④ 를 채우는 일이다
<다섯 단계 중 ①②③⑤ 는 문제가 바뀌어도 문장이 거의 같다. ④ 만 매번 다르다. 그래서 WOP 증명을 쓰는 일은 ④ 를 채우는 일이다>[원본 보기]

다섯 단계를 말로 다시 적어 둔다.

  1. 반례 집합을 정의한다. C::={nN:¬P(n)}.
  2. 모순을 노리고 C 가 공집합이 아니라고 가정한다.
  3. WOP 로 C 의 최소 원소 c 를 잡는다. 이때 c 보다 작은 n 에서는 P(n) 이 참이라는 정보가 생긴다.
  4. 모순을 만든다. P(c) 가 실제로 참임을 보이거나, c 보다 작은 C 의 원소를 만들어 낸다.
  5. 따라서 C 는 공집합이고 반례는 없다.
초록 띠가 3단계에서 생기는 정보다. c 왼쪽에서는 명제가 참이라는 것을 마음껏 쓸 수 있고, 그 정보로 c 보다 작은 반례를 만들어 내면 모순이 된다
<초록 띠가 3단계에서 생기는 정보다. c 왼쪽에서는 명제가 참이라는 것을 마음껏 쓸 수 있고, 그 정보로 c 보다 작은 반례를 만들어 내면 모순이 된다>[원본 보기]

그림의 초록 띠가 이 방법의 전부다. 가장 작은 반례를 잡는다는 것은 "그보다 작은 곳에서는 다 참이다"라는 정보를 손에 넣는 것이다. 반례 집합을 정의하는 것도, 모순으로 몰아가는 것도 그 정보를 얻기 위한 장치다.

첫 적용 — 정수의 합

1 부터 n 까지의 합 공식을 이 정형으로 증명해 보자.

그 전에 표기를 짚어 둔다. 1+2+3++n 처럼 점 셋을 쓰는 표기를 줄임표(ellipsis)라 하는데, 양 끝에서 함정이 있다. n=1 이면 항이 하나다. 23 이 적혀 있어도 그것에 속으면 안 된다. n=0 이면 항이 하나도 없고, 항이 없는 합은 관례에 따라 0 이다. 헷갈리지 않게 시그마 기호로 쓰면

i=1ni또는1ini

다. 뒤쪽 표기가 n=0 일 때 항이 없다는 것을 더 분명히 보여 준다.

예제 19

모든 음이 아닌 정수 n 에 대하여 i=1ni=n(n+1)2 임을 정렬성 원리로 증명하라.

증명

정형을 그대로 따른다. 뼈대는 최소 반례 c 를 잡고, c1 에서 공식이 성립한다는 것을 써서 c 에서도 성립함을 보이는 것이다.

증명. 모순을 이끌어 낸다. 반례를 모아

C::={nN:i=1nin(n+1)2}

라 하고, C 가 공집합이 아니라고 가정하자. WOP 에 의해 C 는 최소 원소 c 를 갖는다.

n=0 일 때 좌변은 항이 없어 0 이고 우변은 01/2=0 이므로 공식이 성립한다. 따라서 0C 이고 c>0 이다. 그러면 c1 은 음이 아닌 정수이고 c 보다 작으므로 c1C 다. 즉

i=1c1i=(c1)c2

이다. 양변에 c 를 더한다.

i=1ci=(c1)c2+c=c2c+2c2=c(c+1)2

이것은 n=c 에서 공식이 성립한다는 말이므로 cC 다. 그런데 cC 였다. 모순이다.

따라서 C 는 공집합이고, 공식은 모든 음이 아닌 정수에서 성립한다.

c>0 을 확보한 자리를 눈여겨보자. 그 한 줄이 없으면 c1 이 음수가 될 수 있고, 그러면 c1C 이라는 말이 아무 정보도 주지 않는다. WOP 증명에서 가장 자주 빠지는 것이 이 한 줄이다.

예제 20

10 원과 15 원 우표만으로 만들 수 있는 금액은 모두 5 의 배수임을 정렬성 원리로 증명하라. 여기서 S(n) 을 "10 원과 15 원 우표만으로 정확히 n 원을 만들 수 있다"는 술어라 하고, jkjk 를 나눈다는 뜻으로 쓴다.

증명

증명할 명제는 S(n)5n 이다. 뼈대는 이렇다. 반례가 있다면 가장 작은 반례에서 우표 한 장을 떼어 낸다. 남은 금액은 더 작으니 반례가 아니고, 따라서 5 의 배수다. 그러면 원래 금액도 5 의 배수다.

증명. 반례를 모아

C::={nN:S(n) 이고 5n}

라 하고, 공집합이 아니라고 가정하자. WOP 에 의해 최소 원소 m 이 있다.

m>0 이다. 우표를 한 장도 쓰지 않으면 0 원이므로 S(0) 은 참이고, 50 이므로 0C 이다.

S(m) 이고 m>0 이므로 우표를 적어도 한 장 썼다. 그 한 장을 떼어 내면 S(m10) 또는 S(m15) 이 성립하고, 뗀 우표의 값만큼은 m 이 그보다 크므로 남은 금액도 음이 아니다.

S(m10) 인 경우: m10 은 음이 아닌 정수이고 m 보다 작으므로 m10C 다. 그런데 S(m10) 이 참이므로 C 의 정의상 5(m10) 이어야 한다. 그러면 510 이므로 5m 이고, 이는 mC 라는 데 어긋난다.

S(m15) 인 경우: 같은 방식으로 5(m15) 이고 515 이므로 5m 이다. 역시 모순이다.

두 경우 모두 모순이므로 C 는 공집합이고, 만들 수 있는 금액은 모두 5 의 배수다.

이 증명은 정형을 채우는 연습으로 좋다. ④단계에서 한 일이 "더 작은 것에서는 참"이라는 정보를 한 번 쓴 것뿐이다.

예제 21

8 이상의 모든 정수를 3 의 배수와 5 의 배수의 합으로 쓸 수 있음을 정렬성 원리로 증명하라. 배수의 계수는 음이 아닌 정수로 한다.

증명

뼈대는 이렇다. 가장 작은 반례 c 에서 3 을 빼면 c 보다 작으니 반례가 아니고, 따라서 3a+5b 로 쓸 수 있다. 양변에 3 을 더하면 c 도 쓸 수 있다.

그런데 c38 이상이어야 이 논증이 성립한다. 그래서 작은 값 몇 개를 먼저 확인해 c 를 아래에서 밀어내야 한다.

위쪽에 8, 9, 10 이 이미 적혀 있다는 것이 c ≥ 11 을 보장하고, 그래서 c − 3 ≥ 8 이 된다. 이 확인을 빼면 c − 3 이 범위 밖으로 나가 증명이 무너진다
<위쪽에 8, 9, 10 이 이미 적혀 있다는 것이 c ≥ 11 을 보장하고, 그래서 c − 3 ≥ 8 이 된다. 이 확인을 빼면 c − 3 이 범위 밖으로 나가 증명이 무너진다>[원본 보기]

증명. 먼저 8=3+5, 9=33, 10=25 이므로 8, 9, 10 은 반례가 아니다.

이제 반례를 모아 C::={nZ:n8 이고 n 을 3a+5b 로 쓸 수 없다} 라 하고 공집합이 아니라고 가정하자. C 는 하계 8 을 갖는 정수 집합이므로 앞에서 증명한 대로 최소 원소 c 를 갖는다.

위에서 확인한 대로 8,9,10C 이므로 c11 이다. 그러면 c38 이고 c3<c 이므로 c3C 다. 즉 음이 아닌 정수 a, b 가 있어

c3=3a+5b

다. 양변에 3 을 더하면

c=3(a+1)+5b

이고 a+1 도 음이 아닌 정수이므로 c3a+5b 꼴로 썼다. 이는 cC 라는 데 어긋난다. 모순이다.

따라서 C 는 공집합이고 주장이 성립한다.

여기서는 WOP 를 음이 아닌 정수가 아니라 "8 이상의 정수"에 적용했다. 그렇게 해도 되는 근거가 앞 절의 하계 정리다. 공리를 좁게 두고 필요할 때 옮겨 쓴다는 것이 이렇게 값을 한다.

예제 22

다음 방정식은 양의 정수해를 갖지 않음을 정렬성 원리로 증명하라.

4a3+2b3=c3

증명

뼈대는 이렇다. 해가 하나 있으면 세 수가 모두 짝수여야 하고, 그러면 절반으로 줄인 것도 해가 된다. 그러니 가장 작은 해가 있을 수 없다.

무엇의 최소를 잡을지 정해야 한다. 해는 세 수의 묶음이라 그 자체로는 크기를 비교하기 어렵다. c 만 모으면 양의 정수 집합이 된다.

쓰는 사실 하나를 밝혀 둔다. 정수의 세제곱이 짝수이면 그 정수도 짝수다. 홀수 n=2k+1 이면 n3=8k3+12k2+6k+1 이 홀수이기 때문이다.

증명. 모순을 이끌어 낸다. 양의 정수해가 있다고 가정하고

C::={cZ+:어떤 양의 정수 a,b 에 대해 4a3+2b3=c3}

라 하자. 가정에 의해 공집합이 아니므로 WOP 에 의해 최소 원소 c 가 있고, 그에 맞는 양의 정수 a, b 가 있다.

좌변이 짝수이므로 c3 이 짝수이고, 따라서 c 가 짝수다. c=2c 라 하면

4a3+2b3=8c32a3+b3=4c3

이다. 이제 b3=4c32a3 이 짝수이므로 b 도 짝수다. b=2b 라 하면

2a3+8b3=4c3a3+4b3=2c3

이다. 또 a3=2c34b3 이 짝수이므로 a 도 짝수다. a=2a 라 하면

8a3+4b3=2c34a3+2b3=c3

이다. a, b, c 는 모두 양의 정수이므로 cC 다. 그런데 c=c/2<c 이므로 c 가 최소라는 데 어긋난다. 모순이다.

따라서 C 는 공집합이고 방정식은 양의 정수해를 갖지 않는다.

이 방법을 무한 강하법(infinite descent)이라 한다. 해가 있으면 더 작은 해를 만들 수 있고, 그러면 끝없이 내려갈 수 있는데 양의 정수에서는 불가능하다는 논리다. 페르마가 즐겨 쓴 수법이고, 결국 정렬성 원리와 같은 이야기다.

예제 23

1,2,4,,2m 원이 든 봉투를 각각 하나씩 받았다. 다음 성질이 모든 음이 아닌 정수 m 에 대해 참임을 정렬성 원리로 증명하라.

성질 m. 2m+1 보다 작은 음이 아닌 임의의 정수를, 봉투 몇 개를 골라 그 금액의 합으로 만들 수 있다.

증명

뼈대는 이렇다. 목표 금액이 2m 보다 작으면 큰 봉투를 안 쓰고 만들 수 있고, 2m 이상이면 큰 봉투를 하나 쓰고 나머지를 만든다. 목표를 둘로 나누는 것이 요점이다.

증명. 성질을 만족하지 않는 m 을 모아 C 라 하고, 공집합이 아니라고 가정하자. WOP 에 의해 최소 원소 c 가 있다.

c>0 이다. m=0 이면 봉투는 1 원짜리 하나뿐이고 만들어야 하는 금액은 2 보다 작은 01 이다. 0 은 아무 봉투도 고르지 않으면 되고 1 은 그 봉투를 고르면 된다. 그러니 0C 이다.

c>0 이므로 c1 은 음이 아닌 정수이고 c 보다 작으므로 c1C 다. 즉 봉투 1,2,,2c12c 보다 작은 모든 금액을 만들 수 있다.

이제 0n<2c+1 인 금액 n 을 아무거나 잡고 두 경우로 나눈다.

경우 1: n<2c. c1 에서 성질이 성립하므로 1,,2c1 중 몇 개로 n 을 만들 수 있다. 그 조합은 1,,2c 중에서 고른 것이기도 하다.

경우 2: 2cn<2c+1. 그러면 0n2c<2c 이므로 경우 1 과 같은 이유로 1,,2c1 중 몇 개로 n2c 를 만들 수 있다. 거기에 2c 봉투를 더하면 n 이 된다.

두 경우가 빠짐없으므로 2c+1 보다 작은 모든 금액을 만들 수 있고, 이는 c 가 성질을 만족한다는 말이다. cC 라는 데 어긋난다. 모순이다.

따라서 C 는 공집합이고 성질은 모든 m 에 대해 참이다.

이 성질이 곧 모든 음이 아닌 정수를 이진법으로 쓸 수 있다는 말이다. 봉투를 고르는 것이 비트를 1 로 놓는 것이다. 6장에서 이 대응을 다시 만난다.

소인수분해는 존재한다

1 보다 큰 모든 정수가 소수의 곱으로 유일하게 쓰인다는 것을 산술의 기본정리라 한다. 익숙한 사실이지만 두 부분으로 나뉜다 — 그런 분해가 존재한다는 것과, 그것이 유일하다는 것이다. 유일성은 11장에서 증명한다. 존재는 정렬성 원리로 지금 증명할 수 있다.

왼쪽 나무가 언제나 끝난다는 것이 증명해야 할 내용이다. 오른쪽 여섯 단계에서 초록 줄이 ‘n 보다 작은 곳에서는 참’ 이라는 정보를 쓰는 자리다
<왼쪽 나무가 언제나 끝난다는 것이 증명해야 할 내용이다. 오른쪽 여섯 단계에서 초록 줄이 ‘n 보다 작은 곳에서는 참’ 이라는 정보를 쓰는 자리다>[원본 보기]

예제 24

1 보다 큰 모든 정수는 소수들의 곱으로 쓸 수 있음을 증명하라. 소수 하나는 길이 1 인 곱으로 본다.

증명

뼈대는 이렇다. 가장 작은 반례를 잡으면 그것은 소수가 아니므로 더 작은 두 정수의 곱이다. 두 조각은 더 작으니 반례가 아니고, 각각의 소수 분해를 이어 붙이면 원래 수의 분해가 된다.

증명. 소수들의 곱으로 쓸 수 없는 1 보다 큰 정수를 모아 C 라 하고, 공집합이 아니라고 가정하자. C 는 하계 2 를 갖는 정수 집합이므로 최소 원소 n 을 갖는다.

n 은 소수가 아니다. 소수는 길이 1 인 곱으로 보기로 했으므로 소수는 C 에 들어갈 수 없다.

n>1 이고 소수가 아니므로 n=ab 이면서 1<a<n, 1<b<n 인 정수 a, b 가 있다. abC 의 최소 원소보다 작으므로 aC 이고 bC 다. 즉

a=p1p2pk,b=q1q2q

로 소수들의 곱으로 쓸 수 있다. 그러면

n=ab=p1pkq1q

이므로 n 도 소수들의 곱이다. nC 라는 데 어긋난다. 모순이다.

따라서 C 는 공집합이고 주장이 성립한다.

앞의 예제들과 다른 점이 하나 있다. c1 이나 c3 처럼 정해진 만큼 내려가지 않고, n 을 둘로 쪼개 어디로 내려갈지 모르는 채로 내려갔다. 이런 자리에서 정렬성 원리가 특히 편하다. 한 걸음이 한 칸이 아니어도 "더 작다"는 것만 확실하면 되기 때문이다.

보충

모든 음이 아닌 정수 n 에 대하여 n3n/3 임을 정렬성 원리로 증명하라.

증명

지수에 분수가 있어 다루기 어렵다. 양변을 세제곱하면 부등호 방향이 유지되므로(양변이 음이 아니다) 다음과 동치다.

n33n

뼈대는 이렇다. 최소 반례 c 에서 c1 의 부등식을 쓰고, (c/(c1))33 을 넘지 않는지 확인한다.

증명. 작은 값을 먼저 확인한다. n=0: 01. n=1: 13. n=2: 89. n=3: 2727. 모두 성립한다.

반례를 모아 C 라 하고 공집합이 아니라고 가정하면 최소 원소 c 가 있고, 위의 확인에 의해 c4 다. c13 이고 c1C 이므로

(c1)33c1

이다. 양변에 (cc1)3>0 을 곱하면

c3(cc1)33c1

이다. 이제 괄호 안을 재 보자. c4 이므로

cc1=1+1c11+13=43

이고, 따라서 (cc1)36427<8127=3 이다. 이를 위 부등식에 넣으면

c364273c1<33c1=3c

이므로 c 에서 부등식이 성립한다. cC 라는 데 어긋난다. 모순이다.

c4 를 확보하려고 네 값을 확인한 것이 결정적이었다. c=2 였다면 c/(c1)=2 이고 23=8>3 이라 논증이 통하지 않는다. 확인할 초기값의 개수는 문제가 정한다.

정렬집합

정렬성 원리가 말하는 성질에 이름을 붙여 두자. 실수 집합이 정렬집합(well ordered set)이라는 것은 그 집합의 공집합이 아닌 모든 부분집합이 최소 원소를 갖는다는 뜻이다.

정렬성 원리는 N 이 정렬집합이라는 주장이다. 앞에서 이미 몇 가지를 더 알아냈다.

집합정렬집합인가
음이 아닌 정수 N그렇다 — 이것이 정렬성 원리다
하계를 갖는 정수 집합그렇다
공집합이 아닌 유한한 실수 집합그렇다
rN={rn:nN} (r>0)그렇다 — r 로 나누면 N 이다
음의 정수아니다 — 아래로 끝없이 내려간다
음이 아닌 유리수아니다 — 최소 원소 0 은 있지만 양의 유리수 부분집합에 최소가 없다

마지막 줄이 정의를 정확히 읽어야 하는 자리다. 집합 자체에 최소 원소가 있는 것으로는 정렬집합이 되지 않는다. 모든 부분집합이 최소 원소를 가져야 한다.

예제 26

공집합이 아닌 유한한 실수 집합은 정렬집합임을 증명하라.

증명

유한집합의 부분집합은 유한하므로 "공집합이 아닌 유한집합에는 최소 원소가 있다"만 증명하면 된다.

무엇에 WOP 를 걸지 고른다. 집합의 원소들은 실수라 정렬성 원리를 쓸 수 없다. 대신 집합의 크기가 음이 아닌 정수다.

증명. 최소 원소가 없는 크기 n 의 집합이 존재하는 양의 정수 n 을 모아 C 라 하고, 공집합이 아니라고 가정하자. WOP 에 의해 최소 원소 m 이 있다.

크기 1 인 집합은 그 하나뿐인 원소가 최소 원소이므로 1C 이고, 따라서 m2 다.

크기 m 인 실수 집합 F 를 잡자. F 에 최소 원소가 있음을 보이면 모순이 된다. F 의 원소 하나를 r0 라 하고 그것을 뺀 집합을 F 라 하면, m2 이므로 F 는 공집합이 아니고 크기가 m1<m 이다. mC 의 최소 원소이므로 m1C 이고, 따라서 F 에는 최소 원소 r1 이 있다.

이제 r0r1 중 작은 쪽이 F 의 최소 원소다. F 의 원소는 r0 이거나 F 의 원소이고, 후자는 모두 r1 이상이기 때문이다.

그러면 mC 라는 데 어긋난다. 모순이므로 C 는 공집합이다.

여기서 WOP 를 집합의 원소가 아니라 집합의 크기에 걸었다는 점이 중요하다. 증명하려는 대상이 정수가 아닐 때 정수인 무언가를 찾아 그것에 WOP 를 거는 것이 이 방법의 응용 요령이다.

계산이 끝난다는 증명

정렬집합이 컴퓨터과학에서 쓰이는 자리가 있다. 계산이 영원히 돌지 않는다는 증명이다.

발상은 이렇다. 계산의 각 단계에 값을 하나 매기는데, 한 걸음 갈 때마다 그 값이 반드시 줄어들게 매긴다. 그 값들이 정렬집합에서 나온 것이면 계산은 반드시 끝난다. 끝나지 않는다면 그 값들이 최소 원소 없는 부분집합을 만들 텐데, 정렬집합에서는 그럴 수 없기 때문이다.

왼쪽은 정수 위에서 내려가다 0 에 닿아 멈추고, 오른쪽은 유리수 위에서 끝없이 내려간다. 계산의 종료를 보이려면 왼쪽 같은 값을 찾아야 한다
<왼쪽은 정수 위에서 내려가다 0 에 닿아 멈추고, 오른쪽은 유리수 위에서 끝없이 내려간다. 계산의 종료를 보이려면 왼쪽 같은 값을 찾아야 한다>[원본 보기]

예제 27

두 양의 정수 a, b 가 주어졌을 때 다음 절차를 생각하자. 두 수가 같으면 멈추고, 다르면 큰 쪽에서 작은 쪽을 뺀 값으로 큰 쪽을 바꾼다. 이 절차가 어떤 a, b 에서 출발해도 반드시 멈춤을 증명하라.

증명

뼈대는 이렇다. 한 걸음마다 반드시 줄어드는 음이 아닌 정수를 찾는다. 여기서는 두 수의 합이 그 값이다.

증명. 절차의 각 단계에서 두 수의 합 a+b 를 그 단계의 측도로 삼는다. 두 수가 양의 정수이므로 측도는 언제나 음이 아닌 정수다.

한 걸음 갈 때 무슨 일이 일어나는지 보자. a>b 라 하면 새 상태는 (ab,b) 이고 측도는 a 다. b>0 이므로

a<a+b

이고 측도가 반드시 줄어든다. b>a 인 경우도 대칭이다. 또 뺀 결과 aba>b 이므로 양수이고, 그래서 다음 단계의 측도도 음이 아니다.

이제 절차가 멈추지 않는다고 가정하자. 그러면 측도의 값들이 끝없이 이어지는 감소열

m0>m1>m2>

을 이루고, 이 값들을 모은 집합은 음이 아닌 정수로 된 공집합이 아닌 집합인데 최소 원소가 없다. 어떤 mk 를 잡아도 mk+1 이 더 작기 때문이다. 이는 정렬성 원리에 어긋난다. 모순이다.

따라서 절차는 반드시 멈춘다.

이 절차가 무엇을 계산하는지도 말해 둔다. 멈출 때의 값은 ab 의 최대공약수다. 그 사실은 11장에서 증명하고, 이런 "측도가 줄어든다"는 논증을 체계적으로 다루는 것은 8장의 상태 기계다. 여기서는 종료성이 정렬집합의 성질에서 나온다는 것만 확인해 두면 된다.

정렬성 원리와 귀납법

기초수학에서 배운 수학적 귀납법과 이 장의 정렬성 원리는 닮았다. 실은 같은 힘을 갖는다. 한쪽으로 증명할 수 있는 것은 다른 쪽으로도 증명할 수 있다. 그것을 서로 유도하는 일은 7장에서 한다.

두 방법은 같은 사실을 반대 방향에서 쓴다. 세 번째 열이 각 방법이 잘 맞는 자리이고, 아래 두 메모가 번역하는 법이다
<두 방법은 같은 사실을 반대 방향에서 쓴다. 세 번째 열이 각 방법이 잘 맞는 자리이고, 아래 두 메모가 번역하는 법이다>[원본 보기]

지금 알아 둘 것은 번역하는 법이다. 귀납 증명에서 "P(k) 를 가정한다"는 것은 WOP 증명에서 "c 보다 작은 곳에서는 참이다"와 같은 정보다. 귀납법의 출발 단계(P(0) 확인)는 WOP 증명에서 "c>0 이다"를 확보하는 자리에 대응한다.

그러면 왜 둘을 다 배우는가. 한 걸음의 크기가 정해져 있지 않을 때 WOP 가 편하다. 소인수분해 예제에서 n 을 둘로 쪼갰던 것을 떠올려 보자. n 에서 n1 로 내려가는 것이 아니라 어디로 갈지 모르는 채로 내려갔다. 귀납법으로도 할 수 있지만 "강한 귀납법"이라는 다른 모양이 필요하다. 그 이야기가 7장이다.

반대로 합의 공식처럼 n 에서 n+1 로 가는 길이 뻔한 문제에서는 귀납법이 짧다.

오류 찾기

피보나치 수는 F(0)=0, F(1)=1, 그리고 n>1 일 때 F(n)=F(n1)+F(n2) 로 정의된다. 다음 "증명"은 모든 피보나치 수가 짝수라고 주장한다. 몇째 문장에 논리적 잘못이 있는가.

  1. 정렬성 원리로 증명한다.
  2. E(n) 을 "F(n) 이 짝수다"라 하자.
  3. 반례를 모아 C::={nN:¬E(n)} 라 한다.
  4. 모순을 노려 C 가 공집합이 아니라고 가정한다.
  5. WOP 에 의해 C 의 최소 원소 m 이 있다.
  6. F(0)=0 은 짝수이므로 m>0 이다.
  7. m 이 최소 반례이므로 m 보다 작은 모든 k 에 대해 F(k) 는 짝수다.
  8. 특히 F(m1)F(m2) 는 둘 다 짝수다.
  9. 정의에 의해 F(m) 은 짝수 둘의 합이므로 짝수다.
  10. E(m) 이 참이다.
  11. 이는 ¬E(m) 이라는 m 의 정의에 어긋난다.
  12. 모순이므로 C 는 공집합이고, 모든 n 에 대해 F(n) 은 짝수다.
풀이 보기

결론부터 보면 거짓이다. F(1)=1 은 홀수다. 그러니 어딘가 틀렸다.

한 문장씩 보자. ①부터 ⑦까지는 정형 그대로이고 문제가 없다. ⑦은 최소 원소의 뜻에서 바로 나온다.

⑧이 틀렸다. ⑦은 "m 보다 작은 음이 아닌 k 에 대해"를 말한 것인데, ⑧은 그것을 m1m2 에 적용했다. m=1 이면 m2=1 이고 F(1) 은 아예 정의되지 않았다. ⑨의 "정의에 의해"도 n>1 일 때만 쓸 수 있는 것이다.

⑥이 확보한 것은 m>0 뿐이다. ⑧을 쓰려면 m>1 이 필요하고, 그러려면 F(1) 도 짝수임을 확인해야 한다. 그런데 F(1)=1 은 홀수라 그 확인이 실패한다. 실제로 m=1 이 진짜 최소 반례다.

얻을 교훈은 3장의 경우 나누기에서 본 것과 같다. 정의역의 경계를 확인하는 일이 증명의 일부다. 두 칸 뒤를 참조하는 정의라면 초기값 두 개를 확인해야 하고, 세 칸 뒤라면 세 개다. 정형의 ③단계에서 얻는 정보는 "c 보다 작은 음이 아닌 정수에서 참"이지 "c 보다 작은 정수에서 참"이 아니다.

오류 찾기

다음 "증명"은 이 장 앞부분에서 증명한 것과 같은 결론에 이른다. 결론은 맞는데 근거 없는 추론이 있다. 어느 단계인가.

가짜 증명. 기약분수로 쓸 수 없는 양의 유리수 q 가 있다고 가정하자. 그런 유리수를 모아 C 라 하면 qC 이므로 C 는 공집합이 아니다. 그러므로 C 에는 최소 원소 q0 이 있다. q0/2<q0 이므로 q0/2 는 기약분수로 쓸 수 있고, 공통 소인수가 없는 양의 정수 m, n 으로

q02=mn

이라 하자. 경우를 나눈다. n 이 홀수이면 2mn 도 공통 소인수가 없으므로 q0=2m/n 이 기약분수 표현이 되어 모순이다. n 이 짝수이면 mn/2 의 공통 소인수는 mn 의 공통 소인수이기도 하므로 그런 것이 없고, 따라서 q0=m/(n/2) 가 기약분수 표현이 되어 모순이다. 어느 경우에도 모순이므로 C 는 공집합이다.

풀이 보기

결론은 참이고 경우 나누기도 빠짐없다. 두 경우의 약분 논증도 옳다. 그런데 근거 없는 단계가 하나 있다.

"그러므로 C 에는 최소 원소 q0 이 있다"가 근거 없다. C유리수의 집합이고, 정렬성 원리는 음이 아닌 정수 집합에만 쓸 수 있다. 이 장 첫 절에서 양의 유리수 집합에는 최소 원소가 없음을 확인했다.

실제로 C 가 공집합이 아니라면 최소 원소가 있을 이유가 전혀 없다. 어떤 qC 를 잡아도 더 작은 원소가 있을 수 있고, 그것이 유리수의 성질이다.

그러면 이 증명을 고칠 수 있는가. 고칠 수 있다. 앞에서 한 대로 유리수를 모으지 말고 분자를 모으면 된다. 분자는 양의 정수이므로 최소 원소가 있고, 나머지 논증은 그대로 쓸 수 있다.

여기서 얻을 것은 4장 전체의 요점이다. 정렬성 원리를 쓰려면 무엇에 쓰는지가 먼저 정해져야 한다. 집합만 만들어 놓고 "WOP 에 의해"라고 쓰는 것이 이 장에서 가장 흔한 잘못이다.

이 장에서 새로 나온 것

용어·기호
정렬성 원리(WOP)음이 아닌 정수로 된 공집합이 아닌 집합은 최소 원소를 갖는다
정렬집합(well ordered set)공집합이 아닌 모든 부분집합이 최소 원소를 갖는 실수 집합
하계 · 상계집합의 모든 원소 이하인 수 · 이상인 수. 집합에 속할 필요는 없다
WOP 증명의 정형반례 집합 → 공집합이 아니라 가정 → 최소 원소 → 모순 → 공집합
무한 강하법해가 있으면 더 작은 해가 있다는 논증. WOP 와 같은 이야기다
측도(measure)한 걸음마다 줄어드는 값. 정렬집합에서 값을 잡으면 종료성이 나온다
Z+양의 정수 전체
jk · jkjk 를 나눈다 · 나누지 않는다
줄임표(ellipsis) 함정1+2++nn=1 에서 항이 하나, n=0 에서 항이 없다(합은 0)

챙겨 갈 것은 넷이다.

다음 장에서는 방향을 바꾼다. 지금까지는 증명을 쓰는 이야기였고, 5장은 증명에 쓰이는 문장 자체를 다룬다. "또는"이 정확히 무슨 뜻인지, "P 이면 Q"가 P 가 거짓일 때 왜 참인지, 그리고 어떤 논리식이 참이 될 수 있는지 기계가 판정할 수 있는지를 묻는다. 마지막 물음이 컴퓨터과학의 가장 큰 미해결 문제로 이어진다.

논리식

사람들이 일상어의 애매함을 견디고 사는 것은 놀라운 일이다. 다음 문장들을 보자.

평범한 대화에서는 이 정도 흔들림이 문제가 되지 않는다. 그러나 수학이나 프로그램에서는 문장의 뜻이 하나로 정해져야 한다. 그래서 이 장은 앞의 세 장과 방향이 다르다. 3장과 4장은 증명을 쓰는 이야기였고, 이 장은 증명에 쓰이는 문장 자체를 다룬다. 답할 질문은 넷이다. 연산자들의 뜻을 어떻게 못 박는가. 언제 두 문장이 같은 뜻인가. 어떤 문장이 참이 될 수 있는지 기계가 판정할 수 있는가. 그리고 "모든"과 "어떤"을 섞을 때 순서가 왜 뜻을 바꾸는가.

기초수학의 명제 장에서 진리표와 ¬, 드모르간 법칙, 를 이미 봤다. 여기서 새로 세우는 것은 타당성·만족가능성, 정규형(CNF·DNF), 그리고 그것을 판정하는 문제의 어려움이고, 셋째 물음의 답이 컴퓨터과학에서 가장 큰 미해결 문제로 이어진다.

명제에서 명제를 만든다

연산자들의 뜻은 진리표로 못 박는다. 진리표는 성질이 아니라 정의다. 변수가 n 개면 따져야 할 배정이 2n 가지이고, 그 전부를 적으면 정의가 완결된다.

여기서는 명제의 속을 보지 않는다. "2+3=5"인지 "모든 사람은 죽는다"인지는 상관없고, 참·거짓 두 값만 갖는 명제 변수 P, Q 로 다룬다. 불(Boole)의 이름을 따 불 변수(Boolean variable)라고도 한다.

이름기호언제 참인가
부정 NOT¬PP 가 거짓일 때
논리곱 ANDPQ둘 다 참일 때
논리합 ORPQ적어도 하나가 참일 때 — 둘 다여도 참
배타적 논리합 XORPQ정확히 하나만 참일 때
동치 IFFPQ진리값이 같을 때
함의 IMPLIESPQP 가 거짓이거나 Q 가 참일 때

도입부 첫 문장의 애매함이 셋째 줄에서 해결된다. 수학의 둘 다여도 참이므로 "케이크를 먹어도 되고 아이스크림을 먹어도 된다"를 로 옮기면 둘 다 먹어도 된다는 뜻이 되고, 하나만 골라야 한다면 를 써야 한다.

함의 — 가장 걸리는 곳

마지막 줄이 이 절에서 유일하게 직관과 어긋나는 자리다. 표의 문장을 다시 읽어 두자. 함의는 "만약" 부분이 거짓이거나 "그러면" 부분이 참일 때 정확히 참이다.

거짓이 되는 줄은 (참거) 하나뿐이다. 아래쪽 명세 이야기가 이렇게 정한 이유다 — 조건이 성립하지 않은 규칙들이 자동으로 참이 되어야 열두 규칙을 하나의 식으로 묶을 수 있다
<거짓이 되는 줄은 (참거) 하나뿐이다. 아래쪽 명세 이야기가 이렇게 정한 이유다 — 조건이 성립하지 않은 규칙들이 자동으로 참이 되어야 열두 규칙을 하나의 식으로 묶을 수 있다>[원본 보기]

왜 이렇게 정하는가. 기초수학에서는 "약속을 어긴 경우가 하나뿐"이라는 비유로 설명했다. 여기서는 더 실용적인 이유를 든다. 여러 규칙을 하나의 식으로 묶고 싶기 때문이다. 어떤 시스템의 명세가 열두 줄이라고 하자. "센서가 상태 i 이면 시스템은 동작 i 를 한다." Ci 를 "센서가 상태 i 다", Ai 를 "시스템이 동작 i 를 한다"라 하면 명세 전체는 이렇게 적힌다.

(C1A1)(C2A2)(C12A12)

이제 센서가 상태 2 와 상태 5 에만 있고 시스템이 동작 2 와 동작 5 만 했다고 하자. 명세를 지킨 것이므로 위 식이 참이어야 한다. C2A2C5A5 는 문제가 없는데, 가정이 거짓인 나머지 열 개의 함의도 참이 되어야 한다. 표의 아래 두 줄이 정확히 그 일을 한다.

대가가 있다. 수학의 함의는 인과관계를 무시한다. "보안 절차를 지키면 계정이 털리지 않는다"는 받아들일 만하지만 "돼지가 날 수 있다면 계정이 털리지 않는다"도 수학적으로는 참인 함의다. 억지라고 느끼는 것이 정상이다. 다만 인과를 빼면 규칙이 훨씬 단순해지고, 위의 명세처럼 실제로 쓸모가 있다.

예제 30

다음 명제의 진리값을 판정하라. (가) 골드바흐 추측이 참이면 모든 실수 x 에 대해 x20 이다. (나) 골드바흐 추측이 참이면 어떤 실수 x 에 대해 x2<0 이다. (다) 2100+1 이 소수이면 돼지가 난다.

풀이 보기

골드바흐 추측이 참인지 아무도 모르는데도 (가)와 (다)는 판정할 수 있다.

(가) 참이다. 결론 "모든 실수 x 에 대해 x20"이 참이므로, 가정이 참이든 거짓이든 진리표의 (참참) 줄이거나 (거참) 줄이다. 둘 다 함의가 참이다.

(나) 판정할 수 없다. 결론이 거짓이므로 (참거) 줄이거나 (거거) 줄이다. 앞쪽이면 거짓, 뒤쪽이면 참이다. 골드바흐 추측의 진리값을 알아야 답이 나온다.

(다) 참이다. 2100+1=(220)5+1220+1 로 나누어떨어져 소수가 아니다. 가정이 거짓이므로 함의는 참이다.

(가)가 이 예제의 핵심이다. 결론이 참이기만 하면 가정이 무엇이든 함의는 참이다. 이것이 "인과관계를 무시한다"는 말의 실제 모습이다.

예제 31

수학자가 학생에게 "함수가 연속이 아니면 미분가능하지 않다"고 말했다. D 를 "미분가능하다", C 를 "연속이다"라 하면 이 말의 옳은 번역은 ¬C¬D, 즉 DC 뿐이다.

그런데 어머니가 아이에게 "숙제를 안 하면 TV 를 못 본다"고 말했다. H 를 "숙제를 했다", T 를 "TV 를 볼 수 있다"라 하면 이 말의 합당한 번역은 ¬H¬T, 즉 HT 다.

같은 IF-THEN 구조인데 왜 하나는 함의로, 다른 하나는 동치로 옮기는 것이 합당한가?

풀이 보기

차이는 논리가 아니라 말하는 사람이 무엇을 함께 뜻하고 있는가에 있다.

수학자의 말은 딱 그만큼이다. 연속이 미분가능의 필요조건이라는 것 말고 아무것도 주장하지 않는다. 연속인데 미분가능하지 않은 함수는 실제로 있고(|x| 가 그렇다), 수학자는 그것을 알고 있다. 그러니 CD 는 주장하지 않는다.

어머니의 말은 다르다. 아이가 "숙제를 했는데도 TV 를 못 보게 하려나?"라고 되묻지 않는다는 데서 알 수 있다. 어머니는 "숙제를 하면 TV 를 볼 수 있다"도 함께 약속한 것이고, 그래서 (¬H¬T)(HT)HT 가 된다.

이 예제가 말하는 것은 번역이 기계적인 작업이 아니라는 것이다. 일상어를 논리식으로 옮길 때는 문장 밖에 있는 뜻까지 읽어야 한다. 그리고 그 읽기가 끝난 뒤부터는 기계적이다. 그래서 이 문서는 애매함을 남기지 않으려고 처음부터 기호로 적는다.

프로그램의 조건문이 곧 논리식이다

논리 연산자는 프로그램 안에 이미 들어 있다. 다음 조건문을 보자.

↓ python

if x > 0 or (x <= 0 and y > 100): 처리한다()

A 를 "x>0", B 를 "y>100"이라 하면 조건은 왼쪽처럼 적히는데, 진리표를 채워 보면 오른쪽과 진리값이 언제나 같다.

A(¬AB)AB

안쪽 괄호부터 한 열씩 채우면 마지막 두 열이 네 줄 모두 같아진다. 이것이 두 식이 동치라는 증거다
<안쪽 괄호부터 한 열씩 채우면 마지막 두 열이 네 줄 모두 같아진다. 이것이 두 식이 동치라는 증거다>[원본 보기]

두 식의 진리값이 언제나 같으면 동치(equivalent)라 한다. 그러면 조건문을 줄여도 동작이 달라지지 않는다.

↓ python

if x > 0 or y > 100: 처리한다()

진리표 말고 경우 나누기로도 확인할 수 있다. A 가 참이면 A무엇이든 은 참이므로 두 식 모두 참이다. A 가 거짓이면 AXX 와 같은 값이므로 왼쪽은 ¬AB 와, 즉 B 와 같고, 오른쪽도 B 와 같다.

이 일이 왜 중요한가. 프로그램에서는 읽기 쉬워지고 연산이 줄어든다. 하드웨어에서는 게이트가 줄어든다.

위와 아래는 같은 값을 내는데 게이트가 셋에서 하나로 줄었다. 칩 면적·소비 전력·불량률·제조 원가가 모두 게이트 수에 붙는다
<위와 아래는 같은 값을 내는데 게이트가 셋에서 하나로 줄었다. 칩 면적·소비 전력·불량률·제조 원가가 모두 게이트 수에 붙는다>[원본 보기]

기호가 여럿인 이유

같은 연산에 분야마다 다른 기호를 쓴다. 처음 만나면 헷갈리니 정리해 둔다.

연산수학Java · C회로 설계
NOT P¬P 또는 P!PP
P AND QPQP && QPQ
P OR QPQP || QP+Q
P IMPLIES QPQ(없다)(없다)
P XOR QPQP ^ QPQ

회로 설계에서 AND 를 곱, OR 를 합이라 부르는 것이 우연이 아니다. 다음 절의 대수 규칙을 보면 실제로 곱셈·덧셈과 닮은 데가 많다. 이 문서는 식이 길어질 때 기호를 쓰고 설명할 때 AND·OR 같은 말을 쓴다.

예제 32

다음 조건문을 게이트 수가 더 적은 동치식으로 줄여라. A 는 "x 가 짝수", B 는 "x>10"이다.

↓ python

if (A and B) or (A and not B): 처리한다()
풀이 보기

진리표로 확인해도 되지만 여기서는 대수 규칙으로 푼다. A 로 묶는다.

(AB)(A¬B)A(B¬B)

분배법칙을 거꾸로 쓴 것이다. 그런데 B¬B 는 언제나 참이므로 T 로 바꿀 수 있고, ATA 다. 따라서 조건은 그냥 A 다.

게이트 수를 세어 보면 원래는 NOT 하나, AND 둘, OR 하나로 넷이었고 줄인 뒤는 없다. B 는 아예 계산할 필요가 없다. 검산하면 B 가 참일 때 첫 항이, 거짓일 때 둘째 항이 각각 A 와 같으므로 어느 경우에도 전체가 A 와 같다.

실제 코드에서 이런 모양이 나오는 것은 조건을 나중에 덧붙이다 생긴 흔적인 경우가 많다. 식을 줄이는 일은 그런 흔적을 찾아내는 일이기도 하다.

예제 33

이진수 덧셈을 하는 반가산기를 생각하자. 입력은 비트열 ana1a0 과 비트 하나 b 이고, 출력은 비트열 sns1s0 과 마지막 자리올림 c 다. 각 자리의 논리식을 쓰고, 그것이 곧 프로그램임을 보여라.

풀이 보기

손으로 이진수 덧셈을 하는 절차를 그대로 옮기면 된다. 각 자리에서 "그 자리 비트와 들어온 자리올림을 더해, 합 비트와 나가는 자리올림을 만든다."

cii 번 자리로 들어오는 자리올림이라 하자. 0 번 자리로 들어오는 것은 b 다.

c0=b,si=aici,ci+1=aici,c=cn+1

왜 이 식인가. 한 자리에서 더할 것이 aici 둘뿐이므로 합 비트는 둘 중 하나만 1 일 때 1 이고(그것이 XOR), 자리올림은 둘 다 1 일 때 생긴다(그것이 AND). 이 네 줄을 그대로 코드로 옮기면 이렇게 된다.

↓ python

def 반가산기(a, b): # a 는 비트 리스트(낮은 자리부터), b 는 비트 하나 c = b # 0 번 자리로 들어오는 자리올림 s = [] for i in range(len(a)): s.append(a[i] ^ c) # XOR — 합 비트 c = a[i] & c # AND — 다음 자리로 넘어가는 자리올림 return c, s # 마지막 자리올림과 합 비트열

연산 횟수를 세면 XOR 가 n+1 번, AND 가 n+1 번이다. 그런데 회로로 보면 이 설계에는 약점이 있다. ci+1 을 계산하려면 ci 를 먼저 알아야 하므로 자리올림이 왼쪽으로 하나씩 번져 나간다. 그래서 입력 비트 수를 두 배로 하면 걸리는 시간도 두 배가 된다. 이런 회로를 자리올림 전파(ripple-carry) 가산기라 하고, 실제 프로세서는 자리올림을 미리 계산해 이 지연을 줄인다. 그 대가로 회로가 훨씬 복잡해진다.

여기서 확인할 것은 하나다. 논리식과 프로그램과 회로가 같은 것을 세 가지 방식으로 적은 것이라는 점이다.

동치와 타당성

타당한(valid) 식은 변수에 무엇을 배정하든 참인 식이다. 가장 단순한 예가 P¬P 다. 타당한 식은 논리의 근본 진리를 담고 있다고 볼 수 있다. 예를 들어 "PQ 를 함의하고 QR 를 함의하면 PR 를 함의한다"는 것은 다음 식이 타당하다는 말이다.

[(PQ)(QR)](PR)

만족가능한(satisfiable) 식은 참이 되게 하는 배정이 하나라도 있는 식이다. 참이 되는 배정을 만족 배정이라 한다. 세 개념의 관계를 정리해 둔다.

식은 세 무리로 갈린다. 부정을 붙이면 왼쪽 끝과 오른쪽 끝이 서로 바뀐다 — 이 한 줄이 타당성 판정과 만족가능성 판정을 같은 문제로 만든다
<식은 세 무리로 갈린다. 부정을 붙이면 왼쪽 끝과 오른쪽 끝이 서로 바뀐다 — 이 한 줄이 타당성 판정과 만족가능성 판정을 같은 문제로 만든다>[원본 보기]

마지막 줄이 이 장 뒷부분의 열쇠다. 타당성 판정과 만족가능성 판정은 부정 기호 하나로 서로 옮겨 갈 수 있다. 한쪽이 쉬우면 다른 쪽도 쉽고, 한쪽이 어려우면 다른 쪽도 어렵다.

예제 34

다음 각 식이 타당한가, 만족가능하지만 타당하지 않은가, 만족 불가능한가. 만족가능한 것은 만족 배정을 하나 들어라.

()MQ()M[M(PM)]()(PQ)(PQ)()(PQ)(PQ)

풀이 보기

방법은 하나다. 거짓이 되는 배정과 참이 되는 배정을 각각 찾아본다.

(가) 만족가능하지만 타당하지 않다. M=T,Q=F 이면 거짓이고, M=F 이면 참이다.

(나) 타당하다. M 이 거짓이면 함의가 참이다. M 이 참이면 결론을 보자. M 이 참이고 PM 은 결론이 참이므로 참이다. 그러니 결론 M(PM) 이 참이다. 어느 경우에도 참이다.

(다) 타당하다. PQ 가 참이면 정확히 하나가 참이므로 적어도 하나가 참이고, 따라서 PQ 가 참이다. PQ 가 거짓이면 가정이 거짓이라 함의가 참이다.

(라) 만족가능하지만 타당하지 않다. P=T,Q=F 이면 가정이 참이고 결론이 거짓이라 거짓이다. P=Q=T 이면 참이다.

(나)와 (다)에서 쓴 방법을 눈여겨보자. 진리표를 다 채우지 않고 가정이 거짓인 경우와 참인 경우로 나눴다. 변수가 셋이면 여덟 줄이고 넷이면 열여섯 줄이니, 경우 나누기가 훨씬 빠르다.

예제 35

어떤 메시지 처리 시스템의 명세가 다음과 같다. 이 명세들을 모두 만족하는 상태가 있는가? 있다면 그것이 유일한가?

  1. 파일 시스템이 잠겨 있지 않으면 (가) 새 메시지는 대기열에 들어가고, (나) 새 메시지는 버퍼로 보내지며, (다) 시스템이 정상 동작한다. 또 시스템이 정상 동작하면 파일 시스템은 잠겨 있지 않다.
  2. 새 메시지가 대기열에 들어가지 않으면 버퍼로 보내진다.
  3. 새 메시지는 버퍼로 보내지지 않는다.
풀이 보기

먼저 변수를 정한다. L 은 "파일 시스템이 잠겨 있다", Q 는 "새 메시지가 대기열에 들어간다", B 는 "새 메시지가 버퍼로 보내진다", N 은 "시스템이 정상 동작한다"다.

명세를 식으로 옮긴다. 1의 (다)와 그 역이 함께 있으므로 동치가 된다.

¬LQ,¬LB,¬LN,¬QB,¬B

이제 다섯 식이 모두 참이 되게 배정을 찾는다. 값이 강제되는 것부터 정하는 것이 요령이다. 다섯째 식에서 B=F 다. 이것이 유일하게 확정된 출발점이다.

둘째 식 ¬LB 는 결론이 거짓이므로 가정도 거짓이어야 한다. 즉 L=T 다. 그러면 셋째 식 ¬LN 의 왼쪽이 거짓이므로 N=F 다. 넷째 식 ¬QB 도 결론이 거짓이므로 ¬Q=F, 곧 Q=T 다. 남은 첫째 식 ¬LQ 는 가정이 거짓이므로 참이다.

따라서 만족 배정은 L=T,Q=T,B=F,N=F 이고, 매 단계에서 값이 강제되었으므로 유일하다.

읽어 보면 이렇다. 명세를 지키는 유일한 방법은 파일 시스템을 잠그고 시스템을 비정상 상태로 두는 것이다. 설계자가 의도한 바는 아닐 것이다. 명세가 만족가능한지 확인하는 일이 설계의 첫 단계이고, 만족가능해도 그 배정이 뜻하는 바를 읽어야 한다.

명제의 대수

진리표는 정확하지만 금방 한계에 부딪힌다. 변수 30 개면 줄이 10억 개가 넘는다. 그래서 식을 대수적으로 변형해 동치를 확인하는 길이 필요하다.

먼저 연산자를 셋으로 줄인다. , , 는 모두 , , ¬ 로 쓸 수 있다. 예를 들어 PQ¬PQ 다. 그다음 아래 규칙들이 필요한 전부이고, 각각은 진리표 네 줄로 확인된다.

이름규칙
교환법칙PQQP
결합법칙(PQ)RP(QR)
항등원TPP
영원FPF
AND 가 OR 에 분배P(QR)(PQ)(PR)
OR 가 AND 에 분배P(QR)(PQ)(PR)
멱등법칙PPP
모순율P¬PF
배중률P¬PT
이중부정¬¬PP
드모르간 (AND)¬(PQ)¬P¬Q
드모르간 (OR)¬(PQ)¬P¬Q

에 대한 대응 규칙들도 같은 모양으로 성립하므로 따로 적지 않았다. 산술과 다른 점이 둘이다. 첫째, 분배법칙이 양쪽으로 성립한다. 산술에서는 a(b+c)=ab+ac 만 되고 a+bc=(a+b)(a+c) 는 안 되지만, 논리에서는 둘 다 된다. 둘째, 멱등법칙이 있다. 같은 것을 두 번 묶어도 늘지 않는다.

정규형 — DNF 와 CNF

어떤 식이든 정해진 두 모양 중 하나로 바꿀 수 있다. 변수나 그 부정을 리터럴(literal)이라 한다. 서로 다른 변수의 리터럴을 로 묶은 것을 AND 절, 로 묶은 것을 OR 절이라 한다. AND 절들을 로 묶은 식을 선언 정규형(DNF, disjunctive normal form), OR 절들을 로 묶은 식을 연언 정규형(CNF, conjunctive normal form)이라 한다.

참인 줄마다 AND 절 하나가 나오고 그것들을 OR 로 묶으면 DNF 다. 거짓인 줄에서는 리터럴의 부호를 모두 뒤집어 OR 절을 만들고 AND 로 묶으면 CNF 다
<참인 줄마다 AND 절 하나가 나오고 그것들을 OR 로 묶으면 DNF 다. 거짓인 줄에서는 리터럴의 부호를 모두 뒤집어 OR 절을 만들고 AND 로 묶으면 CNF 다>[원본 보기]

예제 36

A(BC) 의 DNF 와 CNF 를 진리표에서 읽어내라. 그리고 CNF 를 만들 때 부호를 뒤집는 이유를 설명하라.

증명

진리표를 채우면 여덟 줄 중 세 줄에서 참이다. A 가 참이고 BC 중 하나 이상이 참인 줄들이다. DNF. 참인 세 줄이 각각 "A 참, B 참, C 참", "A 참, B 참, C 거짓", "A 참, B 거짓, C 참"이므로

(ABC)(AB¬C)(A¬BC)

다. 이 식이 원래 식과 동치인 이유는 각 AND 절이 정확히 한 배정에서만 참이라는 데 있다. 참인 줄의 배정을 넣으면 그 줄의 AND 절이 참이 되어 전체가 참이고, 거짓인 줄의 배정에서는 어떤 AND 절도 참이 되지 않는다.

CNF. 거짓인 다섯 줄을 본다. 예를 들어 "A 참, B 거짓, C 거짓" 줄에 대해서는

¬ABC

라는 OR 절을 만든다. 부호를 뒤집는 이유가 여기 있다. 이 OR 절은 정확히 그 한 배정에서만 거짓이다. A 가 참이면 ¬A 가 거짓, B 가 거짓, C 가 거짓이니 셋 다 거짓이라 OR 가 거짓이다. 다른 배정에서는 적어도 하나가 참이 된다.

그러니 거짓인 다섯 줄에서 얻은 다섯 개의 OR 절을 로 묶으면 그 다섯 배정에서만 거짓인 식, 곧 원래 식이 된다. 요약하면 DNF 는 참이 되는 경우를 다 늘어놓은 것이고, CNF 는 거짓이 되는 경우를 다 막은 것이다. 이 방법이 어떤 진리표에도 통하므로 다음이 성립한다.

모든 논리식은 DNF 로도, CNF 로도 쓸 수 있다.

덧붙여 두면, 어떤 식의 부정에 대한 DNF 를 알고 있으면 CNF 를 계산 없이 얻을 수 있다. 부정의 DNF 전체에 ¬ 를 붙이고 드모르간을 두 번 밀어 넣으면 AND 절이 OR 절로, 로 뒤바뀌어 곧바로 CNF 가 된다.

예제 37

위 방법은 언제나 통하지만 진리표를 다 채워야 한다. 대수 규칙만으로 다음 동치를 증명하라. 이것이 3장에서 여러 번 쓴 식이다.

¬(PQ)P¬Q

증명

뼈대는 이렇다. 먼저 를 없애고, 드모르간으로 부정을 안으로 밀고, 이중부정을 없앤다.

증명.

¬(PQ)¬(¬PQ) — 함의를 ¬ 로 바꿨다.

¬¬P¬Q — OR 에 대한 드모르간.

P¬Q — 이중부정.

세 단계가 전부다. 이 방법이 얼마나 강한가. 위의 규칙만으로 모든 동치를 증명할 수 있다는 것이 알려져 있다. 두 식을 각각 정규형으로 바꾸고 항을 정렬해 중복을 없애면 "표준형"이 나오는데, 두 식이 동치인 것과 표준형이 같은 것이 서로 필요충분이기 때문이다.

다만 김을 빼는 말도 해 두어야 한다. 그 보장된 증명 방법이란 결국 표준형을 만드는 것이고, 표준형은 진리표를 다르게 적은 것이다. 그러니 대수 규칙이 진리표보다 일반적으로 더 빠르지는 않다. 짧은 증명이 나오는 것은 위의 예처럼 운이 좋을 때다.

SAT 문제

앞 절에서 어떤 식이든 두 정규형으로 바꿀 수 있고 진리표에서 직접 읽어낼 수 있음을 봤다. 그런데 만족가능한지는 그렇게 쉽게 보이지 않는다. 어떤 식이 만족가능한지 판정하는 문제를 SAT라 하고, 짧은 식은 눈으로도 되지만 조금 길어지면 사정이 달라진다.

이 장에서 다룬 판정 문제들이 화살표로 서로 옮겨 간다. 하나를 빠르게 풀 수 있으면 나머지도 빠르게 풀 수 있고, 그래서 이것들은 사실상 하나의 문제다
<이 장에서 다룬 판정 문제들이 화살표로 서로 옮겨 간다. 하나를 빠르게 풀 수 있으면 나머지도 빠르게 풀 수 있고, 그래서 이것들은 사실상 하나의 문제다>[원본 보기]

예제 38

다음 식이 만족가능한가. 진리표 여덟 줄을 다 채우지 말고 답하라.

(PQR)(¬P¬Q)(¬P¬R)(¬R¬Q)

풀이 보기

절을 하나씩 말로 읽는다. 첫 절은 "셋 중 적어도 하나가 참"이다. 나머지 세 절은 각각 "PQ 가 함께 참은 아니다", "PR 가 함께 참은 아니다", "RQ 가 함께 참은 아니다"다. 즉 세 변수 중 참인 것이 하나 이하다.

두 조건을 합치면 정확히 하나만 참이다. 그런 배정은 존재한다. P=T,Q=F,R=F 를 넣어 확인하자. 첫 절은 참, 둘째 절은 ¬Q 가 참이라 참, 셋째 절은 ¬R 가 참이라 참, 넷째 절은 둘 다 참이라 참이다. 만족가능하다.

여기서 한 일은 CNF 의 각 절을 제약으로 읽은 것이다. 각 절이 "이 조합은 안 된다"를 하나씩 말해 주므로 CNF 는 이런 읽기에 잘 맞는다. 다만 절이 수천 개이고 변수가 수백 개면 사람이 읽을 수 없다.

그러면 기계는 어떻게 하는가. 가장 단순한 방법은 진리표를 다 채우는 것이고, 그러면 2n 줄이라 시간이 지수적으로 늘어난다. 더 나은 방법이 있는가 — 입력 크기가 s 일 때 s2 이나 s14 처럼 다항 시간에 SAT 를 푸는 방법이 있는가? 다항 시간의 정확한 뜻과 표기법은 알고리즘 문서의 /posts/fundamental/algorithm.html > 점근 표기 절에 있다.

아무도 모른다. 그리고 여기에 걸린 것이 엄청나게 많다. SAT 를 다항 시간에 푸는 방법이 나오면 일정 계획, 경로 찾기, 자원 배분, 회로 검증 같은 문제들이 함께 풀린다. 프로그래밍·대수·금융·정치학에 걸친 수많은 문제가 SAT 로 옮겨 쓸 수 있기 때문이다. 그것은 반가운 일이겠지만 동시에 세계적인 혼란이 온다. 오늘날의 암호가 무너져 온라인 거래가 안전하지 않게 되고 비밀 통신을 누구나 읽을 수 있게 된다.

SAT 를 다항 시간에 풀 수 있는지 묻는 문제를 P 대 NP 문제라 하고, 이론 컴퓨터과학에서 가장 유명한 미해결 문제다. 알고리즘 문서의 /posts/fundamental/algorithm.html > P와 NP 절이 이 문제와 NP-완전을 다루는데, SAT 는 그 이야기의 출발점에 놓인 문제다.

실전 이야기도 해 두자. SAT 해결기(SAT solver)는 회로 검증 같은 실무에서 변수 수백만 개짜리 식도 곧잘 푼다. 다만 어떤 식이 잘 풀릴지 미리 알기 어렵고 만족 불가능한 식에서는 훨씬 약하다. 만족가능하면 배정 하나를 내놓으면 되지만 불가능하다는 것을 보이려면 모든 배정을 배제해야 하기 때문이다.

예제 39

어떤 디지털 회로에 대해 출력이 참이 되는 입력이 있는지 묻는 문제를 회로 SAT라 한다. SAT 를 다항 시간에 풀 수 있으면 회로 SAT 도 다항 시간에 풀 수 있음을 보여라. 단 회로에서 만드는 논리식의 크기가 회로 크기에 비례해야 한다.

증명

뼈대는 이렇다. 배선마다 변수를 하나 두고, 게이트마다 "입력과 출력이 이 관계여야 한다"는 제약식을 하나 쓴다. 그 제약식들을 모두 로 묶고 출력 배선 변수를 하나 더 붙이면 된다.

회로를 논리식으로 그냥 풀어 쓰면 안 된다. 어떤 배선의 값이 뒤에서 여러 번 쓰이면 그 부분식이 복제되고, 그런 배선이 겹치면 식의 크기가 회로 크기에 대해 지수적으로 커질 수 있다. 그러면 옮기는 일 자체가 지수 시간이라 소용이 없다.

증명. 회로 C 의 배선마다 서로 다른 변수를 하나 배정한다. 게이트마다 다음처럼 제약식을 하나 쓴다. 입력 배선이 P, Q 이고 출력 배선이 R 인 AND 게이트라면

(PQ)R

를 쓰고, OR 나 NOT 게이트도 같은 모양으로 쓴다. 이 제약식들 전부와 출력 배선 변수 하나를 로 묶은 식을 FC 라 하자.

FC 의 크기는 게이트 하나당 상수 개의 기호이므로 회로 크기에 비례하고, 옮기는 데 드는 시간도 그렇다. 이제 두 방향을 본다. 회로에 어떤 입력을 넣어 출력이 참이 되었다면, 그때 각 배선에 실제로 흐른 값을 변수에 배정하면 모든 게이트 제약식이 참이고 출력 변수도 참이므로 FC 가 만족된다. 거꾸로 FC 를 만족하는 배정이 있다면, 게이트 제약식들이 배선 값을 입력에서부터 차례로 강제하므로 그 배정의 입력 배선 값을 회로에 넣으면 출력이 참이 된다.

따라서 회로 SAT 의 답과 FC 의 SAT 답이 같고, SAT 를 다항 시간에 풀 수 있으면 회로 SAT 도 다항 시간에 풀 수 있다.

이 논증의 모양을 기억해 둘 만하다. 문제 A 를 문제 B 로 옮기는 데 드는 비용이 작으면, B 를 푸는 방법이 곧 A 를 푸는 방법이다. 알고리즘 문서에서 이것을 환원(reduction)이라 부르고, NP-완전을 정의하는 도구로 쓴다.

술어 논리와 한정사

지금까지는 명제 변수만 다뤘다. 이제 3장에서 도입한 술어와 한정사를 제대로 세운다. 전칭 한정사, 존재 한정사라 하고, 어느 범위에서 변수를 고르는지도 함께 밝힌다.

xR.x20(참)xR.5x27=0(참)

변수가 모두 같은 집합에서 값을 가질 때는 그 집합을 생략하고 xy.Q(x,y) 처럼 쓴다. 이때 생략된 집합을 논의 영역(domain of discourse)이라 하고, 무엇인지 문맥에서 분명해야 한다.

도입부의 셋째 문장이 여기서 해결된다. Probs 를 우리가 내는 문제들의 집합, Solves(x) 를 "당신이 문제 x 를 푼다", G 를 "A 를 받는다"라 하면 "아무 문제나 풀 수 있으면 A 를 준다"는 두 가지로 읽힌다.

(xProbs.Solves(x))G또는(xProbs.Solves(x))G

앞은 전부 풀어야 A 를 주는 것이고 뒤는 하나만 풀어도 주는 것이다. 학점이 걸렸으니 어느 쪽인지 분명히 해야 한다.

한정사 순서가 뜻을 바꾼다

종류가 다른 한정사의 순서를 바꾸면 대개 뜻이 달라진다. 도입부의 넷째 문장이 그 예다. A 를 한국인 전체, D 를 꿈 전체, H(a,d) 를 "a 는 꿈 d 를 갖는다"라 하면 두 읽기는 이렇게 갈린다.

왼쪽은 모두가 같은 하나를 가리키고 오른쪽은 각자 다른 것을 가리켜도 된다. 왼쪽이 참이면 오른쪽도 참이지만 반대는 성립하지 않는다
<왼쪽은 모두가 같은 하나를 가리키고 오른쪽은 각자 다른 것을 가리켜도 된다. 왼쪽이 참이면 오른쪽도 참이지만 반대는 성립하지 않는다>[원본 보기]

dDaA.H(a,d)(하나의 꿈을 모두가 공유한다)aAdD.H(a,d)(사람마다 제 꿈이 있다)

골드바흐 추측에서 순서를 바꿔 보면 차이가 노골적으로 드러난다. 원래 추측 "2보다 큰 모든 짝수는 두 소수의 합이다"는 왼쪽처럼 적히는데, 순서를 바꾸면 오른쪽이 된다.

nEvensp,qPrimes.n=p+qp,qPrimesnEvens.n=p+q

오른쪽은 "같은 두 소수의 합으로 모든 짝수가 된다"는 뜻이라 노골적인 거짓이다.

한정사를 부정한다

"모두가 아이스크림을 좋아하는 것은 아니다"와 "아이스크림을 좋아하지 않는 사람이 있다"는 같은 말이다. 규칙으로 적으면 이렇고, 요령은 하나다 — 부정 기호가 한정사를 지날 때마다 가 뒤바뀐다.

¬(x.P(x))x.¬P(x)¬(x.P(x))x.¬P(x)

부정을 안으로 한 칸씩 밀 때마다 한정사가 뒤바뀐다. 아래 두 메모가 왜 그런지와 무엇에 쓰이는지다 — 이 규칙이 반례로 전칭명제를 무너뜨릴 수 있는 근거다
<부정을 안으로 한 칸씩 밀 때마다 한정사가 뒤바뀐다. 아래 두 메모가 왜 그런지와 무엇에 쓰이는지다 — 이 규칙이 반례로 전칭명제를 무너뜨릴 수 있는 근거다>[원본 보기]

이 규칙은 드모르간 법칙을 무한히 늘린 것이다. 논의 영역이 {d0,d1,} 라 하면 x.P(x)P(d0)P(d1) 이고 x.P(x)P(d0)P(d1) 이므로, 여기에 드모르간을 적용하면 위 규칙이 나온다.

술어식의 타당성과 반례 모형

타당성 개념도 술어식으로 넓힌다. 술어식이 타당하다는 것은 논의 영역이 무엇이든, 변수가 어떤 값을 갖든, 술어를 무엇으로 해석하든 참이라는 뜻이다. 예를 들어 위의 한정사 부정 규칙은 ¬(x.P(x))x.¬P(x) 가 타당하다는 말이다.

타당하지 않다는 것을 보이는 방법은 명제 논리와 같다. 거짓이 되는 해석 하나를 내놓는다. 그런 해석을 반례 모형(counter-model)이라 한다.

예제 40

다음 두 식 중 어느 것이 타당한가. 타당하지 않은 것에는 반례 모형을 들어라.

()xy.P(x,y)yx.P(x,y)()yx.P(x,y)xy.P(x,y)

증명

앞 절의 꿈 그림이 답을 알려 준다. "하나로 다 되는 것"에서 "각자 하나씩 있는 것"은 나오지만 반대는 아니다.

(가) 타당하다. 논의 영역 D 와 술어 해석을 아무거나 잡고, 가정 xy.P(x,y) 가 참이라 하자. 의 뜻에 따라 어떤 원소 d0D 가 있어 모든 yD 에 대해 P(d0,y) 가 참이다.

이제 y 로 아무 원소 dD 를 잡자. P(d0,d) 가 참이므로 "P(x,d) 를 참으로 만드는 x 가 있다"는 말이 성립하고, d 를 아무거나 잡아도 그러므로 yx.P(x,y) 가 참이다. 요점은 안쪽 xd0 를 늘 쓸 수 있다는 것이다.

(나) 타당하지 않다. 반례 모형을 만든다. 논의 영역을 정수 전체로 하고 P(x,y) 를 "x>y"로 해석하자. 가정 yx.x>y 는 참이다 — y 가 주어지면 x=y+1 을 고르면 된다. 반면 결론 xy.x>y 는 거짓이다. 모든 정수보다 큰 정수가 있으면 그것은 자기 자신보다도 커야 한다. 가정이 참이고 결론이 거짓인 해석을 찾았으므로 (나)는 타당하지 않다.

마지막으로 (가)의 증명에 대해 솔직하게 말해 두자. 그 증명은 의 뜻을 한국어로 풀어 읽은 것이었다. 이보다 더 기본적인 무엇으로 증명해야 할지 분명하지 않을 만큼 근본적인 사실이기 때문이다. 어느 자리에서는 형식화가 멈춘다. 그 자리를 알아 두는 것도 이 장에서 얻어 갈 것이다.

오류 찾기

어떤 학생이 명제 P 를 증명하려고 명제 QR 를 새로 만들고 다음 세 함의를 증명했다.

PQ,QR,RP

그리고 이렇게 결론지었다. "Q 가 참이면 QR 에 의해 R 가 참이고, RP 에 의해 P 가 참이다. 마찬가지로 R 가 참이면 PQ 도 참이고, P 가 참이면 QR 도 참이다. 그러니 어느 쪽으로 보아도 셋 다 참이다."

어디가 틀렸는가?

풀이 보기

먼저 결론이 틀렸다는 것을 확인하자. P=Q=R=F 를 배정하면 세 함의가 모두 가정이 거짓이라 참이고, 따라서

(PQ)(QR)(RP)

는 참이다. 그런데 PQR 는 거짓이다. 세 함의가 모두 참인데 셋 다 거짓인 배정이 있다. 그러니 학생의 결론은 나오지 않는다.

그럼 정확히 무엇이 문제인가. 학생이 실제로 증명한 것은 "Q 가 참이면 P 도 참이다"라는 조건문이다. 그런데 어디서도 Q 가 참이라는 것을 보이지 않았다. 세 문장을 붙여 얻은 것은 "셋 중 하나가 참이면 셋 다 참"일 뿐이고, 셋 다 거짓인 경우가 남아 있다.

4장의 정형과 나란히 놓으면 무슨 일인지 분명해진다. 학생은 고리를 잇는 함의만 갖췄고 고리 안으로 참을 넣어 주는 출발점이 없다. 귀납법에서 연결고리는 멀쩡한데 첫 도미노를 아무도 밀지 않은 것과 같고, WOP 증명에서 c>0 을 확보하지 않은 것과 같다.

여기서 얻을 습관은 이것이다. "X 이면 Y" 꼴을 여러 개 붙여 나갈 때는 어느 자리에서 실제로 참인 것이 들어오는지 확인하라. 그 자리가 없으면 아무리 많이 붙여도 결론이 나오지 않는다.

이 장에서 새로 나온 것

기호·용어
PQ배타적 논리합 XOR — 정확히 하나만 참일 때 참
타당하다(valid)어떤 배정에서도 참
만족가능하다(satisfiable)참이 되는 배정이 하나라도 있다
만족 배정식을 참으로 만드는 변수 배정
일관적(consistent)식들의 모임 전부를 참으로 만드는 배정이 있다
리터럴(literal)변수 또는 그 부정
AND 절 · OR 절서로 다른 변수의 리터럴을 · 로 묶은 것
DNF (선언 정규형)AND 절들을 로 묶은 식. 참인 줄에서 읽는다
CNF (연언 정규형)OR 절들을 로 묶은 식. 거짓인 줄에서 부호를 뒤집어 읽는다
SAT주어진 식이 만족가능한지 판정하는 문제
논의 영역(domain of discourse)한정사가 변수를 고르는 범위. 생략할 때는 문맥에서 분명해야 한다
반례 모형(counter-model)술어식을 거짓으로 만드는 해석. 타당하지 않음을 보이는 데 쓴다

챙겨 갈 것은 다섯이다.

다음 장에서는 이 기호들을 써서 수학의 재료 — 집합·수열·함수·관계 — 를 형식적으로 다시 정의한다. 특히 집합을 "조건을 만족하는 것들의 모임"으로 정의하면 어떤 일이 벌어지는지 보게 되고, 그 답이 이 장에서 세운 술어 표기와 직접 이어진다.

수학적 자료형

프로그램을 쓸 때 정수·문자열·목록·사전 같은 자료형을 쓴다. 수학에도 그런 것이 있다. 집합, 수열, 함수, 그리고 관계다. 이 장은 그 넷을 형식적으로 정의한다. 기초수학의 집합 장에서 집합 연산, 멱집합, 곱집합, 함수의 정의, 단사·전사·전단사를 이미 다뤘다. 여기서 새로 하는 일은 셋이다. 집합을 "조건을 만족하는 것들의 모임"으로 정의하면 무슨 일이 벌어지는지 보고, 함수보다 넓은 개념인 이항관계를 세우고, 크기를 세지 않고 비교하는 법을 만든다. 마지막 것이 10장에서 무한집합을 다루는 유일한 도구가 된다.

5장에서 가져오는 것이 많다. 조건제시법은 술어를 쓰는 것이고, 집합 등식의 증명은 논리 동치를 원소의 언어로 옮기는 것이다.

집합

집합(set)은 대상들의 모임이고 그 하나하나를 원소(element)라 한다. 원소는 수든 점이든 다른 집합이든 무엇이든 될 수 있고, eSe 가 집합 S 의 원소라는 뜻이다. 두 가지 약속이 있다. 순서는 뜻이 없고, 원소가 여러 번 나와도 한 번 나온 것과 같다. 그래서 {x,y}={y,x} 이고 {x,x}={x} 다. 집합이 기억하는 것은 무엇이 들어 있는가뿐이다.

자주 쓰는 집합과 연산

기호집합원소
공집합없다
N음이 아닌 정수0,1,2,3,
Z정수,2,1,0,1,2,
Q유리수1/2, 5/3, 16
R실수π, e, 9, 2
C복소수i, 19/2, 22i

어깨의 + 는 양의 원소로, 는 음의 원소로 제한한다. R+ 는 양의 실수, Z 는 음의 정수다. 한편 STS 의 모든 원소가 T 의 원소라는 뜻이다. 기호를 처럼 읽으면 방향을 외울 필요가 없다 — 작은 쪽이 왼쪽이다. 어떤 수 n 에 대해서도 nn 이듯 어떤 집합에 대해서도 SS 다. 같지는 않은 부분집합은 ST 로 적고 진부분집합이라 한다.

연산 넷은 정의를 논리식으로 그대로 적을 수 있다. 이것이 이 절의 요점이다.

연산정의
합집합 ABxABxAxB
교집합 ABxABxAxB
차집합 ABxABxAxB
여집합 AA::=DA — 논의 영역 D 를 정해 두고 쓴다

여집합을 쓰면 부분집합을 등식으로 다시 쓸 수 있다. AB 인 것은 AB= 인 것과 같다. 한편 집합의 모든 부분집합을 모은 집합을 멱집합(power set)이라 하고 pow(A) 로 적는데, 정의는 한 줄이다.

Bpow(A)BA

원소가 n 개면 부분집합은 2n 개인데, 그 증명은 이 장 마지막 절에서 한다. 그 때문에 2A 라는 표기를 쓰는 책도 있다.

조건제시법과 러셀의 역설

5장의 술어를 쓰면 집합을 조건으로 정의할 수 있다. 이것을 조건제시법(set builder notation)이라 한다.

A::={nNn 은 소수이고 어떤 정수 k 에 대해 n=4k+1}

A 의 작은 원소들은 5,13,17,29,37,41,53,61,73, 이다. 열 개를 적어도 규칙이 보이지 않으니 이런 집합은 원소를 늘어놓아 알려 줄 수 없다. 조건이 있어야 정의되는 집합이 있다는 것이 조건제시법을 쓰는 이유다. 그러면 조건이면 무엇이든 집합을 만들 수 있는가. 여기서 사고가 난다.

왼쪽 줄기는 어느 쪽으로 답해도 모순으로 끝난다. 그래서 오른쪽처럼 규칙을 좁혔다 — 무엇을 담을지 정하기 전에 어디에서 잘라낼지를 먼저 말해야 한다
<왼쪽 줄기는 어느 쪽으로 답해도 모순으로 끝난다. 그래서 오른쪽처럼 규칙을 좁혔다 — 무엇을 담을지 정하기 전에 어디에서 잘라낼지를 먼저 말해야 한다>[원본 보기]

그림의 왼쪽을 말로 따라가 보자. 자기 자신을 원소로 갖지 않는 것을 모두 모아 S 라 하자.

S::={xxx}

이제 묻는다. SS 인가? 그렇다고 하면 SS 의 조건을 만족해야 하니 SS 다. 아니라고 하면 S 는 조건을 만족하므로 SS 다. 어느 쪽이든 모순이다. 이것이 러셀의 역설이다.

해결책은 "조건이면 무엇이든 집합"이라는 규칙을 버리는 것이다. 오늘날의 집합론(ZFC)은 이미 있는 집합에서 조건으로 부분을 잘라내는 것만 허용한다. {xAP(x)} 는 되지만 {xP(x)} 는 안 되고, 그러면 위의 S 는 애초에 만들어지지 않는다. 이 문서는 대체로 소박한 뜻의 집합을 쓰되, "모든 집합의 집합"처럼 크기에 제한이 없는 모임을 만들면 위험하다는 것은 기억해 둘 만하다. 집합의 논리를 제대로 다루는 것은 10장이다.

집합 등식을 증명한다

두 집합이 같다는 것은 원소가 정확히 같다는 뜻이다. 그러니 집합 등식은 iff 명제이고, 3장의 동치 사슬로 증명한다.

벤 다이어그램은 확인이지 증명이 아니다. 오른쪽 사슬이 증명이고, 그 굵은 줄에서 실제로 한 일은 5장의 분배법칙 한 번이 전부다
<벤 다이어그램은 확인이지 증명이 아니다. 오른쪽 사슬이 증명이고, 그 굵은 줄에서 실제로 한 일은 5장의 분배법칙 한 번이 전부다>[원본 보기]

그림의 사슬을 정리해 두자. 임의의 원소 z 를 잡고 의 정의를 논리식으로 펴면, 남는 일은 논리 동치를 한 번 쓰는 것이다. 다만 집합 연산과 논리 연산은 대응하지만 같은 것이 아니다. 집합 X, Y 에 대해 "XY"라고 쓰면 안 되고, 명제 P, Q 에 대해 "PQ"라고 쓰면 안 된다. 프로그램에서 형(type)이 맞지 않는 것과 같다.

예제 42

다음을 구하라. (가) pow({1,2}) 의 원소 (나) pow({,{}}) 의 원소 (다) |pow({1,2,,8})|

풀이 보기

(가) 원소를 넣을지 말지 원소마다 정하면 된다. , {1}, {2}, {1,2} 네 개다.

(나) 원소가 {} 둘이므로 부분집합도 네 개다. , {}, {{}}, {,{}}.

여기가 이 예제에서 헷갈리는 자리다. 이 부분집합으로도 나오고 원소로도 나온다. 중괄호를 몇 겹 벗겨야 그것이 나오는지 세면 된다. {} 은 "공집합을 담은 상자"이지 공집합이 아니다.

(다) 원소가 여덟 개이므로 28=256 개다.

(가)와 (나)가 크기가 같은 것은 우연이 아니다. 원소가 무엇인지는 개수에 영향을 주지 않는다. 마지막 절에서 이것을 전단사로 증명한다.

예제 43

임의의 집합 A, B 에 대하여 A=(AB)(AB) 임을 동치 사슬로 증명하라.

증명

뼈대는 이렇다. 원소 하나를 잡고 정의를 논리식으로 펴면 5장의 논리 동치 하나로 끝난다. 여기서 쓸 것은 (P¬Q)(PQ)P 다.

먼저 그 논리 동치를 확인한다. 분배법칙을 거꾸로 쓰면 좌변은 P(¬QQ) 이고, 배중률로 괄호가 T 이 되고, 항등원으로 P 가 된다.

증명. 임의의 원소 z 를 잡는다.

z(AB)(AB)

zABzAB (합집합의 정의)

(zAzB)(zAzB) (차집합과 교집합의 정의)

zA (위의 논리 동치)

모든 원소 z 에 대해 양쪽의 소속이 같으므로 두 집합은 같다.

이 증명의 모양을 기억해 두자. 집합 등식의 증명은 대응하는 논리식이 타당한지 확인하는 일로 바뀐다. 그러니 어려운 부분은 늘 논리 쪽에 있고, 집합 쪽에서는 정의를 펴고 접는 일만 한다.

예제 44

임의의 집합 A, B 에 대하여 다음을 증명하라. (가) pow(AB)=pow(A)pow(B) (나) pow(A)pow(B)pow(AB) 이고, 등호는 AB 중 하나가 다른 쪽의 부분집합일 때만 성립한다.

증명

멱집합의 원소는 부분집합이다. 그러니 원소를 잡을 때 C 꼴로 잡아야 한다. 이것이 이 문제의 유일한 요령이다.

(가) 증명. 임의의 집합 C 를 잡는다.

Cpow(AB)CAB(CACB)

가운데 단계는 멱집합의 정의이고, 마지막 단계는 "C 의 모든 원소가 AB 에 다 있다"를 둘로 나눈 것이다. 이어서

Cpow(A)Cpow(B)Cpow(A)pow(B)

다.

(나) 포함 증명. Cpow(A)pow(B) 라 하면 CA 이거나 CB 다. 어느 쪽이든 CAB 이므로 Cpow(AB) 다.

(나) 등호 조건. 양방향을 본다. AB 이면 pow(A)pow(B) 이므로 좌변이 pow(B) 이고 AB=B 이므로 우변도 pow(B) 다.

거꾸로 어느 쪽도 다른 쪽의 부분집합이 아니라고 하자. 그러면 aABabBAb 가 있다. 이제 {a,b} 를 보자. {a,b}AB 이므로 우변의 원소이지만, bA 이라 {a,b}A 이고 aB 이라 {a,b}B 이므로 좌변의 원소가 아니다. 등호가 성립하지 않는다.

(가)에서는 사슬이 통했는데 (나)에서는 한쪽 포함만 성립했다. 차이가 어디서 왔는가. 는 "나눠 담을 수 있다"는 것을 보장하지 않는다. C 의 원소 일부가 A 에, 나머지가 B 에 있으면 CAB 이지만 CACB 도 아니다. 반례가 정확히 그 상황을 만든 것이다.

수열과 곱집합

수열(sequence)은 순서가 있는 목록이고 짧은 것은 괄호로 적는다. 집합과 두 가지가 다르다.

길이 0 인 수열을 빈 수열이라 하고 이 문서는 λ 로 적는다. 길이 2 인 수열은 순서쌍이다. 집합과 수열을 잇는 것이 곱집합(Cartesian product)이다. S1×S2××Sn 은 첫 성분을 S1 에서, 둘째를 S2 에서 … 뽑아 만든 수열 전체의 집합이다.

N×{a,b}={(0,a),(0,b),(1,a),(1,b),(2,a),(2,b),}

같은 집합을 n 번 곱한 것은 Sn 으로 적는다. 예를 들어 {0,1}3 은 길이 3 인 비트열 여덟 개의 집합이다.

{0,1}3={(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)}

예제 45

집합 A, B, C, D 에 대하여 곱집합 A×BC×D 가 서로소이면 AC 가 서로소이거나 BD 가 서로소임을 증명하라. 두 집합이 서로소라는 것은 교집합이 공집합이라는 뜻이다.

증명

결론이 "둘 중 하나" 꼴이라 직접 공격하기 어렵다. 가정과 결론에 부정이 섞여 있으니 대우를 보자. "AC 가 서로소가 아니고 BD 도 서로소가 아니면 A×BC×D 도 서로소가 아니다." 이쪽은 원소를 실제로 만들 수 있으니 훨씬 다루기 쉽다.

증명. 대우를 증명한다. AC 이고 BD 이라 하자. 그러면 aACabBDb 를 잡을 수 있다.

순서쌍 (a,b) 를 보자. aA 이고 bB 이므로 (a,b)A×B 다. 또 aC 이고 bD 이므로 (a,b)C×D 다. 두 곱집합에 공통 원소가 있으므로 서로소가 아니다.

대우가 참이므로 원래 명제도 참이다.

3장의 지침이 그대로 적용된 예다. "공집합이 아니다"는 원소를 하나 잡을 수 있다는 말이라 다루기 쉽고, "공집합이다"는 그렇지 않다. 그래서 부정 쪽을 가정으로 삼았다.

오류 찾기

다음 "정리"는 거짓이다. 반례를 하나 들고, 아래 "증명"에서 틀린 단계를 정확히 지적하라. 그리고 그 단계에서 살릴 수 있는 것이 무엇인지 말하라.

거짓 정리. L::=(AB)×(CD), R::=(A×C)(B×D) 라 하면 L=R 이다.

가짜 증명. 양쪽이 순서쌍의 집합이므로 모든 x, y 에 대해 (x,y)L(x,y)R 만 보이면 된다. 동치 사슬로 잇는다.

  1. (x,y)R
  2. (x,y)(A×C)(B×D)
  3. (x,y)A×C(x,y)B×D
  4. (xAyC)(xByD)
  5. (xAxB)(yCyD)
  6. xAByCD
  7. (x,y)L
풀이 보기

먼저 반례다. A={1}, B={2}, C={3}, D={4} 라 하자.

L={1,2}×{3,4}={(1,3),(1,4),(2,3),(2,4)}

R={(1,3)}{(2,4)}={(1,3),(2,4)}

(1,4)L 인데 (1,4)R 이므로 두 집합은 다르다.

틀린 단계는 ④에서 ⑤로 가는 곳이다. 논리식으로 적으면 이렇게 주장한 것이다.

(PQ)(RS)(PR)(QS)

이 동치는 성립하지 않는다. PS 만 참이라고 배정해 보자. 좌변은 두 AND 절이 모두 거짓이라 거짓이고, 우변은 PRQS 도 참이라 참이다.

반례의 (1,4) 가 정확히 그 배정이다. 1A (P 참)이고 4D (S 참)인데 1B 이고 4C 이다.

그러면 살릴 수 있는 것은 무엇인가. 한쪽 방향은 성립한다. 좌변이 참이면 PQ 이거나 RS 이고, 어느 쪽이든 PRQS 가 모두 참이다. 즉

(PQ)(RS)(PR)(QS)

는 타당하다. 그러니 사슬의 를 모두 로 바꾸면 RL 이라는 참인 명제의 증명이 된다.

여기서 얻을 습관이 있다. 동치 사슬을 쓸 때는 각 단계가 양방향인지 하나씩 확인하라. 한 단계만 한쪽 방향이면 사슬은 포함 관계 증명으로 격하되고, 그것을 모른 채 등호를 주장하면 이런 일이 생긴다.

함수 — 전함수와 부분함수

함수 f:AB 는 정의역 A 의 원소에 공역 B 의 원소를 지정하는 것이다. 여기서 형식적으로 짚어 둘 것이 둘 있다.

첫째, 함수는 정의역의 모든 원소에 값을 주지 않아도 된다. f1(x)=1/x2x=0 에서 값이 없고, "이진 문자열에서 왼쪽부터 처음 1 이 나오는 자리"를 주는 함수는 0 만으로 된 문자열에서 값이 없다.

두 함수 모두 정의역의 일부에서 값이 없다. 공역을 바꿔서는 이 문제가 해결되지 않고 정의역을 줄여야 한다는 것이 오른쪽 아래 문장이다
<두 함수 모두 정의역의 일부에서 값이 없다. 공역을 바꿔서는 이 문제가 해결되지 않고 정의역을 줄여야 한다는 것이 오른쪽 아래 문장이다>[원본 보기]

값이 정해지지 않은 곳이 있을 수 있는 함수를 부분함수(partial function)라 하고, 값이 정해진 정의역 원소들의 모임을 그 함수의 support라 한다. support 가 정의역과 같으면 전함수(total function)다. 이 문서에서 그냥 "함수"라고 쓰면 부분함수일 수도 있다.

둘째, 공역과 치역은 다르다. 공역은 값이 놓일 자리로 미리 정해 둔 집합이고, 실제로 값이 되어 나온 것만 모은 것이 치역(range)이다. 공역을 치역이라 부르는 책도 있는데 그러면 안 된다. 부분집합 SA 에 대해 f 가 내는 값들을 모은 것은 S상(image)이라 하고 f(S) 로 적는다.

f(S)::={bB어떤 sS 에 대해 f(s)=b},range(f)::=f(A)

마지막 절에서 집합의 크기를 함수의 성질로 견줄 때 이 구별이 결정적으로 쓰인다. 함수를 이어 붙이는 것은 합성이다. f:ABg:BC 에 대해

(gf)(x)::=g(f(x))(xA)

로 정의되는 함수 gf:ACgf 의 합성이라 한다. f 를 먼저 쓰는데 기호는 뒤에 적는다는 것을 주의하라.

예제 47

f(y) 를 "이진 문자열 y 에서 왼쪽부터 처음 1 이 나오는 자리"로 정의한다. 정의역은 유한 길이 이진 문자열 전체, 공역은 Z+ 다. (가) f(0010), f(100), f(0000) 을 구하라. (나) support 와 치역을 구하라. (다) X 를 "0 이 짝수 개 나온 뒤 1 이 오는 문자열"들의 집합이라 할 때 f(X) 는 무엇인가.

풀이 보기

(가) f(0010)=3, f(100)=1 이다. f(0000)정의되지 않는다1 이 없으니 셀 것이 없다.

(나) support 는 1 을 적어도 하나 포함하는 문자열 전체다. 치역은 Z+ 전체다. 임의의 n1 에 대해 0n1 개 쓰고 1 을 붙인 문자열이 n 을 낸다.

(다) 0 이 짝수 개, 즉 2k 개 나온 뒤 1 이 오면 1 의 자리는 2k+1 이다. k0 이상의 정수를 다 훑을 수 있으므로 f(X)양의 홀수 전체다.

(나)에서 공역과 치역이 우연히 같았다는 점을 눈여겨보자. 공역을 N 으로 잡았다면 치역은 그대로인데 공역이 달라진다. 공역은 우리가 정하는 것이고 치역은 함수가 정하는 것이다.

예제 48

f:ABg:BC 에 대해 합성 h::=gf 가 전단사라 하자. (가) f 가 단사인 전함수이고 g 가 전사임을 증명하라. (나) 거꾸로 f 가 단사인 전함수이고 g 가 전단사인데도 h 가 전단사가 아닌 예를 들어라.

증명

뼈대는 이렇다. 합성의 성질을 앞뒤로 나눠 읽는다. h 가 모든 곳에 값을 주려면 f 가 먼저 값을 주어야 하고, hC 를 다 덮으려면 g 가 다 덮어야 한다.

(가) 증명. 세 가지를 차례로 보인다.

f 가 전함수다. 임의의 aA 를 잡자. h 가 전단사이므로 전함수이고, 따라서 h(a)=g(f(a)) 가 정해진다. 그러려면 f(a) 가 먼저 정해져야 한다.

f 가 단사다. f(a1)=f(a2) 라 하자. 양쪽에 g 를 적용하면 h(a1)=h(a2) 이고, h 가 단사이므로 a1=a2 다.

g 가 전사다. 임의의 cC 를 잡자. h 가 전사이므로 h(a)=caA 가 있고, 그러면 g(f(a))=c 이므로 f(a)c 로 가는 원소다.

(나) 반례. A={1}, B=C={1,2} 로 잡고 f(1)=1, g 를 항등함수로 하자. f 는 단사인 전함수이고 g 는 전단사인데, h(1)=1 뿐이라 2 로 가는 것이 없다. h 는 전사가 아니므로 전단사가 아니다.

(나)가 말하는 것은 (가)의 역이 성립하지 않는다는 것이다. 합성이 전단사라는 것은 앞뒤에 각각 조건을 걸지만, 그 조건들을 다 갖춰도 합성이 전단사가 되지는 않는다. 크기가 맞아야 하기 때문이고, 그 이야기가 마지막 절이다.

이항관계

함수는 "한 원소에 하나를 지정하는 것"이라 제약이 있다. 그 제약을 풀면 이항관계가 된다.

정의. 이항관계 R 는 세 가지로 이루어진다 — 정의역 A, 공역 B, 그리고 A×B 의 부분집합인 그래프다. 함수처럼 R:AB 로 적고, 순서쌍 (a,b) 가 그래프에 있으면 aRb 로 적는다.

이 정의는 함수의 정의와 딱 한 가지만 다르다. 각 정의역 원소에 대해 첫 성분이 그것인 순서쌍이 하나 이하여야 한다는 조건이 없다. 그러니 함수는 이항관계의 특수한 경우다. 실수 위의 "작다"도, 집합 사이의 "부분집합이다"도, 사람과 과목 사이의 "담당한다"도 모두 관계다.

화살표를 센다

관계를 그림으로 그리면 성질들을 화살표를 세는 것으로 바꿀 수 있다. 정의역 원소를 왼쪽 줄에, 공역 원소를 오른쪽 줄에 놓고 aRb 일 때 화살표를 그린다.

다섯 성질이 모두 화살표 개수 조건이다. 아래 문장이 중요하다 — 화살표만 보고는 ‘전’ 인지 알 수 없어서 정의역이 무엇인지 함께 밝혀야 한다
<다섯 성질이 모두 화살표 개수 조건이다. 아래 문장이 중요하다 — 화살표만 보고는 ‘전’ 인지 알 수 없어서 정의역이 무엇인지 함께 밝혀야 한다>[원본 보기]
성질화살표 조건
함수나가는 화살표 ≤ 1
전(total)나가는 화살표 ≥ 1
전사(surjective)들어오는 화살표 ≥ 1
단사(injective)들어오는 화살표 ≤ 1
전단사(bijective)나가는 것과 들어오는 것이 모두 정확히 1

이렇게 정리하면 관계의 R1:BA — 화살표를 모두 거꾸로 돌린 관계 — 가 무엇을 하는지 곧바로 읽힌다.

bR1aaRb

R 이 ~이면R1 은 ~이다
전이다전사다
함수다단사다
전사다전이다
단사다함수다
전단사다전단사다

상과 역상

함수의 상 개념이 관계로 그대로 넓어진다. 정의역의 부분집합 Y 에 대해 R(Y)Y 의 어떤 원소에서 화살표가 들어오는 공역 원소 전체다. 공역의 부분집합 X 에 대해 R1(X)역상이라 한다.

상은 화살표를 따라가고 역상은 거꾸로 온다. 아래 세 줄에서 치역과 support 가 각각 어느 쪽에서 세는 것인지 확인해 두자
<상은 화살표를 따라가고 역상은 거꾸로 온다. 아래 세 줄에서 치역과 support 가 각각 어느 쪽에서 세는 것인지 확인해 두자>[원본 보기]

두 개념이 여기서 나온다. 치역은 정의역 전체의 상, 곧 화살표가 하나라도 들어오는 공역 원소 전체이고, support 는 공역 전체의 역상, 곧 화살표가 하나라도 나가는 정의역 원소 전체다.

range(R)::=R(A),support(R)::=R1(B)

예제 49

이항관계 R:AB 의 성질 중 어떤 것이 그래프만 보고 판정되는가. 다음 각각에 대해 그래프만으로 되는지, 그래프와 A 가 필요한지, 그래프와 B 가 필요한지, 셋 다 필요한지 답하라. (가) 전사 (나) 단사 (다) 전 (라) 함수 (마) 전단사

풀이 보기

판정 기준은 하나다. 그 성질이 화살표가 하나도 없는 점에 대해 무언가를 말하는가. 그래프는 화살표만 알려 주므로, 고립된 점이 있는지는 정의역이나 공역을 알아야 한다.

(가) 전사는 "공역의 모든 점에 화살표가 들어온다"다. 화살표가 안 들어오는 공역 점이 있는지 알아야 하므로 그래프와 B 가 필요하다.

(나) 단사는 "어떤 점에도 화살표가 둘 이상 들어오지 않는다"다. 화살표만 보면 판정된다. 그래프만으로 된다.

(다) 전은 "정의역의 모든 점에서 화살표가 나간다"다. 그래프와 A 가 필요하다.

(라) 함수는 "어떤 점에서도 화살표가 둘 이상 나가지 않는다"다. 그래프만으로 된다.

(마) 전단사는 위의 넷을 모두 요구하므로 셋 다 필요하다.

여기서 얻을 것은 관계가 왜 세 가지의 묶음으로 정의되었는가다. 그래프만으로는 관계가 정해지지 않는다. 같은 그래프에 정의역을 더 크게 잡으면 전이 아니게 되고, 공역을 더 크게 잡으면 전사가 아니게 된다.

예제 50

R:AB 에 대해 다음 각 식이 관계의 어떤 성질을 뜻하는지 답하라. 변수 a,a1,a2A 에서, b,b1,b2B 에서 값을 갖는다.

()ab.aRb()ba.aRb

()b1,b2,a.(aRb1aRb2)b1=b2

()a1,a2,b.(a1Rba2Rb)a1=a2

풀이 보기

요령은 한정사를 화살표로 읽는 것이다. ab 는 "정의역의 모든 점마다 무언가로 나가는 화살표가 있다"로 읽힌다.

(가) 이다. 정의역의 모든 점에서 화살표가 나간다.

(나) 전사다. 공역의 모든 점으로 화살표가 들어온다.

(다) 함수다. 한 점에서 나간 화살표가 둘이면 도착점이 같아야 한다는 말이므로, 나가는 화살표가 실질적으로 하나 이하다.

(라) 단사다. 한 점으로 들어온 화살표가 둘이면 출발점이 같아야 한다는 말이므로, 들어오는 화살표가 하나 이하다.

(다)와 (라)를 나란히 보면 정의역과 공역의 역할이 바뀐 것이 전부다. R1 을 취하면 (다)가 (라)로 바뀐다는 것도 확인해 두자. 앞의 표가 말한 것이 이것이다.

유한 기수

유한집합 A 의 원소 개수를 기수(cardinality)라 하고 |A| 로 적는다. 이제 세지 않고 크기를 견주는 법을 만든다. 왜 그런 것이 필요한가. 무한집합에서는 세는 일이 애초에 되지 않기 때문이다.

정의. 집합 A, B 에 대하여

유한집합에서는 이것이 크기 부등호와 정확히 맞아떨어진다. 증명은 화살표를 세는 것이다.

왼쪽 열이 관계의 성질, 가운데가 그때 성립하는 크기 부등호다. 화살표가 양방향인 것 — 부등호에서 성질도 나온다는 것 — 이 요점이고, 아래 두 메모가 이 표의 쓸모다
<왼쪽 열이 관계의 성질, 가운데가 그때 성립하는 크기 부등호다. 화살표가 양방향인 것 — 부등호에서 성질도 나온다는 것 — 이 요점이고, 아래 두 메모가 이 표의 쓸모다>[원본 보기]

왜 그런지 한 방향만 보자. R:AB 가 함수이면 A 의 각 원소가 화살표를 하나 이하로 내므로

(화살표 개수)|A|

다. R 가 전사이면 B 의 각 원소가 화살표를 하나 이상 받으므로 |B|(화살표 개수) 다. 둘을 붙이면 |B||A| 다. 나머지 줄도 같은 식으로 나온다. 이 표를 사상 규칙(Mapping Rules)이라 한다.

부분집합은 몇 개인가

사상 규칙의 첫 응용이 앞에서 미뤄 둔 것이다. 정리. 원소가 n 개인 집합의 부분집합은 2n 개다. 즉 |A|=n 이면 |pow(A)|=2n 이다.

부분집합 하나에 비트열 하나가 대응하고 거꾸로도 그렇다. 세지 않고 짝을 지어 세는 수법이며, 10장에서는 이것이 크기를 재는 유일한 방법이 된다
<부분집합 하나에 비트열 하나가 대응하고 거꾸로도 그렇다. 세지 않고 짝을 지어 세는 수법이며, 10장에서는 이것이 크기를 재는 유일한 방법이 된다>[원본 보기]

예제 51

위 정리를 증명하라.

증명

뼈대는 이렇다. 부분집합과 비트열 사이에 전단사를 만든다. 그러면 사상 규칙에 의해 크기가 같고, 길이 n 인 비트열이 2n 개라는 것은 이미 안다.

증명. A 의 원소를 a1,a2,,an 이라 하자. 부분집합 SA 에 다음 규칙으로 비트열 (b1,,bn){0,1}n 을 대응시킨다.

bi=1aiS

이 대응이 전단사임을 본다. 서로 다른 부분집합은 어떤 원소의 포함 여부가 다르므로 그 자리의 비트가 달라 서로 다른 비트열로 간다. 따라서 단사다. 또 임의의 비트열이 주어지면 bi=1ai 들을 모아 부분집합을 만들 수 있으므로 전사다.

그러므로 pow(A)bij{0,1}n 이고, 사상 규칙에 의해

|pow(A)|=|{0,1}n|=2n

이다.

이 증명에서 실제로 한 일은 세는 문제를 이미 답을 아는 세는 문제로 옮긴 것이다. 17장에서 이 수법을 본격적으로 다룬다.

비둘기집 원리

사상 규칙은 "A 에서 B 로 가는 단사인 전관계가 있으면 |A||B|"라 했다. 이 한 줄을 대우로 뒤집으면 유명한 원리가 나온다.

비둘기집 원리. |A|>|B| 이면 A 에서 B 로 가는 어떤 전함수도 단사가 아니다. 즉 값이 같아지는 서로 다른 두 원소가 반드시 있다.

다섯을 네 칸에 넣으면 어느 칸에는 둘이 들어간다. 아래 세 줄이 이 그림과 사상 규칙의 관계이고, 증명은 화살표를 세는 것이 전부다
<다섯을 네 칸에 넣으면 어느 칸에는 둘이 들어간다. 아래 세 줄이 이 그림과 사상 규칙의 관계이고, 증명은 화살표를 세는 것이 전부다>[원본 보기]

예제 52

{1,2,,2n} 에서 서로 다른 n+1 개의 수를 고르면 그중 서로소인 두 수가 반드시 있음을 증명하라.

증명

뼈대는 이렇다. 칸을 무엇으로 잡을지가 전부다. 연속한 두 정수는 서로소이므로, 연속한 두 수를 한 칸에 담아 두면 같은 칸에 둘이 들어가는 순간 답이 나온다.

먼저 연속한 두 정수가 서로소임을 확인한다. dkk+1 을 모두 나누면 d 는 그 차 1 도 나누므로 d=1 이다.

증명. {1,,2n} 을 다음 n 개의 칸으로 나눈다.

{1,2},{3,4},{5,6},,{2n1,2n}

고른 n+1 개의 수를 각각 자기가 든 칸으로 보내는 함수를 생각하자. 정의역의 크기가 n+1, 공역의 크기가 n 이므로 비둘기집 원리에 의해 이 함수는 단사가 아니다. 즉 같은 칸에 든 서로 다른 두 수가 있다.

각 칸은 연속한 두 정수로 되어 있으므로 그 두 수는 연속한 정수이고, 따라서 서로소다.

이 증명에서 어려운 곳은 계산이 아니라 칸을 고르는 것이었다. 칸을 "홀수와 짝수" 두 개로 잡았다면 같은 칸에 여러 수가 들어가지만 서로소라는 말은 나오지 않는다. 비둘기집 원리를 쓰는 문제는 대개 칸을 찾는 문제다.

예제 53

사상 규칙에서 다음을 유도하라. (가) AsurjB 이고 BsurjC 이면 AsurjC 다. (나) AsurjB 인 것은 BinjA 인 것과 같다. (다) (가)와 (나)에서 AinjB 이고 BinjC 이면 AinjC 임을 결론지어라.

증명

크기 부등호를 거치지 않고 관계 자체로 증명한다는 점이 중요하다. 그래야 유한집합이 아닐 때도 쓸 수 있다.

(가) 증명. 전사 함수 f:ABg:BC 를 잡고 합성 gf 를 본다. 임의의 cC 에 대해 g 가 전사이므로 g(b)=cbB 가 있고, f 가 전사이므로 f(a)=baA 가 있다. 그러면 (gf)(a)=c 이므로 합성도 전사다.

(나) 증명. 화살표를 돌리는 것이 전부다. A 에서 B 로 가는 전사 함수는 나가는 화살표가 하나 이하이고 들어오는 화살표가 하나 이상인 관계다. 화살표를 모두 거꾸로 돌리면 B 에서 A 로 가면서 나가는 화살표가 하나 이상, 들어오는 화살표가 하나 이하인 관계, 즉 단사인 전관계가 된다. 반대 방향도 같은 논증이다.

(다) 증명. (나)에 의해 AinjBBsurjA 와 같고 BinjCCsurjB 와 같다. 그러면 CsurjB 이고 BsurjA 이므로 (가)에 의해 CsurjA 이고, 다시 (나)에 의해 AinjC 다.

(나)가 이 절에서 가장 값나가는 사실이다. surjinj 는 방향을 뒤집은 같은 것이다. 그래서 하나에 대해 증명하면 다른 하나가 공짜로 따라온다.

여기까지는 유한집합 이야기가 아니었다는 점도 확인해 두자. 세 증명 어디에도 "개수"가 나오지 않았다. 그래서 10장에서 무한집합을 다룰 때 이 세 사실을 그대로 쓸 수 있다.

이 장에서 새로 나온 것

기호·용어
pow(A)멱집합 — A 의 부분집합 전체
{xAP(x)}조건제시법. {xP(x)} 는 허용되지 않는다(러셀의 역설)
λ빈 수열
SnSn 번 곱한 곱집합. {0,1}n 은 길이 n 인 비트열 전체
부분함수 · 전함수값이 없는 곳이 있을 수 있는 함수 · 정의역 전체에 값이 있는 함수
support(f)값이 정해진 정의역 원소 전체
f(S) · 치역 range(f)부분집합이 내는 값 전체 · 정의역 전체가 내는 값 전체. 공역과 다르다
gf합성. f 를 먼저 적용한다
이항관계 R:AB정의역, 공역, 그리고 A×B 의 부분집합인 그래프
aRb순서쌍 (a,b)R 의 그래프에 있다
R1역관계 — 화살표를 모두 거꾸로 돌린 것
R(Y) · R1(X)상 · 역상
기수 |A|유한집합의 원소 개수
AsurjB · AinjB · AbijB전사 함수 · 단사인 전관계 · 전단사가 있다
사상 규칙|A||B|AsurjB 등 세 줄
비둘기집 원리|A|>|B| 이면 AB 인 전함수는 단사가 아니다

챙겨 갈 것은 다섯이다.

이것으로 3장부터 6장까지의 블록이 끝났다. 세운 것은 셋이다. 증명이라는 말의 뜻(공리에서 출발해 건전한 규칙으로 옮기는 것), 증명을 쓰는 형식(직접·대우·귀류·경우 나누기·동치 사슬·정렬성 원리), 그리고 그것을 적을 언어(논리식과 한정사, 집합과 관계). 다음 장부터는 이 도구로 실제 대상을 다룬다. 7장의 귀납법이 4장의 정렬성 원리와 어떻게 같은 것인지 보게 되고, 8장에서는 그 도구가 프로그램이 옳게 도는지를 증명하는 데 쓰인다.

귀납법

증명해야 할 명제가 무한히 많은데 종이는 유한하다. n=0 에서 참, n=1 에서 참, n=2 에서 참 … 을 하나씩 적어 나가면 영원히 끝나지 않는다. 그런데 첫 칸 하나와 다리 하나만 증명하면 무한히 많은 칸이 한꺼번에 채워진다. 그 장치가 귀납법(induction)이다.

이 장에서 답할 질문은 넷이다. 귀납법은 정확히 무엇을 증명하라고 요구하는가. 증명하려는 명제를 더 것으로 바꾸면 왜 오히려 쉬워지는가. 한 걸음이 한 칸이 아닐 때는 어떻게 하는가. 그리고 4장의 정렬성 원리와 귀납법은 어떤 관계인가 — 4장 끝에서 "둘은 같은 힘을 갖는다"고 하고 증명을 이 장으로 미뤄 두었다. 그 빚을 여기서 갚는다.

기초수학의 수학적 귀납법 절에서 이 도구를 이미 써 봤을 것이다. 여기서 새로 하는 일은 셋이다. 증명의 정형을 못 박고, 강한 귀납법을 세우고, 귀납법과 정렬성 원리를 서로 유도한다. 그리고 3장에서 시작한 습관을 계속한다 — 잘못된 증명에서 틀린 단계를 찾는 것이다. 이 장의 가짜 증명은 이 과목에서 가장 유명한 것이다.

보통 귀납법

사탕을 든 교수가 학생들을 한 줄로 세우고 두 가지 규칙을 말한다. 맨 앞 학생은 사탕을 받는다. 그리고 어떤 학생이 사탕을 받으면 그 뒤 학생도 받는다. 열일곱 번째 학생은 사탕을 받는가. 받는다. 첫 규칙으로 0번이 받고, 둘째 규칙을 열일곱 번 적용하면 된다. 줄이 얼마나 길어도 마찬가지다.

이것이 귀납법의 전부다. 형식을 갖추어 적으면 다음과 같다.

귀납법의 원리. P 를 음이 아닌 정수에 대한 술어라 하자. 만약

모든 음이 아닌 정수 m 에 대해 P(m) 이 참이다.

3장의 추론 규칙 서식으로 적으면 이렇다.

P(0),nN.P(n)P(n+1)mN.P(m)

뒤에 여러 변형이 나오므로, 위의 것을 가리킬 때는 보통 귀납법(ordinary induction)이라 부르기로 한다.

위쪽 사슬에서 동그라미가 기저 단계이고 화살표 전부를 한 문장으로 증명하는 것이 귀납 단계다. 아래쪽은 화살표 하나가 빠진 사슬 — 그 뒤 전부가 근거를 잃는다. 이 장의 가짜 증명이 정확히 이 모양이다
<위쪽 사슬에서 동그라미가 기저 단계이고 화살표 전부를 한 문장으로 증명하는 것이 귀납 단계다. 아래쪽은 화살표 하나가 빠진 사슬 — 그 뒤 전부가 근거를 잃는다. 이 장의 가짜 증명이 정확히 이 모양이다>[원본 보기]

증명의 정형

4장의 WOP 증명에 정형이 있었던 것처럼 귀납 증명에도 정형이 있다. 아무리 복잡한 귀납 증명도 이 다섯 단계다.

다섯 단계 중 ④ 만 문제마다 다르다. 아래 두 메모가 실전에서 가장 자주 나는 잘못 두 가지이고, 그중 둘째가 이 장의 가짜 증명이 무너지는 자리다
<다섯 단계 중 ④ 만 문제마다 다르다. 아래 두 메모가 실전에서 가장 자주 나는 잘못 두 가지이고, 그중 둘째가 이 장의 가짜 증명이 무너지는 자리다>[원본 보기]

특히 ②를 소홀히 하지 마라. 귀납 가설을 적지 않은 귀납 증명은 대개 틀린 증명이다. 변수가 여럿일 때 어느 것으로 귀납하는지 밝히지 않으면 ④에서 무엇을 가정했는지 스스로도 헷갈린다.

예제 54

모든 음이 아닌 정수 n 에 대하여 i=1ni=n(n+1)2 임을 귀납법으로 증명하라. 4장에서 정렬성 원리로 증명한 것과 견주어 보라.

증명

뼈대는 이렇다. n 까지의 합을 안다고 하고 양변에 n+1 을 더한다. 그러면 오른쪽이 저절로 다음 식이 된다.

증명. 귀납법을 쓴다. 귀납 가설 P(n) 은 위의 등식으로 한다.

기저 단계. n=0 이면 좌변은 항이 없어 0 이고 우변은 01/2=0 이다. 따라서 P(0) 이 참이다.

귀납 단계. 어떤 nN 에 대해 P(n) 이 참이라고 가정한다. 양변에 n+1 을 더하면

i=1n+1i=n(n+1)2+(n+1)=n(n+1)+2(n+1)2=(n+1)(n+2)2

이고 이것이 P(n+1) 이다. 이 논증은 모든 nN 에서 통한다.

따라서 귀납법에 의해 모든 n 에서 P(n) 이 참이다.

4장의 WOP 증명과 견주어 보자. 길이는 거의 같지만 이쪽에는 귀류법이 없다. 반례 집합을 만들지 않고, "모순이다"라고 적지 않는다. 대신 "가정한다"로 시작한다. 어느 쪽이 읽기 쉬운가는 취향의 문제이지만, 이쪽이 계산 절차에 더 가깝다는 것은 분명하다. n 까지의 답에서 n+1 의 답을 만드는 방법이 증명 안에 적혀 있다.

예제 55

r1 인 수 r 와 모든 nN 에 대하여 1+r+r2++rn=rn+11r1 임을 귀납법으로 증명하라.

증명

뼈대는 앞과 같다. 양변에 rn+1 을 더하고 우변을 한 분수로 묶는다.

증명. 귀납법을 쓴다. 귀납 가설 P(n) 은 위의 등식으로 한다.

기저 단계. n=0 이면 좌변은 1 이고 우변은 (r1)/(r1)=1 이다. r1 이므로 분모가 0 이 아니다.

귀납 단계. P(n) 을 가정하고 양변에 rn+1 을 더한다.

1+r++rn+rn+1=rn+11r1+rn+1=rn+11+rn+1(r1)r1=rn+21r1

마지막 등호에서 분자를 정리했다. rn+11+rn+2rn+1=rn+21 이다. 이것이 P(n+1) 이다.

따라서 모든 n 에서 성립한다.

r1 이라는 조건이 어디에 쓰였는지 확인해 두자. 분모가 0 이 되지 않게 하는 데만 쓰였고 그것은 주장 자체가 성립하기 위한 조건이다. r=1 일 때 좌변은 n+1 이므로 공식이 아예 다르다.

예제 56

모든 정수 n>1 에 대하여 1+14+19++1n2<21n 임을 귀납법으로 증명하라.

증명

등식이 아니라 부등식이라는 점이 새롭다. 뼈대는 같다 — 양변에 1/(n+1)2 을 더하고, 그 결과가 목표 부등식의 우변보다 작은지 본다. 부등식에서는 마지막 단계가 계산이 아니라 비교다.

증명. n=2 부터 시작하는 귀납법을 쓴다. 귀납 가설 P(n) 은 위의 부등식으로 한다.

기저 단계. n=2 이면 좌변은 1+1/4=5/4 이고 우변은 21/2=3/2 다. 5/4<3/2 이므로 참이다.

귀납 단계. n2 에서 P(n) 을 가정한다. 양변에 1/(n+1)2 을 더하면

i=1n+11i2<21n+1(n+1)2

이다. 이제 오른쪽이 21/(n+1) 이하임을 보이면 된다. 그것은

1(n+1)21n1n+1=1n(n+1)

과 같은 말이고, n(n+1)(n+1)2 이므로 참이다. 두 부등식을 이으면 P(n+1) 이 나온다.

따라서 모든 n>1 에서 성립한다.

이 증명에서 어려운 곳은 가운데의 1/n1/(n+1) 을 알아보는 것이었다. 부등식의 귀납 증명은 대개 "더한 것이 우변의 증가분보다 작다"를 보이는 일이고, 그 증가분을 먼저 계산해 두면 목표가 분명해진다.

오류 찾기

다음 "증명"은 앞에서 증명한 것과 어긋나는 결론에 이른다. 어느 단계가 틀렸는가.

가짜 정리. 모든 n0 에 대하여 2+3+4++n=n(n+1)2 이다.

가짜 증명. 귀납법을 쓴다. P(n) 을 위의 등식이라 하자.

  1. 기저 단계. n=0 이면 좌변은 항이 없어 0 이고 우변도 0 이므로 P(0) 이 참이다.
  2. 귀납 단계. P(n) 을 가정한다. 즉 2+3++n=n(n+1)/2 이다.
  3. 양변에 n+1 을 더하면 2+3++n+(n+1)=n(n+1)/2+(n+1) 이다.
  4. 우변을 정리하면 (n+1)(n+2)/2 이다.
  5. 따라서 P(n)P(n+1) 이고, 귀납법에 의해 모든 n 에서 P(n) 이 참이다.
풀이 보기

결론이 거짓이다. n=3 이면 좌변은 2+3=5 이고 우변은 34/2=6 이다.

한 단계씩 보자. ②③④의 대수 계산은 전부 맞다. ①도 관례대로 옳다. 그런데 ③이 P(n+1) 을 증명한 것이 아니다.

P(n+1) 은 "2+3++(n+1)=(n+1)(n+2)/2"다. ③의 좌변이 그 좌변과 같은가. n2 일 때는 같다. 그런데 n=0 일 때는 다르다. P(0) 의 좌변은 항이 없어 0 이고, 여기에 n+1=1 을 더하면 1 이 된다. 그런데 P(1) 의 좌변은 "2 부터 1 까지의 합"이므로 역시 항이 없어 0 이다. 10 이다.

P(0)P(1) 이 증명되지 않았고 실제로 거짓이다. 사슬이 맨 처음 화살표에서 끊긴다. P(1) 부터는 전부 거짓이다.

얻을 교훈은 4장의 초기값 확인과 같은 것이다. 줄임표로 적은 합은 양 끝에서 다르게 행동한다. 2+3++nn1 에서 항이 없다. 시그마로 2ini 라 적으면 이 사실이 눈에 보이고, 귀납 단계가 n1 에서만 통한다는 것도 드러난다. 앞의 참인 정리에서는 좌변이 1 부터라 이 문제가 n=0 에서만 생기고, 그 자리가 마침 기저 단계였다.

시작점을 옮긴다

앞의 부등식 예제는 n>1 에서만 성립하는 명제였고, 그래서 기저 단계를 n=2 에서 잡았다. 이것은 귀납법의 다른 원리가 아니라 같은 원리를 옮겨 쓴 것이다. Q(n)::=P(n+2) 라 두면 Q 에 대해 0 부터 시작하는 보통 귀납법이 되고, 결론은 n2 인 모든 n 에서 P(n) 이 참이라는 것이다. 이 옮김은 늘 가능하므로 앞으로는 그때그때 "n=b 에서 시작하는 귀납법"이라 적고 넘어간다.

걸음의 크기도 옮길 수 있다. P(n)P(n+2) 만 증명했다면 무엇이 나오는가. 다음 예제가 그것을 정리한다.

예제 58

어떤 술어 P 에 대해 모든 nN 에서 P(n)P(n+3) 이 증명되었다고 하자. (가) 여기에 P(5) 를 더하면 어떤 결론이 나오는가. (나) n5 인 모든 n 에서 P(n) 이 참이라고 결론짓기 위해 무엇을 더 증명하면 되는가.

풀이 보기

무엇을 묻는가. 걸음이 세 칸일 때 사슬이 몇 개로 갈라지는가다.

(가) P(5) 에서 출발해 세 칸씩 뛰면 P(5),P(8),P(11),P(14), 를 얻는다. 즉 P(3k+5) 가 모든 kN 에서 참이다. P(6) 이나 P(7) 에 대해서는 아무것도 나오지 않는다. 세 칸 걸음은 N 을 나머지에 따라 세 갈래로 쪼개고, P(5) 는 그중 한 갈래만 켜기 때문이다.

(나) 세 갈래를 모두 켜야 하므로 연속한 세 값을 확보하면 된다. P(5), P(6), P(7) 을 증명하면 n5 인 모든 n 이 이 셋 중 하나에서 세 칸씩 뛰어 닿는다. P(5), P(6), P(8) 처럼 나머지가 겹치는 세 개로는 안 된다 — 8=5+3 이므로 P(8) 이 새로 켜는 갈래가 없고, 나머지가 1 인 갈래(7,10,13,)가 비어 있다.

답이 말이 되는가. 앞의 동전 예제가 정확히 이 구조였다. 3원 동전을 얹는 것이 P(n)P(n+3) 이고, 그래서 기저에서 연속한 세 값 8,9,10 을 확인했다. 걸음의 크기가 d 이면 연속한 d 개의 기저가 필요하다.

가정을 강하게 만들면 쉬워진다

귀납 증명이 막히는 가장 흔한 이유는 가정이 모자라서다. 그럴 때 첫 번째로 시도할 것은 이상하게 들린다. 증명하려는 명제를 더 센 것으로 바꾼다. 귀납 단계에서 그 센 명제를 가정으로 쓸 수 있게 되기 때문이다.

원서의 유명한 예로 확인해 보자. 한 변이 2n 인 정사각형 마당을 칸으로 나누고 가운데 한 칸에 조각상을 놓는다. 남은 칸을 세 칸을 덮는 L 자 타일로 빈틈없이 채울 수 있는가.

왼쪽에서 물음표 세 개가 막힌 자리다. 상이 가운데에만 있다고 가정하면 나머지 세 사분면에 가정을 쓸 자격이 없다. 가운데처럼 임시 상 셋을 놓으면 네 사분면 모두가 가정의 사정권에 들어온다
<왼쪽에서 물음표 세 개가 막힌 자리다. 상이 가운데에만 있다고 가정하면 나머지 세 사분면에 가정을 쓸 자격이 없다. 가운데처럼 임시 상 셋을 놓으면 네 사분면 모두가 가정의 사정권에 들어온다>[원본 보기]

예제 59

모든 n0 에 대하여, 한 변이 2n 인 마당의 가운데 한 칸에 상을 놓고 남은 칸을 L 자 타일로 덮을 수 있음을 증명하라.

증명

먼저 실패하는 시도를 보자. P(n) 을 "한 변이 2n 인 마당의 가운데에 상을 놓고 남은 칸을 덮을 수 있다"라 하면, 귀납 단계에서 한 변이 2n+1 인 마당을 네 사분면으로 쪼갠다. 상은 그중 한 사분면에 든다. 나머지 세 사분면에는 상이 없으므로 P(n) 을 쓸 수가 없다.

그래서 가설을 더 세게 바꾼다. P(n) 을 "한 변이 2n 인 마당에서 상이 어느 칸에 있어도 남은 칸을 덮을 수 있다"라 한다. 증명할 것이 더 많아졌지만 가정으로 쓸 것도 더 많아졌다.

증명. 귀납법을 쓴다. 귀납 가설 P(n) 은 위의 강화된 명제로 한다.

기저 단계. n=0 이면 마당이 한 칸뿐이고 상이 그 칸을 채우므로 덮을 것이 없다. P(0) 이 참이다.

귀납 단계. P(n) 을 가정한다. 한 변이 2n+1 인 마당과 그 안의 아무 칸에 놓인 상을 생각하자. 마당을 한 변이 2n 인 네 사분면으로 쪼갠다. 상은 정확히 한 사분면에 든다. 이제 나머지 세 사분면의, 마당 중심에 닿는 칸에 임시 상을 하나씩 놓는다.

네 사분면 모두 "한 변이 2n 이고 상이 하나 놓인 마당"이 되었으므로 P(n) 에 의해 각각 덮을 수 있다. 마지막으로 임시 상 세 개가 놓인 자리는 서로 붙어 L 자를 이루므로 L 자 타일 하나로 덮는다. 이것이 P(n+1) 이다.

따라서 모든 n 에서 성립하고, 상을 가운데에 놓은 것은 그 특수한 경우다.

챙길 것이 둘 있다. 첫째, 임시 상 셋이 반드시 L 자를 이룬다는 것 — 마당 중심에 닿는 네 칸에서 하나를 뺀 셋이므로 언제나 L 자다. 둘째, 이 증명은 타일을 놓는 알고리즘이기도 하다. 사분면으로 쪼개고 임시 상을 놓고 재귀로 내려가면 실제 배치가 나온다. 다만 강화가 언제나 통하는 것은 아니다. 강화한 주장이 실제로 참이어야 한다.

오류 찾기

다음은 이 과목에서 가장 유명한 가짜 증명이다. 어느 문장이 틀렸는가.

가짜 정리. n1 인 어떤 말 무리에서도 모든 말의 색이 같다.

가짜 증명. n 에 대한 귀납법을 쓴다. 귀납 가설 P(n) 은 "말 n 마리로 된 어떤 무리에서도 모두 색이 같다"로 한다.

  1. 기저 단계. n=1 이면 말이 한 마리이고 자기와 색이 같으므로 P(1) 이 참이다.
  2. 귀납 단계. n1 에서 P(n) 을 가정하고, 말 h1,h2,,hn,hn+1 을 생각한다.
  3. 가정에 의해 앞의 n 마리 h1,,hn 은 모두 색이 같다.
  4. 가정에 의해 뒤의 n 마리 h2,,hn+1 도 모두 색이 같다.
  5. 그러므로 h1hn+1 을 뺀 나머지 h2,,hn 과 색이 같다.
  6. 마찬가지로 hn+1h2,,hn 과 색이 같다.
  7. h1hn+1 이 모두 h2,,hn 과 색이 같으므로 n+1 마리 전부가 색이 같다.
  8. 따라서 P(n)P(n+1) 이고, 귀납법에 의해 모든 n1 에서 P(n) 이 참이다.
풀이 보기

결론은 물론 거짓이다. 색이 다른 말 두 마리를 데려오면 된다.

①은 옳다. ②③④도 옳다 — 두 부분 무리는 각각 크기가 n 이므로 가정을 쓸 자격이 있다. 그런데 ⑤가 틀렸다.

⑤는 "나머지 h2,,hn"이라 적었다. 줄임표가 말이 몇 마리 남아 있는 것처럼 보이게 하지만, n=1 이면 그런 말이 하나도 없다. 그때 말 무리는 h1,h2 뿐이고, h1 이 색을 견줄 상대가 없다. ⑦의 "모두 색이 같으므로"도 공유하는 말이 있을 때만 쓸 수 있는 말이다.

P(1)P(2) 이 증명되지 않았다. P(1) 은 참이고 P(2)P(3), P(3)P(4) … 도 모두 옳게 증명되었다. 그런데 사슬의 두 번째 고리 하나가 빠졌으므로 P(2) 부터는 아무 근거가 없다.

왼쪽처럼 말이 넷일 때는 두 부분 무리가 h₂ 와 h₃ 를 공유해서 색이 이어진다. 오른쪽처럼 둘일 때는 공유하는 말이 없어 두 색을 이을 방법이 없다
<왼쪽처럼 말이 넷일 때는 두 부분 무리가 h₂ 와 h₃ 를 공유해서 색이 이어진다. 오른쪽처럼 둘일 때는 공유하는 말이 없어 두 색을 이을 방법이 없다>[원본 보기]

여기서 흔한 오해를 하나 짚어 두자. "n2 에서 P(n) 이 거짓이니 거짓인 것을 가정한 것이 잘못"이라고 설명하면 틀린 설명이다. 귀납 단계에서 하는 일은 P(n) 이 참임을 주장하는 것이 아니라 함의 P(n)P(n+1) 을 증명하는 것이고, 3장에서 본 대로 함의는 가정이 거짓이면 자동으로 참이다. 거짓인 것을 가정하는 것은 아무 문제가 아니다. 문제는 그 함의를 n=1 에서 증명하지 못한 것이다.

강한 귀납법

4장에서 소인수분해의 존재를 WOP 로 증명할 때, nn=km 으로 쪼개고 km 에 대한 정보를 썼다. km 이 얼마인지는 모르지만 둘 다 n 보다 작다는 것만 알았다. 보통 귀납법으로는 이것을 다룰 수 없다 — P(n) 하나만 가정할 수 있는데 필요한 것은 P(k)P(m) 이다.

그래서 가정을 넓힌다.

강한 귀납법의 원리. P 를 음이 아닌 정수에 대한 술어라 하자. 만약

모든 mN 에 대해 P(m) 이 참이다. 추론 규칙 서식으로는

P(0),nN.(kn.P(k))P(n+1)mN.P(m)

다. 보통 귀납법과 다른 것은 귀납 단계에서 손에 쥐는 가정의 넓이 하나뿐이다. 증명의 정형도 같고, 두 곳만 바꾼다 — 첫 줄에 "강한 귀납법을 쓴다"고 적고, 귀납 단계에서 n 이하 전부를 가정한다.

두 방법을 고르는 기준은 오른쪽 열이다. 아래 첫 메모가 중요하다 — 강한 귀납법은 사실 더 세지 않고, 가설에 한정사 하나를 붙이면 보통 귀납법이 된다. 그런데도 구별해 쓰는 이유는 독자를 위해서다
<두 방법을 고르는 기준은 오른쪽 열이다. 아래 첫 메모가 중요하다 — 강한 귀납법은 사실 더 세지 않고, 가설에 한정사 하나를 붙이면 보통 귀납법이 된다. 그런데도 구별해 쓰는 이유는 독자를 위해서다>[원본 보기]

예제 61

피보나치 수는 F(0)=0, F(1)=1, 그리고 n2 일 때 F(n)=F(n1)+F(n2) 로 정의된다. 모든 n0 에 대하여 "F(n) 이 짝수인 것과 F(n+3) 이 짝수인 것이 동치"임을 증명하라.

증명

뼈대는 이렇다. F(n+4)F(n+3)F(n+2) 로 풀고, F(n+1)F(n)F(n1) 로 푼 다음, 가정 두 개를 써서 두 줄을 잇는다. 두 칸 뒤를 참조하는 정의이므로 강한 귀납법이 필요하고 기저도 두 개다.

먼저 정수 m,k 에 대해 다음이 성립함을 확인해 둔다. m+k 가 짝수인 것은 "m 이 짝수인 것과 k 가 짝수인 것이 동치"와 같다. 둘 다 짝수이거나 둘 다 홀수일 때만 합이 짝수이기 때문이다. 이것을 () 라 부르자.

증명. 강한 귀납법을 쓴다. 귀납 가설 P(n) 은 "F(n) 이 짝수 F(n+3) 이 짝수"로 한다.

기저 단계. n=0 일 때 F(0)=0F(3)=2 는 둘 다 짝수다. n=1 일 때 F(1)=1F(4)=3 은 둘 다 홀수다. 어느 쪽이든 동치가 성립한다.

귀납 단계. n1 에서 P(n)P(n1) 을 가정하고 P(n+1) 을 보인다. 동치 사슬로 잇는다.

F(n+1) 짝수F(n)+F(n1) 짝수

[F(n) 짝수F(n1) 짝수]()

[F(n+3) 짝수F(n+2) 짝수]P(n),P(n1)

F(n+3)+F(n+2) 짝수()

F(n+4) 짝수

마지막 줄이 P(n+1) 이다.

따라서 모든 n 에서 성립한다. 실제 값으로 확인해 보면 0,1,1,2,3,5,8,13,21 에서 짝수는 세 칸마다 온다.

여기서 눈여겨볼 것은 동치를 동치 사슬로 이은 것이다. 3장에서 세운 방법이고, 이 증명에서는 그것 없이는 논증을 적기가 매우 번거롭다. 각 단계가 양방향인지 확인하라 — () 도 가정도 모두 동치다.

예제 62

1 보다 큰 모든 정수는 소수들의 곱으로 쓸 수 있음을 강한 귀납법으로 증명하라. 4장에서 WOP 로 증명한 것과 견주어 보라.

증명

뼈대는 WOP 증명과 같다. 소수가 아니면 두 작은 수의 곱이고, 그 둘에는 가정을 쓸 수 있다. 다른 것은 반례를 잡지 않고 곧바로 만들어 낸다는 점이다.

증명. 강한 귀납법을 쓴다. 귀납 가설 P(n) 은 "n 은 소수들의 곱이다"로 하고, n2 에서 시작한다. 소수 하나는 길이 1 인 곱으로 본다.

기저 단계. n=2 는 소수이므로 P(2) 가 참이다.

귀납 단계. n2 이고 2 부터 n 까지 모두 소수들의 곱이라고 가정한다. n+1 을 본다. 경우를 나눈다.

n+1 이 소수이면 길이 1 인 곱이므로 끝난다.

n+1 이 소수가 아니면 정의에 의해 n+1=km 인 정수 k,m 이 있고 둘 다 2 이상 n 이하다. 강한 귀납 가정에 의해 km 이 각각 소수들의 곱이므로, 두 곱을 이어 붙이면 n+1 도 소수들의 곱이다.

어느 경우에도 P(n+1) 이 참이므로 모든 n2 에서 성립한다.

4장의 WOP 증명과 나란히 놓아 보자. 같은 논증이다. WOP 쪽에서 "최소 반례 c 보다 작은 곳에서는 참"이라고 얻은 정보가 여기서는 "n 이하에서 참"이라는 가정으로 처음부터 주어진다. WOP 쪽은 귀류법의 겉옷을 한 겹 더 입고 있을 뿐이다. 다음 절에서 이 인상을 정리로 만든다.

예제 63

어떤 나라에 3원 동전과 5원 동전만 있다. 8원 이상의 모든 금액을 이 두 동전으로 만들 수 있음을 증명하라.

증명

뼈대는 이렇다. 동전 하나를 얹는 것이 귀납 단계다. 3원을 얹으면 세 칸 오른쪽으로 가므로, 8·9·10 을 확보하면 그 오른쪽 전부가 따라온다.

동그라미 셋이 기저 단계에서 손으로 확인하는 금액이다. 화살표가 3원 동전 하나를 얹는 일이고, 한 칸이 아니라 세 칸을 뛰기 때문에 강한 귀납법이 필요하다
<동그라미 셋이 기저 단계에서 손으로 확인하는 금액이다. 화살표가 3원 동전 하나를 얹는 일이고, 한 칸이 아니라 세 칸을 뛰기 때문에 강한 귀납법이 필요하다>[원본 보기]

증명. 강한 귀납법을 쓴다. 귀납 가설 P(n) 은 "금액 n+8 을 3원 동전과 5원 동전으로 만들 수 있다"로 한다.

기저 단계. P(0): 8=3+5 다.

귀납 단계. kn 인 모든 k 에 대해 P(k) 를 가정하고 P(n+1) 을 본다. 경우를 나눈다.

n+1=1 이면 만들 금액이 9 이고 9=3+3+3 이다.

n+1=2 이면 만들 금액이 10 이고 10=5+5 이다.

n+13 이면 0n2n 이므로 강한 귀납 가정에 의해 금액 (n2)+8 을 만들 수 있다. 거기에 3원 동전 하나를 더하면 (n+1)+8 이 된다.

n0 이므로 n+11 이고, 세 경우가 빠짐없이 모든 가능성을 덮는다. 따라서 모든 n 에서 성립한다.

왜 기저를 세 개 확인해야 했는지 확인해 두자. 셋째 경우에서 n2세 칸 내려가므로, 그 논증이 통하지 않는 n+1=1,2 를 따로 처리해야 한다. 4장의 우표 예제에서 "c11 을 확보해야 c38 이 된다"고 했던 것과 정확히 같은 자리다. 확인할 초기값의 개수는 걸음의 크기가 정한다.

예제 64

상자 n 개를 한 무더기로 쌓아 놓고 다음을 반복한다. 무더기 하나를 비지 않은 두 무더기로 쪼개고, 크기가 ab 인 두 무더기가 되었다면 ab 점을 받는다. 모든 무더기가 상자 한 개가 되면 끝난다. 어떻게 쪼개도 총점이 n(n1)/2 임을 증명하라.

증명

뼈대는 이렇다. 첫 쪼갬의 점수와 두 조각에서 얻는 점수를 더하면 항이 서로 벌충되어 원래 크기의 식으로 돌아온다. 어디로 쪼갤지 모르므로 강한 귀납법이다.

왼쪽 둘이 서로 다른 첫 쪼갬인데 합계가 같다. 오른쪽 메모가 강한 귀납법이 필요한 이유다 — 다음 판의 크기가 무엇이 될지 모른다
<왼쪽 둘이 서로 다른 첫 쪼갬인데 합계가 같다. 오른쪽 메모가 강한 귀납법이 필요한 이유다 — 다음 판의 크기가 무엇이 될지 모른다>[원본 보기]

증명. 강한 귀납법을 쓴다. 귀납 가설 P(n) 은 "상자 n 개를 어떻게 쪼개도 총점이 n(n1)/2 다"로 하고 n1 에서 시작한다.

기저 단계. n=1 이면 쪼갤 수 없으므로 총점이 0 이고, 10/2=0 이다.

귀납 단계. n1 에서 P(1),,P(n) 을 가정하고 상자 n+1 개를 생각한다. 첫 쪼갬으로 크기 ab 인 두 무더기가 되었다고 하자. a+b=n+1 이고 1a,bn 이다. 그다음은 두 무더기를 각각 끝까지 쪼개는 일이고, 두 무더기 사이에 점수가 오가지 않으므로

(총점)=ab+(크기 a 를 쪼갠 점수)+(크기 b 를 쪼갠 점수)

다. P(a)P(b) 를 쓰면

=ab+a(a1)2+b(b1)2=2ab+a2a+b2b2=(a+b)2(a+b)2

이고, a+b=n+1 을 넣으면 (n+1)n/2 다. 이것이 P(n+1) 이다.

따라서 모든 n1 에서 성립한다.

결론이 말하는 것을 새겨 두자. 전략이 총점을 바꾸지 못한다. 무엇을 어떻게 쪼개도 같은 점수가 나온다. 이 사실은 실제로 게임을 해 보아서는 알기 어렵고, 증명에서 실제로 쓴 것은 a+b 로 묶히는 대수 계산 한 줄뿐이다.

귀납법과 정렬성 원리는 같은 것이다

4장 끝에서 "정렬성 원리와 귀납법은 같은 힘을 갖는다"고 하고 증명을 미뤘다. 이제 갚는다. 실은 세 원리가 있고 셋이 서로를 유도한다.

화살표가 삼각형을 이루며 한 바퀴 돈다는 것이 요점이다. 어느 하나를 공리로 잡아도 나머지 둘이 정리로 따라온다. 아래 메모는 그래도 셋을 다 배우는 이유다
<화살표가 삼각형을 이루며 한 바퀴 돈다는 것이 요점이다. 어느 하나를 공리로 잡아도 나머지 둘이 정리로 따라온다. 아래 메모는 그래도 셋을 다 배우는 이유다>[원본 보기]

예제 65

강한 귀납법으로 증명할 수 있는 것은 보통 귀납법으로도 증명할 수 있음을 보여라.

증명

뼈대는 한 줄이다. 가설에 한정사를 하나 붙인다.

증명. 술어 P 에 대해 강한 귀납법의 두 조건이 성립한다고 하자. 새 술어를

Q(n)::=kn.P(k)

로 정의한다. Q 에 대해 보통 귀납법의 두 조건을 확인한다.

Q(0) 은 "k0 인 모든 kN 에 대해 P(k)", 즉 P(0) 이고 가정에 의해 참이다.

Q(n)Q(n+1): Q(n) 을 가정하면 P(0),,P(n) 이 모두 참이다. 그러면 강한 귀납법의 둘째 조건에 의해 P(n+1) 도 참이다. 따라서 P(0),,P(n+1) 이 모두 참, 즉 Q(n+1) 이다.

보통 귀납법에 의해 모든 n 에서 Q(n) 이 참이다. 특히 Q(m)P(m) 을 함의하므로 모든 m 에서 P(m) 이 참이다.

이 유도가 기계적이라는 점이 중요하다. 강한 귀납법 증명을 받아 가설 한 줄만 고쳐 쓰면 보통 귀납법 증명이 된다. 그래서 강한 귀납법은 이름과 달리 더 센 원리가 아니다. 그래도 둘을 구별해 쓰는 것은 독자에게 신호를 주기 위해서다. "강한 귀납법을 쓴다"는 한마디가 n+1 의 논증이 n 하나에서 나오지 않는다는 것을 알려 준다.

예제 66

보통 귀납법의 원리에서 정렬성 원리를 유도하라. 즉 귀납법을 공리로 받아들이고 "공집합이 아닌 N 의 부분집합에는 최소 원소가 있다"를 증명하라.

증명

뼈대는 이렇다. 대우를 잡는다. 최소 원소가 없는 집합 C 가 있다고 하고, 귀납법으로 "어떤 수도 C 에 들어 있지 않다"를 증명한다. 그러면 C 는 공집합이다.

증명. CN 이 최소 원소를 갖지 않는다고 하자. 술어를

P(n)::=0 부터 n 까지의 어떤 수도 C 에 들어 있지 않다”

로 정의하고 귀납법을 쓴다.

기저 단계. 0C 이라면 0N 의 어떤 원소보다도 작거나 같으므로 C 의 최소 원소가 된다. 가정에 어긋나므로 0C 이고 P(0) 이 참이다.

귀납 단계. P(n) 을 가정한다. 즉 0,1,,n 이 모두 C 밖에 있다. 이때 n+1C 이라면, C 의 원소는 모두 n+1 이상이므로 n+1C 의 최소 원소가 된다. 가정에 어긋나므로 n+1C 이고, 따라서 P(n+1) 이 참이다.

귀납법에 의해 모든 n 에서 P(n) 이 참이다. 그러면 어떤 음이 아닌 정수도 C 에 들어 있지 않으므로 C= 이다.

대우를 취하면 공집합이 아닌 CN 는 최소 원소를 갖는다는 정렬성 원리가 된다.

반대 방향 — 정렬성 원리에서 귀납법을 유도하는 것 — 은 4장의 정형이 이미 한 일이다. 반례 집합 C={n:¬P(n)} 의 최소 원소 c 를 잡으면 c>0 이고 P(c1) 이 참이므로 귀납 단계에 의해 P(c) 도 참이 되어 모순이다. 그러니 세 원리는 같은 사실의 세 가지 서식이다. 이 사실이 8장에서 값을 한다 — 프로그램이 옳게 도는 것은 귀납법으로, 언젠가 끝나는 것은 정렬성 원리로 증명하는데, 둘은 같은 원리의 두 얼굴이다.

예제 67

공집합이 아닌 유한한 실수 집합에는 최소 원소가 있음을 귀납법으로 증명하라. 4장에서는 WOP 로 증명했다.

증명

뼈대는 이렇다. 원소 하나를 떼어 내면 크기가 하나 줄어든 집합이 되고, 거기에 가정을 쓴다. 실수에는 귀납법을 걸 수 없으므로 집합의 크기에 건다.

증명. 귀납법을 쓴다. 귀납 가설 P(n) 은 "원소가 n 개인 실수 집합에는 최소 원소가 있다"로 하고 n1 에서 시작한다.

기저 단계. n=1 이면 하나뿐인 원소가 최소 원소다.

귀납 단계. P(n) 을 가정하고 원소가 n+1 개인 실수 집합 F 를 생각한다. F 의 원소 하나를 r0 라 하고 F::=F{r0} 라 하자. n1 이므로 F 는 공집합이 아니고 원소가 n 개다. 가정에 의해 F 에는 최소 원소 r1 이 있다.

이제 min(r0,r1)F 의 최소 원소다. F 의 원소는 r0 이거나 F 의 원소이고 후자는 모두 r1 이상이기 때문이다. 따라서 P(n+1) 이 참이다.

4장의 증명과 견주면 글자 수가 줄었다. 반례 집합을 정의하고 모순으로 몰아가는 겉옷이 없어졌다. 두 증명이 실제로 한 일 — 원소 하나를 떼어 내고 나머지에 정보를 쓰는 것 — 은 같다.

이 예제가 9장의 예고이기도 하다. 유한집합은 "공집합에서 시작해 원소를 하나씩 넣어 만드는 것"으로 볼 수 있고, 그렇게 보면 방금의 증명이 그 구성 방식을 그대로 따라간 것이 된다. 9장에서 이 발상을 구조적 귀납법으로 정리한다.

이 장에서 새로 나온 것

용어·기호
보통 귀납법P(0) 그리고 n.P(n)P(n+1) 에서 m.P(m) 을 얻는다
귀납 가설(induction hypothesis)P(n). 증명의 둘째 단계에서 반드시 명시한다
기저 단계 · 귀납 단계P(0) 을 확인하는 자리 · P(n)P(n+1) 을 증명하는 자리
강한 귀납법귀납 단계에서 kn.P(k) 를 모두 가정한다
가설의 강화증명이 막히면 더 센 명제로 바꾼다. 가정으로 쓸 것도 함께 늘어난다
F(n)피보나치 수. F(0)=0, F(1)=1, F(n)=F(n1)+F(n2)
세 원리의 동등성보통 귀납법 · 강한 귀납법 · 정렬성 원리가 서로를 유도한다

챙겨 갈 것은 다섯이다.

다음 장에서는 이 도구를 프로그램에 겨눈다. 한 걸음씩 상태를 바꾸어 가는 과정을 상태 기계로 적고, 걸음마다 유지되는 성질(불변량)로 "결과가 옳다"를 증명하고, 걸음마다 줄어드는 값(측도)으로 "언젠가 끝난다"를 증명한다. 앞이 귀납법이고 뒤가 정렬성 원리다. 이 장에서 둘이 같다는 것을 보았으니, 8장은 그 하나의 원리를 두 방향으로 쓰는 장이다.

상태 기계

프로그램이 옳게 돈다는 것을 어떻게 증명하는가. 실행해 보는 것으로는 안 된다 — 3장에서 본 대로 유한한 표본은 전칭명제를 세우지 못한다. 필요한 것은 모든 입력, 모든 실행에 대해 참인 논증이다.

이 장의 도구는 둘이다. 걸음마다 유지되는 성질을 찾아 "멈췄다면 답이 옳다"를 증명하고, 걸음마다 줄어드는 값을 찾아 "언젠가 멈춘다"를 증명한다. 앞이 귀납법이고 뒤가 정렬성 원리다. 7장에서 둘이 같은 원리라는 것을 보았으니, 이 장은 그 하나의 원리를 두 방향으로 쓰는 장이다.

그래서 먼저 "한 걸음씩 진행하는 과정"을 형식적으로 적는 방법이 필요하다. 그것이 상태 기계(state machine)다. 6장의 이항관계를 그대로 쓴다 — 새로운 것은 이름뿐이다.

장 끝에는 이 블록의 백미를 둔다. 서로 짝을 지어야 하는 사람들이 있고 각자 선호가 다를 때, 아무도 짝을 바꾸려 하지 않는 배치가 언제나 존재하는가. 답은 존재한다는 것이고, 증명 도구는 이 장에서 세우는 불변량과 측도 둘뿐이다.

상태와 전이

정의. 상태 기계는 집합 위의 이항관계다. 집합의 원소를 상태(state), 관계를 전이 관계(transition relation), 관계의 그래프를 상태 그래프(state graph)라 부르고, 상태 하나를 시작 상태(start state)로 지정한다. 상태 q 에서 r 로 가는 전이를 qr 로 적는다.

넘침 상태에서 나가는 화살표가 자기 자신으로만 간다는 것 — 한 번 들어가면 나올 수 없다 — 이 이 기계의 성격이다. 아래 두 메모에서 결정적·비결정적의 구별과, 이것이 6장의 이항관계라는 것을 확인해 두자
<넘침 상태에서 나가는 화살표가 자기 자신으로만 간다는 것 — 한 번 들어가면 나올 수 없다 — 이 이 기계의 성격이다. 아래 두 메모에서 결정적·비결정적의 구별과, 이것이 6장의 이항관계라는 것을 확인해 두자>[원본 보기]

두 가지 말을 더 정한다.

한 상태에서 나가는 전이가 하나 이하인 기계를 결정적(deterministic)이라 하고, 여러 곳으로 갈 수 있으면 비결정적(nondeterministic)이라 한다. 비결정적 기계에는 실행이 여러 가지 있고, 그래서 "어떤 실행에서도" 성립하는 것을 증명해야 한다.

예제 68

위 그림의 계수기를 상태 기계로 정확히 적어라. 그리고 상태 "넘침"이 도달 가능한지 답하라.

풀이 보기

무엇을 묻는가. 상태 집합·시작 상태·전이 관계 세 가지를 명시하는 일이다.

상태::={0,1,,99}{넘침}

시작 상태::=0

전이::={nn+1:0n<99}{99넘침,넘침넘침}

"넘침"은 도달 가능하다. 0199넘침 이 실행이기 때문이다.

답이 말이 되는가. 도달 가능함을 보이는 것은 쉽다 — 실행 하나를 제시하면 된다. 어려운 것은 도달 불가능함을 보이는 일이다. 실행이 무한히 많을 수 있으므로 하나씩 확인할 수 없다. 그것을 하는 방법이 다음 절이다.

불변량 원리

로봇이 원점에서 출발해 무한한 정수 격자 위를 움직인다. 한 걸음에 대각선으로 한 칸만 갈 수 있다. 즉 상태는 정수 좌표 (m,n) 이고 전이는

(m,n)(m±1,n±1)

이다. 이 로봇이 (1,0) 에 도달할 수 있는가.

왼쪽에서 초록 점만 도달 가능하다. 오른쪽 네 줄이 증명의 전부이고, 전이가 네 가지뿐임을 빠짐없이 세는 것이 논증의 절반이다
<왼쪽에서 초록 점만 도달 가능하다. 오른쪽 네 줄이 증명의 전부이고, 전이가 네 가지뿐임을 빠짐없이 세는 것이 논증의 절반이다>[원본 보기]

예제 69

위 로봇이 (1,0) 에 도달할 수 없음을 증명하라.

증명

뼈대는 이렇다. 걸음마다 변하지 않는 것을 찾는다. 좌표의 합이 짝수라는 성질이 그것이다.

성질에 이름을 붙인다. 짝합((m,n))::=[m+n 이 짝수다].

보조정리. qr 이고 짝합(q) 이면 짝합(r) 이다.

증명. 전이는 (m,n)(m±1,n±1) 네 가지뿐이고, 좌표의 합은 각각 +2, 0, 0, 2 만큼 변한다. 짝수에 0, 2, 2 를 더해도 짝수다.

정리의 증명. 걸음 수 n 에 대한 귀납법을 쓴다. 귀납 가설은

P(n)::=n 걸음에 도달할 수 있는 어떤 상태 q 에 대해서도 짝합(q)

로 한다. 기저 단계. 0 걸음에 도달할 수 있는 상태는 시작 상태 (0,0) 뿐이고 0+0 은 짝수다.

귀납 단계. P(n) 을 가정하고, n+1 걸음에 도달하는 상태 r 를 잡는다. 그러면 n 걸음에 도달하는 상태 q 가 있어 qr 다. 가정에 의해 짝합(q) 이고, 보조정리에 의해 짝합(r) 다.

따라서 모든 도달 가능한 상태에서 좌표의 합이 짝수다. 1+0=1 은 홀수이므로 (1,0) 은 도달 불가능하다.

이 증명에서 어려운 곳은 계산이 아니라 무엇이 변하지 않는지 알아보는 것이었다. 그것을 찾으면 나머지는 전이를 빠짐없이 세는 기계적인 일이다.

불변량 원리의 진술

방금의 귀납 논증은 앞으로 여러 번 되풀이된다. 그래서 한 번만 하고 이름을 붙여 둔다.

정의. 상태 기계의 보존되는 불변량(preserved invariant)은 상태에 대한 술어 P 로서, P(q) 가 참이고 qr 이면 P(r) 도 참인 것이다.

불변량 원리(Invariant Principle). 보존되는 불변량이 시작 상태에서 참이면 도달 가능한 모든 상태에서 참이다.

왼쪽 두 상자가 증명할 것, 오른쪽이 얻는 것이다. 아래 첫 메모가 왜 이것이 귀납법인지이고, 둘째 메모의 두 함정은 이 장에서 가장 자주 나는 잘못이다
<왼쪽 두 상자가 증명할 것, 오른쪽이 얻는 것이다. 아래 첫 메모가 왜 이것이 귀납법인지이고, 둘째 메모의 두 함정은 이 장에서 가장 자주 나는 잘못이다>[원본 보기]

두 가지 함정을 미리 못 박아 둔다.

이 원리를 처음 정식화한 사람은 1967년의 로버트 플로이드다. 그는 프로그램 검증과 구문 분석에 대한 업적으로 튜링상을 받았고, 9장에서 그의 이름이 한 번 더 나온다.

물통 두 개로 4 L 를 만든다

3 L 물통과 5 L 물통이 있다. 눈금은 없고 통을 가득 채우거나 완전히 비우거나 한쪽에서 다른 쪽으로 옮기는 일만 할 수 있다. 큰 통에 정확히 4 L 를 담을 수 있는가.

상태를 (b,l) — 큰 통의 물과 작은 통의 물, 단위는 L — 로 두면 시작 상태는 (0,0) 이고 전이는 여섯 가지다. 작은 통 채우기, 큰 통 채우기, 작은 통 비우기, 큰 통 비우기, 작은 통에서 큰 통으로 옮기기, 큰 통에서 작은 통으로 옮기기. 옮기기는 받는 쪽이 넘치는지에 따라 두 갈래다.

위쪽 실행 하나가 5 L 물통에서의 답이다. 아래 왼쪽에서 초록 점 여덟 개가 9 L 물통에서 도달 가능한 상태 전부이고, 4 L 자리가 그 격자에 없다
<위쪽 실행 하나가 5 L 물통에서의 답이다. 아래 왼쪽에서 초록 점 여덟 개가 9 L 물통에서 도달 가능한 상태 전부이고, 4 L 자리가 그 격자에 없다>[원본 보기]

예제 70

3 L 물통과 5 L 물통으로 큰 통에 정확히 4 L 를 담는 실행을 제시하라.

풀이 보기

무엇을 묻는가. 도달 가능성이므로 실행 하나만 보이면 된다.

어느 관계를 쓰는가. 4 L 를 직접 만들 수는 없으니 "큰 통에 1 L 를 남겨 두고 작은 통을 부으면 4 L"라는 역방향 발상으로 간다. 큰 통에 1 L 를 만드는 방법은 5 L 를 채워 놓고 작은 통으로 두 번 덜어내는 것이다.

(0,0)(0,3)(3,0)(3,3)(5,1)(0,1)(1,0)(1,3)(4,0)

각 걸음을 말로 적으면 이렇다. 작은 통 채움 → 작은 통을 큰 통에 부음 → 작은 통 채움 → 작은 통을 큰 통에 부음(큰 통이 5 L 로 차고 작은 통에 1 L 남음) → 큰 통 비움 → 작은 통을 큰 통에 부음 → 작은 통 채움 → 작은 통을 큰 통에 부음.

답이 말이 되는가. 마지막 상태에서 큰 통에 1+3=4 L 가 들어 있고 이는 5 L 를 넘지 않는다. 물의 총량이 걸음마다 어떻게 바뀌는지 확인해 보면 계산 실수를 잡을 수 있다.

예제 71

큰 통이 9 L 로 바뀌면 어떤 방법으로도 큰 통에 4 L 를 담을 수 없음을 증명하라.

증명

뼈대는 이렇다. 3 과 9 는 둘 다 3 의 배수다. 그러면 물의 양이 3 의 배수인 상태를 벗어날 수가 없다.

증명. P((b,l))::=[b 와 l 이 둘 다 3 의 배수다] 라 하고 이것이 보존되는 불변량임을 보인다. P((b,l)) 을 가정하고 여섯 가지 전이를 확인한다.

작은 통 채우기: 새 상태는 (b,3) 이고 3 은 3 의 배수다. 큰 통 채우기: (9,l) 이고 9 도 3 의 배수다. 비우기 두 가지: (b,0)(0,l) 이고 0 은 3 의 배수다.

작은 통에서 큰 통으로 옮기기: 넘치지 않으면 (b+l,0) 이고 3 의 배수 둘의 합은 3 의 배수다. 넘치면 (9,l(9b)) 이고 3 의 배수들의 합과 차이므로 역시 3 의 배수다. 큰 통에서 작은 통으로 옮기기도 대칭이다.

어느 경우에도 P 가 유지된다. 시작 상태 (0,0) 에서 P 가 참이므로 불변량 원리에 의해 도달 가능한 모든 상태에서 두 값이 3 의 배수다. 4 는 3 의 배수가 아니므로 (4,l) 꼴의 상태는 도달 불가능하다.

왜 5 L 통에서는 되고 9 L 통에서는 안 되는지 이제 보인다. gcd(3,5)=1 이고 gcd(3,9)=3 이다. 얻을 수 있는 양은 두 통 용량의 최대공약수의 배수이고, 그 사실의 증명은 11장의 정수론이 한다.

오류 찾기

다음 "증명"은 위의 9 L 물통 기계에 대한 것이다. 결론이 거짓인데 어느 단계가 틀렸는가.

가짜 정리. 시작 상태를 (1,0) 으로 바꾸면 (0,0) 에 결코 도달할 수 없다.

  1. 앞에서 P((b,l))::=[b,l 이 둘 다 3 의 배수다] 가 보존되는 불변량임을 증명했다.
  2. P 가 보존된다는 것은 "전이가 P 를 유지한다"는 뜻이다.
  3. 그러면 ¬P 도 보존된다. P 를 유지하는 전이는 ¬P 도 유지할 것이다.
  4. 새 시작 상태 (1,0) 에서 ¬P 가 참이다.
  5. 불변량 원리에 의해 도달 가능한 모든 상태에서 ¬P 가 참이다.
  6. (0,0)P 를 만족하므로 도달 불가능하다.
풀이 보기

결론이 거짓이다. (1,0) 에서 큰 통을 비우면 곧바로 (0,0) 이다.

①은 앞에서 증명한 그대로다. ②도 정의를 다시 말한 것이다. ③이 틀렸다.

보존의 정의를 논리식으로 적어 보자. q,r.(P(q)qr)P(r) 다. 5장에서 배운 대로 대우를 취하면

q,r.(¬P(r)qr)¬P(q)

가 된다. 즉 ¬P화살표를 거꾸로 따라갈 때 유지된다. 앞으로 가는 방향에 대해서는 아무 말도 하지 않는다. 실제로 (1,0)(0,0)¬P 인 상태에서 P 인 상태로 가는 전이다.

얻을 교훈은 하나다. 보존되는 불변량의 부정은 보존되는 불변량이 아니다. 이 성질이 비대칭인 것은 정의가 "참인 쪽에서만" 요구하기 때문이다. 불변량으로 도달 불가능성을 보일 때는 목표 상태가 불변량을 어기는지를 확인해야 하고, 시작 상태가 어기는 것을 확인해서는 아무것도 나오지 않는다.

예제 73

4×4 칸에 1 부터 15 까지 번호가 붙은 타일과 빈 칸 하나가 있고, 빈 칸에 이웃한 타일을 밀어 넣을 수 있다. 왼쪽 위부터 차례로 1,2,,15 가 놓이고 오른쪽 아래가 빈 상태에서 출발해, 번호가 정확히 거꾸로 놓인 상태(15,14,,1 순서, 오른쪽 아래가 빈 칸)에 도달할 수 없음을 증명하라.

증명

뼈대는 이렇다. 홀짝 하나를 찾는다. 타일 순서의 "뒤집힌 쌍" 개수와 빈 칸의 행 번호를 더한 값의 홀짝이 그것이다.

상태를 두 가지로 적는다. 타일을 왼쪽에서 오른쪽, 위에서 아래로 읽어 빈 칸을 무시한 목록 L 과, 빈 칸의 좌표 (i,j) 다. L 에서 앞에 있는 수가 뒤에 있는 수보다 큰 쌍을 뒤집힌 쌍이라 하고 그 개수를 p(L) 이라 하자. 상태 S=(L,(i,j))홀짝par(S)::=(p(L)+i)mod2 로 정의한다.

보조정리. par 는 전이로 변하지 않는다.

증명. 두 경우다. 타일을 좌우로 밀면 목록에서 인접한 두 자리 중 빈 칸 쪽으로 타일이 옮겨 갈 뿐이므로 목록 L 이 바뀌지 않고 빈 칸의 행 번호 i 도 바뀌지 않는다. 홀짝은 그대로다.

타일을 위아래로 밀면 그 타일이 목록에서 정확히 세 칸 이동한다(한 행이 네 칸이고 빈 칸을 무시하므로 타일 세 개를 지나친다). 타일 하나를 지날 때마다 뒤집힌 쌍의 개수가 ±1 변하므로 p(L) 은 홀수만큼 변한다. 동시에 i1 만큼 변한다. 합 p(L)+i 는 홀수 더하기 홀수, 즉 짝수만큼 변하므로 홀짝은 그대로다.

정리의 증명. 시작 상태에서 L=(1,2,,15) 이므로 p(L)=0 이고 빈 칸은 넷째 행이므로 i=4 다. 홀짝은 0 이다.

목표 상태에서 L=(15,14,,1) 이므로 모든 쌍이 뒤집혀 있고 p(L)=(152)=105 다. 빈 칸은 역시 넷째 행이므로 i=4 이고 홀짝은 (105+4)mod2=1 이다.

홀짝이 보존되는 불변량이고 두 상태의 홀짝이 다르므로 목표 상태는 도달 불가능하다.

여기서 값나가는 것은 불변량을 찾는 데 정해진 방법이 없다는 사실이다. 도달 가능한 상태를 여럿 만들어 보고 공통점을 찾는 것이 표준적인 출발점이다. 이 문제에서 "뒤집힌 쌍의 개수"에 "빈 칸의 행 번호"를 더해야 한다는 것은 좌우 이동과 위아래 이동을 따로 세어 보아야 나온다.

예제 74

검은 토큰과 흰 토큰이 있다. 한 걸음에 검은 토큰 하나를 흰 토큰 둘로 바꾸거나, 흰 토큰 하나를 검은 토큰 둘로 바꿀 수 있다. 검은 토큰 하나에서 출발해 흰 토큰 하나만 남는 상태에 도달할 수 있는지 답하라.

증명

뼈대는 이렇다. 토큰 수의 차이를 3 으로 나눈 나머지를 본다. 왜 3 인지는 아래에서 드러난다.

상태를 (nb,nw) — 검은 토큰 수와 흰 토큰 수 — 로 두면 시작 상태는 (1,0) 이고 전이는 둘이다.

(nb,nw)(nb1,nw+2)(nb>0)

(nb,nw)(nb+2,nw1)(nw>0)

d::=nwnb 를 보자. 첫 전이에서 d+3, 둘째에서 3 만큼 변한다. 그러므로 dmod3 이 보존된다.

시작 상태에서 d=1 이고 12(mod3) 이다. 목표 상태 (0,1) 에서는 d=1 이고 1mod3=1 이다. 나머지가 다르므로 도달 불가능하다.

답이 말이 되는가. (1,0)(0,2)(2,1)(1,3) 를 몇 걸음 따라가 보면 d1,2,1,2, 로 언제나 3 으로 나눈 나머지가 2 다. 왜 3 이 나오는지도 보인다 — 한 걸음에 한쪽이 1 줄고 다른 쪽이 2 늘어나므로 차이가 3 만큼 움직인다. 불변량은 대개 전이가 무엇을 얼마나 바꾸는지에서 곧바로 읽힌다.

부분 정당성과 종료성

플로이드는 프로그램을 검증하는 일을 두 가지로 갈랐다.

"부분"이라는 말은 결과가 반쯤 옳다는 뜻이 아니다. 멈추지 않는 과정을 부분함수를 계산하는 것으로 본다는 뜻이다(6장의 용어다). 부분 정당성은 대개 불변량 원리로, 종료성은 대개 정렬성 원리로 증명한다.

빠른 거듭제곱

ab 를 구하는 가장 단순한 방법은 ab1 번 곱하는 것이다. 훨씬 적은 곱셈으로 되는 방법이 있다. 알고리즘 문서의 /posts/fundamental/algorithm.html > 빠른 거듭제곱 절이 이 방법을 실무 관점에서 다뤘다. 여기서는 그것이 왜 옳은지를 증명한다.

레지스터 x,y,z 를 각각 a,1,b 로 놓고 다음을 반복한다. z=0 이면 y 를 답으로 내고 멈춘다. 그렇지 않으면 z 가 홀수인 경우에만 yx 를 곱하고, 그다음 x 를 제곱하고 z2 로 나눈 몫으로 바꾼다. 상태 기계로 적으면 상태는 (x,y,z)R×R×N, 시작 상태는 (a,1,b), 전이는

(x,y,z){(x2,y,z/2)z0 이고 짝수(x2,xy,(z1)/2)z 가 홀수

다.

오른쪽 열이 한 줄도 바뀌지 않는 것이 이 프로그램이 옳은 이유다. 표는 확인이지 증명이 아니라는 마지막 줄을 새겨 두자 — 증명은 두 경우에서 등식을 다시 세우는 것이다
<오른쪽 열이 한 줄도 바뀌지 않는 것이 이 프로그램이 옳은 이유다. 표는 확인이지 증명이 아니라는 마지막 줄을 새겨 두자 — 증명은 두 경우에서 등식을 다시 세우는 것이다>[원본 보기]

예제 75

위 프로그램의 부분 정당성을 증명하라. 즉 멈춘다면 y=ab 임을 보여라.

증명

뼈대는 이렇다. yxz 가 언제나 ab 라는 것을 불변량으로 잡는다. 그러면 z=0 에서 멈출 때 y=ab 가 바로 나온다.

증명. P((x,y,z))::=[zN 이고 yxz=ab] 라 하고 이것이 보존되는 불변량임을 보인다. P((x,y,z)) 를 가정하고 (x,y,z)(xt,yt,zt) 라 하자. 전이가 있으므로 z0 이고 두 경우다.

z 가 짝수인 경우. xt=x2, yt=y, zt=z/2 다. z 가 짝수인 양의 정수이므로 ztN 이고

ytxtzt=y(x2)z/2=yx2z/2=yxz=ab

다. z 가 홀수인 경우. xt=x2, yt=xy, zt=(z1)/2 다. z 가 홀수이므로 z1 이 짝수이고 ztN 이다. 그리고

ytxtzt=xy(x2)(z1)/2=yx1+(z1)=yxz=ab

다. 두 경우 모두 P 가 유지된다.

시작 상태에서 1ab=ab 이므로 P 가 참이다. 불변량 원리에 의해 도달 가능한 모든 상태에서 P 가 참이다. 프로그램은 z=0 일 때만 멈추므로, 멈추는 상태 (x,y,0) 에 도달했다면

y=yx0=ab

다.

눈여겨볼 것은 불변량이 y 하나가 아니라 yxz 를 함께 묶은 식이라는 점이다. 프로그램의 옳음을 증명할 때 찾아야 하는 것은 대개 이렇게 여러 변수를 묶은 식이고, 그 식은 "아직 해야 할 일"을 나타낸다. 여기서 xz 가 남은 일이고 y 가 이미 한 일이다.

유도 변수와 측도

종료성 쪽으로 간다. 앞의 프로그램이 멈추는 것은 z 가 걸음마다 줄어들기 때문이다. 이렇게 상태에 값을 매기는 함수를 유도 변수(derived variable)라 한다.

정의. 유도 변수 f:상태R강하게 감소한다(strictly decreasing)는 것은 qq 이면 f(q)<f(q) 라는 뜻이다. 부등호를 로 바꾸면 약하게 감소한다고 한다. 증가하는 쪽도 같은 식으로 정의한다.

정리. f 가 강하게 감소하는 N 값 유도 변수이면, 상태 q 에서 출발하는 어떤 실행의 길이도 f(q) 이하다.

증명은 정렬성 원리다 — 실행이 그보다 길면 최소 원소 없는 감소열이 생긴다. 말로 하면 "음이 아닌 정수에서 세어 내려가기 시작하면 f(q) 번보다 많이 내려갈 수 없다"는 당연한 이야기다.

가운데와 오른쪽이 왜 두 조건이 모두 필요한지 보여 준다. 약하게 감소하면 평평한 채로 영원히 갈 수 있고, 값이 유리수면 0 에 다가가면서 끝없이 내려갈 수 있다
<가운데와 오른쪽이 왜 두 조건이 모두 필요한지 보여 준다. 약하게 감소하면 평평한 채로 영원히 갈 수 있고, 값이 유리수면 0 에 다가가면서 끝없이 내려갈 수 있다>[원본 보기]

예제 76

위 프로그램이 b1 에서 멈추고, 곱셈을 2(log2b+1) 번 이하만 한다는 것을 보여라. 여기서 x천장함수(ceiling)x 이상인 가장 작은 정수다. 4장의 바닥함수 x (x 이하인 가장 큰 정수)와 짝을 이룬다. 그리고 logb 는 컴퓨터과학의 관례대로 밑이 2 인 로그를 뜻하는데, 헷갈리지 않게 이 문서는 밑을 늘 적는다.

증명

뼈대는 이렇다. z 를 측도로 삼는다. 절반씩 줄어드는 것이 곱셈 횟수의 상한까지 준다.

종료성. z 는 부분 정당성 증명에서 확인한 대로 언제나 음이 아닌 정수다. 전이가 있으면 z0 이고, 새 값은 z/2 또는 (z1)/2 인데 둘 다 z 보다 작다. z 가 강하게 감소하는 N 값 유도 변수이므로 위 정리에 의해 실행의 길이가 b 이하이고, 프로그램은 반드시 멈춘다.

곱셈 횟수. 더 세게 볼 수 있다. 새 값은 z/2 이므로 걸음마다 z적어도 절반으로 줄어든다. k 걸음 뒤의 값은 b/2k 이고, 이것이 0 이 되는 것은 2k>b, 즉 k>log2b 일 때다. 따라서 걸음 수는 log2b+1 이하다.

한 걸음에서 곱셈은 많아야 두 번이다(yx 를 곱하고 x 를 제곱한다). 그러므로 곱셈은 2(log2b+1) 번 이하다.

답이 말이 되는가. b=1000 이면 log21000=10 이므로 곱셈이 22 번 이하다. 단순한 방법의 999 번과 견주면 차이가 크다. 종료성 증명이 성능 한계까지 준 것이 요점이다. 측도가 얼마나 빨리 줄어드는지가 곧 실행 시간의 상한이다.

예제 77

곱셈 명령이 없고 3 으로 나누는 것만 허용된 기계에서 두 음이 아닌 정수를 곱하는 절차다. 상태는 (r,s,t) 이고 시작 상태는 (x,y,0) 이며, s>0 인 동안 전이는 다음과 같다. s3 의 배수면 (3r,s/3,t), s13 의 배수면 (3r,(s1)/3,t+r), 그렇지 않으면 (3r,(s2)/3,t+2r) 로 간다. s=0 이 되면 t 를 답으로 낸다. 부분 정당성과 종료성을 증명하라.

증명

뼈대는 앞의 거듭제곱과 같다. "이미 한 일 t 더하기 남은 일 rs"가 언제나 xy 다.

부분 정당성. P((r,s,t))::=[sN 이고 rs+t=xy] 라 하고 세 전이를 확인한다.

첫 전이: (3r)(s/3)+t=rs+t=xy 다. 둘째 전이: (3r)s13+(t+r)=r(s1)+t+r=rs+t=xy 다. 셋째 전이: (3r)s23+(t+2r)=r(s2)+t+2r=rs+t=xy 다.

세 경우 모두 유지되고, 나누어진 값이 정수라는 것도 각 조건에서 나온다. 시작 상태에서 xy+0=xy 이므로 P 가 참이다. 불변량 원리에 의해 도달 가능한 모든 상태에서 참이고, 멈추는 상태 (r,0,t) 에서는 t=r0+t=xy 다.

종료성. s 를 측도로 삼는다. s 는 음이 아닌 정수이고, 전이가 있으면 s>0 이며 새 값은 s/3 이므로 강하게 감소한다. 따라서 반드시 멈춘다. 더 세게, 걸음마다 s 가 적어도 3 분의 1 로 줄어들므로 반복 횟수는 1+log3y 이하다.

두 증명이 같은 모양을 두 번 되풀이했다는 점을 확인해 두자. (이미 한 일)+(남은 일)=(목표) 꼴의 불변량은 반복문이 있는 프로그램에서 거의 언제나 쓸 수 있다. 반복문을 볼 때 이 등식을 먼저 세워 보는 것이 좋은 습관이다.

정렬집합으로 넓힌다

측도의 값이 N 일 필요는 없다. 4장에서 정렬집합을 정의하고 "정렬집합에는 무한히 내려가는 열이 없다"를 증명해 두었다. 그것을 회수한다.

정리. 값이 정렬집합에 속하고 강하게 감소하는 유도 변수가 있으면 모든 실행이 끝난다.

N 값일 때와 달리 실행 길이의 상한은 말할 수 없다. 그래도 끝난다는 것은 보장된다. 다음 예제가 그 차이가 실제로 생기는 자리다.

예제 78

로봇이 N2 위를 움직인다. 원점이 아닌 자리 (x,y) 에 있으면 반드시 한 걸음을 두어야 하고, 갈 수 있는 곳은 서쪽으로 한 칸 (x1,y) (x>0 일 때) 또는 남쪽으로 한 칸 내려가면서 동쪽으로 아무리 멀리든 뛰는 것 (z,y1) (z 는 아무 음이 아닌 정수, y>0 일 때)이다. 이 로봇이 반드시 원점에서 멈춤을 증명하라.

증명

N 값 측도로 안 되는지 먼저 보자. (0,1) 에 있는 로봇도 남쪽으로 내려가면서 동쪽으로 10100 만큼 뛸 수 있고, 그러면 멈출 때까지 10100 걸음이 남는다. 어떤 상태에서도 남은 걸음 수를 미리 묶을 수 없다. 그래서 실행 길이의 상한을 주는 정리는 쓸 수 없다.

뼈대는 이렇다. y 를 큰 자리, x 를 작은 자리로 삼아 값을 하나 만든다. y 가 줄면 x 가 아무리 커져도 전체가 줄어들게 해야 한다.

증명. 유도 변수를

v(x,y)::=y+xx+1

로 정의한다. x/(x+1)0x/(x+1)<1 이므로 v 의 정수 부분이 y 이고 소수 부분이 x 를 나타낸다. 두 전이를 확인한다.

서쪽으로 한 칸: y 가 그대로이고 x 가 줄어드므로 x/(x+1) 이 줄어든다(xx/(x+1) 이 증가함수이므로). 따라서 v 가 줄어든다.

남쪽으로 한 칸 내려가며 동쪽으로 뜀: 새 값은 (y1)+z/(z+1)<(y1)+1=yv(x,y) 다. z 가 얼마든 v 가 줄어든다.

그러므로 v 는 강하게 감소한다. 이제 v 의 값들이 정렬집합에 속하는지 보아야 한다. 값의 꼴은 n+m/(m+1) (n,mN)이고, 이런 수를 모은 집합에서는 아래로 내려가는 열이 끝없이 이어질 수 없다. 정수 부분이 줄어드는 일은 많아야 유한 번이고, 정수 부분이 고정된 채로는 소수 부분이 m/(m+1) 꼴이라 m 이 음이 아닌 정수로 줄어들어야 하므로 역시 유한 번이다.

따라서 위 정리에 의해 로봇은 반드시 멈추고, 멈추는 자리는 걸음을 둘 수 없는 자리, 곧 원점이다.

4장에서 "양의 유리수 집합에는 최소 원소가 없다"를 확인하고, 그런데도 {n/(n+1)} 같은 집합은 정렬집합이라고 했던 것을 떠올려 보자. 이 예제가 그 구별이 실제로 값을 하는 자리다. 아무 유리수나 쓰면 종료성이 보장되지 않고, 정렬집합에서 값을 고르면 보장된다.

안정 결혼 문제

이 절이 이 장의 백미다. 문제는 이렇다. 남자 n 명과 여자 n 명이 있고 각자 상대편 전체에 대한 선호 순위를 갖는다. 선호는 서로 대칭일 필요가 없다. 모든 사람을 한 명씩 짝지어야 하는데, 그 배치가 흔들리지 않기를 바란다.

정의. 어떤 짝짓기에서, 서로 결혼하지 않은 남자와 여자가 서로를 자기 배우자보다 좋아하면 그 둘을 불량 짝(rogue couple)이라 한다. 불량 짝이 없는 짝짓기를 안정한 짝짓기(stable matching)라 한다.

가운데가 흔들리는 배치다. 갑 과 A 가 서로를 배우자보다 좋아하므로 그 결혼은 위태롭다. 오른쪽이 안정한 배치이고, 을 과 B 가 서로를 2순위로 여기는 것은 문제가 아니다
<가운데가 흔들리는 배치다. 갑 과 A 가 서로를 배우자보다 좋아하므로 그 결혼은 위태롭다. 오른쪽이 안정한 배치이고, 을 과 B 가 서로를 2순위로 여기는 것은 문제가 아니다>[원본 보기]

물음은 이것이다. 선호가 어떻게 주어져도 안정한 짝짓기가 존재하는가. 당연해 보이지 않는다. 실제로 남녀 구별 없이 아무나 둘씩 묶는 문제("짝꿍 맞추기")에서는 안정한 배치가 없는 선호 조합이 있다. 그런데 상대편에서만 고를 때는 언제나 존재하고, 그것을 만드는 절차가 있다.

구혼 의식

절차를 이야기로 적는다. 첫날 각자는 상대편 전체가 적힌 선호 목록을 갖고 있다. 매일 다음 일이 일어난다.

가운데 표에서 각 남자가 노래하는 상대가 나빠지기만 하는 것을 확인하라. 아래 왼쪽이 종료 증명이고 오른쪽 두 불변량이 나머지 결론 전부를 낳는다
<가운데 표에서 각 남자가 노래하는 상대가 나빠지기만 하는 것을 확인하라. 아래 왼쪽이 종료 증명이고 오른쪽 두 불변량이 나머지 결론 전부를 낳는다>[원본 보기]

이것을 상태 기계로 본다. 어떤 날의 상태는 각 남자의 목록에서 지워지지 않고 남은 여자들로 정해진다. 그것이 정해지면 그날 누가 누구에게 노래하는지도 정해진다. 증명할 것은 넷이다. 의식이 끝나는 날이 온다. 모두 결혼한다. 그 결혼이 안정하다. 그리고 놀랍게도 남자가 유리하다.

네 결론이 모두 측도 하나와 불변량 둘에서 나온다. 아래 첫 메모의 순서 이야기가 중요하다 — 안정한 짝짓기가 하나라도 있음을 먼저 알아야 ‘가망 있는 짝’ 이라는 말이 뜻을 갖는다
<네 결론이 모두 측도 하나와 불변량 둘에서 나온다. 아래 첫 메모의 순서 이야기가 중요하다 — 안정한 짝짓기가 하나라도 있음을 먼저 알아야 ‘가망 있는 짝’ 이라는 말이 뜻을 갖는다>[원본 보기]

예제 79

구혼 의식이 반드시 끝남을 증명하라. 그리고 며칠 안에 끝나는지 말하라.

증명

뼈대는 이렇다. 목록에 남은 이름의 총 개수를 측도로 삼는다. 끝나지 않은 날에는 그 수가 반드시 줄어든다.

증명. 측도 f 를 "모든 남자의 목록에 남아 있는 이름의 총 개수"로 정의한다. 이름이 목록에 다시 추가되는 일은 없으므로 f 는 약하게 감소한다.

강하게 감소함을 보인다. 아직 끝나지 않은 날이라면 정의에 의해 구혼자가 둘 이상인 여자가 있다. 그 여자는 오후에 적어도 한 명을 거절하고, 그 남자는 저녁에 그 여자를 목록에서 지운다. 그러므로 f 가 적어도 1 줄어든다.

f 는 음이 아닌 정수 값이고 시작할 때 남자 n 명의 목록에 각각 n 개씩 있어 f=n2 다. 강하게 감소하는 N 값 측도이므로 앞의 정리에 의해 실행 길이가 n2 이하다. 즉 n2 일 안에 끝난다.

답이 말이 되는가. n=3 이면 9 일 안에 끝나야 하고, 그림의 예에서는 4 일에 끝났다. 상한이 느슨한 것은 하루에 여러 명이 동시에 거절당할 수 있기 때문이다. 종료 증명에 필요한 것은 정확한 값이 아니라 줄어든다는 사실 하나이므로 느슨한 상한으로도 충분하다.

예제 80

다음을 증명하라. P 를 "어떤 여자 w 와 남자 m 에 대해, wm 의 목록에서 지워졌다면 wm 보다 좋아하는 구혼자를 갖고 있다"라 하자. P 는 보존되는 불변량이다.

증명

뼈대는 한 줄이다. 여자의 최선 구혼자는 좋아지기만 한다.

증명. P 가 어떤 날 참이라 하고 하루가 지난 뒤에도 참인지 본다. 두 가지를 확인하면 된다.

첫째, 그날 새로 지워지는 경우다. wm 의 목록에서 지워지는 것은 wm 보다 좋아하는 구혼자가 있어 m 을 거절했을 때뿐이다. 그러니 지워진 직후에 P 의 조건이 만족된다.

둘째, 이미 지워져 있던 경우다. P 에 의해 wm 보다 좋아하는 구혼자 t 를 갖고 있었다. w 가 어제 t 에게 "남아 있으라"고 했으므로 t 의 목록에서 w 가 지워지지 않았고, 따라서 t 는 오늘 아침에도 w 에게 노래한다. 그러면 w 의 오늘 최선 구혼자는 t 이거나 t 보다 더 좋은 사람이고, 어느 쪽이든 m 보다 좋다.

그러므로 P 가 보존된다. 첫날에는 지워진 이름이 하나도 없어 P 가 공허하게 참이므로, 불변량 원리에 의해 의식이 도는 동안 P 가 언제나 참이다.

이 불변량을 "여자의 최선 구혼자는 나빠지지 않는다"로 읽어도 된다. 남자 쪽에서는 반대다 — 목록의 위에서부터 지워 나가므로 노래하는 상대가 나빠지기만 한다. 두 방향이 서로 맞물려 다음 두 정리를 낳는다.

예제 81

구혼 의식이 끝날 때 모두 결혼하고 그 짝짓기가 안정함을 증명하라.

증명

뼈대는 둘이다. 모두 결혼한다는 것은 짝 없는 남자의 목록이 비어 있다는 데서 모순을 얻는 것이고, 안정하다는 것은 결혼하지 않은 아무 남녀에 대해 경우를 나누는 것이다.

모두 결혼한다. 모순을 이끌어 낸다. 마지막 날에 결혼하지 못한 남자가 있다고 하고 그를 갑이라 하자. 갑이 아무에게도 노래하지 않았다는 뜻이므로 그의 목록은 비어 있다. 즉 모든 여자가 갑의 목록에서 지워졌다. 불변량 P 에 의해 모든 여자가 갑보다 좋아하는 구혼자를 갖고 있고, 특히 모든 여자에게 구혼자가 있다. 마지막 날이므로 구혼자는 한 명씩이고 그와 결혼한다. 그러면 여자 n 명이 모두 결혼했고 남녀 수가 같으므로 남자도 n 명 모두 결혼한 셈이다. 갑이 결혼하지 않았다는 데 어긋난다. 모순이다.

안정하다. 마지막 날에 서로 결혼하지 않은 남자 갑과 여자 A 를 아무거나 잡고, 둘이 불량 짝이 아님을 보인다. 경우를 나눈다.

경우 1: A 가 갑의 목록에서 지워졌다. 불변량 P 에 의해 A 는 갑보다 좋아하는 구혼자를 갖고 있고, 마지막 날이므로 그가 A 의 남편이다. A 가 갑을 남편보다 좋아하지 않으므로 불량 짝이 아니다.

경우 2: A 가 갑의 목록에 남아 있다. 갑은 목록에 남은 여자 중 가장 좋아하는 사람에게 노래하고 그와 결혼했다. A 는 목록에 있으면서 선택되지 않았으므로 갑의 아내가 A 보다 위에 있다. 갑이 A 를 아내보다 좋아하지 않으므로 불량 짝이 아니다.

두 경우가 빠짐없으므로 불량 짝은 없고 짝짓기가 안정하다.

경우 나누기의 기준을 보라. "목록에서 지워졌는가" 하나다. 지워졌으면 여자 쪽이 흔들리지 않고, 남아 있으면 남자 쪽이 흔들리지 않는다. 불변량 P 가 앞쪽 절반을 담당하고 목록을 위에서부터 훑는다는 사실이 뒤쪽 절반을 담당한다.

그런데 남자가 유리하다

매일 고르고 거절하는 쪽은 여자다. 그런데도 이 절차가 편드는 쪽은 남자다. 그것을 말하려면 개념 하나가 더 필요하다.

정의. 어떤 안정한 짝짓기에서 두 사람이 결혼한다면 서로를 가망 있는 짝(feasible spouse)이라 한다. 가장 좋아하는 가망 있는 짝을 최선의 짝, 가장 싫어하는 가망 있는 짝을 최악의 짝이라 한다.

이 말이 뜻을 가지려면 안정한 짝짓기가 적어도 하나 있어야 하고, 그것은 앞에서 증명했다. 증명의 순서를 바꿀 수 없다는 것이 이 절의 구조에서 눈여겨볼 점이다.

예제 82

Q 를 "여자 w 가 남자 m 의 목록에서 지워졌다면 wm 에게 가망 있는 짝이 아니다"라 하자. (가) Q 가 보존되는 불변량임을 증명하라. (나) 이로부터 구혼 의식이 모든 남자를 자기 최선의 짝과 결혼시킨다는 것을 결론지어라. (다) 누구나 자기 최선의 짝에게는 최악의 짝임을 증명하고, 구혼 의식이 모든 여자를 자기 최악의 짝과 결혼시킨다고 결론지어라.

증명

뼈대는 이렇다. 지워지는 순간을 잡아, 그 여자가 그 남자에게 가망 없다는 것을 안정성으로 보인다.

Q 가 보존된다. 어떤 날 Q 가 참이고 여자 A 가 남자 갑의 목록에서 지워지려 한다고 하자. A 가 갑을 거절하는 것은 A 가 갑보다 좋아하는 구혼자 병이 있기 때문이다.

이제 Q 가 참이라는 것을 병에게 적용한다. 병의 목록에서 지워진 여자는 모두 병에게 가망 없는 짝이므로, 병에게 가망 있는 짝은 모두 아직 병의 목록에 남아 있다. 그리고 병은 목록의 맨 위인 A 에게 노래하는 중이다. 그러므로 병은 A 를 자기의 다른 어떤 가망 있는 짝보다 좋아한다.

이제 A 가 갑에게 가망 있다고 가정해 모순을 만든다. 그렇다면 A 와 갑이 결혼하는 안정한 짝짓기 M 이 있다. M 에서 병의 아내를 보자. A 는 이미 갑과 결혼했으므로 병의 아내는 A 가 아니고, 앞 문단에 의해 병은 그 아내보다 A 를 좋아한다. 한편 A 는 병을 갑보다 좋아한다. 그러면 A 와 병이 M 의 불량 짝이고 M 이 안정하다는 데 어긋난다. 모순이다.

따라서 A 는 갑에게 가망 없는 짝이고, 지워진 뒤에도 Q 가 참이다. 첫날에는 공허하게 참이므로 Q 는 불변량이다.

(나) 남자가 최선의 짝을 얻는다. 마지막 날에 갑이 A 와 결혼했다면, 갑의 목록에서 A 보다 위에 있던 여자는 모두 지워진 것이다. Q 에 의해 그들은 모두 갑에게 가망 없는 짝이다. 그러므로 A 는 갑에게 가망 있는 짝 중 가장 좋은 사람, 곧 갑의 최선의 짝이다.

(다) 누구나 자기 최선의 짝에게는 최악의 짝이다. 대칭이므로 "모든 남자는 자기 최선의 짝에게 최악의 남편"임만 보이면 된다. A 가 갑의 최선의 짝이라 하자. 어떤 안정한 짝짓기 M 에서 A 가 갑보다 좋아하는 남편을 갖는다고 가정한다. 그러면 M 에서 갑의 아내는 A 가 아니고, A 가 갑의 최선의 짝이므로 갑은 그 아내보다 A 를 좋아한다. 한편 A 는 자기 남편보다 갑을 좋아한다. 그러면 갑과 A 가 M 의 불량 짝이고 M 이 안정하다는 데 어긋난다. 따라서 갑은 A 의 가망 있는 남편 중 가장 나쁜 사람이다.

(나)와 (다)를 이어 붙이면 결론이 나온다. 구혼 의식은 모든 남자를 자기 최선의 짝과 결혼시키고 그 최선의 짝에게 그 남자는 최악의 남편이므로, 구혼 의식은 모든 여자를 자기 최악의 짝과 결혼시킨다.

PQ 를 견주어 보자. P 는 "지워진 여자는 더 좋은 구혼자를 갖고 있다"로 여자 쪽의 사실이고, Q 는 "지워진 여자는 가망이 없었다"로 남자 쪽의 사실이다. 앞의 것이 결혼과 안정성을 낳고 뒤의 것이 최적성을 낳는다.

직관과 정반대인 결론이다. 여자가 매일 고르고 거절하는데도 결과는 여자에게 가장 나쁘다. 왜 그런가. 여자가 고르는 것은 "찾아온 사람 중에서"일 뿐이고 누가 찾아오는지는 남자가 정한다. 남녀의 역할을 바꾸어 여자가 노래하게 하면 대개 다른 안정한 짝짓기가 나오고, 그때는 여자가 유리하다.

실제 쓰임

이 절차는 1962년 게일과 섀플리의 논문으로 발표되었다. 그런데 발표 10년 전부터, 두 사람이 모르는 채로, 미국의 의대 졸업생과 수련병원을 짝짓는 기구가 거의 같은 절차를 쓰고 있었다. 병원이 남자, 졸업생이 여자 역할이었다. 그 전에는 배치가 안정하지 않아 해마다 혼란이 있었고, 이 절차가 그 문제를 해결했다. 섀플리는 이 연구로 2012년 노벨 경제학상을 받았다.

컴퓨터과학에서도 쓰인다. 인터넷 기반 시설 회사에서 웹 요청을 서버에 배정하는 데 이 절차의 변형을 쓴다. 요청이 여자, 서버가 남자 역할이고, 요청은 지연 시간과 손실률로, 서버는 대역폭 비용과 위치로 선호를 정한다. 절차를 고른 이유는 빠르고 분산 처리가 되기 때문이다.

이 장에서 새로 나온 것

용어·기호
상태 기계집합 위의 이항관계 하나와 시작 상태 하나
qr상태 q 에서 r 로 가는 전이
실행(execution)시작 상태에서 출발해 전이를 따라가는 상태의 열. 무한할 수도 있다
도달 가능(reachable)어떤 실행에 나타나는 상태
결정적 · 비결정적나가는 전이가 하나 이하 · 여럿일 수 있다
보존되는 불변량P(q) 이고 qr 이면 P(r) 인 술어
불변량 원리보존되는 불변량이 시작 상태에서 참이면 도달 가능한 모든 상태에서 참이다
부분 정당성 · 종료성멈췄다면 답이 옳다 · 언젠가 반드시 멈춘다
유도 변수(derived variable)상태에 값을 매기는 함수. 강하게 · 약하게 감소를 구별한다
측도(measure)종료성 증명에 쓰는, 걸음마다 강하게 감소하는 유도 변수
불량 짝(rogue couple)서로 결혼하지 않았고 서로를 배우자보다 좋아하는 남녀
안정한 짝짓기불량 짝이 없는 짝짓기
가망 있는 짝(feasible spouse)어떤 안정한 짝짓기에서 그 사람과 결혼하는 상대

챙겨 갈 것은 다섯이다.

다음 장에서는 방향을 바꾼다. 지금까지 다룬 대상 — 정수, 좌표, 물통 상태 — 은 이미 있는 것이었다. 9장에서는 대상 자체를 재귀적으로 만든다. 문자열, 짝이 맞는 괄호, 산술식, 게임을 "기저와 구성자"로 정의하고, 그 정의를 그대로 따라가는 구조적 귀납법을 세운다. 그러면 7장의 보통 귀납법이 그 특수한 경우로 보인다.

재귀적 자료형

프로그램에서 목록·나무·문자열을 다룰 때 쓰는 정의는 대개 같은 모양이다. 빈 것이 하나 있고, 이미 있는 것에서 새것을 만드는 방법이 있다. 수학에서도 그렇다. 그런 식으로 정의된 대상을 재귀적 자료형(recursive data type)이라 한다.

이 장에서 답할 질문은 넷이다. 그런 정의를 어떻게 적는가. 그 위의 함수는 어떻게 정의하는가. 그 위의 성질은 어떻게 증명하는가. 그리고 정의를 잘못 세우면 무슨 일이 벌어지는가.

셋째 물음의 답이 이 장의 중심이다. 구조적 귀납법(structural induction)이라 하고, 자료형의 정의를 그대로 따라가는 증명 방법이다. 7장의 보통 귀납법이 그 특수한 경우로 드러난다 — 음이 아닌 정수도 재귀적 자료형이기 때문이다.

가져오는 것은 7장의 귀납법과 6장의 수열·함수 표기다. 특히 빈 수열 λ 를 계속 쓴다.

재귀적 정의와 구조적 귀납법

문자열로 시작한다. 평소에는 당연하게 쓰는 것이지만, 재귀적 자료형으로 다시 정의해 보면 정의와 증명이 어떻게 맞물리는지가 잘 보인다.

정의. 공집합이 아닌 집합 A알파벳(alphabet)이라 하고 그 원소를 문자(character)라 한다. A 위의 문자열 전체 A 를 다음과 같이 정의한다.

아래쪽 여섯 단계가 이 장의 계산 방식이다. 한 걸음마다 구성자를 한 번씩 벗기고, 벗길 것이 없어지면 기저에 닿는다. 오른쪽 위의 두 줄이 자료형의 정의이고 그 아래 두 줄이 함수의 정의다
<아래쪽 여섯 단계가 이 장의 계산 방식이다. 한 걸음마다 구성자를 한 번씩 벗기고, 벗길 것이 없어지면 기저에 닿는다. 오른쪽 위의 두 줄이 자료형의 정의이고 그 아래 두 줄이 함수의 정의다>[원본 보기]

{0,1} 는 이진 문자열 전체다. 길이가 4 인 문자열 1011 은 이 정의에서 1,0,1,1,λ 로 표현된다. 번거롭게 보이지만 이것이 실제로 프로그래밍 언어가 목록을 담는 방식이다.

이제 함수를 정의한다. 요령은 하나다. 자료형 정의의 갈래를 그대로 따라간다. 기저에서의 값을 정하고, 구성자마다 재료에서의 값으로 결과에서의 값을 정한다.

|λ|::=0,|a,s|::=1+|s|

|s| 가 문자열의 길이다. 이어붙이기도 같은 식으로 정의한다. 문자열 st이어붙임(concatenation) st

λt::=t,a,st::=a,st

다. 앞으로 점을 생략하고 st 로 적는다.

구조적 귀납법

성질을 증명할 차례다. 방법도 정의의 갈래를 따라간다.

구조적 귀납법의 원리. P 를 재귀적 자료형 R 에 대한 술어라 하자. 만약

R 의 모든 원소에서 P 가 참이다.

왼쪽 열을 정하면 가운데와 오른쪽이 따라 정해진다는 것이 요점이다. 아래 첫 메모에서 보통 귀납법이 이것의 특수한 경우인 까닭을, 둘째 메모에서 왜 정의가 모호하면 안 되는지를 확인해 두자
<왼쪽 열을 정하면 가운데와 오른쪽이 따라 정해진다는 것이 요점이다. 아래 첫 메모에서 보통 귀납법이 이것의 특수한 경우인 까닭을, 둘째 메모에서 왜 정의가 모호하면 안 되는지를 확인해 두자>[원본 보기]

예제 83

이어붙이기의 정의에서 λt=t 는 곧바로 나온다. 그런데 반대쪽 — 모든 sA 에 대해 sλ=s — 은 정의에 없다. 이것을 증명하라.

증명

뼈대는 이렇다. s 에 대한 구조적 귀납법을 쓴다. 정의의 갈래가 둘이므로 확인할 것도 둘이다.

증명. 귀납 가설은 P(s)::=[sλ=s] 로 한다.

기저 (s=λ). λλ=λ 다. 이어붙이기 정의의 기저를 t=λ 에 적용한 것이다.

구성자 (s=a,r). 재료 r 에 대해 P(r) 을 가정한다. 그러면

a,rλ=a,rλ=a,r

이다. 첫 등호는 이어붙이기 정의의 구성자 갈래이고, 둘째 등호는 귀납 가정 rλ=r 이다. 따라서 P(a,r) 이 참이다.

구조적 귀납법에 의해 모든 sA 에서 sλ=s 이다.

이 증명이 짧은 것은 확인할 갈래가 정의에 이미 적혀 있기 때문이다. 구조적 귀납 증명을 쓰는 일은 대개 "정의를 보고 갈래를 베낀 다음 각 칸을 채우는" 일이다. 어느 쪽이 정의에서 바로 나오고 어느 쪽이 증명이 필요한지 구별하는 것 — 여기서는 왼쪽 항등원은 정의, 오른쪽 항등원은 정리 — 도 함께 익혀 두자.

예제 84

모든 s,tA 에 대하여 |st|=|s|+|t| 임을 증명하라.

증명

뼈대는 앞과 같다. 다만 변수가 둘이므로 어느 것으로 귀납하는지 밝혀야 한다. s 로 한다.

증명. 귀납 가설을

P(s)::=tA.|st|=|s|+|t|

로 한다. t 를 한정사 안에 넣은 것이 요령이다 — 구성자 갈래에서 t 가 바뀌지 않으므로 이렇게 두면 그대로 쓸 수 있다.

기저 (s=λ). |λt|=|t|=0+|t|=|λ|+|t| 다.

구성자 (s=a,r). P(r) 을 가정한다.

|a,rt|=|a,rt|=1+|rt|=1+(|r|+|t|)=(1+|r|)+|t|=|a,r|+|t|

첫 등호는 이어붙이기 정의, 둘째는 길이 정의, 셋째는 귀납 가정, 마지막은 다시 길이 정의다.

구조적 귀납법에 의해 모든 s 에서 참이다.

귀납 가설에 한정사를 넣은 것을 눈여겨보라. 만약 t 를 고정해 두고 증명하려 하면 구성자 갈래에서 문제가 없지만, 다른 문제에서는 재료마다 다른 t 가 필요해질 수 있다. 구조적 귀납법에서도 7장의 "가설을 강하게"가 그대로 통한다.

예제 85

문자열의 뒤집기를 재귀적으로 정의하고, 모든 s,t 에 대해 rev(st)=rev(t)rev(s) 임을 증명하라. 이어붙이기의 결합법칙 (rs)t=r(st) 는 써도 된다.

증명

정의부터 한다. 갈래를 따라 적으면

rev(λ)::=λ,rev(a,s)::=rev(s)a,λ

다. 앞 글자를 떼어 맨 뒤에 붙이는 것이다. a,λ 은 글자 하나로 된 문자열이므로 앞으로 그냥 a 로 적는다.

뼈대는 이렇다. s 에 대한 구조적 귀납법이고, 구성자 갈래에서 결합법칙을 한 번 쓴다.

증명. 귀납 가설은 P(s)::=t.rev(st)=rev(t)rev(s) 로 한다.

기저 (s=λ). rev(λt)=rev(t)=rev(t)λ=rev(t)rev(λ) 다. 가운데 등호에서 앞 예제의 "오른쪽 항등원"을 썼다.

구성자 (s=a,r). P(r) 을 가정한다.

rev(a,rt)=rev(a,rt)=rev(rt)a=(rev(t)rev(r))a

이고, 결합법칙으로 괄호를 옮기면

=rev(t)(rev(r)a)=rev(t)rev(a,r)

다. 마지막 등호가 뒤집기 정의의 구성자 갈래다.

구조적 귀납법에 의해 모든 s 에서 참이다.

여기서 보조정리를 먼저 챙기는 습관을 확인해 두자. 기저에서 "오른쪽 항등원"이, 구성자에서 "결합법칙"이 필요했다. 둘 다 정의에 없고 각각 구조적 귀납법으로 따로 증명해야 하는 것이다. 재귀적 정의를 세우면 당연해 보이는 사실들이 모두 증명 대상이 된다는 점이 처음에는 낯설다.

예제 86

순서 이진 나무 전체 OBT 를 다음과 같이 정의한다. 기저: OBT 에 속한다. 구성자: R,SOBT 이면 마디,R,S 도 속한다. 나무 T 의 마디 개수를 nT, 잎 개수를 T 라 할 때 T=nT+1 임을 증명하라.

증명

뼈대는 이렇다. 구성자가 재료를 둘 받으므로 가정도 둘 쓴다.

먼저 두 함수를 재귀적으로 정의해 둔다. n::=0, ::=1 이고

n마디,R,S::=1+nR+nS,마디,R,S::=R+S

다. 증명. 귀납 가설은 P(T)::=[T=nT+1] 로 한다.

기저. =1=0+1=n+1 이다.

구성자. P(R)P(S) 를 가정한다. 그러면

마디,R,S=R+S=(nR+1)+(nS+1)=(1+nR+nS)+1=n마디,R,S+1

이다. 구조적 귀납법에 의해 모든 TOBT 에서 참이다.

이 증명을 "마디 수에 대한 강한 귀납법"으로도 할 수 있다. 그런데 구조적 귀납법 쪽이 짧다. 나무의 크기를 세는 함수를 따로 만들 필요가 없고, 정의가 이미 "두 부분나무"라고 말해 주기 때문이다. 재귀적 자료형에서 구조적 귀납법을 쓰는 이유가 이것이다.

예제 87

다음 집합들의 재귀적 정의를 만들어라. (가) S::={2k3m5nN:k,m,nN} (나) L::={(a,b)Z2:ab 가 3 의 배수}

풀이 보기

무엇을 묻는가. 기저와 구성자로 그 집합을 정확히 만들어 내는 규칙이다.

어느 관계를 쓰는가. 원소를 만드는 "작은 걸음"을 찾는다. 지수를 하나씩 올리는 것, 좌표를 하나씩 옮기는 것이다.

(가) 203050=1 이 가장 작은 원소이고, 어떤 원소에 2, 3, 5 를 곱하면 지수 하나가 올라간다.

기저: 1S. 구성자: xS 이면 2x, 3x, 5xS 에 속한다.

(나) ab=0 인 가장 단순한 것이 (0,0) 이다. 차이를 3 의 배수로 유지하려면 두 좌표를 함께 1 씩 옮기거나, 한 좌표만 3 옮기면 된다.

기저: (0,0)L. 구성자: (a,b)L 이면 (a+1,b+1), (a1,b1), (a+3,b), (a3,b)L 에 속한다.

답이 말이 되는가. 정의가 맞는지 확인하는 표준적인 방법은 두 방향의 포함 관계를 따로 보이는 것이다. 만든 집합이 목표 집합에 들어간다는 쪽은 구조적 귀납법으로 쉽게 된다 — (나)에서 ab 가 각 구성자에서 0 또는 ±3 만큼 변하므로 3 의 배수가 유지된다. 반대 방향은 목표 집합의 원소를 실제로 만들어 보여야 하고, 대개 정수에 대한 귀납법이 필요하다.

요령을 하나 적어 둔다. 구성자가 "되돌아가는 걸음"도 포함해야 하는지 확인하라. (나)에서 a 가 음수인 원소를 만들려면 (a1,b1) 같은 갈래가 있어야 한다. 그런 정의는 모호해지지만(같은 원소를 여러 길로 만들 수 있다) 집합을 정의하는 데는 문제가 없다.

짝이 맞는 괄호 문자열

재귀적 정의가 가장 잘 어울리는 예다. 대괄호로만 된 문자열 중 괄호가 제대로 짝지어진 것을 골라내려 한다. 이것을 "왼쪽 괄호마다 대응하는 오른쪽 괄호가 있고 …" 식으로 적기는 어렵다. 재귀적으로는 두 줄이면 된다.

정의. 집합 RecMatch 를 다음과 같이 정의한다.

여기서 [s]t 는 왼쪽 괄호, s, 오른쪽 괄호, t 를 이어붙인 것이다. s=t=λ 로 두면 [] 를 얻고, 그것으로 다시 [[]][][] 를 얻는다.

왜 "[s] 도 되고 st 도 된다"처럼 더 읽기 쉬운 정의를 쓰지 않았는지가 이 절의 첫 이야기다.

예제 88

RecMatch 의 모든 문자열에서 왼쪽 괄호와 오른쪽 괄호의 개수가 같음을 증명하라.

증명

뼈대는 이렇다. 구성자가 왼쪽 하나와 오른쪽 하나를 함께 더한다.

준비로 문자를 세는 함수를 정의한다. 문자 c 가 문자열 s 에 나타나는 횟수 #c(s)

#c(λ)::=0,#c(a,s)::={#c(s)ac1+#c(s)a=c

로 정의한다. 그러면 #c(st)=#c(s)+#c(t) 가 앞의 길이 예제와 똑같은 구조적 귀납법으로 나온다(각 갈래에서 ||#c() 로 바꿔 쓰면 된다).

증명. 왼쪽 괄호를 L, 오른쪽 괄호를 R 로 적고 귀납 가설을 P(s)::=[#L(s)=#R(s)] 로 한다.

기저. #L(λ)=0=#R(λ) 다.

구성자. P(s)P(t) 를 가정한다. 준비한 사실을 세 번 써서 쪼개면

#L([s]t)=1+#L(s)+0+#L(t)

#R([s]t)=0+#R(s)+1+#R(t)

이다. 가정에 의해 #L(s)=#R(s) 이고 #L(t)=#R(t) 이므로 두 값이 같다.

구조적 귀납법에 의해 모든 sRecMatch 에서 참이다.

구성자가 왼쪽 괄호 하나와 오른쪽 괄호 하나를 함께 더한다는 것이 증명의 전부다. 재귀적 정의를 잘 세워 두면 증명이 이렇게 짧아진다.

예제 89

RecMatch 의 문자열은 모든 접두사에서 왼쪽 괄호의 개수가 오른쪽 괄호의 개수 이상임을 증명하라. (문자열 s 의 접두사는 앞에서부터 잘라낸 부분이다. 즉 s=uvu 다.)

증명

뼈대는 이렇다. 구성자로 만든 문자열의 접두사를 경우 나누기로 분류한다. 접두사가 어디까지 걸치는지에 따라 갈래가 생긴다.

왼쪽 괄호를 +1, 오른쪽을 −1 로 세면 이 성질이 ‘꺾은선이 0 아래로 안 내려간다’ 가 된다. 오른쪽이 그 조건을 어기는 문자열이다
<왼쪽 괄호를 +1, 오른쪽을 −1 로 세면 이 성질이 ‘꺾은선이 0 아래로 안 내려간다’ 가 된다. 오른쪽이 그 조건을 어기는 문자열이다>[원본 보기]

편의를 위해 h(u)::=#L(u)#R(u) 라 하자. 그림의 꺾은선 높이가 이 값이다. 증명할 것은 "모든 접두사 u 에서 h(u)0"이다.

증명. 귀납 가설을 P(s)::=[s 의 모든 접두사 u 에서 h(u)0] 로 한다.

기저. λ 의 접두사는 λ 뿐이고 h(λ)=00 이다.

구성자. P(s)P(t) 를 가정하고 [s]t 의 접두사 u 를 잡는다. 네 경우다.

u=λ 이면 h(u)=0 이다.

u=[s] (ss 의 접두사)이면 h(u)=1+h(s) 이고, 가정에 의해 h(s)0 이므로 h(u)1>0 이다.

u=[s] 이면 앞 예제에 의해 h(s)=0 이므로 h(u)=1+01=0 이다.

u=[s]t (tt 의 접두사)이면 h(u)=0+h(t) 이고 가정에 의해 h(t)0 이다.

네 경우가 접두사의 모든 가능성을 덮으므로 P([s]t) 가 참이다. 구조적 귀납법에 의해 증명이 끝난다.

여기서 앞 예제를 셋째 경우에서 썼다는 것을 확인해 두자. h(s)=0 이 없으면 u=[s] 에서 값을 알 수 없다. 정리를 순서대로 쌓아 올리는 것이 이 장의 작업 방식이다.

모호한 정의는 함수를 정하지 못한다

재귀적 정의에서 같은 원소를 두 가지 이상의 길로 만들 수 있으면 그 정의를 모호하다(ambiguous)고 한다. 앞의 재귀적 정의 만들기 예제에서 봤듯이 모호한 정의로도 집합은 잘 정의되고, 집합에 대한 구조적 귀납법도 쓸 수 있다. 문제는 재귀 함수다.

더 읽기 쉬운 다음 정의를 보자. AmbRecMatch 를 이렇게 정의한다. 기저: λ. 구성자: s,t 가 들어 있으면 [s]st 도 들어 있다. 이 집합은 RecMatch같다. 그런데도 앞의 정의를 골라 둔 이유가 있다.

왼쪽 두 갈래가 같은 문자열 λ 에 도착하고 그래서 f(λ) 가 0 이면서 1 이 된다. 오른쪽에서 두 정의의 차이와, 모호한 정의로도 할 수 있는 일과 못 하는 일을 구별해 두자
<왼쪽 두 갈래가 같은 문자열 λ 에 도착하고 그래서 f(λ) 가 0 이면서 1 이 된다. 오른쪽에서 두 정의의 차이와, 모호한 정의로도 할 수 있는 일과 못 하는 일을 구별해 두자>[원본 보기]

예제 90

위 모호한 정의 위에서 "문자열을 만드는 데 쓴 구성자 적용 횟수" f 를 재귀적으로 정의하려 한다. f(λ)::=0, f([s])::=1+f(s), f(st)::=1+f(s)+f(t) 다. 왜 이것이 함수를 정의하지 못하는지 보여라.

풀이 보기

무엇을 묻는가. 같은 입력에서 두 값이 나오는 실제 사례다.

λ 를 보자. 첫 규칙에 의해 f(λ)=0 이다. 그런데 이어붙이기 정의에서 λλ=λ 이므로 셋째 규칙도 쓸 수 있다.

f(λ)=f(λλ)=1+f(λ)+f(λ)=1+0+0=1

0=f(λ)=1 이다. 조건을 모두 만족하는 함수가 하나도 없다.

이 문제가 앞의 모호하지 않은 정의에서는 생기지 않는다. RecMatch 의 각 문자열은 기저이거나 [s]t 꼴이고, 후자에서 st하나로 정해진다(첫 왼쪽 괄호와 짝이 되는 오른쪽 괄호가 어디인지가 문자열 자체로 정해진다). 그래서 각 문자열에 값이 하나만 붙는다.

얻을 교훈. 재귀 함수를 얹을 자리를 남겨 두려면 정의가 모호하지 않아야 한다. 읽기 쉬운 정의와 함수를 얹을 수 있는 정의가 다를 때는 뒤쪽을 고르고, 둘이 같은 집합을 정한다는 것을 따로 증명해 둔다.

예제 91

문자열 [] 를 반복해서 지워 빈 문자열로 만들 수 있는 대괄호 문자열을 지울 수 있다고 하자. 그 전체를 Erasable 라 한다. RecMatchErasable 임을 증명하라.

증명

뼈대는 이렇다. 구성자로 만든 문자열의 지우는 순서를 재료의 지우는 순서로 조립한다.

증명. 귀납 가설을 P(s)::=[sErasable] 로 하고 s 에 대한 구조적 귀납법을 쓴다.

기저. λ 는 이미 빈 문자열이므로 지울 것이 없고 λErasable 이다.

구성자. s,tErasable 를 가정하고 [s]t 를 본다. 먼저 가운데 s 를 지운다s 를 빈 문자열로 만드는 순서가 있으므로 그것을 그대로 쓴다(양옆에 다른 글자가 붙어 있어도 지우는 일은 방해받지 않는다). 그러면 문자열이 []t 가 된다. 이제 앞의 [] 를 지운다. 남은 것은 t 이고, 가정에 의해 지울 수 있다.

따라서 [s]tErasable 이고, 구조적 귀납법에 의해 RecMatchErasable 다.

반대 방향 ErasableRecMatch 도 참인데, 그쪽은 구조적 귀납법으로 되지 않는다. Erasable 이 "기저와 구성자"로 정의된 것이 아니기 때문이다. 문자열의 길이에 대한 강한 귀납법을 써야 하고, 논증은 "지울 수 있는 문자열에서 [] 를 하나 지우면 길이가 둘 줄어든 지울 수 있는 문자열이 된다"에서 출발한다. 어느 귀납법을 쓸지는 대상이 어떻게 정의되었는가가 정한다.

오류 찾기

다음은 참인 정리에 대한 가짜 증명이다. 어디가 근거 없는가.

정리. 1 보다 큰 모든 정수는 넓게 감소하는 소수 열 하나의 곱으로 쓸 수 있다. (넓게 감소한다는 것은 각 항이 그 뒤의 항들 이상이라는 뜻이다. 예를 들어 252=73322 이고 다른 넓게 감소하는 소수 열로는 252 를 만들 수 없다.)

가짜 증명. 강한 귀납법을 쓴다. 귀납 가설 P(n) 은 "n 은 넓게 감소하는 소수 열 하나의 곱이다"로 한다.

  1. 기저. n=2 는 소수이므로 길이 1 인 열의 곱이고, 곱이 2 가 되는 소수 열은 그것뿐이다.
  2. 귀납 단계. n2 이고 2 부터 n 까지 모두 그렇다고 가정한다.
  3. n+1 이 소수이면 자기 하나로 된 열이고, 소수의 정의에 의해 다른 소인수가 없으므로 그 열이 유일하다.
  4. n+1 이 소수가 아니면 n+1=km 인 정수 k,m 이 있고 둘 다 2 이상 n 이하다.
  5. 강한 귀납 가정에 의해 km 은 각각 넓게 감소하는 소수 열 하나의 곱이고, 그 열은 유일하다.
  6. 두 열의 항을 합쳐 크기순으로 늘어놓으면 넓게 감소하는 소수 열이 되고, 그 곱은 km=n+1 이다.
  7. k 의 열과 m 의 열이 각각 유일하므로 합친 열도 유일하다.
  8. 따라서 P(n+1) 이 참이고, 강한 귀납법에 의해 정리가 성립한다.
풀이 보기

정리는 참이다(산술의 기본정리라 하고 11장에서 제대로 증명한다). 그런데 이 논증에는 근거 없는 단계가 있다.

①부터 ⑥까지는 옳다. ⑥까지로 넓게 감소하는 소수 열이 존재한다는 것은 증명되었다. ⑦이 틀렸다.

④에서 n+1=km 으로 쪼갤 때 쪼개는 방법이 여러 가지일 수 있다. 예를 들어 3649 로도 66 로도 218 로도 쪼개진다. ⑦은 "고른 km 에 대해 열이 유일하다"는 것만 말하는데, 필요한 것은 어떻게 쪼개도 같은 열이 나온다는 것이다. 그것은 증명되지 않았다.

이 빈틈이 얼마나 큰지 알아보려면, 유일성이 실제로 깨지는 비슷한 상황을 생각해 보면 된다. 정수 대신 "4k+1 꼴의 양의 정수"만으로 이루어진 체계에서 곱셈을 생각하면, 그 안에서 더 쪼갤 수 없는 수들의 곱으로 쓰는 방법이 두 가지인 수가 있다. 즉 유일성은 곱셈의 일반적 성질이 아니라 정수만의 성질이고, 그것을 쓰려면 정수의 무언가를 더 알아야 한다.

그 "무언가"가 11장의 도구다. 소수 pab 를 나누면 ab 를 나눈다는 사실이고, 그것 없이는 유일성을 증명할 수 없다. 얻을 교훈은 이렇다. 존재와 유일성은 따로 증명해야 하고, 유일성 쪽이 대개 훨씬 어렵다. 존재만 증명해 놓고 유일성이 따라온다고 여기는 것이 이 자리의 함정이다.

음이 아닌 정수도 재귀적 자료형이다

이제 앞 장의 도구들이 이 장의 특수한 경우로 보인다.

정의. N 을 재귀적 자료형으로 정의한다. 기저: 0N. 구성자: nN 이면 n+1N.

이 정의 위의 구조적 귀납법이 바로 7장의 보통 귀납법이다. 기저 원소가 하나이므로 기저 단계가 하나, 구성자가 하나이므로 귀납 단계가 하나다. 그리고 익숙한 재귀 함수 정의들도 이 정의를 따라간 것이다.

0!::=1,(n+1)!::=(n+1)n!

문제는 이 정의를 따라가지 않은 "정의"들이다.

네 가지 실패 방식이 서로 다르다는 것을 확인하라 — 값이 여럿인 것, 값이 하나도 없는 것, 있는지 아무도 모르는 것. 아래 둘째 메모의 예외가 중요하다. 큰 쪽 참조는 무조건 틀린 것이 아니라 무조건 의심스러운 것이다
<네 가지 실패 방식이 서로 다르다는 것을 확인하라 — 값이 여럿인 것, 값이 하나도 없는 것, 있는지 아무도 모르는 것. 아래 둘째 메모의 예외가 중요하다. 큰 쪽 참조는 무조건 틀린 것이 아니라 무조건 의심스러운 것이다>[원본 보기]

예제 93

다음 중 어느 것이 N 위의 함수를 유일하게 정하는가. (가) f(n)::=2+f(n1) (나) f(0)::=0 이고 그 밖에는 f(n)::=f(n+1) (다) n2 의 배수면 0, 3 의 배수면 1, 그 밖에는 2 (라) f(0)::=1 이고 f(n+1)::=2f(n)

풀이 보기

무엇을 묻는가. 조건을 만족하는 함수가 정확히 하나인지다. 여럿이어도 안 되고 없어도 안 된다.

(가) 정하지 못한다. 기저가 없다. 어떤 함수 f 가 이 식을 만족하면 f+7 도 만족한다. 조건을 만족하는 함수가 무한히 많다.

(나) 정하지 못한다. 기저는 있지만 큰 쪽을 참조한다. f(0)=0 이고 n1 에서 어떤 상수 c 인 함수는 모두 조건을 만족한다. 프로그램으로 돌리면 f(1)f(2) 를, f(2)f(3) 을 불러 끝나지 않는다. 6장의 말로 하면 이 "정의"는 0 에서만 값이 있는 부분함수를 정한다.

(다) 정하지 못한다. 규칙끼리 어긋난다. 62 의 배수이면서 3 의 배수이므로 f(6)0 이면서 1 이어야 한다. 조건을 만족하는 함수가 하나도 없다.

(라) 정한다. 기저에서 값을 직접 주고 구성자에서 재료의 값으로 결과의 값을 정했다. 자료형의 정의를 그대로 따라갔으므로 값이 하나로 정해지고, 실제로 f(n)=2n 이다.

답이 말이 되는가. 넷을 견주면 실패의 원인이 하나로 모인다. 정의가 자료형의 정의를 따라가지 않았다. (가)는 기저 갈래를 빼먹고, (나)는 구성자를 거꾸로 타고, (다)는 갈래를 겹치게 잡았다. (라)만 갈래가 자료형과 정확히 맞는다.

큰 쪽을 참조하는 것이 언제나 틀리는 것은 아니라는 점도 알아 두자. 아커만 함수는 A(m,n)=A(m1,A(m,n1)) 처럼 둘째 인자가 훨씬 커지는데도 값이 하나로 정해진다. 다만 그것을 증명하려면 재주가 필요하다. 큰 쪽 참조는 무조건 틀린 것이 아니라 무조건 의심스러운 것이다.

산술식

프로그램에서 식을 계산하는 일도 재귀적 자료형의 이야기다. 변수 하나만 쓰는 산술식 전체 Aexp 를 정의한다.

괄호를 빠뜨릴 수 없고 지수도 없다. 그러니 3x2+2x+1Aexp 가 아니고 Aexp 의 줄임말이다. 원래 모습은 [[3*[x*x]]+[[2*x]+1]] 다. 번거롭지만 그 덕에 정의가 모호하지 않고 나무 모양이 하나로 정해진다.

주황 숫자가 각 부분식의 값이고, 잎에서 뿌리로 올라오는 것이 eval 의 계산 방향이다. 오른쪽 정의에서 구성자마다 규칙이 하나씩 붙는 것을 확인하라
<주황 숫자가 각 부분식의 값이고, 잎에서 뿌리로 올라오는 것이 eval 의 계산 방향이다. 오른쪽 정의에서 구성자마다 규칙이 하나씩 붙는 것을 확인하라>[원본 보기]

값을 구하는 함수를 재귀적으로 정의한다. 변수 x 의 값을 n 이라 할 때

eval(x,n)::=n,eval(k,n)::=k

eval([e1+e2],n)::=eval(e1,n)+eval(e2,n)

이고 곱과 부호도 같은 식이다. 대입도 그렇다. subst(f,e) 를 "e 안의 모든 xf 로 바꾼 식"이라 하면

subst(f,x)::=f,subst(f,k)::=k

이고 구성자마다 안쪽으로 밀어 넣는다. subst(f,[e1+e2])::=[subst(f,e1)+subst(f,e2)] 다.

두 길이 같은 값에 도착하는 것이 정리이고, 일의 양이 다른 것이 실전의 요점이다. 아래 둘째 메모에서 귀납 변수가 무엇인지 — n 도 f 도 아니라 e 다 — 확인해 두자
<두 길이 같은 값에 도착하는 것이 정리이고, 일의 양이 다른 것이 실전의 요점이다. 아래 둘째 메모에서 귀납 변수가 무엇인지 — n 도 f 도 아니라 e 다 — 확인해 두자>[원본 보기]

예제 94

모든 e,fAexpnZ 에 대하여 eval(subst(f,e),n)=eval(e,eval(f,n)) 임을 증명하라.

증명

뼈대는 이렇다. e 에 대한 구조적 귀납법이다. nf 도 아니라 e 임을 첫 줄에 밝혀야 한다.

이 등식이 말하는 것을 먼저 읽어 두자. 왼쪽은 먼저 대입하고 나중에 계산하는 것(대입 모형)이고 오른쪽은 먼저 계산하고 그 값을 넣는 것(환경 모형)이다.

증명. 귀납 가설을

P(e)::=fAexp,nZ.eval(subst(f,e),n)=eval(e,eval(f,n))

로 한다.

기저 (e=x). 왼쪽은 eval(subst(f,x),n)=eval(f,n) 이다. 오른쪽은 eval(x,eval(f,n))=eval(f,n) 이다. 두 번째 등호는 eval(x,m)=m 이라는 기저 규칙이다. 같다.

기저 (e=k). 왼쪽은 eval(k,n)=k 다(대입은 숫자를 바꾸지 않는다). 오른쪽도 eval(k,eval(f,n))=k 다. 같다.

구성자 (e=[e1+e2]). P(e1)P(e2) 를 가정한다. 왼쪽을 정의대로 펼치면

eval([subst(f,e1)+subst(f,e2)],n)=eval(subst(f,e1),n)+eval(subst(f,e2),n)

이고, 가정을 두 항에 각각 쓰면

=eval(e1,eval(f,n))+eval(e2,eval(f,n))=eval([e1+e2],eval(f,n))

이다. 마지막 등호가 eval 의 합 규칙이다. 곱과 부호도 같은 모양이라 그대로 되풀이한다.

구조적 귀납법에 의해 모든 e 에서 참이다.

값은 같은데 일의 양은 다르다. 앞의 예 e=x(x1), f=3x, n=2 에서 대입 모형은 3x 가 두 번 나타나 곱셈 32 를 두 번 하고, 환경 모형은 한 번만 한다. 실제 프로그래밍 언어가 대개 환경 모형을 쓰는 이유다. 정리가 "어느 쪽을 골라도 된다"고 보장해 주므로 성능을 기준으로 고를 수 있다.

게임을 재귀적 자료형으로 본다

체스·바둑·님처럼 두 사람이 번갈아 두고 판이 양쪽에 다 보이는 게임을 완전 정보 2인 게임이라 한다. 여기서는 무승부가 없는 것 — 승패 2인 게임 — 만 다룬다.

발상은 이렇다. 게임 중간의 어떤 판도 그 자체로 새 게임의 시작이다. 님에서 가장 분명하다. 님은 돌 무더기 몇 개에서 시작해, 한 번에 한 무더기에서 돌을 하나 이상 집어 가고, 마지막 돌을 집은 사람이 이긴다. 첫 수를 두는 일은 "다음에 놀 님 게임을 고르는 일"과 같다.

정의. 승패 2인 게임 전체를 다음과 같이 정의한다. 기저: 는 게임이다. 구성자: 게임들의 공집합이 아닌 모임 G 도 게임이고, G 의 각 원소를 G가능한 첫 수라 한다.

라벨은 ‘그 판에서 둘 차례인 사람이 이기는가’ 다. 자식 하나라도 패 면 부모는 승, 자식이 모두 승 이면 부모는 패 — 이 두 줄이 필승 전략의 정의이자 기본 정리의 증명이다
<라벨은 ‘그 판에서 둘 차례인 사람이 이기는가’ 다. 자식 하나라도 패 면 부모는 승, 자식이 모두 승 이면 부모는 패 — 이 두 줄이 필승 전략의 정의이자 기본 정리의 증명이다>[원본 보기]

예제 95

님 게임이 크기가 같은 두 무더기로 시작하면 두 번째로 두는 사람에게 필승 전략이 있음을 보여라.

증명

뼈대는 한 줄이다. 상대를 흉내 낸다.

전략. 상대가 한 무더기에서 돌 k 개를 집으면 다른 무더기에서 똑같이 k 개를 집는다.

왜 되는가. 이 전략을 쓰면 내 차례가 끝날 때마다 두 무더기의 크기가 같다. 이것이 불변량이다(8장의 도구다). 시작할 때 참이고, 상대가 한쪽을 줄이면 내가 다른 쪽을 같은 만큼 줄여 다시 같아진다.

이 불변량이 있으면 상대가 두어야 하는 판은 언제나 두 무더기가 같은 판이다. 상대가 두려면 돌이 남아 있어야 하고, 그러면 내가 흉내 낼 돌도 반드시 남아 있다. 즉 내가 둘 수 없는 상황은 오지 않는다. 돌은 유한하므로 게임이 끝나고, 마지막 돌을 집는 것은 나다.

그림의 님 1,1 이 이 경우다. 첫 수를 두는 사람은 1 로 갈 수밖에 없고, 그 판에서 둘 차례인 사람 — 두 번째로 두는 사람 — 이 남은 돌을 집어 이긴다.

흉내 내기 전략에서 실제로 쓴 것은 불변량 하나와 종료성 하나다. 8장의 두 도구를 게임에 그대로 옮긴 것이고, 이것이 이 절이 하려는 이야기의 축소판이다.

예제 96

승패 2인 게임의 기본 정리. 어떤 승패 2인 게임에서도 두 사람 중 한쪽에게 필승 전략이 있다. 이를 증명하라. (전략은 게임을 그 게임의 가능한 첫 수 중 하나로 보내는 함수다. 두 사람의 전략이 정해지면 진행이 하나로 정해진다.)

증명

뼈대는 이렇다. 구조적 귀납법 한 번이다. 판마다 "둘 차례인 사람"과 "기다리는 사람"의 역할이 바뀌는 것을 잘 따라가는 것이 요점이다.

증명. 귀납 가설을 P(G)::=[G 에서 두 사람 중 한쪽에게 필승 전략이 있다] 로 한다.

기저 (G= 또는 ). 둘 수 있는 수가 없다. 각자에게 전략은 "아무것도 하지 않는다" 하나뿐이고 결과가 G 로 정해진다. 이면 첫 번째 사람이, 면 두 번째 사람이 이긴다.

구성자 (G 가 게임들의 공집합이 아닌 모임).MG 에 대해 P(M) 을 가정한다. 즉 M 에서 두 사람 중 한쪽에게 필승 전략이 있다. 여기서 G 에서 첫 번째로 두는 사람이 M 에서는 두 번째로 두는 사람이 된다는 것을 기억해 두자. 두 경우로 나눈다.

경우 1: 어떤 M0G 에서 두 번째로 두는 사람에게 필승 전략이 있다. 그러면 G 에서 첫 번째로 두는 사람의 필승 전략은 이것이다 — 첫 수로 M0 을 고르고, 그다음부터 M0 에서 두 번째 사람의 필승 전략을 그대로 쓴다.

경우 2: 어떤 MG 에서도 두 번째로 두는 사람에게 필승 전략이 없다. 가정에 의해 각 M 에서 한쪽에게 필승 전략이 있으므로, 모든 M 에서 첫 번째로 두는 사람에게 필승 전략이 있다. 그러면 G 에서 두 번째로 두는 사람의 필승 전략은 이것이다 — 상대가 M 을 고르면 M 에서 첫 번째 사람의 필승 전략을 따른다.

두 경우가 빠짐없으므로 P(G) 가 참이다. 구조적 귀납법에 의해 모든 게임에서 참이다.

결론이 말하는 것을 새겨 두자. 체스에서도 한쪽에게는 상대가 알고 있어도 무너지지 않는 전략이 있다(무승부를 첫 번째 사람의 패로 세면 이 정리가 그대로 적용된다). 그런데 정리는 어느 쪽인지 알려 주지 않는다. 체스와 바둑에서 어느 쪽인지는 아무도 모른다.

무한히 많은 첫 수가 있는 게임에서도 이 정리가 성립한다는 점도 확인해 두자. 정의의 구성자가 "공집합이 아닌 모임"이라고만 했고 유한하다는 말이 없다. 그래서 이 증명은 길이에 대한 귀납법으로는 할 수 없다 — 첫 수가 무한히 많으면 "크기"를 정의할 방법이 없다. 구조적 귀납법이 보통 귀납법보다 멀리 가는 자리가 이런 곳이다.

이 장에서 새로 나온 것

용어·기호
재귀적 자료형기저와 구성자로 정의된 집합
기저 · 구성자증명 없이 집합에 넣는 원소 · 있는 원소에서 새 원소를 만드는 규칙
구조적 귀납법기저마다 · 구성자마다 성질을 확인해 자료형 전체를 덮는 증명
모호한 정의(ambiguous)같은 원소를 두 가지 이상의 길로 만들 수 있는 재귀적 정의
A · a,s알파벳 A 위의 문자열 전체 · 글자 a 를 문자열 s 앞에 붙인 것
st (또는 st)이어붙임
#c(s)문자 c 가 문자열 s 에 나타나는 횟수
rev(s)뒤집은 문자열
RecMatch짝이 맞는 대괄호 문자열. 기저 λ, 구성자 [s]t
Aexp변수 하나뿐인 산술식. 완전히 괄호로 묶는다
eval(e,n) · subst(f,e)식의 값 · 식 안의 변수를 다른 식으로 바꾼 것
대입 모형 · 환경 모형먼저 대입하고 계산 · 먼저 계산하고 값을 넣는다. 결과는 같고 비용이 다르다
승패 2인 게임기저는 승·패, 구성자는 게임들의 공집합이 아닌 모임
필승 전략상대가 무엇을 하든 이기는 전략. 모든 승패 2인 게임에서 한쪽이 갖는다

챙겨 갈 것은 다섯이다.

이 장의 마지막 이야기를 정리해 두자. 보통 귀납법은 구조적 귀납법의 특수한 경우다(N 도 재귀적 자료형이므로). 거꾸로 문자열이나 유한한 나무처럼 크기를 셀 수 있는 자료형에서는 구조적 귀납법을 크기에 대한 귀납법으로 옮겨 쓸 수 있다. 그렇지만 그쪽 증명은 대개 더 번거롭고, 게임의 기본 정리처럼 크기를 정의할 수 없는 자료형에서는 아예 옮길 수 없다.

다음 장에서는 그 "크기를 셀 수 없다"는 이야기를 정면으로 다룬다. 무한집합의 크기를 어떻게 견주는가. 6장에서 유한 가정 없이 증명해 둔 사상 규칙이 거기서 유일한 도구가 된다. 그리고 그 도구로, 컴퓨터가 원리적으로 풀 수 없는 문제가 있다는 것을 증명한다.

무한집합

컴퓨터의 기억 장치는 유한하고 우주도 유한해 보인다. 그런데 왜 무한집합을 다루는가.

답이 셋이다. 첫째, 이미 쓰고 있다 — 정수, 유리수, 실수, 그것들의 수열은 모두 무한집합이다. 둘째, 유한하다고 해서 편해지지 않는다. "하늘의 별만큼 많은 자리를 가진 두 정수를 더하는 프로그램"과 "아무 두 정수를 더하는 프로그램"은 다르지 않고, 앞쪽으로 적으려면 오히려 번거롭다. 셋째가 이 장의 진짜 이유다. 무한집합을 다루려고 만든 논증이 컴퓨터가 원리적으로 할 수 없는 일이 있다는 것을 증명한다.

답할 질문은 넷이다. 셀 수 없는 것의 크기를 어떻게 견주는가. 무한에도 여러 크기가 있는가. 프로그램이 원리적으로 풀 수 없는 문제가 있는가. 그리고 집합이라는 말 자체를 어떻게 안전하게 정의하는가.

가져오는 것은 6장의 사상 규칙이다. AsurjB, AinjB, AbijB 를 정의하고 그 성질을 유한 가정 없이 증명해 두었다. 그렇게 써 둔 이유가 이 장이다. 6장의 러셀의 역설도 다시 꺼낸다. 기초수학의 집합 장에서 대각선 논법을 맛보기로 봤을 것인데, 여기서는 그것을 이 장의 주된 무기로 쓴다. 필요하면 기초수학 문서로 돌아가 복습하고 오면 된다.

크기를 세지 않고 견준다

19세기 말 게오르크 칸토어는 푸리에 급수를 연구하다가 "무한히 많은 점에서 수렴하지 않지만 대체로 수렴한다"고 말하고 싶어졌다. 그러려면 무한집합의 크기를 견줄 방법이 필요했다. 그가 택한 길은 세는 일을 아예 포기하는 것이었다.

6장의 사상 규칙을 그대로 정의로 삼는다. 유한집합에서는 AsurjB|A||B| 와 같았으니, 무한집합에서는 그 관계 자체를 "AB 만큼 크다"로 읽는다.

정의. AstrictB¬(AsurjB) 라는 뜻이다. 즉 A 에서 B 로 가는 전사 함수가 없다는 것이고, AB 보다 진짜로 작다고 읽는다.

왼쪽 세 줄은 6장에서 유한 가정 없이 증명해 둔 것이라 그대로 쓴다. 가운데 두 줄은 증명이 어렵고 이 문서에서는 결과만 쓴다. 오른쪽 두 줄이 무한에서 깨지는 것이고, 그 경계를 아는 것이 이 절의 목표다
<왼쪽 세 줄은 6장에서 유한 가정 없이 증명해 둔 것이라 그대로 쓴다. 가운데 두 줄은 증명이 어렵고 이 문서에서는 결과만 쓴다. 오른쪽 두 줄이 무한에서 깨지는 것이고, 그 경계를 아는 것이 이 절의 목표다>[원본 보기]

예제 97

유한집합 A, B 에 대하여 AstrictB 인 것과 |A|<|B| 인 것이 같음을 보여라.

증명

무엇을 확인하는가. 새 정의가 유한집합에서 옛 뜻과 어긋나지 않는다는 것이다. 정의를 넓힐 때 반드시 해 두어야 하는 확인이다.

증명. 동치 사슬로 잇는다.

AstrictB¬(AsurjB)(정의)

¬(|A||B|)(6장의 사상 규칙)

|A|<|B|

각 단계가 양방향인지 확인해 두자. 사상 규칙이 "AsurjB 인 것과 |A||B| 인 것이 같다"는 동치였기 때문에 부정을 붙여도 동치가 유지된다.

그러니 무한집합에 대한 새 정의는 유한집합에서 하던 이야기를 그대로 이어받는다. 이제부터 "크기"라는 말을 무한집합에 쓸 때 그것이 무슨 뜻인지 정확히 알고 쓰는 것이다. 다만 조심할 것이 있다. 이 장에서 "무한집합의 크기"를 정의한 적은 없다. 정의한 것은 크기의 비교뿐이다.

예제 98

A 가 무한집합이고 bA 이면 Abij(A{b}) 임을 증명하라. 그리고 이것이 유한집합에서 거짓임을 확인하라.

증명

뼈대는 이렇다. 한 칸씩 밀면 앞자리가 빈다. 무한이면 밀 자리가 끝나지 않는다.

왼쪽에서 화살표가 끝없이 이어지는 것이 요점이다. 오른쪽에서는 마지막 화살표가 갈 곳이 없다. 아래 두 줄에 이 논증이 기대는 전제가 적혀 있다
<왼쪽에서 화살표가 끝없이 이어지는 것이 요점이다. 오른쪽에서는 마지막 화살표가 갈 곳이 없다. 아래 두 줄에 이 논증이 기대는 전제가 적혀 있다>[원본 보기]

증명. A 가 무한집합이므로 원소가 하나 있다. 그것을 a0 이라 하자. A 가 무한이므로 원소가 둘 있고, 그중 a0 이 아닌 것을 a1 이라 하자. A 가 무한이므로 원소가 셋 있고, 그중 a0a1 도 아닌 것을 a2 라 하자. 이렇게 계속하면 서로 다른 원소의 무한 열

a0,a1,a2,,an,

을 얻는다. 이제 e:A{b}A 를 이렇게 정의한다.

e(b)::=a0,e(an)::=an+1(nN),e(a)::=a(aA{a0,a1,})

이것이 전단사임을 확인한다. 서로 다른 입력이 서로 다른 값으로 가고(ba0 로, anan+1 로, 나머지는 자기 자신으로 — 세 무리의 상이 겹치지 않는다), A 의 모든 원소가 값으로 나온다(a0b 에서, an+1an 에서, 나머지는 자기 자신에서).

유한집합에서는 거짓이다. |A{b}|=|A|+1|A| 이므로 사상 규칙에 의해 전단사가 없다. 그림 오른쪽이 그것이다 — 마지막 화살표가 갈 곳이 없다.

이 증명에 숨은 전제가 있다는 것을 짚어 두어야 한다. "이렇게 계속하면"이라고 적은 대목이다. 무한 열을 뽑는 일을 무한 번 반복해도 되는지는 당연하지 않고, 실은 이 장 마지막 절에서 다룰 선택 공리에 기대는 것이다. 유한 번 반복하는 것으로는 무한 열을 얻을 수 없다.

결론이 말하는 것도 새겨 두자. 무한집합에 원소를 더해도 크기가 안 커진다. 그러니 "진부분집합은 더 작다"는 감각을 버려야 한다. 그 감각이 유한집합에만 통하는 것이었다.

예제 99

AstrictB 이고 BstrictC 이면 AstrictC 임을 증명하라. 다음 사실은 써도 된다 — 임의의 집합 X, Y 에 대해 XsurjY 또는 YsurjX 다.

증명

뼈대는 이렇다. 귀류법이다. strict 가 부정으로 정의되었으므로 그 추이성을 직접 보이기는 어렵고, 부정을 가정해 surj 의 추이성으로 몰아간다.

증명. ¬(AstrictC) 라 가정하자. 정의에 의해 AsurjC 다.

한편 BstrictC 이므로 ¬(BsurjC) 다. 주어진 사실을 X=B, Y=C 에 적용하면 BsurjC 또는 CsurjB 인데, 앞쪽이 거짓이므로 CsurjB 다.

이제 AsurjC 이고 CsurjB 이므로 6장에서 증명한 surj 의 추이성에 의해 AsurjB 다. 그런데 AstrictB¬(AsurjB) 다. 모순이다.

따라서 AstrictC 다.

이 증명에서 6장의 추이성을 그대로 가져다 썼다는 것이 요점이다. 6장의 그 증명에는 "개수"라는 말이 한 번도 나오지 않았다 — 전사 함수 둘을 합성하면 전사라는 논증뿐이었다. 그래서 무한집합에도 아무 수정 없이 쓸 수 있다. 정의를 좁게 진술해 두고 필요할 때 문제를 그 모양으로 옮기는 4장의 수법과 짝을 이루는 습관이다 — 증명을 필요 이상의 가정 없이 써 두면 나중에 그대로 재사용된다.

가산집합

가장 작은 무한이 무엇인지부터 정한다.

정의. 집합 C가산무한(countably infinite)이라는 것은 NbijC 라는 뜻이다. 유한하거나 가산무한이면 가산(countable)이라 하고, 가산이 아니면 비가산(uncountable)이라 한다.

이 정의를 말로 옮기면 "원소를 c0,c1,c2, 처럼 줄 세울 수 있다"는 것이다. 중복을 허용하면 유한집합도 같은 방식으로 다룰 수 있어서 다음이 성립한다 — C 가 가산인 것은 NsurjC 인 것과 같다. 앞으로 이 형태를 자주 쓴다.

그리고 다음도 성립한다. A 가 무한이고 B 가 가산이면 AsurjB 다. 즉 가산무한이 가장 작은 무한이다. 증명은 앞의 "한 칸씩 밀기"와 같은 방식으로 무한 열 a0,a1, 을 뽑아 B 의 목록에 맞춰 주는 것이다.

예제 100

정수 전체 Z 가 가산무한임을 증명하라.

증명

뼈대는 이렇다. 번갈아 세운다. 0, 1, 1, 2, 2, … 로 줄 세우면 어떤 정수도 유한한 걸음 안에 나온다.

증명. f:NZ

f(n)::={n/2n 이 짝수(n+1)/2n 이 홀수

로 정의한다. 몇 개를 계산해 보면 f(0)=0, f(1)=1, f(2)=1, f(3)=2, f(4)=2 다.

전단사임을 확인한다. 단사: 짝수 입력은 0 이상으로, 홀수 입력은 음수로 가므로 두 무리의 상이 겹치지 않는다. 각 무리 안에서는 nn/2n(n+1)/2 가 각각 단사다. 전사: 정수 k0f(2k)=k 로 나오고, k<0f(2k1)=k 로 나온다.

따라서 NbijZ 다.

여기서 눈여겨볼 것은 줄 세우는 순서를 잘 고르는 것이 전부라는 점이다. 0,1,2, 를 먼저 다 세우고 음수를 세려 하면 음수 차례가 오지 않는다. "번갈아"가 그 문제를 없앤다. 다음 예제에서 같은 요령을 두 차원으로 확장한다.

예제 101

N×N 가 가산임을 보이고, 그로부터 양의 유리수 전체 Q+ 가 가산임을 결론지어라.

증명

뼈대는 이렇다. 대각선을 따라 훑는다. 가로로 훑으면 첫 줄에서 영원히 벗어나지 못한다.

점 옆의 번호가 그 쌍이 받는 순서다. 성분의 합이 같은 쌍들을 한 묶음으로 처리하는 것이 요점이고, 그 묶음이 유한하기 때문에 어떤 쌍도 유한한 걸음 안에 번호를 받는다
<점 옆의 번호가 그 쌍이 받는 순서다. 성분의 합이 같은 쌍들을 한 묶음으로 처리하는 것이 요점이고, 그 묶음이 유한하기 때문에 어떤 쌍도 유한한 걸음 안에 번호를 받는다>[원본 보기]

증명.(i,j)성분의 합 i+j 순으로 세고, 합이 같은 것끼리는 i 가 작은 것부터 센다. 합이 d 인 쌍은 (0,d),(1,d1),,(d,0) 로 정확히 d+1 개이므로 각 묶음이 유한하다.

그러면 쌍 (i,j) 가 받는 번호는 그보다 앞선 묶음들의 크기의 합에 묶음 안의 위치를 더한 것이다.

(i,j)(i+j)(i+j+1)2+i

이 대응이 전단사임은 위의 셈에서 나온다. 어떤 쌍도 유한한 번호를 받고, 어떤 번호에도 정확히 하나의 쌍이 대응한다. 따라서 Nbij(N×N) 다.

유리수 쪽. 양의 유리수는 i/j (i,j 는 양의 정수) 꼴로 쓸 수 있다. 방금의 목록에서 i,j1 인 쌍만 추려 i/j 로 읽으면 양의 유리수의 목록이 된다. 이 목록에는 중복이 있다1/22/4 가 따로 나온다. 그런데 가산의 조건은 NsurjQ+ 이므로 중복은 문제가 아니다. 따라서 Q+ 는 가산이다.

결론이 놀라운 자리다. 유리수는 두 정수 사이를 빽빽하게 메우는데도 정수보다 많지 않다. 어떤 두 유리수 사이에도 또 유리수가 있는데 그렇다. 촘촘함과 크기는 다른 이야기다.

같은 방법으로 Z+, Z×Z, Q 도 가산임이 나온다. 가산집합은 유한 번의 합집합과 곱집합에 대해 닫혀 있다.

예제 102

유한한 이진 문자열 전체 {0,1} 가 가산임을 증명하라.

증명

뼈대는 이렇다. 길이 순으로 세운다. 각 길이의 문자열이 유한 개이므로 어느 문자열도 유한한 걸음 안에 나온다.

증명. 길이 0 인 문자열부터 시작해 길이 1, 2, … 로 세고, 같은 길이끼리는 사전 순(또는 이진수로 읽은 값 순)으로 센다. 목록의 앞부분은

λ,0,1,00,01,10,11,000,

이다. 6장에서 길이 n 인 비트열이 2n 개임을 증명했으므로 각 묶음이 유한하다. 그러면 길이 n 인 문자열의 번호는 (20+21++2n1)=2n1 부터 시작하고, 앞선 묶음이 유한 개이므로 어떤 문자열도 유한한 번호를 받는다.

따라서 Nbij{0,1} 이고 {0,1} 는 가산무한이다.

여기가 이 절에서 가장 중요한 자리다. 길이 n 인 비트열이 2n 개로 폭발적으로 늘어나는데도 전체가 가산이다. 그런데 다음 절에서 무한 비트열 전체는 비가산임을 증명한다. 유한과 무한을 가르는 선이 여기에 있고, 두 결과를 나란히 기억해 두어야 헷갈리지 않는다.

이 결과의 쓸모도 적어 둔다. 문자 집합이 유한하면 같은 논증이 통하므로 어떤 프로그래밍 언어에서든 프로그램 전체가 가산이다. 소스 코드가 유한한 문자열이기 때문이다.

예제 103

양의 정수의 유한 수열 전체가 가산임을 증명하라.

증명

뼈대는 이렇다. 수열 하나에 정수 하나를 대응시킨다. 소인수분해가 그 대응을 준다.

증명. 음이 아닌 정수 n 의 소인수분해를 보고, 지수가 0 이 아닌 부분만 앞에서부터 읽어 수열 e(n) 을 만든다. 예를 들어

20=223051e(20)=(2,1)

6615=20335172e(6615)=(3,1,2)

이고 e(1)=λ (빈 수열)이다. e(0) 은 정의하지 않는다 — 부분함수다.

e전사임을 보인다. 양의 정수의 유한 수열 (k1,k2,,km) 이 주어지면, 소수를 작은 것부터 p1=2, p2=3, p3=5, … 라 하고

n::=p1k1p2k2pmkm

을 만들면 된다. 각 ki 가 양의 정수이므로 지수가 0 이 되는 자리가 없고, 따라서 e(n) 이 정확히 그 수열이다.

그러므로 Nsurj(Z+) 이고, 앞에서 말한 대로 이것이 가산이라는 뜻이다.

이 증명에서 실제로 쓴 것은 소인수분해가 유일하다는 사실이다(11장에서 증명한다). 그 유일성이 없으면 e 가 함수인지조차 알 수 없다.

이 결과가 다음 절에서 값을 한다. 모든 프로그램의 소스 코드는 유한한 문자열이므로 프로그램 전체가 가산이다. 그런데 다음 절에서 "프로그램이 판정해야 할 문제"의 개수는 비가산임을 보인다. 그러면 판정할 수 없는 문제가 있을 수밖에 없다.

대각선 논법과 칸토어 정리

이제 모든 무한이 같은 크기가 아니라는 것을 보인다. 칸토어의 발견이고, 이 문서 전체에서 가장 값나가는 논증이다.

칸토어 정리. 임의의 집합 A 에 대하여 Astrictpow(A) 다.

예제 104

칸토어 정리를 증명하라.

증명

뼈대는 한 줄이다. "ag(a) 에 들어 있는가"를 모든 a 에서 뒤집어 새 부분집합을 만든다. 그 부분집합은 어느 g(a) 와도 다르다.

대각선 줄이 ‘a 가 g(a) 에 들어 있는가’ 이고 그 아래가 뒤집은 것이다. 뒤집은 줄이 각 행과 정확히 대각선 자리에서 다르다는 것이 증명의 전부다
<대각선 줄이 ‘a 가 g(a) 에 들어 있는가’ 이고 그 아래가 뒤집은 것이다. 뒤집은 줄이 각 행과 정확히 대각선 자리에서 다르다는 것이 증명의 전부다>[원본 보기]

증명. ¬(Asurjpow(A)) 를 보여야 한다. 즉 어떤 함수 g:Apow(A) 도 전사가 아님을 보인다. (부분함수는 같은 치역을 갖는 전함수로 늘릴 수 있으므로 g 를 전함수로 놓아도 된다.)

g 가 주어졌다고 하자. 다음 집합을 만든다.

Ag::={aA:ag(a)}

이것은 A 의 부분집합이므로 pow(A) 의 원소다. 이제 Agg 의 치역에 없음을 보인다.

모순을 이끌어 낸다. 어떤 a0A 에 대해 Ag=g(a0) 이라 하자. Ag 의 정의를 a=a0 에 적용하면

a0Aga0g(a0)a0Ag

다. 마지막 단계에서 g(a0)=Ag 를 썼다. 즉 "a0Ag 에 들어 있는 것과 들어 있지 않은 것이 같다"는 것이고 모순이다.

따라서 Agg 의 치역에 없고 g 는 전사가 아니다. 어떤 g 에 대해서도 그러므로 Astrictpow(A) 다.

이 논증이 6장의 러셀의 역설과 같은 모양이라는 것을 눈치챘을 것이다. 그쪽에서는 {S:SS} 를 만들어 모순을 얻었고, 여기서는 {a:ag(a)} 를 만들어 "g 가 전사가 아니다"라는 유용한 결론을 얻었다. 같은 발상이 한쪽에서는 이론을 무너뜨리고 다른 쪽에서는 정리를 만든다.

이 정리에서 무한의 탑이 나온다.

Nstrictpow(N)strictpow(pow(N))strict

각 단계가 앞의 것보다 진짜로 크고, 앞의 추이성 예제에 의해 서로 다른 자리끼리도 크기가 다르다. 그리고 이 열의 모든 집합을 합친 것이 열의 어느 것보다도 크다. 그런 식으로 끝없이 큰 무한을 만들 수 있다.

표기 하나를 소개해 둔다. |N|0(알레프 널)이라 적고 가장 작은 무한 기수라 부른다. 다만 이 문서는 무한집합의 "크기" 자체를 정의하지 않았다. 그것을 제대로 하려면 서수 이론이 필요하고, 우리가 필요한 것은 비교뿐이었다. 0 는 다른 책에서 만날 때 알아보기 위한 이름으로만 알아 두면 된다.

무한 비트열과 실수

칸토어 정리를 구체적인 집합에 적용한다. 6장에서 n 원소 집합의 부분집합과 길이 n 인 비트열 사이에 전단사를 만들었다. 그 대응이 무한으로 그대로 넓어져서

pow(N)bij{0,1}ω

다. 여기서 {0,1}ω무한 비트열 전체다. 부분집합 SN 에 "n 번째 비트가 1 인 것과 nS 인 것이 같은" 비트열을 대응시키면 된다.

예제 105

{0,1}ω 가 비가산임을 대각선 논법으로 직접 증명하라. 그리고 실수 전체 R 도 비가산임을 결론지어라.

증명

뼈대는 이렇다. 목록이 있다고 하고 대각선을 뒤집어 목록에 없는 것을 만든다.

표의 대각선 D 와 그것을 자리마다 뒤집은 C 를 보라. C 는 n 번째 줄과 정확히 n 번째 자리에서 다르므로 어느 줄도 될 수 없다. 오른쪽 아래가 이 논증이 어떤 목록에서도 통하는 이유다
<표의 대각선 D 와 그것을 자리마다 뒤집은 C 를 보라. C 는 n 번째 줄과 정확히 n 번째 자리에서 다르므로 어느 줄도 될 수 없다. 오른쪽 아래가 이 논증이 어떤 목록에서도 통하는 이유다>[원본 보기]

증명. {0,1}ω 가 가산이라 가정하면 원소를 줄 세울 수 있다.

A0,A1,A2,

이제 새 비트열 C 를 이렇게 정의한다 — Cn 번째 비트는 Ann 번째 비트를 뒤집은 것이다. 즉

C[n]::=1An[n]

C 는 각 자리가 0 이나 1 인 무한 비트열이므로 {0,1}ω 의 원소다. 그런데 어떤 n 에 대해 C=An 이라면 모든 자리가 같아야 하고 특히 C[n]=An[n] 이어야 한다. 그런데 정의에 의해 C[n]=1An[n] 이다. 모순이다.

따라서 C 는 목록에 없고, 목록이 {0,1}ω 를 다 담았다는 데 어긋난다. 그러므로 {0,1}ω 는 비가산이다.

실수 쪽. 실수 r 를 그 십진 전개의 소수점 아래 자리를 이어 붙인 비트열 b(r) 로 보낸다. 0 이나 1 이 아닌 자리가 나오면 b(r) 를 정의하지 않는다. 예를 들어 b(1/9)=111, b(41/99)=010101 이고 b(1/3) 은 정의되지 않는다.

b 는 부분함수이지만 전사다. 임의의 무한 비트열이 주어지면 그것을 소수점 아래에 그대로 적은 실수가 그 값으로 간다. 그러므로 Rsurj{0,1}ω 이고, 비가산집합 위로 전사가 있으면 정의역도 비가산이므로 R 도 비가산이다.

이 논증의 힘이 어디서 오는지 새겨 두자. 목록을 어떻게 만들든 통한다. 아주 영리한 줄 세우기를 고안해도, 그것을 대각선 논법에 넣으면 또 빠진 것이 나온다. 그래서 "아직 좋은 방법을 못 찾은 것"이 아니라 "방법이 없다"는 결론이 된다.

예제 106

S 가 무한집합이면 pow(S) 가 비가산임을 증명하라.

증명

뼈대는 이렇다. 가산이라고 하면 S 가 자기 멱집합만큼 크다는 결론이 나오고, 칸토어 정리에 어긋난다.

증명. 모순을 이끌어 낸다. pow(S) 가 가산이라 하자. 그러면 앞에서 말한 대로 Nsurjpow(S) 다.

한편 S 가 무한집합이고 N 은 가산이므로, 이 절 앞에서 확인한 "가산무한이 가장 작은 무한"에 의해 SsurjN 이다.

두 사실에 surj 의 추이성(6장)을 쓰면

SsurjN 이고 Nsurjpow(S)Ssurjpow(S)

다. 그런데 칸토어 정리는 Sstrictpow(S), 즉 ¬(Ssurjpow(S)) 라고 말한다. 모순이다.

따라서 pow(S) 는 비가산이다.

이 증명이 세 조각을 이어 붙인 것임을 확인해 두자. 가산의 정의를 surj 로 바꿔 적는 것, 가산무한이 가장 작은 무한이라는 것, 그리고 칸토어 정리다. 앞에서 도구를 하나씩 갖춰 둔 덕에 증명이 세 줄로 끝났다. 정리를 쌓아 올리면 나중 증명이 짧아진다는 것이 이 문서 전체의 작업 방식이다.

오류 찾기

칸토어 정리의 증명에서 "대각선을 따라" 갈 필요가 있는지 의심해 보자. p:AA 를 전함수라 하고

Ag,p::={p(a):aA 이고 p(a)g(a)}

라 정의한다. 다음 "증명"은 이것도 g 의 치역에 없다고 주장한다.

가짜 증명. Ag,pA 의 부분집합이므로 pow(A) 의 원소다. 각 aA 에 대해, Ag,p 는 원소 p(a) 에서 g(a) 와 다르다 — 정의에 의해 p(a)Ag,p 인 것과 p(a)g(a) 인 것이 같기 때문이다. 그러므로 Ag,p 는 어떤 g(a) 와도 같지 않고 g 의 치역에 없다.

A={0,1}, g(n)={n}, p(n)=0 으로 이 주장이 거짓임을 보이고, 어느 단계가 틀렸는지 밝혀라. 그리고 무엇을 요구하면 논증이 살아나는지 말하라.

풀이 보기

먼저 반례를 계산한다. Ag,p 의 정의에 a=0a=1 을 넣어 본다.

a=0: p(0)=0 이고 g(0)={0} 이므로 p(0)g(0) 이다. 조건을 만족하지 않아 아무것도 넣지 않는다.

a=1: p(1)=0 이고 g(1)={1} 이므로 p(1)g(1) 이다. 조건을 만족하므로 0 을 넣는다.

따라서 Ag,p={0}=g(0) 이고 치역에 있다. 주장이 거짓이다.

틀린 단계는 "정의에 의해 p(a)Ag,p 인 것과 p(a)g(a) 인 것이 같다"다. 정의를 정확히 읽으면 p(a)Ag,p 는 "p(a)=p(a) 이고 p(a)g(a)어떤 a 이 있다"는 뜻이다. a=a 만 보는 것이 아니다.

반례에서 정확히 그 일이 일어났다. p(0)=p(1)=0 이므로 a=10 을 넣어 주었고, 그래서 a=0 에 대한 "다르다"는 주장이 무너졌다.

고치는 방법. p단사이면 된다. 그러면 p(a)=p(a)aa 뿐이므로

p(a)Ag,pp(a)g(a)

가 정말로 성립하고 논증이 살아난다. 대각선 p(a)=a 는 단사인 특수한 경우다.

얻을 교훈은 둘이다. 첫째, 대각선이 본질이 아니다.a 마다 "서로 다른 자리" 하나씩을 확보하는 것이 본질이고, 그래서 단사가 필요하다. 둘째, 조건제시법으로 만든 집합에서 "원소이다"를 읽을 때 한정사를 정확히 읽어라. {p(a):} 꼴은 상(image)이므로 소속 조건에 존재 한정사가 숨어 있다. 6장에서 상과 역상을 정의해 둔 이유가 이런 자리다.

정지 문제

이제 이 논증이 컴퓨터과학에서 무엇을 하는지 본다.

프로그램을 다루는 프로그램은 흔하다. 컴파일러가 그렇고, 해석기도, 타입 검사기도, 최적화기도 그렇다. 그러면 이런 프로그램은 만들 수 있는가 — 주어진 프로그램이 무한 반복에 빠지는지 판정하는 프로그램.

멈추는지 알아내는 것은 원리적으로 어렵지 않다. 시늉해 보면 된다. 어려운 것은 멈추지 않는다는 판정이다. 시늉하는 중에는 "조금 더 있으면 멈출지" "영원히 안 멈출지" 알 수 없다. 그래서 다른 방법 — 코드를 들여다보고 판정하는 방법 — 이 있어야 하고, 이 절에서 그런 방법이 없다는 것을 증명한다.

형식을 갖춘다. 문자열 하나를 인수로 받는 프로그램을 문자열 프로시저라 하고, 프로시저를 문자열에 적용한 계산이 멈추면 그 문자열을 인식한다고 한다. 프로시저 P 가 인식하는 문자열 전체를

lang(P)::={s:P 를 s 에 적용하면 멈춘다}

라 하고, 어떤 프로시저 P 에 대해 L=lang(P) 이면 L인식 가능하다고 한다.

프로그램도 문자열로 적힌다. 문자열 s 를 프로그램으로 읽은 것을 Ps 라 적고, 프로그램으로 읽을 수 없는 s 에 대해서는 Ps 를 "아무것도 인식하지 않는 프로그램"으로 정해 둔다. 그러면 모든 문자열이 프로그램이 되고, 프로그램과 입력을 같은 축에 놓을 수 있다.

표의 대각선을 뒤집은 것이 집합 안멈춤 이다. 칸토어 정리의 표와 축 이름만 다르다는 것을 확인하라 — 그래서 계산의 한계가 무한집합의 크기 이야기에서 나온다
<표의 대각선을 뒤집은 것이 집합 안멈춤 이다. 칸토어 정리의 표와 축 이름만 다르다는 것을 확인하라 — 그래서 계산의 한계가 무한집합의 크기 이야기에서 나온다>[원본 보기]

예제 108

집합 안멈춤::={s:Ps 를 s 에 적용하면 멈추지 않는다} 가 인식 가능하지 않음을 증명하라.

증명

뼈대는 이렇다. 대각선을 뒤집었으므로 자기 자신에서 모순이 난다.

위에서 아래로 내려가는 줄기 하나가 증명 전부다. 오른쪽 점선 세 갈래가 ‘그래도 이렇게 하면 되지 않는가’ 라는 물음과 그 답이고, 아래 메모가 칸토어 정리와의 관계다
<위에서 아래로 내려가는 줄기 하나가 증명 전부다. 오른쪽 점선 세 갈래가 ‘그래도 이렇게 하면 되지 않는가’ 라는 물음과 그 답이고, 아래 메모가 칸토어 정리와의 관계다>[원본 보기]

정의를 다시 적으면 안멈춤={s:slang(Ps)} 이다. 즉 모든 문자열 s 에 대해

s안멈춤slang(Ps)()

이다.

증명. 모순을 이끌어 낸다. 안멈춤 이 인식 가능하다고 가정하면, 어떤 문자열 s0 에 대해

안멈춤=lang(Ps0)

이다. 이것을 () 에 넣으면 모든 s 에 대해

slang(Ps0)slang(Ps)

다. 이제 s=s0 을 넣는다.

s0lang(Ps0)s0lang(Ps0)

모순이다. 따라서 안멈춤 은 인식 가능하지 않다.

칸토어 정리의 증명과 나란히 놓아 보자. 그쪽에서 g(a) 였던 것이 여기서 lang(Ps) 이고, ag(a) 를 뒤집은 것이 slang(Ps) 다. 같은 논증이다. 다른 것은 "부분집합" 자리에 "프로그램이 인식하는 문자열 집합"을 넣은 것뿐이다.

여기서 결정적인 대목은 프로그램을 문자열로 볼 수 있다는 것이다. 그것이 있어야 프로그램과 입력을 같은 축에 놓고 대각선을 그을 수 있다. 프로그램이 데이터라는 사실 — 컴파일러와 해석기가 매일 쓰는 사실 — 이 이 정리의 전제다.

예제 109

위 결과가 다음을 함의함을 설명하라. (가) 다른 프로그래밍 언어로 쓰면 되지 않는가. (나) 완벽한 타입 검사기가 있을 수 없다.

풀이 보기

무엇을 묻는가. 정리의 범위다. 어디까지 미치는지 알아야 결론을 오해하지 않는다.

(가) 앞의 증명은 "프로그램을 문자열로 적을 수 있고 그것을 시늉할 수 있다"는 것만 썼다. 그러니 어떤 언어에도 그대로 적용된다. 그렇다면 한 언어로 다른 언어의 안멈춤을 인식하는 것은 되지 않을까. 그것도 안 된다. 언어 X 로 언어 Y 의 해석기를 쓸 수 있다면, 언어 X 의 프로그램이 언어 Y 의 안멈춤을 인식할 수 있다면 언어 Y 의 프로그램도 X 프로그램을 시늉해서 같은 일을 할 수 있다. 그런데 그것이 불가능하다고 증명했다. 실용적인 언어들은 서로의 해석기를 쓸 수 있으므로 언어를 바꿔 빠져나갈 길이 없다.

(나) 타입 검사기는 "이 프로그램이 실행 중에 타입 오류를 내지 않는다"를 컴파일 시점에 판정하려 한다. 이것도 프로그램의 실행 전체에 대한 성질이다. 그런 성질을 완벽하게 판정하는 프로그램이 있다면 그것을 조금 고쳐 안멈춤 인식기를 만들 수 있고, 그것은 불가능하다.

그러면 실제 타입 검사기는 무엇을 하는가. 어쩔 수 없이 안전한 쪽으로 기운다. 통과시킨 프로그램은 정말 타입 오류를 내지 않지만, 문제없는 프로그램을 몇 개는 거절한다. 타입 검사기를 쓰다가 "이건 분명 괜찮은 코드인데 왜 거절하지"라고 느끼는 일이 있다면, 그 느낌의 뿌리에 이 정리가 있다.

답이 말이 되는가. 이 결론을 과장하지 않는 것이 중요하다. 정리가 말하는 것은 임의의 프로그램에 대해 완벽하게는 안 된다는 것뿐이다. 실제로 쓰이는 프로그램은 대개 분석되기 쉽게 짜여 있고, 그래서 프로그램 분석 도구가 실용적으로 아주 잘 작동한다. 다만 "모든 프로그램을 분석하는 일반적 방법"을 만들었다는 주장을 들으면 그것이 온전한 이야기가 아니라는 것을 알게 되었다.

이 이야기가 알고리즘 문서의 /posts/fundamental/algorithm.html > P와 NP 절과 어떻게 다른지도 짚어 두자. 거기서 다루는 "어렵다"는 알고리즘은 있는데 느리다는 뜻이다. 정지 문제는 알고리즘이 아예 없다. 두 종류의 어려움을 섞지 말아야 한다.

집합의 논리 — ZFC

6장에서 러셀의 역설을 보았다. W::={S:SS} 를 만들면 WW 인 것과 WW 인 것이 같아진다. 그때 처방은 "조건제시법을 쓸 때 어디에서 잘라낼지 먼저 말한다"였다. 이제 그 처방이 어떤 공리 체계의 일부인지 본다.

집합론의 형식 언어는 놀랄 만큼 좁다. 쓸 수 있는 기호가 xy 하나와 5장의 논리 기호뿐이다. 등호조차 정의로 줄인다.

(x=y)::=z.(zxzy),(xy)::=z.(zxzy)

이 언어로 적은 몇 개의 공리에서 사실상 수학 전체를 유도할 수 있다. 그것을 선택 공리를 포함한 체르멜로 · 프렝켈 집합론(ZFC)이라 한다.

가운데가 집합을 만드는 공리이고 그 아래가 그 힘을 제한하는 공리다. 아래 첫 메모에서 러셀의 역설을 막는 것이 부분집합 공리와 기초 공리 둘이라는 것을, 둘째 메모에서 이 체계로도 못 하는 일을 확인해 두자
<가운데가 집합을 만드는 공리이고 그 아래가 그 힘을 제한하는 공리다. 아래 첫 메모에서 러셀의 역설을 막는 것이 부분집합 공리와 기초 공리 둘이라는 것을, 둘째 메모에서 이 체계로도 못 하는 일을 확인해 두자>[원본 보기]

공리를 몇 개만 읽어 본다. 5장의 한정사 읽기 연습이기도 하다.

공리무엇을 말하는가
외연 (Extensionality)x=yz.(xzyz) — 같은 집합에 속하는 집합끼리 같다
짝 (Pairing)x,yuz.[zu(z=xz=y)]{x,y} 가 집합이다
합집합 (Union)집합들의 모임의 합집합도 집합이다
무한 (Infinity)무한집합이 존재한다
부분집합 (Subset)xyz.[zy(zxϕ(z))] — 이미 있는 집합에서 잘라낸 것만 집합이다
멱집합 (Power Set)xpu.[uxup]
치환 (Replacement)집합 위에 정의된 함수의 상도 집합이다
기초 (Foundation)공집합이 아닌 집합에는 원소 관계로 극소인 원소가 있다
선택 (Choice)겹치지 않는 공집합 아닌 집합들의 모임에서 각각 하나씩 뽑아 모은 것도 집합이다

예제 110

기초 공리를 "모든 집합 S 에 대해 SS"로 옮길 수 있음을 보이고, 그로부터 러셀의 W 가 집합이 아님을 결론지어라. 기초 공리는 다음과 같다. mx극소 원소라는 것은 mx 이고 x 의 어떤 원소도 m 의 원소가 아니라는 뜻이다. 공리는 "x 이면 x 에 극소 원소가 있다"다.

증명

뼈대는 이렇다. S 하나로 이루어진 집합에 공리를 적용한다.

SS 임. 모순을 이끌어 낸다. 어떤 집합 S 에 대해 SS 이라 하자. 짝 공리로 x::={S} 를 만든다. x 는 공집합이 아니므로 기초 공리에 의해 극소 원소가 있고, x 의 원소는 S 뿐이므로 그것이 S 다.

극소의 뜻을 풀면 "x 의 어떤 원소도 S 의 원소가 아니다"다. x 의 원소는 S 뿐이므로 SS 다. 이는 가정에 어긋난다. 모순이므로 모든 집합 S 에 대해 SS 다.

W 가 집합이 아님. 방금 보인 것에 의해 모든 집합이 W 의 조건 SS 를 만족한다. 그러니 W 는 "모든 집합의 모임"이다. W 가 집합이라면 자기도 자기 조건을 만족하므로 WW 인데, 방금 모든 집합 S 에 대해 SS 임을 보였으니 모순이다. 따라서 W 는 집합이 아니다.

이제 6장의 역설이 어떻게 막혔는지 정확히 보인다. 두 공리가 함께 일한다. 부분집합 공리는 "아무 조건이나 만족하는 것들을 모은 것"이 집합이라고 인정하지 않는다 — 어디에서 잘라낼지 먼저 말해야 한다. 그래서 W 를 만들 자격 자체가 없다. 기초 공리는 그 위에서 W 가 실제로 집합일 수 없음을 확인해 준다.

여기서 프레게가 무엇을 잃었는지도 새겨 두자. 그가 쓰고 싶었던 것은 "수학적으로 잘 정의된 모임은 모두 집합이다"라는 자연스러운 공리였다. 러셀의 세 줄이 그것을 무너뜨렸고, 그 자연스러움을 포기하는 것이 대가였다.

이게 정말 되는가

오늘날 주류 수학의 상태는 이렇다. 몇 개의 ZFC 공리에서 사실상 모든 것이 유도된다. 장밋빛으로 들리지만 어두운 구름이 몇 개 있다.

그러면 컴퓨터과학을 하는 사람이 이것을 알아야 하는가. 연속체 가설과 큰 무한들은 실무에서 나오지 않는다. 컴퓨터과학은 대개 가산집합, 흔히 유한집합만 다룬다. 19세기 수학계가 "칸토어의 낙원"이라고 비꼬았던 이유도 그것이다. 그런데 그 낙원에서 제대로 추론하려는 노력이 곧바로 계산의 한계에 대한 정리를 낳았다. 정지 문제가 그 결과이고, 그것은 컴퓨터과학을 하는 모든 사람이 알아야 하는 것이다.

이 장에서 새로 나온 것

용어·기호
AstrictB¬(AsurjB). AB 보다 진짜로 작다
가산무한(countably infinite)NbijC. 원소를 줄 세울 수 있다
가산(countable) · 비가산유한하거나 가산무한 · 그렇지 않다. 가산인 것은 NsurjC 와 같다
칸토어 정리어떤 집합 A 에 대해서도 Astrictpow(A)
대각선 논법목록을 가정하고 대각선을 자리마다 뒤집어 목록에 없는 것을 만든다
{0,1}ω무한 비트열 전체. pow(N) 와 전단사이고 비가산이다
0|N| 의 이름. 가장 작은 무한 기수
슈뢰더 · 베른슈타인 정리AsurjB 이고 BsurjA 이면 AbijB
lang(P)프로시저 P 가 인식하는(적용해서 멈추는) 문자열 전체
인식 가능(recognizable)어떤 프로시저 P 에 대해 L=lang(P) 인 문자열 집합
Ps문자열 s 를 프로그램으로 읽은 것. 프로그램도 데이터다
안멈춤 · 정지 문제자기 코드에서 멈추지 않는 문자열 전체 · 멈추는지 판정하는 문제. 인식 가능하지 않다
ZFC선택 공리를 포함한 체르멜로 · 프렝켈 집합론. 하나로 적은 공리 아홉 개
기초 공리(Foundation)공집합이 아닌 집합에 극소 원소가 있다. SS 를 함의한다
연속체 가설Npow(N) 사이의 크기가 없다는 주장. ZFC 로 결정되지 않는다

챙겨 갈 것은 다섯이다.

이것으로 7장부터 10장까지의 블록이 끝났다. 세운 것은 넷이다. 귀납법의 정형과 그것이 정렬성 원리와 같다는 것, 상태 기계와 불변량 · 측도로 프로그램의 옳음과 종료를 증명하는 법, 재귀적 자료형과 구조적 귀납법, 그리고 무한집합의 크기 비교와 대각선 논법이다. 앞의 셋이 "무한히 많은 것을 유한한 종이에 증명하는 법"이고 마지막 하나가 그 한계를 그린다.

다음 장부터는 이 도구로 구체적인 수학을 한다. 11장의 정수론이 첫 자리다. 이 블록에서 미뤄 둔 빚이 거기서 갚아진다 — 소인수분해가 유일하다는 것(9장의 오류 찾기 문제가 그 자리에서 멈췄다), 두 수를 번갈아 빼는 절차가 최대공약수를 정확히 계산한다는 것(4장과 8장에서 종료성만 증명했다), 그리고 물통 문제에서 얻을 수 있는 양이 왜 최대공약수의 배수인가다. 도구는 이 블록에서 다 세웠으니 이제 쓰는 일이 남았다.

정수론

정수론은 정수를 연구하는 분야다. 정수에 무슨 연구할 것이 남았는지 의아할 수 있다. 0, 1, 2, 3 그리고 -1, -2 — 이 중 무엇을 모르겠는가. 그런데 이 장의 절반쯤에서 아직 아무도 답을 모르는 질문을 만난다. 2보다 큰 모든 짝수가 두 소수의 합인가, 큰 두 소수의 곱을 되돌려 소인수로 가르는 빠른 방법이 있는가. 뒤쪽 질문에는 오늘의 인터넷 통신 전체가 걸려 있다.

20세기 초의 수론학자 하디는 정수론이 쓸모없다는 것을 자랑스러워했다. "적어도 한 과학은, 그것도 우리의 것은, 평범한 인간 활동에서 멀리 떨어져 있어 순하고 깨끗하게 남을 것"이라고 썼다. 그는 틀렸다. 정수론은 현대 암호의 바탕이고, 안전한 통신은 온라인 상거래의 뼈대다.

이 장에서 답할 것은 다섯이다. 두 수의 최대공약수를 어떻게 구하고 그 절차가 왜 옳은가. 소인수분해가 왜 유일한가. 나머지만 가지고 하는 산술에서 나눗셈이 언제 되는가. 왜 어떤 수에는 곱셈 역원이 있고 어떤 수에는 없는가. 그리고 공개키 암호가 왜 되돌아오는가.

가져오는 것이 많다. 4장의 정렬성 원리와 소인수분해의 존재, 8장의 상태 기계와 불변량 원리, 그리고 8장의 감소하는 측도다. 앞 여덟 장에서 만든 도구를 처음으로 한 분야에 몰아 쓰는 자리이고, 앞에서 미뤄 둔 빚 셋을 여기서 갚는다. 알고리즘 문서의 /posts/fundamental/algorithm.html > 모듈러 산술 절과 /posts/fundamental/algorithm.html > 공개키 절이 같은 소재를 쓰는 법 쪽에서 다뤘다. 이 장은 왜 그런지를 채운다. 별말이 없으면 변수는 정수 전체 Z 를 훑는다고 본다.

나누어떨어짐

정의. 정수 a 가 정수 b나눈다(divides)는 것은 ak=b 인 정수 k 가 있다는 뜻이고, ab 로 적는다. 나누지 않으면 ab 다. 이 관계는 부르는 이름이 여럿이라 모두 익혀 두는 편이 낫다 — ab 를 나눈다, ab약수(divisor)다, ab인수(factor)다, ba 로 나누어떨어진다, ba배수(multiple)다.

정의에서 곧바로 나오는 것들이 있다. 모든 n 에 대해 n0 이고(n0=0), nn 이고, 1n 이고 1n 이다. 그리고 0n 이면 n=0 이다. 첫 줄이 뜻밖일 수 있다. 0 은 모든 수로 나누어떨어진다. 정의가 "몫이 있다"는 것뿐이고 0 을 만드는 몫은 늘 0 이기 때문이다.

이 장 전체에서 가장 많이 쓰는 개념을 지금 세운다. 정의. 정수 nb0,,bk정수 선형결합(integer linear combination)이라는 것은 어떤 정수 s0,,sk 에 대해

n=s0b0+s1b1++skbk

라는 뜻이다. 이 장에서는 정수만 다루므로 그냥 선형결합이라 부른다. 계수가 음수여도 되고 0 이어도 된다는 점이 중요하다.

예제 111

다음 셋을 증명하라. (가) ab 이고 bc 이면 ac 다. (나) ab 이고 ac 이면 모든 정수 s,t 에 대해 asb+tc 다. (다) c0 일 때, ab 인 것은 cacb 인 것과 같다.

증명

뼈대는 셋 다 같다. 정의를 풀어 "몫"에 이름을 붙이고, 그 이름들로 새 몫을 조립한다. 나누어떨어짐 증명은 거의 언제나 이 모양이다.

(가) 증명. ak1=b 인 정수 k1bk2=c 인 정수 k2 가 있다. 그러면 c=bk2=(ak1)k2=a(k1k2) 이고 k1k2 는 정수이므로 ac 다.

(나) 증명. ak1=b, ak2=c 인 정수 k1,k2 가 있다. 그러면 sb+tc=s(k1a)+t(k2a)=(sk1+tk2)a 이고 sk1+tk2 는 정수이므로 asb+tc 다.

(다) 증명. ab 이면 ak=b 이고 양변에 c 를 곱해 (ca)k=cb 이므로 cacb 다. 거꾸로 cacb 이면 (ca)k=cbk 가 있고, c0 이므로 양변을 c 로 나눠 ak=b 를 얻는다.

(나)를 말로 옮겨 두면 앞으로 편하다. abc 를 나누면 abc 의 모든 선형결합을 나눈다. 이 한 줄이 이 장에서 가장 자주 인용되는 문장이다.

나눗떨어지지 않을 때 — 나눗셈 정리

초등학교에서 배운 대로, 한 수가 다른 수로 딱 나누어떨어지지 않으면 몫과 나머지가 남는다. 그것을 정확히 적으면 다음이 된다.

나눗셈 정리(Division Theorem). 정수 nd0 에 대해

n=qd+r이고0r<|d|

를 만족하는 정수 쌍 (q,r)정확히 하나 있다. q, r나머지라 하고 r=rem(n,d) 로 적는다. 8장에서 쓴 nmodd 는 같은 것의 다른 표기다.

존재는 정렬성 원리로 나온다. {nqd:qZ} 중 음이 아닌 것들을 모으면 공집합이 아니고, 그 최소 원소가 r 이다. 만약 r|d| 였다면 r|d| 가 더 작은 음이 아닌 원소이므로 최소가 아니다. 그림에서 보듯 나머지는 nd 의 부호에 상관없이 음이 아니다. rem(11,7)=3 인 것은 11=(2)7+3 이기 때문이다.

몫은 n 을 넘지 않는 가장 오른쪽 눈금의 번호이고 나머지는 거기서 오른쪽으로 남은 거리다. n 이 음수여도 왼쪽 눈금을 잡으므로 나머지는 음수가 되지 않는다
<몫은 n 을 넘지 않는 가장 오른쪽 눈금의 번호이고 나머지는 거기서 오른쪽으로 남은 거리다. n 이 음수여도 왼쪽 눈금을 잡으므로 나머지는 음수가 되지 않는다>[원본 보기]

예제 112

나눗셈 정리의 유일성을 증명하라. 그리고 여러 프로그래밍 언어에서 11%73 이 아니라 4 를 내놓는 것은 정리가 틀렸다는 뜻인가?

증명

뼈대는 이렇다. 두 답이 있다고 가정하면 두 나머지의 차가 d 의 배수인데, 그 차는 너무 작아 0 밖에 될 수 없다.

증명. n=q1d+r1=q2d+r2 이고 0r1,r2<|d| 라 하자. 두 식을 빼면 (q1q2)d=r2r1 이므로 dr2r1 이다. 한편 r1r2 가 모두 0 이상 |d| 미만이므로 |r2r1|<|d| 다. |d| 보다 작은 절댓값을 갖는 d 의 배수는 0 뿐이므로 r1=r2 이고, 그러면 (q1q2)d=0 에서 d0 이므로 q1=q2 다.

프로그래밍 언어의 문제. 정리가 틀린 것이 아니다. 언어의 % 연산자가 수학의 rem다른 함수인 것이다. 많은 언어가 몫을 "0 쪽으로 버림"으로 정하는데, 그러면 11/7 의 몫이 1 이 되고 나머지는 11(1)7=4 가 된다. 몫을 n/d 로 정하는 언어(파이썬 등)는 3 을 낸다.

두 답 모두 n=qd+r 은 만족한다. 갈리는 것은 0r<|d| 라는 조건뿐이고, 그 조건을 넣은 쪽이 유일성을 얻는다. 이 문서는 언제나 나머지가 음이 아니라는 수학의 관례를 따른다. 익숙한 언어의 동작을 근거로 삼지 않도록 조심하라.

물통 문제로 돌아간다

8장에서 3 L 통과 5 L 통으로 4 L 를 만들었고, 3 L 통과 9 L 통으로는 만들 수 없음을 불변량으로 증명했다. 그때 남긴 물음이 있다. 12 L 와 18 L 로 4 L 는 어떤가. 899 L 와 1147 L 로 32 L 는? 21 L 와 26 L 로 3 L 는? 하나씩 답하지 말고 한꺼번에 답하는 것이 이 절의 목표다.

예제 113

용량 ab 인 두 물통이 있고 8장의 여섯 가지 조작만 할 수 있다. 어떤 순서로 조작해도 각 통에 든 물의 양은 언제나 ab 의 선형결합임을 증명하라. 그리고 12 L 와 18 L 로 4 L 를 만들 수 없음을 결론지어라.

증명

뼈대는 이렇다. "두 통의 물이 각각 ab 의 선형결합이다"를 보존되는 불변량으로 잡는다. 8장의 불변량 원리가 나머지를 해 준다.

증명. 상태 (x,y) 에 대해 P((x,y))::=[x 와 y 가 각각 a 와 b 의 선형결합이다] 라 하자. 여섯 전이를 확인한다.

채우기와 비우기. 그 통의 값이 a, b, 0 중 하나가 된다. 셋 다 선형결합이고(a=1a+0b 등) 다른 통은 그대로다.

옮기기. 받는 쪽이 넘치지 않으면 두 값이 (x+y,0) 또는 (0,x+y) 이 되고, 선형결합의 합은 선형결합이다. 넘치면 받는 쪽이 가득 차므로 두 값이 (x+yb,b) 또는 (a,x+ya) 이 되고, 선형결합의 합과 차이므로 역시 선형결합이다. 시작 상태 (0,0) 에서 0=0a+0b 이므로 P 가 참이고, 불변량 원리에 의해 도달 가능한 모든 상태에서 참이다.

따름. a=12, b=18 이면 612 이고 618 이므로, 앞 예제의 (나)에 의해 61218 의 모든 선형결합을 나눈다. 64 이므로 4 는 선형결합이 아니고, 따라서 도달할 수 없다.

같은 논리로 gcd(899,1147)=31 이고 3132 이므로 899 L 와 1147 L 로 32 L 도 만들 수 없다. 다만 이 보조정리는 안 되는 쪽만 말해 준다. 21 L 와 26 L 의 공약수는 1 뿐이고 13 이지만, 그것이 3 L 를 만들 수 있다는 뜻인지는 아직 알 수 없다. 답은 최대공약수를 제대로 다룬 뒤에 나온다.

최대공약수

ab 를 모두 나누는 수를 공약수라 하고, 그중 가장 큰 것을 최대공약수(greatest common divisor)라 해 gcd(a,b) 로 적는다. 둘이 모두 0 이 아니면 최대공약수가 존재한다. 정의에서 곧바로 gcd(n,1)=1 이고, n0 일 때 gcd(n,n)=gcd(n,0)=|n| 이다(모든 수가 0 의 약수이기 때문이다).

최대공약수를 구하는 방법은 이천 년쯤 전부터 알려져 있다. 바탕은 다음 한 줄이다. 유클리드 보조정리. b0 이면 gcd(a,b)=gcd(b,rem(a,b)) 다.

증명. r::=rem(a,b) 라 하면 나눗셈 정리에 의해 a=qb+r 다. 그러면 abr 의 선형결합이므로 br 의 공약수는 모두 a 를 나눈다. 거꾸로 r=aqbab 의 선형결합이므로 ab 의 공약수는 모두 r 를 나눈다. 즉 {a,b} 의 공약수 전체와 {b,r} 의 공약수 전체가 같은 집합이고, 같은 집합의 최댓값은 같다. 이 한 줄을 되풀이하는 것이 유클리드 알고리즘이다.

왼쪽 세 열이 바뀌는 동안 오른쪽 열은 한 줄도 바뀌지 않는다. 그것이 이 알고리즘의 옳음이고, y 가 0 이 되는 순간 x 가 답이 된다
<왼쪽 세 열이 바뀌는 동안 오른쪽 열은 한 줄도 바뀌지 않는다. 그것이 이 알고리즘의 옳음이고, y 가 0 이 되는 순간 x 가 답이 된다>[원본 보기]

8장의 언어로 다시 적어 보자. 상태는 음이 아닌 정수의 쌍이고 시작 상태는 (a,b) 이며 전이는

(x,y)(y,rem(x,y))(y>0)

하나다. 유클리드 보조정리에 의해 gcd(x,y)=gcd(a,b)보존되는 불변량이고 시작 상태에서 참이다. 그러니 y0 이 되어 멈추면 그 상태에서 x=gcd(x,0)=gcd(a,b) 다. 종료성은 측도로 본다. 두 걸음이면 첫 좌표가 rem(x,y) 가 되는데 이 값은 x/2 이하이므로, x 는 두 걸음마다 절반 이하로 줄어들고 1+2log2a 걸음 안에 멈춘다.

뺄셈만으로 하는 유클리드 알고리즘

나눗셈 없이 빼기만 쓰는 판이 있다. 4장에서 이 절차의 종료성을 보였고 8장에서도 스쳐 갔지만 그것이 정말 최대공약수를 낸다는 것은 미뤄 두었다. 지금 갚는다. 상태는 양의 정수 쌍이고 시작 상태는 (a,b) 이며(a,b1) 전이는 둘이다.

(x,y)(xy,y)(x>y),(x,y)(x,yx)(y>x)

두 값이 같아지면 멈추고 그 값을 답으로 낸다.

예제 114

위 절차가 반드시 멈추고, 멈출 때의 값이 gcd(a,b) 임을 증명하라.

증명

뼈대는 8장에서 세운 두 도구다. gcd 가 변하지 않는다는 불변량으로 옳음을, 두 값의 합이 줄어든다는 측도로 종료를 보인다.

보조정리. x>y1 이면 gcd(x,y)=gcd(xy,y) 다. 증명은 유클리드 보조정리와 똑같은 모양이다. x=(xy)+y 이므로 {xy,y} 의 공약수는 x 를 나누고, xyxy 의 선형결합이므로 {x,y} 의 공약수는 xy 를 나눈다. 두 쌍의 공약수 집합이 같으므로 최댓값도 같다.

부분 정당성. P((x,y))::=[x1 이고 y1 이고 gcd(x,y)=gcd(a,b)] 라 하자. 전이가 있으면 xy 다. x>y 인 경우 새 상태는 (xy,y) 이고 xy1 이며 보조정리에 의해 gcd 가 유지된다. y>x 인 경우도 대칭이다. 시작 상태에서 P 가 참이므로 불변량 원리에 의해 도달 가능한 모든 상태에서 참이다.

멈추는 것은 x=y 일 때뿐이고, 그때 gcd(a,b)=gcd(x,x)=x 이므로 답이 맞다.

종료성. 측도를 f((x,y))::=x+y 로 잡는다. 값이 언제나 음이 아닌 정수이고(불변량이 x,y1 을 보장한다), 전이가 있으면 한쪽에서 1 이상을 빼므로 f 가 강하게 감소한다. 8장의 정리에 의해 실행의 길이가 a+b 이하이고 반드시 멈춘다.

답이 말이 되는가. (21,26) 에서 돌려 보면 (21,5)(16,5)(11,5)(6,5)(1,5)(1,4)(1,3)(1,2)(1,1)1 이 나온다. 나눗셈판이 세 걸음에 끝낸 것을 아홉 걸음에 했다. 측도가 x+y 라 걸음 수 상한이 a+b 인 것도 정직한 값이다. 나눗셈판이 자릿수에 비례하는 것과 견주면 큰 차이이고, 그래서 실무에서는 나눗셈판이나 이진판을 쓴다.

분쇄기 — 최대공약수는 선형결합이다

이제 이 장의 열쇠가 되는 정리다. 정리. gcd(a,b)ab 의 선형결합이다. 즉 어떤 정수 s,t 에 대해 gcd(a,b)=sa+tb 다.

증명은 st실제로 찾는 방법을 제시하는 것으로 한다. 그 방법은 6세기 인도에서 쿠타카(kuttaka), 곧 "분쇄기"라 불렸고 오늘날에는 확장 유클리드 알고리즘이라 한다. 유클리드 알고리즘을 돌리면서 나머지마다 그것을 ab 의 선형결합으로 적어 두는 것이 전부다.

예제 115

분쇄기로 gcd(259,70) 을 구하고 그것을 25970 의 선형결합으로 적어라.

풀이 보기

무엇을 묻는가. gcd 값과 그것을 만드는 계수 s,t 다. 유클리드 알고리즘의 각 줄에서 나머지는 rem(x,y)=xqy 다. 여기서 xy 를 이미 알고 있는 선형결합으로 갈아 넣으면 나머지도 선형결합이 된다. a=259, b=70 이라 두고 표를 채운다.

xyqrem(x,y)=xqya,b 로 적으면
25970349=a3b
7049121=b(a3b)=a+4b
492127=(a3b)2(a+4b)=3a11b
21730 — 멈춘다

마지막 0 이 아닌 나머지가 gcd 이므로 gcd(259,70)=7 이고

7=32591170

이다. 검산하면 777770=7 이다. 계산량이 유클리드 알고리즘보다 조금 더 늘 뿐이므로 수백 자리 수에도 그대로 쓸 수 있다. 뒤에서 곱셈 역원과 RSA 열쇠를 이 절차로 구한다.

여기서 곧바로 따라오는 것이 이 절의 결론이다. 따름정리. 정수 nab 의 선형결합인 것은 gcd(a,b)n 인 것과 같다.

한쪽 방향은 앞의 (나)다 — 공약수는 모든 선형결합을 나누므로 gcd 도 나눈다. 다른 방향은 위 정리다 — gcd(a,b)=sa+tb 이므로 그 배수 mgcd(a,b)=(ms)a+(mt)b 도 선형결합이다.

초록 칸이 만들 수 있는 양이다. 두 통을 다루는 어떤 순서도 물의 양을 두 용량의 선형결합으로만 만들고, 그 선형결합 전체가 정확히 gcd 의 배수 전체다
<초록 칸이 만들 수 있는 양이다. 두 통을 다루는 어떤 순서도 물의 양을 두 용량의 선형결합으로만 만들고, 그 선형결합 전체가 정확히 gcd 의 배수 전체다>[원본 보기]

예제 116

21 L 통과 26 L 통으로 큰 통에 정확히 3 L 를 담을 수 있는가? 할 수 있다면 절차를 제시하라.

풀이 보기

무엇을 묻는가. 도달 가능성과, 가능하다면 조작의 순서다.

어느 관계를 쓰는가. gcd(21,26)=1 이고 13 이므로 따름정리에 의해 3 은 선형결합이다. 분쇄기로 계수를 찾는다. a=26, b=21 로 두면 5=ab, 1=2145=b4(ab)=4a+5b 다. 확인하면 104+105=1 이다. 양변에 3 을 곱하면

3=1226+1521

이다. 확인하면 312+315=3 이다.

계수를 어떻게 읽는가. 21 의 계수 15작은 통을 열다섯 번 채운다는 뜻이고, 26 의 계수 12큰 통을 열두 번 쏟아 버린다는 뜻이다. 절차는 두 줄이다. 작은 통을 채워 큰 통에 붓고, 큰 통이 가득 차면 비우고 계속 붓는다. 부어 넣은 물이 15×21=315 L 이고 버린 물이 12×26=312 L 이므로 남는 것이 3 L 다.

답이 말이 되는가. 계수를 미리 몰라도 된다는 점이 재미있다. "작은 통을 채워 큰 통에 붓고, 큰 통이 차면 비운다"를 원하는 양이 나올 때까지 되풀이하면 반드시 그 양이 나온다. 계수 계산은 몇 번 만에 나오는지를 알려 줄 뿐이다.

이것으로 8장에서 남긴 물통 문제가 완전히 닫혔다. 얻을 수 있는 양은 정확히 두 용량의 최대공약수의 배수 전부다.

최대공약수의 성질

앞으로 쓸 사실 넷을 모아 둔다. k>0 에 대해 (가) gcd(ka,kb)=kgcd(a,b) 다. (나) da 이고 db 인 것은 dgcd(a,b) 인 것과 같다. (다) gcd(a,b)=gcd(a,c)=1 이면 gcd(a,bc)=1 이다. (라) abc 이고 gcd(a,b)=1 이면 ac 다.

중요한 주의. 이 넷은 소인수분해의 유일성으로 증명하면 몇 줄이면 끝난다. 그런데 유일성의 증명에 이 중 일부가 쓰인다. 유일성을 써서 증명하면 순환 논증이 된다. 그래서 선형결합만 가지고 증명해야 한다.

(나)의 증명이 짧다. dgcd(a,b) 이면 gcd 가 ab 를 나누므로 추이성으로 da, db 다. 거꾸로 d 가 둘을 다 나누면 d 는 두 수의 모든 선형결합을 나누고, gcd(a,b)=sa+tb 도 그중 하나다. 여기서 새겨 둘 것이 있다. "가장 큰" 공약수라는 말은 크기로만 뜻이 있는 것이 아니다. 다른 모든 공약수가 그것을 나눈다는 훨씬 강한 성질이 있고, 그 성질의 근거가 선형결합이다.

(라)의 증명도 두 줄이다. gcd(a,b)=1 이므로 1=sa+tb 이고, 양변에 c 를 곱하면 c=s(ac)+t(bc) 다. 오른쪽은 abc 의 선형결합이고 a 가 둘을 다 나누므로 ac 다. 말로 옮기면 "서로소인 조각은 떼어 낼 수 있다"다. abc 를 나누는데 b 와는 아무 인수도 겹치지 않으면, a 의 몫이 될 재료는 c 쪽에만 있을 수밖에 없다. 이 (라)를 이 장에서 몇 번이나 쓴다.

소수와 산술의 기본정리

정의. 소수(prime)1 보다 큰 정수로서 자기 자신과 1 로만 나누어떨어지는 것이다. 0,1,1 이 아니면서 소수도 아닌 정수를 합성수(composite)라 한다. 1 을 소수에서 빼는 이유는 이 절의 끝에서 드러난다. 그리고 소수는 무한히 많다. 유클리드가 남긴 증명이 짧고 아름답다. 소수가 유한히 많아 p1,,pk 가 전부라고 가정하자. N::=p1p2pk+1 이라 두면 N>1 이므로 4장에서 증명한 대로 소인수를 하나 갖는다. 그 소인수를 p 라 하면 p 는 목록에 있으므로 pp1pk 이고, 또 pN 이다. 그러면 p 는 둘의 차 Np1pk=1 도 나눠야 하는데 p>1 이므로 모순이다.

그러나 소수에 대해 모르는 것이 훨씬 많다. 쌍둥이 소수 추측pp+2 가 모두 소수인 p 가 무한히 많다는 것이고, 1966년에 첸이 "p+2 가 소수 두 개 이하의 곱"인 데까지 왔다. 골드바흐 추측은 2보다 큰 모든 짝수가 두 소수의 합이라는 것이고, 지금 알려진 것은 "소수 여섯 개 이하의 합"이다. 그리고 이 장에 가장 중요한 것 — 큰 소수 둘의 곱 n=pq 에서 pq 를 되찾는 효율적인 절차가 알려져 있지 않다. 여기서 "효율적"은 n 자체가 아니라 n 을 적는 데 드는 자릿수의 다항식 시간이라는 뜻이고, 알고리즘 문서의 /posts/fundamental/algorithm.html > P와 NP 절이 그 구분을 다뤘다. 어렵다는 것이 증명된 적은 없다. 빠른 방법이 아직 발견되지 않았을 뿐이다.

소수가 얼마나 촘촘한지는 정확한 답이 있다. π(n)n 이하의 소수 개수라 하면 소수 정리(Prime Number Theorem)limnπ(n)/(n/lnn)=1 이라고 말한다. 어림잡아 n 근처에서는 lnn 개 중 하나가 소수라는 뜻이다. 증명은 이 문서의 범위를 넘지만 결과는 쓸 만하다. 열 자리 소수를 찾으려면 ln101023 개쯤 훑으면 된다는 계산이 나오고, 그것이 RSA 열쇠를 만들 때 큰 소수를 찾는 일이 어렵지 않은 이유다.

유일한 소인수분해

4장에서 정렬성 원리로 존재를 증명했다. 1 보다 큰 모든 정수가 소수들의 곱으로 쓰인다는 것이다. 남은 것은 유일성이다. 곱하는 순서를 바꾸면 값이 같으므로 그대로는 유일하지 않다. 12=223=232=322 셋 다 맞다. 유일한 것은 어떤 소수가 몇 번 나오는지이므로, 크기 순으로 세워 두면 정말 유일해진다. 수열이 약하게 감소한다는 것은 각 항이 그 뒤의 항들보다 작지 않다는 뜻이고, 항이 하나인 수열과 빈 수열도 이 정의에 든다.

산술의 기본정리(Fundamental Theorem of Arithmetic). 모든 양의 정수는 약하게 감소하는 소수열의 곱으로 딱 한 가지로 쓰인다. 여기서 1 을 소수에서 뺀 이유가 드러난다. 1 이 소수라면 15=53=531=5311= 로 무한히 많은 표현이 생겨 유일성이 무너진다. 그리고 1 자신은 빈 수열의 곱이다(곱할 것이 없으면 값을 1 로 정한다).

유일성 증명 앞에 세 단이 필요하고, 그 셋 중 어느 것도 유일성을 써서 증명할 수 없다. 오른쪽 아래의 빨간 화살표가 절대 그으면 안 되는 화살표다
<유일성 증명 앞에 세 단이 필요하고, 그 셋 중 어느 것도 유일성을 써서 증명할 수 없다. 오른쪽 아래의 빨간 화살표가 절대 그으면 안 되는 화살표다>[원본 보기]

예제 117

소수 pab 를 나누면 pa 이거나 pb 임을 증명하라. 소인수분해의 유일성은 쓰지 마라.

증명

뼈대는 이렇다. p 가 소수라 gcd(a,p)1 아니면 p 다. 두 경우로 나누면 끝난다.

증명. gcd(a,p)p 의 양의 약수이고 p 가 소수이므로 1 또는 p 다.

gcd(a,p)=p 인 경우. gcd 는 a 를 나누므로 pa 이고 주장이 성립한다.

gcd(a,p)=1 인 경우. 가정에서 pab 이고 지금 gcd(p,a)=1 이므로, 앞 절의 넷째 성질을 a:=p, b:=a, c:=b 로 그대로 적용하면 pb 다.

두 경우가 빠짐없으므로 증명이 끝났다. 이 증명이 쓴 것은 선형결합 정리 하나뿐이라는 점을 확인하라. 유일성을 끌어오면 두 줄로 끝나지만 그것이 바로 순환 논증이다.

귀납법으로 곧바로 넓혀진다. 소수 pa1a2an 을 나누면 어떤 ai 를 나눈다. n 에 대한 보통 귀납법이고, 귀납 단계에서 a1an1 을 한 덩어리로 보아 위 결과를 쓴다.

예제 118

산술의 기본정리의 유일성을 증명하라.

증명

뼈대는 4장에서 익힌 그것이다. 표현이 둘 이상인 가장 작은 수를 잡고, 그 수보다 작은 수에서 모순을 끌어낸다.

증명. 약하게 감소하는 소수열의 곱으로 두 가지 이상으로 쓰이는 양의 정수가 있다고 가정하자. 정렬성 원리에 의해 그중 최소인 것이 있고 이를 n 이라 하자. 두 표현을

n=p1p2pj=q1q2qk

라 하고 둘 다 약하게 감소하며 p1q1 이라 하자(이름을 바꾸면 언제든 이렇게 둘 수 있다).

먼저 p1q1 임을 본다. 만약 p1=q1 이라면 양변을 q1 로 나눈 n/q1p2pjq2qk 라는 서로 다른 두 표현을 갖는다. 그런데 n/q1<n 이므로 n 이 최소라는 데 어긋난다. 따라서 p1<q1 이다.

이제 모순을 만든다. pi 들이 약하게 감소하므로 p1 이 그중 가장 크고, 따라서 모든 piq1 보다 작다. 한편

q1n=p1p2pj

이므로 앞 예제의 확장판에 의해 q1 은 어떤 pi 를 나눈다. pi 가 소수이고 q1>1 이므로 q1=pi 여야 한다. 그러면 q1p1<q1 이 되어 모순이다. 증명이 기댄 것은 앞의 보조정리뿐이고 그것은 선형결합으로 증명했으니 순환이 없다.

유일 분해를 당연하게 여기지 마라. 정수와 비슷한 다른 수 체계에서는 실제로 깨진다. m+n5 꼴의 수들만 모아 놓으면 6=23=(1+5)(15) 인데 네 인수 모두 그 체계 안에서 더 쪼갤 수 없다. 정수에서 유일 분해가 성립하는 것은 나눗셈 정리가 있기 때문이고, 그것이 위 그림의 맨 위 화살표다.

예제 119

3장에서 "양의 정수 n 에 대해 log7n 은 정수이거나 무리수다"를 증명할 때 "소수 p 가 어떤 정수의 거듭제곱을 나누면 그 정수를 나눈다"는 사실을 빌려 쓰고 증명을 이 장으로 미뤘다. 그것을 갚아라.

증명

주장. 소수 p 와 정수 n, 양의 정수 b 에 대해 pnb 이면 pn 이다.

증명. nb=nnnb 개 이므로 앞 예제의 확장판을 a1==ab=n 에 적용하면 p 가 어떤 ai 를 나눈다. 그 ai 가 곧 n 이다.

이제 3장의 논증에 빈 곳이 없다. 그 증명은 log7n=a/b 로 가정해 nb=7a 를 얻고, 7nb 에서 위 주장으로 7n 을 끌어낸 뒤, n 의 소인수가 7 뿐임을 보여 n7 의 거듭제곱임을 결론지었다.

되짚어 볼 것이 하나 있다. 3장에서는 이 사실을 명시하고 빌려 썼다. 증명에서 무게를 지는 한 줄이 어디인지 밝혀 두면, 그 줄의 증명이 나중에 와도 전체가 무너지지 않는다. 증명을 미루는 것과 증명을 건너뛰는 것은 다르다.

모듈러 산술

가우스는 정수론의 걸작 첫 쪽에서 합동(congruence)을 도입했다. n(ab) 일 때 abn법으로 합동이라 하고

ab(modn)

으로 적는다. 예컨대 7(2915) 이므로 2915(mod7) 이다. 법 n 은 양의 정수만 쓴다. 합동은 나머지와 바로 이어진다.

나머지 보조정리. ab(modn) 인 것은 rem(a,n)=rem(b,n) 인 것과 같다.

증명. 나눗셈 정리로 a=q1n+r1, b=q2n+r2 라 하자(0r1,r2<n). 빼면 ab=(q1q2)n+(r1r2) 이고, 여기서 r1r2n 보다 크고 n 보다 작다. ab 인 것은 n 이 좌변을 나누는 것이고, 그것은 nr1r2 를 나누는 것과 같다. 그 범위에서 n 의 배수는 0 뿐이므로 r1=r2 다. 그래서 2915(mod7) 을 "둘 다 나머지가 1"로 읽어도 된다. 곧바로 arem(a,n)(modn) 도 나온다.

한 줄이 하나의 합동류다. 줄이 다섯 개이므로 5 로 나눈 나머지가 정수 전체를 다섯 조각으로 가르고, 그 다섯 조각에 이름을 붙인 것이 수 체계 Z 5 다
<한 줄이 하나의 합동류다. 줄이 다섯 개이므로 5 로 나눈 나머지가 정수 전체를 다섯 조각으로 가르고, 그 다섯 조각에 이름을 붙인 것이 수 체계 Z 5 다>[원본 보기]

나머지 보조정리에서 합동이 등호를 닮은 성질 셋을 갖는다는 것도 나온다. aa 이고(반사적), ab 이면 ba 이고(대칭적), ab 이고 bc 이면 ac 다(추이적). 셋을 다 갖는 이항관계를 동치관계라 부르는데 그 이야기는 12장에서 제대로 한다. 지금은 위 그림 — 합동이 정수를 조각으로 가른다 — 만 기억하면 된다. 법 3 이면 조각이 셋이다.

다음이 합동의 진짜 값어치다. 합동 보조정리. ab(modn) 이고 cd(modn) 이면 a+cb+d(modn) 이고 acbd(modn) 이다.

증명. n(ba) 이고 (b+c)(a+c)=ba 이므로 a+cb+c 다. 같은 이유로 b+cb+d 이고, 추이성으로 a+cb+d 다. 곱셈도 같다. n(ba) 이면 nc(ba)=bcac 이므로 acbc 이고, 이어 bcbd 다.

나머지 산술과 수 체계 Zn

합동 보조정리를 되풀이하면 실무에서 늘 쓰는 규칙이 나온다. 나머지 산술의 일반 원리. 정수들에 덧셈과 곱셈을 되풀이한 결과를 n 으로 나눈 나머지를 구하려면, 각 피연산자를 그 나머지로 바꾸고, 덧셈과 곱셈을 할 때마다 결과가 0 이상 n 미만이 되도록 곧바로 나머지를 취하면 된다.

이것을 표기로 굳혀 두자. i+nj::=rem(i+j,n) 이고 inj::=rem(ij,n) 이라 하면, 0 이상 n 미만인 정수들과 이 두 연산을 묶은 것을 Zn 이라 하고 "법 n 의 정수환"이라 읽는다. 아래첨자가 계산식을 어지럽히므로 식을 적고 옆에 (Zn) 을 달아 Zn 에서의 등식임을 표시하는 관례를 쓴다.

Zn 에서는 익숙한 산술 규칙이 그대로 성립한다. 결합법칙, 교환법칙, 분배법칙, 항등원 01, 덧셈의 역원. 그래서 곱의 괄호를 어떻게 묶어도 결과가 같고 식을 정리하는 방법도 평소와 같다. 다르게 되는 것은 딱 두 가지 — 나눗셈과 소거다. 그것이 다음 절의 주제다. 그리고 반드시 피해야 할 함정을 못 박아 둔다. 지수를 나머지로 바꾸면 안 된다. 일반 원리는 덧셈과 곱셈의 피연산자에 대한 것이고, 지수는 피연산자가 아니라 "곱셈을 몇 번 하라"는 지시다.

예제 120

rem((444273456789+155558585555)4036666666,36) 를 구하라.

풀이 보기

무엇을 묻는가. 어마어마한 수의 나머지다. 그 수를 실제로 적을 생각은 버려야 한다. 444273456789 만 해도 십진법으로 2천만 자리쯤이다.

어느 관계를 쓰는가. 일반 원리로 밑을 먼저 줄인다. rem(44427,36)=3, rem(15555858,36)=6, rem(403,36)=7 이므로 구하려는 값은

rem((33456789+65555)76666666,36)

와 같다. 지수는 손대지 않았다.

계산. 이제 각 거듭제곱의 나머지가 되풀이되는지 본다.

3 의 거듭제곱: 3,9,27,9,27, 다. 32=9 부터 두 걸음마다 되풀이되므로, 지수가 3 이상 홀수이면 33=27 과 같은 나머지다. 3456789 는 홀수이므로 3345678927 이다.

6 의 거듭제곱: 6,0,0, 다. 62=360 이므로 655550 이다.

7 의 거듭제곱: 7,13,19,25,31,1 이다. 761 이므로 여섯 걸음마다 되풀이되고, 6666666=6×1111111 이므로 766666661 이다. 그러면 답은 (27+0)1=27 이다.

답이 말이 되는가. 0 이상 36 미만이니 형식은 맞다. 이 계산에서 실제로 쓴 산술은 두 자리 수의 곱셈 열 번쯤이다. 거듭제곱의 나머지가 반드시 되풀이된다는 것이 우연이 아님을 이 장의 마지막 절에서 오일러 정리로 설명한다.

오류 찾기

다음 "증명"은 결론이 거짓이다. 어느 단계가 틀렸는가.

가짜 정리. rem(7100,13)=rem(79,13) 이다.

  1. 나머지 산술의 일반 원리에 따르면, 13 으로 나눈 나머지를 구할 때 계산에 나오는 정수를 그 나머지로 바꿔도 결과가 달라지지 않는다.
  2. 7100 에 나오는 정수는 7100 이다.
  3. rem(100,13)=9 이므로 1009 로 바꿔도 된다.
  4. 따라서 rem(7100,13)=rem(79,13) 이다.
풀이 보기

먼저 결론이 거짓임을 확인한다. 72=4910, 73705, 74359, 7612, 7121(mod13) 이다. 100=128+4 이므로 7100749 다. 한편 79 을 이어서 세면 776, 783, 798 이다. 98 이므로 가짜 정리는 거짓이다.

틀린 단계는 2번이다. 일반 원리가 말하는 "계산에 나오는 정수"는 덧셈이나 곱셈의 피연산자다. 71007 을 백 번 곱하라는 뜻이므로 여기서 곱셈의 피연산자는 7 뿐이고, 100곱셈을 몇 번 할지 정하는 수다. 원리의 적용 대상이 아니다.

1번과 3번과 4번은 각자 흠이 없다. 2번이 무너지면 3번의 "바꿔도 된다"가 근거를 잃는다.

그런데 여기서 중요한 사실 하나가 걸려 있다. 지수를 줄이는 것이 아예 안 되는 것은 아니다. 위 계산에서 7121 이었고, 그래서 지수 10012 로 나눈 나머지 4 로 줄일 수 있었다. 줄이는 법이 13 이 아니라 12 라는 점이 요점이다. 그 12 가 무엇인지 — 그리고 왜 그것으로 줄여도 되는지 — 를 이 장의 마지막 절에서 밝힌다.

곱셈 역원과 소거

어떤 수 x곱셈 역원(multiplicative inverse)x1x=1 인 수 x1 이다. 유리수에서는 0 만 빼고 모두 역원이 있고(n/m 의 역원은 m/n), 정수에서는 11 에만 있다.

Zn 에서는 조금 복잡하다. Z15 에서 28=161 이므로 82 의 역원이다. 반면 3 에는 역원이 없다. 만약 3j=1(Z15)j 가 있다면 양변에 5 를 곱해

5=5(3j)=(53)j=15j=0j=0(Z15)

라는 말이 안 되는 결론이 나온다. 갈리는 기준은 하나다. 공통의 소인수가 없는 두 정수를 서로소(relatively prime)라 한다. 1 보다 큰 공약수가 없다는 것과 같고 gcd(a,b)=1 이라는 것과도 같다. 815 는 서로소이고 315 는 아니다.

역원이 있는 것과 소거할 수 있는 것과 법과 서로소인 것이 정확히 같은 셋이다. 법이 소수이면 0 만 빼고 다 가역이어서 유리수처럼 나눗셈이 자유롭다
<역원이 있는 것과 소거할 수 있는 것과 법과 서로소인 것이 정확히 같은 셋이다. 법이 소수이면 0 만 빼고 다 가역이어서 유리수처럼 나눗셈이 자유롭다>[원본 보기]

보조정리. k0 이상 n 미만이고 n 과 서로소이면 kZn 에서 역원을 갖는다. 증명. gcd(n,k)=1 이므로 분쇄기로 sn+tk=1 인 정수 s,t 를 얻는다. 양변에 나머지 산술의 일반 원리를 적용하면 rem(n,n)=0 이고 rem(k,n)=k 이므로

rem(t,n)k=1(Zn)

이다. 즉 rem(t,n)k 의 역원이다. 역원은 분쇄기가 뱉는 계수의 나머지라는 것이 이 증명의 실용적인 알맹이다. 역원은 있으면 하나다. ij 가 둘 다 k 의 역원이면 i=i1=i(kj)=(ik)j=1j=j 다.

그리고 Zn 이 보통 산술과 가장 크게 다른 점이 소거다. 실수에서는 tr=ts 이고 t0 이면 r=s 라 할 수 있지만, Zn 에서는 안 된다. 310=35(Z15) 인데 3 을 지우면 10=5 라는 헛소리가 된다. 정의. kZn 에서 소거 가능(cancellable)하다는 것은 0 이상 n 미만인 모든 a,b 에 대해 ka=kb(Zn) 이면 a=b 라는 뜻이다.

정리. 0 이상 n 미만인 k 에 대해 다음 셋은 서로 동등하다 — gcd(k,n)=1 이다, kZn 에서 역원을 갖는다, kZn 에서 소거 가능하다.

예제 122

7 의 역원을 Z40 에서 구하라. 그리고 위 정리에서 "역원을 가지면 소거 가능하다"와 "서로소가 아니면 소거 불가능하다"를 증명하라.

풀이 보기

역원 구하기. 분쇄기를 a=40, b=7 에 돌린다. 40=57+5 이므로 5=a5b 다. 7=15+2 이므로 2=b(a5b)=a+6b 다. 5=22+1 이므로

1=(a5b)2(a+6b)=3a17b=340177

이다. 확인하면 120119=1 이다. 그러므로 1771(mod40) 이고 역원은 rem(17,40)=23 이다. 검산: 723=161=440+1 이다.

역원이 있으면 소거 가능하다. jk 의 역원이고 ka=kb(Zn) 라 하자. 양변에 j 를 곱하면 j(ka)=j(kb) 이고, 결합법칙으로 (jk)a=(jk)b, 즉 1a=1b 이므로 a=b 다.

서로소가 아니면 소거 불가능하다. d::=gcd(k,n)>1 이라 하자. k(n/d)n 의 배수이므로 0 이고, k00 이다. 즉 k(n/d)=k0(Zn) 인데 0<n/d<n 이므로 n/d0 이다. 소거가 성립하지 않는 반례다.

310=35(Z15) 도 이 틀에 들어간다. d=3 이고 n/d=5 이므로 35=0 이다. 실제로 310=300 이고 35=150 이다.

새겨 둘 것은 이것이다. 법이 소수면 0 을 뺀 모든 수가 서로소이므로 나눗셈이 유리수처럼 자유롭다. 그래서 암호에서 소수를 좋아한다.

오일러 정리와 RSA

마지막 절이다. 앞에서 미뤄 둔 물음에 답한다. 거듭제곱의 나머지가 왜 되풀이되는가, 그리고 지수를 줄일 때 무엇으로 나눈 나머지를 쓰는가. 정의. n>0 에 대해 φ(n) 을 "0 이상 n 미만인 정수 중 n 과 서로소인 것의 개수"로 정의하고 오일러 함수(Euler's function)라 한다. 그 수들의 집합 자체는 Zn 로 적는다. 곧 φ(n)=|Zn| 이다. φ(7)=6 이다 — 1 부터 6 까지 모두 7 과 서로소이고 0 만 아니다. φ(12)=4 다 — 1,5,7,11 뿐이다. 소수 p 에 대해서는 언제나 φ(p)=p1 이다.

넷이 넷으로 한 칸에 하나씩 가므로 오른쪽 전체가 왼쪽 전체와 같은 집합이다. 그것이 오일러 정리의 증명 전부다
<넷이 넷으로 한 칸에 하나씩 가므로 오른쪽 전체가 왼쪽 전체와 같은 집합이다. 그것이 오일러 정리의 증명 전부다>[원본 보기]

예제 123

오일러 정리. kZn 에 속하면 kφ(n)=1(Zn) 이다. 이를 증명하라.

증명

뼈대는 이렇다. "곱하기 k"가 Zn 를 뒤섞기만 할 뿐 잃거나 겹치지 않는다. 그러니 원소를 전부 곱한 값이 양쪽에서 같아야 한다.

1단계 — 닫혀 있다. j,kZn 이면 jnkZn 이다. gcd 성질의 셋째에 의해 gcd(n,jk)=1 이고, 유클리드 보조정리에 의해 gcd(n,rem(jk,n))=gcd(n,jk)=1 이기 때문이다.

2단계 — 겹치지 않는다. kZn 는 소거 가능하므로, ks=kt(Zn) 이면 s=t 다. 그러므로 "k 를 곱하기"는 서로 다른 원소를 서로 다른 원소로 보낸다.

3단계 — 그러므로 뒤섞기다. kZn::={kns:sZn} 라 하자. 1단계에서 kZnZn 이고 2단계에서 두 집합의 크기가 같다. 유한집합에서 크기가 같은 부분집합은 전체와 같으므로 kZn=Zn 다.

4단계 — 전부 곱한다. Zn={k1,,kφ(n)} 라 하고

P::=k1k2kφ(n),Q::=(kk1)(kk2)(kkφ(n))(Zn)

이라 하자. Q 에서 k 를 전부 앞으로 빼내면 Q=kφ(n)P 다. 한편 QkZn 의 원소를 전부 곱한 것이고 3단계에서 그 집합이 Zn 와 같으므로, QP같은 수들을 순서만 바꿔 곱한 것이다. 따라서 P=Q 다.

P=kφ(n)P(Zn)

1단계에 의해 PZn 이므로 소거 가능하다. 양변에서 P 를 지우면 1=kφ(n) 이다.

페르마의 소정리가 특수한 경우로 따라온다. p 가 소수이고 kp 의 배수가 아니면 gcd(k,p)=1 이므로 오일러 정리를 쓸 수 있고, φ(p)=p1 이므로 kp11(modp) 다. 앞의 오류 찾기 예제에서 7121(mod13) 이었던 것이 정확히 이것이다. 지수를 줄일 때 쓰는 법이 n 이 아니라 φ(n) 인 이유가 여기 있다.

오일러 정리를 쓰려면 φ(n) 을 알아야 한다. 소인수분해를 알면 계산이 쉽다. p 가 소수면 φ(pk)=pkpk1 이다 — 0 이상 pk 미만인 수 중 p 의 배수가 정확히 전체의 1/p 이기 때문이다. 그리고 ab 가 서로소면 φ(ab)=φ(a)φ(b) 다. 예컨대 φ(300)=φ(22)φ(3)φ(52)=2220=80 이다.

서로 다른 소수 p,q 에 대한 φ(pq)=(p1)(q1) 은 직접 세도 나온다. 0 이상 pq 미만인 pq 개 중 p 의 배수가 q 개, q 의 배수가 p 개이고 둘 다인 것은 0 하나이므로 서로소가 아닌 것이 p+q1 개다. 따라서 φ(pq)=pqpq+1=(p1)(q1) 이다. 이것이 RSA 가 쓰는 식이다.

정직하게 짚을 것이 있다. 오일러 정리는 역원을 구하는 또 하나의 방법을 준다 — kφ(n)1k 의 역원이다. 그런데 이 방법은 φ(n) 을 알아야 하고, φ(n) 을 구하려면 n 의 소인수분해를 알아야 한다. n 이 크면 그것이 바로 어려운 문제다. 그래서 역원은 실제로는 분쇄기로 구한다.

RSA 공개키 암호

1977년 MIT 의 리베스트, 샤미르, 애들먼이 정수론에 바탕을 둔 암호 체계 RSA 를 제안했다. 알고리즘 문서의 /posts/fundamental/algorithm.html > 공개키 절이 절차와 실무의 함정을 다뤘으므로 여기서는 되풀이하지 않고 왜 되돌아오는지에 집중한다.

위쪽 넷이 열쇠를 만드는 절차이고 가운데 둘이 실제로 쓰는 모습이다. 아래 상자 하나가 결론이다 — 되돌아오는 근거는 오일러 정리 한 줄뿐이다
<위쪽 넷이 열쇠를 만드는 절차이고 가운데 둘이 실제로 쓰는 모습이다. 아래 상자 하나가 결론이다 — 되돌아오는 근거는 오일러 정리 한 줄뿐이다>[원본 보기]

절차는 이렇다. 받는 사람이 서로 다른 큰 소수 p,q 를 고르고 n::=pq 를 만든다. φ(n)=(p1)(q1) 과 서로소인 e 를 고르고, Z(p1)(q1) 에서 e 의 역원 d 를 분쇄기로 구한다. 공개키는 (n,e) 이고 비밀키는 d 다. pq 는 지운다. 보내는 사람은 m^::=me(Zn) 을 보내고, 받는 사람은 m^d(Zn) 을 계산한다. 둘 다 8장의 /posts/fundamental/algorithm.html > 빠른 거듭제곱로 곱셈 O(log) 번이면 된다 — 8장에서 그 프로그램의 옳음을 불변량으로 증명해 두었다.

왜 되돌아오는가. ed1(modφ(n)) 이므로 어떤 정수 k 에 대해 ed=1+kφ(n) 이다. 그러면 mn 과 서로소일 때

m^d=med=m1+kφ(n)=m(mφ(n))k=m1k=m(Zn)

이다. 오일러 정리가 mφ(n)=1 을 보장하는 그 한 줄이 RSA 의 전부다. mn 과 서로소가 아닌 경우에도 복호화는 되는데, 그때는 pq 를 따로 보아야 하고 여기서는 다루지 않는다. n 이 수백 자리 소수 둘의 곱이면 n 과 서로소가 아닌 m 을 우연히 만날 확률은 무시할 수 있다.

안전성이 기대는 것. n 만 알고는 pq 를 되찾기 어렵다는 것뿐이다. 되찾으면 φ(n) 이 나오고 φ(n) 을 알면 분쇄기로 d 가 나온다. 그리고 거꾸로도 참이다 — 공개키와 비밀키를 함께 알면 n 을 소인수분해할 수 있다. 그러니 소인수분해가 어렵다고 믿는 만큼은 "공개키만으로 비밀키를 찾는 일"도 어렵다고 믿을 수 있다. 다만 비밀키를 찾지 않고 메시지만 읽는 길이 없다는 것은 증명되지 않았고, 소인수분해가 어렵다는 것 자체도 증명되지 않았다.

예제 124

p=5, q=11 로 RSA 열쇠를 만들려 한다. e=5 를 쓸 수 있는가? e=7 은 어떤가? 쓸 수 있는 것으로 m=8 을 암호화하고 다시 복호화해 보라.

풀이 보기

무엇을 아는가. n=55 이고 φ(n)=410=40 이다.

e 를 고르는 조건gcd(e,φ(n))=1 이다. 40=235 이므로 gcd(5,40)=5 이고 e=5 는 쓸 수 없다. 740 의 약수가 아니고 서로소이므로 e=7 은 쓸 수 있다.

d 구하기. Z40 에서 7 의 역원인데, 앞 예제에서 이미 분쇄기로 구했다. d=23 이다.

암호화. 87(Z55) 를 빠른 거듭제곱으로 구한다. 82=649, 8492=8126 이므로 87=848282698 이다. 269=234=455+1414 이고 148=112=255+22 다. 암호문은 2 다.

복호화. 223(Z55) 를 구한다. 25=32, 210=1024=1855+3434, 220342=1156=2155+11 이므로 223=2202318=8 이다. 원래 메시지 8 이 돌아왔다.

답이 말이 되는가. 2201 이 나온 것이 우연이 아니다. φ(55)=40 이므로 오일러 정리는 2401 을 보장하고, 실제로는 그 절반에서 이미 1 이 되었다. 오일러 정리는 되풀이 주기의 상한을 주고, 실제 주기는 그것의 약수일 수 있다.

실제 열쇠에서는 pq 가 각각 300자리를 넘는다. 그리고 여기 적은 그대로 쓰면 안전하지 않다. 같은 평문이 늘 같은 암호문이 되므로 평문에 무작위 채움을 섞는 규격을 함께 써야 한다. 그쪽 이야기는 알고리즘 문서에 있다.

이 장에서 새로 나온 것

기호·용어
ab · abak=b 인 정수 k 가 있다 · 없다
선형결합s0b0++skbk. 계수 si 는 정수이고 음수여도 된다
나눗셈 정리d0 이면 n=qd+r, 0r<|d|(q,r) 이 딱 하나
rem(n,d) · nmodd그 나머지. 늘 음이 아니다. 두 표기는 같은 것
gcd(a,b)최대공약수. 다른 모든 공약수가 이것을 나눈다
유클리드 보조정리gcd(a,b)=gcd(b,rem(a,b)). 뺄셈판은 gcd(xy,y)
분쇄기 (확장 유클리드)gcd(a,b)=sa+tbs,t 를 함께 구한다
선형결합 따름정리na,b 의 선형결합인 것은 gcd(a,b)n 인 것과 같다
소수 · 합성수 · π(n)1 보다 크고 자신과 1 로만 나누어떨어진다 · 그 밖의 것 · n 이하의 소수 개수
산술의 기본정리모든 양의 정수가 약하게 감소하는 소수열의 곱으로 딱 한 가지로 쓰인다
ab(modn)n(ab). 곧 두 수의 나머지가 같다
Zn0 이상 n 미만인 정수와 +n, n 을 묶은 것. (Zn) 을 옆에 달아 표시한다
나머지 산술의 일반 원리덧셈·곱셈의 피연산자를 나머지로 바꿔도 된다. 지수는 안 된다
서로소 · 곱셈 역원 · 소거 가능gcd(a,b)=1 · kj=1(Zn)j 가 있다 · ka=kb 에서 k 를 지울 수 있다
세 조건의 동등성gcd(k,n)=1 인 것 · 역원이 있는 것 · 소거 가능한 것이 모두 같다
φ(n) · Znn 과 서로소인 수의 개수 · 그 수들의 집합. φ(p)=p1, φ(pq)=(p1)(q1)
오일러 정리kZn 이면 kφ(n)=1(Zn)
페르마의 소정리p 가 소수이고 pk 이면 kp11(modp)
RSAm^=me, m=m^d, ed1(modφ(n)). 오일러 정리가 되돌린다

챙겨 갈 것은 다섯이다.

다음 장에서는 방향 그래프와 순서를 다룬다. 이 장에서 만난 것 둘이 거기서 다시 나온다. 합동이 정수를 조각으로 가른 것은 동치관계와 분할의 대표적인 예이고, 나누어떨어짐 관계 ab 는 부분순서의 대표적인 예다. 정수론의 두 관계가 그 장의 두 주인공이 된다.

방향 그래프와 부분순서

점 몇 개를 그리고 그 사이에 화살표를 그으면 "무엇이 무엇과 이어져 있는가"를 적을 수 있다. 그것이 방향 그래프(directed graph)이고 줄여 다이그래프라 한다. 웹 페이지 사이의 링크, 작업 사이의 선후관계, 패킷이 지나갈 수 있는 길, 과목의 선수관계가 모두 방향 그래프다.

이 장에서 답할 것은 넷이다. 화살표를 따라 갈 수 있는 곳을 어떻게 세는가. 선후관계만 정해진 일들을 가장 빨리 끝내는 시간이 무엇으로 정해지는가. 6장에서 세운 이항관계의 성질(반사·대칭·추이 같은 것)이 그림에서 무슨 모양으로 보이는가. 그리고 "순서"라는 말과 "같다"라는 말을 관계로 어떻게 정의하는가.

이 장의 핵심 발상을 미리 말해 둔다. 방향 그래프는 이항관계와 정확히 같은 것이다. 6장에서 이항관계를 정의역·공역·그래프의 묶음으로 정의했는데, 정의역과 공역이 같은 집합인 이항관계에 점과 화살표를 그리면 방향 그래프가 된다. 그래서 그래프에 대해 증명한 것이 관계에 대한 정리가 되고, 그 반대도 된다. 11장에서 만든 나누어떨어짐 관계합동이 이 장의 두 예제 주인공이다.

알고리즘 문서가 /posts/fundamental/algorithm.html > 그래프 용어/posts/fundamental/algorithm.html > 위상 정렬(Topological sort), 그리고 최단경로 알고리즘을 다뤘다. 여기서는 그 알고리즘을 되풀이하지 않고 구조에 대한 정리를 증명한다.

방향 그래프와 차수

정의. 방향 그래프 G 는 공집합이 아닌 정점(vertex) 집합 V(G)간선(directed edge) 집합 E(G) 로 이루어진다. 정점은 노드(node)라고도 한다. 간선은 어떤 정점 u 에서 시작해 어떤 정점 v 에서 끝나고, u 를 그 간선의 꼬리(tail), v머리(head)라 한다. 이 간선을 순서쌍 (u,v) 로 나타낼 수 있고, 이 문서는 uv 로 적는다.

새로운 것은 어휘뿐이다. 형식적으로 방향 그래프는 집합 V 위의 이항관계와 같다. 실제로 6장에서 관계의 화살표 모음을 이미 "그래프"라 불렀다. 11장의 나누어떨어짐 관계 ab1 부터 12 까지에 제한하면 정점 열두 개짜리 방향 그래프가 되고, 그 그림을 이 장 뒷부분에서 쓴다.

정의. 정점 v 로 들어오는 간선의 수를 진입차수(in-degree) indeg(v), 나가는 간선의 수를 진출차수(out-degree) outdeg(v) 라 한다.

두 정점 사이에 양방향 간선이 있어도 된다. 진입차수의 합과 진출차수의 합이 같은 것은 둘 다 간선의 수를 센 것이기 때문이다
<두 정점 사이에 양방향 간선이 있어도 된다. 진입차수의 합과 진출차수의 합이 같은 것은 둘 다 간선의 수를 센 것이기 때문이다>[원본 보기]

그림의 표에서 두 열의 합이 같다. 우연이 아니다. 간선마다 머리가 정확히 하나이고 꼬리도 정확히 하나이므로, 두 합은 모두 |E(G)| 를 다르게 센 것이다. 이것이 악수 보조정리의 방향 그래프판이다.

예제 125

크기 n1 인 집합 S 와 전함수 f:SS 가 있다. 간선이 {sf(s):sS} 인 방향 그래프 Df 를 생각하자. (가) 정점들의 진출차수로 가능한 값은? (나) 진입차수로 가능한 값은? (다) f 가 전사이면 진입차수는?

풀이 보기

무엇을 묻는가. 함수를 그래프로 그렸을 때 차수가 무엇으로 제한되는지다.

(가) 정확히 1 뿐이다. f 가 전함수이므로 각 s 에 대해 f(s) 가 정확히 하나 정해지고, 간선이 그 하나씩만 만들어진다. 진출차수가 모두 1 인 것과 전함수인 것이 같은 말이다.

(나) 0 부터 n 까지 어떤 값이든 될 수 있다. indeg(v)=|f1(v)| 이므로, 아무것도 v 로 가지 않으면 0 이고 모든 원소가 v 로 가면(상수함수) n 이다.

(다) 정확히 1 뿐이다. 전사이므로 모든 v 에 대해 indeg(v)1 이고, 진입차수의 합이 간선 수 n 인데 정점이 n 개이므로 하나라도 2 이상이면 어딘가는 0 이 되어 모순이다.

답이 말이 되는가. (다)에서 나온 결론이 "유한집합에서 전사와 단사가 같다"는 6장의 비둘기집 원리와 같은 이야기다. 차수를 세는 것만으로 그 사실이 다시 나온 것이 방향 그래프로 관계를 보는 값어치다.

예제 126

임의의 유한 방향 그래프에서 vindeg(v)=|E(G)| 임을 간선 수에 대한 귀납법으로 증명하라.

증명

뼈대는 이렇다. 간선 하나를 지우면 어떤 정점의 진입차수가 정확히 1 줄어든다.

증명. P(m) 을 "간선이 m 개인 모든 유한 방향 그래프에서 진입차수의 합이 m 이다"라 하고 m 에 대한 보통 귀납법을 쓴다.

기저 단계. m=0 이면 모든 정점의 진입차수가 0 이고 합도 0 이다.

귀납 단계. P(m) 을 가정하고 간선이 m+1 개인 그래프 G 를 잡는다. 간선 하나 e=uv 를 골라 지운 그래프를 G 라 하면 G 의 간선은 m 개이므로 가정에 의해 진입차수의 합이 m 이다. e 를 되돌리면 v 의 진입차수만 1 늘고 다른 정점은 그대로이므로 합이 m+1 이다.

진출차수도 같은 논증이므로 두 합이 모두 |E(G)| 이고 따라서 서로 같다.

"당연한" 사실을 왜 증명하는가. 이 등식은 "간선마다 머리가 하나"라는 관찰을 유한 합으로 바꾸는 단계를 숨기고 있고, 그 단계가 귀납법이다. 무한 그래프에서는 이 등식이 그대로 성립하지 않는다.

보행과 경로

정의. 방향 그래프에서 보행(walk)은 정점으로 시작해 정점으로 끝나는 정점과 간선의 교대 수열로서, 수열에 나오는 모든 간선 uv 에 대해 그 앞이 u 이고 그 뒤가 v 인 것이다. 곧

v0v0v1v1v1v2v2vk1vkvk

꼴이고, 이 보행의 길이k 다(정점 수가 아니라 간선 수다). 모든 vi 가 서로 다르면 경로(path)라 한다. 시작과 끝이 같은 보행을 닫힌 보행이라 하고, 양의 길이 닫힌 보행 중 시작·끝을 뺀 정점이 모두 다른 것을 순환(cycle)이라 한다. 정점 하나는 길이 0 인 경로이자 닫힌 보행이지만 순환은 아니다. 길이 1 인 순환은 자기 고리(self-loop)다.

보행은 정점을 다시 밟아도 되고 경로는 안 된다. 되풀이되는 조각을 잘라내면 경로가 되므로 가장 짧은 보행은 언제나 경로다
<보행은 정점을 다시 밟아도 되고 경로는 안 된다. 되풀이되는 조각을 잘라내면 경로가 되므로 가장 짧은 보행은 언제나 경로다>[원본 보기]

보행은 정점 수열만으로도, 간선 수열만으로도 정해지므로 편할 때 그렇게 적는다. 보행 f 가 정점 v 에서 끝나고 rv 에서 시작하면 두 보행을 이어붙일 수 있고 fr 로 적는다. 길이는 그냥 더해진다 — |fr|=|f|+|r| 이다.

정리. 한 정점에서 다른 정점으로 가는 가장 짧은 보행은 경로다.

증명. u 에서 v 로 가는 보행이 있으면, 정렬성 원리에 의해 길이가 최소인 보행 w 가 있다. w 가 경로가 아니라고 가정하면 어떤 정점 x 가 두 번 나오므로 w=efg 로 쪼갤 수 있고, 여기서 fx 에서 x 로 돌아오는 양의 길이 부분이다. f 를 잘라 낸 egu 에서 v 로 가는 보행이고 길이가 더 짧다. w 의 최소성에 어긋난다.

정의. u 에서 v 까지의 거리 dist(u,v) 는 가장 짧은 경로의 길이다. 방향이 있으므로 dist(u,v)dist(v,u) 는 대개 다르고, 한쪽만 있을 수도 있다.

삼각부등식. dist(u,v)dist(u,x)+dist(x,v) 다. 증명은 위 정리 한 줄이다. fu 에서 x 로 가는 최단경로, rx 에서 v 로 가는 최단경로라 하면 fru 에서 v 로 가는 길이 dist(u,x)+dist(x,v) 인 보행이고, 최단경로는 그보다 길 수 없다.

예제 127

(가) 두 정점을 함께 지나는 닫힌 보행이 있는데 그 두 정점을 함께 지나는 순환은 없는 방향 그래프를 하나 제시하라. (나) 한 정점을 지나는 가장 짧은 양의 길이 닫힌 보행은 순환임을 증명하라.

증명

(가) 정점 a,b,c 에 간선 ab,ba,bc,cb 넷을 둔다. abcbaac 를 함께 지나는 닫힌 보행이다. 그런데 이 그래프의 순환은 ababcb 뿐이고 둘 다 ac 를 함께 담지 않는다.

이것이 보행과 순환이 다르다는 것을 가장 잘 보여 주는 예다. b 를 두 번 밟았기 때문에 두 곳을 다 들를 수 있었다.

(나) 증명. 위 정리의 증명과 같은 모양이다. 정점 v 를 지나는 양의 길이 닫힌 보행이 있으면 최소 길이인 것 w 가 있다. w 가 순환이 아니라면 v 가 아닌 어떤 정점 x 가 두 번 나오거나 v 가 세 번 이상 나온다. 어느 경우든 x 에서 x 로 돌아오는 양의 길이 부분을 잘라 낼 수 있고, 남은 것은 여전히 v 를 지나는 양의 길이 닫힌 보행이면서 더 짧다. 모순이다.

두 증명이 같은 뼈대를 쓴 것을 확인해 두자. "최소인 것을 잡고, 되풀이되는 조각을 잘라 더 작은 것을 만든다"가 4장에서 배운 정렬성 원리 증명의 정형이다.

예제 128

토너먼트 그래프는 서로 다른 두 정점 사이에 간선이 정확히 하나씩 있는 방향 그래프다. 경기에서 이긴 쪽에서 진 쪽으로 화살표를 그은 것으로 볼 수 있다. 진출차수가 최대인 정점에서는 다른 모든 정점까지 거리가 2 이하임을 증명하라.

증명

뼈대는 이렇다. 거리 3 이상인 정점이 있다고 하면 그 정점의 진출차수가 더 커져 최대라는 가정에 어긋난다.

증명. 진출차수가 최대인 정점을 x 라 하고, x 에서 거리 2 이하로 갈 수 없는 정점 v 가 있다고 가정하자.

먼저 xv 가 간선이 아니다(그러면 거리가 1 이다). 토너먼트이므로 vx 는 간선이다.

다음으로 xy 인 모든 y 에 대해 yv 가 간선일 수 없다(그러면 xyv 가 길이 2 보행이다). 토너먼트이므로 vy 가 간선이다.

그러면 vx 가 이긴 모든 정점을 이기고 덤으로 x 까지 이긴다.outdeg(v)outdeg(x)+1 이고 x 가 최대라는 데 어긋난다.

이 정리를 말로 옮기면 "가장 많이 이긴 선수는, 자기를 이긴 상대가 있다 해도 그 상대를 이긴 제3의 선수를 이겼다"다. 다만 그런 선수가 여럿일 수 있고 승수가 더 적은 선수도 그럴 수 있으므로 "최강자"를 정하는 근거가 되지는 않는다.

인접행렬과 보행의 수

정점이 v0,,vn1 인 방향 그래프를 n×n 짜리 01 의 표로 적을 수 있다. 인접행렬(adjacency matrix) AG(i,j) 성분은 vivj 가 간선이면 1, 아니면 0 이다.

값이 2 인 칸은 길이 2 보행이 두 개라는 뜻이다. 행렬 곱의 정의가 가운데 정점을 하나 고르는 일과 정확히 같기 때문에 이런 일이 벌어진다
<값이 2 인 칸은 길이 2 보행이 두 개라는 뜻이다. 행렬 곱의 정의가 가운데 정점을 하나 고르는 일과 정확히 같기 때문에 이런 일이 벌어진다>[원본 보기]

정의. n 개 정점을 가진 그래프의 길이 k 보행 계수 행렬(u,v) 성분이 u 에서 v 로 가는 길이 k 보행의 수인 n×n 행렬이다. 인접행렬이 길이 1 계수 행렬이고, 단위행렬이 길이 0 계수 행렬이다.

정리. C 가 길이 k 계수 행렬이고 D 가 길이 m 계수 행렬이면 CD 는 길이 k+m 계수 행렬이다.

증명. u 에서 v 로 가는 길이 k+m 보행은 "u 에서 어떤 정점 w 로 가는 길이 k 보행" 뒤에 "w 에서 v 로 가는 길이 m 보행"을 이어붙인 것이고, 그 쪼개는 방법이 k 번째 정점 w 하나로 정해진다. 그러므로 wk 번째로 지나는 보행의 수가 CuwDwv 이고, 모든 w 에 대해 더하면

(u 에서 v 로 가는 길이 k+m 보행의 수)=wV(G)CuwDwv

다. 오른쪽이 정확히 행렬 곱 (CD)uv 의 정의다.

여기에 귀납법을 붙이면 따름정리 — 길이 k 계수 행렬은 (AG)k 다. 인접행렬을 k 제곱하면 길이 k 보행의 수가 나온다는 뜻이다. 행렬 곱셈과 그 성질은 선형대수 문서에 있다. 여기서 눈여겨볼 것은 행렬 곱의 정의가 "가운데를 하나 고르고 경우를 다 더한다"는 셈과 같은 모양이라는 점이다. 그래서 그래프의 셈 문제가 행렬 계산으로 넘어간다.

예제 129

위 그림의 그래프에서 a 에서 각 정점까지의 거리를 인접행렬의 거듭제곱으로 구하라. 그리고 왜 n1 제곱까지만 보면 되는가?

풀이 보기

무엇을 묻는가. 거리이고, 방법은 "성분이 처음 0 이 아니게 되는 지수"를 찾는 것이다. dist(u,v)((AG)k)uv>0 이 되는 최소의 k 다. 보행이 있는 것과 경로가 있는 것이 같기 때문이다.

AGa 행은 (0,1,0,1) 이므로 dist(a,b)=dist(a,d)=1 이다. (AG)2a 행은 (0,0,2,1) 이므로 c 가 처음 등장하고 dist(a,c)=2 다. 그리고 dist(a,a)=0 이다.

첫 열이 계속 0 인 것도 읽어야 한다. a 의 진입차수가 0 이므로 어느 정점에서도 a 로 갈 수 없다. dist(b,a) 는 아예 정의되지 않는다.

n1 까지인가. 보행이 있으면 경로가 있고, 경로는 정점을 다시 밟지 않으므로 정점이 n 개면 간선이 많아야 n1 개다. 따라서 도달할 수 있다면 n1 이하의 지수에서 반드시 드러난다.

이 방법은 옳지만 느리다. 행렬 곱 한 번이 O(n3) 이고 n1 번 곱해야 한다. /posts/fundamental/algorithm.html > 그래프 탐색의 너비 우선 탐색이 같은 일을 O(V+E) 에 한다. 여기서 인접행렬을 쓰는 값어치는 계산이 아니라 "보행의 수를 세는 것이 곱셈이다"라는 통찰이다.

예제 130

(가) (AG)k 의 대각 성분들의 합은 무엇을 세는가? (나) 정점이 n 개인 G 가 DAG 이면 (AG)n 이 영행렬임을 보여라.

풀이 보기

(가) 대각 성분 ((AG)k)vvv 에서 v 로 가는 길이 k 보행의 수, 곧 v 를 지나는 길이 k 닫힌 보행의 수다. 그것을 모든 v 에 대해 더한 것이므로 시작점을 표시한 길이 k 닫힌 보행의 총수다. 같은 순환이라도 어느 정점에서 출발한 것으로 보는지에 따라 따로 세어진다.

(나) DAG 에는 순환이 없으므로 닫힌 보행도 없고, 그러면 어떤 보행에서도 정점이 되풀이될 수 없다. 곧 DAG 의 모든 보행은 경로다. 경로는 정점을 다시 밟지 않으므로 길이가 n1 이하이고, 따라서 길이 n 보행이 하나도 없다. 그 수를 담은 행렬이 (AG)n 이므로 모든 성분이 0 이다.

답이 말이 되는가. (나)를 뒤집으면 어떤 k 에서도 (AG)k 의 대각 성분이 0 이 아니면 그 그래프에는 순환이 있다는 판정법이 된다. 실무에서 순환을 찾을 때는 이렇게 하지 않고 깊이 우선 탐색을 쓰지만, "순환이 없다"를 대수적인 조건으로 바꿀 수 있다는 것은 기억할 만하다.

보행 관계와 추이 폐쇄

방향 그래프가 이항관계라는 말을 이제 써 보자. 그래프 G 에 대해 보행 관계 G 를 "u 에서 v 로 가는 보행이 있다"로, 양의 보행 관계 G+ 를 "양의 길이 보행이 있다"로 정의한다. uGv 일 때 vu 에서 도달 가능(reachable)하다고 한다.

이 두 관계를 계산하려면 관계를 합성할 수 있어야 한다.

정의. 이항관계 R:BCS:AB합성 RS:AC

a(RS)c::=bB.(aSb)(bRc)

로 정의한다. RS 의 순서가 뒤집힌 것은 오타가 아니다. 함수의 합성에서 (fg)(x)=f(g(x)) 이므로 g 가 먼저 적용되는데, 그 관례에 맞춘 것이다.

그러면 G 를 자기 자신과 n 번 합성한 것 Gn길이 n 보행 관계가 된다. G0 은 항등관계 IdV(G) 다. 그리고 보행이 있는 것과 경로가 있는 것이 같고 경로의 길이가 |V(G)|1 이하이므로

G=G0G1G|V(G)|1=(GG0)|V(G)|1

이다. 마지막 등식이 실용적이다. 합성을 n1 번 하지 않고 반복 제곱으로 log2n 번쯤 하면 된다. 8장의 /posts/fundamental/algorithm.html > 빠른 거듭제곱가 관계에도 그대로 쓰이는 것이다. G+G추이 폐쇄(transitive closure)라 부른다 — G 를 담는 가장 작은 추이적 관계라는 뜻이다.

예제 131

이항관계 R 이 추이적이면 R=R+ 임을 증명하라.

증명

뼈대는 이렇다. R 이 추이적이면 두 걸음을 한 걸음으로 줄일 수 있고, 그것을 되풀이하면 몇 걸음이든 한 걸음이 된다.

증명. R+=R1R2 이므로 RR+ 는 자명하다. 거꾸로 모든 n1 에 대해 RnR 임을 n 에 대한 귀납법으로 보인다.

기저 단계. R1=R 이다.

귀납 단계. RnR 을 가정하고 aRn+1c 라 하자. 정의에 의해 aRnb 이고 bRcb 가 있다. 가정에 의해 aRb 이고, 추이성에 의해 aRc 다.

그러므로 R+R 이고 두 포함을 합치면 R=R+ 다.

이 사실이 말하는 것은 "추이 폐쇄를 취해도 안 커지는 관계"가 곧 추이적인 관계라는 것이다. 그림으로 보면 "두 걸음 갈 수 있는 곳에는 이미 한 걸음 간선이 그려져 있다"는 뜻이다.

예제 132

인접행렬의 성분을 수가 아니라 참·거짓으로 읽고, 행렬 곱에서 곱셈을 논리곱 , 덧셈을 논리합 로 바꾸면 그 곱은 어느 관계에 대응하는가? 그리고 그것으로 G 를 구하는 계산량은 얼마인가?

풀이 보기

무엇을 묻는가. 앞 절의 정리를 "몇 개인가" 대신 "있는가"로 바꾸면 무엇이 되는지다.

보통 행렬 곱에서 (CD)uv=wCuwDwv 였다. 곱셈을 , 덧셈을 로 바꾸면

(CD)uv=w(CuwDwv)

가 되고, 이것은 "u 에서 w 로 가고 w 에서 v 로 가는 w있는가"다. 관계 합성의 정의에 있는 를 유한 논리합으로 적은 것이므로 이 곱은 정확히 관계의 합성 RS 에 대응한다.

계산량. 이런 행렬 곱 한 번이 O(n3) 이고, G=(GG0)n1 을 반복 제곱으로 구하면 곱셈이 O(logn) 번이므로 전부 O(n3logn) 이다.

답이 말이 되는가. 알고리즘 문서의 /posts/fundamental/algorithm.html > 플로이드 워셜가 같은 문제를 O(n3) 에 푼다. 로그 인자를 없앤 것이 그 알고리즘의 값어치다. 여기서 얻을 것은 "몇 개인가"를 "있는가"로 바꾸면 셈이 논리 연산이 된다는 대응이고, 그 대응 덕분에 보행의 수를 세는 정리 하나가 도달 가능성 계산법까지 함께 준 것이다.

DAG 와 일정 계획

정의. 순환이 없는 방향 그래프를 DAG(directed acyclic graph)라 한다. DAG 가 중요한 까닭은 선후관계가 DAG 라야 뜻이 있기 때문이다. 과목 uv 보다 먼저 들어야 한다는 관계를 화살표로 적으면, 양의 길이 닫힌 보행이 있으면 아무도 졸업할 수 없다. 앞에서 "최단 양의 길이 닫힌 보행은 순환"임을 증명했으므로 닫힌 보행이 없는 것과 순환이 없는 것이 같다.

정의. 유한 DAG 의 위상 정렬(topological sort)은 모든 정점을 늘어놓은 목록으로서, 각 정점 vv 에서 도달 가능한 다른 모든 정점보다 앞에 오는 것이다.

정점 v극소(minimal)라는 것은 다른 어떤 정점에서도 v 로 갈 수 없다는 뜻이다(최소(minimum)는 다른 모든 정점이 v 에서 도달 가능한 것이고, 훨씬 강한 조건이다). 유한 DAG 에 극소 정점이 반드시 있다 — 없다면 어느 정점에서든 화살표를 거꾸로 끝없이 따라갈 수 있고, 정점이 유한하므로 어딘가를 두 번 밟아 순환이 생긴다.

정리. 모든 유한 DAG 에 위상 정렬이 있다. 만드는 법은 극소 정점 하나를 골라 적고 그래프에서 지우는 일을 되풀이하는 것이다. 지우면 새로 극소가 되는 정점이 생긴다. 알고리즘 문서의 /posts/fundamental/algorithm.html > 위상 정렬(Topological sort) 절이 이것을 진입차수와 깊이 우선 탐색 두 방법으로 구현했다.

병렬 일정과 임계 경로

이제 이 절의 목표다. 일을 여러 개 동시에 할 수 있다면 전부 끝내는 데 걸리는 최소 시간은 얼마인가. 작업마다 시간이 같고 프로세서가 얼마든지 있다고 하자.

상자 하나가 한 단계다. 한 상자 안의 작업들 사이에는 화살표가 없어 동시에 해도 되고, 화살표는 늘 왼쪽 상자에서 오른쪽 상자로만 간다
<상자 하나가 한 단계다. 한 상자 안의 작업들 사이에는 화살표가 없어 동시에 해도 되고, 화살표는 늘 왼쪽 상자에서 오른쪽 상자로만 간다>[원본 보기]

정의. DAG D병렬 일정V(D) 의 분할 A0,A1, 로서, j<k 이면 Aj 의 어떤 정점도 Ak 의 정점에서 도달 가능하지 않은 것이다. Akk 단계에 하는 작업의 모음이라 하고, 블록의 수를 그 일정의 시간, 한 단계에 배정된 작업 수의 최댓값을 그 일정이 요구하는 프로세서 수라 한다.

정의. 두 정점이 견줄 수 있다(comparable)는 것은 한쪽이 다른 쪽에서 도달 가능하다는 뜻이다. DAG 의 사슬(chain)은 어느 두 원소든 견줄 수 있는 정점 집합이다. 정점 a 에서 끝나는 가장 큰 사슬을 a 로의 임계 경로라 하고, 그 사슬에서 a 보다 앞선 원소의 수를 a깊이라 한다.

사슬의 원소들은 서로 선후관계에 있으므로 어떤 두 개도 같은 단계에 둘 수 없다. 그러니 어떤 일정도 가장 큰 사슬의 크기보다 짧을 수 없다. 그런데 그 하한이 언제나 달성된다.

정리. 유한 DAG 의 최소 시간 일정은 Ak::={a:a 의 깊이가 k} 로 주어진다. 곧 병렬 시간 = 임계 경로의 크기다.

증명의 알맹이는 "a 를 지금 당장 할 수 있으면 지금 한다"는 욕심 전략이 깊이별 묶음과 같다는 것이다. a 의 깊이가 k 이면 a 앞에 반드시 k 단계가 필요하고, 반대로 a 로 들어오는 모든 정점의 깊이가 k 보다 작으므로 k 단계에 a 를 놓아도 규칙을 어기지 않는다.

띠 하나가 한 단계다. 굵은 길이 임계 경로이고, 초록 정점 셋 사이에는 어떤 방향으로도 길이 없어 동시에 해도 된다
<띠 하나가 한 단계다. 굵은 길이 임계 경로이고, 초록 정점 셋 사이에는 어떤 방향으로도 길이 없어 동시에 해도 된다>[원본 보기]

예제 133

위 옷 입기 DAG 에서 프로세서가 둘뿐이면 최소 시간은 얼마인가? 실제 일정을 제시하라.

풀이 보기

무엇을 묻는가. 프로세서 수에 제한이 있을 때의 최소 시간이다. 프로세서가 무한이면 답이 임계 경로의 크기 4 였다.

무엇을 아는가. 하한이 둘이다. 임계 경로에서 4, 그리고 작업이 열 개이고 한 단계에 둘까지만 하므로 10/2=5 다. 그러므로 최소 시간은 5 이상이다.

5 가 되는 일정이 있는지 찾는다. 규칙은 "먼저 할 일이 모두 앞 단계에 있어야 한다"뿐이다.

단계작업앞 단계에서 끝났어야 하는 것
1셔츠, 속옷없다
2바지, 넥타이바지는 속옷과 셔츠, 넥타이는 셔츠
3벨트, 왼양말벨트는 바지. 왼양말은 없다
4왼구두, 오른양말왼구두는 바지와 왼양말
5오른구두, 재킷오른구두는 바지와 오른양말, 재킷은 벨트와 넥타이

다섯 단계로 끝났고 하한이 5 였으므로 최소 시간은 5 다.

답이 말이 되는가. 눈여겨볼 것은 양말을 뒤로 미룬 것이다. 양말은 먼저 할 일이 없어 언제든 할 수 있으니, 프로세서가 부족할 때는 급한 일에 자리를 내주고 나중에 하는 편이 낫다. 프로세서가 무한일 때는 "할 수 있으면 지금 한다"가 최적이었지만 제한이 있으면 그 전략이 최적이 아니다. 프로세서 수가 제한된 일정 문제는 일반적으로 어렵다.

딜워스 보조정리

정의. DAG 의 반사슬(antichain)은 어느 두 원소도 견줄 수 없는 정점 집합이다. 곧 그 안의 서로 다른 두 정점 사이에 어떤 방향으로도 보행이 없다.

앞의 정리에서 곧바로 나오는 것이 있다. 가장 큰 사슬의 크기가 t 이면 V(D) 를 반사슬 t 개로 분할할 수 있다. 깊이별 묶음 Ak 가 각각 반사슬이기 때문이다(같은 깊이의 두 정점이 견줄 수 있으면 한쪽의 깊이가 더 커야 한다). 여기서 이 장의 산이 나온다.

딜워스 보조정리(Dilworth). 모든 t>0 에 대해, 정점이 n 개인 모든 DAG 는 크기가 t 보다 큰 사슬을 갖거나 크기가 n/t 이상인 반사슬을 갖는다.

증명. 크기가 t 보다 큰 사슬이 없다고 가정하자. 가장 큰 반사슬의 크기를 이라 하자. 위 따름정리에 의해 정점 전체를 반사슬로 분할할 수 있고 그 개수는 가장 큰 사슬의 크기, 곧 t 이하다. 각 반사슬의 크기는 이하이므로 정점의 총수가 t 이하다. 즉 nt 이고 나누면 n/t 다.

t=n 을 넣으면 정점이 n 개인 모든 DAG 에는 크기 n 을 넘는 사슬이나 크기 n 이상인 반사슬이 있다. 정리 자체는 두 줄이지만 쓸 곳이 많다. "줄을 세울 수 없으면 반드시 서로 견줄 수 없는 것들이 많이 있다"는 말이기 때문이다.

예제 134

서로 다른 정수 1 부터 10000 까지를 어떤 순서로 늘어놓아도 길이 101 이상인 증가 부분수열이나 길이 100 이상인 감소 부분수열이 있음을 증명하라. 그리고 그 한계가 거의 최선임을 보이는 배열을 제시하라.

증명

뼈대는 이렇다. 수열을 DAG 로 바꾼다. 사슬이 증가 부분수열이 되고 반사슬이 감소 부분수열이 되도록.

증명. 자리 번호 1,,10000 을 정점으로 두고, i<j 이면서 ai<aj 일 때 간선 ij 를 둔다. 이 관계는 추이적이고 비반사적이므로 순환이 없고 DAG 다.

두 자리 i<jai<aj 일 때만 견줄 수 있다. 값이 모두 다르므로 견줄 수 없다는 것은 ai>aj 라는 뜻이다. 그러므로 사슬은 증가 부분수열이고 반사슬은 감소 부분수열이다.

딜워스 보조정리에 n=10000, t=100 을 넣으면 크기 100 을 넘는 사슬(길이 101 이상인 증가 부분수열)이나 크기 10000/100=100 이상인 반사슬(길이 100 이상인 감소 부분수열)이 있다.

거의 최선인 배열. 100 개씩 묶어 백 덩어리로 나누고, 덩어리 안에서는 내림차순, 덩어리끼리는 올림차순으로 놓는다.

(100,99,,1),(200,199,,101),,(10000,,9901)

증가 부분수열은 한 덩어리에서 하나씩만 뽑을 수 있으므로 길이가 100 이하다. 감소 부분수열은 한 덩어리 안에 머물러야 하므로 역시 100 이하다. 그러므로 길이 101 인 증가·감소 부분수열이 아예 없는 배열이 존재한다.

답이 말이 되는가. 딜워스가 준 하한(증가 101 또는 감소 100)과 이 배열(증가 100, 감소 100)이 어긋나지 않는다. 이 배열에는 길이 100 인 감소 부분수열이 있으므로 둘째 갈래를 만족한다. "정렬되지 않은 수열에는 반드시 상당히 긴 단조 조각이 있다"는 것이 이 예제의 알맹이다.

관계의 성질과 부분순서

이제 관계 쪽으로 넘어간다. 6장에서 이항관계를 정의했고 성질은 필요할 때 채우기로 했다. 지금이 그 자리다. 아래 성질들은 방향 그래프의 모양으로 읽는 편이 빠르다.

오른쪽 아래의 점선이 추이가 요구하는 간선이다. 반대칭과 비대칭이 갈리는 곳은 자기 고리를 허용하는지 하나뿐이다
<오른쪽 아래의 점선이 추이가 요구하는 간선이다. 반대칭과 비대칭이 갈리는 곳은 자기 고리를 허용하는지 하나뿐이다>[원본 보기]

집합 A 위의 이항관계 R 에 대해 다음을 정의한다.

성질논리식방향 그래프에서 무엇
반사(reflexive)xA.xRx모든 정점에 자기 고리가 있다
비반사(irreflexive)¬xA.xRx자기 고리가 하나도 없다
대칭(symmetric)xRyyRx간선이 있으면 반대 방향 간선도 있다
비대칭(asymmetric)xRy¬(yRx)두 정점 사이 간선이 한 개 이하이고 자기 고리도 없다
반대칭(antisymmetric)(xRyyRx)x=y서로 다른 두 정점 사이 간선이 한 개 이하. 자기 고리는 허용
추이(transitive)(xRyyRz)xRz양의 길이 보행이 있으면 간선도 있다
선형(linear)xy(xRyyRx)어떤 두 정점 사이에도 한쪽 방향 간선이 있다

앞 절의 사실들을 이 어휘로 다시 적어 보자. 보행 관계 GG+ 는 이어붙이기 때문에 언제나 추이적이고, 길이 0 보행이 있으므로 G반사적이다. 그리고 G 가 DAG 인 것은 G+ 가 비반사적인 것과 같다. 순환이 있는 것은 어떤 정점에서 자기로 돌아오는 양의 길이 보행이 있는 것이기 때문이다. 서로 도달 가능한 두 정점이 있으면 그것도 순환을 만들므로 G 가 DAG 인 것은 G+ 가 비대칭인 것과도 같다.

여기서 두 부류가 정의된다.

두 부류의 관계는 "xy 인 것은 xy 이거나 x=y 인 것"이다. 실수의 < 는 강한 부분순서이고 는 약한 부분순서다. 집합의 진부분집합 는 강한 부분순서, 부분집합 는 약한 부분순서다. 그리고 11장의 나누어떨어짐 관계는 음이 아닌 정수 위의 약한 부분순서다. 자기 자신을 나누므로 반사적이고, 추이성은 11장 첫 예제의 (가)이고, 음이 아닌 두 수가 서로를 나누면 같으므로 반대칭적이다.

둘 다 부분순서라 불리는 까닭은 견줄 수 없는 쌍이 있어도 되기 때문이다. 서로 다른 두 원소가 언제나 견줄 수 있으면 전순서(linear order)라 한다. < 는 전순서이고, 크기가 같은 서로 다른 두 집합은 로 견줄 수 없으므로 는 전순서가 아니다.

하세 다이어그램

같은 부분순서를 그리는 DAG 는 여러 개다. 간선을 최대한 줄여 그린 것이 하세 다이어그램(Hasse diagram)이다. 정의. 부분순서 에서 ba덮인다는 것은 ba 이면서 bcac 가 없다는 뜻이다. 그 쌍만 간선으로 그리고, 작은 것을 아래에 두어 화살표를 생략한 그림이 하세 다이어그램이다.

왼쪽과 오른쪽이 같은 관계다. 자기 고리 일곱 개와 두 걸음 이상으로 이미 얻어지는 간선 일곱 개를 지우면 여덟 개만 남는다
<왼쪽과 오른쪽이 같은 관계다. 자기 고리 일곱 개와 두 걸음 이상으로 이미 얻어지는 간선 일곱 개를 지우면 여덟 개만 남는다>[원본 보기]

예제 135

{1,2,3,4,6,8,12} 위의 나누어떨어짐 관계에서 덮음 쌍을 모두 찾고, 왜 하세 다이어그램만으로 원래 관계를 되살릴 수 있는지 설명하라.

풀이 보기

무엇을 묻는가. 덮음 쌍의 목록과, 정보가 손실되지 않는 이유다.

덮음 쌍. 123 에 덮인다(14 이지만 124 라 가운데가 있어 덮음이 아니다). 246 에, 36 에, 4812 에, 612 에 덮인다. 모두 여덟 쌍이다.

되살리는 방법. 하세 다이어그램을 방향 그래프로 보고 그 보행 관계를 취하면 된다. ab 이면 a 에서 b 로 덮음 간선을 따라가는 길이 반드시 있다. 왜냐하면 ab 이고 사이에 아무것도 없으면 덮음이고, 아니면 acbc 를 넣어 쪼갤 수 있으며 유한집합이므로 이 쪼개기가 끝나기 때문이다.

답이 말이 되는가. 간선이 22 개에서 8 개로 줄었는데 정보는 그대로다. 추이적인 관계에서 추이성으로 얻어지는 간선은 적을 필요가 없다. 유한 DAG 에 대해서는 덮음 간선만 남긴 그래프가 같은 양의 보행 관계를 갖는 가장 작은 그래프이고 유일하다.

유한하지 않으면 이 이야기가 무너진다. 유리수 위의 < 을 보자. 어떤 두 유리수 사이에도 또 다른 유리수가 있으므로 덮음 쌍이 하나도 없다. 하세 다이어그램이 텅 비는데 관계는 텅 비지 않았다. 위 논증에서 "쪼개기가 끝난다"고 말한 곳이 유한성을 쓴 자리이고, 그것이 이 절의 결론을 유한 부분순서에만 쓸 수 있는 이유다.

곱순서

순서 둘을 곱해 새 순서를 만들 수 있다. 정의. 관계 R1R2 R1×R2

(a1,a2)(R1×R2)(b1,b2)::=(a1R1b1)(a2R2b2)

로 정의한다. 추이성·반사성·비반사성·반대칭성은 모두 곱에서 보존되므로 부분순서 둘의 곱은 부분순서다. 그런데 선형성은 보존되지 않는다. 두 성분이 서로 반대로 커지는 쌍끼리는 견줄 수 없기 때문이다.

예제 136

학생마다 나이와 키를 재고, 나이도 크지 않고 키도 크지 않을 때 로 놓는다. 학생 101 명 중 나이와 키가 모두 같은 쌍은 없다고 하자. 어떤 결론을 낼 수 있는가?

풀이 보기

무엇을 아는가. 이 관계는 나이의 와 키의 의 곱이므로 부분순서다. 그런데 전순서가 아니다 — 더 나이가 많지만 더 작은 학생 쌍은 견줄 수 없다.

어느 정리를 쓰는가. 부분순서이므로 딜워스 보조정리를 쓸 수 있다. 나이와 키가 모두 같은 쌍이 없으므로 강한 부분순서로 보아 DAG 로 다룰 수 있다. n=101 이고 t=10 을 넣는다.

사슬이 크기 11 이상이거나 반사슬이 크기 101/10=10.1 이상, 곧 정수이므로 11 이상이다. 어느 쪽이든 11 명이 나온다.

두 결론을 말로 옮기면 이렇다. 사슬 쪽은 나이가 많아질수록 키도 커지는 학생 열한 명이고, 반사슬 쪽은 나이가 많아질수록 키가 작아지는 학생 열한 명이다. 어느 쪽이든 열한 명을 한 줄로 세울 수 있다.

답이 말이 되는가. 반사슬에서 왜 "나이가 많을수록 작다"가 나오는지 확인해 두자. 두 학생이 견줄 수 없다는 것은 한쪽이 나이가 더 많으면서 키는 더 작다는 뜻이다. 반사슬의 원소를 나이 순으로 세우면 키가 계속 줄어든다. 앞 예제의 증가·감소 부분수열과 정확히 같은 논증이다.

오류 찾기

다음 "증명"은 결론이 거짓이다. 어느 단계가 틀렸는가.

가짜 정리. 대칭적이고 추이적인 이항관계는 반사적이다.

  1. xRy 라 하자.
  2. 대칭성에 의해 yRx 다.
  3. xRy 이고 yRx 이므로 추이성에 의해 xRx 다.
  4. 따라서 모든 x 에 대해 xRx 이고 R 은 반사적이다.
풀이 보기

먼저 반례를 만들어 결론이 거짓임을 확인한다. A={1,2} 위에서 R={(1,1)} 을 보자. 화살표가 자기 고리 하나뿐이므로 대칭성과 추이성은 빈틈없이 성립한다. 그런데 2R2 가 아니므로 반사적이지 않다. 공관계(화살표가 하나도 없는 관계)도 같은 반례다.

틀린 단계는 4번이다. 1번부터 3번까지가 실제로 증명한 것은 x.(y.xRy)xRx 다. 즉 무언가와 관계된 x 에 대해서만 자기 고리를 얻었다. 반사성은 x.xRx 이므로 아무것과도 관계되지 않은 x 까지 요구한다. 위 반례에서 2 가 정확히 그런 원소다.

1번의 "xRy 라 하자"가 조용히 가정을 하나 들여왔다는 것이 함정이다. 5장에서 배운 대로 한정사를 명시하면 곧바로 드러난다. 그림으로 보면 외톨이 정점 하나가 반례다.

그래서 동치관계의 정의에는 반사성을 따로 적어야 한다. 대칭성과 추이성만으로는 나오지 않는다.

동치관계와 분할

부분순서가 "순서"를 형식화한 것이라면 이 절의 것은 "같다"를 형식화한 것이다.

정의. 반사적이고 대칭적이고 추이적인 이항관계를 동치관계(equivalence relation)라 한다. 11장의 합동이 대표적인 예다. xx(modn) 이고, xy 이면 yx 이고, xy 이고 yz 이면 xz 다. 등호 자체도 동치관계다.

동치관계를 만드는 손쉬운 방법이 있다. 전함수 f 가 정의역의 각 원소에 라벨을 붙인다고 보면, "라벨이 같다"가 동치관계다. 곧 afb::=f(a)=f(b) 로 정의하면 반사·대칭·추이가 모두 등호에서 그대로 물려받아진다. 11장의 나머지 보조정리는 n 합동이 r 과 같은 것이라고 말한다. 여기서 r(a)=rem(a,n) 이다. 거꾸로 모든 동치관계가 어떤 함수의 f 꼴로 적힌다.

정의. 집합 A분할(partition)A 의 공집합 아닌 부분집합들의 모음으로서, A 의 모든 원소가 정확히 하나의 부분집합에 드는 것이다. 그 부분집합들을 블록(block)이라 한다. 동치관계 R 과 원소 a 에 대해 a동치류

[a]R::={xA:aRx}

다. 6장의 말로 하면 a R(a) 다.

왼쪽에서 오른쪽으로 가는 것은 동치류를 모으는 일이고 오른쪽에서 왼쪽으로 가는 것은 같은 블록에 있다를 관계로 읽는 일이다. 두 방향이 서로 역이라 동치관계와 분할은 같은 것이다
<왼쪽에서 오른쪽으로 가는 것은 동치류를 모으는 일이고 오른쪽에서 왼쪽으로 가는 것은 같은 블록에 있다를 관계로 읽는 일이다. 두 방향이 서로 역이라 동치관계와 분할은 같은 것이다>[원본 보기]

예제 138

동치관계의 동치류들이 분할을 이룸을 증명하라.

증명

뼈대는 이렇다. 두 동치류가 원소 하나라도 겹치면 완전히 같다는 것만 보이면 된다.

증명. 세 가지를 확인한다.

공집합이 아니다. 반사성에 의해 aRa 이므로 a[a]R 다.

모든 원소가 어떤 블록에 든다. 방금 본 대로 a[a]R 에 든다.

두 블록은 같거나 서로소다. c[a]R[b]R 라 하자. 그러면 aRc 이고 bRc 다. 대칭성에 의해 cRb 이고, 추이성에 의해 aRb 다. 이제 x[b]R 이면 bRx 이고 aRb 이므로 추이성에 의해 aRx, 곧 x[a]R 이다. 즉 [b]R[a]R 이다. ab 의 역할을 바꾸면(aRb 에서 대칭성으로 bRa 를 얻는다) [a]R[b]R 이므로 두 블록이 같다.

그러므로 "정확히 하나의 블록에 든다"가 성립하고 동치류들은 분할이다.

거꾸로도 성립한다. 분할이 주어지면 "같은 블록에 있다"가 동치관계다. 반사·대칭·추이가 눈으로 보인다. 동치관계와 분할은 같은 것을 두 방향에서 적은 것이고, 세 성질 각각이 분할의 어느 조건에 대응하는지 확인해 두면 좋다 — 반사성은 자기가 속한 블록이 있는 것, 대칭성은 블록에 방향이 없는 것, 추이성은 블록이 겹치지 않는 것이다.

예제 139

5 합동의 동치류를 모두 적어라. 그리고 "라벨이 같다"로 보는 관점에서 이 관계를 다시 설명하라.

풀이 보기

무엇을 묻는가. Z 를 법 5 합동으로 가른 블록들이다.

나머지 보조정리에 의해 xy(mod5) 인 것은 rem(x,5)=rem(y,5) 인 것과 같다. 나머지가 될 수 있는 값이 0,1,2,3,4 다섯 개이므로 블록도 다섯 개다.

[0]={,5,0,5,10,},[1]={,4,1,6,11,},,[4]={,1,4,9,14,}

라벨 관점. r(x)::=rem(x,5) 를 라벨 함수로 보면 이 관계가 정확히 r 이다. 그래서 반사·대칭·추이를 따로 확인할 필요가 없다 — 등호에서 물려받는다. 11장에서 합동의 세 성질을 나머지 보조정리로부터 얻은 것이 바로 이 논리였다.

답이 말이 되는가. 616(mod5) 인 것은 둘 다 [1] 에 있기 때문이고, 29(mod5) 인 것은 2[2] 이고 9[4] 이기 때문이다. 그리고 블록이 다섯 개라는 사실이 11장에서 Z5 를 "원소가 다섯 개인 수 체계"로 정의한 근거다. 동치류를 원소로 삼아 새 집합을 만드는 것이 수학에서 늘 하는 일이고, Zn 이 그 첫 예다.

이 장에서 새로 나온 것

기호·용어
uv꼬리가 u, 머리가 v 인 간선. 방향 그래프는 정점 집합 위의 이항관계와 같다
indeg(v) · outdeg(v)진입차수 · 진출차수. 두 합이 모두 |E(G)| 라 서로 같다
보행 · 경로정점과 간선의 교대 수열 · 정점을 다시 밟지 않는 보행. 길이는 간선 수
닫힌 보행 · 순환 · 자기 고리시작과 끝이 같다 · 양의 길이 닫힌 보행 중 정점이 다른 것 · 길이 1 순환
fr보행 이어붙이기. |fr|=|f|+|r|
dist(u,v)최단경로의 길이. 가장 짧은 보행은 언제나 경로다. 삼각부등식이 성립한다
인접행렬 AGvivj 가 간선이면 (i,j) 성분이 1. (AG)k 가 길이 k 보행의 수를 센다
RS관계의 합성. a(RS)caSb 이고 bRcb 가 있다는 뜻
G · G+보행 관계 · 양의 보행 관계(추이 폐쇄). G=(GG0)|V|1
DAG · 위상 정렬순환이 없는 방향 그래프 · 도달 가능한 것보다 앞에 오도록 늘어놓은 목록
극소 · 최소다른 어디서도 갈 수 없다 · 다른 모든 곳으로 갈 수 있다. 유한 DAG 에 극소는 반드시 있다
견줄 수 있다 · 사슬 · 반사슬한쪽이 다른 쪽에서 도달 가능 · 모두 견줄 수 있는 집합 · 어느 둘도 견줄 수 없는 집합
깊이 · 임계 경로그 정점 앞에 반드시 필요한 단계 수 · 가장 큰 사슬. 병렬 시간 = 임계 경로의 크기
딜워스 보조정리정점 n 개 DAG 에 크기 t 를 넘는 사슬이나 크기 n/t 이상 반사슬이 있다
반사 · 비반사 · 대칭 · 비대칭 · 반대칭 · 추이 · 선형위의 요약표 참고. 반대칭과 비대칭은 자기 고리 허용 여부만 다르다
강한 부분순서 추이 + 비반사 (= 추이 + 비대칭) = 어떤 DAG 의 G+
약한 부분순서 추이 + 반사 + 반대칭 = 어떤 DAG 의 G. 나누어떨어짐과 가 예다
전순서(선형순서)서로 다른 두 원소가 언제나 견줄 수 있는 부분순서. 는 예이고 는 아니다
하세 다이어그램 · 덮음덮음 쌍만 그린 그림 · ba 인데 사이에 아무것도 없는 것
곱순서 R1×R2성분마다 각각 관계. 부분순서는 보존되고 선형성은 보존되지 않는다
동치관계 · 동치류 · 분할반사 + 대칭 + 추이 · [a]R={x:aRx} · 겹치지 않는 블록으로 덮기. 셋이 같은 이야기다

챙겨 갈 것은 다섯이다.

이것으로 11장과 12장의 블록이 끝났다. 정수의 산술과 그래프의 구조라는 서로 다른 두 소재를 다뤘지만, 세운 도구는 앞 블록의 것 그대로였다 — 정렬성 원리, 귀납법, 상태 기계와 불변량, 그리고 측도다. 다음 장부터는 그래프를 본격적으로 다룬다. 13장의 통신망은 이 장의 방향 그래프에 "얼마나 잘 흐르는가"라는 척도를 붙이고, 14장부터는 방향을 지운 단순 그래프로 옮겨 가 구조 정리를 증명한다. 이 장의 도달 가능성과 차수 세기가 거기서 계속 쓰인다.

통신망

컴퓨터 여러 대를 선으로 이어 놓고 서로 자료를 주고받게 하려면 "누가 누구와 이어져 있는가"를 정해야 한다. 그 배선도가 12장의 방향 그래프다. 정점은 컴퓨터나 스위치이고 간선은 선(전선·광섬유)이며, 화살표는 자료가 흐를 수 있는 방향이다.

이 장에서 답할 것은 둘이다. 망이 좋다는 것은 무슨 뜻인가. 그리고 좋은 망이 실제로 있는가. 첫째 질문에 답하려면 "좋다"를 잴 수 있는 양으로 바꿔야 하고, 그 양이 이 장의 절반이다. 나머지 절반은 실제 설계 넷을 그 양으로 견주는 일이고, 그 결과를 담은 표 하나가 이 장의 결론이다.

12장에서 가져오는 것은 경로와 그 길이, 그리고 dist(u,v) 다. 6장의 비둘기집 원리와 7장의 귀납법, 9장의 재귀적 자료형과 구조적 귀납법도 그대로 쓴다. 나비망과 베네시망이 재귀적으로 정의되기 때문이다. 알고리즘 문서가 /posts/fundamental/algorithm.html > 그래프 탐색과 최단경로를 다뤘지만 이 장은 알고리즘이 아니라 배선 구조가 무엇을 강제하는가를 증명한다.

라우팅 문제

자료는 패킷(packet) 단위로 오간다. 패킷은 크기가 대충 정해진 자료 덩어리다 — 256바이트든 4096바이트든 상관없다. 이 장에서 중요한 것은 패킷 하나가 한 번에 한 선만 지나가고, 선을 지나는 데 시간 한 단위가 걸린다는 것뿐이다.

정의. 이 장에서 다루는 망은 입력 단말 N 개와 출력 단말 N 개, 그리고 그 사이를 잇는 스위치들로 이루어진다. 단말은 패킷이 태어나는 곳과 도착하는 곳이고, 스위치는 들어온 패킷을 나가는 선으로 넘겨주는 장치다. 편의상 N2 의 거듭제곱이라고 하자.

동그라미가 스위치, 네모가 단말이다. 나무에는 두 정점을 잇는 경로가 하나뿐이므로 라우팅을 고를 여지가 없다
<동그라미가 스위치, 네모가 단말이다. 나무에는 두 정점을 잇는 경로가 하나뿐이므로 라우팅을 고를 여지가 없다>[원본 보기]

그림의 망을 완전 이진 트리망이라 한다. 잎마다 입력 단말 하나와 출력 단말 하나가 붙어 있고, 잎에서 뿌리까지 이진 트리로 이어져 있다. 이 장에서 계속 쓰는 첫 예다.

정의. 어느 입력이 어느 출력으로 가야 하는지는 [0..N) 위의 순열 π 로 주어진다. 곧 입력 i 의 패킷은 출력 π(i) 로 가야 한다. 이 π라우팅 문제라 하고, 그 답인 라우팅은 경로들의 모음 P={P0,,PN1} 으로서 Pi 가 입력 i 에서 출력 π(i) 로 가는 경로인 것이다.

순열이라는 조건이 왜 붙는지 짚어 두자. 두 입력이 같은 출력으로 가야 한다면 그 출력 단말이 무슨 짓을 해도 병목이 된다. 그런 자명한 병목을 빼고 망 자체의 성질만 보려는 것이다.

예제 140

위 그림의 트리망에서 라우팅 문제 π 가 무엇이든 라우팅이 유일하게 정해짐을 설명하고, 그것이 이 망에 대해 무엇을 뜻하는지 말하라.

풀이 보기

무엇을 묻는가. 경로 선택의 자유가 있는지다.

완전 이진 트리는 나무이므로 어떤 두 정점 사이에도 경로가 정확히 하나뿐이다(14장에서 이 사실을 증명한다. 지금은 그림에서 확인하면 된다 — 잎에서 위로 올라가다 두 잎의 공통 조상에서 꺾어 내려오는 길밖에 없다). 입력 단말과 출력 단말도 각각 잎에 하나씩 붙어 있으므로 Piπ 가 정해지면 곧바로 정해진다.

이것이 뜻하는 것은 이 망에서는 라우팅을 잘 고르는 일 자체가 불가능하다는 것이다. 지연이 길어도 줄일 수 없고, 어느 스위치에 패킷이 몰려도 우회할 수 없다. 뒤에서 나비망도 이 성질을 가지는데, 베네시망은 그렇지 않다. 선택의 자유가 있는지가 이 장의 갈림길이다.

망을 견주는 다섯 척도

이제 "좋다"를 다섯 개의 수로 바꾼다.

지름 — 최악의 지연

패킷이 입력에 들어와 출력에 나올 때까지의 시간은 지나간 선의 수에 비례한다. 최단경로로 보낸다면 최악의 지연은 가장 멀리 떨어진 입력·출력 짝 사이의 거리다.

정의. 망의 지름(diameter)은 입력 단말과 출력 단말 사이 최단경로의 길이 중 가장 큰 값이다.

일반 그래프에서는 지름을 "어떤 두 정점 사이의 최대 거리"로 정의하지만, 통신망에서는 입력과 출력 사이만 따진다. 스위치끼리 얼마나 먼지는 관심이 없기 때문이다.

예제 141

입력과 출력이 각각 N=2k 개인 완전 이진 트리망의 지름이 2log2N+2 임을 증명하라.

증명

뼈대는 이렇다. 가장 먼 짝은 서로 다른 절반에 있는 잎 두 개이고, 그때 길은 뿌리까지 올라갔다 내려온다.

증명. 잎이 N=2k 개인 완전 이진 트리의 높이는 k=log2N 이다(뿌리에서 잎까지 간선 k 개). 입력 단말 i 에서 출력 단말 j 로 가는 길은 잎 i 로 한 걸음, 잎 i 에서 두 잎의 최소 공통 조상까지 올라가기, 거기서 잎 j 까지 내려오기, 출력 단말로 한 걸음이다.

올라가는 길이와 내려오는 길이는 각각 k 이하이고, 두 잎이 뿌리의 서로 다른 자식 아래에 있으면 공통 조상이 뿌리이므로 정확히 k+k=2k 다. 여기에 단말로 드나드는 간선 두 개를 더해 2k+2=2log2N+2 다.

그보다 긴 길은 없다. 공통 조상이 뿌리보다 아래면 올라가는 길이가 k 보다 짧아진다.

답이 말이 되는가. N=1024 이면 지름이 210+2=22 다. 입력이 천 개인데 지연이 스물두 단계뿐이다. 로그가 아주 천천히 자라기 때문이고, 이것이 트리망의 미덕이다.

스위치 크기와 스위치 수

정의. 스위치에 들어오는 간선이 a 개, 나가는 간선이 b 개면 그 스위치를 a×b 스위치라 한다. 스위치 크기는 망에 쓰인 스위치 중 가장 큰 것의 크기이고, 스위치 수는 스위치의 개수다.

완전 이진 트리망의 스위치는 대부분 3×3 이다 — 위와 두 자식으로 드나든다. 지름을 줄이려면 스위치를 크게 하면 된다. 삼진 트리를 쓰면 지름이 2log3N+2 로 줄어든다. 극단으로 가서 N×N 짜리 괴물 스위치 하나를 쓰면 지름이 2 다.

그런데 이것은 답이 아니다. 괴물 스위치의 속을 결국 작은 부품으로 만들어야 하고, 그러면 원래 문제로 되돌아온다. 망 설계의 과제는 "크기가 정해진 값싼 부품으로 N×N 스위치의 구실을 하게 만드는 것"이다. 그래서 스위치 크기를 척도에 넣는다 — 그것을 고정하지 않으면 문제 자체가 사라진다.

예제 142

입력이 N 개인 완전 이진 트리망의 스위치 수가 2N1 임을 보여라.

풀이 보기

무엇을 묻는가. 완전 이진 트리의 정점 수다.

어느 관계를 쓰는가. 뿌리 한 층에 스위치 1 개, 그 아래 층에 2 개, 다음 층에 4 개 하는 식으로 층마다 두 배가 되고 마지막 층(잎)이 N 개다. 층은 log2N+1 개다.

1+2+4++N=t=0log2N2t=2N1

등비급수의 합 공식을 쓴 것이고, 그 공식은 7장에서 귀납법으로 증명했다.

답이 말이 되는가. N=4 이면 7 이고 위 그림의 동그라미가 실제로 일곱 개다. 스위치 수가 N 에 비례하는 것은 좋은 성질이다. 뒤에 나오는 배열망은 N2 개를 쓴다.

혼잡도 — 이 장의 알맹이

트리망에는 치명적인 결함이 있다. 뿌리가 병목이다.

동그라미 안의 수가 그 스위치를 지나는 경로의 수다. 왼쪽은 뿌리를 아예 쓰지 않고 오른쪽은 네 경로가 모두 뿌리를 지난다
<동그라미 안의 수가 그 스위치를 지나는 경로의 수다. 왼쪽은 뿌리를 아예 쓰지 않고 오른쪽은 네 경로가 모두 뿌리를 지난다>[원본 보기]

그림의 왼쪽은 항등 순열 π(i)=i 다. 각 패킷은 자기 잎으로 올라가 곧바로 자기 출력으로 내려가므로 어느 스위치도 경로 하나만 지난다. 오른쪽은 π(i)=N1i 다. 모든 패킷이 반대쪽 절반으로 가야 하므로 네 경로가 모두 뿌리를 지난다. 그리고 라우팅이 유일하므로 피할 방법이 없다.

정의. 라우팅 P혼잡도(congestion)P 의 경로 중 한 스위치를 지나는 것의 개수의 최댓값이다. 망의 혼잡도는 다음과 같이 정한다.

최소를 취한 뒤 최대를 취하는 이중 정의다. 뜻은 "가장 나쁜 순열이 와도, 우리가 최선을 다하면 한 스위치에 몰리는 경로가 이만큼까지다"다. 최소를 먼저 취하는 이유는 설계자의 책임과 운영자의 책임을 가르려는 것이다. 라우팅을 잘못 골라서 생긴 혼잡은 망의 흠이 아니다.

한 가지 표기를 더 둔다. 간선 혼잡도는 한 간선을 지나는 경로 수의 최댓값이다. 어떤 간선을 지나는 경로는 그 간선의 양 끝 스위치도 지나므로 간선 혼잡도는 스위치 혼잡도 이하다. 하한을 세울 때는 간선 쪽이 다루기 쉽다.

예제 143

완전 이진 트리망의 혼잡도가 N 임을 증명하라.

증명

뼈대는 이렇다. 뒤집기 순열을 주면 모든 경로가 뿌리를 지나야 하고, 라우팅이 유일하므로 다른 선택이 없다.

증명. 먼저 혼잡도가 N 이하다. 경로가 모두 N 개뿐이므로 어떤 스위치도 경로 N 개보다 많이 지날 수 없다.

다음으로 N 이상이다. π(i)::=N1i 를 잡자. 입력 i 가 붙은 잎을 i 라 하면, i<N/2 이면 i 는 뿌리의 왼쪽 부분나무에 있고 π(i)=N1iN/2 이므로 목적지 잎은 오른쪽 부분나무에 있다. 나무에서 서로 다른 부분나무의 두 정점을 잇는 유일한 경로는 뿌리를 지난다. iN/2 인 경우도 좌우만 바뀐다. 그러므로 N 개의 경로가 모두 뿌리를 지난다.

라우팅이 유일하므로 이 값을 줄일 라우팅이 없다. 따라서 이 순열에 대한 최소 혼잡도가 N 이고, 망의 혼잡도는 그 최댓값이므로 N 이다.

답이 말이 되는가. 지름은 2logN+2 로 훌륭했는데 혼잡도는 최악인 N 이다. 척도 하나만 보면 망을 잘못 고른다는 것이 이 예제의 요점이다. 게다가 뿌리 스위치가 고장 나면 망이 두 조각으로 갈린다.

이분폭 — 하한을 주는 척도

앞의 증명은 "라우팅이 유일하다"에 기댔다. 라우팅을 고를 수 있는 망에서도 혼잡도의 하한을 얻는 방법이 있다. 그것이 이 절의 척도다.

정의. 망의 이분폭(bisection width)은 간선 몇 개를 끊어 망을 두 조각으로 나눌 때, 각 조각에 입력이 N/2 개 이상 출력이 N/2 개 이상 남게 할 수 있는 최소의 끊는 간선 수다.

트리망은 선 하나만 끊어도 입력 절반과 출력 절반이 떨어져 나간다. 허리가 얇다는 것이 곧 그곳이 막힌다는 뜻이다
<트리망은 선 하나만 끊어도 입력 절반과 출력 절반이 떨어져 나간다. 허리가 얇다는 것이 곧 그곳이 막힌다는 뜻이다>[원본 보기]

정리. 이분폭이 w 인 망의 간선 혼잡도는 N/2w 이상이다.

증명. 이분폭을 실현하는 절단을 하나 잡고 두 조각을 A, B 라 하자. 정의에 의해 A 에는 입력이 N/2 개 이상 있고 B 에는 출력이 N/2 개 이상 있다. A 의 입력 중 N/2 개를 골라 B 의 출력 중 N/2 개로 보내고, 남은 것끼리 아무렇게나 이어 순열 π 를 하나 만든다.

π 를 어떻게 라우팅해도 A 에서 B 로 가는 경로가 N/2 개 있고, 그 경로는 모두 끊은 간선 w 개 중 하나를 지나야 한다. 경로가 N/2 개이고 간선이 w 개이므로 비둘기집 원리에 의해 어떤 간선에는 경로가 (N/2)/w 개 이상 얹힌다.

이 정리는 "혼잡도를 낮추려면 배선을 실제로 깔아야 한다"는 말이다. 혼잡도 1 을 얻으려면 이분폭이 N/2 이상이어야 하고, 그만큼의 간선이 절단면을 가로질러야 한다. 공짜가 없다는 것을 이 척도가 회계한다.

왼쪽 넷은 재는 것이고 이분폭은 하한을 주는 것이다. 화살표는 이것이 저것을 제한한다는 뜻이다
<왼쪽 넷은 재는 것이고 이분폭은 하한을 주는 것이다. 화살표는 이것이 저것을 제한한다는 뜻이다>[원본 보기]

예제 144

완전 이진 트리망의 이분폭을 구하고, 위 정리가 주는 하한을 앞에서 얻은 정확한 값과 견주어라.

풀이 보기

무엇을 묻는가. 이분폭과 그것이 주는 하한이다.

이분폭은 1 이다. 뿌리에서 왼쪽 자식으로 가는 간선 하나만 끊으면 그래프가 두 조각으로 갈린다. 한 조각은 왼쪽 부분나무이고 잎이 N/2 개, 곧 입력 N/2 개와 출력 N/2 개를 담는다. 다른 조각은 뿌리와 오른쪽 부분나무이고 역시 잎이 N/2 개다. 정의가 요구하는 것은 각 조각에 입력이 절반 이상, 출력이 절반 이상 있는 것뿐이므로 조건을 만족한다. 간선을 하나도 끊지 않으면 갈리지 않으므로 1 이 최소다.

하한. 정리에 w=1 을 넣으면 간선 혼잡도가 (N/2)/1=N/2 이상이다.

실제 값. 앞의 예제에서 뒤집기 순열을 주면 경로 N 개가 모두 뿌리를 지났다. 그중 왼쪽 절반에서 출발한 N/2 개가 뿌리–왼쪽자식 간선을 올라가고, 오른쪽에서 출발해 왼쪽으로 가는 N/2 개가 같은 간선을 내려간다. 방향이 있으므로 두 방향의 간선은 다르고, 각 방향의 간선 혼잡도가 N/2 다. 하한이 정확히 맞았다.

답이 말이 되는가. 스위치 혼잡도 N 은 두 방향을 합친 값이므로 간선 혼잡도의 두 배다. 두 척도가 어긋나지 않는다. 그리고 여기서 얻은 하한은 "라우팅이 유일하다"를 쓰지 않았다. 선택의 자유가 있는 망에도 그대로 쓸 수 있다는 것이 이 척도의 값어치다.

망 설계 넷

이제 설계를 하나씩 재 본다.

완전 이분망 — 왜 이것으로 끝나지 않는가

가장 단순한 생각은 모든 입력 스위치를 모든 출력 스위치와 직접 잇는 것이다. 입력 스위치 N 개와 출력 스위치 N 개를 두고 그 사이에 간선 N2 개를 놓는다. 12장의 말로 하면 완전 이분 그래프이고, 실무에서는 크로스바(crossbar)라 부른다.

예제 145

완전 이분망의 지름·스위치 수·혼잡도·이분폭을 구하고, 왜 이것이 문제를 푼 것이 아닌지 말하라.

풀이 보기

지름. 입력 단말 → 입력 스위치 → 출력 스위치 → 출력 단말이므로 간선 세 개, 지름은 3 이다. N 과 무관하다.

스위치 수. 2N 개다.

혼잡도. 1 이다. 순열이므로 입력 스위치 i 를 지나는 경로는 Pi 하나뿐이고, 출력 스위치 j 를 지나는 경로는 Pπ1(j) 하나뿐이다.

이분폭. 입력 스위치 절반과 출력 스위치 절반을 한 조각에 넣으면, 그 조각의 입력에서 반대편 출력으로 가는 간선이 (N/2)2 개, 반대 방향도 (N/2)2 개이므로 N2/2 개를 끊어야 한다. 어떻게 나누어도 이만큼이므로 이분폭은 N2/2 다.

왜 답이 아닌가. 스위치 크기가 1×NN×1 이다. 앞에서 말한 괴물 스위치가 여기 있다. 게다가 간선이 N2 개다. N=1000 이면 선이 백만 개이고, 그 선을 실제 기판이나 방에 깔아야 한다.

답이 말이 되는가. 이분폭 정리가 이 사정을 정확히 회계한다. 혼잡도 1 을 얻으려면 이분폭이 N/2 이상이어야 하는데 이 망은 N2/2 를 썼다 — 필요한 것보다 N 배를 더 쓴 것이다. 그러니 "혼잡도 1 이면서 배선이 훨씬 적은 망"이 있을 여지가 남는다. 그것이 이 장 마지막의 베네시망이다.

2차원 배열 — 혼잡도를 거의 없앤다

경로는 행을 따라가다 목적지 열에서 아래로 꺾는다. 그래서 스위치 하나에 모일 수 있는 경로는 그 행에서 온 것과 그 열로 가는 것 둘뿐이다
<경로는 행을 따라가다 목적지 열에서 아래로 꺾는다. 그래서 스위치 하나에 모일 수 있는 경로는 그 행에서 온 것과 그 열로 가는 것 둘뿐이다>[원본 보기]

정의. 2차원 배열망(격자망)은 스위치를 N×N 격자로 놓고 오른쪽 이웃과 아래쪽 이웃으로 간선을 놓은 것이다. 입력 ii 행 왼쪽으로 들어오고 출력 jj 열 아래로 나간다.

예제 146

입력이 N 개인 2차원 배열망의 혼잡도가 정확히 2 임을 증명하라.

증명

뼈대는 이렇다. 상한은 라우팅을 하나 제시해서, 하한은 나쁜 순열을 하나 제시해서 얻는다. 혼잡도의 정의가 최소 다음 최대이므로 두 방향의 논증이 서로 다른 모양이 된다.

혼잡도가 2 이하다. 순열 π 가 무엇이든 다음 라우팅 P 를 쓴다 — 경로 Pii 행을 따라 오른쪽으로 π(i) 열까지 간 다음 그 열을 따라 아래로 내려간다. 그러면 ij 열의 스위치를 지날 수 있는 경로는 둘뿐이다. i 행에서 오른쪽으로 지나가는 경로 Pi, 그리고 j 열을 따라 내려가는 경로 Pπ1(j) 다. 다른 경로는 이 스위치에 올 수 없다. 행을 따라 가는 동안은 자기 행에만 있고 열을 따라 내려가는 동안은 자기 목적지 열에만 있기 때문이다. 그러므로 이 라우팅의 혼잡도는 2 이하이고, 모든 π 에 대해 그런 라우팅이 있으므로 망의 혼잡도도 2 이하다.

혼잡도가 2 이상이다. π(0)=0 이고 π(N1)=N1 인 순열을 잡고 왼쪽 아래 스위치 (N1,0) 을 보자. 입력 N1N1 행 왼쪽으로 들어오므로 PN1 의 첫 스위치가 (N1,0) 이다. 한편 출력 00 열 아래로 나가므로 P0 의 마지막 스위치가 (N1,0) 이다(간선이 오른쪽과 아래로만 있어 0 열에서 나가려면 0 열을 벗어난 적이 없어야 한다). 그러므로 어떤 라우팅에서도 두 경로가 이 스위치를 함께 지난다.

두 방향을 합치면 혼잡도는 정확히 2 다.

답이 말이 되는가. 트리의 N 에서 2 로 떨어졌다. 값을 치른 곳은 지름과 스위치 수다. 지름은 2N 이고 스위치는 N2 개다. N=1000 이면 백만 개다. N 이 작을 때는 단순하고 혼잡이 없어 매력적인 선택이다.

예제 147

2차원 배열망의 지름이 2N 임을 보여라.

풀이 보기

무엇을 묻는가. 가장 먼 입력·출력 짝 사이의 거리다.

입력 i 에서 출력 j 로 가는 최단경로의 길이를 세면, 단말에서 격자로 들어가는 간선 1 개, 0 열에서 j 열까지 오른쪽으로 j 개, i 행에서 N1 행까지 아래로 N1i 개, 격자에서 단말로 나가는 간선 1 개다. 모두 2+j+(N1i) 다.

이 값이 가장 커지는 것은 j=N1, i=0 일 때이고 2+(N1)+(N1)=2N 이다.

답이 말이 되는가. N=4 이면 8 이고 그림에서 in0 부터 out3 까지 세면 여덟 개다. 트리의 2logN+2 와 견주면 N=1024 에서 222048 다. 혼잡도를 얻는 대가로 지연을 백 배 가까이 치른 셈이다.

나비망 — 둘 사이의 타협

트리의 좋은 점(작은 지름, 적은 스위치)과 배열의 좋은 점(작은 혼잡도)을 함께 갖고 싶다. 나비망(butterfly)이 널리 쓰이는 타협안이다.

정의(재귀적). Fn 을 입력 스위치와 출력 스위치가 각각 N=2n 개인 나비망의 스위치와 배선이라 하자(단말은 뺀다). 9장의 재귀적 자료형과 같은 형식이다.

열을 하나 지날 때마다 목적지 행 번호의 한 비트가 정해진다. 그래서 갈림길이 없고 경로가 유일하다
<열을 하나 지날 때마다 목적지 행 번호의 한 비트가 정해진다. 그래서 갈림길이 없고 경로가 유일하다>[원본 보기]

그림에서 보듯 Fn 은 높이 2n 의 열 n+1 개로 놓인다. c 열의 r 행 스위치는 c+1 열의 r 행과 r 의 비트 하나를 뒤집은 행에 이어진다. 뒤집는 비트는 열마다 하나씩 옮겨 간다.

예제 148

입력이 N=2n 개인 나비망의 스위치 수가 N(log2N+1) 임을 재귀적 정의로부터 구조적 귀납법으로 증명하라.

증명

뼈대는 이렇다. 열의 높이는 두 배가 되고 열의 개수는 하나 늘어난다.

증명. P(n) 을 "Fn 은 높이 2n 인 열 n+1 개로 이루어진다"라 하고 n 에 대한 구조적 귀납법을 쓴다.

기저 단계. F1 은 입력 스위치 둘의 열과 출력 스위치 둘의 열, 곧 높이 21=2 인 열 2=1+1 개다.

귀납 단계. P(n) 을 가정하자. Fn+1Fn 두 벌을 위아래로 쌓고 왼쪽에 새 입력 열 하나를 붙인 것이다. 위아래로 쌓으면 열의 높이가 2n+2n=2n+1 이 되고 열의 개수는 그대로 n+1 이다. 새 열을 붙이면 열이 n+2 개가 되고 그 열의 높이도 2n+1 이다. 그러므로 P(n+1) 이 성립한다.

스위치 수는 열의 높이 곱하기 열의 개수이므로 2n(n+1) 이고, n=log2N 을 넣으면 N(log2N+1) 이다.

답이 말이 되는가. N=1024 이면 1024×11=11264 개다. 배열망은 같은 조건에서 10242106 개를 쓴다. 약 백 분의 일이다. 트리망의 2N1=2047 보다는 대여섯 배 많다.

예제 149

나비망에서 각 입력 스위치에서 각 출력 스위치로 가는 경로가 유일하고 길이가 모두 n 임을 증명하라. 그리고 그것으로 지름을 구하라.

증명

뼈대는 이렇다. 목적지가 위쪽 사본에 있는지 아래쪽 사본에 있는지가 첫 걸음을 결정하고, 나머지는 재귀다.

증명. n 에 대한 구조적 귀납법을 쓴다. F1 에서는 입력 둘과 출력 둘 사이에 간선이 하나씩 있으므로 경로가 유일하고 길이가 1 이다.

Fn+1 의 새 입력 스위치 u 에서 출력 스위치 v 로 가려 한다고 하자. u 에서 나가는 간선은 두 개인데 하나는 위쪽 Fn 으로, 하나는 아래쪽 Fn 으로 간다. v 는 두 사본 중 정확히 한 곳에 있고, 사본 사이에는 간선이 없으므로 첫 걸음이 강제된다. 그다음은 그 사본 안에서 v 로 가는 문제이고 귀납 가정에 의해 유일하며 길이가 n 이다. 그러므로 전체 경로가 유일하고 길이는 n+1 이다.

단말로 드나드는 간선 두 개를 더하면 지름은 n+2=log2N+2 다.

답이 말이 되는가. 트리망의 2logN+2 보다 절반쯤 낫다. 그리고 경로가 유일하므로 혼잡도를 최소로 하는 라우팅을 골라도 지연은 지름과 같다 — 고를 것이 없으니 그렇다. 배열망도 모든 경로 길이가 같아 같은 결론이 나온다. 반대로 베네시망에서는 선택이 있는데, 거기서도 모든 입력·출력 경로의 길이가 같아 이 문제가 생기지 않는다.

예제 150

나비망 Fn 의 혼잡도가 n 이 짝수일 때 N 임을 보여라.

증명

뼈대는 이렇다. 경로가 유일하므로 혼잡도는 "한 스위치에 닿을 수 있는 입력의 수"와 "그 스위치에서 닿을 수 있는 출력의 수" 중 작은 쪽이다.

준비. c 열의 스위치 v 를 보자. 왼쪽으로 거슬러 올라가면 열을 하나 지날 때마다 갈래가 둘로 늘어나므로 v 에 닿는 입력 스위치는 정확히 2c 개다. 오른쪽으로 내려가면 같은 이유로 v 에서 닿는 출력 스위치가 2nc 개다.

상한. v 를 지나는 경로는 "v 에 닿는 입력"에서 출발하고 "v 에서 닿는 출력"에 도착해야 한다. 라우팅 문제가 순열이므로 서로 다른 경로는 서로 다른 입력에서 출발하고 서로 다른 출력에 도착한다. 그러므로 v 를 지나는 경로는 min(2c,2nc) 개 이하다. c 를 어떻게 골라도 이 값은 2n/2=N 이하다(n 이 짝수이므로 c=n/2 에서 최대).

하한. c=n/2 열의 스위치 v 를 하나 잡는다. v 에 닿는 입력이 N 개, v 에서 닿는 출력이 N 개다. 그 입력들을 그 출력들로 보내는 순열을 만들면(나머지는 아무렇게나 잇는다) 경로가 유일하므로 그 N 개 경로가 모두 v 를 지난다.

그러므로 혼잡도는 정확히 N 이다. n 이 홀수면 같은 계산으로 N/2 가 나온다.

답이 말이 되는가. N=1024 이면 혼잡도가 32 다. 트리의 1024 보다 훨씬 낫고 배열의 2 보다는 나쁘다. 이름이 말하듯 타협이다. 성배는 아직 나오지 않았다.

베네시망 — 성배

1960년대에 벨 연구소의 바츨라프 베네시가 놀라운 생각을 했다. 나비망 둘을 등 맞대어 붙이면 혼잡도가 1 이 된다.

정의(재귀적). Bn 을 입력·출력 스위치가 각각 N=2n 개인 베네시망의 스위치와 배선이라 하자. 기저 B1F1 과 같다. 생성자는 Bn 두 벌에 새 입력 스위치 2n+1 개와 새 출력 스위치 2n+1를 붙이는 것이다. 입력 쪽 배선은 나비망과 똑같고, 출력 쪽도 거울처럼 같다 — 새 출력 스위치 jj+2n 은 두 Bn 사본의 j 번째 출력 스위치에 이어진다.

가운데 점선 상자 둘이 절반 크기의 베네시망이다. 첫 열에서 어느 상자로 보낼지 고를 수 있고, 그 선택 하나가 이 망의 힘이다
<가운데 점선 상자 둘이 절반 크기의 베네시망이다. 첫 열에서 어느 상자로 보낼지 고를 수 있고, 그 선택 하나가 이 망의 힘이다>[원본 보기]

열이 2n 개이므로 스위치는 2n2n=2Nlog2N 개이고, 스위치 사이 경로 길이는 모두 2n1 이므로 지름은 2log2N+1 이다. 나비망보다 스위치와 지름이 두 배가 되었다. 그 대가로 얻는 것이 다음 정리다.

증명에 쓸 보조정리를 먼저 세운다. 여기서 점과 선분으로 된 그림이 필요한데, 14장이 그것을 단순 그래프로 형식화한다. 지금 필요한 것은 두 문장뿐이므로 그 자리에서 확인하고 넘어간다.

예제 151

점 몇 개와 그 사이를 잇는 선분이 있고, 선분이 두 종류(점선과 실선)로 나뉘어 있다. 각 점에 점선이 한 개 이하, 실선이 한 개 이하 붙어 있다고 하자. 그러면 점들을 두 색으로 칠해 선분으로 이어진 두 점의 색이 언제나 다르게 할 수 있음을 증명하라.

증명

뼈대는 이렇다. 점마다 갈래가 종류별로 하나뿐이므로 점선·실선을 번갈아 따라가면 갈림길이 없다. 그러면 고리가 생겨도 짝수 길이다.

증명. 아직 색이 없는 점 a 를 하나 잡고 다음을 되풀이한다. a 에 첫째 색을 준다. a 의 점선 이웃이 있으면 그 이웃에 둘째 색을 주고, 그 이웃의 실선 이웃에 다시 첫째 색을 주고, 그다음 점선 이웃에 둘째 색을 주는 식으로 점선과 실선을 번갈아 따라가며 색을 준다. 반대 방향(a 의 실선 이웃부터)으로도 같이 한다.

이 따라가기에는 갈림길이 없다. 어떤 점에 점선으로 들어왔다면 다음은 실선으로 나가야 하는데 실선은 한 개 이하이므로 갈 곳이 정해진다. 그러므로 따라가기는 더 갈 곳이 없어 멈추거나, 이미 색을 준 점으로 돌아오거나 둘 중 하나로 끝난다.

돌아오는 경우를 보자. 되돌아온 점은 반드시 출발점 a 다. 다른 점 x 로 돌아왔다면 x 에는 같은 종류의 선분이 두 개 붙어 있어야 하는데(들어온 두 번의 종류가 같다) 가정에 어긋난다. 그리고 이 고리는 점선과 실선이 번갈아 나오므로 선분의 개수가 짝수다. 색은 한 칸마다 바뀌므로 짝수 걸음 뒤에는 처음 색으로 돌아오고, 따라서 a 에 준 색과 어긋나지 않는다.

점선과 실선이 같은 두 점을 잇는 경우(겹친 선)도 이 논증에 들어 있다. 그 두 점에는 다른 선분이 붙을 수 없고, 고리는 두 점을 왕복하는 길이 2 짜리다.

답이 말이 되는가. 요점은 "차수가 종류별로 제한되면 고리가 짝수가 된다"는 것이다. 14장에서 이 사실이 홀수 순환이 없는 그래프는 2색 칠할 수 있다는 정리로 일반화된다. 여기서는 특별한 경우를 손으로 확인한 것이다.

예제 152

입력이 N 개인 베네시망의 혼잡도가 1 임을 증명하라.

증명

뼈대는 이렇다. 첫 열에서 각 패킷을 위·아래 어느 부분망으로 보낼지만 정하면 된다. 그 결정이 앞 예제의 2색 칠하기다.

증명. N=2n 에 대해 P(n) 을 "Bn 의 혼잡도가 1 이다"라 하고 n 에 대한 귀납법을 쓴다.

기저 단계. B1=F1 이고 그 라우팅은 유일하며 혼잡도가 1 이다.

귀납 단계. P(n) 을 가정하고 Bn+1 에 임의의 순열 π 가 주어졌다고 하자. 패킷 0,,N1 을 점으로 놓고(N=2n+1) 두 종류의 선분을 긋는다.

E1::={{u,v}:|uv|=N/2},E2::={{u,w}:|π(u)π(w)|=N/2}

E1입력 쪽 제약이다. 새 입력 스위치 uu+N/2 는 다음 열의 같은 두 스위치에 이어져 있으므로, 두 패킷을 같은 부분망으로 보내면 그 스위치에서 부딪친다. E2출력 쪽 제약이다. 출력 jj+N/2 로 나갈 두 패킷은 마지막 열 직전의 같은 스위치에서 와야 하므로 서로 다른 부분망을 지나야 한다.

u 에는 E1 의 선분이 정확히 하나, E2 의 선분이 정확히 하나 붙는다. 그러므로 앞 예제에 의해 2색 칠하기가 존재한다.

첫째 색 패킷은 위쪽 부분망으로, 둘째 색 패킷은 아래쪽 부분망으로 보낸다. E1 의 각 선분에서 두 끝이 다른 색이므로 첫 열 다음에서 충돌이 없고, E2 의 각 선분에서도 그러므로 마지막 열 직전에서도 충돌이 없다. 각 부분망은 입력이 N/2 개이고 들어온 패킷들의 목적지도 서로 달라 다시 순열 문제가 되므로, 귀납 가정에 의해 혼잡도 1 로 라우팅할 수 있다.

그러므로 Bn+1 의 어떤 라우팅 문제도 혼잡도 1 로 풀린다.

답이 말이 되는가. 혼잡도가 1 이라는 것은 어떤 순열이 와도 스위치마다 패킷이 하나만 지나가게 배정할 수 있다는 뜻이다. 완전 이분망도 그랬지만 그것은 간선을 N2 개 썼다. 베네시망은 2Nlog2N 개의 스위치로 같은 일을 한다. 이분폭 정리가 요구하는 최소 N/2 을 실제로 채운 설계다.

점마다 점선 하나와 실선 하나뿐이므로 번갈아 따라가면 갈림길이 없고, 고리가 생기면 반드시 짝수 길이다
<점마다 점선 하나와 실선 하나뿐이므로 번갈아 따라가면 갈림길이 없고, 고리가 생기면 반드시 짝수 길이다>[원본 보기]

예제 153

N=8 인 베네시망에서 다음 순열을 혼잡도 1 로 라우팅하려 한다. 위 그림의 제약 그래프가 이 순열에 대한 것이다. 두 색으로 나눈 결과를 읽고 왜 그렇게 되는지 확인하라.

π(0)=1,π(1)=5,π(2)=4,π(3)=7,π(4)=3,π(5)=6,π(6)=0,π(7)=2

풀이 보기

무엇을 묻는가. 두 선분 집합을 실제로 구하고 색을 확인하는 일이다.

E1 (점선). |uv|=4 인 짝이므로 {0,4},{1,5},{2,6},{3,7} 이다.

E2 (실선). 출력 번호가 4 만큼 떨어진 짝을 찾아 그 패킷을 잇는다. 출력 04 로 가는 패킷은 62 이므로 {2,6}. 출력 15 는 패킷 01 이므로 {0,1}. 출력 26 은 패킷 75 이므로 {5,7}. 출력 37 은 패킷 43 이므로 {3,4} 이다.

따라가기. 0 에서 시작한다. 점선으로 4, 실선으로 3, 점선으로 7, 실선으로 5, 점선으로 1, 실선으로 0 — 여섯 걸음에 제자리다. 짝수이므로 번갈아 칠할 수 있다.

0 위, 4 아래, 3 위, 7 아래, 5 위, 1 아래.

남은 26 은 점선과 실선이 둘 다 이 둘을 잇는 겹친 선이다. 다른 선분이 붙을 수 없으므로 2 위, 6 아래로 하면 끝난다.

답이 말이 되는가. 위쪽 부분망으로 갈 패킷은 {0,3,5,2} 로 네 개, 아래쪽은 {4,7,1,6} 로 네 개다. 각 부분망의 입력이 정확히 4 개씩이 된 것이 우연이 아니다. E1 이 완벽한 짝짓기여서 각 짝의 한쪽씩이 갈라지기 때문이다. 이제 남은 두 문제는 크기 4 짜리 베네시망 라우팅이고, 같은 절차를 한 번 더 하면 끝난다.

표 하나 — 이 장의 결론

N 은 입력(과 출력) 개수이고 로그는 밑이 2 다.

지름스위치 크기스위치 수혼잡도
완전 이진 트리2logN+23×32N1N
완전 이분(크로스바)31×N2N1
2차원 배열2N2×2N22
나비망logN+22×2N(logN+1)N 또는 N/2
베네시망2logN+12×22NlogN1

표를 읽는 법이 이 장의 결론이다. 완전 이진 트리는 지름과 스위치 수가 좋지만 혼잡도가 최악이다. 완전 이분망은 지름과 혼잡도가 좋지만 스위치 크기가 N 에 비례해 규칙을 어겼다. 2차원 배열은 혼잡도가 좋지만 스위치를 N2 개 쓴다. 나비망은 어느 칸도 최악이 아니지만 어느 칸도 최선이 아니다. 베네시망은 작은 스위치만 쓰면서 지름이 로그이고 혼잡도가 1 이다.

그 대신 베네시망에는 앞의 셋에 없던 부담이 하나 있다. 라우팅을 계산해야 한다. 트리·배열·나비망은 경로가 유일하거나 규칙 한 줄로 정해지지만, 베네시망에서 혼잡도 1 을 얻으려면 순열마다 2색 칠하기를 풀어야 한다. 좋은 성질은 언제나 어딘가에서 값을 치른다.

오류 찾기

다음 "증명"은 결론이 거짓이다. 어느 단계가 틀렸는가.

가짜 정리. 모든 스위치가 3×3 인 망의 혼잡도는 3 이하다.

  1. 스위치 v 를 지나는 경로는 v 로 들어오는 간선 중 하나를 통해 들어온다.
  2. v 로 들어오는 간선은 3 개다.
  3. 그러므로 v 를 지나는 경로는 3 개 이하다.
  4. 모든 스위치에 대해 그러므로 망의 혼잡도는 3 이하다.
풀이 보기

먼저 반례를 확인한다. 완전 이진 트리망은 스위치가 대부분 3×3 인데 혼잡도가 N 이다. N=1024 이면 1024 이고 3 과 거리가 멀다.

틀린 단계는 3번이다. 1번과 2번은 맞다. 3번은 "간선 하나에 경로가 하나뿐"이라고 조용히 가정했다. 그런 규칙은 어디에도 없다. 혼잡도는 시간이 아니라 개수를 재는 양이다. 경로 100 개가 같은 간선을 지날 수 있고, 그 뜻은 그 선으로 패킷 100 개가 차례로 지나간다는 것뿐이다. 오래 걸릴 뿐 불가능하지 않다.

바르게 말하면 이렇다. 간선 혼잡도가 1 이라면 3번이 성립하고 스위치 혼잡도는 3 이하가 된다. 그런데 간선 혼잡도가 1 이라는 것은 이미 목표 자체이지 가정이 아니다. 순환 논증이다.

이 함정이 흔한 까닭은 그림에서 간선을 "한 번에 하나만 지나가는 관"으로 느끼기 쉽기 때문이다. 이분폭 정리를 다시 보면 정반대의 이야기를 한다 — 간선이 적으면 그 위에 경로가 겹겹이 쌓인다. 그래서 혼잡도의 하한이 나왔다.

이 장에서 새로 나온 것

기호·용어
단말 · 스위치 · 패킷패킷이 드나드는 곳 · 패킷을 넘겨주는 장치 · 크기가 정해진 자료 덩어리
라우팅 문제 π[0..N) 위의 순열. 입력 i 의 패킷은 출력 π(i) 로 가야 한다
라우팅 P경로의 모음 {Pi}. Pi 는 입력 i 에서 출력 π(i) 로 가는 경로
지름입력·출력 사이 최단경로 길이의 최댓값 = 최악의 지연
스위치 크기 a×b들어오는 간선 a 개, 나가는 간선 b 개. 이것을 고정하지 않으면 문제가 사라진다
혼잡도가장 나쁜 순열에 대해 가장 좋은 라우팅을 골랐을 때 한 스위치에 몰리는 경로 수. 최소 다음 최대
간선 혼잡도한 간선을 지나는 경로 수의 최댓값. 스위치 혼잡도 이하다
이분폭입력 절반과 출력 절반을 떼어내려면 끊어야 하는 최소 간선 수
이분폭 하한간선 혼잡도 (N/2)/w. 비둘기집 원리로 얻는다
완전 이진 트리망잎마다 입력·출력 단말. 지름 2logN+2, 혼잡도 N
완전 이분망(크로스바)입력 스위치와 출력 스위치를 전부 잇는다. 혼잡도 1 이지만 스위치 크기 1×N
2차원 배열망N×N 격자. 혼잡도 2, 그러나 스위치 N2
나비망 Fn재귀적 정의. 열 n+1 개, 경로 유일, 혼잡도 N
베네시망 Bn나비망 둘을 등 맞댄 것. 열 2n 개, 혼잡도 1
제약 그래프와 2색 칠하기종류별 차수가 1 이하이면 고리가 짝수라 2색 칠할 수 있다. 14장에서 일반화된다

챙겨 갈 것은 넷이다.

마지막 항목이 다음 장으로 이어진다. 이 장에서 급히 만들어 쓴 "점과 선분 그림"을 14장에서 단순 그래프로 제대로 정의하고, 2색 칠하기를 채색수의 특별한 경우로 다룬다. 그리고 여기서 잠깐 나온 "짝짓기"가 14장의 매칭이 되어 이 블록의 가장 큰 정리인 홀의 정리로 이어진다.

단순 그래프

12장의 방향 그래프는 "한쪽으로만 흐르는" 관계를 적는 도구였다. 그런데 세상의 많은 관계는 서로 마주보는 것이다. 결혼했다, 같은 말을 쓴다, 시간이 겹친다, 전선으로 이어져 있다 — 이런 관계에는 방향이 없다. 그것을 적는 것이 단순 그래프다.

그러므로 이 장은 새 소재가 아니라 12장에서 방향을 지운 자리다. 같은 말을 다시 정의하지 않는다. 대신 "방향을 지우면 무엇이 달라지는가"를 먼저 정리하고, 방향이 없을 때만 성립하는 정리들로 넘어간다.

이 장에서 답할 것은 셋이다. 짝을 지을 수 있는지 어떻게 아는가(홀의 정리 — 이 장의 산이다). 몇 가지 색이 있으면 충분한가(채색수). 순환이 없는 연결 그래프는 왜 특별한가(나무). 그 앞에 어휘를 세우는 절이 셋 붙는다.

알고리즘 문서가 /posts/fundamental/algorithm.html > 그래프 용어/posts/fundamental/algorithm.html > 그래프 탐색, /posts/fundamental/algorithm.html > 연결 요소와 이분 그래프, /posts/fundamental/algorithm.html > 크루스칼/posts/fundamental/algorithm.html > 프림을 다뤘다. 여기서는 알고리즘을 되풀이하지 않고 구조 정리를 증명한다.

방향을 지운다

정의. 단순 그래프(simple graph) G 는 공집합이 아닌 정점 집합 V(G)간선 집합 E(G) 로 이루어진다. 간선은 서로 다른 두 정점 uv끝점(endpoint)으로 갖고 방향이 없다. 두 원소 집합 {u,v} 로 적을 수 있고, 이 문서는 uv 로 적는다. uvvu같은 간선이다.

정의에 담긴 제약이 둘 있다. 같은 두 정점 사이에 간선이 둘 이상 있을 수 없고, 자기 고리도 없다. 그래서 "단순"이다. 이 장에서 "그래프"는 단순 그래프를 뜻한다.

차수가 하나로 합쳐지고 자기 고리가 사라진다. a b a 는 방향 그래프에서 순환이었지만 여기서는 같은 간선을 왕복한 것이라 순환으로 세지 않는다
<차수가 하나로 합쳐지고 자기 고리가 사라진다. a b a 는 방향 그래프에서 순환이었지만 여기서는 같은 간선을 왕복한 것이라 순환으로 세지 않는다>[원본 보기]

정의. 같은 간선의 두 끝점인 두 정점을 인접(adjacent)하다고 하고, 간선은 자기 끝점에 붙어 있다(incident)고 한다. 정점 v 에 붙어 있는 간선의 수를 v차수(degree) deg(v) 라 한다. 자기 고리가 없으므로 차수는 v 에 인접한 정점의 수와 같다.

12장의 용어가 어떻게 옮겨지는지 표로 적어 둔다.

12장 (방향 그래프)14장 (단순 그래프)
uv — 꼬리와 머리가 있다uv — 끝점 둘이 대등하다
indeg(v)outdeg(v)deg(v) 하나
자기 고리 허용자기 고리 없음
길이 1 · 2 인 순환이 있다순환은 길이 3 이상
dist(u,v)dist(v,u) 가 다를 수 있다거리가 대칭이다
차수 합 indeg(v)=|E|차수 합 deg(v)=2|E|

마지막 줄이 이 절의 정리다.

악수 보조정리(Handshaking Lemma). 그래프의 모든 정점의 차수를 더하면 간선 수의 두 배다.

증명. 간선 하나가 차수 합에 기여하는 양은 정확히 2 다 — 자기 두 끝점에서 각각 1 씩이다. 간선이 |E(G)| 개이므로 합은 2|E(G)| 다.

이름은 파티에서 온다. 각 사람이 악수한 횟수를 모두 더하면 악수의 총수의 두 배다. 악수 한 번에 두 사람이 손을 내밀기 때문이다. 12장에서는 간선마다 머리가 하나라 합이 |E| 였는데, 방향을 지우면 끝점이 둘 다 세어져 2|E| 가 된다.

예제 155

모든 그래프에서 차수가 홀수인 정점의 개수는 짝수임을 증명하라. 그리고 파티에서 이것이 무슨 말인지 옮겨라.

증명

뼈대는 이렇다. 홀수를 여러 개 더해 짝수가 되려면 개수가 짝수여야 한다.

증명. 정점을 차수가 짝수인 것과 홀수인 것으로 나눈다. 악수 보조정리에 의해

v:deg(v) 짝수deg(v)+v:deg(v) 홀수deg(v)=2|E(G)|

오른쪽은 짝수이고 첫 합은 짝수를 더한 것이므로 짝수다. 그러면 둘째 합도 짝수여야 한다. 홀수를 k 개 더한 것이 짝수이려면 k 가 짝수다(홀수 두 개를 더하면 짝수, 짝수에 홀수를 더하면 홀수이므로 k 에 대한 귀납법으로 곧 나온다).

파티로 옮기면 "악수를 홀수 번 한 사람의 수는 반드시 짝수다"가 된다. 어떤 파티에서도 그렇다. 홀수 번 악수한 사람이 정확히 한 명인 파티는 있을 수 없다.

예제 156

어떤 조사에서 "남성이 이성 상대를 평균적으로 여성보다 훨씬 많이 사귄다"는 결과가 나왔다고 하자. 그래프로 이 주장을 검토하라. 남성 집합을 M, 여성 집합을 F 라 하고 이성 관계가 있었던 짝만 간선으로 둔다.

증명

뼈대는 이렇다. 간선의 한쪽 끝은 반드시 M 에, 다른 쪽 끝은 반드시 F 에 있다. 그러면 두 집합의 차수 합이 같아야 한다.

증명. 간선마다 끝점이 M 에 하나, F 에 하나이므로 M 쪽 차수의 합은 간선 수와 같고 F 쪽도 그렇다. 그러므로

xMdeg(x)=yFdeg(y)

양변을 |M||F| 로 나누면

(xMdeg(x)|M|)1|F|=(yFdeg(y)|F|)1|M|

괄호 안이 각각 M 의 평균 차수와 F 의 평균 차수다. 정리하면

(M 의 평균)=|F||M|(F 의 평균)

결론. 두 평균의 비는 인구 비 |F|/|M| 하나로 정해진다. 사람들의 행동과는 아무 상관이 없다. 여성이 남성보다 3.5% 많은 인구라면 남성의 평균이 3.5% 클 수밖에 없다. 그러므로 "훨씬 많다"는 결과는 그 자체로 조사가 틀렸다는 뜻이다.

답이 말이 되는가. 왜 이런 일이 벌어지는지 말로 옮기면 이렇다. 관계의 총수는 양쪽에서 같은데 한쪽 인구가 적으면 그쪽의 1인당 값이 클 수밖에 없다. 같은 착오가 다른 곳에서도 나온다 — "소수 집단의 학생이 다수 집단의 학생과 함께 공부하는 비율이 그 반대보다 높다"는 조사 결과는 놀라운 현상이 아니라 "소수"라는 말의 뜻이다.

자주 쓰는 그래프와 동형사상

완전 그래프와 빈 그래프가 양 극단이고 순환·경로·초입방체가 그 사이의 규칙적인 것들이다. 초입방체에서 인접은 비트 하나가 다른 것이다
<완전 그래프와 빈 그래프가 양 극단이고 순환·경로·초입방체가 그 사이의 규칙적인 것들이다. 초입방체에서 인접은 비트 하나가 다른 것이다>[원본 보기]

이름이 붙은 그래프 몇 개를 세워 둔다. 정점이 n 개인 완전 그래프 Kn 은 모든 두 정점이 인접한 것이고 간선이 n(n1)/2 개다. 빈 그래프는 간선이 없는 것이다. 경로 그래프 Pn 은 정점 n 개를 한 줄로 이은 것이고(원서는 Ln 으로 적는다), 여기에 양 끝을 잇는 간선을 더한 것이 길이 n 순환 그래프 Cn 이다(n3). 완전 이분 그래프 Km,n 은 정점을 m 개와 n 개로 나누고 다른 편끼리 모두 이은 것이다.

정의. 초입방체 Qn 은 정점이 길이 n 인 비트 문자열 전부이고, 비트 하나만 다른 두 문자열이 인접한 그래프다. 정점이 2n 개, 차수가 모두 n, 간선이 n2n1 개다.

예제 157

Qn 의 간선 수가 n2n1 임을 악수 보조정리로 구하라. 그리고 Qn 의 지름을 구하고, 13장의 어느 이야기와 이어지는지 말하라.

풀이 보기

무엇을 묻는가. 간선 수와 지름이다.

간선 수. 정점이 2n 개이고 차수가 모두 n 이므로 차수 합이 n2n 이다. 악수 보조정리에 의해 이것이 2|E| 이므로 |E|=n2n1 이다.

지름. 두 비트 문자열 u, v 사이의 거리는 다른 비트의 개수다. 서로 다른 비트를 하나씩 고쳐 나가면 그 수만큼의 걸음으로 갈 수 있고, 한 걸음에 비트 하나만 바뀌므로 그보다 짧게는 갈 수 없다. 가장 먼 짝은 모든 비트가 다른 것이고 거리가 n 이다. 그러므로 지름은 n=log2|V| 다.

답이 말이 되는가. 정점이 2n 개인데 지름이 n 이다. 13장의 나비망도 같은 성질이었고 실제로 이유가 같다 — 열을 하나 지날 때마다 목적지의 비트 하나를 맞추는 것이 나비망의 라우팅이었다. 초입방체는 그 규칙을 그래프 자체로 굳힌 것이라, 병렬 컴퓨터의 배선으로 실제로 쓰인다.

그림이 달라도 같은 그래프일 수 있다. 그 뜻을 정확히 적어야 한다 — 정점의 이름과 그림의 좌표를 지우고 "무엇이 무엇과 이어져 있는가"만 남겼을 때 같다는 것이다. 6장의 전단사가 그 "이름 바꾸기"를 맡는다.

정의. 그래프 GH 사이의 동형사상(isomorphism)은 전단사 f:V(G)V(H) 로서

uvE(G)f(u)f(v)E(H)

를 모든 u,vV(G) 에 대해 만족하는 것이다. 그런 f 가 있으면 두 그래프가 동형이라 한다.

왼쪽 둘은 같은 그래프를 다르게 그린 것이다. 아래 둘은 차수 목록이 달라 동형이 될 수 없다
<왼쪽 둘은 같은 그래프를 다르게 그린 것이다. 아래 둘은 차수 목록이 달라 동형이 될 수 없다>[원본 보기]

동형사상의 역함수도 동형사상이고 동형사상의 합성도 동형사상이므로 동형은 동치관계다(12장의 뜻으로). 그리고 동형사상이 지키는 성질을 동형 불변량이라 한다. 정점 수, 간선 수, 차수 목록, 순환의 길이 목록, 연결 여부가 모두 그렇다.

예제 158

다음 성질 중 동형으로 보존되는 것을 고르고, 보존되지 않는 것은 왜 아닌지 말하라. (가) 모든 정점을 지나는 순환이 있다. (나) 정점에 1 부터 7 까지 번호가 붙어 있다. (다) 정점에 1 부터 7 까지 번호를 붙일 수 있다. (라) 어느 간선을 지워도 모든 두 정점 사이에 경로가 있다. (마) 두 간선의 길이가 같다.

풀이 보기

무엇을 묻는가. 성질이 "간선 관계만으로" 적히는지다. 동형사상은 정점의 이름과 그림의 모양을 지우고 인접 관계만 남기므로, 인접 관계만으로 적히는 성질은 보존되고 그 밖의 것에 기대는 성질은 보존되지 않는다.

(가) 보존된다. 순환은 인접 관계로 적히고, 동형사상은 순환을 순환으로 옮긴다.

(나) 보존되지 않는다. 정점이 무엇인지에 기댄다. 정점이 사람 이름인 동형 그래프를 만들면 이 성질이 깨진다.

(다) 보존된다. "번호를 붙일 수 있다"는 "정점이 일곱 개다"와 같은 말이고, 전단사가 있으므로 정점 수는 보존된다.

(라) 보존된다. "연결되어 있고 자른 간선이 없다"는 말이고 인접 관계로 적힌다.

(마) 보존되지 않는다. 간선에 길이라는 것이 아예 없다. 그림에서 잰 길이는 그림의 성질이고 그래프의 성질이 아니다.

답이 말이 되는가. 갈림의 기준을 한 문장으로 하면 "정점의 이름과 그림의 좌표를 지워도 남는 말인가"다. 그래서 그래프 이론은 "동형으로 보존되는 성질을 연구하는 학문"이라고 말해도 된다. 덧붙여, 두 그래프가 동형인지 판정하는 효율적인 절차는 아직 아무도 못 찾았다. 그렇다고 어렵다는 증명도 없어서, /posts/fundamental/algorithm.html > P와 NP에서 가장 유명한 미결 문제 중 하나다.

이분 그래프와 매칭

정의. 정점을 두 블록 L(G)R(G) 로 나눌 수 있어서 모든 간선이 한쪽 끝을 L(G) 에, 다른 쪽 끝을 R(G) 두는 그래프를 이분 그래프(bipartite graph)라 한다. 앞의 성 관계 그래프가 그 예이고, 13장에서 급히 그린 제약 그래프도 2색으로 칠렸으므로 이분 그래프였다.

정의. 그래프 G매칭(matching)은 간선의 부분집합 ME(G) 로서 어느 두 간선도 같은 정점에 붙어 있지 않은 것이다. M 의 간선에 붙어 있는 정점들이 M 에 의해 덮인다고 하고, V(G) 전부를 덮는 매칭을 완벽 매칭이라 한다.

정의. 정점 집합 SV(G)이웃N(S)::={r:srE(G) 인 sS 가 있다} 다. 6장의 말로 하면 간선 관계에 의한 S이다. |S|>|N(S)|S병목(bottleneck)이라 한다.

왼쪽의 굵은 간선 넷이 매칭이다. 오른쪽에서는 세 사람이 일자리 둘만 할 수 있으므로 매칭이 있을 수 없다
<왼쪽의 굵은 간선 넷이 매칭이다. 오른쪽에서는 세 사람이 일자리 둘만 할 수 있으므로 매칭이 있을 수 없다>[원본 보기]

이제 이 장의 산이다.

홀의 정리(Hall). 이분 그래프 G 에서 L(G) 를 덮는 매칭이 있는 것과 L(G) 의 부분집합 중 병목이 하나도 없는 것은 같다.

한쪽은 쉽다. 매칭이 있으면 S 의 각 원소가 자기 짝을 갖고 그 짝들이 서로 다르므로 |N(S)||S| 다. 놀라운 것은 이다. 병목이 없다는 조건은 부분집합 하나하나에 대한 조건이라 확인할 대상이 지수 개나 된다. 그런데도 그 조건만으로 매칭의 존재가 나온다.

예제 159

병목이 있으면 L(G) 를 덮는 매칭이 없음을 증명하라(쉬운 방향).

증명

뼈대는 이렇다. 매칭은 S 에서 N(S) 로 가는 단사함수를 준다.

증명. L(G) 를 덮는 매칭 M 이 있다고 하고 SL(G) 를 아무렇게나 잡자. ML(G) 를 덮으므로 각 sS 에는 M 의 간선이 정확히 하나 붙어 있고, 그 간선의 다른 끝점을 m(s) 라 하자. m(s)s 와 인접하므로 m(s)N(S) 다.

m단사다. m(s)=m(s) 이면 M 의 두 간선이 같은 정점에 붙어 있으므로 매칭의 정의에 의해 그 두 간선은 같고, 따라서 s=s 이다.

단사함수 m:SN(S) 가 있으므로 6장의 사상 규칙에 의해 |S||N(S)| 다. 그러므로 병목이 아니다. 대우를 취하면 병목이 있으면 매칭이 없다.

답이 말이 되는가. 그림의 오른쪽에서 확인해 보자. S={p,q,r} 이고 N(S)={1,2} 이므로 세 사람을 두 일자리에 단사로 보낼 수 없다 — 비둘기집 원리다. 홀의 정리의 쉬운 방향은 비둘기집 원리를 다시 쓴 것이다.

여유가 있으면 아무나 하나 짝지어 보내고, 여유가 없으면 꽉 찬 덩어리를 통째로 떼어낸다. 경우 2 에서 문제가 둘로 쪼개지므로 강한 귀납법이 필요하다
<여유가 있으면 아무나 하나 짝지어 보내고, 여유가 없으면 꽉 찬 덩어리를 통째로 떼어낸다. 경우 2 에서 문제가 둘로 쪼개지므로 강한 귀납법이 필요하다>[원본 보기]

예제 160

홀의 정리의 어려운 방향을 증명하라. 곧 L(G) 의 부분집합 중 병목이 하나도 없으면 L(G) 를 덮는 매칭이 있다는 것을.

증명

뼈대는 이렇다. 지원자 한 명을 짝지어 보내고 남은 문제에 귀납법을 쓰고 싶다. 그런데 여유가 없는 덩어리가 있으면 함부로 보내면 안 되므로, 그 경우에는 덩어리를 통째로 떼어낸다. 문제가 둘로 쪼개지므로 강한 귀납법이어야 한다.

편의상 L(G) 를 지원자 집합, R(G) 를 일자리 집합이라 부른다.

증명. m=|L(G)| 에 대한 강한 귀납법을 쓴다. 명제 P(m) 은 "지원자가 m 명이고 병목이 없으면 지원자 전부를 덮는 매칭이 있다"다.

기저 단계 (m=1). 병목이 없다는 것은 |N({s})|1, 곧 그 한 명이 할 수 있는 일이 하나라도 있다는 뜻이다. 그것과 짝지으면 끝난다.

귀납 단계. |L(G)|=m+12 이라 하고 P(1),,P(m) 을 가정한다. 두 경우로 나눈다.

경우 1 — 크기가 m 이하인 공집합 아닌 모든 부분집합 S|N(S)|>|S| 를 만족한다. 지원자 한 명 s 를 아무렇게나 골라 그가 할 수 있는 일 하나와 짝짓고 둘을 함께 빼낸다. 남은 그래프에서 어떤 부분집합 S 의 이웃은 많아야 하나 줄었는데(빼낸 일자리 하나뿐이다) 원래 |N(S)||S|+1 이었으므로 여전히 |N(S)||S| 다. 곧 병목이 새로 생기지 않는다. 남은 지원자가 m 명이므로 P(m) 에 의해 매칭이 있고, 방금 만든 짝을 더하면 m+1 명의 매칭이다.

경우 2 — 크기가 m 이하인 공집합 아닌 어떤 부분집합 X|N(X)|=|X| 를 만족한다. Y::=N(X) 라 하자. X 안에서도 병목이 없으므로(X 의 부분집합은 L(G) 의 부분집합이다) |X|m 이고 강한 귀납 가정에 의해 XY 에 짝지을 수 있다. |Y|=|X| 이므로 이 매칭은 Y 도 다 쓴다.

남은 문제는 L(G)XR(G)Y 에 짝짓는 것이다. 여기에도 병목이 없다. 만약 ML(G)XR(G)Y 안에서 자기보다 작은 이웃만 가졌다고 하자. 그러면

N(MX)=(N(M)(R(G)Y))Y

이므로 |N(MX)|<|M|+|X|=|MX| 이고(MX 는 서로소다), 이는 MX 가 원래 그래프의 병목이라는 뜻이어서 가정에 어긋난다.

남은 지원자는 m+1|X|m 명이므로 강한 귀납 가정에 의해 매칭이 있고, 두 매칭을 합치면 m+1 명 전부의 매칭이다. 두 매칭은 쓰는 일자리가 서로소이므로 합쳐도 매칭이다.

두 경우 모두 P(m+1) 이 성립한다.

답이 말이 되는가. 어디에서 강한 귀납법이 필요했는지 확인해 두자. 경우 2 에서 문제가 크기 |X|m+1|X| 로 쪼개진다. 두 조각 다 m 보다 작지만 어느 쪽도 "하나 작은 것"이 아니다. 그래서 보통 귀납법으로는 안 되고 7장의 강한 귀납법이 필요하다.

그리고 경우 나누기의 이유도 확인해 두자. 경우 1 에서 "아무나 골라도 된다"고 말할 수 있었던 근거는 모든 부분집합에 여유가 하나 이상 있다는 것이었다. 여유가 없는 덩어리가 있으면 바깥 사람이 그 덩어리의 일자리를 가져가 버릴 수 있으므로 함부로 고를 수 없다. 그래서 그 덩어리를 먼저 처리한다.

병목이 없음을 확인하려면 부분집합을 다 보아야 하는데, 실제로는 그럴 필요가 없는 손쉬운 조건이 있다.

정의. 이분 그래프가 차수 제한(degree-constrained)이라는 것은 어떤 정수 d1 이 있어서 모든 L(G) 와 모든 rR(G) 에 대해 deg()ddeg(r) 인 것이다. 곧 왼쪽 차수가 오른쪽 차수보다 작지 않다.

예제 161

차수 제한 이분 그래프에는 L(G) 를 덮는 매칭이 있음을 증명하라. 그리고 정규 그래프(모든 차수가 같은 그래프)인 이분 그래프에는 완벽 매칭이 있음을 보여라.

증명

뼈대는 이렇다. S 에 붙은 간선을 두 번 센다 — 왼쪽에서 세면 많고 오른쪽에서 세면 적다.

증명. SL(G) 를 잡고 DSS 의 어떤 원소에 붙어 있는 간선 전체라 하자.

왼쪽에서 세면, S 의 각 정점에 간선이 d 개 이상 붙어 있으므로

|DS|d|S|

오른쪽에서 세면, DS 의 모든 간선은 다른 끝점이 N(S) 에 있고 N(S) 의 각 정점에 간선이 d 개 이하 붙어 있으므로

|DS|d|N(S)|

두 부등식을 이으면 d|S|d|N(S)| 이고 d1 이므로 나누어 |S||N(S)| 다. 병목이 없으므로 홀의 정리에 의해 매칭이 있다.

정규 이분 그래프. 모든 차수가 같은 값 d 이면 deg()ddeg(r) 이 저절로 성립하므로 L(G) 를 덮는 매칭이 있다. 그런데 악수 보조정리를 양쪽에 쓰면 d|L(G)|=|E|=d|R(G)| 이므로 |L(G)|=|R(G)| 이고, L(G) 를 덮는 매칭이 오른쪽도 전부 덮는다. 곧 완벽 매칭이다.

답이 말이 되는가. 앞 그림의 왼쪽 그래프가 d=2 로 차수 제한이었다 — 지원자 차수가 모두 2 이고 일자리 차수가 모두 2 이하였다. 그래서 부분집합을 하나도 확인하지 않고 매칭의 존재를 알 수 있었다. 확인할 것이 지수 개에서 차수 두 개로 줄어든 것이 이 따름정리의 값어치다.

예제 162

카드 한 벌 52 장을 13 장씩 네 묶음으로 아무렇게나 나누었다. 각 묶음에서 한 장씩 뽑아 네 장의 숫자가 모두 다르게 할 수 있는가? (숫자는 A, 2, …, K 로 열세 가지다.)

증명

뼈대는 이렇다. 묶음과 숫자를 양쪽에 두는 이분 그래프를 만들고 차수를 센다. 그런데 원하는 것은 "한 장씩"이 아니라 "열세 번 되풀이"이므로 매칭을 여러 번 찾아야 한다.

그래프. 왼쪽은 묶음 넷, 오른쪽은 숫자 열셋. 묶음 b 에 숫자 k 인 카드가 하나라도 있으면 bk 를 간선으로 둔다.

차수 제한인가. 왼쪽 차수는 그 묶음에 나오는 서로 다른 숫자의 개수다. 카드가 13 장이고 같은 숫자는 많아야 4 장이므로 서로 다른 숫자가 적어도 13/4=4 가지다. 곧 왼쪽 차수는 4 이상이다. 오른쪽 차수는 그 숫자가 나오는 묶음의 수이므로 많아야 4 다. 그러므로 d=4 로 차수 제한이다.

앞 예제에 의해 왼쪽을 덮는 매칭이 있다. 곧 네 묶음에 서로 다른 숫자를 하나씩 배정할 수 있고, 그 숫자의 카드를 각 묶음에서 한 장씩 뽑으면 된다.

답이 말이 되는가. 더 물어볼 것이 있다. 이 일을 열세 번 되풀이해 카드를 모두 쓸 수 있는가? 뽑은 카드 네 장을 빼면 각 묶음이 12 장이 되고, 서로 다른 숫자가 적어도 12/4=3 가지, 오른쪽 차수는 여전히 4 이하이므로 이번에는 차수 제한이 아니다. 이 방법으로는 곧바로 이어지지 않는다.

그래도 답은 "된다"이고, 보는 법은 이렇다. 각 묶음을 왼쪽 정점 13 개로, 각 숫자의 카드 네 장을 오른쪽 정점으로 놓지 말고, 묶음과 숫자를 정점으로 두고 카드 한 장마다 간선을 하나 두는 그래프를 생각한다. 그러면 왼쪽 차수가 모두 13, 오른쪽 차수가 모두 4 다. 이제 그래프에 겹친 간선이 있어 단순 그래프가 아니지만 매칭 이야기는 그대로 되고, 매칭을 하나 찾아 그 간선들을 지우면 차수가 각각 123 으로 줄어 같은 논증을 되풀이할 수 있다. 열세 번 되풀이하면 카드가 다 없어진다.

색칠

시험 시간표를 짜야 한다. 같은 학생이 듣는 두 과목의 시험을 같은 시간에 둘 수 없다. 시간대는 적을수록 좋다. 이것이 그래프 문제다 — 과목을 정점으로, 함께 듣는 학생이 있는 두 과목을 간선으로 두고, 시간대를 이라 하면 된다.

정의. 그래프의 색칠은 각 정점에 색을 배정하는 것으로서 인접한 두 정점의 색이 다른 것이다. k 가지 이하의 색으로 색칠이 있으면 k-색칠 가능하다고 하고, 색칠에 필요한 최소 색 수를 채색수 χ(G) 라 한다.

왼쪽은 삼각형이 둘 있어 2색으로는 안 되고 3색으로 끝난다. 오른쪽은 최대 차수가 6 인데도 2색으로 끝나므로 차수 한계가 아주 느슨할 수 있음을 보인다
<왼쪽은 삼각형이 둘 있어 2색으로는 안 되고 3색으로 끝난다. 오른쪽은 최대 차수가 6 인데도 2색으로 끝나므로 차수 한계가 아주 느슨할 수 있음을 보인다>[원본 보기]

곧 나오는 값 몇 개를 적어 둔다. χ(Kn)=n 이다(어느 두 정점도 같은 색일 수 없다). 짝수 길이 순환은 χ=2, 홀수 길이 순환은 χ=3 이다. 그리고 간선이 있는 그래프가 이분 그래프인 것과 χ(G)=2 인 것은 같은 말이다 — 한 색을 왼쪽, 다른 색을 오른쪽으로 삼으면 되고 거꾸로도 그렇다.

정리. 최대 차수가 Δ 이하인 그래프는 (Δ+1)-색칠 가능하다.

예제 163

위 정리를 증명하라. 귀납법을 무엇에 대해 걸어야 하는지도 밝혀라.

증명

뼈대는 이렇다. 정점 하나를 떼어내고 색칠한 뒤 되붙인다. 되붙일 때 이웃이 Δ 개 이하이고 색이 Δ+1 가지이므로 남는 색이 반드시 있다.

귀납법을 무엇에 걸까. Δ 에 대해 걸면 안 된다. Δ 를 줄이는 자연스러운 방법이 없기 때문이다. 그래프 문제에서는 정점 수나 간선 수에 거는 것이 거의 언제나 옳다. 여기서는 정점 수에 건다.

증명. Δ 를 고정하고 P(k) 를 "최대 차수가 Δ 이하인 정점 k 개짜리 그래프는 (Δ+1)-색칠 가능하다"라 한다.

기저 단계 (k=1). 정점 하나는 차수가 0 이고 색 하나로 칠한다.

귀납 단계. P(k) 를 가정하고 정점이 k+1 개이며 최대 차수가 Δ 이하인 그래프 G 를 잡자. 정점 v 와 그에 붙은 간선을 모두 지워 정점 k 개짜리 그래프 H 를 얻는다. 간선을 지웠으므로 H 의 최대 차수도 Δ 이하이고, 귀납 가정에 의해 HΔ+1 색으로 칠할 수 있다.

이제 v 를 되붙인다. v 에 인접한 정점은 많아야 deg(v)Δ 개이므로 그들이 쓴 색은 많아야 Δ 가지다. 색이 Δ+1 가지 있으므로 쓰이지 않은 색이 적어도 하나 남는다. 그 색을 v 에 준다.

답이 말이 되는가. 상한이 딱 맞는 예가 있다. KΔ+1 은 모든 차수가 Δ 이고 채색수가 정확히 Δ+1 이다. 반대로 별 그래프는 최대 차수가 얼마든 커도 채색수가 2 다 — 이 상한은 아주 헐렁할 수 있다. 최소 색 수를 실제로 구하는 것은 어려운 문제이고, 평면 그래프를 3 색으로 칠할 수 있는지 판정하는 것만 해도 /posts/fundamental/algorithm.html > NP-완전이다.

증명에서 눈여겨볼 것이 하나 더 있다. 정점을 떼어내고 색칠한 뒤 되붙이는 순서다. 반대로 "k 개짜리 그래프에 정점을 하나 더한다"로 시작하면 안 된다. 임의의 (k+1)-정점 그래프가 그런 식으로 만들어진다는 보장이 없기 때문이다. 이 함정을 구성 오류(buildup error)라 하고, 이 장의 오류 찾기 예제에 나온다.

보행·연결·홀수 순환

보행·경로·닫힌 보행은 12장의 정의에서 방향만 빼면 된다. 다만 순환의 정의가 달라진다. 단순 그래프에서 순환은 길이 3 이상인 닫힌 보행 중 시작·끝을 뺀 정점이 모두 다른 것이다. 길이 2 짜리 닫힌 보행 uvu 는 같은 간선을 왕복한 것이라 세지 않고, 자기 고리가 없으므로 길이 1 도 없다.

정의. 두 정점 사이에 경로가 있으면 두 정점이 연결되었다고 한다(정점 하나는 길이 0 경로로 자기와 연결되었다고 본다). 모든 두 정점이 연결된 그래프를 연결 그래프라 하고, 어떤 정점과 그 정점에 연결된 모든 정점·간선으로 된 부분그래프를 연결 요소라 한다. 그래프가 연결인 것은 연결 요소가 정확히 하나인 것이다.

정의. G부분그래프V(H)V(G) 이고 E(H)E(G) 인 그래프 H 다. 순환을 "Cn 과 동형인 부분그래프"로 정의하면 시작점과 방향에 대한 군더더기가 사라진다.

짝수 순환은 번갈아 칠하면 맞고 홀수 순환은 한 바퀴 돌아 어긋난다. 오른쪽이 거리의 짝홀로 칠했을 때 어긋나는 간선이 홀수 닫힌 보행을 만든다는 것을 보인다
<짝수 순환은 번갈아 칠하면 맞고 홀수 순환은 한 바퀴 돌아 어긋난다. 오른쪽이 거리의 짝홀로 칠했을 때 어긋나는 간선이 홀수 닫힌 보행을 만든다는 것을 보인다>[원본 보기]

정리. 다음 세 성질은 서로 동등하다.

  1. 그래프에 홀수 길이 순환이 있다.
  2. 그래프를 2 색으로 칠할 수 없다.
  3. 그래프에 홀수 길이 닫힌 보행이 있다.

예제 164

위 세 성질이 동등함을 증명하라.

증명

뼈대는 이렇다. 1231 로 고리를 만든다. 셋을 서로 다 잇는 대신 한 방향으로 한 바퀴 돌면 여섯 개가 아니라 세 개만 증명하면 된다.

12. 홀수 순환 하나를 잡자. 그 순환을 2 색으로 칠하려면 색이 한 정점마다 바뀌어야 하는데, 한 바퀴 돌아 제자리로 오려면 바뀐 횟수가 짝수여야 한다. 길이가 홀수이므로 어긋난다. 순환은 부분그래프이고 부분그래프를 칠할 수 없으면 전체도 칠할 수 없다.

23. 연결 그래프에 대해 보이면 된다(연결 요소마다 따로 보면 되고, 요소끼리는 색이 서로 간섭하지 않는다). 정점 r 를 아무렇게나 잡는다. 연결이므로 각 정점 u 에 대해 u 에서 r 로 가는 보행 wu 가 있다. 색을 이렇게 준다 — |wu| 가 짝수면 첫째 색, 홀수면 둘째 색.

2 색으로 칠할 수 없다고 가정했으므로 이 배정은 올바른 색칠이 아니다. 곧 같은 색인 두 정점 u, v 사이에 간선이 있다. 여기서 보행 w 를 거꾸로 적은 것을 reverse(w) 라 하자 — 간선에 방향이 없으므로 보행을 거꾸로 읽은 것도 언제나 보행이고 길이가 같다. 이것이 방향 그래프에서는 안 되던 일이다. 그러면

wureverse(wv)vu

u 에서 시작해 u 로 돌아오는 닫힌 보행이고 길이가 |wu|+|wv|+1 이다. |wu||wv| 의 짝홀이 같으므로 그 합은 짝수이고, 1 을 더하면 홀수다.

31. 홀수 길이 닫힌 보행이 있으면, 정렬성 원리에 의해 길이가 최소인 홀수 닫힌 보행 w 가 있다. w 가 순환임을 보인다. 아니라고 하면 시작·끝 말고 되풀이되는 정점이 있고 두 경우가 있다.

시작점이 한 번 더 나오는 경우. w=fg 로 쪼갤 수 있고 f, g 모두 양의 길이 닫힌 보행이다. |f|+|g| 가 홀수이므로 정확히 하나가 홀수이고, 그것은 w 보다 짧은 홀수 닫힌 보행이다. 모순이다.

시작점 아닌 정점 y 가 두 번 나오는 경우. w=fgr 로 쪼갤 수 있는데 f 는 시작점에서 y 로, gy 에서 y 로(양의 길이), ry 에서 시작점으로 가는 보행이다. g 가 홀수 길이면 w 보다 짧은 홀수 닫힌 보행이니 모순이므로 g 는 짝수 길이다. 그러면 fr 가 홀수 길이 닫힌 보행이고 w 보다 짧다. 역시 모순이다.

그러므로 w 는 순환이고 길이가 홀수다.

답이 말이 되는가. 이 정리 덕분에 13장에서 베네시망을 위해 급히 증명한 보조정리가 특별한 경우로 들어온다. 거기서는 "점선과 실선이 번갈아 나오므로 고리가 짝수"라고 손으로 확인했는데, 이제 "홀수 순환이 없으므로 2색 칠하기가 있다" 한 줄로 끝난다. 그리고 세 성질의 동등성은 이분 그래프를 판정하는 방법도 준다 — 너비 우선 탐색으로 거리의 짝홀을 칠해 보고 어긋나는 간선이 있는지 확인하면 된다. 알고리즘 문서의 /posts/fundamental/algorithm.html > 연결 요소와 이분 그래프가 그 구현이다.

예제 165

그래프 G 의 연결 요소 수가 |V(G)||E(G)| 이상임을 증명하고, 따름정리로 정점이 n 개인 연결 그래프의 간선은 n1 개 이상임을 얻어라.

증명

뼈대는 이렇다. 간선 하나를 지우면 연결 요소가 늘거나 그대로다. 간선 수에 대한 귀납법이다.

증명. P(k) 를 "간선이 k 개인 모든 그래프 G 의 연결 요소 수는 |V(G)|k 이상이다"라 한다.

기저 단계 (k=0). 간선이 없으면 정점마다 연결 요소 하나이므로 요소가 정확히 |V(G)| 개다.

귀납 단계. P(k) 를 가정하고 간선이 k+1 개인 G 를 잡자. 간선 e 를 하나 골라 지운 그래프를 Ge 라 하면 간선이 k 개이므로 귀납 가정에 의해 연결 요소가 |V(G)|k 개 이상이다. 이제 e 를 되붙인다.

e 의 두 끝점이 Ge 의 같은 요소에 있었다면 요소가 그대로이므로 G 의 요소 수는 |V(G)|k>|V(G)|(k+1) 이다. 다른 요소에 있었다면 두 요소가 하나로 합쳐져 요소 수가 정확히 하나 줄어 |V(G)|k1=|V(G)|(k+1) 이다. 어느 경우든 P(k+1) 이 성립한다.

따름정리. 연결 그래프는 요소가 하나이므로 1n|E|, 곧 |E|n1 이다.

답이 말이 되는가. 증명에서 "간선을 지우고, 귀납 가정을 쓰고, 되붙인다"는 순서를 지킨 것을 확인해 두자. 그래프 증명에서 이 줄였다 되붙이기가 표준 절차다. "k 개짜리 그래프에 간선을 하나 더한다"로 시작하면 임의의 (k+1)-간선 그래프가 그렇게 만들어진다는 보장을 잃는다. 여기서는 어느 방향이든 되지만, 문을 열어 두면 곧 사고가 난다 — 아래 오류 찾기 예제가 그것이다.

자른 간선과 k-연결

통신망이라면 연결만으로는 모자란다. 부품이 망가져도 연결이 유지되어야 한다.

정의. 두 정점이 k-연결이라는 것은 간선을 k1 개까지 지운 어떤 부분그래프에서도 그 둘이 연결되어 있다는 뜻이다. 정점이 둘 이상인 그래프가 k-연결이라는 것은 서로 다른 모든 정점 짝이 k-연결인 것이다. 어떤 간선 e 를 지우면 연결이 끊기는 두 정점이 있을 때 e자른 간선(cut edge)이라 한다.

곧 나오는 사실 셋을 적어 둔다. 1-연결은 그냥 연결이다. 정점이 둘 이상인 그래프가 2-연결인 것은 연결이면서 자른 간선이 없는 것이다. 그리고 간선이 순환에 놓여 있지 않은 것과 자른 간선인 것은 같다. 순환의 간선은 지워도 나머지 순환으로 우회할 수 있고, 순환에 없으면 우회로가 없기 때문이다. Kn(n1)-연결이고 순환은 모두 2-연결이다.

두 정점 사이에 간선이 겹치지 않는 경로k 개 있으면 그 둘은 k-연결이다. 각 경로에서 간선을 하나씩 지워야 하기 때문이다. 놀라운 것은 역도 참이라는 것이고 이것이 멩거 정리(Menger)다. 증명은 k=2 인 경우만 해도 만만치 않아 여기서는 서술만 한다.

오일러 회로와 해밀턴 회로

미술관의 모든 복도를 정확히 한 번씩 지나 제자리로 돌아올 수 있는가? 쾨니히스베르크의 다리 일곱 개를 각각 한 번씩만 건널 수 있는가? 오일러가 후자에 답하면서 그래프 이론이 시작됐다.

정의. 그래프의 오일러 회로(Euler tour)는 모든 간선을 정확히 한 번씩 지나는 닫힌 보행이다.

왼쪽은 모든 차수가 짝수여서 회로가 있고 오른쪽은 홀수 차수 정점이 둘이어서 열린 보행만 있다
<왼쪽은 모든 차수가 짝수여서 회로가 있고 오른쪽은 홀수 차수 정점이 둘이어서 열린 보행만 있다>[원본 보기]

정리. 연결 그래프에 오일러 회로가 있는 것과 모든 정점의 차수가 짝수인 것은 같다.

예제 166

위 정리의 쉬운 방향(오일러 회로가 있으면 모든 차수가 짝수)을 증명하고, 어려운 방향의 증명 뼈대를 적어라. 그리고 홀수 차수 정점이 정확히 둘이면 무엇이 성립하는가?

증명

쉬운 방향의 뼈대. 회로가 정점을 지날 때마다 들어오는 간선 하나와 나가는 간선 하나를 쓴다. 그래서 차수가 둘씩 짝지어진다.

증명. 오일러 회로 w 가 있다고 하자. 정점 v 를 잡고 w 에서 v 가 나오는 횟수를 세자. v 가 회로의 중간에 나올 때마다 wv 에 붙은 간선 두 개(앞의 것과 뒤의 것)를 쓴다. 시작점이자 끝점인 정점도 회로가 닫혀 있으므로 처음 나가는 간선과 마지막 들어오는 간선이 짝을 이룬다. 모든 간선을 정확히 한 번씩 쓰므로 v 에 붙은 간선은 모두 이런 짝에 정확히 한 번 들어가고, 따라서 deg(v) 는 짝수다.

어려운 방향의 뼈대. 모든 차수가 짝수인 연결 그래프에서 회로를 키워 나간다. 아무 정점에서 출발해 쓰지 않은 간선을 따라 계속 가면, 들어간 정점의 남은 차수가 홀수가 될 수 없어 언제나 나갈 간선이 있고, 결국 출발점으로 돌아온다 — 곧 닫힌 보행을 얻는다. 그 간선들을 지우면 남은 그래프의 차수도 모두 짝수이므로 같은 일을 되풀이할 수 있다. 지금 회로가 모든 간선을 쓰지 못했다면, 연결이므로 회로가 지나는 정점 중 아직 쓰지 않은 간선이 붙은 것이 있고, 거기서 만든 새 닫힌 보행을 회로 중간에 끼워 넣는다. 간선 수가 매번 줄어들므로 이 과정이 끝나고, 끝나면 모든 간선을 쓴 회로다.

홀수 차수 정점이 둘인 경우. 회로는 없지만 모든 간선을 한 번씩 쓰는 열린 보행이 있고, 그 시작과 끝이 바로 두 홀수 차수 정점이다. 이유는 두 정점을 새 간선으로 이어 모든 차수를 짝수로 만들고 오일러 회로를 찾은 뒤 그 새 간선을 지우면 되기 때문이다(두 정점이 이미 인접해 있으면 새 정점 하나를 사이에 넣는다).

답이 말이 되는가. 그림 오른쪽에서 확인하자. ac 의 차수가 3 이고 나머지는 2 다. 실제로 abcdac 가 간선 다섯 개를 한 번씩 쓰는 보행이고 시작과 끝이 ac 다. 앞의 예제에서 "홀수 차수 정점의 개수는 짝수"임을 증명했으므로 홀수 차수 정점이 딱 하나인 그래프는 아예 없다 — 그래서 경우가 "0 개"와 "2 개"로 깔끔하게 갈린다.

정의. 그래프의 해밀턴 회로는 모든 정점을 정확히 한 번씩 지나는 순환이다.

이름은 비슷하지만 사정이 전혀 다르다. 오일러 회로는 차수만 세면 있는지 알 수 있는데 해밀턴 회로가 있는지 판정하는 간단한 조건은 아무도 찾지 못했다. 실제로 이 판정은 /posts/fundamental/algorithm.html > NP-완전이다. 간선에 무게가 붙어 있고 무게 합이 가장 작은 해밀턴 회로를 찾는 문제가 외판원 문제이며, 알고리즘 문서의 /posts/fundamental/algorithm.html > 근사 알고리즘이 그 실용적인 대처를 다룬다.

숲과 나무

정의. 순환이 없는 그래프를 숲(forest)이라 하고, 연결된 숲을 나무(tree)라 한다. 숲의 각 연결 요소는 정의에 의해 나무다. 나무에서 차수 1 인 정점을 잎(leaf)이라 한다.

나무는 잎이 많고 정점 수가 간선 수보다 정확히 하나 많다. 오른쪽은 연결 그래프 안에 정점 전부를 잇는 나무가 늘 있다는 것을 보인다
<나무는 잎이 많고 정점 수가 간선 수보다 정확히 하나 많다. 오른쪽은 연결 그래프 안에 정점 전부를 잇는 나무가 늘 있다는 것을 보인다>[원본 보기]

정리. 모든 나무는 다음 성질을 갖는다.

  1. 연결된 부분그래프는 모두 나무다.
  2. 어떤 두 정점 사이에도 경로가 정확히 하나 있다.
  3. 인접하지 않은 두 정점 사이에 간선을 더하면 순환이 생긴다.
  4. 어떤 간선을 지워도 연결이 끊긴다. 곧 모든 간선이 자른 간선이다.
  5. 정점이 둘 이상이면 잎이 둘 이상 있다.
  6. 정점 수가 간선 수보다 정확히 하나 많다.

예제 167

위 성질 중 (2), (5), (6)을 증명하라.

증명

(2) 경로가 정확히 하나. 뼈대는 이렇다. 경로가 둘이면 그 둘로 순환을 만들 수 있다.

나무는 연결이므로 경로가 하나 이상 있다. 두 개 이상 있다고 가정하고, 서로 다른 두 경로 pq 로서 같은 두 정점을 잇고 |p|+|q| 가 최소인 것을 잡는다(정렬성 원리).

pq 가 시작·끝 말고 정점 x 를 함께 지난다고 하자. 그러면 시작점에서 x 까지의 두 토막이 서로 다르거나 x 에서 끝점까지의 두 토막이 서로 다르다(둘 다 같으면 p=q 이다). 다른 쪽만 남기면 같은 두 정점을 잇는 서로 다른 두 경로이면서 길이 합이 더 작다 — 최소성에 어긋난다.

그러므로 pq 는 양 끝점 말고 공통 정점이 없다. 그러면 preverse(q) 는 순환이다. 나무에는 순환이 없으므로 모순이다.

(5) 잎이 둘 이상. 뼈대는 이렇다. 가장 긴 경로의 양 끝은 잎이다.

정점이 둘 이상이므로 길이가 1 이상인 경로가 있고, 그중 가장 긴 것 p 를 잡자. 양 끝점 u, v 는 서로 다르다. u 가 잎이 아니라고 하면 u 에 붙은 간선이 둘 이상이다. 경로 위의 간선이 아닌 다른 간선 uz 가 있고, zp 위에 없다면 그 간선을 붙여 더 긴 경로가 되어 최대성에 어긋나며, zp 위에 있다면 순환이 생겨 나무가 아니다. 그러므로 u 는 잎이고 v 도 같다.

(6) 정점 수 = 간선 수 + 1. 뼈대는 이렇다. 잎을 하나 떼어내면 더 작은 나무가 된다. 정점 수에 대한 귀납법이다.

P(n) 을 "정점이 n 개인 나무의 간선은 n1 개다"라 한다. P(1) 은 정점 하나에 간선 0 개이므로 성립한다. P(n) 을 가정하고 정점이 n+1 개인 나무 T 를 잡자. n+12 이므로 (5)에 의해 잎 v 가 있다. v 와 그에 붙은 간선 하나를 지운다. 차수 1 인 정점을 지우면 연결이 유지되고(v 를 지나는 경로는 v 에서 끝나는 것뿐이다) 순환도 생기지 않으므로 남은 것은 정점 n 개짜리 나무다. 귀납 가정에 의해 간선이 n1 개이고, 지운 간선을 되붙이면 T 의 간선은 n 개다.

답이 말이 되는가. (6)의 역도 거의 성립한다. G 가 나무인 것은 G 가 숲이고 |V(G)|=|E(G)|+1 인 것과 같다. 숲의 각 요소가 나무이므로 요소가 c 개이면 간선 수는 |V|c 이고, |E|=|V|1 이면 c=1, 곧 연결이다. 이렇게 나무의 여러 특징 중 둘을 고르면 나머지가 따라온다는 것이 이 정리의 쓰임새다.

정의. 그래프 G신장 부분그래프는 정점 집합이 V(G) 와 같은 부분그래프이고, 나무인 신장 부분그래프를 신장나무(spanning tree)라 한다.

정리. 모든 연결 그래프에 신장나무가 있다.

증명. G 자신이 연결된 신장 부분그래프이므로 그런 것이 하나 이상 있다. 정렬성 원리에 의해 간선 수가 최소인 연결된 신장 부분그래프 T 가 있다. T 가 순환 C 를 담고 있다면 C 의 간선 하나는 순환에 놓여 있으므로 자른 간선이 아니고, 그것을 지워도 연결된 신장 부분그래프가 남아 T 의 최소성에 어긋난다. 그러므로 T 는 순환이 없고 연결이므로 나무다.

간선에 무게가 붙어 있으면 무게 합이 최소인 신장나무(MST)를 찾는 문제가 된다. 그것을 푸는 알고리즘과 정당성은 알고리즘 문서의 /posts/fundamental/algorithm.html > 크루스칼·/posts/fundamental/algorithm.html > 프림·/posts/fundamental/algorithm.html > 자르기 성질에 있다. 여기서 짚어 둘 것은 그 알고리즘들이 모두 한 가지 사실의 특별한 경우라는 점이다. 정점을 두 색으로 아무렇게나 나누고 양 끝의 색이 다른 간선들을 보면, 그중 무게가 가장 작은 것은 모든 MST 에 들어 있다. 프림은 "지금까지 자란 나무"를 한 색으로, 크루스칼은 "합칠 두 요소"를 서로 다른 색으로 삼은 것이다.

오류 찾기

다음 "증명"은 결론이 거짓이다. 반례를 들고, 어느 단계가 틀렸는지 찾아라.

가짜 정리. 모든 정점의 차수가 1 이상인 그래프는 연결되어 있다.

  1. P(n) 을 "모든 차수가 1 이상인 정점 n 개짜리 그래프는 연결이다"라 한다.
  2. P(1) 은 참이다. 정점 하나짜리 그래프에는 차수가 1 이상인 정점이 있을 수 없으므로 조건이 공허하게 성립한다. P(2) 도 참이다. 정점 둘의 차수가 1 이상인 그래프는 간선 하나로 이어진 것뿐이고 연결이다.
  3. 귀납 단계. P(n) 을 가정한다. 모든 차수가 1 이상인 정점 n 개짜리 그래프를 잡으면 가정에 의해 연결이다.
  4. 여기에 정점 x 를 하나 더해 정점 n+1 개짜리 그래프를 만든다.
  5. x 의 차수가 1 이상이므로 x 에서 어떤 정점 y 로 가는 간선이 있다. 아무 정점 z 에 대해 x 에서 y 로 가고 이어 y 에서 z 로 가면 경로가 있다.
  6. 그러므로 P(n+1) 이 성립하고 귀납법에 의해 정리가 참이다.
풀이 보기

먼저 반례를 만든다. 정점 넷 a,b,c,d 에 간선 abcd 만 둔다. 모든 차수가 1 인데 a 에서 c 로 가는 경로가 없다. 연결이 아니다.

틀린 단계는 4번이다. 3번까지는 흠이 없다. 4번이 "정점 n+1 개짜리 그래프는 정점 n 개짜리 그래프에 정점 하나를 붙여 만들어진다"고 가정했는데 그 가정이 거짓이다. 위 반례에서 정점 하나를 지우면 남은 셋 중 하나는 차수가 0 이 되어 귀납 가정을 쓸 수 있는 그래프가 아니다.

다시 말하면 증명이 실제로 보인 것은 "P(n) 을 만족하는 그래프에 정점을 하나 붙이면 연결이다"이고, 그것은 "모든 (n+1)-정점 그래프가 연결이다"가 아니다. 귀납 단계는 임의의 (n+1)-정점 그래프에서 출발해야 한다.

이 함정을 구성 오류(buildup error)라 한다. 앞의 색칠 정리와 연결 요소 정리에서 왜 "임의의 큰 그래프를 잡고, 정점(또는 간선)을 지워 귀납 가정을 쓰고, 되붙였는가"가 이제 분명하다. 그 순서를 지키면 이 오류가 원천적으로 막힌다.

5번도 3번의 연결성에 기대고 있어 함께 무너진다. 그러나 첫째 오류는 4번이다.

이 장에서 새로 나온 것

기호·용어
단순 그래프 · uv방향 없는 간선. 자기 고리와 겹친 간선이 없다. 간선은 두 원소 집합
인접 · 붙어 있다 · deg(v)같은 간선의 두 끝점 · 간선과 그 끝점의 관계 · 붙은 간선의 수
악수 보조정리vdeg(v)=2|E(G)|. 홀수 차수 정점의 개수는 짝수다
Kn · Pn · Cn · Km,n · Qn완전 · 경로 · 순환 · 완전 이분 · 초입방체. Qn 의 지름은 n
동형사상 · 동형 불변량간선을 보존하는 전단사 · 동형으로 보존되는 성질(차수 목록 등)
이분 그래프정점을 두 블록으로 나누어 모든 간선이 블록을 가로지르게 할 수 있다
매칭 · 완벽 매칭같은 정점에 붙지 않는 간선들 · 모든 정점을 덮는 매칭
N(S) · 병목S 의 이웃 전체 · |S|>|N(S)|S
홀의 정리L(G) 를 덮는 매칭이 있는 것과 병목이 없는 것이 같다
차수 제한deg()ddeg(r). 이것만으로 매칭의 존재가 나온다
색칠 · 채색수 χ(G)인접한 두 정점의 색이 다른 배정 · 필요한 최소 색 수
차수 한계 정리최대 차수가 Δ 이면 Δ+1 색으로 칠할 수 있다
연결 · 연결 요소 · 부분그래프경로가 있다 · 서로 연결된 최대 덩어리 · 정점과 간선이 각각 부분집합
reverse(w)보행을 거꾸로 읽은 것. 방향이 없으므로 그것도 보행이고 길이가 같다
홀수 순환 정리홀수 순환이 있다 = 2색 칠할 수 없다 = 홀수 닫힌 보행이 있다
자른 간선 · k-연결지우면 끊기는 간선(= 순환에 없는 간선) · 간선 k1 개를 지워도 연결
멩거 정리k-연결이면 간선이 겹치지 않는 경로가 k 개 있다(서술만)
오일러 회로 · 해밀턴 회로모든 간선을 한 번씩 · 모든 정점을 한 번씩. 앞은 차수로 판정되고 뒤는 어렵다
숲 · 나무 · 잎순환 없음 · 연결된 숲 · 차수 1 인 정점. 나무는 |V|=|E|+1
신장나무정점 전체를 담은 나무 부분그래프. 연결 그래프에 반드시 있다
구성 오류작은 그래프에 붙여 큰 그래프를 만든다고 가정하는 잘못. 지웠다 되붙여야 한다

챙겨 갈 것은 다섯이다.

다음 장은 그래프를 평면에 그릴 수 있는가를 묻는다. 여기서 세운 차수·순환·나무·색칠이 모두 쓰인다. 특히 악수 보조정리와 "정점 수 = 간선 수 + 1"이 오일러 공식의 증명과 정다면체 분류의 뼈대가 되고, 이 장의 색칠이 평면 그래프의 5색 정리로 이어진다.

평면 그래프

개집이 세 채, 사람 집이 세 채 있다. 개집마다 세 집으로 가는 길을 내려는데 길이 서로 엇갈리지 않게 할 수 있을까. 다리가 넷인 문어 다섯 마리가 바닥에 앉아 서로 악수하려 한다. 팔이 겹치지 않게 모두와 악수할 수 있을까.

14장의 말로 옮기면 앞의 것은 K3,3 을, 뒤의 것은 K5 을 평면에 엇갈림 없이 그릴 수 있는가 하는 문제다. 답은 둘 다 "안 된다"인데, 간선을 딱 하나 빼면 된다.

위의 둘은 아무리 애써도 선이 엇갈린다. 아래는 간선 하나를 뺀 뒤 엇갈림 없이 다시 그린 것이다
<위의 둘은 아무리 애써도 선이 엇갈린다. 아래는 간선 하나를 뺀 뒤 엇갈림 없이 다시 그린 것이다>[원본 보기]

이 장에서 답할 것은 넷이다. "평면에 그린다"를 어떻게 정확히 정의하는가. 정점·간선·면의 수 사이에 어떤 관계가 있는가(오일러 공식). K5K3,3 가 왜 안 되는가. 그리고 정다면체가 왜 다섯 개뿐인가 — 마지막 것이 이 장의 백미다. 그 사이에 평면 그래프의 5색 정리도 증명한다.

14장의 차수·순환·연결·나무·색칠을 그대로 쓴다. 특히 악수 보조정리정점 수 = 간선 수 + 1이 계속 나온다. 그리고 9장의 재귀적 자료형과 구조적 귀납법이 이 장의 주된 증명 도구다.

평면에 그린다는 것

정의. 그래프의 그림(drawing)은 각 정점에 평면의 서로 다른 점 하나를 배정하고, 각 간선에 두 끝점을 잇는 매끄러운 곡선 하나를 배정하는 것이다. 그림이 평면적이라는 것은 어떤 곡선도 자기 자신이나 다른 곡선과 만나지 않는 것이다 — 곧 두 번 이상 나오는 점은 정점의 점뿐이다. 평면적인 그림이 있는 그래프를 평면 그래프(planar graph)라 한다.

이 정의는 옳지만 "매끄러운 곡선"과 "점이 두 번 나온다"에 기대고 있다. 그 두 개념을 제대로 세우려면 평면 기하와 점집합 위상수학으로 한 장을 써야 한다. 그림에 기댄 평면 그래프 증명에서 잘못된 것이 역사적으로 아주 많이 나왔으므로, 이 장은 다른 길을 간다 — 이산적인 자료형으로 평면 배치를 다시 정의한다. 그러려면 먼저 을 알아야 한다.

면과 이산면

평면적인 그림의 곡선들은 평면을 여러 조각으로 나눈다. 그 조각 하나하나를 면(face)이라 하고, 사방으로 무한히 뻗는 조각을 바깥면이라 한다.

면이 넷이고 각 면의 경계가 닫힌 보행 하나에 대응한다. 간선마다 경계에 정확히 두 번 나오는 것이 이 장의 열쇠다
<면이 넷이고 각 면의 경계가 닫힌 보행 하나에 대응한다. 간선마다 경계에 정확히 두 번 나오는 것이 이 장의 열쇠다>[원본 보기]

그림에서 각 면의 경계를 따라가면 정점의 수열이 나온다. 면 III 의 경계를 따라가면 adca 다. 이렇게 얻은 닫힌 보행을 그 면의 이산면(discrete face)이라 한다. "이산"이라 부르는 까닭은 평면의 영역은 연속적인 대상이지만 그래프의 닫힌 보행은 이산적인 대상이기 때문이다.

그림에서 확인할 것이 하나 있다. 바깥면도 다른 면과 다를 것이 없다. 그래프를 구 위에 그렸다고 생각해 보자. 어느 면을 골라 그 자리에 구멍을 뚫고 구멍을 넓혀 평면에 펼치면 그 면이 바깥면이 된다. 어느 면이든 바깥이 될 수 있으므로 특별한 면이란 없다.

예제 169

위 그림의 그래프에서 이산면 네 개의 길이를 모두 더하면 얼마인가? 그 값이 무엇을 세고 있는지 말하고, 정점을 다시 배치해 그림을 다르게 그려도 그 값이 바뀌지 않는 이유를 설명하라.

풀이 보기

무엇을 묻는가. 길이의 총합과 그 뜻이다.

네 이산면이 모두 길이 3 이므로 합은 12 다. 간선이 6 개이므로 12=2×6 이다.

무엇을 세는가. "간선이 면 경계에 나오는 횟수"를 전부 센 것이다. 앞 절 끝에서 말한 대로 각 간선은 정확히 두 번 나오므로 합이 언제나 2e 다.

왜 배치를 바꿔도 그대로인가. 합이 2e 이고 간선 수는 그림을 어떻게 그리든 그래프의 성질이므로 바뀌지 않는다. 정점을 어디에 놓든, 어느 면을 바깥으로 삼든 2e 다.

답이 말이 되는가. 여기서 얻은 (이산면 길이의 합)=2e 는 이 장에서 가장 자주 쓰이는 등식이다. 오일러 공식과 짝을 지어 간선 수의 상한을 주고, 그 상한에서 K5 의 비평면성과 5색 정리와 정다면체 분류가 모두 나온다. 지금은 그냥 셈 한 줄로 보이지만 이 장의 뼈대다.

면 경계가 늘 순환은 아니다

자른 간선은 한 면의 경계에 두 번 나온다. 그래서 경계를 순환이라 하지 못하고 닫힌 보행이라 해야 한다
<자른 간선은 한 면의 경계에 두 번 나온다. 그래서 경계를 순환이라 하지 못하고 닫힌 보행이라 해야 한다>[원본 보기]

왼쪽 그림의 간선 ce 는 14장의 말로 자른 간선이다. 이 그림에서는 다리(bridge)라 부르자. 바깥면의 경계를 따라가면 abcefgecda 인데 다리를 갈 때 한 번 올 때 한 번 지난다. 정점 ce 도 두 번 나오므로 이것은 순환이 아니다.

오른쪽은 다리로만 된 나무가 면 안에 매달린 것이고 동글(dongle)이라 부른다. 안쪽 면의 경계에서 그 나무의 간선 셋이 모두 두 번씩 나온다.

이 두 가지가 전부다. 연결 그래프의 평면 배치에서 간선은 서로 다른 두 면의 경계에 한 번씩 나오거나, 한 면의 경계에 두 번 나온다. 어느 쪽이든 간선마다 경계에 정확히 두 번이다. 이 사실이 뒤에서 간선 수의 상한을 준다.

예제 170

(가) 같은 그래프를 두 가지로 평면에 그려서 면의 길이 목록이 서로 다르게 할 수 있음을 예로 보여라. (나) 그런데도 모든 면의 길이를 더한 값은 언제나 같음을 증명하라.

증명

(가) 예. 정점 uv 를 잡고 그 사이를 잇는, 안쪽 정점이 서로 겹치지 않는 경로 네 개를 둔다. 길이는 각각 1,2,2,3 이라 하자. 이 그래프를 평면에 그리면 u 를 중심으로 네 경로가 어떤 순서로 뻗어 나가는지가 정해지고, 이웃한 두 경로가 면 하나를 둘러싼다. 그래서 면의 길이는 순서상 이웃한 두 경로의 길이의 합이다.

순서를 (1,2,2,3) 으로 두면 면의 길이가 1+2=3, 2+2=4, 2+3=5, 3+1=4 이므로 목록이 {3,4,4,5} 다. 순서를 (1,2,3,2) 로 두면 3,5,5,3 이므로 목록이 {3,3,5,5} 다. 두 목록이 다르다.

(나) 증명. 보조정리 하나로 끝난다. 각 간선은 면 경계에 정확히 두 번 나오므로 모든 면의 길이를 더한 값은 정확히 2e 다. 간선 수는 배치와 무관하므로 그 값은 배치를 바꿔도 같다. 실제로 위 예에서 e=1+2+2+3=8 이고 두 목록의 합이 모두 16=2×8 이다.

답이 말이 되는가. 면의 개수도 배치와 무관하다 — 오일러 공식이 f=ev+2 로 정해 주기 때문이다. 그러니 배치를 바꿔 바꿀 수 있는 것은 길이가 면들 사이에 어떻게 나뉘는가뿐이고, 개수와 총합은 손댈 수 없다. 위 예에서 두 배치 모두 면이 넷이고 합이 16 이었다.

평면 배치의 재귀적 정의

이제 연속적인 그림을 버리고 이산적인 정의를 세운다. 발상은 이렇다. 평면적인 그림은 한 걸음씩 그려 나갈 수 있다. 점을 하나 찍거나, 이미 찍은 두 점 사이에 곡선을 하나 그린다. 새 곡선이 다른 곡선과 엇갈리지 않으려면 한 면 안에 머물러야 하고, 아니면 서로 떨어진 두 그림의 바깥면을 지나 이어야 한다. 그러니 규칙이 둘이다.

정의. 연결 그래프의 평면 배치(planar embedding)는 그 그래프의 닫힌 보행들의 공집합 아닌 모음이고 그 원소를 이산면이라 한다. 다음과 같이 재귀적으로 정의한다.

면 쪼개기는 간선과 면을 각각 하나 늘리고 다리 잇기는 간선을 하나 늘리며 면을 하나 줄인다. 두 규칙 모두 v − e + f 를 그대로 둔다
<면 쪼개기는 간선과 면을 각각 하나 늘리고 다리 잇기는 간선을 하나 늘리며 면을 하나 줄인다. 두 규칙 모두 v − e + f 를 그대로 둔다>[원본 보기]

이 정의가 제대로 되는가? 된다. 그래프가 앞 절의 뜻으로 평면 그래프인 것과, 그 연결 요소마다 이 뜻의 평면 배치가 있는 것이 같다. 다만 그 사실 자체는 연속 수학 없이 증명할 수 없다 — 우리가 피하려 한 바로 그것이 필요하다. 대신 이 정의를 세운 뒤로는 연속 수학이 다시 필요하지 않다. 그것이 이 정의의 값어치다.

예제 171

정점 a,b,c 로 된 삼각형(길이 3 순환)의 평면 배치를 위 정의에 따라 한 걸음씩 만들어라. 각 단계의 이산면을 적어라.

풀이 보기

무엇을 묻는가. 생성자를 실제로 적용하는 연습이다.

1단계. 정점 a 하나. 이산면은 {a} 하나(길이 0 닫힌 보행).

2단계 (다리 잇기). 정점 b 하나짜리 배치를 따로 만들고 ab 로 잇는다. 이산면은 aabbbaa 하나, 곧 aba 다.

3단계 (다리 잇기). 정점 c 를 같은 방식으로 b 에 잇는다. γ=bab 로 잡으면(같은 면을 b 에서 시작해 적은 것이다) 새 이산면은 babcb 하나다.

4단계 (면 쪼개기). ac 는 인접하지 않고 둘 다 이산면 babcb 에 나온다. 이 면을 a 에서 시작해 다시 적으면 abcba 이고 α=abc, β=cba 로 쪼갤 수 있다. 간선 ac 를 더하면 이산면이 둘이 된다 — abcaacba 다.

답이 말이 되는가. 삼각형의 평면 그림에는 면이 둘(안과 바깥)이고, 실제로 이산면이 둘 나왔다. 두 이산면은 같은 정점을 지나지만 방향이 반대다. 그림으로 보면 안쪽 면을 시계 방향으로, 바깥 면을 반시계 방향으로 돈 것이다. 확인해 보면 ve+f=33+2=2 다.

예제 172

위 정의는 연결 그래프만 다룬다. 생성자를 하나 더해 연결되지 않은 경우까지 넓히자. 모으기. 정점이 겹치지 않는 두 평면 배치 E1, E2 가 있으면 E1E2 도 평면 배치다(잇지 않고 그대로 둔다). 이때 연결 요소가 c 개인 배치에 대해 ve+f2c=0 임을 증명하라.

증명

뼈대는 이렇다. 생성자가 셋으로 늘었으니 각각에서 ve+f2c 가 보존되는지만 확인한다.

기저 단계. 정점 하나짜리 배치는 v=1, e=0, f=1, c=1 이므로 10+12=0 이다.

면 쪼개기. ef 가 각각 하나 늘고 vc 는 그대로이므로 값이 바뀌지 않는다.

다리 잇기. 두 배치의 값을 더하면 v=v1+v2, e=e1+e2+1, f=f1+f21 이고, 떨어져 있던 두 덩어리가 이어졌으므로 c=c1+c21 이다. 그러면

ve+f2c=(v1e1+f12c1)+(v2e2+f22c2)11+2=0

모으기. v=v1+v2, e=e1+e2, f=f1+f2, c=c1+c2 이므로 두 배치의 값을 그냥 더한 것이고 합이 0 이다.

네 경우 모두 값이 보존되므로 구조적 귀납법에 의해 항등식이 성립한다.

답이 말이 되는가. c=1 을 넣으면 ve+f=2, 곧 원래의 오일러 공식이다. 그리고 떨어진 정점 두 개짜리 배치로 확인해 보면 v=2, e=0, f=2, c=2 이고 20+24=0 이다. 여기서 면을 둘로 센 것이 눈에 걸린다 — 그림으로 보면 두 점 바깥의 영역은 하나뿐이다. 그러나 이산면은 영역이 아니라 닫힌 보행이고 두 배치에서 온 두 개의 보행은 서로 다른 대상이다. 이것이 "이산"이라는 말의 값어치이자 대가다.

오일러 공식

재귀적 정의를 세운 값어치가 여기서 나온다.

오일러 공식. 연결 그래프에 평면 배치가 있으면

ve+f=2

다. 여기서 v 는 정점 수, e 는 간선 수, f 는 면(이산면) 수다.

예제 173

오일러 공식을 증명하라.

증명

뼈대는 이렇다. 기저에서 ve+f=2 이고, 두 생성자가 그 값을 바꾸지 않는다. 9장의 구조적 귀납법이다.

증명. 평면 배치 E 에 대한 명제를 P(E)::=(ve+f=2) 라 하고 평면 배치의 정의에 대한 구조적 귀납법을 쓴다.

기저 단계. 정점 하나짜리 배치는 v=1, e=0, f=1 이므로 10+1=2 다.

생성자 1 (면 쪼개기). 정점은 그대로이고 간선이 하나 늘고 이산면 하나가 둘로 바뀌므로 면도 하나 늘어난다. 그러면

v(e+1)+(f+1)=ve+f

이므로 값이 바뀌지 않는다. 귀납 가정에 의해 그 값이 2 이므로 새 배치에서도 2 다.

생성자 2 (다리 잇기). 두 배치를 G, H 라 하면 새 배치의 정점은 vG+vH, 간선은 eG+eH+1, 면은 fG+fH1 이다(두 면이 하나로 합쳐졌다). 그러면

(vG+vH)(eG+eH+1)+(fG+fH1)=(vGeG+fG)+(vHeH+fH)2

이고 귀납 가정에 의해 오른쪽은 2+22=2 다.

두 생성자 모두 명제를 보존하므로 구조적 귀납법에 의해 모든 평면 배치에서 ve+f=2 다.

답이 말이 되는가. 눈여겨볼 것은 다리 잇기에서 2 가 나온 자리다. 두 배치가 각각 2 를 갖고 있으니 그냥 더하면 4 가 되는데, 면이 하나 합쳐지고 간선이 하나 늘어 정확히 2 가 빠진다. 만약 ve+f 의 값이 2 가 아닌 다른 상수였다면 이 생성자에서 앞뒤가 맞지 않았을 것이다. 2 라는 값은 이 생성자가 정한 것이다.

예제 174

(가) 어떤 연결 평면 그래프의 간선이 정점보다 5 개 많다. 면은 몇 개인가? (나) 어떤 연결 그래프의 정점이 간선보다 하나 많다. 이 그래프가 평면임을 설명하고 면의 수를 구하라.

풀이 보기

(가) e=v+5 이므로 오일러 공식에 넣으면 v(v+5)+f=2, 곧 f=7 이다. 정점 수와 간선 수를 몰라도 면 수가 정해진다.

(나) v=e+1 이고 연결이므로 14장의 특징에 의해 이 그래프는 나무다(연결이고 |V|=|E|+1). 나무는 평면이다 — 잎을 하나씩 붙여 나가면 되고, 그것이 정확히 다리 잇기 생성자다. 오일러 공식에 넣으면 f=2v+e=2(e+1)+e=1 이다.

답이 말이 되는가. 나무를 그리면 면이 하나뿐이라는 것이 눈으로도 보인다 — 나무에는 순환이 없으니 무엇을 둘러싸지 못하고 바깥면만 남는다. 그리고 그 하나뿐인 이산면에서 모든 간선이 두 번 나온다(모든 간선이 다리이므로). 예를 들어 정점 셋을 한 줄로 이은 나무 abc 의 이산면은 abcba 이고 길이가 4=2e 다.

간선 수의 상한

오일러 공식에 "간선마다 두 번"을 붙이면 상한이 나온다. 두 보조정리를 먼저 적는다. 둘 다 평면 배치의 정의에 대한 구조적 귀납법으로 증명되고, 앞 절 그림에서 뜻은 이미 확인했다.

정리. 연결 평면 그래프의 정점이 v3 개이고 간선이 e 개이면

e3v6

이다.

예제 175

위 정리를 증명하라. 그리고 K5 가 평면이 아님을 보여라.

증명

뼈대는 이렇다. 모든 이산면의 길이를 더한 값을 두 방식으로 잰다. 간선 쪽에서 재면 정확히 2e 이고, 면 쪼에서 재면 3f 이상이다.

증명. 평면 배치를 하나 잡자. 보조정리 1 에 의해 각 간선은 이산면들의 경계에 정확히 두 번 나오므로 이산면 길이의 총합은 정확히 2e 다. 보조정리 2 에 의해 각 이산면의 길이가 3 이상이므로 그 총합은 3f 이상이다. 따라서

3f2e

오일러 공식에서 f=ev+2 이므로 대입하면

3(ev+2)2e3e3v+62ee3v6

K5 는 평면이 아니다. K5 는 연결이고 v=5, e=10 이다. 그런데 3v6=9<10 이므로 모든 평면 그래프가 만족하는 부등식을 어긴다.

답이 말이 되는가. 부등식을 말로 옮기면 "평면에 그리려면 간선이 정점 수의 세 배쯤을 넘을 수 없다"다. 정점을 늘리면 간선을 그만큼 늘릴 수 있지만 그 비율이 고정된다. 완전 그래프의 간선은 v2 에 비례해 자라므로 v 가 커지면 반드시 이 한계를 넘는다. 실제로 v5 인 완전 그래프는 모두 평면이 아니다.

이분 그래프에는 더 강한 상한이 있다. 삼각형이 없기 때문이다.

보조정리 3. 정점이 셋 이상인 연결 이분 그래프의 평면 배치에서 각 이산면의 길이는 4 이상이다.

증명. 보조정리 2 에 의해 길이는 3 이상이다. 14장의 정리에 의해 이분 그래프에는 홀수 길이 닫힌 보행이 없다. 이산면은 닫힌 보행이므로 길이가 홀수일 수 없고, 따라서 3 이 될 수 없다. 그러므로 4 이상이다.

예제 176

연결 이분 평면 그래프에서 v3 이면 e2v4 임을 증명하고, K3,3 가 평면이 아님을 보여라.

증명

증명. 앞 증명과 같은데 3f2e 대신 4f2e 를 쓴다. 보조정리 3 에 의해 이산면 길이의 총합이 4f 이상이고, 보조정리 1 에 의해 그 총합이 2e 이기 때문이다. 오일러 공식에서 f=ev+2 를 대입하면

4(ev+2)2e2e4v8e2v4

K3,3 는 평면이 아니다. 연결이고 이분이며 v=6, e=9 이다. 2v4=8<9 이므로 부등식을 어긴다.

답이 말이 되는가. K3,33v6=12 이라 앞의 부등식은 통과한다. 그래서 이분이라는 정보를 더 써야 했다. 이것이 "정보를 더 쓰면 한계가 더 조여진다"는 좋은 예다. 그리고 이제 이 장을 연 두 퍼즐의 답이 나왔다 — 개집 세 채와 집 세 채는 엇갈림 없이 이을 수 없고, 문어 다섯 마리는 팔을 겹치지 않고 모두 악수할 수 없다.

예제 177

삼각형 없는 연결 평면 그래프(길이 3 순환이 없는 것)에서 v>2 이면 e2v4 임을 증명하고, 그런 그래프에는 차수 3 이하인 정점이 반드시 있음을 보여라.

증명

앞부분. 이산면은 닫힌 보행이므로 길이가 3 인 이산면이 있으면 그 경계가 길이 3 순환이 된다. 삼각형이 없으므로 그런 이산면이 없고, 따라서 모든 이산면의 길이가 4 이상이다. 나머지는 앞 예제의 계산과 똑같아 e2v4 다.

뒷부분. 뼈대는 이렇다. 모든 차수가 4 이상이라고 가정하면 간선이 너무 많아진다.

모든 정점의 차수가 4 이상이라고 가정하자. 악수 보조정리에 의해

2e=vdeg(v)4ve2v

그런데 방금 e2v4 를 얻었으므로 2v2v4 이고 이는 거짓이다. 그러므로 차수 3 이하인 정점이 있다.

답이 말이 되는가. 이 논법을 기억해 두자. 간선 수의 상한 + 악수 보조정리 = 작은 차수 정점의 존재. 바로 다음 절의 5색 정리가 정확히 이 논법으로 "차수 5 이하인 정점이 있다"를 얻는다. 그리고 이 예제의 결과를 쓰면 삼각형 없는 평면 그래프는 4색으로 칠할 수 있다는 것도 나온다 — 정점을 지웠다 되붙이는 14장의 색칠 논법에 "차수 3 이하"를 넣으면 된다.

평면 그래프의 5색 정리

지도를 칠하는 데 네 가지 색이면 충분하다는 것이 유명한 4색 정리다. 그 증명은 이 문서의 범위를 크게 넘는다(1970년대에 컴퓨터로 경우를 잔뜩 검사해서야 증명되었다). 그런데 다섯 가지 색으로 충분하다는 것은 지금까지 세운 것으로 증명할 수 있다.

보조정리 셋이 필요하다. 앞의 둘은 평면 배치의 정의에 대한 구조적 귀납법으로 증명되고, 그림으로는 자명하다.

여기서 합치기는 두 정점 n1, n2 를 지우고 새 정점 m 을 넣어, n1 이나 n2 에 인접했던 모든 정점에 m 을 인접하게 만드는 것이다.

두 정점이 인접하므로 그 간선을 따라 한쪽을 끌어당기면 된다. 합친 뒤 정점이 하나 줄어드는 것이 귀납법의 발판이다
<두 정점이 인접하므로 그 간선을 따라 한쪽을 끌어당기면 된다. 합친 뒤 정점이 하나 줄어드는 것이 귀납법의 발판이다>[원본 보기]

보조정리 6 의 증명. 모든 정점의 차수가 6 이상이라고 가정하자. 악수 보조정리에 의해 2e=vdeg(v)6v, 곧 e3v 다. 그런데 간선 수 상한에 의해 e3v6<3v 이므로 모순이다(정점이 셋 미만인 경우는 차수가 1 이하라 곧바로 성립한다).

5색 정리. 모든 평면 그래프는 5-색칠 가능하다.

차수가 정확히 5 일 때만 손이 더 간다. 그때 인접하지 않은 이웃 둘을 합쳐 색을 아껴 쓰는 것이 요령이다
<차수가 정확히 5 일 때만 손이 더 간다. 그때 인접하지 않은 이웃 둘을 합쳐 색을 아껴 쓰는 것이 요령이다>[원본 보기]

예제 178

5색 정리를 증명하라.

증명

뼈대는 이렇다. 차수 5 이하인 정점 g 를 지우고 귀납 가정으로 칠한 뒤 되붙인다. 차수가 4 이하면 색이 남으니 끝이다. 정확히 5 면 색이 모자랄 수 있는데, 그때는 이웃 둘을 미리 같은 색으로 만들어 놓는다.

증명. 정점 수 v 에 대한 강한 귀납법을 쓴다. 명제는 "정점이 v 개인 모든 평면 그래프는 5-색칠 가능하다"다.

기저 단계 (v5). 정점마다 다른 색을 주면 된다.

귀납 단계. 정점이 v+1 개인 평면 그래프 G 를 잡자. 보조정리 6 에 의해 차수 5 이하인 정점 g 가 있다.

경우 1 (deg(g)<5). g 를 지운 그래프 H 는 보조정리 4 에 의해 평면이고 정점이 v 개이므로 귀납 가정에 의해 5-색칠 가능하다. 그 색칠을 g 말고 모든 정점에 그대로 쓰고, g 의 이웃이 5 개보다 적으므로 쓰이지 않은 색이 하나 남는다. 그것을 g 에 준다.

경우 2 (deg(g)=5). g 의 이웃 다섯이 서로 모두 인접하다면 그 다섯이 K5 와 동형인 부분그래프가 되고, 보조정리 4 와 "K5 는 평면이 아니다"에 어긋난다. 그러므로 인접하지 않은 이웃 n1, n2 가 있다.

이제 gn1 을 합쳐 새 정점 m 을 만든다. 둘은 인접하므로 보조정리 5 에 의해 평면이다. n2g 에 인접했으므로 m 에도 인접하다. 그래서 mn2 를 다시 합칠 수 있고, 그 결과 G 도 평면이다. 정점은 v+1 에서 셋이 하나로 줄었으므로 v1 개다.

귀납 가정에 의해 G5-색칠한다. 그 색칠을 G 로 옮기되, 합쳐진 정점의 색을 n1n2 둘에 똑같이 준다. n1n2G 에서 인접하지 않으므로 같은 색이어도 규칙을 어기지 않는다. 나머지 정점은 G 의 색을 그대로 쓴다. g 를 빼면 올바른 색칠이다.

마지막으로 g 를 칠한다. g 의 이웃은 다섯인데 그중 둘이 같은 색이므로 이웃이 쓰는 색은 많아야 네 가지다. 남은 색을 g 에 준다.

두 경우 모두 5-색칠을 얻었다.

답이 말이 되는가. 증명이 어디서 평면성을 썼는지 세어 보자. 세 곳이다 — 차수 5 이하 정점의 존재(보조정리 6, 그것도 간선 수 상한에서 나왔다), 부분그래프의 평면성, 합치기 뒤의 평면성. 그리고 경우 2 에서 K5 가 평면이 아니라는 사실을 썼다. 이 장에서 세운 것이 거의 다 동원된 셈이다.

왜 이 방법으로 4색까지 가지 못하는가. 경우 2 에서 이웃 둘을 합쳐 색 하나를 아꼈다. 4색으로 하려면 차수 4 이하 정점을 찾아야 하는데 그것이 보장되지 않고, 차수 4 인 경우에 같은 요령을 쓰면 이웃 넷 중 둘을 합쳐야 하는데 인접하지 않은 이웃 쌍이 있다는 보장이 없다. 그 틈을 메우는 데 백 년이 걸렸다.

예제 179

채색수가 정확히 4 인 평면 그래프를 하나 제시하라. 그리고 이 사실이 5색 정리와 4색 정리 각각에 대해 무엇을 말하는지 밝혀라.

풀이 보기

무엇을 묻는가. 색 넷이 실제로 필요한 평면 그래프의 예다.

K4 를 보자. 평면인가? v=4, e=6 이고 3v6=6 이므로 부등식을 어기지 않는다. 그리고 실제로 그려진다 — 삼각형 하나를 그리고 가운데에 정점을 놓아 세 꼭짓점과 이으면 된다. 앞의 정사면체 그림이 바로 그것이다.

채색수는 4 다. 완전 그래프이므로 어느 두 정점도 같은 색일 수 없고, 정점이 넷이므로 χ(K4)=4 다.

5색 정리에 대해. 이 예는 5색 정리의 상한이 3색까지 내려갈 수는 없다는 것을 말한다. 곧 "모든 평면 그래프는 3색으로 칠할 수 있다"는 거짓이다.

4색 정리에 대해. 이 예는 4색 정리의 4 라는 수가 최선임을 말한다. 색을 셋으로 줄인 정리는 있을 수 없다.

답이 말이 되는가. 그러면 남은 틈은 하나다 — 채색수가 정확히 5 인 평면 그래프가 있는가. 4색 정리가 "없다"고 답하지만 그 증명은 이 문서의 범위를 넘는다. 우리가 증명한 5색 정리는 "6 이상은 필요 없다"까지다. 참고로 14장의 차수 한계 정리만 쓰면 훨씬 못한 결과가 나온다 — 평면 그래프의 최대 차수에는 상한이 없으므로 그 정리로는 아무 유한한 색 수도 얻지 못한다. 평면성을 써야 5 가 나온다.

정다면체는 왜 다섯 개뿐인가

피타고라스 학파에는 두 가지 비밀이 있었다고 한다. 하나는 2 가 무리수라는 것이고(3장에서 증명했다) 다른 하나가 이 절의 것이다.

정의. 다면체는 유한한 개수의 다각형 면으로 둘러싸인 볼록한 삼차원 영역이다. 면이 모두 합동인 정다각형이고 꼭짓점마다 같은 개수의 면이 모이면 그 다면체를 정다면체라 한다.

정다면체 안에 구를 하나 넣고 다면체의 모서리를 구 위로 투영하면, 구 위에 그린 평면 배치가 된다. 앞에서 구 위의 배치와 평면 위의 배치가 같은 것임을 확인했으므로 오일러 공식을 쓸 수 있다.

세 정다면체를 엇갈림 없이 평면에 그린 것이다. 꼭짓점마다 면이 m 개 모이고 면마다 변이 n 개라는 두 조건이 셈의 재료다
<세 정다면체를 엇갈림 없이 평면에 그린 것이다. 꼭짓점마다 면이 m 개 모이고 면마다 변이 n 개라는 두 조건이 셈의 재료다>[원본 보기]

예제 180

정다면체의 면이 n 각형이고 꼭짓점마다 면이 m 모인다고 하자. 다음을 증명하라.

1m+1n=1e+12

증명

뼈대는 이렇다. 간선을 두 번 세는 셈을 두 가지 방식으로 하고, 오일러 공식에 넣는다. 14장의 악수 보조정리와 같은 발상이다.

꼭짓점 쪽에서. 꼭짓점마다 면이 m 개 모이면 그 꼭짓점에 모이는 모서리도 m 개다(면 두 개가 모서리 하나를 사이에 두고 만나므로, 한 꼭짓점 주위를 돌면 면과 모서리가 번갈아 나온다). 곧 모든 정점의 차수가 m 이므로 악수 보조정리에 의해

mv=2e

면 쪽에서. 면마다 변이 n 개이고 각 모서리는 정확히 두 면의 경계에 있으므로

nf=2e

두 식을 vf 에 대해 풀면 v=2e/m, f=2e/n 이다. 오일러 공식 ve+f=2 에 넣으면

2eme+2en=2

양변을 2e 로 나누면

1m12+1n=1e

이고 정리하면 구하려던 식이다.

답이 말이 되는가. 정육면체로 확인해 보자. n=4(정사각형 면), m=3(꼭짓점마다 세 면), e=12 이다. 왼쪽은 1/3+1/4=7/12 이고 오른쪽은 1/12+1/2=7/12 다. 맞는다.

초록 칸 다섯 개가 조건을 만족하는 (n, m) 전부다. n 이나 m 이 6 이상이면 왼쪽이 1/2 이하가 되어 곧바로 탈락한다
<초록 칸 다섯 개가 조건을 만족하는 (n, m) 전부다. n 이나 m 이 6 이상이면 왼쪽이 1/2 이하가 되어 곧바로 탈락한다>[원본 보기]

예제 181

위 식으로부터 정다면체가 다섯 종류뿐임을 증명하라.

증명

뼈대는 이렇다. e 가 양수이므로 왼쪽이 1/2 보다 커야 하고, 그 조건이 후보를 몇 개로 묶는다.

증명. e>0 이므로 1/e>0 이고 따라서

1m+1n>12

이어야 한다. 그리고 두 가지 제약이 더 있다. 다각형의 변은 3 개 이상이므로 n3 이고, 한 꼭짓점에 면이 셋 이상 모여야 입체가 되므로 m3 이다.

이제 n 이나 m 중 하나가 6 이상이라고 하자. 다른 하나는 3 이상이므로 왼쪽이 많아야

13+16=12

인데 이는 1/2 보다 크지 않다. 그러므로 nm 은 모두 3,4,5 중 하나다. 남은 아홉 가지를 하나씩 확인하면 그림의 표대로 다섯 가지만 부등식을 만족한다.

(n,m){(3,3),(4,3),(3,4),(3,5),(5,3)}

각 경우에 e1/e=1/m+1/n1/2 로 구하고 v=2e/m, f=2e/n 을 구하면 그림의 표가 된다. 차례로 정사면체·정육면체·정팔면체·정이십면체·정십이면체다.

답이 말이 되는가. 여기서 증명한 것을 정확히 말하면 "정다면체가 있다면 그 (n,m) 은 이 다섯 중 하나다"다. 부등식은 후보를 줄일 뿐 존재를 주지 않는다. 다섯이 모두 실제로 만들어진다는 것은 따로 확인해야 하고, 앞 그림에서 셋을 그렸으며 나머지 둘도 만들 수 있다.

결론을 말로 옮기면 이렇다. "똑같이 생긴 정다각형으로 빈틈없이 볼록한 입체를 만드는 방법은 다섯 가지뿐이다." 이 사실을 얻는 데 쓴 것은 그래프의 정점·간선·면을 센 것과 오일러 공식뿐이다 — 삼차원 도형에 대한 사실이 이차원의 셈에서 나왔다. 그리고 이 결과에는 실용적인 따름이 있다. 인공위성을 지구 표면에 완벽히 고르게 배치하려면 정다면체의 꼭짓점에 두면 되는데, 그렇게 배치할 수 있는 위성 수는 4,6,8,12,20 개뿐이다.

평면성의 또 다른 특징

K5K3,3 를 예로 고른 데는 이유가 있다. 이 둘이 평면성 전체를 특징짓는다.

정의. 그래프 G마이너(minor)G 에서 정점 지우기, 간선 지우기, 인접한 두 정점 합치기를 몇 번이든 어떤 순서로든 되풀이해 얻을 수 있는 그래프다.

쿠라토프스키 정리(Kuratowski). 그래프가 평면이 아닌 것과 K5 또는 K3,3 를 마이너로 갖는 것은 같다.

이 정리의 증명은 입문서에 담기에 너무 길어 여기서는 서술만 한다. 다만 한 방향은 우리가 이미 가지고 있다. 보조정리 4 와 5 는 정점·간선 지우기와 인접 정점 합치기가 평면성을 지킨다고 말한다. 그러므로 평면 그래프의 마이너는 모두 평면이고, K5K3,3 를 마이너로 가지면 그 그래프는 평면이 아니다. 어려운 방향은 그 반대다.

오류 찾기

다음 "증명"은 결론이 거짓이다. 반례를 들고 어느 단계가 틀렸는지 찾아라.

가짜 정리. 간선이 3v6 개 이하인 모든 연결 그래프는 평면이다.

  1. 평면 그래프는 e3v6 을 만족한다(앞에서 증명했다).
  2. 그러므로 e3v6 이 평면성의 조건이다.
  3. 어떤 연결 그래프의 간선이 3v6 개 이하이면 조건을 만족한다.
  4. 따라서 그 그래프는 평면이다.
풀이 보기

먼저 반례를 만든다. K3,3 를 보자. v=6, e=9 이고 3v6=129 이므로 부등식을 만족한다. 그런데 앞에서 K3,3 가 평면이 아님을 증명했다.

틀린 단계는 2번이다. 1번이 실제로 말한 것은 "평면이면 e3v6 이다", 곧 평면부등식 이다. 2번은 그것을 "조건이다"라는 말로 슬쩍 동치로 바꿨다. 5장의 말로 하면 필요조건을 충분조건으로 뒤집은 것이고, 3장의 말로 하면 역을 참으로 가정한 것이다.

정확히 적어 보면 함정이 사라진다. e3v6 은 평면성의 필요조건이다. 그래서 이 부등식을 어기면 평면이 아니라고 결론지을 수 있고, 실제로 K5 를 그렇게 처리했다. 하지만 부등식을 만족한다고 평면인 것은 아니다. K3,3 가 바로 그 틈에 들어 있고, 그래서 이분성이라는 정보를 더 써서 더 조인 부등식 e2v4 를 만들어야 했다.

평면성의 참된 필요충분조건은 쿠라토프스키 정리다. 간선 수를 세는 것만으로는 평면성을 판정할 수 없다 — 간선 수는 정점의 이름도 배치도 보지 않지만, 평면성은 "어느 정점들이 어떻게 엮여 있는가"에 달려 있다.

이 장에서 새로 나온 것

기호·용어
그림 · 평면적 그림 · 평면 그래프정점에 점, 간선에 곡선을 배정 · 곡선이 엇갈리지 않는다 · 그런 그림이 있는 그래프
면 · 바깥면곡선들이 평면을 나눈 조각 · 무한히 뻗는 조각. 특별한 면은 아니다
이산면면의 경계를 따라간 닫힌 보행. 연속적인 영역을 이산적으로 적은 것
다리 · 동글자른 간선 · 다리로만 된 나무. 둘 다 경계에 두 번 나온다
평면 배치닫힌 보행들의 모음. 기저(정점 하나)와 두 생성자로 재귀적으로 정의된다
면 쪼개기한 면 위의 두 정점을 잇는다. ef 가 각각 1 늚
다리 잇기떨어진 두 배치를 잇는다. e 는 1 늘고 f 는 1 줄음
오일러 공식ve+f=2. 구조적 귀납법으로 증명된다
간선마다 두 번각 간선은 두 면에 한 번씩 또는 한 면에 두 번. 길이 총합이 2e
간선 수 상한v3 이면 e3v6. 이분이거나 삼각형이 없으면 e2v4
K5K3,3둘 다 평면이 아니다. 앞은 첫 부등식, 뒤는 둘째 부등식으로 걸린다
정점 합치기 · 마이너인접한 두 정점을 하나로 · 지우기와 합치기로 얻어지는 그래프
보조정리 4 · 5 · 6부분그래프는 평면 · 인접 정점 합치기는 평면 유지 · 차수 5 이하 정점이 있다
5색 정리모든 평면 그래프는 5색으로 칠할 수 있다. 4색은 훨씬 어렵다
정다면체와 (n,m)면이 정 n 각형, 꼭짓점마다 면 m 개. mv=2e, nf=2e
다면체 분류식1/m+1/n=1/e+1/2. 오른쪽이 1/2 를 넘어야 하므로 답이 다섯 개
쿠라토프스키 정리평면이 아닌 것과 K5 또는 K3,3 를 마이너로 갖는 것이 같다(서술만)

챙겨 갈 것은 넷이다.

이것으로 그래프 세 장이 끝났다. 13장에서 통신망을 척도로 견주고, 14장에서 방향 없는 그래프의 구조 정리를 증명하고, 15장에서 평면에 그릴 수 있는지를 물었다. 세 장이 함께 쓴 도구는 놀랍게도 앞 블록의 것들이었다 — 정렬성 원리, 보통·강한 귀납법, 구조적 귀납법, 비둘기집 원리, 그리고 두 번 세기다. 특히 마지막 것은 다음 블록의 주제다. 16장부터 셈 자체를 다루면서, 여기서 임시로 쓴 "양변을 두 번 센다"가 정식 도구가 된다.

합과 점근

지금 당장 10억 원을 받겠는가, 아니면 죽을 때까지 해마다 5000만 원을 받겠는가. 오래 살면 받는 돈의 총액은 훨씬 커진다. 그런데 나중에 받는 돈은 지금 받는 돈보다 값이 낮다 — 지금 받으면 그 돈을 굴려 이자를 얻을 수 있기 때문이다. 그러면 둘 중 어느 쪽이 나은가. 이 물음의 답은 합 하나를 계산하면 나온다.

이 장에서 답할 것은 넷이다. 긴 합을 짧은 식으로 바꾸는 방법은 무엇인가. 짧은 식이 아예 없을 때는 어떻게 하는가(적분으로 감싼다 — 이 장의 중심이다). n! 같은 곱은 어떻게 다루는가(로그를 씌워 합으로 바꾼다). 그리고 "대충 이만큼 자란다"를 어떻게 정확하게 말하는가(점근 표기).

앞 장들에서 가져오는 것은 많지 않다. 4장과 7장의 정렬성 원리와 귀납법으로 이 장의 공식들을 검산한다. 새로 필요한 도구는 미분과 적분인데 기초수학 문서의 /posts/fundamental/elementary-mathematics.html > 미분/posts/fundamental/elementary-mathematics.html > 정적분을 그대로 쓰고, 적분은 "곡선 아래의 넓이"라는 뜻만 알면 된다. 그리고 알고리즘 문서가 /posts/fundamental/algorithm.html > 점근 표기/posts/fundamental/algorithm.html > 증가율을 실용적으로 다뤘는데, 거기서는 "쓰는 법"이었고 여기서는 정의와 증명을 채운다.

닫힌 형태와 연금의 값

4장에서 1+2++n=n(n+1)/2 를 증명했다. 왼쪽은 항이 n 개이고 오른쪽은 곱셈 두 번과 나눗셈 한 번이다. 이렇게 시그마도 점점점도 쓰지 않고 적은 식닫힌 형태(closed form)라 한다. 좋은 까닭은 계산이 빠른 것만이 아니다 — 자라는 속도가 눈에 보인다. n(n+1)/2 를 보면 n 이 두 배가 되면 값이 네 배쯤 된다는 것이 곧바로 읽히지만 왼쪽을 보고는 알 수 없다.

이 장에서 가장 많이 쓰는 닫힌 형태는 등비합이다.

1+x+x2++xn=1xn+11x(x1)

기초수학에서 이 식을 보았을 것이다. 귀납법으로 증명하기도 쉽다. 그런데 귀납법은 이 식을 어떻게 찾았는지 알려 주지 않는다. 오른쪽 식을 누가 처음 어떻게 떠올렸는가. 그 방법이 이 절의 알맹이다.

예제 183

위 등비합의 닫힌 형태를 귀납법을 쓰지 않고 유도하라.

증명

뼈대는 이렇다. 합을 살짝 흔들어 자기 자신과 겹치게 만든다. 겹친 부분이 몽땅 지워지면 남는 것이 답이다.

증명. S::=1+x+x2++xn 이라 하자. 여기에 x 를 곱하면

xS=x+x2+x3++xn+1

이다. 두 식을 위아래로 놓고 보면 x 부터 xn 까지가 양쪽에 똑같이 있다. 그래서 빼면 지워진다.

SxS=1xn+1

왼쪽을 묶으면 S(1x)=1xn+1 이고, x1 이면 나눌 수 있다.

S=1xn+11x

이 수법을 섭동법(perturbation method)이라 한다. 합에 무언가를 곱하거나 항을 하나 밀어 자기 자신과 거의 같은 것을 만들고, 둘을 견주어 대부분을 지운다.

답이 말이 되는가. x=2, n=3 으로 확인하면 왼쪽은 1+2+4+8=15 이고 오른쪽은 (116)/(12)=15 다. 그리고 x=1 을 넣으면 오른쪽이 0/0 이 되는데, 실제로 그때는 합이 n+1 이므로 닫힌 형태가 아예 다르다. 나눌 때 x1 을 확인한 자리가 그것을 막았다.

막대의 높이가 등비수열이라는 것이 요점이다. 그래서 ‘영원히 받는다’ 는 경우에도 합이 유한하다
<막대의 높이가 등비수열이라는 것이 요점이다. 그래서 ‘영원히 받는다’ 는 경우에도 합이 유한하다>[원본 보기]

이제 첫 물음을 풀 수 있다. 돈을 이자율 p 로 굴릴 수 있다고 하자. 지금 가진 1 원은 한 해 뒤에 1+p 원이 된다. 거꾸로 한 해 뒤에 받을 1 원은 지금 값으로 1/(1+p)이다 — 지금 그만큼이 있으면 굴려서 한 해 뒤에 1 원이 되기 때문이다.

그래서 해마다 처음에 m 원씩 n 해 받는 연금(annuity)의 지금 값은

V=i=1nm(1+p)i1=mj=0n1xj=m1xn1x(x::=11+p)

다. 첫 등호에서 j=i1 로 바꿔 적었고, 마지막에서 등비합을 썼다.

예제 184

이자율이 p=0.08 이라 하자. (가) 해마다 5000만 원을 20해 받는 연금의 지금 값을 구하라. (나) 10억 원을 지금 받는 것과 견주면 어느 쪽이 나은가.

풀이 보기

무엇을 묻는가. 위 식에 값을 넣는 것이다.

(가) x=1/1.08=0.925926 이고 1x=0.074074 다. x20=1.0820=0.214548 이므로

V=5000×10.2145480.074074=5000×10.6036=53018

단위가 만 원이므로 약 5.3억 원이다.

(나) 받는 돈의 총액은 5000×20=10 억 원이지만 지금 값은 그 절반을 조금 넘는다. 그러므로 10억 원을 지금 받는 것이 낫다.

답이 말이 되는가. 총액이 같은데 값이 절반이라는 것이 놀랍게 들린다면 마지막 지급을 보면 된다. 스무째 해 지급은 지금부터 열아홉 해 뒤이므로 지금 값이 5000×1.0819=5000×0.2317=1159 만 원뿐이다. 뒤쪽 지급이 기하급수적으로 깎이는 것이 차이를 만든다. 복권 광고가 총액을 앞세우는 까닭이 이것이다.

무한히 많은 항

"죽을 때까지"를 낙관적으로 "영원히"로 바꾸면 항이 무한히 많아진다. 무한히 많은 돈일까. 아니다. 무한급수의 값은 부분합의 극한으로 정의되므로, |x|<1 일 때 xn+10 인 것에서 곧바로 정리가 나온다.

i=0xi::=limn1xn+11x=11x

x=1/(1+p)<1 이므로 영구 연금의 값은 V=m/(1x)=m(1+p)/p 다. m=5000 만 원, p=0.08 이면 V=5000×13.5=67500 만 원, 곧 6.75억 원이다. 영원히 받아도 10억 원보다 작다는 것이 이상하게 들리지만 뒤집어 보면 당연하다 — 10억 원을 지금 은행에 넣으면 이자만으로 해마다 8000만 원을 영원히 쓸 수 있다.

예제 185

i=1n1ixi 은 등비합이 아니다(항의 비가 일정하지 않다). 그런데도 닫힌 형태를 얻을 수 있다. 등비합 공식을 미분해서 유도하라. 그리고 |x|<1 일 때의 무한합도 구하라.

증명

뼈대는 이렇다. 이미 아는 항등식의 양변을 미분하면 새 항등식이 공짜로 나온다. xi 를 미분하면 ixi1 이므로 우리가 원하는 계수 i 가 생긴다.

증명. i=0n1xi=1xn1x 의 양변을 x 로 미분한다. 왼쪽은 항마다 미분해 i=0n1ixi1 이고 오른쪽은 몫의 미분법으로 다음과 같다.

nxn1(1x)+(1xn)(1x)2=1nxn1+(n1)xn(1x)2

지수가 하나씩 밀렸으니 양변에 x 를 곱해 맞춘다.

i=1n1ixi=xnxn+(n1)xn+1(1x)2

무한합. |x|<1 이면 nxn0 이고 nxn+10 이므로 극한을 취해

i=1ixi=x(1x)2

답이 말이 되는가. n=2 로 검산하면 왼쪽은 x 하나뿐이고 오른쪽은 (x2x2+x3)/(1x)2=x(1x)2/(1x)2=x 다. 맞는다.

이 결과에는 재미있는 따름이 있다. 해마다 지급액이 m,2m,3m, 으로 계속 늘어나는 연금도 값이 유한하다 — V=m(1+p)/p2 이다. 지급액은 덧셈으로 늘어나는데 돈의 값어치는 곱셈으로 깎이므로 곱셈이 이긴다.

거듭제곱의 합

1+2++n 의 닫힌 형태는 증명할 수 있었지만 어디서 왔는지는 아직 말하지 않았다. 두 가지 발견법을 보자.

예제 186

(가) 가우스가 어릴 때 썼다고 전해지는 방법으로 i=1ni 의 닫힌 형태를 유도하라. (나) 같은 수법이 i=1ni2 에는 통하지 않는다. 다른 발견법으로 그 닫힌 형태를 찾고, 찾은 것을 증명하라.

증명

(가) S::=i=1ni 를 두 방향으로 적고 세로로 더한다. 각 자리가 모두 n+1 이 되고 자리가 n 개다.

S=1+2++n,S=n+(n1)++12S=n(n+1)

그러므로 S=n(n+1)/2 다. 앞 절의 섭동법과 같은 발상이다 — 합을 흔들어 자기 자신과 겹치게 만들었다.

(나) 발견. 세로로 더해도 자리마다 값이 달라 이 수법은 통하지 않는다. 대신 답의 모양을 추측한다. 항이 n 개이고 평균이 n2 규모로 자라므로 합은 n3 규모일 것이다. 그래서 i2=an3+bn2+cn+d 라 가정하고 n=0,1,2,3 을 넣는다.

0=d,1=a+b+c+d,5=8a+4b+2c+d,14=27a+9b+3c+d

풀면 a=1/3, b=1/2, c=1/6, d=0 이고 정리하면 다음을 얻는다.

i=1ni2=n33+n22+n6=n(n+1)(2n+1)6

(나) 증명. 위 계산은 증명이 아니다. "답이 삼차 다항식이다"라는 가정을 확인하지 않았기 때문이다. 귀납법으로 따로 증명한다. n=0 에서 양변이 0 이고, n 에서 성립한다고 가정하면

i=1n+1i2=n(n+1)(2n+1)6+(n+1)2=(n+1)(2n2+7n+6)6=(n+1)(n+2)(2n+3)6

이고 이것이 n+1 에 대한 식이다.

답이 말이 되는가. 추측하는 단계와 증명하는 단계를 반드시 갈라 두어야 한다. 만약 답이 삼차가 아니었다면(예컨대 로그가 섞였다면) 위 연립방정식은 여전히 답을 주지만 그 답은 완전히 틀린 식이다. 18장에서 추측이 필요 없는 방법을 배운다 — 생성함수는 닫힌 형태를 계산으로 뽑아낸다.

합을 적분으로 근사하기

닫힌 형태가 아예 없는 합도 많다. i=1ni 가 그렇고 뒤에 나올 i=1n1/ii=1nlni 도 그렇다. 이럴 때는 닫힌 형태인 상한과 하한으로 감싼다. 발상은 한 문장이다 — 합은 폭이 1 인 직사각형들의 넓이이고 적분은 곡선 아래의 넓이다. 둘의 차이가 오차다. 이 절의 정리 하나가 이 장에서 가장 자주 쓰인다.

그러려면 함수가 한쪽으로만 움직여야 한다. 정의. 함수 f약증가(weakly increasing)한다는 것은 x<y 이면 f(x)f(y) 인 것이다. 부등호가 등호 없이 성립하면 강증가고, 약감소강감소도 같은 식으로 정의한다. "증가하지 않는다" 같은 말은 쓰지 않는다 — 5장에서 보았듯 부정이 붙은 말은 헷갈리고, "감소함수가 아니다"는 오르락내리락하는 함수까지 포함한다.

표본점의 어느 쪽에 칸을 세우느냐가 부등호의 방향을 정한다. 두 그림을 합치면 상한과 하한이 동시에 나오고, 둘의 차이는 f(n) − f(1) 뿐이다
<표본점의 어느 쪽에 칸을 세우느냐가 부등호의 방향을 정한다. 두 그림을 합치면 상한과 하한이 동시에 나오고, 둘의 차이는 f(n) − f(1) 뿐이다>[원본 보기]

정리(적분 한계). f 가 양의 실수에서 양의 실수로 가는 약증가 함수이고

S::=i=1nf(i),I::=1nf(x)dx

이면 I+f(1)SI+f(n) 이다. f 가 약감소하면 부등호가 뒤집혀 I+f(n)SI+f(1) 이다.

예제 187

위 정리의 약증가 경우를 증명하라. 그리고 약감소 경우가 왜 부등호가 뒤집히는지 설명하라.

증명

뼈대는 이렇다. 칸 하나와 곡선 한 토막을 견준다. 칸을 표본점의 오른쪽에 세우면 곡선 아래로 들어가고, 왼쪽에 세우면 곡선을 덮는다.

상한. i=1,,n1 에 대해 구간 [i,i+1] 위에 높이 f(i) 인 칸을 세운다. f 가 약증가하므로 그 구간 안에서 f(x)f(i) 이고, 따라서 f(i)=ii+1f(i)dxii+1f(x)dx 다. i=1 부터 n1 까지 더하면 왼쪽은 Sf(n) 이고 오른쪽은 I 다. 곧 SI+f(n).

하한. 이번에는 i=2,,n 에 대해 구간 [i1,i] 위에 높이 f(i) 인 칸을 세운다. 그 구간 안에서 f(x)f(i) 이므로 i1if(x)dxf(i) 다. i=2 부터 n 까지 더하면 왼쪽이 I 이고 오른쪽이 Sf(1) 이다. 곧 I+f(1)S.

약감소 경우. 부등식을 세운 곳은 "구간 안에서 f(x)f(i) 보다 큰가 작은가" 두 군데뿐이다. 약감소하면 그 두 부등호가 모두 뒤집히므로 결론의 부등호도 뒤집힌다.

답이 말이 되는가. 두 한계의 차이는 f(n)f(1) 이다. 곧 이 방법의 오차는 아무리 커도 합의 가장 큰 항만큼이다. 합 자체가 항 수만큼 커지므로, 항이 많아지면 오차의 비중은 작아진다. 그래서 이 어수룩해 보이는 방법이 쓸모가 있다.

예제 188

S=i=1ni 를 위 정리로 감싸라. 그리고 얻은 한계가 얼마나 좋은지 n=100 에서 확인하라.

풀이 보기

무엇을 묻는가. 상한과 하한, 그리고 그 품질이다.

f(x)=x 는 약증가(사실 강증가)한다. 적분은

I=1nx1/2dx=[23x3/2]1n=23(n3/21)

정리에 넣으면

23n3/2+13S23n3/2+n23

n=100 에서. 23×1000=666.7 이므로 하한이 667.0, 상한이 676.0 이다. 참값은 671.5 다.

답이 말이 되는가. 폭이 9 인 구간이 참값을 감쌌고, 그 폭은 1001=9, 곧 가장 큰 항이다. 값 자체가 671 이므로 상대 오차는 1% 남짓이다. 참값을 몰라도 "23n3/2 쯤"이라고 확실하게 말할 수 있다는 것이 이 방법의 값어치다.

이 정리로 급수의 수렴 판정도 곧바로 나온다. i11/ip 는 항이 양수이므로 부분합이 유계인 것과 수렴하는 것이 같고, 부분합이 적분과 항 하나 차이이므로 적분이 유한한가만 보면 된다. 1nxpdx=(n1p1)/(1p)p>1 일 때만 수렴하고(p=1 이면 lnn 이라 발산한다), 따라서 급수도 그때만 수렴한다. 경계에 놓인 발산하는 급수 1/i 가 다음 절의 주인공이다.

조화수

정의. n 번째 조화수(harmonic number)

Hn::=i=1n1i=1+12+13++1n

이다. 닫힌 형태는 알려져 있지 않다. 그런데 이 수는 셈과 확률과 알고리즘 분석에서 끊임없이 나온다. 왜 그런지 보이는 예 하나를 들자.

책 네 권이면 맨 위 책이 책상 모서리를 책 한 권 길이보다 더 나간다. 미는 몫이 1/2, 1/4, 1/6, 1/8 이라는 것이 조화수가 나오는 자리다
<책 네 권이면 맨 위 책이 책상 모서리를 책 한 권 길이보다 더 나간다. 미는 몫이 1/2, 1/4, 1/6, 1/8 이라는 것이 조화수가 나오는 자리다>[원본 보기]

예제 189

책을 여러 권 쌓아 맨 위 책을 책상 모서리 밖으로 최대한 내밀려 한다. 책 한 권 길이를 1 이라 하고, 쌓은 더미가 넘어지지 않는다는 것은 위쪽 i 권의 무게중심이 i+1 번째 책 위에 있다는 뜻이라 하자. n 권으로 내밀 수 있는 최대 길이 Bn 을 구하라.

증명

뼈대는 이렇다. 맨 아래에 책 한 권을 새로 넣는 것으로 점화식을 세운다.

기저. 한 권이면 무게중심이 가운데이므로 B1=1/2 이다.

점화식. n+1 권으로 최대한 내미는 방법은 n 권을 최적으로 쌓은 더미를 맨 아래 책 위에 얹는 것이다(위 더미가 최적이 아니라면 그것을 최적인 것으로 바꾸어 더 내밀 수 있다). 그리고 위 더미의 무게중심을 맨 아래 책의 오른쪽 끝에 정확히 맞추면 가장 멀리 간다.

이때 늘어나는 몫을 계산한다. 위 n 권의 무게중심을 원점으로 잡으면 아래 책의 무게중심은 1/2 에 있고, 책의 무게가 모두 같으므로 n+1 권 전체의 무게중심은 (0n+(1/2)1)/(n+1)=1/(2(n+1)) 이다. 이 값이 곧 늘어난 몫이므로 Bn+1=Bn+1/(2(n+1)) 다.

풀기. 펼쳐 쓰면 다음과 같다.

Bn=12+122+123++12n=Hn2

답이 말이 되는가. H4=1+12+13+14=2512 이므로 B4=25/24>1 이다. 책 네 권으로 맨 위 책을 책 한 권 길이보다 더 내밀 수 있다. 처음 들으면 안 될 것 같은데 되는 이유는, 앞 절에서 본 대로 Hn 이 발산하기 때문이다 — 책이 넉넉하면 얼마든지 멀리 나간다.

조화수의 계단이 로그 곡선과 나란히 올라간다. 두 값의 차이가 한 상수로 굳는 것이 그림의 요점이다
<조화수의 계단이 로그 곡선과 나란히 올라간다. 두 값의 차이가 한 상수로 굳는 것이 그림의 요점이다>[원본 보기]

Hn 의 크기는 앞 절의 정리로 곧바로 나온다. f(x)=1/x 는 약감소하고 I=1ndx/x=lnn 이므로

lnn+1nHnlnn+1

이다. 곧 Hnlnn 과 아주 가깝다. 실제로는 더 정확한 값이 알려져 있다.

Hn=lnn+γ+12n112n2+ϵ(n)120n4

여기서 γ=0.577215664오일러 상수(Euler's constant)이고 ϵ(n)01 사이다. 이 식은 증명하지 않는다. 앞 예제로 돌아가면, 책을 세 권 길이만큼 내밀려면 Hn6 이어야 하므로 대략 ne6403 이고 정확히 계산하면 227 권으로 충분하다. 내민 길이가 로그로 자라면 책 수는 지수로 늘어난다 — "얼마든지 멀리 갈 수 있다"와 "실제로 갈 만하다"는 아주 다른 이야기다.

점근적으로 같다

Hn 을 "lnn 쯤"이라고 말할 때 그 "쯤"을 정확히 적을 표기가 필요하다.

정의. 함수 f, g 에 대해 fg (fg점근적으로 같다)는

limxf(x)g(x)=1

을 뜻한다. 그러므로 Hnlnn 이다.

여기서 헷갈리기 쉬운 것이 있다. Hnlnn+γ 라고 쓰면 더 정확해 보이지만 아무것도 더 말하지 않는다. 정의에 따르면 어떤 상수 c 에 대해서도 Hnlnn+c 이기 때문이다. 상수는 비율에 영향을 주지 않는다. "둘째로 큰 항이 γ 다"를 말하려면 이렇게 적어야 한다.

Hnlnnγ

곱은 로그를 씌워 합으로

지금까지 만든 도구는 모두 합에 대한 것이다. 그런데 n! 처럼 곱이 필요한 자리가 많다. 새 도구가 필요하지는 않다. 로그를 씌우면 곱이 합이 된다.

P=i=1nf(i)lnP=i=1nlnf(i)

합을 다룬 뒤 마지막에 e 의 거듭제곱을 취해 로그를 벗기면 된다.

예제 190

적분 한계로 n! 의 상한과 하한을 구하라.

증명

뼈대는 이렇다. lnn! 을 합으로 적고 적분으로 감싼 뒤 지수를 취한다.

증명. lnn!=i=1nlni 이고 lnx 는 약증가한다. 적분은 I=1nlnxdx=[xlnxx]1n=nlnnn+1 이고, 약증가 경우의 정리에서 f(1)=0, f(n)=lnn 이므로

nlnnn+1lnn!nlnnn+1+lnn

이다. 양변에 지수를 취하면

nnen1n!nn+1en1

답이 말이 되는가. 상한과 하한의 비가 n 이다. 합에서는 오차가 항 하나였는데 지수를 취하니 오차가 곱셈 n 배로 벌어졌다. 로그를 씌워 합으로 바꾸는 수법의 대가가 이것이다. n=10 에서 하한은 1010/e91.23×106, 참값은 3.63×106, 상한은 1.23×107 이다. 규모는 맞지만 자릿수 하나가 흔들린다. 그래서 더 좋은 근사가 필요하다.

스털링 근사의 상대 오차가 n = 1 에서도 10% 아래이고 n = 10 에서 1% 아래다. 오른쪽 상자가 오차항의 정확한 범위다
<스털링 근사의 상대 오차가 n = 1 에서도 10% 아래이고 n = 10 에서 1% 아래다. 오른쪽 상자가 오차항의 정확한 범위다>[원본 보기]

정리(스털링 근사). 모든 n1 에 대해

n!=2πn(ne)neϵ(n),112n+1ϵ(n)112n

이다. 증명은 이 문서의 범위를 넘는다(귀납법으로도 되고 미적분으로도 되지만 둘 다 길다). 대신 이 식에서 무엇을 읽어야 하는지를 적는다.

예제 191

동전을 2n 번 던져 앞면이 정확히 n 번 나오는 경우의 비율은 (2n)!22n(n!)2 이다(19장에서 이것이 확률임을 보인다). 스털링 근사로 이 값이 1/πn 과 점근적으로 같음을 보여라.

증명

뼈대는 이렇다. 분자와 분모에 각각 스털링을 넣고 약분한다. 관계는 곱과 나눗셈에서 그대로 유지되므로 근사식을 그냥 대입해도 된다.

증명. (2n)!4πn(2n/e)2n 이고 (n!)22πn(n/e)2n 이다. 그러므로

(2n)!22n(n!)24πn22nn2ne2n22n2πnn2ne2n=4πn2πn=2πn2πn=1πn

답이 말이 되는가. n2ne2n22n모두 약분되고 남은 것이 제곱근뿐이다. 스털링 근사를 쓰는 전형적인 모양이다. 값을 확인하면 n=50 (동전 100번)에서 1/50π=0.0798 이다. 곧 동전 100번에 앞면이 정확히 50번일 확률은 8% 정도다. 가장 흔한 결과인데도 10%가 안 된다는 것이 확률에서 되풀이 나오는 감각이다.

이중 합

합 안에 합이 있으면 안쪽부터 닫힌 형태로 바꾸고 밖으로 나간다. 그런데 안쪽에 닫힌 형태가 없을 때가 있다. 그때 쓰는 요령이 더하는 순서를 바꾸는 것이다.

같은 삼각형을 행으로 더하나 열로 더하나 총합은 같다. 행 쪽에는 닫힌 형태가 없지만 열 쪽에는 있다
<같은 삼각형을 행으로 더하나 열로 더하나 총합은 같다. 행 쪽에는 닫힌 형태가 없지만 열 쪽에는 있다>[원본 보기]

예제 192

k=1nHk 의 닫힌 형태를 구하라.

증명

뼈대는 이렇다. (k,j) 쌍을 삼각형으로 늘어놓고 열 방향으로 더한다. Hk 자체에는 닫힌 형태가 없으므로 행 방향으로는 길이 막힌다.

증명. 정의를 펼치면 k=1nHk=k=1nj=1k1/j 이고, 더하는 쌍 (k,j)1jkn 인 것 전부다. 이 조건을 j 를 먼저 고르는 쪽으로 다시 읽으면 "j1 부터 n 까지 고르고 kj 부터 n 까지 고른다"다. 그래서 순서를 바꿔 적을 수 있다.

k=1nj=1k1j=j=1nk=jn1j=j=1n1j(nj+1)

안쪽 합에서 1/jk 와 무관하므로 항의 개수 nj+1 을 곱한 것이다. 이제 펼치면

j=1nn+1jj=1njj=(n+1)Hnn

답이 말이 되는가. n=3 으로 검산하자. 왼쪽은 H1+H2+H3=1+1.5+1.8333=4.3333 이고 오른쪽은 4×1.83333=4.3333 이다. 맞는다.

여기서 눈여겨볼 것은 닫힌 형태가 없는 Hn 이 답에 그대로 남았다는 점이다. 그래도 이것은 닫힌 형태다 — Hn 을 하나의 이름으로 인정하기로 했으므로 시그마가 사라진 것으로 충분하다. 그리고 적분 한계를 쓰면 이 합이 nlnn 규모임을 곧바로 알 수 있다.

점근 표기

"23n3/2 쯤", "lnn 규모" 같은 말을 계속 써 왔다. 이제 정확히 적는다. 표기가 여섯 개인데 정의가 필요한 것은 셋뿐이고 나머지는 뒤집거나 겹친 것이다.

작은 o — 확실히 느리다

정의. g 가 음이 아닌 함수일 때, f=o(g) ("fg 보다 점근적으로 작다")는

limxf(x)g(x)=0

을 뜻한다. 예컨대 1000x1.9=o(x2) 이다. 비가 1000/x0.1 이고 이것은 0 으로 간다. 상수 1000 이 아무리 커도 지수의 차이를 못 이긴다.

여기서 두 보조정리가 나온다. 앞으로 계속 쓴다.

큰 O — 크게 빠르지는 않다

정의. g 가 음이 아닌 함수일 때, f=O(g)어떤 상수 c0 과 어떤 x0 이 있어서 모든 xx0 에 대해 |f(x)|cg(x) 인 것이다.

정의가 복잡해 보이지만 뜻은 간단하다. fg 인데 상수배는 눈감아 주고, 작은 x 에서의 예외도 눈감아 준다.

상수 c 와 문턱 x~0 은 서로 맞바꾸는 값이다. 정의는 그런 쌍이 하나라도 있으면 된다고 말한다
<상수 c 와 문턱 x~0 은 서로 맞바꾸는 값이다. 정의는 그런 쌍이 하나라도 있으면 된다고 말한다>[원본 보기]

극한으로 적으면 이렇다. f=O(g)lim supx|f(x)|/g(x)< 와 같다. 여기서 상극한(lim sup)이 나오는 까닭은 극한이 없는 경우까지 담아야 하기 때문이다. f/g35 사이를 오락가락하면 극한은 없지만 f=O(g) 는 참이다.

예제 193

정의로 다음을 판정하라. (가) 100x2=O(x2) (나) x2+100x+10=O(x2) (다) 4x=O(2x) (라) x=O(xsin2x+1)

증명

(가) 참이다. c=100, x0=1 을 대면 |100x2|100x2 이 모든 x1 에서 성립한다.

(나) 참이다. 비를 계산하면 1+100/x+10/x21 이므로 사실 x2+100x+10x2 이고, 뒤에서 볼 보조정리에 의해 O 도 성립한다. 정의로 직접 확인하려면 x100 에서 100xx2 이고 10x2 이므로 c=3, x0=100 을 대면 된다.

(다) 거짓이다. 4x/2x=2x 이므로 어떤 상수로도 누를 수 없다. 밑의 차이가 "상수배"라고 생각하기 쉬운데 4x2x 의 제곱이다. 이 함정에는 이름이 붙어 있다 — 지수의 낭패(exponential fiasco)다.

(라) 거짓이다. x=πk 인 점에서 sinx=0 이므로 오른쪽이 1 이 된다. 그런 x 가 얼마든지 큰 곳에 있으므로 xc1 이 될 수 없다.

답이 말이 되는가. (라)의 두 함수는 어느 쪽도 다른 쪽의 O 가 아니다 — 거꾸로 xsin2x+1x+1 이므로 그 방향은 성립한다. 그러니 이 경우는 한쪽만 성립한다. 어느 쪽도 성립하지 않는 쌍도 만들 수 있고, 그것이 "O 는 전순서가 아니다"라는 말의 뜻이다.

나머지 넷

세 개를 정의했으니 나머지는 이름을 붙이는 일뿐이다.

표기읽는 말
f=o(g)limf/g=0확실히 느리다
f=O(g)어떤 c,x0 이 있어 xx0 에서 |f|cg크게 빠르지는 않다
fglimf/g=1앞머리가 같다
f=Ω(g)g=O(f) 로 정의한다크게 느리지는 않다
f=ω(g)g=o(f) 로 정의한다확실히 빠르다
f=Θ(g)f=O(g) 이고 g=O(f)상수배 안에서 같다

Θ 가 실전에서 가장 유용하다. 상한과 하한을 한꺼번에 말하기 때문이다. 예컨대 어떤 절차의 실행 시간이 T(n)=10n320n2+1 이면 T(n)=Θ(n3) 이라 적고, "입력이 두 배가 되면 시간이 여덟 배쯤"이라는 정보가 여기에 담긴다.

화살표는 함의의 방향이고 거꾸로는 성립하지 않는다. 아래 상자는 여섯 표기를 관계로 볼 때 어떤 성질을 갖는지 정리한 것이다
<화살표는 함의의 방향이고 거꾸로는 성립하지 않는다. 아래 상자는 여섯 표기를 관계로 볼 때 어떤 성질을 갖는지 정리한 것이다>[원본 보기]

세 가지 사실을 미리 적어 둔다. 증명은 모두 극한의 성질 한 줄이다. f=o(g) 이거나 fg 이면 f=O(g)(극한이 0 이든 1 이든 유한하므로 상극한이 유한하다). 그 역은 거짓이다(2x=O(x) 이지만 2xx 도 아니고 2x=o(x) 도 아니다). 그리고 f=o(g) 이면 g=O(f) 는 거짓이다(limg/f=1/0= 이므로).

이 사실들이 표기의 성질을 정한다. oω강한 부분순서이고(12장의 말이다), Θ동치관계다. O 는 반사적이고 추이적이지만 반대칭이 아니다x=O(2x) 이고 2x=O(x) 인데 두 함수는 다르다. 그래서 O 는 부분순서가 되지 못하고, Θ 로 묶은 덩어리들 사이에서만 순서가 된다.

예제 194

스털링 근사를 쓰지 않고 log(n!)=Θ(nlogn) 을 증명하라.

증명

뼈대는 이렇다. 위쪽은 모든 인수를 n 으로 키우고, 아래쪽은 큰 절반만 남긴다.

상한. n! 의 인수가 모두 n 이하이므로 n!nn 이고 따라서 log(n!)nlogn, 곧 log(n!)=O(nlogn) 이다.

하한. n! 의 인수 가운데 큰 쪽 절반만 남기고 나머지를 1 로 낮추면 값이 작아진다. 남긴 인수는 n/2 개이고 모두 n/2 이상이므로 다음이 성립한다.

n!(n2)n/2log(n!)n2(logn1)

n4 이면 logn2 (밑이 2일 때)이므로 logn112logn 이고 따라서 log(n!)(nlogn)/4, 곧 nlogn=O(log(n!)) 이다. 두 방향을 합치면 log(n!)=Θ(nlogn).

답이 말이 되는가. 스털링 근사에서도 같은 결과가 나온다 — log(n!)nlognn/ln2nlogn 이다. 그런데 위 증명은 근사식을 전혀 쓰지 않았다. 상한은 인수를 키우고 하한은 인수를 버리는 것만으로 충분했다. 점근적인 크기만 필요할 때는 이렇게 거칠게 다뤄도 되고, 그것이 점근 표기의 쓸모다. 이 결과는 알고리즘 문서의 비교 정렬의 하한 Ω(nlogn) 이 나오는 자리이기도 하다.

흔한 함정

점근 표기로 틀리는 방법은 아주 많다. 네 가지를 정리한다.

둘째와 셋째 항목에 예외가 있다. Hn=lnn+γ+O(1/n) 이나 n!=(1+o(1))2πn(n/e)n 처럼 쓰는 것은 관례로 인정된다. 참뜻은 "Hn=lnn+γ+f(n) 인 어떤 함수 f 가 있고 그것이 f=O(1/n) 을 만족한다"이고, 읽는 사람이 그 뜻을 안다면 쓸 만한 줄임말이다.

오류 찾기

다음 "증명"은 결론이 거짓이다. 반례를 들고 어느 단계가 틀렸는지 찾아라.

가짜 정리. i=1ni=O(n)

  1. 상수는 모두 O(1) 이다. 예컨대 17=O(1) 이다.
  2. 그러므로 합의 각 항 iO(1) 이다.
  3. f(n)::=i=1ni=O(1)+O(1)++O(1) 이고 항이 n 개다.
  4. 따라서 f(n)=O(n) 이다.
풀이 보기

반례는 곧바로 나온다. i=1ni=n(n+1)/2 이고 이것을 n 으로 나누면 (n+1)/2 이므로 어떤 상수로도 누를 수 없다. 곧 O(n) 이 아니다.

틀린 단계는 2번이다. 1번은 참이다 — 상수함수는 O(1) 이다. 그런데 2번에서 i 를 상수처럼 다뤘다. i1 부터 n 까지 움직이는 값이고, n 에 딸려 커진다. "i=O(1)"이라는 문장은 i 를 고정된 수로 볼 때만 뜻이 있고, 그때는 그 i 가 합에 몇 번째로 들어가는지와 아무 관계가 없다.

3번도 틀렸다. O(1)수처럼 더한 것이 문제다. 앞에서 강조한 대로 O(g) 는 홀로 뜻을 갖지 않는다. f=O(g) 라는 관계만 정의했다. 그러므로 O(1)+O(1) 이라는 표현은 무엇인지 정해진 바가 없고, 정해지지 않은 것을 계산하면 무엇이든 나온다.

이 함정을 피하는 법은 하나다. O 가 들어간 줄이 나오면 그 줄에서 무엇이 f 이고 무엇이 g 인지 이름을 붙여 다시 적어 본다. 위 3번을 그렇게 적으려 하면 곧바로 막힌다 — 왼쪽 f(n) 은 함수인데 오른쪽에는 함수가 없다.

참고로 같은 겉모습으로 참인 문장도 있다. i=1ni=O(n2) 은 참이고, 이때는 f(n)=n(n+1)/2g(n)=n2 라는 두 함수를 놓고 c=1, x0=1 을 대면 증명이 끝난다. 함수 두 개를 적을 수 있으면 참이고, 적을 수 없으면 그 문장은 뜻이 없다.

이 장에서 새로 나온 것

기호·용어
닫힌 형태시그마도 점점점도 쓰지 않은 식. 계산이 빠르고 자라는 속도가 보인다
등비합1+x++xn=(1xn+1)/(1x). |x|<1 이면 무한합이 1/(1x)
섭동법합을 흔들어 자기 자신과 겹치게 만들고 겹친 부분을 지운다
연금의 현재가치V=m(1xn)/(1x), x=1/(1+p). 영구 연금은 m(1+p)/p
미분으로 새 공식i1ixi=x/(1x)2. 아는 항등식을 미분해 얻는다
약증가 · 약감소x<y 이면 f(x)f(y) · f(x)f(y)
적분 한계증가하면 I+f(1)SI+f(n), 감소하면 뒤집힌다. 오차는 가장 큰 항 이하
조화수 Hni=1n1/i. 닫힌 형태가 없다. lnn+1/nHnlnn+1
오일러 상수 γ0.577215664. Hnlnnγ. Bn=Hn/2 (책 쌓기)
1/ip 의 수렴p>1 일 때만 수렴한다. 경계가 조화급수다
로그로 곱을 합으로lnf(i)=lnf(i). 마지막에 지수를 취한다
n! 의 거친 한계nn/en1n!nn+1/en1. 상한과 하한의 비가 n
스털링 근사n!=2πn(n/e)neϵ(n), 1/(12n+1)ϵ(n)1/(12n)
n!2πn(n/e)n근사식은 늘 참값보다 작다. n10 에서 오차 1% 안
이중 합의 순서 바꾸기k=1nHk=(n+1)Hnn. 행이 막히면 열로 더한다
f=o(g)limf/g=0. xa=o(xb), logx=o(xϵ), xb=o(ax)
f=O(g)어떤 c,x0 이 있어 xx0 에서 |f|cg
fg · Ω,ω,Θlimf/g=1 · g=O(f) · g=o(f) · 양쪽 모두 O
log(n!)=Θ(nlogn)상한은 인수를 키우고 하한은 큰 절반만 남긴다
지수의 낭패4xO(2x). 밑의 차이는 상수배가 아니다

챙겨 갈 것은 넷이다.

이 장에서 "세는 것"은 이미 세어 놓은 합을 다루는 일이었다. 다음 장은 합 자체를 어디서 얻는가를 다룬다. 셈의 규칙 다섯 개를 세우고, 그것으로 "직접 세기 어려운 것을 다른 것으로 바꾸어 센다". 그리고 그때 나오는 n! 과 이항계수의 크기를 재는 데 이 장의 스털링 근사가 곧바로 쓰인다.

셈의 규칙

다섯 가지 맛이 있는 도넛 가게에서 도넛 열두 개를 고르는 방법은 몇 가지인가. 그리고 길이 16 인 비트열 가운데 1 이 정확히 넷인 것은 몇 개인가. 두 물음은 아무 관계가 없어 보이지만 답이 같다. 이 장은 그런 일이 왜 일어나는지, 그리고 그것을 어떻게 써먹는지에 대한 장이다.

이 장에서 답할 것은 셋이다. 세기 어려운 것을 세기 쉬운 것으로 바꾸는 규칙은 무엇인가(다섯 개다). 그 규칙을 쓰다 어디서 틀리는가(같은 것을 두 번 세는 곳이다 — 포커 손이 그 예다). 그리고 셈으로 대수 항등식을 증명할 수 있는가(할 수 있다. 계산을 한 줄도 하지 않고).

이 장의 열쇠말은 하나다. 다른 것을 세어 이것을 센다. 앞 장들에서 가져오는 것은 6장의 사상 규칙비둘기집 원리, 12장의 동치관계와 분할, 그리고 16장의 스털링 근사다. 순열·조합·이항정리는 기초수학 문서에서 이미 계산해 보았을 것이다. 여기서는 그 공식들이 어디서 오는지를 규칙 다섯 개로부터 증명한다.

다른 것을 세어 이것을 센다

방 안에 사람이 몇 명 있는지 세는 방법은 여럿이다. 머리를 세도 되고, 귀를 세어 둘로 나눠도 된다. 어느 쪽이든 답은 같다. 어처구니없어 보이지만 이 장의 어려운 문제는 거의 다 이런 식으로 풀린다.

가장 곧은 방법은 전단사를 만드는 것이다. 6장의 사상 규칙에서 AbijB 이면 |A|=|B| 였다. 이것을 이 장에서는 전단사 규칙(Bijection Rule)이라 부른다.

전단사 규칙은 셈 능력의 확대기다. 어느 한 집합의 크기를 알아내면, 그것과 짝지을 수 있는 모든 집합의 크기를 공짜로 얻는다. 크기를 모르는 채로 두 집합이 같은 크기임을 확정할 수도 있다.

맛의 경계에 막대를 세우고 도넛을 0, 막대를 1 로 적는다. 짝짓기가 양방향이므로 크기가 같고, 어느 쪽 크기도 아직 모른다는 것이 요점이다
<맛의 경계에 막대를 세우고 도넛을 0, 막대를 1 로 적는다. 짝짓기가 양방향이므로 크기가 같고, 어느 쪽 크기도 아직 모른다는 것이 요점이다>[원본 보기]

예제 196

맛이 k 가지인 도넛 가게에서 도넛 n 개를 고르는 방법의 수가, 0n 개이고 1k1 개인 비트열의 수와 같음을 증명하라.

증명

뼈대는 이렇다. 맛의 경계에 칸막이를 세우고, 도넛을 0 으로 칸막이를 1 로 적는다.

증명. 맛에 순서를 정해 두고, 고른 도넛을 맛별로 묶어 그 순서대로 늘어놓는다. 맛이 k 가지이므로 묶음 사이의 경계가 k1 군데다. 각 경계에 칸막이를 하나 세우고, 왼쪽에서 오른쪽으로 읽으며 도넛은 0, 칸막이는 1 로 적는다. 도넛이 n 개이고 칸막이가 k1 개이므로 길이 n+k1 인 비트열이 되고 1 이 정확히 k1 개다.

이 대응이 전단사임을 본다. 서로 다른 선택은 어떤 맛의 개수가 다르므로 그 자리의 0 덩어리 길이가 달라 서로 다른 비트열로 간다(단사). 거꾸로 그런 비트열이 주어지면 1 들이 그것을 k 개의 0 덩어리로 나누고, 덩어리 길이를 맛별 개수로 읽으면 도넛 선택이 하나 나온다(전사).

그러므로 전단사 규칙에 의해 두 집합의 크기가 같다.

답이 말이 되는가. k=5, n=12 로 확인하면 길이 161 이 넷인 비트열과 짝이 지어진다 — 이 장을 연 두 물음이다. 눈여겨볼 것은 증명이 어느 쪽 크기도 계산하지 않았다는 점이다. 크기를 모르면서 같다는 것을 확정했고, 한쪽을 나중에 알아내면 다른 쪽이 공짜로 나온다. 그 계산은 이 장 뒤쪽에서 한다.

곱의 규칙과 합의 규칙

전단사 규칙은 "이것을 저것으로 바꾸어라"라고만 말한다. 그러면 저것은 어떻게 세는가. 전략은 이렇다. 수열을 세는 데 아주 능숙해지고, 나머지는 전부 전단사로 수열로 옮긴다.

규칙(곱의 규칙). 유한집합 P1,,Pn 에 대해 |P1×P2××Pn|=|P1||P2||Pn| 다.

규칙(합의 규칙). 서로소인 집합 A1,,An 에 대해 |A1An|=|A1|++|An| 다.

합의 규칙에서 "서로소"가 빠지면 거짓이다. 겹치는 경우는 이 장의 뒤쪽에서 포함배제로 다룬다.

두 규칙에서 6장의 결과가 곧바로 다시 나온다. 원소가 n 개인 집합의 부분집합은 길이 n 인 비트열과 전단사이고(6장에서 만든 짝짓기다), 비트열의 집합은 {0,1}n 이므로 곱의 규칙에 의해 2n 개다.

어느 규칙을 쓸지는 사상이 몇 대 1 인가로 갈린다. 아래 상자의 함정 — k 대 1 을 전단사로 착각하는 것 — 이 이 장에서 가장 자주 틀리는 자리다
<어느 규칙을 쓸지는 사상이 몇 대 1 인가로 갈린다. 아래 상자의 함정 — k 대 1 을 전단사로 착각하는 것 — 이 이 장에서 가장 자주 틀리는 자리다>[원본 보기]

예제 197

어떤 시스템의 올바른 비밀번호는 길이가 6 에서 8 사이인 기호 수열이다. 첫 기호는 영문자(대소문자를 구별해 52 가지)여야 하고 나머지는 영문자나 숫자(62 가지)여야 한다. 가능한 비밀번호는 몇 개인가?

풀이 보기

무엇을 묻는가. 세 가지 길이의 수열을 합친 집합의 크기다.

첫 자리에 올 수 있는 기호의 집합을 F, 나머지 자리에 올 수 있는 기호의 집합을 S 라 하면 |F|=52, |S|=62 이고 비밀번호 전체의 집합은

(F×S5)(F×S6)(F×S7)

이다. 길이가 다르므로 세 집합은 서로소다. 합의 규칙과 곱의 규칙을 차례로 쓰면

52625+52626+526271.9×1014

답이 말이 되는가. 두 규칙을 어느 순서로 썼는지가 요점이다. 먼저 길이로 갈라(합) 각 길이 안에서 자리마다 곱했다(곱). 거꾸로 하려 하면 "길이가 정해지지 않은 자리"라는 말이 안 되는 것을 세게 된다. 그리고 세 항 가운데 마지막 것이 전체의 98%다 — 비밀번호는 길이가 한 자리 늘어날 때마다 62배가 된다.

일반화된 곱의 규칙

곱의 규칙은 각 자리의 선택이 서로 무관할 때만 쓸 수 있다. 그런데 "앞에서 고른 것은 다시 고를 수 없다" 같은 조건이 붙는 일이 흔하다. 그때도 가짓수 자체가 일정하면 곱할 수 있다.

규칙(일반화된 곱의 규칙). 길이 k 인 수열들의 집합 S 에 대해, 첫 자리의 가능한 값이 n1 가지이고, 첫 자리를 무엇으로 정하든 둘째 자리의 가능한 값이 n2 가지이고, …, 앞의 k1 자리를 어떻게 정하든 k 번째 자리의 가능한 값이 nk 가지이면

|S|=n1n2nk

다. 여기서 중요한 것은 "가능한 값이 무엇인가"는 앞의 선택에 따라 달라져도 좋고 "가능한 값이 몇 개인가"만 일정하면 된다는 점이다.

이 규칙에서 순열의 개수가 나온다. 집합 S순열S 의 모든 원소가 정확히 한 번 나오는 수열이다. 원소가 n 개면 첫 자리에 n 가지, 그다음에 n1 가지, … 이므로 순열은 n! 개다.

예제 198

(가) 지폐의 일련번호가 여덟 자리 숫자이고, 같은 숫자가 두 번 이상 나오면 그 지폐를 결함이 있다고 하자. 결함이 없는 지폐의 비율은 얼마인가? (나) 체스판(8×8)에 폰·나이트·비숍을 놓는데 어느 두 개도 같은 행이나 같은 열에 있지 않게 하는 방법은 몇 가지인가?

풀이 보기

(가) 분모는 제약이 없으므로 곱의 규칙으로 108 이다. 분자는 자리마다 "앞에서 쓴 숫자를 뺀 나머지"에서 골라야 하는데, 어느 것을 썼든 남는 개수는 일정하다. 그러므로 일반화된 곱의 규칙으로

109876543=10!2!=1814400

이고 비율은 1814400/108=1.8144% 다.

(나) 배치를 수열 (rP,cP,rN,cN,rB,cB) 로 적으면(각각 폰·나이트·비숍의 행과 열) 배치와 수열 사이에 전단사가 있다. 행 셋이 서로 달라야 하고 열 셋도 서로 달라야 하므로 가짓수는 8,7,68,7,6 이다. 곧

(876)2=3362=112896

답이 말이 되는가. (가)에서 결함 없는 지폐가 2% 도 안 된다는 것이 뜻밖일 수 있다. 여덟 자리를 열 가지 숫자에 넣는 것이니 비둘기집 원리에 걸릴 만큼 빽빽하지는 않은데도 그렇다. 이 감각은 19장의 생일 원리에서 다시 나온다. (나)에서는 세 조각이 서로 구별되는 것이 중요했다 — 다음 절에서 구별되지 않는 조각을 놓으면 답이 달라진다.

나눗셈 규칙

귀를 세어 둘로 나누는 방법을 이제 규칙으로 만든다.

정의. 함수 f:ABk1 (k-to-1)이라는 것은 공역의 모든 원소가 정의역의 원소 정확히 k 개로부터 상을 받는 것이다.

규칙(나눗셈 규칙). f:ABk1 이면 |A|=k|B| 다.

12장의 말로 하면 이렇다. f 는 "f 의 값이 같다"라는 동치관계를 정의역에 만들고, 그 동치류들이 정의역의 분할을 이룬다. k1 이라는 것은 모든 블록의 크기가 k라는 뜻이고, 그러면 블록의 개수가 |A|/k 다. 나눗셈 규칙은 그 한 줄이다.

수열 두 개가 배치 하나로 가므로 수열의 수를 둘로 나눈다. 오른쪽 목록에서 k 가 상황마다 다르다는 것을 확인하라
<수열 두 개가 배치 하나로 가므로 수열의 수를 둘로 나눈다. 오른쪽 목록에서 k 가 상황마다 다르다는 것을 확인하라>[원본 보기]

예제 199

똑같이 생긴 룩 두 개를 체스판에 놓는데 같은 행이나 같은 열에 있지 않게 하는 방법은 몇 가지인가?

풀이 보기

무엇을 묻는가. 앞 절의 체스 문제와 닮았지만 두 조각이 구별되지 않는다.

A 를 수열 (r1,c1,r2,c2) 의 집합(행끼리 다르고 열끼리 다르다)이라 하고 B 를 올바른 배치의 집합이라 하자. 사상 f 는 수열을 "(r1,c1) 에 룩 하나, (r2,c2) 에 룩 하나"인 배치로 보낸다.

f전단사가 아니다. (1,a,8,h)(8,h,1,a) 가 같은 배치로 간다. 룩이 구별되지 않으므로 어느 것을 "첫" 룩이라 부를 근거가 없다. 각 배치는 두 수열로부터 오므로 f21 이다.

일반화된 곱의 규칙으로 |A|=(87)2 이고, 나눗셈 규칙으로

|B|=|A|2=(87)22=31362=1568

답이 말이 되는가. 앞 절의 세 조각 문제에서는 나누지 않았고 여기서는 나누었다. 차이는 하나다 — 조각을 구별할 수 있는가. 이 판단을 놓치는 것이 셈에서 가장 흔한 실수이고, 뒤에 나올 오류 찾기 예제가 바로 그것이다.

자리 배치 넷이 돌려 보면 모두 같아진다. 순환 이동이 n 가지이므로 사상이 n 대 1 이고, 그래서 (n−1)! 이 나온다
<자리 배치 넷이 돌려 보면 모두 같아진다. 순환 이동이 n 가지이므로 사상이 n 대 1 이고, 그래서 (n−1)! 이 나온다>[원본 보기]

예제 200

아서 왕이 서로 다른 기사 n 명을 원탁에 앉히려 한다. 두 배치가 같은 배열이라는 것은 모든 기사의 양옆이 같은 것이다. 서로 다른 배열은 몇 가지인가?

증명

뼈대는 이렇다. 자리 배치를 순열로 세고, 돌려서 같아지는 것끼리 묶어 나눈다.

자리 배치를 센다. 원탁의 한 자리를 "맨 위"로 정하고 거기서 시계 방향으로 읽으면 기사들의 순열이 나온다. 거꾸로 순열이 주어지면 자리 배치가 하나 정해지므로 자리 배치와 순열 사이에 전단사가 있고, 자리 배치는 n! 개다.

몇 대 1 인가. 두 자리 배치가 같은 배열인 것은 하나를 돌려 다른 하나로 만들 수 있는 것이다. 순열의 말로 하면 순환 이동이다. 길이 n 인 순열의 순환 이동은 n 가지이고, 기사가 모두 다르므로 그 n 가지가 서로 다른 순열이다. 그러므로 사상이 n1 이다.

나눈다. 나눗셈 규칙에 의해 배열의 수는

n!n=(n1)!

답이 말이 되는가. n=4 이면 4!/4=6 이다. 그림에서 자리 배치 넷이 배열 하나로 가는 것을 확인했고, 자리 배치가 24 개이니 배열이 6 개다. 눈여겨볼 것은 "n 가지가 서로 다르다"를 확인한 자리다. 만약 기사 넷이 모두 같은 사람이었다면 순환 이동이 모두 같은 순열이어서 kn 이 아니다. k 는 세어 확인해야 하는 값이고 짐작하면 안 된다.

부분집합과 이항계수

이제 이 장에서 가장 많이 쓰이는 수를 세운다. 원소가 n 개인 집합의 크기 k 부분집합이 몇 개인가. 이 수를 (nk) 라 적고 "n 에서 k 를 고른다"라 읽는다.

예제 201

부분집합 규칙. (nk)=n!k!(nk)! 임을 증명하라.

증명

뼈대는 이렇다. 순열의 앞쪽 k 개를 잘라 부분집합을 만들고, 몇 대 1 인지 센다.

증명. 원소가 a1,,an 인 집합의 순열 ai1ai2ain앞의 k 개를 모은 집합 {ai1,,aik} 으로 보내는 사상을 생각하자. 이 사상은 순열의 집합에서 크기 k 부분집합의 집합으로 가는 전함수다.

몇 대 1 인가. 크기 k 부분집합 T 하나를 잡자. 어떤 순열이 T 로 가는 것은 앞의 k 자리가 T 의 원소들이고 뒤의 nk 자리가 나머지 원소들인 것과 같다. 앞쪽 순서가 k! 가지, 뒤쪽 순서가 (nk)! 가지이고 두 선택이 무관하므로 곱의 규칙에 의해 k!(nk)! 개의 순열이 T 로 간다. 이 값은 T 가 무엇이든 같다.

나눈다. 순열이 n! 개이므로 나눗셈 규칙에 의해

n!=k!(nk)!(nk)(nk)=n!k!(nk)!

답이 말이 되는가. k=0 에서도 맞는다 — 0! 은 항 없는 곱이므로 1 이고 (n0)=n!/(1n!)=1 이다. 크기 0 부분집합은 공집합 하나뿐이니 옳다. 그리고 6장에서 만든 "부분집합 ↔ 비트열" 전단사를 여기에 얹으면 길이 n 인 비트열 가운데 1k 개인 것은 (nk)라는 것도 나온다.

중복이 있는 수열

부분집합 규칙은 집합을 크기 k 인 것과 크기 nk 인 것 둘로 쪼개는 방법의 수라고 읽을 수도 있다. 그러면 셋 이상으로 쪼개는 것도 셀 수 있어야 한다.

정의. k1++km=n 일 때 다항계수

(nk1,k2,,km)::=n!k1!k2!km!

로 정의한다. 앞 예제와 똑같은 논증(순열을 앞에서부터 k1 개, 다음 k2 개, … 로 잘라 묶는다. 사상이 k1!k2!km!1 이다)으로 다음이 나온다.

규칙(부분집합 쪼개기 규칙). 원소가 n 개인 집합을 크기 k1,,km 인 부분집합들로 쪼개는 방법은 위 다항계수만큼이다.

이 규칙의 가장 쓸모 있는 모습은 글자를 늘어놓는 문제다.

규칙(늘어놓기 규칙). 서로 다른 글자 l1,,lm 을 각각 k1,,km 번 써서 만드는 수열의 수는 (k1++kmk1,,km) 다.

왜 그런가. 수열 하나를 "글자마다 그 글자가 놓인 자리들의 집합"으로 보내면 전단사다. 예컨대 BOOKKEEPER 자체는 ({1},{2,3},{4,5},{6,7,9},{8},{10}) 으로 간다. 그러므로 늘어놓기와 쪼개기가 같은 것을 센다.

예제 202

(가) BOOKKEEPER 의 글자를 늘어놓는 방법은 몇 가지인가? (나) MISSISSIPPI 는? (다) 북·동·남·서로 각각 다섯 걸음씩 걸어 스무 걸음을 걷는 경로는 몇 가지인가?

풀이 보기

(가) B 하나, O 둘, K 둘, E 셋, P 하나, R 하나이므로

10!1!2!2!3!1!1!=362880024=151200

(나) M 하나, I 넷, S 넷, P 둘이므로 11!1!4!4!2!=399168001152=34650 이다.

(다) 경로와 "N 다섯, E 다섯, S 다섯, W 다섯으로 된 길이 20 수열" 사이에 전단사가 있으므로 20!(5!)4 이다.

답이 말이 되는가. (가)를 검산하려면 이렇게 보면 된다. 글자에 번호를 달아 모두 구별되게 하면 10! 개이고, 번호를 지우면 O 두 개의 순서 2! 가지, K 두 개의 2! 가지, E 세 개의 3! 가지가 구별되지 않으므로 사상이 2!2!3!=241 이다. 나눗셈 규칙이 또 나왔다. 이 장에서 나눗셈 규칙은 "구별되지 않는 것을 구별되는 것으로 잠깐 바꿔 세고 되돌리는" 도구로 계속 쓰인다.

예제 203

맛이 k 가지일 때 도넛 n 개를 고르는 방법의 수를 구하라. 그리고 이 장을 연 물음에 답하라.

증명

뼈대는 이렇다. 이 장의 첫 예제가 만든 전단사에 방금 얻은 이항계수를 얹는다.

증명. 첫 예제에서 도넛 선택과 "0n 개, 1k1 개인 비트열" 사이에 전단사가 있음을 보였다. 그런 비트열은 길이가 n+k1 이고 그중 1 의 자리를 고르는 것과 같으므로, 부분집합 규칙에 의해

(n+k1k1)=(n+k1n)

개다(마지막 등호는 "고를 것을 고르는 것과 버릴 것을 고르는 것이 같다"는 것이다).

답. k=5, n=12 이면 (1612)=(164)=1820 이다.

답이 말이 되는가. 작은 값으로 검산하자. 맛이 둘이고 도넛이 셋이면 공식은 (43)=4 를 준다. 실제로 (초콜릿 개수, 플레인 개수)가 (3,0),(2,1),(1,2),(0,3) 네 가지다. 맞는다. 이 셈은 "x1++xk=n 인 음이 아닌 정수해의 개수"와 같은 것이고 그 모습으로도 자주 만난다.

포커 손 세기

규칙 다섯 개가 다 모였다. 이제 이 규칙들이 실제로 어떻게 쓰이고 어디서 미끄러지는지 본다. 카드 한 벌은 52 장이고 각 카드에는 끗수 13 가지와 무늬 4 가지가 있다. 은 서로 다른 다섯 장의 집합이므로 전체 손의 수는 (525)=2598960 이다.

예제 204

(가) 포카드(같은 끗수 넷 + 다른 한 장)인 손은 몇 개인가? (나) 풀하우스(같은 끗수 셋 + 다른 같은 끗수 둘)인 손은 몇 개인가?

풀이 보기

무엇을 묻는가. 손의 집합을 수열의 집합으로 옮겨 세는 것이다.

(가) 포카드 손은 "넷이 된 끗수, 남는 카드의 끗수, 남는 카드의 무늬" 세 값으로 완전히 정해진다. 거꾸로 그런 수열마다 손이 하나이므로 전단사다. 일반화된 곱의 규칙으로

13124=624

(나) 풀하우스 손은 "셋이 된 끗수, 그 셋의 무늬 집합, 둘이 된 끗수, 그 둘의 무늬 집합" 네 값으로 정해진다. 무늬 집합은 넷 중에서 고르는 것이므로

13(43)12(42)=134126=3744

답이 말이 되는가. (나)에서 왜 나누지 않아도 되는가를 따져 두자. "셋"과 "둘"은 개수가 달라 서로 구별된다. 6 셋과 킹 둘인 손은 킹 셋과 6 둘인 손과 다른 손이므로 두 수열이 같은 손으로 갈 일이 없다. 그래서 사상이 전단사다. 이 판단이 다음 예제에서 뒤집힌다.

확률로 옮기면 포카드는 624/25989601/4165 이다. 좋은 손일 만하다.

첫 쌍과 둘째 쌍을 맞바꾼 두 수열이 같은 손으로 간다. 그래서 사상이 2 대 1 이고, 다른 길로 세어 답을 맞춰 볼 수 있다
<첫 쌍과 둘째 쌍을 맞바꾼 두 수열이 같은 손으로 간다. 그래서 사상이 2 대 1 이고, 다른 길로 세어 답을 맞춰 볼 수 있다>[원본 보기]

오류 찾기

다음 "풀이"는 답이 틀렸다. 어느 단계가 틀렸는지 찾고 옳은 답을 구하라.

문제. 두 쌍(같은 끗수 둘 + 다른 같은 끗수 둘 + 나머지 한 장)인 손은 몇 개인가?

  1. 두 쌍 손은 다음 여섯 값으로 정해진다 — 첫 쌍의 끗수, 첫 쌍의 무늬 집합, 둘째 쌍의 끗수, 둘째 쌍의 무늬 집합, 남는 카드의 끗수, 남는 카드의 무늬.
  2. 가짓수는 차례로 13, (42), 12, (42), 11, 4 이다.
  3. 그러므로 답은 13(42)12(42)114=247104 다.
풀이 보기

틀린 단계는 1번이다. "정해진다"는 맞지만 "하나로 정해진다"가 아니다. 두 쌍이 3 과 Q 라면 수열 (3,{,},Q,{,},A,)(Q,{,},3,{,},A,)같은 손으로 간다. 손은 집합이므로 어느 쪽이 "첫" 쌍인지 가릴 근거가 없다.

앞 예제의 풀하우스에서는 이 일이 일어나지 않았다. 거기서는 한쪽이 셋, 다른 쪽이 둘이라 개수가 두 쌍을 구별해 주었다. 여기서는 둘 다 둘이다.

옳은 답. 사상이 21 이므로 나눗셈 규칙으로 둘로 나눈다.

13(42)12(42)1142=2471042=123552

다른 길로 검산한다. 두 끗수를 한꺼번에 고르면 순서 문제가 애초에 생기지 않는다. 두 끗수의 집합을 (132) 가지로 고르고, 낮은 끗수의 무늬를 (42), 높은 끗수의 무늬를 (42), 남는 카드를 114 가지로 고르면

(132)(42)(42)114=786644=123552

두 답이 같다. 이 함정을 막는 방법 두 가지를 기억해 두자. 첫째, 사상을 만들 때마다 "공역의 한 원소로 화살표가 몇 개 오는가"를 세어 적는다. 둘째, 같은 문제를 다른 길로 한 번 더 풀어 답을 맞춰 본다. 두 값이 다르면 적어도 한쪽이 틀렸다.

비둘기집 원리의 응용

6장에서 비둘기집 원리를 사상 규칙의 대우로 얻었다. |A|>|B| 이면 AB 인 어떤 전함수도 단사가 아니다. 조금 강한 형태도 같은 방식으로 나온다.

규칙(일반화된 비둘기집 원리). |A|>k|B| 이면 모든 전함수 f:ABA 의 원소 k+1 개 이상을 같은 값으로 보낸다.

이 원리를 쓰는 문제에서 어려운 곳은 계산이 아니다. 무엇을 비둘기로, 무엇을 비둘기집으로, 어떤 규칙으로 넣을지를 정하는 것이 전부다. 셋을 또박또박 적으면 증명은 한 줄로 끝난다.

예제 206

(가) 어떤 도시에 머리카락이 만 개 이상인 사람이 50 만 명 살고, 사람의 머리카락은 20 만 개를 넘지 않는다고 하자. 머리카락 수가 정확히 같은 사람이 세 명 있음을 증명하라. (나) 스물다섯 자리 수 90 개가 적힌 표가 있다. 합이 같은 서로 다른 두 부분집합이 있음을 증명하라.

증명

(가) 증명. 비둘기는 그 도시의 대머리가 아닌 사람들이니 |A|=500000 이다. 비둘기집은 있을 수 있는 머리카락 수이니 B={10000,,200000} 이고 |B|=190001 이다. 규칙은 "사람을 그의 머리카락 수로 보낸다"다.

2|B|=380002<500000=|A| 이므로 일반화된 비둘기집 원리(k=2)에 의해 세 명 이상이 같은 값으로 간다.

(나) 증명. 비둘기는 90 개 수의 부분집합 전체이니 |A|=290 이다. 비둘기집은 있을 수 있는 합이다. 각 수가 1025 보다 작고 수가 90 개이므로 어떤 부분집합의 합도 901025 이하다. 곧 B={0,1,,901025} 이고 |B|=901025+1 이다. 규칙은 "부분집합을 그 원소들의 합으로 보낸다"다.

2901.24×1027 이고 |B|9.0×1026 이므로 |A|>|B| 다. 비둘기집 원리에 의해 같은 합을 갖는 서로 다른 두 부분집합이 있다.

답이 말이 되는가. (나)의 증명은 그 두 부분집합이 무엇인지 전혀 알려 주지 않는다. 이런 증명을 비구성적 증명(nonconstructive proof)이라 한다. 두 수가 모두 1026 이 넘는 거대한 값인데 한쪽이 다른 쪽보다 조금 크다는 것만으로 존재가 나왔다. 참고로 실제로 찾는 것은 어려운 문제이고, 그 어려움이 암호에 쓰인다.

마술 한 가지

셈과 매칭이 함께 쓰이는 예를 하나 보자. 마술사가 조수를 객석에 보내고 딴 곳을 본다. 관객 다섯 명이 카드 한 벌에서 각각 한 장을 고르면, 조수가 그 다섯 장을 모아 넷만 어떤 순서로 들어 보인다. 마술사는 남은 다섯째 카드를 맞힌다.

속임수가 없다면 조수가 마술사에게 보낼 수 있는 정보는 두 가지다. 어느 카드를 숨길지남은 넷을 어떤 순서로 들지다. 이것으로 충분한가. 14장의 말로 옮기면 이분 그래프의 매칭 문제가 된다. 왼쪽 정점은 관객이 고를 수 있는 다섯 장의 집합이고 오른쪽 정점은 조수가 보일 수 있는 서로 다른 넉 장의 수열이며, 수열의 카드가 모두 그 집합에 들어 있을 때 간선을 잇는다. 왼쪽을 덮는 매칭이 있으면 마술은 된다 — 둘이 미리 그 매칭을 약속해 두면 되기 때문이다.

매칭이 있는가. 왼쪽 정점의 차수는 54!=120 이다(숨길 카드 다섯 가지 × 남은 넷의 순열 4! 가지). 오른쪽 정점의 차수는 48 이다(다섯째 카드가 될 수 있는 것이 남은 48 장이다). 왼쪽 차수가 오른쪽 차수보다 크므로 14장의 차수 제한 이분 그래프 따름정리에 의해 왼쪽을 덮는 매칭이 있다. 실제로 외우기 쉬운 매칭도 있는데, 그 요령의 첫 단계가 "다섯 장 가운데 무늬가 같은 두 장을 찾는다"이고 무늬가 넷이므로 비둘기집 원리가 그것을 보장한다.

예제 207

관객이 넉 장만 고르고 조수가 석 장을 보이는 마술은 불가능함을 증명하라.

증명

뼈대는 이렇다. 보일 수 있는 수열이 고를 수 있는 손보다 적으면 비둘기집 원리에 걸린다.

증명. X 를 관객이 고를 수 있는 넉 장의 집합 전체, Y 를 조수가 보일 수 있는 석 장의 수열 전체라 하자. 부분집합 규칙으로

|X|=(524)=270725

이고 일반화된 곱의 규칙으로

|Y|=525150=132600

이다. 조수의 전략은 X 에서 Y 로 가는 전함수다(어떤 손이 나와도 무언가는 보여야 한다). 270725/132600>2 이므로 일반화된 비둘기집 원리(k=2)에 의해 같은 석 장 수열을 받는 손이 세 개 이상 있다. 그 수열을 본 마술사는 세 가지 가능성을 가리지 못한다.

답이 말이 되는가. 다섯 장 판에서는 |X|=(525)=2598960 이고 |Y|=52515049=6497400 이라 오른쪽이 훨씬 크다. 그래서 비둘기집 원리에 걸리지 않았고, 매칭까지 실제로 있었다. 셈은 "안 된다"를 증명하고, 매칭 정리는 "된다"를 증명한다. 두 도구의 역할이 정확히 갈리는 좋은 예다.

포함배제

합의 규칙은 집합들이 서로소일 때만 쓸 수 있었다. 겹치면 겹친 만큼을 빼야 하는데, 빼다 보면 지나치게 빠지는 곳이 생겨 다시 더해야 한다.

한 사람이 몇 번 세어지는지를 전공 수별로 확인하면 언제나 정확히 한 번이다. 그 세 줄이 규칙의 증명이다
<한 사람이 몇 번 세어지는지를 전공 수별로 확인하면 언제나 정확히 한 번이다. 그 세 줄이 규칙의 증명이다>[원본 보기]

규칙(포함배제). 유한집합 S1,,Sn 에 대해

|i=1nSi|=i|Si|i<j|SiSj|+i<j<k|SiSjSk|+(1)n1|i=1nSi|

이다. 곧 홀수 겹은 더하고 짝수 겹은 뺀다. 왜 맞는가. 합집합의 원소 하나가 정확히 k 개의 Si 에 들어 있다고 하자. 그 원소는 한 겹 항에서 (k1) 번 더해지고 두 겹 항에서 (k2) 번 빠지고, … 이므로 세어진 총 횟수는

(k1)(k2)+(k3)=1j=0k(kj)(1)j=1(11)k=1

이다(가운데 등호는 기초수학의 이항정리다). 모든 원소가 정확히 한 번 세어지므로 규칙이 성립한다.

예제 208

(가) 수학 전공이 60 명, 전산 전공이 200 명, 물리 전공이 40 명이고, 수학·전산 이중 전공이 4 명, 수학·물리가 3 명, 전산·물리가 11 명, 삼중 전공이 2 명이라 하자(이중 전공 수는 삼중 전공을 뺀 것이다). 세 과에 속한 학생은 몇 명인가? (나) {0,1,,9} 의 순열 가운데 42 나 04 나 60 이 연달아 나오는 것은 몇 개인가?

풀이 보기

(가) 규칙에 넣을 값은 교집합의 크기이므로 삼중 전공자를 되넣어야 한다. |ME|=4+2=6, |MP|=3+2=5, |EP|=11+2=13, |MEP|=2 다. 그러면

60+200+406513+2=278

(나) P42 를 42 가 연달아 나오는 순열의 집합이라 하고 P04, P60 도 같이 정의한다. 요령은 붙어 있는 두 숫자를 한 기호로 묶는 것이다. 42 가 붙어 있는 순열은 기호 {42,0,1,3,5,6,7,8,9} 의 순열과 전단사이므로 |P42|=9! 이고 나머지도 같다. 두 겹은 기호가 여덟 개로 줄어 8! 인데(예컨대 42 와 60 을 함께 묶으면 {42,60,1,3,5,7,8,9}), 04 와 42 를 함께 묶으면 042 가 되어 역시 여덟 기호다. 세 겹은 6042 하나로 붙어 일곱 기호이므로 7! 이다. 포함배제로

39!38!+7!=1088640120960+5040=972720

답이 말이 되는가. (가)에서 주어진 값과 규칙이 요구하는 값이 다르다는 것을 놓치면 답이 틀린다. "이중 전공 4명"이 "교집합의 크기 4"인지 "정확히 두 전공인 사람 4명"인지에 따라 계산이 달라진다. 문제 문장을 규칙의 말로 옮기는 일이 계산보다 어려운 자리다. (나)에서는 세 겹 교집합이 비어 있지 않은 것이 다행이었다 — 04 와 42 와 60 이 6042 로 이어 붙기 때문이다. 만약 두 쌍이 모순되는 조건이었다면 그 항이 0 이 된다.

조합적 증명

마지막 절이 이 장의 결론이다. 같은 집합을 두 방식으로 세면 두 식이 같다. 그것만으로 대수 항등식이 증명된다.

정의. 조합적 증명(combinatorial proof)은 다음 네 걸음으로 이루어진다. ① 집합 S 를 정한다. ② 한 방식으로 세어 |S|=n 을 얻는다. ③ 다른 방식으로 세어 |S|=m 을 얻는다. ④ 따라서 n=m 이다.

가장 간단한 예를 먼저 보자. 티셔츠 n 장 가운데 k 장을 남기려 한다. 남길 것을 고르는 것과 버릴 것을 고르는 것은 같은 일이므로

(nk)=(nnk)

다. 대수로도 증명되지만(양변이 모두 n!/(k!(nk)!) 이다) 위 한 문장이 더 짧고 더 많은 것을 말한다.

한 사람을 기준으로 갈라 센 값과 그냥 센 값이 같다. 두 경우가 겹치지 않는지와 빠뜨린 경우가 없는지를 확인하는 것이 증명의 알맹이다
<한 사람을 기준으로 갈라 센 값과 그냥 센 값이 같다. 두 경우가 겹치지 않는지와 빠뜨린 경우가 없는지를 확인하는 것이 증명의 알맹이다>[원본 보기]

예제 209

파스칼 항등식. (nk)=(n1k1)+(n1k) 를 조합적으로 증명하라.

증명

① 집합. S 를 "n 명 가운데 k 명을 뽑아 만든 팀 전체"의 집합이라 하자.

② 한 방식. 정의에 의해 |S|=(nk) 다.

③ 다른 방식. n 명 가운데 한 사람을 골라 Bob 이라 부르고 두 경우로 가른다. Bob 이 뽑힌 팀은 나머지 n1 명에서 k1 명을 더 뽑은 것이므로 (n1k1) 개다. Bob 이 빠진 팀은 나머지 n1 명에서 k 명을 뽑은 것이므로 (n1k) 개다. 두 경우는 서로소이고(Bob 이 들었거나 안 들었거나 둘 중 하나다) 빠뜨린 팀이 없다. 합의 규칙에 의해 |S|=(n1k1)+(n1k) 다.

④ 결론. 두 값이 같으므로 항등식이 성립한다.

답이 말이 되는가. 이 증명에서 대수 계산은 한 줄도 없었다. 그리고 이 항등식이 파스칼의 삼각형에서 "위의 두 수를 더한다"는 규칙 그대로라는 것도 확인해 두자. 검산하려면 n=5, k=210=4+6 을 보면 된다.

조합적 증명이 의심스러우면 전단사를 명시해 확인할 수 있다. A::={(1,X):X{2..n},|X|=k1}, B::={(0,Y):Y{2..n},|Y|=k} 라 두면 AB 는 첫 좌표가 달라 서로소이고, f((1,X))=X{1}, f((0,Y))=YAB 에서 S 로 가는 전단사다.

예제 210

다음을 조합적으로 증명하라. 대수로 풀려 하면 아주 힘들다.

r=0n(nr)(2nnr)=(3nn)

증명

뼈대는 이렇다. 오른쪽이 (3nn) 이니 원소가 3n 개인 집합에서 n 개를 고르는 것을 세면 된다. 왼쪽에 (nr)(2nnr) 이 있으니 그 3n 개를 n 개와 2n 개로 갈라 두어야 한다.

① 집합. 빨간 카드 n 장과 검은 카드 2n 장으로 된 3n 장짜리 덱에서 n 장을 뽑아 만든 손 전체를 S 라 하자(카드는 모두 서로 다르다).

② 한 방식. 3n 장에서 n 장을 고르는 것이므로 |S|=(3nn) 다.

③ 다른 방식. 손에 든 빨간 카드의 수 r 로 경우를 가른다. 빨간 카드를 r 장 고르는 방법이 (nr) 가지, 남은 nr 장을 검은 카드에서 고르는 방법이 (2nnr) 가지이고 두 선택이 무관하므로 곱의 규칙에 의해 그 경우의 손은 (nr)(2nnr) 개다. r0 부터 n 까지이고 서로 다른 r 의 경우는 서로소이며 빠뜨린 손이 없으므로 합의 규칙에 의해

|S|=r=0n(nr)(2nnr)

④ 결론. 두 값이 같으므로 항등식이 성립한다.

답이 말이 되는가. n=1 로 검산하면 왼쪽은 (10)(21)+(11)(20)=2+1=3 이고 오른쪽은 (31)=3 이다. 맞는다.

조합적 증명을 찾는 요령은 하나다. 더 간단한 쪽을 보고 집합 S 를 정한다. 여기서는 오른쪽 (3nn) 이 "3n 에서 n 을 고른다"라고 알려 주었고, 왼쪽의 모양이 그 3n 을 어떻게 갈라야 하는지 알려 주었다. 한번 집합을 옳게 잡으면 나머지는 저절로 나온다.

이 장에서 새로 나온 것

기호·용어
전단사 규칙AbijB 이면 |A|=|B|. 6장 사상 규칙의 한 줄
곱의 규칙|P1××Pn|=|P1||Pn|. 자리마다 무관하게 고를 때
합의 규칙서로소이면 크기를 더한다. 서로소가 아니면 포함배제로 간다
일반화된 곱의 규칙앞의 선택이 뒤의 가짓수를 바꾸지 않으면(가짓수만 일정하면) 곱한다
순열집합의 모든 원소가 정확히 한 번 나오는 수열. 원소가 n 개면 n!
k1 사상공역의 모든 원소가 정의역 원소 정확히 k 개로부터 상을 받는다
나눗셈 규칙k1 이면 |A|=k|B|. 12장의 분할에서 모든 블록의 크기가 k 인 것
원탁 배열n!/n=(n1)!. 순환 이동이 n 가지라 사상이 n1
부분집합 규칙(nk)=n!/(k!(nk)!). 순열의 앞 k 개를 잘라 나눗셈 규칙
다항계수(nk1,,km)=n!/(k1!km!)
부분집합 쪼개기 규칙집합을 크기 k1,,km 로 쪼개는 방법이 다항계수만큼
늘어놓기 규칙글자를 k1,,km 번씩 써서 만드는 수열의 수가 다항계수만큼
막대와 별k 가지에서 도넛 n 개 고르기 = (n+k1n)
(nk)=(nnk)남길 것을 고르는 것과 버릴 것을 고르는 것이 같다
포커 손전체 (525). 포카드 624, 풀하우스 3744, 두 쌍 123552
두 쌍의 함정두 쌍은 개수가 같아 구별되지 않는다. 사상이 21 이므로 나눈다
일반화된 비둘기집|A|>k|B| 이면 같은 값으로 가는 원소가 k+1 개 이상
비구성적 증명존재는 보이지만 어느 것인지 알려 주지 않는 증명
카드 마술다섯 장은 된다(14장의 차수 제한 매칭) · 넉 장은 안 된다(비둘기집)
포함배제홀수 겹은 더하고 짝수 겹은 뺀다. 원소마다 1(11)k=1 번 세어진다
조합적 증명집합 하나를 두 방식으로 세어 두 식이 같음을 얻는다

챙겨 갈 것은 넷이다.

이 장의 셈은 모두 "하나의 수"를 답으로 냈다. 그런데 대개 우리가 알고 싶은 것은 하나의 수가 아니라 n 에 따라 답이 어떻게 달라지는가다. 다음 장은 그 수열 전체를 함수 하나로 접어 다루는 방법을 배운다. 놀랍게도 그렇게 하면 이 장의 규칙 다섯 개 가운데 곱의 규칙이 함수의 곱셈이 되고, 지금 손으로 힘들게 갈랐던 경우들이 약분으로 저절로 정리된다.

생성함수

17장의 셈은 답이 하나의 수였다. 그런데 우리가 정말 알고 싶은 것은 대개 수열이다. 도넛 n 개를 고르는 방법의 수를 n=0,1,2, 에 대해 한꺼번에 알고 싶고, 피보나치 수 f0,f1,f2, 를 통째로 다루고 싶다. 수열은 항이 무한히 많아 손에 잡히지 않는다.

이 장의 발상은 한 문장이다. 수열의 항을 하나씩 계수 자리에 꽂아 함수 하나로 접는다. 그러면 수열에 대한 물음이 대수 계산으로 바뀐다. 대수 계산에는 규칙이 잔뜩 있으므로, 손으로는 어려웠던 문제가 약분 한 번으로 끝나기도 한다.

이 장에서 답할 것은 셋이다. 수열의 어떤 연산이 함수의 어떤 계산에 대응하는가(표 하나로 정리한다). 점화식을 실제로 어떻게 푸는가(피보나치의 닫힌 형태까지 간다). 그리고 발산하는 급수를 쓰는 것이 왜 괜찮은가.

앞 장들에서 가져오는 것은 17장의 셈의 규칙 다섯 개(특히 곱의 규칙과 합의 규칙), 16장의 등비합과 섭동법, 그리고 기초수학의 미분과 부분분수다. 24장이 같은 점화식들을 특성근으로 다시 푼다 — 이 장은 그 다른 한쪽이고, 마지막 절에서 두 길을 견준다.

수열을 하나의 함수로 접는다

정의. 수열 f0,f1,f2,생성함수(generating function)는 무한급수

F(x)=f0+f1x+f2x2+f3x3+

이다. F(x) 에서 xn 의 계수를 꺼내는 것을 [xn]F(x) 로 적는다. 곧 [xn]F(x)=fn 이다.

수열의 항이 계수 자리로 들어간다. x 는 자리를 표시하는 표식일 뿐이고 값을 대입하지 않는다는 것이 요점이다
<수열의 항이 계수 자리로 들어간다. x 는 자리를 표시하는 표식일 뿐이고 값을 대입하지 않는다는 것이 요점이다>[원본 보기]

계수가 아주 시시한 수열에서도 쓸모가 나온다. 항이 모두 1 인 수열의 생성함수를 G(x) 라 하자. 16장의 섭동법을 그대로 쓴다.

G(x)=1+x+x2+,xG(x)=xx2G(x)xG(x)=1

이므로 G(x)=1/(1x) 다. 곧

[xn]11x=1

같은 수법을 한 번 더 쓴다. N(x)::=1+2x+3x2+ 라 하면 N(x)xN(x)=1+x+x2+=G(x) 이므로

1(1x)2=G(x)1x=N(x)[xn]1(1x)2=n+1

이 두 식이 이 장에서 가장 많이 쓰인다. 외울 것은 이 둘뿐이고 나머지는 여기서 파생된다.

예제 211

(가) 다음 수열의 생성함수를 닫힌 형태로 적어라. ① 1,1,0,0,0,0,0,1,1,1,1,0,1,0,1, (나) 1+x(1x)2xn 계수를 구하라.

풀이 보기

무엇을 묻는가. 정의를 그대로 적용하는 연습이다.

(가) ① 급수가 1+x 에서 끝나므로 1+x 다. x2+x3+=x2(1+x+)=x21x 다. 1+x2+x4+ 이고 y=x2 로 보면 등비급수이므로 11x2 다.

(나) 분자를 갈라 두 조각으로 만든다. 1+x(1x)2=1(1x)2+x(1x)2 이고, 둘째 조각은 첫 조각을 한 칸 민 것이므로 표의 이동 규칙을 쓸 수 있다.

[xn]1+x(1x)2=(n+1)+n=2n+1

답이 말이 되는가. 직접 전개해 확인하자. (1+x)(1+2x+3x2+)=1+3x+5x2+ 이고 계수가 1,3,5, 곧 홀수다. 맞는다. 분자를 항별로 갈라 이동 규칙을 쓰는 것이 계수를 꺼내는 가장 흔한 요령이고, 뒤의 부분분수도 결국 이 일을 조직적으로 하는 것이다.

수렴은 잊어라

위 두 등식은 |x|<1 일 때만 수치적으로 참이다. x=2 를 넣으면 왼쪽은 1+2+4+ 로 발산하는데 오른쪽은 1/(12)=1 이다. 그런데도 이 장에서는 신경 쓰지 않는다. 왜인가.

답은 x 에 값을 넣지 않기 때문이다. 생성함수에서 x 는 "몇 번째 항인가"를 표시하는 자리표일 뿐이다. F(x) 라고 쓰지만 실체는 계수의 무한 수열이고, 등호는 "두 수열의 모든 항이 같다"는 뜻이다. 그 관점을 마지막 절에서 정식으로 세운다. 그때까지는 수렴을 걱정하지 않아도 된다고 믿고 읽어라.

생성함수로 세기

이제 수열의 연산이 함수의 계산으로 어떻게 바뀌는지 정리한다. 이 표가 이 장의 도구 상자다.

수열에서 하는 일함수에서 하는 계산
항마다 더한다F(x)+G(x)같은 차수끼리 모인다
항마다 c 를 곱한다cF(x)계수마다 c
오른쪽으로 한 칸 밀기xF(x)차수가 하나씩 올라간다
앞의 한 항 버리기(F(x)f0)/x차수가 하나씩 내려간다
합성곱F(x)G(x)아래에서 따로 본다
부분합 f0++fnF(x)/(1x)항이 모두 1 인 것과의 합성곱
항에 n 을 곱한다xF(x)미분하면 계수에 n 이 붙는다

가장 값나가는 줄은 이동이다. 점화식은 "수열이 자기 자신을 몇 칸 민 것과 관계가 있다"는 말이므로, 이동이 곱셈으로 바뀌는 순간 점화식이 방정식이 된다. 무한히 많은 등식이 방정식 하나로 접힌다.

왼쪽 칸의 일을 하고 싶으면 오른쪽 칸의 계산을 하면 된다. 아래 상자가 이동이 왜 가장 값나가는지를 설명한다
<왼쪽 칸의 일을 하고 싶으면 오른쪽 칸의 계산을 하면 된다. 아래 상자가 이동이 왜 가장 값나가는지를 설명한다>[원본 보기]

곱셈이 왜 셈인가

표에서 "왜" 칸을 비워 둔 줄이 하나 있다. 그것이 이 절의 것이고, 17장의 곱의 규칙이 여기서 함수의 곱셈으로 되살아난다.

사과와 바나나가 있다. 사과 n 개를 고르는 방법이 an 가지, 바나나 n 개를 고르는 방법이 bn 가지라 하자. 그러면 사과와 바나나를 합쳐 n 개를 고르는 방법은 몇 가지인가. 사과를 몇 개 고를지 정하고(k 개, ak 가지) 남은 것을 바나나로 채우면(nk 개, bnk 가지) 곱의 규칙에 의해 akbnk 가지이고, k0 부터 n 까지이며 서로소이므로 합의 규칙에 의해

a0bn+a1bn1+a2bn2++anb0

이다. 그런데 이 식이 정확히 [xn](A(x)B(x)) 다.

두 급수의 항을 표로 늘어놓으면 차수가 같은 항이 대각선에 모인다. 그 대각선의 합이 곱의 계수이고 그것이 곧 셈이다
<두 급수의 항을 표로 늘어놓으면 차수가 같은 항이 대각선에 모인다. 그 대각선의 합이 곱의 계수이고 그것이 곧 셈이다>[원본 보기]

규칙(합성곱 규칙). A(x) 가 집합 A 에서 고르는 방법의 생성함수이고 B(x)A겹치지 않는 집합 B 에서 고르는 방법의 생성함수이면, AB 에서 고르는 방법의 생성함수는 A(x)B(x) 다.

이 규칙을 처음 쓰는 자리로 17장의 도넛을 다시 세어 보자. 초콜릿 도넛만 고른다면 개수마다 방법이 딱 하나이므로 생성함수가 1+x+x2+=1/(1x) 다. 플레인도 같다. 두 맛이 겹치지 않으므로 합성곱 규칙에 의해

D(x)=11x11x=1(1x)2

이고 앞에서 계수를 이미 구했다 — n+1 이다. 맛이 k 가지면 같은 논법으로 1/(1x)k 이고, 17장에서 그 계수를 셈으로 구했으므로

[xn]1(1x)k=(n+k1n)

이다. 셈이 계수를 알려 준 것이다. 거꾸로 계수를 대수로 구해 셈 공식을 얻을 수도 있다 — 1/(1x)kn 번 미분해 x=0 에서 값을 잰 뒤 n! 로 나누면 같은 값이 나온다.

예제 212

합성곱 규칙으로 이항정리 (1+x)m=n(mn)xn 을 증명하라.

증명

뼈대는 이렇다. 원소가 하나뿐인 집합에서 고르는 생성함수는 1+x 이고, 그것을 m 번 곱한다.

증명. 집합 {ai} 에서 서로 다른 원소를 고르는 방법을 세자. 0 개 고르는 방법이 한 가지, 1 개 고르는 방법이 한 가지, 2 개 이상은 없으므로 생성함수가 1+x 다.

{a1},,{am} 은 서로 겹치지 않으므로 합성곱 규칙을 m1 번 이어 쓰면, {a1,,am} 의 부분집합을 고르는 방법의 생성함수는 (1+x)m 이다.

한편 크기 n 부분집합의 수는 17장의 부분집합 규칙에 의해 (mn) 이다. 같은 수열의 생성함수를 두 방식으로 적은 것이므로 계수가 모두 같다.

[xn](1+x)m=(mn)

답이 말이 되는가. 기초수학에서는 (1+x)m 을 실제로 전개해 항을 세어 이항정리를 얻었다. 여기서는 전개를 한 번도 하지 않았다. "겹치지 않는 것에서 고르는 것은 곱이다"라는 규칙 하나로 끝났고, 이것이 17장의 조합적 증명과 같은 발상이다 — 한 수열을 두 방식으로 세었다.

예제 213

꽃집이 다음 조건으로 꽃다발을 만든다. 백합은 하나 이하, 튤립은 홀수 개, 장미는 둘 이상.n 송이로 만드는 꽃다발은 몇 가지인가?

풀이 보기

무엇을 묻는가. 꽃마다 생성함수를 적고 곱하는 것이다.

백합. 0 개나 1 개이므로 L(x)=1+x.

튤립. 홀수 개이므로 T(x)=x+x3+x5+=x(1+x2+x4+)=x1x2.

장미. 둘 이상이므로 R(x)=x2+x3+=x21x.

세 종류가 겹치지 않으므로 합성곱 규칙에 의해

B(x)=(1+x)x1x2x21x=(1+x)x3(1x)(1+x)(1x)=x3(1x)2

다. x3 은 세 칸 밀기이므로 [xn]B(x)=[xn3]1/(1x)2=n2 다(n3 일 때. 그보다 작으면 0 이다).

답이 말이 되는가. n=3 이면 1 가지여야 한다 — 튤립 하나와 장미 둘뿐이다. n=4 이면 2 가지여야 하는데 (백합 1, 튤립 1, 장미 2)와 (백합 0, 튤립 1, 장미 3)이다. 튤립을 셋으로 하면 장미가 둘 이상일 자리가 없다. 맞는다. x3 이 앞에 붙어 나온 것이 "최소 세 송이는 반드시 든다"는 조건을 그대로 반영한다는 점도 눈여겨보자.

말도 안 되는 셈 문제

지금까지는 다른 방법으로도 풀 수 있는 문제였다. 이제 생성함수가 아니면 손대기 어려운 문제를 보자.

네 가지 제약의 생성함수를 곱하면 거의 다 약분되고 아는 꼴만 남는다. 손으로 경우를 가르는 대신 약분이 그 일을 한다
<네 가지 제약의 생성함수를 곱하면 거의 다 약분되고 아는 꼴만 남는다. 손으로 경우를 가르는 대신 약분이 그 일을 한다>[원본 보기]

예제 214

다음 조건을 모두 만족하며 과일 n 개를 담는 방법의 수를 구하라. 사과는 짝수 개, 바나나는 5 의 배수 개, 오렌지는 넷 이하, 배는 하나 이하.

증명

뼈대는 이렇다. 과일마다 생성함수를 적고 네 개를 곱한다.

사과. 개수가 짝수여야 하므로 방법의 수가 1,0,1,0, 이고 생성함수는 1+x2+x4+ 다. y=x2 로 보면 등비급수이므로 A(x)=1/(1x2).

바나나. 같은 식으로 B(x)=1/(1x5).

오렌지. 넷 이하이므로 O(x)=1+x+x2+x3+x4 이고, 16장의 유한 등비합으로 O(x)=(1x5)/(1x).

배. P(x)=1+x.

네 종류가 서로 겹치지 않으므로 합성곱 규칙에 의해 전체 생성함수는 네 개의 곱이다.

11x211x51x51x(1+x)=1+x(1x2)(1x)=1(1x)2

마지막 등호는 1x2=(1x)(1+x) 이기 때문이다. 그러므로 방법의 수는 [xn]1/(1x)2=n+1 가지다.

답이 말이 되는가. n=6 이면 답이 7 이어야 한다. 실제로 (사과, 바나나, 오렌지, 배)를 적어 보면 (6,0,0,0),(4,0,2,0),(4,0,1,1),(2,0,4,0),(2,0,3,1),(0,5,1,0),(0,5,0,1) 일곱 가지다. 맞는다.

놀라운 것은 답이 n+1 이라는 단순한 값이라는 점이다. 답이 이렇게 간단하니 생성함수 없이도 설명할 길이 있어야 한다고 의심할 만하고, 실제로 있다. 그러나 그 설명을 찾는 것보다 위 곱셈이 훨씬 빠르고, 조건을 조금 바꾸어도 같은 방법이 그대로 돌아간다는 점이 더 값나간다.

예제 215

10 원, 50 원, 100 원, 500 원 동전으로 n 원을 거슬러 주는 방법의 수를 생성함수로 적어라. 그리고 그 함수로 답을 실제로 구하는 절차를 말하라.

풀이 보기

무엇을 묻는가. 동전마다 생성함수를 적고 곱하는 것이다.

10 원 동전만 쓴다면 n10 의 배수일 때만 방법이 하나이므로 생성함수가 1+x10+x20+=11x10 다. 나머지도 같은 식으로 적고, 네 종류가 겹치지 않으므로 곱한다.

C(x)=11x1011x5011x10011x500

절차. [xn]C(x) 를 구하면 된다. 이 분수는 약분되지 않으므로 앞 예제처럼 운을 기대할 수 없고, 뒤에 나올 부분분수로 쪼개거나 — 실전에서는 — 네 급수를 차례로 합성곱해 계수를 n 까지 쌓아 올린다.

답이 말이 되는가. 마지막 절차가 실은 아주 익숙한 것이다. "1 원부터 n 원까지 답을 쌓아 올린다"는 것은 알고리즘 문서의 /posts/fundamental/algorithm.html > 동전 거스름돈에서 본 동적 계획법 표 그대로다. 생성함수의 곱은 그 표를 채우는 절차를 한 줄로 적은 것이다. 검산해 보면 n=100 일 때 계수는 10 원 열 개, 10 원 다섯 개와 50 원 하나, 50 원 둘, 100 원 하나로 4 다.

부분분수

앞 예제는 곱이 마침 아는 꼴로 약분되어 운이 좋았다. 그렇지 않을 때는 어떻게 계수를 꺼내는가. 답은 다항식의 분수를 아는 꼴의 합으로 쪼개는 것이고, 기초수학에서 적분할 때 쓴 부분분수 그대로다.

보조정리. p(x) 가 차수 n 보다 낮은 다항식이고 α1,,αn 이 서로 다른 0 이 아닌 수이면, 상수 c1,,cn 이 있어

p(x)(1α1x)(1α2x)(1αnx)=c11α1x+c21α2x++cn1αnx

이다. 쪼갠 뒤에는 계수를 곧바로 읽을 수 있다. 1/(1αx) 의 급수는 1+αx+α2x2+ 이므로

[xn]c1αx=cαn

이다. 중복된 뿌리가 있으면 c/(1αx)k 꼴의 항이 나오고 그 계수는 앞의 도넛 공식에 αn 을 곱한 것이다.

[xn]c(1αx)k=cαn(n+k1n)

이것이 생성함수 방법의 마지막 조각이다. 다항식의 분수로 적히는 생성함수라면 계수를 언제나 꺼낼 수 있다.

예제 216

16장에서 k=1nk2 의 닫힌 형태를 모양을 추측한 뒤 귀납법으로 확인해 얻었다. 그때 "추측이 필요 없는 방법"을 약속했다. 이제 그것을 지켜라 — 생성함수로 k=1nk2 를 구하라.

증명

뼈대는 이렇다. 먼저 k2 을 계수로 갖는 함수를 찾고, 부분합 규칙을 쓴다.

1단계. S(x)::=x2+x(1x)3 의 계수가 n2 임을 확인한다. 도넛 공식에서 [xk]1/(1x)3=(k+22)=(k+1)(k+2)/2 이고, 분자의 두 항은 각각 두 칸과 한 칸 밀기이므로

[xn]S(x)=(n1)n2+n(n+1)2=n((n1)+(n+1))2=n2

2단계. 표의 부분합 규칙에 의해 S(x)/(1x)xn 계수가 knk2 다. 그 함수는 (x2+x)/(1x)4 이고, 도넛 공식에서 [xk]1/(1x)4=(k+33) 이므로

k=1nk2=(n+13)+(n+23)=(n+1)n(n1)+(n+2)(n+1)n6=n(n+1)(2n+1)6

답이 말이 되는가. 16장에서 추측으로 얻은 것과 같은 식이다. 그런데 여기서는 답의 모양을 가정한 곳이 한 군데도 없다. 삼차 다항식이라고 짐작하지 않았고, 얻은 뒤 귀납법으로 확인할 필요도 없었다 — 모든 등호가 정의와 규칙에서 나왔다. 이것이 16장에서 약속한 "추측이 필요 없는 방법"이다.

다만 1단계에서 (x2+x)/(1x)3어떻게 찾았는가는 여전히 재주가 필요해 보인다. 조직적으로 찾는 길도 있다 — 1/(1x) 에 "항에 n 을 곱한다"(곧 xF(x))를 두 번 적용하면 계수가 n2 인 함수가 나오고, 정리하면 위 식이다. 표의 마지막 줄이 그 일을 한다.

선형 점화식 풀기

이제 도구가 다 모였다. 점화식을 방정식으로 바꾸고, 풀고, 부분분수로 쪼개고, 계수를 읽는다.

피보나치의 닫힌 형태

피보나치 수는 f0=0, f1=1, fn=fn1+fn2 (n2)로 정의된다.

예제 217

피보나치 수의 닫힌 형태를 구하라.

증명

뼈대는 이렇다. 점화식을 F 에 대한 방정식으로 바꾼다. fn1 은 한 칸 밀기이므로 xF(x) 이고 fn2 은 두 칸이므로 x2F(x) 이다.

방정식 세우기. 세 급수를 세로로 놓고 더한다.

F(x)xF(x)x2F(x)=f0+(f1f0)x+n2(fnfn1fn2)xn

n2 인 항은 점화식에 의해 모두 0 이고 f0=0, f1=1 이므로 오른쪽이 x 만 남는다. 그러므로

F(x)(1xx2)=xF(x)=x1xx2

부분분수로 쪼개기. 분모를 (1α1x)(1α2x) 꼴로 적어야 한다. 1xx2=0 의 두 뿌리를 구해 역수를 취하면

α1=1+52,α2=152

이고 1xx2=(1α1x)(1α2x) 다(전개해 확인할 수 있다 — α1+α2=1 이고 α1α2=1 이다). 이제 c1,c2 를 찾는다. 양변에 분모를 곱하면

x=c1(1α2x)+c2(1α1x)

이고 x=1/α2 를 넣으면 c2=1/(α2α1)=1/5, x=1/α1 을 넣으면 c1=1/5 다.

계수 읽기. [xn]c/(1αx)=cαn 이므로

fn=15((1+52)n(152)n)

이 식을 비네 공식(Binet)이라 한다.

답이 말이 되는가. n=2 로 검산하자. α12=(3+5)/2, α22=(35)/2 이므로 차가 5 이고 f2=1 이다. 맞는다. 눈여겨볼 것은 정수만 더해 만든 수열의 닫힌 형태에 무리수가 들어 있다는 점이다. 무리수 두 개가 언제나 정확히 상쇄되어 정수가 나온다 — 3장에서 무리수를 다룰 때는 상상하기 어려웠던 모양이다.

큰 뿌리의 거듭제곱만으로 피보나치 수가 거의 다 설명된다. 작은 뿌리의 절댓값이 1 보다 작아 금방 사라지기 때문이다
<큰 뿌리의 거듭제곱만으로 피보나치 수가 거의 다 설명된다. 작은 뿌리의 절댓값이 1 보다 작아 금방 사라지기 때문이다>[원본 보기]

비네 공식은 실용적이기도 하다. |α2|<1 이므로 α2n0 이고 따라서 fnα1n/5 다(16장의 점근 표기다). 곧 피보나치 수는 지수적으로 자라고, 그 밑이 황금비 α1=1.618 이다. 점화식만 보고는 알 수 없던 사실이다. 그리고 이 공식과 알고리즘 문서의 /posts/fundamental/algorithm.html > 빠른 거듭제곱을 합치면 fn 을 곱셈 O(logn) 번으로 구할 수 있다.

하노이 탑

비동차항이 있는 점화식도 같은 방법으로 풀린다.

세 단계가 점화식의 상한을 주고, 가장 큰 원판을 옮기기 전후에 그 일이 반드시 필요하다는 것이 하한을 준다. 두 부등식이 만나 등식이 된다
<세 단계가 점화식의 상한을 주고, 가장 큰 원판을 옮기기 전후에 그 일이 반드시 필요하다는 것이 하한을 준다. 두 부등식이 만나 등식이 된다>[원본 보기]

예제 218

기둥 셋과 크기가 다른 원판 n 개가 있다. 원판은 한 번에 하나만 옮길 수 있고 큰 원판을 작은 원판 위에 놓을 수 없다. 모든 원판을 다른 기둥으로 옮기는 데 필요한 최소 횟수 tn 을 구하라.

증명

점화식 세우기. 상한은 방법을 하나 제시하면 된다. 위의 n1 개를 가운데 기둥으로 옮기고(tn1 번), 가장 큰 것을 목표 기둥으로 옮기고(1 번), n1 개를 그 위에 얹는다(tn1 번). 그러므로 tn2tn1+1 이다.

하한도 나온다. 어느 방법이든 어느 시점에 가장 큰 원판을 옮겨야 하고, 그때 작은 n1 개는 남은 한 기둥에 모두 쌓여 있어야 한다. 그것을 만드는 데 tn1 번 이상이 필요하고, 옮긴 뒤 다시 얹는 데 또 tn1 번 이상이 필요하다. 그러므로 tn2tn1+1 이다. 두 부등식을 합쳐

t0=0,tn=2tn1+1(n1)

방정식 세우기. 2tn1 은 "한 칸 밀고 두 배"이므로 2xT(x) 이고, 상수 1n1 에서만 붙으므로 항이 모두 1 인 급수에서 n=0 항을 뺀 것, 곧 1/(1x)1 이다. 그러므로

T(x)2xT(x)=t0+(11x1)=x1x

T(x)=x(12x)(1x) 다.

부분분수. x(12x)(1x)=c112x+c21x 로 두고 분모를 곱하면 x=c1(1x)+c2(12x) 이다. x=1/2 을 넣으면 c1=1, x=1 을 넣으면 c2=1 이다.

계수 읽기.

tn=[xn]112x[xn]11x=2n1

답이 말이 되는가. t1=1, t2=3, t3=7 이고 그림의 세 원판 풀이가 일곱 걸음이었다. 맞는다. 원판이 64 개라면 2641 번이니, 한 걸음에 1초가 걸린다 해도 우주의 나이보다 긴 시간이 필요하다. "끝난다"와 "끝나는 것을 볼 수 있다"는 다르다 — 16장의 책 쌓기에서 본 것과 같은 감각이다.

일반적인 선형 점화식

두 예제가 같은 다섯 걸음을 걸었다. 정리하면 이렇다.

f(n)=c1f(n1)+c2f(n2)++cdf(nd)+h(n)

꼴을 차수 d 인 선형 점화식이라 하고 h(n)비동차항이라 한다. 풀이는 ① 수열을 F(x) 로 접고 ② 이동 규칙으로 F 에 대한 일차방정식을 만들고 ③ 풀어 F(x)=p(x)/q(x) 를 얻고 ④ 부분분수로 쪼개고 ⑤ 계수를 읽는 것이다. 여기서 분모는 언제나

q(x)=1c1xc2x2cdxd

다. 그러므로 답은 αn 들의 선형결합이고 αq 의 뿌리의 역수다. 중복근이 있으면 nkαn 꼴의 항이 붙는다. 비동차항이 있으면 그 생성함수를 방정식에 그냥 더하면 되고 — 하노이 탑에서 1/(1x) 을 더한 것이 그것이다 — 특별한 요령이 필요하지 않다.

두 길이 같은 다항식의 뿌리를 본다. 이 장은 왼쪽 길을 걷고 24장이 오른쪽 길을 걷는다
<두 길이 같은 다항식의 뿌리를 본다. 이 장은 왼쪽 길을 걷고 24장이 오른쪽 길을 걷는다>[원본 보기]

24장은 같은 점화식을 특성근으로 푼다. 그쪽에서는 f(n)=xn 을 대입해 특성다항식 xdc1xd1cd=0 의 뿌리를 구한다. 두 다항식의 관계를 여기서 분명히 적어 둔다. q(x) 의 뿌리 r 와 특성다항식의 뿌리 α서로 역수다(α=1/r). 실제로 q(x)=0x=1/α 를 넣으면 특성다항식을 αd 로 나눈 식이 된다. 그래서 두 길은 같은 수들을 다른 이름으로 부르고 있을 뿐이다.

예제 219

g0=0, g1=1, gn=4gn14gn2 를 풀어라. 그리고 이 예제가 앞의 두 예제와 무엇이 다른지 밝혀라.

증명

방정식. 앞과 같은 방식으로

G(x)(14x+4x2)=g0+(g14g0)x=x

이므로 G(x)=x14x+4x2=x(12x)2 다.

다른 점. 분모가 중복근을 갖는다 — (12x) 가 두 번이다. 그래서 부분분수 보조정리를 그대로 쓸 수 없고 c/(12x)k 꼴을 써야 한다.

계수 읽기. x 를 곱한 것은 "한 칸 밀기"이므로 먼저 1/(12x)2 의 계수를 구한 뒤 한 칸 밀면 된다. 앞의 공식에서 α=2, k=2 이므로

[xn]1(12x)2=2n(n+1n)=(n+1)2n

한 칸 밀면 gn=[xn1]1/(12x)2=n2n1 이다.

답이 말이 되는가. 점화식으로 직접 계산하면 g0=0, g1=1, g2=4, g3=12, g4=32 다. 공식은 0,1,4,12,32 를 준다. 맞는다.

여기서 n2n1 처럼 n 이 곱해진 항이 나오는 것이 중복근의 표시다. 24장에서 특성근으로 풀 때도 같은 모양이 나오고, 그때 "왜 n 이 붙는가"는 여기 부분분수에서 답이 나온다 — 1/(1αx)2 의 계수가 (n+1n)=n+1 배이기 때문이다.

형식 멱급수

마지막으로 "수렴을 잊어라"를 정식으로 세운다. 발산하는 급수를 대수 대상으로 다루는 것이 왜 괜찮은가.

답은 애초에 급수가 아니라 수열을 다루고 있었다는 것이다. 무한 수열 두 개에 대해 연산을 이렇게 정의한다.

GH::=(g0+h0,g1+h1,),GH::=(g0h0,g0h1+g1h0,,i=0ngihni,)

곧 덧셈은 항마다 하고 곱셈은 합성곱으로 정의한다. 이 두 연산은 11장의 Zn 에서 확인한 산술 규칙 — 결합·교환·분배법칙, 덧셈과 곱셈의 항등원, 덧셈의 역원 — 을 모두 만족한다. 이런 규칙을 갖춘 구조를 가환환(commutative ring)이라 하고, 여기서 영원소는 Z=(0,0,), 단위원소는 I=(1,0,0,) 다. 이 특정한 가환환을 형식 멱급수의 환(ring of formal power series)이라 한다.

이제 1/(1x) 의 뜻이 분명해진다. J::=(1,1,0,0,)K::=(1,1,1,) 를 놓고 합성곱을 계산하면 JK=I 다. 곧 KJ 의 곱셈 역원이고, 익숙한 등식

11x=1+x+x2+

은 그 사실을 적은 것이다. x 의 값이나 수렴과는 아무 관계가 없다. 그리고 초항이 0 이 아니면 역원이 있다는 것도 증명할 수 있으므로, 이 장에서 한 나눗셈들은 모두 정당하다.

예제 220

계수가 n! 인 생성함수는 x=0 말고 어디서도 수렴하지 않는다. 그런데도 그것을 형식적으로 다뤄 다음 항등식을 증명할 수 있다. 해 보라.

n!=1+i=1n(i1)(i1)!

증명

뼈대는 이렇다. 두 발산 급수 사이의 관계를 방정식으로 적고, 부분합 규칙으로 계수를 읽는다.

증명. F(x)::=n0n!xnH(x)::=n0nn!xn 을 놓는다. 표의 "앞의 한 항 버리기" 규칙에서

[xn]F(x)1x=(n+1)!

이다. 그런데 nn!=(n+1)!n! 이므로

[xn]H(x)=[xn]F(x)1x[xn]F(x)

이고 모든 계수가 같으므로 H(x)=F(x)1xF(x) 다. F 에 대해 풀면

F(x)=xH(x)+11x

계수 읽기. [xn](xH(x)+1)n1 이면 (n1)(n1)! 이고 n=0 이면 1 이다. 그리고 1x 로 나누는 것은 표의 부분합이므로

[xn]F(x)=1+i=1n(i1)(i1)!

왼쪽은 정의상 n! 이므로 항등식이 증명되었다.

답이 말이 되는가. n=4 로 검산하자. 오른쪽은 1+(00!+11!+22!+33!)=1+(0+1+4+18)=24 이고 4!=24 다. 맞는다.

이 예제의 값어치는 결과보다 과정에 있다. FH 는 실수 함수로 보면 둘 다 x=0 에서만 정의되는 시시한 대상이고 서로 구별되지도 않는다. 그런데 계수 수열로 보면 완전히 다른 대상이고, 그 차이를 방정식으로 적어 참인 항등식을 뽑아냈다. 수렴을 버린 대가로 얻은 것이 이것이다.

오류 찾기

다음 "증명"은 결론이 거짓이다. 어느 단계가 틀렸는지 찾아라.

가짜 정리. 1+2+4+8+=1

  1. 11x=1+x+x2+x3+ 는 이 장에서 증명한 등식이다.
  2. 이 장에서 "수렴을 걱정하지 않아도 된다"고 했으므로 어떤 x 를 넣어도 된다.
  3. x=2 를 넣으면 왼쪽은 1/(12)=1 이고 오른쪽은 1+2+4+8+ 이다.
  4. 따라서 두 값이 같다.
풀이 보기

틀린 단계는 2번이다. 이 장이 말한 것은 "아무 값이나 넣어도 된다"가 아니라 "값을 넣지 않는다"였다. 형식 멱급수에서 x 는 자리표이고 등호는 "두 계수 수열이 같다"는 뜻이다. 그 등호에는 "x 에 어떤 수를 넣어도 양변의 값이 같다"는 주장이 들어 있지 않다.

그러므로 3번의 "대입"은 정의되지 않은 연산이다. 굳이 실수 함수로 읽으려면 급수가 수렴하는 곳, 곧 |x|<1 에서만 값을 견줄 수 있고 x=2 는 그 밖이다.

이 함정은 16장의 점근 표기 함정과 같은 종류다. 표기가 무엇을 주장하고 무엇을 주장하지 않는지를 정의로 돌아가 확인하면 사라진다. O(g) 를 값처럼 더하면 안 되었던 것과 같은 이유로, 형식 멱급수에 값을 대입하면 안 된다.

그렇다고 발산하는 급수가 쓸모없는 것은 아니다. 계수가 n! 인 생성함수는 x=0 말고 어디서도 수렴하지 않지만, 형식적으로 다루면 n! 에 대한 참인 항등식을 뽑아낼 수 있다. 수렴은 값을 얻는 데 필요하고, 계수를 얻는 데는 필요하지 않다.

이 장에서 새로 나온 것

기호·용어
생성함수수열 f0,f1, 에 대해 F(x)=f0+f1x+f2x2+
계수 꺼내기[xn]F(x)=fn
기본 두 식[xn]1/(1x)=1, [xn]1/(1x)2=n+1
도넛 공식[xn]1/(1x)k=(n+k1n)
이동오른쪽으로 한 칸 밀기가 xF(x). 점화식이 방정식이 되는 까닭
앞 항 버리기 · 부분합(F(x)f0)/x · F(x)/(1x)
항에 n 곱하기xF(x)
합성곱[xn](AB)=a0bn+a1bn1++anb0
합성곱 규칙겹치지 않는 두 종류에서 고르는 방법의 생성함수는 두 생성함수의 곱
이항정리 다시[xn](1+x)m=(mn). 1+xm 번 곱한 것
부분분수p/(1αix)ci/(1αix) 로 쪼갠다
한 조각의 계수[xn]c/(1αx)=cαn, [xn]c/(1αx)k=cαn(n+k1n)
선형 점화식f(n)=c1f(n1)++cdf(nd)+h(n). h 가 비동차항
분모 다항식q(x)=1c1xcdxd. 그 뿌리의 역수가 특성근
비네 공식fn=(α1nα2n)/5, α1=(1+5)/2. fnα1n/5
하노이 탑tn=2tn1+1 이고 tn=2n1
중복근nkαn 꼴의 항이 나온다. [xn]1/(12x)2=(n+1)2n
형식 멱급수의 환수열에 항별 덧셈과 합성곱 곱셈을 준 가환환. Z=(0,0,), I=(1,0,)
1/(1x) 의 참뜻(1,1,0,) 의 곱셈 역원이 (1,1,1,) 이라는 것

챙겨 갈 것은 넷이다.

여기서 셈 세 장이 끝났다. 16장에서 합의 크기를 재고, 17장에서 셈의 규칙을 세우고, 18장에서 수열 전체를 한 대상으로 다루었다. 세 장이 함께 만든 도구는 뒤에서 계속 쓰인다 — 19장부터의 확률에서 유한 확률공간의 크기를 세는 일이 곧 17장의 규칙이고, 22장의 편차 한계에서 n! 과 이항계수의 크기가 16장의 스털링 근사로 재어진다. 그리고 24장이 이 장의 점화식을 특성근으로 다시 풀어 두 길이 만나는 것을 보인다.

사건과 확률 공간

1990년 9월, 한 잡지의 독자 상담란에 이런 편지가 실렸다. "퀴즈 쇼에 나갔습니다. 문이 셋이고 하나 뒤에는 자동차, 나머지 둘 뒤에는 염소가 있습니다. 제가 1번 문을 골랐더니, 뒤에 무엇이 있는지 다 아는 사회자가 3번 문을 열어 염소를 보여 주고는 <2번 문으로 바꾸시겠습니까?> 라고 묻습니다. 바꾸는 것이 이득입니까?" 칼럼니스트는 "바꾸시오"라고 답했다. 그러자 수학자들에게서 틀렸다는 편지가 쏟아졌다.

칼럼니스트가 맞았다. 이 문제가 유명해진 이유는 답이 어려워서가 아니다. 훈련된 직관마저 확률에서는 자주 틀린다는 것을 이보다 잘 보여 주는 예가 없기 때문이다. 그래서 이 장은 직관을 쓰지 않는 방법 하나를 세우는 데 대부분을 쓴다.

이 장에서 답할 것은 셋이다. "⋯일 확률"이라는 말을 어떻게 수학의 대상으로 바꾸는가(결과와 사건, 그리고 확률함수다). 그것을 어떤 절차로 계산하는가(네 단계 방법이다 — 이 문서의 표준 도구가 된다). 그리고 유한집합의 크기에 대해 세운 규칙들이 확률에도 그대로 통하는가(통한다. 그것이 17장을 여기서 다시 쓰게 되는 이유다).

앞 장들에서 가져오는 것은 17장의 셈의 규칙 다섯 개(특히 곱의 규칙, 합의 규칙, 부분집합 규칙)와 16장의 등비급수의 합점근 표기, 그리고 6장의 집합 표기다. 확률의 공리와 조건부확률은 기초수학 문서에서, 분포와 통계적 추론은 통계학 문서에서 이미 다뤘다. 여기서는 그것을 되풀이하지 않고 유한(또는 가산) 확률공간 위에서 처음부터 엄밀하게 다시 세운다. 뒤의 세 장이 이 바닥 위에 선다.

문 세 개 — 몬티 홀 문제

확률 문제를 만나면 먼저 문제를 분명하게 만들어야 한다. 말로 적힌 문제에는 거의 언제나 빈틈이 있고, 그 빈틈을 어떻게 메우느냐에 따라 답이 달라진다. 이 습관을 몸에 붙이는 것이 이 장에서 배울 것 가운데 가장 값어치 있는 것일 수도 있다.

위 편지에서 메워야 할 빈틈은 넷이다.

  1. 자동차는 세 문 뒤에 같은 확률로 있다.
  2. 참가자는 세 문을 같은 확률로 고르고, 그 선택은 자동차 위치와 무관하다.
  3. 참가자가 문을 고른 뒤 사회자는 반드시 다른 문 하나를 열어 염소를 보이고 바꿀 기회를 준다.
  4. 사회자에게 열 문의 선택권이 있을 때(참가자가 자동차 문을 골랐을 때) 두 문을 같은 확률로 연다.

셋째 가정이 특히 중요하다. 편지는 사회자가 그렇게 했다고만 말했고 반드시 그렇게 한다고는 말하지 않았다. 실제 프로그램에서 사회자는 참가자가 고른 문을 그냥 열어 버리기도 했다. 만약 사회자가 "참가자가 자동차 문을 골랐을 때만 바꿀 기회를 준다"는 규칙으로 움직인다면 바꾸는 것은 절대 이롭지 않다. 같은 편지에서 정반대 결론이 나오는 것이다.

넷째 가정은 답을 바꾸지 않지만 확률을 매기려면 필요하다. 이제 가정이 정해졌으므로 물음을 정확히 적을 수 있다. 바꾸는 참가자가 자동차를 얻을 확률은 얼마인가.

네 단계 방법

확률 문제에는 어려움이 둘 있다. 상황을 수학으로 옮기는 일옮겨 놓은 수학 문제를 푸는 일이다. 아래 절차는 그 둘을 갈라 놓는다. 1·2 단계가 옮기는 일이고 3·4 단계가 푸는 일이다.

1·2 단계는 모형을 세우고 3·4 단계는 계산한다. 어디에도 직관이 들어갈 자리가 없다는 것이 이 절차의 요점이다
<1·2 단계는 모형을 세우고 3·4 단계는 계산한다. 어디에도 직관이 들어갈 자리가 없다는 것이 이 절차의 요점이다>[원본 보기]

1단계 — 표본공간을 찾는다

실험에서 무작위로 정해지는 양을 순서대로 나열한다. 몬티 홀에서는 셋이다. 자동차가 있는 문, 참가자가 처음 고른 문, 사회자가 연 문.

그 양들의 값을 한 벌 정한 것을 결과(outcome)라 하고, 결과 전체의 집합을 표본공간(sample space)이라 하며 S 로 적는다. 무작위로 정해지는 양을 차례로 갈라 그리면 나무 그림(tree diagram)이 되고, 나무의 잎이 결과, 잎 전체가 표본공간이다.

문을 1,2,3 대신 A,B,C 라 부르자(나중에 수를 많이 적어야 한다). 결과를 세 문의 이름으로 적으면, 예컨대 (A,B,C) 는 "자동차는 A 뒤, 참가자는 B 를 골랐고, 사회자가 C 를 열었다"는 뜻이다. 표본공간은 결과 열두 개로 이루어진다.

2단계 — 관심 있는 사건을 정한다

사건(event)은 결과의 집합, 즉 S 의 부분집합이다. 우리가 알고 싶은 것은 사건

[바꾸면 이긴다]={(A,B,C),(A,C,B),(B,A,C),(B,C,A),(C,A,B),(C,B,A)}

의 확률이다. 대괄호로 성질을 감싼 것을 "그 성질을 만족하는 결과들의 집합"이라는 뜻으로 쓴다. 이 사건은 참가자가 처음에 자동차 문을 고르지 못한 결과들이다. 처음에 틀렸으면 남은 두 문 가운데 하나가 자동차이고 사회자가 염소 문을 열어 주므로, 바꾸면 반드시 자동차다.

3단계 — 결과의 확률을 매긴다

이 단계가 수학이 아닌 부분을 품고 있다. 결과의 확률은 우리가 모형화하려는 현상이 정하는 것이고 수학으로 끌어낼 수 있는 것이 아니다. 다만 수학은 더 적고 더 기초적인 판단에서 모든 결과의 확률을 계산해 준다. 그 계산은 두 걸음이다.

(a) 간선에 확률을 적는다. 각 간선에는 "그 간선의 부모까지 왔다고 할 때 이 가지로 갈 확률"을 적는다. 앞의 네 가정이 그대로 이 값들이다. 첫 층은 모두 1/3, 둘째 층도 모두 1/3, 셋째 층은 사회자에게 선택권이 있으면 1/2 씩이고 없으면 그 하나에 1 이다. 한 갈림에서 나가는 간선 확률의 합은 언제나 1 이다.

(b) 뿌리에서 잎까지의 간선 확률을 곱한다. 예컨대 (A,A,B) 의 확률은

131312=118

이다. 왜 곱하는가. 지금은 이렇게 생각해 두면 된다 — 뿌리에서 출발한 경로가 첫 층에서 A 가지로 갈 기회가 셋에 하나, 그 다음 층에서 다시 셋에 하나, 마지막에 둘에 하나이므로 "셋의 하나의 셋의 하나의 절반"이다. 이 규칙의 정식 근거는 20장에서 조건부확률로 증명한다.

이렇게 결과마다 확률을 정한 것은 곧 결과를 실수로 보내는 함수를 정한 것이다. 그 함수를 Pr 로 적는다. 방금 얻은 것은 Pr[(A,A,B)]=1/18, Pr[(A,B,C)]=1/9 따위다.

4단계 — 사건의 확률을 더한다

사건의 확률은 그 사건에 든 결과들의 확률의 합이다. 정의가 이것뿐이다.

Pr[[바꾸면 이긴다]]=19+19+19+19+19+19=23

바꾸는 참가자는 확률 2/3 으로 자동차를 얻는다. 바꾸지 않는 참가자는 1/3 이다(바꿔서 지는 것과 안 바꿔서 이기는 것이 같은 사건이므로). 분수를 더하고 곱하는 것보다 어려운 계산은 하나도 없었다. 어려웠던 것은 "직관적으로 뻔한" 답으로 뛰어들지 않고 참는 일뿐이다.

잎 12 개 가운데 6 개가 표시되어 있는데도 답이 1/2 이 아니다. 사회자에게 선택권이 있는 잎은 1/18, 없는 잎은 1/9 이기 때문이다
<잎 12 개 가운데 6 개가 표시되어 있는데도 답이 1/2 이 아니다. 사회자에게 선택권이 있는 잎은 1/18, 없는 잎은 1/9 이기 때문이다>[원본 보기]

잘못된 추론 찾기

다음 두 추론은 각각 몬티 홀 문제의 답이 1/2 이라고 말한다. 각각 어디가 틀렸는가?

(가) 나무의 잎이 열둘인데 "바꾸면 이긴다"에 든 잎이 정확히 여섯이다. 절반이므로 확률은 1/2 이다.

(나) 사회자가 염소 문을 열어 주었으므로 남은 문은 둘이고 그중 하나에 자동차가 있다. 둘 중 하나이므로 각각 1/2 이다.

풀이 보기

(가) 개수를 세어 확률을 얻는 것은 결과들의 확률이 모두 같을 때만 옳다. 여기서는 같지 않다. 사회자에게 선택권이 있는 잎은 1/18, 없는 잎은 1/9 이고 정확히 "바꾸면 이긴다"의 잎들이 무거운 쪽이다. 여섯 개가 각각 두 배 무거우므로 답이 1/2 이 아니라 2/3 이 된다.

이 실수를 막는 방법은 하나다. 개수 세기로 넘어가기 전에 "결과의 확률이 정말 모두 같은가"를 명시적으로 확인하는 것이다. 3단계를 건너뛰고 4단계로 뛰면 반드시 이 함정에 빠진다.

(나) "둘 중 하나"라는 말에서 곧바로 "각각 1/2"으로 가는 것이 틀렸다. 균등함은 가정에서 나오는 것이지 선택지 개수에서 나오는 것이 아니다. 여기서 처음 고른 문은 확률 1/3 로 자동차였고, 사회자가 문을 여는 행위는 그 값을 바꾸지 못한다 — 사회자는 어느 문을 골랐든 염소 문을 열 수 있으므로 참가자의 첫 선택에 대해 아무 정보도 주지 않는다. 남은 문 하나가 나머지 2/3 을 전부 물려받는다.

나무를 그리면 (나)의 오류가 그림에 나타난다. 남은 두 문에 해당하는 잎들의 확률 합이 각각 1/32/3 이다. 말로 하는 추론이 미끄러지는 자리를 나무가 붙잡아 준다. 이것이 이 장에서 나무를 계속 쓰는 이유다.

예제 223

문이 인 몬티 홀을 생각한다. 상품은 한 문 뒤에 균등하게 있고, 참가자가 문을 고르면 사회자는 상품이 없고 참가자가 고르지 않은 문 하나를 균등하게 열어 준다. 그러면 열리지 않은 문이 셋(처음 고른 것과 다른 둘) 남는다. (가) 처음 문을 지키는 참가자가 이길 확률은? (나) 남은 둘 가운데 하나를 균등하게 골라 바꾸는 참가자가 이길 확률은?

풀이 보기

무엇을 묻는가. 두 전략의 승률이다. 나무는 층이 셋(상품 위치·첫 선택·열린 문)이고 (나)에서는 넷째 층(바꿀 문 고르기)이 붙는다. 잎이 많으므로 전략별로 필요한 부분만 접어서 계산한다.

(가) 지키는 참가자는 처음 고른 문이 상품 문일 때만 이긴다. 상품 위치와 첫 선택이 무관하고 각각 균등하므로 그 확률은 1/4 다. 사회자가 무엇을 열든 이 값은 바뀌지 않는다.

(나) 두 경우로 가른다. 처음에 맞혔으면(확률 1/4) 바꾸면 반드시 진다. 처음에 틀렸으면(확률 3/4) 상품은 고르지 않은 세 문 가운데 하나에 있고, 사회자는 그중 상품 없는 두 문 가운데 하나를 연다. 그러면 남은 두 문 가운데 정확히 하나가 상품 문이므로 균등하게 고르면 1/2 로 맞힌다. 두 경우는 서로소이므로 합의 규칙으로

Pr[이긴다]=140+3412=38

답이 말이 되는가. 3/8=0.375>1/4 이므로 문이 넷일 때도 바꾸는 것이 이롭다. 다만 2/3 만큼 극적이지는 않다 — 문이 셋일 때는 "남은 문"이 하나뿐이라 2/3 을 혼자 물려받지만, 넷일 때는 둘이 나눠 갖기 때문이다. 일반적으로 문이 n 개면 지키기는 1/n, 바꾸기는 n1n1n2 다. n=3 에서 2/3, n=4 에서 3/8 이 나온다.

예제 224

두 팀이 3전 2선승으로 겨룬다. 한 팀이 매 경기를 확률 3/5 로 이기고, 그 확률은 앞 경기 결과와 무관하다고 하자. 네 단계 방법으로 답하라. (가) 세 경기가 모두 치러질 확률은? (나) 우승한 팀이 1차전을 진 확률은? (다) 더 센 팀이 우승할 확률은?

풀이 보기

나무는 1차전에서 갈리고, 2차전 뒤 승패가 갈리면 끝나고 갈리지 않으면 3차전으로 간다. 센 팀을 R, 약한 팀을 Y 라 하면 결과는 여섯이다. 간선 확률은 R 쪽이 3/5, Y 쪽이 2/5 이므로 잎의 확률은

Pr[RR]=925,Pr[RYR]=Pr[YRR]=18125,Pr[RYY]=Pr[YRY]=12125,Pr[YY]=425

검산하자. 925+425=65125 이고 나머지 넷의 합이 60125 이므로 전체가 1 이다. 결과의 확률을 매긴 직후에 합이 1 인지 확인하는 습관을 들이면 3단계의 실수를 대부분 잡아낸다.

(가) 두 경기로 끝나는 것은 RRYY 뿐이므로 여사건을 쓰면 11325=1225=0.48 이다.

(나) 우승팀이 1차전을 진 결과는 RYY (약한 팀이 우승, 1차전 패)와 YRR (센 팀이 우승, 1차전 패)이다. 12125+18125=30125=625=0.24.

(다) R 가 우승하는 결과는 RR,RYR,YRR 이므로 45125+18125+18125=81125=0.648.

답이 말이 되는가. (다)의 값이 한 경기 승률 0.6 보다 크다. 경기를 여럿 치르면 실력 차이가 더 잘 드러난다는 것이고, 대회를 다전제로 하는 이유가 이것이다. 다만 0.648 은 여전히 낮다 — 3전 2선승은 실력을 가리는 도구로서 형편없다. 7전 4선승이면 이 값이 0.71 까지 오른다.

이상한 주사위

네 단계 방법의 힘을 조금 더 보자. 술집에서 낯선 사람이 이상한 주사위 셋을 꺼내며 걸기를 제안한다. 각자 주사위 하나를 골라 한 번 굴리고 큰 수가 나온 쪽이 이긴다. 주사위는 여섯 면이지만 마주 보는 면에 같은 수가 적혀 있어 세 가지 수만 나오고, 각각이 확률 1/3 이다.

A={2,6,7},B={1,5,9},C={3,4,8}

게다가 상대는 "당신이 먼저 고르시오"라고 한다. 좋은 제안처럼 들린다.

한 번 굴리면 A 가 B 를, B 가 C 를, C 가 A 를 5/9 로 이긴다. 화살표가 한 바퀴 돌아 먼저 고르는 쪽이 불리해진다
<한 번 굴리면 A 가 B 를, B 가 C 를, C 가 A 를 5/9 로 이긴다. 화살표가 한 바퀴 돌아 먼저 고르는 쪽이 불리해진다>[원본 보기]

AB 를 네 단계로 계산하자. 표본공간은 두 수의 순서쌍 아홉 개이고, 간선 확률이 모두 1/3 이므로 결과의 확률이 모두 1/9 이다. 이렇게 결과의 확률이 모두 같은 확률공간을 균등(uniform)하다고 한다. 균등하면 사건의 확률이 개수의 비다.

Pr[E]=|E||S|(균등할 때만)

A 가 이기는 순서쌍은 (2,1),(6,1),(6,5),(7,1),(7,5) 다섯 개이므로 Pr[A 승]=5/9 다.

예제 225

BC 를, 그리고 CA 를 각각 확률 5/9 로 이김을 보여라. 그러므로 "더 자주 이긴다"라는 관계는 추이적이지 않다.

증명

뼈대는 이렇다. 아홉 칸을 다 세면 된다. 세 경우 모두 균등 확률공간이므로 이기는 칸의 개수만 세면 끝난다.

증명. BC 에서 B 가 이기는 쌍은 (5,3),(5,4),(9,3),(9,4),(9,8) 다섯 개다. CA 에서 C 가 이기는 쌍은 (3,2),(4,2),(8,2),(8,6),(8,7) 다섯 개다. 두 표본공간 모두 크기가 아홉이고 균등하므로 각각 확률이 5/9 다.

앞에서 Pr[AB]=5/9 를 얻었으므로

ABCA,각각 5/9

이다. 만약 "더 자주 이긴다"가 추이적이었다면 ABBC 에서 AC 가 나와야 하는데 실제로는 CA 다. 그러므로 추이적이지 않다.

답이 말이 되는가. 12장의 말로 하면 이 관계는 부분순서가 되지 못한다. 하세 다이어그램을 그릴 수 없고 위상 정렬도 할 수 없다. 방향 그래프로 그리면 길이 3 인 순환이 생긴다. 실전 결론은 이것이다 — 먼저 고르는 쪽이 불리하다. 무엇을 고르든 상대가 이길 주사위를 남겨 둘 수 있다.

예제 226

같은 주사위로 이번에는 각자 두 번 굴려 합을 견준다. A 는 여전히 B 보다 유리한가?

풀이 보기

무엇을 묻는가. 두 번 굴린 합에 대해 A 가 이길 확률이다. 나무는 층이 넷이고 잎이 34=81 개인데, 모든 간선이 1/3 이므로 균등하고 잎의 확률이 모두 1/81 이다. 그러니 세면 된다.

요령은 각 주사위의 두 번 합을 먼저 목록으로 만드는 것이다. A 의 두 번 합은 아홉 가지가 같은 확률로 나오고

(4,8,8,9,9,12,13,13,14)

이며 B

(2,6,6,10,10,10,14,14,18)

이다. 이제 두 목록에서 하나씩 뽑는 쌍 9×9=81 개 가운데 A 쪽이 큰 것을 센다. A 합이 4 이면 더 작은 B 합은 2 하나뿐이라 1 개, 8 이면 {2,6,6}3 개, 93 개, 12{2,6,6,10,10,10}6 개, 136 개, 146 개다. 목록의 중복을 감안해 더하면

1+3+3+3+3+6+6+6+6=37

이다. 같은 값이 되는 쌍은 둘(양쪽이 14)이므로 B 가 큰 쌍은 81372=42 개다.

Pr[A 승]=37810.457,Pr[B 승]=42810.519

답이 말이 되는가. 뒤집혔다. 한 번 굴리면 A 가 유리한데 두 번 굴리면 B 가 유리하다. "한 판에 더 자주 이기면 여러 판에서도 더 자주 이긴다"는 직관은 근거가 없다. 검산은 세 수의 합이 37+2+42=81 인 것으로 한다. 이 예에서 배울 것은 확률에서 "당연해 보이는" 추론을 하나라도 끼우면 답이 무너진다는 것이다.

균등 확률공간과 셈의 규칙

균등한 경우에는 확률 계산이 곧 셈이 된다. 그러면 17장에서 만든 도구가 전부 확률 도구가 된다.

결과의 확률이 모두 같을 때만 개수의 비가 확률이다. 이 조건을 확인하지 않고 세기 시작하는 것이 이 장에서 가장 흔한 실수다
<결과의 확률이 모두 같을 때만 개수의 비가 확률이다. 이 조건을 확인하지 않고 세기 시작하는 것이 이 장에서 가장 흔한 실수다>[원본 보기]

예제 227

잘 섞은 52장 덱에서 다섯 장을 뽑았다. 그것이 풀하우스(같은 값 세 장과 다른 값 두 장)일 확률은?

풀이 보기

무엇을 묻는가. 균등 확률공간에서의 사건의 확률이므로 두 개수를 세면 된다.

다섯 장 손 전체가 표본공간이고, 잘 섞었다는 것은 모든 손이 같은 확률이라는 뜻이므로 균등하다. 17장에서 |S|=(525) 였고 풀하우스의 개수는 13(43)12(42)=134126=3744 였다. 그러므로

Pr[풀하우스]=3744(525)=374425989601694

답이 말이 되는가. 700번쯤에 한 번이다. 요점은 확률을 새로 계산한 것이 하나도 없다는 것이다. 17장의 셈 결과를 그대로 분자와 분모에 넣었을 뿐이다. 균등 확률공간에서는 언제나 이렇게 된다.

예제 228

다음을 구하라. (가) 나사 100개가 든 상자에 불량이 10개 있다. 열 개를 집었을 때 불량이 하나도 없을 확률은? (나) {1,2,3,4,5} 에서 한 수를 균등하게 뽑아 없앤 뒤, 남은 넷에서 다시 한 수를 균등하게 뽑는다. 두 번째로 뽑힌 수가 홀수일 확률은? (다) 공정한 동전을 n 번 던졌을 때 앞면이 모두 맨 뒤에 몰려 있을 확률은?(앞면이 하나도 없으면 조건을 만족한다고 본다)

풀이 보기

(가) 열 개를 집는 방법이 (10010) 가지이고 모두 같은 확률이다. 정상 나사 90개에서 열 개를 집는 방법이 (9010) 가지이므로

Pr=(9010)(10010)=90100899981910.330

두 이항계수를 펼치면 열 개의 분수가 남는데, 값이 모두 0.89 근처이므로 0.9100.349 보다 조금 작다는 것을 짐작할 수 있다.

(나) 얼핏 조건에 따라 달라질 것 같지만 두 번째로 뽑히는 수는 균등하다. 어떤 수 j 가 두 번째로 뽑히려면 첫 번째로 j 가 아닌 수(확률 4/5)가 나오고 그 다음 남은 넷에서 j 가 나와야(확률 1/4) 하므로 Pr[두 번째=j]=4514=15 다. 홀수는 1,3,5 셋이므로 답은 3/5 다. 첫 번째로 뽑힐 확률과 같다.

(다) 길이 n 인 앞뒤 수열이 2n 개이고 모두 확률 2n 이다. 조건을 만족하는 수열은 뒷면이 j 개 앞에 오고 앞면이 nj 개 뒤에 오는 것들이므로 j=0,1,,nn+1 개다. 답은 (n+1)/2n.

답이 말이 되는가. (다)를 n=3 으로 검산하면 4/8=1/2 인데, 실제로 TTT,TTH,THH,HHH 넷이 조건을 만족한다. 맞는다. (나)의 교훈이 특히 값어치 있다 — "순서를 아는 것"이 "확률이 바뀌는 것"을 뜻하지 않는다. 20장의 조건부확률에서 이 감각이 계속 시험된다.

생일 원리

학생이 95명인 강의실에서 생일이 같은 두 사람이 있을 확률은 얼마인가. 95를 365와 견주어 1/4 쯤이라고 짐작하기 쉽다. 실제 값은 0.99999 보다 크다.

계산을 위해 두 가정을 둔다. 한 사람의 생일이 특정한 날일 확률이 1/d 이고(d=365), n 명의 생일이 서로 무관하게 정해진다는 것이다. 실제로는 계절에 따라 출생이 몰리고 학생들의 수강 선택도 서로 무관하지 않으므로 둘 다 참이 아니다. 그래도 이 계산이 값어치 있는 이유는 해시 테이블의 충돌이 정확히 이 모형을 따르기 때문이다.

생일 수열은 dn 개이고 모두 같은 확률이다. 생일이 모두 다른 수열은 일반화된 곱의 규칙으로 d(d1)(dn+1) 개이므로

Pr[모두 다르다]=d(d1)(dn+1)dn=(10d)(11d)(1n1d)

이 곱은 닫힌 형태가 없다. 16장의 방식대로 다루기 쉬운 것으로 감싼다. x>0 에서 1x<ex 이므로(ex=1x+x2/2 를 잘라 보면 된다) 항마다 갈아 끼우면

Pr[모두 다르다]<e0e1/de2/de(n1)/d=ei=1n1i/d=en(n1)/2d

상한과 정확한 값이 거의 겹친다. n 이 √d 규모가 되는 자리에서 확률이 급히 무너지는 것이 이 그림의 요점이다
<상한과 정확한 값이 거의 겹친다. n 이 √d 규모가 되는 자리에서 확률이 급히 무너지는 것이 이 그림의 요점이다>[원본 보기]

지수의 크기를 보자. n2d 쯤이면 지수가 1 근처이므로 1/e 가 된다. 이것이 컴퓨터과학에서 자주 쓰이는 어림이다.

생일 원리. 한 해가 d 일이고 방에 2d 명이 있으면 생일이 겹치는 사람이 있을 확률이 약 11/e0.632 다.

예제 229

(가) d=365, n=95 에서 위 상한의 값을 어림하고 결론을 말하라. (나) 항목 n 개를 크기 d 인 해시 테이블에 넣을 때 충돌을 피하려면 d 를 얼마로 잡아야 하는가?

풀이 보기

(가) n(n1)/2d=9594/730=12.23 이므로 상한은 e12.23 이다. ln20000012.21 이므로 이 값은 1/200000 보다 작다. 그러므로 생일이 겹치는 두 사람이 있을 확률은 11/200000 보다 크다. 95명 강의실에서 생일 겹침이 없다면 그것이 뉴스거리다.

(나) 겹침이 없기를 바라려면 지수가 1 보다 훨씬 작아지지 않아야 하므로 n2/2d1 보다 충분히 작아야 한다. 곧 dn2 규모, 더 정확히는 n2 의 상당한 배수여야 한다. 거꾸로 n2d 의 작은 비율만 넘어도 충돌이 여럿 생긴다. 항목 n 개를 크기 n 테이블에 넣으면 지수가 n/2 이므로 충돌이 없을 확률은 사실상 0 이다.

답이 말이 되는가. (나)의 결론은 /posts/fundamental/algorithm.html > 해시 테이블 를 설계할 때 충돌 처리를 반드시 준비해야 하는 이유다. 테이블을 아무리 크게 잡아도(항목 수의 제곱만큼 잡지 않는 한) 충돌이 생긴다. 같은 계산이 암호에서 "생일 공격"의 바탕이기도 하다 — 해시값이 b 비트면 2b/2 번쯤 시도해 충돌을 찾을 수 있으므로, 안전을 위해 필요한 비트 수가 두 배가 된다.

예제 230

불멸의 전사가 n 명 있는데 하나만 남기려 한다. 그들은 앞면이 확률 p 로 나오는 동전을 만들어 각자 한 번 던지고, 정확히 한 명만 앞면이면 그를 유일자로 삼기로 했다. 아니면 실패로 보고 다시 칼을 든다. (가) 성공 확률을 np 로 적어라. (나) 성공 확률을 가장 크게 하는 p 는? (다) 그때 성공 확률은 n 이 커지면 어디로 가는가?

풀이 보기

(가) 표본공간은 길이 n{H,T} 수열이다. 나무의 각 층에서 앞면 간선이 p, 뒷면 간선이 q::=1p 이므로 앞면이 h 개인 잎의 확률은 phqnh 다(경로에 앞면 간선이 h 개, 뒷면 간선이 nh 개다). 앞면이 정확히 하나인 잎은 n 개이므로

Pr[성공]=npqn1=np(1p)n1

(나) f(p)::=np(1p)n1 을 미분한다.

f(p)=n(1p)n2[(1p)p(n1)]=n(1p)n2(1np)

0<p<1 에서 앞 인수가 양수이므로 f(p)=0p=1/n 뿐이고, 그 왼쪽에서 f>0, 오른쪽에서 f<0 이므로 최대다. p=1/n 으로 만들면 된다.

(다) 그때 f(1/n)=n1n(11n)n1=(11n)n1 이고, n 에서 이것은 1/e0.368 로 간다.

답이 말이 되는가. n=2 로 검산하면 p=1/2 이고 성공 확률이 (1/2)1=1/2 다. 실제로 두 사람이 공정한 동전을 던지면 결과 넷 가운데 HT,TH 둘에서 성공하므로 1/2 다. 맞는다. 요점은 "n 이 커지면 성공 확률이 0 으로 간다"는 주장이 틀렸다는 것이다. 동전을 잘 고르면 사람이 몇이든 성공률 36% 를 지킬 수 있다. 그리고 여기서 나온 1/e 는 생일 원리의 1/e 와 같은 뿌리다 — 둘 다 (11/m)m1/e 에서 온다.

확률 공간이란 무엇인가

지금까지 한 일을 정의로 굳힌다.

정의. 가산 표본공간(countable sample space) S 는 비어 있지 않은 가산집합이다. 원소 ωS결과라 하고 부분집합을 사건이라 한다.

정의. S 위의 확률함수(probability function)는 전함수 Pr:SR 로서 다음 두 조건을 만족하는 것이다.

표본공간과 확률함수를 함께 확률 공간(probability space)이라 한다. 사건 ES 의 확률은

Pr[E]::=ωEPr[ω]

로 정의한다. 표본공간을 가산집합으로 제한한 것이 이 문서의 선택이다. 그러면 사건의 확률을 적분이 아니라 합으로 정의할 수 있고, 10장에서 이름만 언급한 바나흐·타르스키 같은 집합론의 곤란을 피할 수 있다. 실수 구간 위의 확률을 다루려면 이 정의를 넓혀야 하지만 우리가 볼 문제에는 필요하지 않다.

집합론에서 온 규칙

유한집합의 크기에 대해 세운 규칙 대부분이 확률로 그대로 옮겨 온다. 출발점은 정의에서 곧바로 나오는 한 줄이다.

규칙(합의 규칙). 사건 E0,E1, 이 쌍마다 서로소이면

Pr[nNEn]=nNPr[En]

사건이 가산 무한히 많아도 성립한다는 점이 중요하다. 이것을 가산 가법성이라 한다.

화살표를 거꾸로 따라가면 어떤 규칙이든 정의 두 줄까지 되짚을 수 있다. 새로 가정한 것이 하나도 없다는 것이 요점이다
<화살표를 거꾸로 따라가면 어떤 규칙이든 정의 두 줄까지 되짚을 수 있다. 새로 가정한 것이 하나도 없다는 것이 요점이다>[원본 보기]

예제 231

합의 규칙에서 다음 네 규칙을 끌어내라. A::=SA 로 적는다.

Pr[A]=1Pr[A],Pr[BA]=Pr[B]Pr[AB]

Pr[AB]=Pr[A]+Pr[B]Pr[AB],ABPr[A]Pr[B]

증명

뼈대는 하나다. 집합을 서로소인 조각으로 쪼개고 합의 규칙을 쓴다. 어느 쪼개기를 고르는지가 전부다.

여사건 규칙. S=AA 이고 두 조각이 서로소이므로 합의 규칙에 의해 Pr[S]=Pr[A]+Pr[A] 다. 확률함수의 정의에서 Pr[S]=ωSPr[ω]=1 이므로 Pr[A]=1Pr[A].

차의 규칙. B=(BA)(AB) 이고 두 조각이 서로소다(A 에 드는지로 갈렸다). 합의 규칙에서 Pr[B]=Pr[BA]+Pr[AB] 이므로 옮기면 된다.

포함배제. AB=A(BA) 이고 두 조각이 서로소이므로 Pr[AB]=Pr[A]+Pr[BA] 다. 여기에 차의 규칙을 넣으면 Pr[A]+Pr[B]Pr[AB] 다.

단조성. AB 이면 Pr[B]=Pr[A]+Pr[BA] 이고 Pr[BA]0 이다(음이 아닌 항들의 합이므로). 그러므로 Pr[A]Pr[B].

답이 말이 되는가. 네 증명 모두 새로운 가정을 하나도 쓰지 않았다. 정의 두 줄과 합의 규칙뿐이다. 그리고 포함배제에서 Pr[AB]0 을 쓰면 곧바로 불의 부등식 Pr[AB]Pr[A]+Pr[B] 를 얻는다. 17장의 포함배제와 모양이 같은 것이 우연이 아니다 — 그 증명도 "한 원소가 몇 번 세어지는가"를 따졌고 여기서는 "한 결과의 확률이 몇 번 더해지는가"를 따진다.

여섯 규칙 모두 맨 위의 합의 규칙 하나에서 나온다. 서로소인 조각으로 쪼개고 다시 더하는 것이 증명의 전부다
<여섯 규칙 모두 맨 위의 합의 규칙 하나에서 나온다. 서로소인 조각으로 쪼개고 다시 더하는 것이 증명의 전부다>[원본 보기]

합집합 한계

불의 부등식은 사건이 여럿일 때로 곧바로 늘어난다. 서로소를 요구하지 않는다는 것이 이 도구의 값어치다.

규칙(합집합 한계). Pr[E1E2]Pr[E1]+Pr[E2]+

예제 232

부품 n 개로 된 시스템이 있고, 각 부품이 1년 안에 고장 날 확률이 p 다. 부품 하나라도 고장 나면 시스템이 멈춘다. 부품끼리의 관계에 대해 아무 가정도 하지 않고 시스템이 멈출 확률 Pr[F] 에 대해 무엇을 말할 수 있는가? 그리고 그 한계가 실제로 달성될 수 있음을 보여라.

증명

뼈대는 이렇다. 위는 합집합 한계, 아래는 단조성. 그리고 달성 가능성은 확률함수를 하나씩 지어 보이면 된다.

증명. Fii 번 부품이 고장 나는 사건이라 하면 F=iFi 다. 합집합 한계로 Pr[F]iPr[Fi]=np 이다. 한편 F1F 이므로 단조성으로 Pr[F]Pr[F1]=p 다. 그러므로

pPr[F]np

양 끝이 달성됨. 표본공간을 S::=P({1,,n}) 로 잡고, 결과 s 를 "고장 난 부품의 번호 집합"으로 읽는다. 시스템이 멈추지 않는 결과는 하나다.

아래 끝은 부품이 모두 함께 고장 나는 모형이다. Pr[{1,,n}]::=p, Pr[]::=1p, 나머지는 0 으로 둔다. 합이 1 이고 모두 음이 아니므로 확률함수다. 각 Fi{1,,n} 만 담으므로 Pr[Fi]=p 이고 Pr[F]=p 다.

위 끝은 고장이 겹치지 않는 모형이다(p1/n 일 때). Pr[{i}]::=pn 개 주고 Pr[]::=1np, 나머지는 0 이다. 합이 np+1np=1 이므로 확률함수이고 Pr[Fi]=p 이며 F 는 서로소인 n 개의 합집합이므로 Pr[F]=np 다.

답이 말이 되는가. n=100, p=105 이면 105Pr[F]103 이다. 부품 사이의 관계를 전혀 몰라도 "1년에 천 번 중 한 번보다 자주 멈추지는 않는다"고 말할 수 있다. 이것이 합집합 한계가 실무에서 쓰이는 방식이다. 두 끝의 비가 n 배이므로 느슨하기는 하다 — 더 좁히려면 독립 같은 가정이 필요하고, 그것이 20장의 주제다.

무한 확률공간

표본공간이 무한한 문제는 흔하다. 두 사람이 번갈아 공정한 동전을 던져 먼저 앞면을 낸 사람이 이긴다고 하자. 나무에 끝이 없다.

잎이 무한히 많지만 확률의 합은 1 이다. 무한히 계속 뒷면인 경로는 잎이 아니므로 결과가 아니라는 점을 확인하라
<잎이 무한히 많지만 확률의 합은 1 이다. 무한히 계속 뒷면인 경로는 잎이 아니므로 결과가 아니라는 점을 확인하라>[원본 보기]

TnH 를 "뒷면 n 번 뒤 앞면"이라 하면 표본공간은 S::={TnH:nN} 이고 확률함수는 Pr[TnH]::=1/2n+1 이다. 확률 공간인지 확인하려면 값이 음이 아니고 합이 1 인지 보면 되는데, 16장의 등비급수로

nN12n+1=12111/2=1

이다. 첫 사람이 이기는 사건은 결과가 무한히 많지만 가산 가법성으로 더할 수 있다.

Pr[첫 사람 승]=12+18+132+=12nN14n=12111/4=23

이 모형에는 "영원히 뒷면"에 해당하는 결과가 없다. 그림에서 그것은 잎에 닿지 않는 무한 경로다. 그 가능성을 넣고 싶다면 결과 ω 를 하나 더해도 되지만, 나머지 확률의 합이 이미 1 이므로 Pr[ω]::=0 으로 둘 수밖에 없다. 확률 0 인 결과는 어떤 계산에도 영향을 주지 않으므로 보통은 넣지 않는다.

예제 233

두 사람에게 상을 주려고 동전을 두 번 던진다. 앞면 뒤에 뒷면이면 1번이, 뒷면 뒤에 앞면이면 2번이 이긴다. 두 번이 같은 면이면 무효로 하고 처음부터 다시 던진다. 앞면이 확률 p 로 나온다고 할 때 1번이 이길 확률을 구하고, 아무도 이기지 못할 확률을 말하라.

풀이 보기

무엇을 묻는가. 나무가 무한하므로 잎을 모두 적을 수는 없다. 요령은 나무의 자기 닮음을 쓰는 것이다 — 무효가 되면 상황이 처음과 똑같아진다.

s 를 1번이 이길 확률이라 하자. 처음 두 번의 결과는 넷이다. HT (확률 pq)면 1번 승, TH (확률 qp)면 2번 승, HH (p2)나 TT (q2)면 처음으로 돌아간다. 돌아간 뒤 1번이 이길 확률은 다시 s 이므로

s=pq+(p2+q2)s

이 식을 푼다. 1p2q2=1p2(1p)2=2p2p2=2pq 이므로

s=pq1p2q2=pq2pq=12

아무도 이기지 못하는 것은 무효가 영원히 되풀이되는 경우다. 두 사람이 이길 확률의 합이 1/2+1/2=1 이므로 그 확률은 0 이다. 앞의 동전 게임과 마찬가지로 그런 결과는 잎이 아니다.

답이 말이 되는가. p 가 무엇이든 1/2 이다. 한쪽으로 심하게 치우친 동전으로도 완전히 공정한 추첨을 할 수 있다. p=0.99 라면 HTTH 는 둘 다 좀처럼 나오지 않지만 확률이 서로 같다는 점은 변하지 않고, 무효를 되풀이하는 절차가 그 대칭성만 남긴다. 이것을 폰노이만 뽑기라 부르며 실제 난수 생성에 쓴다. 검산은 p=1/2 로 한다 — s=(1/4)/(11/41/4)=1/2 다.

예제 234

공정한 동전을 계속 던져 연속한 세 번HHT 또는 TTH 가 되는 순간 멈춘다. HHT 가 먼저 나올 확률은?

증명

뼈대는 이렇다. 앞면과 뒷면의 이름을 맞바꿔도 확률이 변하지 않는다. 계산을 하지 않고 대칭성만으로 끝난다.

증명. 표본공간은 HHTTTH 로 끝나고 그 전에 둘 다 나오지 않는 유한 수열들의 집합이다. 각 결과의 확률은 길이가 k 이면 2k 다. 이제 사상 σ 를 "수열의 모든 HT 로, TH 로 바꾼다"로 정의한다.

σ 는 표본공간에서 표본공간으로 가는 전단사이고(두 번 쓰면 제자리다), 길이를 보존하므로 확률을 보존한다. 그리고 HHT 로 끝나는 결과를 정확히 TTH 로 끝나는 결과로 옮긴다. 그러므로 두 사건의 확률이 같다.

두 사건은 서로소이고 합집합의 확률이 1 이므로(둘 중 하나는 확률 1 로 결국 일어난다) 각각 1/2 다.

답이 말이 되는가. 이 논법이 통하는 조건을 정확히 보아 두자. 동전이 공정해야 하고(σ 가 확률을 보존해야 한다), 두 무늬가 이름 맞바꾸기로 서로 옮겨져야 한다. HHTTTH 는 그 조건을 만족한다. 그러나 HHTHTT만족하지 않는다 — 이름을 바꾸면 TTHTHH 가 되어 원래 짝이 아니다. 실제로 그 경우의 답은 1/2 이 아니고, 20장에서 조건부확률로 계산한다. 대칭성 논법은 강력하지만 대칭이 정말 있는지 확인해야 한다.

이 장에서 새로 나온 것

기호·용어
결과 ω무작위로 정해지는 양의 값을 한 벌 정한 것. 나무의 잎
표본공간 S결과 전체의 집합. 이 문서에서는 비어 있지 않은 가산집합
사건 E결과의 집합, 곧 S 의 부분집합
[성질]그 성질을 만족하는 결과들의 집합이라는 표기
확률함수Pr:SRPr[ω]0 이고 ωPr[ω]=1
확률 공간표본공간과 확률함수를 함께 부르는 말
사건의 확률Pr[E]::=ωEPr[ω]. 정의가 이것뿐이다
네 단계 방법결과를 정한다 → 사건을 정한다 → 결과의 확률을 매긴다 → 더한다
나무 그림층이 무작위 양 하나씩, 잎이 결과. 간선 확률을 곱해 잎의 확률을 얻는다
간선 확률의 규칙갈림마다 합이 1. 뜻은 20장에서 조건부확률로 밝힌다
균등 확률공간유한하고 모든 결과의 확률이 같다. 그때 Pr[E]=|E|/|S|
가산 가법성(합의 규칙)쌍마다 서로소이면 Pr[En]=Pr[En]. 항이 무한해도 된다
여사건 규칙Pr[A]=1Pr[A]
차의 규칙Pr[BA]=Pr[B]Pr[AB]
포함배제Pr[AB]=Pr[A]+Pr[B]Pr[AB]
불의 부등식 · 단조성Pr[AB]Pr[A]+Pr[B] · ABPr[A]Pr[B]
합집합 한계Pr[En]Pr[En]. 서로소가 아니어도 된다
생일 원리한 해가 d 일이고 2d 명이면 겹칠 확률이 약 11/e0.632
생일 상한Pr[모두 다르다]<en(n1)/2d. 1x<ex 를 항마다 쓴다
이상한 주사위ABCA 가 각각 5/9. 승률은 추이적이지 않다
두 번 굴리면 뒤집힘AB37/8142/81. 한 판의 우위가 여러 판으로 옮겨 가지 않는다
폰노이만 뽑기치우친 동전으로 공정한 추첨. 같은 면이면 무효로 하고 다시 던진다

챙겨 갈 것은 넷이다.

이 장에서 확률을 매기는 법을 세웠다. 다음 장은 정보가 들어오면 확률이 어떻게 바뀌는가를 다룬다. 그러면 이 장에서 근거 없이 쓴 규칙 하나 — 간선 확률을 곱해 잎의 확률을 얻는 것 — 의 정체가 드러나고, 몬티 홀에서 그토록 많은 사람이 헷갈린 이유도 밝혀진다.

조건부확률

몬티 홀 문제가 직업 수학자들까지 헷갈리게 했다는 이야기를 19장에서 했다. 나무 그림으로 풀어 보니 계산은 분수 몇 개를 곱하고 더하는 것이 전부였는데, 어째서 그렇게 많은 사람이 틀렸을까. 이 장이 그 답이다. 사람들이 틀린 자리는 계산이 아니라 "무엇을 알고 있는가"를 확률에 반영하는 방식이었다.

이 장에서 답할 것은 넷이다. "Y 가 일어났다고 할 때 X 가 일어날 확률"을 어떻게 정의하는가. 19장에서 근거 없이 쓴 규칙 — 간선 확률을 곱해 잎의 확률을 얻는 것 — 은 왜 옳은가(이 정의에서 곧바로 나온다). 정보가 들어오면 확률이 어떻게 바뀌는가(베이즈 규칙과 오즈다). 그리고 "두 사건이 서로 무관하다"는 말을 어떻게 정의하며, 그것이 셋 이상일 때 왜 까다로워지는가.

앞 장에서 가져오는 것은 확률 공간의 정의, 사건의 확률, 네 단계 방법, 균등 확률공간의 Pr[E]=|E|/|S|, 그리고 집합론에서 온 규칙들이다. 17장의 일반화된 곱의 규칙부분집합 규칙도 다시 쓴다. 기초수학 문서에서 베이즈 정리를 계산해 본 적이 있을 것이다. 여기서는 정의에서 시작해 규칙들을 증명하고, 정의가 요구하는 것과 요구하지 않는 것을 정확히 가른다. 이 장의 예제들은 대부분 "직관이 미끄러지는 자리"를 짚기 위해 있다.

몬티 홀의 혼란은 어디서 오는가

틀린 추론 하나를 그대로 따라가 보자. 참가자가 문 A 를 골랐고, 사회자의 조수 카롤이 문 B 를 열어 염소를 보였다고 하자. 19장의 나무에서 "참가자가 A 를 골랐고 B 뒤에 염소가 있다"는 결과는 셋이다.

(A,A,B),(A,A,C),(C,A,B)

확률은 각각 1/18, 1/18, 1/9 다. 이 가운데 바꿔서 이기는 것은 (C,A,B) 하나이고 그 확률 1/9 는 나머지 둘의 합 1/18+1/18=1/9 와 같다. 그러므로 이 상황에서 바꿔서 이길 확률과 질 확률이 같다 — 바꾸는 것이 낫지 않다!

그런데 우리는 답이 2/3 임을 이미 안다. 무엇이 잘못되었는가. 놀랍게도 계산에는 잘못이 없다. 잘못은 조건을 잘못 고른 것이다.

조건을 걸면 표본공간이 줄고 확률을 다시 1 로 맞춘다. 여기서 조건에 (A,A,C) 가 끼어 있다는 것이 오류의 정체다
<조건을 걸면 표본공간이 줄고 확률을 다시 1 로 맞춘다. 여기서 조건에 (A,A,C) 가 끼어 있다는 것이 오류의 정체다>[원본 보기]

참가자가 실제로 아는 것은 "B 뒤에 염소가 있다"가 아니라 "카롤이 B 를 열었다"다. 그런데 위에서 고른 조건에는 (A,A,C) — 카롤이 C 를 연 결과 — 가 들어 있다. 아는 것을 전부 반영하지 않은 조건을 쓰는 바람에 남아 있을 수 없는 결과가 섞여 들어갔다.

옳은 조건으로 다시 세면 남는 결과는 (A,A,B)(C,A,B) 둘뿐이고 확률의 합이 1/18+1/9=1/6 이다. 바꿔서 이기는 것은 여전히 (C,A,B) 하나이므로

1/91/6=23

이 되어 19장의 답과 맞는다. 조건부확률에서 틀리는 가장 흔한 방식이 이것이다 — 아는 것을 다 넣지 않거나, 알 수 없는 것을 넣는 것.

정의와 표기

정의. 사건 XY 에 대해 Pr[Y]0 일 때 Y 가 주어졌을 때 X 의 조건부확률(conditional probability)

Pr[XY]::=Pr[XY]Pr[Y]

다. Pr[Y]=0 이면 정의되지 않는다. 앞으로 조건 자리에 오는 사건은 확률이 0 이 아니라고 암묵적으로 가정한다(그 조건을 매번 적으면 문장이 지저분해진다).

정의가 하는 일은 그림에서 본 그대로다. Y 밖의 결과를 버리고, 남은 결과의 확률을 Pr[Y] 로 나눠 다시 합이 1 이 되게 한다. 실제로 PrY[ω]::=Pr[ω]/Pr[Y] (ωY) 와 PrY[ω]::=0 (ωY) 로 정의하면 이것이 S 위의 또 하나의 확률함수이고, 그 함수로 잰 X 의 확률이 바로 Pr[XY] 다. 그래서 19장에서 세운 모든 규칙이 조건 하나를 고정한 세계 안에서 그대로 성립한다. 이 사실을 뒤에서 쓴다.

곱셈 규칙

정의의 양변에 Pr[Y] 를 곱하면 이 장에서 가장 많이 쓸 등식이 나온다.

규칙(곱셈 규칙, 두 사건). Pr[E1E2]=Pr[E1]Pr[E2E1]. 세 사건이면 Pr[E1E2E3]=Pr[E1]Pr[E2E1]Pr[E3E1E2] 다 — 조건 자리가 한 항씩 커진다.

예제 235

n 개 사건에 대한 곱셈 규칙을 점점점 없이 적고 귀납법으로 증명하라.

증명

뼈대는 이렇다. 맨 뒤 인수 하나를 떼어 내면 n1 개 짜리가 남는다. 7장의 보통 귀납법이다.

주장 P(n). Pr[E1En1]0 인 모든 사건들에 대해

Pr[i=1nEi]=j=1nPr[Ej|i=1j1Ei]

j=1 의 항은 공교집합을 S 로 읽어 Pr[E1S]=Pr[E1] 이다.

증명. n 에 대한 귀납법. 기저 n=1 이면 양변이 모두 Pr[E1] 이다. 귀납 단계 P(n) 을 가정하고 F::=i=1nEi 라 두면 정의에서 Pr[FEn+1]=Pr[F]Pr[En+1F] 이고, 여기에 귀납 가정으로 Pr[F] 를 펼치면 오른쪽이 j=1 부터 n+1 까지의 곱이 된다. 그러므로 P(n+1) 이 성립한다.

답이 말이 되는가. 이 규칙은 새로운 내용이 없다 — 정의를 n1 번 되풀이한 것이다. 형태가 값어치 있는 것이지 내용이 값어치 있는 것이 아니다. 그리고 조건 자리의 교집합이 j 가 커질수록 좁아진다는 점이 요점이다. "여기까지 왔다고 할 때 다음 한 걸음"이 각 인수의 뜻이고, 다음 절에서 그것이 나무의 간선임을 본다.

나무 그림이 왜 옳은가

19장에서 나무의 간선에 확률을 적고 경로를 따라 곱했다. 그때 근거를 20장으로 미뤄 두었다. 이제 밝힌다. 간선에 적은 수는 조건부확률이었다.

한 경로의 간선 확률이 차례로 조건부확률이고, 그 곱이 곱셈 규칙의 오른쪽이다. 곱하기가 규칙인 이유가 이 한 줄이다
<한 경로의 간선 확률이 차례로 조건부확률이고, 그 곱이 곱셈 규칙의 오른쪽이다. 곱하기가 규칙인 이유가 이 한 줄이다>[원본 보기]

나무에서 뿌리에서 잎까지 가는 경로를 생각하고, Ej 를 "j 번째 층에서 이 경로의 가지로 갔다"는 사건이라 하자. 그러면 잎에 해당하는 결과는 사건 E1E2Ek 이고, 곱셈 규칙에 의해 그 확률은

Pr[E1]Pr[E2E1]Pr[E3E1E2]

이다. j 번째 인수는 정확히 "j 번째 간선의 부모까지 왔다고 할 때 그 간선으로 갈 확률"이므로, 우리가 간선에 적었던 그 수다. 곱셈 규칙의 오른쪽이 "경로의 간선 확률을 다 곱한 것"과 글자 그대로 같다.

이제 19장에서 "직관적 설명"으로 넘겼던 자리가 정리로 바뀌었다. 그리고 실전에서 중요한 것은 이것이다. 간선에 확률을 적을 때 물어야 할 말은 "이 가지로 갈 확률"이 아니라 "부모에 도달했다고 할 때 이 가지로 갈 확률"이다. 한 갈림에서 나가는 간선 확률의 합이 항상 1 인 것도 이 때문이다 — 조건을 고정한 세계에서는 Pr 가 여전히 확률함수이므로 전체 확률이 1 이다.

예제 236

곱셈 규칙으로 크기 k 인 부분집합의 개수를 다시 얻어라. 곧 |{X{1..n}:|X|=k}|=n!k!(nk)! 임을 확률로 증명하라.

증명

뼈대는 이렇다. 정해 둔 집합 S 가 뽑힐 확률 p 를 구하면 개수는 1/p 다. 모든 집합이 같은 확률로 뽑히기 때문이다.

증명. 크기 k 인 집합 S{1..n} 를 하나 정해 둔다. 실험은 이것이다 — {1..n} 에서 수를 하나씩 중복 없이 k 번 균등하게 뽑는다.

Aj 를 "j 번째로 뽑은 수가 S 에 든다"는 사건이라 하자. j1 번째까지 모두 S 의 원소를 뽑았다면 남은 수는 n(j1) 개이고 그중 S 의 원소가 k(j1) 개이므로

Pr[Aj|i<jAi]=kj+1nj+1

이다. 곱셈 규칙으로 Pr[jAj]=knk1n11nk+1=k!(nk)!n! 다.

한편 뽑은 수들의 집합은 크기 k 인 어느 부분집합이든 같은 확률로 나온다. 한 집합을 낳는 뽑는 순서가 정확히 k! 가지이고 모든 순서가 같은 확률이기 때문이다(17장의 나눗셈 규칙과 같은 논법이다). 그러므로 집합의 개수를 N 이라 하면 각 집합이 나올 확률이 1/N 이고, 위에서 구한 값이 "뽑은 집합이 S 다"의 확률이므로 1/N=k!(nk)!/n!, 곧 N=n!/(k!(nk)!) 다.

답이 말이 되는가. n=4, k=2 로 검산하면 2413=16 이고 실제로 크기 2 인 부분집합이 여섯 개다. 17장에서는 순열의 앞 k 개를 자르고 나눗셈 규칙을 썼는데 여기서는 곱셈 규칙 하나로 같은 결과가 나왔다. 확률이 셈의 도구가 될 수도 있다는 것이 이 예제의 요점이고, 22장에서 이 방향을 훨씬 강하게 쓴다.

조건부확률의 네 단계 방법

조건부확률도 네 단계 방법으로 계산한다. 달라지는 것은 4단계뿐이다. 사건 두 개를 표시하고 확률의 비를 잡는다.

지역 하키 팀이 3전 2선승 대회에 나간다. 1차전은 확률 1/2 로 이긴다. 그 뒤로는 앞 경기 결과에 따라 달라진다 — 이겼으면 기세가 올라 확률 2/3 로 이기고, 졌으면 풀이 죽어 확률 1/3 로만 이긴다. 1차전을 이겼다고 할 때 대회에서 우승할 확률은 얼마인가.

분자는 두 열에 모두 표시된 잎의 확률 합, 분모는 오른쪽 열에 표시된 잎의 확률 합이다. 조건부확률은 이 비 하나다
<분자는 두 열에 모두 표시된 잎의 확률 합, 분모는 오른쪽 열에 표시된 잎의 확률 합이다. 조건부확률은 이 비 하나다>[원본 보기]

예제 237

위 하키 대회에서 T 를 "대회에서 우승한다", F 를 "1차전을 이긴다"라 하고 Pr[TF] 를 구하라.

풀이 보기

무엇을 묻는가. 조건부확률 하나다. 정의에 필요한 것은 Pr[TF]Pr[F] 두 값이다.

1단계. 결과는 S={WW,WLW,WLL,LWW,LWL,LL} 여섯이다(W 는 승, L 는 패이고 두 번 이기거나 두 번 지면 끝난다).

2단계. T={WW,WLW,LWW}, F={WW,WLW,WLL} 다.

3단계. 첫 층은 1/2 씩이고, 그 아래는 부모의 결과에 따라 2/3 또는 1/3 이다. 경로를 곱하면

Pr[WW]=1223=13,Pr[WLW]=121313=118,Pr[WLL]=121323=19

이고 대칭적으로 Pr[LL]=1/3, Pr[LWL]=1/18, Pr[LWW]=1/9 다. 합이 13+118+19+19+118+13=1 이므로 확률함수가 맞다.

4단계. TF={WW,WLW} 이므로

Pr[TF]=Pr[TF]Pr[F]=1/3+1/181/3+1/18+1/9=7/189/18=79

답이 말이 되는가. 조건 없는 우승 확률은 Pr[T]=13+118+19=12 다. 1차전을 이기면 1/2 에서 7/9 로 뛴다. 기세 효과가 있는 대회에서 첫 경기가 그만큼 중요하다는 뜻이고, 값의 방향이 상식과 맞는다.

사후확률과 베이즈 규칙

물음을 거꾸로 돌려 보자. 대회에서 우승했다고 할 때 1차전을 이겼을 확률은? 이 물음을 이상하게 느끼는 사람이 많다. 대회가 이미 끝났다면 1차전 승패는 확률이 아니라 사실이다.

그러나 우리의 확률 이론에는 시간이라는 개념이 아예 없다. 사건 사이에 앞뒤가 없으므로 이 물음은 완전히 정당하다. 실용적으로도 뜻이 있다 — 대회 결과만 전해 듣고 개별 경기를 모른다면, 1차전 승패를 두고 확률을 말하는 것이 자연스럽다. BA 보다 시간적으로 앞설 때 Pr[BA]사후확률(a posteriori probability)이라 부른다. 수학적으로는 보통 조건부확률과 조금도 다르지 않다.

정리(베이즈 규칙). Pr[BA]=Pr[AB]Pr[B]Pr[A]

증명은 두 줄이다. 조건부확률의 정의에서 Pr[BA]Pr[A]=Pr[AB]=Pr[AB]Pr[B] 이므로 Pr[A] 로 나누면 된다.

예제 238

위 하키 대회에서 Pr[FT] 를 구하라. 그리고 베이즈 규칙으로 같은 값이 나오는지 확인하라.

풀이 보기

정의로 곧바로 계산하면 TF={WW,WLW} 이고 T={WW,WLW,LWW} 이므로

Pr[FT]=1/3+1/181/3+1/18+1/9=79

베이즈 규칙으로도 해 보자. 앞 예제에서 Pr[TF]=7/9 이고 Pr[F]=1/2, Pr[T]=1/2 이므로

Pr[FT]=(7/9)(1/2)1/2=79

답이 말이 되는가. 두 조건부확률이 같은 값이 되었다. 우연이다 — Pr[F]=Pr[T] 였기 때문이다. 베이즈 규칙을 보면 두 값이 같아지는 것은 Pr[A]=Pr[B] 일 때뿐임을 알 수 있다. 그러니 Pr[XY]Pr[YX] 를 섞어 쓰는 것은 아주 위험하다. 다음 예제가 그 위험을 수치로 보여 준다.

의학 검사 — 정확도라는 말의 함정

어떤 병에 대한 검사가 있고 성능이 이렇게 주어졌다고 하자.

그러니까 이 검사는 어느 쪽 사람에게든 90% 이상 옳은 답을 낸다. 이제 이 검사를 유병률이 1% 인 집단에 쓴다. 양성이 나왔다. 병이 있을 확률은 얼마인가.

만 명으로 세어 보면 양성 585 명 가운데 진짜가 90 명뿐이다. 건강한 사람이 압도적으로 많으면 작은 위양성률도 진짜를 압도한다
<만 명으로 세어 보면 양성 585 명 가운데 진짜가 90 명뿐이다. 건강한 사람이 압도적으로 많으면 작은 위양성률도 진짜를 압도한다>[원본 보기]

예제 239

위 상황에서 Pr[양성] 을 구하고, 그 값이 왜 그렇게 낮은지 설명하라.

풀이 보기

무엇을 묻는가. 사후확률이다. A 를 "병이 있다", B 를 "양성"이라 하자.

주어진 것을 조건부확률로 옮긴다. Pr[A]=0.01, Pr[BA]=0.90, Pr[BA]=0.05 다. 나무는 층이 둘이다 — 병이 있는가, 검사가 어떻게 나오는가.

곱셈 규칙으로 잎의 확률을 얻는다.

Pr[AB]=0.01×0.90=0.009,Pr[AB]=0.99×0.05=0.0495

양성인 잎은 이 둘뿐이므로 Pr[B]=0.0585 이고

Pr[AB]=0.0090.05850.154

답이 말이 되는가. 검사가 95% 정확한데도 양성 판정이 맞을 확률은 15% 다. 곧 양성이 나오면 85% 확률로 그 판정이 틀렸다.

왜 그런가. 양성이 되는 길이 둘이다 — 병이 있고 검사가 맞은 경우와, 건강한데 검사가 틀린 경우. 그런데 거의 모든 사람이 건강하다. 만 명 가운데 병이 있는 사람이 100명이고 그중 90명이 양성이다. 건강한 9900명 가운데 5% 인 495명도 양성이다. 양성 585명 가운데 진짜는 90명, 곧 15% 다. 수식 없이 사람 수로 세어 보는 이 방법을 자연 빈도(natural frequency)라 하고, 조건부확률의 결과가 이상해 보일 때 감각을 되찾는 데 쓸모 있다.

마지막으로 "정확도"라는 말의 허술함을 짚어 두자. "언제나 음성"이라고만 답하는 검사도 정확도가 99% 다(건강한 99% 에게 옳은 답을 낸다). 아무 정보도 주지 않는데 정확도는 더 높다. 검사의 값어치는 정확도가 아니라 양성이 오즈를 몇 배로 만드는가로 재야 하고, 그 이야기를 이 장 마지막 절에서 한다.

전확률 정리

앞 예제들에서 되풀이한 계산에 이름을 붙인다. 경우를 갈라 각각 계산한 뒤 확률로 가중평균한다.

규칙(전확률 정리, 사건 하나). Pr[A]=Pr[AE]Pr[E]+Pr[AE]Pr[E]

규칙(전확률 정리, 일반형). E1,,En 이 쌍마다 서로소이고 합집합이 확률 1 이면 Pr[A]=i=1nPr[AEi]Pr[Ei] 다.

증명은 한 줄이다. AAE1,,AEn 으로 쪼개면 서로소이므로 합의 규칙을 쓸 수 있고, 각 조각을 곱셈 규칙으로 바꾸면 된다. 그리고 베이즈 규칙의 분모에 이것을 넣으면 일반형 베이즈 규칙 Pr[E1A]=Pr[AE1]Pr[E1]/iPr[AEi]Pr[Ei] 가 나온다.

아래로 내려가면 전확률 정리, 거꾸로 올라가면 베이즈 규칙이다. 같은 그림의 두 방향이라는 점을 확인하라
<아래로 내려가면 전확률 정리, 거꾸로 올라가면 베이즈 규칙이다. 같은 그림의 두 방향이라는 점을 확인하라>[원본 보기]

조건을 고정하면 규칙이 산다

앞에서 "조건 하나를 고정하면 Pr 가 여전히 확률함수"라고 했다. 그 결과로 19장의 규칙들이 조건부 형태로도 그대로 참이다. 예컨대

Pr[ABC]=Pr[AC]+Pr[BC]Pr[ABC]

는 정의를 넣어 보면 곧 확인된다. 그러나 조건 자리에서는 그렇지 않다. 다음은 거짓이다.

Pr[ABC]Pr[AB]+Pr[AC]Pr[ABC](일반적으로)

잘못된 추론 찾기

인구 조사원에게 "집집마다 문을 두드려 문을 연 아이의 성별을 적어라"고 지시했다. 모든 집에 아이가 둘이고, 한 아이가 딸일 확률은 1/2 이며, 두 아이가 같은 확률로 문을 연다고 하자. 딸이 문을 열었을 때 두 아이가 모두 딸일 확률을 다음 추론으로 구했다. 어디가 틀렸는가?

"딸이 문을 열었으니 그 집에 딸이 적어도 한 명 있다. 딸이 적어도 한 명일 확률은 1(1/2)(1/2)=3/4 이고 두 아이가 모두 딸일 확률은 1/4 이므로, 답은 (1/4)/(3/4)=1/3 이다."

풀이 보기

틀린 곳은 마지막 문장이 아니라 "딸이 적어도 한 명 있다"를 조건으로 삼은 것이다. 그 조건은 우리가 아는 것보다 약하다. 우리는 "딸이 문을 열었다"를 알고 있다.

표본공간을 정확히 잡자. 결과를 (첫째 성별, 둘째 성별, 문을 연 아이) 로 적으면 여덟 개이고 모두 확률 1/8 이다. O 를 "딸이 문을 열었다", T 를 "두 아이가 모두 딸"이라 하면

O={(B,G,둘째),(G,B,첫째),(G,G,첫째),(G,G,둘째)},TO={(G,G,첫째),(G,G,둘째)}

이므로 Pr[O]=4/8=1/2, Pr[TO]=2/8=1/4 이고

Pr[TO]=1/41/2=12

1/3 이 아니라 1/2 인가. 두 조건이 걸러 내는 결과가 다르다. "적어도 한 명 딸"에는 딸이 한 명뿐인 집이 들어가고(첫째만 딸, 둘째만 딸) 두 딸 집이 하나 들어가 1:2 로 기운다. 그런데 "딸이 문을 열었다"는 조건에서는 딸이 한 명뿐인 집이 그 딸이 문을 열 때만(확률 1/2) 살아남고, 두 딸 집은 언제나 살아남는다. 그 가중치가 비를 1:1 로 되돌린다.

배울 것은 하나다. "정보를 얻었다"에서 "무엇을 조건으로 잡을까"로 가는 걸음이 조건부확률에서 가장 위험한 걸음이다. 정보를 얻는 방식이 표본공간에 들어 있어야 한다. 몬티 홀의 혼란도, 앞 절의 거짓 등식도, 이 예제도 모두 같은 실수의 다른 얼굴이다. 막는 법은 하나다 — 표본공간의 결과를 실제로 적어 보고 조건이 어느 결과들을 남기는지 눈으로 확인하는 것.

예제 241

죄수가 셋(볼드모트·사우론·푸푸) 있고 위원회가 그중 을 균등하게 골라 석방한다. 사우론은 자신이 석방될 확률이 2/3 임을 안다. 간수가 "다른 두 죄수 가운데 석방될 사람 하나의 이름"을 알려 주겠다고 한다(둘 다 석방되면 둘 중 하나를 같은 확률로 말한다). 사우론은 "푸푸가 석방된다"는 말을 들으면 자기 확률이 1/2 로 떨어질 테니 듣지 않는 것이 낫다고 생각한다. 어디가 틀렸는가?

풀이 보기

무엇을 묻는가. Pr[S"F"] 다. S 는 "사우론 석방", "F" 는 "간수가 푸푸라고 말한다"다.

1·2단계. 석방되는 두 명의 조합이 {V,S},{V,F},{S,F} 셋이고 각각 확률 1/3 이다. 둘째 층은 간수의 말이다.

3단계. {V,S} 이면 사우론 아닌 석방자는 볼드모트뿐이므로 간수는 반드시 "V" 라고 말한다. {S,F} 이면 반드시 "F" 다. {V,F} 이면 둘 다 석방되므로 "V" 와 "F" 를 각각 1/2 로 말한다. 잎의 확률은

Pr[{V,S},"V"]=13,Pr[{S,F},"F"]=13,Pr[{V,F},"V"]=Pr[{V,F},"F"]=16

4단계. "F" 인 잎은 둘이고 확률 합이 13+16=12 다. 그중 사우론이 석방되는 잎은 첫째 하나이므로

Pr[S"F"]=1/31/2=23

아무것도 바뀌지 않았다. 사우론의 실수는 "남은 두 경우 {S,F}{V,F} 가 같은 확률"이라고 본 것이다. 두 경우의 사전 확률은 같지만 "F" 라는 말을 낳는 확률이 다르다 — {S,F} 는 반드시 "F" 를 낳고 {V,F} 는 절반만 낳는다. 그래서 조건을 걸면 {S,F} 가 두 배 무거워진다.

답이 말이 되는가. 대칭으로 Pr[S"V"]=2/3 이므로 전확률 정리로 2312+2312=23=Pr[S] 다. 검산이 맞는다. 그리고 이 문제는 몬티 홀과 같은 문제다 — 간수가 사회자, 푸푸가 열린 문이다. 다만 사우론이 "문을 바꿀" 수 없으므로 확률이 그대로다.

심슨의 역설

1973년 어느 유명 대학이 성차별 조사를 받았다. 근거는 명백해 보였다. 그 해 남성 지원자의 44% 가 대학원에 합격했는데 여성은 35% 만 합격했다.

그런데 학과별로 뜯어 보니 차별의 증거가 거의 없었고, 통계적으로 이상한 몇 학과는 오히려 여성에게 유리한 쪽으로 기울어 있었다. 누군가 계산을 틀린 것 같지만 숫자는 서로 모순되지 않는다. 작은 집단마다 같은 방향의 경향이 있는데 합치면 경향이 뒤집히는 이 현상을 심슨의 역설(Simpson's paradox)이라 한다.

학과마다 여성 합격률이 높은데 합치면 남성이 높다. 지원자 수가 학과마다 크게 다른 것이 이 뒤집힘을 만든다
<학과마다 여성 합격률이 높은데 합치면 남성이 높다. 지원자 수가 학과마다 크게 다른 것이 이 뒤집힘을 만든다>[원본 보기]

학과가 둘(전산·전기)뿐인 예로 확인하자. 무작위로 지원자 한 명을 뽑는 실험을 생각하고 사건을 이렇게 둔다. A 는 "합격", FCS 는 "전산에 지원한 여성", MEE 는 "전기에 지원한 남성" 등이다. 넷은 쌍마다 서로소다.

학과남성여성
전산 (CS)5명 중 2명 합격 — 40%100명 중 50명 합격 — 50%
전기 (EE)100명 중 70명 합격 — 70%5명 중 4명 합격 — 80%
전체105명 중 72명 합격 — 69%105명 중 54명 합격 — 51%

학과마다 여성 합격률이 더 높은데 전체로는 남성이 더 높다. 까닭은 지원 분포다. 합격률이 낮은 전산에 여성이 100명 몰렸고 합격률이 높은 전기에는 5명뿐이며, 남성은 정반대다.

잘못된 증명 찾기

판사가 원고와 피고의 주장이 서로 모순된다고 보고 다음 증명을 제시했다. 어느 줄이 틀렸는가?

Pr[AFEEFCS]=Pr[AFEE]+Pr[AFCS] (FEEFCS 가 서로소이므로)

<Pr[AMEE]+Pr[AMCS] (학과별로 여성 합격률이 더 높다는 원고 주장에서)

=Pr[AMEEMCS] (MEEMCS 가 서로소이므로)

따라서 Pr[AFEEFCS]<Pr[AMEEMCS] 이고, 이는 "전체로는 여성 합격률이 더 높다"는 피고 주장과 모순이다.

풀이 보기

틀린 곳은 첫째 줄과 셋째 줄이다. 둘 다 같은 오류다. 합의 규칙은 조건 막대의 왼쪽에서만 쓸 수 있다. 조건 자리에서는 쓸 수 없다.

왜 안 되는지 정의로 확인하자. BC 가 서로소이면

Pr[ABC]=Pr[AB]+Pr[AC]Pr[BC]=Pr[AB]Pr[B]Pr[B]+Pr[C]+Pr[AC]Pr[C]Pr[B]+Pr[C]

이다. 곧 합이 아니라 가중평균이고 가중치는 두 조건의 확률의 비다. 판사의 식이 참이라면 여성 쪽 값이 0.5+0.8=1.3 이 되는데 확률이 1 을 넘을 수 없으니 그 자체로 모순이다.

옳게 계산하면 표의 숫자가 그대로 나온다. 여성은 전산 100명, 전기 5명이므로

Pr[AFEEFCS]=0.5100105+0.85105=50+4105=541050.51

남성은 전산 5명, 전기 100명이므로 0.45105+0.7100105=721050.69 다. 모순이 없다. 가중치가 반대로 걸려 있기 때문이다.

앞 절의 거짓 등식도 같은 이야기다. B::={0,,9}, C::={10,,18}{0}, A::={1,,18}{0,,18} 위의 균등 공간에서 잡으면 Pr[AB]=Pr[AC]=9/10 이고 Pr[ABC]=0 이라 오른쪽이 1.8 인데 왼쪽은 18/19 다.

끝으로 통계적 교훈. 같은 숫자에서 정반대 결론이 나온 이유는 우리가 "무엇이 원인인가"를 이미 믿고 있었기 때문이다. "학과" 대신 "심사한 날이 홀수인가"로 갈랐다면 같은 숫자를 보고도 우연이라 여기고 전체 통계를 믿었을 것이다. 자료가 우리 믿음을 확인해 준 것이 아니라, 우리 믿음이 자료 해석을 정했다. 상관은 인과를 뜻하지 않는다.

독립

방의 양쪽 끝에서 동전 두 개를 동시에 던진다고 하자. 한쪽이 어떻게 떨어지든 다른 쪽에 영향이 없다. 그 직관을 붙잡는 개념이 독립이다.

정의. 확률이 0 인 사건은 모든 사건과(자기 자신과도) 독립(independent)이라 정의한다. Pr[B]0 이면 AB 와 독립이라는 것은 Pr[AB]=Pr[A] 라는 뜻이다. 곧 B 가 일어났다는 것을 알아도 A 의 확률이 바뀌지 않는다.

정리. AB 와 독립인 것은 Pr[AB]=Pr[A]Pr[B] 와 동치다. 정의에 Pr[AB]=Pr[AB]/Pr[B] 를 넣고 양변에 Pr[B] 를 곱하면 된다. 이 형태는 대칭이므로 "AB 와 독립"과 "BA 와 독립"이 같은 말이다. 그래서 보통 "AB 는 독립이다"라고 쓴다.

흔한 오해 하나를 미리 막아 둔다. 서로소인 사건은 독립이 아니다. 오히려 정반대다. AB= 이면 A 가 일어났음을 아는 순간 B 가 일어나지 않았음을 알게 된다. 서로소인 사건은 확률이 0 이 아닌 한 절대 독립이 아니다.

그리고 독립은 대개 가정이다. 방 양쪽의 동전은 독립으로 보는 것이 온당하다. 그러나 어떤 맑은 날의 시간별 강우확률이 정오부터 자정까지 매시간 10% 라고 해서 "비가 하루 종일 안 올 확률이 0.9120.28"인 것은 아니다. 오후 5시에 비가 안 왔다면 6시에도 안 올 확률은 90% 보다 높고, 5시에 쏟아졌다면 6시에도 올 확률이 10% 보다 훨씬 높다.

상호 독립

사건이 셋 이상이면 이야기가 까다로워진다.

정의. 사건 E1,,En상호 독립(mutually independent)이라는 것은, 크기 2 이상인 모든 부분집합 T 에 대해 Pr[iTEi]=iTPr[Ei] 가 성립하는 것이다. 확인해야 할 등식이 2nn1 개다. 사건이 넷이면 열한 개(쌍 여섯 개, 세 겹 네 개, 네 겹 하나)다.

정의. 사건들의 집합이 k-겹 독립(k-way independent)이라는 것은 크기 k 인 모든 부분집합이 상호 독립인 것이다. 2-겹 독립을 쌍마다 독립(pairwise independent)이라 한다.

사건이 둘이면 등식 하나, n 개면 2ⁿ − n − 1 개다. 쌍마다 독립에서 상호 독립으로 가는 화살표가 없다는 것이 이 그림의 요점이다
<사건이 둘이면 등식 하나, n 개면 2ⁿ − n − 1 개다. 쌍마다 독립에서 상호 독립으로 가는 화살표가 없다는 것이 이 그림의 요점이다>[원본 보기]

예제 243

공정하고 상호 독립인 동전 셋을 던지고 A1 을 "1번과 2번이 같다", A2 를 "2번과 3번이 같다", A3 를 "3번과 1번이 같다"라 하자. 이 세 사건이 쌍마다 독립이지만 상호 독립은 아님을 증명하라.

증명

뼈대는 이렇다. 결과 여덟 개를 적고 확률을 직접 센다. 쌍은 다 맞고 세 겹만 틀린다는 것을 보이면 된다.

증명. 표본공간은 {HHH,HHT,HTH,HTT,THH,THT,TTH,TTT} 이고 동전이 공정하고 상호 독립이므로 모든 결과의 확률이 (1/2)3=1/8 이다.

A1={HHH,HHT,TTH,TTT} 이므로 Pr[A1]=4/8=1/2 이고, 대칭으로 Pr[A2]=Pr[A3]=1/2 다.

쌍마다. A1A2={HHH,TTT} 이므로

Pr[A1A2]=28=14=1212=Pr[A1]Pr[A2]

이다. 대칭으로 A1A3A2A3 도 각각 {HHH,TTT} 이므로 같은 등식이 성립한다. 그러므로 쌍마다 독립이다.

세 겹. A1A2A3={HHH,TTT} 이므로

Pr[A1A2A3]=1418=Pr[A1]Pr[A2]Pr[A3]

이다. 상호 독립의 조건이 깨졌다.

답이 말이 되는가. 까닭이 그림에 보인다. 세 쌍 가운데 둘이 같다는 것을 알면 세 번째도 반드시 같다. 세 겹 교집합이 두 겹 교집합과 똑같은 집합인 것이 그 사실의 표현이다. 그러므로 A3A1A2 를 함께 알면 완전히 결정되고, 각각만 알면 아무 정보도 주지 않는다.

이 예를 일반화할 수 있다. 상호 독립인 동전 n1 개와 그 배타적 논리합을 한 변수로 두면 (n1)-겹 독립이지만 상호 독립이 아닌 n 개 사건을 얻는다. 쌍만 확인하고 넘어가는 습관이 위험한 이유다.

쌍마다는 1/4 = (1/2)(1/2) 로 맞지만 셋을 함께 보면 1/4 와 1/8 이 어긋난다. 두 쌍이 같으면 세 번째도 같아지는 것이 그 까닭이다
<쌍마다는 1/4 = (1/2)(1/2) 로 맞지만 셋을 함께 보면 1/4 와 1/8 이 어긋난다. 두 쌍이 같으면 세 번째도 같아지는 것이 그 까닭이다>[원본 보기]

예제 244

어느 재판에서 범죄 현장 혈액의 유전 표지 다섯 개가 피고와 일치했고, 검찰은 무작위로 뽑은 사람이 그 다섯을 모두 가질 확률이 1/170000000 이라고 주장했다. 근거는 각 표지의 빈도 1/100,1/50,1/40,1/5,1/170 을 곱한 것이다. (가) 이 계산이 요구하는 가정은? (나) 쌍마다 독립만 가정하면 어떤 상한을 얻는가? (다) 아무 독립도 가정하지 않으면?

풀이 보기

(가) 다섯 사건의 상호 독립이다. 다섯 겹 교집합의 확률을 다섯 확률의 곱으로 쓰는 등식은 상호 독립의 조건 가운데 하나이고, 쌍마다 독립으로는 나오지 않는다.

(나) 다섯 겹 교집합은 어느 두 겹 교집합의 부분집합이다. 단조성으로 상한을 얻을 수 있으니 가장 드문 두 표지 A (1/100)와 E (1/170)를 고르자.

Pr[ABCDE]Pr[AE]=Pr[A]Pr[E]=11001170=117000

둘째 등호에서만 독립을 썼고 그것은 쌍마다 독립으로 충분하다.

(다) 표지들이 겹겹이 포개져 있을 수도 있다. E 를 가진 사람이 모두 A 를 가지고, A 를 가진 사람이 모두 B 를 가지고, … 하는 식이라면 다섯 겹 교집합이 E 와 같아져 확률이 1/170 이다.

답이 말이 되는가. 세 값의 차이가 1/170, 1/17000, 1/170000000 — 만 배씩 벌어진다. 어떤 독립을 가정하느냐가 결론을 백만 배 바꾼다. 그리고 상호 독립을 확인하려면 수억 개 표본이 필요하다 — 다른 넷이 함께 있을 때 다섯째 표지의 빈도가 달라지지 않는다는 것을 어떻게 알겠는가. 독립은 공짜가 아니다.

예제 245

공정한 동전을 계속 던져 연속한 세 번이 HHT 또는 HTT 가 되는 순간 멈춘다. HTT 가 먼저 나올 확률은? (19장에서 HHTTTH 는 대칭으로 1/2 임을 보았다.)

풀이 보기

무엇을 묻는가. 대칭 논법이 통하지 않는 경우다. 이름을 맞바꾸면 TTHTHH 가 되어 원래 짝이 아니므로, 계산을 해야 한다.

요령은 "지금까지 본 것 가운데 앞으로 쓸모 있는 부분"만 상태로 삼는 것이다. 두 무늬가 모두 H 로 시작하므로 첫 H 가 나오기 전에는 아무 일도 일어나지 않는다. 그 뒤로 필요한 상태는 둘이다 — 마지막이 H 인 상태(H)와 마지막 둘이 HT 인 상태(HT).

HH 에 도달하면 HTT영원히 나올 수 없다. H 가 계속되면 HH 에 머물고, T 가 나오는 순간 HHT 로 끝나기 때문이다. 그러므로 HH 에서 HTT 가 이길 확률은 0 이다.

h 를 상태 H 에서, t 를 상태 HT 에서 HTT 가 이길 확률이라 하자. 상태 H 에서 다음이 H 면(확률 1/2) HH 로 가고, THT 로 간다. 상태 HT 에서 다음이 THTT 로 끝나고, H 면 마지막 글자가 H 이므로 H 로 되돌아온다. 전확률 정리로

h=120+12t,t=121+12h

첫 식을 둘째에 넣으면 t=12+14t 이므로 t=2/3 이고 h=1/3 이다. 첫 H 이후 상태 H 에서 시작하므로

Pr[HTT 먼저]=13,Pr[HHT 먼저]=23

답이 말이 되는가. 1/2 이 아니다. 왜 HHT 가 유리한가. 두 무늬는 H 로 시작하는데, HH 에 한 번 닿으면 HHT확정된다. 반면 HT 에 닿아도 HTT 가 확정되지 않고 H 가 나오면 원점으로 돌아간다. 비대칭은 "실패했을 때 얼마나 뒤로 밀리는가"에 있다. 이 감각은 23장의 무작위 행보에서 다시 나온다.

확률과 신뢰

마지막 절은 실전에서 조건부확률이 오해되는 방식에 대한 것이다. 결핵 검사가 있고 성능이 아주 좋다고 하자. 병이 있으면 반드시 양성이고, 병이 없으면 99% 확률로 옳게 음성이 나온다.

Pr[양성결핵]=1,Pr[음성결핵]=0.99

이 검사는 누구에게든 99% 이상 옳은 답을 낸다. 그래서 이렇게 말할 수 있다. "검사 결과가 옳다고 99% 신뢰수준에서 말할 수 있다." 그리고 양성이 나왔다면 "결핵이 있거나, 아니면 확률 1/100 짜리 아주 드문 일이 일어났다"고 말할 수 있다. 둘 다 참이다.

여기서 "그러니 양성이면 결핵일 확률이 0.99 다"로 넘어가면 틀린다. 위 문장은 "아주 드문 일"과 "결핵" 가운데 어느 쪽이 더 드문지 말하지 않는다. 그리고 결핵은 검사가 틀리는 것보다 훨씬 드물다.

오즈와 베이즈 인자

이 이야기를 깔끔하게 하려면 확률을 오즈(odds)로 바꾸는 것이 좋다.

Odds(H)::=Pr[H]Pr[H]=Pr[H]1Pr[H],Pr[H]=Odds(H)1+Odds(H)

공정한 주사위로 4가 나올 오즈는 (1/6)/(5/6)=1/5 다. 도박사의 말로 "일 대 오"다. 이제 증거 E 를 얻었을 때의 오즈를 베이즈 규칙으로 계산하면 Pr[E] 가 약분되어

Odds(HE)=Pr[HE]Pr[HE]=Pr[EH]Pr[EH]베이즈 인자Odds(H)

가 된다. 앞의 인수를 베이즈 인자(Bayes factor)라 한다. 증거는 오즈에 곱해진다. 검사의 값어치는 이 곱하는 수 하나로 재는 것이 옳다.

예제 246

위 결핵 검사의 베이즈 인자를 구하라. 그리고 어느 인구 집단의 결핵 유병률이 1/10000 이라 할 때, 무작위로 뽑은 사람이 양성이면 결핵일 확률을 구하라.

풀이 보기

베이즈 인자는

Pr[양성결핵]Pr[양성결핵]=110.99=100

이다. 양성은 오즈를 100배로 만든다. 이것만 보면 강한 증거다.

사전 오즈는 Odds(결핵)=1/100009999/10000=19999 다. 곱하면

Odds(결핵양성)=100199991100

이므로 확률은 1/1001+1/1000.0099, 곧 약 1% 다.

답이 말이 되는가. 99% 신뢰수준의 양성 판정을 받고도 결핵일 확률은 1% 다. "99% 신뢰"와 "확률 0.99"는 전혀 다른 말이다. 신뢰수준은 검사에 대한 진술이고 확률은 사람에 대한 진술이다. 그리고 사후 확률을 계산하려면 사전 확률이 반드시 필요하다 — 검사의 성능만으로는 결코 얻을 수 없다. 베이즈 인자가 유병률과 무관하다는 점이 오히려 이 사실을 또렷하게 만든다.

이 구별이 실전에서 가장 날카롭게 드러나는 예가 있다. 공정하다고 들은 동전을 100번 던졌는데 모두 앞면이 나왔다. 다음도 앞면에 걸어야 하는가? "공정하다는 정의상 1/2"라는 답은 모형 안에서 옳다. 틀린 것은 답이 아니라 모형이다 — 2100 짜리 사건을 관측했다는 사실 자체가 "공정하다"는 가정의 신용을 무너뜨린다. 앞면 확률 99/100 인 치우친 동전이 확률 250 로 섞여 있을 가능성만 넣어도, 베이즈 인자가 (99/100)100/2100>0.362100 이므로 사후 오즈가 0.362504×1014 로 뛴다. 상식이 맞았다.

사전 확률을 가정하고 싶지 않다면 신뢰수준으로만 말해도 된다. "동전이 치우쳤거나, 아니면 확률 2100 짜리 일이 일어났다" — 곧 12100 신뢰수준에서 치우쳤다고 말할 수 있다. 두 언어 모두 "앞면에 걸어라"라는 같은 실천으로 이어진다. 22장에서 표본으로 모수를 추정할 때 이 구별이 다시 중요해진다.

이 장에서 새로 나온 것

기호·용어
조건부확률Pr[XY]::=Pr[XY]/Pr[Y]. Pr[Y]=0 이면 정의되지 않는다
조건을 건다는 것Y 밖의 결과를 버리고 남은 확률을 Pr[Y] 로 나눠 다시 1 로 맞춘다
곱셈 규칙(2)Pr[E1E2]=Pr[E1]Pr[E2E1]
곱셈 규칙(n)조건 자리의 교집합이 한 항씩 커진다. 정의를 n1 번 되풀이한 것
나무 그림의 근거간선 확률이 조건부확률이므로 경로를 곱하는 것이 곱셈 규칙이다
사후확률BA 보다 앞설 때의 Pr[BA]. 수학적으로는 다를 것이 없다
베이즈 규칙Pr[BA]=Pr[AB]Pr[B]/Pr[A]
전확률 정리Pr[A]=iPr[AEi]Pr[Ei]. Ei 가 분할일 때
일반형 베이즈 규칙베이즈 규칙의 분모를 전확률 정리로 채운 것
자연 빈도만 명으로 세어 보는 방법. 조건부확률의 결과가 이상해 보일 때 감각을 되찾는다
막대 왼쪽과 오른쪽왼쪽에서는 19장의 규칙이 다 살아 있다. 오른쪽에서는 가중평균만 참이다
Pr[ABC]B,C 가 서로소일 때 Pr[AB]Pr[AC] 의 가중평균
심슨의 역설집단마다 같은 방향인 경향이 합치면 뒤집힌다. 가중치가 반대로 걸릴 때
독립Pr[AB]=Pr[A], 곧 Pr[AB]=Pr[A]Pr[B]. 대칭이다
서로소 ≠ 독립서로소인 사건은 확률이 0 이 아닌 한 절대 독립이 아니다
상호 독립크기 2 이상인 모든 부분집합에서 곱 등식이 성립. 등식이 2nn1
k-겹 독립 · 쌍마다 독립크기 k 인 부분집합만 확인 · k=2 인 경우
쌍마다 ⇏ 상호동전 셋의 A1,A2,A3. 쌍은 1/4 로 맞고 세 겹은 1/41/8
독립 가정의 값표지 다섯 개가 1/170, 1/17000, 1/170000000 로 갈린다
오즈Odds(H)::=Pr[H]/Pr[H]. Pr[H]=Odds/(1+Odds)
베이즈 인자Pr[EH]/Pr[EH]. 증거는 오즈에 곱해진다
신뢰수준 ≠ 확률신뢰수준은 검사에 대한 진술, 확률은 대상에 대한 진술이다

챙겨 갈 것은 넷이다.

다음 장에서는 사건에서 로 옮겨 간다. "이길 확률" 대신 "몇 번 이기는가", "얼마를 잃는가"를 묻는 것이다. 그 도구가 확률변수이고, 그 위에 세울 기댓값의 선형성이 이 문서 전체에서 가장 자주 쓰는 도구가 된다. 이 장의 조건부확률과 전확률 정리는 그때 조건부 기댓값전기댓값 정리로 그대로 옮겨 간다.

확률변수

지금까지 물은 것은 늘 "⋯일 확률"이었다. 그런데 실제로 알고 싶은 것은 대개 다. 몬티 홀 게임을 몇 번 해야 누군가 자동차를 얻을까. 이 병은 얼마나 오래 갈까. 이상한 주사위로 밤새 놀면 얼마를 잃을까. 이런 물음에 답하려면 결과에 수를 붙이는 도구가 필요하다.

이 장에서 답할 것은 셋이다. "무작위로 정해지는 수"를 어떻게 정의하는가(놀랍게도 함수다). 그 수의 평균을 어떻게 정의하며 왜 두 정의가 같은가. 그리고 그 평균에 대해 무엇이 참인가. 마지막 물음의 답이 이 장의 — 어쩌면 이 문서 전체의 — 가장 값어치 있는 도구다. 기댓값의 선형성이라 부르고, 여러 확률변수의 합의 평균은 각 평균의 합이라는 한 줄이다. 독립을 요구하지 않는다는 점이 그 힘의 원천이다. 분포를 구할 수 없어 손을 못 대던 문제들이 이 한 줄로 풀린다.

앞 장들에서 가져오는 것은 19장의 확률 공간과 네 단계 방법, 20장의 조건부확률·곱셈 규칙·전확률 정리·상호 독립, 17장의 이항계수와 셈의 규칙, 16장의 조화수 Hn스털링 근사등비급수다. 확률변수·기댓값·분산과 이항분포는 기초수학통계학 문서에서 이미 계산해 보았을 것이다. 여기서는 정의에서 시작해 정리를 증명하고, 선형성이 성립하는 범위를 정확히 가른다.

확률변수는 함수다

정의. 확률 공간 위의 확률변수(random variable)는 정의역이 표본공간인 전함수다. 이름이 잘못 붙은 개념이다 — 확률변수는 변수가 아니라 함수다. 공역은 무엇이든 될 수 있지만 보통은 실수의 부분집합이다.

공정하고 상호 독립인 동전 셋을 던진다고 하자. C 를 앞면의 개수라 하고, M 을 세 동전이 모두 같으면 1, 아니면 0 이라 하자. 표본공간 S={HHH,HHT,HTH,HTT,THH,THT,TTH,TTT} 의 각 결과에 대해 두 값이 하나로 정해지므로 CM 은 함수다. 예컨대 C(HTH)=2, M(HTH)=0, C(TTT)=0, M(TTT)=1 이다.

지시확률변수

정의. 모든 결과를 0 또는 1 로 보내는 확률변수를 지시확률변수(indicator random variable) 또는 베르누이 변수라 한다. 위의 M 이 그 예다. 지시확률변수는 사건과 사실상 같은 것이다. 사건 E 가 있으면

IE(ω)::={1(ωE)0(ωE)

로 정의하면 E 는 사건 [IE=1] 과 같다. 거꾸로 지시변수는 표본공간을 값이 1 인 부분과 0 인 부분으로 나눈다. M 은 곧 "세 동전이 모두 같다"는 사건의 지시변수다. 이 사소해 보이는 대응이 이 장 후반의 주역이다.

확률변수와 사건

값이 여러 개인 확률변수는 표본공간을 여러 조각으로 나눈다. C 는 이렇게 나눈다.

값이 같은 결과를 모으면 표본공간의 분할이 된다. 각 블록이 사건이므로 확률을 잴 수 있다
<값이 같은 결과를 모으면 표본공간의 분할이 된다. 각 블록이 사건이므로 확률을 잴 수 있다>[원본 보기]

각 조각은 S 의 부분집합이므로 사건이다. 그래서 확률변수의 값에 대한 어떤 주장이든 사건을 정의한다. 예컨대

[C=2]={THH,HTH,HHT},Pr[C=2]=18+18+18=38

이고 [M=1]={HHH,TTT} 이므로 Pr[M=1]=1/4 이다. [C1] 이나 [CM 이 홀수] 같은 것도 사건이다(뒤의 것은 {HHH} 하나다 — 잠깐 생각해 보면 확인된다).

확률변수의 독립

정의. 확률변수 R1R2독립이라는 것은 모든 x1,x2 에 대해 사건 [R1=x1][R2=x2] 가 독립인 것이다. R1,,Rn상호 독립이라는 것은 모든 값에 대해 n 개 사건이 상호 독립인 것이다.

예제 247

(가) 위의 CM 은 독립인가? (나) H1 을 "첫 동전이 앞면"의 지시변수라 할 때 H1M 은 독립인가? (다) 두 사건이 독립인 것과 그 지시변수가 독립인 것이 같음을 증명하라.

증명

(가) 독립이 아니다. 반례 하나를 찾으면 된다. x1=2, x2=1 로 두면

Pr[C=2 이고 M=1]=01438=Pr[M=1]Pr[C=2]

왼쪽이 0 인 것은 앞면이 정확히 둘이면 세 동전이 모두 같을 수 없기 때문이다. 직관과도 맞는다 — 앞면 개수를 알면 모두 같은지가 완전히 결정된다.

(나) 독립이다. [H1=1]={HHH,HTH,HHT,HTT} 이고 이 넷 가운데 M=1 인 것은 HHH 하나이므로

Pr[M=1H1=1]=1/81/2=14=Pr[M=1]

이다. H1=0 인 경우도 같고, M=0 인 경우는 여사건이므로 자동이다. 뜻은 이렇다 — 첫 동전 하나만 봐서는 셋이 모두 같은지에 대해 아무것도 알 수 없다.

(다) A1::=A, A0::=A 로 적으면 사건 [IA=c] 가 곧 Ac 다(c{0,1}). B 도 같이 둔다.

(⇐) 지시변수가 독립이면 c=d=1 인 경우가 곧 Pr[AB]=Pr[A]Pr[B] 이므로 두 사건이 독립이다. (⇒) 두 사건이 독립이면 나머지 세 조합은 여사건 규칙으로 나온다. 예컨대

Pr[A1B0]=Pr[A]Pr[AB]=Pr[A]Pr[A]Pr[B]=Pr[A](1Pr[B])=Pr[A1]Pr[B0]

이고(첫 등호는 차의 규칙이다) A0B1, A0B0 도 같은 방식이다.

답이 말이 되는가. (다)는 "사건의 독립"과 "확률변수의 독립"이 서로 어긋나지 않음을 확인한 것이다. 그리고 독립인 변수의 함수도 독립이다 — RS 가 독립이면 f(R)g(S) 도 독립이다. 증명은 [f(R)=a]f(r)=ar 들에 대한 [R=r] 의 서로소 합집합임을 쓰면 된다.

분포함수

확률변수를 다룰 때 표본공간이 무엇인지는 대개 상관없다. 필요한 것은 값마다의 확률뿐이다.

정의. 공역이 V 인 확률변수 R확률질량함수PDFR:V[0,1]

PDFR(x)::={Pr[R=x](xrange(R))0(그 밖에)

이다. 공역이 실수의 부분집합이면 누적분포함수CDFR(x)::=Pr[Rx] 로 정의한다. (원서는 앞의 것을 probability density function 이라 부르고 표기도 그래서 PDF 인데, 값이 띄어져 있는 변수에서는 밀도가 아니라 질량이므로 이 문서는 pmf라는 말도 함께 쓴다.) 정의에서 곧바로 xPDFR(x)=1 이 나오고, CDFR(x)=yxPDFR(y) 이므로 둘은 같은 정보를 담고 있다.

두 그림에 표본공간이 없다는 것이 요점이다. 그래서 서로 다른 실험의 확률변수가 같은 pmf 를 가질 수 있다
<두 그림에 표본공간이 없다는 것이 요점이다. 그래서 서로 다른 실험의 확률변수가 같은 pmf 를 가질 수 있다>[원본 보기]

표본공간이 사라졌다는 것이 왜 중요한가. 서로 다른 실험의 확률변수가 같은 pmf 를 갖는 일이 아주 흔하기 때문이다. 그래서 자주 나오는 pmf 에는 이름이 붙었다.

이름 붙은 분포 넷

컴퓨터과학에서 특히 자주 쓰이는 넷이다.

이름pmf어디서 나오는가
베르누이f(1)=p, f(0)=1p지시확률변수의 분포
균등공역의 원소가 n 개이면 모두 1/n공정한 주사위, 무작위로 고르기
이항fn,p(k)=(nk)pkqnk (q=1p)독립인 동전 n 번의 앞면 개수
기하f(i)=qi1p처음 성공까지 걸린 횟수

이항분포는 이렇게 나온다. 앞면이 k 개인 수열은 (nk) 개이고(17장의 부분집합 규칙) 그 각각의 확률이 pkqnk 이므로 합이 (nk)pkqnk 다. p=1/2 이면 (nk)2n 이 되고 이것을 치우치지 않은 이항분포라 한다(/posts/fundamental/probability.html > 이항분포 에서 이 분포로 실제 계산을 해 보았을 것이다).

봉우리에서 멀어지면 확률이 급히 작아진다. 강조한 양쪽 끝을 꼬리라 하고, 22장의 편차 한계가 바로 이 꼬리를 위에서 잡는 일이다
<봉우리에서 멀어지면 확률이 급히 작아진다. 강조한 양쪽 끝을 꼬리라 하고, 22장의 편차 한계가 바로 이 꼬리를 위에서 잡는 일이다>[원본 보기]

봉우리 양쪽으로 급히 작아지는 부분을 분포의 꼬리(tail)라 한다. 컴퓨터과학의 확률 분석은 대개 "나쁜 일이 일어날 확률"을 위에서 잡는 일이고, 그것이 곧 꼬리의 크기를 재는 일이다. 감각을 위해 하나만 적어 두면, 공정한 동전 100번에서 앞면이 25번 이하일 확률은 300만 분의 1 미만이다. 22장이 이 계산을 일반적으로 한다.

숫자 게임

정의가 길었으니 게임을 하나 하자. 봉투가 둘이고 각각에 0 부터 n 사이의 서로 다른 정수가 들어 있다. 큰 수가 든 봉투를 맞히면 이긴다. 봉투 하나를 무작위로 열어 그 수를 볼 수 있다. 수는 무작위가 아니다 — 우리가 고르고, 당신의 전략을 깨뜨리도록 고른다. 그래도 어떤 수를 넣든 승률이 1/2 을 넘는 전략이 있다.

발상은 이렇다. 두 수 사이에 있는 값 x 를 안다면 반드시 이긴다(엿본 수가 x 보다 크면 그것이 큰 쪽, 작으면 다른 쪽이 큰 쪽이다). 그런 x 를 알 수는 없으니 찍는다. 맞으면 100% 로 이기고, 틀려도 승률이 여전히 1/2 이므로 합치면 1/2 을 넘는다.

x 가 두 수 사이에 떨어지면 엿본 것이 무엇이든 이긴다. 그 확률만큼 1/2 위로 올라가는 것이 이 전략의 이득이다
<x 가 두 수 사이에 떨어지면 엿본 것이 무엇이든 이긴다. 그 확률만큼 1/2 위로 올라가는 것이 이 전략의 이득이다>[원본 보기]

예제 248

위 전략을 정확히 적고 승률을 구하라. x 는 반정수 12,32,,2n12 가운데 균등하게 고른다(정수를 고르면 두 수 가운데 하나와 같아질 수 있어 번거롭다).

풀이 보기

무엇을 묻는가. 나무를 그려 사건의 확률을 더하면 된다. 두 수를 L<H 라 하자.

1단계. 무작위로 정해지는 양이 둘이다 — 고른 x 와 엿본 봉투. xL 보다 작거나(반정수 L 개), 두 수 사이이거나(HL 개), H 보다 크다(nH 개). 엿본 수는 T=L 이거나 T=H 이고 각각 1/2 이다. 잎이 여섯이다.

3단계. 첫 층의 간선은 L/n, (HL)/n, (nH)/n 이고(합이 1 이다) 둘째 층은 모두 1/2 이다.

2단계. 어느 잎에서 이기는가. x<L 이면 엿본 수가 무엇이든 x 보다 크므로 "이것이 큰 쪽"이라 답한다 — T=H 면 맞고 T=L 이면 틀린다. x>H 이면 반대로 "다른 쪽이 큰 쪽"이라 답하므로 T=L 이면 맞고 T=H 이면 틀린다. 그리고 L<x<H 이면 양쪽 다 맞는다.

4단계. 이기는 잎 넷을 더한다.

Pr[이긴다]=L2n+HL2n+HL2n+nH2n=n+HL2n=12+HL2n

두 수가 서로 다른 정수이므로 HL1 이고

Pr[이긴다]12+12n

답이 말이 되는가. n=100 이면 최소 50.5%, n=10 이면 55% 다. 카지노 기준으로는 훌륭한 승률이다. 요점은 어떤 수를 넣어도 이 하한이 유효하다는 것이다. 우리가 5051 을 넣어 HL 을 최소로 만들어도 1/2+1/2n 은 지켜진다. 균등하게 찍는 것이 최선인 까닭도 여기 있다 — 어떤 반정수를 덜 자주 고른다는 것을 우리가 알면 그 주변 값을 봉투에 넣으면 되기 때문이다.

이런 것을 확률화 알고리즘(randomized algorithm)이라 한다. 무작위 수로 결정을 흔들어 성능의 하한을 보장하는 방식이고, 퀵소트와 이더넷의 지수 백오프가 같은 발상이다.

예제 249

공정한 주사위 셋을 상호 독립으로 굴리고 M::=max{R,S,T} 라 하자. 각 주사위가 {1,2,3} 에서 균등하다고 할 때 PDFM 을 구하라.

풀이 보기

무엇을 묻는가. 값마다의 확률이다. 요령은 pmf 를 직접 구하지 않고 cdf 를 먼저 구하는 것이다. 최댓값이 k 이하라는 것은 셋 다 k 이하라는 뜻이므로 상호 독립을 쓸 수 있다.

CDFM(k)=Pr[Mk]=Pr[Rk]Pr[Sk]Pr[Tk]=(k3)3

그러므로 PDFM(k)=CDFM(k)CDFM(k1) 이고

PDFM(1)=127,PDFM(2)=827127=727,PDFM(3)=2727827=1927

답이 말이 되는가. 합이 (1+7+19)/27=1 이다. 그리고 값이 급격히 오른쪽으로 몰려 있다 — 셋 가운데 하나만 3 이면 최댓값이 3 이므로 그럴 수밖에 없다. 최댓값은 cdf 로, 최솟값은 여사건으로 다루는 것이 정석이다. 최솟값이라면 Pr[min>k]=((3k)/3)3 을 쓴다.

기댓값

시험 점수를 받으면 가장 먼저 궁금한 것이 반 평균이다. 그 평균이 곧 "무작위로 뽑은 학생의 기댓값"이다.

정의. 표본공간 S 위의 음이 아닌 실수값 확률변수 R기댓값(expectation) 또는 평균(mean)

Ex[R]::=ωSR(ω)Pr[ω]

이다. 값이 음수도 되는 변수는 위 합이 절대수렴할 때만 기댓값을 정의한다(이 조건이 왜 필요한지는 이 장 마지막 절에서 드러난다). 정의에 따라 공정한 주사위 눈 R 의 기댓값은 116++616=72 다. "기댓값"이라는 이름이 조금 어긋난다는 것을 여기서 확인해 두자 — 주사위에서 3.5 를 기대하는 사람은 없다.

두 방식으로 정의하고 같음을 보이기

위 계산에서 우리는 정의대로 결과마다 더한 것이 아니라 값마다 더했다. 그래도 되는 이유가 다음 정리다.

결과마다 더하는 쪽은 증명에 편하고 값마다 더하는 쪽은 계산에 편하다. 두 정의를 오가는 것이 이 장의 기술이다
<결과마다 더하는 쪽은 증명에 편하고 값마다 더하는 쪽은 계산에 편하다. 두 정의를 오가는 것이 이 장의 기술이다>[원본 보기]

예제 250

모든 확률변수 R 에 대해 Ex[R]=xrange(R)xPr[R=x] 임을 증명하라.

증명

뼈대는 이렇다. 같은 값을 주는 결과들을 먼저 묶는다. 사건 [R=x] 들이 S 의 분할이므로 항을 다시 모아도 된다.

증명. 정의에서 출발한다.

Ex[R]=ωSR(ω)Pr[ω]=xrange(R)ω[R=x]R(ω)Pr[ω]

첫 등호는 정의이고 둘째 등호는 [R=x] 들이 S 를 분할하므로 성립한다. 안쪽 합의 각 항에서 ω[R=x] 이므로 R(ω)=x 이고, 상수 x 를 밖으로 뽑으면

=xω[R=x]xPr[ω]=xx(ω[R=x]Pr[ω])=xxPr[R=x]

이고 마지막 등호는 사건의 확률의 정의다.

답이 말이 되는가. 항의 순서를 마음대로 바꾸었다는 점을 짚어 두자. 음이 아닌 실수의 가산 합은 순서를 바꿔도 같은 값에 수렴하거나 언제나 발산한다는 정리가 그것을 허락한다. 값이 음수도 되면 이 자유가 사라지고(16장에서 조건수렴 급수의 항을 옮기면 값이 달라지는 것을 보았다) 그래서 절대수렴을 요구했다.

어느 쪽을 쓸지는 상황에 따라 다르다. 결과마다 더하는 정의는 증명에 편하다 — 선형성이 한 줄로 나온다. 값마다 더하는 형태는 계산에 편하다 — 표본공간을 몰라도 pmf 만 있으면 된다.

지시확률변수의 기댓값

아주 짧지만 이 장에서 가장 많이 쓰일 사실이다.

보조정리. 사건 A 의 지시변수 IA 에 대해 Ex[IA]=Pr[A] 다. 증명은 한 줄이다 — 값이 01 뿐이므로

Ex[IA]=1Pr[IA=1]+0Pr[IA=0]=Pr[IA=1]=Pr[A]

이다. 지시변수의 기댓값은 그 사건의 확률이다. 이 한 줄이 확률과 기댓값을 잇는 통로다.

예제 251

공정한 주사위 눈을 R 이라 할 때 (가) Ex[R2](Ex[R])2 를 견주어라. (나) Ex[1/R]1/Ex[R] 을 견주어라.

풀이 보기

(가) R2 도 확률변수이고 값마다 더하면 Ex[R2]=(1+4+9+16+25+36)/6=91/615.17 인데 (Ex[R])2=(7/2)2=12.25 다. 다르다.

(나) Ex[1/R]=16(1+12+13+14+15+16)=H66=491200.408 인데 1/Ex[R]=2/70.286 다. 역시 다르다.

답이 말이 되는가. 함수를 씌우는 것과 기댓값을 취하는 것은 순서를 바꿀 수 없다. Ex[f(R)]f(Ex[R]) 가 보통이고, 이것을 같다고 쓰는 것이 이 장에서 가장 흔한 실수다. 다음 절에서 볼 선형성은 f 가 일차함수일 때만 그 순서를 바꿀 수 있다는 이야기다.

(가)에서 Ex[R2]>(Ex[R])2 인 것은 우연이 아니다. 두 값의 차이가 분산이고 언제나 음이 아니다(91/649/4=35/12). 22장에서 이 양이 주역이 된다.

조건부 기댓값과 전기댓값 정리

사건에 조건을 걸 수 있었으니 기댓값에도 걸 수 있다.

정의. 사건 A 가 주어졌을 때 R조건부 기댓값

Ex[RA]::=rrange(R)rPr[R=rA]

이다. 예컨대 주사위 눈이 4 이상이라는 조건에서 눈의 기댓값은 413+513+613=5 다.

정리(전기댓값 정리). A1,A2,S 의 분할이면 Ex[R]=iEx[RAi]Pr[Ai] 다. 증명은 값마다 더하는 형태에서 전확률 정리를 쓰고 합의 순서를 바꾸면 된다. 20장의 전확률 정리가 그대로 기댓값으로 옮겨 온 것이고, 복잡한 기댓값을 쉬운 경우로 쪼갤 때 쓴다.

예제 252

학생이 빨래를 미루는 날 수를 구한다. 바쁜 학생은 과제 세 개를 끝낸 뒤에 빨래하는데 과제 하나에 확률 2/3 로 1일, 확률 1/3 로 2일이 걸린다. 느긋한 학생은 매일 아침 공정한 주사위를 굴려 1이 나오면 그날 빨래하고 아니면 하루 미룬 뒤 다음 아침에 다시 굴린다. 운 없는 학생은 공정한 주사위 두 개를 굴려 그 만큼 앓아누운 뒤 빨래한다. 학생이 바쁠 확률이 1/2, 느긋할 확률이 1/3, 운 없을 확률이 1/6 일 때 미루는 날 수의 기댓값은?

풀이 보기

무엇을 묻는가. 세 경우로 쪼갠 뒤 전기댓값 정리로 모으면 된다. 모든 무작위 값은 상호 독립이라 하자.

바쁜 학생. 과제 하나의 기댓값이 123+213=43 이고 세 개의 합이므로 다음 절의 선형성을 미리 쓰면 Ex[B]=343=4 이다. 느긋한 학생. 미루는 날 수는 "1이 나오기 전까지 실패한 횟수"다. 아래에서 볼 평균 고장 시간 규칙으로 1이 처음 나오기까지 굴리는 횟수의 기댓값이 1/(1/6)=6 이므로 미루는 날은 61=5 일이다.

운 없는 학생. 두 눈이 독립이므로 곱의 기댓값이 기댓값의 곱이다(이 장 뒤에서 증명한다). Ex[U]=7272=494=12.25. 모으기. 세 경우가 분할을 이루므로

Ex[D]=124+135+16494=2+53+4924=137245.71

답이 말이 되는가. 세 값 4,5,12.25 사이에 있고 가중치가 큰 쪽으로 기울어 있다. 눈여겨볼 것은 운 없는 학생이 1/6 밖에 안 되는데 전체 평균을 상당히 끌어올린다는 점이다. 기댓값은 극단값에 민감하다 — 22장에서 이 성질을 정면으로 다룬다.

평균 고장 시간

위에서 미리 쓴 규칙을 이제 증명한다. 어떤 프로그램이 매 시간이 끝날 때 확률 p 로 죽는다고 하자(아직 죽지 않았다면). 죽을 때까지 걸리는 시간의 기댓값은?

C 를 처음 죽기까지의 시간이라 하고 A 를 "첫 시간에 죽는다"라 하자. 전기댓값 정리로

Ex[C]=Ex[CA]Pr[A]+Ex[CA]Pr[A]

이다. A 에서는 C=1 이므로 Ex[CA]=1 이다. A 에서는 한 시간을 쓰고 처음 상태로 되돌아가므로 Ex[CA]=1+Ex[C] 다. 넣으면 Ex[C]=p+(1+Ex[C])q=1+qEx[C] 이고 정리하면 pEx[C]=1, 곧

규칙(평균 고장 시간). 매 걸음 독립으로 확률 p 로 실패하면 첫 실패까지의 걸음 수의 기댓값은 1/p 다.

이것이 기하분포의 기댓값이다. 시간당 1% 로 죽는 프로그램은 평균 100시간을 버틴다. 아들을 얻을 때까지 아이를 낳는 부부는 평균 두 명을 낳으므로 딸은 평균 한 명이다 — 그런 관습이 있는 사회에서도 인구의 성비는 반반이라는 뜻이다.

예제 253

열쇠 n 개 가운데 하나가 문에 맞는다. (가) 맞지 않는 열쇠를 다시 꾸러미에 넣고 무작위로 계속 뽑으면 문을 여는 데 시도하는 횟수의 기댓값은? (나) 맞지 않는 열쇠를 버리면 기댓값은?

증명

(가) 매 시도가 독립이고 성공 확률이 1/n 이므로 평균 고장 시간 규칙으로 Ex[T]=n 이다.

(나) 뼈대는 이렇다. 먼저 Pr[T>k] 를 구하고, 그것을 더한다.

T>k 라는 것은 처음 k 번이 모두 틀렸다는 뜻이다. 곱셈 규칙으로

Pr[T>k]=n1nn2n1nknk+1=nkn

이다(가운데가 차례로 지워진다). 그러면 Pr[T=k]=Pr[T>k1]Pr[T>k]=nk+1nnkn=1n 이므로 T{1,,n} 위에서 균등하다. 균등분포의 기댓값은 값들의 평균이므로

Ex[T]=1+2++nn=n+12

답이 말이 되는가. n(n+1)/2기억하는 쪽이 거의 두 배 빠르다. 그리고 (나)의 결론 "T 가 균등하다"는 뜻밖이다. 첫 시도에서 맞힐 확률과 마지막 시도까지 갈 확률이 같다니 이상해 보이지만, 열쇠를 미리 무작위로 늘어놓고 맞는 열쇠의 위치를 보면 당연하다 — 어느 자리에 있을 확률이나 같다. 같은 실험을 다른 순서로 바라보면 어려운 계산이 사라지는 일이 확률에서 자주 있다.

기댓값의 선형성

이제 이 문서에서 가장 자주 쓰는 도구다. 정리(기댓값의 선형성). 확률변수 R1,,Rk 와 상수 a1,,akR 에 대해

Ex[i=1kaiRi]=i=1kaiEx[Ri]

증명은 두 변수에 대해 보이고 귀납법으로 늘리면 된다. T::=R1+R2 라 하면 결과마다 더하는 정의에서

Ex[T]=ωT(ω)Pr[ω]=ω(R1(ω)+R2(ω))Pr[ω]=ωR1(ω)Pr[ω]+ωR2(ω)Pr[ω]=Ex[R1]+Ex[R2]

이다. 항을 갈랐을 뿐인데 이 증명이 독립을 어디에서도 쓰지 않았다. 그것이 선형성의 힘이다 — 독립을 다루는 일은 번거롭고, 우리가 만나는 변수들은 독립이 아닌 경우가 많다. 곧바로 얻는 것 하나. 주사위 두 개의 합의 기댓값은 3.5+3.5=7 이다. 독립을 가정하면 36가지 경우로 확인할 수 있지만 가정하지 않아도 같은 답이다 — 두 주사위가 어떻게 얽혀 있어도 각각이 공정하기만 하면 합의 평균은 7 이다.

지시확률변수의 합 — 이 장의 백미

선형성이 특히 강력해지는 것은 지시확률변수의 합에서다. 요령이 하나로 정해져 있다. 정리. 사건 A1,,An 가운데 일어나는 사건의 개수의 기댓값은 i=1nPr[Ai] 다.

분포를 구하지 않는다. 세려는 것마다 사건을 붙이고 그 확률만 구해 더한다. 독립인지는 물어볼 필요조차 없다
<분포를 구하지 않는다. 세려는 것마다 사건을 붙이고 그 확률만 구해 더한다. 독립인지는 물어볼 필요조차 없다>[원본 보기]

증명은 두 줄이다. Ri::=IAi, R::=R1++Rn 이라 하면 R 은 일어난 사건의 개수이고, 선형성과 지시변수 보조정리로 Ex[R]=iEx[Ri]=iPr[Ai] 다. "몇 개가 일어나는가"를 물으면 확률을 더하기만 하면 된다. 독립은 필요하지 않다.

G 의 분포는 계산하지 않았다. 알아낸 것은 지시변수 하나의 확률뿐이고 그것으로 충분했다
<G 의 분포는 계산하지 않았다. 알아낸 것은 지시변수 하나의 확률뿐이고 그것으로 충분했다>[원본 보기]

예제 254

만찬장에서 손님 n 명이 모자를 맡겼는데 뒤섞여 각자 무작위로 모자 하나를 받았다. 각 손님이 자기 모자를 받을 확률이 1/n 이라는 것만 알고 있다. 자기 모자를 되돌려받는 손님 수의 기댓값을 구하라.

증명

뼈대는 이렇다. 손님마다 지시변수를 붙인다. 그러면 알아야 할 것은 1/n 하나뿐이다.

증명. G 를 자기 모자를 받은 손님 수라 하고, Gi 를 "i 번 손님이 자기 모자를 받았다"의 지시변수라 하면 G=G1+G2++Gn 이다. 지시변수 보조정리로 Ex[Gi]=Pr[Gi=1]=1/n 이므로 선형성에 의해

Ex[G]=Ex[G1]++Ex[Gn]=1n++1nn 개=1

답이 말이 되는가. 사람이 몇 명이든 평균 한 사람이 자기 모자를 돌려받는다. n=1 이면 반드시 한 명이므로 1 이고 맞는다. 여기가 이 장의 핵심이다. 두 가지를 눈여겨보라. 첫째, G 의 분포를 우리는 모른다. Pr[G=k] 를 구하는 것은 훨씬 어려운 문제이고(17장의 포함배제가 필요하다) 문제 설명으로는 분포가 하나로 정해지지도 않는다. 그런데도 평균은 나왔다. 둘째, Gi 들은 독립이 아니다. n1 명이 자기 모자를 받으면 마지막 사람도 반드시 자기 모자를 받는다. 그래도 선형성은 그대로 쓸 수 있다.

쌍마다 지시변수를 붙이면 쌍이 C(n,2) 개이고 각 쌍의 확률이 1/2 이다. 지시변수들이 독립이 아니라는 것은 문제가 되지 않는다
<쌍마다 지시변수를 붙이면 쌍이 C(n,2) 개이고 각 쌍의 확률이 1/2 이다. 지시변수들이 독립이 아니라는 것은 문제가 되지 않는다>[원본 보기]

예제 255

서로 다른 수 n 개를 무작위로 늘어놓았다. 앞자리가 뒷자리보다 큰 쌍을 뒤집힘(inversion)이라 한다. 뒤집힘 개수의 기댓값을 구하라.

증명

뼈대는 이렇다. 쌍마다 지시변수를 붙인다. 쌍이 (n2) 개이고 각 쌍의 확률이 1/2 다.

증명. 자리 i<j 마다 Xij 를 "i 자리의 수가 j 자리의 수보다 크다"의 지시변수라 하자. 뒤집힘 개수는 X=i<jXij 다.

두 자리에 놓인 두 수 가운데 어느 쪽이 앞에 오는지는 대칭이다. 늘어놓기를 뒤집는 사상(두 자리의 값을 맞바꾸는 것)이 확률을 보존하는 전단사이므로 Pr[Xij=1]=1/2 이다. 그러므로 선형성과 지시변수 보조정리로

Ex[X]=i<jPr[Xij=1]=(n2)12=n(n1)4

답이 말이 되는가. n=2 로 검산하면 1/2 이고, 실제로 두 배열 가운데 하나만 뒤집혀 있으므로 맞는다. n=3 이면 3/2 인데, 여섯 배열의 뒤집힘 수가 0,1,1,2,2,3 이므로 평균이 9/6=3/2 다. 맞는다.

이 값이 삽입 정렬이 하는 교환 횟수의 평균이므로, 무작위 입력에 대한 삽입 정렬이 Θ(n2) 인 것이 여기서 나온다. 분포를 구하는 것은 어려운 문제이지만 평균은 두 줄이다. 그리고 Xij 들은 물론 독립이 아니다 — X12=1 이고 X23=1 이면 X13=1 이 강제된다. 상관없다.

예제 256

(가) 교실에 책상이 4×4 로 놓여 있다. 어떤 남학생의 앞·뒤·왼·오른쪽에 여학생이 있으면 그 둘은 눈이 맞는다. 각 자리가 서로 독립으로 같은 확률로 남학생 또는 여학생이라 할 때 눈이 맞는 쌍의 개수의 기댓값은? (나) 값이 1 부터 6 까지인 카드가 각각 두 장씩 열두 장 있다. 잘 섞어 한 줄로 늘어놓았을 때 이웃한 두 자리의 값이 같은 쌍의 개수의 기댓값은?

풀이 보기

두 문제 모두 "몇 개가 일어나는가"이므로 사건마다 확률을 구해 더하면 된다. (가) 이웃한 자리의 쌍을 센다. 가로로 한 줄에 3쌍씩 4줄이므로 12쌍, 세로로도 12쌍, 모두 24쌍이다. 한 쌍이 눈이 맞는 것은 한쪽이 남학생이고 다른 쪽이 여학생인 것이므로 확률이 21212=12 이다. 그러므로

Ex[쌍의 수]=2412=12

(나) 이웃한 자리의 쌍이 11개다. 한 쌍의 두 카드가 같은 값일 확률은, 왼쪽 카드가 무엇이든 오른쪽 카드가 그 짝일 확률이므로 1/11 이다(남은 열한 장 가운데 짝이 한 장이다). 그러므로

Ex[쌍의 수]=11111=1

답이 말이 되는가. (나)의 답이 정확히 1 이라는 것이 깔끔하다. 그리고 두 문제 모두 사건들이 독립이 아니다 — (가)에서 한 학생이 여러 쌍에 걸쳐 있고 (나)에서 한 카드가 두 쌍에 걸쳐 있다. 선형성은 그것을 묻지 않는다. (나)의 확률 1/11 을 구할 때 "왼쪽이 무엇이든"이라고 말한 것이 요령이다. 값별로 경우를 가르려 하면 계산이 훨씬 지저분해진다.

예제 257

3-절은 서로 다른 변수 셋의 리터럴을 로 이은 것이고 3-CNF 는 3-절들을 로 이은 것이다(5장의 말이다). 3-절이 일곱 개인 3-CNF G 가 주어졌다. 변수마다 참·거짓을 독립으로 같은 확률로 정한다고 하자. (가) 한 절이 참일 확률은? (나) 참인 절의 개수의 기댓값은? (다) G 가 만족가능함을 증명하라.

증명

(가) 3-절이 거짓이 되려면 세 리터럴이 모두 거짓이어야 한다. 세 리터럴은 서로 다른 변수에 붙어 있으므로 독립이고 각각 확률 1/2 로 거짓이다. 그러므로 절이 거짓일 확률이 1/8 이고 참일 확률은 7/8 이다.

(나) 절마다 지시변수를 붙이고 선형성을 쓰면 Ex[참인 절의 수]=778=498=6.125 다.

(다) 뼈대는 이렇다. 평균이 6 보다 크므로 6 보다 큰 값을 주는 배정이 반드시 있다.

증명. 참인 절의 개수를 N 이라 하면 N0 부터 7 까지의 정수다. 만약 모든 배정에서 N6 이라면, 기댓값은 값들의 확률 가중 평균이므로 Ex[N]6 이 되어야 한다. 그런데 Ex[N]=6.125>6 이다. 모순이다.

그러므로 N7 인 배정이 존재하고, 절이 일곱 개뿐이므로 그 배정에서 모든 절이 참이다. 곧 G 는 만족가능하다.

답이 말이 되는가. 이 논법을 확률적 방법(probabilistic method)이라 하고, 대상을 만들지 않고 존재만 증명한다는 점이 특징이다 — 만족시키는 배정을 하나도 찍어 보이지 않았는데 있다는 것을 알았다.

일반화하면 이렇다. 서로 다른 k-절 n 개로 된 집합에서 참인 절의 기댓값은 n(12k) 이므로, n<2k 이면 n(12k)>n1 이 되어 같은 논법으로 만족가능하다. 5장에서 SAT 가 어렵다고 했는데, 절이 적으면 풀지 않고도 답이 "예"임을 안다.

쿠폰 수집가

선형성의 마지막 응용이자 가장 예쁜 것이다. n 종류의 사은품이 균등하고 독립으로 나올 때 전부 모으려면 몇 개를 사야 하는가. 생일 365 가지를 모두 만나려면 몇 명을 만나야 하는가와 같은 문제다.

새 종류가 나오는 순간마다 자른다. k 종류를 가졌을 때 새 것이 나올 확률이 (n−k)/n 이므로 각 구간의 평균이 n/(n−k) 다
<새 종류가 나오는 순간마다 자른다. k 종류를 가졌을 때 새 것이 나올 확률이 (n−k)/n 이므로 각 구간의 평균이 n/(n−k) 다>[원본 보기]

요령은 수집 과정을 구간으로 자르는 것이다. k 종류를 이미 가진 동안의 구매를 한 구간으로 묶고 그 길이를 Xk 라 하면 전체 구매 수가 T=X0+X1++Xn1 이다. k 종류를 가진 상태에서 한 번 사면 새 종류일 확률이 (nk)/n 이므로, 평균 고장 시간 규칙으로 Ex[Xk]=n/(nk) 다. 선형성으로

Ex[T]=nn+nn1++n2+n1=n(11+12++1n)=nHnnlnn

16장의 조화수가 다시 나왔다. 여기서 쓴 Xk 들은 지시변수가 아니다(기하분포다) — 선형성은 어떤 변수의 합에든 쓸 수 있다.

예제 258

(가) 공정한 주사위의 여섯 눈을 모두 보려면 평균 몇 번 굴려야 하는가? (나) 생일이 모든 날에 걸치려면 평균 몇 명을 만나야 하는가? (다) 두 값을 19장의 생일 원리와 견주어 무엇이 다른지 말하라.

풀이 보기

(가) n=6 이므로 6H6=64920=14.7 번이다. (나) n=365 이므로 365H365 다. 16장의 근사 Hnlnn+γH3655.900+0.577=6.477 이므로 약 2364 명이다.

(다) 19장의 생일 원리는 겹침이 하나라도 생기는236527 명이면 된다고 했다. 여기서는 모든 날이 채워지는2364 명이 필요하다. 같은 문제가 아니다 — 첫 겹침은 n 규모에서, 완전 수집은 nlnn 규모에서 일어난다. 100배 가까이 차이가 난다.

답이 말이 되는가. 왜 그렇게 오래 걸리나. nHn 의 합에서 마지막 항 n/1=n 이 가장 크다. 남은 한 종류를 기다리는 데만 평균 n 번이 든다. 처음에는 살 때마다 새 것이 나오지만 끝에 가서 하나를 기다리는 시간이 전체를 지배한다. 실전 감각으로도 익숙한 일이다.

곱의 기댓값

합에서 성립한 것이 곱에서도 성립하는가. 앞의 예제에서 Ex[RR]Ex[R]Ex[R] 를 보았으니 일반적으로는 아니다. 그러나 독립이면 성립한다.

정리. R1,,Rk 가 상호 독립이면 Ex[iRi]=iEx[Ri] 다. 증명은 값마다 더하는 형태에서 독립으로 결합확률을 쪼개고 합을 인수분해하면 된다. 두 변수의 경우

Ex[R1R2]=r1r2r1r2Pr[R1=r1]Pr[R2=r2]=(r1r1Pr[R1=r1])(r2r2Pr[R2=r2])

이다. 둘째 등호가 독립을 쓴 자리다. 합에서는 독립이 필요 없고 곱에서는 필요하다는 이 비대칭을 기억해 두면 실수를 크게 줄인다.

선형성이 무너지는 곳

선형성은 항이 무한히 많아도 쓸 수 있지만 조건이 붙는다. 정리. 확률변수 R0,R1, 에 대해 iEx[|Ri|] 가 수렴하면 Ex[iRi]=iEx[Ri] 다.

그 조건이 깨지면 어떻게 되는지 보자. 룰렛에서 빨강에 걸면 맞으면 판돈만큼 받고 틀리면 잃는다. 실제 룰렛에는 초록 칸이 있어 빨강이 나올 확률이 1/2 보다 작지만, 논의를 위해 공정한 룰렛을 가정하자. 그러면 판마다 기댓값이 0 이므로 어떤 전략을 써도 딸 수 없어야 한다.

그런데 판돈 두 배 전략이 있다. 10 달러를 걸고, 지면 20, 또 지면 40 … 이렇게 빨강이 나올 때까지 두 배로 올린다. n 번째에 이기면 그때까지 낸 돈이 10(1+2++2n1)=10(2n1) 이고 받는 돈이 2102n1=102n 이므로 순이익이 언제나 10 달러다. 그리고 빨강은 확률 1 로 결국 나온다. 그러니 이 전략의 기댓값은 10 달러다.

판마다 절댓값의 기댓값이 10 으로 일정하므로 그 급수가 발산한다. 무한 선형성의 조건이 깨진 자리가 여기다
<판마다 절댓값의 기댓값이 10 으로 일정하므로 그 급수가 발산한다. 무한 선형성의 조건이 깨진 자리가 여기다>[원본 보기]

잘못된 추론 찾기

다음 추론은 판돈 두 배 전략의 기댓값이 0 이라고 말한다. 어디가 틀렸는가?

Bnn 번째 판에서 딴 금액(이미 게임이 끝났으면 0)이라 하면 총 이익은 W=n1Bn 이다. 룰렛이 공정하므로 모든 n 에 대해 Ex[Bn]=0 이다. 선형성에 의해 Ex[W]=nEx[Bn]=0+0+=0 이다.

풀이 보기

틀린 곳은 마지막 등호에서 선형성을 쓴 것이다. 항이 무한히 많으므로 nEx[|Bn|] 가 수렴해야 하는데 수렴하지 않는다.

확인하자. n 번째 판을 하려면 앞의 n1 판을 모두 져야 하므로 그 확률이 2(n1) 이고, 그때 판돈은 102n1 달러다. 그러므로

Ex[|Bn|]=102n12(n1)=10

이 되어 n 과 무관하게 항상 10 이다. 따라서

n1Ex[|Bn|]=10+10+10+=

로 발산한다. 조건이 깨졌으므로 선형성을 쓸 수 없고, 실제로 두 값이 다르다 — 왼쪽은 10 이고 오른쪽 급수는 0 으로 수렴한다. Ex[Bn] 이 수렴하는 것만으로는 부족하다는 것도 이 예에서 확인된다.

답이 말이 되는가. 그러면 확률론이 "공정한 게임에서 확실히 딸 수 있다"는 터무니없는 결론을 내는 것인가. 아니다. 이 전략을 쓰려면 무한한 자금이 필요하다. k 판까지만 버틸 돈이 있다면 총 이익은 B1++Bk 로 유한한 합이므로 선형성이 그대로 성립하고 기댓값이 0 (공정한 룰렛) 또는 음수(실제 룰렛)가 된다. 터무니없는 가정이 터무니없는 결론을 낳은 것이니 이론을 의심할 일이 아니다.

실전 감각으로 옮기면 이렇다. 판돈 두 배 전략은 거의 언제나 조금 따고 아주 드물게 파산한다. 기댓값은 그 "아주 드문 큰 손실"을 정확히 상쇄하는 자리에 있고, 그것이 기댓값 하나만 보고 위험을 판단할 수 없는 이유다. 22장의 편차 한계와 23장의 도박꾼의 파산이 그 이야기를 이어받는다.

이 장에서 새로 나온 것

기호·용어
확률변수정의역이 표본공간인 전함수. 변수가 아니라 함수다
지시확률변수 IAωA 면 1, 아니면 0. 베르누이 변수라고도 한다
[R=x]R 의 값이 x 인 결과들의 사건. 값마다의 사건이 S 의 분할을 이룬다
확률변수의 독립모든 값에 대해 [R1=x1][R2=x2] 가 독립. 두 사건의 독립은 그 지시변수의 독립과 같다
pmf PDFR(x)Pr[R=x]. 원서 표기는 PDF 이지만 이산에서는 질량함수다
cdf CDFR(x)Pr[Rx]. pmf 를 왼쪽부터 누적한 것
베르누이 · 균등 분포f(1)=p,f(0)=1p · 공역의 원소가 n 개면 모두 1/n
이항 · 기하 분포(nk)pkqnk (앞면 개수) · qi1p (처음 성공까지)
분포의 꼬리 · 최댓값봉우리에서 먼 부분(22장의 주제) · cdf 를 먼저 구한다
확률화 알고리즘무작위 수로 결정을 흔들어 성능의 하한을 보장한다. 숫자 게임이 그 예
기댓값 Ex[R]ωR(ω)Pr[ω]. 음수 값이 있으면 절대수렴을 요구한다
값마다 더하는 형태Ex[R]=xxPr[R=x]. 표본공간을 몰라도 계산된다
Ex[IA]=Pr[A]지시변수의 기댓값은 그 사건의 확률. 확률과 기댓값을 잇는 통로
Ex[f(R)]f(Ex[R])Ex[R2]=91/6 이고 (Ex[R])2=49/4. 그 차이가 분산이다
조건부 기댓값 · 전기댓값rrPr[R=rA] · Ex[R]=iEx[RAi]Pr[Ai]
평균 고장 시간매 걸음 확률 p 로 실패하면 첫 실패까지 평균 1/p 걸음
기댓값의 선형성Ex[aiRi]=aiEx[Ri]. 독립을 요구하지 않는다
사건 개수의 기댓값iPr[Ai]. 지시변수의 합에 선형성을 쓴 것
모자 · 뒤집힘n(1/n)=1 (사람이 몇이든 한 명) · (n2)/2=n(n1)/4 (삽입 정렬의 평균 교환)
확률적 방법기댓값이 m 보다 크면 m 보다 큰 값을 주는 결과가 존재한다
쿠폰 수집가Ex[T]=nHnnlnn. 주사위 14.7, 생일 약 2364
곱의 기댓값상호 독립이면 Ex[Ri]=Ex[Ri]. 독립이 여기서는 필요하다
무한 선형성의 조건iEx[|Ri|] 가 수렴해야 한다. 판돈 두 배에서 이것이 깨진다

챙겨 갈 것은 넷이다.

이 장에서 평균을 세웠다. 그러나 평균만으로는 위험을 알 수 없다 — 판돈 두 배 전략의 기댓값 10 달러가 그 예다. 다음 장은 평균에서 얼마나 벗어나는가를 묻는다. 마르코프 부등식과 체비쇼프 부등식이 "기댓값만 알아도 꼬리를 얼마나 잡을 수 있는가"에 답하고, 그 도구로 무작위 표본에서 모수를 추정하는 일과 그 추정을 얼마나 믿을 수 있는지를 다룬다. 이 장의 선형성지시확률변수는 거기서도 계속 주역이고, 그 결과가 통계학 문서의 /posts/fundamental/probability.html > 큰 수의 법칙 과 만난다.

평균에서 벗어나기

21장에서 기댓값을 정의하고 그것을 계산하는 도구를 잔뜩 만들었다. 그런데 평균을 알아서 무엇에 쓰는가. 확률변수는 평균 근처에 오지 않을 수도 있다. 주사위 눈의 평균은 3.5 인데 3.5 가 나오는 일은 없고, 판돈 두 배 전략의 기댓값은 10 달러인데 그 전략은 대개 조금 따고 아주 드물게 파산한다.

평균이 값어치를 갖는 것은 평균에서 얼마나 벗어나는가를 함께 말할 수 있을 때다. 이 장에서 답할 것은 셋이다. 평균만 알아도 꼬리를 얼마나 잡을 수 있는가. 흩어짐을 어떻게 하나의 수로 재는가(분산과 표준편차다). 그리고 무작위 표본으로 모수를 추정할 때 표본이 몇 개면 되는가. 마지막 물음은 실험과학 전체가 걸린 물음이고, 답은 뜻밖에도 "모집단 크기와 무관하다"다. 답은 세 부등식으로 나오는데, 아는 것이 늘어날수록 부등식이 세진다.

세 한계가 모두 마르코프 하나에서 나온다. R 에 어떤 함수를 씌우고 그 함수에 마르코프를 쓰는 것이 요령이고, 씌우는 함수가 제곱이면 체비쇼프, 지수면 체르노프가 된다
<세 한계가 모두 마르코프 하나에서 나온다. R 에 어떤 함수를 씌우고 그 함수에 마르코프를 쓰는 것이 요령이고, 씌우는 함수가 제곱이면 체비쇼프, 지수면 체르노프가 된다>[원본 보기]

앞 장들에서 가져오는 것은 21장의 기댓값과 그 선형성, 지시확률변수, 곱의 기댓값(독립일 때), 평균 고장 시간 1/p, 이항분포, 20장의 독립·쌍마다 독립·상호 독립전기댓값 정리, 19장의 합집합 한계, 그리고 16장의 등비급수다. 분산은 기초수학통계학 에서 이미 계산해 보았을 것이다. 여기서는 분산이 왜 그렇게 정의되는지, 그리고 그것으로 무엇을 증명할 수 있는지를 다룬다.

마르코프 부등식

어떤 시험의 평균 점수가 90 점이라는 것만 알고 있다. 180 점 이상을 받은 학생의 비율에 대해 무엇을 말할 수 있는가. 점수가 음수가 될 수 없다는 것만 더 쓰면 답이 나온다. 만약 학생의 절반이 180 점 이상이었다면 그 절반만으로도 평균이 90 점을 넘는다. 그러므로 180 점 이상은 절반 이하다. 이 한 줄이 마르코프 부등식이다.

정리(마르코프 부등식). R 이 음이 아닌 확률변수이면 모든 x>0 에 대해

Pr[Rx]Ex[R]x

증명. 값마다 더하는 형태에서 항을 버리고 값을 낮춘다.

Ex[R]=yyPr[R=y]yxyPr[R=y]yxxPr[R=y]=xyxPr[R=y]=xPr[Rx]

첫 부등호는 R0 이므로 버린 항들이 음이 아니라는 데서 나오고, 둘째 부등호는 남은 항에서 yx 이기 때문이다. 양변을 x 로 나누면 끝난다. 곧 R0 을 쓴 자리가 첫 부등호이고, 음수 값을 갖는 변수에 이 정리를 쓸 수 없는 까닭도 그 자리에 있다.

평균에서 벗어나는 정도로 다시 적으면 이렇다. 따름정리. R0 이고 c1 이면 Pr[RcEx[R]]1/c 다. x=cEx[R] 를 넣으면 그대로 나온다.

잘못된 추론 찾기

다음 주장은 참이다 — "사람들 대다수는 손가락 개수가 평균보다 많다." 손가락이 남는 사람보다 손가락을 잃은 사람이 더 많다고 하자. 아래 세 설명 가운데 옳은 것을 고르고 나머지가 왜 틀렸는지 밝혀라.

① 전체 인구의 손가락을 모두 더해 인구수로 나누면 10 보다 작은 수가 나온다. ② 엄지를 손가락으로 세지 않는 소수가 평균을 끌어내린다. ③ 아무도 음수 개의 손가락을 갖지 않으므로 마르코프 부등식에서 곧바로 나온다.

풀이 보기

①이 옳다. 무작위로 뽑은 사람의 손가락 수를 F 라 하면 Ex[F] 가 곧 인구 전체의 평균이다. 손가락이 열 개보다 적은 사람이 열 개보다 많은 사람보다 많으므로 Ex[F]<10 이고, 손가락이 열 개인 대다수는 평균보다 많은 것이 된다.

②는 설명이 아니다. 세는 방식을 바꾸면 F 자체가 다른 확률변수가 된다. 그 정의에서는 대다수가 8 개를 가지므로 평균이 8 에 가깝고, 여전히 "대다수가 평균보다 많다"를 얻으려면 다시 ①과 같은 논거가 필요하다. 말장난이 논거를 대신할 수는 없다.

③이 이 문제의 핵심적인 오류다. 마르코프 부등식은 위쪽 꼬리의 상한만 준다. Ex[F]<10 이라면 그것에서 나오는 것은 Pr[F20]1/2 같은 것뿐이고, "대다수가 평균보다 많다"는 하한에 대한 주장이므로 마르코프에서 나올 수 없다. 실제로 마르코프 부등식은 어떤 분포에도 참이므로, 대다수가 평균보다 작은 분포에도 똑같이 참이다. 참인 정리에서 참인 결론이 나왔다고 해서 그 정리가 그 결론의 근거가 되지는 않는다.

답이 말이 되는가. 이 문제가 가르치는 것은 정리를 인용할 때 그 정리가 실제로 무엇을 말하는지 확인하는 습관이다. 이 장의 세 부등식은 모두 "확률이 이보다 크지 않다"는 형태이고 "이보다 작지 않다"는 결론을 주지 않는다. 하한이 필요하면 다른 도구를 찾아야 한다.

딱 맞는 곳과 형편없는 곳

마르코프 부등식은 아는 것이 적으므로 대개 느슨하다. 그러나 때로는 정확히 맞는다. 두 문제를 견주면 그 차이가 보인다.

회전판 문제. n 명이 둥근 회전판에 놓인 서로 다른 음식을 앞에 두고 있다. 누군가 판을 돌려 각자가 무작위로 음식을 하나 받는다. 모두가 원래 자기 음식을 받을 확률은? 판이 멈추는 위치가 n 가지이고 그 가운데 하나에서만 모두가 자기 음식을 받으므로 정확히 1/n 이다.

이제 마르코프로 풀어 보자. 자기 음식을 받은 사람 수를 R 이라 하면 21장의 지시변수 요령으로 Ex[R]=n(1/n)=1 이다. 모두가 자기 음식을 받는 것은 Rn 이므로

Pr[Rn]Ex[R]n=1n

이고 참값과 같다. 마르코프 부등식이 정확할 수 있다는 것이 놀랍지 않은 이유는 증명을 되짚으면 보인다 — R0n 두 값만 갖는다면 증명의 두 부등호가 모두 등호가 된다.

예제 261

21장의 모자 문제로 돌아간다. 손님 n 명이 무작위로 모자를 받고 각자가 자기 모자를 받을 확률이 1/n 이다. (가) x 명 이상이 자기 모자를 받을 확률의 상한을 구하라. (나) 모두가 자기 모자를 받을 확률에 대해 마르코프가 주는 상한과 참값을 견주어라(모자를 나눠 주는 방식이 균등한 무작위 순열이라 하자). (다) 회전판에서는 딱 맞았는데 여기서는 왜 그렇지 않은가.

풀이 보기

무엇을 묻는가. 상한 하나와 참값 하나, 그리고 둘이 벌어진 이유다. 21장에서 Ex[G]=1 임을 이미 알고 있다.

(가) 마르코프 부등식에 x 를 그대로 넣으면

Pr[Gx]Ex[G]x=1x

이다. 예컨대 다섯 명 이상이 자기 모자를 받을 확률은 1/5 이하이고, 이 상한은 손님이 몇 명이든 같다. n10 이든 109 이든 1/5 이다.

(나) 모두가 자기 모자를 받는 것은 순열이 항등순열인 경우 하나뿐이므로 참값은 1/n! 이다. 마르코프는 Pr[Gn]1/n 을 준다. n=10 이면 참값이 약 2.8×107 인데 상한은 0.1 이다. 형편없이 느슨하다.

(다) 회전판에서는 R 이 사실상 0 아니면 n 이었다 — 한 사람이 자기 음식을 받으면 모두가 받는다(판이 제자리로 돌아온 것이므로). 그래서 마르코프 증명의 부등호가 등호가 되었다. 모자 문제에서는 G0,1,2,,n 을 두루 갖고 대부분의 질량이 작은 값에 몰려 있다. G=n 만 남기고 나머지를 버리는 마르코프의 계산은 그 몰려 있는 질량을 통째로 n 으로 올려 세는 셈이 된다.

답이 말이 되는가. 교훈은 이렇다. 마르코프 부등식이 정확해지는 것은 분포가 두 값에 몰려 있을 때이고, 값이 여러 개면 대개 형편없다. 그러면 값이 여러 개일 때 쓸 도구가 필요하고, 그것이 다음 절의 체비쇼프 부등식이다.

하한을 알면 더 세진다

마르코프 부등식은 R0 만 썼다. R 의 하한을 더 알고 있다면 그 정보를 쓸 수 있다. Rb 이면 Rb 가 음이 아니므로 Rb 에 마르코프를 쓴다. 이것이 이 장 전체를 관통하는 요령의 첫 사례다 — 확률변수를 잘 변형해서 마르코프에 넣는다.

예제 262

소 떼가 체온을 떨어뜨리는 병에 걸렸다. 체온이 36C 미만으로 내려간 소는 죽는다. 병이 워낙 심해 떼의 평균 체온이 30C 까지 내려갔고, 실제로 관측된 가장 낮은 체온은 24C 였으며 그보다 낮은 소는 없었다. (가) 마르코프 부등식으로 소의 5/6 이하만 살 수 있음을 보이고, (나) 하한을 써서 1/2 이하로 개선하라. (다) 소가 400 마리라면 (나)의 상한이 딱 맞을 수 있음을 보여라. (라) "평균에 대한 산술적 사실"에 확률 정리를 쓴 것이 정당한 이유를 밝혀라.

증명

무엇을 묻는가. 상한 둘과 그것이 최선임을 보이는 예 하나, 그리고 확률공간을 세우는 방법이다.

(가) 소 한 마리의 체온을 T 라 하면 T0 이고 Ex[T]=30 이다. 살아남는 것은 T36 이므로

Pr[T36]3036=56

(나) 모든 소가 24C 이상이므로 T240 이고 Ex[T24]=6 이다. 그리고 T36T2412 와 같은 사건이므로

Pr[T36]=Pr[T2412]612=12

버린 정보를 되찾아 상한이 5/6 에서 1/2 로 좋아졌다. 일반적으로 하한 b>0 을 알면 Rb 에 쓰는 것이 언제나 더 좋다 — (Ex[R]b)/(xb)<Ex[R]/xb>0 일 때 성립하기 때문이다(양변에 분모를 곱해 정리하면 bx<bEx[R], 곧 Ex[R]<x 다).

(다) 200 마리가 정확히 36C 이고 200 마리가 정확히 24C 라 하자. 평균은 (36+24)/2=30 이고 최저는 24 이며 살아남는 소가 정확히 절반이다. 주어진 정보만으로는 이보다 좁힐 수 없다.

(라) 확률공간을 이렇게 세운다. 표본공간은 소 400 마리의 집합이고 각 소의 확률은 1/400 이며, T(ω) 는 소 ω 의 체온이다. 그러면

Ex[T]=ωT(ω)1400=떼의 평균 체온

이고, 어떤 성질을 만족하는 소의 비율이 그 성질의 확률과 정확히 같다. 그래서 확률에 대한 정리가 비율에 대한 주장이 된다.

답이 말이 되는가. (라)가 이 예제에서 가장 중요하다. 마르코프 부등식은 확률에 대한 정리이지만, 균등 확률공간을 씌우면 "평균과 비율"에 대한 순수한 산술적 사실이 된다. 통계에서 자료의 요약값에 확률의 언어를 쓰는 일이 정당한 것도 같은 다리를 건너기 때문이다.

체비쇼프 부등식

마르코프에 넣기 위해 R 을 변형하는 요령을 일반화하자. |R|z 는 어떤 실수 z>0 에 대해서도 음이 아니고, 사건 [|R|x] 와 사건 [|R|zxz]같은 사건이다(x>0 일 때 ttz 가 증가하므로). 그러므로

보조정리. 임의의 확률변수 R 과 양수 x,z 에 대해 Pr[|R|x]Ex[|R|z]/xz 다.

이제 R 대신 평균에서 벗어난 양 REx[R] 에 이 보조정리를 쓴다. z=2 인 경우가 특히 쓸모 있어서 오른쪽 분자에 이름이 붙었다.

정의. 확률변수 R분산(variance)Var[R]::=Ex[(REx[R])2] 다. 평균제곱편차라고도 한다. 식을 안쪽에서 밖으로 읽는 것이 요령이다 — REx[R] 는 평균에서 벗어난 양이고, 제곱하면 부호를 잃고 크기만 남으며 벗어남이 클 때 크게 벌어진다. 그것의 평균이 분산이다. R 이 늘 평균 가까이 있으면 분산이 작고, 자주 멀리 가면 분산이 크다.

그리고 z=2 를 보조정리에 넣은 것이 다음이다. 정리(체비쇼프 부등식). 확률변수 R 과 양수 x 에 대해 다음이 성립한다. 마르코프와 달리 R0 을 요구하지 않는데, 제곱을 씌우는 순간 음수가 사라졌기 때문이다.

Pr[|REx[R]|x]Var[R]x2

왜 제곱인가 — 두 도박

평균에서 벗어난 거리를 재려면 절댓값 |REx[R]| 의 평균을 쓰는 것이 더 자연스러워 보인다. 왜 제곱을 씌워 놓고 나중에 제곱근을 씌우는 번거로운 길을 가는가. 답은 제곱한 것에는 다음 절에서 볼 좋은 성질들이 있고 절댓값에는 없다는 것이다. 그 값어치를 먼저 느껴 보자.

두 도박의 기댓값이 정확히 같은데 흩어짐은 백만 배 다르다. 기댓값은 이 차이를 전혀 알려 주지 못한다
<두 도박의 기댓값이 정확히 같은데 흩어짐은 백만 배 다르다. 기댓값은 이 차이를 전혀 알려 주지 못한다>[원본 보기]

예제 263

두 도박이 있다. 게임 가는 확률 2/3 으로 2 달러를 따고 확률 1/31 달러를 잃는다. 게임 나는 확률 2/3 으로 1002 달러를 따고 확률 1/32001 달러를 잃는다. 두 게임의 기댓값과 분산과 표준편차를 구하고 무엇이 다른지 말하라.

풀이 보기

무엇을 묻는가. 정의를 그대로 계산한다. 두 게임의 이익을 A, B 라 하자.

기댓값. Ex[A]=223+(1)13=1 이고 Ex[B]=100223+(2001)13=668667=1 이다. 같다.

분산. 안쪽에서 밖으로 계산한다. A1 은 확률 2/31, 확률 1/32 이므로 (A1)2 는 확률 2/31, 확률 1/34 다. 그러므로

Var[A]=123+413=2

같은 방식으로 B11001 또는 2002 이고 제곱은 1002001 또는 4008004 이므로

Var[B]=100200123+400800413=2004002+40080043=2004002

표준편차. 분산의 단위가 "달러의 제곱"이라 크기 감각이 맞지 않는다. 그래서 제곱근을 씌운 것을 표준편차(standard deviation)라 하고 σR::=Var[R] 로 적는다. σA=21.41 달러이고 σB=20040021416 달러다.

답이 말이 되는가. B 는 실제로 평균에서 1001 또는 2002 만큼 벗어나므로 1416 이라는 값이 그 규모를 잘 대표한다. 반면 분산 2004002 는 크기 감각을 주지 못한다. 그래서 사람에게 보일 때는 표준편차를, 증명할 때는 분산을 쓴다. 실전 감각으로 옮기면 이렇다 — 열 판을 하면 둘 다 평균 10 달러를 딴다. 그런데 게임 가는 최악의 경우 10 달러를 잃고, 게임 나는 2 만 달러를 잃는다. 높은 분산은 대개 높은 위험을 뜻한다.

표준편차로 다시 적은 체비쇼프

체비쇼프 부등식에 x=cσR 를 넣으면 이렇게 된다. 따름정리. 양수 c 에 대해

Pr[|REx[R]|cσR]1c2

이 형태가 표준편차의 뜻을 정해 준다. 확률변수의 값은 평균을 중심으로 σ 규모의 구간에 몰려 있다. 3σ 밖으로 나가는 일은 1/9 이하이고 10σ 밖은 1/100 이하다. 어떤 분포에도 통하는 보장이라는 점이 이 부등식의 값어치이고, 동시에 느슨함의 원인이다.

체비쇼프가 보장하는 것과 실제 꼬리의 차이가 세 배에서 서른 배까지 벌어진다. 그래도 분포를 몰라도 쓸 수 있다는 것이 이 부등식의 값어치다
<체비쇼프가 보장하는 것과 실제 꼬리의 차이가 세 배에서 서른 배까지 벌어진다. 그래도 분포를 몰라도 쓸 수 있다는 것이 이 부등식의 값어치다>[원본 보기]

예제 264

공정하고 상호 독립인 동전을 100 번 던지고 앞면 수를 H 라 한다. Ex[H]=50 이고 Var[H]=25 임을 뒤에서 증명할 것이니 여기서는 그대로 쓰자. (가) Pr[H70] 에 대해 마르코프가 주는 상한은? (나) 체비쇼프가 주는 상한은? (다) 참값은 약 3.9×105 다. 두 상한과 견주어라. (라) 체비쇼프 부등식이 등호가 되는 확률변수를 만들어라.

풀이 보기

(가) Pr[H70]50/70=5/70.714 다. 거의 아무것도 말하지 않는다.

(나) σH=5 이고 70=50+4σH 이므로 c=4 다. 따름정리로 Pr[|H50|20]1/16=0.0625 이고, 이것은 양쪽 꼬리를 합친 값이므로 한쪽만 보면 더 작다. 그대로 써도 0.0625 이다.

(다) 참값 3.9×105 과 견주면 마르코프는 약 18000 배, 체비쇼프는 약 1600 배 느슨하다. 체비쇼프가 마르코프보다 열 배 넘게 좋지만 여전히 참값과는 세 자리가 벌어져 있다. 이 자리를 메우는 것이 이 장 마지막 절의 체르노프 한계다.

(라) 뼈대는 이렇다. 질량을 세 점에만 놓는다. μ,σ,x 가 주어졌고 σx 라 하자. R

Pr[R=μ+x]=Pr[R=μx]=σ22x2,Pr[R=μ]=1σ2x2

을 만족한다고 두면 확률의 합이 1 이고 모두 음이 아니다. 대칭이므로 Ex[R]=μ 이고

Var[R]=x2σ22x2+x2σ22x2+0=σ2

이다. 그리고 Pr[|Rμ|x]=σ2/x2 이므로 체비쇼프 부등식이 등호가 된다.

답이 말이 되는가. (라)가 말하는 것은 체비쇼프 부등식을 더 좋게 만들 수 없다는 것이다. 평균과 분산만 아는 상태에서는 이보다 좁힐 수 없다. 그러니 (다)에서 본 세 자리의 여유는 부등식이 게을러서가 아니라 우리가 정보를 덜 쓴 대가다. 다음 절에서 분산을 실제로 계산하는 법을 갖추고, 마지막 절에서 "독립인 것들의 합"이라는 정보를 더 쓴다.

분산의 성질

분산이 절댓값보다 나은 이유가 이 절에 모여 있다. 네 가지를 증명하는데, 뼈대는 모두 "정의를 펼치고 선형성을 쓴다" 하나다.

예제 265

(가) 모든 확률변수에 대해 Var[R]=Ex[R2]Ex2[R] 임을 증명하라(Ex2[R](Ex[R])2 의 줄임말이다). (나) 그것으로 베르누이 변수의 분산을 구하라. (다) 상수 a,b 에 대해 Var[aR+b]=a2Var[R] 임을 증명하라.

증명

뼈대는 셋 모두 하나다. 정의를 펼치고 선형성을 쓴다. μ::=Ex[R] 로 두자(이것은 상수다).

(가) 증명.

Var[R]=Ex[(Rμ)2]=Ex[R22μR+μ2]=Ex[R2]2μEx[R]+μ2=Ex[R2]2μ2+μ2=Ex[R2]μ2

셋째 등호가 선형성이다. μ 가 상수이므로 Ex[μ2]=μ2 이고 Ex[2μR]=2μEx[R] 이다. 21장에서 Ex[R2]Ex2[R] 를 확인하며 "그 차이가 분산이다"라고 적어 둔 것이 이 등식이다.

(나) BPr[B=1]=p, Pr[B=0]=q=1p 인 베르누이 변수라 하자. 값이 01 뿐이므로 B2=B 다. 따라서 Ex[B2]=Ex[B]=p 이고

Var[B]=pp2=p(1p)=pq

(다) 증명. 먼저 Ex[aR+b]=aμ+b 이므로 벗어난 양이 (aR+b)(aμ+b)=a(Rμ) 다. 제곱하면 a2(Rμ)2 이고 기댓값을 취하면

Var[aR+b]=Ex[a2(Rμ)2]=a2Ex[(Rμ)2]=a2Var[R]

답이 말이 되는가. (다)에서 b 가 사라진 것이 요점이다. 모두에게 같은 상수를 더하면 흩어짐은 변하지 않는다. 표준편차로 옮기면 σaR+b=|a|σR 이고, 절댓값이 붙는 것은 표준편차가 음이 아니기 때문이다. 그리고 pqp=1/2 에서 최대 1/4 다 — 이 사실이 표본 크기를 정할 때 그대로 쓰인다.

합의 분산 — 이 절의 산

기댓값은 언제나 더해졌다. 분산은 그렇지 않다. R=S 이면 Var[R+S]=Var[2R]=4Var[R] 인데 Var[R]+Var[S]=2Var[R] 이므로, 둘이 같으려면 Var[R]=0 이어야 한다. 그러나 독립이면 더해진다. 그리고 놀랍게도 상호 독립까지 필요하지 않다.

예제 266

(가) R1,,Rn쌍마다 독립이면 Var[R1++Rn]=Var[R1]++Var[Rn] 임을 증명하라. (나) 그것으로 이항분포의 분산을 구하라. (다) 평균 고장 시간의 분산을 구하라.

증명

뼈대는 이렇다. 평균이 0 인 경우로 옮기고 제곱을 전개한다. 앞 예제의 (다)에서 상수를 더해도 분산이 변하지 않음을 보였으므로 Ri 대신 RiEx[Ri] 를 생각해도 된다. 그러면 모든 Ex[Ri]=0 이라 가정해도 일반성을 잃지 않는다(평행이동은 독립성도 바꾸지 않는다 — 독립인 변수의 함수는 독립이다).

증명. 평균이 0 이면 Var[T]=Ex[T2] 이므로 T::=iRi 에 대해 Ex[T2]=iEx[Ri2] 만 보이면 된다. 제곱을 전개하고 선형성을 쓰면

Ex[T2]=Ex[iRi2+ijRiRj]=iEx[Ri2]+ijEx[RiRj]

이다. 여기서 ij 이면 RiRj 가 독립이므로 21장의 곱의 기댓값 정리로 Ex[RiRj]=Ex[Ri]Ex[Rj]=00=0 이다. 둘째 합이 통째로 사라지고

Var[T]=Ex[T2]=iEx[Ri2]=iVar[Ri]

쓴 것은 두 개짜리 곱의 기댓값뿐이므로 쌍마다 독립으로 충분하다.

(나) J(n,p)-이항분포를 따르면 J=k=1nIk 이고 Ik 는 확률 p1 인 상호 독립 지시변수다. 각각의 분산이 pq 이므로

Var[J]=npq

앞 예제의 동전 100 번에서 Var[H]=1001212=25 이고 σH=5 다. 미리 썼던 값이 이렇게 나온다.

(다) 매 걸음 확률 p 로 실패하고 C 를 첫 실패까지의 걸음 수라 하자. 21장에서 Ex[C]=1/p 를 전기댓값 정리로 얻었으니 같은 방식으로 Ex[C2] 를 구한다. 첫 걸음에서 실패하면 C2=1 이고, 실패하지 않으면 남은 과정이 처음과 같으므로 CC+1 로 바뀐다.

Ex[C2]=p1+qEx[(C+1)2]=p+q(Ex[C2]+2p+1)

이므로 pEx[C2]=p+q(2/p+1)=1+2q/p 이고 Ex[C2]=(2p)/p2 다. 그러므로

Var[C]=2pp21p2=1pp2=qp2

답이 말이 되는가. (다)를 감각으로 옮기면 이렇다. 시간당 1% 로 죽는 프로그램은 평균 100 시간을 버티고 표준편차가 0.99/0.0199.5 시간이다. 표준편차가 평균과 거의 같다 — 기하분포는 대단히 넓게 퍼져 있어서 "평균 100시간"이라는 말만으로는 위험을 거의 알 수 없다. 그리고 (가)가 이 장에서 가장 자주 쓰일 정리다. 지시변수의 합에 대해 기댓값은 선형성으로, 분산은 (가)로 계산하는 것이 정형이 된다.

잘못된 증명 찾기

다음은 모자 문제에서 자기 모자를 받은 손님 수 Sn 의 분산을 구한 것이다. 어디가 틀렸는가? 그리고 옳은 값을 구하라.

Xi 를 "i 번 손님이 자기 모자를 받았다"의 지시변수라 하면 Sn=X1++Xn 이고 각 Xi 는 확률 1/n1 인 베르누이 변수다. 그러므로 Var[Xi]=1n(11n) 이고, 합의 분산 정리에 의해 Var[Sn]=n1n(11n)=11n 이다.

증명

틀린 곳은 "합의 분산 정리에 의해"다. 그 정리는 쌍마다 독립을 요구하는데 Xi 들은 쌍마다 독립이 아니다. 확인하자. 다섯째 손님이 자기 모자를 받았다는 것을 알면 남은 n1 개 모자가 남은 n1 명에게 무작위로 간 것이므로

Pr[X2=1X5=1]=1n11n=Pr[X2=1]

이다. 한 사람이 자기 모자를 받았다는 소식은 다른 사람의 확률을 올린다. 21장에서 기댓값을 계산할 때는 독립이 필요하지 않았으므로 같은 XiEx[Sn]=1 을 얻는 데 문제가 없었지만, 분산은 다르다.

옳은 계산. Ex[Sn2] 를 직접 구한다. Xi2=Xi 임을 쓰면

Ex[Sn2]=iEx[Xi2]+ijEx[XiXj]=iEx[Xi]+ijPr[Xi=1 이고 Xj=1]

첫 합은 n(1/n)=1 이다. 둘째 합의 각 항은 곱셈 규칙으로 1n1n1 이고 항이 n(n1) 개이므로 합이 1 이다. 그러므로 Ex[Sn2]=2 이고

Var[Sn]=Ex[Sn2]Ex2[Sn]=21=1

답이 말이 되는가. 틀린 값 11/n 과 옳은 값 1 은 크게 다르지 않아 이 오류는 눈에 잘 띄지 않는다. 그래서 더 위험하다 — 답이 그럴듯하다는 것이 증명이 옳다는 뜻은 아니다. 그리고 Var[Sn]=1 을 손에 넣었으니 체비쇼프를 쓸 수 있다. σ=1 이므로

Pr[Sn11]Pr[|Sn1|10]1102=1100

열 명보다 많이 자기 모자를 되찾을 확률은 1% 이하다. 손님이 몇 명이든 같다. 앞 절에서 마르코프로 얻은 Pr[Sn11]1/11 보다 열한 배 좋아졌다.

예제 268

학생 95 명의 생일이 365 일 위에서 균등하고 상호 독립이라 하자. 생일이 같은 의 개수를 M 이라 한다. Ex[M]Var[M] 을 구하고, M619 사이일 확률이 3/4 을 넘음을 보여라.

증명

뼈대는 이렇다. 쌍마다 지시변수를 붙이고 기댓값은 선형성으로, 분산은 쌍마다 독립으로 구한다.

증명. 1i<j95 마다 Eij 를 "ij 의 생일이 같다"의 지시변수라 하면 M=i<jEij 이고 Pr[Eij=1]=1/365 이다(i 의 생일이 무엇이든 j 가 그날일 확률이므로). 쌍이 (952)=4465 개이므로

Ex[M]=(952)1365=446536512.23

분산에는 Eij 들이 쌍마다 독립이라는 사실을 쓴다. 세 사람이 걸린 두 쌍, 예컨대 E12E13 을 보면 Pr[E13=1E12=1]=1/365 이므로 독립이다(12 의 생일이 같다는 소식이 3 의 생일에 대해 아무것도 말해 주지 않는다). 네 사람이 걸린 두 쌍은 더 분명히 독립이다. 그러므로

Var[M]=i<jVar[Eij]=(952)1365(11365)<12.2

체비쇼프에 x=7 을 넣으면 Pr[|M12.23|7]<12.2/490.249 이다. 곧 3/4 넘는 확률로 5.23<M<19.23 이고, M 이 정수이므로 6M19 다.

답이 말이 되는가. 19장의 생일 원리는 95 명이면 겹치는 쌍이 있다는 것까지만 말했다. 여기서는 몇 쌍인지까지 좁혔다. 눈여겨볼 것은 Eij 들이 상호 독립이 아니라는 점이다 — E12=1 이고 E23=1 이면 E13=1 이 강제된다. 그래도 쌍마다 독립이므로 분산이 더해진다. 정리가 쌍마다 독립만 요구하도록 증명해 둔 것이 여기서 값을 한다.

무작위 표본에 의한 추정

이제 이 장의 실용적인 목표로 간다. 어떤 집단에서 갑을 지지하는 사람의 비율 p 를 알고 싶다. 전수 조사는 못 하므로 무작위로 몇 명을 뽑아 물어본다. 몇 명을 물어야 하고, 그 결과를 얼마나 믿을 수 있는가.

모형은 이렇다. 지시변수 Ki 를 "i 번째로 뽑은 사람이 갑을 지지한다"라 하자. 매번 전체에서 균등하게 뽑고 뽑은 사람을 다시 넣으므로 K1,K2, 는 상호 독립이고 각각 확률 p1 이며, Sn::=K1++Kn 이라 하면 Sn/n 이 우리의 추정값이다. 추정값이 참값에서 0.04 이상 벗어날 확률을 1/20 아래로 누르려면 n 이 얼마여야 하는가. 세 걸음이다. 첫째, Sn(n,p)-이항분포이므로 Var[Sn]=npqn/4 다(pqp=1/2 에서 최대 1/4 이므로 — p 를 모르는데도 상한을 얻는 것이 여기다). 둘째, 제곱배 규칙으로

Var[Snn]=1n2Var[Sn]14n

셋째, Ex[Sn/n]=p 이므로 체비쇼프를 그대로 쓴다.

Pr[|Snnp|0.04]1/4n(0.04)2=156.25n

이 값이 1/20 이하가 되려면 n3125 다.

상한이 1/n 로 떨어지므로 오차를 절반으로 줄이려면 표본이 네 배 필요하다. 그리고 모집단 크기가 식에 들어오지 않는다
<상한이 1/n 로 떨어지므로 오차를 절반으로 줄이려면 표본이 네 배 필요하다. 그리고 모집단 크기가 식에 들어오지 않는다>[원본 보기]

예제 269

모집단 크기가 위 계산에 한 번도 나오지 않았다. 유권자가 만 명이든 십억 명이든 3125 명이면 된다는 뜻이고, 국을 간 볼 때 한 숟갈이면 되며 냄비가 크다고 두 숟갈이 필요하지 않은 것과 같다. 이제 위 계산을 일반화하라. G1,,Gn쌍마다 독립이고 모두 평균 μ, 표준편차 σ 를 가질 때 Sn::=iGi 에 대해 Pr[|Sn/nμ|x]1n(σx)2 임을 증명하라. 그리고 그것에서 큰 수의 법칙을 이끌어라.

증명

뼈대는 이렇다. 표본평균의 기댓값과 분산을 구하고 체비쇼프에 넣는다.

증명. 선형성으로

Ex[Snn]=1ni=1nEx[Gi]=nμn=μ

이고, 제곱배 규칙과 쌍마다 독립 가법성으로

Var[Snn]=1n2Var[Sn]=1n2i=1nVar[Gi]=nσ2n2=σ2n

이다. 체비쇼프 부등식을 Sn/n 에 쓰면

Pr[|Snnμ|x]Var[Sn/n]x2=σ2/nx2=1n(σx)2

큰 수의 법칙. 위 상한에서 x 를 고정하고 n 하면 오른쪽이 0 으로 간다. 그러므로 모든 ϵ>0 에 대해

limnPr[|Snnμ|<ϵ]=1

답이 말이 되는가. 이것이 큰 수의 법칙의 약한 형태이고, 표본을 충분히 늘리면 원하는 정확도를 원하는 신뢰도로 얻을 수 있다는 뜻이다. /posts/fundamental/probability.html > 큰 수의 법칙 에서 이 법칙을 실전에서 쓰는 모습을 보았을 것이고, 여기서는 그 정량적 형태를 증명했다 — "충분히 늘리면"이 아니라 "n 이 이만큼이면 이만큼 믿을 만하다"까지 말한다. 분산이 n 으로 나뉘는 것이 모든 것의 원천이고, 표준편차로 보면 σ/n 이라 통계학의 /posts/fundamental/probability.html > 표준오차 가 바로 이 값이다.

추정을 어떻게 믿는가

3125 명에게 물어 1250 명이 갑을 지지했다고 하자. 1250/3125=0.4 다. 이제 결과를 말로 옮겨야 하는데, 여기가 이 장에서 가장 미끄러운 곳이다.

틀린 말. "확률 0.95 로 지지율 p0.4±0.04 안에 있다." 왜 틀렸는가. 20장에서 짚었듯이 p 는 확률변수가 아니다. 그것은 고정된 미지의 실수이고, 만약 실제로 p=0.3 이라면 "0.30.360.44 사이에 있을 확률"을 묻는 것이 되는데 그런 확률은 없다. 그냥 있지 않을 뿐이다.

그러면 무엇이 맞는 말인가. "우리가 쓴 절차가 참값에서 0.04 안쪽의 값을 내놓을 확률이 0.95 다." 확률은 우리가 만든 뽑기 절차에 붙고 세상의 사실에는 붙지 않는다. 같은 뜻을 뒤집으면 이렇게도 적는다 — "지지율이 0.4±0.04 안에 있거나, 확률 1/20 의 드문 일이 일어났다." 실무에서는 이 긴 문장을 줄여 "신뢰수준 95% 에서 0.4±0.04" 라고 쓴다.

왼쪽 사슬은 계산이고 오른쪽은 그 계산을 말로 옮길 때의 함정이다. 확률은 절차에 붙고 알아내려는 값에는 붙지 않는다
<왼쪽 사슬은 계산이고 오른쪽은 그 계산을 말로 옮길 때의 함정이다. 확률은 절차에 붙고 알아내려는 값에는 붙지 않는다>[원본 보기]

예제 270

어떤 여론조사가 1928 명을 균등하고 독립으로 뽑아 그 가운데 675 명이 특정 견해를 지지한다는 답을 얻어 지지율을 675/19280.350 으로 추정하고, 오차 한계를 3 퍼센트포인트라고 밝혔다. (가) 지시변수가 가질 수 있는 가장 큰 분산은? (나) 쌍마다 독립 표본 정리로 이 조사가 주장할 수 있는 신뢰수준을 구하라. (다) 조사자가 99% 넘는 신뢰도를 주장한다면 무엇을 계산한 것일까. (라) "실제 지지율이 0.35±0.03 일 확률이 높다"고 말해도 되는가.

풀이 보기

(가) 지시변수의 분산은 pq=p(1p) 이고 p=1/2 에서 최대 1/4 이다. 그러므로 σ21/4 다.

(나) n=1928, x=0.03 을 정리에 넣는다.

Pr[|Snnp|0.03]119280.250.0009277.819280.144

그러므로 신뢰수준은 10.144=0.856, 곧 86% 다.

(다) 체비쇼프는 "분산만 아는" 상태의 한계다. 조사자는 Sn 이 이항분포임을 알고 있으므로 이항 꼬리를 직접 계산할 수 있다. k(nk)pkqnk 를 벗어난 범위에 대해 더하면 훨씬 작은 값이 나온다. 다음 절의 체르노프 한계도 같은 정보를 쓰는 도구다.

(라) 안 된다. (나)에서 얻은 것은 절차에 대한 확률이다. 옳은 표현은 "신뢰수준 약 86% 에서 0.35±0.03" 이거나 "0.35±0.03 이거나 확률 0.144 의 드문 일이 일어났다" 다.

답이 말이 되는가. (나)의 86% 가 조사자의 주장보다 낮은 것은 계산이 틀려서가 아니라 우리가 정보를 덜 쓴 것이다. 체비쇼프는 어떤 분포에나 통하는 대가로 느슨하다. /posts/fundamental/probability.html > 신뢰구간/posts/fundamental/probability.html > 표본비율 에서는 /posts/fundamental/probability.html > 중심극한정리 를 써서 훨씬 좁은 구간을 얻는데, 그것은 이항분포의 모양을 더 쓰기 때문이다. 이 문서가 하는 일은 모양을 모를 때도 참인 보장을 세우는 것이다.

체르노프 한계

평균과 분산만 알면 체비쇼프가 최선이었다. 그런데 우리가 다루는 확률변수는 대개 독립인 작은 것들의 합이다 — 동전 던지기, 여론조사, 서버에 뿌려진 작업. 그 사실을 쓰면 다항식이 아니라 지수적으로 작은 상한을 얻는다. 정리(체르노프 한계). T1,,Tn 이 상호 독립이고 모든 i 에 대해 0Ti1 이라 하자. T::=T1++Tn 이라 하면 모든 c1 에 대해

Pr[TcEx[T]]eβ(c)Ex[T],β(c)::=clncc+1

세 가지를 눈여겨보라. 첫째, Ti 들의 분포가 서로 달라도 되고 알려지지 않아도 된다[0,1] 안에 있고 독립이기만 하면 된다. 둘째, n 도 각각의 기댓값도 식에 나오지 않고 합의 기댓값 하나만 나온다. 셋째, Ex[T]지수 자리에 있다.

β 는 c = 1 에서 0 이고 그 뒤로 자란다. β 가 지수 자리에 있고 Ex[T] 가 곱해지므로 조금만 커져도 확률이 여러 자리씩 줄어든다
<β 는 c = 1 에서 0 이고 그 뒤로 자란다. β 가 지수 자리에 있고 Ex[T] 가 곱해지므로 조금만 커져도 확률이 여러 자리씩 줄어든다>[원본 보기]

감각을 얻자. 공정한 동전 1000 번에서 앞면이 기댓값보다 20% 이상 많을 확률은 c=1.2 이므로 β(1.2)=0.0188 이고 Ex[T]=500 이므로

Pr[T600]e0.0188×500=e9.39<8.4×105

다. 만 번에 한 번이 안 된다. 동전을 백만 번 던지면 같은 20% 초과의 상한이 e9392 이 되어 상상하기 어려운 크기로 줄어든다. 거꾸로 벗어남을 키워도 급히 줄어든다. 30% 초과라면 c=1.3 이고 β0.0411 로 두 배쯤 커질 뿐인데 지수 자리에 있으므로 상한이 1.2×109 이 된다. 복권도 보자. 0000 부터 9999 까지 네 자리 수를 골라 맞으면 상금을 받는 복권을 천만 명이 산다고 하자. 당첨자 수의 기댓값은 107/104=1000 명이다. 당첨자가 두 배인 2000 명을 넘을 확률은 c=2, β(2)=0.386 이므로 e386 이하다. 사실상 일어나지 않는다. 10% 초과조차 c=1.1, β=0.00484e4.84<0.008 이다. 복권 운영자에게는 결과가 거의 확정되어 있다.

서버를 한 대 더 놓는 것이 과부하 확률을 세 자리씩 깎는다. 작업의 길이를 하나도 모른 채 무작위로 뿌리기만 했는데도 이런 보장이 나온다
<서버를 한 대 더 놓는 것이 과부하 확률을 세 자리씩 깎는다. 작업의 길이를 하나도 모른 채 무작위로 뿌리기만 했는데도 이런 보장이 나온다>[원본 보기]

예제 271

게시판이 10 분마다 글 24000 개를 받는다. 서버는 글 하나를 평균 1/4 초에 처리하고 어떤 글도 1 초를 넘지 않는다. 글은 서버 m 대에 무작위로 균등하게 배정되고, 배정과 처리 시간은 독립이다. 한 서버가 10 분(600 초) 안에 처리하지 못할 만큼 일을 받으면 과부하다. 과부하가 사실상 일어나지 않게 하려면 m 이 얼마여야 하는가?

풀이 보기

무엇을 묻는가. m 을 정하려면 "어느 서버든 과부하"의 확률을 m 의 식으로 적어야 한다.

무엇을 아는가. 첫 서버가 받는 일의 초 수를 T=i=124000Ti 라 하자. Tii 번째 글이 다른 서버로 갔으면 0, 이 서버로 왔으면 그 글의 처리 시간이다. 0Ti1 이 성립하는 것이 결정적이다 — 일을 초로 재기로 한 이유가 바로 이것이다. 배정이 독립이고 처리 시간이 배정과 독립이므로 Ti 들은 상호 독립이다. 체르노프의 조건이 갖추어졌다.

기댓값. 선형성으로

Ex[T]=24000×(1/4)m=6000m 

m=10 이면 600 초로 용량과 정확히 같다. 여유가 전혀 없으니 절반쯤 넘칠 것이다. 그러므로 m>10 이어야 하고, 600=cEx[T] 로 두면 c=m/10 이다.

한 서버. 체르노프로 Pr[T600]eβ(m/10)6000/m 다.

모든 서버. 19장의 합집합 한계로 "어느 하나라도 과부하"의 확률은 각 서버의 확률의 합 이하다. 서버가 대칭이므로

Pr[어느 서버든 과부하]meβ(m/10)6000/m

계산. m=11 이면 0.784, m=12 이면 0.000999, m=13 이면 7.6×108 이다.

답이 말이 되는가. 11 대는 곧 넘치고, 12 대는 10 분 구간 천 번에 한 번 — 하루에 144구간이니 대략 일주일에 한 번 — 넘치고, 13 대는 수백 년에 한 번 넘친다. 용량 여유 30% 가 이만큼을 산다. 그리고 이 보장을 얻는 데 우리가 한 일은 작업의 길이를 하나도 모른 채 무작위로 뿌린 것뿐이다. 길이를 안다면 이것은 짐 싸기 문제이고 정확히 푸는 것이 어렵다. 결정론적 해법이 어렵거나 필요한 정보가 없을 때 무작위를 쓰는 것이 좋은 선택이 되는 전형적인 상황이다. 마지막으로 Ti로 잰 이유를 짚어 두자. 체르노프 한계는 Ti[0,1] 을 요구하는데, 시간을 분으로 재면 조건이 저절로 만족되는 대신 Ex[T] 가 작아져 지수가 약해진다. 단위를 최댓값에 맞춰 잡는 것이 이 정리를 세게 쓰는 요령이다.

증명 — 지수를 씌워 마르코프에 넣는다

예제 272

체르노프 한계를 증명하라.

증명

뼈대는 한 줄이다. 부등식의 양변에 c 를 밑으로 하는 지수를 씌우고 마르코프를 쓴다. c1 이므로 tct 가 증가함수이고, 따라서 TcEx[T]cTccEx[T]같은 사건이다.

증명. cT0 이므로 마르코프를 쓸 수 있다.

Pr[TcEx[T]]=Pr[cTccEx[T]]Ex[cT]ccEx[T]

이제 분자를 위에서 잡아야 한다. 보조정리 1. Ex[cTi]e(c1)Ex[Ti] 다. 증명은 이렇다. v[0,1]c1 에 대해 cv1+(c1)v 가 성립한다 — 아래로 볼록한 함수 cv 가 두 교점 v=0,1 사이에서 그 두 점을 잇는 직선 아래에 있기 때문이다(Ti[0,1] 에 갇히게 한 이유가 여기다). 그러므로

Ex[cTi]=vcvPr[Ti=v]v(1+(c1)v)Pr[Ti=v]=1+(c1)Ex[Ti]e(c1)Ex[Ti]

마지막 부등호는 모든 실수 z 에 대해 1+zez 이기 때문이다.

보조정리 2. Ex[cT]e(c1)Ex[T] 다. cT=cT1cT2cTn 이고 독립인 변수의 함수도 독립이므로(21장) 곱의 기댓값 정리를 쓸 수 있다.

Ex[cT]=iEx[cTi]ie(c1)Ex[Ti]=e(c1)iEx[Ti]=e(c1)Ex[T]

마지막 등호가 선형성이다. 마무리. 보조정리 2를 넣고 분모를 e 의 거듭제곱으로 고치면

Pr[TcEx[T]]e(c1)Ex[T]ccEx[T]=e(c1)Ex[T]eclncEx[T]=e(clncc+1)Ex[T]

답이 말이 되는가. 이 증명에서 값어치 있는 발상은 지수를 씌우면 마르코프가 갑자기 세진다는 것 하나다. 왜 세지는가. 지수함수가 큰 값을 압도적으로 크게 만들므로, cT 의 평균은 T 의 큰 값이 얼마나 자주 나오는지에 훨씬 민감하다. 그 민감한 양에 마르코프를 쓰면 꼬리에 대한 정보가 더 나온다. 다만 그 대가로 Ex[cT] 라는 까다로운 양을 잡아야 했고, 그것을 곱으로 쪼개려면 상호 독립이 필요했다. 세 부등식 가운데 체르노프만 독립을 요구하는 까닭이 이 자리에 있다. 조건 두 가지를 다시 확인해 두면, Ti[0,1] 은 볼록성 부등식 cv1+(c1)v 를 쓰기 위한 것이고 상호 독립은 곱의 기댓값을 쪼개기 위한 것이다. 어느 하나가 깨지면 결론이 깨진다.

세 한계를 나란히

상호 독립인 사건 A1,,An 이 있고 그 가운데 몇 개가 일어나는지를 묻자. TiAi 의 지시변수, pi::=Pr[Ai], T::=iTi 라 하면 세 도구가 각각 이렇게 말한다.

도구무엇을 요구하는가무엇을 말하는가
기댓값의 선형성아무것도Ex[T]=ipi
마르코프위와 같음Pr[TcEx[T]]1/c
분산의 가법성쌍마다 독립Var[T]=ipi(1pi)
체비쇼프위와 같음Pr[|TEx[T]|cσT]1/c2
체르노프상호 독립, Ti[0,1]Pr[TcEx[T]]eβ(c)Ex[T]
마르코프와 체비쇼프는 다항식으로 떨어지고 체르노프만 지수로 떨어진다. 그래서 로그 축에서 앞의 둘은 거의 눕고 체르노프만 참값과 나란히 내려간다
<마르코프와 체비쇼프는 다항식으로 떨어지고 체르노프만 지수로 떨어진다. 그래서 로그 축에서 앞의 둘은 거의 눕고 체르노프만 참값과 나란히 내려간다>[원본 보기]

체르노프는 위쪽 꼬리만 잡는다. 아래쪽이 궁금하면 nT 에 다시 쓰면 된다nT[0,1] 값 변수들의 독립인 합이고, T 가 평균보다 훨씬 작다는 것은 nT 가 평균보다 훨씬 크다는 것과 같다. 그래서 양쪽 모두 지수적으로 작다. 알고리즘 문서의 확률적 자료구조가 정확히 이 한계 위에 서 있다. /posts/fundamental/algorithm.html > 블룸 필터 의 거짓 양성률, /posts/fundamental/algorithm.html > Count-Min Sketch/posts/fundamental/algorithm.html > HyperLogLog 의 오차 보장은 모두 "독립인 해시들의 합이 평균에서 크게 벗어나지 않는다"는 문장이고, 그것을 정량화하는 것이 이 절의 한계들이다. /posts/fundamental/algorithm.html > 확률과 공간의 맞바꿈 이 "정확함을 조금 포기하면 공간이 크게 줄어든다"고 말할 때 그 "조금"의 크기를 재 주는 것이 여기서 증명한 부등식들이다.

머피의 법칙

체르노프의 짝이 되는 정리를 하나 더 본다. 기댓값이 1 보다 훨씬 작으면 마르코프가 "하나도 일어나지 않을 것"이라 말한다. 거꾸로 기댓값이 1 보다 훨씬 크면 어떨까.

예제 273

상호 독립인 사건 A1,,An 의 지시변수를 Ti, T::=iTi 라 하자. Pr[T=0]eEx[T] 임을 증명하라.

증명

뼈대는 이렇다. 여사건의 곱으로 적고 1xex 를 항마다 쓴다.

증명. T=0 인 것은 어느 사건도 일어나지 않는 것이므로

Pr[T=0]=Pr[A1An]=i=1n(1Pr[Ai])

이다(둘째 등호가 상호 독립이다 — 여사건들도 상호 독립임을 20장에서 확인했다). 모든 실수 x 에 대해 1xex 이므로

i(1Pr[Ai])iePr[Ai]=eiPr[Ai]=eiEx[Ti]=eEx[T]

마지막 두 등호는 지시변수 보조정리와 선형성이다.

답이 말이 되는가. 뜻을 새겨 보자. 잘못될 수 있는 독립인 일이 많고 그 확률의 합이 10 이라면, 하나도 잘못되지 않을 확률이 e10<1/22000 이다. 거의 확실히 무언가는 잘못된다. 이것을 머피의 법칙이라 부를 만하다. 그리고 "기적"이라 불리는 일들이 실제로 일어나는 까닭도 여기 있다 — 백만 분의 일인 사건이 백만 가지 있으면 그중 무엇인가는 일어난다. 위의 복권으로 옮기면, 무작위로 고른 표가 십만 장 팔렸다면 당첨자가 없을 확률이 e10 미만이다. 누군가는 당첨된다.

이 장에서 새로 나온 것

기호·용어
마르코프 부등식R0 이면 Pr[Rx]Ex[R]/x. 또는 Pr[RcEx[R]]1/c
하한을 쓰는 요령Rb>0 이면 Rb 에 마르코프를 쓴다. 언제나 더 좋아진다
분산 · 표준편차Var[R]::=Ex[(REx[R])2] · σR::=Var[R] (단위가 원래 변수와 같다)
체비쇼프 부등식Pr[|Rμ|x]Var[R]/x2, 곧 Pr[|Rμ|cσ]1/c2. R0 을 요구하지 않는다
분산 공식 · 베르누이Var[R]=Ex[R2]Ex2[R] · Var[B]=pq1/4 (B2=B 에서)
제곱배 규칙Var[aR+b]=a2Var[R], σaR+b=|a|σR
분산의 가법성쌍마다 독립이면 Var[Ri]=Var[Ri]. 상호 독립까지 필요 없다
이항 · 기하분포의 분산npq (동전 100 번이면 25) · q/p2 (표준편차가 평균과 거의 같다)
모자 문제의 분산Var[Sn]=1. 지시변수가 쌍마다 독립이 아니므로 가법성을 쓸 수 없다
생일 짝의 수Ex[M]=(n2)/d, Var[M]=(n2)1d(11d). 95 명이면 6 에서 19
표본평균 Sn/nEx=μ, Var=σ2/n. 흩어짐이 σ/n 로 줄어든다
쌍마다 독립 표본 정리Pr[|Sn/nμ|x]1n(σ/x)2
큰 수의 법칙(약한 형태)limnPr[|Sn/nμ|<ϵ]=1
표본 크기오차 0.04, 신뢰 95%n3125. 모집단 크기와 무관하다
신뢰수준절차에 붙는 확률이다. 알아내려는 값에 확률을 붙이면 틀린 말이 된다
체르노프 한계독립이고 Ti[0,1] 이면 Pr[TcEx[T]]eβ(c)Ex[T], β(c)=clncc+1
β 의 값β(1.2)=0.0188, β(1.3)=0.0411, β(2)=0.386. 지수 자리에 있다
머피의 법칙상호 독립이면 Pr[T=0]eEx[T]. 기댓값이 크면 거의 확실히 일어난다
1+zez이 장에서 두 번 쓰였다. 체르노프의 보조정리와 머피의 법칙

챙겨 갈 것은 넷이다.

이 장은 얼마나 벗어나는가를 물었다. 다음 장은 어디로 가는가를 묻는다. 한 걸음마다 무작위로 오르내리는 과정을 무작위 행보라 하고, 도박꾼의 자본이 그 첫 예다. 공정한 게임에서도 파산하는 이유, 조금 불리한 게임이 왜 절망적으로 불리한지를 이 장의 도구로 설명한다 — 표류와 진동의 다툼이 곧 평균과 표준편차의 다툼이기 때문이다. 그리고 행보의 무대를 직선에서 그래프로 옮기면 페이지랭크가 나온다.

무작위 행보

한 걸음마다 방향을 무작위로 정해 움직이는 과정을 무작위 행보(random walk)라 한다. 물리학자는 삼차원 무작위 행보로 브라운 운동과 기체의 확산을 설명하고, 컴퓨터과학자는 그래프 위의 무작위 행보로 웹 페이지의 중요도를 잰다. 이 장은 두 예를 본다. 먼저 직선 위의 행보로 도박을 모형화하고, 다음으로 그래프 위의 행보로 페이지랭크를 만든다.

이 장에서 답할 것은 셋이다. 공정한 게임에서도 파산하는가(그렇다. 확률 1 로 파산한다). 조금 불리한 게임은 얼마나 불리한가("조금"이 아니다. 지수적으로 불리하다). 그리고 그래프 위를 오래 걸으면 어디에 머무는가. 마지막 물음의 답이 정상분포이고 그것이 곧 페이지랭크다.

앞 장들에서 가져오는 것은 22장의 표준편차체르노프 한계, 21장의 기댓값의 선형성무한 선형성의 조건, 20장의 전확률 정리조건부 기댓값, 12장의 방향 그래프나가는 차수, 16장의 등비급수의 합, 그리고 8장의 상태 기계다. 그리고 이 장에서 세우는 점화식을 24장이 조리법으로 푼다 — 여기서는 답을 확인하는 데 필요한 만큼만 쓰고 왜 그렇게 푸는지는 다음 장에 맡긴다.

도박꾼의 파산

도박꾼이 n 달러를 들고 와서 한 판에 1 달러씩 건다. 이기면 판돈을 돌려받고 1 달러를 더 받고, 지면 1 달러를 잃는다. 그는 돈이 다 떨어지거나 자본이 목표 T 달러에 이를 때까지 계속한다. m::=Tn목표 이익이라 하자. 목표에 이르면 이긴 것이고, 목표에 이르기 전에 자본이 0 이 되면 파산이다. 각 판을 이길 확률은 p 로 같고 판들은 상호 독립이라 하자. q::=1p 로 적는다.

한 걸음이 ±1 이므로 자본은 정수 위를 걷는다. 무작위 행보의 물음은 늘 둘이다 — 어느 쪽 경계에 닿는가, 그리고 닿기까지 몇 걸음인가
<한 걸음이 ±1 이므로 자본은 정수 위를 걷는다. 무작위 행보의 물음은 늘 둘이다 — 어느 쪽 경계에 닿는가, 그리고 닿기까지 몇 걸음인가>[원본 보기]

8장의 말로 옮기면 이것은 상태 기계다. 상태가 자본이고 전이가 한 판이며 0T 가 종료 상태다. 다른 점은 전이가 무작위라는 것이고, 그래서 "끝나는가"가 아니라 "어느 쪽으로 끝나는가"와 "몇 걸음에 끝나는가"를 확률로 물어야 한다.

p1/2 이면 공정한(unbiased) 게임이라 하고, p1/2 이면 편향된(biased) 게임이라 한다.

같은 상황을 두 사람의 게임으로 바꿔 보는 것이 유용하다. 갑이 n 달러, 을이 m 달러를 갖고 한 판마다 갑이 확률 p 로 을에게서 1 달러를 받고 확률 q 로 을에게 1 달러를 준다. 한 사람이 빌 때까지 한다면 이것은 초기 자본 n, 목표 T=n+m 인 도박꾼의 파산과 완전히 같은 문제다. 을의 자본이 곧 갑의 목표까지의 거리이기 때문이다. 이 관점이 뒤에서 승률을 구할 때 결정적으로 쓰인다.

공정한 게임 — 승률은 자본에 비례한다

답을 먼저 보자. 공정한 게임에서 초기 자본이 n 이고 목표가 T 일 때 목표에 이를 확률을 wn 이라 하면

wn=nT(p=1/2)

다. n=T/2 일 때 1/2 이라는 것은 대칭으로 곧 알 수 있지만 나머지는 그렇지 않다.

승률은 초기 자본에 정확히 비례한다. 자본이 크면 자주 이기지만 질 때 그만큼 크게 진다 — 곱하면 평균 이익이 정확히 0 이다
<승률은 초기 자본에 정확히 비례한다. 자본이 크면 자주 이기지만 질 때 그만큼 크게 진다 — 곱하면 평균 이익이 정확히 0 이다>[원본 보기]

예제 274

공정한 게임에서 (가) 자본 100 달러로 200 달러를 목표로 하면 승률은? (나) 자본 500 달러로 100 달러를 더 따려 하면? (다) 자본 106 달러로 100 달러를 더 따려 하면? (라) (나)에서 평균 이익을 구하고 "승률이 높다"는 말과 어떻게 어울리는지 밝혀라.

풀이 보기

무엇을 묻는가. wn=n/T 에 값을 넣는 것과 그 결과를 어떻게 읽을지다.

(가) n=100, T=200 이므로 1/2 이다. (나) n=500, T=600 이므로 5/60.833 이다. (다) T=106+100 이므로 106/(106+100)>0.9999 다.

(라) 이기면 100 달러를 얻고 지면 500 달러를 잃는다. 그러므로

Ex[이익]=56100+16(500)=5005006=0

답이 말이 되는가. 공정한 판을 아무리 이어 붙여도 평균 이익은 0 이다. 21장의 선형성으로 보면 당연하다 — 판마다 기댓값이 0 이고 판 수가 유한한 값의 기댓값을 갖기 때문이다. 높은 승률은 "자주 조금 따고 드물게 크게 잃는다"는 뜻일 뿐이다. 이 구조가 22장의 판돈 두 배 전략과 같은 모양임을 눈여겨보라. 그리고 두 사람의 게임으로 보면 같은 식이 다르게 읽힌다 — 갑이 500, 을이 100 을 갖고 한 사람이 빌 때까지 공정한 동전을 던지면 갑이 이길 확률이 5/6 이다. 돈이 많은 쪽이 이긴다.

파스칼의 칩 — 판을 공정하게 만들어 버리기

승률을 어떻게 구하는가. 파스칼의 발상은 열일곱 세기 중반의 것인데 지금 보아도 재기 넘친다. 칩의 값을 바꿔 매겨 어떤 p 에서도 판이 공정해지게 만든다. 그러면 기댓값이 0 이라는 한 줄에서 승률이 나온다.

갑의 칩을 아래에서 위로 r, r², ⋯, rⁿ 로, 을의 칩을 위에서 아래로 rⁿ⁺¹, ⋯, rⁿ⁺ᵐ 로 매기면 어느 판이든 가치의 기댓값이 0 이 된다
<갑의 칩을 아래에서 위로 r, r², ⋯, rⁿ 로, 을의 칩을 위에서 아래로 rⁿ⁺¹, ⋯, rⁿ⁺ᵐ 로 매기면 어느 판이든 가치의 기댓값이 0 이 된다>[원본 보기]

예제 275

두 사람의 게임으로 보자. 갑이 칩 n 개, 을이 칩 m=Tn 개를 갖고 한 판마다 갑이 확률 p 로 을의 맨 위 칩을 가져오고 확률 q 로 자기 맨 위 칩을 내준다. r::=q/p 라 하자. 갑의 칩을 바닥부터 r,r2,,rn 로, 을의 칩을 맨 위부터 아래로 rn+1,rn+2,,rn+m 로 값을 매긴다. (가) 한 판의 가치 기댓값이 0 임을 보여라. (나) 게임이 끝났을 때의 가치로 승률 wn 을 구하라.

증명

뼈대는 이렇다. 가치를 매기는 방식이 판 뒤에도 그대로 유지되므로 모든 판이 같은 이유로 공정하다. 그러면 전체 가치의 기댓값이 0 이고, 그 식을 wn 에 대해 풀면 된다.

(가) 증명. 갑의 맨 위 칩은 rn, 을의 맨 위 칩은 rn+1 이다. 갑이 한 판에서 얻는 가치는

rn+1prnq=rn(rpq)=rn(qppq)=0

이다. 그리고 판이 끝난 뒤에도 갑의 칩을 아래에서 위로 읽고 이어서 을의 칩을 위에서 아래로 읽은 값의 줄은 여전히 r,r2,,rn+m 이다. 갑이 이기면 그 줄의 경계가 한 칸 오른쪽으로, 지면 한 칸 왼쪽으로 옮겨질 뿐이다. 그러므로 모든 판이 같은 계산으로 공정하다.

(나) 증명. 판마다 가치의 기댓값이 0 이므로 게임이 끝났을 때 갑이 얻은 가치의 기댓값도 0 이다(판 수가 무한할 수 있지만 가치의 크기가 판 수와 무관하게 유한한 범위에 갇혀 있으므로 21장의 무한 선형성 조건이 만족된다). 갑이 이기면 을의 칩을 모두 얻으므로 가치가 i=n+1n+mri 만큼 늘고, 지면 i=1nri 만큼 줄어든다. 그러므로

0=wni=n+1n+mri(1wn)i=1nri

공정한 게임(r=1). 두 합이 각각 mn 이므로 0=wnm(1wn)n 이고 정리하면 wn=n/(n+m)=n/T 다.

편향된 게임(r1). 16장의 등비합으로 i=1nri=r(rn1)/(r1) 이고 i=n+1n+mri=r(rTrn)/(r1) 이다. 공통 인수 r/(r1) 를 지우면

wn(rTrn)=(1wn)(rn1)

이고 전개하면 wnrTwn=rn1 이므로

wn=rn1rT1(r=qp1)

답이 말이 되는가. 두 결과를 검산하자. n=T 를 넣으면 두 식 모두 1 이고 n=0 을 넣으면 모두 0 이다. 그리고 r1 로 보내면 (rn1)/(rT1)n/T 인데(분자와 분모를 r1 로 나누면 항이 각각 n 개와 T 개인 합이 된다) 두 경우가 이어져 있다는 확인이 된다. 이 증명의 값어치는 "문제를 바꾸지 않고 세는 단위를 바꾸었다"는 발상 하나다. 편향을 없애려고 게임을 고친 것이 아니라 칩의 값을 고쳐 편향이 저절로 상쇄되게 했다.

예제 276

위 결과를 파스칼처럼 영리하지 않은 방법으로 다시 얻어라. 곧 wn 에 대한 점화식을 세우고 풀어라.

증명

뼈대는 이렇다. 첫 판의 결과로 경우를 나눈다. 20장의 전확률 정리가 그대로 점화식이 된다.

점화식 세우기. 0<n<T 라 하자. 첫 판을 이기면 자본이 n+1 이 되고 그다음부터는 자본 n+1 로 시작한 게임과 완전히 같으므로 승률이 wn+1 이다. 지면 wn1 이다. 전확률 정리로

wn=pwn+1+qwn1,w0=0,wT=1

푸는 법. 24장의 조리법을 미리 쓴다. wn=xn 을 넣고 xn1 로 나누면 x=px2+q, 곧

px2x+q=0

이다. 근의 공식으로 x=1±14pq2p 인데 14pq=14p(1p)=(12p)2 이므로 제곱근이 |12p|깔끔하게 벗겨진다. 그러므로 두 뿌리는 1q/p=r 다.

p1/2 인 경우. 두 뿌리가 다르므로 일반해가 wn=A1n+Brn=A+Brn 이다. 경계조건을 넣으면 A+B=0A+BrT=1 이고, 빼면 B(rT1)=1 이므로 B=1/(rT1), A=B 다. 따라서

wn=rn1rT1

p=1/2 인 경우. 두 뿌리가 모두 1중복근이다. 그러면 일반해에 n 이 곱해진 항이 붙어 wn=A+Bn 이 된다(18장의 부분분수에서 1/(1αx)2 의 계수가 n+1 배가 되는 것과 같은 현상이고, 24장에서 다시 다룬다). w0=0 에서 A=0 이고 wT=1 에서 B=1/T 이므로 wn=n/T 다.

답이 말이 되는가. 파스칼의 답과 문자까지 같다. 눈여겨볼 것은 공정한 게임이 "중복근"이라는 특별한 경우로 나타났다는 점이다. 그래서 n/T 라는 일차식이 나왔고, 편향된 게임에서는 rn 이라는 지수식이 나왔다. 답의 모양이 완전히 다른 까닭이 특성방정식의 뿌리에 있다. 그리고 이 풀이는 재기가 필요하지 않다 — 점화식을 세우고 조리법을 따랐을 뿐이다. 24장이 그 조리법을 세운다.

편향된 게임 — 지수적인 불리함

wn=(rn1)/(rT1) 은 읽기가 쉽지 않다. 불리한 게임(p<1/2, 곧 r>1)에서 쓸 만한 상한이 있다.

r>1 이면 분자와 분모가 모두 양수이고 분자가 더 작으므로

wn=rn1rT1<rnrT=1rTn=(1r)m

이다. 상한에 초기 자본이 들어 있지 않다. 목표 이익 m 하나에만 달려 있고 그것도 지수적으로 달려 있다.

로그 축에서 직선이므로 승률이 목표 이익에 대해 지수적으로 떨어진다. 상한에 초기 자본이 없으므로 돈을 아무리 많이 가져와도 이 값을 넘지 못한다
<로그 축에서 직선이므로 승률이 목표 이익에 대해 지수적으로 떨어진다. 상한에 초기 자본이 없으므로 돈을 아무리 많이 가져와도 이 값을 넘지 못한다>[원본 보기]

예제 277

룰렛에서 빨강에 1 달러씩 건다. 초록 칸 때문에 한 판을 이길 확률이 p=18/38 이라 하자. (가) 100 달러를 따려는 도박꾼의 승률 상한을 구하라. (나) 자본을 500 달러에서 50 억 달러로 늘리면 얼마나 좋아지는가. (다) 목표를 200 달러로 올리면? (라) 공정한 게임의 5/6 과 견주어라.

증명

무엇을 묻는가. 상한에 값을 넣는 것과 그 상한이 무엇에 달려 있는지다.

(가) q=20/38 이므로 r=q/p=20/18=10/9 이고 1/r=9/10 이다. 목표 이익이 m=100 이므로

wn<(910)100=2.66×105<137000

(나) 전혀 좋아지지 않는다. 상한 (9/10)100 에 초기 자본이 나오지 않는다. 자본을 백만 배로 늘려도 100 달러를 따기 전에 파산할 확률이 11/37000 을 넘는다.

(다) (9/10)200=((9/10)100)2<(1/37000)2 이므로 약 14 억 분의 일이다. 목표를 두 배로 하면 승률이 제곱이 된다.

(라) 자본 500, 목표 600 일 때 공정한 게임의 승률은 5/60.83 이고 이 게임은 1/37000 미만이다. 세 만 배가 아니라 세 만 분의 일이다. 한 판의 승률 차이는 0.5 에서 0.4742.6 퍼센트포인트뿐인데 결과가 이렇게 갈린다.

답이 말이 되는가. 카지노가 어떻게 유지되는지가 이 계산이다. 손님은 "거의 공정한 게임이니 승률도 거의 같겠지"라고 짐작하는데 실제로는 거의 공정한 것과 공정한 것이 전혀 다르다. 왜 그런지는 다음 절에서 설명한다.

표류와 진동

직관을 세워 보자. 도박꾼의 자본에는 두 힘이 걸려 있다. 하나는 운의 진동(swing)이다. 잘 되는 판이 몰리면 자본이 오르고 안 되는 판이 몰리면 내려간다. 다른 하나는 표류(drift)다. 판마다 평균적으로 pq=2p1 달러를 잃으므로 자본이 꾸준히 내려간다.

진동은 판 수의 제곱근으로 자라고 표류는 판 수에 비례해 자란다. 그래서 초반에 운이 오지 않으면 필요한 진동이 갈수록 커져 사실상 불가능해진다
<진동은 판 수의 제곱근으로 자라고 표류는 판 수에 비례해 자란다. 그래서 초반에 운이 오지 않으면 필요한 진동이 갈수록 커져 사실상 불가능해진다>[원본 보기]

자본이 아주 많으면 아주 오래 놀 수 있으니 언젠가 운 좋은 진동이 와서 100 달러를 앞서게 해 줄 것 같다. 그러나 기다리는 동안 표류가 자본을 갉아먹는다. 자본이 수십, 수백 달러 내려가면 목표에 닿기 위해 필요한 진동이 그만큼 커지고, 필요한 진동이 커지면 그것이 올 확률은 22장에서 본 대로 지수적으로 작아진다. 이것을 정량화해 보자.

예제 278

k 판을 한 시점을 보자(kmin(m,n) 이라 하자). 딴 판의 수를 W 라 하면 W(k,p)-이항분포를 따른다. (가) 이 시점에 이미 목표 이익 m 을 앞서려면 W 가 얼마 이상이어야 하는가. (나) 그 값이 Ex[W] 를 몇 개의 표준편차만큼 넘어야 하는지 k 의 식으로 적어라. (다) 결론을 말로 옮겨라.

증명

무엇을 아는가. 22장에서 Ex[W]=kp 이고 σW=kpq 임을 증명했다.

(가) k 판 가운데 W 판을 이기고 kW 판을 졌으므로 자본 변화가 W(kW)=2Wk 다. 이 값이 m 이상이어야 하므로

Wk+m2

(나) 평균을 넘어야 하는 양은

k+m2kp=m+k(12p)2

이고 이것을 표준편차로 나누면

m+k(12p)2kpq

다. p<1/2 이므로 12p양수이고, 따라서 분자는 k 에 비례해 자라는데 분모는 k 로만 자란다. 그러므로 이 값은 Θ(k) 다.

(다) 뜻은 이렇다. 오래 놀수록 필요한 진동이 표준편차 단위로 커진다. k 판을 한 시점에 목표를 앞서려면 평균에서 Θ(k) 개의 표준편차만큼 위로 벗어나 있어야 하고, 22장의 체르노프 한계로 그 확률은 k 에 대해 지수적으로 작다. 그러므로 초반에 운이 오지 않으면 사실상 기회가 사라진다.

답이 말이 되는가. p=1/2 이면 12p=0 이 되어 (나)의 값이 m/(2kpq)=m/k줄어든다. 표류가 없으면 오래 놀수록 필요한 진동이 표준편차 단위로 작아지고, 그래서 공정한 게임에서는 "오래 기다리면 언젠가 온다"는 직관이 실제로 맞는다. 표류가 있는지 없는지가 이 모든 차이를 만든다. 실무의 격언으로 옮기면 "길게 보면 표류가 진동을 이긴다" 다.

이길 때 그만두지 않으면

목표를 정하지 않고 파산할 때까지 놀면 어떻게 되는가. 답이 둘 다 뜻밖이다.

예제 279

공정한 게임을 목표 없이 계속하는 도박꾼이 n1 달러로 시작한다. 확률 1 로 파산함을 증명하라.

증명

뼈대는 이렇다. 목표가 있는 게임의 파산 확률을 아래에서 잡고 목표를 무한히 멀리 보낸다.

증명. 목표 T>n 을 정해 놓고 노는 게임을 생각하자. 그 게임에서 파산하는 판의 열은 목표를 무시하고 계속 놀았을 때도 똑같이 파산으로 이끈다(자본이 T 에 닿기 전에 0 에 닿았으므로 목표가 있든 없든 같은 시점에 파산한다). 그러므로

Pr[목표 없이 놀아 파산]Pr[목표 T 로 놀아 파산]=1nT

이다. 이 부등식이 모든 T>n 에 대해 성립하고, T 로 보내면 오른쪽이 1 에 얼마든지 가까워진다. 확률이 1 을 넘을 수 없으므로 왼쪽은 정확히 1 이다.

답이 말이 되는가. 백만 달러를 들고 완벽하게 공정한 게임을 해도 결국 전부 잃는다. 22장의 판돈 두 배 전략이 "무한한 자금이 있어야 한다"는 조건에 걸렸던 것과 같은 이야기를 반대쪽에서 본 것이다. 그리고 p1/2 이면 어느 경우에도 같은 결론이 나온다 — 불리한 게임의 파산 확률은 공정한 게임보다 크기 때문이다.

잘못된 추론 찾기

위 결과를 두고 다음과 같이 말하는 사람이 있다. 어디가 틀렸는가?

"확률 1 로 파산한다지만 파산까지 걸리는 판 수의 기댓값은 무한하다. 그러므로 파산은 무한히 먼 미래로 밀려나 있고, 실질적으로 걱정할 일이 아니다. 1 달러만 들고 시작해도 마찬가지다."

풀이 보기

앞의 사실은 참이다. 실제로 기대 판 수가 무한하다. 확인해 두자. 자본이 1 달러 줄어드는 데 걸리는 기대 판 수를 t 라 하면, 첫 판을 지면 그 자리에서 줄어들고 이기면 자본이 1 늘었으므로 이제 2 달러를 줄여야 한다. 그러므로

t=q1+p(1+2t)=12+12+t=1+t

이고 이것을 만족하는 유한한 t 는 없다. 곧 t= 다.

틀린 곳은 "기댓값이 무한하니 실질적으로 걱정할 일이 아니다" 라는 마지막 추론이다. 기댓값은 하나의 요약값이고, 그것이 무한하다는 것은 "오래 걸린다"가 아니라 "아주 드물게 아주 오래 걸리는 경우가 평균을 발산시킨다"는 뜻일 수 있다. 실제로 1 달러로 시작하면

Pr[첫 판에 파산]=12,Pr[다섯 판 안에 파산]=12+18+116=11160.69

다(2k+1 번째 판에 처음 0 에 닿는 경우의 수가 카탈란 수 Ck=1,1,2, 이므로 확률이 Ck/22k+1 이다). 거의 절반이 한 판에 끝나는데 평균은 무한하다.

답이 말이 되는가. 이것은 22장이 말한 것의 되풀이다 — 기댓값 하나만으로는 위험을 판단할 수 없다. 극단적인 예를 하나 더 들면 이렇다. 처음에 확률 110100 로 그 자리에서 파산하게 만들고, 남은 10100 의 경우에만 공정한 무한 게임을 하게 하자. 거의 확실히 즉시 파산하는데도 기대 판 수는 여전히 무한하다(무한에 양수를 곱하면 무한이므로). 기댓값이 무한하다는 말은 이런 것들을 전부 한데 뭉갠다.

게임은 몇 판 가는가

승률 다음의 물음은 게임의 길이다. 같은 방법으로 점화식을 세운다. 초기 자본이 n 일 때 게임이 끝나기까지의 기대 판 수를 en 이라 하자.

예제 281

(가) en 에 대한 점화식과 경계조건을 세워라. (나) 공정한 게임에서 en=n(Tn) 임을 확인하라. (다) 그것을 말로 옮기고 수치를 확인하라.

증명

(가) 20장의 조건부 기댓값을 쓴다. 첫 판을 이기면 그 한 판을 쓰고 자본 n+1 에서 다시 시작하므로 기대 판 수가 1+en+1 이고, 지면 1+en1 이다. 전기댓값 정리로

en=p(1+en+1)+q(1+en1)=1+pen+1+qen1,e0=eT=0

게임이 이미 끝난 자리에서는 판을 하지 않으므로 경계값이 둘 다 0 이다.

(나) 증명. p=q=1/2 일 때 en=n(Tn) 을 넣어 확인한다. 오른쪽은

1+(n+1)(Tn1)+(n1)(Tn+1)2

이고 분자를 전개하면 (nTn22n+T1)+(nTn2+2nT1)=2nT2n22 이므로 위 식이 1+nTn21=n(Tn) 이 된다. 왼쪽과 같다. 경계조건도 e0=0, eT=T(TT)=0 으로 맞는다.

(다) Tn=m 이므로 en=nm, 곧

Ex[공정한 게임의 판 수]=(초기 자본)×(목표 이익)

이다. 10 달러로 시작해 10 달러를 더 따거나 파산할 때까지 하면 평균 100 판이다. 500 달러로 100 달러를 따려 하면 평균 50000 판이다.

답이 말이 되는가. 두 인수가 대칭이라는 것이 예쁘다 — 자본과 목표 이익을 맞바꿔도 기대 판 수가 같다. 그리고 편향된 게임에서는 답이 en=wnTnpq 인데, 이것도 위 점화식에 넣어 확인할 수 있고(wn=pwn+1+qwn1 을 쓰면 항이 정확히 맞아떨어진다) p<q 이면 분모가 음수이고 wnT<n 이므로 값이 양수다. 룰렛에서 500 달러로 100 달러를 따려 하면 승률이 거의 0 이므로 enn/(qp)=500/(1/19)=9500 판이다 — 공정한 게임의 50000 판보다 훨씬 빨리 끝난다. 표류가 있으면 결과가 빨리 정해진다.

그래프 위의 무작위 행보

이제 행보의 무대를 직선에서 방향 그래프로 옮긴다. 12장에서 세운 용어를 그대로 쓴다. 정점 x 에 있을 때 그 정점에서 나가는 간선 하나를 균등하게 골라 따라간다고 하자. 곧 x 에서 나가는 차수를 outdeg(x) 라 할 때

Pr[xy 를 따른다|x 에 있다]::=1outdeg(x)

다. 그러면 다음 걸음에 y 에 있을 확률은 20장의 전확률 정리로 나온다.

Pr[y 로 간다]=xyPr[x 에 있다]outdeg(x)

합은 y 로 들어오는 간선 전체에 대한 것이다. 이 식을 "정점 x 가 자기 확률을 나가는 간선 수만큼 쪼개어 이웃들에게 나눠 준다"로 읽으면 편하다.

진입 차수만 세면 d 가 가장 크지만 무작위 행보는 a 와 d 를 같게 본다. a 를 지나야 b 와 c 에 갈 수 있기 때문이다
<진입 차수만 세면 d 가 가장 크지만 무작위 행보는 a 와 d 를 같게 본다. a 를 지나야 b 와 c 에 갈 수 있기 때문이다>[원본 보기]

정의. 방향 그래프의 각 정점에 확률을 매긴 것이 정상분포(stationary distribution)라는 것은 확률의 합이 1 이고 모든 정점 x 에 대해

Pr[x 에 있다]=Pr[다음 걸음에 x 에 있다]

인 것이다. 곧 한 걸음 걸어도 분포가 변하지 않는 배정이다. 정의를 위 식과 합치면 미지수 n 개에 대한 연립일차방정식이 된다.

예제 282

정점 a,b,c 에 간선이 ab, ac, ba, bc, ca 로 있다. (가) 간선마다 확률을 매겨라. (나) 정상분포를 구하라. (다) 진입 차수로 매긴 순위와 견주어라.

풀이 보기

무엇을 묻는가. 방정식을 세워 푸는 것이다. 미지수를 α,β,γ 로 적자.

(가) outdeg(a)=2, outdeg(b)=2, outdeg(c)=1 이므로 ab 에서 나가는 간선은 각각 1/2, c 에서 나가는 간선은 1 이다.

(나) 각 정점으로 들어오는 간선을 모으면

α=β2+γ,β=α2,γ=α2+β2,α+β+γ=1

이다. 둘째 식을 셋째에 넣으면 γ=α/2+α/4=3α/4 이고, 이 둘을 넷째에 넣으면 α(1+1/2+3/4)=19α/4=1 이므로

α=49,β=29,γ=13

검산하자. 첫 식은 2/912+1/3=1/9+3/9=4/9 로 맞고 합은 4/9+2/9+3/9=1 이다.

(다) 진입 차수는 a2, b1, c2 다. 그러면 ac 가 동점이지만 정상분포는 a4/9, c3/9 로 갈라 놓는다.

답이 말이 되는가. 왜 갈렸는가. a 로 들어오는 두 간선 가운데 하나가 outdeg(c)=1 인 정점에서 오므로 확률을 통째로 받고, c 로 들어오는 두 간선은 모두 나가는 차수가 2 인 정점에서 오므로 반씩만 받는다. 곧 표를 준 쪽이 표를 몇 장 뿌렸는지가 표의 무게를 정한다. 이 한 가지가 페이지랭크의 핵심이다. 그리고 방정식이 "합이 1" 없이는 모두 0 인 답을 허용한다는 점을 잊지 마라 — 마지막 식을 반드시 함께 세운다.

예제 283

다음 두 그래프를 살펴라. (가) 정점 둘에 xyyx 만 있는 왕복 그래프. 정상분포를 구하고, x 에서 출발한 행보의 분포가 그것에 가까워지는지 밝혀라. (나) 정점 셋에 ab, ac, 그리고 bbcc (제자리 간선)가 있는 그래프. 정상분포를 모두 구하라.

증명

(가) 방정식은 Pr[x]=Pr[y], Pr[y]=Pr[x], 합이 1 이므로 정상분포는 (1/2,1/2) 하나뿐이다. 그런데 x 에서 출발하면 분포가 (1,0),(0,1),(1,0), 로 튄다. 두 값을 오가므로 어느 값에도 가까워지지 않는다. 정상분포가 있고 유일한데도 도달하지 못한다.

(나) 증명. a 로 들어오는 간선이 없으므로 Pr[a]=0 이 강제된다. b 에 대한 식은 Pr[b]=Pr[a]/2+Pr[b]=Pr[b] 이므로 아무 제약도 주지 않는다. c 도 같다. 남은 것은 합이 1 이라는 조건뿐이므로, 어떤 t[0,1] 에 대해서도

(Pr[a],Pr[b],Pr[c])=(0,t,1t)

가 정상분포다. 정상분포가 셀 수 없이 많다.

답이 말이 되는가. 두 예가 말하는 것은 "정상분포"라는 개념만으로는 "오래 걸으면 여기 있다"는 뜻을 얻지 못한다는 것이다. 필요한 조건은 그래프가 강하게 연결되어 있는 것이다(12장의 말이다 — 어느 정점에서 어느 정점으로도 방향을 지켜 갈 수 있다). 강하게 연결되어 있으면 정상분포가 유일하고, 어디서 출발해도 충분히 오래 걸으면 그 분포에 가까워진다. (가)는 강하게 연결되어 있지만 주기가 있어서 수렴이 깨졌고, (나)는 강하게 연결되어 있지 않아 유일성이 깨졌다. 다음 절에서 페이지랭크가 이 두 문제를 어떻게 한꺼번에 없애는지 본다.

왼쪽은 정상분포가 유일한데 도달하지 못하고, 오른쪽은 정상분포가 무한히 많다. 페이지랭크가 슈퍼 정점을 더하는 이유가 이 두 그림이다
<왼쪽은 정상분포가 유일한데 도달하지 못하고, 오른쪽은 정상분포가 무한히 많다. 페이지랭크가 슈퍼 정점을 더하는 이유가 이 두 그림이다>[원본 보기]

걸어서 정상분포에 다가가기

정상분포는 연립방정식을 풀어 구할 수도 있지만, 정점이 아주 많으면 그 방법을 쓸 수 없다. 대신 아무 분포에서 출발해 한 걸음 걷는 계산을 되풀이한다. 그래프가 강하게 연결되어 있고 주기가 없으면 값이 정상분포로 수렴한다.

예제 284

앞 예제의 그래프(ab, ac, ba, bc, ca)에서 균등분포 (1/3,1/3,1/3) 에서 출발해 세 걸음을 걸어라. 그리고 정상분포 (4/9,2/9,3/9) 와 견주어라.

풀이 보기

무엇을 묻는가. 한 걸음의 식을 세 번 적용하는 계산이다. 분포를 (α,β,γ) 라 하면 한 걸음 뒤에는

α=β2+γ,β=α2,γ=α2+β2

이 된다. 분모를 36 으로 맞춰 적으면 계산이 편하다.

출발. (12,12,12)/36. 한 걸음. α=6+12=18, β=6, γ=6+6=12 이므로 (18,6,12)/36 이다. 두 걸음. α=3+12=15, β=9, γ=9+3=12 이므로 (15,9,12)/36 이다. 세 걸음. α=4.5+12=16.5, β=7.5, γ=7.5+4.5=12 이므로 (16.5,7.5,12)/36 이다.

정상분포는 (4/9,2/9,3/9)=(16,8,12)/36 이다. 세 걸음 만에 (16.5,7.5,12)/36 까지 왔다.

답이 말이 되는가. 세 값의 합이 걸음마다 36/36=1 로 유지되는 것을 확인하라 — 확률이 새로 생기거나 사라지지 않기 때문이다. 그리고 γ 는 첫 걸음 뒤부터 이미 12/36 에 고정되었고 αβ 가 참값을 위아래로 오가며 좁혀 온다. 걸음마다 오차가 일정한 비율로 줄어드는 것이 이 반복법의 성질이고, 그래서 웹 그래프처럼 정점이 조 단위여도 수십 번 걸으면 쓸 만한 값이 나온다. 방정식을 푸는 것과 걷는 것 가운데 걷는 것이 훨씬 싸다.

페이지랭크

검색어에 맞는 문서가 수백만 개일 때 어느 것을 먼저 보여야 하는가. 낱말이 몇 번 나오는지로 점수를 매기면 첫 화면에 검색어를 이백 번 적어 놓은 페이지가 이긴다. 1995년에 두 사람이 웹의 링크 구조가 답을 갖고 있다고 생각했다. 페이지가 페이지를 가리키는 것을 표로 보는 것이다.

두 번의 시도가 각각 어떤 공격에 무너지고 무작위 행보가 그것을 어떻게 막는지, 그리고 슈퍼 정점이 수학적 필요에서 나온 것임을 따라간다
<두 번의 시도가 각각 어떤 공격에 무너지고 무작위 행보가 그것을 어떻게 막는지, 그리고 슈퍼 정점이 수학적 필요에서 나온 것임을 따라간다>[원본 보기]

첫 생각은 진입 차수였다. Rank(x)::=indeg(x) 로 두는 것이다. 곧 무너진다.

예제 285

페이지가 다섯 개다. P 는 내 페이지이고 D1,D2,D3 는 내가 만든 허수아비 페이지로 각각 P 만 가리킨다. Q 는 잘 알려진 페이지이고 PQ, QP 다. (가) 진입 차수로 순위를 매기면? (나) 정상분포로 매기면? (다) 두 결과의 차이가 왜 생겼는지 밝혀라.

증명

(가) P 로 들어오는 간선이 D1,D2,D3,Q 에서 넷이고 Q 로는 P 에서 하나다. 허수아비는 진입 간선이 없다. 그러므로 순위는 P(4)>Q(1)>Di(0) 이다. 허수아비 셋을 만들어 PQ 보다 네 배 중요하게 만들었다.

(나) 증명. Di 로 들어오는 간선이 하나도 없으므로 정상분포에서 Pr[Di]=0 이다. 그러면 P 로 들어오는 확률은

Pr[P]=Pr[D1]1+Pr[D2]1+Pr[D3]1+Pr[Q]1=0+0+0+Pr[Q]=Pr[Q]

이고 Q 로 들어오는 확률은 Pr[Q]=Pr[P]/1=Pr[P] 다. 합이 1 이므로

Pr[P]=Pr[Q]=12,Pr[Di]=0

허수아비 셋이 아무 효과도 내지 못했다.

(다) 진입 차수는 표를 세기만 하고 표를 준 쪽이 얼마나 중요한지를 묻지 않는다. 무작위 행보는 묻는다 — 아무도 가리키지 않는 페이지에는 행보가 도달하지 않으므로 그 페이지에 머물 확률이 0 이고, 확률 0 을 나눠 주어도 0 이다.

답이 말이 되는가. 정직하게 덧붙이면, 실제 페이지랭크에는 아래에서 볼 슈퍼 정점이 있어서 모든 페이지가 조금씩 확률을 받는다. 그래서 허수아비도 0 이 아니게 되고 P 가 조금 이득을 본다. 링크 농장이 완전히 무용해지지는 않는다는 뜻이고, 검색 엔진이 스팸 링크를 따로 걸러내는 일을 계속하는 이유이기도 하다. 그래도 "표를 준 쪽이 중요해야 표가 무겁다"는 구조 하나가 낱말 세기와는 차원이 다른 강건함을 준다.

예제 286

두 번째 공격을 막아 보자. 어떤 페이지가 자기가 밀어 주고 싶은 페이지 k 개에 링크를 뿌린다. (가) 진입 차수로 세면 무슨 일이 생기는가. (나) 무작위 행보에서는? (다) 나가는 링크가 없는 페이지와 정상분포의 유일성 문제를 페이지랭크가 어떻게 처리하는지 설명하라.

풀이 보기

(가) k 개 페이지의 진입 차수가 각각 1 씩 오른다. 링크를 뿌리는 데 드는 비용이 없으므로 k 를 얼마든지 키울 수 있고, "일찍 투표하고 자주 투표하라"가 좋은 전략이 된다. 순위 체계가 무너진다.

(나) 그 페이지가 가진 확률 Pr[x]k 개로 쪼개진다. 각 링크가 전하는 것은 Pr[x]/k 이므로 링크를 많이 뿌리면 한 표씩이 그만큼 가벼워진다. 한 페이지가 가진 표의 총량이 Pr[x] 로 고정되어 있다는 것이 이 방식의 강건함이다.

(다) 두 문제를 한 장치로 처리한다. 슈퍼 정점을 하나 더하고, 모든 페이지에서 슈퍼 정점으로 가는 간선을 놓고, 슈퍼 정점에서 모든 페이지로 균등하게 나가는 간선을 놓는다. 나가는 링크가 없는 페이지는 슈퍼 정점으로 가는 간선이 확률 1 을 갖고, 링크가 k 개 있는 페이지는 슈퍼 정점으로 갈 확률을 이를테면 0.15 로 두고 원래 링크 각각에 0.85/k 를 준다.

이렇게 하면 그래프가 강하게 연결된다 — 어느 페이지에서든 슈퍼 정점을 거쳐 어느 페이지로도 갈 수 있다. 앞 절에서 본 대로 강하게 연결된 그래프에는 정상분포가 유일하고, 어디서 출발해도 오래 걸으면 그것에 가까워진다.

답이 말이 되는가. 사용자 경험으로 읽으면 슈퍼 정점은 "막다른 곳에 이르거나 지겨워지면 아무 페이지로나 새로 시작한다"는 행동이다. 모형을 현실에 가깝게 만들려는 손질이 정상분포의 유일성과 수렴이라는 수학적 요구와 정확히 맞아떨어진 셈이다. 좋은 모형에서 자주 일어나는 일이다.

정의(페이지랭크). 페이지랭크는 위 그래프의 정상분포다. 곧 음이 아닌 수 Rank(x) 들 가운데

Rank(x)=yxRank(y)outdeg(y),xRank(x)=1

을 만족하는 것이다. 정점이 n 개면 미지수 n 개에 방정식 n+1 개다. 마지막 식이 없으면 모두 0 인 답이 나오므로 반드시 함께 세운다.

실제로는 이 연립방정식을 풀지 않는다. 웹 그래프의 정점이 조 단위이므로 풀 수가 없다. 대신 균등분포에서 출발해 한 걸음 걷는 계산을 되풀이한다. 강하게 연결되어 있으므로 값이 정상분포로 수렴한다. 선형대수학 의 말로 옮기면 Rank 는 전이행렬의 고윳값 1 에 대한 고유벡터이고, 되풀이하는 계산은 그 고유벡터를 찾는 반복법이다. 12장에서 인접행렬의 거듭제곱이 보행의 수를 센다고 한 것과 같은 구조인데, 여기서는 행렬의 성분이 개수가 아니라 확률이다.

무작위 행보가 또 나오는 곳

이 장의 두 예 말고도 무작위 행보는 여러 곳에 나온다. 셋만 적어 둔다. 첫째, 확산이다. 향기 분자가 방 안에서 퍼지는 것은 삼차원 무작위 행보이고, k 걸음 뒤에 출발점에서 떨어진 거리가 k 규모라는 앞 절의 계산이 그대로 "확산 거리는 시간의 제곱근에 비례한다"가 된다. 둘째, 카드 섞기다. 섞는 방법 하나를 한 걸음으로 보면 카드 배열들 위의 무작위 행보가 되고, 정상분포가 균등분포이며 "몇 걸음이면 균등에 가까워지는가"가 "몇 번 섞어야 하는가"가 된다. 셋째, 확률적 알고리즘이다. 만족 배정을 찾을 때까지 변수 하나를 무작위로 뒤집는 절차는 "만족되지 않은 절의 수" 위의 무작위 행보이고, 그 행보가 0 에 닿기까지의 기대 걸음 수를 이 장의 방법으로 잰다.

공통점은 하나다. 상태를 정하고, 한 걸음의 확률을 정하고, 어디에 닿는지와 몇 걸음에 닿는지를 묻는다. 그 물음에 답하는 방법은 두 가지뿐이었다 — 파스칼처럼 보존되는 양을 찾거나(8장의 불변량과 같은 발상이다), 점화식을 세워 푸는 것이다.

이 장에서 새로 나온 것

기호·용어
무작위 행보한 걸음마다 방향을 무작위로 정해 움직이는 과정. 직선 위 또는 그래프 위
도박꾼의 파산초기 자본 n, 목표 T, 목표 이익 m=Tn, 한 판 승률 p, q=1p
r=q/p한 판의 불리함을 재는 비. r=1 이 공정, r>1 이 불리한 게임
공정한 게임의 승률wn=n/T. 승률이 초기 자본에 정확히 비례한다
편향된 게임의 승률wn=(rn1)/(rT1)
파스칼의 칩 논법칩의 값을 r 의 거듭제곱으로 매기면 어떤 p 에서도 판이 공정해진다
불리한 게임의 상한wn<(1/r)m. 초기 자본이 들어 있지 않고 목표 이익에 지수적으로 달렸다
룰렛의 수치p=18/38 이면 r=10/9. 100 달러 목표의 승률이 (9/10)100<1/37000
표류와 진동표류는 판 수에 비례하고 진동은 판 수의 제곱근에 비례한다. 길게 보면 표류가 이긴다
필요한 진동의 크기k 판 뒤에 목표를 앞서려면 평균에서 Θ(k) 개의 표준편차만큼 벗어나야 한다
목표 없는 공정한 게임확률 1 로 파산한다. 그런데 파산까지의 기대 판 수는 무한하다
기대 판 수공정한 게임이면 en=n(Tn)= (초기 자본) × (목표 이익). 일반적으로는 (wnTn)/(pq)
그래프 위의 행보나가는 간선을 균등하게 고른다. Pr[xyx]=1/outdeg(x)
한 걸음의 식Pr[y 로 간다]=xyPr[x]/outdeg(x)
정상분포한 걸음 걸어도 변하지 않는 확률 배정. 합이 1 이라는 조건을 반드시 함께 세운다
유일성과 수렴강하게 연결되어 있으면 유일하고 어디서 출발해도 가까워진다. 주기가 있으면 수렴이 깨지고, 싱크가 여럿이면 유일성이 깨진다
페이지랭크슈퍼 정점을 더한 웹 그래프의 정상분포. 전이행렬의 고윳값 1 에 대한 고유벡터다
슈퍼 정점모든 페이지에서 확률 0.15 로 가고 거기서 모든 페이지로 균등하게 나간다. 그래프를 강하게 연결시킨다
표의 무게한 페이지가 가진 확률이 나가는 링크 수만큼 쪼개진다. 링크를 뿌려도 총량이 늘지 않는다

챙겨 갈 것은 넷이다.

이 장에서 점화식을 네 번 세웠다. 승률 wn, 기대 판 수 en, 자본이 1 줄어드는 시간 t, 그리고 정상분포의 연립방정식이다. 앞의 둘은 "xn 을 넣어 뿌리를 구한다"는 조리법으로 풀었는데 그 조리법을 아직 세우지 않았다. 다음 장이 그것을 세운다 — 하노이 탑병합정렬로 점화식을 만드는 법부터 시작해, 선형 점화식을 특성근으로 푸는 법분할정복 점화식의 마스터 정리까지 간다. 그리고 18장이 같은 점화식들을 생성함수로 푼 것과 나란히 놓아 두 길이 왜 같은 답을 주는지를 밝힌다.

점화식

점화식(recurrence)은 수열의 항을 앞의 항으로 적은 식이다. 이 문서에서 점화식은 이미 여러 번 나왔다. 18장은 하노이 탑과 피보나치를 생성함수로 풀었고, 23장은 도박꾼의 승률과 기대 판 수를 점화식으로 적어 놓고 "xn 을 넣어 뿌리를 구한다"는 조리법을 미리 썼다. 그 조리법을 세우는 것이 이 장이다.

이 장에서 답할 것은 셋이다. 점화식을 어떻게 세우는가(하노이 탑과 병합정렬로 두 가지 전형을 본다). 어떻게 푸는가(네 가지 길이 있고 어느 것을 고를지가 요령이다). 그리고 왜 어떤 점화식은 지수적인 답을, 어떤 점화식은 다항식 답을 주는가. 마지막 물음의 답이 이 장에서 가장 실용적인 소득이다 — 알고리즘을 빠르게 하려면 어디를 손봐야 하는지를 알려 준다.

앞의 두 길은 패턴을 눈으로 찾는 방법이고 방향이 서로 반대다. 뒤의 두 길은 조리법이라 통찰이 필요하지 않다
<앞의 두 길은 패턴을 눈으로 찾는 방법이고 방향이 서로 반대다. 뒤의 두 길은 조리법이라 통찰이 필요하지 않다>[원본 보기]

앞 장들에서 가져오는 것은 18장의 생성함수부분분수, 그리고 분모 q(x)=1c1xcdxd비네 공식이다. 16장의 점근 표기(O,Ω,Θ)와 등비합적분으로 합을 근사하기도 계속 쓴다. 그리고 7장의 귀납법이 이 장의 검증 도구다. 알고리즘 문서가 /posts/fundamental/algorithm.html > 재귀와 재귀식/posts/fundamental/algorithm.html > 마스터 정리 를 결과만 주고 지나갔다. 여기서 증명한다. 이 장에서 log 의 밑을 적지 않으면 2 다.

하노이 탑 — 추측하고 검증하기

기둥 셋과 크기가 다른 원판 n 개가 있다. 한 번에 원판 하나만 옮기고 큰 원판을 작은 원판 위에 놓을 수 없다. 전부 다른 기둥으로 옮기는 최소 횟수 Tn 은 18장에서 세운 대로

T1=1,Tn=2Tn1+1(n2)

다. 가장 큰 원판을 옮기기 전후에 나머지 n1 개를 통째로 옮겨야 하기 때문이다. 이제 이 식을 푼다.

가장 단순한 방법은 추측하고 검증하기다. 항을 몇 개 계산해 패턴을 찾고 귀납법으로 증명한다. T1 부터 적으면 1,3,7,15,31,63 이다. 답이 보인다.

예제 287

Tn=2n1 이 위 점화식을 만족함을 증명하라.

증명

뼈대는 이렇다. 점화식의 첫 줄이 귀납법의 기저가 되고 둘째 줄이 귀납 단계가 된다. 점화식과 귀납법의 구조가 똑같아서 증명이 저절로 굴러간다.

증명. n 에 대한 귀납법이다. 귀납 가정은 Tn=2n1 이다.

기저. n=1 일 때 T1=1=211 이다.

귀납 단계. n2 이고 Tn1=2n11 이라 하자. 그러면

Tn=2Tn1+1=2(2n11)+1=2n2+1=2n1

이다. 첫 등호는 점화식이고 둘째는 귀납 가정이며 나머지는 정리다.

답이 말이 되는가. T3=7 이고 원판 셋을 실제로 옮겨 보면 일곱 걸음이다. 원판이 64 개라면 26411.8×1019 걸음이니, 한 걸음에 1 초가 걸린다 해도 우주의 나이보다 긴 시간이 필요하다. "끝난다"와 "끝나는 것을 볼 수 있다"는 다르다.

잘못된 증명 찾기

정확한 답 2n1 대신 더 깔끔한 상한 Tn2n 만 증명하려 한다. 다음 증명은 어디가 틀렸는가? 그리고 무엇을 고쳐야 하는가?

증명. n 에 대한 귀납법이다. 귀납 가정은 Tn2n 이다. 기저는 T1=121 이므로 참이다. 귀납 단계에서 Tn12n1 이라 하면 Tn=2Tn1+122n1+1=2n+1 이므로 Tn2n 이다.

증명

틀린 곳은 마지막 "이므로"다. Tn2n+1 을 얻었는데 Tn2n 을 주장했다. 2n+12n 보다 크므로 이 함의는 성립하지 않는다. 귀납 단계가 아주 조금 모자라게 끝났다.

고치는 법은 뜻밖이다. 더 센 명제를 증명하면 된다. 귀납 가정을 Tn2n1 로 바꾸면

Tn=2Tn1+12(2n11)+1=2n1

이 되어 통과한다. 물론 이것은 사실 등식이므로 앞 예제와 같은 증명이다.

답이 말이 되는가. 7장에서 강한 귀납법을 다루며 "가정이 셀수록 증명이 쉬워진다"는 현상을 보았다. 여기서는 결론이 셀수록 증명이 쉬워졌다 — 귀납법에서 증명할 명제가 곧 다음 단계의 가정이 되므로, 명제를 약하게 만들면 쓸 무기도 약해진다. 점화식의 해에 대해 느슨한 상한만 증명하려 드는 것은 귀납법과 잘 어울리지 않는다. 정확한 답을 구하고 나서 느슨하게 읽는 편이 낫다.

대입하고 정리하기

추측하고 검증하기에는 큰 약점이 있다. 추측을 맞혀야 한다. 하노이 탑은 1,3,7,15 만 보아도 답이 보이지만 답이 복잡하면 그렇지 않다. 그럴 때 쓰는 것이 대입하고 정리하기다. 수의 패턴이 아니라 식의 패턴을 찾는다는 점이 다르고, 앞에서부터가 아니라 뒤에서부터 간다는 점이 다르다.

예제 289

하노이 탑의 점화식을 대입하고 정리하기로 풀어라.

증명

뼈대는 세 걸음이다. ① 패턴이 보일 때까지 대입하고 정리한다. ② 그 패턴을 한 번 더 대입해 검증한다. ③ 값을 아는 항에 닿도록 변수를 정한다.

① 대입과 정리. 너무 많이 정리하면 패턴이 숨으므로 적당히만 정리한다.

Tn=2Tn1+1=2(2Tn2+1)+1=4Tn2+2+1=8Tn3+4+2+1=16Tn4+8+4+2+1

패턴이 보인다. 등비합을 닫힌 형태로 접으면

Tn=2kTnk+2k1++2+1=2kTnk+2k1

② 검증. 이 식에서 한 걸음 더 대입한다.

2kTnk+2k1=2k(2Tnk1+1)+2k1=2k+1Tn(k+1)+2k+11

오른쪽 끝은 처음 식에서 kk+1 로 바꾼 것과 정확히 같다. 그리고 k=1 일 때 그 식은 원래 점화식이다. 그러므로 귀납법에 의해 모든 k1 에 대해 성립한다.

③ 아는 항에 닿기. T1=1 을 알고 있으므로 k=n1 로 둔다.

Tn=2n1T1+2n11=2n1+2n11=2n1

답이 말이 되는가. 추측하고 검증하기와 같은 답이다. 두 방법을 견주어 두자. 추측·검증은 T1,T2,T3,앞에서부터 계산해 n 번째 항의 식을 짐작한다. 대입·정리는 TnTn1,Tn2,뒤에서부터 펼쳐 값을 아는 첫 항에 닿는다. 방향이 반대이고, 그래서 잘 통하는 문제가 다르다. ②에서 "한 걸음 더 대입해 보니 같은 모양이 나왔다"가 곧 귀납 단계라는 것을 눈여겨보라. 대입·정리는 검증까지 저절로 해 준다.

병합정렬 — 추측이 통하지 않을 때

두 번째 전형이다. 병합정렬은 수 n 개를 반으로 갈라 각각을 재귀적으로 정렬한 뒤 두 정렬된 목록을 합친다. 합칠 때는 두 목록의 맨 앞을 견주어 작은 것을 내보내기를 되풀이하고, 한쪽이 비면 나머지를 통째로 내보낸다.

예제 290

n2 의 거듭제곱일 때 병합정렬이 쓰는 비교 횟수의 최댓값 Tn 에 대한 점화식을 세우고 풀어라.

증명

점화식 세우기. n=1 이면 이미 정렬되어 있으므로 T1=0 이다. n2 이면 앞 절반을 정렬하는 데 최대 Tn/2, 뒤 절반에 최대 Tn/2, 그리고 합치는 데 최대 n1 번이다. 합치는 횟수가 n1 인 이유는 비교 한 번마다 적어도 하나가 내보내지고 한쪽이 비는 순간 나머지가 비교 없이 나가므로, n 개를 내보내는 동안 비교는 n1 번을 넘을 수 없다. 그러므로

T1=0,Tn=2Tn/2+n1(n2, n 은 2 의 거듭제곱)

추측이 되는가. 앞에서부터 계산하면 T1=0, T2=1, T4=5, T8=17, T16=49 다. 0,1,5,17,49 에서 패턴을 짐작하기는 어렵다. 대입·정리로 간다.

Tn=2Tn/2+n1=2(2Tn/4+n21)+(n1)=4Tn/4+(n2)+(n1)

한 번 더 하면 8Tn/8+(n4)+(n2)+(n1) 이고 또 하면 16Tn/16+(n8)+(n4)+(n2)+(n1) 이다. 패턴은

Tn=2kTn/2k+j=0k1(n2j)=2kTn/2k+kn(2k1)

검증. 한 걸음 더 대입하면

2k(2Tn/2k+1+n2k1)+kn2k+1=2k+1Tn/2k+1+(k+1)n2k+1+1

이 되어 kk+1 로 바뀐 같은 모양이다.

아는 항에 닿기. T1 을 알고 있으므로 n/2k=1, 곧 k=logn 로 둔다. 그러면 2k=n 이므로

Tn=nT1+nlognn+1=nlognn+1

답이 말이 되는가. 검산하자. n=16 이면 16416+1=49 로 맞고, n=8 이면 838+1=17 로 맞는다. 왜 추측이 안 되었는지도 이제 보인다 — 답에 nlognn+1 이 섞여 있어 처음 몇 항만으로는 짐작할 수 없다. 답이 복잡할 때 대입·정리가 값을 한다. 알고리즘 문서의 /posts/fundamental/algorithm.html > 병합 정렬 이 이 정렬을 실전 관점에서 다뤘고, 비교 횟수의 정확한 상한이 여기서 나온다.

재귀 트리로 눈으로 풀기

같은 답을 그림으로 얻을 수도 있다. 재귀 호출을 나무로 그리고 층마다 하는 일을 더한 뒤 층 수를 곱한다.

층마다 조각의 개수가 두 배가 되고 크기가 절반이 되어 층마다의 일이 n 으로 유지된다. 층이 log n 개이므로 전체가 n log n 규모다
<층마다 조각의 개수가 두 배가 되고 크기가 절반이 되어 층마다의 일이 n 으로 유지된다. 층이 log n 개이므로 전체가 n log n 규모다>[원본 보기]

예제 291

재귀 트리로 병합정렬의 비교 횟수가 nlogn 규모임을 보여라. 그리고 그 계산이 대입·정리의 어느 단계에 대응하는지 밝혀라.

증명

증명. 뿌리는 크기 n 인 문제이고 층 j 에는 크기 n/2j 인 문제가 2j 개 있다. 층 j 에서 합치는 데 드는 비교는 문제마다 n/2j1 번 이하이므로 층 전체로는

2j(n2j1)=n2j

번 이하다. 크기가 1 이 되는 층이 j=logn 이므로 합치는 일이 있는 층은 j=0 부터 logn1 까지 logn 개다. 모두 더하면

j=0logn1(n2j)=nlogn(2logn1)=nlognn+1

이고 대입·정리로 얻은 값과 정확히 같다.

대응. 재귀 트리의 "층 j 의 일"이 대입·정리에서 나온 합 j=0k1(n2j) 의 각 항이다. 곧 두 방법은 같은 합을 다른 순서로 적은 것이다. 대입·정리는 그 합을 대수적으로 쌓고 재귀 트리는 그림으로 늘어놓는다.

답이 말이 되는가. 재귀 트리의 값어치는 어느 층이 전체를 지배하는지 눈에 보인다는 것이다. 여기서는 층마다의 일이 거의 같아서 어느 층도 지배하지 않았고, 그래서 답에 층 수 logn 이 인수로 남았다. 이 관찰이 뒤에서 마스터 정리를 증명하는 열쇠가 된다.

선형 점화식과 특성근

두 조리법 가운데 첫째다. 계단 오르기 문제로 시작하자. 계단 n 개를 오르는데 한 번에 한 칸 또는 두 칸을 밟을 수 있다. 방법이 몇 가지인가. 네 칸이면 다섯 가지다(한한한한, 두두, 두한한, 한두한, 한한두).

n 칸을 오르는 방법은 첫걸음이 한 칸인 것두 칸인 것으로 갈린다. 앞의 경우 남은 계단이 n1 개이고 뒤의 경우 n2 개다. 그러므로 방법의 수 g(n)

g(0)=1,g(1)=1,g(n)=g(n1)+g(n2)(n2)

를 만족한다. 피보나치 점화식이다. 실제로 g(2)=2,g(3)=3,g(4)=5 로 위에서 센 것과 맞는다. 18장의 표기 f0=0, f1=1 을 쓰면 g(n)=fn+1 이므로 fn 을 풀면 된다.

정의. 상수 a1,,ad 에 대해

f(n)=a1f(n1)+a2f(n2)++adf(nd)

꼴을 차수 d 인 동차 선형 점화식이라 한다(18장에서 쓴 ci 를 여기서는 ai 로 적는다. 생성함수의 분모와 구별하기 위해서다). 동차는 "더 단순한 쪽"이라는 뜻이고, 오른쪽에 f 와 무관한 항이 붙으면 비동차다.

푸는 첫 걸음은 답의 모양을 찍는 것이다. 선형 점화식의 해는 지수함수인 경향이 있으므로 f(n)=xn 을 넣어 본다. 경계조건은 잠시 잊는다. 피보나치에 넣으면 xn=xn1+xn2 이고 xn2 로 나누면

x2=x+1

이라는 이차방정식이 남는다. 일반적으로는 xnd 로 나누어

xd=a1xd1+a2xd2++ad1x+ad

를 얻고 이것을 특성방정식(characteristic equation)이라 한다. 계수가 점화식의 계수와 같으므로 곧바로 적을 수 있다. 그 뿌리를 특성근이라 한다.

예제 292

fg 가 같은 동차 선형 점화식의 해이면 모든 실수 s,t 에 대해 h(n)::=sf(n)+tg(n) 도 그 점화식의 해임을 증명하라.

증명

뼈대는 이렇다. 정의를 넣고 항을 다시 모은다. 이 한 줄이 특성근 방법을 가능하게 하는 정리다 — 뿌리마다 얻은 해를 마음대로 섞어도 여전히 해이기 때문에, 경계조건을 맞출 자유가 생긴다.

증명.

h(n)=sf(n)+tg(n)=si=1daif(ni)+ti=1daig(ni)=i=1dai(sf(ni)+tg(ni))=i=1daih(ni)

첫 등호는 h 의 정의, 둘째는 fg 가 해라는 사실, 셋째는 항을 다시 모은 것, 넷째는 다시 h 의 정의다. 처음과 끝이 같으므로 h 도 해다.

답이 말이 되는가. 여기서 쓴 것은 점화식이 선형이라는 성질뿐이다. 오른쪽이 f(n1)2 이나 f(n1) 이면 항을 이렇게 모을 수 없다. 이 성질은 선형 미분방정식에서도 같은 모양으로 나타난다 — 그래서 선형 점화식을 풀 수 있으면 선형 미분방정식의 풀이법도 이미 절반은 아는 것이다.

예제 293

피보나치 점화식 f0=0, f1=1, fn=fn1+fn2 를 특성근으로 풀어라. 그리고 18장이 생성함수로 얻은 답과 견주어라.

증명

특성방정식. 위에서 얻은 x2=x+1 의 뿌리는

α1=1+52=1.618,α2=152=0.618

일반해. 두 뿌리가 다르므로 α1nα2n 이 각각 해이고, 앞 예제에 의해 그 선형결합도 해다.

fn=sα1n+tα2n

경계조건. f0=0 에서 s+t=0 이고 f1=1 에서 sα1+tα2=1 이다. 첫 식에서 t=s 이므로 둘째에 넣으면 s(α1α2)=1 이고 α1α2=5 이므로

s=15,t=15

이다. 그러므로

fn=15((1+52)n(152)n)

이고 이것이 비네 공식이다. 18장의 답과 문자까지 같다.

답이 말이 되는가. 검산하자. n=5 이면 α15=11.09, α25=0.0902 이므로 (11.09+0.09)/2.236=5.00 이고 실제로 f5=5 다. 그리고 계단 오르기의 답은 g(n)=fn+1 이므로 g(4)=f5=5 로 손으로 센 것과 맞는다.

두 길의 계산량을 견주어 두자. 생성함수 길은 급수를 접고 방정식을 세우고 분모를 인수분해하고 부분분수로 쪼갠 뒤 계수를 읽었다. 특성근 길은 xn 을 넣고 이차방정식을 풀고 연립방정식 두 개를 풀었다. 동차 점화식에서는 특성근 길이 짧다.

큰 뿌리는 1 보다 크므로 그 항이 지수적으로 자라고 작은 뿌리는 절댓값이 1 미만이라 금방 사라진다. 두 직선의 기울기가 반대 부호인 것이 두 항의 운명을 갈랐다
<큰 뿌리는 1 보다 크므로 그 항이 지수적으로 자라고 작은 뿌리는 절댓값이 1 미만이라 금방 사라진다. 두 직선의 기울기가 반대 부호인 것이 두 항의 운명을 갈랐다>[원본 보기]

비네 공식은 실용적인 정보를 준다. |α2|<1 이므로 α2n0 이고, 16장의 점근 표기로

fn=α1n5+o(1)

이다. 곧 피보나치 수는 밑이 1.618 인 지수로 자란다. α1황금비라 하고 ϕ 로 적는다. 실제로 ϕ20/5=6765.000029 이고 f20=6765 다 — 무리수만으로 만든 식이 정수에 소름 돋게 가까워진다.

중복근

특성방정식에 중복근이 있으면 해가 모자란다. 차수 d 인 점화식에는 경계조건이 d 개 있으므로 미지수도 d 개가 필요한데, 뿌리가 겹치면 서로 다른 αnd 개보다 적어진다. 답은 이렇다.

규칙. r 가 중복도 k 인 특성근이면 rn,nrn,n2rn,,nk1rn 이 모두 해다.

예제 294

g0=0, g1=1, gn=4gn14gn2 를 특성근으로 풀어라. 그리고 18장이 부분분수로 같은 문제를 푼 것과 견주어 "왜 n 이 곱해지는가"에 답하라.

증명

특성방정식. x2=4x4, 곧 (x2)2=0 이므로 x=2 가 중복도 2 인 뿌리다.

일반해. 규칙에 따라 2nn2n 이 해이므로

gn=c2n+dn2n

경계조건. g0=0 에서 c=0 이고 g1=1 에서 2d=1 이므로 d=1/2 다. 따라서

gn=12n2n=n2n1

n 이 곱해지는가. 18장의 계산이 답을 준다. 그쪽에서 생성함수가 G(x)=x/(12x)2 로 나왔고, 분모에 (12x)두 번 들어 있었다. 그리고

[xn]1(12x)2=(n+1)2n

이므로 계수에 n+1 이라는 일차 인수가 붙었다. 일반적으로 1/(1αx)k 의 계수는 (n+k1n)αn 이고 이항계수는 n(k1) 차 다항식이다. 그래서 중복도 k 인 뿌리가 nk1αn 까지를 낳는다.

답이 말이 되는가. 점화식으로 직접 계산하면 0,1,4,12,32,80 이고 공식은 n2n1 이므로 0,1,4,12,32,80 이다. 맞는다. 두 길이 서로를 설명한다는 것이 요점이다. 특성근 길은 "n 을 곱한다"는 규칙을 외우게 하지만 왜 그런지는 말해 주지 않는다. 생성함수 길은 그 이유를 부분분수의 계수로 보여 준다. 그리고 23장에서 공정한 게임의 승률이 n/T 라는 일차식이었던 것도 같은 현상이다 — 특성근 1 이 중복이었기 때문이다.

비동차 점화식

오른쪽에 f 와 무관한 항 g(n) 이 붙으면 비동차 선형 점화식이다.

f(n)=a1f(n1)++adf(nd)+g(n)

풀이는 다섯 걸음이다. ① g(n)0 으로 놓고 특성근을 구한다. ② 뿌리마다 항을 만들어 동차해를 적는다(상수는 아직 정하지 않는다). ③ 경계조건을 무시하고 전체 점화식을 만족하는 해 하나를 찾는다 — 이것을 특수해라 한다. ④ 둘을 더해 일반해를 만든다. ⑤ 경계조건을 넣어 상수를 정한다.

③이 유일하게 통찰이 필요한 자리이고, 규칙 몇 개면 대개 해결된다. g(n) 이 상수면 f(n)=c 부터, 안 되면 bn+c, 그다음 an2+bn+c 를 시도한다. g(n) 이 다항식이면 같은 차수의 다항식부터 차수를 올려 가며 시도한다. g(n) 이 지수 3n 이면 c3n 부터, 안 되면 (bn+c)3n 을 시도한다.

다섯 걸음의 순서와 각 걸음에서 왜 그렇게 하는지, 그리고 오른쪽에 하노이 변형을 실제로 따라간 계산이 있다
<다섯 걸음의 순서와 각 걸음에서 왜 그렇게 하는지, 그리고 오른쪽에 하노이 변형을 실제로 따라간 계산이 있다>[원본 보기]

예제 295

하노이 탑에서 원판을 옮기는 데 크기만큼 시간이 든다고 하자. 곧 n 번째 원판을 옮기는 데 n 초가 걸린다. 그러면 걸리는 시간이 f(1)=1, f(n)=2f(n1)+n 을 만족한다. 이것을 풀고 원래 하노이 탑과 견주어라.

증명

① 특성근. g(n)=n 을 지우면 f(n)=2f(n1) 이고 특성방정식이 x=2 다. ② 동차해. f(n)=c2n.

③ 특수해. g(n)=n 이 일차식이므로 f(n)=an+b 를 시도한다. 점화식에 넣으면

an+b=2(a(n1)+b)+n=2an2a+2b+n

이고 한쪽으로 모으면 0=(a+1)n+(b2a) 다. 이것이 모든 n 에 대해 성립해야 하므로 두 계수가 각각 0 이어야 한다. 곧 a=1 이고 b=2a=2 다. 특수해는 f(n)=n2 다.

④ 일반해. f(n)=c2nn2.

⑤ 상수 정하기. f(1)=1 이므로 2c12=1, 곧 c=2 다. 따라서

f(n)=22nn2=2n+1n2

답이 말이 되는가. 검산하자. f(1)=412=1 이고 f(2)=822=4 인데 점화식으로는 21+2=4 다. f(3)=1632=11 이고 점화식으로는 24+3=11 이다. 맞는다.

원래 하노이 탑의 답은 2n1 이었고 이번 답은 22nn2 다. 거의 정확히 두 배다. 한 번의 추가 작업을 1 에서 n 으로 늘렸는데 답은 두 배밖에 늘지 않았다. 이 관찰이 이 장 마지막 절의 주제다. 그리고 왜 특수해에 동차해를 더해도 되는가를 다시 확인해 두자 — 동차해는 오른쪽의 g(n) 없이 0 을 만드는 해이므로, 특수해에 더해도 g(n) 쪽 균형이 깨지지 않는다. 앞의 선형결합 정리가 그것을 보증한다.

두 길이 만나는 곳

이 장의 특성근과 18장의 생성함수는 같은 점화식을 다른 방법으로 푼다. 두 답이 늘 같았다. 우연이 아니다. 두 길이 사실 같은 다항식을 보고 있기 때문이다.

두 길을 피보나치로 나란히 걸으면 같은 α₁, α₂ 가 양쪽에서 나온다. 아래 상자가 그 이유다 — 두 다항식은 계수를 거꾸로 쓴 것이고 뿌리가 서로 역수다
<두 길을 피보나치로 나란히 걸으면 같은 α₁, α₂ 가 양쪽에서 나온다. 아래 상자가 그 이유다 — 두 다항식은 계수를 거꾸로 쓴 것이고 뿌리가 서로 역수다>[원본 보기]

예제 296

18장에서 선형 점화식의 생성함수가 F(x)=p(x)/q(x) 꼴이고 분모가 언제나

q(x)=1a1xa2x2adxd

임을 보였다. 이 장의 특성다항식은 χ(x)::=xda1xd1ad1xad 다. (가) q 의 뿌리와 χ 의 뿌리가 서로 역수임을 증명하라. (나) 그것으로 두 방법이 같은 답을 주는 이유를 설명하라. (다) 중복근에서도 맞아떨어짐을 확인하라.

증명

뼈대는 한 줄이다. q(1/α)αd 를 곱하면 χ(α) 가 된다.

(가) 증명. 먼저 q(0)=10 이므로 q 의 뿌리는 0 이 아니다. 그러므로 뿌리를 1/α 꼴로 적을 수 있다(α0). 이제

αdq(1α)=αd(1a1αa2α2adαd)=αda1αd1a2αd2ad=χ(α)

이다. αd0 이므로 q(1/α)=0 인 것과 χ(α)=0 인 것이 같다.q 의 뿌리 r 와 특성근 αα=1/r 의 관계다.

(나) 생성함수 길은 분모를 q(x)=i(1αix) 로 인수분해한다(1/αi 가 뿌리이므로 이렇게 적힌다). 부분분수로 쪼개면 조각이 ci/(1αix) 꼴이고 그 계수는

[xn]ci1αix=ciαin

이다. 그러므로 생성함수 길이 내놓는 답은 iciαin 이고, 이것은 특성근 길이 내놓는 "특성근의 거듭제곱의 선형결합"과 같은 모양이다. 두 길은 같은 수들을 다른 이름으로 부르고 있었을 뿐이다.

(다) q 에서 (1αx)k 번 들어 있는 것은 χ 에서 α 가 중복도 k 인 것과 같다(위 등식이 인수의 중복도를 보존하므로). 그러면 생성함수 쪽 조각이 c/(1αx)k 이고 그 계수가 (n+k1n)αn 인데, 이항계수가 n(k1) 차 다항식이므로 답이 αn,nαn,,nk1αn 의 선형결합이 된다. 특성근 쪽의 규칙과 정확히 같다.

답이 말이 되는가. 피보나치로 확인하자. 생성함수 쪽 분모는 1xx2 이고 그 뿌리는 (1±5)/2 다. 특성다항식은 x2x1 이고 뿌리는 (1±5)/2 다. 곱해 보면 1+521+52=514=1 이므로 서로 역수다. 맞는다.

그러면 어느 쪽을 쓸 것인가. 비동차항이 있으면 생성함수 쪽이 편하다g(n) 의 생성함수를 방정식에 그냥 더하면 되고 특수해를 찍는 통찰이 필요하지 않다. 동차이거나 자라는 속도만 궁금하면 특성근 쪽이 빠르다 — 가장 큰 뿌리 하나만 구하면 끝난다. 그리고 두 길을 모두 알아 두는 값어치는 한쪽에서 외워야 하는 규칙이 다른 쪽에서 증명되는 것이다. 중복근에 n 이 붙는 이유가 그 예다.

분할정복 점화식과 마스터 정리

병합정렬의 점화식은 선형이 아니다. T(n)정해진 개수의 바로 앞 항들의 선형결합이 아니라 T(n/2) 라는 훨씬 뒤의 항의 함수이기 때문이다. 이런 꼴을 분할정복 점화식이라 한다.

T(n)=i=1kaiT(bin)+g(n)

여기서 ai 는 양수, bi01 사이의 상수, g 는 음이 아닌 함수다. a1=2, b1=1/2, g(n)=n1 로 두면 병합정렬이다.

이런 점화식의 점근적인 해는 거의 언제나 다음 하나로 나온다. 정리(아크라·바지 공식). 위 점화식의 해는

T(n)=Θ(np(1+1ng(u)up+1du)),여기서 p 는 i=1kaibip=1 의 해

이다. |g(n)| 이 어떤 다항식으로 위에서 잡히기만 하면 쓸 수 있다(g(n)=n2logn 은 되고 g(n)=2n 은 안 된다). 증명은 이 문서의 범위를 넘으므로 하지 않는다. 대신 여기서 마스터 정리를 이 공식과 재귀 트리로 증명한다 — 알고리즘 문서의 /posts/fundamental/algorithm.html > 마스터 정리 가 결과만 쓰고 지나간 그 정리다.

예제 297

아크라·바지 공식으로 (가) 병합정렬 T(n)=2T(n/2)+n1, (나) 이진 탐색 T(n)=T(n/2)+1, (다) T(n)=2T(n/2)+89T(3n/4)+n2 를 풀어라.

풀이 보기

무엇을 묻는가. 각 경우에 p 를 찾고 적분을 계산하면 된다.

(가) 2(1/2)p=1 이므로 p=1 이다. 적분은

1nu1u2du=1n(1u1u2)du=[lnu+1u]1n=lnn+1n1

이므로 T(n)=Θ(n(1+lnn+1/n1))=Θ(nlnn)=Θ(nlogn) 이다(lnnlogn 은 상수배 차이이므로 Θ 안에서 같다). 대입·정리로 얻은 nlognn+1 과 맞는다.

(나) 1(1/2)p=1 이므로 p=0 이다. 적분은 1ndu/u=lnn 이므로 T(n)=Θ(n0(1+lnn))=Θ(logn) 이다. 알고리즘 문서의 /posts/fundamental/algorithm.html > 이진 탐색 이 주는 답과 같다.

(다) 2(1/2)p+89(3/4)p=1 을 풀어야 한다. p=2 를 넣으면 2/4+89916=12+12=1 이므로 p=2 다. 적분은 1nu2/u3du=lnn 이므로

T(n)=Θ(n2(1+lnn))=Θ(n2logn)

답이 말이 되는가. (다)는 부분문제가 둘이고 크기 비율도 다르고 개수도 정수가 아닌데 한 줄로 풀렸다. 아크라·바지 공식의 값어치가 여기 있다. 다만 aibip=1 이 닫힌 형태로 풀리지 않는 경우가 많고 그때는 수치적으로 p 를 구한다. (가)와 (나)에서 경계조건 T(1) 을 한 번도 쓰지 않았다는 점도 눈여겨보라 — 분할정복 점화식의 점근적인 해는 경계조건과 무관하다. 밑바닥 연산이 두 배 느려지면 전체가 최대 두 배 느려질 뿐이고 그 상수배는 Θ 가 감춘다.

마스터 정리를 증명한다

분할정복 점화식 가운데 컴퓨터과학에서 가장 자주 나오는 것은 부분문제가 하나 꼴인 경우다. 그 경우를 따로 정리한 것이 마스터 정리다.

정리(마스터 정리). T(n)=aT(n/b)+g(n) 이라 하자(a1, b>1). E::=logba 라 하면

막대의 길이가 그 층에서 하는 일의 양이다. 등비수열이므로 첫 항이 크면 첫 항이, 마지막 항이 크면 마지막 항이, 모두 같으면 층 수만큼이 답이 된다
<막대의 길이가 그 층에서 하는 일의 양이다. 등비수열이므로 첫 항이 크면 첫 항이, 마지막 항이 크면 마지막 항이, 모두 같으면 층 수만큼이 답이 된다>[원본 보기]

예제 298

마스터 정리를 증명하라. nb 의 거듭제곱인 경우만 다루어도 된다.

증명

뼈대는 이렇다. 재귀 트리의 층마다의 일을 더한다. 그 합이 등비수열이므로 세 경우는 "공비가 1 보다 작은가, 같은가, 큰가"에 대응한다.

층마다의 일. n=bL 이라 하면 L=logbn 이다. 대입·정리를 하면

T(n)=aT(n/b)+g(n)=a2T(n/b2)+ag(n/b)+g(n)==aLT(1)+j=0L1ajg(n/bj)

이 된다(한 걸음 더 대입하면 LL+1 로 바뀐 같은 모양이 나오므로 귀납법으로 확인된다). 여기서 aL=alogbn=nlogba=nE 이므로 잎에서 오는 항이 Θ(nE) 이고, 남은 것은 합을 재는 일이다.

경우 2를 먼저 본다(k=0). g(m)=Θ(mE) 이므로 각 항이

ajg(n/bj)=Θ(aj(n/bj)E)=Θ(nEajbjE)=Θ(nE)

다. 마지막 등호는 bE=blogba=a 이므로 aj/bjE=aj/aj=1 이기 때문이다. 층마다의 일이 같다. 층이 L=logbn 개이므로 합이 Θ(nElogn) 이고, 잎 항 Θ(nE) 는 그보다 작으므로 T(n)=Θ(nElogn) 이다. 일반적인 k 에서는 각 항이 Θ(nElogk(n/bj)) 이고 log(n/bj)=(Lj)logb 이므로 합이 Θ(nEj(Lj)k)=Θ(nELk+1) 이 되어 결론이 나온다.

경우 1(잎이 지배). g(m)=O(mEϵ) 이므로

ajg(n/bj)=O(aj(n/bj)Eϵ)=O(nEϵajbj(Eϵ))=O(nEϵbjϵ)

다. 공비가 bϵ>1 인 등비수열이므로 합은 마지막 항이 지배하고, 등비합 공식으로 합이 O(nEϵbLϵ)=O(nEϵnϵ)=O(nE) 다. 잎 항이 Θ(nE) 이므로 둘을 합쳐 T(n)=Θ(nE) 이다.

경우 3(뿌리가 지배). 조건 ag(n/b)cg(n) 을 되풀이 쓰면 ajg(n/bj)cjg(n) 이다. 그러므로

j=0L1ajg(n/bj)g(n)j=0cj=g(n)1c=O(g(n))

이고(c<1 이므로 등비급수가 수렴한다) j=0 항이 g(n) 이므로 합은 정확히 Θ(g(n)) 이다. 그리고 g(n)=Ω(nE+ϵ) 이므로 잎 항 Θ(nE)O(g(n)) 이다. 따라서 T(n)=Θ(g(n)) 이다.

답이 말이 되는가. 세 경우가 모두 등비수열의 어느 항이 가장 큰가로 갈렸다. 그것이 그림의 세 모양이다. 그리고 경우 3의 이상해 보이는 조건 ag(n/b)cg(n) 은 "g 가 층을 내려갈 때 충분히 빠르게 줄어든다"를 뜻한다 — 그 조건이 없으면 g 가 진동해서 등비 비교가 무너질 수 있다. 마지막으로 세 경우가 모든 g 를 덮지 않는다는 점을 기억하라. 예컨대 g(n)=nE/logn 은 어느 경우에도 들어가지 않는다. 그때는 아크라·바지 공식으로 돌아가면 된다.

예제 299

(가) 카라추바 곱셈의 T(n)=3T(n/2)+Θ(n) 을 풀어라. (나) 어떤 알고리즘의 시간이 T(n)=7T(n/2)+n2 이고 다른 알고리즘이 T(n)=aT(n/4)+n2 이다. 어떤 a 에 대해 뒤쪽이 점근적으로 더 빠른가?

풀이 보기

(가) a=3, b=2 이므로 E=log231.585 다. g(n)=Θ(n)=Θ(n1) 이고 1<E 이므로 어떤 ϵ 에 대해 g(n)=O(nEϵ) 이다. 경우 1이므로

T(n)=Θ(nlog23)=Θ(n1.585)

곱셈을 순진하게 하면 Θ(n2) 인데 부분문제를 넷에서 셋으로 줄여 지수를 내렸다.

(나) 앞쪽은 E=log272.807 이고 g(n)=n2 이며 2<E 이므로 경우 1이다. 곧 T(n)=Θ(nlog27) 다. 뒤쪽은 E=log4a 이고, 셋으로 갈린다. log4a<2a<16 이면 경우 3이라 Θ(n2), a=16 이면 경우 2라 Θ(n2logn), a>16 이면 경우 1이라 Θ(nlog4a) 다. 앞쪽보다 빠르려면

log4a<log27=log449a<49

이어야 한다(a16 인 경우는 지수가 2 이하이므로 자동으로 더 빠르다). 그러므로 a<49 일 때, 곧 a 가 정수라면 48 이하일 때 뒤쪽이 점근적으로 더 빠르다.

답이 말이 되는가. log27=log449 로 밑을 맞춘 것이 요령이다. log4a=log2a/log24=(log2a)/2 이므로 log4a<log27log2a<2log27=log249 와 같다. 그리고 (나)의 두 알고리즘은 실제로 행렬 곱셈에서 나온다 — 크기를 반으로 줄이며 부분문제를 일곱 개 만드는 것과 넷으로 줄이며 여러 개 만드는 것의 다툼이고, 부분문제 개수를 줄이는 경쟁이 지수를 어디까지 내리는가가 그 분야의 역사다.

점화식의 감각

추측하고 검증했고, 대입하고 정리했고, 뿌리를 구했고, 적분했다. 이제 물러서서 감각을 정리하자. 어떤 점화식이 어떤 답을 주는가.

점화식규모
하노이 탑 Tn=2Tn1+12n1Θ(2n)
하노이 변형 Tn=2Tn1+n2n+1n2Θ(2n)
피보나치 Tn=Tn1+Tn2(ϕnψn)/5Θ(ϕn), ϕ=1.618
병합정렬 Tn=2Tn/2+n1nlognn+1Θ(nlogn)
하노이와 병합정렬의 점화식이 비슷하게 생겼는데 해는 10¹⁹ 대 321 이다. 부분문제를 얼마나 줄이는지가 전부를 정한다
<하노이와 병합정렬의 점화식이 비슷하게 생겼는데 해는 10¹⁹ 대 321 이다. 부분문제를 얼마나 줄이는지가 전부를 정한다>[원본 보기]

표에서 읽어야 할 것이 셋이다. 첫째, 하노이와 병합정렬의 점화식은 비슷하게 생겼는데 해가 완전히 다르다. n=64 에서 하노이는 1.8×1019 걸음이고 병합정렬은 321 번 비교다. 둘째, 두 점화식은 각각 하나의 강점과 하나의 약점을 갖는다. 하노이는 부분문제가 n1거의 줄지 않는 대신 추가 작업이 1 뿐이다. 병합정렬은 부분문제가 n/2절반이 되는 대신 추가 작업이 n1 이다. 그런데 병합정렬이 비교할 수 없을 만큼 빠르다. 셋째, 하노이와 하노이 변형을 견주면 추가 작업을 1 에서 n 으로 늘려도 답이 두 배만 늘었다.

결론은 하나다. 부분문제의 크기와 개수가 지배하고, 층마다의 추가 작업은 상수배만 바꾼다.

위 줄은 지수이고 아래 줄은 다항식이다. 가로로 옮기면 지수의 밑이나 지수 자리가 바뀌지만, 추가 작업을 늘리는 것은 상수배만 바꾼다
<위 줄은 지수이고 아래 줄은 다항식이다. 가로로 옮기면 지수의 밑이나 지수 자리가 바뀌지만, 추가 작업을 늘리는 것은 상수배만 바꾼다>[원본 보기]

예제 300

(가) 하노이 탑에서 부분문제를 둘에서 셋으로 늘리면(Tn=3Tn1+1) 답이 어떻게 바뀌는가. (나) 병합정렬에서 부분문제를 a 개로 늘리면(Tn=aTn/2+n1) 답이 어떻게 바뀌는가. (다) 두 답을 견주어 감각을 한 문장으로 적어라.

증명

(가) 특성근이 2 에서 3 으로 바뀐다. 비동차항이 상수이므로 특수해를 f(n)=c 로 찍으면 c=3c+1 에서 c=1/2 이고, 일반해가 Tn=A3n1/2 이다. T1=1 이면 3A=3/2 이므로 A=1/2 이고 Tn=(3n1)/2 다. 규모가 Θ(2n) 에서 Θ(3n) 으로 지수의 밑이 바뀌었다.

(나) 아크라·바지로 a(1/2)p=1 이므로 p=log2a 다. 적분은 1n(u1)up1du 이고 세 경우로 갈린다.

Tn={Θ(n)(a<2)Θ(nlogn)(a=2)Θ(nlog2a)(a>2)

a<2 이면 p<1 이라 적분이 Θ(n1p) 으로 자라고 np 를 곱하면 Θ(n) 이다. a=2 는 앞에서 계산했다. a>2 이면 p>1 이라 적분이 상수로 수렴하므로 Θ(np) 만 남는다.

(다) (가)에서는 밑이 바뀌었고 (나)에서는 답의 모양 자체가 셋으로 갈렸다. a1.99 에서 2.01 로 조금 움직이는 것만으로 Θ(n) 에서 Θ(nlogn) 을 거쳐 Θ(n1.007) 로 넘어간다. 한 문장으로 적으면 "재귀 절차의 성능은 부분문제의 크기와 개수가 정하고, 한 번의 추가 작업이나 밑바닥의 비용은 상수배만 바꾼다" 다.

답이 말이 되는가. 실무의 조언으로 옮기면 이렇다. 재귀 알고리즘을 빠르게 하려면 층마다의 일을 줄이려 애쓰기보다 부분문제를 더 작게 만들거나 개수를 줄일 길을 찾아라. 카라추바 곱셈이 부분문제를 넷에서 셋으로 줄여 지수를 2 에서 1.585 로 내린 것이 그 표본이고, 알고리즘 문서의 /posts/fundamental/algorithm.html > 분할정복 이 다루는 기법들이 대개 이 자리를 공격한다.

이 장에서 새로 나온 것

기호·용어
추측하고 검증하기앞에서부터 항을 계산해 패턴을 찾고 귀납법으로 증명한다. 답이 단순할 때 가장 빠르다
상한만 증명하는 함정Tn2n 은 귀납법으로 증명되지 않는다. 더 센 명제 Tn2n1 이 통과한다
대입하고 정리하기뒤에서부터 펼쳐 식의 패턴을 찾고, 한 번 더 대입해 검증하고, 아는 항에 닿게 변수를 정한다
재귀 트리층마다의 일을 더하고 층 수를 곱한다. 어느 층이 지배하는지가 눈에 보인다
병합정렬의 점화식T1=0, Tn=2Tn/2+n1 이고 해가 nlognn+1
동차 선형 점화식f(n)=a1f(n1)++adf(nd). 차수가 d
특성방정식xd=a1xd1++ad. 계수를 그대로 옮겨 적는다. 그 뿌리가 특성근
선형결합 정리해 둘의 선형결합도 해다. 그래서 경계조건을 맞출 자유가 생긴다
중복근 규칙중복도 k 인 뿌리 rrn,nrn,,nk1rn 을 낳는다
황금비 ϕ(1+5)/2=1.618. fn=ϕn/5+o(1)
비동차 선형 점화식오른쪽에 g(n) 이 붙는다. 동차해 + 특수해 = 일반해, 그다음 경계조건
특수해 찍는 법g 가 다항식이면 같은 차수부터 올려 가며, 지수 cn 이면 acn 부터 시도한다
두 다항식의 관계q(x)=1a1xadxd 의 뿌리와 특성근은 서로 역수다. αdq(1/α)=χ(α)
두 길의 선택비동차항이 있으면 생성함수가 편하고, 동차이거나 규모만 알면 되면 특성근이 빠르다
분할정복 점화식T(n)=aiT(bin)+g(n). bi01 사이의 상수
아크라·바지 공식T(n)=Θ(np(1+1ng(u)up1du)), aibip=1
마스터 정리 E=logbag=O(nEϵ) 이면 Θ(nE), Θ(nElogkn) 이면 Θ(nElogk+1n), Ω(nE+ϵ) 이고 규칙성 조건이면 Θ(g)
규칙성 조건ag(n/b)cg(n), c<1. g 가 층을 내려갈 때 충분히 빠르게 줄어든다
경계조건과 바닥·천장분할정복 점화식의 점근적인 해는 둘 다에 무관하다. 상수배만 바뀐다
점화식의 감각부분문제의 크기와 개수가 지배한다. 가산적으로 줄면 지수, 배수적으로 줄면 다항식
Tn=aTn/2+n1a<2Θ(n), a=2Θ(nlogn), a>2Θ(nlog2a)

챙겨 갈 것은 넷이다.

여기서 이 문서의 본문이 끝난다. 22장에서 평균에서 벗어나는 정도를 재고, 23장에서 무작위로 걷는 과정을 따라가고, 24장에서 재귀를 닫힌 형태로 옮겼다. 세 장이 함께 하는 일은 하나였다 — "대충 이런 일이 일어난다"를 "정확히 이만큼 일어난다"로 바꾸는 것. 그 작업의 도구는 앞의 스물한 장에서 하나씩 쌓아 온 것들이고, 이 문서를 처음부터 읽어 온 사람은 그 도구가 어디서 왔는지를 모두 알고 있다. 증명이 무엇인지에서 시작해 여기까지 왔다.

더 공부할 것

이 문서는 원서 22개 장의 골격까지다. 여기서 갈라지는 길을 정리해 둔다. 각 분야가 이 문서의 어느 부분을 확장한 것인지 함께 적었다.

이 사이트 안에서 이어지는 문서

학부·대학원 과정

더 나아가는 주제

공부 방식에 대한 조언