File: Mathlib/NumberTheory/ModularForms/CongruenceSubgroups.lean

full_name: «_aux_Mathlib_NumberTheory_ModularForms_CongruenceSubgroups___macroRules_termSL(_,_)_1»
code: local notation "SL(" n ", " R ")" => Matrix.SpecialLinearGroup (Fin n) R
goal: Lean.Macro

full_name: _aux_Mathlib_NumberTheory_ModularForms_CongruenceSubgroups___unexpand_Matrix_SpecialLinearGroup_1
code: local notation "SL(" n ", " R ")" => Matrix.SpecialLinearGroup (Fin n) R
goal: Lean.PrettyPrinter.Unexpander

full_name: «_aux_Mathlib_NumberTheory_ModularForms_CongruenceSubgroups___macroRules_term↑ₘ__1»
code: local notation:1024 "↑ₘ" A:1024 => ((A : SL(2, ℤ)) : Matrix (Fin 2) (Fin 2) ℤ)
goal: Lean.Macro

full_name: «_aux_Mathlib_NumberTheory_ModularForms_CongruenceSubgroups___macroRules_termSLMOD(_)_1»
code: local notation "SLMOD(" N ")" =>
  @Matrix.SpecialLinearGroup.map (Fin 2) _ _ _ _ _ _ (Int.castRingHom (ZMod N))
goal: Lean.Macro

full_name: SL_reduction_mod_hom_val
code: @[simp]
theorem SL_reduction_mod_hom_val (N : ℕ) (γ : SL(2, ℤ)) :
    ∀ i j : Fin 2, (SLMOD(N) γ : Matrix (Fin 2) (Fin 2) (ZMod N)) i j = ((↑ₘγ i j : ℤ) : ZMod N) 
goal: ↑((Matrix.SpecialLinearGroup.map (Int.castRingHom (ZMod N))) γ) i j = ↑(↑γ i j)

full_name: CongruenceSubgroup.Gamma
code: /-- The full level `N` congruence subgroup of `SL(2, ℤ)` of matrices that reduce to the identity
modulo `N`. -/
def Gamma (N : ℕ) : Subgroup SL(2, ℤ) 
goal: Subgroup SL(2, ℤ)

full_name: CongruenceSubgroup.Gamma_mem'
code: theorem Gamma_mem' (N : ℕ) (γ : SL(2, ℤ)) : γ ∈ Gamma N ↔ SLMOD(N) γ = 1 
goal: γ ∈ CongruenceSubgroup.Gamma N ↔ (Matrix.SpecialLinearGroup.map (Int.castRingHom (ZMod N))) γ = 1

full_name: CongruenceSubgroup.Gamma_mem
code: @[simp]
theorem Gamma_mem (N : ℕ) (γ : SL(2, ℤ)) : γ ∈ Gamma N ↔ ((↑ₘγ 0 0 : ℤ) : ZMod N) = 1 ∧
    ((↑ₘγ 0 1 : ℤ) : ZMod N) = 0 ∧ ((↑ₘγ 1 0 : ℤ) : ZMod N) = 0 ∧ ((↑ₘγ 1 1 : ℤ) : ZMod N) = 1 
goal: γ ∈ CongruenceSubgroup.Gamma N ↔ ↑(↑γ 0 0) = 1 ∧ ↑(↑γ 0 1) = 0 ∧ ↑(↑γ 1 0) = 0 ∧ ↑(↑γ 1 1) = 1

full_name: CongruenceSubgroup.Gamma_normal
code: theorem Gamma_normal (N : ℕ) : Subgroup.Normal (Gamma N) 
goal: (CongruenceSubgroup.Gamma N).Normal

full_name: CongruenceSubgroup.Gamma_one_top
code: theorem Gamma_one_top : Gamma 1 = ⊤ 
goal: CongruenceSubgroup.Gamma 1 = ⊤

full_name: CongruenceSubgroup.Gamma_zero_bot
code: theorem Gamma_zero_bot : Gamma 0 = ⊥ 
goal: CongruenceSubgroup.Gamma 0 = ⊥

full_name: CongruenceSubgroup.ModularGroup_T_pow_mem_Gamma
code: lemma ModularGroup_T_pow_mem_Gamma (N M : ℤ) (hNM : N ∣ M) :
    (ModularGroup.T ^ M) ∈ Gamma (Int.natAbs N) 
goal: ModularGroup.T ^ M ∈ CongruenceSubgroup.Gamma N.natAbs

full_name: CongruenceSubgroup.Gamma0
code: /-- The congruence subgroup of `SL(2, ℤ)` of matrices whose lower left-hand entry reduces to zero
modulo `N`. -/
def Gamma0 (N : ℕ) : Subgroup SL(2, ℤ) 
goal: Subgroup SL(2, ℤ)

full_name: CongruenceSubgroup.Gamma0_mem
code: @[simp]
theorem Gamma0_mem (N : ℕ) (A : SL(2, ℤ)) : A ∈ Gamma0 N ↔ ((↑ₘA 1 0 : ℤ) : ZMod N) = 0 
goal: A ∈ CongruenceSubgroup.Gamma0 N ↔ ↑(↑A 1 0) = 0

full_name: CongruenceSubgroup.Gamma0_det
code: theorem Gamma0_det (N : ℕ) (A : Gamma0 N) : (A.1.1.det : ZMod N) = 1 
goal: ↑(↑↑A).det = 1

