반응형

안녕 게이들아?

지난번의 카라추바 곱셈법에 이어서 이번에는 톰-쿡 알고리즘을 알아보려고해.

카라추바 곱셈법의 확장이 톰-쿡 알고리즘이라고 할 수도 있고,

톰-쿡 알고리즘의 특정한 케이스가 카라추바 곱셈법이라고도 할 수 있어.

뭐 같은 말이긴 하지만 말이야

 

0. 소개

톰-쿡 알고리즘은 Andrei Toom와 Stephen Cook이 만든 알고리즘이야. 

근데 왜 이름이 Toom이노; 톰-쿡이든 툼-쿡이든 그냥 톰-쿡 알고리즘 합시다!

1963년에 톰이 처음 만들어냈고, 1966년에 쿡이 이를 업그레이드 시켰다고 한다.

카라추바가 1960년에 만들고 1962년에 논문냈는데 이랑 거의 비슷하노..

 

이 알고리즘은 큰 수를 여러 조각으로 쪼개서 곱셈을 하는 방법이다.

k개의 조각으로 나눈다고 하고, 이를 톰-k라고 부른다.

저번에 쓴 카라추바 곱셈법은 톰-2와 같다.

일반적으로 톰-k에서 k가 클수록 곱셈을 하는 데 소비하는 시간은 줄어들게 된다.

반면, 덧셈이나 행렬계산 등 기타 잡 연산들을 하는 데 소비하는 시간이 훨씬 많이 들기 때문에 오히려 전체 연산 시간은 늘어나게 된다.

그래서 k를 무작정 키운다고 좋은 건 아니고, 톰-3 정도가 적절하다.

a와 b를 곱할 때, a는 3조각으로 나누고, b는 2조각으로 나눌 수 있는데, 이 때는 톰-2.5 라고 한다. (평균낸다.)

 

전체적인 개념을 설명해주면, 한 수를 3조각으로 분해하는데, 이 3조각이 각각 방정식의 계수라고 생각하는거야.

그러면 2차 방정식이 두개 나오겠지? 곱하는 수가 2개니까.

그리고 이 2차 방정식을 두개 곱하면 4차 방정식이 나올거야.

여기의 계수는 총 5개가 필요하지.

그리고 이 5개를 적당히 위치 해서 다 더 해주면 된다. (아래서 자세히 서술)

그래서 결과적으로 9개의 곱셈이 필요한 것을 5개로 줄일 수 있다. 이기야!

 

톰-쿡 알고리즘은 크게 5단계로 이루어진다.

1. 분할 Splitting

2. 평가 Evaluation

3. 점별 곱셈 Pointwise multiplication

4. 보간 Interpolation

5. 재구성 Recomposition

 

1~5번은 알고리즘으로 순서대로 서술하겠다.

 

*참고사항 : 예시로 드는 수는 충분히 크지 않아서 톰-쿡 알고리즘이 비효율적일 수 있다.

 

1. 분할

a = 1234567891

b = 582736475

각각 10,9자리이다.

이 숫자를 어떻게 쪼개면 잘 쪼겠다고 소문이 나겠노?

먼저 a와 b를 로그 취한 것의 정수부분만 구한다.

오오미.. 슨상님 곱셈하는데 로그가 왠 말이노 ㅠㅠ

하지말고 그냥 쉽게 말하면 각 자리수에서 1씩 빼주면 된다.

즉, [loga] = 9,  [logb]=8 이다.

여기서 k로 나눠준다. 우린 3조각으로 나눌꺼니까, 각각 9/3=3, 8/3=2.6이 된다.

이 둘을 버림한다. 3과 2가 나온다.

이 중에 큰 값을 고른다. (3)

그리고 1을 더해준다.

그래서 최종적으로 나온 결과는 4이다.

우리는 4자리씩 쪼개면 된다.

a = 12 3456 7891

b = 5 8273 6475

 

 

p(x)는 x진수로 된 수라고도 볼 수 있다.

x=1000=10^4을 대입해주면

p(x)=a, q(x)=b가 나올 것이다.

 

아하! 불알 탁!

그럼 p(x)q(x)에 x=10^4을 넣으면 a*b가 나오겠다는 것을 알 수 있겠지?

 

즉, 우리가 앞으로 궁금해야할 것은 4차함수인 p(x)q(x)의 계수들이다.

 

그런데 일반적으로 이걸 구하려면 계수가 3개씩 있으니 총 9번의 최대 4자리 끼리의 곱셈이 필요하다.

하지만 다른 좋은 방법이 있다.

그것은 바로 방정식 위의 점을 이용하는 것이다.

 

2. 평가

평가는 뭐냐하면 p(x), q(x)의 특정 x에서의 값들을 구하는 과정이다.

이걸 왜 구하냐면, 특정한 점 t에서 p(t)q(t)를 곱한 것은, r(x)=p(x)q(x)라고 할 때 r(t)의 값과 같기 때문이다.

이를 이용하면 r(x)의 계수들ㅇㄹ 구할 수 있다.

4차 방정식에는 계수가 5개 있으니까 5개의 계수를 결정하기 위해서는 5개의 점을 대입해보면 된다.

일반적으로 그 점들은 작은 정수들이 들어간다.

-2, -1, 0, 1, 2 같은 애들..

