Documentation

Mathlib.Combinatorics.Additive.FreimanHom

Freiman homomorphisms #

In this file, we define Freiman homomorphisms and isomorphism.

An n-Freiman homomorphism from A to B is a function f : α → β such that f '' A ⊆ B and f x₁ * ... * f xₙ = f y₁ * ... * f yₙ for all x₁, ..., xₙ, y₁, ..., yₙ ∈ A such that x₁ * ... * xₙ = y₁ * ... * yₙ. In particular, any MulHom is a Freiman homomorphism.

An n-Freiman isomorphism from A to B is a function f : α → β bijective between A and B such that f x₁ * ... * f xₙ = f y₁ * ... * f yₙ ↔ x₁ * ... * xₙ = y₁ * ... * yₙ for all x₁, ..., xₙ, y₁, ..., yₙ ∈ A. In particular, any MulEquiv is a Freiman isomorphism.

They are of interest in additive combinatorics.

Main declaration #

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 AddMonoid/Monoid instead of the AddMonoid/Monoid itself.

References #

Yufei Zhao, 18.225: Graph Theory and Additive Combinatorics

TODO #

structure IsAddFreimanHom {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] (n : ) (A : Set α) (B : Set β) (f : αβ) :

An additive n-Freiman homomorphism from a set A to a set B is a map which preserves sums of n elements.

  • mapsTo : Set.MapsTo f A B
  • map_sum_eq_map_sum : ∀ ⦃s t : Multiset α⦄, (∀ ⦃x : α⦄, x sx A)(∀ ⦃x : α⦄, x tx A)Multiset.card s = nMultiset.card t = ns.sum = t.sum(Multiset.map f s).sum = (Multiset.map f t).sum

    An additive n-Freiman homomorphism preserves sums of n elements.

