Theorem: MvPolynomial.aeval_natDegree_le
File: Mathlib/RingTheory/Polynomial/Basic.lean

Proof steps:
state_before: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
⊢ ((aeval f) F).natDegree ≤ m * n
state_after: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
⊢ (Finsupp.sum F fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e).natDegree ≤ m * n
tactic: rw [MvPolynomial.aeval_def, MvPolynomial.eval₂]
state_before: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
⊢ (Finsupp.sum F fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e).natDegree ≤ m * n
state_after: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
⊢ fold max 0 (natDegree ∘ fun i => (fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e) i (F i)) F.support ≤
    m * n
tactic: apply (Polynomial.natDegree_sum_le _ _).trans
state_before: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
⊢ fold max 0 (natDegree ∘ fun i => (fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e) i (F i)) F.support ≤
    m * n
state_after: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
⊢ ∀ b ∈ F.support,
    (natDegree ∘ fun i => (fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e) i (F i)) b ≤ m * n
tactic: apply Finset.sup_le
state_before: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
⊢ ∀ b ∈ F.support,
    (natDegree ∘ fun i => (fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e) i (F i)) b ≤ m * n
state_after: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ (natDegree ∘ fun i => (fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e) i (F i)) d ≤ m * n
tactic: intro d hd
state_before: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ (natDegree ∘ fun i => (fun s a => (algebraMap R R[X]) a * s.prod fun n e => f n ^ e) i (F i)) d ≤ m * n
state_after: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ (Polynomial.C (F d) * d.prod fun n e => f n ^ e).natDegree ≤ m * n
tactic: simp_rw [Function.comp_apply, ← C_eq_algebraMap]
state_before: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ (Polynomial.C (F d) * d.prod fun n e => f n ^ e).natDegree ≤ m * n
state_after: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ (d.prod fun n e => f n ^ e).natDegree ≤ m * n
tactic: apply (Polynomial.natDegree_C_mul_le _ _).trans
state_before: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ (d.prod fun n e => f n ^ e).natDegree ≤ m * n
state_after: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ ∑ i ∈ d.support, ((fun n e => f n ^ e) i (d i)).natDegree ≤ m * n
tactic: apply (Polynomial.natDegree_prod_le _ _).trans
state_before: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
⊢ ∑ i ∈ d.support, ((fun n e => f n ^ e) i (d i)).natDegree ≤ m * n
state_after: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
⊢ ∑ i ∈ d.support, ((fun n e => f n ^ e) i (d i)).natDegree ≤ m * n
tactic: have : ∑ i ∈ d.support, (d i) * n ≤ m * n := by
    rw [← Finset.sum_mul]
    apply mul_le_mul' (.trans _ hF) le_rfl
    rw [MvPolynomial.totalDegree]
    exact Finset.le_sup_of_le hd le_rfl
state_before: case a
R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
⊢ ∑ i ∈ d.support, ((fun n e => f n ^ e) i (d i)).natDegree ≤ m * n
state_after: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
⊢ ∀ i ∈ d.support, ((fun n e => f n ^ e) i (d i)).natDegree ≤ d i * n
tactic: apply (Finset.sum_le_sum _).trans this
state_before: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
⊢ ∀ i ∈ d.support, ((fun n e => f n ^ e) i (d i)).natDegree ≤ d i * n
state_after: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
i : σ
⊢ ((fun n e => f n ^ e) i (d i)).natDegree ≤ d i * n
tactic: rintro i -
state_before: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
i : σ
⊢ ((fun n e => f n ^ e) i (d i)).natDegree ≤ d i * n
state_after: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
i : σ
⊢ d i * (f i).natDegree ≤ d i * n
tactic: apply Polynomial.natDegree_pow_le.trans
state_before: R✝ : Type u
S : Type u_1
σ : Type v
M : Type w
inst✝⁴ : CommRing R✝
inst✝³ : CommRing S
inst✝² : AddCommGroup M
inst✝¹ : Module R✝ M
R : Type u_2
inst✝ : CommSemiring R
m n : ℕ
F : MvPolynomial σ R
hF : F.totalDegree ≤ m
f : σ → R[X]
hf : ∀ (i : σ), (f i).natDegree ≤ n
d : σ →₀ ℕ
hd : d ∈ F.support
this : ∑ i ∈ d.support, d i * n ≤ m * n
i : σ
⊢ d i * (f i).natDegree ≤ d i * n
state_after: no goals
tactic: exact mul_le_mul' le_rfl (hf i)