개요
본문은 아래의 포스트와 내용이 이어지며, 다음 포스트의 내용을 부가적인 설명 없이 서술한다.
이번에는 생성함수를 어떻게 실제 PS 문제에 적용할 수 있는지 살펴본다.
다변수 생성함수
이항계수의 생성함수
이항계수 (kn)의 OGF를 유도하자.
먼저, 이항계수와 같은 값을 가지는 함수 f(n,k)를 귀납적으로 정의하자. 다음은 이항계수의 일반적인 귀납적 정의이다:
다음을 만족하는 함수 f:Z≥02→R은 모든 음이 아닌 정수 n, k에 대하여, f(n,k)=(kn)를 만족한다.
-
모든 n≥0에 대하여, f(n,0)=1.
-
모든 n≥1에 대하여, f(0,n)=0.
-
모든 n≥1, k≥1에 대하여, f(n,k)=f(n−1,k)+f(n−1,k−1).
이변수 함수 f(n,k)의 OGF F(x,y)는 다음과 같이 정의하는 것이 자연스러울 것이다:
F(x,y)=n=0∑∞k=0∑∞f(n,k)xnyk
위의 식에서 점화식 f(n,k)=f(n−1,k)+f(n−1,k−1)를 적용하면, 다음과 같은 식을 얻는다:
n=1∑∞k=1∑∞f(n,k)xnyk=xn=1∑∞k=1∑∞f(n−1,k)xn−1yk+xyn=1∑∞f(n−1,k−1)xn−1yk−1
이를 F(x,y) 정의에 대입하자.
n=1∑∞k=1∑∞f(n,k)xnyk=F(x,y)−n=1∑∞f(n,0)xn−k=1∑∞f(0,k)yk−f(0,0)=F(x,y)−n=0∑∞xn
xn=1∑∞k=1∑∞f(n−1,k)xn−1yk+xyn=1∑∞f(n−1,k−1)xn−1yk−1
=x(F(x,y)−n=0∑∞f(n,0)xn)+xyF(x,y)=x(F(x,y)−n=0∑∞xn)+xyF(x,y)
따라서, F(x,y)에 관한 중요한 식 하나를 알아낼 수 있다:
F(x,y)−n=0∑∞xn=x(F(x,y)−n=0∑∞xn)+xyF(x,y)
F(x,y)−1−x1=x(F(x,y)−1−x1)+xyF(x,y)
F(x,y)=1−x−xy1
정리하면, 이항계수 (kn)의 OGF는 1−x−xy1이다.
여기서, 식을 약간 조작하면 어렵지 않게 F(x,y)를 무한 급수 형태로 표현할 수 있다.
F(x,y)=1−x−xy1=1−(x(y+1))1=n=0∑∞(x(y+1))n=n=0∑∞xn(y+1)n
이로부터 다음과 같은 정리를 증명할 수 있다. 이항 정리를 증명하는 새로운 방법을 찾았다고 말할 수 있다.
이항 정리의 새로운 증명
모든 양의 정수 n에 대하여, 다음은 일변수 실수 항등식이다.
(y+1)n=k=0∑n(kn)yk=(0n)y0+(1n)y1+⋯+(n−1n)yn−1+(nn)yn
F(x,y)에서 xn의 계수를 살펴보자.
F(x,y)=k=0∑∞(y+1)kxk 이므로, xn의 계수는 (y+1)n이다.
또한, 정의에 따르면 F(x,y)=n=0∑∞k=0∑∞f(n,k)xnyk=n=0∑∞(k=0∑∞f(n,k)yk)xn 이므로, xn의 계수는 k=0∑∞f(n,k)yk=k=0∑∞(kn)yk 와도 같다.
따라서, 주어진 식은 항상 성립한다.
이제, F(x,y)를 다음과 같이 변형해보자:
F(x,y)=1−x−xy1=(1−x)−xy1=1−1−xx⋅y1−x1
=1−x1(1+1−xx⋅y+(1−xx)2⋅y2+⋯)=1−x1n=0∑∞(1−xx)nyn
여기서, F(x,y)의 yn의 계수가 (1−x)n+1xn이라는 사실로부터 다음 정리를 증명할 수 있다.
이항계수의 OGF의 전개식
임의의 x∈R와 k∈Z≥0에 대하여 다음이 성립한다.
n=0∑∞(kn)xn=(1−x)k+1xk
이 정리는 다음과 같이 해석할 수 있다. (1−x)k+11을 다항식의 형태로 전개하면 xn−k의 계수가 (kn)와 일치한다는 사실을 함의한다.
따라서, (1−x)k1의 다항 전개의 xn의 계수는 (k−1n+k−1)이다. 이는 추후에, 고정된 k에 대하여 (kn)의 합에 관한 식을 서술해야 할 때 유용하게 사용할 것이다.
카탈랑 수열의 닫힌 형태
이전 포스트에서 카탈랑 수열 {cn}n∈Z≥0의 OGF C(x)가 다음과 같음을 보였다:
C(x)=2x1−1−4x
하지만, C(x)는 카탈랑 수 cn의 닫힌 형태(Closed form expression)를 직접적으로 알려주지는 않는다. 이번에는 카탈랑 수의 닫힌 형태를 유도하고자 한다.
위에서 살펴본 이항계수 (kn)는 복소수 범위까지 확장할 수 있다. 다음 정리는 그러한 확장 방법을 알려준다.
알려진 정의 (일반화된 이항계수)
복소수 r∈C와 음이 아닌 정수 n∈Z≥0에 대하여, (확장)이항계수 (nr)을 다음과 같이 정의한다:
(nr)=n!r(r−1)⋯(r−(n−1))
이제부터 언급하는 이항계수는 모두 일반화된 이항계수를 의미한다. 따라서, (kn)에서 n가 음이 아닌 정수일 필요성이 사라졌음에 유의하자.
보조정리
임의의 복소수 r∈C에 대하여 다음이 성립한다.
(1+x)r=n=0∑∞(nr)xn
엄밀하지는 않지만 가장 직관적인 증명은 이러하다. (1+x)r의 다항 전개가 존재한다고 가정할 때, 양변의 xn의 계수가 서로 같은지 살펴보자.
먼저, 좌변을 n번 미분한 식의 상수항은 다음과 같다:
dxndn(1+x)rx=0=r(r−1)⋯(r−(n−1))=n!(nr)
우변을 n번 미분한 식의 상수항은 다음과 같다:
dxndnn=0∑∞(nr)xnx=0=n!(nr)
따라서, 주어진 식은 항등식이다.
이제, 보조정리를 이용하면, 1−4x를 다음과 같이 표현할 수 있다:
1−4x=(1−4x)21=n=0∑∞(n21)(−4x)n
=n=0∑∞(21×2−1×2−3×⋯×2−(2n−3))⋅n!1×(−4)nxn
=1+n=1∑∞2n(−1)n−1(1×3×⋯×(2n−3))⋅n!(−4)nxn
=1+n=1∑∞2n−1⋅(n−1)!−2n⋅(2n−2)!⋅n!1xn
=1+n=1∑∞−n2⋅(n−1)!(n−1)!(2n−2)!xn=1+n=1∑∞−n2(n−12n−2)xn
즉, C(x)는 다음과 같이 무한 급수 형태로 나타낼 수 있다:
C(x)=2x1−1−4x=2x1(1−(1+n=1∑∞−n2(n−12n−2)xn))=n=1∑∞n(n−12n−2)xn−1=n=0∑∞n+11(n2n)xn
정리하면, 아주 긴 여정 끝에 우리는 카탈랑 수의 닫힌 형태가 cn=n+11(n2n)임을 알아내었다. 생성함수로 수열의 새로운 성질을 알아낼 수 있다니, 놀랍지 않은가!
순열과 관련된 생성함수
어떤 순열 p=(p1,⋯,pn)가 주어졌다면, 정점 i에서 pi로 가는 간선으로 이루어진 그래프는 여러 개의 Disjoint한 사이클이 된다는 사실은 잘 알려져 있다. 또한, 역으로, Disjoint한 사이클을 하나의 순열 p로 표현할 수도 있다.
이번에는 사이클의 개수를 세는 문제를 순열로 해석한 후, 생성함수를 적용하여 해결하는 방법에 대하여 알아본다.
k개의 사이클로 이루어진 길이 n의 순열의 개수 세기
그러한 순열의 개수를 부호 없는 제1종 스털링 수라고 부른다.

