이 문서는 (책) CONCRETE MATHEMATICS(구체수학) 2장.합 - 2.합과 점화식을 공부한 노트입니다.

Sn=nk=0ak

위의 식은 다음과 같다.

Sn=a0+a1+a2+...+an

한편으로는 다음 점화식과 같다고도 볼 수 있다.

S0=a0;Sn=Sn1+an,forn>0

예제

다음과 같은 식이 있다고 하자.

  • an은 n을 몇 배 하고 어떤 상수를 더한 것이다.

그렇다면 다음과 같이 점화식을 꾸밀 수 있을 것이다.

R0=α;Rn=Rn1+β+γn,forn>0

python 으로 표현하자면 다음과 같을 것이다.

def R(n):
    if n == 0:
        return alpha
    return R(n-1) + beta + gamma * n

# alpha, beta, gamma의 값은 아직 모른다

작은 값들부터 넣어보며 생각해보면 다음을 알 수 있다.

R0=α;R1=R0+β+γ=α+β+γR2=R1+β+γ2=α+2β+3γ...

이를 다음과 같이 일반해로 유도해내자.

Rn=A(n)α+B(n)β+C(n)γ

그리고 다음과 같은 경우들을 생각해보자.

R_n = 1 인 경우

Rn=1 이라면

R0=A(0)α+B(0)β+C(0)γ=α=1R1=A(1)α+B(1)β+C(1)γ=R0+(β+γ1)=α+β+γ=1R2=A(2)α+B(2)β+C(2)γ=R1+(β+γ2)=(α+β+γ)+(β+γ2)=α+2β+3γ=1α=1α+β+γ=0α+2β+3γ=0} 이므로α=1,β=0,γ=0Rn=A(n)α+B(n)β+C(n)=A(n)1+B(n)0+C(n)0A(n)=1Rn=1
  • 잘 생각해 보면 이 점화식대로라면, Rn의 값이 무엇이건 간에 A(n)=1 이라는 것을 알 수 있다.
    • α는 초항이므로, 합을 몇 번이고 반복해도 딱 한 번만 더하기 때문이다.
  • B(n),C(n)0과 곱하므로 지금 시점에서는 알아낼 방법이 없다.

R_n = n 인 경우

Rn=n 이라면

R0=A(0)α+B(0)β+C(0)γ=α=0R1=A(1)α+B(1)β+C(1)γ=α+β+γ=1R2=A(2)α+B(2)β+C(2)γ=α+2β+3γ=2α=0,β=1,γ=0Rn=A(n)α+B(n)β+C(n)γ=A(n)0+B(n)1+C(n)0B(n)=nRn=n
  • 잘 생각해 보면 이 점화식대로라면, Rn의 값이 무엇이건 간에 B(n)=n 라는 것을 알 수 있다.
    • 더하는 항의 수 만큼 β가 증가하기 때문이다.
  • A(n),C(n)0과 곱하므로 지금 시점에서는 알아낼 방법이 없다.

R_n = n^2 인 경우

Rn=n2 이라면

R0=A(0)α+B(0)β+C(0)γ=α=0R1=A(1)α+B(1)β+C(1)γ=α+β+γ=1R2=A(2)α+B(2)β+C(2)γ=α+2β+3γ=4α=0,β=1,γ=2B(n)=nRn=α+nβ+C(n)γRn=n2=A(n)α+B(n)β+C(n)γ=B(n)+2C(n)n2=B(n)+2C(n)=n+2C(n)n2+n=2C(n)C(n)=n2+n2
  • 잘 생각해 보면 이 점화식대로라면, Rn의 값이 무엇이건 간에 C(n)=n2+n2 라는 것을 알 수 있다.
    • n(n+1)2γ=1γ+2γ+...+nγ 이기 때문이다.
  • A(n)0과 곱하므로 지금 시점에서는 알아낼 방법이 없다.

응용

다음과 같은 합이 있다고 하자.

nk=0(a+bk)

python으로는 다음과 같을 것이다.

def sigma(n):
    sum = 0
    for k in range(0, n+1):
        sum += a + b*k
    return sum

위 합의 점화식은 다음과 같다.

S0=a;Sn=Sn1+a+bn,forn>0

python으로는 다음과 같을 것이다.

def S(n):
    if n == 0:
        return a
    return S(n-1) + a + (b*n)

그렇다면 (2.7)과 같은 방식으로, 다음과 같이 점화식을 꾸밀 수 있다.

R0=α;Rn=Rn1+β+γn,forn>0=Rn1+a+bn

모양이 같으므로, 어렵지 않게 다음의 사실을 알아낼 수 있다.

a=αS0=R0a=βb=γ

이를 A(n)α+B(n)β+C(n)γ 에 대입해보면 다음과 같이 될 것이다.

aA(n)+aB(n)+bC(n)=a1+an+bn2+n2=a(n+1)+b(n+1)n2Rn=a(n+1)+b(n+1)n2

검증

검증해보고 싶다.

nk=0(a+bk)

이를 풀어 쓰면 구조를 이해하기 쉬울 것 같다.

nk=0(a+7k)=(a+b0)+(a+b1)+(a+b2)+...+(a+bn)n+10 ~ n 까지 모두 n + 1 개의 항이 있으므로=a(n+1)+b(0+1+2+...+n)=a(n+1)+b(n+1)(0+n)2=a(n+1)+b(n+1)n2

일반해와 똑같은 모양이 나왔다.

예제: 하노이의 탑

하노이의 탑 점화식은 다음과 같다.

T0=0;Tn=2Tn1+1,forn>0.
def T(n):
    if n == 0:
        return 0
    return 2*T(n-1) + 1

양변을 2n으로 나누면 (2.6)과 같은 모양이 된다.

