# HG changeset patch # User paulson # Date 1694523288 -3600 # Node ID 3032bc7d613d875b3acacdb842c500b3dfb3c82a # Parent 123bbc715ec9bf160582ec7686d3e59c383ce2be A little reorganisation diff -r 123bbc715ec9 -r 3032bc7d613d src/HOL/Set_Interval.thy --- a/src/HOL/Set_Interval.thy Mon Sep 11 23:13:23 2023 +0200 +++ b/src/HOL/Set_Interval.thy Tue Sep 12 13:54:48 2023 +0100 @@ -2228,6 +2228,28 @@ shows "(\i = m.. 'a::ab_group_add" + assumes "m \ n" + shows "(\i\n - m. f(n - i)) = (\i\n. f i) - (\ii\n - m. f(n - i)) = (\i\(-) n ` {m..n}. f(n - i))" + proof (rule sum.cong) + have "\x. x \ n - m \ \k\m. k \ n \ x = n - k" + by (metis assms diff_diff_cancel diff_le_mono2 diff_le_self le_trans) + then show "{..n - m} = (-) n ` {m..n}" + by (auto simp: image_iff Bex_def) + qed auto + also have "\ = (\i=m..n. f i)" + by (simp add: sum.reindex_cong [OF inj]) + also have "\ = (\i\n. f i) - (\iTelescoping\ @@ -2626,4 +2648,45 @@ (* TODO: Add support for folding over more kinds of intervals here *) +lemma pairs_le_eq_Sigma: "{(i, j). i + j \ m} = Sigma (atMost m) (\r. atMost (m - r))" + for m :: nat + by auto + +lemma sum_up_index_split: "(\k\m + n. f k) = (\k\m. f k) + (\k = Suc m..m + n. f k)" + by (metis atLeast0AtMost Suc_eq_plus1 le0 sum.ub_add_nat) + +lemma Sigma_interval_disjoint: "(SIGMA i:A. {..v i}) \ (SIGMA i:A.{v i<..w}) = {}" + for w :: "'a::order" + by auto + +lemma product_atMost_eq_Un: "A \ {..m} = (SIGMA i:A.{..m - i}) \ (SIGMA i:A.{m - i<..m})" + for m :: nat + by auto + +lemma polynomial_product: (*with thanks to Chaitanya Mangla*) + fixes x :: "'a::idom" + assumes m: "\i. i > m \ a i = 0" + and n: "\j. j > n \ b j = 0" + shows "(\i\m. (a i) * x ^ i) * (\j\n. (b j) * x ^ j) = + (\r\m + n. (\k\r. (a k) * (b (r - k))) * x ^ r)" +proof - + have "\i j. \m + n - i < j; a i \ 0\ \ b j = 0" + by (meson le_add_diff leI le_less_trans m n) + then have \
: "(\(i,j)\(SIGMA i:{..m+n}. {m+n - i<..m+n}). a i * x ^ i * (b j * x ^ j)) = 0" + by (clarsimp simp add: sum_Un Sigma_interval_disjoint intro!: sum.neutral) + have "(\i\m. (a i) * x ^ i) * (\j\n. (b j) * x ^ j) = (\i\m. \j\n. (a i * x ^ i) * (b j * x ^ j))" + by (rule sum_product) + also have "\ = (\i\m + n. \j\n + m. a i * x ^ i * (b j * x ^ j))" + using assms by (auto simp: sum_up_index_split) + also have "\ = (\r\m + n. \j\m + n - r. a r * x ^ r * (b j * x ^ j))" + by (simp add: add_ac sum.Sigma product_atMost_eq_Un sum_Un Sigma_interval_disjoint \
) + also have "\ = (\(i,j)\{(i,j). i+j \ m+n}. (a i * x ^ i) * (b j * x ^ j))" + by (auto simp: pairs_le_eq_Sigma sum.Sigma) + also have "... = (\k\m + n. \i\k. a i * x ^ i * (b (k - i) * x ^ (k - i)))" + by (rule sum.triangle_reindex_eq) + also have "\ = (\r\m + n. (\k\r. (a k) * (b (r - k))) * x ^ r)" + by (auto simp: algebra_simps sum_distrib_left simp flip: power_add intro!: sum.cong) + finally show ?thesis . +qed + end diff -r 123bbc715ec9 -r 3032bc7d613d src/HOL/Transcendental.thy --- a/src/HOL/Transcendental.thy Mon Sep 11 23:13:23 2023 +0200 +++ b/src/HOL/Transcendental.thy Tue Sep 12 13:54:48 2023 +0100 @@ -6241,51 +6241,10 @@ subsection \Basics about polynomial functions: products, extremal behaviour and root counts\ -lemma pairs_le_eq_Sigma: "{(i, j). i + j \ m} = Sigma (atMost m) (\r. atMost (m - r))" - for m :: nat - by auto - -lemma sum_up_index_split: "(\k\m + n. f k) = (\k\m. f k) + (\k = Suc m..m + n. f k)" - by (metis atLeast0AtMost Suc_eq_plus1 le0 sum.ub_add_nat) - -lemma Sigma_interval_disjoint: "(SIGMA i:A. {..v i}) \ (SIGMA i:A.{v i<..w}) = {}" - for w :: "'a::order" - by auto - -lemma product_atMost_eq_Un: "A \ {..m} = (SIGMA i:A.{..m - i}) \ (SIGMA i:A.{m - i<..m})" - for m :: nat - by auto - -lemma polynomial_product: (*with thanks to Chaitanya Mangla*) - fixes x :: "'a::idom" - assumes m: "\i. i > m \ a i = 0" - and n: "\j. j > n \ b j = 0" - shows "(\i\m. (a i) * x ^ i) * (\j\n. (b j) * x ^ j) = - (\r\m + n. (\k\r. (a k) * (b (r - k))) * x ^ r)" -proof - - have "\i j. \m + n - i < j; a i \ 0\ \ b j = 0" - by (meson le_add_diff leI le_less_trans m n) - then have \
: "(\(i,j)\(SIGMA i:{..m+n}. {m+n - i<..m+n}). a i * x ^ i * (b j * x ^ j)) = 0" - by (clarsimp simp add: sum_Un Sigma_interval_disjoint intro!: sum.neutral) - have "(\i\m. (a i) * x ^ i) * (\j\n. (b j) * x ^ j) = (\i\m. \j\n. (a i * x ^ i) * (b j * x ^ j))" - by (rule sum_product) - also have "\ = (\i\m + n. \j\n + m. a i * x ^ i * (b j * x ^ j))" - using assms by (auto simp: sum_up_index_split) - also have "\ = (\r\m + n. \j\m + n - r. a r * x ^ r * (b j * x ^ j))" - by (simp add: add_ac sum.Sigma product_atMost_eq_Un sum_Un Sigma_interval_disjoint \
) - also have "\ = (\(i,j)\{(i,j). i+j \ m+n}. (a i * x ^ i) * (b j * x ^ j))" - by (auto simp: pairs_le_eq_Sigma sum.Sigma) - also have "... = (\k\m + n. \i\k. a i * x ^ i * (b (k - i) * x ^ (k - i)))" - by (rule sum.triangle_reindex_eq) - also have "\ = (\r\m + n. (\k\r. (a k) * (b (r - k))) * x ^ r)" - by (auto simp: algebra_simps sum_distrib_left simp flip: power_add intro!: sum.cong) - finally show ?thesis . -qed - lemma polynomial_product_nat: fixes x :: nat - assumes m: "\i. i > m \ a i = 0" - and n: "\j. j > n \ b j = 0" + assumes m: "\i. i > m \ int (a i) = 0" + and n: "\j. j > n \ int (b j) = 0" shows "(\i\m. (a i) * x ^ i) * (\j\n. (b j) * x ^ j) = (\r\m + n. (\k\r. (a k) * (b (r - k))) * x ^ r)" using polynomial_product [of m a n b x] assms