import Mathlib.NumberTheory.Modular import Mathlib.NumberTheory.ModularForms.Petersson import Mathlib.NumberTheory.ModularForms.CongruenceSubgroups import Mathlib.Analysis.Complex.UpperHalfPlane.Measure import Mathlib.MeasureTheory.Integral.Bochner.Basic set_option autoImplicit false noncomputable section open scoped MatrixGroups ModularForm namespace CuspForm def peterssonOnIntegrand (Γ : Subgroup SL(2, ℤ)) (k : ℤ) (f g : UpperHalfPlane → ℂ) (τ : UpperHalfPlane) : ℂ := ∑ᶠ q : SL(2, ℤ) ⧸ Γ, UpperHalfPlane.petersson k (f ∣[k] (q.out⁻¹ : SL(2, ℤ))) (g ∣[k] (q.out⁻¹ : SL(2, ℤ))) τ def peterssonOn (Γ : Subgroup SL(2, ℤ)) (k : ℤ) (f g : UpperHalfPlane → ℂ) : ℂ := MeasureTheory.integral (MeasureTheory.volume.restrict ModularGroup.fd) (peterssonOnIntegrand Γ k f g) theorem peterssonOn_def (Γ : Subgroup SL(2, ℤ)) (k : ℤ) (f g : UpperHalfPlane → ℂ) : peterssonOn Γ k f g = MeasureTheory.integral (MeasureTheory.volume.restrict ModularGroup.fd) (peterssonOnIntegrand Γ k f g) := rfl end CuspForm end