src/HOL/Hyperreal/NthRoot.thy
 author huffman Sun May 20 09:21:04 2007 +0200 (2007-05-20) changeset 23047 17f7d831efe2 parent 23046 12f35ece221f child 23049 11607c283074 permissions -rw-r--r--
add realpow_pos_nth2 back in
 paulson@12196 ` 1` ```(* Title : NthRoot.thy ``` paulson@12196 ` 2` ``` Author : Jacques D. Fleuriot ``` paulson@12196 ` 3` ``` Copyright : 1998 University of Cambridge ``` paulson@14477 ` 4` ``` Conversion to Isar and new proofs by Lawrence C Paulson, 2004 ``` paulson@12196 ` 5` ```*) ``` paulson@12196 ` 6` huffman@22956 ` 7` ```header {* Nth Roots of Real Numbers *} ``` paulson@14324 ` 8` nipkow@15131 ` 9` ```theory NthRoot ``` huffman@23009 ` 10` ```imports SEQ Parity Deriv ``` nipkow@15131 ` 11` ```begin ``` paulson@14324 ` 12` huffman@22956 ` 13` ```subsection {* Existence of Nth Root *} ``` huffman@20687 ` 14` huffman@23009 ` 15` ```text {* Existence follows from the Intermediate Value Theorem *} ``` paulson@14324 ` 16` huffman@23009 ` 17` ```lemma realpow_pos_nth: ``` huffman@23009 ` 18` ``` assumes n: "0 < n" ``` huffman@23009 ` 19` ``` assumes a: "0 < a" ``` huffman@23009 ` 20` ``` shows "\r>0. r ^ n = (a::real)" ``` huffman@23009 ` 21` ```proof - ``` huffman@23009 ` 22` ``` have "\r\0. r \ (max 1 a) \ r ^ n = a" ``` huffman@23009 ` 23` ``` proof (rule IVT) ``` huffman@23009 ` 24` ``` show "0 ^ n \ a" using n a by (simp add: power_0_left) ``` huffman@23009 ` 25` ``` show "0 \ max 1 a" by simp ``` huffman@23009 ` 26` ``` from n have n1: "1 \ n" by simp ``` huffman@23009 ` 27` ``` have "a \ max 1 a ^ 1" by simp ``` huffman@23009 ` 28` ``` also have "max 1 a ^ 1 \ max 1 a ^ n" ``` huffman@23009 ` 29` ``` using n1 by (rule power_increasing, simp) ``` huffman@23009 ` 30` ``` finally show "a \ max 1 a ^ n" . ``` huffman@23009 ` 31` ``` show "\r. 0 \ r \ r \ max 1 a \ isCont (\x. x ^ n) r" ``` huffman@23009 ` 32` ``` by (simp add: isCont_power isCont_Id) ``` huffman@23009 ` 33` ``` qed ``` huffman@23009 ` 34` ``` then obtain r where r: "0 \ r \ r ^ n = a" by fast ``` huffman@23009 ` 35` ``` with n a have "r \ 0" by (auto simp add: power_0_left) ``` huffman@23009 ` 36` ``` with r have "0 < r \ r ^ n = a" by simp ``` huffman@23009 ` 37` ``` thus ?thesis .. ``` huffman@23009 ` 38` ```qed ``` paulson@14325 ` 39` huffman@23047 ` 40` ```(* Used by Integration/RealRandVar.thy in AFP *) ``` huffman@23047 ` 41` ```lemma realpow_pos_nth2: "(0::real) < a \ \r>0. r ^ Suc n = a" ``` huffman@23047 ` 42` ```by (blast intro: realpow_pos_nth) ``` huffman@23047 ` 43` huffman@23009 ` 44` ```text {* Uniqueness of nth positive root *} ``` paulson@14324 ` 45` paulson@14324 ` 46` ```lemma realpow_pos_nth_unique: ``` huffman@23009 ` 47` ``` "\0 < n; 0 < a\ \ \!r. 0 < r \ r ^ n = (a::real)" ``` paulson@14324 ` 48` ```apply (auto intro!: realpow_pos_nth) ``` huffman@23009 ` 49` ```apply (rule_tac n=n in power_eq_imp_eq_base, simp_all) ``` paulson@14324 ` 50` ```done ``` paulson@14324 ` 51` huffman@20687 ` 52` ```subsection {* Nth Root *} ``` huffman@20687 ` 53` huffman@22956 ` 54` ```text {* We define roots of negative reals such that ``` huffman@22956 ` 55` ``` @{term "root n (- x) = - root n x"}. This allows ``` huffman@22956 ` 56` ``` us to omit side conditions from many theorems. *} ``` huffman@20687 ` 57` huffman@22956 ` 58` ```definition ``` huffman@22956 ` 59` ``` root :: "[nat, real] \ real" where ``` huffman@22956 ` 60` ``` "root n x = (if 0 < x then (THE u. 0 < u \ u ^ n = x) else ``` huffman@22956 ` 61` ``` if x < 0 then - (THE u. 0 < u \ u ^ n = - x) else 0)" ``` huffman@20687 ` 62` huffman@22956 ` 63` ```lemma real_root_zero [simp]: "root n 0 = 0" ``` huffman@22956 ` 64` ```unfolding root_def by simp ``` huffman@22956 ` 65` huffman@22956 ` 66` ```lemma real_root_minus: "0 < n \ root n (- x) = - root n x" ``` huffman@22956 ` 67` ```unfolding root_def by simp ``` huffman@22956 ` 68` huffman@22956 ` 69` ```lemma real_root_gt_zero: "\0 < n; 0 < x\ \ 0 < root n x" ``` huffman@20687 ` 70` ```apply (simp add: root_def) ``` huffman@22956 ` 71` ```apply (drule (1) realpow_pos_nth_unique) ``` huffman@20687 ` 72` ```apply (erule theI' [THEN conjunct1]) ``` huffman@20687 ` 73` ```done ``` huffman@20687 ` 74` huffman@22956 ` 75` ```lemma real_root_pow_pos: (* TODO: rename *) ``` huffman@22956 ` 76` ``` "\0 < n; 0 < x\ \ root n x ^ n = x" ``` huffman@22956 ` 77` ```apply (simp add: root_def) ``` huffman@22956 ` 78` ```apply (drule (1) realpow_pos_nth_unique) ``` huffman@22956 ` 79` ```apply (erule theI' [THEN conjunct2]) ``` huffman@22956 ` 80` ```done ``` huffman@20687 ` 81` huffman@22956 ` 82` ```lemma real_root_pow_pos2 [simp]: (* TODO: rename *) ``` huffman@22956 ` 83` ``` "\0 < n; 0 \ x\ \ root n x ^ n = x" ``` huffman@22956 ` 84` ```by (auto simp add: order_le_less real_root_pow_pos) ``` huffman@22956 ` 85` huffman@23046 ` 86` ```lemma odd_pos: "odd (n::nat) \ 0 < n" ``` huffman@23046 ` 87` ```by (cases n, simp_all) ``` huffman@23046 ` 88` huffman@23046 ` 89` ```lemma odd_real_root_pow: "odd n \ root n x ^ n = x" ``` huffman@23046 ` 90` ```apply (rule_tac x=0 and y=x in linorder_le_cases) ``` huffman@23046 ` 91` ```apply (erule (1) real_root_pow_pos2 [OF odd_pos]) ``` huffman@23046 ` 92` ```apply (subgoal_tac "root n (- x) ^ n = - x") ``` huffman@23046 ` 93` ```apply (simp add: real_root_minus odd_pos) ``` huffman@23046 ` 94` ```apply (simp add: odd_pos) ``` huffman@23046 ` 95` ```done ``` huffman@23046 ` 96` huffman@22956 ` 97` ```lemma real_root_ge_zero: "\0 < n; 0 \ x\ \ 0 \ root n x" ``` huffman@20687 ` 98` ```by (auto simp add: order_le_less real_root_gt_zero) ``` huffman@20687 ` 99` huffman@22956 ` 100` ```lemma real_root_power_cancel: "\0 < n; 0 \ x\ \ root n (x ^ n) = x" ``` huffman@22956 ` 101` ```apply (subgoal_tac "0 \ x ^ n") ``` huffman@22956 ` 102` ```apply (subgoal_tac "0 \ root n (x ^ n)") ``` huffman@22956 ` 103` ```apply (subgoal_tac "root n (x ^ n) ^ n = x ^ n") ``` huffman@22956 ` 104` ```apply (erule (3) power_eq_imp_eq_base) ``` huffman@22956 ` 105` ```apply (erule (1) real_root_pow_pos2) ``` huffman@22956 ` 106` ```apply (erule (1) real_root_ge_zero) ``` huffman@22956 ` 107` ```apply (erule zero_le_power) ``` huffman@20687 ` 108` ```done ``` huffman@20687 ` 109` huffman@23046 ` 110` ```lemma odd_real_root_power_cancel: "odd n \ root n (x ^ n) = x" ``` huffman@23046 ` 111` ```apply (rule_tac x=0 and y=x in linorder_le_cases) ``` huffman@23046 ` 112` ```apply (erule (1) real_root_power_cancel [OF odd_pos]) ``` huffman@23046 ` 113` ```apply (subgoal_tac "root n ((- x) ^ n) = - x") ``` huffman@23046 ` 114` ```apply (simp add: real_root_minus odd_pos) ``` huffman@23046 ` 115` ```apply (erule real_root_power_cancel [OF odd_pos], simp) ``` huffman@23046 ` 116` ```done ``` huffman@23046 ` 117` huffman@22956 ` 118` ```lemma real_root_pos_unique: ``` huffman@22956 ` 119` ``` "\0 < n; 0 \ y; y ^ n = x\ \ root n x = y" ``` huffman@22956 ` 120` ```by (erule subst, rule real_root_power_cancel) ``` huffman@22956 ` 121` huffman@23046 ` 122` ```lemma odd_real_root_unique: ``` huffman@23046 ` 123` ``` "\odd n; y ^ n = x\ \ root n x = y" ``` huffman@23046 ` 124` ```by (erule subst, rule odd_real_root_power_cancel) ``` huffman@23046 ` 125` huffman@22956 ` 126` ```lemma real_root_one [simp]: "0 < n \ root n 1 = 1" ``` huffman@22956 ` 127` ```by (simp add: real_root_pos_unique) ``` huffman@22956 ` 128` huffman@22956 ` 129` ```text {* Root function is strictly monotonic, hence injective *} ``` huffman@22956 ` 130` huffman@22956 ` 131` ```lemma real_root_less_mono_lemma: ``` huffman@22956 ` 132` ``` "\0 < n; 0 \ x; x < y\ \ root n x < root n y" ``` huffman@22856 ` 133` ```apply (subgoal_tac "0 \ y") ``` huffman@22956 ` 134` ```apply (subgoal_tac "root n x ^ n < root n y ^ n") ``` huffman@22956 ` 135` ```apply (erule power_less_imp_less_base) ``` huffman@22956 ` 136` ```apply (erule (1) real_root_ge_zero) ``` huffman@22956 ` 137` ```apply simp ``` huffman@22956 ` 138` ```apply simp ``` huffman@22721 ` 139` ```done ``` huffman@22721 ` 140` huffman@22956 ` 141` ```lemma real_root_less_mono: "\0 < n; x < y\ \ root n x < root n y" ``` huffman@22956 ` 142` ```apply (cases "0 \ x") ``` huffman@22956 ` 143` ```apply (erule (2) real_root_less_mono_lemma) ``` huffman@22956 ` 144` ```apply (cases "0 \ y") ``` huffman@22956 ` 145` ```apply (rule_tac y=0 in order_less_le_trans) ``` huffman@22956 ` 146` ```apply (subgoal_tac "0 < root n (- x)") ``` huffman@22956 ` 147` ```apply (simp add: real_root_minus) ``` huffman@22956 ` 148` ```apply (simp add: real_root_gt_zero) ``` huffman@22956 ` 149` ```apply (simp add: real_root_ge_zero) ``` huffman@22956 ` 150` ```apply (subgoal_tac "root n (- y) < root n (- x)") ``` huffman@22956 ` 151` ```apply (simp add: real_root_minus) ``` huffman@22956 ` 152` ```apply (simp add: real_root_less_mono_lemma) ``` huffman@22721 ` 153` ```done ``` huffman@22721 ` 154` huffman@22956 ` 155` ```lemma real_root_le_mono: "\0 < n; x \ y\ \ root n x \ root n y" ``` huffman@22956 ` 156` ```by (auto simp add: order_le_less real_root_less_mono) ``` huffman@22956 ` 157` huffman@22721 ` 158` ```lemma real_root_less_iff [simp]: ``` huffman@22956 ` 159` ``` "0 < n \ (root n x < root n y) = (x < y)" ``` huffman@22956 ` 160` ```apply (cases "x < y") ``` huffman@22956 ` 161` ```apply (simp add: real_root_less_mono) ``` huffman@22956 ` 162` ```apply (simp add: linorder_not_less real_root_le_mono) ``` huffman@22721 ` 163` ```done ``` huffman@22721 ` 164` huffman@22721 ` 165` ```lemma real_root_le_iff [simp]: ``` huffman@22956 ` 166` ``` "0 < n \ (root n x \ root n y) = (x \ y)" ``` huffman@22956 ` 167` ```apply (cases "x \ y") ``` huffman@22956 ` 168` ```apply (simp add: real_root_le_mono) ``` huffman@22956 ` 169` ```apply (simp add: linorder_not_le real_root_less_mono) ``` huffman@22721 ` 170` ```done ``` huffman@22721 ` 171` huffman@22721 ` 172` ```lemma real_root_eq_iff [simp]: ``` huffman@22956 ` 173` ``` "0 < n \ (root n x = root n y) = (x = y)" ``` huffman@22956 ` 174` ```by (simp add: order_eq_iff) ``` huffman@22956 ` 175` huffman@22956 ` 176` ```lemmas real_root_gt_0_iff [simp] = real_root_less_iff [where x=0, simplified] ``` huffman@22956 ` 177` ```lemmas real_root_lt_0_iff [simp] = real_root_less_iff [where y=0, simplified] ``` huffman@22956 ` 178` ```lemmas real_root_ge_0_iff [simp] = real_root_le_iff [where x=0, simplified] ``` huffman@22956 ` 179` ```lemmas real_root_le_0_iff [simp] = real_root_le_iff [where y=0, simplified] ``` huffman@22956 ` 180` ```lemmas real_root_eq_0_iff [simp] = real_root_eq_iff [where y=0, simplified] ``` huffman@22721 ` 181` huffman@22956 ` 182` ```text {* Roots of multiplication and division *} ``` huffman@22956 ` 183` huffman@22956 ` 184` ```lemma real_root_mult_lemma: ``` huffman@22956 ` 185` ``` "\0 < n; 0 \ x; 0 \ y\ \ root n (x * y) = root n x * root n y" ``` huffman@22956 ` 186` ```by (simp add: real_root_pos_unique mult_nonneg_nonneg power_mult_distrib) ``` huffman@22956 ` 187` huffman@22956 ` 188` ```lemma real_root_inverse_lemma: ``` huffman@22956 ` 189` ``` "\0 < n; 0 \ x\ \ root n (inverse x) = inverse (root n x)" ``` huffman@22956 ` 190` ```by (simp add: real_root_pos_unique power_inverse [symmetric]) ``` huffman@22721 ` 191` huffman@22721 ` 192` ```lemma real_root_mult: ``` huffman@22956 ` 193` ``` assumes n: "0 < n" ``` huffman@22956 ` 194` ``` shows "root n (x * y) = root n x * root n y" ``` huffman@22956 ` 195` ```proof (rule linorder_le_cases, rule_tac [!] linorder_le_cases) ``` huffman@22956 ` 196` ``` assume "0 \ x" and "0 \ y" ``` huffman@22956 ` 197` ``` thus ?thesis by (rule real_root_mult_lemma [OF n]) ``` huffman@22956 ` 198` ```next ``` huffman@22956 ` 199` ``` assume "0 \ x" and "y \ 0" ``` huffman@22956 ` 200` ``` hence "0 \ x" and "0 \ - y" by simp_all ``` huffman@22956 ` 201` ``` hence "root n (x * - y) = root n x * root n (- y)" ``` huffman@22956 ` 202` ``` by (rule real_root_mult_lemma [OF n]) ``` huffman@22956 ` 203` ``` thus ?thesis by (simp add: real_root_minus [OF n]) ``` huffman@22956 ` 204` ```next ``` huffman@22956 ` 205` ``` assume "x \ 0" and "0 \ y" ``` huffman@22956 ` 206` ``` hence "0 \ - x" and "0 \ y" by simp_all ``` huffman@22956 ` 207` ``` hence "root n (- x * y) = root n (- x) * root n y" ``` huffman@22956 ` 208` ``` by (rule real_root_mult_lemma [OF n]) ``` huffman@22956 ` 209` ``` thus ?thesis by (simp add: real_root_minus [OF n]) ``` huffman@22956 ` 210` ```next ``` huffman@22956 ` 211` ``` assume "x \ 0" and "y \ 0" ``` huffman@22956 ` 212` ``` hence "0 \ - x" and "0 \ - y" by simp_all ``` huffman@22956 ` 213` ``` hence "root n (- x * - y) = root n (- x) * root n (- y)" ``` huffman@22956 ` 214` ``` by (rule real_root_mult_lemma [OF n]) ``` huffman@22956 ` 215` ``` thus ?thesis by (simp add: real_root_minus [OF n]) ``` huffman@22956 ` 216` ```qed ``` huffman@22721 ` 217` huffman@22721 ` 218` ```lemma real_root_inverse: ``` huffman@22956 ` 219` ``` assumes n: "0 < n" ``` huffman@22956 ` 220` ``` shows "root n (inverse x) = inverse (root n x)" ``` huffman@22956 ` 221` ```proof (rule linorder_le_cases) ``` huffman@22956 ` 222` ``` assume "0 \ x" ``` huffman@22956 ` 223` ``` thus ?thesis by (rule real_root_inverse_lemma [OF n]) ``` huffman@22956 ` 224` ```next ``` huffman@22956 ` 225` ``` assume "x \ 0" ``` huffman@22956 ` 226` ``` hence "0 \ - x" by simp ``` huffman@22956 ` 227` ``` hence "root n (inverse (- x)) = inverse (root n (- x))" ``` huffman@22956 ` 228` ``` by (rule real_root_inverse_lemma [OF n]) ``` huffman@22956 ` 229` ``` thus ?thesis by (simp add: real_root_minus [OF n]) ``` huffman@22956 ` 230` ```qed ``` huffman@22721 ` 231` huffman@22956 ` 232` ```lemma real_root_divide: ``` huffman@22956 ` 233` ``` "0 < n \ root n (x / y) = root n x / root n y" ``` huffman@22956 ` 234` ```by (simp add: divide_inverse real_root_mult real_root_inverse) ``` huffman@22956 ` 235` huffman@22956 ` 236` ```lemma real_root_power: ``` huffman@22956 ` 237` ``` "0 < n \ root n (x ^ k) = root n x ^ k" ``` huffman@22956 ` 238` ```by (induct k, simp_all add: real_root_mult) ``` huffman@22721 ` 239` huffman@23042 ` 240` ```lemma real_root_abs: "0 < n \ root n \x\ = \root n x\" ``` huffman@23042 ` 241` ```by (simp add: abs_if real_root_minus) ``` huffman@23042 ` 242` huffman@23042 ` 243` ```text {* Continuity and derivatives *} ``` huffman@23042 ` 244` huffman@23042 ` 245` ```lemma isCont_root_pos: ``` huffman@23042 ` 246` ``` assumes n: "0 < n" ``` huffman@23042 ` 247` ``` assumes x: "0 < x" ``` huffman@23042 ` 248` ``` shows "isCont (root n) x" ``` huffman@23042 ` 249` ```proof - ``` huffman@23042 ` 250` ``` have "isCont (root n) (root n x ^ n)" ``` huffman@23042 ` 251` ``` proof (rule isCont_inverse_function [where f="\a. a ^ n"]) ``` huffman@23042 ` 252` ``` show "0 < root n x" using n x by simp ``` huffman@23042 ` 253` ``` show "\z. \z - root n x\ \ root n x \ root n (z ^ n) = z" ``` huffman@23042 ` 254` ``` by (simp add: abs_le_iff real_root_power_cancel n) ``` huffman@23042 ` 255` ``` show "\z. \z - root n x\ \ root n x \ isCont (\a. a ^ n) z" ``` huffman@23042 ` 256` ``` by (simp add: isCont_power isCont_Id) ``` huffman@23042 ` 257` ``` qed ``` huffman@23042 ` 258` ``` thus ?thesis using n x by simp ``` huffman@23042 ` 259` ```qed ``` huffman@23042 ` 260` huffman@23042 ` 261` ```lemma isCont_root_neg: ``` huffman@23042 ` 262` ``` "\0 < n; x < 0\ \ isCont (root n) x" ``` huffman@23042 ` 263` ```apply (subgoal_tac "isCont (\x. - root n (- x)) x") ``` huffman@23042 ` 264` ```apply (simp add: real_root_minus) ``` huffman@23042 ` 265` ```apply (rule isCont_o2 [OF isCont_minus [OF isCont_Id]]) ``` huffman@23042 ` 266` ```apply (simp add: isCont_minus isCont_root_pos) ``` huffman@23042 ` 267` ```done ``` huffman@23042 ` 268` huffman@23042 ` 269` ```lemma isCont_root_zero: ``` huffman@23042 ` 270` ``` "0 < n \ isCont (root n) 0" ``` huffman@23042 ` 271` ```unfolding isCont_def ``` huffman@23042 ` 272` ```apply (rule LIM_I) ``` huffman@23042 ` 273` ```apply (rule_tac x="r ^ n" in exI, safe) ``` huffman@23042 ` 274` ```apply (simp add: zero_less_power) ``` huffman@23042 ` 275` ```apply (simp add: real_root_abs [symmetric]) ``` huffman@23042 ` 276` ```apply (rule_tac n="n" in power_less_imp_less_base, simp_all) ``` huffman@23042 ` 277` ```done ``` huffman@23042 ` 278` huffman@23042 ` 279` ```lemma isCont_real_root: "0 < n \ isCont (root n) x" ``` huffman@23042 ` 280` ```apply (rule_tac x=x and y=0 in linorder_cases) ``` huffman@23042 ` 281` ```apply (simp_all add: isCont_root_pos isCont_root_neg isCont_root_zero) ``` huffman@23042 ` 282` ```done ``` huffman@23042 ` 283` huffman@23042 ` 284` ```lemma DERIV_real_root: ``` huffman@23042 ` 285` ``` assumes n: "0 < n" ``` huffman@23042 ` 286` ``` assumes x: "0 < x" ``` huffman@23042 ` 287` ``` shows "DERIV (root n) x :> inverse (real n * root n x ^ (n - Suc 0))" ``` huffman@23042 ` 288` ```proof (rule DERIV_inverse_function) ``` huffman@23044 ` 289` ``` show "0 < x" using x . ``` huffman@23044 ` 290` ``` show "x < x + 1" by simp ``` huffman@23044 ` 291` ``` show "\y. 0 < y \ y < x + 1 \ root n y ^ n = y" ``` huffman@23042 ` 292` ``` using n by simp ``` huffman@23042 ` 293` ``` show "DERIV (\x. x ^ n) (root n x) :> real n * root n x ^ (n - Suc 0)" ``` huffman@23042 ` 294` ``` by (rule DERIV_pow) ``` huffman@23042 ` 295` ``` show "real n * root n x ^ (n - Suc 0) \ 0" ``` huffman@23042 ` 296` ``` using n x by simp ``` huffman@23042 ` 297` ``` show "isCont (root n) x" ``` huffman@23042 ` 298` ``` by (rule isCont_real_root) ``` huffman@23042 ` 299` ```qed ``` huffman@23042 ` 300` huffman@23046 ` 301` ```lemma DERIV_odd_real_root: ``` huffman@23046 ` 302` ``` assumes n: "odd n" ``` huffman@23046 ` 303` ``` assumes x: "x \ 0" ``` huffman@23046 ` 304` ``` shows "DERIV (root n) x :> inverse (real n * root n x ^ (n - Suc 0))" ``` huffman@23046 ` 305` ```proof (rule DERIV_inverse_function) ``` huffman@23046 ` 306` ``` show "x - 1 < x" by simp ``` huffman@23046 ` 307` ``` show "x < x + 1" by simp ``` huffman@23046 ` 308` ``` show "\y. x - 1 < y \ y < x + 1 \ root n y ^ n = y" ``` huffman@23046 ` 309` ``` using n by (simp add: odd_real_root_pow) ``` huffman@23046 ` 310` ``` show "DERIV (\x. x ^ n) (root n x) :> real n * root n x ^ (n - Suc 0)" ``` huffman@23046 ` 311` ``` by (rule DERIV_pow) ``` huffman@23046 ` 312` ``` show "real n * root n x ^ (n - Suc 0) \ 0" ``` huffman@23046 ` 313` ``` using odd_pos [OF n] x by simp ``` huffman@23046 ` 314` ``` show "isCont (root n) x" ``` huffman@23046 ` 315` ``` using odd_pos [OF n] by (rule isCont_real_root) ``` huffman@23046 ` 316` ```qed ``` huffman@23046 ` 317` huffman@22956 ` 318` ```subsection {* Square Root *} ``` huffman@20687 ` 319` huffman@22956 ` 320` ```definition ``` huffman@22956 ` 321` ``` sqrt :: "real \ real" where ``` huffman@22956 ` 322` ``` "sqrt = root 2" ``` huffman@20687 ` 323` huffman@22956 ` 324` ```lemma pos2: "0 < (2::nat)" by simp ``` huffman@22956 ` 325` huffman@22956 ` 326` ```lemma real_sqrt_unique: "\y\ = x; 0 \ y\ \ sqrt x = y" ``` huffman@22956 ` 327` ```unfolding sqrt_def by (rule real_root_pos_unique [OF pos2]) ``` huffman@20687 ` 328` huffman@22956 ` 329` ```lemma real_sqrt_abs [simp]: "sqrt (x\) = \x\" ``` huffman@22956 ` 330` ```apply (rule real_sqrt_unique) ``` huffman@22956 ` 331` ```apply (rule power2_abs) ``` huffman@22956 ` 332` ```apply (rule abs_ge_zero) ``` huffman@22956 ` 333` ```done ``` huffman@20687 ` 334` huffman@22956 ` 335` ```lemma real_sqrt_pow2 [simp]: "0 \ x \ (sqrt x)\ = x" ``` huffman@22956 ` 336` ```unfolding sqrt_def by (rule real_root_pow_pos2 [OF pos2]) ``` huffman@22856 ` 337` huffman@22956 ` 338` ```lemma real_sqrt_pow2_iff [simp]: "((sqrt x)\ = x) = (0 \ x)" ``` huffman@22856 ` 339` ```apply (rule iffI) ``` huffman@22856 ` 340` ```apply (erule subst) ``` huffman@22856 ` 341` ```apply (rule zero_le_power2) ``` huffman@22856 ` 342` ```apply (erule real_sqrt_pow2) ``` huffman@20687 ` 343` ```done ``` huffman@20687 ` 344` huffman@22956 ` 345` ```lemma real_sqrt_zero [simp]: "sqrt 0 = 0" ``` huffman@22956 ` 346` ```unfolding sqrt_def by (rule real_root_zero) ``` huffman@22956 ` 347` huffman@22956 ` 348` ```lemma real_sqrt_one [simp]: "sqrt 1 = 1" ``` huffman@22956 ` 349` ```unfolding sqrt_def by (rule real_root_one [OF pos2]) ``` huffman@22956 ` 350` huffman@22956 ` 351` ```lemma real_sqrt_minus: "sqrt (- x) = - sqrt x" ``` huffman@22956 ` 352` ```unfolding sqrt_def by (rule real_root_minus [OF pos2]) ``` huffman@22956 ` 353` huffman@22956 ` 354` ```lemma real_sqrt_mult: "sqrt (x * y) = sqrt x * sqrt y" ``` huffman@22956 ` 355` ```unfolding sqrt_def by (rule real_root_mult [OF pos2]) ``` huffman@22956 ` 356` huffman@22956 ` 357` ```lemma real_sqrt_inverse: "sqrt (inverse x) = inverse (sqrt x)" ``` huffman@22956 ` 358` ```unfolding sqrt_def by (rule real_root_inverse [OF pos2]) ``` huffman@22956 ` 359` huffman@22956 ` 360` ```lemma real_sqrt_divide: "sqrt (x / y) = sqrt x / sqrt y" ``` huffman@22956 ` 361` ```unfolding sqrt_def by (rule real_root_divide [OF pos2]) ``` huffman@22956 ` 362` huffman@22956 ` 363` ```lemma real_sqrt_power: "sqrt (x ^ k) = sqrt x ^ k" ``` huffman@22956 ` 364` ```unfolding sqrt_def by (rule real_root_power [OF pos2]) ``` huffman@22956 ` 365` huffman@22956 ` 366` ```lemma real_sqrt_gt_zero: "0 < x \ 0 < sqrt x" ``` huffman@22956 ` 367` ```unfolding sqrt_def by (rule real_root_gt_zero [OF pos2]) ``` huffman@22956 ` 368` huffman@22956 ` 369` ```lemma real_sqrt_ge_zero: "0 \ x \ 0 \ sqrt x" ``` huffman@22956 ` 370` ```unfolding sqrt_def by (rule real_root_ge_zero [OF pos2]) ``` huffman@20687 ` 371` huffman@22956 ` 372` ```lemma real_sqrt_less_mono: "x < y \ sqrt x < sqrt y" ``` huffman@22956 ` 373` ```unfolding sqrt_def by (rule real_root_less_mono [OF pos2]) ``` huffman@22956 ` 374` huffman@22956 ` 375` ```lemma real_sqrt_le_mono: "x \ y \ sqrt x \ sqrt y" ``` huffman@22956 ` 376` ```unfolding sqrt_def by (rule real_root_le_mono [OF pos2]) ``` huffman@22956 ` 377` huffman@22956 ` 378` ```lemma real_sqrt_less_iff [simp]: "(sqrt x < sqrt y) = (x < y)" ``` huffman@22956 ` 379` ```unfolding sqrt_def by (rule real_root_less_iff [OF pos2]) ``` huffman@22956 ` 380` huffman@22956 ` 381` ```lemma real_sqrt_le_iff [simp]: "(sqrt x \ sqrt y) = (x \ y)" ``` huffman@22956 ` 382` ```unfolding sqrt_def by (rule real_root_le_iff [OF pos2]) ``` huffman@22956 ` 383` huffman@22956 ` 384` ```lemma real_sqrt_eq_iff [simp]: "(sqrt x = sqrt y) = (x = y)" ``` huffman@22956 ` 385` ```unfolding sqrt_def by (rule real_root_eq_iff [OF pos2]) ``` huffman@22956 ` 386` huffman@22956 ` 387` ```lemmas real_sqrt_gt_0_iff [simp] = real_sqrt_less_iff [where x=0, simplified] ``` huffman@22956 ` 388` ```lemmas real_sqrt_lt_0_iff [simp] = real_sqrt_less_iff [where y=0, simplified] ``` huffman@22956 ` 389` ```lemmas real_sqrt_ge_0_iff [simp] = real_sqrt_le_iff [where x=0, simplified] ``` huffman@22956 ` 390` ```lemmas real_sqrt_le_0_iff [simp] = real_sqrt_le_iff [where y=0, simplified] ``` huffman@22956 ` 391` ```lemmas real_sqrt_eq_0_iff [simp] = real_sqrt_eq_iff [where y=0, simplified] ``` huffman@22956 ` 392` huffman@22956 ` 393` ```lemmas real_sqrt_gt_1_iff [simp] = real_sqrt_less_iff [where x=1, simplified] ``` huffman@22956 ` 394` ```lemmas real_sqrt_lt_1_iff [simp] = real_sqrt_less_iff [where y=1, simplified] ``` huffman@22956 ` 395` ```lemmas real_sqrt_ge_1_iff [simp] = real_sqrt_le_iff [where x=1, simplified] ``` huffman@22956 ` 396` ```lemmas real_sqrt_le_1_iff [simp] = real_sqrt_le_iff [where y=1, simplified] ``` huffman@22956 ` 397` ```lemmas real_sqrt_eq_1_iff [simp] = real_sqrt_eq_iff [where y=1, simplified] ``` huffman@20687 ` 398` huffman@23042 ` 399` ```lemma isCont_real_sqrt: "isCont sqrt x" ``` huffman@23042 ` 400` ```unfolding sqrt_def by (rule isCont_real_root [OF pos2]) ``` huffman@23042 ` 401` huffman@23042 ` 402` ```lemma DERIV_real_sqrt: ``` huffman@23042 ` 403` ``` "0 < x \ DERIV sqrt x :> inverse (sqrt x) / 2" ``` huffman@23042 ` 404` ```unfolding sqrt_def by (rule DERIV_real_root [OF pos2, simplified]) ``` huffman@23042 ` 405` huffman@20687 ` 406` ```lemma not_real_square_gt_zero [simp]: "(~ (0::real) < x*x) = (x = 0)" ``` huffman@20687 ` 407` ```apply auto ``` huffman@20687 ` 408` ```apply (cut_tac x = x and y = 0 in linorder_less_linear) ``` huffman@20687 ` 409` ```apply (simp add: zero_less_mult_iff) ``` huffman@20687 ` 410` ```done ``` huffman@20687 ` 411` huffman@20687 ` 412` ```lemma real_sqrt_abs2 [simp]: "sqrt(x*x) = \x\" ``` huffman@22856 ` 413` ```apply (subst power2_eq_square [symmetric]) ``` huffman@20687 ` 414` ```apply (rule real_sqrt_abs) ``` huffman@20687 ` 415` ```done ``` huffman@20687 ` 416` huffman@20687 ` 417` ```lemma real_sqrt_pow2_gt_zero: "0 < x ==> 0 < (sqrt x)\" ``` huffman@22956 ` 418` ```by simp (* TODO: delete *) ``` huffman@20687 ` 419` huffman@20687 ` 420` ```lemma real_sqrt_not_eq_zero: "0 < x ==> sqrt x \ 0" ``` huffman@22956 ` 421` ```by simp (* TODO: delete *) ``` huffman@20687 ` 422` huffman@20687 ` 423` ```lemma real_inv_sqrt_pow2: "0 < x ==> inverse (sqrt(x)) ^ 2 = inverse x" ``` huffman@22856 ` 424` ```by (simp add: power_inverse [symmetric]) ``` huffman@20687 ` 425` huffman@20687 ` 426` ```lemma real_sqrt_eq_zero_cancel: "[| 0 \ x; sqrt(x) = 0|] ==> x = 0" ``` huffman@22956 ` 427` ```by simp ``` huffman@20687 ` 428` huffman@20687 ` 429` ```lemma real_sqrt_ge_one: "1 \ x ==> 1 \ sqrt x" ``` huffman@22956 ` 430` ```by simp ``` huffman@20687 ` 431` huffman@22443 ` 432` ```lemma sqrt_divide_self_eq: ``` huffman@22443 ` 433` ``` assumes nneg: "0 \ x" ``` huffman@22443 ` 434` ``` shows "sqrt x / x = inverse (sqrt x)" ``` huffman@22443 ` 435` ```proof cases ``` huffman@22443 ` 436` ``` assume "x=0" thus ?thesis by simp ``` huffman@22443 ` 437` ```next ``` huffman@22443 ` 438` ``` assume nz: "x\0" ``` huffman@22443 ` 439` ``` hence pos: "0 0" by (simp add: divide_inverse nneg nz) ``` huffman@22443 ` 443` ``` show "inverse (sqrt x) / (sqrt x / x) = 1" ``` huffman@22443 ` 444` ``` by (simp add: divide_inverse mult_assoc [symmetric] ``` huffman@22443 ` 445` ``` power2_eq_square [symmetric] real_inv_sqrt_pow2 pos nz) ``` huffman@22443 ` 446` ``` qed ``` huffman@22443 ` 447` ```qed ``` huffman@22443 ` 448` huffman@22721 ` 449` ```lemma real_divide_square_eq [simp]: "(((r::real) * a) / (r * r)) = a / r" ``` huffman@22721 ` 450` ```apply (simp add: divide_inverse) ``` huffman@22721 ` 451` ```apply (case_tac "r=0") ``` huffman@22721 ` 452` ```apply (auto simp add: mult_ac) ``` huffman@22721 ` 453` ```done ``` huffman@22721 ` 454` huffman@22856 ` 455` ```subsection {* Square Root of Sum of Squares *} ``` huffman@22856 ` 456` huffman@22856 ` 457` ```lemma real_sqrt_mult_self_sum_ge_zero [simp]: "0 \ sqrt(x*x + y*y)" ``` huffman@22968 ` 458` ```by (rule real_sqrt_ge_zero [OF sum_squares_ge_zero]) ``` huffman@22856 ` 459` huffman@22856 ` 460` ```lemma real_sqrt_sum_squares_ge_zero [simp]: "0 \ sqrt (x\ + y\)" ``` huffman@22961 ` 461` ```by simp ``` huffman@22856 ` 462` huffman@22856 ` 463` ```lemma real_sqrt_sum_squares_mult_ge_zero [simp]: ``` huffman@22856 ` 464` ``` "0 \ sqrt ((x\ + y\)*(xa\ + ya\))" ``` huffman@22856 ` 465` ```by (auto intro!: real_sqrt_ge_zero simp add: zero_le_mult_iff) ``` huffman@22856 ` 466` huffman@22856 ` 467` ```lemma real_sqrt_sum_squares_mult_squared_eq [simp]: ``` huffman@22856 ` 468` ``` "sqrt ((x\ + y\) * (xa\ + ya\)) ^ 2 = (x\ + y\) * (xa\ + ya\)" ``` huffman@22956 ` 469` ```by (auto simp add: zero_le_mult_iff) ``` huffman@22856 ` 470` huffman@22856 ` 471` ```lemma real_sqrt_sum_squares_ge1 [simp]: "x \ sqrt(x\ + y\)" ``` huffman@22856 ` 472` ```by (rule power2_le_imp_le, simp_all) ``` huffman@22856 ` 473` huffman@22856 ` 474` ```lemma real_sqrt_sum_squares_ge2 [simp]: "y \ sqrt(x\ + y\)" ``` huffman@22856 ` 475` ```by (rule power2_le_imp_le, simp_all) ``` huffman@22856 ` 476` huffman@22858 ` 477` ```lemma power2_sum: ``` huffman@22858 ` 478` ``` fixes x y :: "'a::{number_ring,recpower}" ``` huffman@22858 ` 479` ``` shows "(x + y)\ = x\ + y\ + 2 * x * y" ``` huffman@22858 ` 480` ```by (simp add: left_distrib right_distrib power2_eq_square) ``` huffman@22858 ` 481` huffman@22858 ` 482` ```lemma power2_diff: ``` huffman@22858 ` 483` ``` fixes x y :: "'a::{number_ring,recpower}" ``` huffman@22858 ` 484` ``` shows "(x - y)\ = x\ + y\ - 2 * x * y" ``` huffman@22858 ` 485` ```by (simp add: left_diff_distrib right_diff_distrib power2_eq_square) ``` huffman@22858 ` 486` huffman@22858 ` 487` ```lemma real_sqrt_sum_squares_triangle_ineq: ``` huffman@22858 ` 488` ``` "sqrt ((a + c)\ + (b + d)\) \ sqrt (a\ + b\) + sqrt (c\ + d\)" ``` huffman@22858 ` 489` ```apply (rule power2_le_imp_le, simp) ``` huffman@22858 ` 490` ```apply (simp add: power2_sum) ``` huffman@22858 ` 491` ```apply (simp only: mult_assoc right_distrib [symmetric]) ``` huffman@22858 ` 492` ```apply (rule mult_left_mono) ``` huffman@22858 ` 493` ```apply (rule power2_le_imp_le) ``` huffman@22858 ` 494` ```apply (simp add: power2_sum power_mult_distrib) ``` huffman@22858 ` 495` ```apply (simp add: ring_distrib) ``` huffman@22858 ` 496` ```apply (subgoal_tac "0 \ b\ * c\ + a\ * d\ - 2 * (a * c) * (b * d)", simp) ``` huffman@22858 ` 497` ```apply (rule_tac b="(a * d - b * c)\" in ord_le_eq_trans) ``` huffman@22858 ` 498` ```apply (rule zero_le_power2) ``` huffman@22858 ` 499` ```apply (simp add: power2_diff power_mult_distrib) ``` huffman@22858 ` 500` ```apply (simp add: mult_nonneg_nonneg) ``` huffman@22858 ` 501` ```apply simp ``` huffman@22858 ` 502` ```apply (simp add: add_increasing) ``` huffman@22858 ` 503` ```done ``` huffman@22858 ` 504` huffman@22956 ` 505` ```text "Legacy theorem names:" ``` huffman@22956 ` 506` ```lemmas real_root_pos2 = real_root_power_cancel ``` huffman@22956 ` 507` ```lemmas real_root_pos_pos = real_root_gt_zero [THEN order_less_imp_le] ``` huffman@22956 ` 508` ```lemmas real_root_pos_pos_le = real_root_ge_zero ``` huffman@22956 ` 509` ```lemmas real_sqrt_mult_distrib = real_sqrt_mult ``` huffman@22956 ` 510` ```lemmas real_sqrt_mult_distrib2 = real_sqrt_mult ``` huffman@22956 ` 511` ```lemmas real_sqrt_eq_zero_cancel_iff = real_sqrt_eq_0_iff ``` huffman@22956 ` 512` huffman@22956 ` 513` ```(* needed for CauchysMeanTheorem.het_base from AFP *) ``` huffman@22956 ` 514` ```lemma real_root_pos: "0 < x \ root (Suc n) (x ^ (Suc n)) = x" ``` huffman@22956 ` 515` ```by (rule real_root_power_cancel [OF zero_less_Suc order_less_imp_le]) ``` huffman@22956 ` 516` huffman@22956 ` 517` ```(* FIXME: the stronger version of real_root_less_iff ``` huffman@22956 ` 518` ``` breaks CauchysMeanTheorem.list_gmean_gt_iff from AFP. *) ``` huffman@22956 ` 519` huffman@22956 ` 520` ```declare real_root_less_iff [simp del] ``` huffman@22956 ` 521` ```lemma real_root_less_iff_nonneg [simp]: ``` huffman@22956 ` 522` ``` "\0 < n; 0 \ x; 0 \ y\ \ (root n x < root n y) = (x < y)" ``` huffman@22956 ` 523` ```by (rule real_root_less_iff) ``` huffman@22956 ` 524` paulson@14324 ` 525` ```end ```