태코놀로지

피보나치 수열과 피사노 주기(Pisano Period) 본문

Algorithm

피보나치 수열과 피사노 주기(Pisano Period)

태코놀로지 2017. 1. 27. 19:40

피보나치 수열과 피사노 주기(Pisano Period)


최근 백준 온라인 저지 문제를 풀고 있는데, 신기하면서도 골치아팠던 내용에 대해서 끄적거려본다. 오늘 푼 문제는 시간초과가 발생해서 다른 방법으로 풀었지만, 그 내용이 궁금해서 검색하다가 알게 되었다. 주로 피보나치 수를 구할 때는 재귀를 많이 활용하는데 퍼포먼스가 상당히 떨어진다. 이에 메모이제이션/이터레이션의 방법으로 구하는 경우가 다반사다.


이번 문제는 위 세 가지 방법으로 모두 시간초과를 당해서, 내용을 찾아보니 행렬 곱 연산을 활용하는 또하나의 방법을 알게되었다. 그리고 이 행렬 곱 연산 방법으로 해결했다.


마지막으로는 해당 문제에만 적용할 수 있었던 특이한 방법인데. 문제는 n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력하는 문제였다. 피보나치 수를 K로 나눈 나머지는 항상 일정 주기를 갖는데 이를 피사노 주기(Pisano Period)라고 한다. 피사노 주기를 활용하면 아래와 같은 규칙을 찾을 수 있다.


주기의 길이가 P면, N번째 피보나치 수를 M으로 나눈 나머지는 N%P번째 피보나치 수를 M으로 나눈 나머지와 같다.



Source Code
 (Github) 




Comments