src/HOL/Inequalities.thy
changeset 64267 b9a1486e79be
parent 63918 6bf55e6e0b75
child 66804 3f9bb52082c4
equal deleted inserted replaced
64265:8eb6365f5916 64267:b9a1486e79be
     5 
     5 
     6 theory Inequalities
     6 theory Inequalities
     7   imports Real_Vector_Spaces
     7   imports Real_Vector_Spaces
     8 begin
     8 begin
     9 
     9 
    10 lemma Setsum_Icc_int: "(m::int) \<le> n \<Longrightarrow> \<Sum> {m..n} = (n*(n+1) - m*(m-1)) div 2"
    10 lemma Sum_Icc_int: "(m::int) \<le> n \<Longrightarrow> \<Sum> {m..n} = (n*(n+1) - m*(m-1)) div 2"
    11 proof(induct i == "nat(n-m)" arbitrary: m n)
    11 proof(induct i == "nat(n-m)" arbitrary: m n)
    12   case 0
    12   case 0
    13   hence "m = n" by arith
    13   hence "m = n" by arith
    14   thus ?case by (simp add: algebra_simps)
    14   thus ?case by (simp add: algebra_simps)
    15 next
    15 next
    23   also have "\<dots> = ((n-1)*(n-1+1) - m*(m-1) + 2*n) div 2" by simp
    23   also have "\<dots> = ((n-1)*(n-1+1) - m*(m-1) + 2*n) div 2" by simp
    24   also have "\<dots> = (n*(n+1) - m*(m-1)) div 2" by(simp add: algebra_simps)
    24   also have "\<dots> = (n*(n+1) - m*(m-1)) div 2" by(simp add: algebra_simps)
    25   finally show ?case .
    25   finally show ?case .
    26 qed
    26 qed
    27 
    27 
    28 lemma Setsum_Icc_nat: assumes "(m::nat) \<le> n"
    28 lemma Sum_Icc_nat: assumes "(m::nat) \<le> n"
    29 shows "\<Sum> {m..n} = (n*(n+1) - m*(m-1)) div 2"
    29 shows "\<Sum> {m..n} = (n*(n+1) - m*(m-1)) div 2"
    30 proof -
    30 proof -
    31   have "m*(m-1) \<le> n*(n + 1)"
    31   have "m*(m-1) \<le> n*(n + 1)"
    32    using assms by (meson diff_le_self order_trans le_add1 mult_le_mono)
    32    using assms by (meson diff_le_self order_trans le_add1 mult_le_mono)
    33   hence "int(\<Sum> {m..n}) = int((n*(n+1) - m*(m-1)) div 2)" using assms
    33   hence "int(\<Sum> {m..n}) = int((n*(n+1) - m*(m-1)) div 2)" using assms
    34     by (auto simp: Setsum_Icc_int[transferred, OF assms] zdiv_int of_nat_mult simp del: of_nat_setsum
    34     by (auto simp: Sum_Icc_int[transferred, OF assms] zdiv_int of_nat_mult simp del: of_nat_sum
    35           split: zdiff_int_split)
    35           split: zdiff_int_split)
    36   thus ?thesis
    36   thus ?thesis
    37     using of_nat_eq_iff by blast
    37     using of_nat_eq_iff by blast
    38 qed
    38 qed
    39 
    39 
    40 lemma Setsum_Ico_nat: assumes "(m::nat) \<le> n"
    40 lemma Sum_Ico_nat: assumes "(m::nat) \<le> n"
    41 shows "\<Sum> {m..<n} = (n*(n-1) - m*(m-1)) div 2"
    41 shows "\<Sum> {m..<n} = (n*(n-1) - m*(m-1)) div 2"
    42 proof cases
    42 proof cases
    43   assume "m < n"
    43   assume "m < n"
    44   hence "{m..<n} = {m..n-1}" by auto
    44   hence "{m..<n} = {m..n-1}" by auto
    45   hence "\<Sum>{m..<n} = \<Sum>{m..n-1}" by simp
    45   hence "\<Sum>{m..<n} = \<Sum>{m..n-1}" by simp
    46   also have "\<dots> = (n*(n-1) - m*(m-1)) div 2"
    46   also have "\<dots> = (n*(n-1) - m*(m-1)) div 2"
    47     using assms \<open>m < n\<close> by (simp add: Setsum_Icc_nat mult.commute)
    47     using assms \<open>m < n\<close> by (simp add: Sum_Icc_nat mult.commute)
    48   finally show ?thesis .
    48   finally show ?thesis .
    49 next
    49 next
    50   assume "\<not> m < n" with assms show ?thesis by simp
    50   assume "\<not> m < n" with assms show ?thesis by simp
    51 qed
    51 qed
    52 
    52 
    57   shows "of_nat n * (\<Sum>k=0..<n. a k * b k) \<le> (\<Sum>k=0..<n. a k) * (\<Sum>k=0..<n. b k)"
    57   shows "of_nat n * (\<Sum>k=0..<n. a k * b k) \<le> (\<Sum>k=0..<n. a k) * (\<Sum>k=0..<n. b k)"
    58 proof -
    58 proof -
    59   let ?S = "(\<Sum>j=0..<n. (\<Sum>k=0..<n. (a j - a k) * (b j - b k)))"
    59   let ?S = "(\<Sum>j=0..<n. (\<Sum>k=0..<n. (a j - a k) * (b j - b k)))"
    60   have "2 * (of_nat n * (\<Sum>j=0..<n. (a j * b j)) - (\<Sum>j=0..<n. b j) * (\<Sum>k=0..<n. a k)) = ?S"
    60   have "2 * (of_nat n * (\<Sum>j=0..<n. (a j * b j)) - (\<Sum>j=0..<n. b j) * (\<Sum>k=0..<n. a k)) = ?S"
    61     by (simp only: one_add_one[symmetric] algebra_simps)
    61     by (simp only: one_add_one[symmetric] algebra_simps)
    62       (simp add: algebra_simps setsum_subtractf setsum.distrib setsum.commute[of "\<lambda>i j. a i * b j"] setsum_distrib_left)
    62       (simp add: algebra_simps sum_subtractf sum.distrib sum.commute[of "\<lambda>i j. a i * b j"] sum_distrib_left)
    63   also
    63   also
    64   { fix i j::nat assume "i<n" "j<n"
    64   { fix i j::nat assume "i<n" "j<n"
    65     hence "a i - a j \<le> 0 \<and> b i - b j \<ge> 0 \<or> a i - a j \<ge> 0 \<and> b i - b j \<le> 0"
    65     hence "a i - a j \<le> 0 \<and> b i - b j \<ge> 0 \<or> a i - a j \<ge> 0 \<and> b i - b j \<le> 0"
    66       using assms by (cases "i \<le> j") (auto simp: algebra_simps)
    66       using assms by (cases "i \<le> j") (auto simp: algebra_simps)
    67   } then have "?S \<le> 0"
    67   } then have "?S \<le> 0"
    68     by (auto intro!: setsum_nonpos simp: mult_le_0_iff)
    68     by (auto intro!: sum_nonpos simp: mult_le_0_iff)
    69   finally show ?thesis by (simp add: algebra_simps)
    69   finally show ?thesis by (simp add: algebra_simps)
    70 qed
    70 qed
    71 
    71 
    72 lemma Chebyshev_sum_upper_nat:
    72 lemma Chebyshev_sum_upper_nat:
    73   fixes a b :: "nat \<Rightarrow> nat"
    73   fixes a b :: "nat \<Rightarrow> nat"
    74   shows "(\<And>i j. \<lbrakk> i\<le>j; j<n \<rbrakk> \<Longrightarrow> a i \<le> a j) \<Longrightarrow>
    74   shows "(\<And>i j. \<lbrakk> i\<le>j; j<n \<rbrakk> \<Longrightarrow> a i \<le> a j) \<Longrightarrow>
    75          (\<And>i j. \<lbrakk> i\<le>j; j<n \<rbrakk> \<Longrightarrow> b i \<ge> b j) \<Longrightarrow>
    75          (\<And>i j. \<lbrakk> i\<le>j; j<n \<rbrakk> \<Longrightarrow> b i \<ge> b j) \<Longrightarrow>
    76     n * (\<Sum>i=0..<n. a i * b i) \<le> (\<Sum>i=0..<n. a i) * (\<Sum>i=0..<n. b i)"
    76     n * (\<Sum>i=0..<n. a i * b i) \<le> (\<Sum>i=0..<n. a i) * (\<Sum>i=0..<n. b i)"
    77 using Chebyshev_sum_upper[where 'a=real, of n a b]
    77 using Chebyshev_sum_upper[where 'a=real, of n a b]
    78 by (simp del: of_nat_mult of_nat_setsum  add: of_nat_mult[symmetric] of_nat_setsum[symmetric])
    78 by (simp del: of_nat_mult of_nat_sum  add: of_nat_mult[symmetric] of_nat_sum[symmetric])
    79 
    79 
    80 end
    80 end