@@ -285,6 +285,8 @@ theorem natDegree_nat_cast (n : ℕ) : natDegree (n : R[X]) = 0 := by
285
285
simp only [← C_eq_nat_cast, natDegree_C]
286
286
#align polynomial.nat_degree_nat_cast Polynomial.natDegree_nat_cast
287
287
288
+ theorem degree_nat_cast_le (n : ℕ) : degree (n : R[X]) ≤ 0 := degree_le_of_natDegree_le (by simp)
289
+
288
290
@[simp]
289
291
theorem degree_monomial (n : ℕ) (ha : a ≠ 0 ) : degree (monomial n a) = n := by
290
292
rw [degree, support_monomial n ha]; rfl
@@ -537,15 +539,23 @@ theorem coeff_mul_X_sub_C {p : R[X]} {r : R} {a : ℕ} :
537
539
theorem degree_neg (p : R[X]) : degree (-p) = degree p := by unfold degree; rw [support_neg]
538
540
#align polynomial.degree_neg Polynomial.degree_neg
539
541
542
+ theorem degree_neg_le_of_le {a : WithBot ℕ} {p : R[X]} (hp : degree p ≤ a) : degree (- p) ≤ a :=
543
+ p.degree_neg.le.trans ‹_›
544
+
540
545
@[simp]
541
546
theorem natDegree_neg (p : R[X]) : natDegree (-p) = natDegree p := by simp [natDegree]
542
547
#align polynomial.nat_degree_neg Polynomial.natDegree_neg
543
548
549
+ theorem natDegree_neg_le_of_le {p : R[X]} (hp : natDegree p ≤ m) : natDegree (- p) ≤ m :=
550
+ (natDegree_neg p).le.trans ‹_›
551
+
544
552
@[simp]
545
553
theorem natDegree_int_cast (n : ℤ) : natDegree (n : R[X]) = 0 := by
546
554
rw [← C_eq_int_cast, natDegree_C]
547
555
#align polynomial.nat_degree_int_cast Polynomial.natDegree_int_cast
548
556
557
+ theorem degree_int_cast_le (n : ℤ) : degree (n : R[X]) ≤ 0 := degree_le_of_natDegree_le (by simp)
558
+
549
559
@[simp]
550
560
theorem leadingCoeff_neg (p : R[X]) : (-p).leadingCoeff = -p.leadingCoeff := by
551
561
rw [leadingCoeff, leadingCoeff, natDegree_neg, coeff_neg]
@@ -643,6 +653,10 @@ theorem degree_add_le_of_degree_le {p q : R[X]} {n : ℕ} (hp : degree p ≤ n)
643
653
(degree_add_le p q).trans <| max_le hp hq
644
654
#align polynomial.degree_add_le_of_degree_le Polynomial.degree_add_le_of_degree_le
645
655
656
+ theorem degree_add_le_of_le {a b : WithBot ℕ} (hp : degree p ≤ a) (hq : degree q ≤ b) :
657
+ degree (p + q) ≤ max a b :=
658
+ (p.degree_add_le q).trans <| max_le_max ‹_› ‹_›
659
+
646
660
theorem natDegree_add_le (p q : R[X]) : natDegree (p + q) ≤ max (natDegree p) (natDegree q) := by
647
661
cases' le_max_iff.1 (degree_add_le p q) with h h <;> simp [natDegree_le_natDegree h]
648
662
#align polynomial.nat_degree_add_le Polynomial.natDegree_add_le
@@ -652,6 +666,10 @@ theorem natDegree_add_le_of_degree_le {p q : R[X]} {n : ℕ} (hp : natDegree p
652
666
(natDegree_add_le p q).trans <| max_le hp hq
653
667
#align polynomial.nat_degree_add_le_of_degree_le Polynomial.natDegree_add_le_of_degree_le
654
668
669
+ theorem natDegree_add_le_of_le (hp : natDegree p ≤ m) (hq : natDegree q ≤ n) :
670
+ natDegree (p + q) ≤ max m n :=
671
+ (p.natDegree_add_le q).trans <| max_le_max ‹_› ‹_›
672
+
655
673
@[simp]
656
674
theorem leadingCoeff_zero : leadingCoeff (0 : R[X]) = 0 :=
657
675
rfl
@@ -782,6 +800,10 @@ theorem degree_mul_le (p q : R[X]) : degree (p * q) ≤ degree p + degree q :=
782
800
exact add_le_add (le_degree_of_ne_zero ha) (le_degree_of_ne_zero hb)
783
801
#align polynomial.degree_mul_le Polynomial.degree_mul_le
784
802
803
+ theorem degree_mul_le_of_le {a b : WithBot ℕ} (hp : degree p ≤ a) (hq : degree q ≤ b) :
804
+ degree (p * q) ≤ a + b :=
805
+ (p.degree_mul_le _).trans <| add_le_add ‹_› ‹_›
806
+
785
807
theorem degree_pow_le (p : R[X]) : ∀ n : ℕ, degree (p ^ n) ≤ n • degree p
786
808
| 0 => by rw [pow_zero, zero_nsmul]; exact degree_one_le
787
809
| n + 1 =>
@@ -791,6 +813,14 @@ theorem degree_pow_le (p : R[X]) : ∀ n : ℕ, degree (p ^ n) ≤ n • degree
791
813
_ ≤ _ := by rw [succ_nsmul]; exact add_le_add le_rfl (degree_pow_le _ _)
792
814
#align polynomial.degree_pow_le Polynomial.degree_pow_le
793
815
816
+ theorem degree_pow_le_of_le {a : WithBot ℕ} (b : ℕ) (hp : degree p ≤ a) :
817
+ degree (p ^ b) ≤ b * a := by
818
+ induction b with
819
+ | zero => simp [degree_one_le]
820
+ | succ n hn =>
821
+ rw [Nat.cast_succ, add_mul, one_mul, pow_succ']
822
+ exact degree_mul_le_of_le hn hp
823
+
794
824
@[simp]
795
825
theorem leadingCoeff_monomial (a : R) (n : ℕ) : leadingCoeff (monomial n a) = a := by
796
826
by_cases ha : a = 0
@@ -1034,6 +1064,10 @@ theorem natDegree_mul_le {p q : R[X]} : natDegree (p * q) ≤ natDegree p + natD
1034
1064
refine' add_le_add _ _ <;> apply degree_le_natDegree
1035
1065
#align polynomial.nat_degree_mul_le Polynomial.natDegree_mul_le
1036
1066
1067
+ theorem natDegree_mul_le_of_le (hp : natDegree p ≤ m) (hg : natDegree q ≤ n) :
1068
+ natDegree (p * q) ≤ m + n :=
1069
+ natDegree_mul_le.trans <| add_le_add ‹_› ‹_›
1070
+
1037
1071
theorem natDegree_pow_le {p : R[X]} {n : ℕ} : (p ^ n).natDegree ≤ n * p.natDegree := by
1038
1072
induction' n with i hi
1039
1073
· simp
@@ -1042,6 +1076,10 @@ theorem natDegree_pow_le {p : R[X]} {n : ℕ} : (p ^ n).natDegree ≤ n * p.natD
1042
1076
exact add_le_add_left hi _
1043
1077
#align polynomial.nat_degree_pow_le Polynomial.natDegree_pow_le
1044
1078
1079
+ theorem natDegree_pow_le_of_le (n : ℕ) (hp : natDegree p ≤ m) :
1080
+ natDegree (p ^ n) ≤ n * m :=
1081
+ natDegree_pow_le.trans (Nat.mul_le_mul rfl.le ‹_›)
1082
+
1045
1083
@[simp]
1046
1084
theorem coeff_pow_mul_natDegree (p : R[X]) (n : ℕ) :
1047
1085
(p ^ n).coeff (n * p.natDegree) = p.leadingCoeff ^ n := by
@@ -1075,6 +1113,8 @@ theorem natDegree_eq_zero_iff_degree_le_zero : p.natDegree = 0 ↔ p.degree ≤
1075
1113
Nat.cast_withBot, WithBot.coe_zero]
1076
1114
#align polynomial.nat_degree_eq_zero_iff_degree_le_zero Polynomial.natDegree_eq_zero_iff_degree_le_zero
1077
1115
1116
+ theorem degree_zero_le : degree (0 : R[X]) ≤ 0 := natDegree_eq_zero_iff_degree_le_zero.mp rfl
1117
+
1078
1118
theorem degree_le_iff_coeff_zero (f : R[X]) (n : WithBot ℕ) :
1079
1119
degree f ≤ n ↔ ∀ m : ℕ, n < m → coeff f m = 0 := by
1080
1120
-- Porting note: `Nat.cast_withBot` is required.
@@ -1294,10 +1334,18 @@ theorem degree_sub_le (p q : R[X]) : degree (p - q) ≤ max (degree p) (degree q
1294
1334
simpa only [degree_neg q] using degree_add_le p (-q)
1295
1335
#align polynomial.degree_sub_le Polynomial.degree_sub_le
1296
1336
1337
+ theorem degree_sub_le_of_le {a b : WithBot ℕ} (hp : degree p ≤ a) (hq : degree q ≤ b) :
1338
+ degree (p - q) ≤ max a b :=
1339
+ (p.degree_sub_le q).trans <| max_le_max ‹_› ‹_›
1340
+
1297
1341
theorem natDegree_sub_le (p q : R[X]) : natDegree (p - q) ≤ max (natDegree p) (natDegree q) := by
1298
1342
simpa only [← natDegree_neg q] using natDegree_add_le p (-q)
1299
1343
#align polynomial.nat_degree_sub_le Polynomial.natDegree_sub_le
1300
1344
1345
+ theorem natDegree_sub_le_of_le (hp : natDegree p ≤ m) (hq : natDegree q ≤ n) :
1346
+ natDegree (p - q) ≤ max m n :=
1347
+ (p.natDegree_sub_le q).trans <| max_le_max ‹_› ‹_›
1348
+
1301
1349
theorem degree_sub_lt (hd : degree p = degree q) (hp0 : p ≠ 0 )
1302
1350
(hlc : leadingCoeff p = leadingCoeff q) : degree (p - q) < degree p :=
1303
1351
have hp : monomial (natDegree p) (leadingCoeff p) + p.erase (natDegree p) = p :=
0 commit comments