-- Mathlib/NumberTheory/Cyclotomic/Gal.lean
theorem autToPow_injective : Function.Injective <| hμ.autToPow K

Proof state:
case e_self.e_self
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : hf'.choose ≡ hg'.choose [MOD ↑n]
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ hf'.choose ≡ hg'.choose [MOD orderOf hμ.toRootsOfUnity]

Tactic:
convert hfg

Result:
case h.e'_1
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : hf'.choose ≡ hg'.choose [MOD ↑n]
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ orderOf hμ.toRootsOfUnity = ↑n

Proof state:
case h.e'_1
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : hf'.choose ≡ hg'.choose [MOD ↑n]
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ orderOf hμ.toRootsOfUnity = ↑n

Tactic:
conv => enter [2]; rw [hμ.eq_orderOf, ← hμ.val_toRootsOfUnity_coe]

Result:
case h.e'_1
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : hf'.choose ≡ hg'.choose [MOD ↑n]
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ orderOf hμ.toRootsOfUnity = orderOf ↑↑hμ.toRootsOfUnity

Proof state:
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : ↑hf'.choose = ↑hg'.choose
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ f = g

Tactic:
suffices f (hμ.toRootsOfUnity : Lˣ) = g (hμ.toRootsOfUnity : Lˣ) by
  apply AlgEquiv.coe_algHom_injective
  apply (hμ.powerBasis K).algHom_ext
  exact this

Result:
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : ↑hf'.choose = ↑hg'.choose
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ f ↑↑hμ.toRootsOfUnity = g ↑↑hμ.toRootsOfUnity

Proof state:
case h.e'_1
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : hf'.choose ≡ hg'.choose [MOD ↑n]
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ orderOf hμ.toRootsOfUnity = orderOf ↑↑hμ.toRootsOfUnity

Tactic:
rw [orderOf_units, Subgroup.orderOf_coe]

Result:
no goals

Proof state:
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : ↑hf'.choose = ↑hg'.choose
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ f ↑↑hμ.toRootsOfUnity = g ↑↑hμ.toRootsOfUnity

Tactic:
rw [ZMod.eq_iff_modEq_nat] at hfg

Result:
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : hf'.choose ≡ hg'.choose [MOD ↑n]
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ f ↑↑hμ.toRootsOfUnity = g ↑↑hμ.toRootsOfUnity

Proof state:
case a
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : ↑hf'.choose = ↑hg'.choose
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
this : f ↑↑hμ.toRootsOfUnity = g ↑↑hμ.toRootsOfUnity
⊢ ↑f = ↑g

Tactic:
apply (hμ.powerBasis K).algHom_ext

Result:
case a.h
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : ↑hf'.choose = ↑hg'.choose
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
this : f ↑↑hμ.toRootsOfUnity = g ↑↑hμ.toRootsOfUnity
⊢ ↑f (IsPrimitiveRoot.powerBasis K hμ).gen = ↑g (IsPrimitiveRoot.powerBasis K hμ).gen

Proof state:
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : ↑hf'.choose = ↑hg'.choose
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
⊢ f = g

Tactic:
have hg := hg'.choose_spec

Result:
n : ℕ+
K : Type u_1
inst✝⁴ : Field K
L : Type u_2
μ : L
inst✝³ : CommRing L
inst✝² : IsDomain L
hμ : IsPrimitiveRoot μ ↑n
inst✝¹ : Algebra K L
inst✝ : IsCyclotomicExtension {n} K L
f g : L ≃ₐ[K] L
hn₀ : NeZero ↑n
hf' : ∃ m, f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hg' : ∃ m, g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ m
hfg : ↑hf'.choose = ↑hg'.choose
hf : f ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hf'.choose
hg : g ↑↑hμ.toRootsOfUnity = ↑↑hμ.toRootsOfUnity ^ hg'.choose
⊢ f = g