| author | wenzelm | 
| Tue, 02 Aug 2016 18:46:24 +0200 | |
| changeset 63585 | f4a308fdf664 | 
| parent 63558 | 0aa33085c8b1 | 
| child 63721 | 492bb53c3420 | 
| permissions | -rw-r--r-- | 
| 63467 | 1 | (* Title: HOL/NthRoot.thy | 
| 2 | Author: Jacques D. Fleuriot, 1998 | |
| 3 | Author: Lawrence C Paulson, 2004 | |
| 12196 | 4 | *) | 
| 5 | ||
| 60758 | 6 | section \<open>Nth Roots of Real Numbers\<close> | 
| 14324 | 7 | |
| 15131 | 8 | theory NthRoot | 
| 63467 | 9 | imports Deriv Binomial | 
| 15131 | 10 | begin | 
| 14324 | 11 | |
| 63467 | 12 | |
| 60758 | 13 | subsection \<open>Existence of Nth Root\<close> | 
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 14 | |
| 60758 | 15 | text \<open>Existence follows from the Intermediate Value Theorem\<close> | 
| 14324 | 16 | |
| 23009 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 17 | lemma realpow_pos_nth: | 
| 63467 | 18 | fixes a :: real | 
| 23009 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 19 | assumes n: "0 < n" | 
| 63467 | 20 | and a: "0 < a" | 
| 21 | shows "\<exists>r>0. r ^ n = a" | |
| 23009 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 22 | proof - | 
| 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 23 | have "\<exists>r\<ge>0. r \<le> (max 1 a) \<and> r ^ n = a" | 
| 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 24 | proof (rule IVT) | 
| 63467 | 25 | show "0 ^ n \<le> a" | 
| 26 | using n a by (simp add: power_0_left) | |
| 27 | show "0 \<le> max 1 a" | |
| 28 | by simp | |
| 29 | from n have n1: "1 \<le> n" | |
| 30 | by simp | |
| 31 | have "a \<le> max 1 a ^ 1" | |
| 32 | by simp | |
| 23009 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 33 | also have "max 1 a ^ 1 \<le> max 1 a ^ n" | 
| 63467 | 34 | using n1 by (rule power_increasing) simp | 
| 23009 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 35 | finally show "a \<le> max 1 a ^ n" . | 
| 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 36 | show "\<forall>r. 0 \<le> r \<and> r \<le> max 1 a \<longrightarrow> isCont (\<lambda>x. x ^ n) r" | 
| 44289 | 37 | by simp | 
| 23009 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 38 | qed | 
| 63467 | 39 | then obtain r where r: "0 \<le> r \<and> r ^ n = a" | 
| 40 | by fast | |
| 41 | with n a have "r \<noteq> 0" | |
| 42 | by (auto simp add: power_0_left) | |
| 43 | with r have "0 < r \<and> r ^ n = a" | |
| 44 | by simp | |
| 45 | then show ?thesis .. | |
| 23009 
01c295dd4a36
Prove existence of nth roots using Intermediate Value Theorem
 huffman parents: 
