Additive characters of finite rings and fields #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
Let R
be a finite commutative ring. An additive character of R
with values
in another commutative ring R'
is simply a morphism from the additive group
of R
into the multiplicative monoid of R'
.
The additive characters on R
with values in R'
form a commutative group.
We use the namespace add_char
.
Main definitions and results #
We define mul_shift ψ a
, where ψ : add_char R R'
and a : R
, to be the
character defined by x ↦ ψ (a * x)
. An additive character ψ
is primitive
if mul_shift ψ a
is trivial only when a = 0
.
We show that when ψ
is primitive, then the map a ↦ mul_shift ψ a
is injective
(add_char.to_mul_shift_inj_of_is_primitive
) and that ψ
is primitive when R
is a field
and ψ
is nontrivial (add_char.is_nontrivial.is_primitive
).
We also show that there are primitive additive characters on R
(with suitable
target R'
) when R
is a field or R = zmod n
(add_char.primitive_char_finite_field
and add_char.primitive_zmod_char
).
Finally, we show that the sum of all character values is zero when the character
is nontrivial (and the target is a domain); see add_char.sum_eq_zero_of_is_nontrivial
.
Tags #
additive character
Definitions related to and results on additive characters #
Define add_char R R'
as (multiplicative R) →* R'
.
The definition works for an additive monoid R
and a monoid R'
,
but we will restrict to the case that both are commutative rings below.
We assume right away that R'
is commutative, so that add_char R R'
carries
a structure of commutative monoid.
The trivial additive character (sending everything to 1
) is (1 : add_char R R').
Equations
- add_char R R' = (multiplicative R →* R')
Interpret an additive character as a monoid homomorphism.
Equations
Define coercion to a function so that it includes the move from R
to multiplicative R
.
After we have proved the API lemmas below, we don't need to worry about writing of_add a
when we want to apply an additive character.
Equations
- add_char.has_coe_to_fun = {coe := λ (ψ : add_char R R') (x : R), ⇑(ψ.to_monoid_hom) (⇑multiplicative.of_add x)}
An additive character maps 0
to 1
.
An additive character maps sums to products.
An additive character maps multiples by natural numbers to powers.
An additive character on a commutative additive group has an inverse.
Note that this is a different inverse to the one provided by monoid_hom.has_inv
,
as it acts on the domain instead of the codomain.
Equations
- add_char.has_inv = {inv := λ (ψ : add_char R R'), monoid_hom.comp ψ inv_monoid_hom}
An additive character maps multiples by integers to powers.
The additive characters on a commutative additive group form a commutative group.
Equations
- add_char.comm_group = {mul := comm_monoid.mul monoid_hom.comm_monoid, mul_assoc := _, one := comm_monoid.one monoid_hom.comm_monoid, one_mul := _, mul_one := _, npow := comm_monoid.npow monoid_hom.comm_monoid, npow_zero' := _, npow_succ' := _, inv := has_inv.inv add_char.has_inv, div := group.div._default comm_monoid.mul add_char.comm_group._proof_6 comm_monoid.one add_char.comm_group._proof_7 add_char.comm_group._proof_8 comm_monoid.npow add_char.comm_group._proof_9 add_char.comm_group._proof_10 has_inv.inv, div_eq_mul_inv := _, zpow := group.zpow._default comm_monoid.mul add_char.comm_group._proof_12 comm_monoid.one add_char.comm_group._proof_13 add_char.comm_group._proof_14 comm_monoid.npow add_char.comm_group._proof_15 add_char.comm_group._proof_16 has_inv.inv, zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, mul_left_inv := _, mul_comm := _}
An additive character is nontrivial iff it is not the trivial character.
An additive character is primitive iff all its multiplicative shifts by nonzero elements are nontrivial.
Equations
- ψ.is_primitive = ∀ (a : R), a ≠ 0 → (ψ.mul_shift a).is_nontrivial
The map associating to a : R
the multiplicative shift of ψ
by a
is injective when ψ
is primitive.
When R
is a field F
, then a nontrivial additive character is primitive
Definition for a primitive additive character on a finite ring R
into a cyclotomic extension
of a field R'
. It records which cyclotomic extension it is, the character, and the
fact that the character is primitive.
Equations
- add_char.primitive_add_char R R' = Σ (n : ℕ+), Σ' (char : add_char R (cyclotomic_field n R')), char.is_primitive
The first projection from primitive_add_char
, giving the cyclotomic field.
Equations
- add_char.primitive_add_char.n = λ (χ : add_char.primitive_add_char R R'), χ.fst
The second projection from primitive_add_char
, giving the character.
Equations
- add_char.primitive_add_char.char = λ (χ : add_char.primitive_add_char R R'), χ.snd.fst
The third projection from primitive_add_char
, showing that χ.2
is primitive.
We can define an additive character on zmod n
when we have an n
th root of unity ζ : C
.
Equations
- add_char.zmod_char n hζ = {to_fun := λ (a : multiplicative (zmod ↑n)), ζ ^ (⇑multiplicative.to_add a).val, map_one' := _, map_mul' := _}
The additive character on zmod n
associated to a primitive n
th root of unity
is primitive
There is a primitive additive character on zmod n
if the characteristic of the target
does not divide n
Equations
- add_char.primitive_zmod_char n F' h = ⟨n, ⟨add_char.zmod_char n _, _⟩⟩
Existence of a primitive additive character on a finite field #
There is a primitive additive character on the finite field F
if the characteristic
of the target is different from that of F
.
We obtain it as the composition of the trace from F
to zmod p
with a primitive
additive character on zmod p
, where p
is the characteristic of F
.
Equations
- add_char.primitive_char_finite_field F F' h = let p : ℕ := ring_char F, pp : ℕ+ := p.to_pnat _, ψ : add_char.primitive_add_char (zmod ↑pp) F' := add_char.primitive_zmod_char pp F' _, _inst : algebra (zmod p) F := zmod.algebra F p, ψ' : multiplicative F →* cyclotomic_field ψ.n F' := monoid_hom.comp ψ.char (⇑add_monoid_hom.to_multiplicative (algebra.trace (zmod p) F).to_add_monoid_hom) in ⟨ψ.n, ⟨ψ', _⟩⟩
The sum of all character values #
The sum over the values of a nontrivial additive character vanishes if the target ring is a domain.
The sum over the values of the trivial additive character is the cardinality of the source.
The sum over the values of mul_shift ψ b
for ψ
primitive is zero when b ≠ 0
and #R
otherwise.