(** ** Constants and usual functions *)

(** 0 and 1 for complex are defined as [RtoC 0] and [RtoC 1] *)
Definition Ci : C := (0,1).(** *** Arithmetic operations *)

Definition Cplus (x y : C) : C := (fst x + fst y, snd x + snd y).Definition Copp (x : C) : C := (-fst x, -snd x).Definition Cminus (x y : C) : C := Cplus x (Copp y).Definition Cmult (x y : C) : C := (fst x * fst y - snd x * snd y, fst x * snd y + snd x * fst y).Definition Cinv (x : C) : C := (fst x / (fst x ^ 2 + snd x ^ 2), - snd x / (fst x ^ 2 + snd x ^ 2)).Definition Cdiv (x y : C) : C := Cmult x (Cinv y).Infix "+" := Cplus : C_scope.Notation "- x" := (Copp x) : C_scope.Infix "-" := Cminus : C_scope.Infix "*" := Cmult : C_scope.Notation "/ x" := (Cinv x) : C_scope.Infix "/" := Cdiv : C_scope.(** *** Other usual functions *)

Definition Re (z : C) : R := fst z.Definition Im (z : C) : R := snd z.Definition Cmod (x : C) : R := sqrt (fst x ^ 2 + snd x ^ 2).Definition Cconj (x : C) : C := (fst x, (- snd x)%R).

(* Specifications: *)
Lemma Cmod_0 : Cmod 0 = 0.
Lemma Cmod_1 : Cmod 1 = 1.
Lemma Cmod_opp : forall x, Cmod (-x) = Cmod x.
Lemma Cmod_triangle : forall x y, Cmod (x + y) <= Cmod x + Cmod y.
Lemma Cmod_mult : forall x y, Cmod (x * y) = (Cmod x * Cmod y)%R.
Lemma Rmax_Cmod : forall x, Rmax (Rabs (fst x)) (Rabs (snd x)) <= Cmod x.
Lemma Cmod_2Rmax : forall x, Cmod x <= sqrt 2 * Rmax (Rabs (fst x)) (Rabs (snd x)).
Lemma RtoC_plus (x y : R) : RtoC (x + y) = RtoC x + RtoC y.
Lemma RtoC_opp (x : R) : RtoC (- x) = - RtoC x.
Lemma RtoC_minus (x y : R) : RtoC (x - y) = RtoC x - RtoC y.
Lemma RtoC_mult (x y : R) : RtoC (x * y) = RtoC x * RtoC y.
Lemma RtoC_inv (x : R) : (x <> 0)%R -> RtoC (/ x) = / RtoC x.
Lemma RtoC_div (x y : R) : (y <> 0)%R -> RtoC (x / y) = RtoC x / RtoC y.
Lemma Cplus_comm (x y : C) : x + y = y + x.
Lemma Cplus_assoc (x y z : C) : x + (y + z) = (x + y) + z.
Lemma Cplus_0_r (x : C) : x + 0 = x.
Lemma Cplus_0_l (x : C) : 0 + x = x.
Lemma Cplus_opp_r (x : C) : x + -x = 0.
Lemma Copp_plus_distr (z1 z2 : C) : - (z1 + z2) = (- z1 + - z2).
Lemma Copp_minus_distr (z1 z2 : C) : - (z1 - z2) = z2 - z1.
Lemma Cmult_comm (x y : C) : x * y = y * x.
Lemma Cmult_assoc (x y z : C) : x * (y * z) = (x * y) * z.
Lemma Cmult_0_r (x : C) : x * 0 = 0.
Lemma Cmult_0_l (x : C) : 0 * x = 0.
Lemma Cmult_1_r (x : C) : x * 1 = x.
Lemma Cmult_1_l (x : C) : 1 * x = x.
Lemma Cinv_r (r : C) : r <> 0 -> r * /r = 1.
Lemma Cinv_l (r : C) : r <> 0 -> /r * r = 1.
Lemma Cmult_plus_distr_l (x y z : C) : x * (y + z) = x * y + x * z.
Lemma Cmult_plus_distr_r (x y z : C) : (x + y) * z = x * z + y * z.