Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit d57ac08

Browse files
committed
feat(field_theory/separable): definition and basic properties (#3155)
1 parent 340d5a9 commit d57ac08

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

src/field_theory/separable.lean

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/-
2+
Copyright (c) 2020 Kenny Lau. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kenny Lau.
5+
-/
6+
7+
import ring_theory.polynomial
8+
9+
/-!
10+
11+
# Separable polynomials
12+
13+
We define a polynomial to be separable if it is coprime with its derivative. We prove basic
14+
properties about separable polynomials here.
15+
16+
-/
17+
18+
universes u v w
19+
open_locale classical
20+
21+
namespace polynomial
22+
23+
section comm_semiring
24+
25+
variables {R : Type u} [comm_semiring R]
26+
27+
/-- A polynomial is separable iff it is coprime with its derivative. -/
28+
def separable (f : polynomial R) : Prop :=
29+
is_coprime f f.derivative
30+
31+
lemma separable_def (f : polynomial R) :
32+
f.separable ↔ is_coprime f f.derivative :=
33+
iff.rfl
34+
35+
lemma separable_def' (f : polynomial R) :
36+
f.separable ↔ ∃ a b : polynomial R, a * f + b * f.derivative = 1 :=
37+
iff.rfl
38+
39+
lemma separable_one : (1 : polynomial R).separable :=
40+
is_coprime_one_left
41+
42+
lemma separable_X_add_C (a : R) : (X + C a).separable :=
43+
by { rw [separable_def, derivative_add, derivative_X, derivative_C, add_zero],
44+
exact is_coprime_one_right }
45+
46+
lemma separable_X : (X : polynomial R).separable :=
47+
by { rw [separable_def, derivative_X], exact is_coprime_one_right }
48+
49+
lemma separable.of_mul_left {f g : polynomial R} (h : (f * g).separable) : f.separable :=
50+
begin
51+
have := h.of_mul_left_left, rw derivative_mul at this,
52+
exact is_coprime.of_mul_right_left (is_coprime.of_add_mul_left_right this)
53+
end
54+
55+
lemma separable.of_mul_right {f g : polynomial R} (h : (f * g).separable) : g.separable :=
56+
by { rw mul_comm at h, exact h.of_mul_left }
57+
58+
end comm_semiring
59+
60+
section comm_ring
61+
62+
variables {R : Type u} [comm_ring R]
63+
64+
lemma separable.mul {f g : polynomial R} (hf : f.separable) (hg : g.separable)
65+
(h : is_coprime f g) : (f * g).separable :=
66+
by { rw [separable_def, derivative_mul], exact ((hf.mul_right h).add_mul_left_right _).mul_left
67+
((h.symm.mul_right hg).mul_add_right_right _) }
68+
69+
end comm_ring
70+
71+
end polynomial

src/ring_theory/coprime.lean

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ open_locale classical big_operators
2424

2525
universes u v
2626

27+
section comm_semiring
28+
2729
variables {R : Type u} [comm_semiring R] (x y z : R)
2830

2931
/-- The proposition that `x` and `y` are coprime, defined to be the existence of `a` and `b` such
@@ -162,3 +164,91 @@ show is_coprime x (x * k), from hk ▸ H
162164
theorem is_coprime.map (H : is_coprime x y) {S : Type v} [comm_semiring S] (f : R →+* S) :
163165
is_coprime (f x) (f y) :=
164166
let ⟨a, b, h⟩ := H in ⟨f a, f b, by rw [← f.map_mul, ← f.map_mul, ← f.map_add, h, f.map_one]⟩
167+
168+
variables {x y z}
169+
170+
lemma is_coprime.of_add_mul_left_left (h : is_coprime (x + y * z) y) : is_coprime x y :=
171+
let ⟨a, b, H⟩ := h in ⟨a, a * z + b, by simpa only [add_mul, mul_add,
172+
add_assoc, add_comm, add_left_comm, mul_assoc, mul_comm, mul_left_comm] using H⟩
173+
174+
lemma is_coprime.of_add_mul_right_left (h : is_coprime (x + z * y) y) : is_coprime x y :=
175+
by { rw mul_comm at h, exact h.of_add_mul_left_left }
176+
177+
lemma is_coprime.of_add_mul_left_right (h : is_coprime x (y + x * z)) : is_coprime x y :=
178+
by { rw is_coprime_comm at h ⊢, exact h.of_add_mul_left_left }
179+
180+
lemma is_coprime.of_add_mul_right_right (h : is_coprime x (y + z * x)) : is_coprime x y :=
181+
by { rw mul_comm at h, exact h.of_add_mul_left_right }
182+
183+
lemma is_coprime.of_mul_add_left_left (h : is_coprime (y * z + x) y) : is_coprime x y :=
184+
by { rw add_comm at h, exact h.of_add_mul_left_left }
185+
186+
lemma is_coprime.of_mul_add_right_left (h : is_coprime (z * y + x) y) : is_coprime x y :=
187+
by { rw add_comm at h, exact h.of_add_mul_right_left }
188+
189+
lemma is_coprime.of_mul_add_left_right (h : is_coprime x (x * z + y)) : is_coprime x y :=
190+
by { rw add_comm at h, exact h.of_add_mul_left_right }
191+
192+
lemma is_coprime.of_mul_add_right_right (h : is_coprime x (z * x + y)) : is_coprime x y :=
193+
by { rw add_comm at h, exact h.of_add_mul_right_right }
194+
195+
end comm_semiring
196+
197+
namespace is_coprime
198+
199+
section comm_ring
200+
201+
variables {R : Type u} [comm_ring R]
202+
203+
lemma add_mul_left_left {x y : R} (h : is_coprime x y) (z : R) : is_coprime (x + y * z) y :=
204+
@of_add_mul_left_left R _ _ _ (-z) $
205+
by simpa only [mul_neg_eq_neg_mul_symm, add_neg_cancel_right] using h
206+
207+
lemma add_mul_right_left {x y : R} (h : is_coprime x y) (z : R) : is_coprime (x + z * y) y :=
208+
by { rw mul_comm, exact h.add_mul_left_left z }
209+
210+
lemma add_mul_left_right {x y : R} (h : is_coprime x y) (z : R) : is_coprime x (y + x * z) :=
211+
by { rw is_coprime_comm, exact h.symm.add_mul_left_left z }
212+
213+
lemma add_mul_right_right {x y : R} (h : is_coprime x y) (z : R) : is_coprime x (y + z * x) :=
214+
by { rw is_coprime_comm, exact h.symm.add_mul_right_left z }
215+
216+
lemma mul_add_left_left {x y : R} (h : is_coprime x y) (z : R) : is_coprime (y * z + x) y :=
217+
by { rw add_comm, exact h.add_mul_left_left z }
218+
219+
lemma mul_add_right_left {x y : R} (h : is_coprime x y) (z : R) : is_coprime (z * y + x) y :=
220+
by { rw add_comm, exact h.add_mul_right_left z }
221+
222+
lemma mul_add_left_right {x y : R} (h : is_coprime x y) (z : R) : is_coprime x (x * z + y) :=
223+
by { rw add_comm, exact h.add_mul_left_right z }
224+
225+
lemma mul_add_right_right {x y : R} (h : is_coprime x y) (z : R) : is_coprime x (z * x + y) :=
226+
by { rw add_comm, exact h.add_mul_right_right z }
227+
228+
lemma add_mul_left_left_iff {x y z : R} : is_coprime (x + y * z) y ↔ is_coprime x y :=
229+
⟨of_add_mul_left_left, λ h, h.add_mul_left_left z⟩
230+
231+
lemma add_mul_right_left_iff {x y z : R} : is_coprime (x + z * y) y ↔ is_coprime x y :=
232+
⟨of_add_mul_right_left, λ h, h.add_mul_right_left z⟩
233+
234+
lemma add_mul_left_right_iff {x y z : R} : is_coprime x (y + x * z) ↔ is_coprime x y :=
235+
⟨of_add_mul_left_right, λ h, h.add_mul_left_right z⟩
236+
237+
lemma add_mul_right_right_iff {x y z : R} : is_coprime x (y + z * x) ↔ is_coprime x y :=
238+
⟨of_add_mul_right_right, λ h, h.add_mul_right_right z⟩
239+
240+
lemma mul_add_left_left_iff {x y z : R} : is_coprime (y * z + x) y ↔ is_coprime x y :=
241+
⟨of_mul_add_left_left, λ h, h.mul_add_left_left z⟩
242+
243+
lemma mul_add_right_left_iff {x y z : R} : is_coprime (z * y + x) y ↔ is_coprime x y :=
244+
⟨of_mul_add_right_left, λ h, h.mul_add_right_left z⟩
245+
246+
lemma mul_add_left_right_iff {x y z : R} : is_coprime x (x * z + y) ↔ is_coprime x y :=
247+
⟨of_mul_add_left_right, λ h, h.mul_add_left_right z⟩
248+
249+
lemma mul_add_right_right_iff {x y z : R} : is_coprime x (z * x + y) ↔ is_coprime x y :=
250+
⟨of_mul_add_right_right, λ h, h.mul_add_right_right z⟩
251+
252+
end comm_ring
253+
254+
end is_coprime

0 commit comments

Comments
 (0)