Skip to main content
AlexKontorovich/PrimeNumberTheoremAnd
Source indexedtheorem · leanprover/lean4:v4.32.0

Complex.Hadamard.analyticOrderAt_finset_prod_weierstrassFactor_divisorZeroIndex₀

PrimeNumberTheoremAnd.Mathlib.Analysis.Complex.DivisorPartialProductFactor · PrimeNumberTheoremAnd/Mathlib/Analysis/Complex/DivisorPartialProductFactor.lean:39 to 138

Mathematical statement

Exact Lean statement

theorem analyticOrderAt_finset_prod_weierstrassFactor_divisorZeroIndex₀
    (m : ℕ) (f : ℂ → ℂ)
    (s : Finset (divisorZeroIndex₀ f (Set.univ : Set ℂ))) (z₀ : ℂ) :
    analyticOrderAt (fun z : ℂ => ∏ p ∈ s, weierstrassFactor m (z / divisorZeroIndex₀_val p))
        z₀ = ((s.filter (fun p => divisorZeroIndex₀_val p = z₀)).card : ℕ∞)

Complete declaration

Lean source

Canonical source
Full Lean sourceLean 4
theorem analyticOrderAt_finset_prod_weierstrassFactor_divisorZeroIndex₀    (m : ) (f : ℂ  ℂ)    (s : Finset (divisorZeroIndex₀ f (Set.univ : Set ℂ))) (z₀ : ℂ) :    analyticOrderAt (fun z : ℂ => ∏ p  s, weierstrassFactor m (z / divisorZeroIndex₀_val p))        z₀ = ((s.filter (fun p => divisorZeroIndex₀_val p = z₀)).card : ∞) := by  classical -- needed  refine Finset.induction_on s ?base ?step  · simp [analyticOrderAt_eq_zero]  · intro p s hp hs    by_cases hEq : divisorZeroIndex₀_val p = z₀    · have hp0 : divisorZeroIndex₀_val p  0 := p.property      have han_fac :          AnalyticAt ℂ (fun z : ℂ => weierstrassFactor m (z / divisorZeroIndex₀_val p)) z₀ := by        exact (differentiable_weierstrassFactor_divisorZeroIndex₀ m p).analyticAt z₀      have han_rest : AnalyticAt ℂ (fun z : ℂ => ∏ q  s, weierstrassFactor m          (z / divisorZeroIndex₀_val q)) z₀ := by        simpa [divisorPartialProduct] using! analyticAt_divisorPartialProduct m f s z₀      let fac : ℂ := fun z : ℂ => weierstrassFactor m (z / divisorZeroIndex₀_val p)      let rest : ℂ := fun z : ℂ => ∏ q  s, weierstrassFactor m (z / divisorZeroIndex₀_val q)      have hmul :          analyticOrderAt (fac * rest) z₀ =            analyticOrderAt fac z₀ + analyticOrderAt rest z₀ := by        simpa [fac, rest] using (analyticOrderAt_mul (z₀ := z₀) han_fac han_rest)      have hcard :          (Finset.filter (fun q => divisorZeroIndex₀_val q = z₀) (insert p s)).card =            (Finset.filter (fun q => divisorZeroIndex₀_val q = z₀) s).card + 1 := by        simp [hEq, hp, Finset.filter_insert]      have hfac : analyticOrderAt fac z₀ = (1 : ∞) := by        simpa [fac, hEq] using          (analyticOrderAt_weierstrassFactor_div_self (m := m) (a := divisorZeroIndex₀_val p) hp0)      have hrest : analyticOrderAt rest z₀ = ((s.filter          (fun q => divisorZeroIndex₀_val q = z₀)).card : ∞) := by        simpa [rest] using hs      have hcongr :          (fun z : ℂ => ∏ q  insert p s, weierstrassFactor m (z / divisorZeroIndex₀_val q))            =ᶠ[𝓝 z₀] (fac * rest) := by        refine Filter.Eventually.of_forall ?_        intro z        simp [fac, rest, Finset.prod_insert, hp, Pi.mul_apply]      calc        analyticOrderAt (fun z : ℂ => ∏ q  insert p s, weierstrassFactor m            (z / divisorZeroIndex₀_val q)) z₀ = analyticOrderAt (fac * rest) z₀ := by              simpa using (analyticOrderAt_congr hcongr)        _ = analyticOrderAt fac z₀ + analyticOrderAt rest z₀ := hmul        _ = (1 : ∞) + ((s.filter (fun q => divisorZeroIndex₀_val q = z₀)).card : ∞) := by              simp [hfac, hrest]        _ = (((insert p s).filter (fun q => divisorZeroIndex₀_val q = z₀)).card : ∞) := by              simp [hcard, Nat.add_comm]    · have han_fac :          AnalyticAt ℂ (fun z : ℂ => weierstrassFactor m (z / divisorZeroIndex₀_val p)) z₀ := by        exact (differentiable_weierstrassFactor_divisorZeroIndex₀ m p).analyticAt z₀      have hfac0 : analyticOrderAt (fun z : ℂ => weierstrassFactor m          (z / divisorZeroIndex₀_val p)) z₀ = 0 := by        have hp0 : divisorZeroIndex₀_val p  0 := p.property        have hval : weierstrassFactor m (z₀ / divisorZeroIndex₀_val p)  0 := by          have : (z₀ / divisorZeroIndex₀_val p)  1 := by            intro h1            have : z₀ = divisorZeroIndex₀_val p := by              have : z₀ = (z₀ / divisorZeroIndex₀_val p) * (divisorZeroIndex₀_val p) := by                simp [div_eq_mul_inv]              simpa [h1, div_eq_mul_inv, hp0] using this            exact hEq (this.symm)          exact (weierstrassFactor_ne_zero_iff m (z₀ / divisorZeroIndex₀_val p)).2 this        simpa using (han_fac.analyticOrderAt_eq_zero).2 (by simpa using hval)      have hcard :          (Finset.filter (fun q => divisorZeroIndex₀_val q = z₀) (insert p s)).card =            (Finset.filter (fun q => divisorZeroIndex₀_val q = z₀) s).card := by        simp [hEq, Finset.filter_insert]      have han_rest : AnalyticAt ℂ (fun z : ℂ => ∏ q  s, weierstrassFactor m          (z / divisorZeroIndex₀_val q)) z₀ := by        simpa [divisorPartialProduct] using! analyticAt_divisorPartialProduct m f s z₀      let fac : ℂ := fun z : ℂ => weierstrassFactor m (z / divisorZeroIndex₀_val p)      let rest : ℂ := fun z : ℂ => ∏ q  s, weierstrassFactor m (z / divisorZeroIndex₀_val q)      have hmul :          analyticOrderAt (fac * rest) z₀ =            analyticOrderAt fac z₀ + analyticOrderAt rest z₀ := by        simpa [fac, rest] using (analyticOrderAt_mul (z₀ := z₀) han_fac han_rest)      have hcongr :          (fun z : ℂ => ∏ q  insert p s, weierstrassFactor m (z / divisorZeroIndex₀_val q))            =ᶠ[𝓝 z₀] (fac * rest) := by        refine Filter.Eventually.of_forall ?_        intro z        simp [fac, rest, Finset.prod_insert, hp, Pi.mul_apply]      calc        analyticOrderAt (fun z : ℂ => ∏ q  insert p s, weierstrassFactor m        (z / divisorZeroIndex₀_val q)) z₀            = analyticOrderAt (fac * rest) z₀ := by              simpa using (analyticOrderAt_congr hcongr)        _ = analyticOrderAt rest z₀ := by              calc                analyticOrderAt (fac * rest) z₀ = analyticOrderAt fac z₀ +                    analyticOrderAt rest z₀ := hmul                _ = analyticOrderAt rest z₀ := by                      have hfac0' : analyticOrderAt fac z₀ = 0 := by                        simpa [fac] using hfac0                      simp [hfac0']        _ = ((s.filter (fun q => divisorZeroIndex₀_val q = z₀)).card : ∞) := by              simpa [rest] using hs        _ = (((insert p s).filter (fun q => divisorZeroIndex₀_val q = z₀)).card : ∞) := by              simpa using congrArg (fun n :  => (n : ∞)) hcard.symm