src/HOL/ex/Formal_Power_Series_Examples.thy
author chaieb
Fri, 27 Mar 2009 17:35:21 +0000
changeset 30748 fe67d729a61c
parent 29698 91feea8e41e4
child 31021 53642251a04f
permissions -rw-r--r--
fixed proof
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     1
(*  Title:      Formal_Power_Series_Examples.thy
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     2
    ID:         
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     3
    Author:     Amine Chaieb, University of Cambridge
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     4
*)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     5
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     6
header{* Some applications of formal power series and some properties over complex numbers*}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     7
29698
91feea8e41e4 Fixed theory name
chaieb
parents: 29696
diff changeset
     8
theory Formal_Power_Series_Examples
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
     9
  imports Formal_Power_Series Binomial Complex
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    10
begin
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    11
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    12
section{* The generalized binomial theorem *}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    13
lemma gbinomial_theorem: 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    14
  "((a::'a::{ring_char_0, field, division_by_zero, recpower})+b) ^ n = (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n-k))"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    15
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    16
  from E_add_mult[of a b] 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    17
  have "(E (a + b)) $ n = (E a * E b)$n" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    18
  then have "(a + b) ^ n = (\<Sum>i\<Colon>nat = 0\<Colon>nat..n. a ^ i * b ^ (n - i)  * (of_nat (fact n) / of_nat (fact i * fact (n - i))))"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    19
    by (simp add: field_simps fps_mult_nth of_nat_mult[symmetric] setsum_right_distrib)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    20
  then show ?thesis 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    21
    apply simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    22
    apply (rule setsum_cong2)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    23
    apply simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    24
    apply (frule binomial_fact[where ?'a = 'a, symmetric])
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    25
    by (simp add: field_simps of_nat_mult)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    26
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    27
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    28
text{* And the nat-form -- also available from Binomial.thy *}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    29
lemma binomial_theorem: "(a+b) ^ n = (\<Sum>k=0..n. (n choose k) * a^k * b^(n-k))"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    30
  using gbinomial_theorem[of "of_nat a" "of_nat b" n]
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    31
  unfolding of_nat_add[symmetric] of_nat_power[symmetric] of_nat_mult[symmetric] of_nat_setsum[symmetric]
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    32
  by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    33
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    34
section {* The binomial series and Vandermonde's identity *}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    35
definition "fps_binomial a = Abs_fps (\<lambda>n. a gchoose n)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    36
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    37
lemma fps_binomial_nth[simp]: "fps_binomial a $ n = a gchoose n"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    38
  by (simp add: fps_binomial_def)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    39
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    40
lemma fps_binomial_ODE_unique:
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    41
  fixes c :: "'a::{field, recpower,ring_char_0}"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    42
  shows "fps_deriv a = (fps_const c * a) / (1 + X) \<longleftrightarrow> a = fps_const (a$0) * fps_binomial c"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    43
  (is "?lhs \<longleftrightarrow> ?rhs")
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    44
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    45
  let ?da = "fps_deriv a"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    46
  let ?x1 = "(1 + X):: 'a fps"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    47
  let ?l = "?x1 * ?da"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    48
  let ?r = "fps_const c * a"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    49
  have x10: "?x1 $ 0 \<noteq> 0" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    50
  have "?l = ?r \<longleftrightarrow> inverse ?x1 * ?l = inverse ?x1 * ?r" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    51
  also have "\<dots> \<longleftrightarrow> ?da = (fps_const c * a) / ?x1"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    52
    apply (simp only: fps_divide_def  mult_assoc[symmetric] inverse_mult_eq_1[OF x10])
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    53
    by (simp add: ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    54
  finally have eq: "?l = ?r \<longleftrightarrow> ?lhs" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    55
  moreover
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    56
  {assume h: "?l = ?r" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    57
    {fix n
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    58
      from h have lrn: "?l $ n = ?r$n" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    59
      
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    60
      from lrn 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    61
      have "a$ Suc n = ((c - of_nat n) / of_nat (Suc n)) * a $n" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    62
	apply (simp add: ring_simps del: of_nat_Suc)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    63
	by (cases n, simp_all add: field_simps del: of_nat_Suc)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    64
    }
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    65
    note th0 = this
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    66
    {fix n have "a$n = (c gchoose n) * a$0"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    67
      proof(induct n)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    68
	case 0 thus ?case by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    69
      next
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    70
	case (Suc m)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    71
	thus ?case unfolding th0
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    72
	  apply (simp add: field_simps del: of_nat_Suc)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    73
	  unfolding mult_assoc[symmetric] gbinomial_mult_1
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    74
	  by (simp add: ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    75
      qed}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    76
    note th1 = this
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    77
    have ?rhs
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    78
      apply (simp add: fps_eq_iff)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    79
      apply (subst th1)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    80
      by (simp add: ring_simps)}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    81
  moreover
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    82
  {assume h: ?rhs
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    83
  have th00:"\<And>x y. x * (a$0 * y) = a$0 * (x*y)" by (simp add: mult_commute)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    84
    have "?l = ?r" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    85
      apply (subst h)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    86
      apply (subst (2) h)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    87
      apply (clarsimp simp add: fps_eq_iff ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    88
      unfolding mult_assoc[symmetric] th00 gbinomial_mult_1
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    89
      by (simp add: ring_simps gbinomial_mult_1)}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    90
  ultimately show ?thesis by blast
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    91
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    92
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    93
lemma fps_binomial_deriv: "fps_deriv (fps_binomial c) = fps_const c * fps_binomial c / (1 + X)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    94
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    95
  let ?a = "fps_binomial c"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    96
  have th0: "?a = fps_const (?a$0) * ?a" by (simp)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    97
  from iffD2[OF fps_binomial_ODE_unique, OF th0] show ?thesis .
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    98
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
    99
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   100
lemma fps_binomial_add_mult: "fps_binomial (c+d) = fps_binomial c * fps_binomial d" (is "?l = ?r")
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   101
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   102
  let ?P = "?r - ?l"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   103
  let ?b = "fps_binomial"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   104
  let ?db = "\<lambda>x. fps_deriv (?b x)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   105
  have "fps_deriv ?P = ?db c * ?b d + ?b c * ?db d - ?db (c + d)"  by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   106
  also have "\<dots> = inverse (1 + X) * (fps_const c * ?b c * ?b d + fps_const d * ?b c * ?b d - fps_const (c+d) * ?b (c + d))"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   107
    unfolding fps_binomial_deriv
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   108
    by (simp add: fps_divide_def ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   109
  also have "\<dots> = (fps_const (c + d)/ (1 + X)) * ?P"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   110
    by (simp add: ring_simps fps_divide_def fps_const_add[symmetric] del: fps_const_add)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   111
  finally have th0: "fps_deriv ?P = fps_const (c+d) * ?P / (1 + X)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   112
    by (simp add: fps_divide_def)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   113
  have "?P = fps_const (?P$0) * ?b (c + d)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   114
    unfolding fps_binomial_ODE_unique[symmetric]
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   115
    using th0 by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   116
  hence "?P = 0" by (simp add: fps_mult_nth)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   117
  then show ?thesis by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   118
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   119
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   120
lemma fps_minomial_minus_one: "fps_binomial (- 1) = inverse (1 + X)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   121
  (is "?l = inverse ?r")
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   122
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   123
  have th: "?r$0 \<noteq> 0" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   124
  have th': "fps_deriv (inverse ?r) = fps_const (- 1) * inverse ?r / (1 + X)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   125
    by (simp add: fps_inverse_deriv[OF th] fps_divide_def power2_eq_square mult_commute fps_const_neg[symmetric] del: fps_const_neg)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   126
  have eq: "inverse ?r $ 0 = 1"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   127
    by (simp add: fps_inverse_def)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   128
  from iffD1[OF fps_binomial_ODE_unique[of "inverse (1 + X)" "- 1"] th'] eq
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   129
  show ?thesis by (simp add: fps_inverse_def)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   130
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   131
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   132
lemma gbinomial_Vandermond: "setsum (\<lambda>k. (a gchoose k) * (b gchoose (n - k))) {0..n} = (a + b) gchoose n"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   133
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   134
  let ?ba = "fps_binomial a"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   135
  let ?bb = "fps_binomial b"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   136
  let ?bab = "fps_binomial (a + b)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   137
  from fps_binomial_add_mult[of a b] have "?bab $ n = (?ba * ?bb)$n" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   138
  then show ?thesis by (simp add: fps_mult_nth)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   139
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   140
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   141
lemma binomial_Vandermond: "setsum (\<lambda>k. (a choose k) * (b choose (n - k))) {0..n} = (a + b) choose n"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   142
  using gbinomial_Vandermond[of "(of_nat a)" "of_nat b" n]
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   143
  
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   144
  apply (simp only: binomial_gbinomial[symmetric] of_nat_mult[symmetric] of_nat_setsum[symmetric] of_nat_add[symmetric])
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   145
  by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   146
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   147
lemma binomial_symmetric: assumes kn: "k \<le> n" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   148
  shows "n choose k = n choose (n - k)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   149
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   150
  from kn have kn': "n - k \<le> n" by arith
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   151
  from binomial_fact_lemma[OF kn] binomial_fact_lemma[OF kn']
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   152
  have "fact k * fact (n - k) * (n choose k) = fact (n - k) * fact (n - (n - k)) * (n choose (n - k))" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   153
  then show ?thesis using kn by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   154
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   155
  
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   156
lemma binomial_Vandermond_same: "setsum (\<lambda>k. (n choose k)^2) {0..n} = (2*n) choose n"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   157
  using binomial_Vandermond[of n n n,symmetric]
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   158
  unfolding nat_mult_2 apply (simp add: power2_eq_square)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   159
  apply (rule setsum_cong2)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   160
  by (auto intro:  binomial_symmetric)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   161
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   162
section {* Relation between formal sine/cosine and the exponential FPS*}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   163
lemma Eii_sin_cos:
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   164
  "E (ii * c) = fps_cos c + fps_const ii * fps_sin c "
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   165
  (is "?l = ?r")
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   166
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   167
  {fix n::nat
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   168
    {assume en: "even n"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   169
      from en obtain m where m: "n = 2*m" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   170
	unfolding even_mult_two_ex by blast
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   171
      
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   172
      have "?l $n = ?r$n" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   173
	by (simp add: m fps_sin_def fps_cos_def power_mult_distrib
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   174
	  power_mult power_minus)}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   175
    moreover
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   176
    {assume on: "odd n"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   177
      from on obtain m where m: "n = 2*m + 1" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   178
	unfolding odd_nat_equiv_def2 by (auto simp add: nat_mult_2)  
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   179
      have "?l $n = ?r$n" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   180
	by (simp add: m fps_sin_def fps_cos_def power_mult_distrib
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   181
	  power_mult power_minus)}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   182
    ultimately have "?l $n = ?r$n"  by blast}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   183
  then show ?thesis by (simp add: fps_eq_iff)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   184
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   185
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   186
lemma fps_sin_neg[simp]: "fps_sin (- c) = - fps_sin c"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   187
by (simp add: fps_eq_iff fps_sin_def)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   188
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   189
lemma fps_cos_neg[simp]: "fps_cos (- c) = fps_cos c"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   190
  by (simp add: fps_eq_iff fps_cos_def)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   191
lemma E_minus_ii_sin_cos: "E (- (ii * c)) = fps_cos c - fps_const ii * fps_sin c "
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   192
  unfolding minus_mult_right Eii_sin_cos by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   193
30748
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   194
lemma fps_const_minus: "fps_const (c::'a::group_add) - fps_const d = fps_const (c - d)  "by (simp add: fps_eq_iff fps_const_def)
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   195
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   196
lemma fps_number_of_fps_const: "number_of i = fps_const (number_of i :: 'a:: {comm_ring_1, number_ring})"
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   197
  apply (subst (2) number_of_eq)
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   198
apply(rule int_induct[of _ 0])
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   199
apply (simp_all add: number_of_fps_def)
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   200
by (simp_all add: fps_const_add[symmetric] fps_const_minus[symmetric])
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   201
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   202
lemma fps_cos_Eii:
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   203
  "fps_cos c = (E (ii * c) + E (- ii * c)) / fps_const 2"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   204
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   205
  have th: "fps_cos c + fps_cos c = fps_cos c * fps_const 2" 
30748
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   206
    by (simp add: fps_eq_iff fps_number_of_fps_const complex_number_of_def[symmetric])
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   207
  show ?thesis
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   208
  unfolding Eii_sin_cos minus_mult_commute
30748
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   209
  by (simp add: fps_number_of_fps_const fps_divide_def fps_const_inverse th complex_number_of_def[symmetric])
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   210
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   211
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   212
lemma fps_sin_Eii:
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   213
  "fps_sin c = (E (ii * c) - E (- ii * c)) / fps_const (2*ii)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   214
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   215
  have th: "fps_const \<i> * fps_sin c + fps_const \<i> * fps_sin c = fps_sin c * fps_const (2 * ii)" 
30748
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   216
    by (simp add: fps_eq_iff fps_number_of_fps_const complex_number_of_def[symmetric])
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   217
  show ?thesis
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   218
  unfolding Eii_sin_cos minus_mult_commute
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   219
  by (simp add: fps_divide_def fps_const_inverse th)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   220
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   221
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   222
lemma fps_const_mult_2: "fps_const (2::'a::number_ring) * a = a +a"
30748
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   223
  by (simp add: fps_eq_iff fps_number_of_fps_const)
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   224
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   225
lemma fps_const_mult_2_right: "a * fps_const (2::'a::number_ring) = a +a"
30748
fe67d729a61c fixed proof
chaieb
parents: 29698
diff changeset
   226
  by (simp add: fps_eq_iff fps_number_of_fps_const)
29696
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   227
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   228
lemma fps_tan_Eii:
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   229
  "fps_tan c = (E (ii * c) - E (- ii * c)) / (fps_const ii * (E (ii * c) + E (- ii * c)))"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   230
  unfolding fps_tan_def fps_sin_Eii fps_cos_Eii mult_minus_left E_neg
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   231
  apply (simp add: fps_divide_def fps_inverse_mult fps_const_mult[symmetric] fps_const_inverse del: fps_const_mult)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   232
  by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   233
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   234
lemma fps_demoivre: "(fps_cos a + fps_const ii * fps_sin a)^n = fps_cos (of_nat n * a) + fps_const ii * fps_sin (of_nat n * a)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   235
  unfolding Eii_sin_cos[symmetric] E_power_mult
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   236
  by (simp add: mult_ac)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   237
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   238
text{* Now some trigonometric identities *}
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   239
lemma fps_sin_add: 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   240
  "fps_sin (a+b) = fps_sin (a::complex) * fps_cos b + fps_cos a * fps_sin b"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   241
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   242
  let ?ca = "fps_cos a"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   243
  let ?cb = "fps_cos b"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   244
  let ?sa = "fps_sin a"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   245
  let ?sb = "fps_sin b"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   246
  let ?i = "fps_const ii"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   247
  have i: "?i*?i = fps_const -1" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   248
  have "fps_sin (a + b) = 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   249
    ((?ca + ?i * ?sa) * (?cb + ?i*?sb) - (?ca - ?i*?sa) * (?cb - ?i*?sb)) *
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   250
    fps_const (- (\<i> / 2))"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   251
    apply(simp add: fps_sin_Eii[of "a+b"] fps_divide_def minus_mult_commute)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   252
    unfolding right_distrib
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   253
    apply (simp add: Eii_sin_cos E_minus_ii_sin_cos fps_const_inverse E_add_mult)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   254
    by (simp add: ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   255
  also have "\<dots> = (?ca * ?cb + ?i*?ca * ?sb + ?i * ?sa * ?cb + (?i*?i)*?sa*?sb - ?ca*?cb + ?i*?ca * ?sb + ?i*?sa*?cb - (?i*?i)*?sa * ?sb) * fps_const (- ii/2)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   256
    by (simp add: ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   257
  also have "\<dots> = (fps_const 2 * ?i * (?ca * ?sb + ?sa * ?cb)) * fps_const (- ii/2)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   258
    apply simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   259
  apply (simp add: ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   260
    apply (simp add:  ring_simps add: fps_const_mult[symmetric] del:fps_const_mult)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   261
    unfolding fps_const_mult_2_right
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   262
    by (simp add: ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   263
  also have "\<dots> = (fps_const 2 * ?i * fps_const (- ii/2)) * (?ca * ?sb + ?sa * ?cb)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   264
    by (simp only: mult_ac)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   265
  also have "\<dots> = ?sa * ?cb + ?ca*?sb"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   266
    by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   267
  finally show ?thesis .
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   268
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   269
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   270
lemma fps_cos_add: 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   271
  "fps_cos (a+b) = fps_cos (a::complex) * fps_cos b - fps_sin a * fps_sin b"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   272
proof-
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   273
  let ?ca = "fps_cos a"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   274
  let ?cb = "fps_cos b"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   275
  let ?sa = "fps_sin a"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   276
  let ?sb = "fps_sin b"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   277
  let ?i = "fps_const ii"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   278
  have i: "?i*?i = fps_const -1" by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   279
  have i': "\<And>x. ?i * (?i * x) = - x" 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   280
    apply (simp add: mult_assoc[symmetric] i)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   281
    by (simp add: fps_eq_iff)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   282
  have m1: "\<And>x. x * fps_const (-1 ::complex) = - x" "\<And>x. fps_const (-1 :: complex) * x = - x"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   283
    by (auto simp add: fps_eq_iff)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   284
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   285
  have "fps_cos (a + b) = 
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   286
    ((?ca + ?i * ?sa) * (?cb + ?i*?sb) + (?ca - ?i*?sa) * (?cb - ?i*?sb)) *
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   287
    fps_const (1/ 2)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   288
    apply(simp add: fps_cos_Eii[of "a+b"] fps_divide_def minus_mult_commute)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   289
    unfolding right_distrib minus_add_distrib
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   290
    apply (simp add: Eii_sin_cos E_minus_ii_sin_cos fps_const_inverse E_add_mult)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   291
    by (simp add: ring_simps)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   292
  also have "\<dots> = (?ca * ?cb + ?i*?ca * ?sb + ?i * ?sa * ?cb + (?i*?i)*?sa*?sb + ?ca*?cb - ?i*?ca * ?sb - ?i*?sa*?cb + (?i*?i)*?sa * ?sb) * fps_const (1/2)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   293
    apply simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   294
    by (simp add: ring_simps i' m1)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   295
  also have "\<dots> = (fps_const 2 * (?ca * ?cb - ?sa * ?sb)) * fps_const (1/2)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   296
    apply simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   297
    by (simp add: ring_simps m1 fps_const_mult_2_right)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   298
  also have "\<dots> = (fps_const 2 * fps_const (1/2)) * (?ca * ?cb - ?sa * ?sb)"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   299
    by (simp only: mult_ac)
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   300
  also have "\<dots> = ?ca * ?cb - ?sa*?sb"
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   301
    by simp
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   302
  finally show ?thesis .
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   303
qed
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   304
477c7fcc0777 Some applications of formal power Series
chaieb
parents:
diff changeset
   305
end