File: Mathlib/NumberTheory/ModularForms/EisensteinSeries/UniformConvergence.lean

full_name: EisensteinSeries.norm_eq_max_natAbs
code: lemma norm_eq_max_natAbs (x : Fin 2 → ℤ) : ‖x‖ = max (x 0).natAbs (x 1).natAbs 
goal: ‖x‖ = ↑(max (x 0).natAbs (x 1).natAbs)

full_name: EisensteinSeries.r1
code: /-- Auxiliary function used for bounding Eisenstein series, defined as
  `z.im ^ 2 / (z.re ^ 2 + z.im ^ 2)`. -/
def r1 : ℝ 
goal: ℝ

full_name: EisensteinSeries.r1_eq
code: lemma r1_eq : r1 z = 1 / ((z.re / z.im) ^ 2 + 1) 
goal: EisensteinSeries.r1 z = 1 / ((z.re / z.im) ^ 2 + 1)

full_name: EisensteinSeries.r1_pos
code: lemma r1_pos : 0 < r1 z 
goal: 0 < EisensteinSeries.r1 z

full_name: EisensteinSeries.r1_aux_bound
code: /-- For `c, d ∈ ℝ` with `1 ≤ d ^ 2`, we have `r1 z ≤ |c * z + d| ^ 2`.  -/
lemma r1_aux_bound (c : ℝ) {d : ℝ} (hd : 1 ≤ d ^ 2) :
    r1 z ≤ (c * z.re + d) ^ 2 + (c * z.im) ^ 2 
goal: EisensteinSeries.r1 z ≤ (c * z.re + d) ^ 2 + (c * z.im) ^ 2

full_name: EisensteinSeries.r
code: /-- This function is used to give an upper bound on the summands in Eisenstein series; it is
defined by `z ↦ min z.im √(z.im ^ 2 / (z.re ^ 2 + z.im ^ 2))`. -/
def r : ℝ 
goal: ℝ

full_name: EisensteinSeries.r_pos
code: lemma r_pos : 0 < r z 
goal: 0 < EisensteinSeries.r z

full_name: EisensteinSeries.r_lower_bound_on_verticalStrip
code: lemma r_lower_bound_on_verticalStrip {A B : ℝ} (h : 0 < B) (hz : z ∈ verticalStrip A B) :
    r ⟨⟨A, B⟩, h⟩ ≤ r z 
goal: EisensteinSeries.r ⟨{ re := A, im := B }, h⟩ ≤ EisensteinSeries.r z

full_name: EisensteinSeries.auxbound1
code: lemma auxbound1 {c : ℝ} (d : ℝ) (hc : 1 ≤ c ^ 2) : r z ≤ Complex.abs (c * z + d) 
goal: EisensteinSeries.r z ≤ Complex.abs (↑c * ↑z + ↑d)

full_name: EisensteinSeries.auxbound2
code: lemma auxbound2 (c : ℝ) {d : ℝ} (hd : 1 ≤ d ^ 2) : r z ≤ Complex.abs (c * z + d) 
goal: EisensteinSeries.r z ≤ Complex.abs (↑c * ↑z + ↑d)

full_name: EisensteinSeries.div_max_sq_ge_one
code: lemma div_max_sq_ge_one (x : Fin 2 → ℤ) (hx : x ≠ 0) :
    1 ≤ (x 0 / ‖x‖) ^ 2 ∨ 1 ≤ (x 1 / ‖x‖) ^ 2 
goal: 1 ≤ (↑(x 0) / ‖x‖) ^ 2 ∨ 1 ≤ (↑(x 1) / ‖x‖) ^ 2

full_name: EisensteinSeries.r_mul_max_le
code: lemma r_mul_max_le {x : Fin 2 → ℤ} (hx : x ≠ 0) : r z * ‖x‖ ≤ Complex.abs (x 0 * z + x 1) 
goal: EisensteinSeries.r z * ‖x‖ ≤ Complex.abs (↑(x 0) * ↑z + ↑(x 1))

