Documentation

Mathlib.Algebra.Group.UniqueProds.Basic

Unique products and related notions #

A group G has unique products if for any two non-empty finite subsets A, B ⊆ G, there is an element g ∈ A * B that can be written uniquely as a product of an element of A and an element of B. We call the formalization this property UniqueProds. Since the condition requires no property of the group operation, we define it for a Type simply satisfying Mul. We also introduce the analogous "additive" companion, UniqueSums, and link the two so that to_additive converts UniqueProds into UniqueSums.

A common way of proving that a group satisfies the UniqueProds/Sums property is by assuming the existence of some kind of ordering on the group that is well-behaved with respect to the group operation and showing that minima/maxima are the "unique products/sums". However, the order is just a convenience and is not part of the UniqueProds/Sums setup.

Here you can see several examples of Types that have UniqueSums/Prods (inferInstance uses Covariant.to_uniqueProds_left and Covariant.to_uniqueSums_left).

import Mathlib.Data.Real.Basic
import Mathlib.Data.PNat.Basic
import Mathlib.Algebra.Group.UniqueProds.Basic

example : UniqueSums ℕ   := inferInstance
example : UniqueSums ℕ+  := inferInstance
example : UniqueSums ℤ   := inferInstance
example : UniqueSums ℚ   := inferInstance
example : UniqueSums ℝ   := inferInstance
example : UniqueProds ℕ+ := inferInstance

Use in (Add)MonoidAlgebras #

UniqueProds/Sums allow to decouple certain arguments about (Add)MonoidAlgebras into an argument about the grading type and then a generic statement of the form "look at the coefficient of the 'unique product/sum'". The file Algebra/MonoidAlgebra/NoZeroDivisors contains several examples of this use.

def UniqueAdd {G : Type u_1} [Add G] (A : Finset G) (B : Finset G) (a0 : G) (b0 : G) :

Let G be a Type with addition, let A B : Finset G be finite subsets and let a0 b0 : G be two elements. UniqueAdd A B a0 b0 asserts a0 + b0 can be written in at most one way as a sum of an element from A and an element from B.

