2488 using assms f_iso isolated_pole_imp_nzero_times by blast |
2504 using assms f_iso isolated_pole_imp_nzero_times by blast |
2489 show "zorder f z \<noteq> 0" |
2505 show "zorder f z \<noteq> 0" |
2490 using isolated_pole_imp_neg_zorder assms by fastforce |
2506 using isolated_pole_imp_neg_zorder assms by fastforce |
2491 qed |
2507 qed |
2492 |
2508 |
2493 subsection \<open>Isolated zeroes\<close> |
|
2494 |
|
2495 definition isolated_zero :: "(complex \<Rightarrow> complex) \<Rightarrow> complex \<Rightarrow> bool" where |
|
2496 "isolated_zero f z \<longleftrightarrow> f z = 0 \<and> eventually (\<lambda>z. f z \<noteq> 0) (at z)" |
|
2497 |
|
2498 lemma isolated_zero_altdef: "isolated_zero f z \<longleftrightarrow> f z = 0 \<and> \<not>z islimpt {z. f z = 0}" |
|
2499 unfolding isolated_zero_def eventually_at_filter eventually_nhds islimpt_def by blast |
|
2500 |
|
2501 lemma isolated_zero_mult1: |
|
2502 assumes "isolated_zero f x" "isolated_zero g x" |
|
2503 shows "isolated_zero (\<lambda>x. f x * g x) x" |
|
2504 proof - |
|
2505 have "\<forall>\<^sub>F x in at x. f x \<noteq> 0" "\<forall>\<^sub>F x in at x. g x \<noteq> 0" |
|
2506 using assms unfolding isolated_zero_def by auto |
|
2507 hence "eventually (\<lambda>x. f x * g x \<noteq> 0) (at x)" |
|
2508 by eventually_elim auto |
|
2509 with assms show ?thesis |
|
2510 by (auto simp: isolated_zero_def) |
|
2511 qed |
|
2512 |
|
2513 lemma isolated_zero_mult2: |
|
2514 assumes "isolated_zero f x" "g x \<noteq> 0" "g analytic_on {x}" |
|
2515 shows "isolated_zero (\<lambda>x. f x * g x) x" |
|
2516 proof - |
|
2517 have "eventually (\<lambda>x. f x \<noteq> 0) (at x)" |
|
2518 using assms unfolding isolated_zero_def by auto |
|
2519 moreover have "eventually (\<lambda>x. g x \<noteq> 0) (at x)" |
|
2520 using analytic_at_neq_imp_eventually_neq[of g x 0] assms by auto |
|
2521 ultimately have "eventually (\<lambda>x. f x * g x \<noteq> 0) (at x)" |
|
2522 by eventually_elim auto |
|
2523 thus ?thesis |
|
2524 using assms(1) by (auto simp: isolated_zero_def) |
|
2525 qed |
|
2526 |
|
2527 lemma isolated_zero_mult3: |
|
2528 assumes "isolated_zero f x" "g x \<noteq> 0" "g analytic_on {x}" |
|
2529 shows "isolated_zero (\<lambda>x. g x * f x) x" |
|
2530 using isolated_zero_mult2[OF assms] by (simp add: mult_ac) |
|
2531 |
|
2532 lemma isolated_zero_prod: |
|
2533 assumes "\<And>x. x \<in> I \<Longrightarrow> isolated_zero (f x) z" "I \<noteq> {}" "finite I" |
|
2534 shows "isolated_zero (\<lambda>y. \<Prod>x\<in>I. f x y) z" |
|
2535 using assms(3,2,1) by (induction rule: finite_ne_induct) (auto intro: isolated_zero_mult1) |
|
2536 |
|
2537 lemma non_isolated_zero': |
|
2538 assumes "isolated_singularity_at f z" "not_essential f z" "f z = 0" "\<not>isolated_zero f z" |
|
2539 shows "eventually (\<lambda>z. f z = 0) (at z)" |
|
2540 by (metis assms isolated_zero_def non_zero_neighbour not_eventually) |
|
2541 |
|
2542 lemma non_isolated_zero: |
|
2543 assumes "\<not>isolated_zero f z" "f analytic_on {z}" "f z = 0" |
|
2544 shows "eventually (\<lambda>z. f z = 0) (nhds z)" |
|
2545 proof - |
|
2546 have "eventually (\<lambda>z. f z = 0) (at z)" |
|
2547 by (rule non_isolated_zero') |
|
2548 (use assms in \<open>auto intro: not_essential_analytic isolated_singularity_at_analytic\<close>) |
|
2549 with \<open>f z = 0\<close> show ?thesis |
|
2550 unfolding eventually_at_filter by (auto elim!: eventually_mono) |
|
2551 qed |
|
2552 |
|
2553 lemma not_essential_compose: |
|
2554 assumes "not_essential f (g z)" "g analytic_on {z}" |
|
2555 shows "not_essential (\<lambda>x. f (g x)) z" |
|
2556 proof (cases "isolated_zero (\<lambda>w. g w - g z) z") |
|
2557 case False |
|
2558 hence "eventually (\<lambda>w. g w - g z = 0) (nhds z)" |
|
2559 by (rule non_isolated_zero) (use assms in \<open>auto intro!: analytic_intros\<close>) |
|
2560 hence "not_essential (\<lambda>x. f (g x)) z \<longleftrightarrow> not_essential (\<lambda>_. f (g z)) z" |
|
2561 by (intro not_essential_cong refl) |
|
2562 (auto elim!: eventually_mono simp: eventually_at_filter) |
|
2563 thus ?thesis |
|
2564 by (simp add: not_essential_const) |
|
2565 next |
|
2566 case True |
|
2567 hence ev: "eventually (\<lambda>w. g w \<noteq> g z) (at z)" |
|
2568 by (auto simp: isolated_zero_def) |
|
2569 from assms consider c where "f \<midarrow>g z\<rightarrow> c" | "is_pole f (g z)" |
|
2570 by (auto simp: not_essential_def) |
|
2571 have "isCont g z" |
|
2572 by (rule analytic_at_imp_isCont) fact |
|
2573 hence lim: "g \<midarrow>z\<rightarrow> g z" |
|
2574 using isContD by blast |
|
2575 |
|
2576 from assms(1) consider c where "f \<midarrow>g z\<rightarrow> c" | "is_pole f (g z)" |
|
2577 unfolding not_essential_def by blast |
|
2578 thus ?thesis |
|
2579 proof cases |
|
2580 fix c assume "f \<midarrow>g z\<rightarrow> c" |
|
2581 hence "(\<lambda>x. f (g x)) \<midarrow>z\<rightarrow> c" |
|
2582 by (rule filterlim_compose) (use lim ev in \<open>auto simp: filterlim_at\<close>) |
|
2583 thus ?thesis |
|
2584 by (auto simp: not_essential_def) |
|
2585 next |
|
2586 assume "is_pole f (g z)" |
|
2587 hence "is_pole (\<lambda>x. f (g x)) z" |
|
2588 by (rule is_pole_compose) fact+ |
|
2589 thus ?thesis |
|
2590 by (auto simp: not_essential_def) |
|
2591 qed |
|
2592 qed |
|
2593 |
2509 |
2594 subsection \<open>Isolated points\<close> |
2510 subsection \<open>Isolated points\<close> |
2595 |
2511 |
2596 definition isolated_points_of :: "complex set \<Rightarrow> complex set" where |
2512 definition isolated_points_of :: "complex set \<Rightarrow> complex set" where |
2597 "isolated_points_of A = {z\<in>A. eventually (\<lambda>w. w \<notin> A) (at z)}" |
2513 "isolated_points_of A = {z\<in>A. eventually (\<lambda>w. w \<notin> A) (at z)}" |
2616 using assms by (auto simp: isolated_points_of_def discrete_altdef) |
2532 using assms by (auto simp: isolated_points_of_def discrete_altdef) |
2617 |
2533 |
2618 lemmas uniform_discreteI1 = uniformI1 |
2534 lemmas uniform_discreteI1 = uniformI1 |
2619 lemmas uniform_discreteI2 = uniformI2 |
2535 lemmas uniform_discreteI2 = uniformI2 |
2620 |
2536 |
2621 lemma isolated_singularity_at_compose: |
2537 lemma zorder_zero_eqI': |
2622 assumes "isolated_singularity_at f (g z)" "g analytic_on {z}" |
2538 assumes "f analytic_on {z}" |
2623 shows "isolated_singularity_at (\<lambda>x. f (g x)) z" |
2539 assumes "\<And>i. i < nat n \<Longrightarrow> (deriv ^^ i) f z = 0" |
2624 proof (cases "isolated_zero (\<lambda>w. g w - g z) z") |
2540 assumes "(deriv ^^ nat n) f z \<noteq> 0" and "n \<ge> 0" |
2625 case False |
2541 shows "zorder f z = n" |
2626 hence "eventually (\<lambda>w. g w - g z = 0) (nhds z)" |
2542 proof - |
2627 by (rule non_isolated_zero) (use assms in \<open>auto intro!: analytic_intros\<close>) |
2543 from assms(1) obtain A where "open A" "z \<in> A" "f holomorphic_on A" |
2628 hence "isolated_singularity_at (\<lambda>x. f (g x)) z \<longleftrightarrow> isolated_singularity_at (\<lambda>_. f (g z)) z" |
2544 using analytic_at by blast |
2629 by (intro isolated_singularity_at_cong refl) |
|
2630 (auto elim!: eventually_mono simp: eventually_at_filter) |
|
2631 thus ?thesis |
2545 thus ?thesis |
2632 by (simp add: isolated_singularity_at_const) |
2546 using zorder_zero_eqI[of f A z n] assms by blast |
2633 next |
2547 qed |
2634 case True |
2548 |
2635 from assms(1) obtain r where r: "r > 0" "f analytic_on ball (g z) r - {g z}" |
2549 |
2636 by (auto simp: isolated_singularity_at_def) |
2550 subsection \<open>Isolated zeros\<close> |
2637 hence holo_f: "f holomorphic_on ball (g z) r - {g z}" |
2551 |
2638 by (subst (asm) analytic_on_open) auto |
2552 definition isolated_zero :: "('a::topological_space \<Rightarrow> 'b::real_normed_div_algebra) \<Rightarrow> 'a \<Rightarrow> bool" where |
2639 from assms(2) obtain r' where r': "r' > 0" "g holomorphic_on ball z r'" |
2553 "isolated_zero f a \<longleftrightarrow> f \<midarrow>a\<rightarrow> 0 \<and> eventually (\<lambda>x. f x \<noteq> 0) (at a)" |
2640 by (auto simp: analytic_on_def) |
2554 |
2641 |
2555 lemma isolated_zero_shift: |
2642 have "continuous_on (ball z r') g" |
2556 fixes z :: "'a :: real_normed_vector" |
2643 using holomorphic_on_imp_continuous_on r' by blast |
2557 shows "isolated_zero f z \<longleftrightarrow> isolated_zero (\<lambda>w. f (z + w)) 0" |
2644 hence "isCont g z" |
2558 unfolding isolated_zero_def |
2645 using r' by (subst (asm) continuous_on_eq_continuous_at) auto |
2559 by (simp add: at_to_0' eventually_filtermap filterlim_filtermap add_ac) |
2646 hence "g \<midarrow>z\<rightarrow> g z" |
2560 |
2647 using isContD by blast |
2561 lemma isolated_zero_shift': |
2648 hence "eventually (\<lambda>w. g w \<in> ball (g z) r) (at z)" |
2562 fixes z :: "'a :: real_normed_vector" |
2649 using \<open>r > 0\<close> unfolding tendsto_def by force |
2563 assumes "NO_MATCH 0 z" |
2650 moreover have "eventually (\<lambda>w. g w \<noteq> g z) (at z)" using True |
2564 shows "isolated_zero f z \<longleftrightarrow> isolated_zero (\<lambda>w. f (z + w)) 0" |
2651 by (auto simp: isolated_zero_def elim!: eventually_mono) |
2565 by (rule isolated_zero_shift) |
2652 ultimately have "eventually (\<lambda>w. g w \<in> ball (g z) r - {g z}) (at z)" |
2566 |
2653 by eventually_elim auto |
2567 lemma isolated_zero_imp_not_essential [intro]: |
2654 then obtain r'' where r'': "r'' > 0" "\<forall>w\<in>ball z r''-{z}. g w \<in> ball (g z) r - {g z}" |
2568 "isolated_zero f z \<Longrightarrow> not_essential f z" |
2655 unfolding eventually_at_filter eventually_nhds_metric ball_def |
2569 unfolding isolated_zero_def not_essential_def |
2656 by (auto simp: dist_commute) |
2570 using tendsto_nhds_iff by blast |
2657 have "f \<circ> g holomorphic_on ball z (min r' r'') - {z}" |
2571 |
2658 proof (rule holomorphic_on_compose_gen) |
2572 lemma pole_is_not_zero: |
2659 show "g holomorphic_on ball z (min r' r'') - {z}" |
2573 fixes f:: "'a::perfect_space \<Rightarrow> 'b::real_normed_field" |
2660 by (rule holomorphic_on_subset[OF r'(2)]) auto |
2574 assumes "is_pole f z" |
2661 show "f holomorphic_on ball (g z) r - {g z}" |
2575 shows "\<not>isolated_zero f z" |
2662 by fact |
2576 proof |
2663 show "g ` (ball z (min r' r'') - {z}) \<subseteq> ball (g z) r - {g z}" |
2577 assume "isolated_zero f z" |
2664 using r'' by force |
2578 then have "filterlim f (nhds 0) (at z)" |
2665 qed |
2579 unfolding isolated_zero_def using tendsto_nhds_iff by blast |
2666 hence "f \<circ> g analytic_on ball z (min r' r'') - {z}" |
2580 moreover have "filterlim f at_infinity (at z)" |
2667 by (subst analytic_on_open) auto |
2581 using \<open>is_pole f z\<close> unfolding is_pole_def . |
2668 thus ?thesis using \<open>r' > 0\<close> \<open>r'' > 0\<close> |
2582 ultimately show False |
2669 by (auto simp: isolated_singularity_at_def o_def intro!: exI[of _ "min r' r''"]) |
2583 using not_tendsto_and_filterlim_at_infinity[OF at_neq_bot] |
2670 qed |
2584 by auto |
2671 |
2585 qed |
2672 lemma is_pole_power_int_0: |
2586 |
2673 assumes "f analytic_on {x}" "isolated_zero f x" "n < 0" |
2587 lemma isolated_zero_imp_pole_inverse: |
2674 shows "is_pole (\<lambda>x. f x powi n) x" |
2588 fixes f :: "_ \<Rightarrow> 'b::{real_normed_div_algebra, division_ring}" |
2675 proof - |
2589 assumes "isolated_zero f z" |
2676 have "f \<midarrow>x\<rightarrow> f x" |
2590 shows "is_pole (\<lambda>z. inverse (f z)) z" |
2677 using assms(1) by (simp add: analytic_at_imp_isCont isContD) |
2591 proof - |
2678 with assms show ?thesis |
2592 from assms have ev: "eventually (\<lambda>z. f z \<noteq> 0) (at z)" |
2679 unfolding is_pole_def |
|
2680 by (intro filterlim_power_int_neg_at_infinity) (auto simp: isolated_zero_def) |
|
2681 qed |
|
2682 |
|
2683 lemma isolated_zero_imp_not_constant_on: |
|
2684 assumes "isolated_zero f x" "x \<in> A" "open A" |
|
2685 shows "\<not>f constant_on A" |
|
2686 proof |
|
2687 assume "f constant_on A" |
|
2688 then obtain c where c: "\<And>x. x \<in> A \<Longrightarrow> f x = c" |
|
2689 by (auto simp: constant_on_def) |
|
2690 from assms and c[of x] have [simp]: "c = 0" |
|
2691 by (auto simp: isolated_zero_def) |
2593 by (auto simp: isolated_zero_def) |
2692 have "eventually (\<lambda>x. f x \<noteq> 0) (at x)" |
2594 have "filterlim f (nhds 0) (at z)" |
2693 using assms by (auto simp: isolated_zero_def) |
2595 using assms by (simp add: isolated_zero_def) |
2694 moreover have "eventually (\<lambda>x. x \<in> A) (at x)" |
2596 with ev have "filterlim f (at 0) (at z)" |
2695 using assms by (intro eventually_at_in_open') auto |
2597 using filterlim_atI by blast |
2696 ultimately have "eventually (\<lambda>x. False) (at x)" |
2598 also have "?this \<longleftrightarrow> filterlim (\<lambda>z. inverse (inverse (f z))) (at 0) (at z)" |
2697 by eventually_elim (use c in auto) |
2599 by (rule filterlim_cong) (use ev in \<open>auto elim!: eventually_mono\<close>) |
2698 thus False |
2600 finally have "filterlim (\<lambda>z. inverse (f z)) at_infinity (at z)" |
2699 by simp |
2601 by (subst filterlim_inverse_at_iff [symmetric]) |
2700 qed |
2602 thus ?thesis |
|
2603 by (simp add: is_pole_def) |
|
2604 qed |
|
2605 |
|
2606 lemma is_pole_imp_isolated_zero_inverse: |
|
2607 fixes f :: "_ \<Rightarrow> 'b::{real_normed_div_algebra, division_ring}" |
|
2608 assumes "is_pole f z" |
|
2609 shows "isolated_zero (\<lambda>z. inverse (f z)) z" |
|
2610 proof - |
|
2611 from assms have ev: "eventually (\<lambda>z. f z \<noteq> 0) (at z)" |
|
2612 by (simp add: non_zero_neighbour_pole) |
|
2613 have "filterlim f at_infinity (at z)" |
|
2614 using assms by (simp add: is_pole_def) |
|
2615 also have "?this \<longleftrightarrow> filterlim (\<lambda>z. inverse (inverse (f z))) at_infinity (at z)" |
|
2616 by (rule filterlim_cong) (use ev in \<open>auto elim!: eventually_mono\<close>) |
|
2617 finally have "filterlim (\<lambda>z. inverse (f z)) (at 0) (at z)" |
|
2618 by (subst (asm) filterlim_inverse_at_iff [symmetric]) auto |
|
2619 hence "filterlim (\<lambda>z. inverse (f z)) (nhds 0) (at z)" |
|
2620 using filterlim_at by blast |
|
2621 moreover have "eventually (\<lambda>z. inverse (f z) \<noteq> 0) (at z)" |
|
2622 using ev by eventually_elim auto |
|
2623 ultimately show ?thesis |
|
2624 by (simp add: isolated_zero_def) |
|
2625 qed |
|
2626 |
|
2627 lemma is_pole_inverse_iff: "is_pole (\<lambda>z. inverse (f z)) z \<longleftrightarrow> isolated_zero f z" |
|
2628 using is_pole_imp_isolated_zero_inverse isolated_zero_imp_pole_inverse by fastforce |
|
2629 |
|
2630 lemma isolated_zero_inverse_iff: "isolated_zero (\<lambda>z. inverse (f z)) z \<longleftrightarrow> is_pole f z" |
|
2631 using is_pole_imp_isolated_zero_inverse isolated_zero_imp_pole_inverse by fastforce |
|
2632 |
|
2633 lemma zero_isolated_zero: |
|
2634 fixes f :: "'a :: {t2_space, perfect_space} \<Rightarrow> _" |
|
2635 assumes "isolated_zero f z" "isCont f z" |
|
2636 shows "f z = 0" |
|
2637 proof (rule tendsto_unique) |
|
2638 show "f \<midarrow>z\<rightarrow> f z" |
|
2639 using assms(2) by (rule isContD) |
|
2640 show "f \<midarrow>z\<rightarrow> 0" |
|
2641 using assms(1) by (simp add: isolated_zero_def) |
|
2642 qed auto |
|
2643 |
|
2644 lemma zero_isolated_zero_analytic: |
|
2645 assumes "isolated_zero f z" "f analytic_on {z}" |
|
2646 shows "f z = 0" |
|
2647 using assms(1) analytic_at_imp_isCont[OF assms(2)] by (rule zero_isolated_zero) |
|
2648 |
|
2649 lemma isolated_zero_analytic_iff: |
|
2650 assumes "f analytic_on {z}" |
|
2651 shows "isolated_zero f z \<longleftrightarrow> f z = 0 \<and> eventually (\<lambda>z. f z \<noteq> 0) (at z)" |
|
2652 proof safe |
|
2653 assume "f z = 0" "eventually (\<lambda>z. f z \<noteq> 0) (at z)" |
|
2654 with assms show "isolated_zero f z" |
|
2655 unfolding isolated_zero_def by (metis analytic_at_imp_isCont isCont_def) |
|
2656 qed (use zero_isolated_zero_analytic[OF _ assms] in \<open>auto simp: isolated_zero_def\<close>) |
|
2657 |
|
2658 lemma non_isolated_zero_imp_eventually_zero: |
|
2659 assumes "f analytic_on {z}" "f z = 0" "\<not>isolated_zero f z" |
|
2660 shows "eventually (\<lambda>z. f z = 0) (at z)" |
|
2661 proof (rule not_essential_frequently_0_imp_eventually_0) |
|
2662 from assms(1) show "isolated_singularity_at f z" "not_essential f z" |
|
2663 by (simp_all add: isolated_singularity_at_analytic not_essential_analytic) |
|
2664 from assms(1,2) have "f \<midarrow>z\<rightarrow> 0" |
|
2665 by (metis analytic_at_imp_isCont continuous_within) |
|
2666 thus "frequently (\<lambda>z. f z = 0) (at z)" |
|
2667 using assms(2,3) by (auto simp: isolated_zero_def frequently_def) |
|
2668 qed |
|
2669 |
|
2670 lemma non_isolated_zero_imp_eventually_zero': |
|
2671 assumes "f analytic_on {z}" "f z = 0" "\<not>isolated_zero f z" |
|
2672 shows "eventually (\<lambda>z. f z = 0) (nhds z)" |
|
2673 using non_isolated_zero_imp_eventually_zero[OF assms] assms(2) |
|
2674 using eventually_nhds_conv_at by blast |
2701 |
2675 |
2702 end |
2676 end |