Cancellative semigroup on a distributive lattice

Let $(S,\le)$ be a distributive lattice. Is there a semigroup structure on $S$ such that $S$ is cancellative and always $(x\wedge y)(x\vee y)=xy$?

• @user47958: do you check some lattices $L_n$ (of divisors of $n$)? – Sebastien Palcoux Sep 24 '14 at 13:14
• @SébastienPalcoux: The lattice of divisors of $n$ is a direct product of linear lattices. For linear lattices, the identity is vacuously true (as long as the semigroup is commutative, which it always has to be), so one can just take e.g. a cyclic group structure on each factor. – Emil Jeřábek Sep 24 '14 at 13:19
• Assuming your $\mathbb N$ doesn’t contain $0$ (otherwise multiplication is not cancellative), $(\mathbb N,|)$ is a direct sum of countably many linear lattices, and as such it has a group structure by the same argument: e.g., let $p_1^{a_1}\dots p_k^{a_k}*p_1^{b_1}\dots p_k^{b_k}=p_1^{f^{-1}(f(a_1)+f(a_2))}\dots p_k^{f^{-1}(f(a_k)+f(b_k))}$, where $f(a)=a/2$ for $a$ even, and $f(a)=-(1+a)/2$ for $a$ odd. Now, what is not clear to me is whether there is any cancellative semigroup structure on $(\mathbb N,|)$ when $\mathbb N$ includes $0$. – Emil Jeřábek Sep 24 '14 at 14:00
• Oh, there is: make $0$ a unit, and put $n*m=2nm$ for $n,m\ne0$. – Emil Jeřábek Sep 24 '14 at 14:29
• That’s an immediate consequence of the fact that every distributive lattice can be embedded in a Boolean algebra. (A Boolean algebra is also an abelian group, in fact, a commutative ring.) – Emil Jeřábek Sep 24 '14 at 18:34

Exhaustive search confirms that the 18-element lattice of down-sets of the poset $P=(\{a,b,c,u,v,w\},\{(a,u),(a,v),(b,u),(b,w),(c,v),(c,w)\})$ is a counterexample.

EDIT: I used an ad hoc C program for the check. The code is posted below, but let me first explain how it works.

Let $L$ be a finite distributive lattice. Since the condition in the OP forces the semigroup to be commutative, and finite cancellative semigroups are groups, the condition is equivalent to the existence of an abelian group $A$, and a bijective mapping $\mu\colon L\to A$ satisfying $$\tag{*}\mu(x)+\mu(y)=\mu(x\land y)+\mu(x\lor y),\qquad x,y\in L.$$ By subtracting $\mu(0)$ if necessary, we may assume without loss of generality $$\tag{{*}{*}}\mu(0)=0.$$ I will call a mapping $\mu$ satisfying $(*)$ and $(**)$ an $A$-valued measure on $L$. Now, how do such measures look like?

Let $(I,\le)$ be the Birkhoff dual of $L$, i.e., the poset of join-irreducible elements of $L$ under the induced order. $L$ is isomorphic to the lattice $D(I)$ of down-sets of $I$, wherefrom it is easy to see that for any sequence $\{a_i:i\in I\}$ of elements of $A$, $$\tag{{*}{*}{*}}\mu(x)=\sum_{i\le x}a_i$$ defines a measure on $L$. On the other hand, let $\mu$ be a measure, and define $$a_i=\mu(i)-\sum_{\substack{j\in I\\j<i}}a_j$$ by well-founded induction on $i\in I$. Let $\mu'$ be as in $(*{*}*)$. Then $\mu'$ is a measure on $L$ that coincides with $\mu$ on join-irreducible elements. It follows by induction that $\mu(x)=\mu'(x)$ for all $x\in L$: if $x\ne0$ is not join-irreducible, we can write it as $x=y\lor z$ with $y,z<x$, hence $$\mu(x)=\mu(y)+\mu(z)-\mu(y\land z)=\mu'(y)+\mu'(z)-\mu'(y\land z)=\mu'(x)$$ by the induction hypothesis. Thus, measures on $L$ are exactly the mappings of the form $(*{*}*)$.

In the particular case of $P$, the lattice $D(P)$ has 18 elements, and the only abelian groups of that size are $C_{18}$ and $C_6\times C_3$. The code below does a brute-force search for a sequence $\{a_i:i\in P\}$ such that the corresponding measure $\mu\colon D(P)\to A$ as in $(*{*}*)$ is injective; the choice of $A$ is controlled by uncommenting the appropriate definition of the A(x,y) macro (the first line implements addition in $C_{18}$, the second one in $C_6\times C_3$).

#include <stdio.h>
#include <assert.h>

#define N 18
#define A(x,y) ((x + y) % N)
// #define A(x,y) ((x + y - 3 * (((x % 3) + (y % 3)) >= 3)) % N)

#define TEST(s,x) { unsigned tmp = 1 << (x); if (tmp & s) { cnt++; continue; } s |= tmp; }

int main (void)
{
unsigned a, cnt = 0;
for (a = 1; a < N; a++) {
unsigned b, sa = 1;
TEST(sa, a);
for (b = 1; b < N; b++) {
unsigned c, sb = sa, ab = A(a, b);
TEST(sb, b);
TEST(sb, ab);
for (c = 1; c < N; c++) {
unsigned u, sc = sb, ac = A(a, c), bc = A(b, c), abc = A(ab, c);
TEST(sc, c);
TEST(sc, ac);
TEST(sc, bc);
TEST(sc, abc);
for (u = 1; u < N; u++) {
unsigned v, su = sc, abu = A(ab, u), abcu = A(abc, u);
TEST(su, abu);
TEST(su, abcu);
for (v = 1; v < N; v++) {
unsigned w, sv = su, acv = A(ac, v), abcv = A(abc, v), abcuv = A(abcu, v);
TEST(sv, acv);
TEST(sv, abcv);
TEST(sv, abcuv);
for (w = 1; w < N; w++) {
unsigned sw = sv, bcw = A(bc, w), abcw = A(abc, w), abcuw = A(abcu, w), abcvw = A(abcv, w), abcuvw = A(abcuv, w);
TEST(sw, bcw);
TEST(sw, abcw);
TEST(sw, abcuw);
TEST(sw, abcvw);
TEST(sw, abcuvw);
assert (sw == (1 << N) - 1);
printf ("%u,%u,%u;%u,%u,%u\n", a, b, c, u, v, w);
return 1;
}
}
}
}
}
}

printf ("no (%u)\n", cnt);
return 0;
}

• Do you mean that a computer program can check that it is really a counterexample? – user47958 Sep 26 '14 at 22:57
• Yes, exactly. I first tried to do it by hand with various tricks, but it got way too messy, and it turns out that a dumb computer search works like a charm. – Emil Jeřábek Sep 26 '14 at 23:07
• Which program did you use (gap, wolfram, etc)? Do I need to write a proram from scratch (eg with C++)? – user47958 Sep 26 '14 at 23:39
• @EmilJeřábek: respect! – Victor Sep 27 '14 at 5:22
• cpp.sh/4l2 – user47958 Sep 27 '14 at 14:11