Equations
Instances For
    def UniqueMul {G : Type u_1} [Mul G] (A : Finset G) (B : Finset G) (a0 : G) (b0 : G) :

    Let G be a Type with multiplication, let A B : Finset G be finite subsets and let a0 b0 : G be two elements. UniqueMul A B a0 b0 asserts a0 * b0 can be written in at most one way as a product of an element of A and an element of B.

    Equations
    Instances For
      @[simp]
      theorem UniqueAdd.of_subsingleton {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [Subsingleton G] :
      UniqueAdd A B a0 b0
      @[simp]
      theorem UniqueMul.of_subsingleton {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [Subsingleton G] :
      UniqueMul A B a0 b0
      theorem UniqueAdd.of_card_le_one {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} (hA : A.Nonempty) (hB : B.Nonempty) (hA1 : A.card 1) (hB1 : B.card 1) :
      aA, bB, UniqueAdd A B a b
      theorem UniqueMul.of_card_le_one {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} (hA : A.Nonempty) (hB : B.Nonempty) (hA1 : A.card 1) (hB1 : B.card 1) :
      aA, bB, UniqueMul A B a b
      @[deprecated UniqueAdd.of_card_le_one]
      theorem UniqueAdd.of_card_nonpos {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} (hA : A.Nonempty) (hB : B.Nonempty) (hA1 : A.card 1) (hB1 : B.card 1) :
      aA, bB, UniqueAdd A B a b

      Alias of UniqueAdd.of_card_le_one.

      theorem UniqueAdd.mt {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueAdd A B a0 b0) ⦃a : G ⦃b : G :
      a Ab Ba a0 b b0a + b a0 + b0
      theorem UniqueMul.mt {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueMul A B a0 b0) ⦃a : G ⦃b : G :
      a Ab Ba a0 b b0a * b a0 * b0
      theorem UniqueAdd.subsingleton {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueAdd A B a0 b0) :
      Subsingleton { ab : G × G // ab.1 A ab.2 B ab.1 + ab.2 = a0 + b0 }
      theorem UniqueMul.subsingleton {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueMul A B a0 b0) :
      Subsingleton { ab : G × G // ab.1 A ab.2 B ab.1 * ab.2 = a0 * b0 }
      theorem UniqueAdd.set_subsingleton {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueAdd A B a0 b0) :
      {ab : G × G | ab.1 A ab.2 B ab.1 + ab.2 = a0 + b0}.Subsingleton
      theorem UniqueMul.set_subsingleton {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueMul A B a0 b0) :
      {ab : G × G | ab.1 A ab.2 B ab.1 * ab.2 = a0 * b0}.Subsingleton
      theorem UniqueAdd.iff_existsUnique {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (aA : a0 A) (bB : b0 B) :
      UniqueAdd A B a0 b0 ∃! ab : G × G, ab A ×ˢ B ab.1 + ab.2 = a0 + b0
      theorem UniqueMul.iff_existsUnique {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (aA : a0 A) (bB : b0 B) :
      UniqueMul A B a0 b0 ∃! ab : G × G, ab A ×ˢ B ab.1 * ab.2 = a0 * b0
      theorem UniqueAdd.iff_card_le_one {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [DecidableEq G] (ha0 : a0 A) (hb0 : b0 B) :
      UniqueAdd A B a0 b0 (Finset.filter (fun (p : G × G) => p.1 + p.2 = a0 + b0) (A ×ˢ B)).card 1
      theorem UniqueMul.iff_card_le_one {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [DecidableEq G] (ha0 : a0 A) (hb0 : b0 B) :
      UniqueMul A B a0 b0 (Finset.filter (fun (p : G × G) => p.1 * p.2 = a0 * b0) (A ×ˢ B)).card 1
      @[deprecated UniqueAdd.iff_card_le_one]
      theorem UniqueAdd.iff_card_nonpos {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [DecidableEq G] (ha0 : a0 A) (hb0 : b0 B) :
      UniqueAdd A B a0 b0 (Finset.filter (fun (p : G × G) => p.1 + p.2 = a0 + b0) (A ×ˢ B)).card 1

      Alias of UniqueAdd.iff_card_le_one.

      theorem UniqueAdd.exists_iff_exists_existsUnique {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} :
      (∃ (a0 : G) (b0 : G), a0 A b0 B UniqueAdd A B a0 b0) ∃ (g : G), ∃! ab : G × G, ab A ×ˢ B ab.1 + ab.2 = g
      theorem UniqueMul.exists_iff_exists_existsUnique {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} :
      (∃ (a0 : G) (b0 : G), a0 A b0 B UniqueMul A B a0 b0) ∃ (g : G), ∃! ab : G × G, ab A ×ˢ B ab.1 * ab.2 = g
      theorem UniqueAdd.addHom_preimage {G : Type u_1} {H : Type u_2} [Add G] [Add H] (f : AddHom G H) (hf : Function.Injective f) (a0 : G) (b0 : G) {A : Finset H} {B : Finset H} (u : UniqueAdd A B (f a0) (f b0)) :
      UniqueAdd (A.preimage f ) (B.preimage f ) a0 b0

      UniqueAdd is preserved by inverse images under injective, additive maps.

      theorem UniqueMul.mulHom_preimage {G : Type u_1} {H : Type u_2} [Mul G] [Mul H] (f : G →ₙ* H) (hf : Function.Injective f) (a0 : G) (b0 : G) {A : Finset H} {B : Finset H} (u : UniqueMul A B (f a0) (f b0)) :
      UniqueMul (A.preimage f ) (B.preimage f ) a0 b0

      UniqueMul is preserved by inverse images under injective, multiplicative maps.

      theorem UniqueAdd.of_addHom_image {G : Type u_1} {H : Type u_2} [Add G] [Add H] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [DecidableEq H] (f : AddHom G H) (hf : ∀ ⦃a b c d : G⦄, a + b = c + df a = f c f b = f da = c b = d) (h : UniqueAdd (Finset.image (⇑f) A) (Finset.image (⇑f) B) (f a0) (f b0)) :
      UniqueAdd A B a0 b0
      theorem UniqueMul.of_mulHom_image {G : Type u_1} {H : Type u_2} [Mul G] [Mul H] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [DecidableEq H] (f : G →ₙ* H) (hf : ∀ ⦃a b c d : G⦄, a * b = c * df a = f c f b = f da = c b = d) (h : UniqueMul (Finset.image (⇑f) A) (Finset.image (⇑f) B) (f a0) (f b0)) :
      UniqueMul A B a0 b0
      theorem UniqueAdd.addHom_image_iff {G : Type u_1} {H : Type u_2} [Add G] [Add H] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [DecidableEq H] (f : AddHom G H) (hf : Function.Injective f) :
      UniqueAdd (Finset.image (⇑f) A) (Finset.image (⇑f) B) (f a0) (f b0) UniqueAdd A B a0 b0

      UniqueAdd is preserved under additive maps that are injective.

      See UniqueAdd.addHom_map_iff for a version with swapped bundling.

      theorem UniqueMul.mulHom_image_iff {G : Type u_1} {H : Type u_2} [Mul G] [Mul H] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} [DecidableEq H] (f : G →ₙ* H) (hf : Function.Injective f) :
      UniqueMul (Finset.image (⇑f) A) (Finset.image (⇑f) B) (f a0) (f b0) UniqueMul A B a0 b0

      Unique_Mul is preserved under multiplicative maps that are injective.

      See UniqueMul.mulHom_map_iff for a version with swapped bundling.

      theorem UniqueAdd.addHom_map_iff {G : Type u_1} {H : Type u_2} [Add G] [Add H] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (f : G H) (mul : ∀ (x y : G), f (x + y) = f x + f y) :
      UniqueAdd (Finset.map f A) (Finset.map f B) (f a0) (f b0) UniqueAdd A B a0 b0

      UniqueAdd is preserved under embeddings that are additive.

      See UniqueAdd.addHom_image_iff for a version with swapped bundling.

      theorem UniqueMul.mulHom_map_iff {G : Type u_1} {H : Type u_2} [Mul G] [Mul H] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (f : G H) (mul : ∀ (x y : G), f (x * y) = f x * f y) :
      UniqueMul (Finset.map f A) (Finset.map f B) (f a0) (f b0) UniqueMul A B a0 b0

      UniqueMul is preserved under embeddings that are multiplicative.

      See UniqueMul.mulHom_image_iff for a version with swapped bundling.

      theorem UniqueAdd.of_addOpposite {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueAdd (Finset.map { toFun := AddOpposite.op, inj' := } B) (Finset.map { toFun := AddOpposite.op, inj' := } A) (AddOpposite.op b0) (AddOpposite.op a0)) :
      UniqueAdd A B a0 b0
      theorem UniqueMul.of_mulOpposite {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueMul (Finset.map { toFun := MulOpposite.op, inj' := } B) (Finset.map { toFun := MulOpposite.op, inj' := } A) (MulOpposite.op b0) (MulOpposite.op a0)) :
      UniqueMul A B a0 b0
      theorem UniqueAdd.to_addOpposite {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueAdd A B a0 b0) :
      UniqueAdd (Finset.map { toFun := AddOpposite.op, inj' := } B) (Finset.map { toFun := AddOpposite.op, inj' := } A) (AddOpposite.op b0) (AddOpposite.op a0)
      theorem UniqueMul.to_mulOpposite {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} (h : UniqueMul A B a0 b0) :
      UniqueMul (Finset.map { toFun := MulOpposite.op, inj' := } B) (Finset.map { toFun := MulOpposite.op, inj' := } A) (MulOpposite.op b0) (MulOpposite.op a0)
      theorem UniqueAdd.iff_addOpposite {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} :
      UniqueAdd (Finset.map { toFun := AddOpposite.op, inj' := } B) (Finset.map { toFun := AddOpposite.op, inj' := } A) (AddOpposite.op b0) (AddOpposite.op a0) UniqueAdd A B a0 b0
      theorem UniqueMul.iff_mulOpposite {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} {a0 : G} {b0 : G} :
      UniqueMul (Finset.map { toFun := MulOpposite.op, inj' := } B) (Finset.map { toFun := MulOpposite.op, inj' := } A) (MulOpposite.op b0) (MulOpposite.op a0) UniqueMul A B a0 b0
      theorem UniqueAdd.of_image_filter {G : Type u_1} {H : Type u_2} [Add G] [Add H] [DecidableEq H] (f : AddHom G H) {A : Finset G} {B : Finset G} {aG : G} {bG : G} {aH : H} {bH : H} (hae : f aG = aH) (hbe : f bG = bH) (huH : UniqueAdd (Finset.image (⇑f) A) (Finset.image (⇑f) B) aH bH) (huG : UniqueAdd (Finset.filter (fun (a : G) => f a = aH) A) (Finset.filter (fun (b : G) => f b = bH) B) aG bG) :
      UniqueAdd A B aG bG
      theorem UniqueMul.of_image_filter {G : Type u_1} {H : Type u_2} [Mul G] [Mul H] [DecidableEq H] (f : G →ₙ* H) {A : Finset G} {B : Finset G} {aG : G} {bG : G} {aH : H} {bH : H} (hae : f aG = aH) (hbe : f bG = bH) (huH : UniqueMul (Finset.image (⇑f) A) (Finset.image (⇑f) B) aH bH) (huG : UniqueMul (Finset.filter (fun (a : G) => f a = aH) A) (Finset.filter (fun (b : G) => f b = bH) B) aG bG) :
      UniqueMul A B aG bG
      class UniqueSums (G : Type u_1) [Add G] :

      Let G be a Type with addition. UniqueSums G asserts that any two non-empty finite subsets of G have the UniqueAdd property, with respect to some element of their sum A + B.

      • uniqueAdd_of_nonempty : ∀ {A B : Finset G}, A.NonemptyB.Nonemptya0A, b0B, UniqueAdd A B a0 b0

        For A B two nonempty finite sets, there always exist a0 ∈ A, b0 ∈ B such that UniqueAdd A B a0 b0

      Instances
        theorem UniqueSums.uniqueAdd_of_nonempty {G : Type u_1} :
        ∀ {inst : Add G} [self : UniqueSums G] {A B : Finset G}, A.NonemptyB.Nonemptya0A, b0B, UniqueAdd A B a0 b0

        For A B two nonempty finite sets, there always exist a0 ∈ A, b0 ∈ B such that UniqueAdd A B a0 b0

        class UniqueProds (G : Type u_1) [Mul G] :

        Let G be a Type with multiplication. UniqueProds G asserts that any two non-empty finite subsets of G have the UniqueMul property, with respect to some element of their product A * B.

        • uniqueMul_of_nonempty : ∀ {A B : Finset G}, A.NonemptyB.Nonemptya0A, b0B, UniqueMul A B a0 b0

          For A B two nonempty finite sets, there always exist a0 ∈ A, b0 ∈ B such that UniqueMul A B a0 b0

        Instances
          theorem UniqueProds.uniqueMul_of_nonempty {G : Type u_1} :
          ∀ {inst : Mul G} [self : UniqueProds G] {A B : Finset G}, A.NonemptyB.Nonemptya0A, b0B, UniqueMul A B a0 b0

          For A B two nonempty finite sets, there always exist a0 ∈ A, b0 ∈ B such that UniqueMul A B a0 b0

          class TwoUniqueSums (G : Type u_1) [Add G] :

          Let G be a Type with addition. TwoUniqueSums G asserts that any two non-empty finite subsets of G, at least one of which is not a singleton, possesses at least two pairs of elements satisfying the UniqueAdd property.

          • uniqueAdd_of_one_lt_card : ∀ {A B : Finset G}, 1 < A.card * B.cardp1A ×ˢ B, p2A ×ˢ B, p1 p2 UniqueAdd A B p1.1 p1.2 UniqueAdd A B p2.1 p2.2

            For A B two finite sets whose product has cardinality at least 2, we can find at least two unique pairs.

          Instances
            theorem TwoUniqueSums.uniqueAdd_of_one_lt_card {G : Type u_1} :
            ∀ {inst : Add G} [self : TwoUniqueSums G] {A B : Finset G}, 1 < A.card * B.cardp1A ×ˢ B, p2A ×ˢ B, p1 p2 UniqueAdd A B p1.1 p1.2 UniqueAdd A B p2.1 p2.2

            For A B two finite sets whose product has cardinality at least 2, we can find at least two unique pairs.

            class TwoUniqueProds (G : Type u_1) [Mul G] :

            Let G be a Type with multiplication. TwoUniqueProds G asserts that any two non-empty finite subsets of G, at least one of which is not a singleton, possesses at least two pairs of elements satisfying the UniqueMul property.

            • uniqueMul_of_one_lt_card : ∀ {A B : Finset G}, 1 < A.card * B.cardp1A ×ˢ B, p2A ×ˢ B, p1 p2 UniqueMul A B p1.1 p1.2 UniqueMul A B p2.1 p2.2

              For A B two finite sets whose product has cardinality at least 2, we can find at least two unique pairs.

            Instances
              theorem TwoUniqueProds.uniqueMul_of_one_lt_card {G : Type u_1} :
              ∀ {inst : Mul G} [self : TwoUniqueProds G] {A B : Finset G}, 1 < A.card * B.cardp1A ×ˢ B, p2A ×ˢ B, p1 p2 UniqueMul A B p1.1 p1.2 UniqueMul A B p2.1 p2.2

              For A B two finite sets whose product has cardinality at least 2, we can find at least two unique pairs.

              theorem uniqueAdd_of_twoUniqueAdd {G : Type u_1} [Add G] {A : Finset G} {B : Finset G} (h : 1 < A.card * B.cardp1A ×ˢ B, p2A ×ˢ B, p1 p2 UniqueAdd A B p1.1 p1.2 UniqueAdd A B p2.1 p2.2) (hA : A.Nonempty) (hB : B.Nonempty) :
              aA, bB, UniqueAdd A B a b
              theorem uniqueMul_of_twoUniqueMul {G : Type u_1} [Mul G] {A : Finset G} {B : Finset G} (h : 1 < A.card * B.cardp1A ×ˢ B, p2A ×ˢ B, p1 p2 UniqueMul A B p1.1 p1.2 UniqueMul A B p2.1 p2.2) (hA : A.Nonempty) (hB : B.Nonempty) :
              aA, bB, UniqueMul A B a b
              Equations
              • =
              Equations
              • =
              Equations
              • =
              theorem UniqueSums.of_addHom {G : Type u} {H : Type v} [Add G] [Add H] (f : AddHom H G) (hf : ∀ ⦃a b c d : H⦄, a + b = c + df a = f c f b = f da = c b = d) [UniqueSums G] :
              theorem UniqueProds.of_mulHom {G : Type u} {H : Type v} [Mul G] [Mul H] (f : H →ₙ* G) (hf : ∀ ⦃a b c d : H⦄, a * b = c * df a = f c f b = f da = c b = d) [UniqueProds G] :
              theorem UniqueSums.of_injective_addHom {G : Type u} {H : Type v} [Add G] [Add H] (f : AddHom H G) (hf : Function.Injective f) :
              theorem UniqueProds.of_injective_mulHom {G : Type u} {H : Type v} [Mul G] [Mul H] (f : H →ₙ* G) (hf : Function.Injective f) :
              theorem AddEquiv.uniqueSums_iff {G : Type u} {H : Type v} [Add G] [Add H] (f : G ≃+ H) :

              UniqueSums is preserved under additive equivalences.

              theorem MulEquiv.uniqueProds_iff {G : Type u} {H : Type v} [Mul G] [Mul H] (f : G ≃* H) :

              UniqueProd is preserved under multiplicative equivalences.

              Equations
              • =
              Equations
              • =

              Two theorems in [Andrzej Strojnowski, A note on u.p. groups][Strojnowski1980]

              theorem UniqueSums.of_same {G : Type u_1} [AddSemigroup G] [IsCancelAdd G] (h : ∀ {A : Finset G}, A.Nonemptya1A, a2A, UniqueAdd A A a1 a2) :
              theorem UniqueProds.of_same {G : Type u_1} [Semigroup G] [IsCancelMul G] (h : ∀ {A : Finset G}, A.Nonemptya1A, a2A, UniqueMul A A a1 a2) :

              UniqueProds G says that for any two nonempty Finsets A and B in G, A × B contains a unique pair with the UniqueMul property. Strojnowski showed that if G is a group, then we only need to check this when A = B. Here we generalize the result to cancellative semigroups. Non-cancellative counterexample: the AddMonoid {0,1} with 1+1=1.

              If a group has UniqueProds, then it actually has TwoUniqueProds. For an example of a semigroup G embeddable into a group that has UniqueProds but not TwoUniqueProds, see Example 10.13 in [J. Okniński, Semigroup Algebras][Okninski1991].

              instance UniqueSums.instForall {ι : Type u_2} (G : ιType u_1) [(i : ι) → Add (G i)] [∀ (i : ι), UniqueSums (G i)] :
              UniqueSums ((i : ι) → G i)
              Equations
              • =
              instance UniqueProds.instForall {ι : Type u_2} (G : ιType u_1) [(i : ι) → Mul (G i)] [∀ (i : ι), UniqueProds (G i)] :
              UniqueProds ((i : ι) → G i)
              Equations
              • =
              instance UniqueSums.instSum {G : Type u} {H : Type v} [Add G] [Add H] [UniqueSums G] [UniqueSums H] :
              Equations
              • =
              instance UniqueProds.instProd {G : Type u} {H : Type v} [Mul G] [Mul H] [UniqueProds G] [UniqueProds H] :
              Equations
              • =
              instance instUniqueSumsDFinsupp {ι : Type u_2} (G : ιType u_1) [(i : ι) → AddZeroClass (G i)] [∀ (i : ι), UniqueSums (G i)] :
              UniqueSums (Π₀ (i : ι), G i)
              Equations
              • =
              instance instUniqueSumsFinsupp {ι : Type u_1} {G : Type u_2} [AddZeroClass G] [UniqueSums G] :
              Equations
              • =
              theorem TwoUniqueSums.of_addHom {G : Type u} {H : Type v} [Add G] [Add H] (f : AddHom H G) (hf : ∀ ⦃a b c d : H⦄, a + b = c + df a = f c f b = f da = c b = d) [TwoUniqueSums G] :
              theorem TwoUniqueProds.of_mulHom {G : Type u} {H : Type v} [Mul G] [Mul H] (f : H →ₙ* G) (hf : ∀ ⦃a b c d : H⦄, a * b = c * df a = f c f b = f da = c b = d) [TwoUniqueProds G] :
              theorem TwoUniqueSums.of_injective_addHom {G : Type u} {H : Type v} [Add G] [Add H] (f : AddHom H G) (hf : Function.Injective f) :
              theorem AddEquiv.twoUniqueSums_iff {G : Type u} {H : Type v} [Add G] [Add H] (f : G ≃+ H) :

              TwoUniqueSums is preserved under additive equivalences.

              theorem MulEquiv.twoUniqueProds_iff {G : Type u} {H : Type v} [Mul G] [Mul H] (f : G ≃* H) :

              TwoUniqueProd is preserved under multiplicative equivalences.

              instance TwoUniqueSums.instForall {ι : Type u_2} (G : ιType u_1) [(i : ι) → Add (G i)] [∀ (i : ι), TwoUniqueSums (G i)] :
              TwoUniqueSums ((i : ι) → G i)
              Equations
              • =
              instance TwoUniqueProds.instForall {ι : Type u_2} (G : ιType u_1) [(i : ι) → Mul (G i)] [∀ (i : ι), TwoUniqueProds (G i)] :
              TwoUniqueProds ((i : ι) → G i)
              Equations
              • =
              instance TwoUniqueSums.instSum {G : Type u} {H : Type v} [Add G] [Add H] [TwoUniqueSums G] [TwoUniqueSums H] :
              Equations
              • =
              instance TwoUniqueProds.instProd {G : Type u} {H : Type v} [Mul G] [Mul H] [TwoUniqueProds G] [TwoUniqueProds H] :
              Equations
              • =
              Equations
              • =
              @[instance 100]
              instance TwoUniqueSums.of_covariant_right {G : Type u} [Add G] [IsRightCancelAdd G] [LinearOrder G] [CovariantClass G G (fun (x1 x2 : G) => x1 + x2) fun (x1 x2 : G) => x1 < x2] :

              This instance asserts that if G has a right-cancellative addition, a linear order, and addition is strictly monotone w.r.t. the second argument, then G has TwoUniqueSums.

              Equations
              • =
              @[instance 100]
              instance TwoUniqueProds.of_covariant_right {G : Type u} [Mul G] [IsRightCancelMul G] [LinearOrder G] [CovariantClass G G (fun (x1 x2 : G) => x1 * x2) fun (x1 x2 : G) => x1 < x2] :

              This instance asserts that if G has a right-cancellative multiplication, a linear order, and multiplication is strictly monotone w.r.t. the second argument, then G has TwoUniqueProds.

              Equations
              • =
              @[instance 100]
              instance TwoUniqueSums.of_covariant_left {G : Type u} [Add G] [IsLeftCancelAdd G] [LinearOrder G] [CovariantClass G G (Function.swap fun (x1 x2 : G) => x1 + x2) fun (x1 x2 : G) => x1 < x2] :

              This instance asserts that if G has a left-cancellative addition, a linear order, and addition is strictly monotone w.r.t. the first argument, then G has TwoUniqueSums.

              Equations
              • =
              @[instance 100]
              instance TwoUniqueProds.of_covariant_left {G : Type u} [Mul G] [IsLeftCancelMul G] [LinearOrder G] [CovariantClass G G (Function.swap fun (x1 x2 : G) => x1 * x2) fun (x1 x2 : G) => x1 < x2] :

              This instance asserts that if G has a left-cancellative multiplication, a linear order, and multiplication is strictly monotone w.r.t. the first argument, then G has TwoUniqueProds.

              Equations
              • =
              @[deprecated UniqueProds.of_injective_mulHom]
              theorem UniqueProds.mulHom_image_of_injective {G : Type u} {H : Type v} [Mul G] [Mul H] (f : H →ₙ* G) (hf : Function.Injective f) :

              Alias of UniqueProds.of_injective_mulHom.

              @[deprecated UniqueSums.of_injective_addHom]
              theorem UniqueSums.addHom_image_of_injective {G : Type u} {H : Type v} [Add G] [Add H] (f : AddHom H G) (hf : Function.Injective f) :

              Alias of UniqueSums.of_injective_addHom.

              @[deprecated MulEquiv.uniqueProds_iff]
              theorem UniqueProds.mulHom_image_iff {G : Type u} {H : Type v} [Mul G] [Mul H] (f : G ≃* H) :

              Alias of MulEquiv.uniqueProds_iff.


              UniqueProd is preserved under multiplicative equivalences.

              @[deprecated AddEquiv.uniqueSums_iff]
              theorem UniqueSums.addHom_image_iff {G : Type u} {H : Type v} [Add G] [Add H] (f : G ≃+ H) :

              Alias of AddEquiv.uniqueSums_iff.


              UniqueSums is preserved under additive equivalences.

              @[deprecated TwoUniqueProds.of_injective_mulHom]

              Alias of TwoUniqueProds.of_injective_mulHom.

              @[deprecated TwoUniqueSums.of_injective_addHom]
              theorem TwoUniqueSums.addHom_image_of_injective {G : Type u} {H : Type v} [Add G] [Add H] (f : AddHom H G) (hf : Function.Injective f) :

              Alias of TwoUniqueSums.of_injective_addHom.

              @[deprecated MulEquiv.twoUniqueProds_iff]
              theorem TwoUniqueProds.mulHom_image_iff {G : Type u} {H : Type v} [Mul G] [Mul H] (f : G ≃* H) :

              Alias of MulEquiv.twoUniqueProds_iff.


              TwoUniqueProd is preserved under multiplicative equivalences.

              @[deprecated AddEquiv.twoUniqueSums_iff]
              theorem TwoUniqueSums.addHom_image_iff {G : Type u} {H : Type v} [Add G] [Add H] (f : G ≃+ H) :

              Alias of AddEquiv.twoUniqueSums_iff.


              TwoUniqueSums is preserved under additive equivalences.

              instance instTwoUniqueSumsDFinsupp {ι : Type u_2} (G : ιType u_1) [(i : ι) → AddZeroClass (G i)] [∀ (i : ι), TwoUniqueSums (G i)] :
              TwoUniqueSums (Π₀ (i : ι), G i)
              Equations
              • =
              instance instTwoUniqueSumsFinsupp {ι : Type u_1} {G : Type u_2} [AddZeroClass G] [TwoUniqueSums G] :
              Equations
              • =

              Any FreeMonoid has the TwoUniqueProds property.

              Equations
              • =

              Any FreeAddMonoid has the TwoUniqueSums property.

              Equations
              • =