그런데 0,1,-1,-2만 이용하고 5번째 점은 그냥 최고차항의 계수를 쓰겠다. (표시는 무한대 기호로 표시한다)

 

수식 입력이 귀찮아서 그냥 위키피디아에서 수식 이미지 가져왔다.

 

p(∞)라고 표현된 것이 바로 최고차항의 계수이다.

위의 식들은 행렬로 표현하면 아주 편하게 계산할 수 있다.

 

 

이 때 편의를 위해 0의 0승을 그냥 1로 정의했다.

 

이 과정을 이용하면 x=0,1,-1,-2,∞일 때 p(x)와 q(x)의 값들을 구할 수 있다.

 

이 과정을 쉽게하려면 다음과 같이 하면 된다.

임시로 t라는 수를 하나 잡는다.

위와 같이 계산하면 약간의 계산 이득을 볼 수 있다.

 

이제 실제로 값을 구해보자.

 

음수도 나올 수 있다.

 

3. 점별 곱셈

이제 x=0,1,-1,-2,∞일 때 r(x)값을 구해보도록 하자.

오오미 이게 뭐시당가..

4~5자리수 곱셈이랑께!

 

x=s일 때, r(s)=p(s)q(s)의 값을 구하는 작업이다.

 

음수가 나오는 건 정상이다. 안나올수도 있고

 

이 부분이 시간이 제일 많이 걸린다고 한다.

카라츄바 곱셈법으로 하면 적절할듯!

 

4. 보간

2번의 평가 과정에서 2차 함수의 행렬을 구했듯이 이번에는 r(x)의 행렬을 구할 수 있다.

이의 역행렬을 취하면 보간행렬을 구할 수 있다.

 

보면 분수가 있어서 좀 더러워보이는데

생각해보면 처음에 두 2차 함수 곱해서 만든 4차 함수는 계수들이 당연히 정수들 아니겠노?

어차피 약분 될 애들이니까 걱정해줄 필요 없다.

 

k값에 따라서 이를 효율적으로 구하는 순서는 달라질 수 있지만, k=3일 때는 다음과 같은 순서로 하면 좀 빠르게 구할 수 있다.

끝이라고 적히지 않은 값들은 임시적으로 저장해놓는 값이다.

 

 

드디어 r(x)의 모든 계수를 구했다 이기야!

 

5. 재구성

이제 다 됐다

여기에 처음에 쪼개준 단위인 1000을 대입해보자.

 

 

이 결과는 계산기로 계산한 결과와 100% 일치한다.

 

분석해보면 고전적인 방법으로는 10*9=90번의 곱셈이 필요하다.

하지만 톰-3을 이용하면 5번의 4*4 곱셈이 필요한데, 4*4 곱셈은 카라추바 곱셈법(톰-2)를 이용하면 9회만에 수행 가능하다.

따라서, 3단계 점별곱셈에서 45회의 1의 자리 곱셈이 수행된다.

또한 2단계에서 2배를 해주는 과정이 필요하므로 2*5=10회 정도의 곱셈을 수행한다.

보간 과정에서 3회의 8자리 나눗셈이 필요하고, 1회의 2자리 곱셈을 수행했다.

이 외에 많은 덧셈과 뺄셈을 수행했다.

 

심심한 게이들은 저 수를 90회 곱해서 직접 더해보는 것과 톰-3을 이용해서 구해보는 두가지 과정을 해보면 재미있을 것 같다.

 

6. 물을 것 같은 질문

Q. 보니까 전혀 간단해보이지 않는다. 이게 어떻게 된 일이노?

A. 두 숫자가 충분히 크지 않다. 숫자가 존나 크다면 존나 편리함을 알 수 있을 것이다.

그리고 무엇보다 이것은 컴퓨터를 위한 알고리즘이지 사람이 쓰라고 있는 알고리즘이 아니다.

 

Q. 사람이 쓰지도 못할 거 왜 올리노?

A. 원리를 알아간다는 것은 행복한 일이다.

 

Q. 톰-3 이 외의 경우에는 어떻게 계산하나? (-2,-1,0,1,∞ 이 외의 값을 넣은 경우에는?)

A. 해당 값을 넣었을 때 나오는 관계식들을 행렬로 만들어 준 다음에 적당히 하면 역행렬을 만들 수 있다.

이건 k값이 같을 경우에는 항상 일정한 행렬이 나오니까 그냥 미리 만들어 놓은거 쓰자이기!

 

Q. 곱하는 두 수의 크기가 차이날 경우 어떻게 하나?

A. 만약 한 숫자는 100자리고 한 숫자는 30자리다. 이럴 경우에, 100자리짜리는 3조각으로 나누고 30자리짜리는 그냥 1조각으로 하면 된다. 이 때 톰-2의 방법으로 풀면 된다. 그런데 사실 한쪽이 1조각일 경우에는 고전적인 곱셈방법과 전혀 차이가 없으니 사용하지 않아도 된다.

 

Q. 4자리 수를 주어진 수에 따라 구했더니 한 조각이 2자리 수로 나오는데, 이러면 3조각이 아니라 2조각 밖에 안 생긴다 ㅠㅠ 

A. 톰-쿡 알고리즘을쓰기에는 노무 작은 수다.

 

행렬 수식 출처 ; 위키피디아

나머지 수식은 Hanword로 직접 노가다해가면서 쳤다 ㅠㅠ

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기