뉴턴법 오차 분석Permalink

앞선 강의에서 제곱근을 계산하는 뉴턴법을 Xi+1=Xi+aXi2 라고 했다.

뉴턴법의 오차를 한 번 분석해보자. ϵn 은 n번째 오차(양수 or 음수)이다.

Xn+1=a(1+ϵn)Xn+1=Xn+aXn2=a(1+ϵn)+aa(1+ϵn)2=a((1+ϵn)+1(1+ϵn)2)=a(2+2ϵn+ϵ2n2(1+ϵn))=a(1+ϵ2n2(1+ϵn))

따라서

ϵn+1=ϵ2n2(1+ϵn)

ϵn 은 단계를 거듭할수록 매우 작아진다. 따라서 우변의 분모에 있는 ϵn 를 무시한다면 매 단계 오차는 제곱의 절반만큼 감소한다고 볼 수 있다. 매 단계마다 정확도가 2배 되므로 이차적 수렴이라고 할 수 있다.


여러가지 곱셈 알고리즘Permalink

다양한 곱셈 알고리즘에 대해 알아보자.

  1. 기본 분할 정복 알고리즘
    숫자를 큰 부분 절반과 작은 부분 절반으로 나누어서 계산하는 기본 방식이다. Θ(d2) 의 시간이 걸린다.

  2. 카라추바 알고리즘
    앞선 강의에서 본 것처럼 Θ(dlog23)=Θ(d1.584) 의 시간이 걸린다.

  3. Toom-Cook 알고리즘
    Toom과 Cook이 만든 알고리즘이다. 카라추바 알고리즘을 일반화한 것이라고 보면 된다. 숫자를 k개의 부분(k2)으로 쪼갠다. k가 3일 때의 점화식은 다음과 같다.
    T(d)=5T(d/3)+Θ(d)=Θ(dlog35)=Θ(d1.465)

  4. Schonhage-Strassen 알고리즘
    고속 푸리에 변환(FFT)를 사용하는 알고리즘으로 거의 선형 시간에 가깝다. 시간복잡도는 Θ(dlogdlog(logd)) 이다.

여기까지는 파이썬의 gmpy 패키지에서 사용 가능하다. 특히, 파이썬은 큰 숫자의 곱셈에 대해 기본적으로 카라추바 알고리즘을 사용한다.

  1. Furer 알고리즘
    Θ(nlogn2O(logn)) 의 시간 복잡도를 가진다. logn 은 반복 로그라고 부르는데, 로그 값의 결과가 1보다 작거나 같을 때까지 반복해서 로그를 계산하는 횟수를 의미한다. 아주 큰 숫자라도 로그 계산을 하면 1보다 작게 될 때까지는 별로 걸리지 않는다. 즉, 아주아주 큰 숫자를 계산할 때도 유용하게 이용할 수 있다.


고정밀 나눗셈Permalink

이제 본격적으로 고정밀 나눗셈을 논할 준비가 되었다.

ab 의 고정밀 나눗셈은 1b 의 고정밀 표현을 먼저 계산하게 된다. 이때, 1b 의 고정밀 표현은 R이 큰 값인 경우에 Rb 을 R로 나눈 결과다. R=2k와 같은 경우라면 우리는 자릿수 이동을 통해 나눗셈 결과를 쉽게 알 수 있다.

Rb 을 계산하는 데 뉴턴 방법을 사용해보자.

f(x)=1xbRf(x)=1x2xi+1=xif(xi)f(xi)=xi(1xibR)1x2xi+1=xi+x2i(1xibR)=2xibx2iR

마지막 식을 분석해보자. 일단 xi 에 2를 곱하는 과정이 필요하다. 그리고 xi 를 제곱(곱셈)한 뒤에 b를 곱한다. 나눗셈 과정은 R을 나누는 것 하나 밖에 없으며, 심지어 그 나눗셈마저 쉽게 하기 위해 R을 잘 선택해두었다.

예시를 보자. R=216(2)b=5로 나누는 과정이다. b를 나눗셈에 쉽게 4로 재설정할 수 있다.

Rb=216(2)5216(2)4=214(2)

x0 부터 차례로 계산하면 다음과 같다.

x0=214(2)=16384x1=2(16384)5(16384)2/65536=12288x2=2(12288)5(12288)2/65536=13056x3=2(13056)5(13056)2/65536=13107

이차적 수렴이므로, x1 에서는 가장 앞 한 자리, x2 는 가장 앞 두 자리, x3 는 가장 앞 네 자리를 신뢰할 수 있다. 최종 결과는 다음과 같다.

Rb=216(2)5=655365=13107.2


고정밀 나눗셈에서의 오차 분석Permalink

고정밀 나눗셈에서 역시 각 단계마다 정확하게 계산한 자릿수가 2배씩 증가하므로 이차적 수렴이다.

나눗셈의 복잡도는 O(logndα) 라고 생각할 수 있다. 전체 계산에 필요한 스텝의 개수가 logd 개이고(정확도가 2배씩 증가하니까), 곱셈의 복잡도는 dα 이기 때문이다. 그러나 이게 최선일까?

먼저, α1 에 대해서, 나눗셈은 각 반복마다 다른 크기의 자릿수를 가지는 숫자를 곱해야 한다. 초기에는 자릿수가 작지만, 나중에는 d자릿수를 계산하게 된다. 따라서 나눗셈에서의 연산 횟수는 다음과 같이 표현할 수 있다.

c1α+c2α+c4α+...+c(d4)α+c(d2)α+cdα<2cdα

나눗셈의 복잡도 상한을 보자! 곱셈의 복잡도와 나눗셈의 복잡도는 동일하다.


제곱근 계산의 복잡도Permalink

이제 최종적으로 제곱근 계산을 살펴보자. f(x)=x2a 의 해를 찾기 위해 나눗셈이 필요한 뉴턴법의 첫 번째 단계를 적용한다. d자리의 정확도가 목표일 때, 필요한 반복은 logd 이고 곱셈(나눗셈)의 복잡도는 Θ(dα) 이다. 따라서 복잡도는 O(dαlogd) 이다.

그러나 첫 번째 단계를 적용할 때 필요한 정확한 자릿수는 작은 상태에서 점차 커진다. 즉, 제곱근 계산에 걸리는 시간 복잡도도 O(dα) 가 된다.



별도의 출처 표시가 있는 이미지를 제외한 모든 이미지는 강의자료에서 발췌하였음을 밝힙니다.

댓글남기기