src/HOL/Real/Complex_Numbers.thy
author paulson
Fri, 21 Nov 2003 11:15:40 +0100
changeset 14265 95b42e69436c
parent 14263 a431e0aa34c9
child 14334 6137d24eef79
permissions -rw-r--r--
HOL: installation of Ring_and_Field as the basis for Naturals and Reals
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Real/Complex_Numbers.thy
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     3
    Author:     Gertrud Bauer and Markus Wenzel, TU München
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     5
*)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     6
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     7
header {* Complex numbers *}
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     8
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
     9
theory Complex_Numbers = RealPow + Ring_and_Field:
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    10
12740
wenzelm
parents: 12733
diff changeset
    11
subsection {* Representation of complex numbers *}
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    12
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    13
datatype complex = Complex real real
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    14
12740
wenzelm
parents: 12733
diff changeset
    15
consts Re :: "complex => real"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    16
primrec "Re (Complex x y) = x"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    17
12740
wenzelm
parents: 12733
diff changeset
    18
consts Im :: "complex => real"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    19
primrec "Im (Complex x y) = y"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    20
12740
wenzelm
parents: 12733
diff changeset
    21
lemma complex_surj [simp]: "Complex (Re z) (Im z) = z"
wenzelm
parents: 12733
diff changeset
    22
  by (induct z) simp
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    23
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    24
instance complex :: zero ..
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    25
instance complex :: one ..
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    26
instance complex :: number ..
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    27
instance complex :: plus ..
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    28
instance complex :: minus ..
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    29
instance complex :: times ..
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    30
instance complex :: inverse ..
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    31
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    32
defs (overloaded)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    33
  zero_complex_def: "0 == Complex 0 0"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    34
  one_complex_def: "1 == Complex 1 0"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    35
  number_of_complex_def: "number_of b == Complex (number_of b) 0"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    36
  add_complex_def: "z + w == Complex (Re z + Re w) (Im z + Im w)"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    37
  minus_complex_def: "z - w == Complex (Re z - Re w) (Im z - Im w)"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    38
  uminus_complex_def: "- z == Complex (- Re z) (- Im z)"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    39
  mult_complex_def: "z * w ==
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    40
    Complex (Re z * Re w - Im z * Im w) (Re z * Im w + Im z * Re w)"
12740
wenzelm
parents: 12733
diff changeset
    41
  inverse_complex_def: "(z::complex) \<noteq> 0 ==> inverse z ==
wenzelm
parents: 12733
diff changeset
    42
    Complex (Re z / ((Re z)\<twosuperior> + (Im z)\<twosuperior>)) (- Im z / ((Re z)\<twosuperior> + (Im z)\<twosuperior>))"
wenzelm
parents: 12733
diff changeset
    43
  divide_complex_def: "(w::complex) \<noteq> 0 ==> z / (w::complex) == z * inverse w"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    44
12740
wenzelm
parents: 12733
diff changeset
    45
