Skip to content

Commit 9386712

Browse files
committed
feat: add mod n cyclotomic character (#6342)
We define the group homomorphism Aut(L)->(Z/dZ)^* coming from the action on the n'th roots of unity in L. Here d is the number of n'th roots of unity in L (which might not be n in this generality). We also make API for the standard special case when there are n n'th roots of unity in L, calling it `ModularCyclotomicCharacter`. Joint work with Hanneke Wiersema, coming from the Leiden conference on machine checked mathematics.
1 parent 7f61923 commit 9386712

File tree

2 files changed

+220
-0
lines changed

2 files changed

+220
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2920,6 +2920,7 @@ import Mathlib.NumberTheory.ClassNumber.AdmissibleCardPowDegree
29202920
import Mathlib.NumberTheory.ClassNumber.Finite
29212921
import Mathlib.NumberTheory.ClassNumber.FunctionField
29222922
import Mathlib.NumberTheory.Cyclotomic.Basic
2923+
import Mathlib.NumberTheory.Cyclotomic.CyclotomicCharacter
29232924
import Mathlib.NumberTheory.Cyclotomic.Discriminant
29242925
import Mathlib.NumberTheory.Cyclotomic.Embeddings
29252926
import Mathlib.NumberTheory.Cyclotomic.Gal
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
/-
2+
Copyright (c) 2023 Hanneke Wiersema. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Kevin Buzzard, Hanneke Wiersema
5+
-/
6+
import Mathlib.RingTheory.RootsOfUnity.Basic
7+
8+
/-!
9+
10+
# The cyclotomic character
11+
12+
Let `L` be an integral domain and let `n : ℕ+` be a positive integer. If `μₙ` is the
13+
group of `n`th roots of unity in `L` then any field automorphism `g` of `L`
14+
induces an automorphism of `μₙ` which, being a cyclic group, must be of
15+
the form `ζ ↦ ζ^j` for some integer `j = j(g)`, well-defined in `ZMod d`, with
16+
`d` the cardinality of `μₙ`. The function `j` is a group homomorphism
17+
`(L ≃+* L) →* ZMod d`.
18+
19+
Future work: If `L` is separably closed (e.g. algebraically closed) and `p` is a prime
20+
number such that `p ≠ 0` in `L`, then applying the above construction with
21+
`n = p^i` (noting that the size of `μₙ` is `p^i`) gives a compatible collection of
22+
group homomorphisms `(L ≃+* L) →* ZMod (p^i)` which glue to give
23+
a group homomorphism `(L ≃+* L) →* ℤₚ`; this is the `p`-adic cyclotomic character.
24+
25+
## Important definitions
26+
27+
Let `L` be an integral domain, `g : L ≃+* L` and `n : ℕ+`. Let `d` be the number of `n`th roots
28+
of `1` in `L`.
29+
30+
* `ModularCyclotomicCharacter L n hn : (L ≃+* L) →* (ZMod n)ˣ` sends `g` to the unique `j` such
31+
that `g(ζ)=ζ^j` for all `ζ : rootsOfUnity n L`. Here `hn` is a proof that there
32+
are `n` `n`th roots of unity in `L`.
33+
34+
## Implementation note
35+
36+
In theory this could be set up as some theory about monoids, being a character
37+
on monoid isomorphisms, but under the hypotheses that the `n`'th roots of unity
38+
are cyclic. The advantage of sticking to integral domains is that finite subgroups
39+
are guaranteed to be cyclic, so the weaker assumption that there are `n` `n`th
40+
roots of unity is enough. All the applications I'm aware of are when `L` is a
41+
field anyway.
42+
43+
Although I don't know whether it's of any use, `ModularCyclotomicCharacter'`
44+
is the general case for integral domains, with target in `(ZMod d)ˣ`
45+
where `d` is the number of `n`th roots of unity in `L`.
46+
47+
## Todo
48+
49+
* Prove the compatibility of `ModularCyclotomicCharacter n` and `ModularCyclotomicCharacter m`
50+
if `n ∣ m`.
51+
52+
* Define the cyclotomic character.
53+
54+
* Prove that it's continuous.
55+
56+
## Tags
57+
58+
cyclotomic character
59+
-/
60+
61+
universe u
62+
variable {L : Type u} [CommRing L] [IsDomain L]
63+
64+
/-
65+
66+
## The mod n theory
67+
68+
-/
69+
70+
variable (n : ℕ+)
71+
72+
theorem rootsOfUnity.integer_power_of_ringEquiv (g : L ≃+* L) :
73+
∃ m : ℤ, ∀ t : rootsOfUnity n L, g (t : Lˣ) = (t ^ m : Lˣ) := by
74+
obtain ⟨m, hm⟩ := MonoidHom.map_cyclic ((g : L ≃* L).restrictRootsOfUnity n).toMonoidHom
75+
exact ⟨m, fun t ↦ Units.ext_iff.1 <| SetCoe.ext_iff.2 <| hm t⟩
76+
77+
theorem rootsOfUnity.integer_power_of_ringEquiv' (g : L ≃+* L) :
78+
∃ m : ℤ, ∀ t ∈ rootsOfUnity n L, g (t : Lˣ) = (t ^ m : Lˣ) := by
79+
simpa using rootsOfUnity.integer_power_of_ringEquiv n g
80+
81+
/-- `ModularCyclotomicCharacter_aux g n` is a non-canonical auxiliary integer `j`,
82+
only well-defined modulo the number of `n`'th roots of unity in `L`, such that `g(ζ)=ζ^j`
83+
for all `n`'th roots of unity `ζ` in `L`. -/
84+
noncomputable def ModularCyclotomicCharacter_aux (g : L ≃+* L) (n : ℕ+) : ℤ :=
85+
(rootsOfUnity.integer_power_of_ringEquiv n g).choose
86+
87+
-- the only thing we know about `ModularCyclotomicCharacter_aux g n`
88+
theorem ModularCyclotomicCharacter_aux_spec (g : L ≃+* L) (n : ℕ+) :
89+
∀ t : rootsOfUnity n L, g (t : Lˣ) = (t ^ (ModularCyclotomicCharacter_aux g n) : Lˣ) :=
90+
(rootsOfUnity.integer_power_of_ringEquiv n g).choose_spec
91+
92+
/-- If `g` is a ring automorphism of `L`, and `n : ℕ+`, then
93+
`ModularCyclotomicCharacter.toFun n g` is the `j : ZMod d` such that `g(ζ)=ζ^j` for all
94+
`n`'th roots of unity. Here `d` is the number of `n`th roots of unity in `L`. -/
95+
noncomputable def ModularCyclotomicCharacter.toFun (n : ℕ+) (g : L ≃+* L) :
96+
ZMod (Fintype.card (rootsOfUnity n L)) :=
97+
ModularCyclotomicCharacter_aux g n
98+
99+
namespace ModularCyclotomicCharacter
100+
101+
local notation "χ₀" => ModularCyclotomicCharacter.toFun
102+
103+
/-- The formula which characterises the output of `ModularCyclotomicCharacter g n`. -/
104+
theorem toFun_spec (g : L ≃+* L) {n : ℕ+} (t : rootsOfUnity n L) :
105+
g (t : Lˣ) = (t ^ (χ₀ n g).val : Lˣ) := by
106+
rw [ModularCyclotomicCharacter_aux_spec g n t, ← zpow_coe_nat, ModularCyclotomicCharacter.toFun,
107+
ZMod.val_int_cast, ← Subgroup.coe_zpow]
108+
exact Units.ext_iff.1 <| SetCoe.ext_iff.2 <| zpow_eq_zpow_emod _ pow_card_eq_one
109+
110+
theorem toFun_spec' (g : L ≃+* L) {n : ℕ+} {t : Lˣ} (ht : t ∈ rootsOfUnity n L) :
111+
g t = t ^ (χ₀ n g).val :=
112+
toFun_spec g ⟨t, ht⟩
113+
114+
theorem toFun_spec'' (g : L ≃+* L) {n : ℕ+} {t : L} (ht : IsPrimitiveRoot t n) :
115+
g t = t ^ (χ₀ n g).val :=
116+
toFun_spec' g (SetLike.coe_mem ht.toRootsOfUnity)
117+
118+
/-- If g(t)=t^c for all roots of unity, then c=χ(g). -/
119+
theorem toFun_unique (g : L ≃+* L) (c : ZMod (Fintype.card (rootsOfUnity n L)))
120+
(hc : ∀ t : rootsOfUnity n L, g (t : Lˣ) = (t ^ c.val : Lˣ)) : c = χ₀ n g := by
121+
apply IsCyclic.ext rfl (fun ζ ↦ ?_)
122+
specialize hc ζ
123+
suffices ((ζ ^ c.val : Lˣ) : L) = (ζ ^ (χ₀ n g).val : Lˣ) by exact_mod_cast this
124+
rw [← toFun_spec g ζ, hc]
125+
126+
theorem toFun_unique' (g : L ≃+* L) (c : ZMod (Fintype.card (rootsOfUnity n L)))
127+
(hc : ∀ t ∈ rootsOfUnity n L, g t = t ^ c.val) : c = χ₀ n g :=
128+
toFun_unique n g c (fun ⟨_, ht⟩ ↦ hc _ ht)
129+
130+
lemma id : χ₀ n (RingEquiv.refl L) = 1 := by
131+
refine (toFun_unique n (RingEquiv.refl L) 1 <| fun t ↦ ?_).symm
132+
have : 1 ≤ Fintype.card { x // x ∈ rootsOfUnity n L } := Fin.size_positive'
133+
obtain (h | h) := this.lt_or_eq
134+
· have := Fact.mk h
135+
simp [ZMod.val_one]
136+
· have := Fintype.card_le_one_iff_subsingleton.mp h.ge
137+
obtain rfl : t = 1 := Subsingleton.elim t 1
138+
simp
139+
140+
lemma comp (g h : L ≃+* L) : χ₀ n (g * h) =
141+
χ₀ n g * χ₀ n h := by
142+
refine (toFun_unique n (g * h) _ <| fun ζ ↦ ?_).symm
143+
change g (h (ζ : Lˣ)) = _
144+
rw [toFun_spec, ← Subgroup.coe_pow, toFun_spec, mul_comm, Subgroup.coe_pow, ← pow_mul,
145+
← Subgroup.coe_pow]
146+
congr 2
147+
norm_cast
148+
simp only [pow_eq_pow_iff_modEq, ← ZMod.nat_cast_eq_nat_cast_iff, SubmonoidClass.coe_pow,
149+
ZMod.nat_cast_val, Nat.cast_mul, ZMod.cast_mul (m := orderOf ζ) orderOf_dvd_card]
150+
151+
end ModularCyclotomicCharacter
152+
153+
variable (L)
154+
155+
/-- Given a positive integer `n`, `ModularCyclotomicCharacter' n` is a
156+
multiplicative homomorphism from the automorphisms of a field `L` to `(ℤ/dℤ)ˣ`,
157+
where `d` is the number of `n`'th roots of unity in `L`. It is uniquely
158+
characterised by the property that `g(ζ)=ζ^(ModularCyclotomicCharacter n g)`
159+
for `g` an automorphism of `L` and `ζ` an `n`th root of unity. -/
160+
noncomputable
161+
def ModularCyclotomicCharacter' (n : ℕ+) :
162+
(L ≃+* L) →* (ZMod (Fintype.card { x // x ∈ rootsOfUnity n L }))ˣ := MonoidHom.toHomUnits
163+
{ toFun := ModularCyclotomicCharacter.toFun n
164+
map_one' := ModularCyclotomicCharacter.id n
165+
map_mul' := ModularCyclotomicCharacter.comp n }
166+
167+
lemma spec' (g : L ≃+* L) {t : Lˣ} (ht : t ∈ rootsOfUnity n L) :
168+
g t = t ^ ((ModularCyclotomicCharacter' L n g) : ZMod
169+
(Fintype.card { x // x ∈ rootsOfUnity n L })).val :=
170+
ModularCyclotomicCharacter.toFun_spec' g ht
171+
172+
lemma unique' (g : L ≃+* L) {c : ZMod (Fintype.card { x // x ∈ rootsOfUnity n L })}
173+
(hc : ∀ t ∈ rootsOfUnity n L, g t = t ^ c.val) :
174+
c = ModularCyclotomicCharacter' L n g :=
175+
ModularCyclotomicCharacter.toFun_unique' _ _ _ hc
176+
177+
/-- Given a positive integer `n` and a field `L` containing `n` `n`th roots
178+
of unity, `ModularCyclotomicCharacter n` is a multiplicative homomorphism from the
179+
automorphisms of `L` to `(ℤ/nℤ)ˣ`. It is uniquely characterised by the property that
180+
`g(ζ)=ζ^(ModularCyclotomicCharacter n g)` for `g` an automorphism of `L` and `ζ` any `n`th root
181+
of unity. -/
182+
noncomputable def ModularCyclotomicCharacter {n : ℕ+}
183+
(hn : Fintype.card { x // x ∈ rootsOfUnity n L } = n) :
184+
(L ≃+* L) →* (ZMod n)ˣ :=
185+
(Units.mapEquiv <| (ZMod.ringEquivCongr hn).toMulEquiv).toMonoidHom.comp
186+
(ModularCyclotomicCharacter' L n)
187+
188+
namespace ModularCyclotomicCharacter
189+
190+
variable {n : ℕ+} (hn : Fintype.card { x // x ∈ rootsOfUnity n L } = n)
191+
192+
lemma spec (g : L ≃+* L) {t : Lˣ} (ht : t ∈ rootsOfUnity n L) :
193+
g t = t ^ ((ModularCyclotomicCharacter L hn g) : ZMod n).val := by
194+
rw [toFun_spec' g ht]
195+
congr 1
196+
exact (ZMod.ringEquivCongr_val _ _).symm
197+
198+
lemma unique (g : L ≃+* L) {c : ZMod n} (hc : ∀ t ∈ rootsOfUnity n L, g t = t ^ c.val) :
199+
c = ModularCyclotomicCharacter L hn g := by
200+
change c = (ZMod.ringEquivCongr hn) (toFun n g)
201+
rw [← toFun_unique' n g (ZMod.ringEquivCongr hn.symm c)
202+
(fun t ht ↦ by rw [hc t ht, ZMod.ringEquivCongr_val]), ← ZMod.ringEquivCongr_symm hn,
203+
RingEquiv.apply_symm_apply]
204+
205+
end ModularCyclotomicCharacter
206+
207+
variable {L}
208+
209+
/-- The relationship between `IsPrimitiveRoot.autToPow` and
210+
`ModularCyclotomicCharacter`. Note that `IsPrimitiveRoot.autToPow`
211+
needs an explicit root of unity, and also an auxiliary "base ring" `R`. -/
212+
lemma IsPrimitiveRoot.autToPow_eq_ModularCyclotomicCharacter (n : ℕ+)
213+
(R : Type*) [CommRing R] [Algebra R L] {μ : L} (hμ : IsPrimitiveRoot μ n) (g : L ≃ₐ[R] L) :
214+
hμ.autToPow R g = ModularCyclotomicCharacter L hμ.card_rootsOfUnity g := by
215+
ext
216+
apply ZMod.val_injective
217+
apply hμ.pow_inj (ZMod.val_lt _) (ZMod.val_lt _)
218+
simpa [autToPow_spec R hμ g, ModularCyclotomicCharacter', ModularCyclotomicCharacter,
219+
ZMod.ringEquivCongr_val] using ModularCyclotomicCharacter.toFun_spec'' g hμ

0 commit comments

Comments
 (0)