src/HOL/Isar_examples/Fibonacci.thy
changeset 11809 c9ffdd63dd93
parent 11704 3c50a2cd6f00
child 15439 71c0f98e31f1
equal deleted inserted replaced
11808:c724a9093ebe 11809:c9ffdd63dd93
    50 
    50 
    51 lemma fib_add:
    51 lemma fib_add:
    52   "fib (n + k + 1) = fib (k + 1) * fib (n + 1) + fib k * fib n"
    52   "fib (n + k + 1) = fib (k + 1) * fib (n + 1) + fib k * fib n"
    53   (is "?P n")
    53   (is "?P n")
    54   -- {* see \cite[page 280]{Concrete-Math} *}
    54   -- {* see \cite[page 280]{Concrete-Math} *}
    55 proof (induct ?P n rule: fib_induct)
    55 proof (induct n rule: fib_induct)
    56   show "?P 0" by simp
    56   show "?P 0" by simp
    57   show "?P 1" by simp
    57   show "?P 1" by simp
    58   fix n
    58   fix n
    59   have "fib (n + 2 + k + 1)
    59   have "fib (n + 2 + k + 1)
    60     = fib (n + k + 1) + fib (n + 1 + k + 1)" by simp
    60     = fib (n + k + 1) + fib (n + 1 + k + 1)" by simp
    69     by (simp add: add_mult_distrib2)
    69     by (simp add: add_mult_distrib2)
    70   finally show "?P (n + 2)" .
    70   finally show "?P (n + 2)" .
    71 qed
    71 qed
    72 
    72 
    73 lemma gcd_fib_Suc_eq_1: "gcd (fib n, fib (n + 1)) = 1" (is "?P n")
    73 lemma gcd_fib_Suc_eq_1: "gcd (fib n, fib (n + 1)) = 1" (is "?P n")
    74 proof (induct ?P n rule: fib_induct)
    74 proof (induct n rule: fib_induct)
    75   show "?P 0" by simp
    75   show "?P 0" by simp
    76   show "?P 1" by simp
    76   show "?P 1" by simp
    77   fix n
    77   fix n
    78   have "fib (n + 2 + 1) = fib (n + 1) + fib (n + 2)"
    78   have "fib (n + 2 + 1) = fib (n + 1) + fib (n + 2)"
    79     by simp
    79     by simp
   156   qed
   156   qed
   157 qed
   157 qed
   158 
   158 
   159 
   159 
   160 theorem fib_gcd: "fib (gcd (m, n)) = gcd (fib m, fib n)" (is "?P m n")
   160 theorem fib_gcd: "fib (gcd (m, n)) = gcd (fib m, fib n)" (is "?P m n")
   161 proof (induct ?P m n rule: gcd_induct)
   161 proof (induct m n rule: gcd_induct)
   162   fix m show "fib (gcd (m, 0)) = gcd (fib m, fib 0)" by simp
   162   fix m show "fib (gcd (m, 0)) = gcd (fib m, fib 0)" by simp
   163   fix n :: nat assume n: "0 < n"
   163   fix n :: nat assume n: "0 < n"
   164   hence "gcd (m, n) = gcd (n, m mod n)" by (rule gcd_non_0)
   164   hence "gcd (m, n) = gcd (n, m mod n)" by (rule gcd_non_0)
   165   also assume hyp: "fib ... = gcd (fib n, fib (m mod n))"
   165   also assume hyp: "fib ... = gcd (fib n, fib (m mod n))"
   166   also from n have "... = gcd (fib n, fib m)" by (rule gcd_fib_mod)
   166   also from n have "... = gcd (fib n, fib m)" by (rule gcd_fib_mod)