T02n=0;Tn2n=2Tn12n+12n,forn>0.Sn=Tn2n이라 하자.Sn=Tn2n=Sn1+2n,forn>0.
def S(n):
    if n == 0:
        return 0
    return S(n-1) + 2**(-n)

def T(n):
    return S(n) * (2**n)

그렇다면 2n씩 더해가는 것이므로 다음과 같이 표현할 수 있다.

Sn=nk=12k=(12)1+(12)2+...+(12)n
def S(n):
    sum = 0
    for k in range(1, n+1):
        sum += 2**(-k)
    return sum

def T(n):
    return S(n) * (2**n)

고등학교 때 배운 등비수열의 합 공식 Sn=S1(rn1)r1 을 적용해 보면

Sn=nk=12k=12((12)n1)121=(12)n+1Tn2n=(12)n+1Tn=1+2n

따라서 하노이의 탑에 n개의 원판이 있을 때, 이를 옮기는 최소한의 횟수는 2n1 임을 알 수 있다.

# 최적화 완료
def T(n):
    return 2**n - 1

일반화

위의 풀이법을 사용하면 다음 형태의 점화식을 일반화할 수 있을 것 같다.

anTn=bnTn1+cn

양 변에 sn을 곱하자. (단, snbn=sn1an1.)

snanTn=snbnTn1+sncn=sn1an1Tn1+sncnSn=(Sn1)+sncn(Sn=snanTn이라 하자)=(Sn2+sn1cn1)+sncn()=(Sn3+sn2cn2+sn1cn1)+sncn()...=S0+s1c1+s2c2+...+sncn=s0a0T0+nk=1skck=s1b1T0+nk=1skck ,Sn=snanTnTn=1snanSn=1snan(s1b1T0+nk=1skck)

검증

위의 일반해를 하노이의 탑으로 검증해 보자.

하노이의 탑 점화식은 다음과 같았다.

T0=0;Tn=2Tn1+1,forn>0.

일반화에 사용한 형태의 점화식이 다음과 같았으므로,

anTn=bnTn1+cn

하노이의 탑에서 각 변수의 값은 다음과 같다.

  • an=1  
  • bn=2  
  • cn=1  
  • T0=0  

따라서 일반해는 다음과 같다.

snbn=sn1an1sn2=sn1sn=2nTn=1snan(s1b1T0+nk=1skck)=1snan(nk=1skck)=1sn(nk=1sk)=2nnk=12k=2n12(1(12)n)112=2n2n12n=2n1

예제: quick-sort 퀵 소트

퀵 소트의 점화식은 다음과 같다.

C0=0;C1=0;Cn=n+1+2nn1k=0Ck,forn>1.Cn=n개 항목을 퀵 소트로 정렬할 때 비교 횟수의 평균

점화식을 정리해 보자.

일단 양 변에 n을 곱해서, 분모의 n을 제거한다.

Cn=n+1+2nn1k=0Ck,forn>1.nCn=n2+n+2n1k=0Ck,forn>1.nn1로 대체한다.(n1)Cn1=(n1)2+(n1)+2n2k=0Ck,forn1>1.

위의 식에서 아래 식을 빼보자.

nCn=n2+n+2n1k=0Ck(n1)Cn1=(n1)2+(n1)+2n2k=0CknCn(n1)Cn1=2n+2Cn1

즉, 다음과 같다.

nCn(n1)Cn1=2n+2Cn1,forn>2.nCn=2n+2Cn1+(n1)Cn1nCn=2n+(n+1)Cn1

그리고 점화식은 다음과 같이 정리된다.

C0=0;C1=0;C2=3;nCn=(n+1)Cn1+2n,forn>2.

(2.9)를 참고해 꾸며보자.

anTn=bnTn1+cnnCn=(n+1)Cn1+2nan=nbn=n+1c1=0C1=0+0c2=62C2=3C1+c2cn=2nsnbn=sn1an1sn=sn1an1bn=(sn2an2bn1)an1bn=a1a2...an1b2b3...bn=12...n134...(n1)n(n+1)=12n(n+1)

(2.10)을 적용하자.

Tn=1snan(s1b1T0+nk=1skck)Cn=112n(n+1)n(s1b1C0+nk=1skck)=112n(n+1)n(nk=1skck)=n+12nk=1skck=n+12nk=12k(k+1)ck=(n+1)nk=11k(k+1)ck=(n+1)(1120+1236+nk=31k(k+1)ck)=(n+1)(0+1+nk=31k(k+1)2k)=2(n+1)(12+nk=31k(k+1)k)=2(n+1)(12+nk=31k+1)=2(n+1)(12+nk=11k+111+111+2)=2(n+1)(nk=11k+113)=2(n+1)nk=11k+12(n+1)3,forn>1.

퀵 소트 점화식의 닫힌 형식

위에서 얻은 퀵 소트 점화식의 해는 다음과 같았다.

Cn=2(n+1)nk=11k+12(n+1)3,forn>1.

해를 잘 살펴보면 조화수(Harmonic number)가 식의 중간에 들어가 있음을 알 수 있다.

Hn=1+12+...+1n=nk=11k

퀵 소트 점화식의 해를 조화수를 사용해 정리해 보자.

nk=11k+1 만 떼어서 작업하는 쪽이 편할 것 같다.

nk=11k+1=n+1k=21k=n+1k=11k11=nk=11k11+1n+1=nk=11knn+1=Hnnn+1

간단하게 된 합을 적용해 보자.

Cn=2(n+1)nk=11k+12(n+1)3,forn>1.=2(n+1)(Hnnn+1)2(n+1)3=2(n+1)Hn2(n+1)nn+12(n+1)3=2(n+1)Hn2n2(n+1)3=2(n+1)Hn2n2n323=2(n+1)Hn8n323,forn>1.

Links