packages feed

egison-5.0.0: sample/math/number/tribonacci.egi

-- Tribonacci sequence using matrix exponentiation

def m : Integer := 3

def A : Matrix Integer :=
  generateTensor
    (\match as list integer with
      | [#1, _] -> 1
      | [$x, #(x - 1)] -> 1
      | _ -> 0)
    [m, m]

assertEqual "transition matrix A"
  A
  [| [| 1, 1, 1 |], [| 1, 0, 0 |], [| 0, 1, 0 |] |]

def B : Vector Integer :=
  generateTensor
    (\[x] -> if x = 1 then 1 else 0)
    [m]

assertEqual "initial vector B"
  B
  [| 1, 0, 0 |]

assertEqual "A * B"
  (M.* A B)
  [| 1, 1, 0 |]

assertEqual "A^2 * B"
  (M.* (M.power A 2) B)
  [| 2, 1, 1 |]

assertEqual "A^3 * B"
  (M.* (M.power A 3) B)
  [| 4, 2, 1 |]

assertEqual "A^4 * B"
  (M.* (M.power A 4) B)
  [| 7, 4, 2 |]

assertEqual "A^5 * B"
  (M.* (M.power A 5) B)
  [| 13, 7, 4 |]

assertEqual "A^100 * B (100th tribonacci)"
  (M.* (M.power A 100) B)
  [| 180396380815100901214157639, 98079530178586034536500564, 53324762928098149064722658 |]