이 문제는 피보나치 수열을 구할 때 계산 단계(order of growth)가 로그 차수가 되는

책의 말을 빌리면 똑똑한 알고리즘을 소개하고 있습니다.

 

변수 a, b를 'a <- a + b,  b <- a'로 하는 규칙을 T라 하고

T를 n번 수행하면 Fib(n + 1)과 Fib(n)을 구할 수 있습니다.

 

이를 확장해서 T_{pq}는 다음과 같은 규칙을 가진다면,

p = 0, q = 1일 때 위의 T와 같은 규칙이 됩니다.

'a <- bq + aq + ap,  b <- bp + aq'

 

여기서 T_{pq}를 두 번 수행한 결과가 T_{p'q'}을 한 번 수행한 것과 같도록

p', q'을 p, q에 관한 식으로 구하는 것이 문제입니다.

 

 

항등식에서 미지의 계수를 구하는 방법에

항등식 양변의 같은 차수의 항의 계수는 같다는 계수비교법이 있으니

a, b를 변수라 두고 p', q'을 미지의 계수라 하면 답이 나옵니다.

(이 말이 더 복잡한가요.;;)

 

그렇게해서 구해진 답은

p' = p² + q²,  q' = q² + 2pq입니다.

 

 

문제 밑에 소스가 적혀있습니다.

여기에 p'과 q'을 넣을 공간이 비워져있습니다.

위에서 구한 답을 해당 빈칸에 넣은 다음 실행시켰습니다.

 

c14

fib 10까지 살펴보니 제대로 작동하고 있습니다.

 

그 뒤에 n을 100과 100,000을 만들어 돌렸습니다.

100,000의 경우 8초 정도 기다리니 답이 나왔습니다.

그 답의 양이 매우 길어 한 화면에 나오지 않는군요.

스크롤의 크기를 보시면 답의 길이를 짐작하실 수 있습니다.

숫자 개수를 살펴보니 총 20,899자리입니다.;;;;

유효숫자를 4개만 잡는다면 2.597 * 10^20898이네요.

10을 20,898번 곱한다라...;;;;;

이 거대한 숫자가 10초도 지나지 않아 나오다니 대단합니다.^^

 

c15

정의에 맞게 작성한 경우 100을 구하려면 3분이 넘어도 답이 나오지 않습니다.

(결국 제가 break를 걸었습니다.)

 

이것이 Θ(log n)과 Θ(2ⁿ)의 차이인 듯싶습니다.

이래서 좋은 알고리즘을 써야하는군요.^^

 

낭만고양이님께서도 해당 문제에 대한 글을 적어주셨습니다.

'SICP Exercise : 연습문제 1.19'

 

낭만고양이님 말씀처럼 이건 수학 문제인 듯싶습니다.^^;;;

하지만 상당히 강력한 알고리즘을 구경할 수 있었기에 재미있었습니다.^^

이런 수학문제라면 환영합니다.(단, 이해하고 풀 수 있다면...OTL.....)

 

 

참조

Structure and Interpretation of Computer Programs 2/E - Page 61

실력 공통수학의 정석 - Page 90

크리에이티브 커먼즈 라이선스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1252

댓글을 달아 주세요

  1. 아르핀 2008/01/16 10:58  댓글주소  수정/삭제  댓글쓰기

    우와 신기하네요! 피보나치 수열을 이런 식으로 이해해서 구할 수도 있군요...
    견문이 짧아 이해하기 어려운 것이 몇 가지 있었지만 흥미롭게 잘 봤습니다.
    연습문제인데도 저에게는 생소한 개념이 많아서 배울 것이 많네요. =ㅅ=;;

  2. NoSyu 2008/01/16 13:47  댓글주소  수정/삭제  댓글쓰기

    /아르핀/
    네.... 피보나치 수열을 정의에 따라 돌아가는 줄 알았는데,
    그보다 훨씬 빠른 속도로 처리하는 방법이 있다는 것이 신기했습니다.
    연습문제뿐인지라 책에 있는 내용을 많이 생략했어요.^^;;;

[로그인][오픈아이디란?]