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

tactic: cases nonempty_fintype σ
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: 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 σ
⊢ 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: 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
⊢ ∃ 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 : 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
⊢ ∃ 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: 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
⊢ ∃ 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: 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
⊢ ∃ 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: obtain ⟨φ, hφ⟩ := Function.Surjective.hasRightInverse hϕ.2
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: 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, 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: 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))
⊢ ∃ 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: 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)
⊢ ∃ 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: 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)
⊢ 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: 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}
⊢ 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 [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 : 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: simpa only [map_sum ϕ, ϕ.map_mul, map_prod ϕ, ϕ.map_pow, ϕ.map_zero, hx] using congr_arg ϕ 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: infer_instance
state_before: 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}).IsMaximal
state_after: no goals