PROPUS © Nickolay Balonin and Jennifer Seberry, 6.08.2014 Propus matrix catalogue and on-line algorithms

Definition. An Hadamard matrix H of order n is an n xn matrix with elements ±1 such that H^{T} H=HH^{T} =n I, where I – is the n xn identity matrix and T stands for transposition [1,2]. Propus [3] is a construction method for orthogonal ±1-matrices based on the array

where cells A, B=C, and D, satisfy AA^{T} +BB^{T} +CC^{T} +DD^{T} =cI, c – constant. Symmetric A (minimum) gives symmetric Hadamard matrices. This construction, based on symmetric circulant ±1-matrices, – good Propus . Common Propus is based on the turn of B=C and D.

Common Propusi have a system of holes. Mersenne line: v=4k-1, all n=4v=12, 28, 44, 60, .... do exists ! 2*n=24, 56, 88, 120, ... do not exist: main holes line are orders m=8(4*k-1)=24, 56, 88, 120, 152.... Odin line: q=4k-3, all n=2(q+1)=4, 12, 20, 28, .. do exist, for 2*n=8, 24!, 40, 56!, 72, 96!, 104, 120!.. every second order 24, 56, 96, 120.. do not exist: main holes line are orders m=8(4*k-1)=24, 56, 88, 120, 152.... Finite Golay lines: 1) Simple 2, 4, 8, 16, 32, 64 do exist, 128=32x4 Common! 2) 20, 40 (Common), 80 do exist, 160=40x4 Common! 3) Simple 52 and 104=26x4, 208 Common ! D-optimal lines: D-optimal design: 86 (158?) is the last symmetric solution, so 172 is the last Propus with it.