그림 1: $n=4$, $k=2$일 때 가능한 모든 그래프
$n=4$, $k=2$일 때의 부호 없는 제1종 스털링 수는 $11$이다.
먼저, 하나의 사이클로 이루어진 길이 n의 순열의 개수를 cn이라고 하자. 어렵지 않게, cn=(n−1)!임을 보일 수 있다.
이제, 수열 {cn}n∈Z≥0의 EGF를 C(x)라고 하자. 정의에 의하여 다음이 성립함에 유의하자:
C(x)=n=0∑∞n!cnxn
다시 원래 문제로 돌아오자. k를 고정하고, n가 주어졌을 때 그러한 순열의 개수를 fn라고 하자. n<k에 대해서는 필요에 따라 무시해도 좋고, fn=0으로 생각해도 무방하다.
수열 f의 EGF를 F(x)라고 하자. 이제 우리는 F(x)=k!1C(x)k임을 보임으로써 문제를 해결할 것이다.
먼저, n개의 정점으로 이루어진 k개의 사이클을 생각하자. 각각의 사이클에 1부터 k까지 번호를 부여하고, i번 사이클의 크기를 ai라고 하자. 자명하게도, a1+⋯+ak=i=1∑kai=n라야 한다.
ai개의 정점으로 하나의 사이클을 만드는 방법은 총 cai가지가 존재한다. 또한, 독립적으로 번호가 부여된 k개의 사이클을 하나의 순열로 합치는 방법은 총 a1!a2!⋯ak!n!가지가 있다.
따라서, 다음 식을 얻는다:
fn=k!n!a1+a2+⋯+ak=n∑a1!a2!⋯ak!ca1ca2⋯cak
원래 문제에서는 사이클의 순서가 중요하지 않으므로, k!로 나누어주어야 함에 유의한다.
이전 포스트에서 "7. 분할" 성질에 따르면, a1+a2+⋯+ak=n∑a1!a2!⋯ak!ca1ca2⋯cak는 C(x)k의 xn의 계수와 일치한다.
F(x)는 EGF이므로, 정리하면 F(x)=k!1C(x)k이다.
만약에 k와 N가 주어졌을 때, n=1,2,⋯,N에서 답을 모두 구해야 한다고 하자. F(x)=k!1C(x)k를 전개하면 문제를 쉽게 해결할 수 있는데
- C(x)의 처음 O(N)개의 계수를 O(N)에 계산할 수 있고
- C(x)k=eklnC(x)임을 이용하면, C(x)k의 처음 O(N)개의 계수를 O(NlgN)에 계산할 수 있으므로
전체 문제를 O(NlgN)이라는 효율적인 시간 복잡도로 해결할 수 있다.
사이클의 길이가 집합 S의 원소인 길이 n의 순열의 개수 세기
이전에는 사이클의 개수에 제약이 있었다면, 이번에는 사이클의 길이에 제약이 생겼다.
유사하게 하나의 사이클로 이루어진 길이 n의 순열의 개수를 cn이라고 하자. 다만, n∈S라면, cn=0로 정의하자. 이로부터 우리는 사이클의 길이가 집합 S의 원소임을 보장할 수 있다.
동일한 논리를 적용하여, F(x)=k!1C(x)k를 얻자. 모든 k=1,2,⋯,n에 대하여 각각 답을 계산한 뒤 더하면, 이것이 우리가 원하는 답이 된다.
즉, k=1∑nk!1C(x)k의 xn의 계수를 계산하면 된다. 이 값은 k=0∑∞k!1C(x)k=eC(x)의 xn의 계수와 동일하다.
따라서, 집합 S와 n가 주어졌을 때, 문제의 답을 O(∣S∣+nlgn)에 효율적으로 알아낼 수 있다.
길이 n의 순열의 사이클의 개수의 기댓값
길이 n의 모든 순열이 생성하는 사이클의 개수의 합을 gn라고 하자. 이 값을 n!으로 나누면 우리가 원하는 답이 된다.
수열 g의 EGF를 G(x)라고 하자. 편의를 위하여, 다항 전개가 가능한 식 f(x)에 대하여, f(x)의 xn의 계수를 [xn]f(x)라고 표기하자. 이전과 동일한 논리를 사용하면, 다음 등식을 얻는다:
[xn]G(x)=[xn]k=1∑nk⋅k!C(x)k=[xn]k=1∑∞(k−1)!1C(x)k
=[xn]C(x)(k=0∑∞k!C(x)k)=[xn]C(x)eC(x)
cn=(n−1)!라는 사실로부터, 다음을 알 수 있다:
C(x)=k=1∑∞k!ckxk=k=1∑∞k!(k−1)!xk=k=1∑∞kxk=−ln(1−x)
따라서, C(x)eC(x)=−1−xln(1−x)이다.
ln(1+x)의 매클로린 급수는 x−2x2+3x3−4x4+⋯이므로, n≥1라면 [xn](−ln(1−x))=n1이다.
고로, "8. 구간 합" 성질을 적용하면 다음을 알 수 있다:
[xn]1−x−ln(1−x)=1+21+⋯+n1=k=1∑nk1
따라서, n!gn=[xn]G(x)=[xn]1−x−ln(1−x)=k=1∑nk1이다.
정리하면, 길이 n의 순열이 생성하는 사이클의 개수의 기댓값은 n번째 조화수 1+21+⋯+n1이다.
결론
이항계수의 이변수 생성함수를 유도하고, 이항계수 자체를 복소수 범위까지 확장시켰다. 이 과정에서 이항 정리의 새로운 증명을 알아보았고, (1−x)k1의 다항 전개가 이항계수 (k−1n+k−1)와 밀접한 연관이 있음을 관찰하였다.
이항계수의 생성함수는 카탈랑 수의 닫힌 형태를 유도하는 데에도 큰 도움을 주었다. 보조정리를 이용하여, 카탈랑 수열의 생성함수를 이항계수의 전개 형태로 변형하였고, 이로부터 닫힌 형태를 직접적으로 밝힐 수 있다.
순열과 관련된 조합론 문제는 생성함수 EGF를 이용하면 유용하다는 점을 다양한 예시를 통하여 경험하였다. 일반적인 DP로는 O(n2)이나 혹은 다항 시간으로 해결하기 어려운 문제를, 생성함수를 이용하면 O(nlgn)의 빠른 시간 복잡도로 해결할 수 있다.
다음 포스트에서는, 일반적인 그래프에 관한 조합론 문제에 어떻게 생성함수를 적용할 수 있는지와, 미분 방정식 테크닉에 관하여 다룰 것이다.