@@ -5,7 +5,7 @@ Authors: Chris Hughes, Johannes Hölzl, Jens Wagemaker
5
5
6
6
Theory of univariate polynomials, represented as `ℕ →₀ α`, where α is a commutative semiring.
7
7
-/
8
- import data.finsupp algebra.euclidean_domain tactic.ring
8
+ import data.finsupp algebra.euclidean_domain tactic.ring ring_theory.associated
9
9
10
10
/-- `polynomial α` is the type of univariate polynomials over `α`.
11
11
@@ -81,6 +81,7 @@ lemma single_eq_C_mul_X : ∀{n}, single n a = C a * X^n
81
81
lemma sum_C_mul_X_eq (p : polynomial α) : p.sum (λn a, C a * X^n) = p :=
82
82
eq.trans (sum_congr rfl $ assume n hn, single_eq_C_mul_X.symm) (finsupp.sum_single _)
83
83
84
+
84
85
@[elab_as_eliminator] protected lemma induction_on {M : polynomial α → Prop } (p : polynomial α)
85
86
(h_C : ∀a, M (C a))
86
87
(h_add : ∀p q, M p → M q → M (p + q))
@@ -131,6 +132,8 @@ by simp [coeff, eq_comm, C, single]; congr
131
132
132
133
@[simp] lemma coeff_X_one : coeff (X : polynomial α) 1 = 1 := rfl
133
134
135
+ @[simp] lemma coeff_X_zero : coeff (X : polynomial α) 0 = 0 := rfl
136
+
134
137
@[simp] lemma coeff_C_mul_X (x : α) (k n : ℕ) :
135
138
coeff (C x * X^k : polynomial α) n = if n = k then x else 0 :=
136
139
by rw [← single_eq_C_mul_X]; simp [single, eq_comm, coeff]; congr
@@ -312,6 +315,12 @@ lemma root_mul_right_of_is_root {p : polynomial α} (q : polynomial α) :
312
315
is_root p a → is_root (p * q) a :=
313
316
λ H, by rw [is_root, eval_mul, is_root.def.1 H, zero_mul]
314
317
318
+ lemma coeff_zero_eq_eval_zero (p : polynomial α) :
319
+ coeff p 0 = p.eval 0 :=
320
+ calc coeff p 0 = coeff p 0 * 0 ^ 0 : by simp
321
+ ... = p.eval 0 : eq.symm $
322
+ finset.sum_eq_single _ (λ b _ hb, by simp [zero_pow (nat.pos_of_ne_zero hb)]) (by simp)
323
+
315
324
end eval
316
325
317
326
section comp
@@ -424,6 +433,12 @@ let ⟨n, hn⟩ :=
424
433
have hn : degree p = some n := not_not.1 hn,
425
434
by rw [nat_degree, hn]; refl
426
435
436
+ lemma nat_degree_eq_of_degree_eq_some {p : polynomial α} {n : ℕ}
437
+ (h : degree p = n) : nat_degree p = n :=
438
+ have hp0 : p ≠ 0 , from λ hp0, by rw hp0 at h; exact option.no_confusion h,
439
+ option.some_inj.1 $ show (nat_degree p : with_bot ℕ) = n,
440
+ by rwa [← degree_eq_nat_degree hp0]
441
+
427
442
@[simp] lemma degree_le_nat_degree : degree p ≤ nat_degree p :=
428
443
begin
429
444
by_cases hp : p = 0 , { rw hp, exact bot_le },
@@ -579,6 +594,8 @@ leading_coeff_monomial a 0
579
594
suffices leading_coeff (C (1 :α) * X^1 ) = 1 , by rwa [C_1, pow_one, one_mul] at this ,
580
595
leading_coeff_monomial 1 1
581
596
597
+ @[simp] lemma monic_X : monic (X : polynomial α) := leading_coeff_X
598
+
582
599
@[simp] lemma leading_coeff_one : leading_coeff (1 : polynomial α) = 1 :=
583
600
suffices leading_coeff (C (1 :α) * X^0 ) = 1 , by rwa [C_1, pow_zero, mul_one] at this ,
584
601
leading_coeff_monomial 1 0
@@ -710,6 +727,13 @@ else with_bot.coe_le_coe.1 $
710
727
(le_nat_degree_of_ne_zero (finsupp.mem_support_iff.1 hn))
711
728
(nat.zero_le _))
712
729
730
+ lemma zero_le_degree_iff {p : polynomial α} : 0 ≤ degree p ↔ p ≠ 0 :=
731
+ by rw [ne.def, ← degree_eq_bot];
732
+ cases degree p; exact dec_trivial
733
+
734
+ @[simp] lemma coeff_mul_X_zero (p : polynomial α) : coeff (p * X) 0 = 0 :=
735
+ by rw [coeff_mul_left, sum_range_succ]; simp
736
+
713
737
end comm_semiring
714
738
715
739
section comm_ring
@@ -992,6 +1016,12 @@ lemma dvd_iff_mod_by_monic_eq_zero (hq : monic q) : p %ₘ q = 0 ↔ q ∣ p :=
992
1016
degree_eq_nat_degree (mt leading_coeff_eq_zero.2 hrpq0)] at this ;
993
1017
exact not_lt_of_ge (nat.le_add_right _ _) (with_bot.some_lt_some.1 this ))⟩
994
1018
1019
+ @[simp] lemma mod_by_monic_one (p : polynomial α) : p %ₘ 1 = 0 :=
1020
+ (dvd_iff_mod_by_monic_eq_zero monic_one).2 (one_dvd _)
1021
+
1022
+ @[simp] lemma div_by_monic_one (p : polynomial α) : p /ₘ 1 = p :=
1023
+ by conv_rhs { rw [← mod_by_monic_add_div p monic_one] }; simp
1024
+
995
1025
lemma degree_pos_of_root (hp : p ≠ 0 ) (h : is_root p a) : 0 < degree p :=
996
1026
lt_of_not_ge $ λ hlt, begin
997
1027
have := eq_C_of_degree_le_zero hlt,
@@ -1024,6 +1054,9 @@ begin
1024
1054
refl
1025
1055
end
1026
1056
1057
+ lemma X_ne_zero : (X : polynomial α) ≠ 0 :=
1058
+ mt (congr_arg (λ p, coeff p 1 )) (by simp)
1059
+
1027
1060
@[simp] lemma degree_X_sub_C (a : α) : degree (X - C a) = 1 :=
1028
1061
begin
1029
1062
rw [sub_eq_add_neg, add_comm, ← @degree_X α],
@@ -1099,6 +1132,9 @@ lemma dvd_iff_is_root : (X - C a) ∣ p ↔ is_root p a :=
1099
1132
mod_by_monic_X_sub_C_eq_C_eval, ← C_0, C_inj] at h,
1100
1133
λ h, ⟨(p /ₘ (X - C a)), by rw mul_div_by_monic_eq_iff_is_root.2 h⟩⟩
1101
1134
1135
+ lemma mod_by_monic_X (p : polynomial α) : p %ₘ X = C (p.eval 0 ) :=
1136
+ by rw [← mod_by_monic_X_sub_C_eq_C_eval, C_0, sub_zero]
1137
+
1102
1138
end nonzero_comm_ring
1103
1139
1104
1140
section integral_domain
@@ -1140,6 +1176,12 @@ instance : integral_domain (polynomial α) :=
1140
1176
end ,
1141
1177
..polynomial.nonzero_comm_ring }
1142
1178
1179
+ lemma nat_degree_mul_eq (hp : p ≠ 0 ) (hq : q ≠ 0 ) : nat_degree (p * q) =
1180
+ nat_degree p + nat_degree q :=
1181
+ by rw [← with_bot.coe_eq_coe, ← degree_eq_nat_degree (mul_ne_zero hp hq),
1182
+ with_bot.coe_add, ← degree_eq_nat_degree hp,
1183
+ ← degree_eq_nat_degree hq, degree_mul_eq]
1184
+
1143
1185
@[simp] lemma nat_degree_pow_eq (p : polynomial α) (n : ℕ) :
1144
1186
nat_degree (p ^ n) = n * nat_degree p :=
1145
1187
if hp0 : p = 0
@@ -1285,13 +1327,53 @@ lemma leading_coeff_comp (hq : nat_degree q ≠ 0): leading_coeff (p.comp q) =
1285
1327
leading_coeff p * leading_coeff q ^ nat_degree p :=
1286
1328
by rw [← coeff_comp_degree_mul_degree hq, ← nat_degree_comp]; refl
1287
1329
1330
+ lemma degree_eq_zero_of_is_unit (h : is_unit p) : degree p = 0 :=
1331
+ let ⟨q, hq⟩ := is_unit_iff_dvd_one.1 h in
1332
+ have hp0 : p ≠ 0 , from λ hp0, by simpa [hp0] using hq,
1333
+ have hq0 : q ≠ 0 , from λ hp0, by simpa [hp0] using hq,
1334
+ have nat_degree (1 : polynomial α) = nat_degree (p * q),
1335
+ from congr_arg _ hq,
1336
+ by rw [nat_degree_one, nat_degree_mul_eq hp0 hq0, eq_comm,
1337
+ add_eq_zero_iff, ← with_bot.coe_eq_coe,
1338
+ ← degree_eq_nat_degree hp0] at this ;
1339
+ exact this.1
1340
+
1288
1341
end integral_domain
1289
1342
1290
1343
section field
1291
1344
variables [discrete_field α] {p q : polynomial α}
1292
1345
instance : vector_space α (polynomial α) :=
1293
1346
{ ..finsupp.to_module ℕ α }
1294
1347
1348
+ lemma is_unit_iff_degree_eq_zero : is_unit p ↔ degree p = 0 :=
1349
+ ⟨degree_eq_zero_of_is_unit,
1350
+ λ h, have degree p ≤ 0 , by simp [*, le_refl],
1351
+ have hc : coeff p 0 ≠ 0 , from λ hc,
1352
+ by rw [eq_C_of_degree_le_zero this , hc] at h;
1353
+ simpa using h,
1354
+ is_unit_iff_dvd_one.2 ⟨C (coeff p 0 )⁻¹, begin
1355
+ conv in p { rw eq_C_of_degree_le_zero this },
1356
+ rw [← C_mul, _root_.mul_inv_cancel hc, C_1]
1357
+ end ⟩⟩
1358
+
1359
+ lemma degree_pos_of_ne_zero_of_nonunit (hp0 : p ≠ 0 ) (hp : ¬is_unit p) :
1360
+ 0 < degree p :=
1361
+ lt_of_not_ge (λ h, by rw [eq_C_of_degree_le_zero h] at hp0 hp;
1362
+ exact hp ⟨units.map C (units.mk0 (coeff p 0 ) (mt C_inj.2 (by simpa using hp0))), rfl⟩)
1363
+
1364
+ lemma irreducible_of_degree_eq_one (hp1 : degree p = 1 ) : irreducible p :=
1365
+ ⟨mt is_unit_iff_dvd_one.1 (λ ⟨q, hq⟩,
1366
+ absurd (congr_arg degree hq) (λ h,
1367
+ have degree q = 0 , by rw [degree_one, degree_mul_eq, hp1, eq_comm,
1368
+ nat.with_bot.add_eq_zero_iff] at h; exact h.2 ,
1369
+ by simp [degree_mul_eq, this , degree_one, hp1] at h;
1370
+ exact absurd h dec_trivial)),
1371
+ λ q r hpqr, begin
1372
+ have := congr_arg degree hpqr,
1373
+ rw [hp1, degree_mul_eq, eq_comm, nat.with_bot.add_eq_one_iff] at this ,
1374
+ rw [is_unit_iff_degree_eq_zero, is_unit_iff_degree_eq_zero]; tautology
1375
+ end ⟩
1376
+
1295
1377
lemma monic_mul_leading_coeff_inv (h : p ≠ 0 ) :
1296
1378
monic (p * C (leading_coeff p)⁻¹) :=
1297
1379
by rw [monic, leading_coeff_mul, leading_coeff_C,
0 commit comments