178 lemma (in bounded_bilinear) Zseq: |
186 lemma (in bounded_bilinear) Zseq: |
179 "Zseq X \<Longrightarrow> Zseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)" |
187 "Zseq X \<Longrightarrow> Zseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)" |
180 unfolding Zseq_conv_Zfun by (rule Zfun) |
188 unfolding Zseq_conv_Zfun by (rule Zfun) |
181 |
189 |
182 lemma (in bounded_bilinear) Zseq_prod_Bseq: |
190 lemma (in bounded_bilinear) Zseq_prod_Bseq: |
183 assumes X: "Zseq X" |
191 "Zseq X \<Longrightarrow> Bseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)" |
184 assumes Y: "Bseq Y" |
192 unfolding Zseq_conv_Zfun Bseq_conv_Bfun |
185 shows "Zseq (\<lambda>n. X n ** Y n)" |
193 by (rule Zfun_prod_Bfun) |
186 proof - |
|
187 obtain K where K: "0 \<le> K" |
|
188 and norm_le: "\<And>x y. norm (x ** y) \<le> norm x * norm y * K" |
|
189 using nonneg_bounded by fast |
|
190 obtain B where B: "0 < B" |
|
191 and norm_Y: "\<And>n. norm (Y n) \<le> B" |
|
192 using Y [unfolded Bseq_def] by fast |
|
193 from X show ?thesis |
|
194 proof (rule Zseq_imp_Zseq) |
|
195 fix n::nat |
|
196 have "norm (X n ** Y n) \<le> norm (X n) * norm (Y n) * K" |
|
197 by (rule norm_le) |
|
198 also have "\<dots> \<le> norm (X n) * B * K" |
|
199 by (intro mult_mono' order_refl norm_Y norm_ge_zero |
|
200 mult_nonneg_nonneg K) |
|
201 also have "\<dots> = norm (X n) * (B * K)" |
|
202 by (rule mult_assoc) |
|
203 finally show "norm (X n ** Y n) \<le> norm (X n) * (B * K)" . |
|
204 qed |
|
205 qed |
|
206 |
194 |
207 lemma (in bounded_bilinear) Bseq_prod_Zseq: |
195 lemma (in bounded_bilinear) Bseq_prod_Zseq: |
208 assumes X: "Bseq X" |
196 "Bseq X \<Longrightarrow> Zseq Y \<Longrightarrow> Zseq (\<lambda>n. X n ** Y n)" |
209 assumes Y: "Zseq Y" |
197 unfolding Zseq_conv_Zfun Bseq_conv_Bfun |
210 shows "Zseq (\<lambda>n. X n ** Y n)" |
198 by (rule Bfun_prod_Zfun) |
211 proof - |
|
212 obtain K where K: "0 \<le> K" |
|
213 and norm_le: "\<And>x y. norm (x ** y) \<le> norm x * norm y * K" |
|
214 using nonneg_bounded by fast |
|
215 obtain B where B: "0 < B" |
|
216 and norm_X: "\<And>n. norm (X n) \<le> B" |
|
217 using X [unfolded Bseq_def] by fast |
|
218 from Y show ?thesis |
|
219 proof (rule Zseq_imp_Zseq) |
|
220 fix n::nat |
|
221 have "norm (X n ** Y n) \<le> norm (X n) * norm (Y n) * K" |
|
222 by (rule norm_le) |
|
223 also have "\<dots> \<le> B * norm (Y n) * K" |
|
224 by (intro mult_mono' order_refl norm_X norm_ge_zero |
|
225 mult_nonneg_nonneg K) |
|
226 also have "\<dots> = norm (Y n) * (B * K)" |
|
227 by (simp only: mult_ac) |
|
228 finally show "norm (X n ** Y n) \<le> norm (Y n) * (B * K)" . |
|
229 qed |
|
230 qed |
|
231 |
199 |
232 lemma (in bounded_bilinear) Zseq_left: |
200 lemma (in bounded_bilinear) Zseq_left: |
233 "Zseq X \<Longrightarrow> Zseq (\<lambda>n. X n ** a)" |
201 "Zseq X \<Longrightarrow> Zseq (\<lambda>n. X n ** a)" |
234 by (rule bounded_linear_left [THEN bounded_linear.Zseq]) |
202 by (rule bounded_linear_left [THEN bounded_linear.Zseq]) |
235 |
203 |
361 lemma LIMSEQ_mult: |
329 lemma LIMSEQ_mult: |
362 fixes a b :: "'a::real_normed_algebra" |
330 fixes a b :: "'a::real_normed_algebra" |
363 shows "[| X ----> a; Y ----> b |] ==> (%n. X n * Y n) ----> a * b" |
331 shows "[| X ----> a; Y ----> b |] ==> (%n. X n * Y n) ----> a * b" |
364 by (rule mult.LIMSEQ) |
332 by (rule mult.LIMSEQ) |
365 |
333 |
366 lemma inverse_diff_inverse: |
|
367 "\<lbrakk>(a::'a::division_ring) \<noteq> 0; b \<noteq> 0\<rbrakk> |
|
368 \<Longrightarrow> inverse a - inverse b = - (inverse a * (a - b) * inverse b)" |
|
369 by (simp add: algebra_simps) |
|
370 |
|
371 lemma Bseq_inverse_lemma: |
334 lemma Bseq_inverse_lemma: |
372 fixes x :: "'a::real_normed_div_algebra" |
335 fixes x :: "'a::real_normed_div_algebra" |
373 shows "\<lbrakk>r \<le> norm x; 0 < r\<rbrakk> \<Longrightarrow> norm (inverse x) \<le> inverse r" |
336 shows "\<lbrakk>r \<le> norm x; 0 < r\<rbrakk> \<Longrightarrow> norm (inverse x) \<le> inverse r" |
374 apply (subst nonzero_norm_inverse, clarsimp) |
337 apply (subst nonzero_norm_inverse, clarsimp) |
375 apply (erule (1) le_imp_inverse_le) |
338 apply (erule (1) le_imp_inverse_le) |
376 done |
339 done |
377 |
340 |
378 lemma Bseq_inverse: |
341 lemma Bseq_inverse: |
379 fixes a :: "'a::real_normed_div_algebra" |
342 fixes a :: "'a::real_normed_div_algebra" |
380 assumes X: "X ----> a" |
343 shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> Bseq (\<lambda>n. inverse (X n))" |
381 assumes a: "a \<noteq> 0" |
344 unfolding LIMSEQ_conv_tendsto Bseq_conv_Bfun |
382 shows "Bseq (\<lambda>n. inverse (X n))" |
345 by (rule Bfun_inverse) |
383 proof - |
|
384 from a have "0 < norm a" by simp |
|
385 hence "\<exists>r>0. r < norm a" by (rule dense) |
|
386 then obtain r where r1: "0 < r" and r2: "r < norm a" by fast |
|
387 obtain N where N: "\<And>n. N \<le> n \<Longrightarrow> norm (X n - a) < r" |
|
388 using LIMSEQ_D [OF X r1] by fast |
|
389 show ?thesis |
|
390 proof (rule BseqI2' [rule_format]) |
|
391 fix n assume n: "N \<le> n" |
|
392 hence 1: "norm (X n - a) < r" by (rule N) |
|
393 hence 2: "X n \<noteq> 0" using r2 by auto |
|
394 hence "norm (inverse (X n)) = inverse (norm (X n))" |
|
395 by (rule nonzero_norm_inverse) |
|
396 also have "\<dots> \<le> inverse (norm a - r)" |
|
397 proof (rule le_imp_inverse_le) |
|
398 show "0 < norm a - r" using r2 by simp |
|
399 next |
|
400 have "norm a - norm (X n) \<le> norm (a - X n)" |
|
401 by (rule norm_triangle_ineq2) |
|
402 also have "\<dots> = norm (X n - a)" |
|
403 by (rule norm_minus_commute) |
|
404 also have "\<dots> < r" using 1 . |
|
405 finally show "norm a - r \<le> norm (X n)" by simp |
|
406 qed |
|
407 finally show "norm (inverse (X n)) \<le> inverse (norm a - r)" . |
|
408 qed |
|
409 qed |
|
410 |
|
411 lemma LIMSEQ_inverse_lemma: |
|
412 fixes a :: "'a::real_normed_div_algebra" |
|
413 shows "\<lbrakk>X ----> a; a \<noteq> 0; \<forall>n. X n \<noteq> 0\<rbrakk> |
|
414 \<Longrightarrow> (\<lambda>n. inverse (X n)) ----> inverse a" |
|
415 apply (subst LIMSEQ_Zseq_iff) |
|
416 apply (simp add: inverse_diff_inverse nonzero_imp_inverse_nonzero) |
|
417 apply (rule Zseq_minus) |
|
418 apply (rule Zseq_mult_left) |
|
419 apply (rule mult.Bseq_prod_Zseq) |
|
420 apply (erule (1) Bseq_inverse) |
|
421 apply (simp add: LIMSEQ_Zseq_iff) |
|
422 done |
|
423 |
346 |
424 lemma LIMSEQ_inverse: |
347 lemma LIMSEQ_inverse: |
425 fixes a :: "'a::real_normed_div_algebra" |
348 fixes a :: "'a::real_normed_div_algebra" |
426 assumes X: "X ----> a" |
349 shows "\<lbrakk>X ----> a; a \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. inverse (X n)) ----> inverse a" |
427 assumes a: "a \<noteq> 0" |
350 unfolding LIMSEQ_conv_tendsto |
428 shows "(\<lambda>n. inverse (X n)) ----> inverse a" |
351 by (rule tendsto_inverse) |
429 proof - |
|
430 from a have "0 < norm a" by simp |
|
431 then obtain k where "\<forall>n\<ge>k. norm (X n - a) < norm a" |
|
432 using LIMSEQ_D [OF X] by fast |
|
433 hence "\<forall>n\<ge>k. X n \<noteq> 0" by auto |
|
434 hence k: "\<forall>n. X (n + k) \<noteq> 0" by simp |
|
435 |
|
436 from X have "(\<lambda>n. X (n + k)) ----> a" |
|
437 by (rule LIMSEQ_ignore_initial_segment) |
|
438 hence "(\<lambda>n. inverse (X (n + k))) ----> inverse a" |
|
439 using a k by (rule LIMSEQ_inverse_lemma) |
|
440 thus "(\<lambda>n. inverse (X n)) ----> inverse a" |
|
441 by (rule LIMSEQ_offset) |
|
442 qed |
|
443 |
352 |
444 lemma LIMSEQ_divide: |
353 lemma LIMSEQ_divide: |
445 fixes a b :: "'a::real_normed_field" |
354 fixes a b :: "'a::real_normed_field" |
446 shows "\<lbrakk>X ----> a; Y ----> b; b \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. X n / Y n) ----> a / b" |
355 shows "\<lbrakk>X ----> a; Y ----> b; b \<noteq> 0\<rbrakk> \<Longrightarrow> (\<lambda>n. X n / Y n) ----> a / b" |
447 by (simp add: LIMSEQ_mult LIMSEQ_inverse divide_inverse) |
356 by (simp add: LIMSEQ_mult LIMSEQ_inverse divide_inverse) |