Documentation

Mathlib.NumberTheory.ModularForms.Basic

Modular forms #

This file defines modular forms and proves some basic properties about them. Including constructing the graded ring of modular forms.

We begin by defining modular forms and cusp forms as extension of SlashInvariantForms then we define the space of modular forms, cusp forms and prove that the product of two modular forms is a modular form.

theorem MDifferentiable.slash {f : UpperHalfPlane} (hf : MDiff f) (k : ) (g : GL (Fin 2) ) :
MDiff (SlashAction.map k g f)

The weight k slash action of GL(2, ℝ) preserves holomorphic functions.

structure ModularForm (Γ : Subgroup (GL (Fin 2) )) (k : ) extends SlashInvariantForm Γ k :

These are SlashInvariantForm's that are holomorphic and bounded at infinity.

Instances For
    structure CuspForm (Γ : Subgroup (GL (Fin 2) )) (k : ) extends SlashInvariantForm Γ k :

    These are SlashInvariantForms that are holomorphic and zero at infinity.

    Instances For
      class ModularFormClass (F : Type u_2) (Γ : outParam (Subgroup (GL (Fin 2) ))) (k : outParam ) [FunLike F UpperHalfPlane ] extends SlashInvariantFormClass F Γ k :

      ModularFormClass F Γ k says that F is a type of bundled functions that extend SlashInvariantFormClass by requiring that the functions be holomorphic and bounded at all cusps.

      Instances
        class CuspFormClass (F : Type u_2) (Γ : outParam (Subgroup (GL (Fin 2) ))) (k : outParam ) [FunLike F UpperHalfPlane ] extends SlashInvariantFormClass F Γ k :

        CuspFormClass F Γ k says that F is a type of bundled functions that extend SlashInvariantFormClass by requiring that the functions be holomorphic and zero at all cusps.

        Instances
          @[implicit_reducible, instance 100]
          instance ModularForm.funLike (Γ : Subgroup (GL (Fin 2) )) (k : ) :
          @[instance 100]
          instance ModularFormClass.modularForm (Γ : Subgroup (GL (Fin 2) )) (k : ) :
          theorem ModularFormClass.continuous {k : } {Γ : Subgroup (GL (Fin 2) )} {F : Type u_2} [FunLike F UpperHalfPlane ] [ModularFormClass F Γ k] (f : F) :
          @[implicit_reducible, instance 100]
          instance CuspForm.funLike (Γ : Subgroup (GL (Fin 2) )) (k : ) :
          @[instance 100]
          instance CuspFormClass.cuspForm (Γ : Subgroup (GL (Fin 2) )) (k : ) :
          theorem ModularForm.toFun_eq_coe {Γ : Subgroup (GL (Fin 2) )} {k : } (f : ModularForm Γ k) :
          f.toFun = f
          @[simp]
          theorem ModularForm.toSlashInvariantForm_coe {Γ : Subgroup (GL (Fin 2) )} {k : } (f : ModularForm Γ k) :
          theorem CuspForm.toFun_eq_coe {Γ : Subgroup (GL (Fin 2) )} {k : } {f : CuspForm Γ k} :
          f.toFun = f
          @[simp]
          theorem CuspForm.toSlashInvariantForm_coe {Γ : Subgroup (GL (Fin 2) )} {k : } (f : CuspForm Γ k) :
          theorem ModularForm.ext {Γ : Subgroup (GL (Fin 2) )} {k : } {f g : ModularForm Γ k} (h : ∀ (x : UpperHalfPlane), f x = g x) :
          f = g
          theorem ModularForm.ext_iff {Γ : Subgroup (GL (Fin 2) )} {k : } {f g : ModularForm Γ k} :
          f = g ∀ (x : UpperHalfPlane), f x = g x
          theorem CuspForm.ext {Γ : Subgroup (GL (Fin 2) )} {k : } {f g : CuspForm Γ k} (h : ∀ (x : UpperHalfPlane), f x = g x) :
          f = g
          theorem CuspForm.ext_iff {Γ : Subgroup (GL (Fin 2) )} {k : } {f g : CuspForm Γ k} :
          f = g ∀ (x : UpperHalfPlane), f x = g x
          def ModularForm.copy {Γ : Subgroup (GL (Fin 2) )} {k : } (f : ModularForm Γ k) (f' : UpperHalfPlane) (h : f' = f) :

          Copy of a ModularForm with a new toFun equal to the old one. Useful to fix definitional equalities.

          Instances For
            def CuspForm.copy {Γ : Subgroup (GL (Fin 2) )} {k : } (f : CuspForm Γ k) (f' : UpperHalfPlane) (h : f' = f) :

            Copy of a CuspForm with a new toFun equal to the old one. Useful to fix definitional equalities.

            Instances For
              @[implicit_reducible]
              instance ModularForm.add {Γ : Subgroup (GL (Fin 2) )} {k : } :
              Add (ModularForm Γ k)
              @[simp]
              theorem ModularForm.coe_add {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : ModularForm Γ k) :
              (f + g) = f + g
              @[simp]
              theorem ModularForm.add_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : ModularForm Γ k) (z : UpperHalfPlane) :
              (f + g) z = f z + g z
              @[implicit_reducible]
              instance ModularForm.instZero {Γ : Subgroup (GL (Fin 2) )} {k : } :
              Zero (ModularForm Γ k)
              @[simp]
              theorem ModularForm.coe_zero {Γ : Subgroup (GL (Fin 2) )} {k : } :
              0 = 0
              @[simp]
              theorem ModularForm.zero_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (z : UpperHalfPlane) :
              0 z = 0
              @[simp]
              theorem ModularForm.coe_eq_zero_iff {Γ : Subgroup (GL (Fin 2) )} {k : } (f : ModularForm Γ k) :
              f = 0 f = 0
              @[implicit_reducible]
              instance ModularForm.instSMulℝ {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_1} [SMul α ] [SMul α ] [IsScalarTower α ] :
              SMul α (ModularForm Γ k)
              @[simp]
              theorem ModularForm.coe_smul {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_1} [SMul α ] [SMul α ] [IsScalarTower α ] (f : ModularForm Γ k) (n : α) :
              (n f) = n f
              @[simp]
              theorem ModularForm.smul_apply {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_1} [SMul α ] [SMul α ] [IsScalarTower α ] (f : ModularForm Γ k) (n : α) (z : UpperHalfPlane) :
              (n f) z = n f z
              @[implicit_reducible]
              instance ModularForm.instSMulℂ {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_1} [SMul α ] [IsScalarTower α ] [Γ.HasDetOne] :
              SMul α (ModularForm Γ k)
              @[simp]
              theorem ModularForm.IsGLPos.coe_smul {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_1} [SMul α ] [IsScalarTower α ] [Γ.HasDetOne] (f : ModularForm Γ k) (n : α) :
              (n f) = n f
              @[simp]
              theorem ModularForm.IsGLPos.smul_apply {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_1} [SMul α ] [IsScalarTower α ] [Γ.HasDetOne] (f : ModularForm Γ k) (n : α) (z : UpperHalfPlane) :
              (n f) z = n f z
              @[implicit_reducible]
              instance ModularForm.instNeg {Γ : Subgroup (GL (Fin 2) )} {k : } :
              Neg (ModularForm Γ k)
              @[simp]
              theorem ModularForm.coe_neg {Γ : Subgroup (GL (Fin 2) )} {k : } (f : ModularForm Γ k) :
              ⇑(-f) = -f
              @[simp]
              theorem ModularForm.neg_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f : ModularForm Γ k) (z : UpperHalfPlane) :
              (-f) z = -f z
              @[implicit_reducible]
              instance ModularForm.instSub {Γ : Subgroup (GL (Fin 2) )} {k : } :
              Sub (ModularForm Γ k)
              @[simp]
              theorem ModularForm.coe_sub {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : ModularForm Γ k) :
              (f - g) = f - g
              @[simp]
              theorem ModularForm.sub_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : ModularForm Γ k) (z : UpperHalfPlane) :
              (f - g) z = f z - g z
              @[implicit_reducible]
              instance ModularForm.instAddCommGroup {Γ : Subgroup (GL (Fin 2) )} {k : } :
              def ModularForm.coeHom {Γ : Subgroup (GL (Fin 2) )} {k : } :

              Additive coercion from ModularForm to ℍ → ℂ.

              Instances For
                @[simp]
                theorem ModularForm.coeHom_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f : ModularForm Γ k) (a : UpperHalfPlane) :
                coeHom f a = f a
                @[implicit_reducible]
                noncomputable instance ModularForm.instModuleReal {Γ : Subgroup (GL (Fin 2) )} {k : } :
                @[implicit_reducible]
                noncomputable instance ModularForm.instModuleComplexOfHasDetOneFinOfNatNatReal {Γ : Subgroup (GL (Fin 2) )} {k : } [Γ.HasDetOne] :
                @[implicit_reducible]
                instance ModularForm.instInhabited {Γ : Subgroup (GL (Fin 2) )} {k : } :
                Inhabited (ModularForm Γ k)
                def ModularForm.mul {Γ : Subgroup (GL (Fin 2) )} {k_1 k_2 : } [Γ.HasDetPlusMinusOne] (f : ModularForm Γ k_1) (g : ModularForm Γ k_2) :
                ModularForm Γ (k_1 + k_2)

                The modular form of weight k_1 + k_2 given by the product of two modular forms of weights k_1 and k_2.

                Instances For
                  @[simp]
                  theorem ModularForm.coe_mul {Γ : Subgroup (GL (Fin 2) )} {k_1 k_2 : } [Γ.HasDetPlusMinusOne] (f : ModularForm Γ k_1) (g : ModularForm Γ k_2) :
                  (f.mul g) = f * g
                  @[deprecated ModularForm.coe_mul (since := "2025-12-06")]
                  theorem ModularForm.mul_coe {Γ : Subgroup (GL (Fin 2) )} {k_1 k_2 : } [Γ.HasDetPlusMinusOne] (f : ModularForm Γ k_1) (g : ModularForm Γ k_2) :
                  (f.mul g) = f * g

                  Alias of ModularForm.coe_mul.

                  def ModularForm.const {Γ : Subgroup (GL (Fin 2) )} (x : ) [Γ.HasDetOne] :

                  The constant function with value x : ℂ as a modular form of weight 0 and any level.

                  Instances For
                    @[simp]
                    theorem ModularForm.coe_const {Γ : Subgroup (GL (Fin 2) )} (x : ) [Γ.HasDetOne] :
                    (const x) = Function.const UpperHalfPlane x
                    @[deprecated ModularForm.coe_const (since := "2025-12-06")]
                    theorem ModularForm.const_toFun {Γ : Subgroup (GL (Fin 2) )} (x : ) [Γ.HasDetOne] :
                    (const x) = Function.const UpperHalfPlane x

                    Alias of ModularForm.coe_const.

                    @[simp]
                    theorem ModularForm.const_apply {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetOne] (x : ) (τ : UpperHalfPlane) :
                    (const x) τ = x
                    def ModularForm.constℝ {Γ : Subgroup (GL (Fin 2) )} (x : ) [Γ.HasDetPlusMinusOne] :

                    The constant function with value x : ℂ as a modular form of weight 0 and any level.

                    Instances For
                      @[simp]
                      theorem ModularForm.coe_constℝ {Γ : Subgroup (GL (Fin 2) )} (x : ) [Γ.HasDetPlusMinusOne] :
                      (constℝ x) = Function.const UpperHalfPlane x
                      @[deprecated ModularForm.coe_constℝ (since := "2025-12-06")]
                      theorem ModularForm.constℝ_toFun {Γ : Subgroup (GL (Fin 2) )} (x : ) [Γ.HasDetPlusMinusOne] :
                      (constℝ x) = Function.const UpperHalfPlane x

                      Alias of ModularForm.coe_constℝ.

                      @[simp]
                      theorem ModularForm.constℝ_apply {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] (x : ) (τ : UpperHalfPlane) :
                      (constℝ x) τ = x
                      @[simp]
                      theorem ModularForm.one_coe_eq_one {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] :
                      1 = 1
                      @[simp]
                      theorem ModularForm.coe_natCast {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] (n : ) :
                      n = n
                      @[simp]
                      theorem ModularForm.coe_intCast {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] (z : ) :
                      z = z
                      @[implicit_reducible]
                      instance CuspForm.hasAdd {Γ : Subgroup (GL (Fin 2) )} {k : } :
                      Add (CuspForm Γ k)
                      @[simp]
                      theorem CuspForm.coe_add {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : CuspForm Γ k) :
                      (f + g) = f + g
                      @[simp]
                      theorem CuspForm.add_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : CuspForm Γ k) (z : UpperHalfPlane) :
                      (f + g) z = f z + g z
                      @[implicit_reducible]
                      instance CuspForm.instZero {Γ : Subgroup (GL (Fin 2) )} {k : } :
                      Zero (CuspForm Γ k)
                      @[simp]
                      theorem CuspForm.coe_zero {Γ : Subgroup (GL (Fin 2) )} {k : } :
                      0 = 0
                      @[simp]
                      theorem CuspForm.zero_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (z : UpperHalfPlane) :
                      0 z = 0
                      @[implicit_reducible]
                      instance CuspForm.instSMul {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_2} [SMul α ] [SMul α ] [IsScalarTower α ] :
                      SMul α (CuspForm Γ k)
                      @[simp]
                      theorem CuspForm.coe_smul {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_2} [SMul α ] [SMul α ] [IsScalarTower α ] (f : CuspForm Γ k) (n : α) :
                      (n f) = n f
                      @[simp]
                      theorem CuspForm.smul_apply {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_2} [SMul α ] [SMul α ] [IsScalarTower α ] (f : CuspForm Γ k) (n : α) {z : UpperHalfPlane} :
                      (n f) z = n f z
                      @[implicit_reducible]
                      instance CuspForm.IsGLPos.instSMul {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_2} [SMul α ] [IsScalarTower α ] [Γ.HasDetOne] :
                      SMul α (CuspForm Γ k)
                      @[simp]
                      theorem CuspForm.IsGLPos.coe_smul {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_2} [SMul α ] [IsScalarTower α ] [Γ.HasDetOne] (f : CuspForm Γ k) (n : α) :
                      (n f) = n f
                      @[simp]
                      theorem CuspForm.IsGLPos.smul_apply {Γ : Subgroup (GL (Fin 2) )} {k : } {α : Type u_2} [SMul α ] [IsScalarTower α ] [Γ.HasDetOne] (f : CuspForm Γ k) (n : α) {z : UpperHalfPlane} :
                      (n f) z = n f z
                      @[implicit_reducible]
                      instance CuspForm.instNeg {Γ : Subgroup (GL (Fin 2) )} {k : } :
                      Neg (CuspForm Γ k)
                      @[simp]
                      theorem CuspForm.coe_neg {Γ : Subgroup (GL (Fin 2) )} {k : } (f : CuspForm Γ k) :
                      ⇑(-f) = -f
                      @[simp]
                      theorem CuspForm.neg_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f : CuspForm Γ k) (z : UpperHalfPlane) :
                      (-f) z = -f z
                      @[implicit_reducible]
                      instance CuspForm.instSub {Γ : Subgroup (GL (Fin 2) )} {k : } :
                      Sub (CuspForm Γ k)
                      @[simp]
                      theorem CuspForm.coe_sub {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : CuspForm Γ k) :
                      (f - g) = f - g
                      @[simp]
                      theorem CuspForm.sub_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f g : CuspForm Γ k) (z : UpperHalfPlane) :
                      (f - g) z = f z - g z
                      @[implicit_reducible]
                      instance CuspForm.instAddCommGroup {Γ : Subgroup (GL (Fin 2) )} {k : } :
                      def CuspForm.coeHom {Γ : Subgroup (GL (Fin 2) )} {k : } :

                      Additive coercion from CuspForm to ℍ → ℂ.

                      Instances For
                        @[simp]
                        theorem CuspForm.coeHom_apply {Γ : Subgroup (GL (Fin 2) )} {k : } (f : CuspForm Γ k) (a : UpperHalfPlane) :
                        coeHom f a = f a
                        @[implicit_reducible]
                        noncomputable instance CuspForm.instModuleReal {Γ : Subgroup (GL (Fin 2) )} {k : } :
                        @[implicit_reducible]
                        noncomputable instance CuspForm.instModuleComplexOfHasDetOneFinOfNatNatReal {Γ : Subgroup (GL (Fin 2) )} {k : } [Γ.HasDetOne] :
                        @[implicit_reducible]
                        instance CuspForm.instInhabited {Γ : Subgroup (GL (Fin 2) )} {k : } :
                        Inhabited (CuspForm Γ k)
                        @[instance 99]
                        instance CuspForm.instModularFormClassOfCuspFormClass {F : Type u_1} {Γ : Subgroup (GL (Fin 2) )} {k : } [FunLike F UpperHalfPlane ] [CuspFormClass F Γ k] :
                        def ModularForm.mcast {a b : } {Γ : Subgroup (GL (Fin 2) )} (h : a = b) (f : ModularForm Γ a) :

                        Cast for modular forms, which is useful for avoiding Heqs.

                        Instances For
                          theorem ModularForm.gradedMonoid_eq_of_cast {Γ : Subgroup (GL (Fin 2) )} {a b : GradedMonoid (ModularForm Γ)} (h : a.fst = b.fst) (h2 : mcast h a.snd = b.snd) :
                          a = b
                          @[implicit_reducible]
                          def ModularForm.prod {ι : Type} {s : Finset ι} {k : ι} (m : ) (hm : m = is, k i) {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] (F : (i : ι) → ModularForm Γ (k i)) :

                          Given ModularForm's F i of weight k i for i : ι, define the form which as a function is a product of those indexed by s : Finset ι with weight m = ∑ i ∈ s, k i.

                          Instances For
                            @[simp]
                            theorem ModularForm.coe_prod {ι : Type} {s : Finset ι} {k : ι} (m : ) (hm : m = is, k i) {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] (F : (i : ι) → ModularForm Γ (k i)) :
                            (prod m hm F) = is, (F i)
                            def ModularForm.prodEqualWeights {ι : Type} {s : Finset ι} {k : } {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] (F : ιModularForm Γ k) :
                            ModularForm Γ (s.card * k)

                            Given ModularForm's F i of weight k, define the form which as a function is a product of those indexed by s : Finset ι with weight #s * k.

                            Instances For
                              @[simp]
                              theorem ModularForm.coe_prodEqualWeights {ι : Type} {s : Finset ι} {k : } {Γ : Subgroup (GL (Fin 2) )} [Γ.HasDetPlusMinusOne] (F : ιModularForm Γ k) :
                              (prodEqualWeights F) = is, (F i)
                              noncomputable def ModularForm.translate {k : } {Γ : Subgroup (GL (Fin 2) )} {F : Type u_1} [FunLike F UpperHalfPlane ] (f : F) [ModularFormClass F Γ k] (g : GL (Fin 2) ) :

                              Translating a ModularForm by GL(2, ℝ), to obtain a new ModularForm.

                              Instances For
                                @[simp]
                                theorem ModularForm.coe_translate {k : } {Γ : Subgroup (GL (Fin 2) )} {F : Type u_1} [FunLike F UpperHalfPlane ] (f : F) [ModularFormClass F Γ k] (g : GL (Fin 2) ) :
                                (translate f g) = SlashAction.map k g f
                                noncomputable def CuspForm.translate {k : } {Γ : Subgroup (GL (Fin 2) )} {F : Type u_1} [FunLike F UpperHalfPlane ] (f : F) [CuspFormClass F Γ k] (g : GL (Fin 2) ) :

                                Translating a CuspForm by SL(2, ℤ), to obtain a new CuspForm.

                                Instances For