Instances For
    theorem IsAddFreimanHom.mapsTo {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsAddFreimanHom n A B f) :
    theorem IsAddFreimanHom.map_sum_eq_map_sum {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsAddFreimanHom n A B f) ⦃s : Multiset α ⦃t : Multiset α (hsA : ∀ ⦃x : α⦄, x sx A) (htA : ∀ ⦃x : α⦄, x tx A) (hs : Multiset.card s = n) (ht : Multiset.card t = n) (h : s.sum = t.sum) :
    (Multiset.map f s).sum = (Multiset.map f t).sum

    An additive n-Freiman homomorphism preserves sums of n elements.

    structure IsMulFreimanHom {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] (n : ) (A : Set α) (B : Set β) (f : αβ) :

    An n-Freiman homomorphism from a set A to a set B is a map which preserves products of n elements.

    • mapsTo : Set.MapsTo f A B
    • map_prod_eq_map_prod : ∀ ⦃s t : Multiset α⦄, (∀ ⦃x : α⦄, x sx A)(∀ ⦃x : α⦄, x tx A)Multiset.card s = nMultiset.card t = ns.prod = t.prod(Multiset.map f s).prod = (Multiset.map f t).prod

      An n-Freiman homomorphism preserves products of n elements.

    Instances For
      theorem IsMulFreimanHom.mapsTo {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsMulFreimanHom n A B f) :
      theorem IsMulFreimanHom.map_prod_eq_map_prod {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsMulFreimanHom n A B f) ⦃s : Multiset α ⦃t : Multiset α (hsA : ∀ ⦃x : α⦄, x sx A) (htA : ∀ ⦃x : α⦄, x tx A) (hs : Multiset.card s = n) (ht : Multiset.card t = n) (h : s.prod = t.prod) :
      (Multiset.map f s).prod = (Multiset.map f t).prod

      An n-Freiman homomorphism preserves products of n elements.

      structure IsAddFreimanIso {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] (n : ) (A : Set α) (B : Set β) (f : αβ) :

      An additive n-Freiman homomorphism from a set A to a set B is a bijective map which preserves sums of n elements.

      • bijOn : Set.BijOn f A B
      • map_sum_eq_map_sum : ∀ ⦃s t : Multiset α⦄, (∀ ⦃x : α⦄, x sx A)(∀ ⦃x : α⦄, x tx A)Multiset.card s = nMultiset.card t = n((Multiset.map f s).sum = (Multiset.map f t).sum s.sum = t.sum)

        An additive n-Freiman homomorphism preserves sums of n elements.

      Instances For
        theorem IsAddFreimanIso.bijOn {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsAddFreimanIso n A B f) :
        Set.BijOn f A B
        theorem IsAddFreimanIso.map_sum_eq_map_sum {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsAddFreimanIso n A B f) ⦃s : Multiset α ⦃t : Multiset α (hsA : ∀ ⦃x : α⦄, x sx A) (htA : ∀ ⦃x : α⦄, x tx A) (hs : Multiset.card s = n) (ht : Multiset.card t = n) :
        (Multiset.map f s).sum = (Multiset.map f t).sum s.sum = t.sum

        An additive n-Freiman homomorphism preserves sums of n elements.

        structure IsMulFreimanIso {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] (n : ) (A : Set α) (B : Set β) (f : αβ) :

        An n-Freiman homomorphism from a set A to a set B is a map which preserves products of n elements.

        • bijOn : Set.BijOn f A B
        • map_prod_eq_map_prod : ∀ ⦃s t : Multiset α⦄, (∀ ⦃x : α⦄, x sx A)(∀ ⦃x : α⦄, x tx A)Multiset.card s = nMultiset.card t = n((Multiset.map f s).prod = (Multiset.map f t).prod s.prod = t.prod)

          An n-Freiman homomorphism preserves products of n elements.

        Instances For
          theorem IsMulFreimanIso.bijOn {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsMulFreimanIso n A B f) :
          Set.BijOn f A B
          theorem IsMulFreimanIso.map_prod_eq_map_prod {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {n : } {A : Set α} {B : Set β} {f : αβ} (self : IsMulFreimanIso n A B f) ⦃s : Multiset α ⦃t : Multiset α (hsA : ∀ ⦃x : α⦄, x sx A) (htA : ∀ ⦃x : α⦄, x tx A) (hs : Multiset.card s = n) (ht : Multiset.card t = n) :
          (Multiset.map f s).prod = (Multiset.map f t).prod s.prod = t.prod

          An n-Freiman homomorphism preserves products of n elements.

          theorem IsAddFreimanIso.isAddFreimanHom {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B : Set β} {f : αβ} {n : } (hf : IsAddFreimanIso n A B f) :
          theorem IsMulFreimanIso.isMulFreimanHom {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B : Set β} {f : αβ} {n : } (hf : IsMulFreimanIso n A B f) :
          theorem IsAddFreimanHom.add_eq_add {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B : Set β} {f : αβ} (hf : IsAddFreimanHom 2 A B f) {a : α} {b : α} {c : α} {d : α} (ha : a A) (hb : b A) (hc : c A) (hd : d A) (h : a + b = c + d) :
          f a + f b = f c + f d
          theorem IsMulFreimanHom.mul_eq_mul {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B : Set β} {f : αβ} (hf : IsMulFreimanHom 2 A B f) {a : α} {b : α} {c : α} {d : α} (ha : a A) (hb : b A) (hc : c A) (hd : d A) (h : a * b = c * d) :
          f a * f b = f c * f d
          theorem IsAddFreimanIso.add_eq_add {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B : Set β} {f : αβ} (hf : IsAddFreimanIso 2 A B f) {a : α} {b : α} {c : α} {d : α} (ha : a A) (hb : b A) (hc : c A) (hd : d A) :
          f a + f b = f c + f d a + b = c + d
          theorem IsMulFreimanIso.mul_eq_mul {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B : Set β} {f : αβ} (hf : IsMulFreimanIso 2 A B f) {a : α} {b : α} {c : α} {d : α} (ha : a A) (hb : b A) (hc : c A) (hd : d A) :
          f a * f b = f c * f d a * b = c * d
          theorem isAddFreimanHom_two {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B : Set β} {f : αβ} :
          IsAddFreimanHom 2 A B f Set.MapsTo f A B aA, bA, cA, dA, a + b = c + df a + f b = f c + f d

          Characterisation of 2-Freiman homs.

          theorem isMulFreimanHom_two {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B : Set β} {f : αβ} :
          IsMulFreimanHom 2 A B f Set.MapsTo f A B aA, bA, cA, dA, a * b = c * df a * f b = f c * f d

          Characterisation of 2-Freiman homs.

          theorem isAddFreimanHom_id {α : Type u_2} [AddCommMonoid α] {A₁ : Set α} {A₂ : Set α} {n : } (hA : A₁ A₂) :
          IsAddFreimanHom n A₁ A₂ id
          theorem isMulFreimanHom_id {α : Type u_2} [CommMonoid α] {A₁ : Set α} {A₂ : Set α} {n : } (hA : A₁ A₂) :
          IsMulFreimanHom n A₁ A₂ id
          theorem isAddFreimanIso_id {α : Type u_2} [AddCommMonoid α] {A : Set α} {n : } :
          theorem isMulFreimanIso_id {α : Type u_2} [CommMonoid α] {A : Set α} {n : } :
          theorem IsAddFreimanHom.comp {α : Type u_2} {β : Type u_3} {γ : Type u_4} [AddCommMonoid α] [AddCommMonoid β] [AddCommMonoid γ] {A : Set α} {B : Set β} {C : Set γ} {f : αβ} {g : βγ} {n : } (hg : IsAddFreimanHom n B C g) (hf : IsAddFreimanHom n A B f) :
          IsAddFreimanHom n A C (g f)
          theorem IsMulFreimanHom.comp {α : Type u_2} {β : Type u_3} {γ : Type u_4} [CommMonoid α] [CommMonoid β] [CommMonoid γ] {A : Set α} {B : Set β} {C : Set γ} {f : αβ} {g : βγ} {n : } (hg : IsMulFreimanHom n B C g) (hf : IsMulFreimanHom n A B f) :
          IsMulFreimanHom n A C (g f)
          theorem IsAddFreimanIso.comp {α : Type u_2} {β : Type u_3} {γ : Type u_4} [AddCommMonoid α] [AddCommMonoid β] [AddCommMonoid γ] {A : Set α} {B : Set β} {C : Set γ} {f : αβ} {g : βγ} {n : } (hg : IsAddFreimanIso n B C g) (hf : IsAddFreimanIso n A B f) :
          IsAddFreimanIso n A C (g f)
          theorem IsMulFreimanIso.comp {α : Type u_2} {β : Type u_3} {γ : Type u_4} [CommMonoid α] [CommMonoid β] [CommMonoid γ] {A : Set α} {B : Set β} {C : Set γ} {f : αβ} {g : βγ} {n : } (hg : IsMulFreimanIso n B C g) (hf : IsMulFreimanIso n A B f) :
          IsMulFreimanIso n A C (g f)
          theorem IsAddFreimanHom.subset {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A₁ : Set α} {A₂ : Set α} {B₁ : Set β} {B₂ : Set β} {f : αβ} {n : } (hA : A₁ A₂) (hf : IsAddFreimanHom n A₂ B₂ f) (hf' : Set.MapsTo f A₁ B₁) :
          IsAddFreimanHom n A₁ B₁ f
          theorem IsMulFreimanHom.subset {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A₁ : Set α} {A₂ : Set α} {B₁ : Set β} {B₂ : Set β} {f : αβ} {n : } (hA : A₁ A₂) (hf : IsMulFreimanHom n A₂ B₂ f) (hf' : Set.MapsTo f A₁ B₁) :
          IsMulFreimanHom n A₁ B₁ f
          theorem IsAddFreimanHom.superset {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B₁ : Set β} {B₂ : Set β} {f : αβ} {n : } (hB : B₁ B₂) (hf : IsAddFreimanHom n A B₁ f) :
          IsAddFreimanHom n A B₂ f
          theorem IsMulFreimanHom.superset {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B₁ : Set β} {B₂ : Set β} {f : αβ} {n : } (hB : B₁ B₂) (hf : IsMulFreimanHom n A B₁ f) :
          IsMulFreimanHom n A B₂ f
          theorem IsAddFreimanIso.subset {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A₁ : Set α} {A₂ : Set α} {B₁ : Set β} {B₂ : Set β} {f : αβ} {n : } (hA : A₁ A₂) (hf : IsAddFreimanIso n A₂ B₂ f) (hf' : Set.BijOn f A₁ B₁) :
          IsAddFreimanIso n A₁ B₁ f
          theorem IsMulFreimanIso.subset {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A₁ : Set α} {A₂ : Set α} {B₁ : Set β} {B₂ : Set β} {f : αβ} {n : } (hA : A₁ A₂) (hf : IsMulFreimanIso n A₂ B₂ f) (hf' : Set.BijOn f A₁ B₁) :
          IsMulFreimanIso n A₁ B₁ f
          theorem isAddFreimanHom_const {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B : Set β} {n : } {b : β} (hb : b B) :
          IsAddFreimanHom n A B fun (x : α) => b
          theorem isMulFreimanHom_const {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B : Set β} {n : } {b : β} (hb : b B) :
          IsMulFreimanHom n A B fun (x : α) => b
          @[simp]
          theorem isAddFreimanIso_empty {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {f : αβ} {n : } :
          @[simp]
          theorem isMulFreimanIso_empty {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {f : αβ} {n : } :
          theorem IsAddFreimanHom.add {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B₁ : Set β} {B₂ : Set β} {f₁ : αβ} {f₂ : αβ} {n : } (h₁ : IsAddFreimanHom n A B₁ f₁) (h₂ : IsAddFreimanHom n A B₂ f₂) :
          IsAddFreimanHom n A (B₁ + B₂) (f₁ + f₂)
          theorem IsMulFreimanHom.mul {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B₁ : Set β} {B₂ : Set β} {f₁ : αβ} {f₂ : αβ} {n : } (h₁ : IsMulFreimanHom n A B₁ f₁) (h₂ : IsMulFreimanHom n A B₂ f₂) :
          IsMulFreimanHom n A (B₁ * B₂) (f₁ * f₂)
          theorem AddMonoidHomClass.isAddFreimanHom {F : Type u_1} {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B : Set β} {n : } [FunLike F α β] [AddMonoidHomClass F α β] (f : F) (hfAB : Set.MapsTo (f) A B) :
          IsAddFreimanHom n A B f
          theorem MonoidHomClass.isMulFreimanHom {F : Type u_1} {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B : Set β} {n : } [FunLike F α β] [MonoidHomClass F α β] (f : F) (hfAB : Set.MapsTo (f) A B) :
          IsMulFreimanHom n A B f
          theorem AddEquivClass.isAddFreimanIso {F : Type u_1} {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCommMonoid β] {A : Set α} {B : Set β} {n : } [EquivLike F α β] [AddEquivClass F α β] (f : F) (hfAB : Set.BijOn (f) A B) :
          IsAddFreimanIso n A B f
          theorem MulEquivClass.isMulFreimanIso {F : Type u_1} {α : Type u_2} {β : Type u_3} [CommMonoid α] [CommMonoid β] {A : Set α} {B : Set β} {n : } [EquivLike F α β] [MulEquivClass F α β] (f : F) (hfAB : Set.BijOn (f) A B) :
          IsMulFreimanIso n A B f
          theorem IsAddFreimanHom.mono {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [AddCancelCommMonoid β] {A : Set α} {B : Set β} {f : αβ} {m : } {n : } (hmn : m n) (hf : IsAddFreimanHom n A B f) :
          theorem IsMulFreimanHom.mono {α : Type u_2} {β : Type u_3} [CommMonoid α] [CancelCommMonoid β] {A : Set α} {B : Set β} {f : αβ} {m : } {n : } (hmn : m n) (hf : IsMulFreimanHom n A B f) :
          theorem IsAddFreimanIso.mono {α : Type u_2} {β : Type u_3} [AddCancelCommMonoid α] [AddCancelCommMonoid β] {A : Set α} {B : Set β} {f : αβ} {m : } {n : } {hmn : m n} (hf : IsAddFreimanIso n A B f) :
          theorem IsMulFreimanIso.mono {α : Type u_2} {β : Type u_3} [CancelCommMonoid α] [CancelCommMonoid β] {A : Set α} {B : Set β} {f : αβ} {m : } {n : } {hmn : m n} (hf : IsMulFreimanIso n A B f) :
          theorem IsAddFreimanHom.neg {α : Type u_2} {β : Type u_3} [AddCommMonoid α] [SubtractionCommMonoid β] {A : Set α} {B : Set β} {f : αβ} {n : } (hf : IsAddFreimanHom n A B f) :
          IsAddFreimanHom n A (-B) (-f)
          theorem IsMulFreimanHom.inv {α : Type u_2} {β : Type u_3} [CommMonoid α] [DivisionCommMonoid β] {A : Set α} {B : Set β} {f : αβ} {n : } (hf : IsMulFreimanHom n A B f) :
          theorem IsAddFreimanHom.sub {α : Type u_2} [AddCommMonoid α] {A : Set α} {n : } {β : Type u_5} [SubtractionCommMonoid β] {B₁ : Set β} {B₂ : Set β} {f₁ : αβ} {f₂ : αβ} (h₁ : IsAddFreimanHom n A B₁ f₁) (h₂ : IsAddFreimanHom n A B₂ f₂) :
          IsAddFreimanHom n A (B₁ - B₂) (f₁ - f₂)
          theorem IsMulFreimanHom.div {α : Type u_2} [CommMonoid α] {A : Set α} {n : } {β : Type u_5} [DivisionCommMonoid β] {B₁ : Set β} {B₂ : Set β} {f₁ : αβ} {f₂ : αβ} (h₁ : IsMulFreimanHom n A B₁ f₁) (h₂ : IsMulFreimanHom n A B₂ f₂) :
          IsMulFreimanHom n A (B₁ / B₂) (f₁ / f₂)
          theorem IsAddFreimanHom.sum {α₁ : Type u_5} {α₂ : Type u_6} {β₁ : Type u_7} {β₂ : Type u_8} [AddCommMonoid α₁] [AddCommMonoid α₂] [AddCommMonoid β₁] [AddCommMonoid β₂] {A₁ : Set α₁} {A₂ : Set α₂} {B₁ : Set β₁} {B₂ : Set β₂} {f₁ : α₁β₁} {f₂ : α₂β₂} {n : } (h₁ : IsAddFreimanHom n A₁ B₁ f₁) (h₂ : IsAddFreimanHom n A₂ B₂ f₂) :
          IsAddFreimanHom n (A₁ ×ˢ A₂) (B₁ ×ˢ B₂) (Prod.map f₁ f₂)
          theorem IsMulFreimanHom.prod {α₁ : Type u_5} {α₂ : Type u_6} {β₁ : Type u_7} {β₂ : Type u_8} [CommMonoid α₁] [CommMonoid α₂] [CommMonoid β₁] [CommMonoid β₂] {A₁ : Set α₁} {A₂ : Set α₂} {B₁ : Set β₁} {B₂ : Set β₂} {f₁ : α₁β₁} {f₂ : α₂β₂} {n : } (h₁ : IsMulFreimanHom n A₁ B₁ f₁) (h₂ : IsMulFreimanHom n A₂ B₂ f₂) :
          IsMulFreimanHom n (A₁ ×ˢ A₂) (B₁ ×ˢ B₂) (Prod.map f₁ f₂)
          theorem IsAddFreimanIso.sum {α₁ : Type u_5} {α₂ : Type u_6} {β₁ : Type u_7} {β₂ : Type u_8} [AddCommMonoid α₁] [AddCommMonoid α₂] [AddCommMonoid β₁] [AddCommMonoid β₂] {A₁ : Set α₁} {A₂ : Set α₂} {B₁ : Set β₁} {B₂ : Set β₂} {f₁ : α₁β₁} {f₂ : α₂β₂} {n : } (h₁ : IsAddFreimanIso n A₁ B₁ f₁) (h₂ : IsAddFreimanIso n A₂ B₂ f₂) :
          IsAddFreimanIso n (A₁ ×ˢ A₂) (B₁ ×ˢ B₂) (Prod.map f₁ f₂)
          theorem IsMulFreimanIso.prod {α₁ : Type u_5} {α₂ : Type u_6} {β₁ : Type u_7} {β₂ : Type u_8} [CommMonoid α₁] [CommMonoid α₂] [CommMonoid β₁] [CommMonoid β₂] {A₁ : Set α₁} {A₂ : Set α₂} {B₁ : Set β₁} {B₂ : Set β₂} {f₁ : α₁β₁} {f₂ : α₂β₂} {n : } (h₁ : IsMulFreimanIso n A₁ B₁ f₁) (h₂ : IsMulFreimanIso n A₂ B₂ f₂) :
          IsMulFreimanIso n (A₁ ×ˢ A₂) (B₁ ×ˢ B₂) (Prod.map f₁ f₂)
          theorem Fin.isAddFreimanIso_Iic {k : } {m : } {n : } (hm : m 0) (hkmn : m * k n) :
          IsAddFreimanIso m (Set.Iic k) (Set.Iic k) Fin.val

          No wrap-around principle.

          The first k + 1 elements of Fin (n + 1) are m-Freiman isomorphic to the first k + 1 elements of assuming there is no wrap-around.

          theorem Fin.isAddFreimanIso_Iio {k : } {m : } {n : } (hm : m 0) (hkmn : m * k n) :
          IsAddFreimanIso m (Set.Iio k) (Set.Iio k) Fin.val

          No wrap-around principle.

          The first k elements of Fin (n + 1) are m-Freiman isomorphic to the first k elements of assuming there is no wrap-around.