full_name: CongruenceSubgroup.Gamma0Map
code: /-- The group homomorphism from `Gamma0` to `ZMod N` given by mapping a matrix to its lower
right-hand entry. -/
def Gamma0Map (N : ℕ) : Gamma0 N →* ZMod N 
goal: ↥(CongruenceSubgroup.Gamma0 N) →* ZMod N

full_name: CongruenceSubgroup.Gamma1'
code: /-- The congruence subgroup `Gamma1` (as a subgroup of `Gamma0`) of matrices whose bottom
row is congruent to `(0,1)` modulo `N`. -/
def Gamma1' (N : ℕ) : Subgroup (Gamma0 N) 
goal: Subgroup ↥(CongruenceSubgroup.Gamma0 N)

full_name: CongruenceSubgroup.Gamma1_mem'
code: @[simp]
theorem Gamma1_mem' (N : ℕ) (γ : Gamma0 N) : γ ∈ Gamma1' N ↔ (Gamma0Map N) γ = 1 
goal: γ ∈ CongruenceSubgroup.Gamma1' N ↔ (CongruenceSubgroup.Gamma0Map N) γ = 1

full_name: CongruenceSubgroup.Gamma1_to_Gamma0_mem
code: theorem Gamma1_to_Gamma0_mem (N : ℕ) (A : Gamma0 N) : A ∈ Gamma1' N ↔
    ((↑ₘA 0 0 : ℤ) : ZMod N) = 1 ∧ ((↑ₘA 1 1 : ℤ) : ZMod N) = 1 ∧ ((↑ₘA 1 0 : ℤ) : ZMod N) = 0 
goal: A ∈ CongruenceSubgroup.Gamma1' N ↔ ↑(↑↑A 0 0) = 1 ∧ ↑(↑↑A 1 1) = 1 ∧ ↑(↑↑A 1 0) = 0

full_name: CongruenceSubgroup.Gamma1
code: /-- The congruence subgroup `Gamma1` of `SL(2, ℤ)` consisting of matrices whose bottom
row is congruent to `(0,1)` modulo `N`. -/
def Gamma1 (N : ℕ) : Subgroup SL(2, ℤ) 
goal: Subgroup SL(2, ℤ)

full_name: CongruenceSubgroup.Gamma1_mem
code: @[simp]
theorem Gamma1_mem (N : ℕ) (A : SL(2, ℤ)) : A ∈ Gamma1 N ↔
    ((↑ₘA 0 0 : ℤ) : ZMod N) = 1 ∧ ((↑ₘA 1 1 : ℤ) : ZMod N) = 1 ∧ ((↑ₘA 1 0 : ℤ) : ZMod N) = 0 
goal: A ∈ CongruenceSubgroup.Gamma1 N ↔ ↑(↑A 0 0) = 1 ∧ ↑(↑A 1 1) = 1 ∧ ↑(↑A 1 0) = 0

full_name: CongruenceSubgroup.Gamma1_in_Gamma0
code: theorem Gamma1_in_Gamma0 (N : ℕ) : Gamma1 N ≤ Gamma0 N 
goal: CongruenceSubgroup.Gamma1 N ≤ CongruenceSubgroup.Gamma0 N

full_name: CongruenceSubgroup.IsCongruenceSubgroup
code: /-- A congruence subgroup is a subgroup of `SL(2, ℤ)` which contains some `Gamma N` for some
`(N : ℕ+)`. -/
def IsCongruenceSubgroup (Γ : Subgroup SL(2, ℤ)) : Prop 
goal: Prop

full_name: CongruenceSubgroup.isCongruenceSubgroup_trans
code: theorem isCongruenceSubgroup_trans (H K : Subgroup SL(2, ℤ)) (h : H ≤ K)
    (h2 : IsCongruenceSubgroup H) : IsCongruenceSubgroup K 
goal: CongruenceSubgroup.IsCongruenceSubgroup K

full_name: CongruenceSubgroup.Gamma_is_cong_sub
code: theorem Gamma_is_cong_sub (N : ℕ+) : IsCongruenceSubgroup (Gamma N) 
goal: CongruenceSubgroup.IsCongruenceSubgroup (CongruenceSubgroup.Gamma ↑N)

full_name: CongruenceSubgroup.Gamma1_is_congruence
code: theorem Gamma1_is_congruence (N : ℕ+) : IsCongruenceSubgroup (Gamma1 N) 
goal: CongruenceSubgroup.IsCongruenceSubgroup (CongruenceSubgroup.Gamma1 ↑N)

full_name: CongruenceSubgroup.Gamma0_is_congruence
code: theorem Gamma0_is_congruence (N : ℕ+) : IsCongruenceSubgroup (Gamma0 N) 
goal: CongruenceSubgroup.IsCongruenceSubgroup (CongruenceSubgroup.Gamma0 ↑N)

full_name: CongruenceSubgroup.Gamma_cong_eq_self
code: theorem Gamma_cong_eq_self (N : ℕ) (g : ConjAct SL(2, ℤ)) : g • Gamma N = Gamma N 
goal: g • CongruenceSubgroup.Gamma N = CongruenceSubgroup.Gamma N

full_name: CongruenceSubgroup.conj_cong_is_cong
code: theorem conj_cong_is_cong (g : ConjAct SL(2, ℤ)) (Γ : Subgroup SL(2, ℤ))
    (h : IsCongruenceSubgroup Γ) : IsCongruenceSubgroup (g • Γ) 
goal: CongruenceSubgroup.IsCongruenceSubgroup (g • Γ)