Documentation

Mathlib.Data.Nat.Fib.Basic

Fibonacci Numbers #

This file defines the fibonacci series, proves results about it and introduces methods to compute it quickly.

The Fibonacci Sequence #

Summary #

Definition of the Fibonacci sequence F₀ = 0, F₁ = 1, Fₙ₊₂ = Fₙ + Fₙ₊₁.

Main Definitions #

Main Statements #

Implementation Notes #

For efficiency purposes, the sequence is defined using Stream.iterate.

Tags #

fib, fibonacci

def Nat.fib (n : ) :

Implementation of the fibonacci sequence satisfying fib 0 = 0, fib 1 = 1, fib (n + 2) = fib n + fib (n + 1).

Note: We use a stream iterator for better performance when compared to the naive recursive implementation.

Equations
    Instances For
      @[simp]
      theorem Nat.fib_zero :
      fib 0 = 0
      @[simp]
      theorem Nat.fib_one :
      fib 1 = 1
      @[simp]
      theorem Nat.fib_two :
      fib 2 = 1
      theorem Nat.fib_add_two {n : } :
      fib (n + 2) = fib n + fib (n + 1)

      Shows that fib indeed satisfies the Fibonacci recurrence Fₙ₊₂ = Fₙ + Fₙ₊₁.

      theorem Nat.fib_add_one {n : } :
      n 0fib (n + 1) = fib (n - 1) + fib n
      theorem Nat.fib_le_fib_succ {n : } :
      fib n fib (n + 1)
      @[simp]
      theorem Nat.fib_eq_zero {n : } :
      fib n = 0 n = 0
      @[simp]
      theorem Nat.fib_pos {n : } :
      0 < fib n 0 < n
      theorem Nat.fib_add_two_sub_fib_add_one {n : } :
      fib (n + 2) - fib (n + 1) = fib n
      theorem Nat.fib_lt_fib_succ {n : } (hn : 2 n) :
      fib n < fib (n + 1)
      theorem Nat.fib_add_two_strictMono :
      StrictMono fun (n : ) => fib (n + 2)

      fib (n + 2) is strictly monotone.

      theorem Nat.fib_lt_fib {m : } (hm : 2 m) {n : } :
      fib m < fib n m < n
      theorem Nat.le_fib_self {n : } (five_le_n : 5 n) :
      n fib n
      theorem Nat.le_fib_add_one (n : ) :
      n fib n + 1
      theorem Nat.fib_coprime_fib_succ (n : ) :
      (fib n).Coprime (fib (n + 1))

      Subsequent Fibonacci numbers are coprime, see https://proofwiki.org/wiki/Consecutive_Fibonacci_Numbers_are_Coprime

      theorem Nat.fib_two_mul (n : ) :
      fib (2 * n) = fib n * (2 * fib (n + 1) - fib n)
      theorem Nat.fib_two_mul_add_one (n : ) :
      fib (2 * n + 1) = fib (n + 1) ^ 2 + fib n ^ 2
      theorem Nat.fib_two_mul_add_two (n : ) :
      fib (2 * n + 2) = fib (n + 1) * (2 * fib n + fib (n + 1))

      Computes (Nat.fib n, Nat.fib (n + 1)) using the binary representation of n. Supports Nat.fastFib.

      Equations
        Instances For
          def Nat.fastFib (n : ) :

          Computes Nat.fib n using the binary representation of n. Proved to be equal to Nat.fib in Nat.fast_fib_eq.

          Equations
            Instances For
              theorem Nat.fast_fib_aux_bit_ff (n : ) :
              (bit false n).fastFibAux = have p := n.fastFibAux; (p.1 * (2 * p.2 - p.1), p.2 ^ 2 + p.1 ^ 2)
              theorem Nat.fast_fib_aux_bit_tt (n : ) :
              (bit true n).fastFibAux = have p := n.fastFibAux; (p.2 ^ 2 + p.1 ^ 2, p.2 * (2 * p.1 + p.2))
              theorem Nat.gcd_fib_add_self (m n : ) :
              (fib m).gcd (fib (n + m)) = (fib m).gcd (fib n)
              theorem Nat.gcd_fib_add_mul_self (m n k : ) :
              (fib m).gcd (fib (n + k * m)) = (fib m).gcd (fib n)
              theorem Nat.fib_gcd (m n : ) :
              fib (m.gcd n) = (fib m).gcd (fib n)

              fib n is a strong divisibility sequence, see https://proofwiki.org/wiki/GCD_of_Fibonacci_Numbers

              theorem Nat.fib_dvd (m n : ) (h : m n) :
              fib m fib n
              theorem Nat.fib_succ_eq_sum_choose (n : ) :
              fib (n + 1) = pFinset.antidiagonal n, p.1.choose p.2
              theorem Nat.fib_succ_eq_succ_sum (n : ) :
              fib (n + 1) = kFinset.range n, fib k + 1