src/HOL/Number_Theory/Fib.thy
author eberlm <eberlm@in.tum.de>
Thu, 20 Oct 2016 13:53:36 +0200
changeset 64317 029e6247210e
parent 64267 b9a1486e79be
child 65393 079a6f850c02
permissions -rw-r--r--
More on Fibonacci numbers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41959
b460124855b8 tuned headers;
wenzelm
parents: 41541
diff changeset
     1
(*  Title:      HOL/Number_Theory/Fib.thy
b460124855b8 tuned headers;
wenzelm
parents: 41541
diff changeset
     2
    Author:     Lawrence C. Paulson
b460124855b8 tuned headers;
wenzelm
parents: 41541
diff changeset
     3
    Author:     Jeremy Avigad
64317
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
     4
    Author:     Manuel Eberl
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     5
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     6
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
     7
section \<open>The fibonacci function\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     8
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     9
theory Fib
64317
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    10
  imports Complex_Main
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    11
begin
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    12
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    13
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
    14
subsection \<open>Fibonacci numbers\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    15
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    16
fun fib :: "nat \<Rightarrow> nat"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    17
where
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    18
  fib0: "fib 0 = 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    19
| fib1: "fib (Suc 0) = 1"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    20
| fib2: "fib (Suc (Suc n)) = fib (Suc n) + fib n"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    21
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    22
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
    23
subsection \<open>Basic Properties\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    24
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    25
lemma fib_1 [simp]: "fib (1::nat) = 1"
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    26
  by (metis One_nat_def fib1)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    27
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    28
lemma fib_2 [simp]: "fib (2::nat) = 1"
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    29
  using fib.simps(3) [of 0]
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    30
  by (simp add: numeral_2_eq_2)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    31
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    32
lemma fib_plus_2: "fib (n + 2) = fib (n + 1) + fib n"
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    33
  by (metis Suc_eq_plus1 add_2_eq_Suc' fib.simps(3))
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    34
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    35
lemma fib_add: "fib (Suc (n+k)) = fib (Suc k) * fib (Suc n) + fib k * fib n"
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    36
  by (induct n rule: fib.induct) (auto simp add: field_simps)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    37
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    38
lemma fib_neq_0_nat: "n > 0 \<Longrightarrow> fib n > 0"
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    39
  by (induct n rule: fib.induct) (auto simp add: )
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    40
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    41
64317
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    42
subsection \<open>More efficient code\<close>
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    43
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    44
text \<open>
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    45
  The naive approach is very inefficient since the branching recursion leads to many
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    46
  values of @{term fib} being computed multiple times. We can avoid this by ``remembering''
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    47
  the last two values in the sequence, yielding a tail-recursive version.
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    48
  This is far from optimal (it takes roughly $O(n\cdot M(n))$ time where $M(n)$ is the 
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    49
  time required to multiply two $n$-bit integers), but much better than the naive version,
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    50
  which is exponential.
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    51
\<close>
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    52
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    53
fun gen_fib :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat" where
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    54
  "gen_fib a b 0 = a"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    55
| "gen_fib a b (Suc 0) = b"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    56
| "gen_fib a b (Suc (Suc n)) = gen_fib b (a + b) (Suc n)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    57
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    58
lemma gen_fib_recurrence: "gen_fib a b (Suc (Suc n)) = gen_fib a b n + gen_fib a b (Suc n)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    59
  by (induction a b n rule: gen_fib.induct) simp_all
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    60
  
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    61
lemma gen_fib_fib: "gen_fib (fib n) (fib (Suc n)) m = fib (n + m)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    62
  by (induction m rule: fib.induct) (simp_all del: gen_fib.simps(3) add: gen_fib_recurrence)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    63
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    64
lemma fib_conv_gen_fib: "fib n = gen_fib 0 1 n"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    65
  using gen_fib_fib[of 0 n] by simp
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    66
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    67
declare fib_conv_gen_fib [code]
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    68
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
    69
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
    70
subsection \<open>A Few Elementary Results\<close>
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
    71
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
    72
text \<open>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    73
  \medskip Concrete Mathematics, page 278: Cassini's identity.  The proof is
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    74
  much easier using integers, not natural numbers!
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
    75
\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    76
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    77
lemma fib_Cassini_int: "int (fib (Suc (Suc n)) * fib n) - int((fib (Suc n))\<^sup>2) = - ((-1)^n)"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    78
  by (induct n rule: fib.induct)  (auto simp add: field_simps power2_eq_square power_add)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    79
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    80
lemma fib_Cassini_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    81
  "fib (Suc (Suc n)) * fib n =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    82
     (if even n then (fib (Suc n))\<^sup>2 - 1 else (fib (Suc n))\<^sup>2 + 1)"
61649
268d88ec9087 Tweaks for "real": Removal of [iff] status for some lemmas, adding [simp] for others. Plus fixes.
paulson <lp15@cam.ac.uk>
parents: 60688
diff changeset
    83
  using fib_Cassini_int [of n]  by (auto simp del: of_nat_mult of_nat_power)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    84
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    85
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
    86
subsection \<open>Law 6.111 of Concrete Mathematics\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    87
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    88
lemma coprime_fib_Suc_nat: "coprime (fib (n::nat)) (fib (Suc n))"
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    89
  apply (induct n rule: fib.induct)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    90
  apply auto
62429
25271ff79171 Tuned Euclidean Rings/GCD rings
Manuel Eberl <eberlm@in.tum.de>
parents: 62348
diff changeset
    91
  apply (metis gcd_add1 add.commute)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
    92
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    93
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    94
lemma gcd_fib_add: "gcd (fib m) (fib (n + m)) = gcd (fib m) (fib n)"
62348
9a5f43dac883 dropped various legacy fact bindings
haftmann
parents: 61649
diff changeset
    95
  apply (simp add: gcd.commute [of "fib m"])
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    96
  apply (cases m)
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
    97
  apply (auto simp add: fib_add)
62348
9a5f43dac883 dropped various legacy fact bindings
haftmann
parents: 61649
diff changeset
    98
  apply (metis gcd.commute mult.commute coprime_fib_Suc_nat
62429
25271ff79171 Tuned Euclidean Rings/GCD rings
Manuel Eberl <eberlm@in.tum.de>
parents: 62348
diff changeset
    99
    gcd_add_mult gcd_mult_cancel gcd.commute)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   100
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   101
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   102
lemma gcd_fib_diff: "m \<le> n \<Longrightarrow> gcd (fib m) (fib (n - m)) = gcd (fib m) (fib n)"
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
   103
  by (simp add: gcd_fib_add [symmetric, of _ "n-m"])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   104
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   105
lemma gcd_fib_mod: "0 < m \<Longrightarrow> gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   106
proof (induct n rule: less_induct)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   107
  case (less n)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   108
  show "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)"
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   109
  proof (cases "m < n")
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   110
    case True
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   111
    then have "m \<le> n" by auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   112
    with \<open>0 < m\<close> have pos_n: "0 < n" by auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   113
    with \<open>0 < m\<close> \<open>m < n\<close> have diff: "n - m < n" by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   114
    have "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib ((n - m) mod m))"
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
   115
      by (simp add: mod_if [of n]) (insert \<open>m < n\<close>, auto)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   116
    also have "\<dots> = gcd (fib m)  (fib (n - m))"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   117
      by (simp add: less.hyps diff \<open>0 < m\<close>)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   118
    also have "\<dots> = gcd (fib m) (fib n)"
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
   119
      by (simp add: gcd_fib_diff \<open>m \<le> n\<close>)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   120
    finally show "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)" .
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   121
  next
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   122
    case False
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   123
    then show "gcd (fib m) (fib (n mod m)) = gcd (fib m) (fib n)"
a98ef45122f3 misc tuning;
wenzelm
parents: 41959
diff changeset
   124
      by (cases "m = n") auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   125
  qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   126
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   127
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
   128
lemma fib_gcd: "fib (gcd m n) = gcd (fib m) (fib n)"
63167
0909deb8059b isabelle update_cartouches -c -t;
wenzelm
parents: 62429
diff changeset
   129
    \<comment> \<open>Law 6.111\<close>
62348
9a5f43dac883 dropped various legacy fact bindings
haftmann
parents: 61649
diff changeset
   130
  by (induct m n rule: gcd_nat_induct) (simp_all add: gcd_non_0_nat gcd.commute gcd_fib_mod)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   131
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63167
diff changeset
   132
theorem fib_mult_eq_sum_nat: "fib (Suc n) * fib n = (\<Sum>k \<in> {..n}. fib k * fib k)"
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
   133
  by (induct n rule: nat.induct) (auto simp add:  field_simps)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   134
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   135
64317
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   136
subsection \<open>Closed form\<close>
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   137
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   138
lemma fib_closed_form:
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   139
  defines "\<phi> \<equiv> (1 + sqrt 5) / (2::real)" and "\<psi> \<equiv> (1 - sqrt 5) / (2::real)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   140
  shows   "of_nat (fib n) = (\<phi> ^ n - \<psi> ^ n) / sqrt 5"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   141
proof (induction n rule: fib.induct)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   142
  fix n :: nat
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   143
  assume IH1: "of_nat (fib n) = (\<phi> ^ n - \<psi> ^ n) / sqrt 5"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   144
  assume IH2: "of_nat (fib (Suc n)) = (\<phi> ^ Suc n - \<psi> ^ Suc n) / sqrt 5"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   145
  have "of_nat (fib (Suc (Suc n))) = of_nat (fib (Suc n)) + of_nat (fib n)" by simp
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   146
  also have "... = (\<phi>^n*(\<phi> + 1) - \<psi>^n*(\<psi> + 1)) / sqrt 5"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   147
    by (simp add: IH1 IH2 field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   148
  also have "\<phi> + 1 = \<phi>\<^sup>2" by (simp add: \<phi>_def field_simps power2_eq_square)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   149
  also have "\<psi> + 1 = \<psi>\<^sup>2" by (simp add: \<psi>_def field_simps power2_eq_square)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   150
  also have "\<phi>^n * \<phi>\<^sup>2 - \<psi>^n * \<psi>\<^sup>2 = \<phi> ^ Suc (Suc n) - \<psi> ^ Suc (Suc n)"  
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   151
    by (simp add: power2_eq_square)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   152
  finally show "of_nat (fib (Suc (Suc n))) = (\<phi> ^ Suc (Suc n) - \<psi> ^ Suc (Suc n)) / sqrt 5" .
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   153
qed (simp_all add: \<phi>_def \<psi>_def field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   154
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   155
lemma fib_closed_form':
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   156
  defines "\<phi> \<equiv> (1 + sqrt 5) / (2 :: real)" and "\<psi> \<equiv> (1 - sqrt 5) / (2 :: real)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   157
  assumes "n > 0"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   158
  shows   "fib n = round (\<phi> ^ n / sqrt 5)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   159
proof (rule sym, rule round_unique')
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   160
  have "\<bar>\<phi> ^ n / sqrt 5 - of_int (int (fib n))\<bar> = \<bar>\<psi>\<bar> ^ n / sqrt 5"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   161
    by (simp add: fib_closed_form[folded \<phi>_def \<psi>_def] field_simps power_abs)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   162
  also {
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   163
    from assms have "\<bar>\<psi>\<bar>^n \<le> \<bar>\<psi>\<bar>^1"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   164
      by (intro power_decreasing) (simp_all add: algebra_simps real_le_lsqrt)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   165
    also have "... < sqrt 5 / 2" by (simp add: \<psi>_def field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   166
    finally have "\<bar>\<psi>\<bar>^n / sqrt 5 < 1/2" by (simp add: field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   167
  }
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   168
  finally show "\<bar>\<phi> ^ n / sqrt 5 - of_int (int (fib n))\<bar> < 1/2" .
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   169
qed
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   170
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   171
lemma fib_asymptotics:
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   172
  defines "\<phi> \<equiv> (1 + sqrt 5) / (2 :: real)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   173
  shows   "(\<lambda>n. real (fib n) / (\<phi> ^ n / sqrt 5)) \<longlonglongrightarrow> 1"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   174
proof -
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   175
  define \<psi> where "\<psi> \<equiv> (1 - sqrt 5) / (2 :: real)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   176
  have "\<phi> > 1" by (simp add: \<phi>_def)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   177
  hence A: "\<phi> \<noteq> 0" by auto
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   178
  have "(\<lambda>n. (\<psi> / \<phi>) ^ n) \<longlonglongrightarrow> 0"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   179
    by (rule LIMSEQ_power_zero) (simp_all add: \<phi>_def \<psi>_def field_simps add_pos_pos)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   180
  hence "(\<lambda>n. 1 - (\<psi> / \<phi>) ^ n) \<longlonglongrightarrow> 1 - 0" by (intro tendsto_diff tendsto_const)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   181
  with A show ?thesis
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   182
    by (simp add: divide_simps fib_closed_form [folded \<phi>_def \<psi>_def])
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   183
qed
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   184
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   185
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   186
subsection \<open>Divide-and-Conquer recurrence\<close>
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   187
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   188
text \<open>
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   189
  The following divide-and-conquer recurrence allows for a more efficient computation 
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   190
  of Fibonacci numbers; however, it requires memoisation of values to be reasonably 
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   191
  efficient, cutting the number of values to be computed to logarithmically many instead of
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   192
  linearly many. The vast majority of the computation time is then actually spent on the 
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   193
  multiplication, since the output number is exponential in the input number.
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   194
\<close>
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   195
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   196
lemma fib_rec_odd:
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   197
  defines "\<phi> \<equiv> (1 + sqrt 5) / (2 :: real)" and "\<psi> \<equiv> (1 - sqrt 5) / (2 :: real)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   198
  shows   "fib (Suc (2*n)) = fib n^2 + fib (Suc n)^2"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   199
proof -
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   200
  have "of_nat (fib n^2 + fib (Suc n)^2) = ((\<phi> ^ n - \<psi> ^ n)\<^sup>2 + (\<phi> * \<phi> ^ n - \<psi> * \<psi> ^ n)\<^sup>2)/5"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   201
    by (simp add: fib_closed_form[folded \<phi>_def \<psi>_def] field_simps power2_eq_square)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   202
  also have "(\<phi> ^ n - \<psi> ^ n)\<^sup>2 + (\<phi> * \<phi> ^ n - \<psi> * \<psi> ^ n)\<^sup>2 = 
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   203
    \<phi>^(2*n) + \<psi>^(2*n) - 2*(\<phi>*\<psi>)^n + \<phi>^(2*n+2) + \<psi>^(2*n+2) - 2*(\<phi>*\<psi>)^(n+1)" (is "_ = ?A")
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   204
      by (simp add: power2_eq_square algebra_simps power_mult power_mult_distrib)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   205
  also have "\<phi> * \<psi> = -1" by (simp add: \<phi>_def \<psi>_def field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   206
  hence "?A = \<phi>^(2*n+1) * (\<phi> + inverse \<phi>) + \<psi>^(2*n+1) * (\<psi> + inverse \<psi>)" 
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   207
    by (auto simp: field_simps power2_eq_square)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   208
  also have "1 + sqrt 5 > 0" by (auto intro: add_pos_pos)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   209
  hence "\<phi> + inverse \<phi> = sqrt 5" by (simp add: \<phi>_def field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   210
  also have "\<psi> + inverse \<psi> = -sqrt 5" by (simp add: \<psi>_def field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   211
  also have "(\<phi> ^ (2*n+1) * sqrt 5 + \<psi> ^ (2*n+1)* - sqrt 5) / 5 =
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   212
               (\<phi> ^ (2*n+1) - \<psi> ^ (2*n+1)) * (sqrt 5 / 5)" by (simp add: field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   213
  also have "sqrt 5 / 5 = inverse (sqrt 5)" by (simp add: field_simps)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   214
  also have "(\<phi> ^ (2*n+1) - \<psi> ^ (2*n+1)) * ... = of_nat (fib (Suc (2*n)))"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   215
    by (simp add: fib_closed_form[folded \<phi>_def \<psi>_def] divide_inverse)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   216
  finally show ?thesis by (simp only: of_nat_eq_iff)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   217
qed
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   218
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   219
lemma fib_rec_even: "fib (2*n) = (fib (n - 1) + fib (n + 1)) * fib n"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   220
proof (induction n)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   221
  case (Suc n)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   222
  let ?rfib = "\<lambda>x. real (fib x)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   223
  have "2 * (Suc n) = Suc (Suc (2*n))" by simp
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   224
  also have "real (fib ...) = ?rfib n^2 + ?rfib (Suc n)^2 + (?rfib (n - 1) + ?rfib (n + 1)) * ?rfib n" 
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   225
    by (simp add: fib_rec_odd Suc)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   226
  also have "(?rfib (n - 1) + ?rfib (n + 1)) * ?rfib n = (2 * ?rfib (n + 1) - ?rfib n) * ?rfib n"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   227
    by (cases n) simp_all
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   228
  also have "?rfib n^2 + ?rfib (Suc n)^2 + ... = (?rfib (Suc n) + 2 * ?rfib n) * ?rfib (Suc n)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   229
    by (simp add: algebra_simps power2_eq_square)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   230
  also have "... = real ((fib (Suc n - 1) + fib (Suc n + 1)) * fib (Suc n))" by simp
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   231
  finally show ?case by (simp only: of_nat_eq_iff)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   232
qed simp
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   233
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   234
lemma fib_rec_even': "fib (2*n) = (2*fib (n - 1) + fib n) * fib n"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   235
  by (subst fib_rec_even, cases n) simp_all
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   236
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   237
lemma fib_rec:
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   238
  "fib n = (if n = 0 then 0 else if n = 1 then 1 else
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   239
            if even n then let n' = n div 2; fn = fib n' in (2 * fib (n' - 1) + fn) * fn
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   240
            else let n' = n div 2 in fib n' ^ 2 + fib (Suc n') ^ 2)"
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   241
  by (auto elim: evenE oddE simp: fib_rec_odd fib_rec_even' Let_def)
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   242
029e6247210e More on Fibonacci numbers
eberlm <eberlm@in.tum.de>
parents: 64267
diff changeset
   243
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60141
diff changeset
   244
subsection \<open>Fibonacci and Binomial Coefficients\<close>
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   245
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63167
diff changeset
   246
lemma sum_drop_zero: "(\<Sum>k = 0..Suc n. if 0<k then (f (k - 1)) else 0) = (\<Sum>j = 0..n. f j)"
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   247
  by (induct n) auto
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   248
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63167
diff changeset
   249
lemma sum_choose_drop_zero:
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   250
    "(\<Sum>k = 0..Suc n. if k=0 then 0 else (Suc n - k) choose (k - 1)) = (\<Sum>j = 0..n. (n-j) choose j)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63167
diff changeset
   251
  by (rule trans [OF sum.cong sum_drop_zero]) auto
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   252
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   253
lemma ne_diagonal_fib: "(\<Sum>k = 0..n. (n-k) choose k) = fib (Suc n)"
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   254
proof (induct n rule: fib.induct)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   255
  case 1
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   256
  show ?case by simp
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   257
next
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   258
  case 2
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   259
  show ?case by simp
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   260
next
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   261
  case (3 n)
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   262
  have "(\<Sum>k = 0..Suc n. Suc (Suc n) - k choose k) =
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   263
        (\<Sum>k = 0..Suc n. (Suc n - k choose k) + (if k=0 then 0 else (Suc n - k choose (k - 1))))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63167
diff changeset
   264
    by (rule sum.cong) (simp_all add: choose_reduce_nat)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   265
  also have "\<dots> = (\<Sum>k = 0..Suc n. Suc n - k choose k) +
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   266
                   (\<Sum>k = 0..Suc n. if k=0 then 0 else (Suc n - k choose (k - 1)))"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63167
diff changeset
   267
    by (simp add: sum.distrib)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   268
  also have "\<dots> = (\<Sum>k = 0..Suc n. Suc n - k choose k) +
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   269
                   (\<Sum>j = 0..n. n - j choose j)"
64267
b9a1486e79be setsum -> sum
nipkow
parents: 63167
diff changeset
   270
    by (metis sum_choose_drop_zero)
60141
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   271
  finally show ?case using 3
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   272
    by simp
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   273
qed
833adf7db7d8 New material, mostly about limits. Consolidation.
paulson <lp15@cam.ac.uk>
parents: 59667
diff changeset
   274
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   275
end
54713
6666fc0b9ebc Fib: Who needs the int version?
paulson
parents: 53077
diff changeset
   276