Theorem: SlashInvariantForm.vAdd_width_periodic
File: Mathlib/NumberTheory/ModularForms/Identities.lean

Proof steps:
state_before: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
⊢ f (↑N * ↑n +ᵥ z) = f z
state_after: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
⊢ f (↑(↑N * n) +ᵥ z) = f z
tactic: norm_cast
state_before: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
⊢ f (↑(↑N * n) +ᵥ z) = f z
state_after: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
⊢ f (ModularGroup.T ^ (↑N * n) • z) = f z
tactic: rw [← modular_T_zpow_smul z (N * n)]
state_before: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
⊢ f (ModularGroup.T ^ (↑N * n) • z) = f z
state_after: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma (↑N).natAbs
⊢ f (ModularGroup.T ^ (↑N * n) • z) = f z
tactic: have Hn := (ModularGroup_T_pow_mem_Gamma N (N * n) (by simp))
state_before: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma (↑N).natAbs
⊢ f (ModularGroup.T ^ (↑N * n) • z) = f z
state_after: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma N
⊢ f (ModularGroup.T ^ (↑N * n) • z) = f z
tactic: simp only [zpow_natCast, Int.natAbs_ofNat] at Hn
state_before: N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma N
⊢ f (ModularGroup.T ^ (↑N * n) • z) = f z
state_after: case h.e'_3
N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma N
⊢ f z = (↑(↑↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩ 1 0) * ↑z + ↑(↑↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩ 1 1)) ^ k * f z
tactic: convert (SlashInvariantForm.slash_action_eqn' k (Gamma N) f ⟨((ModularGroup.T ^ (N * n))), Hn⟩ z)
state_before: case h.e'_3
N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma N
⊢ f z = (↑(↑↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩ 1 0) * ↑z + ↑(↑↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩ 1 1)) ^ k * f z
state_after: case h.e'_3
N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma N
⊢ f z =
    (↑(↑{ val := ↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩, inv := ↑(↑⟨ModularGroup.T ^ (↑N * n), Hn⟩)⁻¹, val_inv := ⋯,
                    inv_val := ⋯ }
                1 0) *
            ↑z +
          ↑(↑{ val := ↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩, inv := ↑(↑⟨ModularGroup.T ^ (↑N * n), Hn⟩)⁻¹, val_inv := ⋯,
                  inv_val := ⋯ }
              1 1)) ^
        k *
      f z
tactic: unfold SpecialLinearGroup.coeToGL
state_before: case h.e'_3
N : ℕ
k n : ℤ
f : SlashInvariantForm (Gamma N) k
z : ℍ
Hn : ModularGroup.T ^ (↑N * n) ∈ Gamma N
⊢ f z =
    (↑(↑{ val := ↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩, inv := ↑(↑⟨ModularGroup.T ^ (↑N * n), Hn⟩)⁻¹, val_inv := ⋯,
                    inv_val := ⋯ }
                1 0) *
            ↑z +
          ↑(↑{ val := ↑↑⟨ModularGroup.T ^ (↑N * n), Hn⟩, inv := ↑(↑⟨ModularGroup.T ^ (↑N * n), Hn⟩)⁻¹, val_inv := ⋯,
                  inv_val := ⋯ }
              1 1)) ^
        k *
      f z
state_after: no goals
tactic: simp only [Fin.isValue, ModularGroup.coe_T_zpow (N * n), of_apply, cons_val', cons_val_zero,
    empty_val', cons_val_fin_one, cons_val_one, head_fin_const, Int.cast_zero, zero_mul, head_cons,
    Int.cast_one, zero_add, one_zpow, one_mul]