피사노 주기(Pisano Period)

이영구·2022년 8월 28일
0

Algorithm

목록 보기
9/19

피사노 주기: 피보나치 수를 K로 나눴다고 했을 때, 그 나머지는 항상 주기를 가지게 되는데 이를 피사노 주기라 함.

피사노 주기를 P라고 했을 때,

N % M == (N % P) % M

또한 M=10kM = 10^{k} 일 때 k>2라면 주기는 항상 1510k115*10^{k-1}이라는 공식이 성립함

  • pisano period
def pisano_p(x):
    f0, f1 = 0, 1
    f2 = f0+f1

    for i in range(x*x):
        f2 = (f0+f1) % x
        f0 = f1
        f1 = f2
        if f0 == 0 and f1==1:
            return i+1
  • 피보나치 수 의 성질
    (Fn+2Fn+1)F_{n+2}\choose F_{n+1} = (1110)1\,1\choose 1\,0 (Fn+1Fn)F_{n+1}\choose F_{n}

    (Fn+1FnFnFn1)F_{n+1}\,F_{n}\choose F_{n}\,F_{n-1} = (1110)1\,1\choose 1\,0n^{n}

    F2n1F_{2n-1} = FnF_{n}2^{2} +Fn1F_{n-1}2^{2}

    F2nF_{2n} = (Fn1F_{n-1} + Fn+1F_{n+1})FnF_{n} = (2Fn1F_{n-1} + FnF_{n})FnF_{n}

    i=0nF(i)=Fn+21\sum_{i=0}^{n} F(i) = F_{n+2} -1
    → 피보나치 수의 합 문제 : https://www.acmicpc.net/problem/2086

profile
In to the code!

0개의 댓글