| 13957 |      1 | (*  Title       : CSeries.thy
 | 
|  |      2 |     Author      : Jacques D. Fleuriot
 | 
|  |      3 |     Copyright   : 2002  University of Edinburgh
 | 
|  |      4 | *)
 | 
|  |      5 | 
 | 
| 14406 |      6 | header{*Finite Summation and Infinite Series for Complex Numbers*}
 | 
|  |      7 | 
 | 
| 15131 |      8 | theory CSeries
 | 
| 15140 |      9 | imports CStar
 | 
| 15131 |     10 | begin
 | 
| 13957 |     11 | 
 | 
|  |     12 | consts sumc :: "[nat,nat,(nat=>complex)] => complex"
 | 
|  |     13 | primrec
 | 
| 14406 |     14 |    sumc_0:   "sumc m 0 f = 0"
 | 
|  |     15 |    sumc_Suc: "sumc m (Suc n) f = (if n < m then 0 else sumc m n f + f(n))"
 | 
| 13957 |     16 | 
 | 
|  |     17 | (*  
 | 
| 19765 |     18 | definition
 | 
| 13957 |     19 | 
 | 
|  |     20 |    needs convergence of complex sequences  
 | 
|  |     21 | 
 | 
|  |     22 |   csums  :: [nat=>complex,complex] => bool     (infixr 80)
 | 
| 19765 |     23 |    "f sums s  = (%n. sumr 0 n f) ----C> s"
 | 
| 13957 |     24 |   
 | 
|  |     25 |    csummable :: (nat=>complex) => bool
 | 
| 19765 |     26 |    "csummable f = (EX s. f csums s)"
 | 
| 13957 |     27 | 
 | 
|  |     28 |    csuminf   :: (nat=>complex) => complex
 | 
| 19765 |     29 |    "csuminf f = (@s. f csums s)"
 | 
| 13957 |     30 | *)
 | 
|  |     31 | 
 | 
| 14406 |     32 | lemma sumc_Suc_zero [simp]: "sumc (Suc n) n f = 0"
 | 
| 20899 |     33 | by (induct n) auto
 | 
| 14406 |     34 | 
 | 
|  |     35 | lemma sumc_eq_bounds [simp]: "sumc m m f = 0"
 | 
| 20899 |     36 | by (induct m) auto
 | 
| 14406 |     37 | 
 | 
|  |     38 | lemma sumc_Suc_eq [simp]: "sumc m (Suc m) f = f(m)"
 | 
|  |     39 | by auto
 | 
|  |     40 | 
 | 
|  |     41 | lemma sumc_add_lbound_zero [simp]: "sumc (m+k) k f = 0"
 | 
| 20899 |     42 | by (induct k) auto
 | 
| 14406 |     43 | 
 | 
|  |     44 | lemma sumc_add: "sumc m n f + sumc m n g = sumc m n (%n. f n + g n)"
 | 
| 20899 |     45 | by (induct n) (auto simp add: add_ac)
 | 
| 14406 |     46 | 
 | 
|  |     47 | lemma sumc_mult: "r * sumc m n f = sumc m n (%n. r * f n)"
 | 
| 20899 |     48 | by (induct n) (auto simp add: right_distrib)
 | 
| 14406 |     49 | 
 | 
|  |     50 | lemma sumc_split_add [rule_format]:
 | 
|  |     51 |      "n < p --> sumc 0 n f + sumc n p f = sumc 0 p f"
 | 
| 20899 |     52 | by (induct p) (auto dest!: leI dest: le_anti_sym)
 | 
| 14406 |     53 | 
 | 
|  |     54 | lemma sumc_split_add_minus:
 | 
|  |     55 |      "n < p ==> sumc 0 p f + - sumc 0 n f = sumc n p f"
 | 
| 20899 |     56 | apply (drule_tac f = f in sumc_split_add [symmetric])
 | 
| 14406 |     57 | apply (simp add: add_ac)
 | 
|  |     58 | done
 | 
|  |     59 | 
 | 
| 15539 |     60 | lemma sumc_cmod: "cmod(sumc m n f) \<le> (\<Sum>i=m..<n. cmod(f i))"
 | 
