Theorem: minpoly.irreducible
File: Mathlib/FieldTheory/Minpoly/Basic.lean

tactic: refine' (irreducible_of_monic (monic hx) <| ne_one A x).2 fun f g hf hg he => _
state_before: A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
⊢ Irreducible (minpoly A x)

tactic: rw [← hf.isUnit_iff, ← hg.isUnit_iff]
state_before: A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
⊢ f = 1 ∨ g = 1

tactic: by_contra' h
state_before: A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
⊢ IsUnit f ∨ IsUnit g

tactic: have heval := congr_arg (Polynomial.aeval x) he
state_before: A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
h : ¬IsUnit f ∧ ¬IsUnit g
⊢ False

tactic: rw [aeval A x, aeval_mul, mul_eq_zero] at heval
state_before: A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
h : ¬IsUnit f ∧ ¬IsUnit g
heval : ↑(Polynomial.aeval x) (f * g) = ↑(Polynomial.aeval x) (minpoly A x)
⊢ False

tactic: cases' heval with heval heval
state_before: A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
h : ¬IsUnit f ∧ ¬IsUnit g
heval : ↑(Polynomial.aeval x) f = 0 ∨ ↑(Polynomial.aeval x) g = 0
⊢ False

tactic: exact aeval_ne_zero_of_dvdNotUnit_minpoly hx hf ⟨hf.ne_zero, g, h.2, he.symm⟩ heval
state_before: case inl
A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
h : ¬IsUnit f ∧ ¬IsUnit g
heval : ↑(Polynomial.aeval x) f = 0
⊢ False

tactic: refine' aeval_ne_zero_of_dvdNotUnit_minpoly hx hg ⟨hg.ne_zero, f, h.1, _⟩ heval
state_before: case inr
A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
h : ¬IsUnit f ∧ ¬IsUnit g
heval : ↑(Polynomial.aeval x) g = 0
⊢ False

tactic: rw [mul_comm, he]
state_before: case inr
A : Type u_1
B : Type u_2
B' : Type ?u.150283
inst✝⁴ : CommRing A
inst✝³ : Ring B
inst✝² : Algebra A B
x : B
inst✝¹ : IsDomain A
inst✝ : IsDomain B
hx : IsIntegral A x
f g : A[X]
hf : Monic f
hg : Monic g
he : f * g = minpoly A x
h : ¬IsUnit f ∧ ¬IsUnit g
heval : ↑(Polynomial.aeval x) g = 0
⊢ minpoly A x = g * f