$ The quasiGroup existence problem (CSP lib problem 3) $ $ An m order quasigroup is an mxm multiplication table of integers 1..m, $ where each element occurrs exactly once in each row and column and certain $ multiplication axioms hold (in this case, we want axiom 4 to hold). $ $ by Ian Miguel ESSENCE' 1.0 given n : int(1..1000) letting nDomain be domain int(0..n-1) find quasiGroup : matrix indexed by [nDomain, nDomain] of nDomain find qgDiagonal : matrix indexed by [nDomain] of nDomain such that $ accessor for diagonal forall i : nDomain . qgDiagonal[i] = quasiGroup[i,i], $ All rows have to be different forall row : nDomain . allDifferent(quasiGroup[row,..]), $ All columns have to be different forall col : nDomain . allDifferent(quasiGroup[..,col]), $ (j*i)*(i*j) = i forall i : nDomain . forall j : nDomain . quasiGroup[quasiGroup[j,i],quasiGroup[i,j]] = i, $ Idempotency forall i : nDomain . (quasiGroup[i,i] = i), $ Implied (from Colton,Miguel 01) $ All-diff diagonal allDifferent(qgDiagonal), $ anti-Abelian forall i : nDomain . forall j : nDomain . (i != j) => (quasiGroup[i,j] != quasiGroup[j,i]), $ if (i*i)=j then (j*j) = i forall i : nDomain . forall j : nDomain . (quasiGroup[i,i]=j) => (quasiGroup[j,j]=i), $ Symmetry-breaking constraints forall i : nDomain . quasiGroup[i,n-1] + 2 >= i