| 20899 |     61 | by (induct n) (auto intro: complex_mod_triangle_ineq [THEN order_trans])
 | 
| 14406 |     62 | 
 | 
|  |     63 | lemma sumc_fun_eq [rule_format (no_asm)]:
 | 
|  |     64 |      "(\<forall>r. m \<le> r & r < n --> f r = g r) --> sumc m n f = sumc m n g"
 | 
| 15251 |     65 | by (induct "n", auto)
 | 
| 14406 |     66 | 
 | 
|  |     67 | lemma sumc_const [simp]: "sumc 0 n (%i. r) = complex_of_real (real n) * r"
 | 
| 20899 |     68 | by (induct n) (auto simp add: left_distrib real_of_nat_Suc)
 | 
| 14406 |     69 | 
 | 
|  |     70 | lemma sumc_add_mult_const:
 | 
|  |     71 |      "sumc 0 n f + -(complex_of_real(real n) * r) = sumc 0 n (%i. f i + -r)"
 | 
|  |     72 | by (simp add: sumc_add [symmetric])
 | 
|  |     73 | 
 | 
|  |     74 | lemma sumc_diff_mult_const: 
 | 
|  |     75 |      "sumc 0 n f - (complex_of_real(real n)*r) = sumc 0 n (%i. f i - r)"
 | 
|  |     76 | by (simp add: diff_minus sumc_add_mult_const)
 | 
|  |     77 | 
 | 
|  |     78 | lemma sumc_less_bounds_zero [rule_format]: "n < m --> sumc m n f = 0"
 | 
| 20899 |     79 | by (induct n) auto
 | 
| 14406 |     80 | 
 | 
|  |     81 | lemma sumc_minus: "sumc m n (%i. - f i) = - sumc m n f"
 | 
| 20899 |     82 | by (induct n) auto
 | 
| 14406 |     83 | 
 | 
|  |     84 | lemma sumc_shift_bounds: "sumc (m+k) (n+k) f = sumc m n (%i. f(i + k))"
 | 
| 20899 |     85 | by (induct n) auto
 | 
| 14406 |     86 | 
 | 
|  |     87 | lemma sumc_minus_one_complexpow_zero [simp]:
 | 
|  |     88 |      "sumc 0 (2*n) (%i. (-1) ^ Suc i) = 0"
 | 
| 20899 |     89 | by (induct n) auto
 | 
| 14406 |     90 | 
 | 
|  |     91 | lemma sumc_interval_const [rule_format (no_asm)]:
 | 
|  |     92 |      "(\<forall>n. m \<le> Suc n --> f n = r) & m \<le> na  
 | 
| 15013 |     93 |       --> sumc m na f = (complex_of_real(real (na - m)) * r)"
 | 
| 20899 |     94 | by (induct na) (auto simp add: Suc_diff_le real_of_nat_Suc left_distrib)
 | 
| 14406 |     95 | 
 | 
|  |     96 | lemma sumc_interval_const2 [rule_format (no_asm)]:
 | 
|  |     97 |      "(\<forall>n. m \<le> n --> f n = r) & m \<le> na  
 | 
|  |     98 |       --> sumc m na f = (complex_of_real(real (na - m)) * r)"
 | 
| 20899 |     99 | by (induct na) (auto simp add: left_distrib Suc_diff_le real_of_nat_Suc)
 | 
| 14406 |    100 | 
 | 
