Theorem: Sylow.normalizer_sup_eq_top
File: Mathlib/GroupTheory/Sylow.lean

tactic: refine' top_le_iff.mp fun g _ => _
state_before: p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
⊢ normalizer (map (Subgroup.subtype N) ↑P) ⊔ N = ⊤

tactic: obtain ⟨n, hn⟩ := exists_smul_eq N ((MulAut.conjNormal g : MulAut N) • P) P
state_before: p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
g : G
x✝ : g ∈ ⊤
⊢ g ∈ normalizer (map (Subgroup.subtype N) ↑P) ⊔ N

tactic: rw [← inv_mul_cancel_left (↑n) g, sup_comm]
state_before: case intro
p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
g : G
x✝ : g ∈ ⊤
n : { x // x ∈ N }
hn : n • ↑MulAut.conjNormal g • P = P
⊢ g ∈ normalizer (map (Subgroup.subtype N) ↑P) ⊔ N

tactic: apply mul_mem_sup (N.inv_mem n.2)
state_before: case intro
p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
g : G
x✝ : g ∈ ⊤
n : { x // x ∈ N }
hn : n • ↑MulAut.conjNormal g • P = P
⊢ (↑n)⁻¹ * (↑n * g) ∈ N ⊔ normalizer (map (Subgroup.subtype N) ↑P)

tactic: rw [Sylow.smul_def, ← mul_smul, ← MulAut.conjNormal_val, ← MulAut.conjNormal.map_mul,
  Sylow.ext_iff, Sylow.pointwise_smul_def, Subgroup.pointwise_smul_def] at hn
state_before: case intro
p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
g : G
x✝ : g ∈ ⊤
n : { x // x ∈ N }
hn : n • ↑MulAut.conjNormal g • P = P
⊢ ↑n * g ∈ normalizer (map (Subgroup.subtype N) ↑P)

tactic: refine' fun x =>
  (mem_map_iff_mem
          (show Function.Injective (MulAut.conj (↑n * g)).toMonoidHom from
            (MulAut.conj (↑n * g)).injective)).symm.trans
    _
state_before: case intro
p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
g : G
x✝ : g ∈ ⊤
n : { x // x ∈ N }
hn✝ : (↑MulAut.conj n * ↑MulAut.conjNormal g) • P = P
hn :
  map
      (↑(MulDistribMulAction.toMonoidEnd ((fun x => MulAut { x // x ∈ N }) n) { x // x ∈ N })
        (↑MulAut.conjNormal (↑n * g)))
      ↑P =
    ↑P
⊢ ↑n * g ∈ normalizer (map (Subgroup.subtype N) ↑P)

tactic: rw [map_map, ← congr_arg (map N.subtype) hn, map_map]
state_before: case intro
p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
g : G
x✝ : g ∈ ⊤
n : { x // x ∈ N }
hn✝ : (↑MulAut.conj n * ↑MulAut.conjNormal g) • P = P
hn :
  map
      (↑(MulDistribMulAction.toMonoidEnd ((fun x => MulAut { x // x ∈ N }) n) { x // x ∈ N })
        (↑MulAut.conjNormal (↑n * g)))
      ↑P =
    ↑P
x : G
⊢ ↑(MulEquiv.toMonoidHom (↑MulAut.conj (↑n * g))) x ∈
      map (MulEquiv.toMonoidHom (↑MulAut.conj (↑n * g))) (map (Subgroup.subtype N) ↑P) ↔
    ↑n * g * x * (↑n * g)⁻¹ ∈ map (Subgroup.subtype N) ↑P

tactic: rfl
state_before: case intro
p✝ : ℕ
G : Type u_1
inst✝³ : Group G
p : ℕ
inst✝² : Fact (Nat.Prime p)
N : Subgroup G
inst✝¹ : Normal N
inst✝ : Finite (Sylow p { x // x ∈ N })
P : Sylow p { x // x ∈ N }
g : G
x✝ : g ∈ ⊤
n : { x // x ∈ N }
hn✝ : (↑MulAut.conj n * ↑MulAut.conjNormal g) • P = P
hn :
  map
      (↑(MulDistribMulAction.toMonoidEnd ((fun x => MulAut { x // x ∈ N }) n) { x // x ∈ N })
        (↑MulAut.conjNormal (↑n * g)))
      ↑P =
    ↑P
x : G
⊢ ↑(MulEquiv.toMonoidHom (↑MulAut.conj (↑n * g))) x ∈
      map (MonoidHom.comp (MulEquiv.toMonoidHom (↑MulAut.conj (↑n * g))) (Subgroup.subtype N)) ↑P ↔
    ↑n * g * x * (↑n * g)⁻¹ ∈
      map
        (MonoidHom.comp (Subgroup.subtype N)
          (↑(MulDistribMulAction.toMonoidEnd ((fun x => MulAut { x // x ∈ N }) n) { x // x ∈ N })
            (↑MulAut.conjNormal (↑n * g))))
        ↑P