Share to: share facebook share twitter share wa share telegram print page

피보나치 수

피보나치 수를 이용한 사각형 채우기

수학에서 피보나치 수(영어: Fibonacci numbers)는 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다. 처음 여섯 항은 각각 1, 1, 2, 3, 5, 8이다. 편의상 0번째 항을 0으로 두기도 한다.

역사

피보나치 수가 처음 언급된 문헌은 기원전 5세기 인도수학자 핑갈라가 쓴 책이다.

유럽에서 피보나치 수를 처음 연구한 것은 레오나르도 피보나치토끼 수의 증가에 대해서 이야기하면서 이 수에 대해 언급했다. n 번째 달의 토끼 수는

  • 첫 달에는 새로 태어난 토끼 한 쌍만이 존재한다.
  • 두 달 이상이 된 토끼는 번식 가능하다.
  • 번식 가능한 토끼 한 쌍은 매달 새끼 한 쌍을 낳는다.
  • 토끼는 죽지 않는다.

따라서 첫 달에는 새로 태어난 토끼 한 쌍이 있고, 두 번째 달에는 그대로 토끼 한 쌍, 세 번째 달부터는 이 토끼 한 쌍이 새끼를 낳게 되어 토끼가 2쌍이 되고, 네 번째 달에는 3쌍, 다섯 번째 달에는 5쌍이 된다. 이때 n번째 달에 a 쌍의 토끼가 있었고, 다음 n+1번째 달에는 새로 태어난 토끼를 포함해 b쌍이 있었다고 하자. 그러면 그다음 n+2 번째 달에는 a+b 쌍의 토끼가 있게 된다. 이는 n번째 달에 살아있던 토끼는 충분한 나이가 되어 새끼를 낳을 수 있지만, 바로 전 달인 n+1번째 달에 막 태어난 토끼는 아직 새끼를 낳을 수 없기 때문이다.

정의

점화식을 통한 정의

피보나치 수 는 다음과 같은 초기값 및 점화식으로 정의되는 수열이다.

0번째 항부터 시작할 경우 다음과 같이 정의된다.

피보나치 수의 처음 몇 항은 (0번째 항부터 시작할 경우) 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ... (OEIS의 수열 A000045)

일반항

피보나치 수의 일반항은 다음과 같다.[1]:19, (1.20)

여기서 황금비이며, 는 5의 음이 아닌 제곱근이다. 이를 비네 공식(영어: Binet's formula)이라고 한다. 이는 레온하르트 오일러1765년 처음 발표했으나 잊혔다가, 1848년 자크 비네에 의해 재발견되었다.

성질

항등식

다음과 같은 항등식이 성립하며, 카시니 항등식(영어: Cassini's identity)이라고 한다.

다음과 같은 항등식이 성립하며, 이를 도가뉴 항등식(영어: d'Ocagne's identity)이라고 한다.[1]:9, (1.8)

다음과 같은 항등식이 성립한다.[1]:20

피보나치 수를 점화식을 통해 음의 정수에까지 확장할 수 있다. 이 경우, 비네 공식이 여전히 성립하며, 또한 다음이 성립한다.[1]:37, (1.40)

급수 공식

처음 몇 피보나치 수의 합,[1]:5, (1.1) 교대합,[1]:6, (1.6) 제곱합,[1]:6, (1.7) 세제곱합[1]:21은 다음과 같다.

처음 몇 피보나치 수의 홀수째,[1]:5, (1.2) 짝수째,[1]:6, (1.3) 3의 배수째[1]:21 항의 합은 다음과 같다.

피보나치 수의 역수의 합은 수렴하며, 또한 다음 항등식들이 성립한다.[1]:33, (1.34); 33; 34

홀수 위치에서 피보나치 수의 역수의 합은 다음 값을 갖는다:

λ*은 모듈러 람다 함수이다.

K는 제 1 종 완전 타원 적분이다.

생성 함수

피보나치 수의 생성 함수는 다음과 같다.[1]:28, (1.28)

피보나치 수의 역수생성 함수는 다음과 같이 나타낼 수 있다.[1]:35, (1.36); 35; 36; 36

점근 공식

이웃하는 피보나치 수의 비

이웃하는 피보나치 수의 황금비로 수렴한다.

또한, 다음과 같은 부등식이 성립한다.[1]:23

수론적 성질

피보나치 수열은 서로 인접한 항끼리 서로소이다. 이는 귀납법으로 간단히 증명할 수 있다.

소스 코드

0번째 항부터 시작할 경우를 파이썬 코드로 구현하면 아래와 같다.

def fib(n):
    if n == 0 or n == 1:
        return n
    
    return fib(n-2) + fib(n-1)

위 코드는 메모이제이션을 통해 성능을 개선할 수 있다.

memo = {}

def fib(n):
    if n == 0 or n == 1:
        return n
        
    if n not in memo:
        memo[n] = fib(n-2) + fib(n-1)
    
    return memo[n]

같이 보기

각주

  1. Vorobiev, Nicolai N. (2002) [1992]. 《Fibonacci Numbers》 (영어). 번역 Martin, Mircea. Springer Basel AG. doi:10.1007/978-3-0348-8107-4. ISBN 978-3-7643-6135-8. 

외부 링크

Kembali kehalaman sebelumnya