src/HOL/Analysis/Complex_Transcendental.thy
changeset 68527 2f4e2aab190a
parent 68517 6b5f15387353
child 68535 4d09df93d1a2
equal deleted inserted replaced
68524:f5ca4c2157a5 68527:2f4e2aab190a
  1573 
  1573 
  1574 definition Arg :: "complex \<Rightarrow> real" where "Arg z \<equiv> (if z = 0 then 0 else Im (Ln z))"
  1574 definition Arg :: "complex \<Rightarrow> real" where "Arg z \<equiv> (if z = 0 then 0 else Im (Ln z))"
  1575 
  1575 
  1576 text\<open>Finally the Argument is defined for the same interval as the complex logarithm: $(-\pi,\pi]$.\<close>
  1576 text\<open>Finally the Argument is defined for the same interval as the complex logarithm: $(-\pi,\pi]$.\<close>
  1577 
  1577 
       
  1578 lemma Arg_of_real: "Arg (of_real r) = (if r<0 then pi else 0)"
       
  1579   by (simp add: Im_Ln_eq_pi Arg_def)
       
  1580 
       
  1581 lemma mpi_less_Arg: "-pi < Arg z"
       
  1582     and Arg_le_pi: "Arg z \<le> pi"
       
  1583   by (auto simp: Arg_def mpi_less_Im_Ln Im_Ln_le_pi)
       
  1584 
       
  1585 lemma
       
  1586   assumes "z \<noteq> 0"
       
  1587   shows Arg_eq: "z = of_real(norm z) * exp(\<i> * Arg z)"
       
  1588   using assms exp_Ln exp_eq_polar
       
  1589   by (auto simp:  Arg_def)
       
  1590 
       
  1591 lemma Argument_exists:
       
  1592   assumes "z \<noteq> 0" and R: "R = {r-pi<..r+pi}"
       
  1593   obtains s where "is_Arg z s" "s\<in>R"
       
  1594 proof -
       
  1595   let ?rp = "r - Arg z + pi"
       
  1596   define k where "k \<equiv> \<lfloor>?rp / (2 * pi)\<rfloor>"
       
  1597   have "(Arg z + of_int k * (2 * pi)) \<in> R"
       
  1598     using floor_divide_lower [of "2*pi" ?rp] floor_divide_upper [of "2*pi" ?rp]
       
  1599     by (auto simp: k_def algebra_simps R)
       
  1600   then show ?thesis
       
  1601     using Arg_eq \<open>z \<noteq> 0\<close> is_Arg_2pi_iff is_Arg_def that by blast
       
  1602 qed
       
  1603 
       
  1604 lemma Argument_exists_unique:
       
  1605   assumes "z \<noteq> 0" and R: "R = {r-pi<..r+pi}"
       
  1606   obtains s where "is_Arg z s" "s\<in>R" "\<And>t. \<lbrakk>is_Arg z t; t\<in>R\<rbrakk> \<Longrightarrow> s=t"
       
  1607 proof -
       
  1608   obtain s where s: "is_Arg z s" "s\<in>R"
       
  1609     using Argument_exists [OF assms] .
       
  1610   moreover have "\<And>t. \<lbrakk>is_Arg z t; t\<in>R\<rbrakk> \<Longrightarrow> s=t"
       
  1611     using assms s  by (auto simp: is_Arg_eqI)
       
  1612   ultimately show thesis
       
  1613     using that by blast
       
  1614 qed
       
  1615 
       
  1616 lemma Argument_Ex1:
       
  1617   assumes "z \<noteq> 0" and R: "R = {r-pi<..r+pi}"
       
  1618   shows "\<exists>!s. is_Arg z s \<and> s \<in> R"
       
  1619   using Argument_exists_unique [OF assms]  by metis
       
  1620 
       
  1621 lemma Arg_divide:
       
  1622   assumes "w \<noteq> 0" "z \<noteq> 0"
       
  1623   shows "is_Arg (z / w) (Arg z - Arg w)"
       
  1624   using Arg_eq [of z] Arg_eq [of w] Arg_eq [of "norm(z / w)"] assms
       
  1625   by (auto simp: is_Arg_def norm_divide field_simps exp_diff Arg_of_real)
       
  1626 
  1578 lemma Arg_unique_lemma:
  1627 lemma Arg_unique_lemma:
  1579   assumes z:  "is_Arg z t"
  1628   assumes z:  "is_Arg z t"
  1580       and z': "is_Arg z t'"
  1629       and z': "is_Arg z t'"
  1581       and t:  "- pi < t"  "t \<le> pi"
  1630       and t:  "- pi < t"  "t \<le> pi"
  1582       and t': "- pi < t'" "t' \<le> pi"
  1631       and t': "- pi < t'" "t' \<le> pi"
  1601   qed (use assms in auto)
  1650   qed (use assms in auto)
  1602   then show ?thesis
  1651   then show ?thesis
  1603     by simp
  1652     by simp
  1604 qed
  1653 qed
  1605 
  1654 
  1606 lemma
       
  1607   assumes "z \<noteq> 0"
       
  1608   shows mpi_less_Arg: "-pi < Arg z"
       
  1609     and Arg_le_pi: "Arg z \<le> pi"
       
  1610     and Arg_eq: "z = of_real(norm z) * exp(\<i> * Arg z)"
       
  1611   using assms exp_Ln exp_eq_polar
       
  1612   by (auto simp: mpi_less_Im_Ln Im_Ln_le_pi Arg_def)
       
  1613 
       
  1614 lemma complex_norm_eq_1_exp_eq: "norm z = 1 \<longleftrightarrow> exp(\<i> * (Arg z)) = z"
  1655 lemma complex_norm_eq_1_exp_eq: "norm z = 1 \<longleftrightarrow> exp(\<i> * (Arg z)) = z"
  1615   by (metis Arg_eq exp_not_eq_zero exp_zero mult.left_neutral norm_zero of_real_1 norm_exp_i_times)
  1656   by (metis Arg_eq exp_not_eq_zero exp_zero mult.left_neutral norm_zero of_real_1 norm_exp_i_times)
  1616 
  1657 
  1617 lemma Arg_unique: "\<lbrakk>of_real r * exp(\<i> * a) = z; 0 < r; -pi < a; a \<le> pi\<rbrakk> \<Longrightarrow> Arg z = a"
  1658 lemma Arg_unique: "\<lbrakk>of_real r * exp(\<i> * a) = z; 0 < r; -pi < a; a \<le> pi\<rbrakk> \<Longrightarrow> Arg z = a"
  1618   by (rule Arg_unique_lemma [unfolded is_Arg_def, OF _ Arg_eq])
  1659   by (rule Arg_unique_lemma [unfolded is_Arg_def, OF _ Arg_eq])
  1619      (use mpi_less_Arg Arg_le_pi in \<open>auto simp: norm_mult\<close>)
  1660      (use mpi_less_Arg Arg_le_pi in \<open>auto simp: norm_mult\<close>)
  1620 
       
  1621 
  1661 
  1622 lemma Arg_minus:
  1662 lemma Arg_minus:
  1623   assumes "z \<noteq> 0"
  1663   assumes "z \<noteq> 0"
  1624   shows "Arg (-z) = (if Arg z \<le> 0 then Arg z + pi else Arg z - pi)"
  1664   shows "Arg (-z) = (if Arg z \<le> 0 then Arg z + pi else Arg z - pi)"
  1625 proof -
  1665 proof -
  1669   by (simp add: Arg_def Im_Ln_eq_0) (metis less_eq_real_def of_real_Re of_real_def scale_zero_left)
  1709   by (simp add: Arg_def Im_Ln_eq_0) (metis less_eq_real_def of_real_Re of_real_def scale_zero_left)
  1670 
  1710 
  1671 corollary Arg_ne_0: assumes "z \<notin> \<real>\<^sub>\<ge>\<^sub>0" shows "Arg z \<noteq> 0"
  1711 corollary Arg_ne_0: assumes "z \<notin> \<real>\<^sub>\<ge>\<^sub>0" shows "Arg z \<noteq> 0"
  1672   using assms by (auto simp: nonneg_Reals_def Arg_eq_0)
  1712   using assms by (auto simp: nonneg_Reals_def Arg_eq_0)
  1673 
  1713 
  1674 lemma Arg_of_real: "Arg (of_real r) = (if r<0 then pi else 0)"
       
  1675   by (simp add: Im_Ln_eq_pi Arg_def)
       
  1676 
       
  1677 lemma Arg_eq_pi_iff: "Arg z = pi \<longleftrightarrow> z \<in> \<real> \<and> Re z < 0"
  1714 lemma Arg_eq_pi_iff: "Arg z = pi \<longleftrightarrow> z \<in> \<real> \<and> Re z < 0"
  1678 proof (cases "z=0")
  1715 proof (cases "z=0")
  1679   case False
  1716   case False
  1680   then show ?thesis
  1717   then show ?thesis
  1681     using Arg_eq_0 [of "-z"] Arg_eq_pi complex_is_Real_iff by blast
  1718     using Arg_eq_0 [of "-z"] Arg_eq_pi complex_is_Real_iff by blast
  1693   then show ?thesis
  1730   then show ?thesis
  1694     by simp (metis Arg2pi_inverse Arg2pi_real Arg_real Reals_inverse)
  1731     by simp (metis Arg2pi_inverse Arg2pi_real Arg_real Reals_inverse)
  1695 next
  1732 next
  1696   case False
  1733   case False
  1697   then have "Arg z < pi" "z \<noteq> 0"
  1734   then have "Arg z < pi" "z \<noteq> 0"
  1698     using Arg_def Arg_eq_0_pi Arg_le_pi by fastforce+
  1735     using Arg_eq_0_pi Arg_le_pi by (auto simp: less_eq_real_def)
  1699   then show ?thesis
  1736   then show ?thesis
  1700     apply (simp add: False)
  1737     apply (simp add: False)
  1701     apply (rule Arg_unique [of "inverse (norm z)"])
  1738     apply (rule Arg_unique [of "inverse (norm z)"])
  1702     using False mpi_less_Arg [of z] Arg_eq [of z]
  1739     using False mpi_less_Arg [of z] Arg_eq [of z]
  1703     apply (auto simp: exp_minus field_simps)
  1740     apply (auto simp: exp_minus field_simps)