22968diff
changeset | 46 | qed | 
| 14325 | 47 | |
| 23047 | 48 | (* Used by Integration/RealRandVar.thy in AFP *) | 
| 49 | lemma realpow_pos_nth2: "(0::real) < a \<Longrightarrow> \<exists>r>0. r ^ Suc n = a" | |
| 63467 | 50 | by (blast intro: realpow_pos_nth) | 
| 23047 | 51 | |
| 63467 | 52 | text \<open>Uniqueness of nth positive root.\<close> | 
| 53 | lemma realpow_pos_nth_unique: "0 < n \<Longrightarrow> 0 < a \<Longrightarrow> \<exists>!r. 0 < r \<and> r ^ n = a" for a :: real | |
| 54 | by (auto intro!: realpow_pos_nth simp: power_eq_iff_eq_base) | |
| 14324 | 55 | |
| 56 | ||
| 60758 | 57 | subsection \<open>Nth Root\<close> | 
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 58 | |
| 63467 | 59 | text \<open> | 
| 60 | We define roots of negative reals such that \<open>root n (- x) = - root n x\<close>. | |
| 61 | This allows us to omit side conditions from many theorems. | |
| 62 | \<close> | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 63 | |
| 63467 | 64 | lemma inj_sgn_power: | 
| 65 | assumes "0 < n" | |
| 66 | shows "inj (\<lambda>y. sgn y * \<bar>y\<bar>^n :: real)" | |
| 67 | (is "inj ?f") | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 68 | proof (rule injI) | 
| 63467 | 69 | have x: "(0 < a \<and> b < 0) \<or> (a < 0 \<and> 0 < b) \<Longrightarrow> a \<noteq> b" for a b :: real | 
| 70 | by auto | |
| 71 | fix x y | |
| 72 | assume "?f x = ?f y" | |
| 73 | with power_eq_iff_eq_base[of n "\<bar>x\<bar>" "\<bar>y\<bar>"] \<open>0 < n\<close> show "x = y" | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 74 | by (cases rule: linorder_cases[of 0 x, case_product linorder_cases[of 0 y]]) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 75 | (simp_all add: x) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 76 | qed | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 77 | |
| 63467 | 78 | lemma sgn_power_injE: | 
| 79 | "sgn a * \<bar>a\<bar> ^ n = x \<Longrightarrow> x = sgn b * \<bar>b\<bar> ^ n \<Longrightarrow> 0 < n \<Longrightarrow> a = b" | |
| 80 | for a b :: real | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 81 | using inj_sgn_power[THEN injD, of n a b] by simp | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 82 | |
| 63467 | 83 | definition root :: "nat \<Rightarrow> real \<Rightarrow> real" | 
| 84 | where "root n x = (if n = 0 then 0 else the_inv (\<lambda>y. sgn y * \<bar>y\<bar>^n) x)" | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 85 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 86 | lemma root_0 [simp]: "root 0 x = 0" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 87 | by (simp add: root_def) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 88 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 89 | lemma root_sgn_power: "0 < n \<Longrightarrow> root n (sgn y * \<bar>y\<bar>^n) = y" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 90 | using the_inv_f_f[OF inj_sgn_power] by (simp add: root_def) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 91 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 92 | lemma sgn_power_root: | 
| 63467 | 93 | assumes "0 < n" | 
| 94 | shows "sgn (root n x) * \<bar>(root n x)\<bar>^n = x" | |
| 95 | (is "?f (root n x) = x") | |
| 96 | proof (cases "x = 0") | |
| 97 | case True | |
| 98 | with assms root_sgn_power[of n 0] show ?thesis | |
| 99 | by simp | |
| 100 | next | |
| 101 | case False | |
| 102 | with realpow_pos_nth[OF \<open>0 < n\<close>, of "\<bar>x\<bar>"] | |
| 103 | obtain r where "0 < r" "r ^ n = \<bar>x\<bar>" | |
| 104 | by auto | |
| 60758 | 105 | with \<open>x \<noteq> 0\<close> have S: "x \<in> range ?f" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 106 | by (intro image_eqI[of _ _ "sgn x * r"]) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 107 | (auto simp: abs_mult sgn_mult power_mult_distrib abs_sgn_eq mult_sgn_abs) | 
| 60758 | 108 | from \<open>0 < n\<close> f_the_inv_into_f[OF inj_sgn_power[OF \<open>0 < n\<close>] this] show ?thesis | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 109 | by (simp add: root_def) | 
| 63467 | 110 | qed | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 111 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 112 | lemma split_root: "P (root n x) \<longleftrightarrow> (n = 0 \<longrightarrow> P 0) \<and> (0 < n \<longrightarrow> (\<forall>y. sgn y * \<bar>y\<bar>^n = x \<longrightarrow> P y))" | 
| 63558 | 113 | proof (cases "n = 0") | 
| 114 | case True | |
| 115 | then show ?thesis by simp | |
| 116 | next | |
| 117 | case False | |
| 118 | then show ?thesis | |
| 119 | by simp (metis root_sgn_power sgn_power_root) | |
| 120 | qed | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 121 | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 122 | lemma real_root_zero [simp]: "root n 0 = 0" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 123 | by (simp split: split_root add: sgn_zero_iff) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 124 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 125 | lemma real_root_minus: "root n (- x) = - root n x" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 126 | by (clarsimp split: split_root elim!: sgn_power_injE simp: sgn_minus) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 127 | |
| 63467 | 128 | lemma real_root_less_mono: "0 < n \<Longrightarrow> x < y \<Longrightarrow> root n x < root n y" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 129 | proof (clarsimp split: split_root) | 
| 63467 | 130 | have *: "0 < b \<Longrightarrow> a < 0 \<Longrightarrow> \<not> a > b" for a b :: real | 
| 131 | by auto | |
| 132 | fix a b :: real | |
| 133 | assume "0 < n" "sgn a * \<bar>a\<bar> ^ n < sgn b * \<bar>b\<bar> ^ n" | |
| 134 | then show "a < b" | |
| 135 | using power_less_imp_less_base[of a n b] | |
| 136 | power_less_imp_less_base[of "- b" n "- a"] | |
| 137 | by (simp add: sgn_real_def * [of "a ^ n" "- ((- b) ^ n)"] | |
| 138 | split: if_split_asm) | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 139 | qed | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 140 | |
| 63467 | 141 | lemma real_root_gt_zero: "0 < n \<Longrightarrow> 0 < x \<Longrightarrow> 0 < root n x" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 142 | using real_root_less_mono[of n 0 x] by simp | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 143 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 144 | lemma real_root_ge_zero: "0 \<le> x \<Longrightarrow> 0 \<le> root n x" | 
| 63467 | 145 | using real_root_gt_zero[of n x] | 
| 146 | by (cases "n = 0") (auto simp add: le_less) | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 147 | |
| 63467 | 148 | lemma real_root_pow_pos: "0 < n \<Longrightarrow> 0 < x \<Longrightarrow> root n x ^ n = x" (* TODO: rename *) | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 149 | using sgn_power_root[of n x] real_root_gt_zero[of n x] by simp | 
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 150 | |
| 63467 | 151 | lemma real_root_pow_pos2 [simp]: "0 < n \<Longrightarrow> 0 \<le> x \<Longrightarrow> root n x ^ n = x" (* TODO: rename *) | 
| 152 | by (auto simp add: order_le_less real_root_pow_pos) | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 153 | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 154 | lemma sgn_root: "0 < n \<Longrightarrow> sgn (root n x) = sgn x" | 
| 60867 | 155 | by (auto split: split_root simp: sgn_real_def) | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 156 | |
| 23046 | 157 | lemma odd_real_root_pow: "odd n \<Longrightarrow> root n x ^ n = x" | 
| 63467 | 158 | using sgn_power_root[of n x] | 
| 159 | by (simp add: odd_pos sgn_real_def split: if_split_asm) | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 160 | |
| 63467 | 161 | lemma real_root_power_cancel: "0 < n \<Longrightarrow> 0 \<le> x \<Longrightarrow> root n (x ^ n) = x" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 162 | using root_sgn_power[of n x] by (auto simp add: le_less power_0_left) | 
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 163 | |
| 23046 | 164 | lemma odd_real_root_power_cancel: "odd n \<Longrightarrow> root n (x ^ n) = x" | 
| 63467 | 165 | using root_sgn_power[of n x] | 
| 166 | by (simp add: odd_pos sgn_real_def power_0_left split: if_split_asm) | |
| 23046 | 167 | |
| 63467 | 168 | lemma real_root_pos_unique: "0 < n \<Longrightarrow> 0 \<le> y \<Longrightarrow> y ^ n = x \<Longrightarrow> root n x = y" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 169 | using root_sgn_power[of n y] by (auto simp add: le_less power_0_left) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 170 | |
| 63467 | 171 | lemma odd_real_root_unique: "odd n \<Longrightarrow> y ^ n = x \<Longrightarrow> root n x = y" | 
| 172 | by (erule subst, rule odd_real_root_power_cancel) | |
| 23046 | 173 | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 174 | lemma real_root_one [simp]: "0 < n \<Longrightarrow> root n 1 = 1" | 
| 63467 | 175 | by (simp add: real_root_pos_unique) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 176 | |
| 63467 | 177 | text \<open>Root function is strictly monotonic, hence injective.\<close> | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 178 | |
| 63467 | 179 | lemma real_root_le_mono: "0 < n \<Longrightarrow> x \<le> y \<Longrightarrow> root n x \<le> root n y" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 180 | by (auto simp add: order_le_less real_root_less_mono) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 181 | |
| 63467 | 182 | lemma real_root_less_iff [simp]: "0 < n \<Longrightarrow> root n x < root n y \<longleftrightarrow> x < y" | 
| 63558 | 183 | by (cases "x < y") (simp_all add: real_root_less_mono linorder_not_less real_root_le_mono) | 
| 22721 
d9be18bd7a28
moved root and sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
22630diff
changeset | 184 | |
| 63467 | 185 | lemma real_root_le_iff [simp]: "0 < n \<Longrightarrow> root n x \<le> root n y \<longleftrightarrow> x \<le> y" | 
| 63558 | 186 | by (cases "x \<le> y") (simp_all add: real_root_le_mono linorder_not_le real_root_less_mono) | 
| 22721 
d9be18bd7a28
moved root and sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
22630diff
changeset | 187 | |
| 63467 | 188 | lemma real_root_eq_iff [simp]: "0 < n \<Longrightarrow> root n x = root n y \<longleftrightarrow> x = y" | 
| 189 | by (simp add: order_eq_iff) | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 190 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 191 | lemmas real_root_gt_0_iff [simp] = real_root_less_iff [where x=0, simplified] | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 192 | lemmas real_root_lt_0_iff [simp] = real_root_less_iff [where y=0, simplified] | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 193 | lemmas real_root_ge_0_iff [simp] = real_root_le_iff [where x=0, simplified] | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 194 | lemmas real_root_le_0_iff [simp] = real_root_le_iff [where y=0, simplified] | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 195 | lemmas real_root_eq_0_iff [simp] = real_root_eq_iff [where y=0, simplified] | 
| 22721 
d9be18bd7a28
moved root and sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
22630diff
changeset | 196 | |
| 63467 | 197 | lemma real_root_gt_1_iff [simp]: "0 < n \<Longrightarrow> 1 < root n y \<longleftrightarrow> 1 < y" | 
| 198 | using real_root_less_iff [where x=1] by simp | |
| 23257 | 199 | |
| 63467 | 200 | lemma real_root_lt_1_iff [simp]: "0 < n \<Longrightarrow> root n x < 1 \<longleftrightarrow> x < 1" | 
| 201 | using real_root_less_iff [where y=1] by simp | |
| 202 | ||
| 203 | lemma real_root_ge_1_iff [simp]: "0 < n \<Longrightarrow> 1 \<le> root n y \<longleftrightarrow> 1 \<le> y" | |
| 204 | using real_root_le_iff [where x=1] by simp | |
| 23257 | 205 | |
| 63467 | 206 | lemma real_root_le_1_iff [simp]: "0 < n \<Longrightarrow> root n x \<le> 1 \<longleftrightarrow> x \<le> 1" | 
| 207 | using real_root_le_iff [where y=1] by simp | |
| 23257 | 208 | |
| 63467 | 209 | lemma real_root_eq_1_iff [simp]: "0 < n \<Longrightarrow> root n x = 1 \<longleftrightarrow> x = 1" | 
| 210 | using real_root_eq_iff [where y=1] by simp | |
| 23257 | 211 | |
| 212 | ||
| 63467 | 213 | text \<open>Roots of multiplication and division.\<close> | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 214 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 215 | lemma real_root_mult: "root n (x * y) = root n x * root n y" | 
| 63467 | 216 | by (auto split: split_root elim!: sgn_power_injE | 
| 217 | simp: sgn_mult abs_mult power_mult_distrib) | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 218 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 219 | lemma real_root_inverse: "root n (inverse x) = inverse (root n x)" | 
| 63467 | 220 | by (auto split: split_root elim!: sgn_power_injE | 
| 221 | simp: inverse_sgn power_inverse) | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 222 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 223 | lemma real_root_divide: "root n (x / y) = root n x / root n y" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 224 | by (simp add: divide_inverse real_root_mult real_root_inverse) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 225 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 226 | lemma real_root_abs: "0 < n \<Longrightarrow> root n \<bar>x\<bar> = \<bar>root n x\<bar>" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 227 | by (simp add: abs_if real_root_minus) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 228 | |
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 229 | lemma real_root_power: "0 < n \<Longrightarrow> root n (x ^ k) = root n x ^ k" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 230 | by (induct k) (simp_all add: real_root_mult) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 231 | |
| 63467 | 232 | |
| 233 | text \<open>Roots of roots.\<close> | |
| 23257 | 234 | |
| 235 | lemma real_root_Suc_0 [simp]: "root (Suc 0) x = x" | |
| 63467 | 236 | by (simp add: odd_real_root_unique) | 
| 23257 | 237 | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 238 | lemma real_root_mult_exp: "root (m * n) x = root m (root n x)" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 239 | by (auto split: split_root elim!: sgn_power_injE | 
| 63467 | 240 | simp: sgn_zero_iff sgn_mult power_mult[symmetric] | 
| 241 | abs_mult power_mult_distrib abs_sgn_eq) | |
| 23257 | 242 | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 243 | lemma real_root_commute: "root m (root n x) = root n (root m x)" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57275diff
changeset | 244 | by (simp add: real_root_mult_exp [symmetric] mult.commute) | 
| 23257 | 245 | |
| 63467 | 246 | |
| 247 | text \<open>Monotonicity in first argument.\<close> | |
| 23257 | 248 | |
| 63558 | 249 | lemma real_root_strict_decreasing: | 
| 250 | assumes "0 < n" "n < N" "1 < x" | |
| 251 | shows "root N x < root n x" | |
| 252 | proof - | |
| 253 | from assms have "root n (root N x) ^ n < root N (root n x) ^ N" | |
| 254 | by (simp add: real_root_commute power_strict_increasing del: real_root_pow_pos2) | |
| 255 | with assms show ?thesis by simp | |
| 256 | qed | |
| 23257 | 257 | |
| 63558 | 258 | lemma real_root_strict_increasing: | 
| 259 | assumes "0 < n" "n < N" "0 < x" "x < 1" | |
| 260 | shows "root n x < root N x" | |
| 261 | proof - | |
| 262 | from assms have "root N (root n x) ^ N < root n (root N x) ^ n" | |
| 263 | by (simp add: real_root_commute power_strict_decreasing del: real_root_pow_pos2) | |
| 264 | with assms show ?thesis by simp | |
| 265 | qed | |
| 23257 | 266 | |
| 63467 | 267 | lemma real_root_decreasing: "0 < n \<Longrightarrow> n < N \<Longrightarrow> 1 \<le> x \<Longrightarrow> root N x \<le> root n x" | 
| 268 | by (auto simp add: order_le_less real_root_strict_decreasing) | |
| 23257 | 269 | |
| 63467 | 270 | lemma real_root_increasing: "0 < n \<Longrightarrow> n < N \<Longrightarrow> 0 \<le> x \<Longrightarrow> x \<le> 1 \<Longrightarrow> root n x \<le> root N x" | 
| 271 | by (auto simp add: order_le_less real_root_strict_increasing) | |
| 23257 | 272 | |
| 63467 | 273 | |
| 274 | text \<open>Continuity and derivatives.\<close> | |
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 275 | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 276 | lemma isCont_real_root: "isCont (root n) x" | 
| 63467 | 277 | proof (cases "n > 0") | 
| 278 | case True | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 279 | let ?f = "\<lambda>y::real. sgn y * \<bar>y\<bar>^n" | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 280 |   have "continuous_on ({0..} \<union> {.. 0}) (\<lambda>x. if 0 < x then x ^ n else - ((-x) ^ n) :: real)"
 | 
