Theorem: MvPolynomial.isMaximal_iff_eq_vanishingIdeal_singleton
File: Mathlib/RingTheory/Nullstellensatz.lean

Proof steps:
state_before: k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
⊢ I.IsMaximal ↔ ∃ x, I = vanishingIdeal {x}
state_after: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
⊢ I.IsMaximal ↔ ∃ x, I = vanishingIdeal {x}
tactic: cases nonempty_fintype σ
state_before: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
⊢ I.IsMaximal ↔ ∃ x, I = vanishingIdeal {x}
state_after: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
⊢ ∃ x, I = vanishingIdeal {x}
tactic: refine
    ⟨fun hI => ?_, fun h =>
      let ⟨x, hx⟩ := h
      hx.symm ▸ MvPolynomial.vanishingIdeal_singleton_isMaximal⟩
state_before: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this : I.IsMaximal := hI
⊢ ∃ x, I = vanishingIdeal {x}
tactic: letI : I.IsMaximal := hI
state_before: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this : I.IsMaximal := hI
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
⊢ ∃ x, I = vanishingIdeal {x}
tactic: letI : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
state_before: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
⊢ ∃ x, I = vanishingIdeal {x}
tactic: let ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
state_before: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
⊢ ∃ x, I = vanishingIdeal {x}
tactic: have hϕ : Function.Bijective ϕ :=
    ⟨quotient_mk_comp_C_injective _ _ I hI.ne_top,
      IsAlgClosed.algebraMap_surjective_of_isIntegral' ϕ
        (MvPolynomial.comp_C_integral_of_surjective_of_jacobson _ Quotient.mk_surjective)⟩
state_before: case intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
⊢ ∃ x, I = vanishingIdeal {x}
tactic: obtain ⟨φ, hφ⟩ := Function.Surjective.hasRightInverse hϕ.2
state_before: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
⊢ ∃ x, I = vanishingIdeal {x}
tactic: let x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
state_before: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
⊢ ∃ x, I = vanishingIdeal {x}
tactic: have hx : ∀ s : σ, ϕ (x s) = (Ideal.Quotient.mk I) (X s) := fun s =>
    hφ ((Ideal.Quotient.mk I) (X s))
state_before: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
⊢ ∃ x, I = vanishingIdeal {x}
state_after: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
⊢ vanishingIdeal {x} ≤ I
tactic: refine ⟨x, (IsMaximal.eq_of_le (by infer_instance) hI.ne_top ?_).symm⟩
state_before: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
⊢ vanishingIdeal {x} ≤ I
state_after: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
p : MvPolynomial σ k
hp : p ∈ vanishingIdeal {x}
⊢ p ∈ I
tactic: intro p hp
state_before: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
p : MvPolynomial σ k
hp : p ∈ vanishingIdeal {x}
⊢ p ∈ I
state_after: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
p : MvPolynomial σ k
hp : p ∈ vanishingIdeal {x}
⊢ ∑ d ∈ p.support, ((Ideal.Quotient.mk I).comp C) (coeff d p) * ∏ i : σ, (Ideal.Quotient.mk I) (X i) ^ d i = 0
tactic: rw [← Quotient.eq_zero_iff_mem, map_mvPolynomial_eq_eval₂ (Ideal.Quotient.mk I) p, eval₂_eq']
state_before: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
p : MvPolynomial σ k
hp : p ∈ vanishingIdeal {x}
⊢ ∑ d ∈ p.support, ((Ideal.Quotient.mk I).comp C) (coeff d p) * ∏ i : σ, (Ideal.Quotient.mk I) (X i) ^ d i = 0
state_after: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
p : MvPolynomial σ k
hp : ∑ d ∈ p.support, coeff d p * ∏ i : σ, x i ^ d i = 0
⊢ ∑ d ∈ p.support, ((Ideal.Quotient.mk I).comp C) (coeff d p) * ∏ i : σ, (Ideal.Quotient.mk I) (X i) ^ d i = 0
tactic: rw [mem_vanishingIdeal_singleton_iff, eval_eq'] at hp
state_before: case intro.intro
k : Type u_1
inst✝² : Field k
σ : Type u_2
inst✝¹ : IsAlgClosed k
inst✝ : Finite σ
I : Ideal (MvPolynomial σ k)
val✝ : Fintype σ
hI : I.IsMaximal
this✝ : I.IsMaximal := hI
this : Field (MvPolynomial σ k ⧸ I) := Quotient.field I
ϕ : k →+* MvPolynomial σ k ⧸ I := (Ideal.Quotient.mk I).comp C
hϕ : Function.Bijective ⇑ϕ
φ : MvPolynomial σ k ⧸ I → k
hφ : Function.RightInverse φ ⇑ϕ
x : σ → k := fun s => φ ((Ideal.Quotient.mk I) (X s))
hx : ∀ (s : σ), ϕ (x s) = (Ideal.Quotient.mk I) (X s)
p : MvPolynomial σ k
hp : ∑ d ∈ p.support, coeff d p * ∏ i : σ, x i ^ d i = 0
⊢ ∑ d ∈ p.support, ((Ideal.Quotient.mk I).comp C) (coeff d p) * ∏ i : σ, (Ideal.Quotient.mk I) (X i) ^ d i = 0
state_after: no goals
tactic: simpa only [map_sum ϕ, ϕ.map_mul, map_prod ϕ, ϕ.map_pow, ϕ.map_zero, hx] using congr_arg ϕ hp