@@ -460,7 +460,7 @@ theorem iterate_derivative_interpolate
460460 (hvs : Set.InjOn v s) {k : ℕ} (hk : k ≤ #s - 1 ) :
461461 derivative^[k] (interpolate s v r) = k.factorial *
462462 ∑ i ∈ s, C (r i / ∏ j ∈ s.erase i, ((v i) - (v j))) *
463- ∑ t ∈ (s.erase i).powerset with #t = # s - (k + 1 ),
463+ ∑ t ∈ (s.erase i).powersetCard (# s - (k + 1 ) ),
464464 ∏ a ∈ t, (X - C (v a)) := by
465465 classical
466466 simp_rw [interpolate_eq_sum, iterate_derivative_sum, iterate_derivative_C_mul, mul_sum (s := s),
@@ -471,88 +471,71 @@ theorem iterate_derivative_interpolate
471471 derivative^[k] (∏ j ∈ s.erase i, (X - C (v j))) =
472472 derivative^[k] (∏ vj ∈ (s.erase i).image v, (X - C vj)) := by
473473 rw [Finset.prod_image hvs']
474- _ = k.factorial * ∑ t ∈ ((s.erase i).image v).powerset with #t = # s - (k + 1 ),
474+ _ = k.factorial * ∑ t ∈ ((s.erase i).image v).powersetCard (# s - (k + 1 ) ),
475475 ∏ va ∈ t, (X - C va) := by
476476 have hcard : #((s.erase i).image v) = #s - 1 := by
477477 rw [card_image_of_injOn hvs', card_erase_of_mem hi]
478- have : k ≤ #((s.erase i).image v) := by rwa [hcard]
479- rw [iterate_derivative_prod_X_sub_C this]
480- congr! 5
478+ rw [iterate_derivative_prod_X_sub_C (by rwa [hcard])]
479+ congr! 3
481480 omega
482- _ = k.factorial * ∑ t ∈ (s.erase i).powerset with #t = # s - (k + 1 ),
481+ _ = k.factorial * ∑ t ∈ (s.erase i).powersetCard (# s - (k + 1 ) ),
483482 ∏ a ∈ t, (X - C (v a)) := by
484- rw [powerset_image, sum_nbij (fun (t : Finset ι) => t.image v)]
483+ rw [powersetCard_eq_filter, powerset_image, sum_nbij (fun (t : Finset ι) => t.image v)]
485484 case hi =>
486485 intro a ha
487- rw [mem_filter, mem_powerset ] at ha
486+ rw [mem_powersetCard ] at ha
488487 rw [mem_filter, mem_image]
489- constructor
490- · use a; simp [ha.1 ]
491- · rw [card_image_of_injOn (hvs'.mono (coe_subset.mpr ha.1 ))]
492- exact ha.2
493- case i_inj =>
494- refine (image_injOn_powerset_of_injOn hvs').mono (coe_subset.mpr ?_)
495- simp
488+ refine ⟨⟨a, by simp [ha.1 ]⟩, ?_⟩
489+ rw [card_image_of_injOn (hvs'.mono (by grind))]
490+ exact ha.2
491+ case i_inj => exact (image_injOn_powerset_of_injOn hvs').mono (by grind)
496492 case i_surj =>
497493 intro t ht
498494 rw [mem_coe, mem_filter, mem_image] at ht
499495 obtain ⟨a, ha⟩ := ht.1
500- simp_rw [Set.mem_image, mem_coe, mem_filter]
501- use a
502- refine ⟨⟨ha.1 , ?_⟩, ha.2 ⟩
503- rw [← ht.2 , ← ha.2 , card_image_of_injOn (hvs'.mono (coe_subset.mpr (mem_powerset.mp ha.1 )))]
496+ simp_rw [Set.mem_image, mem_coe, mem_powersetCard]
497+ refine ⟨a, ⟨⟨mem_powerset.mp ha.1 , ?_⟩, ha.2 ⟩⟩
498+ rw [← ht.2 , ← ha.2 , card_image_of_injOn (hvs'.mono (by grind))]
504499 case h =>
505500 intro a ha
506- rw [mem_filter, mem_powerset] at ha
507- rw [prod_image (hvs'.mono (coe_subset.mpr ha.1 ))]
508-
509- omit [DecidableEq ι] in
510- private theorem degree_eq_of_card_eq {P : Polynomial F} (hP : #s = P.degree + 1 ) :
511- P.degree = ↑(s.card - 1 ) := by
512- cases h : P.degree
513- case bot => simp_all
514- case coe d =>
515- rw [Nat.cast_withBot] at hP ⊢
516- suffices #s = d + 1 by grind
517- rw [h] at hP
518- simp [← WithBot.coe_inj, hP]
519-
520- omit [DecidableEq ι] in
521- private theorem natDegree_eq_of_card_eq {P : Polynomial F} (hP : #s = P.degree + 1 ) :
522- P.natDegree = s.card - 1 := natDegree_eq_of_degree_eq_some (degree_eq_of_card_eq hP)
523-
524- omit [DecidableEq ι] in
525- private theorem degree_lt_of_card_eq {P : Polynomial F} (hP : #s = P.degree + 1 ) :
526- P.degree < s.card := by
527- have := degree_eq_of_card_eq hP
528- have := natDegree_eq_of_card_eq hP
529- have s_card : s.card > 0 := by by_contra! h; simp_all
530- grind [Nat.cast_lt]
501+ convert (prod_image (hvs'.mono (coe_subset.mpr (mem_powersetCard.mp ha).1 ))).symm
502+ rfl
531503
532504theorem eval_iterate_derivative_eq_sum
533505 (hvs : Set.InjOn v s) {P : Polynomial F} (hP : #s = P.degree + 1 )
534506 {k : ℕ} (hk : k ≤ P.degree) (x : F) :
535507 (derivative^[k] P).eval x = k.factorial *
536508 ∑ i ∈ s, (P.eval (v i) / ∏ j ∈ s.erase i, ((v i) - (v j))) *
537- ∑ t ∈ (s.erase i).powerset with #t = # s - (k + 1 ),
509+ ∑ t ∈ (s.erase i).powersetCard (# s - (k + 1 ) ),
538510 ∏ a ∈ t, (x - v a) := by
539- rw (occs := [1 ]) [eq_interpolate hvs (degree_lt_of_card_eq hP)]
540- rw [iterate_derivative_interpolate, ← nsmul_eq_mul, eval_smul, nsmul_eq_mul, eval_finset_sum]
541- · congr! 2 with i hi
542- simp_rw [eval_C_mul, eval_finset_sum, eval_prod, eval_sub, eval_X, eval_C]
543- · exact hvs
544- · rw [degree_eq_of_card_eq hP] at hk
545- exact WithBot.coe_le_coe.mp hk
511+ lift P.degree to ℕ using (by contrapose! hP; rw [hP]; simp) with deg hdeg
512+ rw [← WithBot.coe_one, ← WithBot.coe_add] at hP
513+ replace hP := WithBot.coe_eq_coe.mp hP
514+ have hdegree : P.degree = ↑(#s - 1 ) := hdeg.symm.trans (WithBot.coe_eq_coe.mpr (by grind))
515+ rw (occs := [1 ]) [eq_interpolate hvs (f := P)]
516+ · rw [iterate_derivative_interpolate, ← nsmul_eq_mul, eval_smul, nsmul_eq_mul, eval_finset_sum]
517+ · congr! 2 with i hi
518+ simp_rw [eval_C_mul, eval_finset_sum, eval_prod, eval_sub, eval_X, eval_C]
519+ · exact hvs
520+ · exact WithBot.coe_le_coe.mp (le_of_le_of_eq hk (by rwa [hdeg]))
521+ · exact lt_of_eq_of_lt hdeg.symm (WithBot.coe_lt_coe.mpr <|
522+ lt_of_lt_of_eq (lt_add_one deg) hP.symm)
546523
547524theorem leadingCoeff_eq_sum
548525 (hvs : Set.InjOn v s) {P : Polynomial F} (hP : #s = P.degree + 1 ) :
549526 P.leadingCoeff = ∑ i ∈ s, (P.eval (v i)) / ∏ j ∈ s.erase i, ((v i) - (v j)) := by
550- rw [leadingCoeff, natDegree_eq_of_card_eq hP]
551- rw (occs := [1 ]) [eq_interpolate hvs (degree_lt_of_card_eq hP)]
552- rw [interpolate_apply, finset_sum_coeff]
553- congr! with i hi
554- rw [coeff_C_mul, ← natDegree_basis hvs hi, ← leadingCoeff, leadingCoeff_basis hvs hi]
555- field_simp
527+ lift P.degree to ℕ using (by contrapose! hP; rw [hP]; simp) with deg hdeg
528+ rw [← WithBot.coe_one, ← WithBot.coe_add] at hP
529+ replace hP := WithBot.coe_eq_coe.mp hP
530+ have hdegree : P.degree = ↑(#s - 1 ) := hdeg.symm.trans (WithBot.coe_eq_coe.mpr (by grind))
531+ rw [leadingCoeff, natDegree_eq_of_degree_eq_some hdegree]
532+ rw (occs := [1 ]) [eq_interpolate (f := P) hvs]
533+ · rw [interpolate_apply, finset_sum_coeff]
534+ congr! with i hi
535+ rw [coeff_C_mul, ← natDegree_basis hvs hi, ← leadingCoeff, leadingCoeff_basis hvs hi]
536+ field_simp
537+ · exact lt_of_eq_of_lt hdeg.symm (WithBot.coe_lt_coe.mpr <|
538+ lt_of_lt_of_eq (lt_add_one deg) hP.symm)
556539
557540end Interpolate
558541
0 commit comments