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}" |