1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
on-restart-benchmarks/tests/examples/quasigroup_qg5.mzn
Jip J. Dekker f2a1c4e389 Squashed 'software/mza/' content from commit f970a59b17
git-subtree-dir: software/mza
git-subtree-split: f970a59b177c13ca3dd8aaef8cc6681d83b7e813
2021-07-11 16:34:30 +10:00

67 lines
2.0 KiB
MiniZinc

% RUNS ON mzn20_fd
% RUNS ON mzn-fzn_fd
% RUNS ON mzn20_mip
%% Bennett quasigroup existence problem (QG5).
%%
%% A quasigroup is just a groupoid whose "multiplication table" is a
%% Latin square: each row and each column is a permutation of the
%% elements. Bennett's equation (not invented by Frank Bennett but
%% studied by him) is (yx.y)y = x which forces the quasigroup to have
%% interesting properties such as being orthogonal to certain of its
%% conjugates. Idempotent ones are more important than the others.
%%
%% Bennett quasigroups exist for all positive N except for 2, 6, 10
%% and with the possible exceptions of 14, 18, 26, 30, 38, 42 and 158.
%%
%% Idempotent ones exist for all positive N not in {2, 3, 4, 6, 9, 10,
%% 12, 13, 14, 15, 16} except possibly for N in {18, 20, 22, 24, 26,
%% 28, 30, 34, 38, 39, 42, 44, 46, 51, 52, 58, 60, 62, 66, 68, 70, 72,
%% 74, 75, 76, 86, 87, 90, 94, 96, 98, 99, 100, 102, 106, 108, 110,
%% 114, 116, 118, 122, 132, 142, 146, 154, 158, 164, 170, 174}
%%
%% The existence of smallish open problems makes this algebraic
%% question attractive from the viewpoint of automated reasoning and
%% constraint satisfaction.
%%
%% Reference:
%% F. E. Bennett
%% Quasigroups
%% C. J. Colbourn (ed)
%% The CRC Handbook of Combinatorial Designs
%% Chapter 36, pp .424-429.
include "globals.mzn";
int: N;
array[1..N,1..N] of var 1..N: q;
constraint
forall( x in 1..N )
( q[x, x] = x );
constraint
forall( x in 1..N )
( alldifferent([q[x,y] | y in 1..N]) );
constraint
forall( y in 1..N )
( alldifferent([q[x,y] | x in 1..N]) );
constraint
forall( x in 1..N )
( q[x, 1] < x + 2 );
constraint
forall( x in 1..N, y in 1..N )
( q[q[q[y, x], y], y] = x );
solve :: int_search(array1d(1..N*N, q), input_order, indomain, complete)
satisfy;
output ["Bennett quasigroup of size " ++ show(N) ++ ":\n"] ++
[ if y=1 then "\n " else " " endif ++ show(q[x,y]) | x,y in 1..N ] ++
[ "\n" ];
N = 5; % Solutions also exist for N=7, N=8 and N=11.