equal
deleted
inserted
replaced
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) |