| 63467 | 281 | using True by (intro continuous_on_If continuous_intros) auto | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 282 | then have "continuous_on UNIV ?f" | 
| 63467 | 283 | by (rule continuous_on_cong[THEN iffD1, rotated 2]) (auto simp: not_less le_less True) | 
| 284 | then have [simp]: "isCont ?f x" for x | |
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 285 | by (simp add: continuous_on_eq_continuous_at) | 
| 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 286 | have "isCont (root n) (?f (root n x))" | 
| 63467 | 287 | by (rule isCont_inverse_function [where f="?f" and d=1]) (auto simp: root_sgn_power True) | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 288 | then show ?thesis | 
| 63467 | 289 | by (simp add: sgn_power_root True) | 
| 290 | next | |
| 291 | case False | |
| 292 | then show ?thesis | |
| 293 | by (simp add: root_def[abs_def]) | |
| 294 | qed | |
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 295 | |
| 63467 | 296 | lemma tendsto_real_root [tendsto_intros]: | 
| 61973 | 297 | "(f \<longlongrightarrow> x) F \<Longrightarrow> ((\<lambda>x. root n (f x)) \<longlongrightarrow> root n x) F" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 298 | using isCont_tendsto_compose[OF isCont_real_root, of f x F] . | 
| 51478 
270b21f3ae0a
move continuous and continuous_on to the HOL image; isCont is an abbreviation for continuous (at x) (isCont is now restricted to a T2 space)
 hoelzl parents: 
49962diff
changeset | 299 | |
| 63467 | 300 | lemma continuous_real_root [continuous_intros]: | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 301 | "continuous F f \<Longrightarrow> continuous F (\<lambda>x. root n (f x))" | 
| 51478 
270b21f3ae0a
move continuous and continuous_on to the HOL image; isCont is an abbreviation for continuous (at x) (isCont is now restricted to a T2 space)
 hoelzl parents: 
49962diff
changeset | 302 | unfolding continuous_def by (rule tendsto_real_root) | 
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 303 | |
| 63467 | 304 | lemma continuous_on_real_root [continuous_intros]: | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 305 | "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. root n (f x))" | 
| 51478 
270b21f3ae0a
move continuous and continuous_on to the HOL image; isCont is an abbreviation for continuous (at x) (isCont is now restricted to a T2 space)
 hoelzl parents: 
49962diff
changeset | 306 | unfolding continuous_on_def by (auto intro: tendsto_real_root) | 
| 
270b21f3ae0a
move continuous and continuous_on to the HOL image; isCont is an abbreviation for continuous (at x) (isCont is now restricted to a T2 space)
 hoelzl parents: 
