Theorem: Polynomial.Monic.irreducible_of_irreducible_map
File: Mathlib/Algebra/Polynomial/RingDivision.lean

Proof steps:
state_before: R : Type u
S : Type v
T : Type w
a b : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.Monic
h_irr : Irreducible (Polynomial.map φ f)
⊢ Irreducible f
state_after: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.Monic
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
⊢ IsUnit a ∨ IsUnit b
tactic: refine ⟨h_irr.not_unit ∘ IsUnit.map (mapRingHom φ), fun a b h => ?_⟩
state_before: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.Monic
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
⊢ IsUnit a ∨ IsUnit b
state_after: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
⊢ IsUnit a ∨ IsUnit b
tactic: dsimp [Monic] at h_mon
state_before: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
⊢ IsUnit a ∨ IsUnit b
state_after: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = (a * b).leadingCoeff
⊢ IsUnit a ∨ IsUnit b
tactic: have q := (leadingCoeff_mul a b).symm
state_before: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = (a * b).leadingCoeff
⊢ IsUnit a ∨ IsUnit b
state_after: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = 1
⊢ IsUnit a ∨ IsUnit b
tactic: rw [← h, h_mon] at q
state_before: R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = 1
⊢ IsUnit a ∨ IsUnit b
state_after: case refine_1.hf.h
R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = 1
⊢ a.leadingCoeff * ?refine_1.hf.b = 1

case refine_1.hf.b
R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = 1
⊢ R

case refine_2.hf.h
R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = 1
⊢ b.leadingCoeff * ?refine_2.hf.b = 1

case refine_2.hf.b
R : Type u
S : Type v
T : Type w
a✝ b✝ : R
n : ℕ
inst✝³ : CommRing R
inst✝² : IsDomain R
inst✝¹ : CommRing S
inst✝ : IsDomain S
φ : R →+* S
f : R[X]
h_mon : f.leadingCoeff = 1
h_irr : Irreducible (Polynomial.map φ f)
a b : R[X]
h : f = a * b
q : a.leadingCoeff * b.leadingCoeff = 1
⊢ R
tactic: refine (h_irr.isUnit_or_isUnit <|
    (congr_arg (Polynomial.map φ) h).trans (Polynomial.map_mul φ)).imp ?_ ?_ <;>
      apply isUnit_of_isUnit_leadingCoeff_of_isUnit_map <;>
    apply isUnit_of_mul_eq_one