|  |    101 | (*** 
 | 
|  |    102 | Goal "(\<forall>n. m \<le> n --> 0 \<le> cmod(f n)) & m < k --> cmod(sumc 0 m f) \<le> cmod(sumc 0 k f)"
 | 
|  |    103 | by (induct_tac "k" 1)
 | 
|  |    104 | by (Step_tac 1)
 | 
|  |    105 | by (ALLGOALS(asm_full_simp_tac (simpset() addsimps [less_Suc_eq_le])));
 | 
|  |    106 | by (ALLGOALS(dres_inst_tac [("x","n")] spec));
 | 
|  |    107 | by (Step_tac 1)
 | 
|  |    108 | by (dtac le_imp_less_or_eq 1 THEN Step_tac 1)
 | 
|  |    109 | by (dtac add_mono 2)
 | 
|  |    110 | by (dres_inst_tac [("i","sumr 0 m f")] (order_refl RS add_mono) 1);
 | 
|  |    111 | by Auto_tac
 | 
|  |    112 | qed_spec_mp "sumc_le";
 | 
|  |    113 | 
 | 
|  |    114 | Goal "!!f g. (\<forall>r. m \<le> r & r < n --> f r \<le> g r) \
 | 
|  |    115 | \                --> sumc m n f \<le> sumc m n g";
 | 
|  |    116 | by (induct_tac "n" 1)
 | 
|  |    117 | by (auto_tac (claset() addIs [add_mono],
 | 
|  |    118 |     simpset() addsimps [le_def]));
 | 
|  |    119 | qed_spec_mp "sumc_le2";
 | 
|  |    120 | 
 | 
|  |    121 | Goal "(\<forall>n. 0 \<le> f n) --> 0 \<le> sumc m n f";
 | 
|  |    122 | by (induct_tac "n" 1)
 | 
|  |    123 | by Auto_tac
 | 
|  |    124 | by (dres_inst_tac [("x","n")] spec 1);
 | 
|  |    125 | by (arith_tac 1)
 | 
|  |    126 | qed_spec_mp "sumc_ge_zero";
 | 
|  |    127 | 
 | 
|  |    128 | Goal "(\<forall>n. m \<le> n --> 0 \<le> f n) --> 0 \<le> sumc m n f";
 | 
|  |    129 | by (induct_tac "n" 1)
 | 
|  |    130 | by Auto_tac
 | 
|  |    131 | by (dres_inst_tac [("x","n")] spec 1);
 | 
|  |    132 | by (arith_tac 1)
 | 
|  |    133 | qed_spec_mp "sumc_ge_zero2";
 | 
|  |    134 | ***)
 | 
|  |    135 | 
 | 
| 15539 |    136 | lemma sumr_cmod_ge_zero [iff]: "0 \<le> (\<Sum>n=m..<n::nat. cmod (f n))"
 | 
| 20899 |    137 | by (induct n) (auto simp add: add_increasing)
 | 
| 14406 |    138 | 
 | 
|  |    139 | lemma rabs_sumc_cmod_cancel [simp]:
 | 
| 15539 |    140 |      "abs (\<Sum>n=m..<n::nat. cmod (f n)) = (\<Sum>n=m..<n. cmod (f n))"
 | 
| 14406 |    141 | by (simp add: abs_if linorder_not_less)
 | 
|  |    142 | 
 | 
|  |    143 | lemma sumc_one_lb_complexpow_zero [simp]: "sumc 1 n (%n. f(n) * 0 ^ n) = 0"
 | 
| 20899 |    144 | apply (induct n)
 | 
| 14406 |    145 | apply (case_tac [2] "n", auto)
 | 
|  |    146 | done
 | 
|  |    147 | 
 | 
|  |    148 | lemma sumc_diff: "sumc m n f - sumc m n g = sumc m n (%n. f n - g n)"
 | 
|  |    149 | by (simp add: diff_minus sumc_add [symmetric] sumc_minus)
 | 
|  |    150 | 
 | 
|  |    151 | lemma sumc_subst [rule_format (no_asm)]:
 | 
|  |    152 |      "(\<forall>p. (m \<le> p & p < m + n --> (f p = g p))) --> sumc m n f = sumc m n g"
 | 
| 20899 |    153 | by (induct n) auto
 | 
| 14406 |    154 | 
 | 
|  |    155 | lemma sumc_group [simp]:
 | 
|  |    156 |      "sumc 0 n (%m. sumc (m * k) (m*k + k) f) = sumc 0 (n * k) f"
 | 
|  |    157 | apply (subgoal_tac "k = 0 | 0 < k", auto)
 | 
| 15251 |    158 | apply (induct "n")
 | 
| 14406 |    159 | apply (auto simp add: sumc_split_add add_commute)
 | 
|  |    160 | done
 | 
|  |    161 | 
 | 
| 13957 |    162 | end
 |