49962diff
changeset | 307 | |
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 308 | lemma DERIV_real_root: | 
| 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 309 | assumes n: "0 < n" | 
| 63467 | 310 | and x: "0 < x" | 
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 311 | shows "DERIV (root n) x :> inverse (real n * root n x ^ (n - Suc 0))" | 
| 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 312 | proof (rule DERIV_inverse_function) | 
| 63467 | 313 | show "0 < x" | 
| 314 | using x . | |
| 315 | show "x < x + 1" | |
| 316 | by simp | |
| 23044 | 317 | show "\<forall>y. 0 < y \<and> y < x + 1 \<longrightarrow> root n y ^ n = y" | 
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 318 | using n by simp | 
| 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 319 | show "DERIV (\<lambda>x. x ^ n) (root n x) :> real n * root n x ^ (n - Suc 0)" | 
| 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 320 | by (rule DERIV_pow) | 
| 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 321 | show "real n * root n x ^ (n - Suc 0) \<noteq> 0" | 
| 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 322 | using n x by simp | 
| 63467 | 323 | show "isCont (root n) x" | 
| 324 | by (rule isCont_real_root) | |
| 325 | qed | |
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 326 | |
| 23046 | 327 | lemma DERIV_odd_real_root: | 
| 328 | assumes n: "odd n" | |
| 63467 | 329 | and x: "x \<noteq> 0" | 
| 23046 | 330 | shows "DERIV (root n) x :> inverse (real n * root n x ^ (n - Suc 0))" | 
| 331 | proof (rule DERIV_inverse_function) | |
| 63467 | 332 | show "x - 1 < x" | 
| 333 | by simp | |
| 334 | show "x < x + 1" | |
| 335 | by simp | |
| 23046 | 336 | show "\<forall>y. x - 1 < y \<and> y < x + 1 \<longrightarrow> root n y ^ n = y" | 
| 337 | using n by (simp add: odd_real_root_pow) | |
| 338 | show "DERIV (\<lambda>x. x ^ n) (root n x) :> real n * root n x ^ (n - Suc 0)" | |
| 339 | by (rule DERIV_pow) | |
| 340 | show "real n * root n x ^ (n - Suc 0) \<noteq> 0" | |
| 341 | using odd_pos [OF n] x by simp | |
| 63467 | 342 | show "isCont (root n) x" | 
| 343 | by (rule isCont_real_root) | |
| 344 | qed | |
| 23046 | 345 | |
| 31880 | 346 | lemma DERIV_even_real_root: | 
| 63467 | 347 | assumes n: "0 < n" | 
| 348 | and "even n" | |
| 349 | and x: "x < 0" | |
| 31880 | 350 | shows "DERIV (root n) x :> inverse (- real n * root n x ^ (n - Suc 0))" | 
| 351 | proof (rule DERIV_inverse_function) | |
| 63467 | 352 | show "x - 1 < x" | 
| 353 | by simp | |
| 354 | show "x < 0" | |
| 355 | using x . | |
| 31880 | 356 | show "\<forall>y. x - 1 < y \<and> y < 0 \<longrightarrow> - (root n y ^ n) = y" | 
| 357 | proof (rule allI, rule impI, erule conjE) | |
| 358 | fix y assume "x - 1 < y" and "y < 0" | |
| 63467 | 359 | then have "root n (-y) ^ n = -y" using \<open>0 < n\<close> by simp | 
| 60758 | 360 | with real_root_minus and \<open>even n\<close> | 
| 31880 | 361 | show "- (root n y ^ n) = y" by simp | 
| 362 | qed | |
| 363 | show "DERIV (\<lambda>x. - (x ^ n)) (root n x) :> - real n * root n x ^ (n - Suc 0)" | |
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 364 | by (auto intro!: derivative_eq_intros) | 
| 31880 | 365 | show "- real n * root n x ^ (n - Suc 0) \<noteq> 0" | 
| 366 | using n x by simp | |
| 63467 | 367 | show "isCont (root n) x" | 
| 368 | by (rule isCont_real_root) | |
| 369 | qed | |
| 31880 | 370 | |
| 371 | lemma DERIV_real_root_generic: | |
| 63558 | 372 | assumes "0 < n" | 
| 373 | and "x \<noteq> 0" | |
| 374 | and "even n \<Longrightarrow> 0 < x \<Longrightarrow> D = inverse (real n * root n x ^ (n - Suc 0))" | |
| 375 | and "even n \<Longrightarrow> x < 0 \<Longrightarrow> D = - inverse (real n * root n x ^ (n - Suc 0))" | |
| 49753 | 376 | and "odd n \<Longrightarrow> D = inverse (real n * root n x ^ (n - Suc 0))" | 
| 31880 | 377 | shows "DERIV (root n) x :> D" | 
| 63467 | 378 | using assms | 
| 63558 | 379 | by (cases "even n", cases "0 < x") | 
| 380 | (auto intro: DERIV_real_root[THEN DERIV_cong] | |
| 381 | DERIV_odd_real_root[THEN DERIV_cong] | |
| 382 | DERIV_even_real_root[THEN DERIV_cong]) | |
| 31880 | 383 | |
| 63467 | 384 | |
| 60758 | 385 | subsection \<open>Square Root\<close> | 
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 386 | |
| 63467 | 387 | definition sqrt :: "real \<Rightarrow> real" | 
| 388 | where "sqrt = root 2" | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 389 | |
| 63467 | 390 | lemma pos2: "0 < (2::nat)" | 
| 391 | by simp | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 392 | |
| 63467 | 393 | lemma real_sqrt_unique: "y\<^sup>2 = x \<Longrightarrow> 0 \<le> y \<Longrightarrow> sqrt x = y" | 
| 394 | unfolding sqrt_def by (rule real_root_pos_unique [OF pos2]) | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 395 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 396 | lemma real_sqrt_abs [simp]: "sqrt (x\<^sup>2) = \<bar>x\<bar>" | 
| 63467 | 397 | apply (rule real_sqrt_unique) | 
| 63558 | 398 | apply (rule power2_abs) | 
| 63467 | 399 | apply (rule abs_ge_zero) | 
| 400 | done | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 401 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 402 | lemma real_sqrt_pow2 [simp]: "0 \<le> x \<Longrightarrow> (sqrt x)\<^sup>2 = x" | 
| 63467 | 403 | unfolding sqrt_def by (rule real_root_pow_pos2 [OF pos2]) | 
| 22856 | 404 | |
| 63558 | 405 | lemma real_sqrt_pow2_iff [simp]: "(sqrt x)\<^sup>2 = x \<longleftrightarrow> 0 \<le> x" | 
| 63467 | 406 | apply (rule iffI) | 
| 63558 | 407 | apply (erule subst) | 
| 408 | apply (rule zero_le_power2) | |
| 63467 | 409 | apply (erule real_sqrt_pow2) | 
| 410 | done | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 411 | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 412 | lemma real_sqrt_zero [simp]: "sqrt 0 = 0" | 
| 63467 | 413 | unfolding sqrt_def by (rule real_root_zero) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 414 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 415 | lemma real_sqrt_one [simp]: "sqrt 1 = 1" | 
| 63467 | 416 | unfolding sqrt_def by (rule real_root_one [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 417 | |
| 56889 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56536diff
changeset | 418 | lemma real_sqrt_four [simp]: "sqrt 4 = 2" | 
| 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56536diff
changeset | 419 | using real_sqrt_abs[of 2] by simp | 
| 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56536diff
changeset | 420 | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 421 | lemma real_sqrt_minus: "sqrt (- x) = - sqrt x" | 
| 63467 | 422 | unfolding sqrt_def by (rule real_root_minus) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 423 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 424 | lemma real_sqrt_mult: "sqrt (x * y) = sqrt x * sqrt y" | 
| 63467 | 425 | unfolding sqrt_def by (rule real_root_mult) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 426 | |
| 56889 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56536diff
changeset | 427 | lemma real_sqrt_mult_self[simp]: "sqrt a * sqrt a = \<bar>a\<bar>" | 
| 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56536diff
changeset | 428 | using real_sqrt_abs[of a] unfolding power2_eq_square real_sqrt_mult . | 
| 
48a745e1bde7
avoid the Complex constructor, use the more natural Re/Im view; moved csqrt to Complex.
 hoelzl parents: 
56536diff
changeset | 429 | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 430 | lemma real_sqrt_inverse: "sqrt (inverse x) = inverse (sqrt x)" | 
| 63467 | 431 | unfolding sqrt_def by (rule real_root_inverse) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 432 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 433 | lemma real_sqrt_divide: "sqrt (x / y) = sqrt x / sqrt y" | 
| 63467 | 434 | unfolding sqrt_def by (rule real_root_divide) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 435 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 436 | lemma real_sqrt_power: "sqrt (x ^ k) = sqrt x ^ k" | 
| 63467 | 437 | unfolding sqrt_def by (rule real_root_power [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 438 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 439 | lemma real_sqrt_gt_zero: "0 < x \<Longrightarrow> 0 < sqrt x" | 
| 63467 | 440 | unfolding sqrt_def by (rule real_root_gt_zero [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 441 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 442 | lemma real_sqrt_ge_zero: "0 \<le> x \<Longrightarrow> 0 \<le> sqrt x" | 
| 63467 | 443 | unfolding sqrt_def by (rule real_root_ge_zero) | 
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 444 | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 445 | lemma real_sqrt_less_mono: "x < y \<Longrightarrow> sqrt x < sqrt y" | 
| 63467 | 446 | unfolding sqrt_def by (rule real_root_less_mono [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 447 | |
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 448 | lemma real_sqrt_le_mono: "x \<le> y \<Longrightarrow> sqrt x \<le> sqrt y" | 
| 63467 | 449 | unfolding sqrt_def by (rule real_root_le_mono [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 450 | |
| 63558 | 451 | lemma real_sqrt_less_iff [simp]: "sqrt x < sqrt y \<longleftrightarrow> x < y" | 
| 63467 | 452 | unfolding sqrt_def by (rule real_root_less_iff [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 453 | |
| 63558 | 454 | lemma real_sqrt_le_iff [simp]: "sqrt x \<le> sqrt y \<longleftrightarrow> x \<le> y" | 
| 63467 | 455 | unfolding sqrt_def by (rule real_root_le_iff [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 456 | |
| 63558 | 457 | lemma real_sqrt_eq_iff [simp]: "sqrt x = sqrt y \<longleftrightarrow> x = y" | 
| 63467 | 458 | unfolding sqrt_def by (rule real_root_eq_iff [OF pos2]) | 
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 459 | |
| 62381 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62347diff
changeset | 460 | lemma real_less_lsqrt: "0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> x < y\<^sup>2 \<Longrightarrow> sqrt x < y" | 
| 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62347diff
changeset | 461 | using real_sqrt_less_iff[of x "y\<^sup>2"] by simp | 
| 
a6479cb85944
New and revised material for (multivariate) analysis
 paulson <lp15@cam.ac.uk> parents: 
62347diff
changeset | 462 | |
| 54413 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 463 | lemma real_le_lsqrt: "0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> x \<le> y\<^sup>2 \<Longrightarrow> sqrt x \<le> y" | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 464 | using real_sqrt_le_iff[of x "y\<^sup>2"] by simp | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 465 | |
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 466 | lemma real_le_rsqrt: "x\<^sup>2 \<le> y \<Longrightarrow> x \<le> sqrt y" | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 467 | using real_sqrt_le_mono[of "x\<^sup>2" y] by simp | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 468 | |
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 469 | lemma real_less_rsqrt: "x\<^sup>2 < y \<Longrightarrow> x < sqrt y" | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 470 | using real_sqrt_less_mono[of "x\<^sup>2" y] by simp | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 471 | |
| 63467 | 472 | lemma sqrt_le_D: "sqrt x \<le> y \<Longrightarrow> x \<le> y\<^sup>2" | 
| 62131 
1baed43f453e
nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
 paulson parents: 
61973diff
changeset | 473 | by (meson not_le real_less_rsqrt) | 
| 
1baed43f453e
nonneg_Reals, nonpos_Reals, Cauchy integral formula, etc.
 paulson parents: 
61973diff
changeset | 474 | |
| 54413 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 475 | lemma sqrt_even_pow2: | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 476 | assumes n: "even n" | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 477 | shows "sqrt (2 ^ n) = 2 ^ (n div 2)" | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 478 | proof - | 
| 58709 
efdc6c533bd3
prefer generic elimination rules for even/odd over specialized unfold rules for nat
 haftmann parents: 
57514diff
changeset | 479 | from n obtain m where m: "n = 2 * m" .. | 
| 54413 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 480 | from m have "sqrt (2 ^ n) = sqrt ((2 ^ m)\<^sup>2)" | 
| 57512 
cc97b347b301
reduced name variants for assoc and commute on plus and mult
 haftmann parents: 
57275diff
changeset | 481 | by (simp only: power_mult[symmetric] mult.commute) | 
| 54413 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 482 | then show ?thesis | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 483 | using m by simp | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 484 | qed | 
| 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 485 | |
| 53594 | 486 | lemmas real_sqrt_gt_0_iff [simp] = real_sqrt_less_iff [where x=0, unfolded real_sqrt_zero] | 
| 487 | lemmas real_sqrt_lt_0_iff [simp] = real_sqrt_less_iff [where y=0, unfolded real_sqrt_zero] | |
| 488 | lemmas real_sqrt_ge_0_iff [simp] = real_sqrt_le_iff [where x=0, unfolded real_sqrt_zero] | |
| 489 | lemmas real_sqrt_le_0_iff [simp] = real_sqrt_le_iff [where y=0, unfolded real_sqrt_zero] | |
| 490 | lemmas real_sqrt_eq_0_iff [simp] = real_sqrt_eq_iff [where y=0, unfolded real_sqrt_zero] | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 491 | |
| 53594 | 492 | lemmas real_sqrt_gt_1_iff [simp] = real_sqrt_less_iff [where x=1, unfolded real_sqrt_one] | 
| 493 | lemmas real_sqrt_lt_1_iff [simp] = real_sqrt_less_iff [where y=1, unfolded real_sqrt_one] | |
| 494 | lemmas real_sqrt_ge_1_iff [simp] = real_sqrt_le_iff [where x=1, unfolded real_sqrt_one] | |
| 495 | lemmas real_sqrt_le_1_iff [simp] = real_sqrt_le_iff [where y=1, unfolded real_sqrt_one] | |
| 496 | lemmas real_sqrt_eq_1_iff [simp] = real_sqrt_eq_iff [where y=1, unfolded real_sqrt_one] | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 497 | |
| 60615 
e5fa1d5d3952
Useful lemmas. The theorem concerning swapping the variables in a double integral.
 paulson <lp15@cam.ac.uk> parents: 
60141diff
changeset | 498 | lemma sqrt_add_le_add_sqrt: | 
| 
e5fa1d5d3952
Useful lemmas. The theorem concerning swapping the variables in a double integral.
 paulson <lp15@cam.ac.uk> parents: 
60141diff
changeset | 499 | assumes "0 \<le> x" "0 \<le> y" | 
| 
e5fa1d5d3952
Useful lemmas. The theorem concerning swapping the variables in a double integral.
 paulson <lp15@cam.ac.uk> parents: 
60141diff
changeset | 500 | shows "sqrt (x + y) \<le> sqrt x + sqrt y" | 
| 63467 | 501 | by (rule power2_le_imp_le) (simp_all add: power2_sum assms) | 
| 60615 
e5fa1d5d3952
Useful lemmas. The theorem concerning swapping the variables in a double integral.
 paulson <lp15@cam.ac.uk> parents: 
60141diff
changeset | 502 | |
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 503 | lemma isCont_real_sqrt: "isCont sqrt x" | 
| 63467 | 504 | unfolding sqrt_def by (rule isCont_real_root) | 
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 505 | |
| 63467 | 506 | lemma tendsto_real_sqrt [tendsto_intros]: | 
| 61973 | 507 | "(f \<longlongrightarrow> x) F \<Longrightarrow> ((\<lambda>x. sqrt (f x)) \<longlongrightarrow> sqrt x) F" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 508 | unfolding sqrt_def by (rule tendsto_real_root) | 
| 51478 
270b21f3ae0a
move continuous and continuous_on to the HOL image; isCont is an abbreviation for continuous (at x) (isCont is now restricted to a T2 space)
 hoelzl parents: 
49962diff
changeset | 509 | |
| 63467 | 510 | lemma continuous_real_sqrt [continuous_intros]: | 
| 51478 
270b21f3ae0a
move continuous and continuous_on to the HOL image; isCont is an abbreviation for continuous (at x) (isCont is now restricted to a T2 space)
 hoelzl parents: 
49962diff
changeset | 511 | "continuous F f \<Longrightarrow> continuous F (\<lambda>x. sqrt (f x))" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 512 | unfolding sqrt_def by (rule continuous_real_root) | 
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 513 | |
| 63467 | 514 | lemma continuous_on_real_sqrt [continuous_intros]: | 
| 57155 | 515 | "continuous_on s f \<Longrightarrow> continuous_on s (\<lambda>x. sqrt (f x))" | 
| 51483 
dc39d69774bb
modernized definition of root: use the_inv, handle positive and negative case uniformly, and 0-th root is constant 0
 hoelzl parents: 
51478diff
changeset | 516 | unfolding sqrt_def by (rule continuous_on_real_root) | 
| 51478 
270b21f3ae0a
move continuous and continuous_on to the HOL image; isCont is an abbreviation for continuous (at x) (isCont is now restricted to a T2 space)
 hoelzl parents: 
49962diff
changeset | 517 | |
| 31880 | 518 | lemma DERIV_real_sqrt_generic: | 
| 519 | assumes "x \<noteq> 0" | |
| 63467 | 520 | and "x > 0 \<Longrightarrow> D = inverse (sqrt x) / 2" | 
| 521 | and "x < 0 \<Longrightarrow> D = - inverse (sqrt x) / 2" | |
| 31880 | 522 | shows "DERIV sqrt x :> D" | 
| 523 | using assms unfolding sqrt_def | |
| 524 | by (auto intro!: DERIV_real_root_generic) | |
| 525 | ||
| 63467 | 526 | lemma DERIV_real_sqrt: "0 < x \<Longrightarrow> DERIV sqrt x :> inverse (sqrt x) / 2" | 
| 31880 | 527 | using DERIV_real_sqrt_generic by simp | 
| 528 | ||
| 529 | declare | |
| 56381 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 530 | DERIV_real_sqrt_generic[THEN DERIV_chain2, derivative_intros] | 
| 
0556204bc230
merged DERIV_intros, has_derivative_intros into derivative_intros
 hoelzl parents: 
56371diff
changeset | 531 | DERIV_real_root_generic[THEN DERIV_chain2, derivative_intros] | 
| 23042 
492514b39956
add lemmas about continuity and derivatives of roots
 huffman parents: 
23009diff
changeset | 532 | |
| 63558 | 533 | lemma not_real_square_gt_zero [simp]: "\<not> 0 < x * x \<longleftrightarrow> x = 0" | 
| 534 | for x :: real | |
| 63467 | 535 | apply auto | 
| 63558 | 536 | using linorder_less_linear [where x = x and y = 0] | 
| 63467 | 537 | apply (simp add: zero_less_mult_iff) | 
| 538 | done | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 539 | |
| 63467 | 540 | lemma real_sqrt_abs2 [simp]: "sqrt (x * x) = \<bar>x\<bar>" | 
| 541 | apply (subst power2_eq_square [symmetric]) | |
| 542 | apply (rule real_sqrt_abs) | |
| 543 | done | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 544 | |
| 63467 | 545 | lemma real_inv_sqrt_pow2: "0 < x \<Longrightarrow> (inverse (sqrt x))\<^sup>2 = inverse x" | 
| 546 | by (simp add: power_inverse) | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 547 | |
| 63467 | 548 | lemma real_sqrt_eq_zero_cancel: "0 \<le> x \<Longrightarrow> sqrt x = 0 \<Longrightarrow> x = 0" | 
| 549 | by simp | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 550 | |
| 63467 | 551 | lemma real_sqrt_ge_one: "1 \<le> x \<Longrightarrow> 1 \<le> sqrt x" | 
| 552 | by simp | |
| 20687 
fedb901be392
move root and sqrt stuff from Transcendental to NthRoot
 huffman parents: 
20515diff
changeset | 553 | |
| 22443 | 554 | lemma sqrt_divide_self_eq: | 
| 555 | assumes nneg: "0 \<le> x" | |
| 556 | shows "sqrt x / x = inverse (sqrt x)" | |
| 63467 | 557 | proof (cases "x = 0") | 
| 558 | case True | |
| 559 | then show ?thesis by simp | |
| 22443 | 560 | next | 
| 63467 | 561 | case False | 
| 562 | then have pos: "0 < x" | |
| 563 | using nneg by arith | |
| 22443 | 564 | show ?thesis | 
| 63467 | 565 | proof (rule right_inverse_eq [THEN iffD1, symmetric]) | 
| 566 | show "sqrt x / x \<noteq> 0" | |
| 567 | by (simp add: divide_inverse nneg False) | |
| 22443 | 568 | show "inverse (sqrt x) / (sqrt x / x) = 1" | 
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 569 | by (simp add: divide_inverse mult.assoc [symmetric] | 
| 63467 | 570 | power2_eq_square [symmetric] real_inv_sqrt_pow2 pos False) | 
| 22443 | 571 | qed | 
| 572 | qed | |
| 573 | ||
| 54413 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 574 | lemma real_div_sqrt: "0 \<le> x \<Longrightarrow> x / sqrt x = sqrt x" | 
| 63558 | 575 | by (cases "x = 0") (simp_all add: sqrt_divide_self_eq [of x] field_simps) | 
| 54413 
88a036a95967
add finite_select_induct; move generic lemmas from MV_Analysis/Linear_Algebra to the HOL image
 hoelzl parents: 
53594diff
changeset | 576 | |
| 63558 | 577 | lemma real_divide_square_eq [simp]: "(r * a) / (r * r) = a / r" | 
| 578 | for a r :: real | |
| 579 | by (cases "r = 0") (simp_all add: divide_inverse ac_simps) | |
| 22721 
d9be18bd7a28
moved root and sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
22630diff
changeset | 580 | |
| 63467 | 581 | lemma lemma_real_divide_sqrt_less: "0 < u \<Longrightarrow> u / sqrt 2 < u" | 
| 582 | by (simp add: divide_less_eq) | |
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 583 | |
| 63558 | 584 | lemma four_x_squared: "4 * x\<^sup>2 = (2 * x)\<^sup>2" | 
| 585 | for x :: real | |
| 63467 | 586 | by (simp add: power2_eq_square) | 
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 587 | |
| 57275 
0ddb5b755cdc
moved lemmas from the proof of the Central Limit Theorem by Jeremy Avigad and Luke Serafin
 hoelzl parents: 
57155diff
changeset | 588 | lemma sqrt_at_top: "LIM x at_top. sqrt x :: real :> at_top" | 
| 
0ddb5b755cdc
moved lemmas from the proof of the Central Limit Theorem by Jeremy Avigad and Luke Serafin
 hoelzl parents: 
57155diff
changeset | 589 | by (rule filterlim_at_top_at_top[where Q="\<lambda>x. True" and P="\<lambda>x. 0 < x" and g="power2"]) | 
| 
0ddb5b755cdc
moved lemmas from the proof of the Central Limit Theorem by Jeremy Avigad and Luke Serafin
 hoelzl parents: 
57155diff
changeset | 590 | (auto intro: eventually_gt_at_top) | 
| 
0ddb5b755cdc
moved lemmas from the proof of the Central Limit Theorem by Jeremy Avigad and Luke Serafin
 hoelzl parents: 
57155diff
changeset | 591 | |
| 63467 | 592 | |
| 60758 | 593 | subsection \<open>Square Root of Sum of Squares\<close> | 
| 22856 | 594 | |
| 63558 | 595 | lemma sum_squares_bound: "2 * x * y \<le> x\<^sup>2 + y\<^sup>2" | 
| 596 | for x y :: "'a::linordered_field" | |
| 55967 | 597 | proof - | 
| 63467 | 598 | have "(x - y)\<^sup>2 = x * x - 2 * x * y + y * y" | 
| 55967 | 599 | by algebra | 
| 63467 | 600 | then have "0 \<le> x\<^sup>2 - 2 * x * y + y\<^sup>2" | 
| 55967 | 601 | by (metis sum_power2_ge_zero zero_le_double_add_iff_zero_le_single_add power2_eq_square) | 
| 602 | then show ?thesis | |
| 603 | by arith | |
| 604 | qed | |
| 22856 | 605 | |
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 606 | lemma arith_geo_mean: | 
| 63467 | 607 | fixes u :: "'a::linordered_field" | 
| 608 | assumes "u\<^sup>2 = x * y" "x \<ge> 0" "y \<ge> 0" | |
| 609 | shows "u \<le> (x + y)/2" | |
| 610 | apply (rule power2_le_imp_le) | |
| 611 | using sum_squares_bound assms | |
| 612 | apply (auto simp: zero_le_mult_iff) | |
| 613 | apply (auto simp: algebra_simps power2_eq_square) | |
| 614 | done | |
| 55967 | 615 | |
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 616 | lemma arith_geo_mean_sqrt: | 
| 63558 | 617 | fixes x :: real | 
| 618 | assumes "x \<ge> 0" "y \<ge> 0" | |
| 619 | shows "sqrt (x * y) \<le> (x + y)/2" | |
| 55967 | 620 | apply (rule arith_geo_mean) | 
| 621 | using assms | |
| 622 | apply (auto simp: zero_le_mult_iff) | |
| 623 | done | |
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 624 | |
| 63558 | 625 | lemma real_sqrt_sum_squares_mult_ge_zero [simp]: "0 \<le> sqrt ((x\<^sup>2 + y\<^sup>2) * (xa\<^sup>2 + ya\<^sup>2))" | 
| 55967 | 626 | by (metis real_sqrt_ge_0_iff split_mult_pos_le sum_power2_ge_zero) | 
| 22856 | 627 | |
| 628 | lemma real_sqrt_sum_squares_mult_squared_eq [simp]: | |
| 63467 | 629 | "(sqrt ((x\<^sup>2 + y\<^sup>2) * (xa\<^sup>2 + ya\<^sup>2)))\<^sup>2 = (x\<^sup>2 + y\<^sup>2) * (xa\<^sup>2 + ya\<^sup>2)" | 
| 44320 | 630 | by (simp add: zero_le_mult_iff) | 
| 22856 | 631 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 632 | lemma real_sqrt_sum_squares_eq_cancel: "sqrt (x\<^sup>2 + y\<^sup>2) = x \<Longrightarrow> y = 0" | 
| 63467 | 633 | by (drule arg_cong [where f = "\<lambda>x. x\<^sup>2"]) simp | 
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 634 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 635 | lemma real_sqrt_sum_squares_eq_cancel2: "sqrt (x\<^sup>2 + y\<^sup>2) = y \<Longrightarrow> x = 0" | 
| 63467 | 636 | by (drule arg_cong [where f = "\<lambda>x. x\<^sup>2"]) simp | 
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 637 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 638 | lemma real_sqrt_sum_squares_ge1 [simp]: "x \<le> sqrt (x\<^sup>2 + y\<^sup>2)" | 
| 63467 | 639 | by (rule power2_le_imp_le) simp_all | 
| 22856 | 640 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 641 | lemma real_sqrt_sum_squares_ge2 [simp]: "y \<le> sqrt (x\<^sup>2 + y\<^sup>2)" | 
| 63467 | 642 | by (rule power2_le_imp_le) simp_all | 
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 643 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 644 | lemma real_sqrt_ge_abs1 [simp]: "\<bar>x\<bar> \<le> sqrt (x\<^sup>2 + y\<^sup>2)" | 
| 63467 | 645 | by (rule power2_le_imp_le) simp_all | 
| 22856 | 646 | |
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 647 | lemma real_sqrt_ge_abs2 [simp]: "\<bar>y\<bar> \<le> sqrt (x\<^sup>2 + y\<^sup>2)" | 
| 63467 | 648 | by (rule power2_le_imp_le) simp_all | 
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 649 | |
| 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 650 | lemma le_real_sqrt_sumsq [simp]: "x \<le> sqrt (x * x + y * y)" | 
| 63467 | 651 | by (simp add: power2_eq_square [symmetric]) | 
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 652 | |
| 22858 | 653 | lemma real_sqrt_sum_squares_triangle_ineq: | 
| 53015 
a1119cf551e8
standardized symbols via "isabelle update_sub_sup", excluding src/Pure and src/Tools/WWW_Find;
 wenzelm parents: 
51483diff
changeset | 654 | "sqrt ((a + c)\<^sup>2 + (b + d)\<^sup>2) \<le> sqrt (a\<^sup>2 + b\<^sup>2) + sqrt (c\<^sup>2 + d\<^sup>2)" | 
| 63467 | 655 | apply (rule power2_le_imp_le) | 
| 63558 | 656 | apply simp | 
| 657 | apply (simp add: power2_sum) | |
| 658 | apply (simp only: mult.assoc distrib_left [symmetric]) | |
| 659 | apply (rule mult_left_mono) | |
| 660 | apply (rule power2_le_imp_le) | |
| 661 | apply (simp add: power2_sum power_mult_distrib) | |
| 662 | apply (simp add: ring_distribs) | |
| 663 | apply (subgoal_tac "0 \<le> b\<^sup>2 * c\<^sup>2 + a\<^sup>2 * d\<^sup>2 - 2 * (a * c) * (b * d)") | |
| 664 | apply simp | |
| 665 | apply (rule_tac b="(a * d - b * c)\<^sup>2" in ord_le_eq_trans) | |
| 666 | apply (rule zero_le_power2) | |
| 667 | apply (simp add: power2_diff power_mult_distrib) | |
| 668 | apply simp | |
| 669 | apply simp | |
| 63467 | 670 | apply (simp add: add_increasing) | 
| 671 | done | |
| 22858 | 672 | |
| 63467 | 673 | lemma real_sqrt_sum_squares_less: "\<bar>x\<bar> < u / sqrt 2 \<Longrightarrow> \<bar>y\<bar> < u / sqrt 2 \<Longrightarrow> sqrt (x\<^sup>2 + y\<^sup>2) < u" | 
| 674 | apply (rule power2_less_imp_less) | |
| 63558 | 675 | apply simp | 
| 676 | apply (drule power_strict_mono [OF _ abs_ge_zero pos2]) | |
| 677 | apply (drule power_strict_mono [OF _ abs_ge_zero pos2]) | |
| 678 | apply (simp add: power_divide) | |
| 63467 | 679 | apply (drule order_le_less_trans [OF abs_ge_zero]) | 
| 680 | apply (simp add: zero_less_divide_iff) | |
| 681 | done | |
| 23122 | 682 | |
| 59741 
5b762cd73a8e
Lots of new material on complex-valued functions. Modified simplification of (x/n)^k
 paulson <lp15@cam.ac.uk> parents: 
58889diff
changeset | 683 | lemma sqrt2_less_2: "sqrt 2 < (2::real)" | 
| 63467 | 684 | by (metis not_less not_less_iff_gr_or_eq numeral_less_iff real_sqrt_four | 
| 685 | real_sqrt_le_iff semiring_norm(75) semiring_norm(78) semiring_norm(85)) | |
| 59741 
5b762cd73a8e
Lots of new material on complex-valued functions. Modified simplification of (x/n)^k
 paulson <lp15@cam.ac.uk> parents: 
58889diff
changeset | 686 | |
| 
5b762cd73a8e
Lots of new material on complex-valued functions. Modified simplification of (x/n)^k
 paulson <lp15@cam.ac.uk> parents: 
58889diff
changeset | 687 | |
| 63467 | 688 | text \<open>Needed for the infinitely close relation over the nonstandard complex numbers.\<close> | 
| 23049 
11607c283074
moved sqrt lemmas from Transcendental.thy to NthRoot.thy
 huffman parents: 
23047diff
changeset | 689 | lemma lemma_sqrt_hcomplex_capprox: | 
| 63467 | 690 | "0 < u \<Longrightarrow> x < u/2 \<Longrightarrow> y < u/2 \<Longrightarrow> 0 \<le> x \<Longrightarrow> 0 \<le> y \<Longrightarrow> sqrt (x\<^sup>2 + y\<^sup>2) < u" | 
| 59741 
5b762cd73a8e
Lots of new material on complex-valued functions. Modified simplification of (x/n)^k
 paulson <lp15@cam.ac.uk> parents: 
58889diff
changeset | 691 | apply (rule real_sqrt_sum_squares_less) | 
| 63558 | 692 | apply (auto simp add: abs_if field_simps) | 
| 693 | apply (rule le_less_trans [where y = "x*2"]) | |
| 63467 | 694 | using less_eq_real_def sqrt2_less_2 | 
| 63558 | 695 | apply force | 
| 696 | apply assumption | |
| 59741 
5b762cd73a8e
Lots of new material on complex-valued functions. Modified simplification of (x/n)^k
 paulson <lp15@cam.ac.uk> parents: 
58889diff
changeset | 697 | apply (rule le_less_trans [where y = "y*2"]) | 
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 698 | using less_eq_real_def sqrt2_less_2 mult_le_cancel_left | 
| 63558 | 699 | apply auto | 
| 59741 
5b762cd73a8e
Lots of new material on complex-valued functions. Modified simplification of (x/n)^k
 paulson <lp15@cam.ac.uk> parents: 
58889diff
changeset | 700 | done | 
| 61609 
77b453bd616f
Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
 paulson <lp15@cam.ac.uk> parents: 
60867diff
changeset | 701 | |
| 61969 | 702 | lemma LIMSEQ_root: "(\<lambda>n. root n n) \<longlonglongrightarrow> 1" | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 703 | proof - | 
| 63040 | 704 | define x where "x n = root n n - 1" for n | 
| 61969 | 705 | have "x \<longlonglongrightarrow> sqrt 0" | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 706 | proof (rule tendsto_sandwich[OF _ _ tendsto_const]) | 
| 61969 | 707 | show "(\<lambda>x. sqrt (2 / x)) \<longlonglongrightarrow> sqrt 0" | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 708 | by (intro tendsto_intros tendsto_divide_0[OF tendsto_const] filterlim_mono[OF filterlim_real_sequentially]) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 709 | (simp_all add: at_infinity_eq_at_top_bot) | 
| 63467 | 710 | have "x n \<le> sqrt (2 / real n)" if "2 < n" for n :: nat | 
| 711 | proof - | |
| 712 | have "1 + (real (n - 1) * n) / 2 * (x n)\<^sup>2 = 1 + of_nat (n choose 2) * (x n)\<^sup>2" | |
| 63417 
c184ec919c70
more lemmas to emphasize {0::nat..(<)n} as canonical representation of intervals on nat
 haftmann parents: 
63367diff
changeset | 713 | by (auto simp add: choose_two of_nat_div mod_eq_0_iff_dvd) | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 714 |       also have "\<dots> \<le> (\<Sum>k\<in>{0, 2}. of_nat (n choose k) * x n^k)"
 | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 715 | by (simp add: x_def) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 716 | also have "\<dots> \<le> (\<Sum>k=0..n. of_nat (n choose k) * x n^k)" | 
| 63467 | 717 | using \<open>2 < n\<close> | 
| 718 | by (intro setsum_mono2) (auto intro!: mult_nonneg_nonneg zero_le_power simp: x_def le_diff_eq) | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 719 | also have "\<dots> = (x n + 1) ^ n" | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 720 | by (simp add: binomial_ring) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 721 | also have "\<dots> = n" | 
| 60758 | 722 | using \<open>2 < n\<close> by (simp add: x_def) | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 723 | finally have "real (n - 1) * (real n / 2 * (x n)\<^sup>2) \<le> real (n - 1) * 1" | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 724 | by simp | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 725 | then have "(x n)\<^sup>2 \<le> 2 / real n" | 
| 60758 | 726 | using \<open>2 < n\<close> unfolding mult_le_cancel_left by (simp add: field_simps) | 
| 63467 | 727 | from real_sqrt_le_mono[OF this] show ?thesis | 
| 728 | by simp | |
| 729 | qed | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 730 | then show "eventually (\<lambda>n. x n \<le> sqrt (2 / real n)) sequentially" | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 731 | by (auto intro!: exI[of _ 3] simp: eventually_sequentially) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 732 | show "eventually (\<lambda>n. sqrt 0 \<le> x n) sequentially" | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 733 | by (auto intro!: exI[of _ 1] simp: eventually_sequentially le_diff_eq x_def) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 734 | qed | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 735 | from tendsto_add[OF this tendsto_const[of 1]] show ?thesis | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 736 | by (simp add: x_def) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 737 | qed | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 738 | |
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 739 | lemma LIMSEQ_root_const: | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 740 | assumes "0 < c" | 
| 61969 | 741 | shows "(\<lambda>n. root n c) \<longlonglongrightarrow> 1" | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 742 | proof - | 
| 63467 | 743 | have ge_1: "(\<lambda>n. root n c) \<longlonglongrightarrow> 1" if "1 \<le> c" for c :: real | 
| 744 | proof - | |
| 63040 | 745 | define x where "x n = root n c - 1" for n | 
| 61969 | 746 | have "x \<longlonglongrightarrow> 0" | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 747 | proof (rule tendsto_sandwich[OF _ _ tendsto_const]) | 
| 61969 | 748 | show "(\<lambda>n. c / n) \<longlonglongrightarrow> 0" | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 749 | by (intro tendsto_divide_0[OF tendsto_const] filterlim_mono[OF filterlim_real_sequentially]) | 
| 63467 | 750 | (simp_all add: at_infinity_eq_at_top_bot) | 
| 751 | have "x n \<le> c / n" if "1 < n" for n :: nat | |
| 752 | proof - | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 753 | have "1 + x n * n = 1 + of_nat (n choose 1) * x n^1" | 
| 63417 
c184ec919c70
more lemmas to emphasize {0::nat..(<)n} as canonical representation of intervals on nat
 haftmann parents: 
63367diff
changeset | 754 | by (simp add: choose_one) | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 755 |         also have "\<dots> \<le> (\<Sum>k\<in>{0, 1}. of_nat (n choose k) * x n^k)"
 | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 756 | by (simp add: x_def) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 757 | also have "\<dots> \<le> (\<Sum>k=0..n. of_nat (n choose k) * x n^k)" | 
| 63467 | 758 | using \<open>1 < n\<close> \<open>1 \<le> c\<close> | 
| 759 | by (intro setsum_mono2) | |
| 760 | (auto intro!: mult_nonneg_nonneg zero_le_power simp: x_def le_diff_eq) | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 761 | also have "\<dots> = (x n + 1) ^ n" | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 762 | by (simp add: binomial_ring) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 763 | also have "\<dots> = c" | 
| 60758 | 764 | using \<open>1 < n\<close> \<open>1 \<le> c\<close> by (simp add: x_def) | 
| 63467 | 765 | finally show ?thesis | 
| 766 | using \<open>1 \<le> c\<close> \<open>1 < n\<close> by (simp add: field_simps) | |
| 767 | qed | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 768 | then show "eventually (\<lambda>n. x n \<le> c / n) sequentially" | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 769 | by (auto intro!: exI[of _ 3] simp: eventually_sequentially) | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 770 | show "eventually (\<lambda>n. 0 \<le> x n) sequentially" | 
| 63467 | 771 | using \<open>1 \<le> c\<close> | 
| 772 | by (auto intro!: exI[of _ 1] simp: eventually_sequentially le_diff_eq x_def) | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 773 | qed | 
| 63467 | 774 | from tendsto_add[OF this tendsto_const[of 1]] show ?thesis | 
| 775 | by (simp add: x_def) | |
| 776 | qed | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 777 | show ?thesis | 
| 63467 | 778 | proof (cases "1 \<le> c") | 
| 779 | case True | |
| 780 | with ge_1 show ?thesis by blast | |
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 781 | next | 
| 63467 | 782 | case False | 
| 60758 | 783 | with \<open>0 < c\<close> have "1 \<le> 1 / c" | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 784 | by simp | 
| 61969 | 785 | then have "(\<lambda>n. 1 / root n (1 / c)) \<longlonglongrightarrow> 1 / 1" | 
| 60758 | 786 | by (intro tendsto_divide tendsto_const ge_1 \<open>1 \<le> 1 / c\<close> one_neq_zero) | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 787 | then show ?thesis | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 788 | by (rule filterlim_cong[THEN iffD1, rotated 3]) | 
| 63467 | 789 | (auto intro!: exI[of _ 1] simp: eventually_sequentially real_root_divide) | 
| 60141 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 790 | qed | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 791 | qed | 
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 792 | |
| 
833adf7db7d8
New material, mostly about limits. Consolidation.
 paulson <lp15@cam.ac.uk> parents: 
59741diff
changeset | 793 | |
| 22956 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 794 | text "Legacy theorem names:" | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 795 | lemmas real_root_pos2 = real_root_power_cancel | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 796 | lemmas real_root_pos_pos = real_root_gt_zero [THEN order_less_imp_le] | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 797 | lemmas real_root_pos_pos_le = real_root_ge_zero | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 798 | lemmas real_sqrt_mult_distrib = real_sqrt_mult | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 799 | lemmas real_sqrt_mult_distrib2 = real_sqrt_mult | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 800 | lemmas real_sqrt_eq_zero_cancel_iff = real_sqrt_eq_0_iff | 
| 
617140080e6a
define roots of negative reals so that many lemmas no longer require side conditions; simplification solves more goals than previously
 huffman parents: 
22943diff
changeset | 801 | |
| 14324 | 802 | end |