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) |