number_theory.modular_forms.slash_actions
⟷
Mathlib.NumberTheory.ModularForms.SlashActions
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2022 Chris Birkbeck. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
-/
-import Mathbin.Analysis.Complex.UpperHalfPlane.Basic
-import Mathbin.LinearAlgebra.Matrix.GeneralLinearGroup
-import Mathbin.LinearAlgebra.Matrix.SpecialLinearGroup
+import Analysis.Complex.UpperHalfPlane.Basic
+import LinearAlgebra.Matrix.GeneralLinearGroup
+import LinearAlgebra.Matrix.SpecialLinearGroup
#align_import number_theory.modular_forms.slash_actions from "leanprover-community/mathlib"@"9240e8be927a0955b9a82c6c85ef499ee3a626b8"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -146,7 +146,7 @@ private theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c :
simp_rw [← smul_one_smul ℂ c f, ← smul_one_smul ℂ c (f ∣[k]A)]
ext1
simp_rw [slash]
- simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.det_apply_val, Pi.smul_apply,
+ simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.val_det_apply, Pi.smul_apply,
Subtype.val_eq_coe, coe_coe]
ring
@@ -237,7 +237,7 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = ((↑ₘA).det : ℝ) • f ∣[k1] A * g ∣[k2] A :=
by
ext1
- simp only [slash_def, slash, Matrix.GeneralLinearGroup.det_apply_val, Subtype.val_eq_coe,
+ simp only [slash_def, slash, Matrix.GeneralLinearGroup.val_det_apply, Subtype.val_eq_coe,
Pi.mul_apply, Pi.smul_apply, Algebra.smul_mul_assoc, real_smul]
set d : ℂ := ↑((↑ₘA).det : ℝ)
have h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -47,7 +47,7 @@ class SlashAction (β G α γ : Type _) [Group G] [AddMonoid α] [SMul γ α] wh
map : β → G → α → α
zero_slash : ∀ (k : β) (g : G), map k g 0 = 0
slash_one : ∀ (k : β) (a : α), map k 1 a = a
- slash_mul : ∀ (k : β) (g h : G) (a : α), map k (g * h) a = map k h (map k g a)
+ slash_hMul : ∀ (k : β) (g h : G) (a : α), map k (g * h) a = map k h (map k g a)
smul_slash : ∀ (k : β) (g : G) (a : α) (z : γ), map k g (z • a) = z • map k g a
add_slash : ∀ (k : β) (g : G) (a b : α), map k g (a + b) = map k g a + map k g b
#align slash_action SlashAction
@@ -86,7 +86,7 @@ def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul
map k g := SlashAction.map γ k (h g)
zero_slash k g := SlashAction.zero_slash k (h g)
slash_one k a := by simp only [map_one, SlashAction.slash_one]
- slash_mul k g gg a := by simp only [map_mul, SlashAction.slash_mul]
+ slash_hMul k g gg a := by simp only [map_mul, SlashAction.slash_hMul]
smul_slash _ _ := SlashAction.smul_slash _ _
add_slash _ g _ _ := SlashAction.add_slash _ (h g) _ _
#align monoid_hom_slash_action monoidHomSlashAction
@@ -117,7 +117,7 @@ private theorem slash_mul (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) : f
have e3 : (A * B) • x = A • B • x := by convert UpperHalfPlane.mul_smul' A B x
rw [e3]
simp only [UpperHalfPlane.num, UpperHalfPlane.denom, of_real_mul, Subgroup.coe_mul, coe_coe,
- UpperHalfPlane.coe_smul, Units.val_mul, Matrix.mul_eq_mul, Matrix.det_mul,
+ UpperHalfPlane.coe_smul, Units.val_mul, Matrix.hMul_eq_hMul, Matrix.det_mul,
UpperHalfPlane.smulAux, UpperHalfPlane.smulAux', Subtype.coe_mk] at *
field_simp
have :
@@ -158,7 +158,7 @@ instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ
map := slash
zero_slash := zero_slash
slash_one := slash_one
- slash_mul := slash_mul
+ slash_hMul := slash_hMul
smul_slash := smul_slash
add_slash := add_slash
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2022 Chris Birkbeck. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
-
-! This file was ported from Lean 3 source module number_theory.modular_forms.slash_actions
-! leanprover-community/mathlib commit 9240e8be927a0955b9a82c6c85ef499ee3a626b8
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Analysis.Complex.UpperHalfPlane.Basic
import Mathbin.LinearAlgebra.Matrix.GeneralLinearGroup
import Mathbin.LinearAlgebra.Matrix.SpecialLinearGroup
+#align_import number_theory.modular_forms.slash_actions from "leanprover-community/mathlib"@"9240e8be927a0955b9a82c6c85ef499ee3a626b8"
+
/-!
# Slash actions
mathlib commit https://github.com/leanprover-community/mathlib/commit/9240e8be927a0955b9a82c6c85ef499ee3a626b8
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
! This file was ported from Lean 3 source module number_theory.modular_forms.slash_actions
-! leanprover-community/mathlib commit 738054fa93d43512da144ec45ce799d18fd44248
+! leanprover-community/mathlib commit 9240e8be927a0955b9a82c6c85ef499ee3a626b8
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -15,6 +15,9 @@ import Mathbin.LinearAlgebra.Matrix.SpecialLinearGroup
/-!
# Slash actions
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file defines a class of slash actions, which are families of right actions of a given group
parametrized by some Type. This is modeled on the slash action of `GL_pos (fin 2) ℝ` on the space
of modular forms.
mathlib commit https://github.com/leanprover-community/mathlib/commit/8b981918a93bc45a8600de608cde7944a80d92b9
@@ -41,6 +41,7 @@ local notation "GL(" n ", " R ")" "⁺" => Matrix.GLPos (Fin n) R
local notation "SL(" n ", " R ")" => Matrix.SpecialLinearGroup (Fin n) R
+#print SlashAction /-
/-- A general version of the slash action of the space of modular forms.-/
class SlashAction (β G α γ : Type _) [Group G] [AddMonoid α] [SMul γ α] where
map : β → G → α → α
@@ -50,28 +51,34 @@ class SlashAction (β G α γ : Type _) [Group G] [AddMonoid α] [SMul γ α] wh
smul_slash : ∀ (k : β) (g : G) (a : α) (z : γ), map k g (z • a) = z • map k g a
add_slash : ∀ (k : β) (g : G) (a b : α), map k g (a + b) = map k g a + map k g b
#align slash_action SlashAction
+-/
scoped[ModularForm] notation:100 f " ∣[" k ";" γ "] " a:100 => SlashAction.map γ k a f
scoped[ModularForm] notation:100 f " ∣[" k "] " a:100 => SlashAction.map ℂ k a f
+#print SlashAction.neg_slash /-
@[simp]
theorem SlashAction.neg_slash {β G α γ : Type _} [Group G] [AddGroup α] [SMul γ α]
[SlashAction β G α γ] (k : β) (g : G) (a : α) : (-a) ∣[k;γ] g = -a ∣[k;γ] g :=
eq_neg_of_add_eq_zero_left <| by
rw [← SlashAction.add_slash, add_left_neg, SlashAction.zero_slash]
#align slash_action.neg_slash SlashAction.neg_slash
+-/
+#print SlashAction.smul_slash_of_tower /-
@[simp]
theorem SlashAction.smul_slash_of_tower {R β G α : Type _} (γ : Type _) [Group G] [AddGroup α]
[Monoid γ] [MulAction γ α] [SMul R γ] [SMul R α] [IsScalarTower R γ α] [SlashAction β G α γ]
(k : β) (g : G) (a : α) (r : R) : (r • a) ∣[k;γ] g = r • a ∣[k;γ] g := by
rw [← smul_one_smul γ r a, SlashAction.smul_slash, smul_one_smul]
#align slash_action.smul_slash_of_tower SlashAction.smul_slash_of_tower
+-/
attribute [simp] SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_slash
SlashAction.add_slash
+#print monoidHomSlashAction /-
/-- Slash_action induced by a monoid homomorphism.-/
def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul γ α] [Group H]
[SlashAction β G α γ] (h : H →* G) : SlashAction β H α γ
@@ -83,15 +90,18 @@ def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul
smul_slash _ _ := SlashAction.smul_slash _ _
add_slash _ g _ _ := SlashAction.add_slash _ (h g) _ _
#align monoid_hom_slash_action monoidHomSlashAction
+-/
namespace ModularForm
noncomputable section
+#print ModularForm.slash /-
/-- The weight `k` action of `GL(2, ℝ)⁺` on functions `f : ℍ → ℂ`. -/
def slash (k : ℤ) (γ : GL(2, ℝ)⁺) (f : ℍ → ℂ) (x : ℍ) : ℂ :=
f (γ • x) * ((↑ₘγ).det : ℝ) ^ (k - 1) * UpperHalfPlane.denom γ x ^ (-k)
#align modular_form.slash ModularForm.slash
+-/
variable {Γ : Subgroup SL(2, ℤ)} {k : ℤ} (f : ℍ → ℂ)
@@ -154,32 +164,43 @@ instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ
end
+#print ModularForm.slash_def /-
theorem slash_def (A : GL(2, ℝ)⁺) : f ∣[k] A = slash k A f :=
rfl
#align modular_form.slash_def ModularForm.slash_def
+-/
+#print ModularForm.subgroupAction /-
instance subgroupAction (Γ : Subgroup SL(2, ℤ)) : SlashAction ℤ Γ (ℍ → ℂ) ℂ :=
monoidHomSlashAction
(MonoidHom.comp Matrix.SpecialLinearGroup.toGLPos
(MonoidHom.comp (Matrix.SpecialLinearGroup.map (Int.castRingHom ℝ)) (Subgroup.subtype Γ)))
#align modular_form.subgroup_action ModularForm.subgroupAction
+-/
+#print ModularForm.subgroup_slash /-
@[simp]
theorem subgroup_slash (Γ : Subgroup SL(2, ℤ)) (γ : Γ) : f ∣[k] γ = f ∣[k] (γ : GL(2, ℝ)⁺) :=
rfl
#align modular_form.subgroup_slash ModularForm.subgroup_slash
+-/
-instance sLAction : SlashAction ℤ SL(2, ℤ) (ℍ → ℂ) ℂ :=
+#print ModularForm.SLAction /-
+instance SLAction : SlashAction ℤ SL(2, ℤ) (ℍ → ℂ) ℂ :=
monoidHomSlashAction
(MonoidHom.comp Matrix.SpecialLinearGroup.toGLPos
(Matrix.SpecialLinearGroup.map (Int.castRingHom ℝ)))
-#align modular_form.SL_action ModularForm.sLAction
+#align modular_form.SL_action ModularForm.SLAction
+-/
+#print ModularForm.SL_slash /-
@[simp]
theorem SL_slash (γ : SL(2, ℤ)) : f ∣[k] γ = f ∣[k] (γ : GL(2, ℝ)⁺) :=
rfl
#align modular_form.SL_slash ModularForm.SL_slash
+-/
+#print ModularForm.is_invariant_one /-
/-- The constant function 1 is invariant under any element of `SL(2, ℤ)`. -/
@[simp]
theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ) ∣[(0 : ℤ)] A = (1 : ℍ → ℂ) :=
@@ -191,7 +212,9 @@ theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ) ∣[(0 : ℤ)] A =
rw [SL_slash, slash_def, slash, zero_sub, this]
simp
#align modular_form.is_invariant_one ModularForm.is_invariant_one
+-/
+#print ModularForm.slash_action_eq'_iff /-
/-- A function `f : ℍ → ℂ` is `slash_invariant`, of weight `k ∈ ℤ` and level `Γ`,
if for every matrix `γ ∈ Γ` we have `f(γ • z)= (c*z+d)^k f(z)` where `γ= ![![a, b], ![c, d]]`,
and it acts on `ℍ` via Möbius transformations. -/
@@ -207,7 +230,9 @@ theorem slash_action_eq'_iff (k : ℤ) (Γ : Subgroup SL(2, ℤ)) (f : ℍ →
rfl
· convert zpow_ne_zero k (denom_ne_zero γ z)
#align modular_form.slash_action_eq'_iff ModularForm.slash_action_eq'_iff
+-/
+#print ModularForm.mul_slash /-
theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = ((↑ₘA).det : ℝ) • f ∣[k1] A * g ∣[k2] A :=
by
@@ -230,7 +255,9 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
rw [h1, h22]
ring
#align modular_form.mul_slash ModularForm.mul_slash
+-/
+#print ModularForm.mul_slash_SL2 /-
@[simp]
theorem mul_slash_SL2 (k1 k2 : ℤ) (A : SL(2, ℤ)) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = f ∣[k1] A * g ∣[k2] A :=
@@ -239,11 +266,14 @@ theorem mul_slash_SL2 (k1 k2 : ℤ) (A : SL(2, ℤ)) (f g : ℍ → ℂ) :
_ = (1 : ℝ) • f ∣[k1] A * g ∣[k2] A := by simp [-Matrix.SpecialLinearGroup.coe_matrix_coe]
_ = f ∣[k1] A * g ∣[k2] A := by simp
#align modular_form.mul_slash_SL2 ModularForm.mul_slash_SL2
+-/
+#print ModularForm.mul_slash_subgroup /-
theorem mul_slash_subgroup (k1 k2 : ℤ) (Γ : Subgroup SL(2, ℤ)) (A : Γ) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = f ∣[k1] A * g ∣[k2] A :=
mul_slash_SL2 k1 k2 A f g
#align modular_form.mul_slash_subgroup ModularForm.mul_slash_subgroup
+-/
end ModularForm
mathlib commit https://github.com/leanprover-community/mathlib/commit/8b981918a93bc45a8600de608cde7944a80d92b9
@@ -136,7 +136,7 @@ private theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c :
simp_rw [← smul_one_smul ℂ c f, ← smul_one_smul ℂ c (f ∣[k]A)]
ext1
simp_rw [slash]
- simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.coe_det_apply, Pi.smul_apply,
+ simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.det_apply_val, Pi.smul_apply,
Subtype.val_eq_coe, coe_coe]
ring
@@ -212,7 +212,7 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = ((↑ₘA).det : ℝ) • f ∣[k1] A * g ∣[k2] A :=
by
ext1
- simp only [slash_def, slash, Matrix.GeneralLinearGroup.coe_det_apply, Subtype.val_eq_coe,
+ simp only [slash_def, slash, Matrix.GeneralLinearGroup.det_apply_val, Subtype.val_eq_coe,
Pi.mul_apply, Pi.smul_apply, Algebra.smul_mul_assoc, real_smul]
set d : ℂ := ↑((↑ₘA).det : ℝ)
have h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -32,17 +32,13 @@ open Complex UpperHalfPlane
open scoped UpperHalfPlane
--- mathport name: «expr↑ₘ »
local prefix:1024 "↑ₘ" => @coe _ (Matrix (Fin 2) (Fin 2) _) _
--- mathport name: «expr↑ₘ[ ]»
-- like `↑ₘ`, but allows the user to specify the ring `R`. Useful to help Lean elaborate.
local notation "↑ₘ[" R "]" => @coe _ (Matrix (Fin 2) (Fin 2) R) _
--- mathport name: «exprGL( , )⁺»
local notation "GL(" n ", " R ")" "⁺" => Matrix.GLPos (Fin n) R
--- mathport name: «exprSL( , )»
local notation "SL(" n ", " R ")" => Matrix.SpecialLinearGroup (Fin n) R
/-- A general version of the slash action of the space of modular forms.-/
@@ -55,10 +51,8 @@ class SlashAction (β G α γ : Type _) [Group G] [AddMonoid α] [SMul γ α] wh
add_slash : ∀ (k : β) (g : G) (a b : α), map k g (a + b) = map k g a + map k g b
#align slash_action SlashAction
--- mathport name: modular_form.slash
scoped[ModularForm] notation:100 f " ∣[" k ";" γ "] " a:100 => SlashAction.map γ k a f
--- mathport name: modular_form.slash_complex
scoped[ModularForm] notation:100 f " ∣[" k "] " a:100 => SlashAction.map ℂ k a f
@[simp]
@@ -103,7 +97,6 @@ variable {Γ : Subgroup SL(2, ℤ)} {k : ℤ} (f : ℍ → ℂ)
section
--- mathport name: «expr ∣[ ] »
-- temporary notation until the instance is built
local notation:100 f " ∣[" k "]" γ:100 => ModularForm.slash k γ f
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -245,7 +245,6 @@ theorem mul_slash_SL2 (k1 k2 : ℤ) (A : SL(2, ℤ)) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] (A : GL(2, ℝ)⁺) = _ • f ∣[k1] A * g ∣[k2] A := mul_slash _ _ _ _ _
_ = (1 : ℝ) • f ∣[k1] A * g ∣[k2] A := by simp [-Matrix.SpecialLinearGroup.coe_matrix_coe]
_ = f ∣[k1] A * g ∣[k2] A := by simp
-
#align modular_form.mul_slash_SL2 ModularForm.mul_slash_SL2
theorem mul_slash_subgroup (k1 k2 : ℤ) (Γ : Subgroup SL(2, ℤ)) (A : Γ) (f g : ℍ → ℂ) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -75,8 +75,8 @@ theorem SlashAction.smul_slash_of_tower {R β G α : Type _} (γ : Type _) [Grou
rw [← smul_one_smul γ r a, SlashAction.smul_slash, smul_one_smul]
#align slash_action.smul_slash_of_tower SlashAction.smul_slash_of_tower
-attribute [simp]
- SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_slash SlashAction.add_slash
+attribute [simp] SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_slash
+ SlashAction.add_slash
/-- Slash_action induced by a monoid homomorphism.-/
def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul γ α] [Group H]
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -30,7 +30,7 @@ In the `modular_form` locale, this provides
open Complex UpperHalfPlane
-open UpperHalfPlane
+open scoped UpperHalfPlane
-- mathport name: «expr↑ₘ »
local prefix:1024 "↑ₘ" => @coe _ (Matrix (Fin 2) (Fin 2) _) _
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -125,18 +125,15 @@ private theorem slash_mul (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) : f
((↑(↑B : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ) ^ (k - 1) :=
by simp_rw [← mul_zpow]
simp_rw [this, ← mul_assoc, ← mul_zpow]
-#align modular_form.slash_mul modular_form.slash_mul
private theorem add_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
(f + g) ∣[k]A = f ∣[k]A + g ∣[k]A := by
ext1
simp only [slash, Pi.add_apply, denom, coe_coe, zpow_neg]
ring
-#align modular_form.add_slash modular_form.add_slash
private theorem slash_one (k : ℤ) (f : ℍ → ℂ) : f ∣[k]1 = f :=
funext <| by simp [slash]
-#align modular_form.slash_one modular_form.slash_one
variable {α : Type _} [SMul α ℂ] [IsScalarTower α ℂ ℂ]
@@ -149,11 +146,9 @@ private theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c :
simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.coe_det_apply, Pi.smul_apply,
Subtype.val_eq_coe, coe_coe]
ring
-#align modular_form.smul_slash modular_form.smul_slash
private theorem zero_slash (k : ℤ) (A : GL(2, ℝ)⁺) : (0 : ℍ → ℂ) ∣[k]A = 0 :=
funext fun _ => by simp only [slash, Pi.zero_apply, MulZeroClass.zero_mul]
-#align modular_form.zero_slash modular_form.zero_slash
instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ
where
mathlib commit https://github.com/leanprover-community/mathlib/commit/8d33f09cd7089ecf074b4791907588245aec5d1b
@@ -40,7 +40,7 @@ local prefix:1024 "↑ₘ" => @coe _ (Matrix (Fin 2) (Fin 2) _) _
local notation "↑ₘ[" R "]" => @coe _ (Matrix (Fin 2) (Fin 2) R) _
-- mathport name: «exprGL( , )⁺»
-local notation "GL(" n ", " R ")" "⁺" => Matrix.gLPos (Fin n) R
+local notation "GL(" n ", " R ")" "⁺" => Matrix.GLPos (Fin n) R
-- mathport name: «exprSL( , )»
local notation "SL(" n ", " R ")" => Matrix.SpecialLinearGroup (Fin n) R
@@ -197,7 +197,7 @@ theorem SL_slash (γ : SL(2, ℤ)) : f ∣[k] γ = f ∣[k] (γ : GL(2, ℝ)⁺)
theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ) ∣[(0 : ℤ)] A = (1 : ℍ → ℂ) :=
by
have : ((↑ₘ(A : GL(2, ℝ)⁺)).det : ℝ) = 1 := by
- simp only [coe_coe, Matrix.SpecialLinearGroup.coe_gLPos_coe_GL_coe_matrix,
+ simp only [coe_coe, Matrix.SpecialLinearGroup.coe_GLPos_coe_GL_coe_matrix,
Matrix.SpecialLinearGroup.det_coe]
funext
rw [SL_slash, slash_def, slash, zero_sub, this]
@@ -213,7 +213,7 @@ theorem slash_action_eq'_iff (k : ℤ) (Γ : Subgroup SL(2, ℤ)) (f : ℍ →
simp only [subgroup_slash, slash_def, ModularForm.slash]
convert inv_mul_eq_iff_eq_mul₀ _ using 2
· rw [mul_comm]
- simp only [denom, coe_coe, Matrix.SpecialLinearGroup.coe_gLPos_coe_GL_coe_matrix, zpow_neg,
+ simp only [denom, coe_coe, Matrix.SpecialLinearGroup.coe_GLPos_coe_GL_coe_matrix, zpow_neg,
Matrix.SpecialLinearGroup.det_coe, of_real_one, one_zpow, mul_one, subgroup_to_sl_moeb,
sl_moeb]
rfl
@@ -232,7 +232,7 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
have : d ≠ 0 := by
dsimp [d]
norm_cast
- exact Matrix.gLPos.det_ne_zero A
+ exact Matrix.GLPos.det_ne_zero A
rw [← zpow_one_add₀ this, ← zpow_add₀ this]
ring
have h22 : denom A x ^ (-(k1 + k2)) = denom A x ^ (-k1) * denom A x ^ (-k2) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/738054fa93d43512da144ec45ce799d18fd44248
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
! This file was ported from Lean 3 source module number_theory.modular_forms.slash_actions
-! leanprover-community/mathlib commit ef74e2bd3a553d31fdb139188a251509b6c6b038
+! leanprover-community/mathlib commit 738054fa93d43512da144ec45ce799d18fd44248
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -50,9 +50,9 @@ class SlashAction (β G α γ : Type _) [Group G] [AddMonoid α] [SMul γ α] wh
map : β → G → α → α
zero_slash : ∀ (k : β) (g : G), map k g 0 = 0
slash_one : ∀ (k : β) (a : α), map k 1 a = a
- right_action : ∀ (k : β) (g h : G) (a : α), map k h (map k g a) = map k (g * h) a
- smul_action : ∀ (k : β) (g : G) (a : α) (z : γ), map k g (z • a) = z • map k g a
- AddAction : ∀ (k : β) (g : G) (a b : α), map k g (a + b) = map k g a + map k g b
+ slash_mul : ∀ (k : β) (g h : G) (a : α), map k (g * h) a = map k h (map k g a)
+ smul_slash : ∀ (k : β) (g : G) (a : α) (z : γ), map k g (z • a) = z • map k g a
+ add_slash : ∀ (k : β) (g : G) (a b : α), map k g (a + b) = map k g a + map k g b
#align slash_action SlashAction
-- mathport name: modular_form.slash
@@ -65,18 +65,18 @@ scoped[ModularForm] notation:100 f " ∣[" k "] " a:100 => SlashAction.map ℂ k
theorem SlashAction.neg_slash {β G α γ : Type _} [Group G] [AddGroup α] [SMul γ α]
[SlashAction β G α γ] (k : β) (g : G) (a : α) : (-a) ∣[k;γ] g = -a ∣[k;γ] g :=
eq_neg_of_add_eq_zero_left <| by
- rw [← SlashAction.add_action, add_left_neg, SlashAction.zero_slash]
+ rw [← SlashAction.add_slash, add_left_neg, SlashAction.zero_slash]
#align slash_action.neg_slash SlashAction.neg_slash
@[simp]
theorem SlashAction.smul_slash_of_tower {R β G α : Type _} (γ : Type _) [Group G] [AddGroup α]
[Monoid γ] [MulAction γ α] [SMul R γ] [SMul R α] [IsScalarTower R γ α] [SlashAction β G α γ]
(k : β) (g : G) (a : α) (r : R) : (r • a) ∣[k;γ] g = r • a ∣[k;γ] g := by
- rw [← smul_one_smul γ r a, SlashAction.smul_action, smul_one_smul]
+ rw [← smul_one_smul γ r a, SlashAction.smul_slash, smul_one_smul]
#align slash_action.smul_slash_of_tower SlashAction.smul_slash_of_tower
attribute [simp]
- SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_action SlashAction.add_action
+ SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_slash SlashAction.add_slash
/-- Slash_action induced by a monoid homomorphism.-/
def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul γ α] [Group H]
@@ -85,9 +85,9 @@ def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul
map k g := SlashAction.map γ k (h g)
zero_slash k g := SlashAction.zero_slash k (h g)
slash_one k a := by simp only [map_one, SlashAction.slash_one]
- right_action k g gg a := by simp only [map_mul, SlashAction.right_action]
- smul_action _ _ := SlashAction.smul_action _ _
- AddAction _ g _ _ := SlashAction.add_action _ (h g) _ _
+ slash_mul k g gg a := by simp only [map_mul, SlashAction.slash_mul]
+ smul_slash _ _ := SlashAction.smul_slash _ _
+ add_slash _ g _ _ := SlashAction.add_slash _ (h g) _ _
#align monoid_hom_slash_action monoidHomSlashAction
namespace ModularForm
@@ -107,8 +107,8 @@ section
-- temporary notation until the instance is built
local notation:100 f " ∣[" k "]" γ:100 => ModularForm.slash k γ f
-private theorem slash_right_action (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
- (f ∣[k]A) ∣[k]B = f ∣[k](A * B) := by
+private theorem slash_mul (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) : f ∣[k](A * B) = (f ∣[k]A) ∣[k]B :=
+ by
ext1
simp_rw [slash, UpperHalfPlane.denom_cocycle A B x]
have e3 : (A * B) • x = A • B • x := by convert UpperHalfPlane.mul_smul' A B x
@@ -125,14 +125,14 @@ private theorem slash_right_action (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ →
((↑(↑B : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ) ^ (k - 1) :=
by simp_rw [← mul_zpow]
simp_rw [this, ← mul_assoc, ← mul_zpow]
-#align modular_form.slash_right_action modular_form.slash_right_action
+#align modular_form.slash_mul modular_form.slash_mul
-private theorem slash_add (k : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
+private theorem add_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
(f + g) ∣[k]A = f ∣[k]A + g ∣[k]A := by
ext1
simp only [slash, Pi.add_apply, denom, coe_coe, zpow_neg]
ring
-#align modular_form.slash_add modular_form.slash_add
+#align modular_form.add_slash modular_form.add_slash
private theorem slash_one (k : ℤ) (f : ℍ → ℂ) : f ∣[k]1 = f :=
funext <| by simp [slash]
@@ -160,9 +160,9 @@ instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ
map := slash
zero_slash := zero_slash
slash_one := slash_one
- right_action := slash_right_action
- smul_action := smul_slash
- AddAction := slash_add
+ slash_mul := slash_mul
+ smul_slash := smul_slash
+ add_slash := add_slash
end
mathlib commit https://github.com/leanprover-community/mathlib/commit/36b8aa61ea7c05727161f96a0532897bd72aedab
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
! This file was ported from Lean 3 source module number_theory.modular_forms.slash_actions
-! leanprover-community/mathlib commit e65771194f9e923a70dfb49b6ca7be6e400d8b6f
+! leanprover-community/mathlib commit ef74e2bd3a553d31fdb139188a251509b6c6b038
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -18,6 +18,13 @@ import Mathbin.LinearAlgebra.Matrix.SpecialLinearGroup
This file defines a class of slash actions, which are families of right actions of a given group
parametrized by some Type. This is modeled on the slash action of `GL_pos (fin 2) ℝ` on the space
of modular forms.
+
+## Notation
+
+In the `modular_form` locale, this provides
+
+* `f ∣[k;γ] A`: the `k`th `γ`-compatible slash action by `A` on `f`
+* `f ∣[k] A`: the `k`th `ℂ`-compatible slash action by `A` on `f`; a shorthand for `f ∣[k;ℂ] A`
-/
@@ -39,7 +46,7 @@ local notation "GL(" n ", " R ")" "⁺" => Matrix.gLPos (Fin n) R
local notation "SL(" n ", " R ")" => Matrix.SpecialLinearGroup (Fin n) R
/-- A general version of the slash action of the space of modular forms.-/
-class SlashAction (β G α γ : Type _) [Group G] [Zero α] [SMul γ α] [Add α] where
+class SlashAction (β G α γ : Type _) [Group G] [AddMonoid α] [SMul γ α] where
map : β → G → α → α
zero_slash : ∀ (k : β) (g : G), map k g 0 = 0
slash_one : ∀ (k : β) (a : α), map k 1 a = a
@@ -48,8 +55,31 @@ class SlashAction (β G α γ : Type _) [Group G] [Zero α] [SMul γ α] [Add α
AddAction : ∀ (k : β) (g : G) (a b : α), map k g (a + b) = map k g a + map k g b
#align slash_action SlashAction
+-- mathport name: modular_form.slash
+scoped[ModularForm] notation:100 f " ∣[" k ";" γ "] " a:100 => SlashAction.map γ k a f
+
+-- mathport name: modular_form.slash_complex
+scoped[ModularForm] notation:100 f " ∣[" k "] " a:100 => SlashAction.map ℂ k a f
+
+@[simp]
+theorem SlashAction.neg_slash {β G α γ : Type _} [Group G] [AddGroup α] [SMul γ α]
+ [SlashAction β G α γ] (k : β) (g : G) (a : α) : (-a) ∣[k;γ] g = -a ∣[k;γ] g :=
+ eq_neg_of_add_eq_zero_left <| by
+ rw [← SlashAction.add_action, add_left_neg, SlashAction.zero_slash]
+#align slash_action.neg_slash SlashAction.neg_slash
+
+@[simp]
+theorem SlashAction.smul_slash_of_tower {R β G α : Type _} (γ : Type _) [Group G] [AddGroup α]
+ [Monoid γ] [MulAction γ α] [SMul R γ] [SMul R α] [IsScalarTower R γ α] [SlashAction β G α γ]
+ (k : β) (g : G) (a : α) (r : R) : (r • a) ∣[k;γ] g = r • a ∣[k;γ] g := by
+ rw [← smul_one_smul γ r a, SlashAction.smul_action, smul_one_smul]
+#align slash_action.smul_slash_of_tower SlashAction.smul_slash_of_tower
+
+attribute [simp]
+ SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_action SlashAction.add_action
+
/-- Slash_action induced by a monoid homomorphism.-/
-def monoidHomSlashAction {β G H α γ : Type _} [Group G] [Zero α] [SMul γ α] [Add α] [Group H]
+def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul γ α] [Group H]
[SlashAction β G α γ] (h : H →* G) : SlashAction β H α γ
where
map k g := SlashAction.map γ k (h g)
@@ -71,10 +101,13 @@ def slash (k : ℤ) (γ : GL(2, ℝ)⁺) (f : ℍ → ℂ) (x : ℍ) : ℂ :=
variable {Γ : Subgroup SL(2, ℤ)} {k : ℤ} (f : ℍ → ℂ)
--- mathport name: modular_form.slash
-scoped notation:100 f " ∣[" k "]" γ:100 => ModularForm.slash k γ f
+section
+
+-- mathport name: «expr ∣[ ] »
+-- temporary notation until the instance is built
+local notation:100 f " ∣[" k "]" γ:100 => ModularForm.slash k γ f
-theorem slash_right_action (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
+private theorem slash_right_action (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
(f ∣[k]A) ∣[k]B = f ∣[k](A * B) := by
ext1
simp_rw [slash, UpperHalfPlane.denom_cocycle A B x]
@@ -92,25 +125,23 @@ theorem slash_right_action (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
((↑(↑B : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ) ^ (k - 1) :=
by simp_rw [← mul_zpow]
simp_rw [this, ← mul_assoc, ← mul_zpow]
-#align modular_form.slash_right_action ModularForm.slash_right_action
+#align modular_form.slash_right_action modular_form.slash_right_action
-@[simp]
-theorem slash_add (k : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) : (f + g) ∣[k]A = f ∣[k]A + g ∣[k]A :=
- by
+private theorem slash_add (k : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
+ (f + g) ∣[k]A = f ∣[k]A + g ∣[k]A := by
ext1
simp only [slash, Pi.add_apply, denom, coe_coe, zpow_neg]
ring
-#align modular_form.slash_add ModularForm.slash_add
+#align modular_form.slash_add modular_form.slash_add
-@[simp]
-theorem slash_one (k : ℤ) (f : ℍ → ℂ) : f ∣[k]1 = f :=
+private theorem slash_one (k : ℤ) (f : ℍ → ℂ) : f ∣[k]1 = f :=
funext <| by simp [slash]
-#align modular_form.slash_one ModularForm.slash_one
+#align modular_form.slash_one modular_form.slash_one
variable {α : Type _} [SMul α ℂ] [IsScalarTower α ℂ ℂ]
-@[simp]
-theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c : α) : (c • f) ∣[k]A = c • f ∣[k]A :=
+private theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c : α) :
+ (c • f) ∣[k]A = c • f ∣[k]A :=
by
simp_rw [← smul_one_smul ℂ c f, ← smul_one_smul ℂ c (f ∣[k]A)]
ext1
@@ -118,17 +149,11 @@ theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c : α) : (c
simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.coe_det_apply, Pi.smul_apply,
Subtype.val_eq_coe, coe_coe]
ring
-#align modular_form.smul_slash ModularForm.smul_slash
-
-@[simp]
-theorem neg_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) : (-f) ∣[k]A = -f ∣[k]A :=
- funext <| by simp [slash]
-#align modular_form.neg_slash ModularForm.neg_slash
+#align modular_form.smul_slash modular_form.smul_slash
-@[simp]
-theorem zero_slash (k : ℤ) (A : GL(2, ℝ)⁺) : (0 : ℍ → ℂ) ∣[k]A = 0 :=
+private theorem zero_slash (k : ℤ) (A : GL(2, ℝ)⁺) : (0 : ℍ → ℂ) ∣[k]A = 0 :=
funext fun _ => by simp only [slash, Pi.zero_apply, MulZeroClass.zero_mul]
-#align modular_form.zero_slash ModularForm.zero_slash
+#align modular_form.zero_slash modular_form.zero_slash
instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ
where
@@ -139,6 +164,12 @@ instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ
smul_action := smul_slash
AddAction := slash_add
+end
+
+theorem slash_def (A : GL(2, ℝ)⁺) : f ∣[k] A = slash k A f :=
+ rfl
+#align modular_form.slash_def ModularForm.slash_def
+
instance subgroupAction (Γ : Subgroup SL(2, ℤ)) : SlashAction ℤ Γ (ℍ → ℂ) ℂ :=
monoidHomSlashAction
(MonoidHom.comp Matrix.SpecialLinearGroup.toGLPos
@@ -146,8 +177,7 @@ instance subgroupAction (Γ : Subgroup SL(2, ℤ)) : SlashAction ℤ Γ (ℍ →
#align modular_form.subgroup_action ModularForm.subgroupAction
@[simp]
-theorem subgroup_slash (Γ : Subgroup SL(2, ℤ)) (γ : Γ) :
- SlashAction.map ℂ k γ f = slash k (γ : GL(2, ℝ)⁺) f :=
+theorem subgroup_slash (Γ : Subgroup SL(2, ℤ)) (γ : Γ) : f ∣[k] γ = f ∣[k] (γ : GL(2, ℝ)⁺) :=
rfl
#align modular_form.subgroup_slash ModularForm.subgroup_slash
@@ -158,22 +188,19 @@ instance sLAction : SlashAction ℤ SL(2, ℤ) (ℍ → ℂ) ℂ :=
#align modular_form.SL_action ModularForm.sLAction
@[simp]
-theorem SL_slash (γ : SL(2, ℤ)) : SlashAction.map ℂ k γ f = slash k (γ : GL(2, ℝ)⁺) f :=
+theorem SL_slash (γ : SL(2, ℤ)) : f ∣[k] γ = f ∣[k] (γ : GL(2, ℝ)⁺) :=
rfl
#align modular_form.SL_slash ModularForm.SL_slash
--- mathport name: «expr ∣[ , ]»
-local notation:73 f "∣[" k:0 "," A "]" => SlashAction.map ℂ k A f
-
/-- The constant function 1 is invariant under any element of `SL(2, ℤ)`. -/
@[simp]
-theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ)∣[(0 : ℤ),A] = (1 : ℍ → ℂ) :=
+theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ) ∣[(0 : ℤ)] A = (1 : ℍ → ℂ) :=
by
have : ((↑ₘ(A : GL(2, ℝ)⁺)).det : ℝ) = 1 := by
simp only [coe_coe, Matrix.SpecialLinearGroup.coe_gLPos_coe_GL_coe_matrix,
Matrix.SpecialLinearGroup.det_coe]
funext
- rw [SL_slash, slash, zero_sub, this]
+ rw [SL_slash, slash_def, slash, zero_sub, this]
simp
#align modular_form.is_invariant_one ModularForm.is_invariant_one
@@ -181,9 +208,9 @@ theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ)∣[(0 : ℤ),A] =
if for every matrix `γ ∈ Γ` we have `f(γ • z)= (c*z+d)^k f(z)` where `γ= ![![a, b], ![c, d]]`,
and it acts on `ℍ` via Möbius transformations. -/
theorem slash_action_eq'_iff (k : ℤ) (Γ : Subgroup SL(2, ℤ)) (f : ℍ → ℂ) (γ : Γ) (z : ℍ) :
- (f∣[k,γ]) z = f z ↔ f (γ • z) = ((↑ₘ[ℤ] γ 1 0 : ℂ) * z + (↑ₘ[ℤ] γ 1 1 : ℂ)) ^ k * f z :=
+ (f ∣[k] γ) z = f z ↔ f (γ • z) = ((↑ₘ[ℤ] γ 1 0 : ℂ) * z + (↑ₘ[ℤ] γ 1 1 : ℂ)) ^ k * f z :=
by
- simp only [subgroup_slash, ModularForm.slash]
+ simp only [subgroup_slash, slash_def, ModularForm.slash]
convert inv_mul_eq_iff_eq_mul₀ _ using 2
· rw [mul_comm]
simp only [denom, coe_coe, Matrix.SpecialLinearGroup.coe_gLPos_coe_GL_coe_matrix, zpow_neg,
@@ -194,10 +221,10 @@ theorem slash_action_eq'_iff (k : ℤ) (Γ : Subgroup SL(2, ℤ)) (f : ℍ →
#align modular_form.slash_action_eq'_iff ModularForm.slash_action_eq'_iff
theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
- (f * g)∣[k1 + k2,A] = ((↑ₘA).det : ℝ) • f∣[k1,A] * g∣[k2,A] :=
+ (f * g) ∣[k1 + k2] A = ((↑ₘA).det : ℝ) • f ∣[k1] A * g ∣[k2] A :=
by
ext1
- simp only [SlashAction.map, slash, Matrix.GeneralLinearGroup.coe_det_apply, Subtype.val_eq_coe,
+ simp only [slash_def, slash, Matrix.GeneralLinearGroup.coe_det_apply, Subtype.val_eq_coe,
Pi.mul_apply, Pi.smul_apply, Algebra.smul_mul_assoc, real_smul]
set d : ℂ := ↑((↑ₘA).det : ℝ)
have h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1) :=
@@ -218,16 +245,16 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
@[simp]
theorem mul_slash_SL2 (k1 k2 : ℤ) (A : SL(2, ℤ)) (f g : ℍ → ℂ) :
- (f * g)∣[k1 + k2,A] = f∣[k1,A] * g∣[k2,A] :=
+ (f * g) ∣[k1 + k2] A = f ∣[k1] A * g ∣[k2] A :=
calc
- (f * g)∣[k1 + k2,(A : GL(2, ℝ)⁺)] = _ • f∣[k1,A] * g∣[k2,A] := mul_slash _ _ _ _ _
- _ = (1 : ℝ) • f∣[k1,A] * g∣[k2,A] := by simp [-Matrix.SpecialLinearGroup.coe_matrix_coe]
- _ = f∣[k1,A] * g∣[k2,A] := by simp
+ (f * g) ∣[k1 + k2] (A : GL(2, ℝ)⁺) = _ • f ∣[k1] A * g ∣[k2] A := mul_slash _ _ _ _ _
+ _ = (1 : ℝ) • f ∣[k1] A * g ∣[k2] A := by simp [-Matrix.SpecialLinearGroup.coe_matrix_coe]
+ _ = f ∣[k1] A * g ∣[k2] A := by simp
#align modular_form.mul_slash_SL2 ModularForm.mul_slash_SL2
theorem mul_slash_subgroup (k1 k2 : ℤ) (Γ : Subgroup SL(2, ℤ)) (A : Γ) (f g : ℍ → ℂ) :
- (f * g)∣[k1 + k2,A] = f∣[k1,A] * g∣[k2,A] :=
+ (f * g) ∣[k1 + k2] A = f ∣[k1] A * g ∣[k2] A :=
mul_slash_SL2 k1 k2 A f g
#align modular_form.mul_slash_subgroup ModularForm.mul_slash_subgroup
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -127,7 +127,7 @@ theorem neg_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) : (-f) ∣[k]A
@[simp]
theorem zero_slash (k : ℤ) (A : GL(2, ℝ)⁺) : (0 : ℍ → ℂ) ∣[k]A = 0 :=
- funext fun _ => by simp only [slash, Pi.zero_apply, zero_mul]
+ funext fun _ => by simp only [slash, Pi.zero_apply, MulZeroClass.zero_mul]
#align modular_form.zero_slash ModularForm.zero_slash
instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
! This file was ported from Lean 3 source module number_theory.modular_forms.slash_actions
-! leanprover-community/mathlib commit ae690b0c236e488a0043f6faa8ce3546e7f2f9c5
+! leanprover-community/mathlib commit e65771194f9e923a70dfb49b6ca7be6e400d8b6f
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -28,6 +28,10 @@ open UpperHalfPlane
-- mathport name: «expr↑ₘ »
local prefix:1024 "↑ₘ" => @coe _ (Matrix (Fin 2) (Fin 2) _) _
+-- mathport name: «expr↑ₘ[ ]»
+-- like `↑ₘ`, but allows the user to specify the ring `R`. Useful to help Lean elaborate.
+local notation "↑ₘ[" R "]" => @coe _ (Matrix (Fin 2) (Fin 2) R) _
+
-- mathport name: «exprGL( , )⁺»
local notation "GL(" n ", " R ")" "⁺" => Matrix.gLPos (Fin n) R
@@ -177,7 +181,7 @@ theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ)∣[(0 : ℤ),A] =
if for every matrix `γ ∈ Γ` we have `f(γ • z)= (c*z+d)^k f(z)` where `γ= ![![a, b], ![c, d]]`,
and it acts on `ℍ` via Möbius transformations. -/
theorem slash_action_eq'_iff (k : ℤ) (Γ : Subgroup SL(2, ℤ)) (f : ℍ → ℂ) (γ : Γ) (z : ℍ) :
- (f∣[k,γ]) z = f z ↔ f (γ • z) = ((↑ₘγ 1 0 : ℂ) * z + (↑ₘγ 1 1 : ℂ)) ^ k * f z :=
+ (f∣[k,γ]) z = f z ↔ f (γ • z) = ((↑ₘ[ℤ] γ 1 0 : ℂ) * z + (↑ₘ[ℤ] γ 1 1 : ℂ)) ^ k * f z :=
by
simp only [subgroup_slash, ModularForm.slash]
convert inv_mul_eq_iff_eq_mul₀ _ using 2
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.
@@ -39,7 +39,7 @@ local notation:1024 "↑ₘ" A:1024 =>
local notation:1024 "↑ₘ[" R "]" A:1024 =>
((A : GL (Fin 2) R) : Matrix (Fin 2) (Fin 2) R)
-/-- A general version of the slash action of the space of modular forms.-/
+/-- A general version of the slash action of the space of modular forms. -/
class SlashAction (β G α γ : Type*) [Group G] [AddMonoid α] [SMul γ α] where
map : β → G → α → α
zero_slash : ∀ (k : β) (g : G), map k g 0 = 0
@@ -72,7 +72,7 @@ theorem SlashAction.smul_slash_of_tower {R β G α : Type*} (γ : Type*) [Group
attribute [simp] SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_slash
SlashAction.add_slash
-/-- Slash_action induced by a monoid homomorphism.-/
+/-- Slash_action induced by a monoid homomorphism. -/
def monoidHomSlashAction {β G H α γ : Type*} [Group G] [AddMonoid α] [SMul γ α] [Group H]
[SlashAction β G α γ] (h : H →* G) : SlashAction β H α γ where
map k g := SlashAction.map γ k (h g)
This is a very large PR, but it has been reviewed piecemeal already in PRs to the bump/v4.7.0
branch as we update to intermediate nightlies.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: damiano <adomani@gmail.com>
@@ -99,6 +99,10 @@ section
-- temporary notation until the instance is built
local notation:100 f " ∣[" k "]" γ:100 => ModularForm.slash k γ f
+-- Adaptation note: after v4.7.0-rc1, there is a performance problem in `field_simp`.
+-- (Part of the code was ignoring the `maxDischargeDepth` setting: now that we have to increase it,
+-- other paths becomes slow.)
+set_option maxHeartbeats 400000 in
private theorem slash_mul (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
f ∣[k](A * B) = (f ∣[k]A) ∣[k]B := by
ext1 x
@@ -211,7 +211,7 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
set d : ℂ := ↑((↑ₘA).det : ℝ)
have h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1) := by
have : d ≠ 0 := by
- dsimp
+ dsimp [d]
norm_cast
exact Matrix.GLPos.det_ne_zero A
rw [← zpow_one_add₀ this, ← zpow_add₀ this]
I loogled for every occurrence of "cast", Nat
and "natCast"
and where the casted nat was n
, and made sure there were corresponding @[simp]
lemmas for 0
, 1
, and OfNat.ofNat n
. This is necessary in general for simp confluence. Example:
import Mathlib
variable {α : Type*} [LinearOrderedRing α] (m n : ℕ) [m.AtLeastTwo] [n.AtLeastTwo]
example : ((OfNat.ofNat m : ℕ) : α) ≤ ((OfNat.ofNat n : ℕ) : α) ↔ (OfNat.ofNat m : ℕ) ≤ (OfNat.ofNat n : ℕ) := by
simp only [Nat.cast_le] -- this `@[simp]` lemma can apply
example : ((OfNat.ofNat m : ℕ) : α) ≤ ((OfNat.ofNat n : ℕ) : α) ↔ (OfNat.ofNat m : α) ≤ (OfNat.ofNat n : α) := by
simp only [Nat.cast_ofNat] -- and so can this one
example : (OfNat.ofNat m : α) ≤ (OfNat.ofNat n : α) ↔ (OfNat.ofNat m : ℕ) ≤ (OfNat.ofNat n : ℕ) := by
simp -- fails! `simp` doesn't have a lemma to bridge their results. confluence issue.
As far as I know, the only file this PR leaves with ofNat
gaps is PartENat.lean
. #8002 is addressing that file in parallel.
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -113,7 +113,7 @@ private theorem slash_mul (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
((↑(↑B : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ)) ^ (k - 1) =
((↑(↑A : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ) ^ (k - 1) *
((↑(↑B : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ) ^ (k - 1) := by
- simp_rw [← mul_zpow]
+ rw [← mul_zpow]
simp_rw [this, ← mul_assoc, ← mul_zpow]
private theorem add_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
UpperHalfPlane.ModularGroup
(#7885)
Rename some definitions and theorems about $SL(2, ℤ)$ in Analysis/Complex/UpperHalfPlane/Basic.lean
to place them in the namespace UpperHalfPlane.ModularGroup
, in order to avoid the confusion with definitions and theorems about $SL(2, ℝ)$. For example, UpperHalfPlane.det_coe'
is renamed to UpperHalfPlane.ModularGroup.det_coe'
, because we will have UpperHalfPlane.SL2R.det_coe'
.
Co-authored-by: Johan Commelin <johan@commelin.net>
@@ -25,7 +25,7 @@ In the `ModularForm` locale, this provides
-/
-open Complex UpperHalfPlane
+open Complex UpperHalfPlane ModularGroup
open scoped UpperHalfPlane
This adds the graded ring instance to spaces of modular forms.
Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com>
Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Chris Birkbeck <c.birkbeck@uea.ac.uk>
@@ -176,13 +176,17 @@ theorem SL_slash (γ : SL(2, ℤ)) : f ∣[k] γ = f ∣[k] (γ : GL(2, ℝ)⁺)
set_option linter.uppercaseLean3 false in
#align modular_form.SL_slash ModularForm.SL_slash
-/-- The constant function 1 is invariant under any element of `SL(2, ℤ)`. -/
--- @[simp] -- Porting note: simpNF says LHS simplifies to something more complex
-theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ) ∣[(0 : ℤ)] A = (1 : ℍ → ℂ) := by
+theorem is_invariant_const (A : SL(2, ℤ)) (x : ℂ) :
+ Function.const ℍ x ∣[(0 : ℤ)] A = Function.const ℍ x := by
have : ((↑ₘ(A : GL(2, ℝ)⁺)).det : ℝ) = 1 := det_coe'
funext
rw [SL_slash, slash_def, slash, zero_sub, this]
simp
+
+/-- The constant function 1 is invariant under any element of `SL(2, ℤ)`. -/
+-- @[simp] -- Porting note: simpNF says LHS simplifies to something more complex
+theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ) ∣[(0 : ℤ)] A = (1 : ℍ → ℂ) :=
+ is_invariant_const _ _
#align modular_form.is_invariant_one ModularForm.is_invariant_one
/-- A function `f : ℍ → ℂ` is slash-invariant, of weight `k ∈ ℤ` and level `Γ`,
This is the supremum of
along with some minor fixes from failures on nightly-testing as Mathlib master
is merged into it.
Note that some PRs for changes that are already compatible with the current toolchain and will be necessary have already been split out: #8380.
I am hopeful that in future we will be able to progressively merge adaptation PRs into a bump/v4.X.0
branch, so we never end up with a "big merge" like this. However one of these adaptation PRs (#8056) predates my new scheme for combined CI, and it wasn't possible to keep that PR viable in the meantime.
In particular this includes adjustments for the Lean PRs
We can get rid of all the
local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue [lean4#2220](https://github.com/leanprover/lean4/pull/2220)
macros across Mathlib (and in any projects that want to write natural number powers of reals).
Changes the default behaviour of simp
to (config := {decide := false})
. This makes simp
(and consequentially norm_num
) less powerful, but also more consistent, and less likely to blow up in long failures. This requires a variety of changes: changing some previously by simp
or norm_num
to decide
or rfl
, or adding (config := {decide := true})
.
This changed the behaviour of simp
so that simp [f]
will only unfold "fully applied" occurrences of f
. The old behaviour can be recovered with simp (config := { unfoldPartialApp := true })
. We may in future add a syntax for this, e.g. simp [!f]
; please provide feedback! In the meantime, we have made the following changes:
(config := { unfoldPartialApp := true })
in some places, to recover the old behaviour@[eqns]
to manually adjust the equation lemmas for a particular definition, recovering the old behaviour just for that definition. See #8371, where we do this for Function.comp
and Function.flip
.This change in Lean may require further changes down the line (e.g. adding the !f
syntax, and/or upstreaming the special treatment for Function.comp
and Function.flip
, and/or removing this special treatment). Please keep an open and skeptical mind about these changes!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -29,8 +29,6 @@ open Complex UpperHalfPlane
open scoped UpperHalfPlane
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
-
local notation "GL(" n ", " R ")" "⁺" => Matrix.GLPos (Fin n) R
local notation "SL(" n ", " R ")" => Matrix.SpecialLinearGroup (Fin n) R
Due to recent changes in core we can reduce or remove many set_option maxHeartbeats
statements.
I have tried to be careful to not leave anything too close to the line, so don't be surprised if some of these can still be reduced further.
This reduces us from 96 maxHeartbeats
statements to 44
. (There are 10 false positives in meta or testing code.)
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -221,7 +221,6 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
ring
#align modular_form.mul_slash ModularForm.mul_slash
-set_option maxHeartbeats 600000 in
-- @[simp] -- Porting note: simpNF says LHS simplifies to something more complex
theorem mul_slash_SL2 (k1 k2 : ℤ) (A : SL(2, ℤ)) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = f ∣[k1] A * g ∣[k2] A :=
@@ -221,7 +221,7 @@ theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
ring
#align modular_form.mul_slash ModularForm.mul_slash
-set_option maxHeartbeats 1000000 in
+set_option maxHeartbeats 600000 in
-- @[simp] -- Porting note: simpNF says LHS simplifies to something more complex
theorem mul_slash_SL2 (k1 k2 : ℤ) (A : SL(2, ℤ)) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = f ∣[k1] A * g ∣[k2] A :=
@@ -134,7 +134,7 @@ private theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c :
simp_rw [← smul_one_smul ℂ c f, ← smul_one_smul ℂ c (f ∣[k]A)]
ext1
simp_rw [slash]
- simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.det_apply_val, Pi.smul_apply]
+ simp only [slash, Algebra.id.smul_eq_mul, Matrix.GeneralLinearGroup.val_det_apply, Pi.smul_apply]
ring
private theorem zero_slash (k : ℤ) (A : GL(2, ℝ)⁺) : (0 : ℍ → ℂ) ∣[k]A = 0 :=
@@ -204,7 +204,7 @@ theorem slash_action_eq'_iff (k : ℤ) (Γ : Subgroup SL(2, ℤ)) (f : ℍ →
theorem mul_slash (k1 k2 : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] A = ((↑ₘA).det : ℝ) • f ∣[k1] A * g ∣[k2] A := by
ext1 x
- simp only [slash_def, slash, Matrix.GeneralLinearGroup.det_apply_val,
+ simp only [slash_def, slash, Matrix.GeneralLinearGroup.val_det_apply,
Pi.mul_apply, Pi.smul_apply, Algebra.smul_mul_assoc, real_smul]
set d : ℂ := ↑((↑ₘA).det : ℝ)
have h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1) := by
MulZeroClass.
in mul_zero
/zero_mul
(#6682)
Search&replace MulZeroClass.mul_zero
-> mul_zero
, MulZeroClass.zero_mul
-> zero_mul
.
These were introduced by Mathport, as the full name of mul_zero
is actually MulZeroClass.mul_zero
(it's exported with the short name).
@@ -138,7 +138,7 @@ private theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c :
ring
private theorem zero_slash (k : ℤ) (A : GL(2, ℝ)⁺) : (0 : ℍ → ℂ) ∣[k]A = 0 :=
- funext fun _ => by simp only [slash, Pi.zero_apply, MulZeroClass.zero_mul]
+ funext fun _ => by simp only [slash, Pi.zero_apply, zero_mul]
instance : SlashAction ℤ GL(2, ℝ)⁺ (ℍ → ℂ) ℂ where
map := slash
⬝
notation in favor of HMul
(#6487)
The main difficulty here is that *
has a slightly difference precedence to ⬝
. notably around smul
and neg
.
The other annoyance is that ↑U ⬝ A ⬝ ↑U⁻¹ : Matrix m m 𝔸
now has to be written U.val * A * (U⁻¹).val
in order to typecheck.
A downside of this change to consider: if you have a goal of A * (B * C) = (A * B) * C
, mul_assoc
now gives the illusion of matching, when in fact Matrix.mul_assoc
is needed. Previously the distinct symbol made it easy to avoid this mistake.
On the flipside, there is now no need to rewrite by Matrix.mul_eq_mul
all the time (indeed, the lemma is now removed).
@@ -108,7 +108,7 @@ private theorem slash_mul (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
have e3 : (A * B) • x = A • B • x := by convert UpperHalfPlane.mul_smul' A B x
rw [e3]
simp only [UpperHalfPlane.num, UpperHalfPlane.denom, ofReal_mul, Subgroup.coe_mul,
- UpperHalfPlane.coe_smul, Units.val_mul, Matrix.mul_eq_mul, Matrix.det_mul,
+ UpperHalfPlane.coe_smul, Units.val_mul, Matrix.det_mul,
UpperHalfPlane.smulAux, UpperHalfPlane.smulAux', UpperHalfPlane.coe_mk] at *
field_simp
have : (((↑(↑A : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ) *
@@ -181,9 +181,7 @@ set_option linter.uppercaseLean3 false in
/-- The constant function 1 is invariant under any element of `SL(2, ℤ)`. -/
-- @[simp] -- Porting note: simpNF says LHS simplifies to something more complex
theorem is_invariant_one (A : SL(2, ℤ)) : (1 : ℍ → ℂ) ∣[(0 : ℤ)] A = (1 : ℍ → ℂ) := by
- have : ((↑ₘ(A : GL(2, ℝ)⁺)).det : ℝ) = 1 := by
- simp only [Matrix.SpecialLinearGroup.coe_GLPos_coe_GL_coe_matrix,
- Matrix.SpecialLinearGroup.det_coe]
+ have : ((↑ₘ(A : GL(2, ℝ)⁺)).det : ℝ) = 1 := det_coe'
funext
rw [SL_slash, slash_def, slash, zero_sub, this]
simp
@@ -197,8 +195,7 @@ theorem slash_action_eq'_iff (k : ℤ) (Γ : Subgroup SL(2, ℤ)) (f : ℍ →
simp only [subgroup_slash, slash_def, ModularForm.slash]
convert inv_mul_eq_iff_eq_mul₀ (G₀ := ℂ) _ using 2
· rw [mul_comm]
- simp only [denom, Matrix.SpecialLinearGroup.coe_GLPos_coe_GL_coe_matrix, zpow_neg,
- Matrix.SpecialLinearGroup.det_coe, ofReal_one, one_zpow, mul_one, subgroup_to_sl_moeb,
+ simp only [denom, zpow_neg, det_coe', ofReal_one, one_zpow, mul_one, subgroup_to_sl_moeb,
sl_moeb]
rfl
· convert zpow_ne_zero k (denom_ne_zero γ z)
@@ -232,10 +229,8 @@ theorem mul_slash_SL2 (k1 k2 : ℤ) (A : SL(2, ℤ)) (f g : ℍ → ℂ) :
(f * g) ∣[k1 + k2] (A : GL(2, ℝ)⁺) =
((↑ₘA).det : ℝ) • f ∣[k1] A * g ∣[k2] A := by
apply mul_slash
- _ = (1 : ℝ) • f ∣[k1] A * g ∣[k2] A := by
- simp only [Matrix.SpecialLinearGroup.coe_GLPos_coe_GL_coe_matrix,
- Matrix.SpecialLinearGroup.det_coe]
- _ = f ∣[k1] A * g ∣[k2] A := by simp
+ _ = (1 : ℝ) • f ∣[k1] A * g ∣[k2] A := by rw [det_coe']
+ _ = f ∣[k1] A * g ∣[k2] A := by rw [one_smul]
set_option linter.uppercaseLean3 false in
#align modular_form.mul_slash_SL2 ModularForm.mul_slash_SL2
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -42,7 +42,7 @@ local notation:1024 "↑ₘ[" R "]" A:1024 =>
((A : GL (Fin 2) R) : Matrix (Fin 2) (Fin 2) R)
/-- A general version of the slash action of the space of modular forms.-/
-class SlashAction (β G α γ : Type _) [Group G] [AddMonoid α] [SMul γ α] where
+class SlashAction (β G α γ : Type*) [Group G] [AddMonoid α] [SMul γ α] where
map : β → G → α → α
zero_slash : ∀ (k : β) (g : G), map k g 0 = 0
slash_one : ∀ (k : β) (a : α), map k 1 a = a
@@ -58,14 +58,14 @@ scoped[ModularForm] notation:100 f " ∣[" k "] " a:100 => SlashAction.map ℂ k
open scoped ModularForm
@[simp]
-theorem SlashAction.neg_slash {β G α γ : Type _} [Group G] [AddGroup α] [SMul γ α]
+theorem SlashAction.neg_slash {β G α γ : Type*} [Group G] [AddGroup α] [SMul γ α]
[SlashAction β G α γ] (k : β) (g : G) (a : α) : (-a) ∣[k;γ] g = -a ∣[k;γ] g :=
eq_neg_of_add_eq_zero_left <| by
rw [← SlashAction.add_slash, add_left_neg, SlashAction.zero_slash]
#align slash_action.neg_slash SlashAction.neg_slash
@[simp]
-theorem SlashAction.smul_slash_of_tower {R β G α : Type _} (γ : Type _) [Group G] [AddGroup α]
+theorem SlashAction.smul_slash_of_tower {R β G α : Type*} (γ : Type*) [Group G] [AddGroup α]
[Monoid γ] [MulAction γ α] [SMul R γ] [SMul R α] [IsScalarTower R γ α] [SlashAction β G α γ]
(k : β) (g : G) (a : α) (r : R) : (r • a) ∣[k;γ] g = r • a ∣[k;γ] g := by
rw [← smul_one_smul γ r a, SlashAction.smul_slash, smul_one_smul]
@@ -75,7 +75,7 @@ attribute [simp] SlashAction.zero_slash SlashAction.slash_one SlashAction.smul_s
SlashAction.add_slash
/-- Slash_action induced by a monoid homomorphism.-/
-def monoidHomSlashAction {β G H α γ : Type _} [Group G] [AddMonoid α] [SMul γ α] [Group H]
+def monoidHomSlashAction {β G H α γ : Type*} [Group G] [AddMonoid α] [SMul γ α] [Group H]
[SlashAction β G α γ] (h : H →* G) : SlashAction β H α γ where
map k g := SlashAction.map γ k (h g)
zero_slash k g := SlashAction.zero_slash k (h g)
@@ -127,7 +127,7 @@ private theorem add_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f g : ℍ → ℂ) :
private theorem slash_one (k : ℤ) (f : ℍ → ℂ) : f ∣[k]1 = f :=
funext <| by simp [slash, denom]
-variable {α : Type _} [SMul α ℂ] [IsScalarTower α ℂ ℂ]
+variable {α : Type*} [SMul α ℂ] [IsScalarTower α ℂ ℂ]
private theorem smul_slash (k : ℤ) (A : GL(2, ℝ)⁺) (f : ℍ → ℂ) (c : α) :
(c • f) ∣[k]A = c • f ∣[k]A := by
@@ -29,7 +29,7 @@ open Complex UpperHalfPlane
open scoped UpperHalfPlane
-local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue #2220
+local macro_rules | `($x ^ $y) => `(HPow.hPow $x $y) -- Porting note: See issue lean4#2220
local notation "GL(" n ", " R ")" "⁺" => Matrix.GLPos (Fin n) R
@@ -2,16 +2,13 @@
Copyright (c) 2022 Chris Birkbeck. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Birkbeck
-
-! This file was ported from Lean 3 source module number_theory.modular_forms.slash_actions
-! leanprover-community/mathlib commit 738054fa93d43512da144ec45ce799d18fd44248
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Analysis.Complex.UpperHalfPlane.Basic
import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup
import Mathlib.LinearAlgebra.Matrix.SpecialLinearGroup
+#align_import number_theory.modular_forms.slash_actions from "leanprover-community/mathlib"@"738054fa93d43512da144ec45ce799d18fd44248"
+
/-!
# Slash actions
Also define UpperHalfPlane.coe
so that type synonym doesn't leak through API.
@@ -112,7 +112,7 @@ private theorem slash_mul (k : ℤ) (A B : GL(2, ℝ)⁺) (f : ℍ → ℂ) :
rw [e3]
simp only [UpperHalfPlane.num, UpperHalfPlane.denom, ofReal_mul, Subgroup.coe_mul,
UpperHalfPlane.coe_smul, Units.val_mul, Matrix.mul_eq_mul, Matrix.det_mul,
- UpperHalfPlane.smulAux, UpperHalfPlane.smulAux', Subtype.coe_mk] at *
+ UpperHalfPlane.smulAux, UpperHalfPlane.smulAux', UpperHalfPlane.coe_mk] at *
field_simp
have : (((↑(↑A : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ) *
((↑(↑B : GL (Fin 2) ℝ) : Matrix (Fin 2) (Fin 2) ℝ).det : ℂ)) ^ (k - 1) =
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file