Theorem: ModularForm.mul_slash
File: Mathlib/NumberTheory/ModularForms/SlashActions.lean

tactic: ext1 x
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
⊢ (f * g) ∣[k1 + k2] A = (↑↑A).det • f ∣[k1] A * g ∣[k2] A
state_after: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
⊢ ((f * g) ∣[k1 + k2] A) x = ((↑↑A).det • f ∣[k1] A * g ∣[k2] A) x

tactic: simp only [slash_def, slash, Matrix.GeneralLinearGroup.val_det_apply,
  Pi.mul_apply, Pi.smul_apply, Algebra.smul_mul_assoc, real_smul]
state_before: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
⊢ ((f * g) ∣[k1 + k2] A) x = ((↑↑A).det • f ∣[k1] A * g ∣[k2] A) x
state_after: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
⊢ f (A • x) * g (A • x) * ↑(↑↑A).det ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    ↑(↑↑A).det * (f (A • x) * ↑(↑↑A).det ^ (k1 - 1) * denom A x ^ (-k1)) *
      (g (A • x) * ↑(↑↑A).det ^ (k2 - 1) * denom A x ^ (-k2))

tactic: set d : ℂ := ↑((↑ₘA).det : ℝ)
state_before: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
⊢ f (A • x) * g (A • x) * ↑(↑↑A).det ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    ↑(↑↑A).det * (f (A • x) * ↑(↑↑A).det ^ (k1 - 1) * denom A x ^ (-k1)) *
      (g (A • x) * ↑(↑↑A).det ^ (k2 - 1) * denom A x ^ (-k2))
state_after: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ f (A • x) * g (A • x) * d ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))

tactic: have h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1) := by
  have : d ≠ 0 := by
    dsimp [d]
    norm_cast
    exact Matrix.GLPos.det_ne_zero A
  rw [← zpow_one_add₀ this, ← zpow_add₀ this]
  congr; ring
state_before: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ f (A • x) * g (A • x) * d ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))
state_after: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
⊢ f (A • x) * g (A • x) * d ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))

tactic: have h22 : denom A x ^ (-(k1 + k2)) = denom A x ^ (-k1) * denom A x ^ (-k2) := by
  rw [Int.neg_add, zpow_add₀]
  exact UpperHalfPlane.denom_ne_zero A x
state_before: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
⊢ f (A • x) * g (A • x) * d ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))
state_after: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
h22 : denom A x ^ (-(k1 + k2)) = denom A x ^ (-k1) * denom A x ^ (-k2)
⊢ f (A • x) * g (A • x) * d ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))

tactic: rw [h1, h22]
state_before: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
h22 : denom A x ^ (-(k1 + k2)) = denom A x ^ (-k1) * denom A x ^ (-k2)
⊢ f (A • x) * g (A • x) * d ^ (k1 + k2 - 1) * denom A x ^ (-(k1 + k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))
state_after: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
h22 : denom A x ^ (-(k1 + k2)) = denom A x ^ (-k1) * denom A x ^ (-k2)
⊢ f (A • x) * g (A • x) * (d * d ^ (k1 - 1) * d ^ (k2 - 1)) * (denom A x ^ (-k1) * denom A x ^ (-k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))

tactic: ring
state_before: case h
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
h22 : denom A x ^ (-(k1 + k2)) = denom A x ^ (-k1) * denom A x ^ (-k2)
⊢ f (A • x) * g (A • x) * (d * d ^ (k1 - 1) * d ^ (k2 - 1)) * (denom A x ^ (-k1) * denom A x ^ (-k2)) =
    d * (f (A • x) * d ^ (k1 - 1) * denom A x ^ (-k1)) * (g (A • x) * d ^ (k2 - 1) * denom A x ^ (-k2))
state_after: no goals

tactic: have : d ≠ 0 := by
  dsimp [d]
  norm_cast
  exact Matrix.GLPos.det_ne_zero A
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
state_after: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
this : d ≠ 0
⊢ d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)

tactic: rw [← zpow_one_add₀ this, ← zpow_add₀ this]
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
this : d ≠ 0
⊢ d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
state_after: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
this : d ≠ 0
⊢ d ^ (k1 + k2 - 1) = d ^ (1 + (k1 - 1) + (k2 - 1))

tactic: congr
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
this : d ≠ 0
⊢ d ^ (k1 + k2 - 1) = d ^ (1 + (k1 - 1) + (k2 - 1))
state_after: case e_a
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
this : d ≠ 0
⊢ k1 + k2 - 1 = 1 + (k1 - 1) + (k2 - 1)

tactic: ring
state_before: case e_a
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
this : d ≠ 0
⊢ k1 + k2 - 1 = 1 + (k1 - 1) + (k2 - 1)
state_after: no goals

tactic: dsimp [d]
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ d ≠ 0
state_after: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ ¬↑(↑↑A).det = 0

tactic: norm_cast
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ ¬↑(↑↑A).det = 0
state_after: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ ¬(↑↑A).det = 0

tactic: exact Matrix.GLPos.det_ne_zero A
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
⊢ ¬(↑↑A).det = 0
state_after: no goals

tactic: rw [Int.neg_add, zpow_add₀]
state_before: Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
⊢ denom A x ^ (-(k1 + k2)) = denom A x ^ (-k1) * denom A x ^ (-k2)
state_after: case ha
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
⊢ denom A x ≠ 0

tactic: exact UpperHalfPlane.denom_ne_zero A x
state_before: case ha
Γ : Subgroup SL(2, ℤ)
k : ℤ
f✝ : ℍ → ℂ
k1 k2 : ℤ
A : ↥GL(2, ℝ)⁺
f g : ℍ → ℂ
x : ℍ
d : ℂ := ↑(↑↑A).det
h1 : d ^ (k1 + k2 - 1) = d * d ^ (k1 - 1) * d ^ (k2 - 1)
⊢ denom A x ≠ 0
state_after: no goals