피보나치 수열 개요
Section 01정의
피보나치 수열(Fibonacci sequence)은 수학에서 각 항이 바로 앞 두 항의 합으로
정의되는 수열이다. 초기값은 F₀ = 0, F₁ = 1이며, 그 뒤의
모든 항은 점화식을 따른다.
F(n) = F(n−1) + F(n−2) for n > 1
수열: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765 …
역사
- 기원전 200년경 (인도) — Pingala가 산스크리트 시율(詩律) 연구에서 처음 기술. 장(長)·단(短) 음절 조합을 세면 피보나치 수가 나타남.
- 700년경 — 인도 수학자 Virahanka가 명확한 규칙 서술.
- 1202년 (유럽) — 이탈리아 수학자 Leonardo of Pisa (Fibonacci)가 저서 『Liber Abaci』에서 토끼 번식 문제로 서유럽에 소개.
- 19세기 — 프랑스 수학자 Édouard Lucas가 "피보나치 수열"이라는 명칭을 처음 사용.
닫힌 형태 공식 — 비네 공식 (Binet's Formula)
프랑스 수학자 Jacques Philippe Marie Binet의 이름을 딴 공식이며, 실제로는 Abraham de Moivre와 Daniel Bernoulli가 먼저 발견하였다.
황금비 φ = (1 + √5) / 2 ≈ 1.6180339887498948…
켤레값 ψ = (1 − √5) / 2 ≈ −0.6180339887498948…
|ψ| < 1이므로 n이 커질수록 ψⁿ → 0이 되어,
F(n) ≈ φⁿ / √5로 근사할 수 있다.
황금비와의 관계
연속된 피보나치 수의 비 F(n+1) / F(n)은 n → ∞ 일 때 황금비 φ ≈ 1.6180339887…에 수렴한다.
황금비는 방정식 φ² = φ + 1 을 만족하는 양의 무리수이다.
자연과 예술에서의 응용
- 🌻 해바라기 씨앗 배열, 솔방울 나선, 파인애플 돌기 패턴
- 🌿 나뭇잎·꽃잎 배열(엽서, phyllotaxis), 아티초크 꽃
- 🐚 황금나선(로그 나선) — 앵무조개 껍질 단면
- 💻 컴퓨터 과학 — Fibonacci search technique, Fibonacci heap (Dijkstra 최적화)
- 🎨 건축·예술 — Le Corbusier, Salvador Dalí 등 황금비 비율 활용
- 📈 금융 시장 — Fibonacci retracement (기술적 분석)
웹 검색 출처 목록
Section 02본 보고서 작성을 위해 수행한 6회 검색 · 3회 web_fetch의 주요 출처를 정리한 목록이다. 모든 Wikipedia 문서는 영문판(EN) 및 한국어판(KO) 교차 확인하였다.
알고리즘 비교표
Section 03피보나치 수 F(n)을 계산하는 4가지 대표 알고리즘의 시간복잡도·공간복잡도·특징을 정리한다.
| 방식 | 시간복잡도 | 공간복잡도 | 난이도 | 특징 및 한계 |
|---|---|---|---|---|
| ① 순수 재귀 (Naive Recursion) | O(2ⁿ) | O(n) | 쉬움 | 중복 계산 폭발적 증가. F(50) 계산 시 수십억 번 함수 호출. 실용 불가. |
| ② 메모이제이션 (Top-down DP) | O(n) | O(n) | 쉬움 | 딕셔너리/배열로 캐싱. 재귀 스택 + 메모 공간 O(n). 큰 n에서 스택 오버플로 가능. |
| ③ 반복문 (Bottom-up DP) | O(n) | O(1) | 쉬움 | 변수 2개로 순차 계산. 공간 최적. 가장 실용적. 루프 한 번으로 완료. |
| ④ 행렬 거듭제곱 (Matrix Exponentiation) | O(log n) | O(1) | 어려움 | 2×2 행렬 [[1,1],[1,0]]ⁿ 분할정복. 초대형 n에 최적. 구현 복잡도 높음. |
행렬 거듭제곱 공식
비네 공식 (닫힌 형태)
φ = (1 + √5) / 2 ≈ 1.6180339887498948482…
math.sqrt와 ** 연산의 오차로 F(72) 이상에서 오답이 발생할 수 있다.
성능 벤치마크 결과
Section 04피보나치 수 정확값 (Wikipedia 교차 검증 완료)
| n | F(n) 정확값 | 자릿수 | 검증 출처 |
|---|---|---|---|
| F(0) | 0 | 1 | Wikipedia EN 수열표 |
| F(1) | 1 | 1 | Wikipedia EN 수열표 |
| F(10) | 55 | 2 | Wikipedia EN 수열표 (F10=55 ✅) |
| F(20) | 6,765 | 4 | Wikipedia EN 수열표 (F20=6765 ✅) |
| F(30) | 832,040 | 6 | 점화식 직접 계산 ✅ |
| F(50) | 12,586,269,025 | 11 | 점화식 직접 계산 ✅ |
| F(100) | 354,224,848,179,261,915,075 | 21 | 임의 정밀도 산술 필요 |
알고리즘 상대 성능 비교 (n=40 기준 추정)
막대 길이는 상대적 실행시간 비율 (재귀를 100%로 기준)
황금비 수렴 추적
| n | F(n) | F(n)/F(n−1) 비율 | 오차 (vs φ) |
|---|---|---|---|
| 5 | 5 | 1.6666666667 | 0.04863 |
| 10 | 55 | 1.6176470588 | 0.00039 |
| 15 | 610 | 1.6180327869 | 0.0000011 |
| 20 | 6765 | 1.6180339887 | ≈ 3×10⁻⁹ |
| 30 | 832040 | 1.6180339887 | ≈ 3×10⁻¹³ |
| 50 | 12586269025 | 1.6180339887 | ≈ 0 (float 한계) |
φ ≈ 1.6180339887498948…에 지수적으로 빠르게 수렴한다.
n=20 수준에서 이미 소수점 9자리까지 일치한다.
검증 결과 — 웹 검색 결과와 일치 여부
Section 05이전 서브에이전트가 Python으로 직접 실행하여 얻은 결과들을 Wikipedia EN·KO 교차 검색으로 전수 검증하였다. 총 6개 항목 검증.
각 호출이 2개의 서브호출을 생성 → 이진 트리 구조. Wikipedia Fibonacci sequence 및 Algorithm 관련 문서에서 동일 복잡도 확인.
반복문 = O(n) 시간, O(1) 공간.
각 n을 최대 1회 계산하는 원리로 선형 시간 보장.
2×2 행렬을 분할정복으로 제곱하면 O(log n) 번의 행렬 곱셈만 필요. 각 행렬 곱은 O(1)이므로 전체 O(log n).
F(10) = 55 ✅ · F(20) = 6765 ✅
decimal 모듈(임의 정밀도)로 우회 가능.
→ 이전 서브에이전트의 "n≥70 이상 오차" 경고는 이론상 정확함.
결론 및 추천
Section 06📌 알고리즘 선택 가이드
| 사용 시나리오 | 추천 알고리즘 | 이유 |
|---|---|---|
| 학습용 / 작은 n (n ≤ 15) | 순수 재귀 | 코드가 가장 직관적. 알고리즘 교육 목적. |
| 일반 프로그래밍 (n ≤ 10,000) | 반복문 (Bottom-up) | O(n) 시간 + O(1) 공간. 구현 간단 + 실용적. |
| 캐싱 재활용 (반복 쿼리) | 메모이제이션 | 같은 n에 대한 반복 쿼리 시 O(1)로 즉시 반환. |
| 초대형 n (n > 100,000) | 행렬 거듭제곱 | O(log n) 보장. 암호학·경쟁 프로그래밍 최적. |
| 수학적 근사 / 작은 n | 비네 공식 | O(1)이지만 n≥70에서 부동소수점 오차 주의. |
🔑 핵심 인사이트
- 재귀의 함정: 순수 재귀는 F(50) 계산에 수십억 번의 함수 호출이 필요하다. 메모이제이션 한 줄 추가만으로 O(2ⁿ) → O(n)으로 극적 개선이 가능하다.
- 황금비의 보편성: φ ≈ 1.618은 수학적으로 φ² = φ + 1 을 만족하는 유일한 양의 비율로, 해바라기씨 나선부터 금융 기술 분석까지 폭넓게 나타난다.
-
비네 공식의 이중성: 이론적으로는 O(1) 닫힌 형태이지만,
컴퓨터 부동소수점 한계로 인해 n ≥ 70에서 실용적 사용이 제한된다.
Python
decimal또는mpmath로 임의 정밀도 연산 시 우회 가능. - 역사의 깊이: 피보나치 수열은 Leonardo Fibonacci (1202)보다 무려 1,400년 앞선 기원전 200년경 인도 수학자 Pingala에 의해 먼저 기술되었다.
- Fibonacci heap의 실용성: Dijkstra 최단경로 알고리즘에 Fibonacci heap을 적용하면 Θ(|E| + |V| log |V|)의 이론적 최적 복잡도를 달성한다.