@@ -246,7 +246,7 @@ We first develop the theory for a specific `K[n√a] := AdjoinRoot (X ^ n - C a)
246
246
The main result is the description of the galois group: `autAdjoinRootXPowSubCEquiv`.
247
247
-/
248
248
249
- variable {n : ℕ} (hζ : (primitiveRoots n K).Nonempty) (hn : 0 < n)
249
+ variable {n : ℕ} (hζ : (primitiveRoots n K).Nonempty)
250
250
variable (a : K) (H : Irreducible (X ^ n - C a))
251
251
252
252
set_option quotPrecheck false in
@@ -280,14 +280,15 @@ theorem Polynomial.separable_X_pow_sub_C_of_irreducible : (X ^ n - C a).Separabl
280
280
exact (hζ.map_of_injective (algebraMap K K[n√a]).injective).injOn_pow_mul
281
281
(root_X_pow_sub_C_ne_zero (lt_of_le_of_ne (show 1 ≤ n from hn) (Ne.symm hn')) _)
282
282
283
+ variable (n)
284
+
283
285
/-- The natural embedding of the roots of unity of `K` into `Gal(K[ⁿ√a]/K)`, by sending
284
286
`η ↦ (ⁿ√a ↦ η • ⁿ√a)`. Also see `autAdjoinRootXPowSubC` for the `AlgEquiv` version. -/
285
287
noncomputable
286
288
def autAdjoinRootXPowSubCHom :
287
- rootsOfUnity ⟨n, hn⟩ K →* (K[n√a] →ₐ[K] K[n√a]) where
289
+ rootsOfUnity n K →* (K[n√a] →ₐ[K] K[n√a]) where
288
290
toFun := fun η ↦ liftHom (X ^ n - C a) (((η : Kˣ) : K) • (root _) : K[n√a]) <| by
289
291
have := (mem_rootsOfUnity' _ _).mp η.prop
290
- dsimp at this
291
292
rw [map_sub, map_pow, aeval_C, aeval_X, Algebra.smul_def, mul_pow, root_X_pow_sub_C_pow,
292
293
AdjoinRoot.algebraMap_eq, ← map_pow, this, map_one, one_mul, sub_self]
293
294
map_one' := algHom_ext <| by simp
@@ -298,11 +299,13 @@ def autAdjoinRootXPowSubCHom :
298
299
See `autAdjoinRootXPowSubCEquiv`. -/
299
300
noncomputable
300
301
def autAdjoinRootXPowSubC :
301
- rootsOfUnity ⟨n, hn⟩ K →* (K[n√a] ≃ₐ[K] K[n√a]) :=
302
- (AlgEquiv.algHomUnitsEquiv _ _).toMonoidHom.comp (autAdjoinRootXPowSubCHom hn a).toHomUnits
302
+ rootsOfUnity n K →* (K[n√a] ≃ₐ[K] K[n√a]) :=
303
+ (AlgEquiv.algHomUnitsEquiv _ _).toMonoidHom.comp (autAdjoinRootXPowSubCHom n a).toHomUnits
304
+
305
+ variable {n}
303
306
304
307
lemma autAdjoinRootXPowSubC_root (η) :
305
- autAdjoinRootXPowSubC hn a η (root _) = ((η : Kˣ) : K) • root _ := by
308
+ autAdjoinRootXPowSubC n a η (root _) = ((η : Kˣ) : K) • root _ := by
306
309
dsimp [autAdjoinRootXPowSubC, autAdjoinRootXPowSubCHom, AlgEquiv.algHomUnitsEquiv]
307
310
apply liftHom_root
308
311
@@ -311,34 +314,33 @@ variable {a}
311
314
/-- The inverse function of `autAdjoinRootXPowSubC` if `K` has all roots of unity.
312
315
See `autAdjoinRootXPowSubCEquiv`. -/
313
316
noncomputable
314
- def AdjoinRootXPowSubCEquivToRootsOfUnity (σ : K[n√a] ≃ₐ[K] K[n√a]) :
315
- rootsOfUnity ⟨n, hn⟩ K :=
317
+ def AdjoinRootXPowSubCEquivToRootsOfUnity [NeZero n] (σ : K[n√a] ≃ₐ[K] K[n√a]) :
318
+ rootsOfUnity n K :=
316
319
letI := Fact.mk H
317
320
letI : IsDomain K[n√a] := inferInstance
318
321
letI := Classical.decEq K
319
- (rootsOfUnityEquivOfPrimitiveRoots (n := ⟨n, hn⟩ ) (algebraMap K K[n√a]).injective hζ).symm
322
+ (rootsOfUnityEquivOfPrimitiveRoots (n := n ) (algebraMap K K[n√a]).injective hζ).symm
320
323
(rootsOfUnity.mkOfPowEq (if a = 0 then 1 else σ (root _) / root _) (by
321
324
-- The if is needed in case `n = 1` and `a = 0` and `K[n√a] = K`.
322
325
split
323
326
· exact one_pow _
324
327
rw [div_pow, ← map_pow]
325
- simp only [PNat.mk_coe, root_X_pow_sub_C_pow, ← AdjoinRoot.algebraMap_eq, AlgEquiv.commutes]
328
+ simp only [root_X_pow_sub_C_pow, ← AdjoinRoot.algebraMap_eq, AlgEquiv.commutes]
326
329
rw [div_self]
327
330
rwa [Ne, map_eq_zero_iff _ (algebraMap K _).injective]))
328
331
329
332
/-- The equivalence between the roots of unity of `K` and `Gal(K[ⁿ√a]/K)`. -/
330
333
noncomputable
331
- def autAdjoinRootXPowSubCEquiv :
332
- rootsOfUnity ⟨n, hn⟩ K ≃* (K[n√a] ≃ₐ[K] K[n√a]) where
333
- __ := autAdjoinRootXPowSubC hn a
334
- invFun := AdjoinRootXPowSubCEquivToRootsOfUnity hζ hn H
334
+ def autAdjoinRootXPowSubCEquiv [NeZero n] :
335
+ rootsOfUnity n K ≃* (K[n√a] ≃ₐ[K] K[n√a]) where
336
+ __ := autAdjoinRootXPowSubC n a
337
+ invFun := AdjoinRootXPowSubCEquivToRootsOfUnity hζ H
335
338
left_inv := by
336
339
intro η
337
340
have := Fact.mk H
338
341
have : IsDomain K[n√a] := inferInstance
339
342
letI : Algebra K K[n√a] := inferInstance
340
- apply (rootsOfUnityEquivOfPrimitiveRoots
341
- (n := ⟨n, hn⟩) (algebraMap K K[n√a]).injective hζ).injective
343
+ apply (rootsOfUnityEquivOfPrimitiveRoots (algebraMap K K[n√a]).injective hζ).injective
342
344
ext
343
345
simp only [AdjoinRoot.algebraMap_eq, OneHom.toFun_eq_coe, MonoidHom.toOneHom_coe,
344
346
autAdjoinRootXPowSubC_root, Algebra.smul_def, ne_eq, MulEquiv.apply_symm_apply,
@@ -347,36 +349,34 @@ def autAdjoinRootXPowSubCEquiv :
347
349
split_ifs with h
348
350
· obtain rfl := not_imp_not.mp (fun hn ↦ ne_zero_of_irreducible_X_pow_sub_C' hn H) h
349
351
have : (η : Kˣ) = 1 := (pow_one _).symm.trans η.prop
350
- simp only [PNat.mk_one, this, Units.val_one, map_one]
351
- · exact mul_div_cancel_right₀ _ (root_X_pow_sub_C_ne_zero' hn h)
352
+ simp only [this, Units.val_one, map_one]
353
+ · exact mul_div_cancel_right₀ _ (root_X_pow_sub_C_ne_zero' (NeZero.pos n) h)
352
354
right_inv := by
353
355
intro e
354
356
have := Fact.mk H
355
357
letI : Algebra K K[n√a] := inferInstance
356
358
apply AlgEquiv.coe_algHom_injective
357
359
apply AdjoinRoot.algHom_ext
358
- simp only [AdjoinRoot.algebraMap_eq, OneHom.toFun_eq_coe, MonoidHom.toOneHom_coe,
359
- AlgHom.coe_coe, autAdjoinRootXPowSubC_root, Algebra.smul_def, PNat.mk_coe,
360
- AdjoinRootXPowSubCEquivToRootsOfUnity]
360
+ simp only [AdjoinRootXPowSubCEquivToRootsOfUnity, AdjoinRoot.algebraMap_eq, OneHom.toFun_eq_coe,
361
+ MonoidHom.toOneHom_coe, AlgHom.coe_coe, autAdjoinRootXPowSubC_root, Algebra.smul_def]
361
362
rw [rootsOfUnityEquivOfPrimitiveRoots_symm_apply, rootsOfUnity.val_mkOfPowEq_coe]
362
363
split_ifs with h
363
364
· obtain rfl := not_imp_not.mp (fun hn ↦ ne_zero_of_irreducible_X_pow_sub_C' hn H) h
364
365
rw [(pow_one _).symm.trans (root_X_pow_sub_C_pow 1 a), one_mul,
365
366
← AdjoinRoot.algebraMap_eq, AlgEquiv.commutes]
366
- · refine div_mul_cancel₀ _ (root_X_pow_sub_C_ne_zero' hn h)
367
+ · refine div_mul_cancel₀ _ (root_X_pow_sub_C_ne_zero' (NeZero.pos n) h)
367
368
368
- lemma autAdjoinRootXPowSubCEquiv_root (η) :
369
- autAdjoinRootXPowSubCEquiv hζ hn H η (root _) = ((η : Kˣ) : K) • root _ :=
370
- autAdjoinRootXPowSubC_root hn a η
369
+ lemma autAdjoinRootXPowSubCEquiv_root [NeZero n] (η) :
370
+ autAdjoinRootXPowSubCEquiv hζ H η (root _) = ((η : Kˣ) : K) • root _ :=
371
+ autAdjoinRootXPowSubC_root a η
371
372
372
- lemma autAdjoinRootXPowSubCEquiv_symm_smul (σ) :
373
- ((autAdjoinRootXPowSubCEquiv hζ hn H).symm σ : Kˣ) • (root _ : K[n√a]) = σ (root _) := by
373
+ lemma autAdjoinRootXPowSubCEquiv_symm_smul [NeZero n] (σ) :
374
+ ((autAdjoinRootXPowSubCEquiv hζ H).symm σ : Kˣ) • (root _ : K[n√a]) = σ (root _) := by
374
375
have := Fact.mk H
375
376
simp only [autAdjoinRootXPowSubCEquiv, OneHom.toFun_eq_coe, MonoidHom.toOneHom_coe,
376
377
MulEquiv.symm_mk, MulEquiv.coe_mk, Equiv.coe_fn_symm_mk, AdjoinRootXPowSubCEquivToRootsOfUnity,
377
- AdjoinRoot.algebraMap_eq, Units.smul_def, Algebra.smul_def,
378
- rootsOfUnityEquivOfPrimitiveRoots_symm_apply, rootsOfUnity.mkOfPowEq, PNat.mk_coe,
379
- Units.val_ofPowEqOne, ite_mul, one_mul, ne_eq]
378
+ AdjoinRoot.algebraMap_eq, rootsOfUnity.mkOfPowEq, Units.smul_def, Algebra.smul_def,
379
+ rootsOfUnityEquivOfPrimitiveRoots_symm_apply, Units.val_ofPowEqOne, ite_mul, one_mul]
380
380
simp_rw [← root_X_pow_sub_C_eq_zero_iff H]
381
381
split_ifs with h
382
382
· rw [h, map_zero]
@@ -459,8 +459,8 @@ abbrev rootOfSplitsXPowSubC (hn : 0 < n) (a : K)
459
459
(rootOfSplits _ (IsSplittingField.splits L (X ^ n - C a))
460
460
(by simpa [degree_X_pow_sub_C hn] using Nat.pos_iff_ne_zero.mp hn))
461
461
462
- lemma rootOfSplitsXPowSubC_pow :
463
- (rootOfSplitsXPowSubC hn a L) ^ n = algebraMap K L a := by
462
+ lemma rootOfSplitsXPowSubC_pow [NeZero n] :
463
+ (rootOfSplitsXPowSubC (NeZero.pos n) a L) ^ n = algebraMap K L a := by
464
464
have := map_rootOfSplits _ (IsSplittingField.splits L (X ^ n - C a))
465
465
simp only [eval₂_sub, eval₂_X_pow, eval₂_C, sub_eq_zero] at this
466
466
exact this _
@@ -471,15 +471,15 @@ variable {a}
471
471
roots of unity in `K` if `K` contains all of them.
472
472
Note that this does not depend on a choice of `ⁿ√a`. -/
473
473
noncomputable
474
- def autEquivRootsOfUnity :
475
- (L ≃ₐ[K] L) ≃* (rootsOfUnity ⟨n, hn⟩ K) :=
476
- (AlgEquiv.autCongr (adjoinRootXPowSubCEquiv hζ H (rootOfSplitsXPowSubC_pow hn a L)).symm).trans
477
- (autAdjoinRootXPowSubCEquiv hζ hn H).symm
478
-
479
- lemma autEquivRootsOfUnity_apply_rootOfSplit (σ : L ≃ₐ[K] L) :
480
- σ (rootOfSplitsXPowSubC hn a L) =
481
- autEquivRootsOfUnity hζ hn H L σ • (rootOfSplitsXPowSubC hn a L) := by
482
- obtain ⟨η, rfl⟩ := (autEquivRootsOfUnity hζ hn H L).symm.surjective σ
474
+ def autEquivRootsOfUnity [NeZero n] :
475
+ (L ≃ₐ[K] L) ≃* (rootsOfUnity n K) :=
476
+ (AlgEquiv.autCongr (adjoinRootXPowSubCEquiv hζ H (rootOfSplitsXPowSubC_pow a L)).symm).trans
477
+ (autAdjoinRootXPowSubCEquiv hζ H).symm
478
+
479
+ lemma autEquivRootsOfUnity_apply_rootOfSplit [NeZero n] (σ : L ≃ₐ[K] L) :
480
+ σ (rootOfSplitsXPowSubC (NeZero.pos n) a L) =
481
+ autEquivRootsOfUnity hζ H L σ • (rootOfSplitsXPowSubC (NeZero.pos n) a L) := by
482
+ obtain ⟨η, rfl⟩ := (autEquivRootsOfUnity hζ H L).symm.surjective σ
483
483
rw [MulEquiv.apply_symm_apply, autEquivRootsOfUnity]
484
484
simp only [MulEquiv.symm_trans_apply, AlgEquiv.autCongr_symm, AlgEquiv.symm_symm,
485
485
MulEquiv.symm_symm, AlgEquiv.autCongr_apply, AlgEquiv.trans_apply,
@@ -488,43 +488,44 @@ lemma autEquivRootsOfUnity_apply_rootOfSplit (σ : L ≃ₐ[K] L) :
488
488
rfl
489
489
490
490
include hα in
491
- lemma autEquivRootsOfUnity_smul (σ : L ≃ₐ[K] L) :
492
- autEquivRootsOfUnity hζ hn H L σ • α = σ α := by
491
+ lemma autEquivRootsOfUnity_smul [NeZero n] (σ : L ≃ₐ[K] L) :
492
+ autEquivRootsOfUnity hζ H L σ • α = σ α := by
493
493
have ⟨ζ, hζ'⟩ := hζ
494
+ have hn := NeZero.pos n
494
495
rw [mem_primitiveRoots hn] at hζ'
495
496
rw [← mem_nthRoots hn, (hζ'.map_of_injective (algebraMap K L).injective).nthRoots_eq
496
- (rootOfSplitsXPowSubC_pow hn a L)] at hα
497
+ (rootOfSplitsXPowSubC_pow a L)] at hα
497
498
simp only [Finset.range_val, Multiset.mem_map, Multiset.mem_range] at hα
498
499
obtain ⟨i, _, rfl⟩ := hα
499
500
simp only [map_mul, ← map_pow, ← Algebra.smul_def, map_smul,
500
- autEquivRootsOfUnity_apply_rootOfSplit hζ hn H L]
501
+ autEquivRootsOfUnity_apply_rootOfSplit hζ H L]
501
502
exact smul_comm _ _ _
502
503
503
504
/-- Suppose `L/K` is the splitting field of `Xⁿ - a`, and `ζ` is a `n`-th primitive root of unity
504
505
in `K`, then `Gal(L/K)` is isomorphic to `ZMod n`. -/
505
506
noncomputable
506
- def autEquivZmod {ζ : K} (hζ : IsPrimitiveRoot ζ n) :
507
+ def autEquivZmod [NeZero n] {ζ : K} (hζ : IsPrimitiveRoot ζ n) :
507
508
(L ≃ₐ[K] L) ≃* Multiplicative (ZMod n) :=
508
509
haveI hn := Nat.pos_iff_ne_zero.mpr (ne_zero_of_irreducible_X_pow_sub_C H)
509
- (autEquivRootsOfUnity ⟨ζ, (mem_primitiveRoots hn).mpr hζ⟩ hn H L).trans
510
- ((MulEquiv.subgroupCongr (IsPrimitiveRoot.zpowers_eq (k := ⟨n, hn⟩)
510
+ (autEquivRootsOfUnity ⟨ζ, (mem_primitiveRoots hn).mpr hζ⟩ H L).trans
511
+ ((MulEquiv.subgroupCongr (IsPrimitiveRoot.zpowers_eq
511
512
(hζ.isUnit_unit' hn)).symm).trans (AddEquiv.toMultiplicative'
512
513
(hζ.isUnit_unit' hn).zmodEquivZPowers.symm))
513
514
514
515
include hα in
515
- lemma autEquivZmod_symm_apply_intCast {ζ : K} (hζ : IsPrimitiveRoot ζ n) (m : ℤ) :
516
+ lemma autEquivZmod_symm_apply_intCast [NeZero n] {ζ : K} (hζ : IsPrimitiveRoot ζ n) (m : ℤ) :
516
517
(autEquivZmod H L hζ).symm (Multiplicative.ofAdd (m : ZMod n)) α = ζ ^ m • α := by
517
518
have hn := Nat.pos_iff_ne_zero.mpr (ne_zero_of_irreducible_X_pow_sub_C H)
518
- rw [← autEquivRootsOfUnity_smul ⟨ζ, (mem_primitiveRoots hn).mpr hζ⟩ hn H L hα]
519
+ rw [← autEquivRootsOfUnity_smul ⟨ζ, (mem_primitiveRoots hn).mpr hζ⟩ H L hα]
519
520
simp [MulEquiv.subgroupCongr_symm_apply, Subgroup.smul_def, Units.smul_def, autEquivZmod]
520
521
521
522
include hα in
522
- lemma autEquivZmod_symm_apply_natCast {ζ : K} (hζ : IsPrimitiveRoot ζ n) (m : ℕ) :
523
+ lemma autEquivZmod_symm_apply_natCast [NeZero n] {ζ : K} (hζ : IsPrimitiveRoot ζ n) (m : ℕ) :
523
524
(autEquivZmod H L hζ).symm (Multiplicative.ofAdd (m : ZMod n)) α = ζ ^ m • α := by
524
525
simpa only [Int.cast_natCast, zpow_natCast] using autEquivZmod_symm_apply_intCast H L hα hζ m
525
526
526
527
include hζ H in
527
- lemma isCyclic_of_isSplittingField_X_pow_sub_C : IsCyclic (L ≃ₐ[K] L) :=
528
+ lemma isCyclic_of_isSplittingField_X_pow_sub_C [NeZero n] : IsCyclic (L ≃ₐ[K] L) :=
528
529
have hn := Nat.pos_iff_ne_zero.mpr (ne_zero_of_irreducible_X_pow_sub_C H)
529
530
isCyclic_of_surjective _
530
531
(autEquivZmod H _ <| (mem_primitiveRoots hn).mp hζ.choose_spec).symm.surjective
@@ -641,6 +642,7 @@ lemma isCyclic_tfae (K L) [Field K] [Field L] [Algebra K L] [FiniteDimensional K
641
642
∃ a : K, Irreducible (X ^ (finrank K L) - C a) ∧
642
643
IsSplittingField K L (X ^ (finrank K L) - C a),
643
644
∃ (α : L), α ^ (finrank K L) ∈ Set.range (algebraMap K L) ∧ K⟮α⟯ = ⊤] := by
645
+ have : NeZero (Module.finrank K L) := NeZero.of_pos finrank_pos
644
646
tfae_have 1 → 3
645
647
| ⟨inst₁, inst₂⟩ => exists_root_adjoin_eq_top_of_isCyclic K L hK
646
648
tfae_have 3 → 2
0 commit comments