// NICK'S PROPUSI LIBRARY
n=20; NG=false; examples(n);
k1=0; k2=0; k3=0;
for (i=0;i<rows(a);i++) if (a[i]==-1) k1++;
for (i=0;i<rows(b);i++) if (b[i]==-1) k2++;
for (i=0;i<rows(d);i++) if (d[i]==-1) k3++;
puts('n='+n+' k1='+k1+' k2='+k2+' k3='+k3);
if (NG) {
A=negacirc(a); B=negacirc(b); D=negacirc(d); }else{
A=circ(a); B=circ(b); D=circ(d); }
H=Propus(A,B,D); plots(H);
{{I=H'*H}} putm(I); // putm(H);
function examples(n) {
if (n==4) { // GOOD A=D
a=[-1]; b=[1]; d=[-1];
}
if (n==8) { // GOOD A=D
a=[1,-1]; b=[1,1]; d=[1,-1];
}
if (n==12) { // GOODD // d=a, d[0]=-a[0]
a=[1,1,1]; b=[-1,1,1]; d=[-1,1,1];
}
if (n==16) { // GOOD A=D
a=[-1,1,1,1]; b=[-1,1,1,1]; d=[-1,1,1,1];
}
if (n==20) { // GOODD
a=[1,1,-1,-1,1]; b=[-1,1,1,1,1]; d=[-1,1,-1,-1,1];
}
// *** 24 !
if (n==24) { // W(24,22) GOODD
// n=24 s=4 h/hmin=1.04/1 max=0 tick=5 IS=3,3,3
a=[1,1,1,-1,1,1];
b=[0,-1,1,1,1,-1];
d=[-1,1,1,-1,1,1];
if (NG) {
// n=24 s=4 h/hmin=1/1 max=4 tick=106
a=[1,-1,-1,1,1,-1];
b=[-1,-1,1,-1,1,1];
d=[-1,-1,1,-1,1,1];
}}
if (n==28) { // GOODD
// n=28 s=4 h/hmin=1/1 max=0 tick=2 IS=4,4,4
a=[1,-1,1,-1,-1,1,-1];
b=[1,1,1,-1,-1,1,1];
d=[-1,-1,1,-1,-1,1,-1];
}
if (n==32) { // GOOD A=D !
// n=32 s=2 h/hmin=1/1 max=8 tick=46 IS=4,4,4
a=[1,-1,1,1,1,1,1,-1];
b=[-1,-1,1,1,-1,1,1,-1];
d=[1,-1,1,1,1,1,1,-1];
}
if (n==36) { // GOODD
// n=36 s=2 h/hmin=1/1 max=4 tick=77 IS=5,5,5
a=[1,-1,1,1,1,1,1,1,-1];
b=[-1,1,-1,-1,1,1,-1,-1,1];
d=[-1,-1,1,1,1,1,1,1,-1];
}
// *** 40 !
if (n==40) { // W(40,38) GOODD
// n=40 s=4 h/hmin=1.03/1 max=0 tick=14 IS=5,5,5
a=[1,-1,1,-1,-1,1,-1,-1,1,-1];
b=[0,-1,-1,-1,1,1,1,-1,-1,-1];
d=[-1,-1,1,-1,-1,1,-1,-1,1,-1];
if (NG) {
// n=40 s=4 h/hmin=1.04/1.04 max=4 tick=1121
a=[-1,1,-1,-1,-1,-1,-1,-1,1,-1];
b=[-1,-1,-1,1,-1,-1,1,-1,-1,-1];
d=[1,-1,-1,1,1,1,1,-1,-1,1];
// n=40 s=4 h/hmin=1/1 max=8 tick=20
a=[-1,1,1,-1,-1,1,-1,1,1,-1];
b=[1,1,-1,1,-1,-1,-1,1,1,-1];
d=[1,1,-1,1,-1,-1,-1,-1,-1,-1];
}}
// *** 44 !
if (n==48) { // GOOD
// n=48 s=2 h/hmin=1.01/1.01 max=8 tick=46
a=[-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1];
b=[-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1];
d=[-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1];
}
if (n==52) { // GOODD
// n=52 s=5 h/hmin=1.02/1.02 max=8 tick=106 IS=7,7,7
a=[1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1];
b=[1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1];
d=[-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1];
}
// *** 56 !
if (n==56) { // W(56,54) GOODD
// n=56 s=4 h/hmin=1.02/1.02 max=0 tick=1 IS=7,7,7
a=[1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1];
b=[0,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1];
d=[-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1];
}
if (n==60) { // GOODD
// n=60 s=2 h/hmin=1/1 max=8 tick=750 IS=8,8,8
a=[1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1];
b=[-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1];
d=[-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1];
}
if (n==64) { // GOOD A=D
// tick=27 h=1 max=8 n=64 IS=8,8,8
a=[1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1];
b=[1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1];
d=[1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1];
// n=64 s=2 h/hmin=1/1 max=4 tick=29 IS=8,8,8
a=[-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1];
b=[-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1];
d=[-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1];
}
// *** 68 !
// *** 72 !
if (n==72) { // W(72,70) GOODD
// n=72 s=4 h/hmin=1.05/1.03 max=8 tick=19100 IS=9,9,9
a=[1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1];
b=[0,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1];
d=[-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1];
}
if (n==76) { // GOODD
a=[1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1];
b=[-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1];
d=[-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1];
// n=76 p=37 r=2 Lim=0; tick=50 x1=[20,12]; x2=[25,22];
a=[1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1];
b=[1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1];
c=[1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1];
d=[1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1];
d=minp(d);
}
if (n==80) { // GOOD
a=[-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1];
b=[-1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1];
d=[1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1];
// n=80 s=4 h/hmin=1.03/1.03 max=12 tick=56 IS=10,10,10
a=[-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1];
b=[1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1];
d=[1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1];
}
if (n==84) { // GOODD
a=[1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1];
b=[-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1];
d=[-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1];
// n=84 p=41 r=3 Lim=0; tick=16 x1=[24,35]; x2=[18,25];
a=[1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1];
b=[-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1];
d=[1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1];
if (0) {
// W(84,82) GOODD
// n=84 s=4 h/hmin=1.04/1.04 max=12 tick=537 IS=11,11,11
a=[-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1];
b=[0,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1];
d=[1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1];
d=minp(d);
}}
// *** 88 !
// *** 92 !
// *** 96 !
if (n==100) { // GOODD
a=[1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1];
b=[-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1];
d=[-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1];
// n=100 s=4 h/hmin=1/1 max=16 tick=2780 IS=13,13,13
a=[1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1];
b=[-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,1];
d=[-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1];
}
if (n==104) { // W(104,102) GOODD
// n=104 s=4 h/hmin=1.01/1.01 max=0 tick=3765 IS=13,13,13
a=[1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1];
b=[0,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1];
d=[-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1];
}
if (n==108) { // GOODD
// n=108 s=4 h/hmin=1/1 max=16 tick=1384 IS=14,14,14
a=[1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1];
b=[1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1];
d=[-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1];
// n=108 p=53 r=3 Lim=0; tick=112 x1=[32,48]; x2=[25,42];
a=[1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1];
b=[1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1];
d=[1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1];
}
if (n==112) { // GOODD
// n=112 s=4 h/hmin=1.02/1.02 max=16 tick=27 IS=14,14,14
a=[-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1];
b=[1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1];
d=[1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1];
}
// *** ! 116
// *** ! 120
if (n==124) { // GOODD
// n=124 p=61 r=2 Lim=0; tick=8 x1=[29,28]; x2=[19,52];
a=[1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1];
b=[1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1];
d=[1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1];
d=minp(d);
}
if (n==128) { // GOODD D = A
if (0) { // ERR
// n=128 s=4 h/hmin=1.02/1.02 max=16 tick=1509 IS=10,2,10 NON
a=[1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1];
b=[1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1];
d=[1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1];
}}
if (n==148) { // GOODD- D = A
a=[1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1];
b=[-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1];
d=[-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1];
}
if (n==164) {
// n=164 p=81 r=1 Error=0; tick=2
// x1=[2,0,2,1,1,0,0,1]; x2=[1,2,1,1,1,1,1,0];
a=[1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1];
b=[-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1];
d=[1,1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1];
}
if (n==180) {
// n=180 p=89 r=3 Lim=0; tick=34 x1=[49,31]; x2=[12,53];
a=[1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1];
b=[-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1];
d=[1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1];
}
if (n==196) {
a=[-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1];
b=[1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1];
d=[1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1];
}
if (n==204) {
// n=204 p=101 r=3 Lim=0; tick=236 x1=[57,55]; x2=[17,97];
a=[1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1];
b=[1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1];
d=[1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1];
}
if (n==220) {
// n=220 p=109 r=2 Lim=0; tick=30 x1=[47,21]; x2=[4,33];
a=[1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1];
b=[1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1];
d=[1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1];
}
if (n==228) {
// n=228 p=113 r=3 Lim=0; tick=30 x1=[78,44]; x2=[53,86];
a=[1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1];
b=[-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1];
d=[1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1];
}
if (n==244) { // GOODD- C 122 -> P244 admin
a=[1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1];
b=[1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1];
d=[-1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,-1];
}
if (n==252) { // GOODD- C 126 -> P252 admin
a=[1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1];
b=[1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1];
d=[-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1];
}
if (n==276) { // GOODD- C 138 -> P276 admin
// n=138 p=137 r=3 Lim=0; tick=0
a=[1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1];
b=[1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1];
d=[-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1];
// n=276 p=137 r=3 Lim=0; tick=110 x1=[54,101]; x2=[16,102];
a=[1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1];
b=[-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1];
d=[1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1];
d=minp(d);
}
if (n==300) {
// n=300 p=149 r=3 Lim=0; tick=292 x1=[15,96]; x2=[104,10];
a=[1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1];
b=[1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1];
d=[-1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1];
}
if (n==316) {
// n=316 p=157 r=2 Lim=0; tick=0 x1=[150,64]; x2=[58,8];
a=[1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1];
b=[1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1];
d=[-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1];
}
if (n==340) { // GOODD- C 170 -> P340 admin
// n=170 p=169 r=2 Lim=0; tick=0
a=[1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1];
b=[1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1];
d=[-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1];
}
if (n==348) {
// n=348 p=173 r=3 Lim=0; tick=404 x1=[135,43]; x2=[93,45];
a=[1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1];
b=[1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1];
d=[-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1];
}
if (n==364) {
// n=364 p=181 r=2 Lim=0; tick=208 x1=[9,21]; x2=[69,161];
a=[1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1];
b=[1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1];
d=[-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1];
}
if (n==396) {
// n=396 p=197 r=3 Lim=0; tick=72 x1=[43,47]; x2=[89,166];
a=[1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1];
b=[1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1];
d=[-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1];
}
}
function Propus(A,B,D) {
var MA,MB,MD;
MA=minp(A); MB=minp(B); MD=minp(D);
H11=square(A,B,B,D); H12=square(B,D,MA,MB);
H21=square(B,MA,D,MB); H22=square(MD,B,B,MA);
return square(H11,H12,H21,H22);
}

// INTEGER EQUATION SOLVER
n=68; v=n/4;
for (x=v%2;x<v;x+=2)
for (y=v%2;y<v;y+=2)
for (z=v%2;z<v;z+=2) if (x*x+2*y*y+z*z==n) {
k1=(v-x)/2; k2=(v-y)/2; k3=(v-z)/2;
puts("if n="+n+", k1="+k1+"; k2="+k2+"; k3="+k3+"; end");
}

// SIMPLE ORDERS
// 4, 12, [20], 28, 36, [52], 60, 76, 84, [100], 108, 124, 148 (тайна, не ловится!), [164], 180, 196, 204, 220, 228, [244], [252], 276, 300, 316, [340], 348, 364, 388, 396, 460, 468, 484, 516 ...
for (i=0;i<70;i++) { q=4*i+1;
if (isPrime(q)) puts("q="+q+" 2(q+1)="+(2*q+2)); }
// SIMPLE SQUARES
for (i=0;i<70;i++) { q=4*i+1; q2=sqrt(q);
if (round(q2)==q2) if (isPrime(q2))
puts("q*q="+q+" 2(q+1)="+(2*q+2)); }
// SIMPLE CUBES
for (i=5;i<6;i++) if (isPrime(i)) {
q=i*i*i; puts("q*q*q="+q+" 2(q+1)="+(2*q+2)); }
// AND
q=3*3*3*3; puts("q*q*q*q="+q+" 2(q+1)="+(2*q+2));
function isPrime(x) {
for (var i=2;i<x;i++) if (x%i==0) return false;
return true;
}

// PROPUS COLOR TABLE
OpenCanvas('S',520,140);
S.clear(); initMatrix(); S.setFont('Calibri',10);
for (i=0;i<rows(A);i++) { puts(A[i]);
for (j=0;j<cols(A);j++) {
S.setColor('#222222');
x=6; y=j*4; if (y>9) x=3; if ((y>95)||(i>0)) x=0;
S.drawString((j+1)*4+112*i,30+x+16*j,40+20*i);
if (A[i][j].indexOf('C')+1) S.setColor('#FF0000');
if (A[i][j].indexOf('D')+1) S.setColor('#FFFF00');
if (A[i][j].indexOf('U')+1) S.setColor('#00FF00');
if (A[i][j].indexOf('S')+1) S.setColor('#0000FF');
if (A[i][j].indexOf('G')+1) S.setColor('#FF00FF');
S.fillRect(30+16*j,50+i*20,15,10);
}}
S.paint();
function initMatrix() {
A=[["4S2","8S2","12S","16S","20S10","-24X","28S","32S2","36S","40CD10","44C","48S","52S13","-56X","60S","64S2","68C","72CD","76S","80S10","84S","-88X","92C","96CD","100S","104CD","108S","112S"],["116C","-120X","124S","128CD","132C","136CD","140C","144CD","148S","-152X","156C","160CD","164S","168CD","172C","176CD","180S","-184X","188C","192CD","196S","200CD","204S","208CD","212C","-216X","220S","224CD"],["228S","232CD","236C","240CD","244S","-248X","252S","256CD","260C","264CD","268C","272CD","276S","-280X","284C","288CD","292C","296CD","300S","304CD","308C","-312X","316S","320CD","324C","328CD","332C","336CD"]];
}

Start Orders: 4, 8!, 12, 16! are Simple Propusi !
20=10×2 Simple Propus !
** 24=12×2 is the first HOLE !
28=14×2 Simple Propus
32! THE LAST A=B=C=D Simple Propus !
36=18×2 Simple Propus
* 40=20×2 Common Propus Both Sym A, D !!
* 44=11×4 Common Propus
48=24×2 Simple Propus
52 is Simple Propus
** 56=24+32 is HOLE !
60 is Simple Propus
64! is THE LAST twin Propus 8, 16, 32, 64 A=D, B=D
* 68 Common Propus, MAX DET-alg/ Galois-procedure
* 72 Common Propus, MAX DET-alg/ Galois-procedure
76, 80!, 84 are Simple Propusi
*** 88=56+32=96-8 is HOLE !
* 92 Common Propus two-symmetric !
* 96=24×4 is Common !
100=50×2 Simple Propus, MAX DET-alg/ Galois-procedure
==========================================================
* 104=96+8 is Common two-symmetric!
108=54×2 Simple Propus, MAX DET-alg/ Galois-procedure
112=56×2 Simple Propus, MAX DET-alg !
* 116=58×2 Common Propus (with Olivia, rare)
*** 120=88+32 is HOLE !
124=62×2 Simple Propus/ Galois-procedure
* 128 is Common two-symmetric!
* 132=66×2 Common Propus
** 136=68×2 is Common two-symmetric!
* 140=70*2 Common Propus
** 144=72×2 is Common two-symmetric!
148=74×2 Simple Propus
** 152=120+32 is HOLE !
* 156=78×2=4x39 Common Propus
** 160=40×4 is Common two-symmetric!
164=82×2 Simple Propus
** 168 is Common two-symmetric! (fork 160-168-176)
* 172=86*2 Common Propus (with Olivia)
** 176=88×2 is Common two-symmetric?!
180=90×2 Simple Propus
** 184=152+32 is HOLE !
* 188=94×2 Common Propus
** 192=96×2 is Common two-symmetric?!
196=98×2 Simple Propus
** 200 is Common two-symmetric?!
================================================
204=102×2 Simple Propus by C102 Paley
** 208=104×2=192+16 is Common two-symmetric?!
* 212 Common Propus
** 216=184+32=224-8 is HOLE !
220 Simple Propus by C110 Paley
** 224=56×4 is Common two-symmetric?!
228 Simple Propus by C114 Paley
** 232=224+8 is Common two-symmetric ?!
* 236=220+16 Common Propus!? by Max Det 118 (not Paley)
** 240 is is Common two-symmetric?!
244 Simple Propus by C122 Paley
** 248=216+32 is HOLE !
* 252=236+16 Simple Propus by C126 Paley
** 256 is is Common two-symmetric?!
* 260 is Common Propus
** 264 is is Common two-symmetric?!
268=252+16 Common Propus (not Paley)
** 272 is Common two-symmetric?! (not Paley)
276 Simple Propus by C138
** 280=248+32 is HOLE !
* 284=268+16 Common Propus (not Paley)
** 288 is Common two-symmetric?!
* 292 Common Propus (not Paley)
** 296 is Common two-symmetric?!
300=284+16 Simple Propus by C150 Paley
================================================
** 304 is Common two-symmetric?!
* 308 Common Propus
** 312=280+32 is HOLE !
316=300+16 Simple Propus (MAX DET 158?)
** 320 is Common two-symmetric?!
324 Common Propus
** 328 is Common two-symmetric?!
* 332 Common Propus
** 336 is Common two-symmetric?!
340 is Simple Propus
** 344=312+32=352-8 is HOLE !
348=332+16 Simple Propus
** 352=88×4 is Common two-symmetric?!
356 Common Propus
** 360=352+8 is Common two-symmetric?!
364=348+16 Simple Propus
** 368 is Common two-symmetric?!
372 is Common Propus
** 378 is HOLE !
380=364+16 Common Propus
** 384 is Common two-symmetric?!
388 is Simple Propus
** 392 is Common two-symmetric?!
396=380+16 Simple Propus
** 400 is Common two-symmetric?!
========================
* 404 is Common Propus
** 408 is HOLE !
* 412 is Common Propus
408=376+32 is Common two-symmetric?!
...
* 492 Common Propus
* 500 Common Propus
===================
* 668 Common Propus

// GALOIS FIELDS PROCEDURE:
if (tick==0) { n=76;
Flg0=false; GP=false; // COMMON PROPUS
Flgalp=true; Flg1N=n%4!=0; Flg1N=false;
Fphase=true; Maxphase=2; FlgP2=true;
FlgTyp=true; M=10000; R=true; tuning();
}
for (k=0;k<10;k++)
if (R) { setphases();
// ROOTS
x1=gfrand(); x2=equal(x1); getab(x1,p);
if (Flg1N) {
a2=equal(a); b2=equal(b); if (Flg0) a2[0]=0;
}else{
a=a.concat(b); a2=ab2a(a); if (Flg0) a2[0]=0; // a2[v]=0;
x2=gfrand(); getab(x2,p);
a=a.concat(b); b2=ab2a(a); if (Flg0) b2[0]=0; // b2[v]=0;
}
// b2[0]=0;
A=negacirc(a2); B=negacirc(b2);
H=twocircul(A,B); // H=ab2a(H); // N1
m=maxabslsm(H);
if (M>=m) { M=m; if (M==0) R=false;
X1=x1; X2=x2; }
}
// INFORMATION
puts("n="+n+" p="+p+" r="+GFr+" Lim="+M+"; tick="+tick);
// puts("x1=["+X1+"]; x2=["+X2+"];");
// RESTART
if (M>0) {
FlgP2=!FlgP2; tuning();
restart(0) }else{ // FINISH
puts("x1=["+x1+"];"+" x2=["+x2+"];");
puts("a=["+a2+"];"); puts("b=["+b2+"];");
if (1) {
A2=a2ab(A); B2=a2ab(B); Z=eyez(n/4);
S=square(A2); A=S[0]; B=S[1]; C=S[2]; D=S[3];
{{ A=Z*A*Z; B=Z*B*Z; }} // C=Z*C*Z; D=Z*D*Z;
a=A[0]; b=B[0]; b=circshiftback(b,(rows(b)-1)/2);
S=square(B2); A=S[0]; B=S[1]; C=S[2]; D=S[3];
{{ A=Z*A*Z; B=Z*B*Z; }} // C=Z*C*Z; D=Z*D*Z;
c=A[0]; d=B[0]; d=circshiftback(d,(rows(d)-1)/2);
analysis(); // b[0]=0;
if (n%8!=0) {
a=setmaxis(a); b=setmaxis(b); d=setmaxis(d);
IS1=getis(a); IS2=getis(b); IS3=getis(d);
puts('IS='+IS1+','+IS2+','+IS3);
}
putm("a=["+a+"];"); putm("b=["+b+"];"); putm("d=["+d+"];");
// putm("c=["+c+"];"); C=circ(c);
A=circ(a); B=circ(b); D=circ(d);
if (GP) { H=CommonPropus(A,B,D); }else{ H=Propus(A,B,D); }}
{{I=H'*H}} putm(I); putm(H); // H=ab2a(H);
plots(H); sound("5th.wav");
}
function tuning() { p=n; law=n/2;
if (Flg1N) { if (FlgP2) { p=2*p; law=2*law;}
}else{ if (FlgP2) { p=p/2; law=round(law/2); }}
lau=4*law; p=p-1; gfinit(p,2); if (p==27) gfinit(3,6);
v=n/4; v4=v; if (Flg1N) v=n/2; v1=v-1; v2=2*v; v41=v4-1;
setphases(); Z=eyez(v); vs=v1/2; // !!!!!
}
function setphases() {
pha=0; phu=0; phw=1; if ((p+1)%4!=0) phw=2;
if (!Fphase) phw=randint(Maxphase);
pwu=lau+phu; pww=law-phw; pwa=law+pha;
}
function getab(x,p) {
var i,i2,u,w,U,W,W1,W2;
a=one(v); b=one(v); i2=0;
u=gfpow(x,pwu); U=gfexp(u,v1);
w=gfpow(x,pww); W=gfexp(w,v2);
if (Flgalp) { alp=gfpow(x,pwa); W=gfmul(alp,W); }
for (i=0;i<v;i++) {
W1=W[i2]; i2++; W2=W[i2]; i2++;
if (gfeq(gfadd(W1,gfpow(W1,p)),U)) a[i]=-1;
if (gfeq(gfadd(W2,gfpow(W2,p)),U)) b[i]=-1;
}}
function analysis() {
var ERR; ERR=false;
if (maxabs(sub(b,c))>0) {
if (maxabs(sub(b,d))==0) { d=equal(c); }else{
if (maxabs(sub(c,d))==0) { d=equal(b); b=equal(c); }else{
if (maxabs(sub(a,b))==0) { a=equal(c); }else{
if (maxabs(sub(a,c))==0) { a=equal(b); b=equal(a); }else{
if (maxabs(sub(a,d))==0) { a=equal(b); b=equal(d);
d=equal(c); }else{ ERR=true; puts("PROBLEM MATRIX");
}}}}}}
d2=minp(d);
if (abs(sum(add(a,d)))<abs(sum(add(a,d2)))) d=equal(d2);
return ERR;
}
function Propus(A,B,D) {
var MA,MB,MD;
MA=minp(A); MB=minp(B); MD=minp(D);
H11=square(A,B,B,D); H12=square(B,D,MA,MB);
H21=square(B,MA,D,MB); H22=square(MD,B,B,MA);
return square(H11,H12,H21,H22);
}
function CommonPropus(A,B,D) {
var H11,H12,H21,H22,TB,TD,BR,DR,TBR,TDR,MA,MTBR,MTDR;
TB=tr(B); TD=tr(D); BR=flip(B);
DR=flip(D); TBR=flip(TB); TDR=flip(TD);
MA=minp(A); MTBR=minp(TBR); MTDR=minp(TDR);
H11=square(A,BR,BR,TDR); H12=square(BR,DR,MA,MTBR);
H21=square(BR,MA,DR,MTBR); H22=square(MTDR,TBR,TBR,MA);
return square(H11,H12,H21,H22);
}
function getis(a) {
// get index of symmetry
var i,v,F,IS; v=rows(a); F=true; IS=1;
for (i=1;i<=round(v/2);i++) if (F) { IS=i; F=a[i]==a[v-i]; }
return IS;
}
function setmaxis(x) {
// set maximal index of symmetry
var i,v,a,b,F,IS,ISM;
a=equal(x); b=equal(x); ISM=getis(a); v=rows(a);
for (i=1;i<v;i++) { a=circshift(a);
IS=getis(a); if (IS>ISM) { b=equal(a); ISM=IS;}}
return b;
}

// GALOIS FIELD PROCEDURE: 4 CELLS
if (tick==0) { n=20;
Flg1N=n%4!=0; Flg1N=false; // type of symmetry
Fphase=true; Maxphase=2; FlgP2=false;
Flgalp=true; M=10000; R=true; tuning();
}
for (k=0;k<10;k++)
if (R) { setphases();
// ROOTS
x1=gfrand(); // x1=[41,14]; // 44
x2=equal(x1); getab(x1,p);
if (Flg1N) {
b=a2ab(b); d=rowcol(b,v4,v1); c=rowcol(b,0,v41);
a=a2ab(a); b=rowcol(a,v4,v1); a=rowcol(a,0,v41);
// a[0]=0; // b[0]=0;
}else{
c=equal(a); d=equal(b);
x1=gfrand(); // x1=[5,3]; // 44
getab(x1,p);
// a[0]=0; // a[v]=0; // b[0]=0; // b[v]=0;
}
// {{a=Z*a; b=Z*b; c=Z*c; d=Z*d}}
// b=circshiftback(b,vs); // c=circshiftback(d,vs);
// b[0]=0;
// c=equal(b);
A=negacirc(a); B=negacirc(b); // C=negacirc(c);
D=negacirc(d);
// H=twocircul(A,B);
// H=GoethalsSeidel(A,B,C,D);
H=Propus(A,B,D);
m=maxabslsm(H);
if (M>=m) { M=m; if (M==0) R=false; X1=x1; X2=x2; }
}
// INFORMATION
puts("n="+n+" p="+p+" r="+GFr+" Lim="+M+"; tick="+tick);
// puts("x1=["+X1+"]; x2=["+X2+"];");
// RESTART
if (M>0) {
//////////////////////
FlgP2=!FlgP2; tuning();
restart(0) }else{ // FINISH
text="pha="+pha+"; phu="+phu+"; phw="+phw+";"; puts(text);
puts("x1=["+x1+"];"+" x2=["+x2+"];"); Z=eyez(rows(a));
{{a=Z*a; b=Z*b; c=Z*c; d=Z*d;}}
if (n%8!=0) {
a=setmaxis(a); b=setmaxis(b); d=setmaxis(d);
IS1=getis(a); IS2=getis(b); IS3=getis(d);
puts('IS='+IS1+','+IS2+','+IS3);
}
d2=minp(d);
if (abs(sum(add(a,d)))<abs(sum(add(a,d2)))) d=equal(d2);
puts("a=["+a+"];"); puts("b=["+b+"];");
puts("c=["+c+"];"); puts("d=["+d+"];");
A=circ(a); B=circ(b); C=circ(c); D=circ(d);
H=Propus(A,B,D);
// H=williamson(a,b);
{{I=H'*H}} putm(I); putm(H); // H=ab2a(H);
plots(H,"XR"); sound("5th.wav");
}
function tuning() { p=n; law=n/2;
if (Flg1N) { if (FlgP2) { p=2*p; law=2*law;}
}else{ if (FlgP2) { p=p/2; law=round(law/2); }}
lau=4*law; p=p-1; gfinit(p,2); if (p==27) gfinit(3,6);
v=n/4; v4=v; if (Flg1N) v=n/2; v1=v-1; v2=2*v; v41=v4-1;
setphases(); Z=eyez(v); vs=v1/2; // !!!!!
}
function setphases() {
pha=0; phu=0; phw=1; if ((p+1)%4!=0) phw=2;
if (!Fphase) phw=randint(Maxphase);
pwu=lau+phu; pww=law-phw; pwa=law+pha;
}
function getab(x,p) {
var i,i2,u,w,U,W,W1,W2;
a=one(v); b=one(v); i2=0;
u=gfpow(x,pwu); U=gfexp(u,v1);
w=gfpow(x,pww); W=gfexp(w,v2);
if (Flgalp) { alp=gfpow(x,pwa); W=gfmul(alp,W); }
for (i=0;i<v;i++) {
W1=W[i2]; i2++; W2=W[i2]; i2++;
if (gfeq(gfadd(W1,gfpow(W1,p)),U)) a[i]=-1;
if (gfeq(gfadd(W2,gfpow(W2,p)),U)) b[i]=-1;
}}
function Propus(A,B,D) {
var MA,MB,MD;
MA=minp(A); MB=minp(B); MD=minp(D);
H11=square(A,B,B,D); H12=square(B,D,MA,MB);
H21=square(B,MA,D,MB); H22=square(MD,B,B,MA);
return square(H11,H12,H21,H22);
}
function GoethalsSeidel(A,B,C,D) {
var TB,TC,TD,BR,CR,DR,TBR,TCR,TDR;
TB=tr(B); TC=tr(C); TD=tr(D);
BR=flip(B); CR=flip(C); DR=flip(D);
TBR=flip(TB); TDR=flip(TD); TCR=flip(TC);
var H11=square(A,BR,mul(-1,BR),A);
var H12=square(CR,DR,TDR,mul(-1,TCR));
var H21=square(mul(-1,CR),mul(-1,TDR),mul(-1,DR),TCR);
var H22=square(A,TBR,mul(-1,TBR),A);
var H=square(H11,H12,H21,H22);
return H;
}
function GP2(A,B,D) { // GOOD PROPUS
var H11,H12,H21,H22,TB,TD,BR,DR,TBR,TDR,MA,MTBR,MTDR;
TB=tr(B); TD=tr(D); BR=flip(B);
DR=flip(D); TBR=flip(TB); TDR=flip(TD);
MA=minp(A); MTBR=minp(TBR); MTDR=minp(TDR);
H11=square(A,BR,BR,TDR); H12=square(BR,DR,MA,MTBR);
H21=square(BR,MA,DR,MTBR); H22=square(MTDR,TBR,TBR,MA);
return square(H11,H12,H21,H22);
}
function getis(a) {
// get index of symmetry
var i,v,F,IS; v=rows(a); F=true; IS=1;
for (i=1;i<=round(v/2);i++) if (F) { IS=i; F=a[i]==a[v-i]; }
return IS;
}
function setmaxis(x) {
// set maximal index of symmetry
var i,v,a,b,F,IS,ISM;
a=equal(x); b=equal(x); ISM=getis(a); v=rows(a);
for (i=1;i<v;i++) { a=circshift(a);
IS=getis(a); if (IS>ISM) { b=equal(a); ISM=IS;}}
return b;
}
We observe three methods to find propus-Hadamard matrices: using Williamson matrices , D-optimal designs , Dragomir's and Nick's computer algorithms. Many delightful visual images are included. The special orders n <100 are: n =92 inside the D-optimal design family (case m =23 has no symmetric A, there is other symmetric Propus: Dragomir's page ) and the Common family with special cases: n =88 (non Propus?), 92 (Dragomir's page ), 96 (non Propus?); n =16*k with cells of even orders resolvable as weighing matrices. Look: regular Propus matrices. There is also the possibility that this propus construction may lead to some insight into the existence or non-existence of symmetric conference matrices for some orders.

DOUBLE PROPUS A=–D, B=C GET MORE MATRICES BY WILLIAMSON MATRICES Propus H_{12} and H_{28} Propus H_{36} and H_{60} FAMILY: A=Q+I, C=B, D=Q–I Propus H_{20} and H_{52} GOOD PROPUS BY D-OPTIMAL DESIGN D-optimal design X_{6} and Propus H_{12} D-optimal design X_{14} and Propus H_{28} D-optimal design X_{38} and Propus H_{76} FINITE FAMILY Propus H_{12} and H_{28} (B=C=D rich structure) BY CONFERENCE MATRICES Conference matrix C_{10} and Propus H_{20} Conference matrix C_{26} and Propus H_{52} WITH Q+I, Q–I AND MAX DET BLOCK B=X_{5} or B=X_{13} Conference matrix C_{10} and Propus H_{20} Conference matrix C_{26} and Propus H_{52} EVEN CELLS Propus matrices H_{16} and H_{32}

if (tick==0) {
n=20; v=n/4; m=(v-1)/2; q=2*v+1; // m=2; v=2*m+1;
if (q==27) { gfinit(3,3); }else{ gfinit(q); }
FD=1; FW=-1;
}
F=1; FD=-FD; if (FD==1) FW=-FW;
while (F==1) { x1=gfrand();
Q=gfexp(x1,2,v); // putm("Q="+Q);
M=gfadd(GFe,Q); // putm("Q+1="+M);
// N=gfsub(GFe,Q); putm("Q-1="+N);
a=minp(gfeq(M,Q)); F=rows(a);
}
F=1;
while (F==1) { x2=gfrand();
Q=gfexp(x2,2,v); // putm("Q="+Q);
M=gfadd(GFe,Q); // putm("Q+1="+M);
// N=gfsub(GFe,Q); putm("Q-1="+N);
b=minp(gfeq(M,Q)); F=rows(b);
}
d=equal(a);
if (FD==1) d[0]=-d[0]; if (FW==1) b[0]=0;
puts("n="+n+" q="+q+" x1="+x1+" x2="+x2);
A=circ(a); B=circ(b); D=circ(d);
H=Propus(A,B,D); m=maxabslsm(H);
if (m>0) { restart(0);
}else{
puts("A=["+a2ds(a)+"];");
puts("B=["+a2ds(b)+"];");
puts("a=["+a+"];"); puts("b=["+b+"];"); puts("d=["+d+"];");
{{X=H'*H}} putm(X); plots(H);
}
function gfexp(x,lambda,f) {
var t,C; C=zero(f);
for (t=0;t<f;t++) C[t]=gfpow(x,lambda*t);
return C;
}
function Propus(A,B,D) {
var MA,MB,MD;
MA=minp(A); MB=minp(B); MD=minp(D);
H11=square(A,B,B,D); H12=square(B,D,MA,MB);
H21=square(B,MA,D,MB); H22=square(MD,B,B,MA);
return square(H11,H12,H21,H22);
}
function SkewPropus(A,B,D) {
var MB,MD,P11,P12,P21,P22;
MB=minp(B); MD=minp(D);
P11=square(A,B,MB,A); P12=square(B,D,D,MB);
P21=square(MB,MD,MD,B); P22=square(A,B,MB,A);
return square(P11,P12,P21,P22);
}
function CommonPropus(A,B,D) {
var H11,H12,H21,H22,TB,TD,BR,DR,TBR,TDR,MA,MTBR,MTDR;
TB=tr(B); TD=tr(D); BR=flip(B);
DR=flip(D); TBR=flip(TB); TDR=flip(TD);
MA=minp(A); MTBR=minp(TBR); MTDR=minp(TDR);
H11=square(A,BR,BR,TDR); H12=square(BR,DR,MA,MTBR);
H21=square(BR,MA,DR,MTBR); H22=square(MTDR,TBR,TBR,MA);
return square(H11,H12,H21,H22);
}

// GALOIS FIELDS PROCEDURE:
if (tick==0) { n=36;
Flg0=false; GP=false; // COMMON PROPUS
Flgalp=true; Flg1N=n%4!=0; Flg1N=false;
Fphase=true; Maxphase=2; FlgP2=true;
FlgTyp=true; M=10000; R=true; tuning();
}
for (k=0;k<10;k++)
if (R) { setphases();
// ROOTS
x1=gfrand(); x2=equal(x1); getab(x1,p);
if (Flg1N) {
a2=equal(a); b2=equal(b); if (Flg0) a2[0]=0;
}else{
a=a.concat(b); a2=ab2a(a); if (Flg0) a2[0]=0; // a2[v]=0;
x2=gfrand(); getab(x2,p);
a=a.concat(b); b2=ab2a(a); if (Flg0) b2[0]=0; // b2[v]=0;
}
// b2[0]=0;
A=negacirc(a2); B=negacirc(b2);
// H=twocircul(A,B); // H=ab2a(H); // N1
A2=a2ab(A); B2=a2ab(B); Z=eyez(n/4);
S=square(A2); A=S[0]; B=S[1]; C=S[2]; D=S[3];
{{ A=Z*A*Z; B=Z*B*Z; }} // C=Z*C*Z; D=Z*D*Z;
a=A[0]; b=B[0]; b=circshiftback(b,(rows(b)-1)/2);
S=square(B2); A=S[0]; B=S[1]; C=S[2]; D=S[3];
{{ A=Z*A*Z; B=Z*B*Z; }} // C=Z*C*Z; D=Z*D*Z;
c=A[0]; d=B[0]; d=circshiftback(d,(rows(d)-1)/2);
ERR=analysis(); // b[0]=0;
A=circ(a); B=circ(b); D=circ(d);
if (GP) { H=CommonPropus(A,B,D); }else{ H=Propus(A,B,D); }
m=maxabslsm(H);
if (M>=m) { M=m; if (M==0) R=false;
X1=x1; X2=x2; }
}
// INFORMATION
puts("n="+n+" p="+p+" r="+GFr+" Lim="+M+"; tick="+tick);
// puts("x1=["+X1+"]; x2=["+X2+"];");
// RESTART
if (M>0) {
FlgP2=!FlgP2; tuning();
restart(0) }else{ // FINISH
if (ERR) puts("PROBLEM MATRIX");
puts("x1=["+x1+"];"+" x2=["+x2+"];");
puts("a=["+a2+"];"); puts("b=["+b2+"];");
putm("a=["+a+"];"); putm("b=["+b+"];"); putm("d=["+d+"];");
// putm("c=["+c+"];"); C=circ(c);
// A=circ(a); B=circ(b); D=circ(d);
// if (GP) { H=CommonPropus(A,B,D); }else{ H=Propus(A,B,D); }}
{{I=H'*H}} putm(I); putm(H); // H=ab2a(H);
plots(H); sound("5th.wav");
}
function tuning() { p=n; law=n/2;
if (Flg1N) { if (FlgP2) { p=2*p; law=2*law;}
}else{ if (FlgP2) { p=p/2; law=round(law/2); }}
lau=4*law; p=p-1; gfinit(p,2); if (p==27) gfinit(3,6);
v=n/4; v4=v; if (Flg1N) v=n/2; v1=v-1; v2=2*v; v41=v4-1;
setphases(); Z=eyez(v); vs=v1/2; // !!!!!
}
function setphases() {
pha=0; phu=0; phw=1; if ((p+1)%4!=0) phw=2;
if (!Fphase) phw=randint(Maxphase);
pwu=lau+phu; pww=law-phw; pwa=law+pha;
}
function getab(x,p) {
var i,i2,u,w,U,W,W1,W2;
a=one(v); b=one(v); i2=0;
u=gfpow(x,pwu); U=gfexp(u,v1);
w=gfpow(x,pww); W=gfexp(w,v2);
if (Flgalp) { alp=gfpow(x,pwa); W=gfmul(alp,W); }
for (i=0;i<v;i++) {
W1=W[i2]; i2++; W2=W[i2]; i2++;
if (gfeq(gfadd(W1,gfpow(W1,p)),U)) a[i]=-1;
if (gfeq(gfadd(W2,gfpow(W2,p)),U)) b[i]=-1;
}}
function analysis() {
var ERR; ERR=false;
if (maxabs(sub(b,c))>0) {
if (maxabs(sub(b,d))==0) { d=equal(c); }else{
if (maxabs(sub(c,d))==0) { d=equal(b); b=equal(c); }else{
if (maxabs(sub(a,b))==0) { a=equal(c); }else{
if (maxabs(sub(a,c))==0) { a=equal(b); b=equal(a); }else{
if (maxabs(sub(a,d))==0) { a=equal(b); b=equal(d);
d=equal(c); }else{ ERR=true;
}}}}}}
d2=minp(d);
if (abs(sum(add(a,d)))<abs(sum(add(a,d2)))) d=equal(d2);
return ERR;
}
function Propus(A,B,D) {
var MA,MB,MD;
MA=minp(A); MB=minp(B); MD=minp(D);
H11=square(A,B,B,D); H12=square(B,D,MA,MB);
H21=square(B,MA,D,MB); H22=square(MD,B,B,MA);
return square(H11,H12,H21,H22);
}
function CommonPropus(A,B,D) {
var H11,H12,H21,H22,TB,TD,BR,DR,TBR,TDR,MA,MTBR,MTDR;
TB=tr(B); TD=tr(D); BR=flip(B);
DR=flip(D); TBR=flip(TB); TDR=flip(TD);
MA=minp(A); MTBR=minp(TBR); MTDR=minp(TDR);
H11=square(A,BR,BR,TDR); H12=square(BR,DR,MA,MTBR);
H21=square(BR,MA,DR,MTBR); H22=square(MTDR,TBR,TBR,MA);
return square(H11,H12,H21,H22);
}

{{P="H32PSM.xml"}} m=rows(P)/4;
A=rowcol(P,0,m-1,0,m-1); B=rowcol(P,m,2*m-1,0,m-1);
C=rowcol(P,2*m,3*m-1,0,m-1); D=rowcol(P,3*m,4*m-1,0,m-1);
// PROPUS PROPUS PROPUS
P11=square(A,B,C,D);
P12=square(C,D,minp(A),minp(B));
P21=square(B,minp(A),D,minp(C));
P22=square(minp(D),C,B,minp(A));
P=square(P11,P12,P21,P22);
n=rows(P); v=n/4; v2=n/2-1; v3=3*v-1;
a=tr(rowcol(P,0,0,0,v-1)); b=tr(rowcol(P,0,0,v,v2));
c=tr(rowcol(P,0,0,v2+1,v3)); d=tr(rowcol(P,0,0,v3+1,n-1));
putm("a=["+a+"];"); putm("b=["+b+"];"); putm("d=["+d+"];");
{{I=P'*P}} putm(I); plots(P);
1. Jennifer Seberry and Mieko Yamada, Hadamard matrices, sequences, and block designs, in Contemporary Design Theory: A Collection of Surveys, eds. J. H. Dinitz and D. R. Stinson, John Wiley, New York, 1992, pp. 431–560 (PDF ) 2. W.D. Wallis, A.P. Street and Jennifer Seberry Wallis, Combinatorics: Room Squares, Sum-Free Sets, Hadamard Matrices, Lecture Notes in Mathematics, Springer-Verlag, Vol. 292, 1972. 3. N. A. Balonin and Jennifer Seberry, “Visualizing Hadamard Matrices: the Propus Construction”, Australasian Journal of Combinatorics (submitted 6 Aug 2014). 4. N. A. Balonin and Jennifer Seberry, A Review and New Symmetric Conference Matrices //Informatsionno-upravliaiushchie sistemy, 2014, № 4 (71), pp. 2–7. (PDF | WEB ) ELECTRONIC EDITIONS Balonin N. A., Seberry, Jennifer. Visualizing Hadamard Matrices: the Propus Construction, Electronic edition, 2014. N. A. Balonin, Jennifer Seberry Conference Matrices with Two Borders and Four Circulants, Electronic edition, 2014.