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

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
⊢ ((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: 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
⊢ ((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: 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
⊢ ((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: 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')
⊢ ((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 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
⊢ ((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: 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)
⊢ ((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: 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)
⊢ ((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: 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).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: 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)
⊢ ((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: 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
⊢ ((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: 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
⊢ 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: obtain ⟨z, rfl⟩ := Quotient.mk_surjective x
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: rwa [Quotient.eq_zero_iff_mem, mem_comap, hPJ, mem_comap, coe_mapRingHom, map_C]
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: rw [comap_map_of_surjective _ hf]
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
⊢ P = comap f (map f P)
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
⊢ P = P ⊔ comap f ⊥

tactic: refine le_antisymm (le_sup_of_le_left le_rfl) (sup_le le_rfl ?_)
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
⊢ P = P ⊔ comap f ⊥
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
⊢ comap f ⊥ ≤ P

tactic: refine fun p hp =>
  polynomial_mem_ideal_of_coeff_mem_ideal P p fun n => Quotient.eq_zero_iff_mem.mp ?_
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
⊢ comap f ⊥ ≤ P
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
p : R[X]
hp : p ∈ comap f ⊥
n : ℕ
⊢ (Quotient.mk (comap C P)) (p.coeff n) = 0

tactic: 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
p : R[X]
hp : p ∈ comap f ⊥
n : ℕ
⊢ (Quotient.mk (comap C P)) (p.coeff n) = 0
state_after: no goals

tactic: 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
⊢ IsJacobson (R ⧸ P')
state_after: no goals