src/HOL/Analysis/Poly_Roots.thy
changeset 64267 b9a1486e79be
parent 63918 6bf55e6e0b75
child 65578 e4997c181cce
equal deleted inserted replaced
64265:8eb6365f5916 64267:b9a1486e79be
     8 imports Complex_Main
     8 imports Complex_Main
     9 begin
     9 begin
    10 
    10 
    11 subsection\<open>Geometric progressions\<close>
    11 subsection\<open>Geometric progressions\<close>
    12 
    12 
    13 lemma setsum_gp_basic:
    13 lemma sum_gp_basic:
    14   fixes x :: "'a::{comm_ring,monoid_mult}"
    14   fixes x :: "'a::{comm_ring,monoid_mult}"
    15   shows "(1 - x) * (\<Sum>i\<le>n. x^i) = 1 - x^Suc n"
    15   shows "(1 - x) * (\<Sum>i\<le>n. x^i) = 1 - x^Suc n"
    16   by (simp only: one_diff_power_eq [of "Suc n" x] lessThan_Suc_atMost)
    16   by (simp only: one_diff_power_eq [of "Suc n" x] lessThan_Suc_atMost)
    17 
    17 
    18 lemma setsum_gp0:
    18 lemma sum_gp0:
    19   fixes x :: "'a::{comm_ring,division_ring}"
    19   fixes x :: "'a::{comm_ring,division_ring}"
    20   shows   "(\<Sum>i\<le>n. x^i) = (if x = 1 then of_nat(n + 1) else (1 - x^Suc n) / (1 - x))"
    20   shows   "(\<Sum>i\<le>n. x^i) = (if x = 1 then of_nat(n + 1) else (1 - x^Suc n) / (1 - x))"
    21   using setsum_gp_basic[of x n]
    21   using sum_gp_basic[of x n]
    22   by (simp add: mult.commute divide_simps)
    22   by (simp add: mult.commute divide_simps)
    23 
    23 
    24 lemma setsum_power_add:
    24 lemma sum_power_add:
    25   fixes x :: "'a::{comm_ring,monoid_mult}"
    25   fixes x :: "'a::{comm_ring,monoid_mult}"
    26   shows "(\<Sum>i\<in>I. x^(m+i)) = x^m * (\<Sum>i\<in>I. x^i)"
    26   shows "(\<Sum>i\<in>I. x^(m+i)) = x^m * (\<Sum>i\<in>I. x^i)"
    27   by (simp add: setsum_distrib_left power_add)
    27   by (simp add: sum_distrib_left power_add)
    28 
    28 
    29 lemma setsum_power_shift:
    29 lemma sum_power_shift:
    30   fixes x :: "'a::{comm_ring,monoid_mult}"
    30   fixes x :: "'a::{comm_ring,monoid_mult}"
    31   assumes "m \<le> n"
    31   assumes "m \<le> n"
    32   shows "(\<Sum>i=m..n. x^i) = x^m * (\<Sum>i\<le>n-m. x^i)"
    32   shows "(\<Sum>i=m..n. x^i) = x^m * (\<Sum>i\<le>n-m. x^i)"
    33 proof -
    33 proof -
    34   have "(\<Sum>i=m..n. x^i) = x^m * (\<Sum>i=m..n. x^(i-m))"
    34   have "(\<Sum>i=m..n. x^i) = x^m * (\<Sum>i=m..n. x^(i-m))"
    35     by (simp add: setsum_distrib_left power_add [symmetric])
    35     by (simp add: sum_distrib_left power_add [symmetric])
    36   also have "(\<Sum>i=m..n. x^(i-m)) = (\<Sum>i\<le>n-m. x^i)"
    36   also have "(\<Sum>i=m..n. x^(i-m)) = (\<Sum>i\<le>n-m. x^i)"
    37     using \<open>m \<le> n\<close> by (intro setsum.reindex_bij_witness[where j="\<lambda>i. i - m" and i="\<lambda>i. i + m"]) auto
    37     using \<open>m \<le> n\<close> by (intro sum.reindex_bij_witness[where j="\<lambda>i. i - m" and i="\<lambda>i. i + m"]) auto
    38   finally show ?thesis .
    38   finally show ?thesis .
    39 qed
    39 qed
    40 
    40 
    41 lemma setsum_gp_multiplied:
    41 lemma sum_gp_multiplied:
    42   fixes x :: "'a::{comm_ring,monoid_mult}"
    42   fixes x :: "'a::{comm_ring,monoid_mult}"
    43   assumes "m \<le> n"
    43   assumes "m \<le> n"
    44   shows "(1 - x) * (\<Sum>i=m..n. x^i) = x^m - x^Suc n"
    44   shows "(1 - x) * (\<Sum>i=m..n. x^i) = x^m - x^Suc n"
    45 proof -
    45 proof -
    46   have  "(1 - x) * (\<Sum>i=m..n. x^i) = x^m * (1 - x) * (\<Sum>i\<le>n-m. x^i)"
    46   have  "(1 - x) * (\<Sum>i=m..n. x^i) = x^m * (1 - x) * (\<Sum>i\<le>n-m. x^i)"
    47     by (metis mult.assoc mult.commute assms setsum_power_shift)
    47     by (metis mult.assoc mult.commute assms sum_power_shift)
    48   also have "... =x^m * (1 - x^Suc(n-m))"
    48   also have "... =x^m * (1 - x^Suc(n-m))"
    49     by (metis mult.assoc setsum_gp_basic)
    49     by (metis mult.assoc sum_gp_basic)
    50   also have "... = x^m - x^Suc n"
    50   also have "... = x^m - x^Suc n"
    51     using assms
    51     using assms
    52     by (simp add: algebra_simps) (metis le_add_diff_inverse power_add)
    52     by (simp add: algebra_simps) (metis le_add_diff_inverse power_add)
    53   finally show ?thesis .
    53   finally show ?thesis .
    54 qed
    54 qed
    55 
    55 
    56 lemma setsum_gp:
    56 lemma sum_gp:
    57   fixes x :: "'a::{comm_ring,division_ring}"
    57   fixes x :: "'a::{comm_ring,division_ring}"
    58   shows   "(\<Sum>i=m..n. x^i) =
    58   shows   "(\<Sum>i=m..n. x^i) =
    59                (if n < m then 0
    59                (if n < m then 0
    60                 else if x = 1 then of_nat((n + 1) - m)
    60                 else if x = 1 then of_nat((n + 1) - m)
    61                 else (x^m - x^Suc n) / (1 - x))"
    61                 else (x^m - x^Suc n) / (1 - x))"
    62 using setsum_gp_multiplied [of m n x]
    62 using sum_gp_multiplied [of m n x]
    63 apply auto
    63 apply auto
    64 by (metis eq_iff_diff_eq_0 mult.commute nonzero_divide_eq_eq)
    64 by (metis eq_iff_diff_eq_0 mult.commute nonzero_divide_eq_eq)
    65 
    65 
    66 lemma setsum_gp_offset:
    66 lemma sum_gp_offset:
    67   fixes x :: "'a::{comm_ring,division_ring}"
    67   fixes x :: "'a::{comm_ring,division_ring}"
    68   shows   "(\<Sum>i=m..m+n. x^i) =
    68   shows   "(\<Sum>i=m..m+n. x^i) =
    69        (if x = 1 then of_nat n + 1 else x^m * (1 - x^Suc n) / (1 - x))"
    69        (if x = 1 then of_nat n + 1 else x^m * (1 - x^Suc n) / (1 - x))"
    70   using setsum_gp [of x m "m+n"]
    70   using sum_gp [of x m "m+n"]
    71   by (auto simp: power_add algebra_simps)
    71   by (auto simp: power_add algebra_simps)
    72 
    72 
    73 lemma setsum_gp_strict:
    73 lemma sum_gp_strict:
    74   fixes x :: "'a::{comm_ring,division_ring}"
    74   fixes x :: "'a::{comm_ring,division_ring}"
    75   shows "(\<Sum>i<n. x^i) = (if x = 1 then of_nat n else (1 - x^n) / (1 - x))"
    75   shows "(\<Sum>i<n. x^i) = (if x = 1 then of_nat n else (1 - x^n) / (1 - x))"
    76   by (induct n) (auto simp: algebra_simps divide_simps)
    76   by (induct n) (auto simp: algebra_simps divide_simps)
    77 
    77 
    78 subsection\<open>Basics about polynomial functions: extremal behaviour and root counts.\<close>
    78 subsection\<open>Basics about polynomial functions: extremal behaviour and root counts.\<close>
    82   shows   "(\<Sum>i\<le>n. a i * x^i) - (\<Sum>i\<le>n. a i * y^i) =
    82   shows   "(\<Sum>i\<le>n. a i * x^i) - (\<Sum>i\<le>n. a i * y^i) =
    83            (x - y) * (\<Sum>j<n. \<Sum>k= Suc j..n. a k * y^(k - Suc j) * x^j)"
    83            (x - y) * (\<Sum>j<n. \<Sum>k= Suc j..n. a k * y^(k - Suc j) * x^j)"
    84 proof -
    84 proof -
    85   have "(\<Sum>i\<le>n. a i * x^i) - (\<Sum>i\<le>n. a i * y^i) =
    85   have "(\<Sum>i\<le>n. a i * x^i) - (\<Sum>i\<le>n. a i * y^i) =
    86         (\<Sum>i\<le>n. a i * (x^i - y^i))"
    86         (\<Sum>i\<le>n. a i * (x^i - y^i))"
    87     by (simp add: algebra_simps setsum_subtractf [symmetric])
    87     by (simp add: algebra_simps sum_subtractf [symmetric])
    88   also have "... = (\<Sum>i\<le>n. a i * (x - y) * (\<Sum>j<i. y^(i - Suc j) * x^j))"
    88   also have "... = (\<Sum>i\<le>n. a i * (x - y) * (\<Sum>j<i. y^(i - Suc j) * x^j))"
    89     by (simp add: power_diff_sumr2 ac_simps)
    89     by (simp add: power_diff_sumr2 ac_simps)
    90   also have "... = (x - y) * (\<Sum>i\<le>n. (\<Sum>j<i. a i * y^(i - Suc j) * x^j))"
    90   also have "... = (x - y) * (\<Sum>i\<le>n. (\<Sum>j<i. a i * y^(i - Suc j) * x^j))"
    91     by (simp add: setsum_distrib_left ac_simps)
    91     by (simp add: sum_distrib_left ac_simps)
    92   also have "... = (x - y) * (\<Sum>j<n. (\<Sum>i=Suc j..n. a i * y^(i - Suc j) * x^j))"
    92   also have "... = (x - y) * (\<Sum>j<n. (\<Sum>i=Suc j..n. a i * y^(i - Suc j) * x^j))"
    93     by (simp add: nested_setsum_swap')
    93     by (simp add: nested_sum_swap')
    94   finally show ?thesis .
    94   finally show ?thesis .
    95 qed
    95 qed
    96 
    96 
    97 lemma sub_polyfun_alt:
    97 lemma sub_polyfun_alt:
    98   fixes x :: "'a::{comm_ring,monoid_mult}"
    98   fixes x :: "'a::{comm_ring,monoid_mult}"
   100            (x - y) * (\<Sum>j<n. \<Sum>k<n-j. a (j+k+1) * y^k * x^j)"
   100            (x - y) * (\<Sum>j<n. \<Sum>k<n-j. a (j+k+1) * y^k * x^j)"
   101 proof -
   101 proof -
   102   { fix j
   102   { fix j
   103     have "(\<Sum>k = Suc j..n. a k * y^(k - Suc j) * x^j) =
   103     have "(\<Sum>k = Suc j..n. a k * y^(k - Suc j) * x^j) =
   104           (\<Sum>k <n - j. a (Suc (j + k)) * y^k * x^j)"
   104           (\<Sum>k <n - j. a (Suc (j + k)) * y^k * x^j)"
   105       by (rule setsum.reindex_bij_witness[where i="\<lambda>i. i + Suc j" and j="\<lambda>i. i - Suc j"]) auto }
   105       by (rule sum.reindex_bij_witness[where i="\<lambda>i. i + Suc j" and j="\<lambda>i. i - Suc j"]) auto }
   106   then show ?thesis
   106   then show ?thesis
   107     by (simp add: sub_polyfun)
   107     by (simp add: sub_polyfun)
   108 qed
   108 qed
   109 
   109 
   110 lemma polyfun_linear_factor:
   110 lemma polyfun_linear_factor:
   113                   (z-a) * (\<Sum>i<n. b i * z^i) + (\<Sum>i\<le>n. c i * a^i)"
   113                   (z-a) * (\<Sum>i<n. b i * z^i) + (\<Sum>i\<le>n. c i * a^i)"
   114 proof -
   114 proof -
   115   { fix z
   115   { fix z
   116     have "(\<Sum>i\<le>n. c i * z^i) - (\<Sum>i\<le>n. c i * a^i) =
   116     have "(\<Sum>i\<le>n. c i * z^i) - (\<Sum>i\<le>n. c i * a^i) =
   117           (z - a) * (\<Sum>j<n. (\<Sum>k = Suc j..n. c k * a^(k - Suc j)) * z^j)"
   117           (z - a) * (\<Sum>j<n. (\<Sum>k = Suc j..n. c k * a^(k - Suc j)) * z^j)"
   118       by (simp add: sub_polyfun setsum_distrib_right)
   118       by (simp add: sub_polyfun sum_distrib_right)
   119     then have "(\<Sum>i\<le>n. c i * z^i) =
   119     then have "(\<Sum>i\<le>n. c i * z^i) =
   120           (z - a) * (\<Sum>j<n. (\<Sum>k = Suc j..n. c k * a^(k - Suc j)) * z^j)
   120           (z - a) * (\<Sum>j<n. (\<Sum>k = Suc j..n. c k * a^(k - Suc j)) * z^j)
   121           + (\<Sum>i\<le>n. c i * a^i)"
   121           + (\<Sum>i\<le>n. c i * a^i)"
   122       by (simp add: algebra_simps) }
   122       by (simp add: algebra_simps) }
   123   then show ?thesis
   123   then show ?thesis
   239    then have extr_prem: "~ (\<exists>k\<le>n. b k \<noteq> 0) \<Longrightarrow> \<exists>k. k \<noteq> 0 \<and> k \<le> Suc n \<and> c k \<noteq> 0"
   239    then have extr_prem: "~ (\<exists>k\<le>n. b k \<noteq> 0) \<Longrightarrow> \<exists>k. k \<noteq> 0 \<and> k \<le> Suc n \<and> c k \<noteq> 0"
   240      by (metis Suc.prems le0 minus_zero mult_zero_right)
   240      by (metis Suc.prems le0 minus_zero mult_zero_right)
   241    have "\<exists>k\<le>n. b k \<noteq> 0"
   241    have "\<exists>k\<le>n. b k \<noteq> 0"
   242      apply (rule ccontr)
   242      apply (rule ccontr)
   243      using polyfun_extremal [OF extr_prem, of 1]
   243      using polyfun_extremal [OF extr_prem, of 1]
   244      apply (auto simp: eventually_at_infinity b simp del: setsum_atMost_Suc)
   244      apply (auto simp: eventually_at_infinity b simp del: sum_atMost_Suc)
   245      apply (drule_tac x="of_real ba" in spec, simp)
   245      apply (drule_tac x="of_real ba" in spec, simp)
   246      done
   246      done
   247    then show ?thesis using Suc.IH [of b] ins_ab
   247    then show ?thesis using Suc.IH [of b] ins_ab
   248      by (auto simp: card_insert_if)
   248      by (auto simp: card_insert_if)
   249    qed simp
   249    qed simp