number_theory.cyclotomic.basic
⟷
Mathlib.NumberTheory.Cyclotomic.Basic
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -135,7 +135,7 @@ theorem singleton_zero_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) : IsCycl
by
refine'
(iff_adjoin_eq_top _ _ _).2 ⟨fun s hs => by simpa using hs, _root_.eq_top_iff.2 fun x hx => _⟩
- rw [← h] at hx
+ rw [← h] at hx
simpa using hx
#align is_cyclotomic_extension.singleton_zero_of_bot_eq_top IsCyclotomicExtension.singleton_zero_of_bot_eq_top
-/
@@ -161,7 +161,7 @@ theorem trans (C : Type w) [CommRing C] [Algebra A C] [Algebra B C] [IsScalarTow
· let f := IsScalarTower.toAlgHom A B C
have hb : f b ∈ (adjoin A {b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1}).map f :=
⟨b, ((isCyclotomicExtension_iff _ _ _).1 hS).2 b, rfl⟩
- rw [IsScalarTower.toAlgHom_apply, ← adjoin_image] at hb
+ rw [IsScalarTower.toAlgHom_apply, ← adjoin_image] at hb
refine' adjoin_mono (fun y hy => _) hb
obtain ⟨b₁, ⟨⟨n, hn⟩, h₁⟩⟩ := hy
exact ⟨n, ⟨mem_union_left T hn.1, by rw [← h₁, ← AlgHom.map_pow, hn.2, AlgHom.map_one]⟩⟩
@@ -206,7 +206,7 @@ theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
· exact ⟨n, Or.inr hn.1, hn.2⟩
refine' ⟨fun n hn => ((isCyclotomicExtension_iff _ _ _).1 h).1 (mem_union_right S hn), fun b => _⟩
replace h := ((isCyclotomicExtension_iff _ _ _).1 h).2 b
- rwa [this, adjoin_union_eq_adjoin_adjoin, Subalgebra.mem_restrictScalars] at h
+ rwa [this, adjoin_union_eq_adjoin_adjoin, Subalgebra.mem_restrictScalars] at h
#align is_cyclotomic_extension.union_right IsCyclotomicExtension.union_right
-/
@@ -236,7 +236,7 @@ theorem of_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) [H : IsCycl
IsCyclotomicExtension (S ∪ {n}) A B :=
by
refine' (iff_adjoin_eq_top _ _ _).2 ⟨fun s hs => _, _⟩
- · rw [mem_union, mem_singleton_iff] at hs
+ · rw [mem_union, mem_singleton_iff] at hs
obtain hs | rfl := hs
· exact H.exists_prim_root hs
· obtain ⟨m, hm⟩ := hS
@@ -362,7 +362,7 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : M
Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
rw [this]
exact (nth_roots (↑n) 1).toFinset.finite_toSet
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
-/
@@ -384,7 +384,7 @@ theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A
haveI := H A (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1})
have : Module.Finite (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}) B :=
by
- rw [← union_singleton] at h
+ rw [← union_singleton] at h
letI := @union_right S {n} A B _ _ _ h
exact finite_of_singleton n _ _
exact Module.Finite.trans (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}) _
@@ -437,13 +437,13 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n :
by
simp only [mem_singleton_iff, exists_eq_left, map_cyclotomic]
refine' le_antisymm (adjoin_mono fun x hx => _) (adjoin_le fun x hx => _)
- · rw [mem_root_set'] at hx
+ · rw [mem_root_set'] at hx
simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq]
rw [isRoot_of_unity_iff n.pos]
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
rw [is_root.def, ← map_cyclotomic n (algebraMap A B), eval_map, ← aeval_def]
exact hx.2
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
obtain ⟨i, hin, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
refine' SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin _) _)
rw [mem_root_set', map_cyclotomic, aeval_def, ← eval_map, map_cyclotomic, ← is_root]
@@ -461,9 +461,9 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B
exact SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin <| mem_singleton ζ) _)
rw [isRoot_of_unity_iff n.pos]
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
- rw [mem_root_set', aeval_def, ← eval_map, map_cyclotomic, ← is_root] at hx
+ rw [mem_root_set', aeval_def, ← eval_map, map_cyclotomic, ← is_root] at hx
exact hx.2
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
simpa only [hx, mem_root_set', map_cyclotomic, aeval_def, ← eval_map, is_root] using
And.intro (cyclotomic_ne_zero n B) (hζ.is_root_cyclotomic n.pos)
#align is_cyclotomic_extension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic
@@ -486,7 +486,7 @@ theorem IsPrimitiveRoot.adjoin_isCyclotomicExtension {ζ : B} {n : ℕ+} (h : Is
IsCyclotomicExtension {n} A (adjoin A ({ζ} : Set B)) :=
{ exists_prim_root := fun i hi =>
by
- rw [Set.mem_singleton_iff] at hi
+ rw [Set.mem_singleton_iff] at hi
refine' ⟨⟨ζ, subset_adjoin <| Set.mem_singleton ζ⟩, _⟩
rwa [← IsPrimitiveRoot.coe_submonoidClass_iff, Subtype.coe_mk, hi]
adjoin_roots := fun x =>
@@ -494,7 +494,7 @@ theorem IsPrimitiveRoot.adjoin_isCyclotomicExtension {ζ : B} {n : ℕ+} (h : Is
refine'
adjoin_induction' (fun b hb => _) (fun a => _) (fun b₁ b₂ hb₁ hb₂ => _)
(fun b₁ b₂ hb₁ hb₂ => _) x
- · rw [Set.mem_singleton_iff] at hb
+ · rw [Set.mem_singleton_iff] at hb
refine' subset_adjoin _
simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq, hb]
rw [← Subalgebra.coe_eq_one, Subalgebra.coe_pow, SetLike.coe_mk]
@@ -630,7 +630,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
obtain ⟨ζ, hζ⟩ :=
exists_root_of_splits (algebraMap K (CyclotomicField n K)) (splitting_field.splits _)
(degree_cyclotomic_pos n K n.pos).ne'
- rw [← eval_map, ← is_root.def, map_cyclotomic, is_root_cyclotomic_iff] at hζ
+ rw [← eval_map, ← is_root.def, map_cyclotomic, is_root_cyclotomic_iff] at hζ
refine' ⟨forall_eq.2 ⟨ζ, hζ⟩, _⟩
rw [← Algebra.eq_top_iff, ← splitting_field.adjoin_root_set, eq_comm]
exact IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ
@@ -735,7 +735,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : A)] :
IsCyclotomicExtension {n} A (CyclotomicRing n A K)
where
exists_prim_root a han := by
- rw [mem_singleton_iff] at han
+ rw [mem_singleton_iff] at han
subst a
haveI := NeZero.of_noZeroSMulDivisors A K n
haveI := NeZero.of_noZeroSMulDivisors A (CyclotomicField n K) n
@@ -743,7 +743,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : A)] :
refine' ⟨⟨μ, subset_adjoin _⟩, _⟩
· apply (isRoot_of_unity_iff n.pos (CyclotomicField n K)).mpr
refine' ⟨n, Nat.mem_divisors_self _ n.ne_zero, _⟩
- rwa [← is_root_cyclotomic_iff] at hμ
+ rwa [← is_root_cyclotomic_iff] at hμ
· rwa [← IsPrimitiveRoot.coe_submonoidClass_iff, Subtype.coe_mk]
adjoin_roots x :=
by
@@ -832,7 +832,7 @@ theorem IsAlgClosed.isCyclotomicExtension (h : ∀ a ∈ S, NeZero ((a : ℕ) :
obtain ⟨r, hr⟩ := IsAlgClosed.exists_aeval_eq_zero K _ (degree_cyclotomic_pos a K a.pos).ne'
refine' ⟨r, _⟩
haveI := h a ha
- rwa [coe_aeval_eq_eval, ← is_root.def, is_root_cyclotomic_iff] at hr
+ rwa [coe_aeval_eq_eval, ← is_root.def, is_root_cyclotomic_iff] at hr
#align is_alg_closed.is_cyclotomic_extension IsAlgClosed.isCyclotomicExtension
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -353,7 +353,17 @@ section Fintype
#print IsCyclotomicExtension.finite_of_singleton /-
theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : Module.Finite A B :=
- by classical
+ by
+ classical
+ rw [Module.finite_def, ← top_to_submodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
+ refine' fg_adjoin_of_finite _ fun b hb => _
+ · simp only [mem_singleton_iff, exists_eq_left]
+ have : {b : B | b ^ (n : ℕ) = 1} = (nth_roots n (1 : B)).toFinset :=
+ Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
+ rw [this]
+ exact (nth_roots (↑n) 1).toFinset.finite_toSet
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
+ refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
-/
@@ -461,7 +471,11 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B
#print IsCyclotomicExtension.adjoin_primitive_root_eq_top /-
theorem adjoin_primitive_root_eq_top {n : ℕ+} [IsDomain B] [h : IsCyclotomicExtension {n} A B]
- {ζ : B} (hζ : IsPrimitiveRoot ζ n) : adjoin A ({ζ} : Set B) = ⊤ := by classical
+ {ζ : B} (hζ : IsPrimitiveRoot ζ n) : adjoin A ({ζ} : Set B) = ⊤ := by
+ classical
+ rw [← adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic hζ]
+ rw [adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ]
+ exact ((iff_adjoin_eq_top {n} A B).mp h).2
#align is_cyclotomic_extension.adjoin_primitive_root_eq_top IsCyclotomicExtension.adjoin_primitive_root_eq_top
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -353,17 +353,7 @@ section Fintype
#print IsCyclotomicExtension.finite_of_singleton /-
theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : Module.Finite A B :=
- by
- classical
- rw [Module.finite_def, ← top_to_submodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
- refine' fg_adjoin_of_finite _ fun b hb => _
- · simp only [mem_singleton_iff, exists_eq_left]
- have : {b : B | b ^ (n : ℕ) = 1} = (nth_roots n (1 : B)).toFinset :=
- Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
- rw [this]
- exact (nth_roots (↑n) 1).toFinset.finite_toSet
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
- refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
+ by classical
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
-/
@@ -471,11 +461,7 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B
#print IsCyclotomicExtension.adjoin_primitive_root_eq_top /-
theorem adjoin_primitive_root_eq_top {n : ℕ+} [IsDomain B] [h : IsCyclotomicExtension {n} A B]
- {ζ : B} (hζ : IsPrimitiveRoot ζ n) : adjoin A ({ζ} : Set B) = ⊤ := by
- classical
- rw [← adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic hζ]
- rw [adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ]
- exact ((iff_adjoin_eq_top {n} A B).mp h).2
+ {ζ : B} (hζ : IsPrimitiveRoot ζ n) : adjoin A ({ζ} : Set B) = ⊤ := by classical
#align is_cyclotomic_extension.adjoin_primitive_root_eq_top IsCyclotomicExtension.adjoin_primitive_root_eq_top
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -324,7 +324,7 @@ theorem equiv {C : Type _} [CommRing C] [Algebra A C] [h : IsCyclotomicExtension
by
letI : Algebra B C := f.to_alg_hom.to_ring_hom.to_algebra
haveI : IsCyclotomicExtension {1} B C := singleton_one_of_algebra_map_bijective f.surjective
- haveI : IsScalarTower A B C := IsScalarTower.of_ring_hom f.to_alg_hom
+ haveI : IsScalarTower A B C := IsScalarTower.of_algHom f.to_alg_hom
exact (iff_union_singleton_one _ _ _).2 (trans S {1} A B C f.injective)
#align is_cyclotomic_extension.equiv IsCyclotomicExtension.equiv
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -356,7 +356,7 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : M
by
classical
rw [Module.finite_def, ← top_to_submodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
- refine' FG_adjoin_of_finite _ fun b hb => _
+ refine' fg_adjoin_of_finite _ fun b hb => _
· simp only [mem_singleton_iff, exists_eq_left]
have : {b : B | b ^ (n : ℕ) = 1} = (nth_roots n (1 : B)).toFinset :=
Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,9 +3,9 @@ Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-/
-import Mathbin.RingTheory.Polynomial.Cyclotomic.Roots
-import Mathbin.NumberTheory.NumberField.Basic
-import Mathbin.FieldTheory.Galois
+import RingTheory.Polynomial.Cyclotomic.Roots
+import NumberTheory.NumberField.Basic
+import FieldTheory.Galois
#align_import number_theory.cyclotomic.basic from "leanprover-community/mathlib"@"5d0c76894ada7940957143163d7b921345474cbc"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -409,7 +409,7 @@ scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.numberField
/-- A finite cyclotomic extension of an integral noetherian domain is integral -/
theorem integral [IsDomain B] [IsNoetherianRing A] [Finite S] [IsCyclotomicExtension S A B] :
Algebra.IsIntegral A B :=
- isIntegral_of_noetherian <| isNoetherian_of_fg_of_noetherian' <| (Finite S A B).out
+ isIntegral_of_noetherian <| isNoetherian_of_isNoetherianRing_of_finite <| (Finite S A B).out
#align is_cyclotomic_extension.integral IsCyclotomicExtension.integral
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -529,7 +529,7 @@ theorem splits_cyclotomic [IsCyclotomicExtension S K L] (hS : n ∈ S) :
Splits (algebraMap K L) (cyclotomic n K) :=
by
refine' splits_of_splits_of_dvd _ (X_pow_sub_C_ne_zero n.pos _) (splits_X_pow_sub_one K L hS) _
- use ∏ i : ℕ in (n : ℕ).properDivisors, Polynomial.cyclotomic i K
+ use∏ i : ℕ in (n : ℕ).properDivisors, Polynomial.cyclotomic i K
rw [(eq_cyclotomic_iff n.pos _).1 rfl, RingHom.map_one]
#align is_cyclotomic_extension.splits_cyclotomic IsCyclotomicExtension.splits_cyclotomic
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,16 +2,13 @@
Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-
-! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit 5d0c76894ada7940957143163d7b921345474cbc
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.RingTheory.Polynomial.Cyclotomic.Roots
import Mathbin.NumberTheory.NumberField.Basic
import Mathbin.FieldTheory.Galois
+#align_import number_theory.cyclotomic.basic from "leanprover-community/mathlib"@"5d0c76894ada7940957143163d7b921345474cbc"
+
/-!
# Cyclotomic extensions
mathlib commit https://github.com/leanprover-community/mathlib/commit/93f880918cb51905fd51b76add8273cbc27718ab
@@ -341,13 +341,13 @@ theorem neZero [h : IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n :
#align is_cyclotomic_extension.ne_zero IsCyclotomicExtension.neZero
-/
-#print IsCyclotomicExtension.ne_zero' /-
+#print IsCyclotomicExtension.neZero' /-
@[protected]
-theorem ne_zero' [IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n : ℕ) : A) :=
+theorem neZero' [IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n : ℕ) : A) :=
by
apply NeZero.nat_of_neZero (algebraMap A B)
exact NeZero n A B
-#align is_cyclotomic_extension.ne_zero' IsCyclotomicExtension.ne_zero'
+#align is_cyclotomic_extension.ne_zero' IsCyclotomicExtension.neZero'
-/
end Basic
mathlib commit https://github.com/leanprover-community/mathlib/commit/93f880918cb51905fd51b76add8273cbc27718ab
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit 4b05d3f4f0601dca8abf99c4ec99187682ed0bba
+! leanprover-community/mathlib commit 5d0c76894ada7940957143163d7b921345474cbc
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -15,6 +15,9 @@ import Mathbin.FieldTheory.Galois
/-!
# Cyclotomic extensions
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
Let `A` and `B` be commutative rings with `algebra A B`. For `S : set ℕ+`, we define a class
`is_cyclotomic_extension S A B` expressing the fact that `B` is obtained from `A` by adding `n`-th
primitive roots of unity, for all `n ∈ S`.
mathlib commit https://github.com/leanprover-community/mathlib/commit/6285167a053ad0990fc88e56c48ccd9fae6550eb
@@ -77,6 +77,7 @@ variable [Field K] [Field L] [Algebra K L]
noncomputable section
+#print IsCyclotomicExtension /-
/-- Given an `A`-algebra `B` and `S : set ℕ+`, we define `is_cyclotomic_extension S A B` requiring
that there is a `n`-th primitive root of unity in `B` for all `n ∈ S` and that `B` is generated
over `A` by the roots of `X ^ n - 1`. -/
@@ -85,11 +86,13 @@ class IsCyclotomicExtension : Prop where
exists_prim_root {n : ℕ+} (ha : n ∈ S) : ∃ r : B, IsPrimitiveRoot r n
adjoin_roots : ∀ x : B, x ∈ adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}
#align is_cyclotomic_extension IsCyclotomicExtension
+-/
namespace IsCyclotomicExtension
section Basic
+#print IsCyclotomicExtension.iff_adjoin_eq_top /-
/-- A reformulation of `is_cyclotomic_extension` that uses `⊤`. -/
theorem iff_adjoin_eq_top :
IsCyclotomicExtension S A B ↔
@@ -98,27 +101,35 @@ theorem iff_adjoin_eq_top :
⟨fun h => ⟨fun _ => h.exists_prim_root, Algebra.eq_top_iff.2 h.adjoin_roots⟩, fun h =>
⟨h.1, Algebra.eq_top_iff.1 h.2⟩⟩
#align is_cyclotomic_extension.iff_adjoin_eq_top IsCyclotomicExtension.iff_adjoin_eq_top
+-/
+#print IsCyclotomicExtension.iff_singleton /-
/-- A reformulation of `is_cyclotomic_extension` in the case `S` is a singleton. -/
theorem iff_singleton :
IsCyclotomicExtension {n} A B ↔
(∃ r : B, IsPrimitiveRoot r n) ∧ ∀ x, x ∈ adjoin A {b : B | b ^ (n : ℕ) = 1} :=
by simp [isCyclotomicExtension_iff]
#align is_cyclotomic_extension.iff_singleton IsCyclotomicExtension.iff_singleton
+-/
+#print IsCyclotomicExtension.empty /-
/-- If `is_cyclotomic_extension ∅ A B`, then the image of `A` in `B` equals `B`. -/
theorem empty [h : IsCyclotomicExtension ∅ A B] : (⊥ : Subalgebra A B) = ⊤ := by
simpa [Algebra.eq_top_iff, isCyclotomicExtension_iff] using h
#align is_cyclotomic_extension.empty IsCyclotomicExtension.empty
+-/
+#print IsCyclotomicExtension.singleton_one /-
/-- If `is_cyclotomic_extension {1} A B`, then the image of `A` in `B` equals `B`. -/
theorem singleton_one [h : IsCyclotomicExtension {1} A B] : (⊥ : Subalgebra A B) = ⊤ :=
Algebra.eq_top_iff.2 fun x => by
simpa [adjoin_singleton_one] using ((isCyclotomicExtension_iff _ _ _).1 h).2 x
#align is_cyclotomic_extension.singleton_one IsCyclotomicExtension.singleton_one
+-/
variable {A B}
+#print IsCyclotomicExtension.singleton_zero_of_bot_eq_top /-
/-- If `(⊥ : subalgebra A B) = ⊤`, then `is_cyclotomic_extension ∅ A B`. -/
theorem singleton_zero_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) : IsCyclotomicExtension ∅ A B :=
by
@@ -127,9 +138,11 @@ theorem singleton_zero_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) : IsCycl
rw [← h] at hx
simpa using hx
#align is_cyclotomic_extension.singleton_zero_of_bot_eq_top IsCyclotomicExtension.singleton_zero_of_bot_eq_top
+-/
variable (A B)
+#print IsCyclotomicExtension.trans /-
/-- Transitivity of cyclotomic extensions. -/
theorem trans (C : Type w) [CommRing C] [Algebra A C] [Algebra B C] [IsScalarTower A B C]
[hS : IsCyclotomicExtension S A B] [hT : IsCyclotomicExtension T B C]
@@ -153,7 +166,9 @@ theorem trans (C : Type w) [CommRing C] [Algebra A C] [Algebra B C] [IsScalarTow
obtain ⟨b₁, ⟨⟨n, hn⟩, h₁⟩⟩ := hy
exact ⟨n, ⟨mem_union_left T hn.1, by rw [← h₁, ← AlgHom.map_pow, hn.2, AlgHom.map_one]⟩⟩
#align is_cyclotomic_extension.trans IsCyclotomicExtension.trans
+-/
+#print IsCyclotomicExtension.subsingleton_iff /-
@[nontriviality]
theorem subsingleton_iff [Subsingleton B] : IsCyclotomicExtension S A B ↔ S = { } ∨ S = {1} :=
by
@@ -169,7 +184,9 @@ theorem subsingleton_iff [Subsingleton B] : IsCyclotomicExtension S A B ↔ S =
· rw [iff_singleton]
refine' ⟨⟨0, IsPrimitiveRoot.of_subsingleton 0⟩, fun x => by convert (mem_top : x ∈ ⊤)⟩
#align is_cyclotomic_extension.subsingleton_iff IsCyclotomicExtension.subsingleton_iff
+-/
+#print IsCyclotomicExtension.union_right /-
/-- If `B` is a cyclotomic extension of `A` given by roots of unity of order in `S ∪ T`, then `B`
is a cyclotomic extension of `adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 } ` given by
roots of unity of order in `T`. -/
@@ -191,7 +208,9 @@ theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
replace h := ((isCyclotomicExtension_iff _ _ _).1 h).2 b
rwa [this, adjoin_union_eq_adjoin_adjoin, Subalgebra.mem_restrictScalars] at h
#align is_cyclotomic_extension.union_right IsCyclotomicExtension.union_right
+-/
+#print IsCyclotomicExtension.union_left /-
/-- If `B` is a cyclotomic extension of `A` given by roots of unity of order in `T` and `S ⊆ T`,
then `adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 }` is a cyclotomic extension of `B`
given by roots of unity of order in `S`. -/
@@ -206,9 +225,11 @@ theorem union_left [h : IsCyclotomicExtension T A B] (hS : S ⊆ T) :
rw [← adjoin_adjoin_coe_preimage, preimage_set_of_eq]
norm_cast
#align is_cyclotomic_extension.union_left IsCyclotomicExtension.union_left
+-/
variable {n S}
+#print IsCyclotomicExtension.of_union_of_dvd /-
/-- If `∀ s ∈ S, n ∣ s` and `S` is not empty, then `is_cyclotomic_extension S A B` implies
`is_cyclotomic_extension (S ∪ {n}) A B`. -/
theorem of_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) [H : IsCyclotomicExtension S A B] :
@@ -231,7 +252,9 @@ theorem of_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) [H : IsCycl
obtain ⟨m, hm⟩ := hx
exact ⟨m, ⟨Or.inr hm.1, hm.2⟩⟩
#align is_cyclotomic_extension.of_union_of_dvd IsCyclotomicExtension.of_union_of_dvd
+-/
+#print IsCyclotomicExtension.iff_union_of_dvd /-
/-- If `∀ s ∈ S, n ∣ s` and `S` is not empty, then `is_cyclotomic_extension S A B` if and only if
`is_cyclotomic_extension (S ∪ {n}) A B`. -/
theorem iff_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) :
@@ -250,9 +273,11 @@ theorem iff_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) :
simp only [PNat.mul_coe, pow_mul, hxpow, one_pow]
· exact ⟨m, ⟨hm, hxpow⟩⟩
#align is_cyclotomic_extension.iff_union_of_dvd IsCyclotomicExtension.iff_union_of_dvd
+-/
variable (n S)
+#print IsCyclotomicExtension.iff_union_singleton_one /-
/-- `is_cyclotomic_extension S A B` is equivalent to `is_cyclotomic_extension (S ∪ {1}) A B`. -/
theorem iff_union_singleton_one :
IsCyclotomicExtension S A B ↔ IsCyclotomicExtension (S ∪ {1}) A B :=
@@ -266,9 +291,11 @@ theorem iff_union_singleton_one :
· refine' (iff_adjoin_eq_top _ _ _).2 ⟨fun s hs => (not_mem_empty s hs).elim, _⟩
simp [@singleton_one A B _ _ _ H]
#align is_cyclotomic_extension.iff_union_singleton_one IsCyclotomicExtension.iff_union_singleton_one
+-/
variable {A B}
+#print IsCyclotomicExtension.singleton_one_of_bot_eq_top /-
/-- If `(⊥ : subalgebra A B) = ⊤`, then `is_cyclotomic_extension {1} A B`. -/
theorem singleton_one_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) :
IsCyclotomicExtension {1} A B :=
@@ -276,15 +303,19 @@ theorem singleton_one_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) :
convert (iff_union_singleton_one _ _ _).1 (singleton_zero_of_bot_eq_top h)
simp
#align is_cyclotomic_extension.singleton_one_of_bot_eq_top IsCyclotomicExtension.singleton_one_of_bot_eq_top
+-/
+#print IsCyclotomicExtension.singleton_one_of_algebraMap_bijective /-
/-- If `function.surjective (algebra_map A B)`, then `is_cyclotomic_extension {1} A B`. -/
theorem singleton_one_of_algebraMap_bijective (h : Function.Surjective (algebraMap A B)) :
IsCyclotomicExtension {1} A B :=
singleton_one_of_bot_eq_top (surjective_algebraMap_iff.1 h).symm
#align is_cyclotomic_extension.singleton_one_of_algebra_map_bijective IsCyclotomicExtension.singleton_one_of_algebraMap_bijective
+-/
variable (A B)
+#print IsCyclotomicExtension.equiv /-
/-- Given `(f : B ≃ₐ[A] C)`, if `is_cyclotomic_extension S A B` then
`is_cyclotomic_extension S A C`. -/
@[protected]
@@ -296,25 +327,31 @@ theorem equiv {C : Type _} [CommRing C] [Algebra A C] [h : IsCyclotomicExtension
haveI : IsScalarTower A B C := IsScalarTower.of_ring_hom f.to_alg_hom
exact (iff_union_singleton_one _ _ _).2 (trans S {1} A B C f.injective)
#align is_cyclotomic_extension.equiv IsCyclotomicExtension.equiv
+-/
+#print IsCyclotomicExtension.neZero /-
@[protected]
theorem neZero [h : IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n : ℕ) : B) :=
by
obtain ⟨⟨r, hr⟩, -⟩ := (iff_singleton n A B).1 h
exact hr.ne_zero'
#align is_cyclotomic_extension.ne_zero IsCyclotomicExtension.neZero
+-/
+#print IsCyclotomicExtension.ne_zero' /-
@[protected]
theorem ne_zero' [IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n : ℕ) : A) :=
by
apply NeZero.nat_of_neZero (algebraMap A B)
exact NeZero n A B
#align is_cyclotomic_extension.ne_zero' IsCyclotomicExtension.ne_zero'
+-/
end Basic
section Fintype
+#print IsCyclotomicExtension.finite_of_singleton /-
theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : Module.Finite A B :=
by
classical
@@ -328,7 +365,9 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : M
· simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
+-/
+#print IsCyclotomicExtension.finite /-
/-- If `S` is finite and `is_cyclotomic_extension S A B`, then `B` is a finite `A`-algebra. -/
@[protected]
theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A B] :
@@ -350,7 +389,9 @@ theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A
exact finite_of_singleton n _ _
exact Module.Finite.trans (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}) _
#align is_cyclotomic_extension.finite IsCyclotomicExtension.finite
+-/
+#print IsCyclotomicExtension.numberField /-
/-- A cyclotomic finite extension of a number field is a number field. -/
theorem numberField [h : NumberField K] [Finite S] [IsCyclotomicExtension S K L] : NumberField L :=
{ to_charZero := charZero_of_injective_algebraMap (algebraMap K L).Injective
@@ -360,20 +401,25 @@ theorem numberField [h : NumberField K] [Finite S] [IsCyclotomicExtension S K L]
haveI := Finite S K L
exact Module.Finite.trans K _ }
#align is_cyclotomic_extension.number_field IsCyclotomicExtension.numberField
+-/
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.numberField
+#print IsCyclotomicExtension.integral /-
/-- A finite cyclotomic extension of an integral noetherian domain is integral -/
theorem integral [IsDomain B] [IsNoetherianRing A] [Finite S] [IsCyclotomicExtension S A B] :
Algebra.IsIntegral A B :=
isIntegral_of_noetherian <| isNoetherian_of_fg_of_noetherian' <| (Finite S A B).out
#align is_cyclotomic_extension.integral IsCyclotomicExtension.integral
+-/
+#print IsCyclotomicExtension.finiteDimensional /-
/-- If `S` is finite and `is_cyclotomic_extension S K A`, then `finite_dimensional K A`. -/
theorem finiteDimensional (C : Type z) [Finite S] [CommRing C] [Algebra K C] [IsDomain C]
[IsCyclotomicExtension S K C] : FiniteDimensional K C :=
IsCyclotomicExtension.finite S K C
#align is_cyclotomic_extension.finite_dimensional IsCyclotomicExtension.finiteDimensional
+-/
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.finiteDimensional
@@ -383,6 +429,7 @@ section
variable {A B}
+#print IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots /-
theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n : ℕ+}
(hζ : IsPrimitiveRoot ζ n) :
adjoin A ((cyclotomic n A).rootSet B) =
@@ -402,7 +449,9 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n :
rw [mem_root_set', map_cyclotomic, aeval_def, ← eval_map, map_cyclotomic, ← is_root]
refine' ⟨cyclotomic_ne_zero n B, hζ.is_root_cyclotomic n.pos⟩
#align is_cyclotomic_extension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots
+-/
+#print IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic /-
theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B] {ζ : B}
(hζ : IsPrimitiveRoot ζ n) : adjoin A ((cyclotomic n A).rootSet B) = adjoin A {ζ} :=
by
@@ -418,7 +467,9 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B
simpa only [hx, mem_root_set', map_cyclotomic, aeval_def, ← eval_map, is_root] using
And.intro (cyclotomic_ne_zero n B) (hζ.is_root_cyclotomic n.pos)
#align is_cyclotomic_extension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic
+-/
+#print IsCyclotomicExtension.adjoin_primitive_root_eq_top /-
theorem adjoin_primitive_root_eq_top {n : ℕ+} [IsDomain B] [h : IsCyclotomicExtension {n} A B]
{ζ : B} (hζ : IsPrimitiveRoot ζ n) : adjoin A ({ζ} : Set B) = ⊤ := by
classical
@@ -426,9 +477,11 @@ theorem adjoin_primitive_root_eq_top {n : ℕ+} [IsDomain B] [h : IsCyclotomicEx
rw [adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ]
exact ((iff_adjoin_eq_top {n} A B).mp h).2
#align is_cyclotomic_extension.adjoin_primitive_root_eq_top IsCyclotomicExtension.adjoin_primitive_root_eq_top
+-/
variable (A)
+#print IsPrimitiveRoot.adjoin_isCyclotomicExtension /-
theorem IsPrimitiveRoot.adjoin_isCyclotomicExtension {ζ : B} {n : ℕ+} (h : IsPrimitiveRoot ζ n) :
IsCyclotomicExtension {n} A (adjoin A ({ζ} : Set B)) :=
{ exists_prim_root := fun i hi =>
@@ -450,6 +503,7 @@ theorem IsPrimitiveRoot.adjoin_isCyclotomicExtension {ζ : B} {n : ℕ+} (h : Is
· exact Subalgebra.add_mem _ hb₁ hb₂
· exact Subalgebra.mul_mem _ hb₁ hb₂ }
#align is_primitive_root.adjoin_is_cyclotomic_extension IsPrimitiveRoot.adjoin_isCyclotomicExtension
+-/
end
@@ -457,16 +511,19 @@ section Field
variable {n S}
+#print IsCyclotomicExtension.splits_X_pow_sub_one /-
/-- A cyclotomic extension splits `X ^ n - 1` if `n ∈ S`.-/
-theorem splits_x_pow_sub_one [H : IsCyclotomicExtension S K L] (hS : n ∈ S) :
+theorem splits_X_pow_sub_one [H : IsCyclotomicExtension S K L] (hS : n ∈ S) :
Splits (algebraMap K L) (X ^ (n : ℕ) - 1) :=
by
rw [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_one, Polynomial.map_pow,
Polynomial.map_X]
obtain ⟨z, hz⟩ := ((isCyclotomicExtension_iff _ _ _).1 H).1 hS
exact X_pow_sub_one_splits hz
-#align is_cyclotomic_extension.splits_X_pow_sub_one IsCyclotomicExtension.splits_x_pow_sub_one
+#align is_cyclotomic_extension.splits_X_pow_sub_one IsCyclotomicExtension.splits_X_pow_sub_one
+-/
+#print IsCyclotomicExtension.splits_cyclotomic /-
/-- A cyclotomic extension splits `cyclotomic n K` if `n ∈ S` and `ne_zero (n : K)`.-/
theorem splits_cyclotomic [IsCyclotomicExtension S K L] (hS : n ∈ S) :
Splits (algebraMap K L) (cyclotomic n K) :=
@@ -475,6 +532,7 @@ theorem splits_cyclotomic [IsCyclotomicExtension S K L] (hS : n ∈ S) :
use ∏ i : ℕ in (n : ℕ).properDivisors, Polynomial.cyclotomic i K
rw [(eq_cyclotomic_iff n.pos _).1 rfl, RingHom.map_one]
#align is_cyclotomic_extension.splits_cyclotomic IsCyclotomicExtension.splits_cyclotomic
+-/
variable (n S)
@@ -482,9 +540,10 @@ section Singleton
variable [IsCyclotomicExtension {n} K L]
+#print IsCyclotomicExtension.isSplittingField_X_pow_sub_one /-
/-- If `is_cyclotomic_extension {n} K L`, then `L` is the splitting field of `X ^ n - 1`. -/
-theorem splitting_field_x_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1) :=
- { Splits := splits_x_pow_sub_one K L (mem_singleton n)
+theorem isSplittingField_X_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1) :=
+ { Splits := splits_X_pow_sub_one K L (mem_singleton n)
adjoin_rootSet := by
rw [← ((iff_adjoin_eq_top {n} K L).1 inferInstance).2]
congr
@@ -494,26 +553,32 @@ theorem splitting_field_x_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1)
simp only [mem_root_set', map_sub, map_pow, aeval_one, aeval_X, sub_eq_zero, map_X,
and_iff_right_iff_imp, Polynomial.map_sub, Polynomial.map_pow, Polynomial.map_one]
exact fun _ => X_pow_sub_C_ne_zero n.pos (1 : L) }
-#align is_cyclotomic_extension.splitting_field_X_pow_sub_one IsCyclotomicExtension.splitting_field_x_pow_sub_one
+#align is_cyclotomic_extension.splitting_field_X_pow_sub_one IsCyclotomicExtension.isSplittingField_X_pow_sub_one
+-/
+#print IsCyclotomicExtension.algEquiv /-
/-- Any two `n`-th cyclotomic extensions are isomorphic. -/
def algEquiv (L' : Type _) [Field L'] [Algebra K L'] [IsCyclotomicExtension {n} K L'] :
L ≃ₐ[K] L' :=
- let h₁ := splitting_field_x_pow_sub_one n K L
- let h₂ := splitting_field_x_pow_sub_one n K L'
+ let h₁ := isSplittingField_X_pow_sub_one n K L
+ let h₂ := isSplittingField_X_pow_sub_one n K L'
(@IsSplittingField.algEquiv K L _ _ _ (X ^ (n : ℕ) - 1) h₁).trans
(@IsSplittingField.algEquiv K L' _ _ _ (X ^ (n : ℕ) - 1) h₂).symm
#align is_cyclotomic_extension.alg_equiv IsCyclotomicExtension.algEquiv
+-/
-scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.splitting_field_x_pow_sub_one
+scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.isSplittingField_X_pow_sub_one
+#print IsCyclotomicExtension.isGalois /-
theorem isGalois : IsGalois K L :=
letI := splitting_field_X_pow_sub_one n K L
IsGalois.of_separable_splitting_field (X_pow_sub_one_separable_iff.2 (ne_zero' n K L).1)
#align is_cyclotomic_extension.is_galois IsCyclotomicExtension.isGalois
+-/
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.isGalois
+#print IsCyclotomicExtension.splitting_field_cyclotomic /-
/-- If `is_cyclotomic_extension {n} K L`, then `L` is the splitting field of `cyclotomic n K`. -/
theorem splitting_field_cyclotomic : IsSplittingField K L (cyclotomic n K) :=
{ Splits := splits_cyclotomic K L (mem_singleton n)
@@ -525,6 +590,7 @@ theorem splitting_field_cyclotomic : IsSplittingField K L (cyclotomic n K) :=
exact adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ
all_goals infer_instance }
#align is_cyclotomic_extension.splitting_field_cyclotomic IsCyclotomicExtension.splitting_field_cyclotomic
+-/
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.splitting_field_cyclotomic
@@ -537,6 +603,7 @@ end IsCyclotomicExtension
section CyclotomicField
/- ./././Mathport/Syntax/Translate/Command.lean:43:9: unsupported derive handler algebra[algebra] K -/
+#print CyclotomicField /-
/-- Given `n : ℕ+` and a field `K`, we define `cyclotomic_field n K` as the
splitting field of `cyclotomic n K`. If `n` is nonzero in `K`, it has
the instance `is_cyclotomic_extension {n} K (cyclotomic_field n K)`. -/
@@ -546,12 +613,14 @@ deriving Field,
«./././Mathport/Syntax/Translate/Command.lean:43:9: unsupported derive handler algebra[algebra] K»,
Inhabited
#align cyclotomic_field CyclotomicField
+-/
namespace CyclotomicField
instance [CharZero K] : CharZero (CyclotomicField n K) :=
charZero_of_injective_algebraMap (algebraMap K _).Injective
+#print CyclotomicField.isCyclotomicExtension /-
instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
IsCyclotomicExtension {n} K (CyclotomicField n K) :=
by
@@ -566,6 +635,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
rw [← Algebra.eq_top_iff, ← splitting_field.adjoin_root_set, eq_comm]
exact IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ
#align cyclotomic_field.is_cyclotomic_extension CyclotomicField.isCyclotomicExtension
+-/
end CyclotomicField
@@ -577,25 +647,30 @@ variable [Algebra A K] [IsFractionRing A K]
section CyclotomicRing
+#print CyclotomicField.algebraBase /-
/-- If `K` is the fraction field of `A`, the `A`-algebra structure on `cyclotomic_field n K`.
-/
@[nolint unused_arguments]
instance CyclotomicField.algebraBase : Algebra A (CyclotomicField n K) :=
SplittingField.algebra' (cyclotomic n K)
#align cyclotomic_field.algebra_base CyclotomicField.algebraBase
+-/
/-- Ensure there are no diamonds when `A = ℤ`. -/
example : algebraInt (CyclotomicField n ℚ) = CyclotomicField.algebraBase _ _ _ :=
rfl
+#print CyclotomicField.algebra' /-
instance CyclotomicField.algebra' {R : Type _} [CommRing R] [Algebra R K] :
Algebra R (CyclotomicField n K) :=
SplittingField.algebra' (cyclotomic n K)
#align cyclotomic_field.algebra' CyclotomicField.algebra'
+-/
instance {R : Type _} [CommRing R] [Algebra R K] : IsScalarTower R K (CyclotomicField n K) :=
SplittingField.isScalarTower _
+#print CyclotomicField.noZeroSMulDivisors /-
instance CyclotomicField.noZeroSMulDivisors : NoZeroSMulDivisors A (CyclotomicField n K) :=
by
refine' NoZeroSMulDivisors.of_algebraMap_injective _
@@ -604,7 +679,9 @@ instance CyclotomicField.noZeroSMulDivisors : NoZeroSMulDivisors A (CyclotomicFi
Function.Injective.comp (NoZeroSMulDivisors.algebraMap_injective K (CyclotomicField n K))
(IsFractionRing.injective A K)
#align cyclotomic_field.no_zero_smul_divisors CyclotomicField.noZeroSMulDivisors
+-/
+#print CyclotomicRing /-
/-- If `A` is a domain with fraction field `K` and `n : ℕ+`, we define `cyclotomic_ring n A K` as
the `A`-subalgebra of `cyclotomic_field n K` generated by the roots of `X ^ n - 1`. If `n`
is nonzero in `A`, it has the instance `is_cyclotomic_extension {n} A (cyclotomic_ring n A K)`. -/
@@ -613,13 +690,16 @@ def CyclotomicRing : Type w :=
adjoin A {b : CyclotomicField n K | b ^ (n : ℕ) = 1}
deriving CommRing, IsDomain, Inhabited
#align cyclotomic_ring CyclotomicRing
+-/
namespace CyclotomicRing
+#print CyclotomicRing.algebraBase /-
/-- The `A`-algebra structure on `cyclotomic_ring n A K`. -/
instance algebraBase : Algebra A (CyclotomicRing n A K) :=
(adjoin A _).Algebra
#align cyclotomic_ring.algebra_base CyclotomicRing.algebraBase
+-/
-- Ensure that there is no diamonds with ℤ.
example {n : ℕ+} : CyclotomicRing.algebraBase n ℤ ℚ = algebraInt _ :=
@@ -628,17 +708,21 @@ example {n : ℕ+} : CyclotomicRing.algebraBase n ℤ ℚ = algebraInt _ :=
instance : NoZeroSMulDivisors A (CyclotomicRing n A K) :=
(adjoin A _).noZeroSMulDivisors_bot
+#print CyclotomicRing.algebraBase_injective /-
theorem algebraBase_injective : Function.Injective <| algebraMap A (CyclotomicRing n A K) :=
NoZeroSMulDivisors.algebraMap_injective _ _
#align cyclotomic_ring.algebra_base_injective CyclotomicRing.algebraBase_injective
+-/
instance : Algebra (CyclotomicRing n A K) (CyclotomicField n K) :=
(adjoin A _).toAlgebra
+#print CyclotomicRing.adjoin_algebra_injective /-
theorem adjoin_algebra_injective :
Function.Injective <| algebraMap (CyclotomicRing n A K) (CyclotomicField n K) :=
Subtype.val_injective
#align cyclotomic_ring.adjoin_algebra_injective CyclotomicRing.adjoin_algebra_injective
+-/
instance : NoZeroSMulDivisors (CyclotomicRing n A K) (CyclotomicField n K) :=
NoZeroSMulDivisors.of_algebraMap_injective (adjoin_algebra_injective n A K)
@@ -646,6 +730,7 @@ instance : NoZeroSMulDivisors (CyclotomicRing n A K) (CyclotomicField n K) :=
instance : IsScalarTower A (CyclotomicRing n A K) (CyclotomicField n K) :=
IsScalarTower.subalgebra' _ _ _ _
+#print CyclotomicRing.isCyclotomicExtension /-
instance isCyclotomicExtension [NeZero ((n : ℕ) : A)] :
IsCyclotomicExtension {n} A (CyclotomicRing n A K)
where
@@ -671,6 +756,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : A)] :
· exact Subalgebra.add_mem _ hy hz
· exact Subalgebra.mul_mem _ hy hz
#align cyclotomic_ring.is_cyclotomic_extension CyclotomicRing.isCyclotomicExtension
+-/
instance [IsDomain A] [NeZero ((n : ℕ) : A)] :
IsFractionRing (CyclotomicRing n A K) (CyclotomicField n K)
@@ -716,6 +802,7 @@ instance [IsDomain A] [NeZero ((n : ℕ) : A)] :
⟨fun h => ⟨1, by rw [adjoin_algebra_injective n A K h]⟩, fun ⟨c, hc⟩ => by
rw [mul_left_cancel₀ (nonZeroDivisors.ne_zero c.prop) hc]⟩
+#print CyclotomicRing.eq_adjoin_primitive_root /-
theorem eq_adjoin_primitive_root {μ : CyclotomicField n K} (h : IsPrimitiveRoot μ n) :
CyclotomicRing n A K = adjoin A ({μ} : Set (CyclotomicField n K)) :=
by
@@ -723,6 +810,7 @@ theorem eq_adjoin_primitive_root {μ : CyclotomicField n K} (h : IsPrimitiveRoot
IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots h]
simp [CyclotomicRing]
#align cyclotomic_ring.eq_adjoin_primitive_root CyclotomicRing.eq_adjoin_primitive_root
+-/
end CyclotomicRing
@@ -734,6 +822,7 @@ section IsAlgClosed
variable [IsAlgClosed K]
+#print IsAlgClosed.isCyclotomicExtension /-
/-- Algebraically closed fields are `S`-cyclotomic extensions over themselves if
`ne_zero ((a : ℕ) : K))` for all `a ∈ S`. -/
theorem IsAlgClosed.isCyclotomicExtension (h : ∀ a ∈ S, NeZero ((a : ℕ) : K)) :
@@ -745,11 +834,14 @@ theorem IsAlgClosed.isCyclotomicExtension (h : ∀ a ∈ S, NeZero ((a : ℕ) :
haveI := h a ha
rwa [coe_aeval_eq_eval, ← is_root.def, is_root_cyclotomic_iff] at hr
#align is_alg_closed.is_cyclotomic_extension IsAlgClosed.isCyclotomicExtension
+-/
+#print IsAlgClosedOfCharZero.isCyclotomicExtension /-
instance IsAlgClosedOfCharZero.isCyclotomicExtension [CharZero K] :
∀ S, IsCyclotomicExtension S K K := fun S =>
IsAlgClosed.isCyclotomicExtension S K fun a ha => inferInstance
#align is_alg_closed_of_char_zero.is_cyclotomic_extension IsAlgClosedOfCharZero.isCyclotomicExtension
+-/
end IsAlgClosed
mathlib commit https://github.com/leanprover-community/mathlib/commit/bf9bbbcf0c1c1ead18280b0d010e417b10abb1b6
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit 9fb8964792b4237dac6200193a0d533f1b3f7423
+! leanprover-community/mathlib commit 4b05d3f4f0601dca8abf99c4ec99187682ed0bba
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -499,10 +499,10 @@ theorem splitting_field_x_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1)
/-- Any two `n`-th cyclotomic extensions are isomorphic. -/
def algEquiv (L' : Type _) [Field L'] [Algebra K L'] [IsCyclotomicExtension {n} K L'] :
L ≃ₐ[K] L' :=
- let _ := splitting_field_x_pow_sub_one n K L
- let _ := splitting_field_x_pow_sub_one n K L'
- (is_splitting_field.alg_equiv L (X ^ (n : ℕ) - 1)).trans
- (is_splitting_field.alg_equiv L' (X ^ (n : ℕ) - 1)).symm
+ let h₁ := splitting_field_x_pow_sub_one n K L
+ let h₂ := splitting_field_x_pow_sub_one n K L'
+ (@IsSplittingField.algEquiv K L _ _ _ (X ^ (n : ℕ) - 1) h₁).trans
+ (@IsSplittingField.algEquiv K L' _ _ _ (X ^ (n : ℕ) - 1) h₂).symm
#align is_cyclotomic_extension.alg_equiv IsCyclotomicExtension.algEquiv
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.splitting_field_x_pow_sub_one
@@ -573,7 +573,7 @@ end CyclotomicField
section IsDomain
-variable [IsDomain A] [Algebra A K] [IsFractionRing A K]
+variable [Algebra A K] [IsFractionRing A K]
section CyclotomicRing
@@ -588,15 +588,27 @@ instance CyclotomicField.algebraBase : Algebra A (CyclotomicField n K) :=
example : algebraInt (CyclotomicField n ℚ) = CyclotomicField.algebraBase _ _ _ :=
rfl
+instance CyclotomicField.algebra' {R : Type _} [CommRing R] [Algebra R K] :
+ Algebra R (CyclotomicField n K) :=
+ SplittingField.algebra' (cyclotomic n K)
+#align cyclotomic_field.algebra' CyclotomicField.algebra'
+
+instance {R : Type _} [CommRing R] [Algebra R K] : IsScalarTower R K (CyclotomicField n K) :=
+ SplittingField.isScalarTower _
+
instance CyclotomicField.noZeroSMulDivisors : NoZeroSMulDivisors A (CyclotomicField n K) :=
- NoZeroSMulDivisors.of_algebraMap_injective <|
- Function.Injective.comp (NoZeroSMulDivisors.algebraMap_injective _ _) <|
- IsFractionRing.injective A K
+ by
+ refine' NoZeroSMulDivisors.of_algebraMap_injective _
+ rw [IsScalarTower.algebraMap_eq A K (CyclotomicField n K)]
+ exact
+ Function.Injective.comp (NoZeroSMulDivisors.algebraMap_injective K (CyclotomicField n K))
+ (IsFractionRing.injective A K)
#align cyclotomic_field.no_zero_smul_divisors CyclotomicField.noZeroSMulDivisors
/-- If `A` is a domain with fraction field `K` and `n : ℕ+`, we define `cyclotomic_ring n A K` as
the `A`-subalgebra of `cyclotomic_field n K` generated by the roots of `X ^ n - 1`. If `n`
is nonzero in `A`, it has the instance `is_cyclotomic_extension {n} A (cyclotomic_ring n A K)`. -/
+@[nolint unused_arguments]
def CyclotomicRing : Type w :=
adjoin A {b : CyclotomicField n K | b ^ (n : ℕ) = 1}
deriving CommRing, IsDomain, Inhabited
@@ -660,7 +672,8 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : A)] :
· exact Subalgebra.mul_mem _ hy hz
#align cyclotomic_ring.is_cyclotomic_extension CyclotomicRing.isCyclotomicExtension
-instance [NeZero ((n : ℕ) : A)] : IsFractionRing (CyclotomicRing n A K) (CyclotomicField n K)
+instance [IsDomain A] [NeZero ((n : ℕ) : A)] :
+ IsFractionRing (CyclotomicRing n A K) (CyclotomicField n K)
where
map_units := fun ⟨x, hx⟩ => by
rw [isUnit_iff_ne_zero]
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -507,8 +507,6 @@ def algEquiv (L' : Type _) [Field L'] [Algebra K L'] [IsCyclotomicExtension {n}
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.splitting_field_x_pow_sub_one
-include n
-
theorem isGalois : IsGalois K L :=
letI := splitting_field_X_pow_sub_one n K L
IsGalois.of_separable_splitting_field (X_pow_sub_one_separable_iff.2 (ne_zero' n K L).1)
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit 5bfbcca0a7ffdd21cf1682e59106d6c942434a32
+! leanprover-community/mathlib commit 9fb8964792b4237dac6200193a0d533f1b3f7423
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -383,29 +383,28 @@ section
variable {A B}
-theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [DecidableEq B] [IsDomain B] {ζ : B} {n : ℕ+}
+theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n : ℕ+}
(hζ : IsPrimitiveRoot ζ n) :
- adjoin A ↑(map (algebraMap A B) (cyclotomic n A)).roots.toFinset =
+ adjoin A ((cyclotomic n A).rootSet B) =
adjoin A {b : B | ∃ a : ℕ+, a ∈ ({n} : Set ℕ+) ∧ b ^ (a : ℕ) = 1} :=
by
simp only [mem_singleton_iff, exists_eq_left, map_cyclotomic]
refine' le_antisymm (adjoin_mono fun x hx => _) (adjoin_le fun x hx => _)
- · simp only [Multiset.mem_toFinset, Finset.mem_coe, map_cyclotomic,
- mem_roots (cyclotomic_ne_zero n B)] at hx
+ · rw [mem_root_set'] at hx
simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq]
rw [isRoot_of_unity_iff n.pos]
- exact ⟨n, Nat.mem_divisors_self n n.ne_zero, hx⟩
- all_goals infer_instance
+ refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
+ rw [is_root.def, ← map_cyclotomic n (algebraMap A B), eval_map, ← aeval_def]
+ exact hx.2
· simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
obtain ⟨i, hin, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
refine' SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin _) _)
- rwa [Finset.mem_coe, Multiset.mem_toFinset, mem_roots <| cyclotomic_ne_zero n B]
- exact hζ.is_root_cyclotomic n.pos
+ rw [mem_root_set', map_cyclotomic, aeval_def, ← eval_map, map_cyclotomic, ← is_root]
+ refine' ⟨cyclotomic_ne_zero n B, hζ.is_root_cyclotomic n.pos⟩
#align is_cyclotomic_extension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots
-theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [DecidableEq B] [IsDomain B]
- {ζ : B} (hζ : IsPrimitiveRoot ζ n) :
- adjoin A ((map (algebraMap A B) (cyclotomic n A)).roots.toFinset : Set B) = adjoin A {ζ} :=
+theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B] {ζ : B}
+ (hζ : IsPrimitiveRoot ζ n) : adjoin A ((cyclotomic n A).rootSet B) = adjoin A {ζ} :=
by
refine' le_antisymm (adjoin_le fun x hx => _) (adjoin_mono fun x hx => _)
· suffices hx : x ^ ↑n = 1
@@ -413,12 +412,11 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [DecidableE
exact SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin <| mem_singleton ζ) _)
rw [isRoot_of_unity_iff n.pos]
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
- rwa [Finset.mem_coe, Multiset.mem_toFinset, map_cyclotomic,
- mem_roots <| cyclotomic_ne_zero n B] at hx
- all_goals infer_instance
+ rw [mem_root_set', aeval_def, ← eval_map, map_cyclotomic, ← is_root] at hx
+ exact hx.2
· simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
- simpa only [hx, Multiset.mem_toFinset, Finset.mem_coe, map_cyclotomic,
- mem_roots (cyclotomic_ne_zero n B)] using hζ.is_root_cyclotomic n.pos
+ simpa only [hx, mem_root_set', map_cyclotomic, aeval_def, ← eval_map, is_root] using
+ And.intro (cyclotomic_ne_zero n B) (hζ.is_root_cyclotomic n.pos)
#align is_cyclotomic_extension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic
theorem adjoin_primitive_root_eq_top {n : ℕ+} [IsDomain B] [h : IsCyclotomicExtension {n} A B]
@@ -487,14 +485,15 @@ variable [IsCyclotomicExtension {n} K L]
/-- If `is_cyclotomic_extension {n} K L`, then `L` is the splitting field of `X ^ n - 1`. -/
theorem splitting_field_x_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1) :=
{ Splits := splits_x_pow_sub_one K L (mem_singleton n)
- adjoin_roots := by
+ adjoin_rootSet := by
rw [← ((iff_adjoin_eq_top {n} K L).1 inferInstance).2]
congr
refine' Set.ext fun x => _
simp only [Polynomial.map_pow, mem_singleton_iff, Multiset.mem_toFinset, exists_eq_left,
mem_set_of_eq, Polynomial.map_X, Polynomial.map_one, Finset.mem_coe, Polynomial.map_sub]
- rwa [← RingHom.map_one C, mem_roots (@X_pow_sub_C_ne_zero L _ _ _ n.pos _), is_root.def,
- eval_sub, eval_pow, eval_C, eval_X, sub_eq_zero] }
+ simp only [mem_root_set', map_sub, map_pow, aeval_one, aeval_X, sub_eq_zero, map_X,
+ and_iff_right_iff_imp, Polynomial.map_sub, Polynomial.map_pow, Polynomial.map_one]
+ exact fun _ => X_pow_sub_C_ne_zero n.pos (1 : L) }
#align is_cyclotomic_extension.splitting_field_X_pow_sub_one IsCyclotomicExtension.splitting_field_x_pow_sub_one
/-- Any two `n`-th cyclotomic extensions are isomorphic. -/
@@ -520,11 +519,13 @@ scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.isGalois
/-- If `is_cyclotomic_extension {n} K L`, then `L` is the splitting field of `cyclotomic n K`. -/
theorem splitting_field_cyclotomic : IsSplittingField K L (cyclotomic n K) :=
{ Splits := splits_cyclotomic K L (mem_singleton n)
- adjoin_roots := by
+ adjoin_rootSet := by
rw [← ((iff_adjoin_eq_top {n} K L).1 inferInstance).2]
letI := Classical.decEq L
- obtain ⟨ζ, hζ⟩ := @IsCyclotomicExtension.exists_prim_root {n} K L _ _ _ _ _ (mem_singleton n)
- exact adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ }
+ -- todo: make `exists_prim_root` take an explicit `L`
+ obtain ⟨ζ : L, hζ⟩ := IsCyclotomicExtension.exists_prim_root K (mem_singleton n)
+ exact adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ
+ all_goals infer_instance }
#align is_cyclotomic_extension.splitting_field_cyclotomic IsCyclotomicExtension.splitting_field_cyclotomic
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.splitting_field_cyclotomic
@@ -564,7 +565,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
(degree_cyclotomic_pos n K n.pos).ne'
rw [← eval_map, ← is_root.def, map_cyclotomic, is_root_cyclotomic_iff] at hζ
refine' ⟨forall_eq.2 ⟨ζ, hζ⟩, _⟩
- rw [← Algebra.eq_top_iff, ← splitting_field.adjoin_roots, eq_comm]
+ rw [← Algebra.eq_top_iff, ← splitting_field.adjoin_root_set, eq_comm]
exact IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ
#align cyclotomic_field.is_cyclotomic_extension CyclotomicField.isCyclotomicExtension
@@ -707,7 +708,6 @@ instance [NeZero ((n : ℕ) : A)] : IsFractionRing (CyclotomicRing n A K) (Cyclo
theorem eq_adjoin_primitive_root {μ : CyclotomicField n K} (h : IsPrimitiveRoot μ n) :
CyclotomicRing n A K = adjoin A ({μ} : Set (CyclotomicField n K)) :=
by
- letI := Classical.propDecidable
rw [← IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic h,
IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots h]
simp [CyclotomicRing]
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -83,7 +83,7 @@ over `A` by the roots of `X ^ n - 1`. -/
@[mk_iff]
class IsCyclotomicExtension : Prop where
exists_prim_root {n : ℕ+} (ha : n ∈ S) : ∃ r : B, IsPrimitiveRoot r n
- adjoin_roots : ∀ x : B, x ∈ adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 }
+ adjoin_roots : ∀ x : B, x ∈ adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}
#align is_cyclotomic_extension IsCyclotomicExtension
namespace IsCyclotomicExtension
@@ -94,7 +94,7 @@ section Basic
theorem iff_adjoin_eq_top :
IsCyclotomicExtension S A B ↔
(∀ n : ℕ+, n ∈ S → ∃ r : B, IsPrimitiveRoot r n) ∧
- adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 } = ⊤ :=
+ adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1} = ⊤ :=
⟨fun h => ⟨fun _ => h.exists_prim_root, Algebra.eq_top_iff.2 h.adjoin_roots⟩, fun h =>
⟨h.1, Algebra.eq_top_iff.1 h.2⟩⟩
#align is_cyclotomic_extension.iff_adjoin_eq_top IsCyclotomicExtension.iff_adjoin_eq_top
@@ -102,7 +102,7 @@ theorem iff_adjoin_eq_top :
/-- A reformulation of `is_cyclotomic_extension` in the case `S` is a singleton. -/
theorem iff_singleton :
IsCyclotomicExtension {n} A B ↔
- (∃ r : B, IsPrimitiveRoot r n) ∧ ∀ x, x ∈ adjoin A { b : B | b ^ (n : ℕ) = 1 } :=
+ (∃ r : B, IsPrimitiveRoot r n) ∧ ∀ x, x ∈ adjoin A {b : B | b ^ (n : ℕ) = 1} :=
by simp [isCyclotomicExtension_iff]
#align is_cyclotomic_extension.iff_singleton IsCyclotomicExtension.iff_singleton
@@ -146,7 +146,7 @@ theorem trans (C : Type w) [CommRing C] [Algebra A C] [Algebra B C] [IsScalarTow
(fun c ⟨n, hn⟩ => subset_adjoin ⟨n, Or.inr hn.1, hn.2⟩) (fun b => _)
(fun x y hx hy => Subalgebra.add_mem _ hx hy) fun x y hx hy => Subalgebra.mul_mem _ hx hy
· let f := IsScalarTower.toAlgHom A B C
- have hb : f b ∈ (adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 }).map f :=
+ have hb : f b ∈ (adjoin A {b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1}).map f :=
⟨b, ((isCyclotomicExtension_iff _ _ _).1 hS).2 b, rfl⟩
rw [IsScalarTower.toAlgHom_apply, ← adjoin_image] at hb
refine' adjoin_mono (fun y hy => _) hb
@@ -165,21 +165,20 @@ theorem subsingleton_iff [Subsingleton B] : IsCyclotomicExtension S A B ↔ S =
rw [mem_singleton_iff, ← PNat.coe_eq_one_iff]
exact_mod_cast hζ.unique (IsPrimitiveRoot.of_subsingleton ζ)
· rintro (rfl | rfl)
- · refine' ⟨fun _ h => h.elim, fun x => by convert(mem_top : x ∈ ⊤)⟩
+ · refine' ⟨fun _ h => h.elim, fun x => by convert (mem_top : x ∈ ⊤)⟩
· rw [iff_singleton]
- refine' ⟨⟨0, IsPrimitiveRoot.of_subsingleton 0⟩, fun x => by convert(mem_top : x ∈ ⊤)⟩
+ refine' ⟨⟨0, IsPrimitiveRoot.of_subsingleton 0⟩, fun x => by convert (mem_top : x ∈ ⊤)⟩
#align is_cyclotomic_extension.subsingleton_iff IsCyclotomicExtension.subsingleton_iff
/-- If `B` is a cyclotomic extension of `A` given by roots of unity of order in `S ∪ T`, then `B`
is a cyclotomic extension of `adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 } ` given by
roots of unity of order in `T`. -/
theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
- IsCyclotomicExtension T (adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 }) B :=
+ IsCyclotomicExtension T (adjoin A {b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1}) B :=
by
have :
- { b : B | ∃ n : ℕ+, n ∈ S ∪ T ∧ b ^ (n : ℕ) = 1 } =
- { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 } ∪
- { b : B | ∃ n : ℕ+, n ∈ T ∧ b ^ (n : ℕ) = 1 } :=
+ {b : B | ∃ n : ℕ+, n ∈ S ∪ T ∧ b ^ (n : ℕ) = 1} =
+ {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1} ∪ {b : B | ∃ n : ℕ+, n ∈ T ∧ b ^ (n : ℕ) = 1} :=
by
refine' le_antisymm (fun x hx => _) fun x hx => _
· rcases hx with ⟨n, hn₁ | hn₂, hnpow⟩
@@ -197,7 +196,7 @@ theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
then `adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 }` is a cyclotomic extension of `B`
given by roots of unity of order in `S`. -/
theorem union_left [h : IsCyclotomicExtension T A B] (hS : S ⊆ T) :
- IsCyclotomicExtension S A (adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 }) :=
+ IsCyclotomicExtension S A (adjoin A {b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1}) :=
by
refine' ⟨fun n hn => _, fun b => _⟩
· obtain ⟨b, hb⟩ := ((isCyclotomicExtension_iff _ _ _).1 h).1 (hS hn)
@@ -274,7 +273,7 @@ variable {A B}
theorem singleton_one_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) :
IsCyclotomicExtension {1} A B :=
by
- convert(iff_union_singleton_one _ _ _).1 (singleton_zero_of_bot_eq_top h)
+ convert (iff_union_singleton_one _ _ _).1 (singleton_zero_of_bot_eq_top h)
simp
#align is_cyclotomic_extension.singleton_one_of_bot_eq_top IsCyclotomicExtension.singleton_one_of_bot_eq_top
@@ -319,15 +318,15 @@ section Fintype
theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : Module.Finite A B :=
by
classical
- rw [Module.finite_def, ← top_to_submodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
- refine' FG_adjoin_of_finite _ fun b hb => _
- · simp only [mem_singleton_iff, exists_eq_left]
- have : { b : B | b ^ (n : ℕ) = 1 } = (nth_roots n (1 : B)).toFinset :=
- Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
- rw [this]
- exact (nth_roots (↑n) 1).toFinset.finite_toSet
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
- refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
+ rw [Module.finite_def, ← top_to_submodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
+ refine' FG_adjoin_of_finite _ fun b hb => _
+ · simp only [mem_singleton_iff, exists_eq_left]
+ have : {b : B | b ^ (n : ℕ) = 1} = (nth_roots n (1 : B)).toFinset :=
+ Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
+ rw [this]
+ exact (nth_roots (↑n) 1).toFinset.finite_toSet
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
+ refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
/-- If `S` is finite and `is_cyclotomic_extension S A B`, then `B` is a finite `A`-algebra. -/
@@ -341,15 +340,15 @@ theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A
refine' Module.finite_def.2 ⟨({1} : Finset B), _⟩
simp [← top_to_submodule, ← Empty, to_submodule_bot]
· intro _ _ _ _ h
- haveI : IsCyclotomicExtension S A (adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 }) :=
+ haveI : IsCyclotomicExtension S A (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}) :=
union_left _ (insert n S) _ _ (subset_insert n S)
- haveI := H A (adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 })
- have : Module.Finite (adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 }) B :=
+ haveI := H A (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1})
+ have : Module.Finite (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}) B :=
by
rw [← union_singleton] at h
letI := @union_right S {n} A B _ _ _ h
exact finite_of_singleton n _ _
- exact Module.Finite.trans (adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 }) _
+ exact Module.Finite.trans (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}) _
#align is_cyclotomic_extension.finite IsCyclotomicExtension.finite
/-- A cyclotomic finite extension of a number field is a number field. -/
@@ -387,7 +386,7 @@ variable {A B}
theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [DecidableEq B] [IsDomain B] {ζ : B} {n : ℕ+}
(hζ : IsPrimitiveRoot ζ n) :
adjoin A ↑(map (algebraMap A B) (cyclotomic n A)).roots.toFinset =
- adjoin A { b : B | ∃ a : ℕ+, a ∈ ({n} : Set ℕ+) ∧ b ^ (a : ℕ) = 1 } :=
+ adjoin A {b : B | ∃ a : ℕ+, a ∈ ({n} : Set ℕ+) ∧ b ^ (a : ℕ) = 1} :=
by
simp only [mem_singleton_iff, exists_eq_left, map_cyclotomic]
refine' le_antisymm (adjoin_mono fun x hx => _) (adjoin_le fun x hx => _)
@@ -425,9 +424,9 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [DecidableE
theorem adjoin_primitive_root_eq_top {n : ℕ+} [IsDomain B] [h : IsCyclotomicExtension {n} A B]
{ζ : B} (hζ : IsPrimitiveRoot ζ n) : adjoin A ({ζ} : Set B) = ⊤ := by
classical
- rw [← adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic hζ]
- rw [adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ]
- exact ((iff_adjoin_eq_top {n} A B).mp h).2
+ rw [← adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic hζ]
+ rw [adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ]
+ exact ((iff_adjoin_eq_top {n} A B).mp h).2
#align is_cyclotomic_extension.adjoin_primitive_root_eq_top IsCyclotomicExtension.adjoin_primitive_root_eq_top
variable (A)
@@ -538,14 +537,14 @@ end IsCyclotomicExtension
section CyclotomicField
-/- ./././Mathport/Syntax/Translate/Command.lean:42:9: unsupported derive handler algebra[algebra] K -/
+/- ./././Mathport/Syntax/Translate/Command.lean:43:9: unsupported derive handler algebra[algebra] K -/
/-- Given `n : ℕ+` and a field `K`, we define `cyclotomic_field n K` as the
splitting field of `cyclotomic n K`. If `n` is nonzero in `K`, it has
the instance `is_cyclotomic_extension {n} K (cyclotomic_field n K)`. -/
def CyclotomicField : Type w :=
(cyclotomic n K).SplittingField
deriving Field,
- «./././Mathport/Syntax/Translate/Command.lean:42:9: unsupported derive handler algebra[algebra] K»,
+ «./././Mathport/Syntax/Translate/Command.lean:43:9: unsupported derive handler algebra[algebra] K»,
Inhabited
#align cyclotomic_field CyclotomicField
@@ -600,7 +599,7 @@ instance CyclotomicField.noZeroSMulDivisors : NoZeroSMulDivisors A (CyclotomicFi
the `A`-subalgebra of `cyclotomic_field n K` generated by the roots of `X ^ n - 1`. If `n`
is nonzero in `A`, it has the instance `is_cyclotomic_extension {n} A (cyclotomic_ring n A K)`. -/
def CyclotomicRing : Type w :=
- adjoin A { b : CyclotomicField n K | b ^ (n : ℕ) = 1 }
+ adjoin A {b : CyclotomicField n K | b ^ (n : ℕ) = 1}
deriving CommRing, IsDomain, Inhabited
#align cyclotomic_ring CyclotomicRing
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -124,7 +124,7 @@ theorem singleton_zero_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) : IsCycl
by
refine'
(iff_adjoin_eq_top _ _ _).2 ⟨fun s hs => by simpa using hs, _root_.eq_top_iff.2 fun x hx => _⟩
- rw [← h] at hx
+ rw [← h] at hx
simpa using hx
#align is_cyclotomic_extension.singleton_zero_of_bot_eq_top IsCyclotomicExtension.singleton_zero_of_bot_eq_top
@@ -148,7 +148,7 @@ theorem trans (C : Type w) [CommRing C] [Algebra A C] [Algebra B C] [IsScalarTow
· let f := IsScalarTower.toAlgHom A B C
have hb : f b ∈ (adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 }).map f :=
⟨b, ((isCyclotomicExtension_iff _ _ _).1 hS).2 b, rfl⟩
- rw [IsScalarTower.toAlgHom_apply, ← adjoin_image] at hb
+ rw [IsScalarTower.toAlgHom_apply, ← adjoin_image] at hb
refine' adjoin_mono (fun y hy => _) hb
obtain ⟨b₁, ⟨⟨n, hn⟩, h₁⟩⟩ := hy
exact ⟨n, ⟨mem_union_left T hn.1, by rw [← h₁, ← AlgHom.map_pow, hn.2, AlgHom.map_one]⟩⟩
@@ -190,7 +190,7 @@ theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
· exact ⟨n, Or.inr hn.1, hn.2⟩
refine' ⟨fun n hn => ((isCyclotomicExtension_iff _ _ _).1 h).1 (mem_union_right S hn), fun b => _⟩
replace h := ((isCyclotomicExtension_iff _ _ _).1 h).2 b
- rwa [this, adjoin_union_eq_adjoin_adjoin, Subalgebra.mem_restrictScalars] at h
+ rwa [this, adjoin_union_eq_adjoin_adjoin, Subalgebra.mem_restrictScalars] at h
#align is_cyclotomic_extension.union_right IsCyclotomicExtension.union_right
/-- If `B` is a cyclotomic extension of `A` given by roots of unity of order in `T` and `S ⊆ T`,
@@ -216,7 +216,7 @@ theorem of_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) [H : IsCycl
IsCyclotomicExtension (S ∪ {n}) A B :=
by
refine' (iff_adjoin_eq_top _ _ _).2 ⟨fun s hs => _, _⟩
- · rw [mem_union, mem_singleton_iff] at hs
+ · rw [mem_union, mem_singleton_iff] at hs
obtain hs | rfl := hs
· exact H.exists_prim_root hs
· obtain ⟨m, hm⟩ := hS
@@ -228,7 +228,7 @@ theorem of_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) [H : IsCycl
· refine' _root_.eq_top_iff.2 _
rw [← ((iff_adjoin_eq_top S A B).1 H).2]
refine' adjoin_mono fun x hx => _
- simp only [union_singleton, mem_insert_iff, mem_set_of_eq] at hx⊢
+ simp only [union_singleton, mem_insert_iff, mem_set_of_eq] at hx ⊢
obtain ⟨m, hm⟩ := hx
exact ⟨m, ⟨Or.inr hm.1, hm.2⟩⟩
#align is_cyclotomic_extension.of_union_of_dvd IsCyclotomicExtension.of_union_of_dvd
@@ -243,7 +243,7 @@ theorem iff_union_of_dvd (h : ∀ s ∈ S, n ∣ s) (hS : S.Nonempty) :
· exact H.exists_prim_root (subset_union_left _ _ hs)
· rw [_root_.eq_top_iff, ← ((iff_adjoin_eq_top _ A B).1 H).2]
refine' adjoin_mono fun x hx => _
- simp only [union_singleton, mem_insert_iff, mem_set_of_eq] at hx⊢
+ simp only [union_singleton, mem_insert_iff, mem_set_of_eq] at hx ⊢
obtain ⟨m, rfl | hm, hxpow⟩ := hx
· obtain ⟨y, hy⟩ := hS
refine' ⟨y, ⟨hy, _⟩⟩
@@ -326,7 +326,7 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : M
Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
rw [this]
exact (nth_roots (↑n) 1).toFinset.finite_toSet
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hb
refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
@@ -346,7 +346,7 @@ theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A
haveI := H A (adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 })
have : Module.Finite (adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 }) B :=
by
- rw [← union_singleton] at h
+ rw [← union_singleton] at h
letI := @union_right S {n} A B _ _ _ h
exact finite_of_singleton n _ _
exact Module.Finite.trans (adjoin A { b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1 }) _
@@ -392,12 +392,12 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [DecidableEq B] [IsDomain B]
simp only [mem_singleton_iff, exists_eq_left, map_cyclotomic]
refine' le_antisymm (adjoin_mono fun x hx => _) (adjoin_le fun x hx => _)
· simp only [Multiset.mem_toFinset, Finset.mem_coe, map_cyclotomic,
- mem_roots (cyclotomic_ne_zero n B)] at hx
+ mem_roots (cyclotomic_ne_zero n B)] at hx
simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq]
rw [isRoot_of_unity_iff n.pos]
exact ⟨n, Nat.mem_divisors_self n n.ne_zero, hx⟩
all_goals infer_instance
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
obtain ⟨i, hin, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
refine' SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin _) _)
rwa [Finset.mem_coe, Multiset.mem_toFinset, mem_roots <| cyclotomic_ne_zero n B]
@@ -415,9 +415,9 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [DecidableE
rw [isRoot_of_unity_iff n.pos]
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
rwa [Finset.mem_coe, Multiset.mem_toFinset, map_cyclotomic,
- mem_roots <| cyclotomic_ne_zero n B] at hx
+ mem_roots <| cyclotomic_ne_zero n B] at hx
all_goals infer_instance
- · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
+ · simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
simpa only [hx, Multiset.mem_toFinset, Finset.mem_coe, map_cyclotomic,
mem_roots (cyclotomic_ne_zero n B)] using hζ.is_root_cyclotomic n.pos
#align is_cyclotomic_extension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic
@@ -436,7 +436,7 @@ theorem IsPrimitiveRoot.adjoin_isCyclotomicExtension {ζ : B} {n : ℕ+} (h : Is
IsCyclotomicExtension {n} A (adjoin A ({ζ} : Set B)) :=
{ exists_prim_root := fun i hi =>
by
- rw [Set.mem_singleton_iff] at hi
+ rw [Set.mem_singleton_iff] at hi
refine' ⟨⟨ζ, subset_adjoin <| Set.mem_singleton ζ⟩, _⟩
rwa [← IsPrimitiveRoot.coe_submonoidClass_iff, Subtype.coe_mk, hi]
adjoin_roots := fun x =>
@@ -444,7 +444,7 @@ theorem IsPrimitiveRoot.adjoin_isCyclotomicExtension {ζ : B} {n : ℕ+} (h : Is
refine'
adjoin_induction' (fun b hb => _) (fun a => _) (fun b₁ b₂ hb₁ hb₂ => _)
(fun b₁ b₂ hb₁ hb₂ => _) x
- · rw [Set.mem_singleton_iff] at hb
+ · rw [Set.mem_singleton_iff] at hb
refine' subset_adjoin _
simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq, hb]
rw [← Subalgebra.coe_eq_one, Subalgebra.coe_pow, SetLike.coe_mk]
@@ -543,7 +543,8 @@ section CyclotomicField
splitting field of `cyclotomic n K`. If `n` is nonzero in `K`, it has
the instance `is_cyclotomic_extension {n} K (cyclotomic_field n K)`. -/
def CyclotomicField : Type w :=
- (cyclotomic n K).SplittingField deriving Field,
+ (cyclotomic n K).SplittingField
+deriving Field,
«./././Mathport/Syntax/Translate/Command.lean:42:9: unsupported derive handler algebra[algebra] K»,
Inhabited
#align cyclotomic_field CyclotomicField
@@ -562,7 +563,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
obtain ⟨ζ, hζ⟩ :=
exists_root_of_splits (algebraMap K (CyclotomicField n K)) (splitting_field.splits _)
(degree_cyclotomic_pos n K n.pos).ne'
- rw [← eval_map, ← is_root.def, map_cyclotomic, is_root_cyclotomic_iff] at hζ
+ rw [← eval_map, ← is_root.def, map_cyclotomic, is_root_cyclotomic_iff] at hζ
refine' ⟨forall_eq.2 ⟨ζ, hζ⟩, _⟩
rw [← Algebra.eq_top_iff, ← splitting_field.adjoin_roots, eq_comm]
exact IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ
@@ -599,7 +600,8 @@ instance CyclotomicField.noZeroSMulDivisors : NoZeroSMulDivisors A (CyclotomicFi
the `A`-subalgebra of `cyclotomic_field n K` generated by the roots of `X ^ n - 1`. If `n`
is nonzero in `A`, it has the instance `is_cyclotomic_extension {n} A (cyclotomic_ring n A K)`. -/
def CyclotomicRing : Type w :=
- adjoin A { b : CyclotomicField n K | b ^ (n : ℕ) = 1 }deriving CommRing, IsDomain, Inhabited
+ adjoin A { b : CyclotomicField n K | b ^ (n : ℕ) = 1 }
+deriving CommRing, IsDomain, Inhabited
#align cyclotomic_ring CyclotomicRing
namespace CyclotomicRing
@@ -638,7 +640,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : A)] :
IsCyclotomicExtension {n} A (CyclotomicRing n A K)
where
exists_prim_root a han := by
- rw [mem_singleton_iff] at han
+ rw [mem_singleton_iff] at han
subst a
haveI := NeZero.of_noZeroSMulDivisors A K n
haveI := NeZero.of_noZeroSMulDivisors A (CyclotomicField n K) n
@@ -646,7 +648,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : A)] :
refine' ⟨⟨μ, subset_adjoin _⟩, _⟩
· apply (isRoot_of_unity_iff n.pos (CyclotomicField n K)).mpr
refine' ⟨n, Nat.mem_divisors_self _ n.ne_zero, _⟩
- rwa [← is_root_cyclotomic_iff] at hμ
+ rwa [← is_root_cyclotomic_iff] at hμ
· rwa [← IsPrimitiveRoot.coe_submonoidClass_iff, Subtype.coe_mk]
adjoin_roots x :=
by
@@ -731,7 +733,7 @@ theorem IsAlgClosed.isCyclotomicExtension (h : ∀ a ∈ S, NeZero ((a : ℕ) :
obtain ⟨r, hr⟩ := IsAlgClosed.exists_aeval_eq_zero K _ (degree_cyclotomic_pos a K a.pos).ne'
refine' ⟨r, _⟩
haveI := h a ha
- rwa [coe_aeval_eq_eval, ← is_root.def, is_root_cyclotomic_iff] at hr
+ rwa [coe_aeval_eq_eval, ← is_root.def, is_root_cyclotomic_iff] at hr
#align is_alg_closed.is_cyclotomic_extension IsAlgClosed.isCyclotomicExtension
instance IsAlgClosedOfCharZero.isCyclotomicExtension [CharZero K] :
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -447,7 +447,7 @@ theorem IsPrimitiveRoot.adjoin_isCyclotomicExtension {ζ : B} {n : ℕ+} (h : Is
· rw [Set.mem_singleton_iff] at hb
refine' subset_adjoin _
simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq, hb]
- rw [← Subalgebra.coe_eq_one, Subalgebra.coe_pow, [anonymous]]
+ rw [← Subalgebra.coe_eq_one, Subalgebra.coe_pow, SetLike.coe_mk]
exact ((IsPrimitiveRoot.iff_def ζ n).1 h).1
· exact Subalgebra.algebraMap_mem _ _
· exact Subalgebra.add_mem _ hb₁ hb₂
@@ -686,18 +686,18 @@ instance [NeZero ((n : ℕ) : A)] : IsFractionRing (CyclotomicRing n A K) (Cyclo
_⟩
letI : IsScalarTower A K (CyclotomicField n K) :=
IsScalarTower.of_algebraMap_eq (congr_fun rfl)
- rw [[anonymous], ← IsScalarTower.algebraMap_apply, ← IsScalarTower.algebraMap_apply,
+ rw [SetLike.coe_mk, ← IsScalarTower.algebraMap_apply, ← IsScalarTower.algebraMap_apply,
@IsScalarTower.algebraMap_apply A K _ _ _ _ _ (_root_.cyclotomic_field.algebra n K) _ _ w, ←
RingHom.map_mul, hw, ← IsScalarTower.algebraMap_apply]
· rintro y z ⟨a, ha⟩ ⟨b, hb⟩
refine' ⟨⟨a.1 * b.2 + b.1 * a.2, a.2 * b.2, mul_mem_nonZeroDivisors.2 ⟨a.2.2, b.2.2⟩⟩, _⟩
- rw [[anonymous], RingHom.map_mul, add_mul, ← mul_assoc, ha, mul_comm ((algebraMap _ _) ↑a.2),
- ← mul_assoc, hb]
+ rw [SetLike.coe_mk, RingHom.map_mul, add_mul, ← mul_assoc, ha,
+ mul_comm ((algebraMap _ _) ↑a.2), ← mul_assoc, hb]
simp only [map_add, map_mul]
· rintro y z ⟨a, ha⟩ ⟨b, hb⟩
refine' ⟨⟨a.1 * b.1, a.2 * b.2, mul_mem_nonZeroDivisors.2 ⟨a.2.2, b.2.2⟩⟩, _⟩
- rw [[anonymous], RingHom.map_mul, mul_comm ((algebraMap _ _) ↑a.2), mul_assoc, ← mul_assoc z,
- hb, ← mul_comm ((algebraMap _ _) ↑a.2), ← mul_assoc, ha]
+ rw [SetLike.coe_mk, RingHom.map_mul, mul_comm ((algebraMap _ _) ↑a.2), mul_assoc, ←
+ mul_assoc z, hb, ← mul_comm ((algebraMap _ _) ↑a.2), ← mul_assoc, ha]
simp only [map_mul]
eq_iff_exists x y :=
⟨fun h => ⟨1, by rw [adjoin_algebra_injective n A K h]⟩, fun ⟨c, hc⟩ => by
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -65,7 +65,7 @@ included in the `cyclotomic` locale.
open Polynomial Algebra FiniteDimensional Set
-open BigOperators
+open scoped BigOperators
universe u v w z
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -183,10 +183,8 @@ theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
by
refine' le_antisymm (fun x hx => _) fun x hx => _
· rcases hx with ⟨n, hn₁ | hn₂, hnpow⟩
- · left
- exact ⟨n, hn₁, hnpow⟩
- · right
- exact ⟨n, hn₂, hnpow⟩
+ · left; exact ⟨n, hn₁, hnpow⟩
+ · right; exact ⟨n, hn₂, hnpow⟩
· rcases hx with (⟨n, hn⟩ | ⟨n, hn⟩)
· exact ⟨n, Or.inl hn.1, hn.2⟩
· exact ⟨n, Or.inr hn.1, hn.2⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/ef95945cd48c932c9e034872bd25c3c220d9c946
@@ -4,11 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit b602702a58f74f5317862a24893693e80bee6d41
+! leanprover-community/mathlib commit 5bfbcca0a7ffdd21cf1682e59106d6c942434a32
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
-import Mathbin.RingTheory.Polynomial.Cyclotomic.Basic
+import Mathbin.RingTheory.Polynomial.Cyclotomic.Roots
import Mathbin.NumberTheory.NumberField.Basic
import Mathbin.FieldTheory.Galois
@@ -398,6 +398,7 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [DecidableEq B] [IsDomain B]
simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq]
rw [isRoot_of_unity_iff n.pos]
exact ⟨n, Nat.mem_divisors_self n n.ne_zero, hx⟩
+ all_goals infer_instance
· simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
obtain ⟨i, hin, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
refine' SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin _) _)
@@ -417,6 +418,7 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [DecidableE
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
rwa [Finset.mem_coe, Multiset.mem_toFinset, map_cyclotomic,
mem_roots <| cyclotomic_ne_zero n B] at hx
+ all_goals infer_instance
· simp only [mem_singleton_iff, exists_eq_left, mem_set_of_eq] at hx
simpa only [hx, Multiset.mem_toFinset, Finset.mem_coe, map_cyclotomic,
mem_roots (cyclotomic_ne_zero n B)] using hζ.is_root_cyclotomic n.pos
mathlib commit https://github.com/leanprover-community/mathlib/commit/8d33f09cd7089ecf074b4791907588245aec5d1b
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit b353176c24d96c23f0ce1cc63efc3f55019702d9
+! leanprover-community/mathlib commit b602702a58f74f5317862a24893693e80bee6d41
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -604,13 +604,14 @@ def CyclotomicRing : Type w :=
namespace CyclotomicRing
-/-- The `A`-algebra structure on `cyclotomic_ring n A K`.
-This is not an instance since it causes diamonds when `A = ℤ`. -/
-def algebraBase : Algebra A (CyclotomicRing n A K) :=
+/-- The `A`-algebra structure on `cyclotomic_ring n A K`. -/
+instance algebraBase : Algebra A (CyclotomicRing n A K) :=
(adjoin A _).Algebra
#align cyclotomic_ring.algebra_base CyclotomicRing.algebraBase
-attribute [local instance] CyclotomicRing.algebraBase
+-- Ensure that there is no diamonds with ℤ.
+example {n : ℕ+} : CyclotomicRing.algebraBase n ℤ ℚ = algebraInt _ :=
+ rfl
instance : NoZeroSMulDivisors A (CyclotomicRing n A K) :=
(adjoin A _).noZeroSMulDivisors_bot
mathlib commit https://github.com/leanprover-community/mathlib/commit/75e7fca56381d056096ce5d05e938f63a6567828
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
+! leanprover-community/mathlib commit b353176c24d96c23f0ce1cc63efc3f55019702d9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -322,7 +322,7 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : M
by
classical
rw [Module.finite_def, ← top_to_submodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
- refine' fG_adjoin_of_finite _ fun b hb => _
+ refine' FG_adjoin_of_finite _ fun b hb => _
· simp only [mem_singleton_iff, exists_eq_left]
have : { b : B | b ^ (n : ℕ) = 1 } = (nth_roots n (1 : B)).toFinset :=
Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
@@ -579,13 +579,15 @@ variable [IsDomain A] [Algebra A K] [IsFractionRing A K]
section CyclotomicRing
/-- If `K` is the fraction field of `A`, the `A`-algebra structure on `cyclotomic_field n K`.
-This is not an instance since it causes diamonds when `A = ℤ`. -/
+-/
@[nolint unused_arguments]
-def CyclotomicField.algebraBase : Algebra A (CyclotomicField n K) :=
- ((algebraMap K (CyclotomicField n K)).comp (algebraMap A K)).toAlgebra
+instance CyclotomicField.algebraBase : Algebra A (CyclotomicField n K) :=
+ SplittingField.algebra' (cyclotomic n K)
#align cyclotomic_field.algebra_base CyclotomicField.algebraBase
-attribute [local instance] CyclotomicField.algebraBase
+/-- Ensure there are no diamonds when `A = ℤ`. -/
+example : algebraInt (CyclotomicField n ℚ) = CyclotomicField.algebraBase _ _ _ :=
+ rfl
instance CyclotomicField.noZeroSMulDivisors : NoZeroSMulDivisors A (CyclotomicField n K) :=
NoZeroSMulDivisors.of_algebraMap_injective <|
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -322,7 +322,7 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] : M
by
classical
rw [Module.finite_def, ← top_to_submodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
- refine' fg_adjoin_of_finite _ fun b hb => _
+ refine' fG_adjoin_of_finite _ fun b hb => _
· simp only [mem_singleton_iff, exists_eq_left]
have : { b : B | b ^ (n : ℕ) = 1 } = (nth_roots n (1 : B)).toFinset :=
Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/738054fa93d43512da144ec45ce799d18fd44248
@@ -4,13 +4,12 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit fa78268d4d77cb2b2fbc89f0527e2e7807763780
+! leanprover-community/mathlib commit f0c8bf9245297a541f468be517f1bde6195105e9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.RingTheory.Polynomial.Cyclotomic.Basic
import Mathbin.NumberTheory.NumberField.Basic
-import Mathbin.Algebra.CharP.Algebra
import Mathbin.FieldTheory.Galois
/-!
mathlib commit https://github.com/leanprover-community/mathlib/commit/fa78268d4d77cb2b2fbc89f0527e2e7807763780
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit 831c494092374cfe9f50591ed0ac81a25efc5b86
+! leanprover-community/mathlib commit fa78268d4d77cb2b2fbc89f0527e2e7807763780
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -359,9 +359,10 @@ theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A
theorem numberField [h : NumberField K] [Finite S] [IsCyclotomicExtension S K L] : NumberField L :=
{ to_charZero := charZero_of_injective_algebraMap (algebraMap K L).Injective
to_finiteDimensional :=
- @Module.Finite.trans _ K L _ _ _ _
- (@algebraRat L _ (charZero_of_injective_algebraMap (algebraMap K L).Injective)) _ _
- h.to_finiteDimensional (Finite S K L) }
+ by
+ haveI := charZero_of_injective_algebraMap (algebraMap K L).Injective
+ haveI := Finite S K L
+ exact Module.Finite.trans K _ }
#align is_cyclotomic_extension.number_field IsCyclotomicExtension.numberField
scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.numberField
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -166,9 +166,9 @@ theorem subsingleton_iff [Subsingleton B] : IsCyclotomicExtension S A B ↔ S =
rw [mem_singleton_iff, ← PNat.coe_eq_one_iff]
exact_mod_cast hζ.unique (IsPrimitiveRoot.of_subsingleton ζ)
· rintro (rfl | rfl)
- · refine' ⟨fun _ h => h.elim, fun x => by convert (mem_top : x ∈ ⊤)⟩
+ · refine' ⟨fun _ h => h.elim, fun x => by convert(mem_top : x ∈ ⊤)⟩
· rw [iff_singleton]
- refine' ⟨⟨0, IsPrimitiveRoot.of_subsingleton 0⟩, fun x => by convert (mem_top : x ∈ ⊤)⟩
+ refine' ⟨⟨0, IsPrimitiveRoot.of_subsingleton 0⟩, fun x => by convert(mem_top : x ∈ ⊤)⟩
#align is_cyclotomic_extension.subsingleton_iff IsCyclotomicExtension.subsingleton_iff
/-- If `B` is a cyclotomic extension of `A` given by roots of unity of order in `S ∪ T`, then `B`
@@ -277,7 +277,7 @@ variable {A B}
theorem singleton_one_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) :
IsCyclotomicExtension {1} A B :=
by
- convert (iff_union_singleton_one _ _ _).1 (singleton_zero_of_bot_eq_top h)
+ convert(iff_union_singleton_one _ _ _).1 (singleton_zero_of_bot_eq_top h)
simp
#align is_cyclotomic_extension.singleton_one_of_bot_eq_top IsCyclotomicExtension.singleton_one_of_bot_eq_top
mathlib commit https://github.com/leanprover-community/mathlib/commit/38f16f960f5006c6c0c2bac7b0aba5273188f4e5
@@ -465,7 +465,7 @@ theorem splits_x_pow_sub_one [H : IsCyclotomicExtension S K L] (hS : n ∈ S) :
Splits (algebraMap K L) (X ^ (n : ℕ) - 1) :=
by
rw [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_one, Polynomial.map_pow,
- Polynomial.map_x]
+ Polynomial.map_X]
obtain ⟨z, hz⟩ := ((isCyclotomicExtension_iff _ _ _).1 H).1 hS
exact X_pow_sub_one_splits hz
#align is_cyclotomic_extension.splits_X_pow_sub_one IsCyclotomicExtension.splits_x_pow_sub_one
@@ -493,7 +493,7 @@ theorem splitting_field_x_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1)
congr
refine' Set.ext fun x => _
simp only [Polynomial.map_pow, mem_singleton_iff, Multiset.mem_toFinset, exists_eq_left,
- mem_set_of_eq, Polynomial.map_x, Polynomial.map_one, Finset.mem_coe, Polynomial.map_sub]
+ mem_set_of_eq, Polynomial.map_X, Polynomial.map_one, Finset.mem_coe, Polynomial.map_sub]
rwa [← RingHom.map_one C, mem_roots (@X_pow_sub_C_ne_zero L _ _ _ n.pos _), is_root.def,
eval_sub, eval_pow, eval_C, eval_X, sub_eq_zero] }
#align is_cyclotomic_extension.splitting_field_X_pow_sub_one IsCyclotomicExtension.splitting_field_x_pow_sub_one
mathlib commit https://github.com/leanprover-community/mathlib/commit/38f16f960f5006c6c0c2bac7b0aba5273188f4e5
@@ -462,7 +462,7 @@ variable {n S}
/-- A cyclotomic extension splits `X ^ n - 1` if `n ∈ S`.-/
theorem splits_x_pow_sub_one [H : IsCyclotomicExtension S K L] (hS : n ∈ S) :
- Splits (algebraMap K L) (x ^ (n : ℕ) - 1) :=
+ Splits (algebraMap K L) (X ^ (n : ℕ) - 1) :=
by
rw [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_one, Polynomial.map_pow,
Polynomial.map_x]
@@ -486,7 +486,7 @@ section Singleton
variable [IsCyclotomicExtension {n} K L]
/-- If `is_cyclotomic_extension {n} K L`, then `L` is the splitting field of `X ^ n - 1`. -/
-theorem splitting_field_x_pow_sub_one : IsSplittingField K L (x ^ (n : ℕ) - 1) :=
+theorem splitting_field_x_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1) :=
{ Splits := splits_x_pow_sub_one K L (mem_singleton n)
adjoin_roots := by
rw [← ((iff_adjoin_eq_top {n} K L).1 inferInstance).2]
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -673,8 +673,8 @@ instance [IsDomain A] [NeZero ((n : ℕ) : A)] :
map_units' := fun ⟨x, hx⟩ => by
rw [isUnit_iff_ne_zero]
apply map_ne_zero_of_mem_nonZeroDivisors
- apply adjoin_algebra_injective
- exact hx
+ · apply adjoin_algebra_injective
+ · exact hx
surj' x := by
letI : NeZero ((n : ℕ) : K) := NeZero.nat_of_injective (IsFractionRing.injective A K)
refine
FastSubsingleton
and FastIsEmpty
to speed up congr!
/convert
(#12495)
This is a PR that's a temporary measure to improve performance of congr!
/convert
, and the implementation may change in a future PR with a new version of congr!
.
Introduces two typeclasses that are meant to quickly evaluate in common cases of Subsingleton
and IsEmpty
. Makes congr!
use these typeclasses rather than Subsingleton
.
Local Subsingleton
/IsEmpty
instances are included as Fast
instances. To get congr!
/convert
to reason about subsingleton types, you can add such instances to the local context. Or, you can apply Subsingleton.elim
yourself.
@@ -154,6 +154,7 @@ theorem trans (C : Type w) [CommRing C] [Algebra A C] [Algebra B C] [IsScalarTow
@[nontriviality]
theorem subsingleton_iff [Subsingleton B] : IsCyclotomicExtension S A B ↔ S = { } ∨ S = {1} := by
+ have : Subsingleton (Subalgebra A B) := inferInstance
constructor
· rintro ⟨hprim, -⟩
rw [← subset_singleton_iff_eq]
@@ -375,7 +375,7 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n :
simp only [mem_singleton_iff, exists_eq_left, mem_setOf_eq]
rw [isRoot_of_unity_iff n.pos]
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
- rw [IsRoot.definition, ← map_cyclotomic n (algebraMap A B), eval_map, ← aeval_def]
+ rw [IsRoot.def, ← map_cyclotomic n (algebraMap A B), eval_map, ← aeval_def]
exact hx.2
· simp only [mem_singleton_iff, exists_eq_left, mem_setOf_eq] at hx
obtain ⟨i, _, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
@@ -545,7 +545,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
obtain ⟨ζ, hζ⟩ :=
exists_root_of_splits (algebraMap K (CyclotomicField n K)) (SplittingField.splits _)
(degree_cyclotomic_pos n K n.pos).ne'
- rw [← eval_map, ← IsRoot.definition, map_cyclotomic, isRoot_cyclotomic_iff] at hζ
+ rw [← eval_map, ← IsRoot.def, map_cyclotomic, isRoot_cyclotomic_iff] at hζ
-- Porting note: the first `?_` was `forall_eq.2 ⟨ζ, hζ⟩` that now fails.
refine ⟨?_, ?_⟩
· simp only [mem_singleton_iff, forall_eq]
@@ -731,7 +731,7 @@ theorem IsAlgClosed.isCyclotomicExtension (h : ∀ a ∈ S, NeZero ((a : ℕ) :
obtain ⟨r, hr⟩ := IsAlgClosed.exists_aeval_eq_zero K _ (degree_cyclotomic_pos a K a.pos).ne'
refine' ⟨r, _⟩
haveI := h a ha
- rwa [coe_aeval_eq_eval, ← IsRoot.definition, isRoot_cyclotomic_iff] at hr
+ rwa [coe_aeval_eq_eval, ← IsRoot.def, isRoot_cyclotomic_iff] at hr
#align is_alg_closed.is_cyclotomic_extension IsAlgClosed.isCyclotomicExtension
instance IsAlgClosedOfCharZero.isCyclotomicExtension [CharZero K] :
Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.
@@ -436,7 +436,7 @@ section Field
variable {n S}
-/-- A cyclotomic extension splits `X ^ n - 1` if `n ∈ S`.-/
+/-- A cyclotomic extension splits `X ^ n - 1` if `n ∈ S`. -/
theorem splits_X_pow_sub_one [H : IsCyclotomicExtension S K L] (hS : n ∈ S) :
Splits (algebraMap K L) (X ^ (n : ℕ) - 1) := by
rw [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_one, Polynomial.map_pow,
@@ -446,7 +446,7 @@ theorem splits_X_pow_sub_one [H : IsCyclotomicExtension S K L] (hS : n ∈ S) :
set_option linter.uppercaseLean3 false in
#align is_cyclotomic_extension.splits_X_pow_sub_one IsCyclotomicExtension.splits_X_pow_sub_one
-/-- A cyclotomic extension splits `cyclotomic n K` if `n ∈ S` and `ne_zero (n : K)`.-/
+/-- A cyclotomic extension splits `cyclotomic n K` if `n ∈ S` and `ne_zero (n : K)`. -/
theorem splits_cyclotomic [IsCyclotomicExtension S K L] (hS : n ∈ S) :
Splits (algebraMap K L) (cyclotomic n K) := by
refine' splits_of_splits_of_dvd _ (X_pow_sub_C_ne_zero n.pos _) (splits_X_pow_sub_one K L hS) _
@@ -42,7 +42,7 @@ primitive roots of unity, for all `n ∈ S`.
`B` is a finite `A`-algebra.
* `IsCyclotomicExtension.numberField` : a finite cyclotomic extension of a number field is a
number field.
-* `IsCyclotomicExtension.splitting_field_X_pow_sub_one` : if `IsCyclotomicExtension {n} K L`,
+* `IsCyclotomicExtension.isSplittingField_X_pow_sub_one` : if `IsCyclotomicExtension {n} K L`,
then `L` is the splitting field of `X ^ n - 1`.
* `IsCyclotomicExtension.splitting_field_cyclotomic` : if `IsCyclotomicExtension {n} K L`,
then `L` is the splitting field of `cyclotomic n K`.
@@ -375,7 +375,7 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n :
simp only [mem_singleton_iff, exists_eq_left, mem_setOf_eq]
rw [isRoot_of_unity_iff n.pos]
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
- rw [IsRoot.def, ← map_cyclotomic n (algebraMap A B), eval_map, ← aeval_def]
+ rw [IsRoot.definition, ← map_cyclotomic n (algebraMap A B), eval_map, ← aeval_def]
exact hx.2
· simp only [mem_singleton_iff, exists_eq_left, mem_setOf_eq] at hx
obtain ⟨i, _, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
@@ -545,7 +545,7 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
obtain ⟨ζ, hζ⟩ :=
exists_root_of_splits (algebraMap K (CyclotomicField n K)) (SplittingField.splits _)
(degree_cyclotomic_pos n K n.pos).ne'
- rw [← eval_map, ← IsRoot.def, map_cyclotomic, isRoot_cyclotomic_iff] at hζ
+ rw [← eval_map, ← IsRoot.definition, map_cyclotomic, isRoot_cyclotomic_iff] at hζ
-- Porting note: the first `?_` was `forall_eq.2 ⟨ζ, hζ⟩` that now fails.
refine ⟨?_, ?_⟩
· simp only [mem_singleton_iff, forall_eq]
@@ -731,7 +731,7 @@ theorem IsAlgClosed.isCyclotomicExtension (h : ∀ a ∈ S, NeZero ((a : ℕ) :
obtain ⟨r, hr⟩ := IsAlgClosed.exists_aeval_eq_zero K _ (degree_cyclotomic_pos a K a.pos).ne'
refine' ⟨r, _⟩
haveI := h a ha
- rwa [coe_aeval_eq_eval, ← IsRoot.def, isRoot_cyclotomic_iff] at hr
+ rwa [coe_aeval_eq_eval, ← IsRoot.definition, isRoot_cyclotomic_iff] at hr
#align is_alg_closed.is_cyclotomic_extension IsAlgClosed.isCyclotomicExtension
instance IsAlgClosedOfCharZero.isCyclotomicExtension [CharZero K] :
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -68,9 +68,7 @@ open scoped BigOperators
universe u v w z
variable (n : ℕ+) (S T : Set ℕ+) (A : Type u) (B : Type v) (K : Type w) (L : Type z)
-
variable [CommRing A] [CommRing B] [Algebra A B]
-
variable [Field K] [Field L] [Algebra K L]
noncomputable section
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -524,15 +524,15 @@ def CyclotomicField : Type w :=
namespace CyclotomicField
---Porting note: could not be derived
+-- Porting note: could not be derived
instance : Field (CyclotomicField n K) := by
delta CyclotomicField; infer_instance
---Porting note: could not be derived
+-- Porting note: could not be derived
instance algebra : Algebra K (CyclotomicField n K) := by
delta CyclotomicField; infer_instance
---Porting note: could not be derived
+-- Porting note: could not be derived
instance : Inhabited (CyclotomicField n K) := by
delta CyclotomicField; infer_instance
@@ -603,15 +603,15 @@ def CyclotomicRing : Type w :=
namespace CyclotomicRing
---Porting note: could not be derived
+-- Porting note: could not be derived
instance : CommRing (CyclotomicRing n A K) := by
delta CyclotomicRing; infer_instance
---Porting note: could not be derived
+-- Porting note: could not be derived
instance : IsDomain (CyclotomicRing n A K) := by
delta CyclotomicRing; infer_instance
---Porting note: could not be derived
+-- Porting note: could not be derived
instance : Inhabited (CyclotomicRing n A K) := by
delta CyclotomicRing; infer_instance
Currently, we have multiple "no-diamond" tests of the form
example : x = y := rfl
where X
and Y
are instances of some class
. The problem is that since simp
and type class synthesis operate at reducible_and_instances
transparency this check means little.
We went through all the mentions of diamonds and either added with_reducible_and_instancse
or added a reference to the issue #10906.
Co-authored-by: Kevin Buzzard <k.buzzard@imperial.ac.uk>
@@ -573,9 +573,8 @@ instance CyclotomicField.algebraBase : Algebra A (CyclotomicField n K) :=
SplittingField.algebra' (cyclotomic n K)
#align cyclotomic_field.algebra_base CyclotomicField.algebraBase
-/-- Ensure there are no diamonds when `A = ℤ`. -/
-example : algebraInt (CyclotomicField n ℚ) = CyclotomicField.algebraBase _ _ _ :=
- rfl
+/-- Ensure there are no diamonds when `A = ℤ` but there are `reducible_and_instances` #10906 -/
+example : algebraInt (CyclotomicField n ℚ) = CyclotomicField.algebraBase _ _ _ := rfl
instance CyclotomicField.algebra' {R : Type*} [CommRing R] [Algebra R K] :
Algebra R (CyclotomicField n K) :=
@@ -622,8 +621,8 @@ instance algebraBase : Algebra A (CyclotomicRing n A K) :=
#align cyclotomic_ring.algebra_base CyclotomicRing.algebraBase
-- Ensure that there is no diamonds with ℤ.
-example {n : ℕ+} : CyclotomicRing.algebraBase n ℤ ℚ = algebraInt _ :=
- rfl
+-- but there is at `reducible_and_instances` #10906
+example {n : ℕ+} : CyclotomicRing.algebraBase n ℤ ℚ = algebraInt _ := rfl
instance : NoZeroSMulDivisors A (CyclotomicRing n A K) :=
(adjoin A _).noZeroSMulDivisors_bot
refine
s (#10762)
I replaced a few "terminal" refine/refine'
s with exact
.
The strategy was very simple-minded: essentially any refine
whose following line had smaller indentation got replaced by exact
and then I cleaned up the mess.
This PR certainly leaves some further terminal refine
s, but maybe the current change is beneficial.
@@ -317,7 +317,7 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] :
rw [this]
exact (nthRoots (↑n) 1).toFinset.finite_toSet
· simp only [mem_singleton_iff, exists_eq_left, mem_setOf_eq] at hb
- refine' ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
+ exact ⟨X ^ (n : ℕ) - 1, ⟨monic_X_pow_sub_C _ n.pos.ne.symm, by simp [hb]⟩⟩
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
/-- If `S` is finite and `IsCyclotomicExtension S A B`, then `B` is a finite `A`-algebra. -/
@@ -383,7 +383,7 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n :
obtain ⟨i, _, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
refine' SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin _) _)
rw [mem_rootSet', map_cyclotomic, aeval_def, ← eval_map, map_cyclotomic, ← IsRoot]
- refine' ⟨cyclotomic_ne_zero n B, hζ.isRoot_cyclotomic n.pos⟩
+ exact ⟨cyclotomic_ne_zero n B, hζ.isRoot_cyclotomic n.pos⟩
#align is_cyclotomic_extension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots
theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B] {ζ : B}
have
, replace
and suffices
(#10640)
No changes to tactic file, it's just boring fixes throughout the library.
This follows on from #6964.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -389,9 +389,9 @@ theorem adjoin_roots_cyclotomic_eq_adjoin_nth_roots [IsDomain B] {ζ : B} {n :
theorem adjoin_roots_cyclotomic_eq_adjoin_root_cyclotomic {n : ℕ+} [IsDomain B] {ζ : B}
(hζ : IsPrimitiveRoot ζ n) : adjoin A ((cyclotomic n A).rootSet B) = adjoin A {ζ} := by
refine' le_antisymm (adjoin_le fun x hx => _) (adjoin_mono fun x hx => _)
- · suffices hx : x ^ n.1 = 1
- obtain ⟨i, _, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
- exact SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin <| mem_singleton ζ) _)
+ · suffices hx : x ^ n.1 = 1 by
+ obtain ⟨i, _, rfl⟩ := hζ.eq_pow_of_pow_eq_one hx n.pos
+ exact SetLike.mem_coe.2 (Subalgebra.pow_mem _ (subset_adjoin <| mem_singleton ζ) _)
refine' (isRoot_of_unity_iff n.pos B).2 _
refine' ⟨n, Nat.mem_divisors_self n n.ne_zero, _⟩
rw [mem_rootSet', aeval_def, ← eval_map, map_cyclotomic, ← IsRoot] at hx
@@ -321,12 +321,11 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] :
#align is_cyclotomic_extension.finite_of_singleton IsCyclotomicExtension.finite_of_singleton
/-- If `S` is finite and `IsCyclotomicExtension S A B`, then `B` is a finite `A`-algebra. -/
-protected
-theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A B] :
+protected theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A B] :
Module.Finite A B := by
cases' nonempty_fintype S with h
revert h₂ A B
- refine' Set.Finite.induction_on (Set.Finite.intro h) (fun A B => _) @fun n S _ _ H A B => _
+ refine' Set.Finite.induction_on h₁ (fun A B => _) @fun n S _ _ H A B => _
· intro _ _ _ _ _
refine' Module.finite_def.2 ⟨({1} : Finset B), _⟩
simp [← top_toSubmodule, ← empty, toSubmodule_bot, Submodule.one_eq_span]
@@ -3,6 +3,7 @@ Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-/
+import Mathlib.Init.Core
import Mathlib.RingTheory.Polynomial.Cyclotomic.Roots
import Mathlib.NumberTheory.NumberField.Basic
import Mathlib.FieldTheory.Galois
@@ -103,18 +103,18 @@ theorem iff_adjoin_eq_top :
theorem iff_singleton :
IsCyclotomicExtension {n} A B ↔
(∃ r : B, IsPrimitiveRoot r n) ∧ ∀ x, x ∈ adjoin A {b : B | b ^ (n : ℕ) = 1} :=
- by simp [IsCyclotomicExtension_iff]
+ by simp [isCyclotomicExtension_iff]
#align is_cyclotomic_extension.iff_singleton IsCyclotomicExtension.iff_singleton
/-- If `IsCyclotomicExtension ∅ A B`, then the image of `A` in `B` equals `B`. -/
theorem empty [h : IsCyclotomicExtension ∅ A B] : (⊥ : Subalgebra A B) = ⊤ := by
- simpa [Algebra.eq_top_iff, IsCyclotomicExtension_iff] using h
+ simpa [Algebra.eq_top_iff, isCyclotomicExtension_iff] using h
#align is_cyclotomic_extension.empty IsCyclotomicExtension.empty
/-- If `IsCyclotomicExtension {1} A B`, then the image of `A` in `B` equals `B`. -/
theorem singleton_one [h : IsCyclotomicExtension {1} A B] : (⊥ : Subalgebra A B) = ⊤ :=
Algebra.eq_top_iff.2 fun x => by
- simpa [adjoin_singleton_one] using ((IsCyclotomicExtension_iff _ _ _).1 h).2 x
+ simpa [adjoin_singleton_one] using ((isCyclotomicExtension_iff _ _ _).1 h).2 x
#align is_cyclotomic_extension.singleton_one IsCyclotomicExtension.singleton_one
variable {A B}
@@ -137,16 +137,16 @@ theorem trans (C : Type w) [CommRing C] [Algebra A C] [Algebra B C] [IsScalarTow
(h : Function.Injective (algebraMap B C)) : IsCyclotomicExtension (S ∪ T) A C := by
refine' ⟨fun hn => _, fun x => _⟩
· cases' hn with hn hn
- · obtain ⟨b, hb⟩ := ((IsCyclotomicExtension_iff _ _ _).1 hS).1 hn
+ · obtain ⟨b, hb⟩ := ((isCyclotomicExtension_iff _ _ _).1 hS).1 hn
refine' ⟨algebraMap B C b, _⟩
exact hb.map_of_injective h
- · exact ((IsCyclotomicExtension_iff _ _ _).1 hT).1 hn
- · refine' adjoin_induction (((IsCyclotomicExtension_iff T B _).1 hT).2 x)
+ · exact ((isCyclotomicExtension_iff _ _ _).1 hT).1 hn
+ · refine' adjoin_induction (((isCyclotomicExtension_iff T B _).1 hT).2 x)
(fun c ⟨n, hn⟩ => subset_adjoin ⟨n, Or.inr hn.1, hn.2⟩) (fun b => _)
(fun x y hx hy => Subalgebra.add_mem _ hx hy) fun x y hx hy => Subalgebra.mul_mem _ hx hy
· let f := IsScalarTower.toAlgHom A B C
have hb : f b ∈ (adjoin A {b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1}).map f :=
- ⟨b, ((IsCyclotomicExtension_iff _ _ _).1 hS).2 b, rfl⟩
+ ⟨b, ((isCyclotomicExtension_iff _ _ _).1 hS).2 b, rfl⟩
rw [IsScalarTower.toAlgHom_apply, ← adjoin_image] at hb
refine' adjoin_mono (fun y hy => _) hb
obtain ⟨b₁, ⟨⟨n, hn⟩, h₁⟩⟩ := hy
@@ -185,8 +185,8 @@ theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
· rintro x (⟨n, hn⟩ | ⟨n, hn⟩)
· exact ⟨n, Or.inl hn.1, hn.2⟩
· exact ⟨n, Or.inr hn.1, hn.2⟩
- refine' ⟨fun hn => ((IsCyclotomicExtension_iff _ A _).1 h).1 (mem_union_right S hn), fun b => _⟩
- replace h := ((IsCyclotomicExtension_iff _ _ _).1 h).2 b
+ refine' ⟨fun hn => ((isCyclotomicExtension_iff _ A _).1 h).1 (mem_union_right S hn), fun b => _⟩
+ replace h := ((isCyclotomicExtension_iff _ _ _).1 h).2 b
rwa [this, adjoin_union_eq_adjoin_adjoin, Subalgebra.mem_restrictScalars] at h
#align is_cyclotomic_extension.union_right IsCyclotomicExtension.union_right
@@ -196,7 +196,7 @@ given by roots of unity of order in `S`. -/
theorem union_left [h : IsCyclotomicExtension T A B] (hS : S ⊆ T) :
IsCyclotomicExtension S A (adjoin A {b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1}) := by
refine' ⟨@fun n hn => _, fun b => _⟩
- · obtain ⟨b, hb⟩ := ((IsCyclotomicExtension_iff _ _ _).1 h).1 (hS hn)
+ · obtain ⟨b, hb⟩ := ((isCyclotomicExtension_iff _ _ _).1 h).1 (hS hn)
refine' ⟨⟨b, subset_adjoin ⟨n, hn, hb.pow_eq_one⟩⟩, _⟩
rwa [← IsPrimitiveRoot.coe_submonoidClass_iff, Subtype.coe_mk]
· convert mem_top (R := A) (x := b)
@@ -443,7 +443,7 @@ theorem splits_X_pow_sub_one [H : IsCyclotomicExtension S K L] (hS : n ∈ S) :
Splits (algebraMap K L) (X ^ (n : ℕ) - 1) := by
rw [← splits_id_iff_splits, Polynomial.map_sub, Polynomial.map_one, Polynomial.map_pow,
Polynomial.map_X]
- obtain ⟨z, hz⟩ := ((IsCyclotomicExtension_iff _ _ _).1 H).1 hS
+ obtain ⟨z, hz⟩ := ((isCyclotomicExtension_iff _ _ _).1 H).1 hS
exact X_pow_sub_one_splits hz
set_option linter.uppercaseLean3 false in
#align is_cyclotomic_extension.splits_X_pow_sub_one IsCyclotomicExtension.splits_X_pow_sub_one
@@ -285,7 +285,7 @@ theorem equiv {C : Type*} [CommRing C] [Algebra A C] [h : IsCyclotomicExtension
(f : B ≃ₐ[A] C) : IsCyclotomicExtension S A C := by
letI : Algebra B C := f.toAlgHom.toRingHom.toAlgebra
haveI : IsCyclotomicExtension {1} B C := singleton_one_of_algebraMap_bijective f.surjective
- haveI : IsScalarTower A B C := IsScalarTower.of_ring_hom f.toAlgHom
+ haveI : IsScalarTower A B C := IsScalarTower.of_algHom f.toAlgHom
exact (iff_union_singleton_one _ _ _).2 (trans S {1} A B C f.injective)
#align is_cyclotomic_extension.equiv IsCyclotomicExtension.equiv
Make isNoetherian_of_isNoetherianRing_of_finite an instance
: this was impossible in Lean 3 because of a loop.
@@ -352,8 +352,7 @@ theorem numberField [h : NumberField K] [Finite S] [IsCyclotomicExtension S K L]
/-- A finite cyclotomic extension of an integral noetherian domain is integral -/
theorem integral [IsDomain B] [IsNoetherianRing A] [Finite S] [IsCyclotomicExtension S A B] :
Algebra.IsIntegral A B :=
- letI := IsCyclotomicExtension.finite S A B; isIntegral_of_noetherian <|
- isNoetherian_of_isNoetherianRing_of_finite A B
+ letI := IsCyclotomicExtension.finite S A B; isIntegral_of_noetherian inferInstance
#align is_cyclotomic_extension.integral IsCyclotomicExtension.integral
/-- If `S` is finite and `IsCyclotomicExtension S K A`, then `finiteDimensional K A`. -/
exact_mod_cast
tactic with mod_cast
elaborator where possible (#8404)
We still have the exact_mod_cast
tactic, used in a few places, which somehow (?) works a little bit harder to prevent the expected type influencing the elaboration of the term. I would like to get to the bottom of this, and it will be easier once the only usages of exact_mod_cast
are the ones that don't work using the term elaborator by itself.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -161,7 +161,7 @@ theorem subsingleton_iff [Subsingleton B] : IsCyclotomicExtension S A B ↔ S =
intro t ht
obtain ⟨ζ, hζ⟩ := hprim ht
rw [mem_singleton_iff, ← PNat.coe_eq_one_iff]
- exact_mod_cast hζ.unique (IsPrimitiveRoot.of_subsingleton ζ)
+ exact mod_cast hζ.unique (IsPrimitiveRoot.of_subsingleton ζ)
· rintro (rfl | rfl)
-- Porting note: `R := A` was not needed.
· exact ⟨fun h => h.elim, fun x => by convert (mem_top (R := A) : x ∈ ⊤)⟩
This PR tests a string-based tool for renaming declarations.
Inspired by this Zulip thread, I am trying to reduce the diff of #8406.
This PR makes the following renames:
| From | To |
@@ -309,7 +309,7 @@ theorem finite_of_singleton [IsDomain B] [h : IsCyclotomicExtension {n} A B] :
Module.Finite A B := by
classical
rw [Module.finite_def, ← top_toSubmodule, ← ((iff_adjoin_eq_top _ _ _).1 h).2]
- refine' FG_adjoin_of_finite _ fun b hb => _
+ refine' fg_adjoin_of_finite _ fun b hb => _
· simp only [mem_singleton_iff, exists_eq_left]
have : {b : B | b ^ (n : ℕ) = 1} = (nthRoots n (1 : B)).toFinset :=
Set.ext fun x => ⟨fun h => by simpa using h, fun h => by simpa using h⟩
The other direction is a consequence of IsLocalization.map_units
.
Also do the same for LocalizationMap
and IsLocalizedModule
.
This means we have one less fact to prove when constructing an IsLocalization
(etc.) instance (thus many proofs are golfed), but once we construct it we still have access to the eq_iff_exists
lemmas (without the prime) so the API doesn't get less powerful.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -708,9 +708,7 @@ instance [IsDomain A] [NeZero ((n : ℕ) : A)] :
rw [RingHom.map_mul, mul_comm ((algebraMap (CyclotomicRing n A K) _) ↑a.2), mul_assoc, ←
mul_assoc z, hb, ← mul_comm ((algebraMap (CyclotomicRing n A K) _) ↑a.2), ← mul_assoc, ha]
simp only [map_mul]
- eq_iff_exists' := @fun x y =>
- ⟨fun h => ⟨1, by rw [adjoin_algebra_injective n A K h]⟩, fun ⟨c, hc⟩ => by
- rw [mul_left_cancel₀ (nonZeroDivisors.ne_zero c.prop) hc]⟩
+ exists_of_eq {x y} h := ⟨1, by rw [adjoin_algebra_injective n A K h]⟩
theorem eq_adjoin_primitive_root {μ : CyclotomicField n K} (h : IsPrimitiveRoot μ n) :
CyclotomicRing n A K = adjoin A ({μ} : Set (CyclotomicField n K)) := by
@@ -476,8 +476,7 @@ theorem isSplittingField_X_pow_sub_one : IsSplittingField K L (X ^ (n : ℕ) - 1
and_iff_right_iff_imp, Polynomial.map_sub, Polynomial.map_pow, Polynomial.map_one]
exact fun _ => X_pow_sub_C_ne_zero n.pos (1 : L) }
set_option linter.uppercaseLean3 false in
-#align is_cyclotomic_extension.splitting_field_X_pow_sub_one
- IsCyclotomicExtension.isSplittingField_X_pow_sub_one
+#align is_cyclotomic_extension.splitting_field_X_pow_sub_one IsCyclotomicExtension.isSplittingField_X_pow_sub_one
/-- Any two `n`-th cyclotomic extensions are isomorphic. -/
def algEquiv (L' : Type*) [Field L'] [Algebra K L'] [IsCyclotomicExtension {n} K L'] :
⊥ : Subalgebra R A
(#8038)
And the same thing for StarSubalgebra R A
. IntermediateField
was already handled in #7957.
As a result, nine (obvious) lemmas are now true by definition.
This slightly adjusts the statement of Algebra.toSubmodule_bot
to make it simpler and true by definition; the original statement can be recovered by rewriting by Submodule.one_eq_span
, which I've had to add in some downstream proofs.
@@ -328,7 +328,7 @@ theorem finite [IsDomain B] [h₁ : Finite S] [h₂ : IsCyclotomicExtension S A
refine' Set.Finite.induction_on (Set.Finite.intro h) (fun A B => _) @fun n S _ _ H A B => _
· intro _ _ _ _ _
refine' Module.finite_def.2 ⟨({1} : Finset B), _⟩
- simp [← top_toSubmodule, ← empty, toSubmodule_bot]
+ simp [← top_toSubmodule, ← empty, toSubmodule_bot, Submodule.one_eq_span]
· intro _ _ _ _ h
haveI : IsCyclotomicExtension S A (adjoin A {b : B | ∃ n : ℕ+, n ∈ S ∧ b ^ (n : ℕ) = 1}) :=
union_left _ (insert n S) _ _ (subset_insert n S)
This will improve spaces in the mathlib4 docs.
@@ -171,7 +171,7 @@ theorem subsingleton_iff [Subsingleton B] : IsCyclotomicExtension S A B ↔ S =
#align is_cyclotomic_extension.subsingleton_iff IsCyclotomicExtension.subsingleton_iff
/-- If `B` is a cyclotomic extension of `A` given by roots of unity of order in `S ∪ T`, then `B`
-is a cyclotomic extension of `adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 } ` given by
+is a cyclotomic extension of `adjoin A { b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1 }` given by
roots of unity of order in `T`. -/
theorem union_right [h : IsCyclotomicExtension (S ∪ T) A B] :
IsCyclotomicExtension T (adjoin A {b : B | ∃ a : ℕ+, a ∈ S ∧ b ^ (a : ℕ) = 1}) B := by
@@ -352,8 +352,8 @@ theorem numberField [h : NumberField K] [Finite S] [IsCyclotomicExtension S K L]
/-- A finite cyclotomic extension of an integral noetherian domain is integral -/
theorem integral [IsDomain B] [IsNoetherianRing A] [Finite S] [IsCyclotomicExtension S A B] :
Algebra.IsIntegral A B :=
- isIntegral_of_noetherian <| isNoetherian_of_fg_of_noetherian' <|
- (IsCyclotomicExtension.finite S A B).out
+ letI := IsCyclotomicExtension.finite S A B; isIntegral_of_noetherian <|
+ isNoetherian_of_isNoetherianRing_of_finite A B
#align is_cyclotomic_extension.integral IsCyclotomicExtension.integral
/-- If `S` is finite and `IsCyclotomicExtension S K A`, then `finiteDimensional K A`. -/
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -281,7 +281,7 @@ variable (A B)
/-- Given `(f : B ≃ₐ[A] C)`, if `IsCyclotomicExtension S A B` then
`IsCyclotomicExtension S A C`. -/
protected
-theorem equiv {C : Type _} [CommRing C] [Algebra A C] [h : IsCyclotomicExtension S A B]
+theorem equiv {C : Type*} [CommRing C] [Algebra A C] [h : IsCyclotomicExtension S A B]
(f : B ≃ₐ[A] C) : IsCyclotomicExtension S A C := by
letI : Algebra B C := f.toAlgHom.toRingHom.toAlgebra
haveI : IsCyclotomicExtension {1} B C := singleton_one_of_algebraMap_bijective f.surjective
@@ -480,7 +480,7 @@ set_option linter.uppercaseLean3 false in
IsCyclotomicExtension.isSplittingField_X_pow_sub_one
/-- Any two `n`-th cyclotomic extensions are isomorphic. -/
-def algEquiv (L' : Type _) [Field L'] [Algebra K L'] [IsCyclotomicExtension {n} K L'] :
+def algEquiv (L' : Type*) [Field L'] [Algebra K L'] [IsCyclotomicExtension {n} K L'] :
L ≃ₐ[K] L' :=
let h₁ := isSplittingField_X_pow_sub_one n K L
let h₂ := isSplittingField_X_pow_sub_one n K L'
@@ -579,12 +579,12 @@ instance CyclotomicField.algebraBase : Algebra A (CyclotomicField n K) :=
example : algebraInt (CyclotomicField n ℚ) = CyclotomicField.algebraBase _ _ _ :=
rfl
-instance CyclotomicField.algebra' {R : Type _} [CommRing R] [Algebra R K] :
+instance CyclotomicField.algebra' {R : Type*} [CommRing R] [Algebra R K] :
Algebra R (CyclotomicField n K) :=
SplittingField.algebra' (cyclotomic n K)
#align cyclotomic_field.algebra' CyclotomicField.algebra'
-instance {R : Type _} [CommRing R] [Algebra R K] : IsScalarTower R K (CyclotomicField n K) :=
+instance {R : Type*} [CommRing R] [Algebra R K] : IsScalarTower R K (CyclotomicField n K) :=
SplittingField.isScalarTower _
instance CyclotomicField.noZeroSMulDivisors : NoZeroSMulDivisors A (CyclotomicField n K) := by
@@ -2,16 +2,13 @@
Copyright (c) 2021 Riccardo Brasca. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Riccardo Brasca
-
-! This file was ported from Lean 3 source module number_theory.cyclotomic.basic
-! leanprover-community/mathlib commit 4b05d3f4f0601dca8abf99c4ec99187682ed0bba
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.RingTheory.Polynomial.Cyclotomic.Roots
import Mathlib.NumberTheory.NumberField.Basic
import Mathlib.FieldTheory.Galois
+#align_import number_theory.cyclotomic.basic from "leanprover-community/mathlib"@"4b05d3f4f0601dca8abf99c4ec99187682ed0bba"
+
/-!
# Cyclotomic extensions
@@ -126,7 +126,7 @@ variable {A B}
theorem singleton_zero_of_bot_eq_top (h : (⊥ : Subalgebra A B) = ⊤) :
IsCyclotomicExtension ∅ A B := by
-- Porting note: Lean3 is able to infer `A`.
- refine' (iff_adjoin_eq_top _ A _).2
+ refine' (iff_adjoin_eq_top _ A _).2
⟨fun s hs => by simp at hs, _root_.eq_top_iff.2 fun x hx => _⟩
rw [← h] at hx
simpa using hx
@@ -709,8 +709,8 @@ instance [IsDomain A] [NeZero ((n : ℕ) : A)] :
simp only [map_add, map_mul]
· rintro y z ⟨a, ha⟩ ⟨b, hb⟩
refine' ⟨⟨a.1 * b.1, a.2 * b.2, mul_mem_nonZeroDivisors.2 ⟨a.2.2, b.2.2⟩⟩, _⟩
- rw [RingHom.map_mul, mul_comm ((algebraMap (CyclotomicRing n A K) _) ↑a.2), mul_assoc, ←
- mul_assoc z, hb, ← mul_comm ((algebraMap (CyclotomicRing n A K) _) ↑a.2), ← mul_assoc, ha]
+ rw [RingHom.map_mul, mul_comm ((algebraMap (CyclotomicRing n A K) _) ↑a.2), mul_assoc, ←
+ mul_assoc z, hb, ← mul_comm ((algebraMap (CyclotomicRing n A K) _) ↑a.2), ← mul_assoc, ha]
simp only [map_mul]
eq_iff_exists' := @fun x y =>
⟨fun h => ⟨1, by rw [adjoin_algebra_injective n A K h]⟩, fun ⟨c, hc⟩ => by
Co-authored-by: Komyyy <pol_tta@outlook.jp> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Mario Carneiro <di.gama@gmail.com>
@@ -506,7 +506,7 @@ theorem splitting_field_cyclotomic : IsSplittingField K L (cyclotomic n K) :=
rw [← ((iff_adjoin_eq_top {n} K L).1 inferInstance).2]
letI := Classical.decEq L
-- todo: make `exists_prim_root` take an explicit `L`
- obtain ⟨ζ : L, hζ⟩ := IsCyclotomicExtension.exists_prim_root K (mem_singleton n)
+ obtain ⟨ζ : L, hζ⟩ := IsCyclotomicExtension.exists_prim_root K (B := L) (mem_singleton n)
exact adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ }
#align is_cyclotomic_extension.splitting_field_cyclotomic IsCyclotomicExtension.splitting_field_cyclotomic
This PR is the result of running
find . -type f -name "*.lean" -exec sed -i -E 's/^( +)\. /\1· /' {} \;
find . -type f -name "*.lean" -exec sed -i -E 'N;s/^( +·)\n +(.*)$/\1 \2/;P;D' {} \;
which firstly replaces .
focusing dots with ·
and secondly removes isolated instances of such dots, unifying them with the following line. A new rule is placed in the style linter to verify this.
@@ -555,9 +555,9 @@ instance isCyclotomicExtension [NeZero ((n : ℕ) : K)] :
rw [← eval_map, ← IsRoot.def, map_cyclotomic, isRoot_cyclotomic_iff] at hζ
-- Porting note: the first `?_` was `forall_eq.2 ⟨ζ, hζ⟩` that now fails.
refine ⟨?_, ?_⟩
- . simp only [mem_singleton_iff, forall_eq]
+ · simp only [mem_singleton_iff, forall_eq]
exact ⟨ζ, hζ⟩
- . rw [← Algebra.eq_top_iff, ← SplittingField.adjoin_rootSet, eq_comm]
+ · rw [← Algebra.eq_top_iff, ← SplittingField.adjoin_rootSet, eq_comm]
exact IsCyclotomicExtension.adjoin_roots_cyclotomic_eq_adjoin_nth_roots hζ
#align cyclotomic_field.is_cyclotomic_extension CyclotomicField.isCyclotomicExtension
@@ -78,7 +78,7 @@ variable [Field K] [Field L] [Algebra K L]
noncomputable section
/-- Given an `A`-algebra `B` and `S : Set ℕ+`, we define `IsCyclotomicExtension S A B` requiring
-that there is a `n`-th primitive root of unity in `B` for all `n ∈ S` and that `B` is generated
+that there is an `n`-th primitive root of unity in `B` for all `n ∈ S` and that `B` is generated
over `A` by the roots of `X ^ n - 1`. -/
@[mk_iff]
@@ -295,14 +295,14 @@ theorem equiv {C : Type _} [CommRing C] [Algebra A C] [h : IsCyclotomicExtension
protected
theorem neZero [h : IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n : ℕ) : B) := by
obtain ⟨⟨r, hr⟩, -⟩ := (iff_singleton n A B).1 h
- exact hr.ne_zero'
+ exact hr.neZero'
#align is_cyclotomic_extension.ne_zero IsCyclotomicExtension.neZero
protected
-theorem ne_zero' [IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n : ℕ) : A) := by
+theorem neZero' [IsCyclotomicExtension {n} A B] [IsDomain B] : NeZero ((n : ℕ) : A) := by
haveI := IsCyclotomicExtension.neZero n A B
exact NeZero.nat_of_neZero (algebraMap A B)
-#align is_cyclotomic_extension.ne_zero' IsCyclotomicExtension.ne_zero'
+#align is_cyclotomic_extension.ne_zero' IsCyclotomicExtension.neZero'
end Basic
@@ -496,7 +496,7 @@ scoped[Cyclotomic] attribute [instance] IsCyclotomicExtension.isSplittingField_X
theorem isGalois : IsGalois K L :=
letI := isSplittingField_X_pow_sub_one n K L
IsGalois.of_separable_splitting_field (X_pow_sub_one_separable_iff.2
- (IsCyclotomicExtension.ne_zero' n K L).1)
+ (IsCyclotomicExtension.neZero' n K L).1)
#align is_cyclotomic_extension.is_galois IsCyclotomicExtension.isGalois
/-- If `IsCyclotomicExtension {n} K L`, then `L` is the splitting field of `cyclotomic n K`. -/
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file