PavlovskyВы следуете статье, в моей программе я выбрал аналогичный, но несколько иной вариант
Код:
for i:=0 to n-1 do for j:=0 to n-1 do
if not((i=0)and(j=0)) then
for k:=0 to n-1 do for l:=0 to n-1 do
s[i*n+k,j*n+l]:=p[s[k,l],p[i,(n-j)mod n]];
![$s[i,j]$ $s[i,j]$](https://dxdy-02.korotkov.co.uk/f/d/9/0/d90dc5c3325b7a938113776b57a6815682.png)
при

предварительно заполнен таблицей умножения. Дело в том, что в этом варианте не очень видна "свобода" (вместо

можно выбрать,например,

), которая выступает в
сопряженном варианте, повторю:
Код:
for i:=0 to n-1 do for j:=0 to n-1 do
if not((i=0)and(j=0)) then
for k:=0 to n-1 do for l:=0 to n-1 do
s[i*n+k,j*n+l]:=s[k,p[l,sq[i,j]]];
здесь выбор верхнего левого квадратика достаточно свободен (латинский квадрат).
Далее цепочка рассуждений:
Код:
i1,j1,k1,l1 i1,j2,k1,l2
i2,j1,k2,l1 i2,j2,k2,l2
s[k1,p[l1,sq[i1,j1]]] s[k1,p[l2,sq[i1,j2]]]
s[k2,p[l1,sq[i2,j1]]] s[k2,p[l2,sq[i2,j2]]]
если p[l1,sq[i1,j1]]=p[l2,sq[i1,j2]], то p[l1,sq[i2,j1]]<>p[l2,sq[i2,j2]]
т.е. можно положить
p[l1,sq[i1,j1]]+p[l2,sq[i2,j2]]-p[l1,sq[i2,j1]]-p[l2,sq[i2,j2]]<>0
т.к. p-операция сложения, то есть ассоциативность и получаем:
p[sq[i1,j1],sq[i2,j2]]]-p[sq[i2,j1],sq[i2,j2]]<>0
т.е. мы использовали ассоциативность и коммутативность сложения, а требование к умножению только одно.
Меня смущает одна вещь. При

удается использовать только часть таблицы "умножения", а далее использовать Г-достраивание.