@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Eric Rodriguez
5
5
-/
6
6
7
- import number_theory.cyclotomic.zeta
7
+ import number_theory.cyclotomic.primitive_roots
8
8
import field_theory.polynomial_galois_group
9
9
10
10
/-!
@@ -40,19 +40,16 @@ it is always a subgroup, and if the `n`th cyclotomic polynomial is irreducible,
40
40
41
41
local attribute [instance] pnat.fact_pos
42
42
43
- variables ( n : ℕ+) (K : Type *) [field K] ( L : Type *) [field L] {μ : L} (hμ : is_primitive_root μ n)
43
+ variables { n : ℕ+} (K : Type *) [field K] { L : Type *} [field L] {μ : L} (hμ : is_primitive_root μ n)
44
44
[algebra K L] [is_cyclotomic_extension {n} K L]
45
45
46
- local notation `ζ ` := is_cyclotomic_extension.zeta n K L
46
+ open polynomial ne_zero is_cyclotomic_extension
47
47
48
- open polynomial ne_zero
49
-
50
- namespace is_cyclotomic_extension
48
+ namespace is_primitive_root
51
49
52
50
/-- `is_primitive_root.aut_to_pow` is injective in the case that it's considered over a cyclotomic
53
51
field extension, where `n` does not divide the characteristic of K. -/
54
- lemma aut_to_pow_injective [ne_zero ((n : ℕ) : K)] : function.injective $
55
- (@zeta_primitive_root n K L _ _ _ _ _ $ of_no_zero_smul_divisors K L n).aut_to_pow K :=
52
+ lemma aut_to_pow_injective : function.injective $ hμ.aut_to_pow K :=
56
53
begin
57
54
intros f g hfg,
58
55
apply_fun units.val at hfg,
@@ -61,67 +58,66 @@ begin
61
58
have hf := hf'.some_spec,
62
59
have hg := hg'.some_spec,
63
60
generalize_proofs hζ at hf hg,
64
- suffices : f hζ .to_roots_of_unity = g hζ .to_roots_of_unity,
61
+ suffices : f hμ .to_roots_of_unity = g hμ .to_roots_of_unity,
65
62
{ apply alg_equiv.coe_alg_hom_injective,
66
- apply (zeta .power_basis n K L ).alg_hom_ext,
63
+ apply (hμ .power_basis K ).alg_hom_ext,
67
64
exact this },
68
65
rw zmod.eq_iff_modeq_nat at hfg,
69
66
refine (hf.trans _).trans hg.symm,
70
67
rw [←roots_of_unity.coe_pow _ hf'.some, ←roots_of_unity.coe_pow _ hg'.some],
71
68
congr' 1 ,
72
69
rw [pow_eq_pow_iff_modeq],
73
70
convert hfg,
74
- rw [hζ .eq_order_of],
75
- rw [←hζ .coe_to_roots_of_unity_coe] {occs := occurrences.pos [2 ]},
71
+ rw [hμ .eq_order_of],
72
+ rw [←hμ .coe_to_roots_of_unity_coe] {occs := occurrences.pos [2 ]},
76
73
rw [order_of_units, order_of_subgroup]
77
74
end
78
75
76
+ end is_primitive_root
77
+
78
+ namespace is_cyclotomic_extension
79
+
79
80
/-- Cyclotomic extensions are abelian. -/
80
81
noncomputable def aut.comm_group [ne_zero ((n : ℕ) : K)] : comm_group (L ≃ₐ[K] L) :=
81
- (aut_to_pow_injective n K L).comm_group _ (map_one _) (map_mul _) (map_inv _) (map_div _)
82
-
83
- /-- The power basis given by `ζ ^ t`. -/
84
- @[simps] noncomputable def zeta_pow_power_basis [ne_zero ((n : ℕ) : K)] (t : (zmod n)ˣ) :
85
- power_basis K L :=
86
- begin
87
- haveI := of_no_zero_smul_divisors K L n,
88
- refine power_basis.map (algebra.adjoin.power_basis $ integral {n} K L $ ζ ^ (t : zmod n).val) _,
89
- refine (subalgebra.equiv_of_eq _ _ (adjoin_primitive_root_eq_top n _ _)).trans algebra.top_equiv,
90
- exact (zeta_primitive_root n K L).pow_of_coprime _ (zmod.val_coe_unit_coprime t),
91
- end
82
+ let _ := of_no_zero_smul_divisors K L n in by exactI
83
+ ((zeta_primitive_root n K L).aut_to_pow_injective K).comm_group _
84
+ (map_one _) (map_mul _) (map_inv _) (map_div _)
92
85
93
- variables (h : irreducible (cyclotomic n K)) {K}
86
+ variables (h : irreducible (cyclotomic n K)) {K} (L)
94
87
95
88
include h
96
89
97
- /-- The `mul_equiv` that takes an automorphism to the power of μ that μ gets mapped to under it.
98
- A stronger version of `is_primitive_root.aut_to_pow`. -/
90
+ /-- The `mul_equiv` that takes an automorphism `f` to the element `k : (zmod n)ˣ` such that
91
+ `f μ = μ ^ k`. A stronger version of `is_primitive_root.aut_to_pow`. -/
99
92
@[simps] noncomputable def aut_equiv_pow [ne_zero ((n : ℕ) : K)] : (L ≃ₐ[K] L) ≃* (zmod n)ˣ :=
100
- let hn := of_no_zero_smul_divisors K L n in by exactI
101
- { inv_fun := λ t, (zeta.power_basis n K L).equiv_of_minpoly (zeta_pow_power_basis n K L t)
93
+ let hn := of_no_zero_smul_divisors K L n in
94
+ by exactI
95
+ let hζ := zeta_primitive_root n K L,
96
+ hμ := λ t, hζ.pow_of_coprime _ (zmod.val_coe_unit_coprime t) in
97
+ { inv_fun := λ t, (hζ.power_basis K).equiv_of_minpoly ((hμ t).power_basis K)
102
98
begin
103
- simp only [zeta .power_basis_gen, zeta_pow_power_basis_gen ],
99
+ simp only [is_primitive_root .power_basis_gen],
104
100
have hr := is_primitive_root.minpoly_eq_cyclotomic_of_irreducible
105
101
((zeta_primitive_root n K L).pow_of_coprime _ (zmod.val_coe_unit_coprime t)) h,
106
102
exact ((zeta_primitive_root n K L).minpoly_eq_cyclotomic_of_irreducible h).symm.trans hr
107
103
end ,
108
104
left_inv := λ f, begin
109
105
simp only [monoid_hom.to_fun_eq_coe],
110
106
apply alg_equiv.coe_alg_hom_injective,
111
- apply (zeta .power_basis n K L ).alg_hom_ext,
107
+ apply (hζ .power_basis K ).alg_hom_ext,
112
108
simp only [alg_equiv.coe_alg_hom, alg_equiv.map_pow],
113
109
rw power_basis.equiv_of_minpoly_gen,
114
- simp only [zeta_pow_power_basis_gen, zeta .power_basis_gen, is_primitive_root.aut_to_pow_spec],
110
+ simp only [is_primitive_root .power_basis_gen, is_primitive_root.aut_to_pow_spec],
115
111
end ,
116
112
right_inv := λ x, begin
117
113
simp only [monoid_hom.to_fun_eq_coe],
118
- generalize_proofs _ hζ _ h,
119
- have key := hζ.aut_to_pow_spec K ((zeta .power_basis n K L ).equiv_of_minpoly
120
- (zeta_pow_power_basis n K L x ) h),
121
- have := (zeta .power_basis n K L ).equiv_of_minpoly_gen,
122
- rw zeta .power_basis_gen at this {occs := occurrences.pos [ 2 ]} ,
123
- rw [this , zeta_pow_power_basis_gen ] at key,
124
- rw ← hζ.coe_to_roots_of_unity_coe at key {occs := occurrences.pos [1 , 3 ]},
114
+ generalize_proofs _ _ _ h,
115
+ have key := hζ.aut_to_pow_spec K ((hζ .power_basis K ).equiv_of_minpoly
116
+ ((hμ x).power_basis K ) h),
117
+ have := (hζ .power_basis K ).equiv_of_minpoly_gen ((hμ x).power_basis K) h ,
118
+ rw hζ .power_basis_gen K at this ,
119
+ rw [this , is_primitive_root.power_basis_gen ] at key,
120
+ rw ← hζ.coe_to_roots_of_unity_coe at key {occs := occurrences.pos [1 , 5 ]},
125
121
simp only [←coe_coe, ←roots_of_unity.coe_pow] at key,
126
122
replace key := roots_of_unity.coe_injective key,
127
123
rw [pow_eq_pow_iff_modeq, ←order_of_subgroup, ←order_of_units, hζ.coe_to_roots_of_unity_coe,
@@ -131,33 +127,28 @@ let hn := of_no_zero_smul_divisors K L n in by exactI
131
127
end ,
132
128
.. (zeta_primitive_root n K L).aut_to_pow K }
133
129
134
- end is_cyclotomic_extension
130
+ include hμ
135
131
136
- open is_cyclotomic_extension
137
-
138
- namespace is_primitive_root
139
-
140
- variables (h : irreducible (cyclotomic n K)) {K L}
141
-
142
- include h hμ
132
+ variables {L}
143
133
144
134
/-- Maps `μ` to the `alg_equiv` that sends `is_cyclotomic_extension.zeta` to `μ`. -/
145
135
noncomputable def from_zeta_aut [ne_zero ((n : ℕ) : K)] : L ≃ₐ[K] L :=
146
136
have _ := of_no_zero_smul_divisors K L n, by exactI
147
137
let hζ := (zeta_primitive_root n K L).eq_pow_of_pow_eq_one hμ.pow_eq_one n.pos in
148
- (aut_equiv_pow n L h).symm $ zmod.unit_of_coprime hζ.some $
138
+ (aut_equiv_pow L h).symm $ zmod.unit_of_coprime hζ.some $
149
139
((zeta_primitive_root n K L).pow_iff_coprime n.pos hζ.some).mp $ hζ.some_spec.some_spec.symm ▸ hμ
150
140
151
- lemma from_zeta_aut_spec [ne_zero ((n : ℕ) : K)] : from_zeta_aut n hμ h ζ = μ :=
141
+ lemma from_zeta_aut_spec [ne_zero ((n : ℕ) : K)] : from_zeta_aut hμ h (zeta n K L) = μ :=
152
142
begin
153
- simp only [from_zeta_aut, exists_prop, aut_equiv_pow_symm_apply, ←zeta.power_basis_gen,
154
- power_basis.equiv_of_minpoly_gen, zeta_pow_power_basis_gen, zmod.coe_unit_of_coprime],
155
- generalize_proofs hζ,
156
- convert hζ.some_spec.2 ,
157
- exact zmod.val_cast_of_lt hζ.some_spec.1
143
+ simp_rw [from_zeta_aut, aut_equiv_pow_symm_apply],
144
+ generalize_proofs _ hζ h _ hμ _,
145
+ rw [←hζ.power_basis_gen K] {occs := occurrences.pos [4 ]},
146
+ rw [power_basis.equiv_of_minpoly_gen, hμ.power_basis_gen K],
147
+ convert h.some_spec.some_spec,
148
+ exact zmod.val_cast_of_lt h.some_spec.some
158
149
end
159
150
160
- end is_primitive_root
151
+ end is_cyclotomic_extension
161
152
162
153
section gal
163
154
@@ -171,14 +162,14 @@ characteristic of `K`, and `cyclotomic n K` is irreducible in the base field. -/
171
162
noncomputable def gal_cyclotomic_equiv_units_zmod [ne_zero ((n : ℕ) : K)] :
172
163
(cyclotomic n K).gal ≃* (zmod n)ˣ :=
173
164
(alg_equiv.aut_congr (is_splitting_field.alg_equiv _ _)).symm.trans
174
- (is_cyclotomic_extension.aut_equiv_pow n L h)
165
+ (is_cyclotomic_extension.aut_equiv_pow L h)
175
166
176
167
/-- `is_cyclotomic_extension.aut_equiv_pow` repackaged in terms of `gal`. Asserts that the
177
168
Galois group of `X ^ n - 1` is equivalent to `(zmod n)ˣ` if `n` does not divide the characteristic
178
169
of `K`, and `cyclotomic n K` is irreducible in the base field. -/
179
170
noncomputable def gal_X_pow_equiv_units_zmod [ne_zero ((n : ℕ) : K)] :
180
171
(X ^ (n : ℕ) - 1 ).gal ≃* (zmod n)ˣ :=
181
172
(alg_equiv.aut_congr (is_splitting_field.alg_equiv _ _)).symm.trans
182
- (is_cyclotomic_extension.aut_equiv_pow n L h)
173
+ (is_cyclotomic_extension.aut_equiv_pow L h)
183
174
184
175
end gal
0 commit comments