개요
Merge-insertion sort 라는 정렬 알고리즘을 찾아보려고 원본 논문을 봤는데, (or 포드존슨 Ford-Johnson)
알고리즘에서 사용되는 수열에 대한 closed form 식을 설명없이 적어만 놨다...(빨간색으로 표시한 부분)
일단 수열의 명칭이 원문에서 언급되진 않았으나 동일한 형태의 수열이 Jacobsthal sequence라는 이름으로 존재한다.
그래서 이 수열을 직접 점화식에서부터 유도해보려고 한다.
수열의 점화식은 아래와 같다.
피보나치 수열 과 비슷한 형태.
이 점화식을 가지고 closed form을 유도해볼 건데,
방법은 이것저것 있으나 생성함수로 일단 유도해보자.
(사실 Characteristic equation을 사용하면 쉽게 풀 수 있지만, 배운다는 생각으로…)
Generating function
일단 생성함수가 무엇인지 설명하자면,
일단 수열이나 경우의 수 등의 각 항을 계수로 하는 다항식을 생각하는 것이다.
예를 들어,
1~6까지 적힌 주사위를 던져서 나올 수 있는 경우의 수를 식으로 나타내려면 이렇게 나타낼 수 있다.
각 지수는 주사위의 눈을 나타내고, 각 계수는 그 눈이 나올 경우의 수를 나타낸다.
생성함수는 이렇게 각 항을 계수로 하는 다항식을 생각하는 것이다.
수열도 마찬가지로 각 항을 계수로 생성함수를 정의할 수 있다.
여기서 특정 지수의 계수를 골라낼 수 있다면, 곧바로 수열의 n번째 항을 구할 수 있을 것이다.
일단 Jacobsthal sequence의 생성함수 를 다음과 같이 정의하자.
이걸 기존 점화식의 양 변에 을 곱하고
생성함수에 맞게 으로 정리하면,
이렇게 수열의 생성함수를 에 대하여 구할 수 있는데,
우리가 원하는 번째 수열의 항을 구하기 위해선 여기서 의 계수 걸러내야 한다.
이를 위해 부분분수분해 를 사용할 것이다.
부분분수분해는 통분된 분수를 다른 분수로 분해하는 방법인데,
와 가 에 대한 다항식이고,
가 의 형태라면
위와 같이 분해할 수 있다.
은 임의의 상수.
는 분모와 분자가 에 대한 다항식이므로
위의 형태로 분해할 수 있다.
일단 의 해를 구하면
이므로 부분분수분해 형태로 나타내도록 하자.
후에 무한등비급수를 사용할 것이므로 형태로 정리했다.
이제 의 부분분수분해 식에 위에서 구한 를 대입해보자.
여기서 의 형태는 무한등비급수를 사용할 수 있다.
원래 일 때만 성립하는데,
우리가 사용하는 생성함수는 formal power series이므로 coverage를 무시해도 된다.
우리는 번 항의 계수를 구하는 것이 목적이므로
는 필요없음.
최종적으로 구한 Jacobsthal sequence의 closed form 식은 위와 같다.
잘 유도됐음
Characteristic equation
Charaacteristic equation을 사용하여 유도하는 방법은 다음과 같은데,
야콥스탈 수열의 경우 상수계수를 가지는 점화식으로 만들어지므로
수열이 지수적으로 증가한다.
그러므로 을 으로 가정해볼 수 있다. (정수여서 가능)
로 나눠서 정리.
그러므로 은 2 와 -1의 거듭제곱에 대한 선형결합으로 이루어진다고 볼 수 있다.
최종적으로 은 다음과 같다.
결국 이 생성함수 유도에서의 에 해당하는 녀석들이라는걸 알 수 있다.
근본적인 풀이 원리는 같다.
Eigenbasis
수열의 점화식은 선형변환의 형태를 가지므로 이를 행렬로 나타낼 수 있다.
은 를 로 선형변환한 결과이다.
그러므로 은 시작점 을 n-1번 선형변환한 결과라고 볼 수 있으므로,
다음과 같이 제곱을 이용하여 표현할 수 있다.
여기서 문제가 있는데, 의 제곱은 계산하기 쉽지 않다. (다른 원소에 영향을 미치기 때문)
하지만 같은 꼴의 행렬의 제곱은 간단하게 로 나타낼 수 있는데,
이 특성을 적용시키기 위해 선형변환 에 대해 회전 영향을 받지 않는 두 벡터를 찾은 뒤
이를 축(basis)으로 하는 좌표계로 변환하여 선형변환을 적용시키면 간단하게 제곱을 구할 수 있을 것이다.
이러한 벡터를 eigenvector라고 하며,
회전엔 영향을 받진 않으나 스케일에 영향을 받을 수 있으므로 이 스케일 값을 eigenvalue라고 한다.
그러면 다음 행렬변환 의 영향을 받지 않는 벡터를 찾아보자.
를 회전변환 라고 하고,
이를 식으로 표현하면 다음과 같다.
우리는 을 원하므로 에 대해 풀어보자.
그런데 우변은 이므로 어떠한 행렬변환의 결과도 이고 는 영벡터가 될 것이다.
우리는 축으로 사용할 벡터가 필요하므로 영벡터는 사용할 수 없으니 는 영벡터가 아니어야 한다.
그러므로 의 역행렬이 존재하지 않는 경우에만 영벡터가 아닌 를 찾을 수 있다.
역행렬이 존재하기 위해선 이 아니어야 한다.
왜냐하면 가 0이라는 것은 한 축의 정보가 소실되어 차원이 축소되었다는 것을 의미하기 때문에,
선형변환 이전의 벡터로 되돌릴 수 없다.
우리는 을 만족하는 를 찾아야 한다.
이렇게 를 찾았다.
그런데 뭔가 이상하지 않은가? 이전 풀이에서 나왔던 주요 값인 2와 -1이 또 여기서 나왔다.
사실 Characteristic equation은 선형대수의 해당 eigenvalue를 다루는 개념이고 선형변환은 고유한 어떤 값이 존재한다는것을 이용하는 것이다.
어쨋든 이제 를 대입해서 만족하는 들을 찾아보자.
이 벡터 2개를 열벡터로 하는 행렬을 새로운 좌표계 로 사용하여
선형연산을 이 좌표계에서 수행할 것이다.
기존 선형변환 는 좌표계변환 → 변환 → 좌표계복구 로 치환.
이제 를 구하면 이를 제곱하여 을 구할 수 있다
그런데 사실 를 직접 구할 필요는 없다.
왜냐하면 선형변환 와 그 고유값 로 이루어진 대각행렬의 선형변환은,
Aigenvector로 이루어진 aigenbasis 좌표계에서 동일한 선형변환이기 때문이다.
그래서 구해진 가 우리가 구한 을 원소로 하는 대각행렬인 것이다.
최종적으로 은 다음과 같다.
끝.