Freiman homomorphisms #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file, we define Freiman homomorphisms. A n
-Freiman homomorphism on A
is a function
f : α → β
such that f (x₁) * ... * f (xₙ) = f (y₁) * ... * f (yₙ)
for all
x₁, ..., xₙ, y₁, ..., yₙ ∈ A
such that x₁ * ... * xₙ = y₁ * ... * yₙ
. In particular, any
mul_hom
is a Freiman homomorphism.
They are of interest in additive combinatorics.
Main declaration #
freiman_hom
: Freiman homomorphism.add_freiman_hom
: Additive Freiman homomorphism.
Notation #
A →*[n] β
: Multiplicativen
-Freiman homomorphism onA
A →+[n] β
: Additiven
-Freiman homomorphism onA
Implementation notes #
In the context of combinatorics, we are interested in Freiman homomorphisms over sets which are not
necessarily closed under addition/multiplication. This means we must parametrize them with a set in
an add_monoid
/monoid
instead of the add_monoid
/monoid
itself.
References #
Yufei Zhao, 18.225: Graph Theory and Additive Combinatorics
TODO #
monoid_hom.to_freiman_hom
could be relaxed to mul_hom.to_freiman_hom
by proving
(s.map f).prod = (t.map f).prod
directly by induction instead of going through f s.prod
.
Define n
-Freiman isomorphisms.
Affine maps induce Freiman homs. Concretely, provide the add_freiman_hom_class (α →ₐ[𝕜] β) A β n
instance.
- to_fun : α → β
- map_sum_eq_map_sum' : ∀ {s t : multiset α}, (∀ ⦃x : α⦄, x ∈ s → x ∈ A) → (∀ ⦃x : α⦄, x ∈ t → x ∈ A) → ⇑multiset.card s = n → ⇑multiset.card t = n → s.sum = t.sum → (multiset.map self.to_fun s).sum = (multiset.map self.to_fun t).sum
An additive n
-Freiman homomorphism is a map which preserves sums of n
elements.
Instances for add_freiman_hom
- add_freiman_hom.has_sizeof_inst
- add_freiman_hom.fun_like
- add_freiman_hom.freiman_hom_class
- add_freiman_hom.has_coe_to_fun
- add_freiman_hom.has_zero
- add_freiman_hom.inhabited
- add_freiman_hom.has_add
- add_freiman_hom.has_neg
- add_freiman_hom.has_sub
- add_freiman_hom.add_comm_monoid
- add_freiman_hom.add_comm_group
- to_fun : α → β
- map_prod_eq_map_prod' : ∀ {s t : multiset α}, (∀ ⦃x : α⦄, x ∈ s → x ∈ A) → (∀ ⦃x : α⦄, x ∈ t → x ∈ A) → ⇑multiset.card s = n → ⇑multiset.card t = n → s.prod = t.prod → (multiset.map self.to_fun s).prod = (multiset.map self.to_fun t).prod
A n
-Freiman homomorphism on a set A
is a map which preserves products of n
elements.
Instances for freiman_hom
- map_sum_eq_map_sum' : ∀ (f : F) {s t : multiset α}, (∀ ⦃x : α⦄, x ∈ s → x ∈ A) → (∀ ⦃x : α⦄, x ∈ t → x ∈ A) → ⇑multiset.card s = n → ⇑multiset.card t = n → s.sum = t.sum → (multiset.map ⇑f s).sum = (multiset.map ⇑f t).sum
add_freiman_hom_class F s β n
states that F
is a type of n
-ary sums-preserving morphisms.
You should extend this class when you extend add_freiman_hom
.
Instances of this typeclass
- map_prod_eq_map_prod' : ∀ (f : F) {s t : multiset α}, (∀ ⦃x : α⦄, x ∈ s → x ∈ A) → (∀ ⦃x : α⦄, x ∈ t → x ∈ A) → ⇑multiset.card s = n → ⇑multiset.card t = n → s.prod = t.prod → (multiset.map ⇑f s).prod = (multiset.map ⇑f t).prod
freiman_hom_class F A β n
states that F
is a type of n
-ary products-preserving morphisms.
You should extend this class when you extend freiman_hom
.
Instances of this typeclass
Equations
Equations
- freiman_hom.fun_like = {coe := freiman_hom.to_fun n, coe_injective' := _}
Helper instance for when there's too many metavariables to apply fun_like.has_coe_to_fun
directly.
Equations
Helper instance for when there's too many metavariables to apply
fun_like.has_coe_to_fun
directly.
Equations
The identity map from a commutative monoid to itself.
Equations
- freiman_hom.id A n = {to_fun := λ (x : α), x, map_prod_eq_map_prod' := _}
The identity map from an additive commutative monoid to itself.
Equations
- add_freiman_hom.id A n = {to_fun := λ (x : α), x, map_sum_eq_map_sum' := _}
Composition of Freiman homomorphisms as a Freiman homomorphism.
Composition of additive Freiman homomorphisms as an additive Freiman homomorphism.
freiman_hom.const A n b
is the Freiman homomorphism sending everything to b
.
Equations
- freiman_hom.const A n b = {to_fun := λ (_x : α), b, map_prod_eq_map_prod' := _}
add_freiman_hom.const n b
is the Freiman homomorphism sending everything to b
.
Equations
- add_freiman_hom.const A n b = {to_fun := λ (_x : α), b, map_sum_eq_map_sum' := _}
1
is the Freiman homomorphism sending everything to 1
.
Equations
- freiman_hom.has_one = {one := freiman_hom.const A n 1}
0
is the Freiman homomorphism sending everything to 0
.
Equations
- add_freiman_hom.has_zero = {zero := add_freiman_hom.const A n 0}
Equations
Equations
- freiman_hom.inhabited = {default := 1}
f * g
is the Freiman homomorphism sends x
to f x * g x
.
f + g
is the Freiman homomorphism sending x
to f x + g x
.
If f
is a Freiman homomorphism to a commutative group, then f⁻¹
is the Freiman homomorphism
sending x
to (f x)⁻¹
.
If f
is a Freiman homomorphism to an additive commutative group, then -f
is the
Freiman homomorphism sending x
to -f x
.
If f
and g
are Freiman homomorphisms to a commutative group, then f / g
is the Freiman
homomorphism sending x
to f x / g x
.
If f
and g
are additive Freiman homomorphisms to an additive commutative group,
then f - g
is the additive Freiman homomorphism sending x
to f x - g x
Instances #
α →+[n] β
is an add_comm_monoid
.
Equations
- add_freiman_hom.add_comm_monoid = {add := has_add.add add_freiman_hom.has_add, add_assoc := _, zero := 0, zero_add := _, add_zero := _, nsmul := λ (m : ℕ) (f : A →+[n] β), {to_fun := λ (x : α), m • ⇑f x, map_sum_eq_map_sum' := _}, nsmul_zero' := _, nsmul_succ' := _, add_comm := _}
A →*[n] β
is a comm_monoid
.
Equations
- freiman_hom.comm_monoid = {mul := has_mul.mul freiman_hom.has_mul, mul_assoc := _, one := 1, one_mul := _, mul_one := _, npow := λ (m : ℕ) (f : A →*[n] β), {to_fun := λ (x : α), ⇑f x ^ m, map_prod_eq_map_prod' := _}, npow_zero' := _, npow_succ' := _, mul_comm := _}
If β
is an additive commutative group, then A →*[n] β
is an additive commutative
group too.
Equations
- add_freiman_hom.add_comm_group = {add := add_comm_monoid.add add_freiman_hom.add_comm_monoid, add_assoc := _, zero := add_comm_monoid.zero add_freiman_hom.add_comm_monoid, zero_add := _, add_zero := _, nsmul := add_comm_monoid.nsmul add_freiman_hom.add_comm_monoid, nsmul_zero' := _, nsmul_succ' := _, neg := has_neg.neg add_freiman_hom.has_neg, sub := has_sub.sub add_freiman_hom.has_sub, sub_eq_add_neg := _, zsmul := λ (n_1 : ℤ) (f : A →+[n] β), {to_fun := λ (x : α), n_1 • ⇑f x, map_sum_eq_map_sum' := _}, zsmul_zero' := _, zsmul_succ' := _, zsmul_neg' := _, add_left_neg := _, add_comm := _}
If β
is a commutative group, then A →*[n] β
is a commutative group too.
Equations
- freiman_hom.comm_group = {mul := comm_monoid.mul freiman_hom.comm_monoid, mul_assoc := _, one := comm_monoid.one freiman_hom.comm_monoid, one_mul := _, mul_one := _, npow := comm_monoid.npow freiman_hom.comm_monoid, npow_zero' := _, npow_succ' := _, inv := has_inv.inv freiman_hom.has_inv, div := has_div.div freiman_hom.has_div, div_eq_mul_inv := _, zpow := λ (n_1 : ℤ) (f : A →*[n] β), {to_fun := λ (x : α), ⇑f x ^ n_1, map_prod_eq_map_prod' := _}, zpow_zero' := _, zpow_succ' := _, zpow_neg' := _, mul_left_inv := _, mul_comm := _}
Hom hierarchy #
A monoid homomorphism is naturally a freiman_hom
on its entire domain.
We can't leave the domain A : set α
of the freiman_hom
a free variable, since it wouldn't be
inferrable.
An additive monoid homomorphism is naturally an add_freiman_hom
on its entire
domain.
We can't leave the domain A : set α
of the freiman_hom
a free variable, since it wouldn't be
inferrable.
A monoid_hom
is naturally a freiman_hom
.
Equations
- monoid_hom.to_freiman_hom A n f = {to_fun := ⇑f, map_prod_eq_map_prod' := _}
An add_monoid_hom
is naturally an
add_freiman_hom
Equations
- add_monoid_hom.to_add_freiman_hom A n f = {to_fun := ⇑f, map_sum_eq_map_sum' := _}
α →+[n] β
is naturally included in α →+[m] β
for any m ≤ n
Equations
- add_freiman_hom.to_add_freiman_hom h f = {to_fun := ⇑f, map_sum_eq_map_sum' := _}
α →*[n] β
is naturally included in A →*[m] β
for any m ≤ n
.
Equations
- freiman_hom.to_freiman_hom h f = {to_fun := ⇑f, map_prod_eq_map_prod' := _}
An additive n
-Freiman homomorphism is
also an additive m
-Freiman homomorphism for any m ≤ n
.
A n
-Freiman homomorphism is also a m
-Freiman homomorphism for any m ≤ n
.