The level-2 concatenated [[7,1,3]] Steane code, and the 4.8.8 color code are both self-dual [[49,1,9]] codes from the CSS family. Is there a distance 9 self-dual CSS code that has less than 49 qubits?
2 Answers
I assume by "self dual CSS code" you mean one with $H_X = H_Z = H$. $H$ is the parity check matrix of a classical binary code with parameters $[n,(n+1)/2,d]$; this gives you a $[[n,1,d]]$ QECC. $H H^T = 0$ puts a restriction that the dual of the classical code is self orthogonal. A quick search using GAP/GUAVA over the best known linear codes finds a $[47,24,11]$ code which gives you a $[[47,1,11]]$ code. $H$ displayed below.
1 1 . . 1 . 1 . . 1 . . 1 1 . 1 1 . . 1 1 . . . 1 . . . . . . . . . . . . . . . . . . . . . .
. 1 1 . . 1 . 1 . . 1 . . 1 1 . 1 1 . . 1 1 . . . 1 . . . . . . . . . . . . . . . . . . . . .
. . 1 1 . . 1 . 1 . . 1 . . 1 1 . 1 1 . . 1 1 . . . 1 . . . . . . . . . . . . . . . . . . . .
. . . 1 1 . . 1 . 1 . . 1 . . 1 1 . 1 1 . . 1 1 . . . 1 . . . . . . . . . . . . . . . . . . .
1 1 . . . 1 1 . 1 1 1 . 1 . . 1 . 1 . . . . . 1 . . . . 1 . . . . . . . . . . . . . . . . . .
1 . 1 . 1 . . 1 . . 1 1 1 . . 1 . . 1 1 1 . . . . . . . . 1 . . . . . . . . . . . . . . . . .
. 1 . 1 . 1 . . 1 . . 1 1 1 . . 1 . . 1 1 1 . . . . . . . . 1 . . . . . . . . . . . . . . . .
. . 1 . 1 . 1 . . 1 . . 1 1 1 . . 1 . . 1 1 1 . . . . . . . . 1 . . . . . . . . . . . . . . .
. . . 1 . 1 . 1 . . 1 . . 1 1 1 . . 1 . . 1 1 1 . . . . . . . . 1 . . . . . . . . . . . . . .
1 1 . . . . . . 1 1 . 1 1 1 1 . . . . . 1 . 1 1 . . . . . . . . . 1 . . . . . . . . . . . . .
1 . 1 . 1 . 1 . . . 1 . . . 1 . 1 . . 1 1 1 . 1 . . . . . . . . . . 1 . . . . . . . . . . . .
1 . . 1 1 1 1 1 . 1 . 1 1 1 . . 1 1 . 1 . 1 1 . . . . . . . . . . . . 1 . . . . . . . . . . .
. 1 . . 1 1 1 1 1 . 1 . 1 1 1 . . 1 1 . 1 . 1 1 . . . . . . . . . . . . 1 . . . . . . . . . .
1 1 1 . 1 1 . 1 1 . . 1 1 . 1 . 1 . 1 . 1 1 . 1 . . . . . . . . . . . . . 1 . . . . . . . . .
1 . 1 1 1 1 . . 1 . . . . . . . 1 1 . . 1 1 1 . . . . . . . . . . . . . . . 1 . . . . . . . .
. 1 . 1 1 1 1 . . 1 . . . . . . . 1 1 . . 1 1 1 . . . . . . . . . . . . . . . 1 . . . . . . .
1 1 1 . . 1 . 1 . 1 1 . 1 1 . 1 1 . 1 . 1 . 1 1 . . . . . . . . . . . . . . . . 1 . . . . . .
1 . 1 1 1 . . . 1 1 1 1 1 . 1 1 . 1 . . 1 1 . 1 . . . . . . . . . . . . . . . . . 1 . . . . .
1 . . 1 . 1 1 . . . 1 1 . . . . . . 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . 1 . . . .
. 1 . . 1 . 1 1 . . . 1 1 . . . . . . 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . 1 . . .
1 1 1 . 1 1 1 1 1 1 . . . . . 1 1 . . 1 . 1 1 1 . . . . . . . . . . . . . . . . . . . . 1 . .
1 . 1 1 1 1 . 1 1 . 1 . 1 1 . 1 . 1 . 1 . . 1 1 . . . . . . . . . . . . . . . . . . . . . 1 .
1 . . . 1 1 . . . 1 1 1 . 1 1 . 1 1 1 . 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . 1
GAP code :
LoadPackage("guava");
for n in [1..50] do
if(\mod(n,2)=0)then continue;fi;
m:=(n-1)/2;
k:=n-m;
code:=BestKnownLinearCode(n,k,GF(2));
if(code<>fail)then
check:=IsSelfOrthogonalCode(DualCode(code));
Print("n=",n," k=",k," ",check," ",code,"\n");
fi;
od;
results (takes a few seconds) :
n=1 k=1 false a cyclic [1,1,1]0 repetition code over GF(2)
n=3 k=2 false a cyclic [3,2,2]1 Cordaro-Wagner code over GF(2)
n=5 k=3 false a linear [5,3,2]1..2 subcode
n=7 k=4 true a linear [7,4,3]1 punctured code
n=9 k=5 false a linear [9,5,3]2..3 shortened code
n=11 k=6 false a linear [11,6,4]2..4 shortened code
n=13 k=7 false a linear [13,7,4]2..5 subcode
n=15 k=8 false a linear [15,8,4]3..6 subcode
n=17 k=9 false a linear [17,9,5]3..4 punctured code
n=19 k=10 false a linear [19,10,5]3..6 shortened code
n=21 k=11 false a linear [21,11,6]3..7 shortened code
n=23 k=12 true a linear [23,12,7]3 punctured code
n=25 k=13 false a linear [25,13,6]4..9 subcode
n=27 k=14 false a linear [27,14,7]4..7 code defined by generator matrix over GF(2)
n=29 k=15 false a linear [29,15,7]4..10 shortened code
n=31 k=16 false a linear [31,16,8]5..11 shortened code
n=33 k=17 false a linear [33,17,8]5..12 shortened code
n=35 k=18 false a linear [35,18,8]5..13 subcode
n=37 k=19 false a linear [37,19,8]5..14 subcode
Code not yet in library
n=41 k=21 false a linear [41,21,9]6..12 punctured code
n=43 k=22 false a linear [43,22,9]6..14 shortened code
n=45 k=23 false a linear [45,23,10]6..14 shortened code
n=47 k=24 true a linear [47,24,11]6..7 punctured code
Code not yet in library
note there are also solutions for $n=7$ and $n=23$ with smaller distance. To display the matrix :
n:=47;k:=24;
code:=BestKnownLinearCode(n,k,GF(2));
H:=CheckMat(code);
Display(H);
- 2,405
- 1
- 8
- 21
Since this question was asked, https://arxiv.org/abs/2408.12752 was posted. They found a [[45, 1, 9]] self-dual CSS code.
Here's the code to produce the 45 qubit self-dual classical code from the [46,23,10] self-dual code:
from galois import GF2
import numpy as np
def pp(mx):
print("\n".join(["".join(["_1"[int(b)] for b in row]) for row in mx]))
let's build M46
row0 = list(map(int, "00000000100111100110101"))
circulant_mx = np.array([np.roll(row0, row) for row in range(23)])
print("circulant matrix")
print(circulant_mx.shape)
pp(circulant_mx)
h46 = GF2(np.hstack((np.identity(23), circulant_mx)).astype(np.uint8))
print("[46,23,10] parity check mx")
h46.shape
pp(h46)
print(f"H46 is self-dual: {0 == np.count_nonzero(h46 @ h46.T)}")
puncture last column
h45 = h46[:, :-1]
print("Punctured code parity check mx")
h45.shape
pp(h45)
print("The dual of the punctured code")
h45_perp = h45.null_space()
h45_perp.shape
pp(h45_perp)
print(f"dual of punctured code is self-dual: {0 == np.count_nonzero(h45_perp @ h45_perp.T)}")
Which results in the following output:
circulant matrix
(23, 23)
________1__1111__11_1_1
1________1__1111__11_1_
_1________1__1111__11_1
1_1________1__1111__11_
_1_1________1__1111__11
1_1_1________1__1111__1
11_1_1________1__1111__
_11_1_1________1__1111_
__11_1_1________1__1111
1__11_1_1________1__111
11__11_1_1________1__11
111__11_1_1________1__1
1111__11_1_1________1__
_1111__11_1_1________1_
__1111__11_1_1________1
1__1111__11_1_1________
_1__1111__11_1_1_______
__1__1111__11_1_1______
___1__1111__11_1_1_____
____1__1111__11_1_1____
_____1__1111__11_1_1___
______1__1111__11_1_1__
_______1__1111__11_1_1_
[46,23,10] parity check mx
(23, 46)
1______________________________1__1111__11_1_1
_1_____________________1________1__1111__11_1_
__1_____________________1________1__1111__11_1
___1___________________1_1________1__1111__11_
____1___________________1_1________1__1111__11
_____1_________________1_1_1________1__1111__1
______1________________11_1_1________1__1111__
_______1________________11_1_1________1__1111_
________1________________11_1_1________1__1111
_________1_____________1__11_1_1________1__111
__________1____________11__11_1_1________1__11
___________1___________111__11_1_1________1__1
____________1__________1111__11_1_1________1__
_____________1__________1111__11_1_1________1_
______________1__________1111__11_1_1________1
_______________1_______1__1111__11_1_1________
________________1_______1__1111__11_1_1_______
_________________1_______1__1111__11_1_1______
__________________1_______1__1111__11_1_1_____
___________________1_______1__1111__11_1_1____
____________________1_______1__1111__11_1_1___
_____________________1_______1__1111__11_1_1__
______________________1_______1__1111__11_1_1_
H46 is self-dual: True
Punctured code parity check mx
(23, 45)
1______________________________1__1111__11_1_
_1_____________________1________1__1111__11_1
__1_____________________1________1__1111__11_
___1___________________1_1________1__1111__11
____1___________________1_1________1__1111__1
_____1_________________1_1_1________1__1111__
______1________________11_1_1________1__1111_
_______1________________11_1_1________1__1111
________1________________11_1_1________1__111
_________1_____________1__11_1_1________1__11
__________1____________11__11_1_1________1__1
___________1___________111__11_1_1________1__
____________1__________1111__11_1_1________1_
_____________1__________1111__11_1_1________1
______________1__________1111__11_1_1________
_______________1_______1__1111__11_1_1_______
________________1_______1__1111__11_1_1______
_________________1_______1__1111__11_1_1_____
__________________1_______1__1111__11_1_1____
___________________1_______1__1111__11_1_1___
____________________1_______1__1111__11_1_1__
_____________________1_______1__1111__11_1_1_
______________________1_______1__1111__11_1_1
The dual of the punctured code
(22, 45)
1_____________1__________1111___1__1_1__11_1_
_1_____________________1________1__1111__11_1
__1___________1_________11111__1111__111__11_
___1___________________1_1________1__1111__11
____1_________1_________11_11__11_111_1111__1
_____1________1________1__1_1__11_1____1111__
______1________________11_1_1________1__1111_
_______1________________11_1_1________1__1111
________1_____1____________1__111_1_1__1__111
_________1____1________1_1__11__1_1_1___1__11
__________1___1________1111___11__1_1____1__1
___________1__1________11_11_1__111_1_____1__
____________1__________1111__11_1_1________1_
_____________1__________1111__11_1_1________1
_______________1_______1__1111__11_1_1_______
________________1_______1__1111__11_1_1______
_________________1_______1__1111__11_1_1_____
__________________1_______1__1111__11_1_1____
___________________1_______1__1111__11_1_1___
____________________1_______1__1111__11_1_1__
_____________________1_______1__1111__11_1_1_
______________________1_______1__1111__11_1_1
dual of punctured code is self-dual: True
- 1,191
- 6
- 16