Skip to content

Commit 138e008

Browse files
Fe-r-ozKrastanov
andauthored
Multivariate Bicycle code via Hecke's Group Algebra (#381)
Co-authored-by: Stefan Krastanov <[email protected]>
1 parent 5f2ef93 commit 138e008

File tree

5 files changed

+228
-1
lines changed

5 files changed

+228
-1
lines changed

docs/src/references.bib

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,16 @@ @article{lin2024quantum
524524
publisher={APS}
525525
}
526526

527+
@misc{voss2024multivariatebicyclecodes,
528+
title={Multivariate Bicycle Codes},
529+
author={Lukas Voss and Sim Jian Xian and Tobias Haug and Kishor Bharti},
530+
year={2024},
531+
eprint={2406.19151},
532+
archivePrefix={arXiv},
533+
primaryClass={quant-ph},
534+
url={https://arxiv.org/abs/2406.19151},
535+
}
536+
527537
@article{bravyi2024high,
528538
title={High-threshold and low-overhead fault-tolerant quantum memory},
529539
author={Bravyi, Sergey and Cross, Andrew W and Gambetta, Jay M and Maslov, Dmitri and Rall, Patrick and Yoder, Theodore J},

docs/src/references.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ For quantum code construction routines:
4040
- [steane1999quantum](@cite)
4141
- [campbell2012magic](@cite)
4242
- [anderson2014fault](@cite)
43+
- [voss2024multivariatebicyclecodes](@cite)
4344
- [lin2024quantum](@cite)
4445
- [bravyi2024high](@cite)
4546

ext/QuantumCliffordHeckeExt/lifted_product.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,29 @@ julia> c = two_block_group_algebra_codes(A,B);
207207
julia> code_n(c), code_k(c)
208208
(756, 16)
209209
```
210+
### Multivariate Bicycle code
211+
212+
The group algebra of the qubit multivariate bicycle (MB) code with r variables is `𝔽₂[𝐺ᵣ]`,
213+
where `𝐺ᵣ = ℤ/l₁ × ℤ/l₂ × ... × ℤ/lᵣ`.
214+
215+
A [[48, 4, 6]] Weight-6 TB-QLDPC code from Appendix A Table 2 of [voss2024multivariatebicyclecodes](@cite).
216+
217+
```jldoctest
218+
julia> import Hecke: group_algebra, GF, abelian_group, gens; # hide
219+
220+
julia> l=4; m=6;
221+
222+
julia> z = x*y;
223+
224+
julia> A = x^3 + y^5;
225+
226+
julia> B = x + z^5 + y^5 + y^2;
227+
228+
julia> c = two_block_group_algebra_codes(A, B);
229+
230+
julia> code_n(c), code_k(c)
231+
(48, 4)
232+
```
210233
211234
See also: [`LPCode`](@ref), [`generalized_bicycle_codes`](@ref), [`bicycle_codes`](@ref).
212235
"""

test/test_ecc_base.jl

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,45 @@ A[LinearAlgebra.diagind(A, 5)] .= GA(1)
5858
B = reshape([1 + x + x^6], (1, 1))
5959
push!(other_lifted_product_codes, LPCode(A, B))
6060

61+
# Multivariate Bicycle codes taken from Table 1 of [voss2024multivariatebicyclecodes](@cite)
62+
# Weight-4 [[144, 2, 12]] MBB code
63+
l=8; m=9
64+
GA = group_algebra(GF(2), abelian_group([l, m]))
65+
x, y = gens(GA)
66+
z = x*y
67+
A = x^3 + y^7
68+
B = x + y^5
69+
weight4mbb = two_block_group_algebra_codes(A, B)
70+
71+
# Weight-5 [96, 4, 8]] MBB code
72+
l=8; m=6
73+
GA = group_algebra(GF(2), abelian_group([l, m]))
74+
x, y = gens(GA)
75+
z = x*y
76+
A = x^6 + x^3
77+
B = z^5 + x^5 + y
78+
weight5mbb = two_block_group_algebra_codes(A, B)
79+
80+
# Weight-6 [[48, 4, 6]] MBB code
81+
l=4; m=6
82+
GA = group_algebra(GF(2), abelian_group([l, m]))
83+
x, y = gens(GA)
84+
z = x*y
85+
A = x^3 + y^5
86+
B = x + z^5 + y^5 + y^2
87+
weight6mbb = two_block_group_algebra_codes(A, B)
88+
89+
# Weight-7 [[30, 4, 5]] MBB code
90+
l=5; m=3
91+
GA = group_algebra(GF(2), abelian_group([l, m]));
92+
x, y = gens(GA)
93+
z = x*y
94+
A = x^4 + x^2
95+
B = x + x^2 + y + z^2 + z^3
96+
weight7mbb = two_block_group_algebra_codes(A, B)
97+
98+
test_mbb_codes = [weight4mbb, weight5mbb, weight6mbb, weight7mbb]
99+
61100
# Bivariate Bicycle codes
62101
# A [[72, 12, 6]] code from Table 3 of [bravyi2024high](@cite).
63102
l=6; m=6
@@ -92,7 +131,7 @@ const code_instance_args = Dict(
92131
:CSS => (c -> (parity_checks_x(c), parity_checks_z(c))).([Shor9(), Steane7(), Toric(4, 4)]),
93132
:Concat => [(Perfect5(), Perfect5()), (Perfect5(), Steane7()), (Steane7(), Cleve8()), (Toric(2, 2), Shor9())],
94133
:CircuitCode => random_circuit_code_args,
95-
:LPCode => (c -> (c.A, c.B)).(vcat(LP04, LP118, test_gb_codes, test_bb_codes, other_lifted_product_codes)),
134+
:LPCode => (c -> (c.A, c.B)).(vcat(LP04, LP118, test_gb_codes, test_bb_codes, test_mbb_codes, other_lifted_product_codes)),
96135
:QuantumReedMuller => [3, 4, 5]
97136
)
98137

test/test_ecc_multivariate_bicycle.jl

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
@testitem "ECC Multivaraite Bicycle" begin
2+
using Hecke
3+
using Hecke: group_algebra, GF, abelian_group, gens
4+
using QuantumClifford.ECC: two_block_group_algebra_codes, code_k, code_n
5+
6+
# Multivariate Bicycle codes taken from Table 1 of [voss2024multivariatebicyclecodes](@cite)
7+
@testset "Weight-4 QLDPC Codes" begin
8+
# [[112, 8, 5]]
9+
l=7; m=8
10+
GA = group_algebra(GF(2), abelian_group([l, m]))
11+
x, y = gens(GA)
12+
z = x*y
13+
A = z^2 + z^6
14+
B = x + x^6
15+
c = two_block_group_algebra_codes(A, B)
16+
@test code_n(c) == 112 && code_k(c) == 8
17+
18+
# [[64, 2, 8]]
19+
l=8; m=4
20+
GA = group_algebra(GF(2), abelian_group([l, m]))
21+
x, y = gens(GA)
22+
z = x*y
23+
A = x + x^2
24+
B = x^3 + y
25+
c = two_block_group_algebra_codes(A, B)
26+
@test code_n(c) == 64 && code_k(c) == 2
27+
28+
# [[72, 2, 8]]
29+
l=4; m=9
30+
GA = group_algebra(GF(2), abelian_group([l, m]))
31+
x, y = gens(GA)
32+
z = x*y
33+
A = x + y^2
34+
B = x^2 + y^2
35+
c = two_block_group_algebra_codes(A, B)
36+
@test code_n(c) == 72 && code_k(c) == 2
37+
38+
# [[96, 2, 8]]
39+
l=6; m=8
40+
GA = group_algebra(GF(2), abelian_group([l, m]))
41+
x, y = gens(GA)
42+
z = x*y
43+
A = x^5 + y^6
44+
B = z + z^4
45+
c = two_block_group_algebra_codes(A, B)
46+
@test code_n(c) == 96 && code_k(c) == 2
47+
48+
# [[112, 2, 10]]
49+
l=7; m=8
50+
GA = group_algebra(GF(2), abelian_group([l, m]))
51+
x, y = gens(GA)
52+
z = x*y
53+
A = z^6 + x^5
54+
B = z^2 + y^5
55+
c = two_block_group_algebra_codes(A, B)
56+
@test code_n(c) == 112 && code_k(c) == 2
57+
58+
# [[144, 2, 12]]
59+
l=8; m=9
60+
GA = group_algebra(GF(2), abelian_group([l, m]))
61+
x, y = gens(GA)
62+
z = x*y
63+
A = x^3 + y^7
64+
B = x + y^5
65+
c = two_block_group_algebra_codes(A, B)
66+
@test code_n(c) == 144 && code_k(c) == 2
67+
end
68+
69+
@testset "Weight-5 QLDPC Codes" begin
70+
# [[30, 4, 5]]
71+
l=3; m=5
72+
GA = group_algebra(GF(2), abelian_group([l, m]))
73+
x, y = gens(GA)
74+
z = x*y
75+
A = x + z^4
76+
B = x + y^2 + z^2
77+
c = two_block_group_algebra_codes(A, B)
78+
@test code_n(c) == 30 && code_k(c) == 4
79+
80+
# [[72, 4, 8]]
81+
l=4; m=9
82+
GA = group_algebra(GF(2), abelian_group([l, m]))
83+
x, y = gens(GA)
84+
z = x*y
85+
A = x + y^3
86+
B = x^2 + y + y^2
87+
c = two_block_group_algebra_codes(A, B)
88+
@test code_n(c) == 72 && code_k(c) == 4
89+
90+
# [96, 4, 8]]
91+
l=8; m=6
92+
GA = group_algebra(GF(2), abelian_group([l, m]))
93+
x, y = gens(GA)
94+
z = x*y
95+
A = x^6 + x^3
96+
B = z^5 + x^5 + y
97+
c = two_block_group_algebra_codes(A, B)
98+
@test code_n(c) == 96 && code_k(c) == 4
99+
end
100+
101+
@testset "Weight-6 QLDPC codes" begin
102+
# [[30, 6, 4]]
103+
l=5; m=3
104+
GA = group_algebra(GF(2), abelian_group([l, m]))
105+
x, y = gens(GA)
106+
z = x*y
107+
A = x^4 + z^3
108+
B = x^4 + x + z^4 + y
109+
c = two_block_group_algebra_codes(A, B)
110+
@test code_n(c) == 30 && code_k(c) == 6
111+
112+
# [[48, 6, 6]]
113+
l=4; m=6
114+
GA = group_algebra(GF(2), abelian_group([l, m]))
115+
x, y = gens(GA)
116+
z = x*y
117+
A = x^2 + y^4
118+
B = x^3 + z^3 + y^2 + y
119+
c = two_block_group_algebra_codes(A, B)
120+
@test code_n(c) == 48 && code_k(c) == 6
121+
122+
# [[40, 4, 6]]
123+
l=4; m=5
124+
GA = group_algebra(GF(2), abelian_group([l, m]))
125+
x, y = gens(GA)
126+
z = x*y
127+
A = x^2 + y
128+
B = y^4 + y^2 + x^3 + x
129+
c = two_block_group_algebra_codes(A, B)
130+
@test code_n(c) == 40 && code_k(c) == 4
131+
132+
# [[48, 4, 6]]
133+
l=4; m=6
134+
GA = group_algebra(GF(2), abelian_group([l, m]))
135+
x, y = gens(GA)
136+
z = x*y
137+
A = x^3 + y^5
138+
B = x + z^5 + y^5 + y^2
139+
c = two_block_group_algebra_codes(A, B)
140+
@test code_n(c) == 48 && code_k(c) == 4
141+
end
142+
143+
@testset "Weight-7 QLDPC codes" begin
144+
# [[30, 4, 5]]
145+
l=5; m=3
146+
GA = group_algebra(GF(2), abelian_group([l, m]))
147+
x, y = gens(GA)
148+
z = x*y
149+
A = x^4 + x^2
150+
B = x + x^2 + y + z^2 + z^3
151+
c = two_block_group_algebra_codes(A, B)
152+
@test code_n(c) == 30 && code_k(c) == 4
153+
end
154+
end

0 commit comments

Comments
 (0)