src/HOL/Library/NthRoot_Limits.thy
author Andreas Lochbihler
Wed, 08 Apr 2015 15:02:40 +0200
changeset 59956 e936c2828bec
parent 59667 651ea265d568
permissions -rw-r--r--
consistent naming
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57025
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     1
theory NthRoot_Limits
59667
651ea265d568 Removal of the file HOL/Number_Theory/Binomial!! And class field_char_0 now declared in Int.thy
paulson <lp15@cam.ac.uk>
parents: 57025
diff changeset
     2
  imports Complex_Main
57025
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     3
begin
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     4
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     5
lemma LIMSEQ_root: "(\<lambda>n. root n n) ----> 1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     6
proof -
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     7
  def x \<equiv> "\<lambda>n. root n n - 1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     8
  have "x ----> sqrt 0"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
     9
  proof (rule tendsto_sandwich[OF _ _ tendsto_const])
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    10
    show "(\<lambda>x. sqrt (2 / x)) ----> sqrt 0"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    11
      by (intro tendsto_intros tendsto_divide_0[OF tendsto_const] filterlim_mono[OF filterlim_real_sequentially])
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    12
         (simp_all add: at_infinity_eq_at_top_bot)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    13
    { fix n :: nat assume "2 < n"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    14
      have "1 + (real (n - 1) * n) / 2 * x n^2 = 1 + of_nat (n choose 2) * x n^2"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    15
        using `2 < n` unfolding gbinomial_def binomial_gbinomial
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    16
        by (simp add: atLeast0AtMost atMost_Suc field_simps real_of_nat_diff numeral_2_eq_2 real_eq_of_nat[symmetric])
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    17
      also have "\<dots> \<le> (\<Sum>k\<in>{0, 2}. of_nat (n choose k) * x n^k)"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    18
        by (simp add: x_def)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    19
      also have "\<dots> \<le> (\<Sum>k=0..n. of_nat (n choose k) * x n^k)"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    20
        using `2 < n` by (intro setsum_mono2) (auto intro!: mult_nonneg_nonneg zero_le_power simp: x_def le_diff_eq)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    21
      also have "\<dots> = (x n + 1) ^ n"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    22
        by (simp add: binomial_ring)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    23
      also have "\<dots> = n"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    24
        using `2 < n` by (simp add: x_def)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    25
      finally have "real (n - 1) * (real n / 2 * (x n)\<^sup>2) \<le> real (n - 1) * 1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    26
        by simp
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    27
      then have "(x n)\<^sup>2 \<le> 2 / real n"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    28
        using `2 < n` unfolding mult_le_cancel_left by (simp add: field_simps)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    29
      from real_sqrt_le_mono[OF this] have "x n \<le> sqrt (2 / real n)"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    30
        by simp }
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    31
    then show "eventually (\<lambda>n. x n \<le> sqrt (2 / real n)) sequentially"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    32
      by (auto intro!: exI[of _ 3] simp: eventually_sequentially)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    33
    show "eventually (\<lambda>n. sqrt 0 \<le> x n) sequentially"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    34
      by (auto intro!: exI[of _ 1] simp: eventually_sequentially le_diff_eq x_def)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    35
  qed
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    36
  from tendsto_add[OF this tendsto_const[of 1]] show ?thesis
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    37
    by (simp add: x_def)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    38
qed
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    39
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    40
lemma LIMSEQ_root_const:
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    41
  assumes "0 < c"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    42
  shows "(\<lambda>n. root n c) ----> 1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    43
proof -
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    44
  { fix c :: real assume "1 \<le> c"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    45
    def x \<equiv> "\<lambda>n. root n c - 1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    46
    have "x ----> 0"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    47
    proof (rule tendsto_sandwich[OF _ _ tendsto_const])
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    48
      show "(\<lambda>n. c / n) ----> 0"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    49
        by (intro tendsto_divide_0[OF tendsto_const] filterlim_mono[OF filterlim_real_sequentially])
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    50
           (simp_all add: at_infinity_eq_at_top_bot)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    51
      { fix n :: nat assume "1 < n"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    52
        have "1 + x n * n = 1 + of_nat (n choose 1) * x n^1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    53
          using `1 < n` unfolding gbinomial_def binomial_gbinomial by (simp add: real_eq_of_nat[symmetric])
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    54
        also have "\<dots> \<le> (\<Sum>k\<in>{0, 1}. of_nat (n choose k) * x n^k)"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    55
          by (simp add: x_def)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    56
        also have "\<dots> \<le> (\<Sum>k=0..n. of_nat (n choose k) * x n^k)"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    57
          using `1 < n` `1 \<le> c` by (intro setsum_mono2) (auto intro!: mult_nonneg_nonneg zero_le_power simp: x_def le_diff_eq)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    58
        also have "\<dots> = (x n + 1) ^ n"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    59
          by (simp add: binomial_ring)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    60
        also have "\<dots> = c"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    61
          using `1 < n` `1 \<le> c` by (simp add: x_def)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    62
        finally have "x n \<le> c / n"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    63
          using `1 \<le> c` `1 < n` by (simp add: field_simps) }
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    64
      then show "eventually (\<lambda>n. x n \<le> c / n) sequentially"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    65
        by (auto intro!: exI[of _ 3] simp: eventually_sequentially)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    66
      show "eventually (\<lambda>n. 0 \<le> x n) sequentially"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    67
        using `1 \<le> c` by (auto intro!: exI[of _ 1] simp: eventually_sequentially le_diff_eq x_def)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    68
    qed
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    69
    from tendsto_add[OF this tendsto_const[of 1]] have "(\<lambda>n. root n c) ----> 1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    70
      by (simp add: x_def) }
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    71
  note ge_1 = this
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    72
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    73
  show ?thesis
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    74
  proof cases
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    75
    assume "1 \<le> c" with ge_1 show ?thesis by blast
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    76
  next
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    77
    assume "\<not> 1 \<le> c"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    78
    with `0 < c` have "1 \<le> 1 / c"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    79
      by simp
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    80
    then have "(\<lambda>n. 1 / root n (1 / c)) ----> 1 / 1"
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    81
      by (intro tendsto_divide tendsto_const ge_1 `1 \<le> 1 / c` one_neq_zero)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    82
    then show ?thesis
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    83
      by (rule filterlim_cong[THEN iffD1, rotated 3])
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    84
         (auto intro!: exI[of _ 1] simp: eventually_sequentially real_root_divide)
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    85
  qed
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    86
qed
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    87
e7fd64f82876 add various lemmas
hoelzl
parents:
diff changeset
    88
end