|
| 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