full_name: EisensteinSeries.summand_bound
code: /-- Upper bound for the summand `|c * z + d| ^ (-k)`, as a product of a function of `z` and a
function of `c, d`. -/
lemma summand_bound {k : ℝ} (hk : 0 ≤ k) (x : Fin 2 → ℤ) :
    Complex.abs (x 0 * z + x 1) ^ (-k) ≤ (r z) ^ (-k) * ‖x‖ ^ (-k) 
goal: Complex.abs (↑(x 0) * ↑z + ↑(x 1)) ^ (-k) ≤ EisensteinSeries.r z ^ (-k) * ‖x‖ ^ (-k)

full_name: EisensteinSeries.summand_bound_of_mem_verticalStrip
code: lemma summand_bound_of_mem_verticalStrip {k : ℝ} (hk : 0 ≤ k) (x : Fin 2 → ℤ)
    {A B : ℝ} (hB : 0 < B) (hz : z ∈ verticalStrip A B) :
    Complex.abs (x 0 * z + x 1) ^ (-k) ≤ r ⟨⟨A, B⟩, hB⟩ ^ (-k) * ‖x‖ ^ (-k) 
goal: Complex.abs (↑(x 0) * ↑z + ↑(x 1)) ^ (-k) ≤ EisensteinSeries.r ⟨{ re := A, im := B }, hB⟩ ^ (-k) * ‖x‖ ^ (-k)

full_name: EisensteinSeries.summable_one_div_norm_rpow
code: /-- The function `ℤ ^ 2 → ℝ` given by `x ↦ ‖x‖ ^ (-k)` is summable if `2 < k`. We prove this by
splitting into boxes using `Finset.box`. -/
lemma summable_one_div_norm_rpow {k : ℝ} (hk : 2 < k) :
    Summable fun (x : Fin 2 → ℤ) ↦ ‖x‖ ^ (-k) 
goal: Summable fun x => ‖x‖ ^ (-k)

full_name: EisensteinSeries.eisensteinSeries_tendstoLocallyUniformly
code: /-- The sum defining the Eisenstein series (of weight `k` and level `Γ(N)` with congruence
condition `a : Fin 2 → ZMod N`) converges locally uniformly on `ℍ`. -/
theorem eisensteinSeries_tendstoLocallyUniformly {k : ℤ} (hk : 3 ≤ k) {N : ℕ} (a : Fin 2 → ZMod N) :
    TendstoLocallyUniformly (fun (s : Finset (gammaSet N a)) ↦ (∑ x ∈ s, eisSummand k x ·))
      (eisensteinSeries a k ·) Filter.atTop 
goal: TendstoLocallyUniformly (fun s x => ∑ x_1 ∈ s, EisensteinSeries.eisSummand k (↑x_1) x) (fun x => eisensteinSeries a k x)
  Filter.atTop

full_name: EisensteinSeries.eisensteinSeries_tendstoLocallyUniformlyOn
code: /-- Variant of `eisensteinSeries_tendstoLocallyUniformly` formulated with maps `ℂ → ℂ`, which is
nice to have for holomorphicity later. -/
lemma eisensteinSeries_tendstoLocallyUniformlyOn {k : ℤ} {N : ℕ} (hk : 3 ≤ k)
    (a : Fin 2 → ZMod N) : TendstoLocallyUniformlyOn (fun (s : Finset (gammaSet N a )) ↦
      ↑ₕ(fun (z : ℍ) ↦ ∑ x in s, eisSummand k x z )) (↑ₕ(eisensteinSeries_SIF a k).toFun)
          Filter.atTop {z : ℂ | 0 < z.im} 
goal: TendstoLocallyUniformlyOn
  (fun s => (fun z => ∑ x ∈ s, EisensteinSeries.eisSummand k (↑x) z) ∘ ↑UpperHalfPlane.ofComplex)
  ((EisensteinSeries.eisensteinSeries_SIF a k).toFun ∘ ↑UpperHalfPlane.ofComplex) Filter.atTop {z | 0 < z.im}