856 lemma setsum_natinterval_difff: |
856 lemma setsum_natinterval_difff: |
857 fixes f:: "nat \<Rightarrow> ('a::ab_group_add)" |
857 fixes f:: "nat \<Rightarrow> ('a::ab_group_add)" |
858 shows "setsum (\<lambda>k. f k - f(k + 1)) {(m::nat) .. n} = |
858 shows "setsum (\<lambda>k. f k - f(k + 1)) {(m::nat) .. n} = |
859 (if m <= n then f m - f(n + 1) else 0)" |
859 (if m <= n then f m - f(n + 1) else 0)" |
860 by (induct n, auto simp add: algebra_simps not_le le_Suc_eq) |
860 by (induct n, auto simp add: algebra_simps not_le le_Suc_eq) |
|
861 |
|
862 lemmas setsum_restrict_set' = setsum_restrict_set[unfolded Int_def] |
|
863 |
|
864 lemma setsum_setsum_restrict: |
|
865 "finite S \<Longrightarrow> finite T \<Longrightarrow> setsum (\<lambda>x. setsum (\<lambda>y. f x y) {y. y\<in> T \<and> R x y}) S = setsum (\<lambda>y. setsum (\<lambda>x. f x y) {x. x \<in> S \<and> R x y}) T" |
|
866 by (simp add: setsum_restrict_set'[unfolded mem_def] mem_def) |
|
867 (rule setsum_commute) |
|
868 |
|
869 lemma setsum_image_gen: assumes fS: "finite S" |
|
870 shows "setsum g S = setsum (\<lambda>y. setsum g {x. x \<in> S \<and> f x = y}) (f ` S)" |
|
871 proof- |
|
872 { fix x assume "x \<in> S" then have "{y. y\<in> f`S \<and> f x = y} = {f x}" by auto } |
|
873 hence "setsum g S = setsum (\<lambda>x. setsum (\<lambda>y. g x) {y. y\<in> f`S \<and> f x = y}) S" |
|
874 by simp |
|
875 also have "\<dots> = setsum (\<lambda>y. setsum g {x. x \<in> S \<and> f x = y}) (f ` S)" |
|
876 by (rule setsum_setsum_restrict[OF fS finite_imageI[OF fS]]) |
|
877 finally show ?thesis . |
|
878 qed |
|
879 |
|
880 lemma setsum_multicount_gen: |
|
881 assumes "finite s" "finite t" "\<forall>j\<in>t. (card {i\<in>s. R i j} = k j)" |
|
882 shows "setsum (\<lambda>i. (card {j\<in>t. R i j})) s = setsum k t" (is "?l = ?r") |
|
883 proof- |
|
884 have "?l = setsum (\<lambda>i. setsum (\<lambda>x.1) {j\<in>t. R i j}) s" by auto |
|
885 also have "\<dots> = ?r" unfolding setsum_setsum_restrict[OF assms(1-2)] |
|
886 using assms(3) by auto |
|
887 finally show ?thesis . |
|
888 qed |
|
889 |
|
890 lemma setsum_multicount: |
|
891 assumes "finite S" "finite T" "\<forall>j\<in>T. (card {i\<in>S. R i j} = k)" |
|
892 shows "setsum (\<lambda>i. card {j\<in>T. R i j}) S = k * card T" (is "?l = ?r") |
|
893 proof- |
|
894 have "?l = setsum (\<lambda>i. k) T" by(rule setsum_multicount_gen)(auto simp:assms) |
|
895 also have "\<dots> = ?r" by(simp add: setsum_constant mult_commute) |
|
896 finally show ?thesis by auto |
|
897 qed |
861 |
898 |
862 |
899 |
863 subsection{* Shifting bounds *} |
900 subsection{* Shifting bounds *} |
864 |
901 |
865 lemma setsum_shift_bounds_nat_ivl: |
902 lemma setsum_shift_bounds_nat_ivl: |