Skip to content

Commit be34f16

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

File tree

5 files changed

+114
-1
lines changed

5 files changed

+114
-1
lines changed

docs/src/references.bib

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

527+
@article{wang2024coprime,
528+
title={Coprime Bivariate Bicycle Codes and their Properties},
529+
author={Wang, Ming and Mueller, Frank},
530+
journal={arXiv preprint arXiv:2408.10001},
531+
year={2024}
532+
}
533+
527534
@misc{voss2024multivariatebicyclecodes,
528535
title={Multivariate Bicycle Codes},
529536
author={Lukas Voss and Sim Jian Xian and Tobias Haug and Kishor Bharti},

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+
- [wang2024coprime](@cite)
4344
- [voss2024multivariatebicyclecodes](@cite)
4445
- [lin2024quantum](@cite)
4546
- [bravyi2024high](@cite)

ext/QuantumCliffordHeckeExt/lifted_product.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ julia> c = two_block_group_algebra_codes(A,B);
207207
julia> code_n(c), code_k(c)
208208
(756, 16)
209209
```
210+
210211
### Multivariate Bicycle code
211212
212213
The group algebra of the qubit multivariate bicycle (MB) code with r variables is `𝔽₂[𝐺ᵣ]`,
@@ -231,6 +232,32 @@ julia> code_n(c), code_k(c)
231232
(48, 4)
232233
```
233234
235+
### Coprime Bivariate Bicycle code
236+
237+
The coprime bivariate bicycle (BB) codes are defined by two polynomials `𝑎(𝑥,𝑦)` and `𝑏(𝑥,𝑦)`,
238+
where `𝑙` and `𝑚` are coprime, and can be expressed as univariate polynomials `𝑎(𝜋)` and `𝑏(𝜋)`,
239+
with generator `𝜋 = 𝑥𝑦`. They can be viewed as a special case of Lifted Product construction
240+
based on abelian group `ℤₗ x ℤₘ` where `ℤⱼ` cyclic group of order `j`.
241+
242+
[108, 12, 6]] coprime-bivariate bicycle (BB) code from Table 2 of [wang2024coprime](@cite).
243+
244+
```jldoctest
245+
julia> import Hecke: group_algebra, GF, abelian_group, gens;
246+
247+
julia> l=2; m=27;
248+
249+
julia> GA = group_algebra(GF(2), abelian_group([l*m]));
250+
251+
julia> 𝜋 = gens(GA)[1];
252+
253+
julia> A = 𝜋^2 + 𝜋^5 + 𝜋^44;
254+
255+
julia> B = 𝜋^8 + 𝜋^14 + 𝜋^47;
256+
257+
258+
(108, 12)
259+
```
260+
234261
See also: [`LPCode`](@ref), [`generalized_bicycle_codes`](@ref), [`bicycle_codes`](@ref).
235262
"""
236263
function two_block_group_algebra_codes(a::GroupAlgebraElem, b::GroupAlgebraElem)

test/test_ecc_base.jl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,25 @@ 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+
# coprime Bivariate Bicycle codes from Table 2 of [wang2024coprime](@cite)
62+
# [[108,12,6]]
63+
l=2; m=27
64+
GA = group_algebra(GF(2), abelian_group([l*m]))
65+
𝜋 = gens(GA)[1]
66+
A = 𝜋^2 + 𝜋^5 + 𝜋^44
67+
B = 𝜋^8 + 𝜋^14 + 𝜋^47
68+
coprimeBB1 = two_block_group_algebra_codes(A, B)
69+
70+
# [[126,12,10]]
71+
l=7; m=9
72+
GA = group_algebra(GF(2), abelian_group([l*m]))
73+
𝜋 = gens(GA)[1]
74+
A = 1 + 𝜋 + 𝜋^58
75+
B = 𝜋^3 + 𝜋^16 + 𝜋^44
76+
coprimeBB2 = two_block_group_algebra_codes(A, B)
77+
78+
test_coprimeBB_codes = [coprimeBB1, coprimeBB2]
79+
6180
# Multivariate Bicycle codes taken from Table 1 of [voss2024multivariatebicyclecodes](@cite)
6281
# Weight-4 [[144, 2, 12]] MBB code
6382
l=8; m=9
@@ -131,7 +150,7 @@ const code_instance_args = Dict(
131150
:CSS => (c -> (parity_checks_x(c), parity_checks_z(c))).([Shor9(), Steane7(), Toric(4, 4)]),
132151
:Concat => [(Perfect5(), Perfect5()), (Perfect5(), Steane7()), (Steane7(), Cleve8()), (Toric(2, 2), Shor9())],
133152
:CircuitCode => random_circuit_code_args,
134-
:LPCode => (c -> (c.A, c.B)).(vcat(LP04, LP118, test_gb_codes, test_bb_codes, test_mbb_codes, other_lifted_product_codes)),
153+
:LPCode => (c -> (c.A, c.B)).(vcat(LP04, LP118, test_gb_codes, test_bb_codes, test_mbb_codes, test_coprimeBB_codes, other_lifted_product_codes)),
135154
:QuantumReedMuller => [3, 4, 5]
136155
)
137156

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
@testitem "ECC coprime Bivaraite Bicycle" begin
2+
using Nemo
3+
using Nemo: gcd
4+
using Hecke
5+
using Hecke: group_algebra, GF, abelian_group, gens
6+
using QuantumClifford.ECC: two_block_group_algebra_codes, code_k, code_n
7+
8+
@testset "Reproduce Table 2 wang2024coprime" begin
9+
# [[30,4,6]]
10+
l=3; m=5;
11+
GA = group_algebra(GF(2), abelian_group([l*m]))
12+
𝜋 = gens(GA)[1]
13+
A = 1 + 𝜋 + 𝜋^2
14+
B = 𝜋 + 𝜋^3 + 𝜋^8
15+
c = two_block_group_algebra_codes(A, B)
16+
@test gcd([l,m]) == 1
17+
@test code_n(c) == 30 && code_k(c) == 4
18+
19+
# [[42,6,6]]
20+
l=3; m=7;
21+
GA = group_algebra(GF(2), abelian_group([l*m]))
22+
𝜋 = gens(GA)[1]
23+
A = 1 + 𝜋^2 + 𝜋^3
24+
B = 𝜋 + 𝜋^3 + 𝜋^11
25+
c = two_block_group_algebra_codes(A, B)
26+
@test gcd([l,m]) == 1
27+
@test code_n(c) == 42 && code_k(c) == 6
28+
29+
# [[70,6,8]]
30+
l=5; m=7;
31+
GA = group_algebra(GF(2), abelian_group([l*m]))
32+
𝜋 = gens(GA)[1]
33+
A = 1 + 𝜋 + 𝜋^5;
34+
B = 1 + 𝜋 + 𝜋^12;
35+
c = two_block_group_algebra_codes(A, B)
36+
@test gcd([l,m]) == 1
37+
@test code_n(c) == 70 && code_k(c) == 6
38+
39+
# [[108,12,6]]
40+
l=2; m=27;
41+
GA = group_algebra(GF(2), abelian_group([l*m]))
42+
𝜋 = gens(GA)[1]
43+
A = 𝜋^2 + 𝜋^5 + 𝜋^44
44+
B = 𝜋^8 + 𝜋^14 + 𝜋^47
45+
c = two_block_group_algebra_codes(A, B)
46+
@test gcd([l,m]) == 1
47+
@test code_n(c) == 108 && code_k(c) == 12
48+
49+
# [[126,12,10]]
50+
l=7; m=9
51+
GA = group_algebra(GF(2), abelian_group([l*m]))
52+
𝜋 = gens(GA)[1]
53+
A = 1 + 𝜋 + 𝜋^58
54+
B = 𝜋^3 + 𝜋^16 + 𝜋^44
55+
c = two_block_group_algebra_codes(A, B)
56+
@test gcd([l,m]) == 1
57+
@test code_n(c) == 126 && code_k(c) == 12
58+
end
59+
end

0 commit comments

Comments
 (0)