lemma complex_equality [intro?]: "Re z = Re w ==> Im z = Im w ==> z = w"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    46
  by (induct z, induct w) simp
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    47
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    48
lemma Re_zero [simp]: "Re 0 = 0"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    49
  and Im_zero [simp]: "Im 0 = 0"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    50
  by (simp_all add: zero_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    51
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    52
lemma Re_one [simp]: "Re 1 = 1"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    53
  and Im_one [simp]: "Im 1 = 0"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    54
  by (simp_all add: one_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    55
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    56
lemma Re_add [simp]: "Re (z + w) = Re z + Re w"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    57
  by (simp add: add_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    58
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    59
lemma Im_add [simp]: "Im (z + w) = Im z + Im w"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    60
  by (simp add: add_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    61
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    62
lemma Re_diff [simp]: "Re (z - w) = Re z - Re w"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    63
  by (simp add: minus_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    64
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    65
lemma Im_diff [simp]: "Im (z - w) = Im z - Im w"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    66
  by (simp add: minus_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    67
12740
wenzelm
parents: 12733
diff changeset
    68
lemma Re_uminus [simp]: "Re (-z) = - Re z"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    69
  by (simp add: uminus_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    70
12740
wenzelm
parents: 12733
diff changeset
    71
lemma Im_uminus [simp]: "Im (-z) = - Im z"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    72
  by (simp add: uminus_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    73
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    74
lemma Re_mult [simp]: "Re (z * w) = Re z * Re w - Im z * Im w"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    75
  by (simp add: mult_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    76
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    77
lemma Im_mult [simp]: "Im (z * w) = Re z * Im w + Im z * Re w"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    78
  by (simp add: mult_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    79
12740
wenzelm
parents: 12733
diff changeset
    80
lemma zero_complex_iff: "(z = 0) = (Re z = 0 \<and> Im z = 0)"
wenzelm
parents: 12733
diff changeset
    81
  and one_complex_iff: "(z = 1) = (Re z = 1 \<and> Im z = 0)"
wenzelm
parents: 12733
diff changeset
    82
  by (auto simp add: complex_equality)
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    83
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    84
12740
wenzelm
parents: 12733
diff changeset
    85
subsection {* The field of complex numbers *}
wenzelm
parents: 12733
diff changeset
    86
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    87
instance complex :: field
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    88
proof
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    89
  fix z u v w :: complex
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    90
  show "(u + v) + w = u + (v + w)"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    91
    by (simp add: add_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    92
  show "z + w = w + z"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    93
    by (simp add: add_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    94
  show "0 + z = z"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    95
    by (simp add: add_complex_def zero_complex_def)
12740
wenzelm
parents: 12733
diff changeset
    96
  show "-z + z = 0"
wenzelm
parents: 12733
diff changeset
    97
    by (simp add: complex_equality minus_complex_def)
wenzelm
parents: 12733
diff changeset
    98
  show "z - w = z + -w"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
    99
    by (simp add: add_complex_def minus_complex_def uminus_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   100
  show "(u * v) * w = u * (v * w)"
14265
95b42e69436c HOL: installation of Ring_and_Field as the basis for Naturals and Reals
paulson
parents: 14263
diff changeset
   101
    by (simp add: mult_complex_def mult_ac ring_distrib real_diff_def)  (* FIXME *)
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   102
  show "z * w = w * z"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   103
    by (simp add: mult_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   104
  show "1 * z = z"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   105
    by (simp add: one_complex_def mult_complex_def)
14263
a431e0aa34c9 including 0 ~= 1 in definition of Field
paulson
parents: 12740
diff changeset
   106
  show "0 \<noteq> (1::complex)"  --{*for some reason it has to be early*}
a431e0aa34c9 including 0 ~= 1 in definition of Field
paulson
parents: 12740
diff changeset
   107
    by (simp add: zero_complex_def one_complex_def) 
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   108
  show "(u + v) * w = u * w + v * w"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   109
    by (simp add: add_complex_def mult_complex_def ring_distrib)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   110
  assume neq: "w \<noteq> 0"
12740
wenzelm
parents: 12733
diff changeset
   111
  thus "z / w = z * inverse w"
wenzelm
parents: 12733
diff changeset
   112
    by (simp add: divide_complex_def)
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   113
  show "inverse w * w = 1"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   114
  proof
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   115
    have neq': "Re w * Re w + Im w * Im w \<noteq> 0"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   116
    proof -
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   117
      have ge: "0 \<le> Re w * Re w"  "0 \<le> Im w * Im w" by simp_all
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   118
      from neq have "Re w \<noteq> 0 \<or> Im w \<noteq> 0" by (simp add: zero_complex_iff)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   119
      hence "Re w * Re w \<noteq> 0 \<or> Im w * Im w \<noteq> 0" by simp
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   120
      thus ?thesis by rule (insert ge, arith+)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   121
    qed
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   122
    with neq show "Re (inverse w * w) = Re 1"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   123
      by (simp add: inverse_complex_def real_power_two real_add_divide_distrib [symmetric])
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   124
    from neq show "Im (inverse w * w) = Im 1"
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   125
      by (simp add: inverse_complex_def real_power_two
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   126
        real_mult_ac real_add_divide_distrib [symmetric])
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   127
  qed
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   128
qed
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   129
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   130
12740
wenzelm
parents: 12733
diff changeset
   131
subsection {* Basic operations *}
wenzelm
parents: 12733
diff changeset
   132
wenzelm
parents: 12733
diff changeset
   133
instance complex :: power ..
wenzelm
parents: 12733
diff changeset
   134
primrec (power_complex)
wenzelm
parents: 12733
diff changeset
   135
  "z ^ 0 = 1"
wenzelm
parents: 12733
diff changeset
   136
  "z ^ Suc n = (z::complex) * (z ^ n)"
wenzelm
parents: 12733
diff changeset
   137
wenzelm
parents: 12733
diff changeset
   138
lemma complex_power_two: "z\<twosuperior> = z * (z::complex)"
wenzelm
parents: 12733
diff changeset
   139
  by (simp add: complex_equality numeral_2_eq_2)
wenzelm
parents: 12733
diff changeset
   140
wenzelm
parents: 12733
diff changeset
   141
wenzelm
parents: 12733
diff changeset
   142
constdefs
wenzelm
parents: 12733
diff changeset
   143
  im_unit :: complex    ("\<i>")
wenzelm
parents: 12733
diff changeset
   144
  "\<i> == Complex 0 1"
wenzelm
parents: 12733
diff changeset
   145
wenzelm
parents: 12733
diff changeset
   146
lemma im_unit_square: "\<i>\<twosuperior> = -1"
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   147
  by (simp add: im_unit_def complex_power_two mult_complex_def number_of_complex_def)
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   148
12740
wenzelm
parents: 12733
diff changeset
   149
wenzelm
parents: 12733
diff changeset
   150
constdefs
wenzelm
parents: 12733
diff changeset
   151
  conjg :: "complex => complex"
wenzelm
parents: 12733
diff changeset
   152
  "conjg z == Complex (Re z) (- Im z)"
wenzelm
parents: 12733
diff changeset
   153
wenzelm
parents: 12733
diff changeset
   154
lemma Re_cong [simp]: "Re (conjg z) = Re z"
wenzelm
parents: 12733
diff changeset
   155
  by (simp add: conjg_def)
wenzelm
parents: 12733
diff changeset
   156
wenzelm
parents: 12733
diff changeset
   157
lemma Im_cong [simp]: "Im (conjg z) = - Im z"
wenzelm
parents: 12733
diff changeset
   158
  by (simp add: conjg_def)
wenzelm
parents: 12733
diff changeset
   159
wenzelm
parents: 12733
diff changeset
   160
lemma Re_conjg_self: "Re (z * conjg z) = (Re z)\<twosuperior> + (Im z)\<twosuperior>"
wenzelm
parents: 12733
diff changeset
   161
  by (simp add: real_power_two)
wenzelm
parents: 12733
diff changeset
   162
wenzelm
parents: 12733
diff changeset
   163
lemma Im_conjg_self: "Im (z * conjg z) = 0"
wenzelm
parents: 12733
diff changeset
   164
  by simp
wenzelm
parents: 12733
diff changeset
   165
wenzelm
parents: 12733
diff changeset
   166
wenzelm
parents: 12733
diff changeset
   167
subsection {* Embedding other number domains *}
wenzelm
parents: 12733
diff changeset
   168
wenzelm
parents: 12733
diff changeset
   169
constdefs
wenzelm
parents: 12733
diff changeset
   170
  complex :: "'a => complex"
wenzelm
parents: 12733
diff changeset
   171
  "complex x == Complex (real x) 0";
wenzelm
parents: 12733
diff changeset
   172
wenzelm
parents: 12733
diff changeset
   173
lemma Re_complex [simp]: "Re (complex x) = real x"
wenzelm
parents: 12733
diff changeset
   174
  by (simp add: complex_def)
wenzelm
parents: 12733
diff changeset
   175
12733
611ab32b2176 Real/Complex_Numbers.thy;
wenzelm
parents:
diff changeset
   176
end