-- Mathlib/RingTheory/Norm/Basic.lean
theorem norm_eq_prod_embeddings_gen [Algebra R F] (pb : PowerBasis R S)
    (hE : (minpoly R pb.gen).Splits (algebraMap R F)) (hfx : IsSeparable R pb.gen) :
    algebraMap R F (norm R pb.gen) =
      (@Finset.univ _ (PowerBasis.AlgHom.fintype pb)).prod fun σ => σ pb.gen

Proof state:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
σ : S →ₐ[R] F
⊢ (fun σ => σ pb.gen) σ = (fun x => ↑x) (pb.liftEquiv' σ)

Tactic:
simp only [PowerBasis.liftEquiv'_apply_coe]

Result:
no goals

Proof state:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).prod = ∏ x : { y // y ∈ (minpoly R pb.gen).aroots F }, ↑x

Tactic:
rw [Finset.prod_mem_multiset, Finset.prod_eq_multiset_prod, Multiset.toFinset_val,
  Multiset.dedup_eq_self.mpr, Multiset.map_id]

Result:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).Nodup

case hfg
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : { x // x ∈ (minpoly R pb.gen).aroots F }), ↑x = _root_.id ↑x

Proof state:
case hfg
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
x : { x // x ∈ (minpoly R pb.gen).aroots F }
⊢ ↑x = _root_.id ↑x

Tactic:
rfl

Result:
no goals

Proof state:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
⊢ (algebraMap R F) ((norm R) pb.gen) = ∏ σ : S →ₐ[R] F, σ pb.gen

Tactic:
letI := Classical.decEq F

Result:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ (algebraMap R F) ((norm R) pb.gen) = ∏ σ : S →ₐ[R] F, σ pb.gen

Proof state:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : S →ₐ[R] F), (fun σ => σ pb.gen) x = (fun x => ↑x) (pb.liftEquiv' x)

Tactic:
intro σ

Result:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
σ : S →ₐ[R] F
⊢ (fun σ => σ pb.gen) σ = (fun x => ↑x) (pb.liftEquiv' σ)

Proof state:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).Nodup

Tactic:
exact nodup_roots hfx.map

Result:
no goals

Proof state:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).prod = ∏ σ : S →ₐ[R] F, σ pb.gen

Tactic:
rw [@Fintype.prod_equiv (S →ₐ[R] F) _ _ (PowerBasis.AlgHom.fintype pb) _ _ pb.liftEquiv'
  (fun σ => σ pb.gen) (fun x => x) ?_]

Result:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).prod = ∏ x : { y // y ∈ (minpoly R pb.gen).aroots F }, ↑x

R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : S →ₐ[R] F), (fun σ => σ pb.gen) x = (fun x => ↑x) (pb.liftEquiv' x)

Proof state:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ (algebraMap R F) ((norm R) pb.gen) = ∏ σ : S →ₐ[R] F, σ pb.gen

Tactic:
rw [PowerBasis.norm_gen_eq_prod_roots pb hE]

Result:
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).prod = ∏ σ : S →ₐ[R] F, σ pb.gen

Proof state:
case hfg
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : { x // x ∈ (minpoly R pb.gen).aroots F }), ↑x = _root_.id ↑x

Tactic:
intro x

Result:
case hfg
R : Type u_1
S : Type u_2
inst✝⁴ : CommRing R
inst✝³ : Ring S
inst✝² : Algebra R S
F : Type u_6
inst✝¹ : Field F
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : IsSeparable R pb.gen
this : DecidableEq F := Classical.decEq F
x : { x // x ∈ (minpoly R pb.gen).aroots F }
⊢ ↑x = _root_.id ↑x