Theorem: Ideal.Polynomial.quotient_mk_comp_C_isIntegral_of_jacobson
File: Mathlib/RingTheory/Jacobson.lean

Proof steps:
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
⊢ ((Quotient.mk P).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
⊢ ((Quotient.mk P).comp C).IsIntegral
tactic: let P' : Ideal R := P.comap C
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
⊢ ((Quotient.mk P).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
⊢ ((Quotient.mk P).comp C).IsIntegral
tactic: haveI : P'.IsPrime := comap_isPrime C P
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
⊢ ((Quotient.mk P).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
⊢ ((Quotient.mk P).comp C).IsIntegral
tactic: let f : R[X] →+* Polynomial (R ⧸ P') := Polynomial.mapRingHom (Quotient.mk P')
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
⊢ ((Quotient.mk P).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
⊢ ((Quotient.mk P).comp C).IsIntegral
tactic: have hf : Function.Surjective ↑f := map_surjective (Quotient.mk P') Quotient.mk_surjective
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
⊢ ((Quotient.mk P).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ ((Quotient.mk P).comp C).IsIntegral
tactic: have hPJ : P = (P.map f).comap f := by
    rw [comap_map_of_surjective _ hf]
    refine le_antisymm (le_sup_of_le_left le_rfl) (sup_le le_rfl ?_)
    refine fun p hp =>
      polynomial_mem_ideal_of_coeff_mem_ideal P p fun n => Quotient.eq_zero_iff_mem.mp ?_
    simpa only [f, coeff_map, coe_mapRingHom] using (Polynomial.ext_iff.mp hp) n
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ ((Quotient.mk P).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ ((quotientMap (map (mapRingHom (Quotient.mk (comap C P))) P) (mapRingHom (Quotient.mk (comap C P))) ⋯).comp
      ((Quotient.mk P).comp C)).IsIntegral
tactic: refine RingHom.IsIntegral.tower_bot _ _ (injective_quotient_le_comap_map P) ?_
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ ((quotientMap (map (mapRingHom (Quotient.mk (comap C P))) P) (mapRingHom (Quotient.mk (comap C P))) ⋯).comp
      ((Quotient.mk P).comp C)).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ (((Quotient.mk (map (mapRingHom (Quotient.mk (comap C P))) P)).comp C).comp (Quotient.mk (comap C P))).IsIntegral
tactic: rw [← quotient_mk_maps_eq]
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ (((Quotient.mk (map (mapRingHom (Quotient.mk (comap C P))) P)).comp C).comp (Quotient.mk (comap C P))).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ ((Quotient.mk (map (mapRingHom (Quotient.mk (comap C P))) P)).comp C).IsIntegral
tactic: refine ((Quotient.mk P').isIntegral_of_surjective Quotient.mk_surjective).trans _ _ ?_
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
⊢ ((Quotient.mk (map (mapRingHom (Quotient.mk (comap C P))) P)).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
⊢ ((Quotient.mk (map (mapRingHom (Quotient.mk (comap C P))) P)).comp C).IsIntegral
tactic: have : IsMaximal (map (mapRingHom (Quotient.mk (comap C P))) P) :=
    Or.recOn (map_eq_top_or_isMaximal_of_surjective f hf hP)
      (fun h => absurd (_root_.trans (h ▸ hPJ : P = comap f ⊤) comap_top : P = ⊤) hP.ne_top) id
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
⊢ ((Quotient.mk (map (mapRingHom (Quotient.mk (comap C P))) P)).comp C).IsIntegral
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
⊢ IsJacobson (R ⧸ P')

R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
x : R ⧸ P'
hx : C x ∈ map (mapRingHom (Quotient.mk (comap C P))) P
⊢ x = 0
tactic: apply quotient_mk_comp_C_isIntegral_of_jacobson' _ ?_ (fun x hx => ?_)
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
⊢ IsJacobson (R ⧸ P')

R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
x : R ⧸ P'
hx : C x ∈ map (mapRingHom (Quotient.mk (comap C P))) P
⊢ x = 0
state_after: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
x : R ⧸ P'
hx : C x ∈ map (mapRingHom (Quotient.mk (comap C P))) P
⊢ x = 0
tactic: any_goals exact Ideal.isJacobson_quotient
state_before: R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
x : R ⧸ P'
hx : C x ∈ map (mapRingHom (Quotient.mk (comap C P))) P
⊢ x = 0
state_after: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
z : R
hx : C ((Quotient.mk P') z) ∈ map (mapRingHom (Quotient.mk (comap C P))) P
⊢ (Quotient.mk P') z = 0
tactic: obtain ⟨z, rfl⟩ := Quotient.mk_surjective x
state_before: case intro
R : Type u_1
inst✝¹ : CommRing R
inst✝ : IsJacobson R
P : Ideal R[X]
hP : P.IsMaximal
P' : Ideal R := comap C P
this✝ : P'.IsPrime
f : R[X] →+* (R ⧸ P')[X] := mapRingHom (Quotient.mk P')
hf : Function.Surjective ⇑f
hPJ : P = comap f (map f P)
this : (map (mapRingHom (Quotient.mk (comap C P))) P).IsMaximal
z : R
hx : C ((Quotient.mk P') z) ∈ map (mapRingHom (Quotient.mk (comap C P))) P
⊢ (Quotient.mk P') z = 0
state_after: no goals
tactic: rwa [Quotient.eq_zero_iff_mem, mem_comap, hPJ, mem_comap, coe_mapRingHom, map_C]