Theory MoreComplex

theory MoreComplex
imports Complex_Main "HOL-Analysis.Inner_Product"
begin

lemma real_compex_cmod:
  fixes r::real 
  shows "cmod(r * z) = abs r * cmod z"
  by (metis abs_mult norm_of_real)

lemma cnj_closed_for_unit_disc:
  assumes "cmod z1 < 1"
  shows "cmod (cnj z1) <1"
  by (simp add: assms)

lemma mult_closed_for_unit_disc:
  assumes "cmod z1 < 1" "cmod z2 < 1"
  shows "cmod (z1*z2) < 1"
  using assms(1) assms(2) norm_mult_less 
  by fastforce

lemma cnj_cmod:
  shows "z1 * cnj z1 = (cmod z1)^2"
  using complex_norm_square
  by fastforce

lemma cnj_cmod_1:
  assumes "cmod z1 = 1"
  shows "z1 * cnj z1 = 1"
  by (metis assms complex_cnj_one complex_norm_square mult.right_neutral norm_one)

lemma den_not_zero:
  assumes "cmod a < 1" "cmod b < 1"
  shows "1 + cnj a * b  0"
  using assms
  by (smt add.inverse_unique complex_mod_cnj i_squared norm_ii norm_mult norm_mult_less)

lemma cmod_mix_cnj:
  assumes "cmod u < 1" "cmod v < 1"
  shows "cmod ((1 + u*cnj v) / (1 + v*cnj u)) = 1"
  by (smt (verit, ccfv_threshold) assms(1) assms(2) complex_cnj_add complex_cnj_cnj complex_cnj_mult complex_cnj_one complex_mod_cnj den_not_zero divide_self_if mult.commute norm_divide norm_one)

lemma cnj_mix_ex_real_k: 
  assumes "v  0"
  shows "x * cnj v = v * cnj x  ( (k::real). x = k * v)"
proof-
  have vx: "v = Re v + Im v * 𝗂" "x = Re x + Im x * 𝗂"
    by (simp add: complex_eq mult.commute)+

  have "x * cnj v = v * cnj x  (Re x + Im x * 𝗂) * (Re v - Im v * 𝗂) = (Re v + Im v * 𝗂) * (Re x - Im x * 𝗂)"
    by (metis complex_cnj_add complex_cnj_complex_of_real complex_cnj_i complex_cnj_mult complex_eq complex_of_real_i diff_conv_add_uminus i_complex_of_real mult_minus_left)   
  also have "  (Re v * Im x - Re x * Im v) * 𝗂 =
                    (- Re v * Im x + Re x * Im v) * 𝗂"
    by (simp add: field_simps)
  also have "  Re v * Im x = Re x * Im v"
    by (smt (verit, best) complex_i_not_zero mult_minus_left mult_right_cancel of_real_eq_iff)
  also have "  ( (k::real). x = k * v)"
  proof (cases "Im v = 0")
    case True
    then show ?thesis
      using assms vx
      by (smt (verit, best) Im_divide_of_real add.right_neutral calculation complex_cnj_complex_of_real complex_cnj_mult complex_eq mult.commute mult_eq_0_iff nonzero_mult_div_cancel_left of_real_0 times_divide_eq_right)
  next
    case False
    then have "Re v * Im x = Re x * Im v  x = (Im x / Im v) * v"
      using assms vx
      by (smt (verit, ccfv_SIG) calculation complex_cnj_complex_of_real complex_cnj_mult complex_of_real_mult_Complex complex_surj mult.commute nonzero_mult_div_cancel_right times_divide_eq_left)
    then show ?thesis
      using assms vx
      by (smt (verit, del_insts) calculation complex_cnj_complex_of_real complex_cnj_mult mult.assoc mult.commute)
  qed
  finally show ?thesis
    .
qed

lemma two_inner_cnj:
  shows "2 * inner u v = cnj u * v + cnj v * u"
  by (smt (verit) cnj.simps(1) cnj.simps(2) cnj_add_mult_eq_Re inner_complex_def mult.commute mult_minus_left times_complex.simps(1))

abbreviation "cor  complex_of_real"

lemma abs_inner_lt_1:
  assumes "norm u < 1" "norm v < 1"
  shows "abs (inner u v) < 1"
  using Cauchy_Schwarz_ineq2[of u v]
  by (smt (verit) assms(1) assms(2) mult_le_cancel_left2 norm_not_less_zero)

lemma inner_lt_1:
  assumes "norm u < 1" "norm v < 1"
  shows "inner u v < 1"
  using assms
  using abs_inner_lt_1
  by fastforce

lemma inner_def1: 
  shows "inner z1 z2 = (z1 * cnj z2 + z2 * cnj z1) / 2"
proof-
  obtain "a" "b" where ab: "Re z1 = a  Im z1 = b"
    by blast
  obtain "c" "d" where cd: "Re z2 = c  Im z2 = d"
    by blast
  have "Re (z1 * cnj z2) = a*c + b*d" "Re (z2 * cnj z1) = a*c + b*d"
       "Im (z1 * cnj z2) = b*c - a*d" "Im (z2 * cnj z1) = -b*c + a*d"
    using ab cd
    by simp+
  then have "(z1 * cnj z2 + z2 * cnj z1) / 2 =  a*c + b*d"
    using complex_eq_iff by force
  then show ?thesis
    using ab cd inner_complex_def
    by presburger
qed

lemma inner_def2:
  shows "inner z1 z2 = Re (cnj z1 * z2)"
  by (simp add: inner_complex_def)


end