author | huffman |
Thu, 27 Oct 2011 07:46:57 +0200 | |
changeset 45270 | d5b5c9259afd |
parent 44872 | a98ef45122f3 |
child 53077 | a1b3784f8129 |
permissions | -rw-r--r-- |
41959 | 1 |
(* Title: HOL/Number_Theory/Fib.thy |
2 |
Author: Lawrence C. Paulson |
|
3 |
Author: Jeremy Avigad |
|
31719 | 4 |
|
5 |
Defines the fibonacci function. |
|
6 |
||
7 |
The original "Fib" is due to Lawrence C. Paulson, and was adapted by |
|
8 |
Jeremy Avigad. |
|
9 |
*) |
|
10 |
||
11 |
header {* Fib *} |
|
12 |
||
13 |
theory Fib |
|
14 |
imports Binomial |
|
15 |
begin |
|
16 |
||
17 |
||
18 |
subsection {* Main definitions *} |
|
19 |
||
20 |
class fib = |
|
44872 | 21 |
fixes fib :: "'a \<Rightarrow> 'a" |
31719 | 22 |
|
23 |
||
24 |
(* definition for the natural numbers *) |
|
25 |
||
26 |
instantiation nat :: fib |
|
44872 | 27 |
begin |
31719 | 28 |
|
44872 | 29 |
fun fib_nat :: "nat \<Rightarrow> nat" |
31719 | 30 |
where |
31 |
"fib_nat n = |
|
32 |
(if n = 0 then 0 else |
|
33 |
(if n = 1 then 1 else |
|
34 |
fib (n - 1) + fib (n - 2)))" |
|
35 |
||
44872 | 36 |
instance .. |
31719 | 37 |
|
38 |
end |
|
39 |
||
40 |
(* definition for the integers *) |
|
41 |
||
42 |
instantiation int :: fib |
|
44872 | 43 |
begin |
31719 | 44 |
|
44872 | 45 |
definition fib_int :: "int \<Rightarrow> int" |
46 |
where "fib_int n = (if n >= 0 then int (fib (nat n)) else 0)" |
|
31719 | 47 |
|
44872 | 48 |
instance .. |
31719 | 49 |
|
50 |
end |
|
51 |
||
52 |
||
53 |
subsection {* Set up Transfer *} |
|
54 |
||
55 |
lemma transfer_nat_int_fib: |
|
56 |
"(x::int) >= 0 \<Longrightarrow> fib (nat x) = nat (fib x)" |
|
57 |
unfolding fib_int_def by auto |
|
58 |
||
59 |
lemma transfer_nat_int_fib_closure: |
|
60 |
"n >= (0::int) \<Longrightarrow> fib n >= 0" |
|
61 |
by (auto simp add: fib_int_def) |
|
62 |
||
44872 | 63 |
declare transfer_morphism_nat_int[transfer add return: |
31719 | 64 |
transfer_nat_int_fib transfer_nat_int_fib_closure] |
65 |
||
44872 | 66 |
lemma transfer_int_nat_fib: "fib (int n) = int (fib n)" |
31719 | 67 |
unfolding fib_int_def by auto |
68 |
||
44872 | 69 |
lemma transfer_int_nat_fib_closure: "is_nat n \<Longrightarrow> fib n >= 0" |
31719 | 70 |
unfolding fib_int_def by auto |
71 |
||
44872 | 72 |
declare transfer_morphism_int_nat[transfer add return: |
31719 | 73 |
transfer_int_nat_fib transfer_int_nat_fib_closure] |
74 |
||
75 |
||
76 |
subsection {* Fibonacci numbers *} |
|
77 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
78 |
lemma fib_0_nat [simp]: "fib (0::nat) = 0" |
31719 | 79 |
by simp |
80 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
81 |
lemma fib_0_int [simp]: "fib (0::int) = 0" |
31719 | 82 |
unfolding fib_int_def by simp |
83 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
84 |
lemma fib_1_nat [simp]: "fib (1::nat) = 1" |
31719 | 85 |
by simp |
86 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
87 |
lemma fib_Suc_0_nat [simp]: "fib (Suc 0) = Suc 0" |
31719 | 88 |
by simp |
89 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
90 |
lemma fib_1_int [simp]: "fib (1::int) = 1" |
31719 | 91 |
unfolding fib_int_def by simp |
92 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
93 |
lemma fib_reduce_nat: "(n::nat) >= 2 \<Longrightarrow> fib n = fib (n - 1) + fib (n - 2)" |
31719 | 94 |
by simp |
95 |
||
96 |
declare fib_nat.simps [simp del] |
|
97 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
98 |
lemma fib_reduce_int: "(n::int) >= 2 \<Longrightarrow> fib n = fib (n - 1) + fib (n - 2)" |
31719 | 99 |
unfolding fib_int_def |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
100 |
by (auto simp add: fib_reduce_nat nat_diff_distrib) |
31719 | 101 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
102 |
lemma fib_neg_int [simp]: "(n::int) < 0 \<Longrightarrow> fib n = 0" |
31719 | 103 |
unfolding fib_int_def by auto |
104 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
105 |
lemma fib_2_nat [simp]: "fib (2::nat) = 1" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
106 |
by (subst fib_reduce_nat, auto) |
31719 | 107 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
108 |
lemma fib_2_int [simp]: "fib (2::int) = 1" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
109 |
by (subst fib_reduce_int, auto) |
31719 | 110 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
111 |
lemma fib_plus_2_nat: "fib ((n::nat) + 2) = fib (n + 1) + fib n" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
112 |
by (subst fib_reduce_nat, auto simp add: One_nat_def) |
31719 | 113 |
(* the need for One_nat_def is due to the natdiff_cancel_numerals |
114 |
procedure *) |
|
115 |
||
44872 | 116 |
lemma fib_induct_nat: "P (0::nat) \<Longrightarrow> P (1::nat) \<Longrightarrow> |
31719 | 117 |
(!!n. P n \<Longrightarrow> P (n + 1) \<Longrightarrow> P (n + 2)) \<Longrightarrow> P n" |
118 |
apply (atomize, induct n rule: nat_less_induct) |
|
119 |
apply auto |
|
120 |
apply (case_tac "n = 0", force) |
|
121 |
apply (case_tac "n = 1", force) |
|
122 |
apply (subgoal_tac "n >= 2") |
|
123 |
apply (frule_tac x = "n - 1" in spec) |
|
124 |
apply (drule_tac x = "n - 2" in spec) |
|
125 |
apply (drule_tac x = "n - 2" in spec) |
|
126 |
apply auto |
|
127 |
apply (auto simp add: One_nat_def) (* again, natdiff_cancel *) |
|
128 |
done |
|
129 |
||
44872 | 130 |
lemma fib_add_nat: "fib ((n::nat) + k + 1) = fib (k + 1) * fib (n + 1) + |
31719 | 131 |
fib k * fib n" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
132 |
apply (induct n rule: fib_induct_nat) |
31719 | 133 |
apply auto |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
134 |
apply (subst fib_reduce_nat) |
36350 | 135 |
apply (auto simp add: field_simps) |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
136 |
apply (subst (1 3 5) fib_reduce_nat) |
36350 | 137 |
apply (auto simp add: field_simps Suc_eq_plus1) |
31719 | 138 |
(* hmmm. Why doesn't "n + (1 + (1 + k))" simplify to "n + k + 2"? *) |
139 |
apply (subgoal_tac "n + (k + 2) = n + (1 + (1 + k))") |
|
140 |
apply (erule ssubst) back back |
|
44872 | 141 |
apply (erule ssubst) back |
31719 | 142 |
apply auto |
143 |
done |
|
144 |
||
44872 | 145 |
lemma fib_add'_nat: "fib (n + Suc k) = |
146 |
fib (Suc k) * fib (Suc n) + fib k * fib n" |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
147 |
using fib_add_nat by (auto simp add: One_nat_def) |
31719 | 148 |
|
149 |
||
150 |
(* transfer from nats to ints *) |
|
44872 | 151 |
lemma fib_add_int: "(n::int) >= 0 \<Longrightarrow> k >= 0 \<Longrightarrow> |
152 |
fib (n + k + 1) = fib (k + 1) * fib (n + 1) + fib k * fib n " |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
153 |
by (rule fib_add_nat [transferred]) |
31719 | 154 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
155 |
lemma fib_neq_0_nat: "(n::nat) > 0 \<Longrightarrow> fib n ~= 0" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
156 |
apply (induct n rule: fib_induct_nat) |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
157 |
apply (auto simp add: fib_plus_2_nat) |
44872 | 158 |
done |
31719 | 159 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
160 |
lemma fib_gr_0_nat: "(n::nat) > 0 \<Longrightarrow> fib n > 0" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
161 |
by (frule fib_neq_0_nat, simp) |
31719 | 162 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
163 |
lemma fib_gr_0_int: "(n::int) > 0 \<Longrightarrow> fib n > 0" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
164 |
unfolding fib_int_def by (simp add: fib_gr_0_nat) |
31719 | 165 |
|
166 |
text {* |
|
167 |
\medskip Concrete Mathematics, page 278: Cassini's identity. The proof is |
|
168 |
much easier using integers, not natural numbers! |
|
169 |
*} |
|
170 |
||
44872 | 171 |
lemma fib_Cassini_aux_int: "fib (int n + 2) * fib (int n) - |
31719 | 172 |
(fib (int n + 1))^2 = (-1)^(n + 1)" |
173 |
apply (induct n) |
|
44872 | 174 |
apply (auto simp add: field_simps power2_eq_square fib_reduce_int power_add) |
175 |
done |
|
31719 | 176 |
|
44872 | 177 |
lemma fib_Cassini_int: "n >= 0 \<Longrightarrow> fib (n + 2) * fib n - |
31719 | 178 |
(fib (n + 1))^2 = (-1)^(nat n + 1)" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
179 |
by (insert fib_Cassini_aux_int [of "nat n"], auto) |
31719 | 180 |
|
181 |
(* |
|
44872 | 182 |
lemma fib_Cassini'_int: "n >= 0 \<Longrightarrow> fib (n + 2) * fib n = |
31719 | 183 |
(fib (n + 1))^2 + (-1)^(nat n + 1)" |
44872 | 184 |
by (frule fib_Cassini_int, simp) |
31719 | 185 |
*) |
186 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
187 |
lemma fib_Cassini'_int: "n >= 0 \<Longrightarrow> fib ((n::int) + 2) * fib n = |
31719 | 188 |
(if even n then tsub ((fib (n + 1))^2) 1 |
189 |
else (fib (n + 1))^2 + 1)" |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
190 |
apply (frule fib_Cassini_int, auto simp add: pos_int_even_equiv_nat_even) |
31719 | 191 |
apply (subst tsub_eq) |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
192 |
apply (insert fib_gr_0_int [of "n + 1"], force) |
31719 | 193 |
apply auto |
44872 | 194 |
done |
31719 | 195 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
196 |
lemma fib_Cassini_nat: "fib ((n::nat) + 2) * fib n = |
44872 | 197 |
(if even n then (fib (n + 1))^2 - 1 |
198 |
else (fib (n + 1))^2 + 1)" |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
199 |
by (rule fib_Cassini'_int [transferred, of n], auto) |
31719 | 200 |
|
201 |
||
202 |
text {* \medskip Toward Law 6.111 of Concrete Mathematics *} |
|
203 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
204 |
lemma coprime_fib_plus_1_nat: "coprime (fib (n::nat)) (fib (n + 1))" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
205 |
apply (induct n rule: fib_induct_nat) |
31719 | 206 |
apply auto |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
207 |
apply (subst (2) fib_reduce_nat) |
31792 | 208 |
apply (auto simp add: Suc_eq_plus1) (* again, natdiff_cancel *) |
31719 | 209 |
apply (subst add_commute, auto) |
36350 | 210 |
apply (subst gcd_commute_nat, auto simp add: field_simps) |
44872 | 211 |
done |
31719 | 212 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
213 |
lemma coprime_fib_Suc_nat: "coprime (fib n) (fib (Suc n))" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
214 |
using coprime_fib_plus_1_nat by (simp add: One_nat_def) |
31719 | 215 |
|
44872 | 216 |
lemma coprime_fib_plus_1_int: "n >= 0 \<Longrightarrow> coprime (fib (n::int)) (fib (n + 1))" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
217 |
by (erule coprime_fib_plus_1_nat [transferred]) |
31719 | 218 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
219 |
lemma gcd_fib_add_nat: "gcd (fib (m::nat)) (fib (n + m)) = gcd (fib m) (fib n)" |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
220 |
apply (simp add: gcd_commute_nat [of "fib m"]) |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
221 |
apply (rule cases_nat [of _ m]) |
31719 | 222 |
apply simp |
223 |
apply (subst add_assoc [symmetric]) |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
224 |
apply (simp add: fib_add_nat) |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
225 |
apply (subst gcd_commute_nat) |
31719 | 226 |
apply (subst mult_commute) |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
227 |
apply (subst gcd_add_mult_nat) |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
228 |
apply (subst gcd_commute_nat) |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
229 |
apply (rule gcd_mult_cancel_nat) |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
230 |
apply (rule coprime_fib_plus_1_nat) |
44872 | 231 |
done |
31719 | 232 |
|
44872 | 233 |
lemma gcd_fib_add_int [rule_format]: "m >= 0 \<Longrightarrow> n >= 0 \<Longrightarrow> |
31719 | 234 |
gcd (fib (m::int)) (fib (n + m)) = gcd (fib m) (fib n)" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
235 |
by (erule gcd_fib_add_nat [transferred]) |
31719 | 236 |
|
44872 | 237 |
lemma gcd_fib_diff_nat: "(m::nat) \<le> n \<Longrightarrow> |
31719 | 238 |
gcd (fib m) (fib (n - m)) = gcd (fib m) (fib n)" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
239 |
by (simp add: gcd_fib_add_nat [symmetric, of _ "n-m"]) |
31719 | 240 |
|
44872 | 241 |
lemma gcd_fib_diff_int: "0 <= (m::int) \<Longrightarrow> m \<le> n \<Longrightarrow> |
31719 | 242 |
gcd (fib m) (fib (n - m)) = gcd (fib m) (fib n)" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
243 |
by (simp add: gcd_fib_add_int [symmetric, of _ "n-m"]) |
31719 | 244 |
|
44872 | 245 |
lemma gcd_fib_mod_nat: "0 < (m::nat) \<Longrightarrow> |
31719 | 246 |
gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)" |
247 |
proof (induct n rule: less_induct) |
|
248 |
case (less n) |
|
249 |
from less.prems have pos_m: "0 < m" . |
|
250 |
show "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)" |
|
251 |
proof (cases "m < n") |
|
44872 | 252 |
case True |
253 |
then have "m \<le> n" by auto |
|
31719 | 254 |
with pos_m have pos_n: "0 < n" by auto |
44872 | 255 |
with pos_m `m < n` have diff: "n - m < n" by auto |
31719 | 256 |
have "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib ((n - m) mod m))" |
44872 | 257 |
by (simp add: mod_if [of n]) (insert `m < n`, auto) |
258 |
also have "\<dots> = gcd (fib m) (fib (n - m))" |
|
31719 | 259 |
by (simp add: less.hyps diff pos_m) |
44872 | 260 |
also have "\<dots> = gcd (fib m) (fib n)" |
261 |
by (simp add: gcd_fib_diff_nat `m \<le> n`) |
|
31719 | 262 |
finally show "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)" . |
263 |
next |
|
44872 | 264 |
case False |
265 |
then show "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)" |
|
266 |
by (cases "m = n") auto |
|
31719 | 267 |
qed |
268 |
qed |
|
269 |
||
44872 | 270 |
lemma gcd_fib_mod_int: |
31719 | 271 |
assumes "0 < (m::int)" and "0 <= n" |
272 |
shows "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)" |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
273 |
apply (rule gcd_fib_mod_nat [transferred]) |
41541 | 274 |
using assms apply auto |
275 |
done |
|
31719 | 276 |
|
44872 | 277 |
lemma fib_gcd_nat: "fib (gcd (m::nat) n) = gcd (fib m) (fib n)" |
31719 | 278 |
-- {* Law 6.111 *} |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
279 |
apply (induct m n rule: gcd_nat_induct) |
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
280 |
apply (simp_all add: gcd_non_0_nat gcd_commute_nat gcd_fib_mod_nat) |
41541 | 281 |
done |
31719 | 282 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
283 |
lemma fib_gcd_int: "m >= 0 \<Longrightarrow> n >= 0 \<Longrightarrow> |
31719 | 284 |
fib (gcd (m::int) n) = gcd (fib m) (fib n)" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
285 |
by (erule fib_gcd_nat [transferred]) |
31719 | 286 |
|
44872 | 287 |
lemma atMost_plus_one_nat: "{..(k::nat) + 1} = insert (k + 1) {..k}" |
31719 | 288 |
by auto |
289 |
||
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
290 |
theorem fib_mult_eq_setsum_nat: |
31719 | 291 |
"fib ((n::nat) + 1) * fib n = (\<Sum>k \<in> {..n}. fib k * fib k)" |
292 |
apply (induct n) |
|
36350 | 293 |
apply (auto simp add: atMost_plus_one_nat fib_plus_2_nat field_simps) |
41541 | 294 |
done |
31719 | 295 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
296 |
theorem fib_mult_eq_setsum'_nat: |
31719 | 297 |
"fib (Suc n) * fib n = (\<Sum>k \<in> {..n}. fib k * fib k)" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
298 |
using fib_mult_eq_setsum_nat by (simp add: One_nat_def) |
31719 | 299 |
|
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
300 |
theorem fib_mult_eq_setsum_int [rule_format]: |
31719 | 301 |
"n >= 0 \<Longrightarrow> fib ((n::int) + 1) * fib n = (\<Sum>k \<in> {0..n}. fib k * fib k)" |
31952
40501bb2d57c
renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents:
31792
diff
changeset
|
302 |
by (erule fib_mult_eq_setsum_nat [transferred]) |
31719 | 303 |
|
304 |
end |