[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ↑C a * ↑(monomial s) a' = ↑(monomial s) (a * a')
[PROOFSTEP]
show AddMonoidAlgebra.single _ _ * AddMonoidAlgebra.single _ _ = AddMonoidAlgebra.single _ _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ AddMonoidAlgebra.single 0 a * AddMonoidAlgebra.single s a' = AddMonoidAlgebra.single s (a * a')
[PROOFSTEP]
simp [C_apply, single_mul_single]
[GOAL]
R✝ : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ✝ : Type u_1
a a' a₁ a₂ : R✝
e : ℕ
n m : σ✝
s : σ✝ →₀ ℕ
inst✝³ : CommSemiring R✝
inst✝² : CommSemiring S₁
p q : MvPolynomial σ✝ R✝
R : Type u_2
inst✝¹ : CommSemiring R
σ : Type u_3
inst✝ : IsEmpty σ
⊢ Surjective ↑C
[PROOFSTEP]
refine' fun p => ⟨p.toFun 0, Finsupp.ext fun a => _⟩
[GOAL]
R✝ : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ✝ : Type u_1
a✝ a' a₁ a₂ : R✝
e : ℕ
n m : σ✝
s : σ✝ →₀ ℕ
inst✝³ : CommSemiring R✝
inst✝² : CommSemiring S₁
p✝ q : MvPolynomial σ✝ R✝
R : Type u_2
inst✝¹ : CommSemiring R
σ : Type u_3
inst✝ : IsEmpty σ
p : MvPolynomial σ R
a : σ →₀ ℕ
⊢ ↑(↑C (toFun p 0)) a = ↑p a
[PROOFSTEP]
simp only [C_apply, ← single_eq_monomial, (Finsupp.ext isEmptyElim (α := σ) : a = 0), single_eq_same]
[GOAL]
R✝ : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ✝ : Type u_1
a✝ a' a₁ a₂ : R✝
e : ℕ
n m : σ✝
s : σ✝ →₀ ℕ
inst✝³ : CommSemiring R✝
inst✝² : CommSemiring S₁
p✝ q : MvPolynomial σ✝ R✝
R : Type u_2
inst✝¹ : CommSemiring R
σ : Type u_3
inst✝ : IsEmpty σ
p : MvPolynomial σ R
a : σ →₀ ℕ
⊢ toFun p 0 = ↑p 0
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
n : ℕ
⊢ ↑C ↑n = ↑n
[PROOFSTEP]
induction n
[GOAL]
case zero
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ↑C ↑Nat.zero = ↑Nat.zero
[PROOFSTEP]
simp [Nat.succ_eq_add_one, *]
[GOAL]
case succ
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
n✝ : ℕ
n_ih✝ : ↑C ↑n✝ = ↑n✝
⊢ ↑C ↑(Nat.succ n✝) = ↑(Nat.succ n✝)
[PROOFSTEP]
simp [Nat.succ_eq_add_one, *]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ↑C a = a • 1
[PROOFSTEP]
rw [← C_mul', mul_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ X n ^ e = ↑(monomial (Finsupp.single n e)) 1
[PROOFSTEP]
simp [X, monomial_pow]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ↑(monomial (s + Finsupp.single n e)) a = ↑(monomial s) a * X n ^ e
[PROOFSTEP]
rw [X_pow_eq_monomial, monomial_mul, mul_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ↑(monomial (Finsupp.single n e + s)) a = X n ^ e * ↑(monomial s) a
[PROOFSTEP]
rw [X_pow_eq_monomial, monomial_mul, one_mul]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
s : σ
a : R
n : ℕ
⊢ ↑C a * X s ^ n = ↑(monomial (Finsupp.single s n)) a
[PROOFSTEP]
rw [← zero_add (Finsupp.single s n), monomial_add_single, C_apply]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
s : σ
a : R
⊢ ↑C a * X s = ↑(monomial (Finsupp.single s 1)) a
[PROOFSTEP]
rw [← C_mul_X_pow_eq_monomial, pow_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
α : Type u_2
s : Finset α
f : α → σ →₀ ℕ
a : R
⊢ ↑(monomial (∑ i in s, f i)) a = ↑C a * ∏ i in s, ↑(monomial (f i)) 1
[PROOFSTEP]
rw [← monomial_sum_one, C_mul', ← (monomial _).map_smul, smul_eq_mul, mul_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ↑(monomial s) a = ↑C a * Finsupp.prod s fun n e => X n ^ e
[PROOFSTEP]
simp only [X_pow_eq_monomial, ← monomial_finsupp_sum_index, Finsupp.sum_single]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
⊢ ∀ (s : σ →₀ ℕ) (a : R), M (↑(monomial s) a)
[PROOFSTEP]
intro s a
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
⊢ M (↑(monomial s) a)
[PROOFSTEP]
apply @Finsupp.induction σ ℕ _ _ s
[GOAL]
case h0
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
⊢ M (↑(monomial 0) a)
[PROOFSTEP]
show M (monomial 0 a)
[GOAL]
case h0
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
⊢ M (↑(monomial 0) a)
[PROOFSTEP]
exact h_C a
[GOAL]
case ha
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
⊢ ∀ (a_1 : σ) (b : ℕ) (f : σ →₀ ℕ),
    ¬a_1 ∈ f.support → b ≠ 0 → M (↑(monomial f) a) → M (↑(monomial (Finsupp.single a_1 b + f)) a)
[PROOFSTEP]
intro n e p _hpn _he ih
[GOAL]
case ha
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e ≠ 0
ih : M (↑(monomial p) a)
⊢ M (↑(monomial (Finsupp.single n e + p)) a)
[PROOFSTEP]
have : ∀ e : ℕ, M (monomial p a * X n ^ e) := by
  intro e
  induction e with
  | zero => simp [ih]
  | succ e e_ih => simp [ih, pow_succ', (mul_assoc _ _ _).symm, h_X, e_ih]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e ≠ 0
ih : M (↑(monomial p) a)
⊢ ∀ (e : ℕ), M (↑(monomial p) a * X n ^ e)
[PROOFSTEP]
intro e
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝¹ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e✝ : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e✝ ≠ 0
ih : M (↑(monomial p) a)
e : ℕ
⊢ M (↑(monomial p) a * X n ^ e)
[PROOFSTEP]
induction e with
| zero => simp [ih]
| succ e e_ih => simp [ih, pow_succ', (mul_assoc _ _ _).symm, h_X, e_ih]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝¹ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e✝ : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e✝ ≠ 0
ih : M (↑(monomial p) a)
e : ℕ
⊢ M (↑(monomial p) a * X n ^ e)
[PROOFSTEP]
induction e with
| zero => simp [ih]
| succ e e_ih => simp [ih, pow_succ', (mul_assoc _ _ _).symm, h_X, e_ih]
[GOAL]
case zero
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e ≠ 0
ih : M (↑(monomial p) a)
⊢ M (↑(monomial p) a * X n ^ Nat.zero)
[PROOFSTEP]

| zero => simp [ih]
[GOAL]
case zero
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e ≠ 0
ih : M (↑(monomial p) a)
⊢ M (↑(monomial p) a * X n ^ Nat.zero)
[PROOFSTEP]
simp [ih]
[GOAL]
case succ
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝¹ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e✝ : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e✝ ≠ 0
ih : M (↑(monomial p) a)
e : ℕ
e_ih : M (↑(monomial p) a * X n ^ e)
⊢ M (↑(monomial p) a * X n ^ Nat.succ e)
[PROOFSTEP]

| succ e e_ih => simp [ih, pow_succ', (mul_assoc _ _ _).symm, h_X, e_ih]
[GOAL]
case succ
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝¹ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e✝ : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e✝ ≠ 0
ih : M (↑(monomial p) a)
e : ℕ
e_ih : M (↑(monomial p) a * X n ^ e)
⊢ M (↑(monomial p) a * X n ^ Nat.succ e)
[PROOFSTEP]
simp [ih, pow_succ', (mul_assoc _ _ _).symm, h_X, e_ih]
[GOAL]
case ha
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e✝ : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
M : MvPolynomial σ R → Prop
h_C : ∀ (a : R), M (↑C a)
h_X : ∀ (p : MvPolynomial σ R) (n : σ), M p → M (p * X n)
s : σ →₀ ℕ
a : R
n : σ
e : ℕ
p : σ →₀ ℕ
_hpn : ¬n ∈ p.support
_he : e ≠ 0
ih : M (↑(monomial p) a)
this : ∀ (e : ℕ), M (↑(monomial p) a * X n ^ e)
⊢ M (↑(monomial (Finsupp.single n e + p)) a)
[PROOFSTEP]
simp [add_comm, monomial_add_single, this]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
P : MvPolynomial σ R → Prop
p : MvPolynomial σ R
h1 : ∀ (u : σ →₀ ℕ) (a : R), P (↑(monomial u) a)
h2 : ∀ (p q : MvPolynomial σ R), P p → P q → P (p + q)
this : P (↑(monomial 0) 0)
⊢ P 0
[PROOFSTEP]
rwa [monomial_zero] at this 
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
A : Type u_2
inst✝ : Semiring A
f g : MvPolynomial σ R →+* A
hC : ∀ (r : R), ↑f (↑C r) = ↑g (↑C r)
hX : ∀ (i : σ), ↑f (X i) = ↑g (X i)
⊢ f = g
[PROOFSTEP]
refine
  AddMonoidAlgebra.ringHom_ext' ?_
    ?_
      -- porting note: this has high priority, but Lean still chooses `RingHom.ext`, why?
        -- probably because of the type synonym
[GOAL]
case refine_1
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
A : Type u_2
inst✝ : Semiring A
f g : MvPolynomial σ R →+* A
hC : ∀ (r : R), ↑f (↑C r) = ↑g (↑C r)
hX : ∀ (i : σ), ↑f (X i) = ↑g (X i)
⊢ RingHom.comp f singleZeroRingHom = RingHom.comp g singleZeroRingHom
[PROOFSTEP]
ext x
[GOAL]
case refine_1.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
A : Type u_2
inst✝ : Semiring A
f g : MvPolynomial σ R →+* A
hC : ∀ (r : R), ↑f (↑C r) = ↑g (↑C r)
hX : ∀ (i : σ), ↑f (X i) = ↑g (X i)
x : R
⊢ ↑(RingHom.comp f singleZeroRingHom) x = ↑(RingHom.comp g singleZeroRingHom) x
[PROOFSTEP]
exact hC _
[GOAL]
case refine_2
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
A : Type u_2
inst✝ : Semiring A
f g : MvPolynomial σ R →+* A
hC : ∀ (r : R), ↑f (↑C r) = ↑g (↑C r)
hX : ∀ (i : σ), ↑f (X i) = ↑g (X i)
⊢ MonoidHom.comp (↑f) (of R (σ →₀ ℕ)) = MonoidHom.comp (↑g) (of R (σ →₀ ℕ))
[PROOFSTEP]
apply Finsupp.mulHom_ext'
[GOAL]
case refine_2.H
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
A : Type u_2
inst✝ : Semiring A
f g : MvPolynomial σ R →+* A
hC : ∀ (r : R), ↑f (↑C r) = ↑g (↑C r)
hX : ∀ (i : σ), ↑f (X i) = ↑g (X i)
⊢ ∀ (x : σ),
    MonoidHom.comp (MonoidHom.comp (↑f) (of R (σ →₀ ℕ))) (↑AddMonoidHom.toMultiplicative (singleAddHom x)) =
      MonoidHom.comp (MonoidHom.comp (↑g) (of R (σ →₀ ℕ))) (↑AddMonoidHom.toMultiplicative (singleAddHom x))
[PROOFSTEP]
intros x
[GOAL]
case refine_2.H
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
A : Type u_2
inst✝ : Semiring A
f g : MvPolynomial σ R →+* A
hC : ∀ (r : R), ↑f (↑C r) = ↑g (↑C r)
hX : ∀ (i : σ), ↑f (X i) = ↑g (X i)
x : σ
⊢ MonoidHom.comp (MonoidHom.comp (↑f) (of R (σ →₀ ℕ))) (↑AddMonoidHom.toMultiplicative (singleAddHom x)) =
    MonoidHom.comp (MonoidHom.comp (↑g) (of R (σ →₀ ℕ))) (↑AddMonoidHom.toMultiplicative (singleAddHom x))
[PROOFSTEP]
apply MonoidHom.ext_mnat
[GOAL]
case refine_2.H.h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
A : Type u_2
inst✝ : Semiring A
f g : MvPolynomial σ R →+* A
hC : ∀ (r : R), ↑f (↑C r) = ↑g (↑C r)
hX : ∀ (i : σ), ↑f (X i) = ↑g (X i)
x : σ
⊢ ↑(MonoidHom.comp (MonoidHom.comp (↑f) (of R (σ →₀ ℕ))) (↑AddMonoidHom.toMultiplicative (singleAddHom x)))
      (↑Multiplicative.ofAdd 1) =
    ↑(MonoidHom.comp (MonoidHom.comp (↑g) (of R (σ →₀ ℕ))) (↑AddMonoidHom.toMultiplicative (singleAddHom x)))
      (↑Multiplicative.ofAdd 1)
[PROOFSTEP]
exact hX _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ Algebra.adjoin R (range X) = ⊤
[PROOFSTEP]
set S := Algebra.adjoin R (range (X : σ → MvPolynomial σ R))
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
⊢ S = ⊤
[PROOFSTEP]
refine' top_unique fun p hp => _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p : MvPolynomial σ R
hp : p ∈ ⊤
⊢ p ∈ S
[PROOFSTEP]
clear hp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p : MvPolynomial σ R
⊢ p ∈ S
[PROOFSTEP]
induction p using MvPolynomial.induction_on
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
a✝ : R
⊢ ↑C a✝ ∈ S
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p✝ q✝ : MvPolynomial σ R
a✝¹ : p✝ ∈ S
a✝ : q✝ ∈ S
⊢ p✝ + q✝ ∈ S
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p✝ : MvPolynomial σ R
n✝ : σ
a✝ : p✝ ∈ S
⊢ p✝ * X n✝ ∈ S
[PROOFSTEP]
case h_C => exact S.algebraMap_mem _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
a✝ : R
⊢ ↑C a✝ ∈ S
[PROOFSTEP]
case h_C => exact S.algebraMap_mem _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
a✝ : R
⊢ ↑C a✝ ∈ S
[PROOFSTEP]
exact S.algebraMap_mem _
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p✝ q✝ : MvPolynomial σ R
a✝¹ : p✝ ∈ S
a✝ : q✝ ∈ S
⊢ p✝ + q✝ ∈ S
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p✝ : MvPolynomial σ R
n✝ : σ
a✝ : p✝ ∈ S
⊢ p✝ * X n✝ ∈ S
[PROOFSTEP]
case h_add p q hp hq => exact S.add_mem hp hq
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p q : MvPolynomial σ R
hp : p ∈ S
hq : q ∈ S
⊢ p + q ∈ S
[PROOFSTEP]
case h_add p q hp hq => exact S.add_mem hp hq
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p q : MvPolynomial σ R
hp : p ∈ S
hq : q ∈ S
⊢ p + q ∈ S
[PROOFSTEP]
exact S.add_mem hp hq
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p✝ : MvPolynomial σ R
n✝ : σ
a✝ : p✝ ∈ S
⊢ p✝ * X n✝ ∈ S
[PROOFSTEP]
case h_X p i hp => exact S.mul_mem hp (Algebra.subset_adjoin <| mem_range_self _)
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p : MvPolynomial σ R
i : σ
hp : p ∈ S
⊢ p * X i ∈ S
[PROOFSTEP]
case h_X p i hp => exact S.mul_mem hp (Algebra.subset_adjoin <| mem_range_self _)
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Subalgebra R (MvPolynomial σ R) := Algebra.adjoin R (range X)
p : MvPolynomial σ R
i : σ
hp : p ∈ S
⊢ p * X i ∈ S
[PROOFSTEP]
exact S.mul_mem hp (Algebra.subset_adjoin <| mem_range_self _)
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
h : Decidable (a = 0)
⊢ support (↑(monomial s) a) = if a = 0 then ∅ else {s}
[PROOFSTEP]
rw [← Subsingleton.elim (Classical.decEq R a 0) h]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
h : Decidable (a = 0)
⊢ support (↑(monomial s) a) = if a = 0 then ∅ else {s}
[PROOFSTEP]
rfl
  -- porting note: the proof in Lean 3 wasn't fundamentally better and needed `by convert rfl`
    -- the issue is the different decidability instances in the `ite` expressions
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : Nontrivial R
⊢ support (X n) = {Finsupp.single n 1}
[PROOFSTEP]
classical rw [X, support_monomial, if_neg]; exact one_ne_zero
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : Nontrivial R
⊢ support (X n) = {Finsupp.single n 1}
[PROOFSTEP]
rw [X, support_monomial, if_neg]
[GOAL]
case hnc
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : Nontrivial R
⊢ ¬1 = 0
[PROOFSTEP]
exact one_ne_zero
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : Nontrivial R
s : σ
n : ℕ
⊢ support (X s ^ n) = {Finsupp.single s n}
[PROOFSTEP]
classical rw [X_pow_eq_monomial, support_monomial, if_neg (one_ne_zero' R)]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : Nontrivial R
s : σ
n : ℕ
⊢ support (X s ^ n) = {Finsupp.single s n}
[PROOFSTEP]
rw [X_pow_eq_monomial, support_monomial, if_neg (one_ne_zero' R)]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q p : MvPolynomial σ R
m : σ →₀ ℕ
⊢ m ∈ support p ↔ coeff m p ≠ 0
[PROOFSTEP]
simp [support, coeff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q p : MvPolynomial σ R
m : σ →₀ ℕ
⊢ ¬m ∈ support p ↔ coeff m p = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
A : Type u_2
inst✝ : AddCommMonoid A
p : MvPolynomial σ R
b : (σ →₀ ℕ) → R → A
⊢ sum p b = ∑ m in support p, b m (coeff m p)
[PROOFSTEP]
simp [support, Finsupp.sum, coeff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
⊢ support (p * q) ⊆ Finset.biUnion (support p) fun a => Finset.biUnion (support q) fun b => {a + b}
[PROOFSTEP]
convert AddMonoidAlgebra.support_mul p q
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ p q : MvPolynomial σ R
h : p = q
m : σ →₀ ℕ
⊢ coeff m p = coeff m q
[PROOFSTEP]
rw [h]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
i : σ
h : Finsupp.single i 1 = 0
⊢ False
[PROOFSTEP]
cases Finsupp.single_eq_zero.1 h
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
m : σ →₀ ℕ
⊢ ↑(monomial m) 1 = Finsupp.prod m fun n e => X n ^ e
[PROOFSTEP]
simp [monomial_eq]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : DecidableEq σ
i : σ
m : σ →₀ ℕ
k : ℕ
⊢ coeff m (X i ^ k) = if Finsupp.single i k = m then 1 else 0
[PROOFSTEP]
have := coeff_monomial m (Finsupp.single i k) (1 : R)
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : DecidableEq σ
i : σ
m : σ →₀ ℕ
k : ℕ
this : coeff m (↑(monomial (Finsupp.single i k)) 1) = if Finsupp.single i k = m then 1 else 0
⊢ coeff m (X i ^ k) = if Finsupp.single i k = m then 1 else 0
[PROOFSTEP]
rwa [@monomial_eq _ _ (1 : R) (Finsupp.single i k) _, C_1, one_mul, Finsupp.prod_single_index] at this 
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : DecidableEq σ
i : σ
m : σ →₀ ℕ
k : ℕ
this : coeff m (Finsupp.prod (Finsupp.single i k) fun n e => X n ^ e) = if Finsupp.single i k = m then 1 else 0
⊢ X i ^ 0 = 1
[PROOFSTEP]
exact pow_zero _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : DecidableEq σ
i : σ
m : σ →₀ ℕ
⊢ coeff m (X i) = if Finsupp.single i 1 = m then 1 else 0
[PROOFSTEP]
rw [← coeff_X_pow, pow_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
i : σ
⊢ coeff (Finsupp.single i 1) (X i) = 1
[PROOFSTEP]
classical rw [coeff_X', if_pos rfl]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
i : σ
⊢ coeff (Finsupp.single i 1) (X i) = 1
[PROOFSTEP]
rw [coeff_X', if_pos rfl]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m : σ →₀ ℕ
a : R
p : MvPolynomial σ R
⊢ coeff m (↑C a * p) = a * coeff m p
[PROOFSTEP]
classical
rw [mul_def, sum_C]
· simp (config := { contextual := true }) [sum_def, coeff_sum]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m : σ →₀ ℕ
a : R
p : MvPolynomial σ R
⊢ coeff m (↑C a * p) = a * coeff m p
[PROOFSTEP]
rw [mul_def, sum_C]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m : σ →₀ ℕ
a : R
p : MvPolynomial σ R
⊢ coeff m (sum p fun n b => ↑(monomial (0 + n)) (a * b)) = a * coeff m p
[PROOFSTEP]
simp (config := { contextual := true }) [sum_def, coeff_sum]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m : σ →₀ ℕ
a : R
p : MvPolynomial σ R
⊢ (sum p fun n b => ↑(monomial (0 + n)) (0 * b)) = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
s : σ
p : MvPolynomial σ R
⊢ ∀ (y : R), y * 1 = 0 ↔ y = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
s : σ
p : MvPolynomial σ R
⊢ ∀ (y : R), 1 * y = 0 ↔ y = 0
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
⊢ support p \ support q ⊆ support (p + q)
[PROOFSTEP]
intro m hm
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
m : σ →₀ ℕ
hm : m ∈ support p \ support q
⊢ m ∈ support (p + q)
[PROOFSTEP]
simp only [Classical.not_not, mem_support_iff, Finset.mem_sdiff, Ne.def] at hm 
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
m : σ →₀ ℕ
hm : ¬coeff m p = 0 ∧ coeff m q = 0
⊢ m ∈ support (p + q)
[PROOFSTEP]
simp [hm.2, hm.1]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
⊢ support p ∆ support q ⊆ support (p + q)
[PROOFSTEP]
rw [symmDiff_def, Finset.sup_eq_union]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
⊢ support p \ support q ∪ support q \ support p ⊆ support (p + q)
[PROOFSTEP]
apply Finset.union_subset
[GOAL]
case hs
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
⊢ support p \ support q ⊆ support (p + q)
[PROOFSTEP]
exact support_sdiff_support_subset_support_add p q
[GOAL]
case a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
⊢ support q \ support p ⊆ support (p + q)
[PROOFSTEP]
rw [add_comm]
[GOAL]
case a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
inst✝ : DecidableEq σ
p q : MvPolynomial σ R
⊢ support q \ support p ⊆ support (q + p)
[PROOFSTEP]
exact support_sdiff_support_subset_support_add q p
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
⊢ coeff m (p * ↑(monomial s) r) = if s ≤ m then coeff (m - s) p * r else 0
[PROOFSTEP]
classical
obtain rfl | hr := eq_or_ne r 0
· simp only [monomial_zero, coeff_zero, mul_zero, ite_self]
haveI : Nontrivial R := nontrivial_of_ne _ _ hr
split_ifs with h
· conv_rhs => rw [← coeff_mul_monomial _ s]
  congr with t
  rw [tsub_add_cancel_of_le h]
· rw [← not_mem_support_iff]
  intro hm
  apply h
  have H := support_mul _ _ hm
  simp only [Finset.mem_biUnion] at H 
  rcases H with ⟨j, _hj, i', hi', H⟩
  rw [support_monomial, if_neg hr, Finset.mem_singleton] at hi' 
  subst i'
  rw [Finset.mem_singleton] at H 
  subst m
  exact le_add_left le_rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
⊢ coeff m (p * ↑(monomial s) r) = if s ≤ m then coeff (m - s) p * r else 0
[PROOFSTEP]
obtain rfl | hr := eq_or_ne r 0
[GOAL]
case inl
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
p : MvPolynomial σ R
⊢ coeff m (p * ↑(monomial s) 0) = if s ≤ m then coeff (m - s) p * 0 else 0
[PROOFSTEP]
simp only [monomial_zero, coeff_zero, mul_zero, ite_self]
[GOAL]
case inr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
⊢ coeff m (p * ↑(monomial s) r) = if s ≤ m then coeff (m - s) p * r else 0
[PROOFSTEP]
haveI : Nontrivial R := nontrivial_of_ne _ _ hr
[GOAL]
case inr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
⊢ coeff m (p * ↑(monomial s) r) = if s ≤ m then coeff (m - s) p * r else 0
[PROOFSTEP]
split_ifs with h
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : s ≤ m
⊢ coeff m (p * ↑(monomial s) r) = coeff (m - s) p * r
[PROOFSTEP]
conv_rhs => rw [← coeff_mul_monomial _ s]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : s ≤ m
| coeff (m - s) p * r
[PROOFSTEP]
rw [← coeff_mul_monomial _ s]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : s ≤ m
| coeff (m - s) p * r
[PROOFSTEP]
rw [← coeff_mul_monomial _ s]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : s ≤ m
| coeff (m - s) p * r
[PROOFSTEP]
rw [← coeff_mul_monomial _ s]
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : s ≤ m
⊢ coeff m (p * ↑(monomial s) r) = coeff (m - s + s) (p * ↑(monomial s) r)
[PROOFSTEP]
congr with t
[GOAL]
case pos.e_m.h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : s ≤ m
t : σ
⊢ ↑m t = ↑(m - s + s) t
[PROOFSTEP]
rw [tsub_add_cancel_of_le h]
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
⊢ coeff m (p * ↑(monomial s) r) = 0
[PROOFSTEP]
rw [← not_mem_support_iff]
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
⊢ ¬m ∈ support (p * ↑(monomial s) r)
[PROOFSTEP]
intro hm
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
⊢ False
[PROOFSTEP]
apply h
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
⊢ s ≤ m
[PROOFSTEP]
have H := support_mul _ _ hm
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
H : m ∈ Finset.biUnion (support p) fun a => Finset.biUnion (support (↑(monomial s) r)) fun b => {a + b}
⊢ s ≤ m
[PROOFSTEP]
simp only [Finset.mem_biUnion] at H 
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
H : ∃ a, a ∈ support p ∧ ∃ a_1, a_1 ∈ support (↑(monomial s) r) ∧ m ∈ {a + a_1}
⊢ s ≤ m
[PROOFSTEP]
rcases H with ⟨j, _hj, i', hi', H⟩
[GOAL]
case neg.intro.intro.intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
j : σ →₀ ℕ
_hj : j ∈ support p
i' : σ →₀ ℕ
hi' : i' ∈ support (↑(monomial s) r)
H : m ∈ {j + i'}
⊢ s ≤ m
[PROOFSTEP]
rw [support_monomial, if_neg hr, Finset.mem_singleton] at hi' 
[GOAL]
case neg.intro.intro.intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
j : σ →₀ ℕ
_hj : j ∈ support p
i' : σ →₀ ℕ
hi'✝ : i' ∈ support (↑(monomial s) r)
hi' : i' = s
H : m ∈ {j + i'}
⊢ s ≤ m
[PROOFSTEP]
subst i'
[GOAL]
case neg.intro.intro.intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
j : σ →₀ ℕ
_hj : j ∈ support p
hi' : s ∈ support (↑(monomial s) r)
H : m ∈ {j + s}
⊢ s ≤ m
[PROOFSTEP]
rw [Finset.mem_singleton] at H 
[GOAL]
case neg.intro.intro.intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
h : ¬s ≤ m
hm : m ∈ support (p * ↑(monomial s) r)
j : σ →₀ ℕ
_hj : j ∈ support p
hi' : s ∈ support (↑(monomial s) r)
H : m = j + s
⊢ s ≤ m
[PROOFSTEP]
subst m
[GOAL]
case neg.intro.intro.intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
hr : r ≠ 0
this : Nontrivial R
j : σ →₀ ℕ
_hj : j ∈ support p
hi' : s ∈ support (↑(monomial s) r)
h : ¬s ≤ j + s
hm : j + s ∈ support (p * ↑(monomial s) r)
⊢ s ≤ j + s
[PROOFSTEP]
exact le_add_left le_rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
⊢ coeff m (↑(monomial s) r * p) = if s ≤ m then r * coeff (m - s) p else 0
[PROOFSTEP]
rw [mul_comm, mul_comm r]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
m s : σ →₀ ℕ
r : R
p : MvPolynomial σ R
⊢ coeff m (p * ↑(monomial s) r) = if s ≤ m then coeff (m - s) p * r else 0
[PROOFSTEP]
exact coeff_mul_monomial' _ _ _ _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
inst✝ : DecidableEq σ
m : σ →₀ ℕ
s : σ
p : MvPolynomial σ R
⊢ coeff m (p * X s) = if s ∈ m.support then coeff (m - Finsupp.single s 1) p else 0
[PROOFSTEP]
refine' (coeff_mul_monomial' _ _ _ _).trans _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
inst✝ : DecidableEq σ
m : σ →₀ ℕ
s : σ
p : MvPolynomial σ R
⊢ (if Finsupp.single s 1 ≤ m then coeff (m - Finsupp.single s 1) p * 1 else 0) =
    if s ∈ m.support then coeff (m - Finsupp.single s 1) p else 0
[PROOFSTEP]
simp_rw [Finsupp.single_le_iff, Finsupp.mem_support_iff, Nat.succ_le_iff, pos_iff_ne_zero, mul_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
inst✝ : DecidableEq σ
m : σ →₀ ℕ
s : σ
p : MvPolynomial σ R
⊢ coeff m (X s * p) = if s ∈ m.support then coeff (m - Finsupp.single s 1) p else 0
[PROOFSTEP]
refine' (coeff_monomial_mul' _ _ _ _).trans _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
inst✝ : DecidableEq σ
m : σ →₀ ℕ
s : σ
p : MvPolynomial σ R
⊢ (if Finsupp.single s 1 ≤ m then 1 * coeff (m - Finsupp.single s 1) p else 0) =
    if s ∈ m.support then coeff (m - Finsupp.single s 1) p else 0
[PROOFSTEP]
simp_rw [Finsupp.single_le_iff, Finsupp.mem_support_iff, Nat.succ_le_iff, pos_iff_ne_zero, one_mul]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q p : MvPolynomial σ R
⊢ p = 0 ↔ ∀ (d : σ →₀ ℕ), coeff d p = 0
[PROOFSTEP]
rw [ext_iff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q p : MvPolynomial σ R
⊢ (∀ (m : σ →₀ ℕ), coeff m p = coeff m 0) ↔ ∀ (d : σ →₀ ℕ), coeff d p = 0
[PROOFSTEP]
simp only [coeff_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q p : MvPolynomial σ R
⊢ p ≠ 0 ↔ ∃ d, coeff d p ≠ 0
[PROOFSTEP]
rw [Ne.def, eq_zero_iff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q p : MvPolynomial σ R
⊢ (¬∀ (d : σ →₀ ℕ), coeff d p = 0) ↔ ∃ d, coeff d p ≠ 0
[PROOFSTEP]
push_neg
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q p : MvPolynomial σ R
⊢ (∃ d, coeff d p ≠ 0) ↔ ∃ d, coeff d p ≠ 0
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
⊢ ↑C r ∣ φ ↔ ∀ (i : σ →₀ ℕ), r ∣ coeff i φ
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
⊢ ↑C r ∣ φ → ∀ (i : σ →₀ ℕ), r ∣ coeff i φ
[PROOFSTEP]
rintro ⟨φ, rfl⟩ c
[GOAL]
case mp.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
c : σ →₀ ℕ
⊢ r ∣ coeff c (↑C r * φ)
[PROOFSTEP]
rw [coeff_C_mul]
[GOAL]
case mp.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
c : σ →₀ ℕ
⊢ r ∣ r * coeff c φ
[PROOFSTEP]
apply dvd_mul_right
[GOAL]
case mpr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
⊢ (∀ (i : σ →₀ ℕ), r ∣ coeff i φ) → ↑C r ∣ φ
[PROOFSTEP]
intro h
[GOAL]
case mpr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
h : ∀ (i : σ →₀ ℕ), r ∣ coeff i φ
⊢ ↑C r ∣ φ
[PROOFSTEP]
choose C hc using h
[GOAL]
case mpr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
⊢ ↑MvPolynomial.C r ∣ φ
[PROOFSTEP]
classical
let c' : (σ →₀ ℕ) → R := fun i => if i ∈ φ.support then C i else 0
let ψ : MvPolynomial σ R := ∑ i in φ.support, monomial i (c' i)
use ψ
apply MvPolynomial.ext
intro i
simp only [coeff_C_mul, coeff_sum, coeff_monomial, Finset.sum_ite_eq']
split_ifs with hi
· rw [hc]
· rw [not_mem_support_iff] at hi 
  rwa [mul_zero]
[GOAL]
case mpr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
⊢ ↑MvPolynomial.C r ∣ φ
[PROOFSTEP]
let c' : (σ →₀ ℕ) → R := fun i => if i ∈ φ.support then C i else 0
[GOAL]
case mpr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
⊢ ↑MvPolynomial.C r ∣ φ
[PROOFSTEP]
let ψ : MvPolynomial σ R := ∑ i in φ.support, monomial i (c' i)
[GOAL]
case mpr
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
⊢ ↑MvPolynomial.C r ∣ φ
[PROOFSTEP]
use ψ
[GOAL]
case h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
⊢ φ = ↑MvPolynomial.C r * ψ
[PROOFSTEP]
apply MvPolynomial.ext
[GOAL]
case h.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
⊢ ∀ (m : σ →₀ ℕ), coeff m φ = coeff m (↑MvPolynomial.C r * ψ)
[PROOFSTEP]
intro i
[GOAL]
case h.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
i : σ →₀ ℕ
⊢ coeff i φ = coeff i (↑MvPolynomial.C r * ψ)
[PROOFSTEP]
simp only [coeff_C_mul, coeff_sum, coeff_monomial, Finset.sum_ite_eq']
[GOAL]
case h.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
i : σ →₀ ℕ
⊢ coeff i φ = r * if i ∈ support φ then if i ∈ support φ then C i else 0 else 0
[PROOFSTEP]
split_ifs with hi
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
i : σ →₀ ℕ
hi : i ∈ support φ
⊢ coeff i φ = r * C i
[PROOFSTEP]
rw [hc]
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
i : σ →₀ ℕ
hi : ¬i ∈ support φ
⊢ coeff i φ = r * 0
[PROOFSTEP]
rw [not_mem_support_iff] at hi 
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
φ : MvPolynomial σ R
C : (σ →₀ ℕ) → R
hc : ∀ (i : σ →₀ ℕ), coeff i φ = r * C i
c' : (σ →₀ ℕ) → R := fun i => if i ∈ support φ then C i else 0
ψ : MvPolynomial σ R := ∑ i in support φ, ↑(monomial i) (c' i)
i : σ →₀ ℕ
hi : coeff i φ = 0
⊢ coeff i φ = r * 0
[PROOFSTEP]
rwa [mul_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ IsRegular (X n)
[PROOFSTEP]
suffices : IsLeftRegular (X n : MvPolynomial σ R)
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
this : IsLeftRegular (X n)
⊢ IsRegular (X n)
[PROOFSTEP]
exact ⟨this, this.right_of_commute $ Commute.all _⟩
[GOAL]
case this
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ IsLeftRegular (X n)
[PROOFSTEP]
intro P Q (hPQ : (X n) * P = (X n) * Q)
[GOAL]
case this
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q P Q : MvPolynomial σ R
hPQ : X n * P = X n * Q
⊢ P = Q
[PROOFSTEP]
ext i
[GOAL]
case this.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q P Q : MvPolynomial σ R
hPQ : X n * P = X n * Q
i : σ →₀ ℕ
⊢ coeff i P = coeff i Q
[PROOFSTEP]
rw [← coeff_X_mul i n P, hPQ, coeff_X_mul i n Q]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ coeff 0 1 = 1
[PROOFSTEP]
simp [AddMonoidAlgebra.one_def]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ∀ (x y : MvPolynomial σ R),
    OneHom.toFun { toFun := coeff 0, map_one' := (_ : coeff 0 1 = 1) } (x * y) =
      OneHom.toFun { toFun := coeff 0, map_one' := (_ : coeff 0 1 = 1) } x *
        OneHom.toFun { toFun := coeff 0, map_one' := (_ : coeff 0 1 = 1) } y
[PROOFSTEP]
classical simp [coeff_mul, Finsupp.support_single_ne_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ ∀ (x y : MvPolynomial σ R),
    OneHom.toFun { toFun := coeff 0, map_one' := (_ : coeff 0 1 = 1) } (x * y) =
      OneHom.toFun { toFun := coeff 0, map_one' := (_ : coeff 0 1 = 1) } x *
        OneHom.toFun { toFun := coeff 0, map_one' := (_ : coeff 0 1 = 1) } y
[PROOFSTEP]
simp [coeff_mul, Finsupp.support_single_ne_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
⊢ ↑constantCoeff (↑C r) = r
[PROOFSTEP]
classical simp [constantCoeff_eq]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
r : R
⊢ ↑constantCoeff (↑C r) = r
[PROOFSTEP]
simp [constantCoeff_eq]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
i : σ
⊢ ↑constantCoeff (X i) = 0
[PROOFSTEP]
simp [constantCoeff_eq]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝ : DecidableEq σ
d : σ →₀ ℕ
r : R
⊢ ↑constantCoeff (↑(monomial d) r) = if d = 0 then r else 0
[PROOFSTEP]
rw [constantCoeff_eq, coeff_monomial]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
⊢ RingHom.comp constantCoeff C = RingHom.id R
[PROOFSTEP]
ext x
[GOAL]
case a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
x : R
⊢ ↑(RingHom.comp constantCoeff C) x = ↑(RingHom.id R) x
[PROOFSTEP]
exact constantCoeff_C σ x
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : Fintype σ
g : R →+* S₁
X : σ → S₁
f : MvPolynomial σ R
⊢ eval₂ g X f = ∑ d in support f, ↑g (coeff d f) * ∏ i : σ, X i ^ ↑d i
[PROOFSTEP]
simp only [eval₂_eq, ← Finsupp.prod_pow]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : Fintype σ
g : R →+* S₁
X : σ → S₁
f : MvPolynomial σ R
⊢ ∑ x in support f, ↑g (coeff x f) * ∏ x_1 in x.support, X x_1 ^ ↑x x_1 =
    ∑ x in support f, ↑g (coeff x f) * Finsupp.prod x fun a b => X a ^ b
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ eval₂ f g (p + q) = eval₂ f g p + eval₂ f g q
[PROOFSTEP]
classical exact Finsupp.sum_add_index (by simp [f.map_zero]) (by simp [add_mul, f.map_add])
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ eval₂ f g (p + q) = eval₂ f g p + eval₂ f g q
[PROOFSTEP]
exact Finsupp.sum_add_index (by simp [f.map_zero]) (by simp [add_mul, f.map_add])
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (a : σ →₀ ℕ), a ∈ p.support ∪ q.support → (↑f 0 * Finsupp.prod a fun n e => g n ^ e) = 0
[PROOFSTEP]
simp [f.map_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (a : σ →₀ ℕ),
    a ∈ p.support ∪ q.support →
      ∀ (b₁ b₂ : R),
        (↑f (b₁ + b₂) * Finsupp.prod a fun n e => g n ^ e) =
          (↑f b₁ * Finsupp.prod a fun n e => g n ^ e) + ↑f b₂ * Finsupp.prod a fun n e => g n ^ e
[PROOFSTEP]
simp [add_mul, f.map_add]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ (↑f 0 * Finsupp.prod s fun n e => g n ^ e) = 0
[PROOFSTEP]
simp [f.map_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
a : R
⊢ eval₂ f g (↑C a) = ↑f a
[PROOFSTEP]
rw [C_apply, eval₂_monomial, prod_zero_index, mul_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
n : σ
⊢ eval₂ f g (X n) = g n
[PROOFSTEP]
simp [eval₂_monomial, f.map_one, X, prod_single_index, pow_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
classical
apply MvPolynomial.induction_on p
· intro a' s a
  simp [C_mul_monomial, eval₂_monomial, f.map_mul]
· intro p q ih_p ih_q
  simp [add_mul, eval₂_add, ih_p, ih_q]
· intro p n ih s a
  exact
    calc
      (p * X n * monomial s a).eval₂ f g = (p * monomial (Finsupp.single n 1 + s) a).eval₂ f g := by
        rw [monomial_single_add, pow_one, mul_assoc]
      _ = (p * monomial (Finsupp.single n 1) 1).eval₂ f g * f a * s.prod fun n e => g n ^ e := by
        simp [ih, prod_single_index, prod_add_index, pow_one, pow_add, mul_assoc, mul_left_comm, f.map_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
apply MvPolynomial.induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (a : R) {s : σ →₀ ℕ} {a_1 : R},
    eval₂ f g (↑C a * ↑(monomial s) a_1) = eval₂ f g (↑C a) * ↑f a_1 * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
intro a' s a
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a'✝ a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
a' : R
s : σ →₀ ℕ
a : R
⊢ eval₂ f g (↑C a' * ↑(monomial s) a) = eval₂ f g (↑C a') * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
simp [C_mul_monomial, eval₂_monomial, f.map_mul]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (p q : MvPolynomial σ R),
    (∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e) →
      (∀ {s : σ →₀ ℕ} {a : R},
          eval₂ f g (q * ↑(monomial s) a) = eval₂ f g q * ↑f a * Finsupp.prod s fun n e => g n ^ e) →
        ∀ {s : σ →₀ ℕ} {a : R},
          eval₂ f g ((p + q) * ↑(monomial s) a) = eval₂ f g (p + q) * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
intro p q ih_p ih_q
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p q : MvPolynomial σ R
ih_p : ∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e
ih_q : ∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (q * ↑(monomial s) a) = eval₂ f g q * ↑f a * Finsupp.prod s fun n e => g n ^ e
⊢ ∀ {s : σ →₀ ℕ} {a : R},
    eval₂ f g ((p + q) * ↑(monomial s) a) = eval₂ f g (p + q) * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
simp [add_mul, eval₂_add, ih_p, ih_q]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    (∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e) →
      ∀ {s : σ →₀ ℕ} {a : R},
        eval₂ f g (p * X n * ↑(monomial s) a) = eval₂ f g (p * X n) * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
intro p n ih s a
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
n : σ
ih : ∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e
s : σ →₀ ℕ
a : R
⊢ eval₂ f g (p * X n * ↑(monomial s) a) = eval₂ f g (p * X n) * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
exact
  calc
    (p * X n * monomial s a).eval₂ f g = (p * monomial (Finsupp.single n 1 + s) a).eval₂ f g := by
      rw [monomial_single_add, pow_one, mul_assoc]
    _ = (p * monomial (Finsupp.single n 1) 1).eval₂ f g * f a * s.prod fun n e => g n ^ e := by
      simp [ih, prod_single_index, prod_add_index, pow_one, pow_add, mul_assoc, mul_left_comm, f.map_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
n : σ
ih : ∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e
s : σ →₀ ℕ
a : R
⊢ eval₂ f g (p * X n * ↑(monomial s) a) = eval₂ f g (p * ↑(monomial (Finsupp.single n 1 + s)) a)
[PROOFSTEP]
rw [monomial_single_add, pow_one, mul_assoc]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
n : σ
ih : ∀ {s : σ →₀ ℕ} {a : R}, eval₂ f g (p * ↑(monomial s) a) = eval₂ f g p * ↑f a * Finsupp.prod s fun n e => g n ^ e
s : σ →₀ ℕ
a : R
⊢ eval₂ f g (p * ↑(monomial (Finsupp.single n 1 + s)) a) =
    eval₂ f g (p * ↑(monomial (Finsupp.single n 1)) 1) * ↑f a * Finsupp.prod s fun n e => g n ^ e
[PROOFSTEP]
simp [ih, prod_single_index, prod_add_index, pow_one, pow_add, mul_assoc, mul_left_comm, f.map_one]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ (eval₂ f g p * ↑f a * Finsupp.prod 0 fun n e => g n ^ e) = eval₂ f g p * ↑f a
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ {p : MvPolynomial σ R}, eval₂ f g (p * q) = eval₂ f g p * eval₂ f g q
[PROOFSTEP]
apply MvPolynomial.induction_on q
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (a : R) {p : MvPolynomial σ R}, eval₂ f g (p * ↑C a) = eval₂ f g p * eval₂ f g (↑C a)
[PROOFSTEP]
simp [eval₂_C, eval₂_mul_C]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (p q : MvPolynomial σ R),
    (∀ {p_1 : MvPolynomial σ R}, eval₂ f g (p_1 * p) = eval₂ f g p_1 * eval₂ f g p) →
      (∀ {p : MvPolynomial σ R}, eval₂ f g (p * q) = eval₂ f g p * eval₂ f g q) →
        ∀ {p_1 : MvPolynomial σ R}, eval₂ f g (p_1 * (p + q)) = eval₂ f g p_1 * eval₂ f g (p + q)
[PROOFSTEP]
simp (config := { contextual := true }) [mul_add, eval₂_add]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    (∀ {p_1 : MvPolynomial σ R}, eval₂ f g (p_1 * p) = eval₂ f g p_1 * eval₂ f g p) →
      ∀ {p_1 : MvPolynomial σ R}, eval₂ f g (p_1 * (p * X n)) = eval₂ f g p_1 * eval₂ f g (p * X n)
[PROOFSTEP]
simp (config := { contextual := true }) [X, eval₂_monomial, eval₂_mul_monomial, ← mul_assoc]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ eval₂ f g (p ^ 0) = eval₂ f g p ^ 0
[PROOFSTEP]
rw [pow_zero, pow_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ eval₂ f g 1 = 1
[PROOFSTEP]
exact eval₂_one _ _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
n : ℕ
⊢ eval₂ f g (p ^ (n + 1)) = eval₂ f g p ^ (n + 1)
[PROOFSTEP]
rw [pow_add, pow_one, pow_add, pow_one, eval₂_mul, eval₂_pow]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
f₁ f₂ : R →+* S₁
g₁ g₂ : σ → S₁
p₁ p₂ : MvPolynomial σ R
⊢ f₁ = f₂ → g₁ = g₂ → p₁ = p₂ → ↑(eval₂Hom f₁ g₁) p₁ = ↑(eval₂Hom f₂ g₂) p₂
[PROOFSTEP]
rintro rfl rfl rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
f₁ : R →+* S₁
g₁ : σ → S₁
p₁ : MvPolynomial σ R
⊢ ↑(eval₂Hom f₁ g₁) p₁ = ↑(eval₂Hom f₁ g₁) p₁
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₁
φ : S₁ →+* S₂
⊢ RingHom.comp φ (eval₂Hom f g) = eval₂Hom (RingHom.comp φ f) fun i => ↑φ (g i)
[PROOFSTEP]
apply MvPolynomial.ringHom_ext
[GOAL]
case hC
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₁
φ : S₁ →+* S₂
⊢ ∀ (r : R), ↑(RingHom.comp φ (eval₂Hom f g)) (↑C r) = ↑(eval₂Hom (RingHom.comp φ f) fun i => ↑φ (g i)) (↑C r)
[PROOFSTEP]
intro r
[GOAL]
case hC
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₁
φ : S₁ →+* S₂
r : R
⊢ ↑(RingHom.comp φ (eval₂Hom f g)) (↑C r) = ↑(eval₂Hom (RingHom.comp φ f) fun i => ↑φ (g i)) (↑C r)
[PROOFSTEP]
rw [RingHom.comp_apply, eval₂Hom_C, eval₂Hom_C, RingHom.comp_apply]
[GOAL]
case hX
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₁
φ : S₁ →+* S₂
⊢ ∀ (i : σ), ↑(RingHom.comp φ (eval₂Hom f g)) (X i) = ↑(eval₂Hom (RingHom.comp φ f) fun i => ↑φ (g i)) (X i)
[PROOFSTEP]
intro i
[GOAL]
case hX
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₁
φ : S₁ →+* S₂
i : σ
⊢ ↑(RingHom.comp φ (eval₂Hom f g)) (X i) = ↑(eval₂Hom (RingHom.comp φ f) fun i => ↑φ (g i)) (X i)
[PROOFSTEP]
rw [RingHom.comp_apply, eval₂Hom_X', eval₂Hom_X']
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₁
φ : S₁ →+* S₂
p : MvPolynomial σ R
⊢ ↑φ (↑(eval₂Hom f g) p) = ↑(eval₂Hom (RingHom.comp φ f) fun i => ↑φ (g i)) p
[PROOFSTEP]
rw [← comp_eval₂Hom]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₁
φ : S₁ →+* S₂
p : MvPolynomial σ R
⊢ ↑φ (↑(eval₂Hom f g) p) = ↑(RingHom.comp φ (eval₂Hom f fun i => g i)) p
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
f : R →+* S₁
g : σ → S₁
d : σ →₀ ℕ
r : R
⊢ ↑(eval₂Hom f g) (↑(monomial d) r) = ↑f r * Finsupp.prod d fun i k => g i ^ k
[PROOFSTEP]
simp only [monomial_eq, RingHom.map_mul, eval₂Hom_C, Finsupp.prod, map_prod, RingHom.map_pow, eval₂Hom_X']
[GOAL]
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ↑k (eval₂ f g p) = eval₂ (RingHom.comp k f) (↑k ∘ g) p
[PROOFSTEP]
apply MvPolynomial.induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (a : R), ↑k (eval₂ f g (↑C a)) = eval₂ (RingHom.comp k f) (↑k ∘ g) (↑C a)
[PROOFSTEP]
simp (config := { contextual := true }) [eval₂_add, k.map_add, eval₂_mul, k.map_mul]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p q : MvPolynomial σ R),
    ↑k (eval₂ f g p) = eval₂ (RingHom.comp k f) (↑k ∘ g) p →
      ↑k (eval₂ f g q) = eval₂ (RingHom.comp k f) (↑k ∘ g) q →
        ↑k (eval₂ f g (p + q)) = eval₂ (RingHom.comp k f) (↑k ∘ g) (p + q)
[PROOFSTEP]
simp (config := { contextual := true }) [eval₂_add, k.map_add, eval₂_mul, k.map_mul]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
g✝ : σ → S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    ↑k (eval₂ f g p) = eval₂ (RingHom.comp k f) (↑k ∘ g) p →
      ↑k (eval₂ f g (p * X n)) = eval₂ (RingHom.comp k f) (↑k ∘ g) (p * X n)
[PROOFSTEP]
simp (config := { contextual := true }) [eval₂_add, k.map_add, eval₂_mul, k.map_mul]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ eval₂ C X p = p
[PROOFSTEP]
apply MvPolynomial.induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (a : R), eval₂ C X (↑C a) = ↑C a
[PROOFSTEP]
simp (config := { contextual := true }) [eval₂_add, eval₂_mul]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p q : MvPolynomial σ R), eval₂ C X p = p → eval₂ C X q = q → eval₂ C X (p + q) = p + q
[PROOFSTEP]
simp (config := { contextual := true }) [eval₂_add, eval₂_mul]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p : MvPolynomial σ R) (n : σ), eval₂ C X p = p → eval₂ C X (p * X n) = p * X n
[PROOFSTEP]
simp (config := { contextual := true }) [eval₂_add, eval₂_mul]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
⊢ eval₂ f g₁ p = eval₂ f g₂ p
[PROOFSTEP]
apply Finset.sum_congr rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
⊢ ∀ (x : σ →₀ ℕ),
    x ∈ p.support →
      (fun s a => ↑f a * Finsupp.prod s fun n e => g₁ n ^ e) x (↑p x) =
        (fun s a => ↑f a * Finsupp.prod s fun n e => g₂ n ^ e) x (↑p x)
[PROOFSTEP]
intro C hc
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
⊢ (fun s a => ↑f a * Finsupp.prod s fun n e => g₁ n ^ e) C (↑p C) =
    (fun s a => ↑f a * Finsupp.prod s fun n e => g₂ n ^ e) C (↑p C)
[PROOFSTEP]
dsimp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
⊢ (↑f (↑p C) * Finsupp.prod C fun n e => g₁ n ^ e) = ↑f (↑p C) * Finsupp.prod C fun n e => g₂ n ^ e
[PROOFSTEP]
congr 1
[GOAL]
case e_a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
⊢ (Finsupp.prod C fun n e => g₁ n ^ e) = Finsupp.prod C fun n e => g₂ n ^ e
[PROOFSTEP]
apply Finset.prod_congr rfl
[GOAL]
case e_a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
⊢ ∀ (x : σ), x ∈ C.support → (fun n e => g₁ n ^ e) x (↑C x) = (fun n e => g₂ n ^ e) x (↑C x)
[PROOFSTEP]
intro i hi
[GOAL]
case e_a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
i : σ
hi : i ∈ C.support
⊢ (fun n e => g₁ n ^ e) i (↑C i) = (fun n e => g₂ n ^ e) i (↑C i)
[PROOFSTEP]
dsimp
[GOAL]
case e_a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
i : σ
hi : i ∈ C.support
⊢ g₁ i ^ ↑C i = g₂ i ^ ↑C i
[PROOFSTEP]
congr 1
[GOAL]
case e_a.e_a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
i : σ
hi : i ∈ C.support
⊢ g₁ i = g₂ i
[PROOFSTEP]
apply h hi
[GOAL]
case e_a.e_a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
g g₁ g₂ : σ → S₁
h : ∀ {i : σ} {c : σ →₀ ℕ}, i ∈ c.support → coeff c p ≠ 0 → g₁ i = g₂ i
C : σ →₀ ℕ
hc : C ∈ p.support
i : σ
hi : i ∈ C.support
⊢ coeff C p ≠ 0
[PROOFSTEP]
rwa [Finsupp.mem_support_iff] at hc 
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
q : S₂ → MvPolynomial σ R
p : MvPolynomial S₂ R
⊢ eval₂ f (fun t => eval₂ f g (q t)) p = eval₂ f g (eval₂ C q p)
[PROOFSTEP]
show _ = eval₂Hom f g (eval₂ C q p)
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
q : S₂ → MvPolynomial σ R
p : MvPolynomial S₂ R
⊢ eval₂ f (fun t => eval₂ f g (q t)) p = ↑(eval₂Hom f g) (eval₂ C q p)
[PROOFSTEP]
rw [eval₂_comp_left (eval₂Hom f g)]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
q : S₂ → MvPolynomial σ R
p : MvPolynomial S₂ R
⊢ eval₂ f (fun t => eval₂ f g (q t)) p = eval₂ (RingHom.comp (eval₂Hom f g) C) (↑(eval₂Hom f g) ∘ q) p
[PROOFSTEP]
congr with a
[GOAL]
case e_f.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
q : S₂ → MvPolynomial σ R
p : MvPolynomial S₂ R
a : R
⊢ ↑f a = ↑(RingHom.comp (eval₂Hom f g) C) a
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f x : σ → R
p : MvPolynomial σ R
s : R
⊢ ↑(eval x) (s • p) = s * ↑(eval x) p
[PROOFSTEP]
rw [smul_eq_C_mul, (eval x).map_mul, eval_C]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
τ : Type u_2
f : σ → MvPolynomial τ R
g : τ → R
p : MvPolynomial σ R
⊢ ↑(eval (↑(eval g) ∘ f)) p = ↑(eval g) (eval₂ C f p)
[PROOFSTEP]
rw [eval₂_comp_left (eval g)]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
τ : Type u_2
f : σ → MvPolynomial τ R
g : τ → R
p : MvPolynomial σ R
⊢ ↑(eval (↑(eval g) ∘ f)) p = eval₂ (RingHom.comp (eval g) C) (↑(eval g) ∘ f) p
[PROOFSTEP]
unfold eval
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
τ : Type u_2
f : σ → MvPolynomial τ R
g : τ → R
p : MvPolynomial σ R
⊢ ↑(eval₂Hom (RingHom.id R) (↑(eval₂Hom (RingHom.id R) g) ∘ f)) p =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id R) g) C) (↑(eval₂Hom (RingHom.id R) g) ∘ f) p
[PROOFSTEP]
simp only [coe_eval₂Hom]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
τ : Type u_2
f : σ → MvPolynomial τ R
g : τ → R
p : MvPolynomial σ R
⊢ eval₂ (RingHom.id R) (eval₂ (RingHom.id R) g ∘ f) p =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id R) g) C) (eval₂ (RingHom.id R) g ∘ f) p
[PROOFSTEP]
congr with a
[GOAL]
case e_f.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
τ : Type u_2
f : σ → MvPolynomial τ R
g : τ → R
p : MvPolynomial σ R
a : R
⊢ ↑(RingHom.id R) a = ↑(RingHom.comp (eval₂Hom (RingHom.id R) g) C) a
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
S : Type u_2
τ : Type u_3
x : τ → S
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S
f : R →+* MvPolynomial τ S
g : σ → MvPolynomial τ S
p : MvPolynomial σ R
⊢ ↑(eval x) (eval₂ f g p) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) p
[PROOFSTEP]
apply induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
S : Type u_2
τ : Type u_3
x : τ → S
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S
f : R →+* MvPolynomial τ S
g : σ → MvPolynomial τ S
p : MvPolynomial σ R
⊢ ∀ (a : R), ↑(eval x) (eval₂ f g (↑C a)) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) (↑C a)
[PROOFSTEP]
simp
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
S : Type u_2
τ : Type u_3
x : τ → S
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S
f : R →+* MvPolynomial τ S
g : σ → MvPolynomial τ S
p : MvPolynomial σ R
⊢ ∀ (p q : MvPolynomial σ R),
    ↑(eval x) (eval₂ f g p) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) p →
      ↑(eval x) (eval₂ f g q) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) q →
        ↑(eval x) (eval₂ f g (p + q)) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) (p + q)
[PROOFSTEP]
intro p q hp hq
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p✝¹ q✝ : MvPolynomial σ R
f✝ : σ → R
S : Type u_2
τ : Type u_3
x : τ → S
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S
f : R →+* MvPolynomial τ S
g : σ → MvPolynomial τ S
p✝ p q : MvPolynomial σ R
hp : ↑(eval x) (eval₂ f g p) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) p
hq : ↑(eval x) (eval₂ f g q) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) q
⊢ ↑(eval x) (eval₂ f g (p + q)) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) (p + q)
[PROOFSTEP]
simp [hp, hq]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : σ → R
S : Type u_2
τ : Type u_3
x : τ → S
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S
f : R →+* MvPolynomial τ S
g : σ → MvPolynomial τ S
p : MvPolynomial σ R
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    ↑(eval x) (eval₂ f g p) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) p →
      ↑(eval x) (eval₂ f g (p * X n)) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) (p * X n)
[PROOFSTEP]
intro p n hp
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p✝¹ q : MvPolynomial σ R
f✝ : σ → R
S : Type u_2
τ : Type u_3
x : τ → S
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S
f : R →+* MvPolynomial τ S
g : σ → MvPolynomial τ S
p✝ p : MvPolynomial σ R
n : σ
hp : ↑(eval x) (eval₂ f g p) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) p
⊢ ↑(eval x) (eval₂ f g (p * X n)) = eval₂ (RingHom.comp (eval x) f) (fun s => ↑(eval x) (g s)) (p * X n)
[PROOFSTEP]
simp [hp]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
inst✝ : CommSemiring S₂
g : S₁ →+* S₂
p : MvPolynomial σ R
⊢ eval₂ (RingHom.comp (map g) (RingHom.comp C f)) (↑(map g) ∘ X) p = ↑(map (RingHom.comp g f)) p
[PROOFSTEP]
congr
[GOAL]
case e_f
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
inst✝ : CommSemiring S₂
g : S₁ →+* S₂
p : MvPolynomial σ R
⊢ RingHom.comp (map g) (RingHom.comp C f) = RingHom.comp C (RingHom.comp g f)
[PROOFSTEP]
ext1 a
[GOAL]
case e_f.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
inst✝ : CommSemiring S₂
g : S₁ →+* S₂
p : MvPolynomial σ R
a : R
⊢ ↑(RingHom.comp (map g) (RingHom.comp C f)) a = ↑(RingHom.comp C (RingHom.comp g f)) a
[PROOFSTEP]
simp only [map_C, comp_apply, RingHom.coe_comp]
[GOAL]
case e_g
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
inst✝ : CommSemiring S₂
g : S₁ →+* S₂
p : MvPolynomial σ R
⊢ ↑(map g) ∘ X = fun n => X n
[PROOFSTEP]
ext1 n
[GOAL]
case e_g.h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
inst✝ : CommSemiring S₂
g : S₁ →+* S₂
p : MvPolynomial σ R
n : σ
⊢ (↑(map g) ∘ X) n = X n
[PROOFSTEP]
simp only [map_X, comp_apply]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ eval₂ f g p = ↑(eval g) (↑(map f) p)
[PROOFSTEP]
unfold map eval
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ eval₂ f g p = ↑(eval₂Hom (RingHom.id S₁) g) (↑(eval₂Hom (RingHom.comp C f) X) p)
[PROOFSTEP]
simp only [coe_eval₂Hom]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ eval₂ f g p = eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p)
[PROOFSTEP]
have h := eval₂_comp_left (eval₂Hom (RingHom.id S₁) g) (C.comp f) X p
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
h :
  ↑(eval₂Hom (RingHom.id S₁) g) (eval₂ (RingHom.comp C f) X p) =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (↑(eval₂Hom (RingHom.id S₁) g) ∘ X) p
⊢ eval₂ f g p = eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p)
[PROOFSTEP]
dsimp [-eval₂_id] at h 
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
h :
  eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p) =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (eval₂ (RingHom.id S₁) g ∘ X) p
⊢ eval₂ f g p = eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p)
[PROOFSTEP]
rw [h]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
h :
  eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p) =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (eval₂ (RingHom.id S₁) g ∘ X) p
⊢ eval₂ f g p = eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (eval₂ (RingHom.id S₁) g ∘ X) p
[PROOFSTEP]
congr
[GOAL]
case e_f
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
h :
  eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p) =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (eval₂ (RingHom.id S₁) g ∘ X) p
⊢ f = RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)
[PROOFSTEP]
ext1 a
[GOAL]
case e_f.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
h :
  eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p) =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (eval₂ (RingHom.id S₁) g ∘ X) p
a : R
⊢ ↑f a = ↑(RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) a
[PROOFSTEP]
simp only [coe_eval₂Hom, RingHom.id_apply, comp_apply, eval₂_C, RingHom.coe_comp]
[GOAL]
case e_g
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
h :
  eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p) =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (eval₂ (RingHom.id S₁) g ∘ X) p
⊢ g = eval₂ (RingHom.id S₁) g ∘ X
[PROOFSTEP]
ext1 n
[GOAL]
case e_g.h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n✝ m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
h :
  eval₂ (RingHom.id S₁) g (eval₂ (RingHom.comp C f) X p) =
    eval₂ (RingHom.comp (eval₂Hom (RingHom.id S₁) g) (RingHom.comp C f)) (eval₂ (RingHom.id S₁) g ∘ X) p
n : σ
⊢ g n = (eval₂ (RingHom.id S₁) g ∘ X) n
[PROOFSTEP]
simp only [comp_apply, eval₂_X]
[GOAL]
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ↑k (eval₂ f g p) = eval₂ k (↑k ∘ g) (↑(map f) p)
[PROOFSTEP]
apply MvPolynomial.induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (a : R), ↑k (eval₂ f g (↑C a)) = eval₂ k (↑k ∘ g) (↑(map f) (↑C a))
[PROOFSTEP]
intro r
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
r : R
⊢ ↑k (eval₂ f g (↑C r)) = eval₂ k (↑k ∘ g) (↑(map f) (↑C r))
[PROOFSTEP]
rw [eval₂_C, map_C, eval₂_C]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p q : MvPolynomial σ R),
    ↑k (eval₂ f g p) = eval₂ k (↑k ∘ g) (↑(map f) p) →
      ↑k (eval₂ f g q) = eval₂ k (↑k ∘ g) (↑(map f) q) → ↑k (eval₂ f g (p + q)) = eval₂ k (↑k ∘ g) (↑(map f) (p + q))
[PROOFSTEP]
intro p q hp hq
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝¹ q✝ : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p✝ p q : MvPolynomial σ R
hp : ↑k (eval₂ f g p) = eval₂ k (↑k ∘ g) (↑(map f) p)
hq : ↑k (eval₂ f g q) = eval₂ k (↑k ∘ g) (↑(map f) q)
⊢ ↑k (eval₂ f g (p + q)) = eval₂ k (↑k ∘ g) (↑(map f) (p + q))
[PROOFSTEP]
rw [eval₂_add, k.map_add, (map f).map_add, eval₂_add, hp, hq]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    ↑k (eval₂ f g p) = eval₂ k (↑k ∘ g) (↑(map f) p) → ↑k (eval₂ f g (p * X n)) = eval₂ k (↑k ∘ g) (↑(map f) (p * X n))
[PROOFSTEP]
intro p s hp
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝¹ q : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p✝ p : MvPolynomial σ R
s : σ
hp : ↑k (eval₂ f g p) = eval₂ k (↑k ∘ g) (↑(map f) p)
⊢ ↑k (eval₂ f g (p * X s)) = eval₂ k (↑k ∘ g) (↑(map f) (p * X s))
[PROOFSTEP]
rw [eval₂_mul, k.map_mul, (map f).map_mul, eval₂_mul, map_X, hp, eval₂_X, eval₂_X]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂✝ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝¹ q : MvPolynomial σ R
f✝ : R →+* S₁
S₂ : Type u_2
inst✝ : CommSemiring S₂
k : S₁ →+* S₂
f : R →+* S₁
g : σ → S₁
p✝ p : MvPolynomial σ R
s : σ
hp : ↑k (eval₂ f g p) = eval₂ k (↑k ∘ g) (↑(map f) p)
⊢ eval₂ k (↑k ∘ g) (↑(map f) p) * ↑k (g s) = eval₂ k (↑k ∘ g) (↑(map f) p) * (↑k ∘ g) s
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p : MvPolynomial S₂ R
⊢ ↑(map f) (eval₂ C g p) = eval₂ C (↑(map f) ∘ g) (↑(map f) p)
[PROOFSTEP]
apply MvPolynomial.induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p : MvPolynomial S₂ R
⊢ ∀ (a : R), ↑(map f) (eval₂ C g (↑C a)) = eval₂ C (↑(map f) ∘ g) (↑(map f) (↑C a))
[PROOFSTEP]
intro r
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p : MvPolynomial S₂ R
r : R
⊢ ↑(map f) (eval₂ C g (↑C r)) = eval₂ C (↑(map f) ∘ g) (↑(map f) (↑C r))
[PROOFSTEP]
rw [eval₂_C, map_C, map_C, eval₂_C]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p : MvPolynomial S₂ R
⊢ ∀ (p q : MvPolynomial S₂ R),
    ↑(map f) (eval₂ C g p) = eval₂ C (↑(map f) ∘ g) (↑(map f) p) →
      ↑(map f) (eval₂ C g q) = eval₂ C (↑(map f) ∘ g) (↑(map f) q) →
        ↑(map f) (eval₂ C g (p + q)) = eval₂ C (↑(map f) ∘ g) (↑(map f) (p + q))
[PROOFSTEP]
intro p q hp hq
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝¹ q✝ : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p✝ p q : MvPolynomial S₂ R
hp : ↑(map f) (eval₂ C g p) = eval₂ C (↑(map f) ∘ g) (↑(map f) p)
hq : ↑(map f) (eval₂ C g q) = eval₂ C (↑(map f) ∘ g) (↑(map f) q)
⊢ ↑(map f) (eval₂ C g (p + q)) = eval₂ C (↑(map f) ∘ g) (↑(map f) (p + q))
[PROOFSTEP]
rw [eval₂_add, (map f).map_add, hp, hq, (map f).map_add, eval₂_add]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p : MvPolynomial S₂ R
⊢ ∀ (p : MvPolynomial S₂ R) (n : S₂),
    ↑(map f) (eval₂ C g p) = eval₂ C (↑(map f) ∘ g) (↑(map f) p) →
      ↑(map f) (eval₂ C g (p * X n)) = eval₂ C (↑(map f) ∘ g) (↑(map f) (p * X n))
[PROOFSTEP]
intro p s hp
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝¹ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p✝ p : MvPolynomial S₂ R
s : S₂
hp : ↑(map f) (eval₂ C g p) = eval₂ C (↑(map f) ∘ g) (↑(map f) p)
⊢ ↑(map f) (eval₂ C g (p * X s)) = eval₂ C (↑(map f) ∘ g) (↑(map f) (p * X s))
[PROOFSTEP]
rw [eval₂_mul, (map f).map_mul, hp, (map f).map_mul, map_X, eval₂_mul, eval₂_X, eval₂_X]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝¹ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₂ → MvPolynomial S₃ R
p✝ p : MvPolynomial S₂ R
s : S₂
hp : ↑(map f) (eval₂ C g p) = eval₂ C (↑(map f) ∘ g) (↑(map f) p)
⊢ eval₂ C (↑(map f) ∘ g) (↑(map f) p) * ↑(map f) (g s) = eval₂ C (↑(map f) ∘ g) (↑(map f) p) * (↑(map f) ∘ g) s
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
⊢ ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
[PROOFSTEP]
classical
apply MvPolynomial.induction_on p <;> clear p
· intro r m
  rw [map_C]
  simp only [coeff_C]
  split_ifs
  · rfl
  rw [f.map_zero]
· intro p q hp hq m
  simp only [hp, hq, (map f).map_add, coeff_add]
  rw [f.map_add]
· intro p i hp m
  simp only [hp, (map f).map_mul, map_X]
  simp only [hp, mem_support_iff, coeff_mul_X']
  split_ifs
  · rfl
  rw [f.map_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
⊢ ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
[PROOFSTEP]
apply MvPolynomial.induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
⊢ ∀ (a : R) (m : σ →₀ ℕ), coeff m (↑(map f) (↑C a)) = ↑f (coeff m (↑C a))
[PROOFSTEP]
clear p
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
⊢ ∀ (p q : MvPolynomial σ R),
    (∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)) →
      (∀ (m : σ →₀ ℕ), coeff m (↑(map f) q) = ↑f (coeff m q)) →
        ∀ (m : σ →₀ ℕ), coeff m (↑(map f) (p + q)) = ↑f (coeff m (p + q))
[PROOFSTEP]
clear p
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    (∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)) →
      ∀ (m : σ →₀ ℕ), coeff m (↑(map f) (p * X n)) = ↑f (coeff m (p * X n))
[PROOFSTEP]
clear p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
⊢ ∀ (a : R) (m : σ →₀ ℕ), coeff m (↑(map f) (↑C a)) = ↑f (coeff m (↑C a))
[PROOFSTEP]
intro r m
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
r : R
m : σ →₀ ℕ
⊢ coeff m (↑(map f) (↑C r)) = ↑f (coeff m (↑C r))
[PROOFSTEP]
rw [map_C]
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
r : R
m : σ →₀ ℕ
⊢ coeff m (↑C (↑f r)) = ↑f (coeff m (↑C r))
[PROOFSTEP]
simp only [coeff_C]
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
r : R
m : σ →₀ ℕ
⊢ (if 0 = m then ↑f r else 0) = ↑f (if 0 = m then r else 0)
[PROOFSTEP]
split_ifs
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
r : R
m : σ →₀ ℕ
h✝ : 0 = m
⊢ ↑f r = ↑f r
[PROOFSTEP]
rfl
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
r : R
m : σ →₀ ℕ
h✝ : ¬0 = m
⊢ 0 = ↑f 0
[PROOFSTEP]
rw [f.map_zero]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
⊢ ∀ (p q : MvPolynomial σ R),
    (∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)) →
      (∀ (m : σ →₀ ℕ), coeff m (↑(map f) q) = ↑f (coeff m q)) →
        ∀ (m : σ →₀ ℕ), coeff m (↑(map f) (p + q)) = ↑f (coeff m (p + q))
[PROOFSTEP]
intro p q hp hq m
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
p q : MvPolynomial σ R
hp : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
hq : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) q) = ↑f (coeff m q)
m : σ →₀ ℕ
⊢ coeff m (↑(map f) (p + q)) = ↑f (coeff m (p + q))
[PROOFSTEP]
simp only [hp, hq, (map f).map_add, coeff_add]
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
p q : MvPolynomial σ R
hp : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
hq : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) q) = ↑f (coeff m q)
m : σ →₀ ℕ
⊢ ↑f (coeff m p) + ↑f (coeff m q) = ↑f (coeff m p + coeff m q)
[PROOFSTEP]
rw [f.map_add]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    (∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)) →
      ∀ (m : σ →₀ ℕ), coeff m (↑(map f) (p * X n)) = ↑f (coeff m (p * X n))
[PROOFSTEP]
intro p i hp m
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
i : σ
hp : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
m : σ →₀ ℕ
⊢ coeff m (↑(map f) (p * X i)) = ↑f (coeff m (p * X i))
[PROOFSTEP]
simp only [hp, (map f).map_mul, map_X]
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
i : σ
hp : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
m : σ →₀ ℕ
⊢ coeff m (↑(map f) p * X i) = ↑f (coeff m (p * X i))
[PROOFSTEP]
simp only [hp, mem_support_iff, coeff_mul_X']
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
i : σ
hp : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
m : σ →₀ ℕ
⊢ (if i ∈ m.support then ↑f (coeff (m - Finsupp.single i 1) p) else 0) =
    ↑f (if i ∈ m.support then coeff (m - Finsupp.single i 1) p else 0)
[PROOFSTEP]
split_ifs
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
i : σ
hp : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
m : σ →₀ ℕ
h✝ : i ∈ m.support
⊢ ↑f (coeff (m - Finsupp.single i 1) p) = ↑f (coeff (m - Finsupp.single i 1) p)
[PROOFSTEP]
rfl
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
i : σ
hp : ∀ (m : σ →₀ ℕ), coeff m (↑(map f) p) = ↑f (coeff m p)
m : σ →₀ ℕ
h✝ : ¬i ∈ m.support
⊢ 0 = ↑f 0
[PROOFSTEP]
rw [f.map_zero]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
⊢ Injective ↑(map f)
[PROOFSTEP]
intro p q h
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
p q : MvPolynomial σ R
h : ↑(map f) p = ↑(map f) q
⊢ p = q
[PROOFSTEP]
simp only [ext_iff, coeff_map] at h ⊢
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
p q : MvPolynomial σ R
h : ∀ (m : σ →₀ ℕ), ↑f (coeff m p) = ↑f (coeff m q)
⊢ ∀ (m : σ →₀ ℕ), coeff m p = coeff m q
[PROOFSTEP]
intro m
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q✝ : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
p q : MvPolynomial σ R
h : ∀ (m : σ →₀ ℕ), ↑f (coeff m p) = ↑f (coeff m q)
m : σ →₀ ℕ
⊢ coeff m p = coeff m q
[PROOFSTEP]
exact hf (h m)
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
hf : Surjective ↑f
p : MvPolynomial σ S₁
⊢ ∃ a, ↑(map f) a = p
[PROOFSTEP]
induction' p using MvPolynomial.induction_on' with i fr a b ha hb
[GOAL]
case h1
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
hf : Surjective ↑f
i : σ →₀ ℕ
fr : S₁
⊢ ∃ a, ↑(map f) a = ↑(monomial i) fr
[PROOFSTEP]
obtain ⟨r, rfl⟩ := hf fr
[GOAL]
case h1.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
hf : Surjective ↑f
i : σ →₀ ℕ
r : R
⊢ ∃ a, ↑(map f) a = ↑(monomial i) (↑f r)
[PROOFSTEP]
exact ⟨monomial i r, map_monomial _ _ _⟩
[GOAL]
case h2
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
hf : Surjective ↑f
a b : MvPolynomial σ S₁
ha : ∃ a_1, ↑(map f) a_1 = a
hb : ∃ a, ↑(map f) a = b
⊢ ∃ a_1, ↑(map f) a_1 = a + b
[PROOFSTEP]
obtain ⟨a, rfl⟩ := ha
[GOAL]
case h2.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
hf : Surjective ↑f
b : MvPolynomial σ S₁
hb : ∃ a, ↑(map f) a = b
a : MvPolynomial σ R
⊢ ∃ a_1, ↑(map f) a_1 = ↑(map f) a + b
[PROOFSTEP]
obtain ⟨b, rfl⟩ := hb
[GOAL]
case h2.intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f : R →+* S₁
hf : Surjective ↑f
a b : MvPolynomial σ R
⊢ ∃ a_1, ↑(map f) a_1 = ↑(map f) a + ↑(map f) b
[PROOFSTEP]
exact ⟨a + b, RingHom.map_add _ _ _⟩
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₁ →+* R
hf : LeftInverse ↑f ↑g
X : MvPolynomial σ S₁
⊢ ↑(map f) (↑(map g) X) = X
[PROOFSTEP]
rw [map_map, (RingHom.ext hf : f.comp g = RingHom.id _), map_id]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ↑(eval g) (↑(map f) p) = eval₂ f g p
[PROOFSTEP]
apply MvPolynomial.induction_on p
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (a : R), ↑(eval g) (↑(map f) (↑C a)) = eval₂ f g (↑C a)
[PROOFSTEP]
simp (config := { contextual := true })
[GOAL]
case h_add
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p q : MvPolynomial σ R),
    ↑(eval g) (↑(map f) p) = eval₂ f g p →
      ↑(eval g) (↑(map f) q) = eval₂ f g q → ↑(eval g) (↑(map f) (p + q)) = eval₂ f g (p + q)
[PROOFSTEP]
simp (config := { contextual := true })
[GOAL]
case h_X
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ f : R →+* S₁
g : σ → S₁
p : MvPolynomial σ R
⊢ ∀ (p : MvPolynomial σ R) (n : σ),
    ↑(eval g) (↑(map f) p) = eval₂ f g p → ↑(eval g) (↑(map f) (p * X n)) = eval₂ f g (p * X n)
[PROOFSTEP]
simp (config := { contextual := true })
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝² : CommSemiring R
inst✝¹ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
inst✝ : CommSemiring S₂
f : R →+* S₁
g : σ → S₂
φ : S₁ →+* S₂
p : MvPolynomial σ R
⊢ eval₂ φ g (↑(map f) p) = eval₂ (RingHom.comp φ f) g p
[PROOFSTEP]
rw [← eval_map, ← eval_map, map_map]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
⊢ RingHom.comp constantCoeff (map f) = RingHom.comp f constantCoeff
[PROOFSTEP]
ext
[GOAL]
case hC.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
x✝ : R
⊢ ↑(RingHom.comp (RingHom.comp constantCoeff (map f)) C) x✝ = ↑(RingHom.comp (RingHom.comp f constantCoeff) C) x✝
[PROOFSTEP]
simp
[GOAL]
case hX
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
i✝ : σ
⊢ ↑(RingHom.comp constantCoeff (map f)) (X i✝) = ↑(RingHom.comp f constantCoeff) (X i✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
⊢ support (↑(map f) p) ⊆ support p
[PROOFSTEP]
intro x
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
x : σ →₀ ℕ
⊢ x ∈ support (↑(map f) p) → x ∈ support p
[PROOFSTEP]
simp only [mem_support_iff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
x : σ →₀ ℕ
⊢ coeff x (↑(map f) p) ≠ 0 → coeff x p ≠ 0
[PROOFSTEP]
contrapose!
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
x : σ →₀ ℕ
⊢ coeff x p = 0 → coeff x (↑(map f) p) = 0
[PROOFSTEP]
change p.coeff x = 0 → (map f p).coeff x = 0
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
x : σ →₀ ℕ
⊢ coeff x p = 0 → coeff x (↑(map f) p) = 0
[PROOFSTEP]
rw [coeff_map]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
x : σ →₀ ℕ
⊢ coeff x p = 0 → ↑f (coeff x p) = 0
[PROOFSTEP]
intro hx
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
x : σ →₀ ℕ
hx : coeff x p = 0
⊢ ↑f (coeff x p) = 0
[PROOFSTEP]
rw [hx]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f : R →+* S₁
p : MvPolynomial σ R
x : σ →₀ ℕ
hx : coeff x p = 0
⊢ ↑f 0 = 0
[PROOFSTEP]
exact RingHom.map_zero f
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
⊢ support (↑(map f) p) = support p
[PROOFSTEP]
apply Finset.Subset.antisymm
[GOAL]
case H₁
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
⊢ support (↑(map f) p) ⊆ support p
[PROOFSTEP]
exact MvPolynomial.support_map_subset _ _
[GOAL]
case H₂
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
⊢ support p ⊆ support (↑(map f) p)
[PROOFSTEP]
intro x hx
[GOAL]
case H₂
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
x : σ →₀ ℕ
hx : x ∈ support p
⊢ x ∈ support (↑(map f) p)
[PROOFSTEP]
rw [mem_support_iff]
[GOAL]
case H₂
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
x : σ →₀ ℕ
hx : x ∈ support p
⊢ coeff x (↑(map f) p) ≠ 0
[PROOFSTEP]
contrapose! hx
[GOAL]
case H₂
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
x : σ →₀ ℕ
hx : coeff x (↑(map f) p) = 0
⊢ ¬x ∈ support p
[PROOFSTEP]
simp only [Classical.not_not, mem_support_iff]
[GOAL]
case H₂
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
x : σ →₀ ℕ
hx : coeff x (↑(map f) p) = 0
⊢ coeff x p = 0
[PROOFSTEP]
replace hx : (map f p).coeff x = 0 := hx
[GOAL]
case H₂
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
x : σ →₀ ℕ
hx : coeff x (↑(map f) p) = 0
⊢ coeff x p = 0
[PROOFSTEP]
rw [coeff_map, ← f.map_zero] at hx 
[GOAL]
case H₂
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p✝ q : MvPolynomial σ R
f✝ : R →+* S₁
p : MvPolynomial σ R
f : R →+* S₁
hf : Injective ↑f
x : σ →₀ ℕ
hx : ↑f (coeff x p) = ↑f 0
⊢ coeff x p = 0
[PROOFSTEP]
exact hf hx
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q✝ : MvPolynomial σ R
f q : R →+* S₁
r : R
hr : ∀ (r' : R), ↑q r' = 0 ↔ r ∣ r'
φ : MvPolynomial σ R
⊢ ↑C r ∣ φ ↔ ↑(map q) φ = 0
[PROOFSTEP]
rw [C_dvd_iff_dvd_coeff, MvPolynomial.ext_iff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q✝ : MvPolynomial σ R
f q : R →+* S₁
r : R
hr : ∀ (r' : R), ↑q r' = 0 ↔ r ∣ r'
φ : MvPolynomial σ R
⊢ (∀ (i : σ →₀ ℕ), r ∣ coeff i φ) ↔ ∀ (m : σ →₀ ℕ), coeff m (↑(map q) φ) = coeff m 0
[PROOFSTEP]
simp only [coeff_map, coeff_zero, hr]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₁ → R
hg : g 0 = 0
φ : MvPolynomial σ S₁
⊢ ↑(map f) (mapRange g hg φ) = φ ↔ ∀ (d : σ →₀ ℕ), ↑f (g (coeff d φ)) = coeff d φ
[PROOFSTEP]
rw [MvPolynomial.ext_iff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₁ → R
hg : g 0 = 0
φ : MvPolynomial σ S₁
⊢ (∀ (m : σ →₀ ℕ), coeff m (↑(map f) (mapRange g hg φ)) = coeff m φ) ↔ ∀ (d : σ →₀ ℕ), ↑f (g (coeff d φ)) = coeff d φ
[PROOFSTEP]
apply forall_congr'
[GOAL]
case h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₁ → R
hg : g 0 = 0
φ : MvPolynomial σ S₁
⊢ ∀ (a : σ →₀ ℕ), coeff a (↑(map f) (mapRange g hg φ)) = coeff a φ ↔ ↑f (g (coeff a φ)) = coeff a φ
[PROOFSTEP]
intro m
[GOAL]
case h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₁ → R
hg : g 0 = 0
φ : MvPolynomial σ S₁
m : σ →₀ ℕ
⊢ coeff m (↑(map f) (mapRange g hg φ)) = coeff m φ ↔ ↑f (g (coeff m φ)) = coeff m φ
[PROOFSTEP]
rw [coeff_map]
[GOAL]
case h
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₁ → R
hg : g 0 = 0
φ : MvPolynomial σ S₁
m : σ →₀ ℕ
⊢ ↑f (coeff m (mapRange g hg φ)) = coeff m φ ↔ ↑f (g (coeff m φ)) = coeff m φ
[PROOFSTEP]
apply eq_iff_eq_cancel_right.mpr
[GOAL]
case h.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m✝ : σ
s : σ →₀ ℕ
inst✝¹ : CommSemiring R
inst✝ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ f : R →+* S₁
g : S₁ → R
hg : g 0 = 0
φ : MvPolynomial σ S₁
m : σ →₀ ℕ
⊢ ↑f (coeff m (mapRange g hg φ)) = ↑f (g (coeff m φ))
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
inst✝² : CommSemiring S₂
inst✝¹ : Algebra R S₁
inst✝ : Algebra R S₂
f : S₁ →ₐ[R] S₂
src✝ : MvPolynomial σ S₁ →+* MvPolynomial σ S₂ := map ↑f
r : R
⊢ OneHom.toFun
      (↑↑{ toMonoidHom := ↑src✝, map_zero' := (_ : OneHom.toFun (↑↑src✝) 0 = 0),
            map_add' :=
              (_ :
                ∀ (x y : MvPolynomial σ S₁),
                  OneHom.toFun (↑↑src✝) (x + y) = OneHom.toFun (↑↑src✝) x + OneHom.toFun (↑↑src✝) y) })
      (↑(algebraMap R (MvPolynomial σ S₁)) r) =
    ↑(algebraMap R (MvPolynomial σ S₂)) r
[PROOFSTEP]
have h₁ : algebraMap R (MvPolynomial σ S₁) r = C (algebraMap R S₁ r) := rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
inst✝² : CommSemiring S₂
inst✝¹ : Algebra R S₁
inst✝ : Algebra R S₂
f : S₁ →ₐ[R] S₂
src✝ : MvPolynomial σ S₁ →+* MvPolynomial σ S₂ := map ↑f
r : R
h₁ : ↑(algebraMap R (MvPolynomial σ S₁)) r = ↑C (↑(algebraMap R S₁) r)
⊢ OneHom.toFun
      (↑↑{ toMonoidHom := ↑src✝, map_zero' := (_ : OneHom.toFun (↑↑src✝) 0 = 0),
            map_add' :=
              (_ :
                ∀ (x y : MvPolynomial σ S₁),
                  OneHom.toFun (↑↑src✝) (x + y) = OneHom.toFun (↑↑src✝) x + OneHom.toFun (↑↑src✝) y) })
      (↑(algebraMap R (MvPolynomial σ S₁)) r) =
    ↑(algebraMap R (MvPolynomial σ S₂)) r
[PROOFSTEP]
have h₂ : algebraMap R (MvPolynomial σ S₂) r = C (algebraMap R S₂ r) := rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
inst✝² : CommSemiring S₂
inst✝¹ : Algebra R S₁
inst✝ : Algebra R S₂
f : S₁ →ₐ[R] S₂
src✝ : MvPolynomial σ S₁ →+* MvPolynomial σ S₂ := map ↑f
r : R
h₁ : ↑(algebraMap R (MvPolynomial σ S₁)) r = ↑C (↑(algebraMap R S₁) r)
h₂ : ↑(algebraMap R (MvPolynomial σ S₂)) r = ↑C (↑(algebraMap R S₂) r)
⊢ OneHom.toFun
      (↑↑{ toMonoidHom := ↑src✝, map_zero' := (_ : OneHom.toFun (↑↑src✝) 0 = 0),
            map_add' :=
              (_ :
                ∀ (x y : MvPolynomial σ S₁),
                  OneHom.toFun (↑↑src✝) (x + y) = OneHom.toFun (↑↑src✝) x + OneHom.toFun (↑↑src✝) y) })
      (↑(algebraMap R (MvPolynomial σ S₁)) r) =
    ↑(algebraMap R (MvPolynomial σ S₂)) r
[PROOFSTEP]
simp_rw [OneHom.toFun_eq_coe]
  -- porting note: we're missing some `simp` lemmas like `MonoidHom.coe_toOneHom`
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
inst✝² : CommSemiring S₂
inst✝¹ : Algebra R S₁
inst✝ : Algebra R S₂
f : S₁ →ₐ[R] S₂
src✝ : MvPolynomial σ S₁ →+* MvPolynomial σ S₂ := map ↑f
r : R
h₁ : ↑(algebraMap R (MvPolynomial σ S₁)) r = ↑C (↑(algebraMap R S₁) r)
h₂ : ↑(algebraMap R (MvPolynomial σ S₂)) r = ↑C (↑(algebraMap R S₂) r)
⊢ ↑↑↑(map ↑f) (↑(algebraMap R (MvPolynomial σ S₁)) r) = ↑(algebraMap R (MvPolynomial σ S₂)) r
[PROOFSTEP]
change @FunLike.coe (_ →+* _) _ _ _ _ _ = _
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p q : MvPolynomial σ R
f✝ : R →+* S₁
inst✝² : CommSemiring S₂
inst✝¹ : Algebra R S₁
inst✝ : Algebra R S₂
f : S₁ →ₐ[R] S₂
src✝ : MvPolynomial σ S₁ →+* MvPolynomial σ S₂ := map ↑f
r : R
h₁ : ↑(algebraMap R (MvPolynomial σ S₁)) r = ↑C (↑(algebraMap R S₁) r)
h₂ : ↑(algebraMap R (MvPolynomial σ S₂)) r = ↑C (↑(algebraMap R S₂) r)
⊢ ↑(map ↑f) (↑(algebraMap R (MvPolynomial σ S₁)) r) = ↑(algebraMap R (MvPolynomial σ S₂)) r
[PROOFSTEP]
rw [h₁, h₂, map, eval₂Hom_C, RingHom.comp_apply, AlgHom.coe_toRingHom, AlgHom.commutes]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f : σ → S₁
φ : MvPolynomial σ R →ₐ[R] S₁
⊢ φ = aeval (↑φ ∘ X)
[PROOFSTEP]
ext i
[GOAL]
case hf
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f : σ → S₁
φ : MvPolynomial σ R →ₐ[R] S₁
i : σ
⊢ ↑φ (X i) = ↑(aeval (↑φ ∘ X)) (X i)
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝³ : Algebra R S₁
inst✝² : CommSemiring S₂
f : σ → S₁
B : Type u_2
inst✝¹ : CommSemiring B
inst✝ : Algebra R B
φ : S₁ →ₐ[R] B
⊢ AlgHom.comp φ (aeval f) = aeval fun i => ↑φ (f i)
[PROOFSTEP]
ext i
[GOAL]
case hf
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁵ : CommSemiring R
inst✝⁴ : CommSemiring S₁
p q : MvPolynomial σ R
inst✝³ : Algebra R S₁
inst✝² : CommSemiring S₂
f : σ → S₁
B : Type u_2
inst✝¹ : CommSemiring B
inst✝ : Algebra R B
φ : S₁ →ₐ[R] B
i : σ
⊢ ↑(AlgHom.comp φ (aeval f)) (X i) = ↑(aeval fun i => ↑φ (f i)) (X i)
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
inst✝² : Algebra R S₁
inst✝¹ : CommSemiring S₂
f : σ → S₁
B : Type u_2
inst✝ : CommSemiring B
g : σ → S₁
φ : S₁ →+* B
p : MvPolynomial σ R
⊢ ↑φ (↑(aeval g) p) = ↑(eval₂Hom (RingHom.comp φ (algebraMap R S₁)) fun i => ↑φ (g i)) p
[PROOFSTEP]
rw [← comp_eval₂Hom]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
inst✝² : Algebra R S₁
inst✝¹ : CommSemiring S₂
f : σ → S₁
B : Type u_2
inst✝ : CommSemiring B
g : σ → S₁
φ : S₁ →+* B
p : MvPolynomial σ R
⊢ ↑φ (↑(aeval g) p) = ↑(RingHom.comp φ (eval₂Hom (algebraMap R S₁) fun i => g i)) p
[PROOFSTEP]
rfl
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
⊢ eval₂Hom f 0 = RingHom.comp f constantCoeff
[PROOFSTEP]
ext
[GOAL]
case hC.a
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
x✝ : R
⊢ ↑(RingHom.comp (eval₂Hom f 0) C) x✝ = ↑(RingHom.comp (RingHom.comp f constantCoeff) C) x✝
[PROOFSTEP]
simp
[GOAL]
case hX
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
i✝ : σ
⊢ ↑(eval₂Hom f 0) (X i✝) = ↑(RingHom.comp f constantCoeff) (X i✝)
[PROOFSTEP]
simp
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
g : σ → S₂
φ : MvPolynomial σ R
h : ∀ (d : σ →₀ ℕ), coeff d φ ≠ 0 → ∃ i, i ∈ d.support ∧ g i = 0
⊢ ↑(eval₂Hom f g) φ = 0
[PROOFSTEP]
rw [φ.as_sum, map_sum]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
g : σ → S₂
φ : MvPolynomial σ R
h : ∀ (d : σ →₀ ℕ), coeff d φ ≠ 0 → ∃ i, i ∈ d.support ∧ g i = 0
⊢ ∑ x in support φ, ↑(eval₂Hom f g) (↑(monomial x) (coeff x φ)) = 0
[PROOFSTEP]
refine Finset.sum_eq_zero fun d hd => ?_
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
g : σ → S₂
φ : MvPolynomial σ R
h : ∀ (d : σ →₀ ℕ), coeff d φ ≠ 0 → ∃ i, i ∈ d.support ∧ g i = 0
d : σ →₀ ℕ
hd : d ∈ support φ
⊢ ↑(eval₂Hom f g) (↑(monomial d) (coeff d φ)) = 0
[PROOFSTEP]
obtain ⟨i, hi, hgi⟩ : ∃ i ∈ d.support, g i = 0 := h d (Finsupp.mem_support_iff.mp hd)
[GOAL]
case intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
g : σ → S₂
φ : MvPolynomial σ R
h : ∀ (d : σ →₀ ℕ), coeff d φ ≠ 0 → ∃ i, i ∈ d.support ∧ g i = 0
d : σ →₀ ℕ
hd : d ∈ support φ
i : σ
hi : i ∈ d.support
hgi : g i = 0
⊢ ↑(eval₂Hom f g) (↑(monomial d) (coeff d φ)) = 0
[PROOFSTEP]
rw [eval₂Hom_monomial, Finsupp.prod, Finset.prod_eq_zero hi, mul_zero]
[GOAL]
case intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
g : σ → S₂
φ : MvPolynomial σ R
h : ∀ (d : σ →₀ ℕ), coeff d φ ≠ 0 → ∃ i, i ∈ d.support ∧ g i = 0
d : σ →₀ ℕ
hd : d ∈ support φ
i : σ
hi : i ∈ d.support
hgi : g i = 0
⊢ g i ^ ↑d i = 0
[PROOFSTEP]
rw [hgi, zero_pow]
[GOAL]
case intro.intro
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f✝ : σ → S₁
f : R →+* S₂
g : σ → S₂
φ : MvPolynomial σ R
h : ∀ (d : σ →₀ ℕ), coeff d φ ≠ 0 → ∃ i, i ∈ d.support ∧ g i = 0
d : σ →₀ ℕ
hd : d ∈ support φ
i : σ
hi : i ∈ d.support
hgi : g i = 0
⊢ 0 < ↑d i
[PROOFSTEP]
rwa [pos_iff_ne_zero, ← Finsupp.mem_support_iff]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f : σ → S₁
⊢ Algebra.adjoin R (range f) = AlgHom.range (aeval f)
[PROOFSTEP]
simp only [← Algebra.map_top, ← MvPolynomial.adjoin_range_X, AlgHom.map_adjoin, ← Set.range_comp, (· ∘ ·),
  MvPolynomial.aeval_X]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝³ : CommSemiring R
inst✝² : CommSemiring S₁
p q : MvPolynomial σ R
inst✝¹ : Algebra R S₁
inst✝ : CommSemiring S₂
f : σ → S₁
s : Set S₁
⊢ Algebra.adjoin R s = AlgHom.range (aeval Subtype.val)
[PROOFSTEP]
rw [← Algebra.adjoin_range_eq_range_aeval, Subtype.range_coe]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁷ : CommSemiring R
inst✝⁶ : CommSemiring S₁
p q : MvPolynomial σ R
S : Type u_2
A : Type u_3
B : Type u_4
inst✝⁵ : CommSemiring S
inst✝⁴ : CommSemiring A
inst✝³ : CommSemiring B
inst✝² : Algebra S R
inst✝¹ : Algebra S A
inst✝ : Algebra S B
f : R →ₐ[S] A
X : σ → A
src✝ : MvPolynomial σ R →+* A := eval₂Hom (↑f) X
r : S
⊢ OneHom.toFun
      (↑↑{ toMonoidHom := ↑src✝, map_zero' := (_ : OneHom.toFun (↑↑src✝) 0 = 0),
            map_add' :=
              (_ :
                ∀ (x y : MvPolynomial σ R),
                  OneHom.toFun (↑↑src✝) (x + y) = OneHom.toFun (↑↑src✝) x + OneHom.toFun (↑↑src✝) y) })
      (↑(algebraMap S (MvPolynomial σ R)) r) =
    ↑(algebraMap S A) r
[PROOFSTEP]
simp [IsScalarTower.algebraMap_eq S R (MvPolynomial σ R), algebraMap_eq]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁷ : CommSemiring R
inst✝⁶ : CommSemiring S₁
p q : MvPolynomial σ R
S : Type u_2
A : Type u_3
B : Type u_4
inst✝⁵ : CommSemiring S
inst✝⁴ : CommSemiring A
inst✝³ : CommSemiring B
inst✝² : Algebra S R
inst✝¹ : Algebra S A
inst✝ : Algebra S B
g : R →ₐ[S] A
y : σ → A
⊢ aevalTower (AlgHom.id S S) = aeval
[PROOFSTEP]
ext
[GOAL]
case h.hf
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁷ : CommSemiring R
inst✝⁶ : CommSemiring S₁
p q : MvPolynomial σ R
S : Type u_2
A : Type u_3
B : Type u_4
inst✝⁵ : CommSemiring S
inst✝⁴ : CommSemiring A
inst✝³ : CommSemiring B
inst✝² : Algebra S R
inst✝¹ : Algebra S A
inst✝ : Algebra S B
g : R →ₐ[S] A
y : σ → A
x✝ : σ → S
i✝ : σ
⊢ ↑(aevalTower (AlgHom.id S S) x✝) (X i✝) = ↑(aeval x✝) (X i✝)
[PROOFSTEP]
simp only [aevalTower_X, aeval_X]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁷ : CommSemiring R
inst✝⁶ : CommSemiring S₁
p q : MvPolynomial σ R
S : Type u_2
A : Type u_3
B : Type u_4
inst✝⁵ : CommSemiring S
inst✝⁴ : CommSemiring A
inst✝³ : CommSemiring B
inst✝² : Algebra S R
inst✝¹ : Algebra S A
inst✝ : Algebra S B
g : R →ₐ[S] A
y : σ → A
⊢ aevalTower (Algebra.ofId S A) = aeval
[PROOFSTEP]
ext
[GOAL]
case h.hf
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s : σ →₀ ℕ
inst✝⁷ : CommSemiring R
inst✝⁶ : CommSemiring S₁
p q : MvPolynomial σ R
S : Type u_2
A : Type u_3
B : Type u_4
inst✝⁵ : CommSemiring S
inst✝⁴ : CommSemiring A
inst✝³ : CommSemiring B
inst✝² : Algebra S R
inst✝¹ : Algebra S A
inst✝ : Algebra S B
g : R →ₐ[S] A
y x✝ : σ → A
i✝ : σ
⊢ ↑(aevalTower (Algebra.ofId S A) x✝) (X i✝) = ↑(aeval x✝) (X i✝)
[PROOFSTEP]
simp only [aeval_X, aevalTower_X]
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
hs : ∀ (i : σ →₀ ℕ), i ∈ support p → ↑f (coeff i p) ∈ s
v : σ → S
hv : ∀ (i : σ), v i ∈ s
⊢ eval₂ f v p ∈ s
[PROOFSTEP]
classical
replace hs : ∀ i, f (p.coeff i) ∈ s
· intro i
  by_cases hi : i ∈ p.support
  · exact hs i hi
  · rw [MvPolynomial.not_mem_support_iff.1 hi, f.map_zero]
    exact zero_mem s
induction' p using MvPolynomial.induction_on''' with a a b f ha _ ih
· simpa using hs 0
rw [eval₂_add, eval₂_monomial]
refine' add_mem (mul_mem _ <| prod_mem fun i _ => pow_mem (hv _) _) (ih fun i => _)
· have := hs a
  rwa [coeff_add, MvPolynomial.not_mem_support_iff.1 ha, add_zero, coeff_monomial, if_pos rfl] at this 
have := hs i
rw [coeff_add, coeff_monomial] at this 
split_ifs at this  with h
· subst h
  rw [MvPolynomial.not_mem_support_iff.1 ha, map_zero]
  exact zero_mem _
· rwa [if_neg h, zero_add] at this 
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
hs : ∀ (i : σ →₀ ℕ), i ∈ support p → ↑f (coeff i p) ∈ s
v : σ → S
hv : ∀ (i : σ), v i ∈ s
⊢ eval₂ f v p ∈ s
[PROOFSTEP]
replace hs : ∀ i, f (p.coeff i) ∈ s
[GOAL]
case hs
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
hs : ∀ (i : σ →₀ ℕ), i ∈ support p → ↑f (coeff i p) ∈ s
v : σ → S
hv : ∀ (i : σ), v i ∈ s
⊢ ∀ (i : σ →₀ ℕ), ↑f (coeff i p) ∈ s
[PROOFSTEP]
intro i
[GOAL]
case hs
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
hs : ∀ (i : σ →₀ ℕ), i ∈ support p → ↑f (coeff i p) ∈ s
v : σ → S
hv : ∀ (i : σ), v i ∈ s
i : σ →₀ ℕ
⊢ ↑f (coeff i p) ∈ s
[PROOFSTEP]
by_cases hi : i ∈ p.support
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
hs : ∀ (i : σ →₀ ℕ), i ∈ support p → ↑f (coeff i p) ∈ s
v : σ → S
hv : ∀ (i : σ), v i ∈ s
i : σ →₀ ℕ
hi : i ∈ support p
⊢ ↑f (coeff i p) ∈ s
[PROOFSTEP]
exact hs i hi
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
hs : ∀ (i : σ →₀ ℕ), i ∈ support p → ↑f (coeff i p) ∈ s
v : σ → S
hv : ∀ (i : σ), v i ∈ s
i : σ →₀ ℕ
hi : ¬i ∈ support p
⊢ ↑f (coeff i p) ∈ s
[PROOFSTEP]
rw [MvPolynomial.not_mem_support_iff.1 hi, f.map_zero]
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
hs : ∀ (i : σ →₀ ℕ), i ∈ support p → ↑f (coeff i p) ∈ s
v : σ → S
hv : ∀ (i : σ), v i ∈ s
i : σ →₀ ℕ
hi : ¬i ∈ support p
⊢ 0 ∈ s
[PROOFSTEP]
exact zero_mem s
[GOAL]
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs : ∀ (i : σ →₀ ℕ), ↑f (coeff i p) ∈ s
⊢ eval₂ f v p ∈ s
[PROOFSTEP]
induction' p using MvPolynomial.induction_on''' with a a b f ha _ ih
[GOAL]
case h_C
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f (coeff i p) ∈ s
a : R
hs : ∀ (i : σ →₀ ℕ), ↑f (coeff i (↑C a)) ∈ s
⊢ eval₂ f v (↑C a) ∈ s
[PROOFSTEP]
simpa using hs 0
[GOAL]
case h_add_weak
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
⊢ eval₂ f✝ v
      ((let_fun this := ↑(monomial a) b;
        this) +
        f) ∈
    s
[PROOFSTEP]
rw [eval₂_add, eval₂_monomial]
[GOAL]
case h_add_weak
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
⊢ (↑f✝ b * Finsupp.prod a fun n e => v n ^ e) + eval₂ f✝ v f ∈ s
[PROOFSTEP]
refine' add_mem (mul_mem _ <| prod_mem fun i _ => pow_mem (hv _) _) (ih fun i => _)
[GOAL]
case h_add_weak.refine'_1
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
⊢ ↑f✝ b ∈ s
[PROOFSTEP]
have := hs a
[GOAL]
case h_add_weak.refine'_1
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
this :
  ↑f✝
      (coeff a
        ((let_fun this := ↑(monomial a) b;
          this) +
          f)) ∈
    s
⊢ ↑f✝ b ∈ s
[PROOFSTEP]
rwa [coeff_add, MvPolynomial.not_mem_support_iff.1 ha, add_zero, coeff_monomial, if_pos rfl] at this 
[GOAL]
case h_add_weak.refine'_2
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
i : σ →₀ ℕ
⊢ ↑f✝ (coeff i f) ∈ s
[PROOFSTEP]
have := hs i
[GOAL]
case h_add_weak.refine'_2
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
i : σ →₀ ℕ
this :
  ↑f✝
      (coeff i
        ((let_fun this := ↑(monomial a) b;
          this) +
          f)) ∈
    s
⊢ ↑f✝ (coeff i f) ∈ s
[PROOFSTEP]
rw [coeff_add, coeff_monomial] at this 
[GOAL]
case h_add_weak.refine'_2
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
i : σ →₀ ℕ
this✝ :
  ↑f✝
      (coeff i
          (let_fun this := ↑(monomial a) b;
          this) +
        coeff i f) ∈
    s
this : ↑f✝ ((if a = i then b else 0) + coeff i f) ∈ s
⊢ ↑f✝ (coeff i f) ∈ s
[PROOFSTEP]
split_ifs at this  with h
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
i : σ →₀ ℕ
this✝ :
  ↑f✝
      (coeff i
          (let_fun this := ↑(monomial a) b;
          this) +
        coeff i f) ∈
    s
this : ↑f✝ ((if a = i then b else 0) + coeff i f) ∈ s
h : a = i
⊢ ↑f✝ (coeff i f) ∈ s
[PROOFSTEP]
subst h
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
this✝ :
  ↑f✝
      (coeff a
          (let_fun this := ↑(monomial a) b;
          this) +
        coeff a f) ∈
    s
this : ↑f✝ ((if a = a then b else 0) + coeff a f) ∈ s
⊢ ↑f✝ (coeff a f) ∈ s
[PROOFSTEP]
rw [MvPolynomial.not_mem_support_iff.1 ha, map_zero]
[GOAL]
case pos
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
this✝ :
  ↑f✝
      (coeff a
          (let_fun this := ↑(monomial a) b;
          this) +
        coeff a f) ∈
    s
this : ↑f✝ ((if a = a then b else 0) + coeff a f) ∈ s
⊢ 0 ∈ s
[PROOFSTEP]
exact zero_mem _
[GOAL]
case neg
R : Type u
S₁ : Type v
S₂ : Type w
S₃ : Type x
σ : Type u_1
a✝¹ a' a₁ a₂ : R
e : ℕ
n m : σ
s✝ : σ →₀ ℕ
inst✝⁴ : CommSemiring R
inst✝³ : CommSemiring S₁
p✝ q : MvPolynomial σ R
S : Type u_2
subS : Type u_3
inst✝² : CommSemiring S
inst✝¹ : SetLike subS S
inst✝ : SubsemiringClass subS S
f✝ : R →+* S
p : MvPolynomial σ R
s : subS
v : σ → S
hv : ∀ (i : σ), v i ∈ s
hs✝ : ∀ (i : σ →₀ ℕ), ↑f✝ (coeff i p) ∈ s
a : σ →₀ ℕ
b : R
f : (σ →₀ ℕ) →₀ R
ha : ¬a ∈ f.support
a✝ : b ≠ 0
ih : (∀ (i : σ →₀ ℕ), ↑f✝ (coeff i f) ∈ s) → eval₂ f✝ v f ∈ s
hs :
  ∀ (i : σ →₀ ℕ),
    ↑f✝
        (coeff i
          ((let_fun this := ↑(monomial a) b;
            this) +
            f)) ∈
      s
i : σ →₀ ℕ
this✝ :
  ↑f✝
      (coeff i
          (let_fun this := ↑(monomial a) b;
          this) +
        coeff i f) ∈
    s
this : ↑f✝ ((if a = i then b else 0) + coeff i f) ∈ s
h : ¬a = i
⊢ ↑f✝ (coeff i f) ∈ s
[PROOFSTEP]
rwa [if_neg h, zero_add] at this 
