Argument Principle

lean4-proofcomplex-analysisvisualization
12πiγf(z)f(z)dz=NP\frac{1}{2\pi i}\oint_\gamma \frac{f'(z)}{f(z)}\,dz = N - P

Statement

Let ff be meromorphic inside and on a simple closed positively-oriented contour γ\gamma, with no zeros or poles on γ\gamma itself. Let NN = number of zeros of ff inside γ\gamma (counted with multiplicity), and PP = number of poles. Then:

12πiγf(z)f(z)dz=NP\frac{1}{2\pi i}\oint_\gamma \frac{f'(z)}{f(z)}\,dz = N - P

The left side also equals the winding number of fγf \circ \gamma around 00 in the ff-plane.

Visualization

Example: f(z)=z3zf(z) = z^3 - z on the circle z=2|z| = 2.

Factor: f(z)=z(z1)(z+1)f(z) = z(z-1)(z+1). Zeros at z=0,1,1z = 0, 1, -1, all inside z=2|z| = 2. No poles (polynomial). So N=3N = 3, P=0P = 0.

The argument principle predicts:

12πiz=2f(z)f(z)dz=30=3\frac{1}{2\pi i}\oint_{|z|=2} \frac{f'(z)}{f(z)}\,dz = 3 - 0 = 3

Residue calculation: f/f=(3z21)/(z3z)=3z21z(z1)(z+1)f'/f = (3z^2 - 1)/(z^3 - z) = \frac{3z^2-1}{z(z-1)(z+1)}.

Zero aaord(f,a)\text{ord}(f, a)Residue of f/ff'/f at aa
001111
111111
1-11111

Sum =3= 3. Integral =2πi3= 2\pi i \cdot 3. Dividing by 2πi2\pi i: result =3=N= 3 = N.

Image trace: As zz traverses z=2|z| = 2 once counterclockwise, f(z)=z3zf(z) = z^3 - z winds around 00 exactly 3 times (one winding per enclosed zero).

Contour |z| = 2          Image f(gamma) winds 3x around 0

    Im                          Im
    |                           |
   2+    o                   ...+...
    | (enclosed            .   0   .
   -+--+--+-- Re        -.--+--+--+-- Re
    | zeros                 ....    winding
   -2+  at                  number = 3
    | 0,1,-1

Proof Sketch

  1. At each zero aa of order mm: write f(z)=(za)mg(z)f(z) = (z-a)^m g(z) with g(a)0g(a) \ne 0. Then f/f=m/(za)+g/gf'/f = m/(z-a) + g'/g near aa. The term g/gg'/g is holomorphic at aa, contributing no residue. The residue of f/ff'/f at aa is mm.
  2. At each pole aa of order pp: write f(z)=(za)ph(z)f(z) = (z-a)^{-p}h(z) with h(a)0h(a) \ne 0. Then f/f=p/(za)+h/hf'/f = -p/(z-a) + h'/h, contributing residue p-p.
  3. Sum via the Residue Theorem: 12πif/fdz=zerosmkpolespj=NP\frac{1}{2\pi i}\oint f'/f\,dz = \sum_{\text{zeros}} m_k - \sum_{\text{poles}} p_j = N - P.

The winding number interpretation follows from: ddtarg(f(γ(t)))=Im(f(γ)f(γ)γ)\frac{d}{dt}\arg(f(\gamma(t))) = \text{Im}\left(\frac{f'(\gamma)}{f(\gamma)}\gamma'\right), integrated over [0,1][0, 1].

Connections

The Argument Principle is the Residue Theorem applied to f/ff'/f, so Residue TheoremResidue Theoremγf(z)dz=2πikRes(f,ak)\oint_\gamma f(z)\,dz = 2\pi i \sum_{k} \operatorname{Res}(f, a_k)A contour integral of a meromorphic function equals 2πi times the sum of residues of enclosed poles.Read more → and Cauchy Integral FormulaCauchy Integral Formulaf(w)=12πizc=Rf(z)zwdzf(w) = \frac{1}{2\pi i}\oint_{|z-c|=R} \frac{f(z)}{z - w}\,dzA holomorphic function's value at any interior point is determined by its values on the boundary circle.Read more → are its parents. Rouché's theorem (a corollary) counts zeros by comparison. This directly implies the Fundamental Theorem of AlgebraFundamental Theorem of Algebradegp1,  pC[z]    z0C:p(z0)=0\deg p \geq 1,\; p \in \mathbb{C}[z] \implies \exists z_0 \in \mathbb{C}: p(z_0) = 0Every non-constant polynomial with complex coefficients has at least one root in ℂRead more →: for a degree-nn polynomial ff, the winding number of ff on a large circle is nn, forcing exactly nn zeros inside.

Lean4 Proof

import Mathlib.Analysis.Complex.CauchyIntegral

open Complex MeasureTheory

/-- **Argument Principle (special case)**: for a function holomorphic and
    nonvanishing on a closed disk, f'/f integrates to zero.
    We prove the instance where f has no zeros inside: N = 0, P = 0.
    
    For f holomorphic on closedBall c R with no zeros, f'/f is holomorphic,
    so its circle integral vanishes by the Cauchy-Goursat theorem. -/
theorem argument_principle_no_zeros
    {R : } (hR : 0 < R) {c : }
    {f f' :   }
    (hf : ContinuousOn f (Metric.closedBall c R))
    (hf_diff :  z  Metric.ball c R, DifferentiableAt  f z)
    (hf_nz :  z  Metric.closedBall c R, f z  0)
    (hf' : ContinuousOn f' (Metric.closedBall c R))
    (hf'_diff :  z  Metric.ball c R, DifferentiableAt  f' z) :
    ∮ z in C(c, R), f' z / f z = 0 := by
  apply circleIntegral_eq_zero_of_differentiable_on_off_countable hR.le Set.countable_empty
  · exact hf'.div hf (fun z hz => hf_nz z hz)
  · intro z hz, _
    exact (hf'_diff z hz).div (hf_diff z hz) (hf_nz z (Metric.ball_subset_closedBall hz))