@@ -44,6 +44,17 @@ lemma eval₂_congr {R S : Type*} [semiring R] [semiring S]
44
44
f = g → s = t → φ = ψ → eval₂ f s φ = eval₂ g t ψ :=
45
45
by rintro rfl rfl rfl; refl
46
46
47
+ @[simp] lemma eval₂_at_zero : p.eval₂ f 0 = f (coeff p 0 ) :=
48
+ begin
49
+ -- This proof is lame, and the `finsupp` API shows through.
50
+ simp only [eval₂_eq_sum, zero_pow_eq, mul_ite, mul_zero, mul_one, finsupp.sum_ite_eq'],
51
+ split_ifs,
52
+ { refl, },
53
+ { simp only [not_not, finsupp.mem_support_iff, ne.def] at h,
54
+ apply_fun f at h,
55
+ simpa using h.symm, },
56
+ end
57
+
47
58
@[simp] lemma eval₂_zero : (0 : polynomial R).eval₂ f x = 0 :=
48
59
finsupp.sum_zero_index
49
60
@@ -236,6 +247,26 @@ begin
236
247
exact P.eval_eq_finset_sum x
237
248
end
238
249
250
+ @[simp] lemma eval₂_at_apply {S : Type *} [semiring S] (f : R →+* S) (r : R) :
251
+ p.eval₂ f (f r) = f (p.eval r) :=
252
+ begin
253
+ rw [eval₂_eq_sum, eval_eq_sum, finsupp.sum, finsupp.sum, f.map_sum],
254
+ simp only [f.map_mul, f.map_pow],
255
+ end
256
+
257
+ @[simp] lemma eval₂_at_one {S : Type *} [semiring S] (f : R →+* S) : p.eval₂ f 1 = f (p.eval 1 ) :=
258
+ begin
259
+ convert eval₂_at_apply f 1 ,
260
+ simp,
261
+ end
262
+
263
+ @[simp] lemma eval₂_at_nat_cast {S : Type *} [semiring S] (f : R →+* S) (n : ℕ) :
264
+ p.eval₂ f n = f (p.eval n) :=
265
+ begin
266
+ convert eval₂_at_apply f n,
267
+ simp,
268
+ end
269
+
239
270
@[simp] lemma eval_C : (C a).eval x = a := eval₂_C _ _
240
271
241
272
@[simp] lemma eval_nat_cast {n : ℕ} : (n : polynomial R).eval x = n :=
@@ -260,6 +291,35 @@ eval₂_monomial _ _
260
291
(s • p).eval x = s * p.eval x :=
261
292
eval₂_smul (ring_hom.id _) _ _
262
293
294
+ @[simp] lemma eval_C_mul : (C a * p).eval x = a * p.eval x :=
295
+ begin
296
+ apply polynomial.induction_on' p,
297
+ { intros p q ph qh,
298
+ simp only [mul_add, eval_add, ph, qh], },
299
+ { intros n b,
300
+ simp [mul_assoc], }
301
+ end
302
+
303
+ @[simp] lemma eval_nat_cast_mul {n : ℕ} : ((n : polynomial R) * p).eval x = n * p.eval x :=
304
+ by rw [←C_eq_nat_cast, eval_C_mul]
305
+
306
+ @[simp] lemma eval_mul_X : (p * X).eval x = p.eval x * x :=
307
+ begin
308
+ apply polynomial.induction_on' p,
309
+ { intros p q ph qh,
310
+ simp only [add_mul, eval_add, ph, qh], },
311
+ { intros n a,
312
+ simp only [←monomial_one_one_eq_X, monomial_mul_monomial, eval_monomial,
313
+ mul_one, pow_succ', mul_assoc], }
314
+ end
315
+
316
+ @[simp] lemma eval_mul_X_pow {k : ℕ} : (p * X^k).eval x = p.eval x * x^k :=
317
+ begin
318
+ induction k with k ih,
319
+ { simp, },
320
+ { simp [pow_succ', ←mul_assoc, ih], }
321
+ end
322
+
263
323
lemma eval_sum (p : polynomial R) (f : ℕ → R → polynomial R) (x : R) :
264
324
(p.sum f).eval x = p.sum (λ n a, (f n a).eval x) :=
265
325
eval₂_sum _ _ _ _
311
371
312
372
@[simp] lemma C_comp : (C a).comp p = C a := eval₂_C _ _
313
373
374
+ @[simp] lemma nat_cast_comp {n : ℕ} : (n : polynomial R).comp p = n :=
375
+ by rw [←C_eq_nat_cast, C_comp]
376
+
314
377
@[simp] lemma comp_zero : p.comp (0 : polynomial R) = C (p.eval 0 ) :=
315
378
by rw [← C_0, comp_C]
316
379
@@ -325,6 +388,40 @@ by rw [← C_1, C_comp]
325
388
326
389
@[simp] lemma add_comp : (p + q).comp r = p.comp r + q.comp r := eval₂_add _ _
327
390
391
+ @[simp] lemma monomial_comp (n : ℕ) : (monomial n a).comp p = C a * p^n :=
392
+ eval₂_monomial _ _
393
+
394
+ @[simp] lemma mul_X_comp : (p * X).comp r = p.comp r * r :=
395
+ begin
396
+ apply polynomial.induction_on' p,
397
+ { intros p q hp hq, simp [hp, hq, add_mul], },
398
+ { intros n b, simp [pow_succ', mul_assoc], }
399
+ end
400
+
401
+ @[simp] lemma X_pow_comp {k : ℕ} : (X^k).comp p = p^k :=
402
+ begin
403
+ induction k with k ih,
404
+ { simp, },
405
+ { simp [pow_succ', mul_X_comp, ih], },
406
+ end
407
+
408
+ @[simp] lemma mul_X_pow_comp {k : ℕ} : (p * X^k).comp r = p.comp r * r^k :=
409
+ begin
410
+ induction k with k ih,
411
+ { simp, },
412
+ { simp [ih, pow_succ', ←mul_assoc, mul_X_comp], },
413
+ end
414
+
415
+ @[simp] lemma C_mul_comp : (C a * p).comp r = C a * p.comp r :=
416
+ begin
417
+ apply polynomial.induction_on' p,
418
+ { intros p q hp hq, simp [hp, hq, mul_add], },
419
+ { intros n b, simp [mul_assoc], }
420
+ end
421
+
422
+ @[simp] lemma nat_cast_mul_comp {n : ℕ} : ((n : polynomial R) * p).comp r = n * p.comp r :=
423
+ by rw [←C_eq_nat_cast, C_mul_comp, C_eq_nat_cast]
424
+
328
425
@[simp] lemma mul_comp {R : Type *} [comm_semiring R] (p q r : polynomial R) :
329
426
(p * q).comp r = p.comp r * q.comp r := eval₂_mul _ _
330
427
@@ -336,22 +433,12 @@ begin
336
433
{ simp [pow_succ, ih], },
337
434
end
338
435
339
- @[simp] lemma monomial_comp (n : ℕ) : (monomial n a).comp p = C a * p^n :=
340
- eval₂_monomial _ _
341
-
342
436
@[simp] lemma bit0_comp : comp (bit0 p : polynomial R) q = bit0 (p.comp q) :=
343
437
by simp only [bit0, add_comp]
344
438
345
439
@[simp] lemma bit1_comp : comp (bit1 p : polynomial R) q = bit1 (p.comp q) :=
346
440
by simp only [bit1, add_comp, bit0_comp, one_comp]
347
441
348
- @[simp] lemma cast_nat_comp (n : ℕ) : comp (n : polynomial R) p = n :=
349
- begin
350
- induction n with n ih,
351
- { simp, },
352
- { simp [ih], },
353
- end
354
-
355
442
lemma comp_assoc {R : Type *} [comm_semiring R] (φ ψ χ : polynomial R) :
356
443
(φ.comp ψ).comp χ = φ.comp (ψ.comp χ) :=
357
444
begin
@@ -510,6 +597,12 @@ lemma map_sum {ι : Type*} (g : ι → polynomial R) (s : finset ι) :
510
597
(∑ i in s, g i).map f = ∑ i in s, (g i).map f :=
511
598
eq.symm $ sum_hom _ _
512
599
600
+ lemma map_comp (p q : polynomial R) : map f (p.comp q) = (map f p).comp (map f q) :=
601
+ polynomial.induction_on p
602
+ (by simp)
603
+ (by simp {contextual := tt})
604
+ (by simp [pow_succ', ← mul_assoc, polynomial.comp] {contextual := tt})
605
+
513
606
@[simp]
514
607
lemma eval_zero_map (f : R →+* S) (p : polynomial R) :
515
608
(p.map f).eval 0 = f (p.eval 0 ) :=
@@ -579,12 +672,27 @@ section eval
579
672
580
673
variables [comm_semiring R] {p q : polynomial R} {x : R}
581
674
675
+ lemma eval₂_comp [comm_semiring S] (f : R →+* S) {x : S} :
676
+ eval₂ f x (p.comp q) = eval₂ f (eval₂ f x q) p :=
677
+ by rw [comp, p.as_sum_range]; simp [eval₂_finset_sum, eval₂_pow]
678
+
582
679
@[simp] lemma eval_mul : (p * q).eval x = p.eval x * q.eval x := eval₂_mul _ _
583
680
584
681
instance eval.is_semiring_hom : is_semiring_hom (eval x) := eval₂.is_semiring_hom _ _
585
682
586
683
@[simp] lemma eval_pow (n : ℕ) : (p ^ n).eval x = p.eval x ^ n := eval₂_pow _ _ _
587
684
685
+ @[simp]
686
+ lemma eval_comp : (p.comp q).eval x = p.eval (q.eval x) :=
687
+ begin
688
+ apply polynomial.induction_on' p,
689
+ { intros r s hr hs, simp [add_comp, hr, hs], },
690
+ { intros n a, simp, }
691
+ end
692
+
693
+ instance comp.is_semiring_hom : is_semiring_hom (λ q : polynomial R, q.comp p) :=
694
+ by unfold comp; apply_instance
695
+
588
696
lemma eval₂_hom [comm_semiring S] (f : R →+* S) (x : R) :
589
697
p.eval₂ f (f x) = f (p.eval x) :=
590
698
(ring_hom.comp_id f) ▸ (hom_eval₂ p (ring_hom.id R) f x).symm
@@ -637,12 +745,6 @@ begin
637
745
exact ring_hom.map_zero f,
638
746
end
639
747
640
- lemma map_comp (p q : polynomial R) : map f (p.comp q) = (map f p).comp (map f q) :=
641
- polynomial.induction_on p
642
- (by simp)
643
- (by simp {contextual := tt})
644
- (by simp [pow_succ', ← mul_assoc, polynomial.comp] {contextual := tt})
645
-
646
748
end map
647
749
648
750
end comm_semiring
0 commit comments