번째 피보나치 수 를 계산하는 효율적인 알고리즘


11

피보나치 수 회 반복은 다음을 사용하여 선형 시간에 계산 될 수있다 :n

def fib(n):
    i, j = 1, 1
    for k in {1...n-1}:
        i, j = j, i+j
    return i

피보나치 수 번째는 다음과 같이 계산 될 수있다 [ φ의 N / n. 그러나 이것은 비교적 작은n에대한 반올림 문제에도 문제가 있습니다. 아마도이주위에 방법이있지만 오히려 그렇게하지 않을 것입니다.[φn/5]n

부동 소수점 산술에 의존하지 않는 n 번째 피보나치 수 를 계산 하는 효율적인 (값 이상의 로그 ) 알고리즘이 있습니까? 정수 연산 ( + , , × , / )을 일정한 시간에 수행 할 수 있다고 가정합니다 .nn+×/


5
제안으로 피보나치 수에 관한 Wikipedia 기사에는 많은 방법이 있습니다.
가명

답변:


14

넌 매트릭스 전원 공급 및 신원 사용할 수 계산 모델에서 반복 제곱을 사용하여 전력 공급을 구현하는 경우 이는 O ( log n ) 알고리즘입니다.

[1110]n=[Fn+1FnFnFn1].
O(logn)

1
고전입니다.
dfeuer

8
또한 재발 유도하기 위해이 ID를 사용할 수 있습니다 F 2 N = F 2 N + 2 F N - 1 F N을 . F2n1=Fn2+Fn12F2n=Fn2+2Fn1Fn
augurar

4

이 수학적 기사 : 큰 피보나치 수를 계산하는 빠른 알고리즘 (Daisuke Takahashi) : PDF를 읽을 수 있습니다 .

더 간단하게, C ++ (GMP없이) 및 Python으로 여러 피보나치 알고리즘을 구현했습니다. Bitbucket에서 완전한 소스 . 메인 페이지에서 다음 링크를 따라갈 수도 있습니다.

  • C ++ HTML 온라인 문서.
  • 약간의 수학적 문서 : 피보나치 수-좋은 알고리즘을 구현하기위한 여러 관계

가장 유용한 공식은 다음과 같습니다.

  • F2n=Fn+12Fn12=2FnFn1+Fn2
  • F2n+1=Fn+12+Fn2

알고리즘에주의하십시오. 동일한 값을 여러 번 계산해서는 안됩니다. 간단한 재귀 알고리즘 (Python) :

def fibonacci_pair(n):
    """Return (F_{n-1}, F_n)"""
    if n != 0:
        f_k_1, f_k = fibonacci_pair(n//2)  # F_{k-1},F_k with k = n/2

        return ((f_k**2 + f_k_1**2,
                 ((f_k*f_k_1)*2) + f_k**2) if n & 1 == 0  # even
                else (((f_k*f_k_1)*2) + f_k**2,
                      (f_k + f_k_1)**2 + f_k**2))
    else:
        return (1, 0)

O(logn)


2
컴퓨터 과학에 오신 것을 환영합니다 . 답변에 더 많은 정보를 추가 할 수 있습니까? 현재는 두 개 이상의 링크에 지나지 않으므로 해당 링크가 죽거나 연결된 서버를 사용할 수 없으면 응답이 의미가 없습니다. 자세한 정보에 대한 링크는 괜찮지 만 여기에있는 링크는 유일한 정보입니다. 또한 질문은 C ++ 구현이 아니라 알고리즘에 관한 것입니다. 구현은 언어 별 세부 사항 뒤에있는 알고리즘을 모호하게하는 경향이 있습니다.
David Richerby

David, 첫 번째 링크는 수학 기사에 대한 링크입니다. 제목 A 빠른 알고리즘 [...] 은 "(n은 더 나은 값의 알고리즘) 효율적인 알고리즘이 있습니까?"라는 질문에 대한 답변입니다. 두 번째 링크는 C ++ Python의 다양한 구현에 대한 링크 이며 여러 수식이있는 약간의 수학적 문서입니다.
Olivier Pirson

2
아닙니다. 귀하의 답변에 포함 된 기사 의 제목 은 아무 것도 대답하지 않습니다. 귀하의 답변에 거의 포함되어 있지 않은 기사 의 텍스트 는 아마도 질문에 대답하는 것처럼 들립니다. 그러나 Stack Exchange는 질문 및 답변 사이트이며 링크 팜이 아닙니다. (아니요, 나는 당신이 당신의 답변에 기사를 복사하여 붙여 넣기를 제안하지 않습니다. 그러나 요약이 필요합니다.)
David Richerby

요약을 원하면 작성하십시오!
Olivier Pirson

0

O(log2n)

무료 도서 Matters Computational 및 pari / gp 코드를 확인하십시오.


5
링크를 게시하는 대신 아이디어를 요약하는 것이 좋습니다.
augurar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.