Theorem: Algebra.norm_eq_prod_embeddings_gen
File: Mathlib/RingTheory/Norm.lean

tactic: letI := Classical.decEq F
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
⊢ (algebraMap R F) ((norm R) pb.gen) = ∏ σ : S →ₐ[R] F, σ pb.gen
state_after: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
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]
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ (algebraMap R F) ((norm R) pb.gen) = ∏ σ : S →ₐ[R] F, σ pb.gen
state_after: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
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) ?_]
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).prod = ∏ σ : S →ₐ[R] F, σ pb.gen
state_after: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
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
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : S →ₐ[R] F), (fun σ => σ pb.gen) x = (fun x => ↑x) (pb.liftEquiv' x)

tactic: rw [Finset.prod_mem_multiset, Finset.prod_eq_multiset_prod, Multiset.toFinset_val,
  Multiset.dedup_eq_self.mpr, Multiset.map_id]
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).prod = ∏ x : { y // y ∈ (minpoly R pb.gen).aroots F }, ↑x
state_after: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).Nodup

case hfg
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : { x // x ∈ (minpoly R pb.gen).aroots F }), ↑x = _root_.id ↑x

tactic: exact nodup_roots hfx.map
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ((minpoly R pb.gen).aroots F).Nodup
state_after: no goals

tactic: intro x
state_before: case hfg
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : { x // x ∈ (minpoly R pb.gen).aroots F }), ↑x = _root_.id ↑x
state_after: case hfg
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
x : { x // x ∈ (minpoly R pb.gen).aroots F }
⊢ ↑x = _root_.id ↑x

tactic: rfl
state_before: case hfg
R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
x : { x // x ∈ (minpoly R pb.gen).aroots F }
⊢ ↑x = _root_.id ↑x
state_after: no goals

tactic: intro σ
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
⊢ ∀ (x : S →ₐ[R] F), (fun σ => σ pb.gen) x = (fun x => ↑x) (pb.liftEquiv' x)
state_after: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
σ : S →ₐ[R] F
⊢ (fun σ => σ pb.gen) σ = (fun x => ↑x) (pb.liftEquiv' σ)

tactic: simp only [PowerBasis.liftEquiv'_apply_coe]
state_before: R : Type u_1
S : Type u_2
T : Type u_3
inst✝¹⁰ : CommRing R
inst✝⁹ : Ring S
inst✝⁸ : Algebra R S
K : Type u_4
L : Type u_5
F : Type u_6
inst✝⁷ : Field K
inst✝⁶ : Field L
inst✝⁵ : Field F
inst✝⁴ : Algebra K L
inst✝³ : Algebra K F
ι : Type w
E : Type u_7
inst✝² : Field E
inst✝¹ : Algebra K E
inst✝ : Algebra R F
pb : PowerBasis R S
hE : Splits (algebraMap R F) (minpoly R pb.gen)
hfx : (minpoly R pb.gen).Separable
this : DecidableEq F := Classical.decEq F
σ : S →ₐ[R] F
⊢ (fun σ => σ pb.gen) σ = (fun x => ↑x) (pb.liftEquiv' σ)
state_after: no goals