통계, IT, AI

25. 1000-digit Fibonacci number 본문

IT/PROJECT_EULER

25. 1000-digit Fibonacci number

Harold_Finch 2017. 1. 28. 22:44

1. 개요

문제는 이곳에서 확인할 수 있다. n번째 피보나치 수열의 값을 Fn이라고 할 때 최초로 1000의 자리를 넘는 Fnn을 구하는 것이 목표이다. 단, F1=F2=1이다.


2. 구현: ver 1.0

처음에는 피보나치 수열의 일반항을 구하여 진행하려고 했으나 일반항에 무리수가 포함되어 있고 거듭제곱 연산이 발생하기 때문에 계산상 오차가 발생하였다. 피보나치 수열의 일반항은 3. 피보나치 수열의 일반항에 적고, 본 문제의 해결은 피보나치 수열의 정의를 이용한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
import math as m
 
fn_2, fn_1 = 1, 1
fn = fn_2 + fn_1
n = 3
 
while m.log(fn, 10) < 999# log_{10}10=1
    fn_2 = fn_1
    fn_1 = fn
    fn = fn_1 + fn_2
    n += 1
 
print(n)

답은 4782이다.


3. 피보나치 수열의 일반항

n번째 피보나치 수열의 값을 Fn이라고 할 때 일반항은 아래와 같다.


Fn=15((1+52)n(152)n)


증명은 다음과 같다. 피보나치 수열의 점화식은 Fn+1=Fn+Fn1이다.단, n2이며 F1=F2=1이다. 이때 αβ=1, α+β=1αβ를 이용하여 점화식을 (1)과 같이 다시 쓸 수 있다.


(1)Fn+1αFn=β(FnαFn1)=β2(Fn1αFn2)==βn1(F2αF1)=βn


αβ를 바꾸어 써도 식이 성립하므로 점화식을 (2)와 같이 표현할 수 있다.


(2)Fn+1βFn=α(FnβFn1)=α2(Fn1βFn2)==αn1(F2βF1)=αn


(1)(2)를 연립하여 Fn=(βnαn)/(βα)를 얻는다. 한편, αβ=1, α+β=1의 해는 x2x1=0의 해와 같으므로 이를 대입하면 Fn의 일반항을 구할 수 있다.

'IT > PROJECT_EULER' 카테고리의 다른 글

27. Quadratic primes  (0) 2017.01.29
26. Reciprocal cycles  (0) 2017.01.29
24. Lexicographic permutations  (0) 2017.01.27
23. Non-abundant sums  (0) 2017.01.27
21. Amicable numbers  (0) 2017.01.23
Comments