From 4cc8eac91ad45a34e9ed62391b89610972824834 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 26 Jun 2025 13:47:59 +0500 Subject: [PATCH 01/21] =?UTF-8?q?=20=F0=9F=90=9E=F0=9F=A6=8B=20fix=20gener?= =?UTF-8?q?ation=20of=20classical=20LiftedCode=20and=20code=5Fn,=20code=5F?= =?UTF-8?q?s=20paras,=20define=20code=5Fk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../QuantumCliffordHeckeExt.jl | 10 +++-- ext/QuantumCliffordHeckeExt/lifted.jl | 38 +++++++++++++++++-- src/ecc/ECC.jl | 2 +- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22ac7caba..faeb97f65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ## v0.10.0 - 2025-06-25 +- **(fix)** The `parity_checks`, `code_n`, and `code_s` methods were throwing errors and `code_k` was not defined for the classical `LiftedCode`s. - **(fix)** The gates `SQRTY`, `CXYZ`, `CZYX` were computing phases incorrectly when acting on `I` stabilizers. - **(fix)** Paulis with imaginary phases had their phases incorrectly tracked. - **(fix)** `rowdecompose` was not accounting for the phase of the input Pauli string, leading to potential errors in non-Clifford functionality. diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index 9af5eeaca..ed895db73 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -4,19 +4,21 @@ using QECCore import QECCore: code_n, code_s, code_k, rate, distance using DocStringExtensions -import QuantumClifford, LinearAlgebra +import QuantumClifford +import LinearAlgebra +import LinearAlgebra: rank import Hecke: Group, GroupElem, AdditiveGroupElem, GroupAlgebra, GroupAlgebraElem, FqFieldElem, representation_matrix, dim, base_ring, - multiplication_table, coefficients, abelian_group, group_algebra, rand + multiplication_table, coefficients, abelian_group, group_algebra, rand, order, group import Nemo -import Nemo: characteristic, matrix_repr, GF, ZZ, lift +import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix import QuantumClifford.ECC: iscss, parity_checks, two_block_group_algebra_codes, generalized_bicycle_codes, bicycle_codes, check_repr_commutation_relation, haah_cubic_codes import QECCore: AbstractECC, CSS, - hgp, code_k, code_n, code_s, parity_matrix_x, parity_matrix_z, parity_matrix_xz + hgp, code_k, code_n, code_s, parity_matrix_x, parity_matrix_z, parity_matrix_xz, parity_matrix # exported from extension so that Documenter.jl sees them when autogenerating API lists export hgp, two_block_group_algebra_codes, generalized_bicycle_codes, bicycle_codes, haah_cubic_codes, diff --git a/ext/QuantumCliffordHeckeExt/lifted.jl b/ext/QuantumCliffordHeckeExt/lifted.jl index a5864b70a..214ecbf2b 100644 --- a/ext/QuantumCliffordHeckeExt/lifted.jl +++ b/ext/QuantumCliffordHeckeExt/lifted.jl @@ -83,7 +83,35 @@ function LiftedCode(group_elem_array::Matrix{<: GroupOrAdditiveGroupElem}; GA::G end end -# TODO document and doctest example +""" +Constructs a group algebra code over `GF(2)` by lifting a matrix of cyclic shifts +(entries modulo `l`) to the group algebra of the abelian group `ℤ/lℤ` of order `l`. + +# Example + +```jldoctest +julia> import Hecke; import QuantumClifford.ECC + +julia> base_matrix = [0 0 0 0; 0 1 2 5; 0 6 3 1]; l = 3; + +julia> c = LiftedCode(base_matrix, l); + +julia> parity_checks(c) +9×12 Matrix{Bool}: + 1 0 0 1 0 0 1 0 0 1 0 0 + 0 1 0 0 1 0 0 1 0 0 1 0 + 0 0 1 0 0 1 0 0 1 0 0 1 + 1 0 0 0 0 1 0 1 0 0 1 0 + 0 1 0 1 0 0 0 0 1 0 0 1 + 0 0 1 0 1 0 1 0 0 1 0 0 + 1 0 0 1 0 0 1 0 0 0 0 1 + 0 1 0 0 1 0 0 1 0 1 0 0 + 0 0 1 0 0 1 0 0 1 0 1 0 + +julia> code_n(c), code_k(c), code_s(c) +(12, 5, 9) +``` +""" function LiftedCode(shift_array::Matrix{Int}, l::Int; GA::GroupAlgebra=group_algebra(GF(2), abelian_group(l))) A = zeros(GA, size(shift_array)...) for i in 1:size(shift_array, 1) @@ -104,9 +132,11 @@ function concat_lift_repr(repr, mat) end function parity_checks(c::LiftedCode) - return lift(c.repr, c.A) + return concat_lift_repr(c.repr, c.A) end -code_n(c::LiftedCode) = size(c.A, 2) * size(zero(c.GA), 2) +code_n(c::LiftedCode) = size(c.A, 2) * order(group(c.GA)) + +code_s(c::LiftedCode) = size(c.A, 1) * order(group(c.GA)) -code_s(c::LiftedCode) = size(c.A, 1) * size(zero(c.GA), 1) +code_k(c::LiftedCode) = code_n(c) - rank(matrix(GF(2), parity_checks(c))) diff --git a/src/ecc/ECC.jl b/src/ecc/ECC.jl index cc8c9c2a1..fabe067cf 100644 --- a/src/ecc/ECC.jl +++ b/src/ecc/ECC.jl @@ -1,7 +1,7 @@ module ECC using QECCore -import QECCore: code_n, code_s, code_k, rate, distance, parity_matrix_x, parity_matrix_z,parity_matrix +import QECCore: code_n, code_s, code_k, rate, distance, parity_matrix_x, parity_matrix_z, parity_matrix using LinearAlgebra: LinearAlgebra, I, rank, tr using QuantumClifford: QuantumClifford, AbstractOperation, AbstractStabilizer, AbstractTwoQubitOperator, Stabilizer, PauliOperator, From 63bc79daf4cedcfdf4e2eb29a2e1b6c1b79d9b8b Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 26 Jun 2025 15:40:12 +0500 Subject: [PATCH 02/21] =?UTF-8?q?=F0=9F=94=8Cuse=20parity=5Fmatrix=20inste?= =?UTF-8?q?ad=20of=20parity=5Fchecks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 2 +- ext/QuantumCliffordHeckeExt/lifted.jl | 10 ++++++---- src/ecc/ECC.jl | 1 + 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index ed895db73..dfbba652b 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -13,7 +13,7 @@ import Hecke: Group, GroupElem, AdditiveGroupElem, import Nemo import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix -import QuantumClifford.ECC: iscss, parity_checks, +import QuantumClifford.ECC: iscss, parity_checks, parity_matrix, two_block_group_algebra_codes, generalized_bicycle_codes, bicycle_codes, check_repr_commutation_relation, haah_cubic_codes diff --git a/ext/QuantumCliffordHeckeExt/lifted.jl b/ext/QuantumCliffordHeckeExt/lifted.jl index 214ecbf2b..913a27e74 100644 --- a/ext/QuantumCliffordHeckeExt/lifted.jl +++ b/ext/QuantumCliffordHeckeExt/lifted.jl @@ -90,13 +90,15 @@ Constructs a group algebra code over `GF(2)` by lifting a matrix of cyclic shift # Example ```jldoctest -julia> import Hecke; import QuantumClifford.ECC +julia> import Hecke; import QuantumClifford.ECC: LiftedCode, code_n, code_k, code_s + +julia> import QuantumClifford.ECC.QECCore:parity_matrix julia> base_matrix = [0 0 0 0; 0 1 2 5; 0 6 3 1]; l = 3; julia> c = LiftedCode(base_matrix, l); -julia> parity_checks(c) +julia> parity_matrix(c) 9×12 Matrix{Bool}: 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 @@ -131,7 +133,7 @@ function concat_lift_repr(repr, mat) return z end -function parity_checks(c::LiftedCode) +function parity_matrix(c::LiftedCode) return concat_lift_repr(c.repr, c.A) end @@ -139,4 +141,4 @@ code_n(c::LiftedCode) = size(c.A, 2) * order(group(c.GA)) code_s(c::LiftedCode) = size(c.A, 1) * order(group(c.GA)) -code_k(c::LiftedCode) = code_n(c) - rank(matrix(GF(2), parity_checks(c))) +code_k(c::LiftedCode) = code_n(c) - rank(matrix(GF(2), parity_matrix(c))) diff --git a/src/ecc/ECC.jl b/src/ecc/ECC.jl index fabe067cf..873e46f82 100644 --- a/src/ecc/ECC.jl +++ b/src/ecc/ECC.jl @@ -84,6 +84,7 @@ function generator_polynomial end function generator end parity_checks(s::Stabilizer) = s +parity_checks(c::AbstractCECC) = parity_matrix(c) parity_checks(c::AbstractECC) = Stabilizer(parity_matrix(c)) Stabilizer(c::AbstractECC) = parity_checks(c) MixedDestabilizer(c::AbstractECC; kwarg...) = MixedDestabilizer(Stabilizer(c); kwarg...) From 112c76a6edf8ca31c72c44231a160d49d6407671 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 26 Jun 2025 15:43:21 +0500 Subject: [PATCH 03/21] =?UTF-8?q?=F0=9F=A7=B9=20polish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ext/QuantumCliffordHeckeExt/lifted.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/lifted.jl b/ext/QuantumCliffordHeckeExt/lifted.jl index 913a27e74..f19def8fa 100644 --- a/ext/QuantumCliffordHeckeExt/lifted.jl +++ b/ext/QuantumCliffordHeckeExt/lifted.jl @@ -92,7 +92,7 @@ Constructs a group algebra code over `GF(2)` by lifting a matrix of cyclic shift ```jldoctest julia> import Hecke; import QuantumClifford.ECC: LiftedCode, code_n, code_k, code_s -julia> import QuantumClifford.ECC.QECCore:parity_matrix +julia> import QuantumClifford.ECC.QECCore: parity_matrix julia> base_matrix = [0 0 0 0; 0 1 2 5; 0 6 3 1]; l = 3; From 5326e26cb2913cc7bcca04f4fdd5a053f7efd6b8 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 26 Jun 2025 15:45:06 +0500 Subject: [PATCH 04/21] =?UTF-8?q?=F0=9F=94=8C=20polish=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ecc/ECC.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ecc/ECC.jl b/src/ecc/ECC.jl index 873e46f82..fabe067cf 100644 --- a/src/ecc/ECC.jl +++ b/src/ecc/ECC.jl @@ -84,7 +84,6 @@ function generator_polynomial end function generator end parity_checks(s::Stabilizer) = s -parity_checks(c::AbstractCECC) = parity_matrix(c) parity_checks(c::AbstractECC) = Stabilizer(parity_matrix(c)) Stabilizer(c::AbstractECC) = parity_checks(c) MixedDestabilizer(c::AbstractECC; kwarg...) = MixedDestabilizer(Stabilizer(c); kwarg...) From 5883231b56d9f00c28ecd7bad54b20ae3e6a4bd5 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 26 Jun 2025 17:11:37 +0500 Subject: [PATCH 05/21] =?UTF-8?q?=F0=9F=A7=BE=20document=20the=20other=20c?= =?UTF-8?q?onstructor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ext/QuantumCliffordHeckeExt/lifted.jl | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/lifted.jl b/ext/QuantumCliffordHeckeExt/lifted.jl index f19def8fa..cf5ce4dbd 100644 --- a/ext/QuantumCliffordHeckeExt/lifted.jl +++ b/ext/QuantumCliffordHeckeExt/lifted.jl @@ -70,7 +70,29 @@ function LiftedCode(A::Matrix{GroupAlgebraElem{FqFieldElem, <: GroupAlgebra}}; G LiftedCode(A; GA=GA, repr=representation_matrix) end -# TODO document and doctest example +""" +Constructs a group algebra code by embedding a matrix of group elements into the +specified group algebra `GA`, with optional custom representation `repr`. + +```jldoctest +julia> import Hecke: group_algebra, GF, abelian_group, gens, representation_matrix + +julia> import QuantumClifford.ECC: LiftedCode, code_n, code_k, code_s + +julia> import QuantumClifford.ECC.QECCore: parity_matrix + +julia> l = 63; GA = group_algebra(GF(2), abelian_group(l)); x = gens(GA)[]; + +julia> B = reshape([1 + x + x^6], (1, 1)); + +julia> c = LiftedCode(B, repr = representation_matrix); + +julia> code = parity_matrix(c); + +julia> code_n(c), code_k(c), code_s(c) +(63, 6, 63) +``` +""" function LiftedCode(group_elem_array::Matrix{<: GroupOrAdditiveGroupElem}; GA::GroupAlgebra=group_algebra(GF(2), parent(group_elem_array[1,1])), repr::Union{Function, Nothing}=nothing) A = zeros(GA, size(group_elem_array)...) for i in axes(group_elem_array, 1), j in axes(group_elem_array, 2) From fb42147042f4382dc5c974cd5bc1e3edaa96f3c4 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 26 Jun 2025 18:57:36 +0500 Subject: [PATCH 06/21] =?UTF-8?q?=F0=9F=A7=B9=20polish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- ext/QuantumCliffordHeckeExt/lifted.jl | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index faeb97f65..8a6d10169 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ ## v0.10.0 - 2025-06-25 -- **(fix)** The `parity_checks`, `code_n`, and `code_s` methods were throwing errors and `code_k` was not defined for the classical `LiftedCode`s. +- **(fix)** The `parity_checks`, `code_n`, and `code_s` methods were throwing method errors and `code_k` was not defined for the classical `LiftedCode`s. - **(fix)** The gates `SQRTY`, `CXYZ`, `CZYX` were computing phases incorrectly when acting on `I` stabilizers. - **(fix)** Paulis with imaginary phases had their phases incorrectly tracked. - **(fix)** `rowdecompose` was not accounting for the phase of the input Pauli string, leading to potential errors in non-Clifford functionality. diff --git a/ext/QuantumCliffordHeckeExt/lifted.jl b/ext/QuantumCliffordHeckeExt/lifted.jl index cf5ce4dbd..02b2baf5e 100644 --- a/ext/QuantumCliffordHeckeExt/lifted.jl +++ b/ext/QuantumCliffordHeckeExt/lifted.jl @@ -74,6 +74,8 @@ end Constructs a group algebra code by embedding a matrix of group elements into the specified group algebra `GA`, with optional custom representation `repr`. +# Example + ```jldoctest julia> import Hecke: group_algebra, GF, abelian_group, gens, representation_matrix From 42e5bfaa1365988179caff5484be81d7f514018e Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Fri, 27 Jun 2025 00:04:45 +0500 Subject: [PATCH 07/21] =?UTF-8?q?=F0=9F=A7=B9=20polish=20doctest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ext/QuantumCliffordHeckeExt/lifted.jl | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/ext/QuantumCliffordHeckeExt/lifted.jl b/ext/QuantumCliffordHeckeExt/lifted.jl index 02b2baf5e..8be13fbe8 100644 --- a/ext/QuantumCliffordHeckeExt/lifted.jl +++ b/ext/QuantumCliffordHeckeExt/lifted.jl @@ -83,16 +83,29 @@ julia> import QuantumClifford.ECC: LiftedCode, code_n, code_k, code_s julia> import QuantumClifford.ECC.QECCore: parity_matrix -julia> l = 63; GA = group_algebra(GF(2), abelian_group(l)); x = gens(GA)[]; +julia> l = 12; GA = group_algebra(GF(2), abelian_group(l)); x = gens(GA)[]; -julia> B = reshape([1 + x + x^6], (1, 1)); +julia> B = reshape([1 + x + x^3 + x^6], (1, 1)); julia> c = LiftedCode(B, repr = representation_matrix); -julia> code = parity_matrix(c); +julia> code = parity_matrix(c) +12×12 Matrix{Bool}: + 1 0 0 0 0 0 1 0 0 1 0 1 + 1 1 0 0 0 0 0 1 0 0 1 0 + 0 1 1 0 0 0 0 0 1 0 0 1 + 1 0 1 1 0 0 0 0 0 1 0 0 + 0 1 0 1 1 0 0 0 0 0 1 0 + 0 0 1 0 1 1 0 0 0 0 0 1 + 1 0 0 1 0 1 1 0 0 0 0 0 + 0 1 0 0 1 0 1 1 0 0 0 0 + 0 0 1 0 0 1 0 1 1 0 0 0 + 0 0 0 1 0 0 1 0 1 1 0 0 + 0 0 0 0 1 0 0 1 0 1 1 0 + 0 0 0 0 0 1 0 0 1 0 1 1 julia> code_n(c), code_k(c), code_s(c) -(63, 6, 63) +(12, 3, 12) ``` """ function LiftedCode(group_elem_array::Matrix{<: GroupOrAdditiveGroupElem}; GA::GroupAlgebra=group_algebra(GF(2), parent(group_elem_array[1,1])), repr::Union{Function, Nothing}=nothing) @@ -122,7 +135,7 @@ julia> base_matrix = [0 0 0 0; 0 1 2 5; 0 6 3 1]; l = 3; julia> c = LiftedCode(base_matrix, l); -julia> parity_matrix(c) +julia> code = parity_matrix(c) 9×12 Matrix{Bool}: 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 From ac1dd492285731f2a69ddccd6cfcec60cdb3cbb8 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Sun, 29 Jun 2025 14:18:03 +0500 Subject: [PATCH 08/21] =?UTF-8?q?=F0=9F=A7=B9=20add=20basic=20tests=20test?= =?UTF-8?q?=5Fnowarn=20that=20just=20check=20there=20is=20no=20method=20er?= =?UTF-8?q?rors=20now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_ecc_throws.jl | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/test/test_ecc_throws.jl b/test/test_ecc_throws.jl index e9b56b91d..2322c9ce6 100644 --- a/test/test_ecc_throws.jl +++ b/test/test_ecc_throws.jl @@ -1,6 +1,8 @@ @testitem "ECC throws" begin - using QuantumClifford.ECC: ReedMuller, BCH, RecursiveReedMuller, Golay, Triangular488, Triangular666 + using Hecke + using Hecke: group_algebra, GF, abelian_group, gens, one, representation_matrix + using QuantumClifford.ECC: ReedMuller, BCH, RecursiveReedMuller, Golay, Triangular488, Triangular666, LiftedCode, code_k, code_n, code_s, parity_matrix @test_throws ArgumentError ReedMuller(-1, 3) @test_throws ArgumentError ReedMuller(1, 0) @@ -19,4 +21,18 @@ @test_throws ArgumentError Triangular488(1) @test_throws ArgumentError Triangular666(8) @test_throws ArgumentError Triangular666(1) + + l = 12; GA = group_algebra(GF(2), abelian_group(l)); x = gens(GA)[] + B = reshape([1 + x + x^3 + x^6], (1, 1)) + c = LiftedCode(B, repr = representation_matrix) + @test_nowarn parity_matrix(c) + @test_nowarn code_n(c) + @test_nowarn code_k(c) + @test_nowarn code_s(c) + base_matrix = [0 0 0 0; 0 1 2 5; 0 6 3 1]; l = 3; + @test_nowarn LiftedCode(base_matrix, l); + @test_nowarn parity_matrix(c) + @test_nowarn code_n(c) + @test_nowarn code_k(c) + @test_nowarn code_s(c) end From 4e241df48c0d1a3df425ff7e90d8a5e0b056afb4 Mon Sep 17 00:00:00 2001 From: Feroz Ahmed Mian Date: Sun, 29 Jun 2025 16:00:05 +0500 Subject: [PATCH 09/21] =?UTF-8?q?=F0=9F=A7=B9=20polish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_ecc_throws.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_ecc_throws.jl b/test/test_ecc_throws.jl index 2322c9ce6..9030deacd 100644 --- a/test/test_ecc_throws.jl +++ b/test/test_ecc_throws.jl @@ -30,7 +30,7 @@ @test_nowarn code_k(c) @test_nowarn code_s(c) base_matrix = [0 0 0 0; 0 1 2 5; 0 6 3 1]; l = 3; - @test_nowarn LiftedCode(base_matrix, l); + c = LiftedCode(base_matrix, l); @test_nowarn parity_matrix(c) @test_nowarn code_n(c) @test_nowarn code_k(c) From 6bcbc41c726060ecf66fe7e749bfc91bba1c7748 Mon Sep 17 00:00:00 2001 From: Feroz Ahmed Mian Date: Thu, 3 Jul 2025 01:37:36 +0500 Subject: [PATCH 10/21] add changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4efc960d2..24ae9b288 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,13 @@ # News +## v0.10.1 - dev + +- **(fix)** The `parity_checks`, `code_n`, and `code_s` methods were throwing method errors and `code_k` was not defined for the classical `LiftedCode`s. + ## v0.10.0 - 2025-07-02 -- **(fix)** The `parity_checks`, `code_n`, and `code_s` methods were throwing method errors and `code_k` was not defined for the classical `LiftedCode`s. - **(fix)** The gates `SQRTY`, `CXYZ`, `CZYX` were computing phases incorrectly when acting on `I` stabilizers. - **(fix)** Paulis with imaginary phases had their phases incorrectly tracked. - **(fix)** `rowdecompose` was not accounting for the phase of the input Pauli string, leading to potential errors in non-Clifford functionality. From aa7fceb9c67d0f7c6a3b691d67b669c7bc43656b Mon Sep 17 00:00:00 2001 From: Feroz Ahmed Mian Date: Thu, 17 Jul 2025 12:15:09 +0500 Subject: [PATCH 11/21] use Hecke.group --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index 2ee478562..6d86153af 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -10,7 +10,7 @@ import LinearAlgebra: rank import Hecke: Group, GroupElem, AdditiveGroupElem, GroupAlgebra, GroupAlgebraElem, FqFieldElem, representation_matrix, dim, base_ring, multiplication_table, coefficients, abelian_group, group_algebra, rand, gens, order, - is_commutative + is_commutative, group import Nemo import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix From 01ca06b5d06e8271310465422f6e514c254782cd Mon Sep 17 00:00:00 2001 From: Feroz Ahmed Mian Date: Fri, 25 Jul 2025 09:38:44 +0500 Subject: [PATCH 12/21] use Hecke.group --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index 0ac3d8f92..0d5c108e9 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -9,7 +9,7 @@ import Hecke: Group, GroupElem, AdditiveGroupElem, GroupAlgebra, GroupAlgebraElem, FqFieldElem, representation_matrix, dim, base_ring, multiplication_table, coefficients, abelian_group, group_algebra, rand, gens, order, is_commutative, FqPolyRingElem, residue_ring, coeff, zero_matrix, mod1, lift, ZZ, gen, - matrix, ncols, nrows, degree + matrix, ncols, nrows, degree, group import Nemo import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix From 6098913f99536c2c74f2bfec1b866fd4221be5b1 Mon Sep 17 00:00:00 2001 From: Feroz Ahmed Mian Date: Fri, 25 Jul 2025 23:10:12 +0500 Subject: [PATCH 13/21] merge conflict update --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index 0d5c108e9..d5b1fc19e 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -4,7 +4,9 @@ using QECCore import QECCore: code_n, code_s, code_k, rate, distance using DocStringExtensions -import QuantumClifford, LinearAlgebra +import QuantumClifford +import LinearAlgebra + import Hecke: Group, GroupElem, AdditiveGroupElem, GroupAlgebra, GroupAlgebraElem, FqFieldElem, representation_matrix, dim, base_ring, multiplication_table, coefficients, abelian_group, group_algebra, rand, gens, order, From 5cd71fa76c0fc30159a0190f267607581da477fd Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Fri, 25 Jul 2025 23:43:57 +0500 Subject: [PATCH 14/21] merge conflict cleanup --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index d5b1fc19e..137fe9dc8 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -4,8 +4,7 @@ using QECCore import QECCore: code_n, code_s, code_k, rate, distance using DocStringExtensions -import QuantumClifford -import LinearAlgebra +import QuantumClifford, LinearAlgebra import Hecke: Group, GroupElem, AdditiveGroupElem, GroupAlgebra, GroupAlgebraElem, FqFieldElem, representation_matrix, dim, base_ring, @@ -13,7 +12,7 @@ import Hecke: Group, GroupElem, AdditiveGroupElem, is_commutative, FqPolyRingElem, residue_ring, coeff, zero_matrix, mod1, lift, ZZ, gen, matrix, ncols, nrows, degree, group import Nemo -import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix +import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix, rank import QuantumClifford.ECC: iscss, parity_checks, parity_matrix, two_block_group_algebra_codes, generalized_bicycle_codes, bicycle_codes, check_repr_commutation_relation, From 1b39d9a8b5d3e12ddf9f7a8b86f36cf9faee4e3f Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Sat, 9 Aug 2025 22:15:22 +0500 Subject: [PATCH 15/21] merge conflict cleanup: since code_k is recently defined in QECCore for Classical Codes, so specific code_k is not required if it's based on general formula --- CHANGELOG.md | 2 +- ext/QuantumCliffordHeckeExt/lifted.jl | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea37e47ae..62d1560d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ ## v0.10.1-dev -- **(fix)** The classical `LiftedCode` constructor had method errors in `parity_checks`, `code_n`, and `code_s`, and an undefined `code_k`. +- **(fix)** The classical `LiftedCode` constructor had method errors in `parity_checks`, `code_n`, and `code_s`. - The generalized hypergraph product code is implemented in the ECC submodule. - Add novel `[[n² + m²,(n - rank([C ∣ M]))² + (m − rank([C ∣ M]ᵀ))², d]]` quantum Tillich-Zémor `random_TillichZemor_code` codes to `QECCore` and introduce `QECCoreNemoExt` for accurate matrix `rank` computation. - The D-dimensional Surface and Toric codes are now implemented using `Oscar`'s chain complexes and `GF2` homology in the ECC submodule. diff --git a/ext/QuantumCliffordHeckeExt/lifted.jl b/ext/QuantumCliffordHeckeExt/lifted.jl index 50456bc9a..094e1d62f 100644 --- a/ext/QuantumCliffordHeckeExt/lifted.jl +++ b/ext/QuantumCliffordHeckeExt/lifted.jl @@ -177,5 +177,3 @@ end code_n(c::LiftedCode) = size(c.A, 2) * order(group(c.GA)) code_s(c::LiftedCode) = size(c.A, 1) * order(group(c.GA)) - -code_k(c::LiftedCode) = code_n(c) - rank(matrix(GF(2), parity_matrix(c))) From e9fd581da144dcae2e219508c71bf1f11e38c1b3 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 30 Oct 2025 16:23:04 -0400 Subject: [PATCH 16/21] polish --- ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl | 2 +- ext/QuantumCliffordOscarExt/bivariate_bicycle.jl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl b/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl index 33d413c23..4eaa5e134 100644 --- a/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl +++ b/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl @@ -18,7 +18,7 @@ import Oscar: free_group, small_group_identification, describe, order, FPGroupEl kronecker_product, FqMatrix, identity_matrix, iszero, FqPolyRingElem, laurent_polynomial_ring, hnf_with_transform, ideal, intersect, ==, is_coprime, quo, groebner_basis, length, FqMPolyRingElem, first, MPolyQuoRingElem, FqMPolyRingElem, modulus, ideal, monomials, terms, coeff, degree, mod, - monomial, exponent_vector, nvars + monomial, exponent_vector, nvars, EuclideanRingResidueRingElem import Oscar.Generic.MatSpaceElem import Oscar.Generic.DirectSumModule import Oscar.Generic.LaurentMPolyWrap diff --git a/ext/QuantumCliffordOscarExt/bivariate_bicycle.jl b/ext/QuantumCliffordOscarExt/bivariate_bicycle.jl index 438966673..ae9fef342 100644 --- a/ext/QuantumCliffordOscarExt/bivariate_bicycle.jl +++ b/ext/QuantumCliffordOscarExt/bivariate_bicycle.jl @@ -25,7 +25,7 @@ We consider the specific ideal generated by two polynomials enforcing periodic b ```math \\begin{aligned} -J = \\langle x^\\ell - 1, y^m - 1 \\rangle = { p(x,y)(x^\ell - 1) + q(x,y)(y^m - 1) \\mid p, q \\in \\mathbb{F}_2[x,y]} +J = \\langle x^\\ell - 1, y^m - 1 \\rangle = { p(x,y)(x^\\ell - 1) + q(x,y)(y^m - 1) \\mid p, q \\in \\mathbb{F}_2[x,y]} \\end{aligned} ``` @@ -37,7 +37,7 @@ conditions in the y-direction. Formally, to verify that ``J`` satisfies the *ideal* requirements, the properties of J are as follows: -- ``(J, +) \\leq mathbb{F}_2[x, y], +)`` +- ``(J, +) \\leq \\mathbb{F}_2[x, y], +)`` For any ``f(x,y) \\in \\mathbb{F}_2[x, y]`` and any ``j(x,y) \\in J``: - ``f(x,y) \\cdot j(x,y) \\in J`` From a5741426635dba4cd96ed6c071996f4d9718450a Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 30 Oct 2025 16:29:12 -0400 Subject: [PATCH 17/21] polish --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 2 +- ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index e2ef0355e..8e2f61544 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -10,7 +10,7 @@ import Hecke: Group, GroupElem, AdditiveGroupElem, GroupAlgebra, GroupAlgebraElem, FqFieldElem, representation_matrix, dim, base_ring, multiplication_table, coefficients, abelian_group, group_algebra, rand, gens, order, is_commutative, FqPolyRingElem, residue_ring, coeff, zero_matrix, mod1, lift, ZZ, gen, - polynomial_ring, characteristic, isone, mod, factor, zeros, group + polynomial_ring, characteristic, isone, mod, factor, zeros, group, EuclideanRingResidueRingElem import Hecke.Generic.MatSpaceElem import Nemo import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix, rank diff --git a/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl b/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl index 4eaa5e134..33d413c23 100644 --- a/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl +++ b/ext/QuantumCliffordOscarExt/QuantumCliffordOscarExt.jl @@ -18,7 +18,7 @@ import Oscar: free_group, small_group_identification, describe, order, FPGroupEl kronecker_product, FqMatrix, identity_matrix, iszero, FqPolyRingElem, laurent_polynomial_ring, hnf_with_transform, ideal, intersect, ==, is_coprime, quo, groebner_basis, length, FqMPolyRingElem, first, MPolyQuoRingElem, FqMPolyRingElem, modulus, ideal, monomials, terms, coeff, degree, mod, - monomial, exponent_vector, nvars, EuclideanRingResidueRingElem + monomial, exponent_vector, nvars import Oscar.Generic.MatSpaceElem import Oscar.Generic.DirectSumModule import Oscar.Generic.LaurentMPolyWrap From 8bacf0f3cb01e4723e7be5e4c148a479ab1e40db Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 30 Oct 2025 16:41:54 -0400 Subject: [PATCH 18/21] add LiftedCode to the CECC tests --- test/test_cecc.jl | 1 + test/test_cecc_base.jl | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/test/test_cecc.jl b/test/test_cecc.jl index cb7ce692f..8e7964c33 100644 --- a/test/test_cecc.jl +++ b/test/test_cecc.jl @@ -1,5 +1,6 @@ @testitem "ECC" tags=[:ecc, :ecc_base] begin using Nemo + using Hecke using QuantumClifford.ECC using QuantumClifford.ECC: AbstractCECC, QECCore diff --git a/test/test_cecc_base.jl b/test/test_cecc_base.jl index e4210c358..a00e7a2b7 100644 --- a/test/test_cecc_base.jl +++ b/test/test_cecc_base.jl @@ -7,6 +7,7 @@ using InteractiveUtils using SparseArrays import Nemo: GF, matrix, rank, finite_field, polynomial_ring +import Hecke: group_algebra, abelian_group, gens, representation_matrix import LinearAlgebra include("test_ecc_base.jl") @@ -40,6 +41,13 @@ R, z = polynomial_ring(F, :z) g₄ = z^2 + α^7*z + 1 L₄ = [α^i for i in 2:13] +# Lifted Codes +l₁ = 12; GA₁ = group_algebra(GF(2), abelian_group(l)); x = gens(GA)[] +B₁ = reshape([1 + x + x^3 + x^6], (1, 1)) +c = LiftedCode(B, repr = representation_matrix) + +base_matrix₂ = [0 0 0 0; 0 1 2 5; 0 6 3 1]; l₂ = 3; + const classical_code_instance_args = Dict( :RepCode => [3, 4, 5, 6, 7, 8, 9, 10], :BCH => [(3, 1), (3, 2), (4, 1), (4, 1), (5, 1), (5, 2), (6, 1), (6, 2)], @@ -48,7 +56,8 @@ const classical_code_instance_args = Dict( :Golay => [(23), (24)], :Hamming => [2, 3, 4, 5, 6, 7, 8], :GallagerLDPC => [(3, 3, 4), (3, 4, 5), (4, 5, 7), (4, 6, 7)], - :GoppaCode => [(m₁, t₁, g₁, L₁), (m₂, t₂, g₂), (m₃, t₃, g₃), (m₄, t₄, g₄, L₄)] + :GoppaCode => [(m₁, t₁, g₁, L₁), (m₂, t₂, g₂), (m₃, t₃, g₃), (m₄, t₄, g₄, L₄)], + :LiftedCode => [(B₁, repr = representation_matrix), (base_matrix₂, l₂), (base_matrix₂, 5), (base_matrix₂, 7)] ) function all_testable_classical_code_instances(; maxn=nothing) From 0582ce52eb8f1103b7c45ade759e32237cf98187 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 30 Oct 2025 16:53:26 -0400 Subject: [PATCH 19/21] add degree --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index 8e2f61544..6df30514f 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -10,7 +10,8 @@ import Hecke: Group, GroupElem, AdditiveGroupElem, GroupAlgebra, GroupAlgebraElem, FqFieldElem, representation_matrix, dim, base_ring, multiplication_table, coefficients, abelian_group, group_algebra, rand, gens, order, is_commutative, FqPolyRingElem, residue_ring, coeff, zero_matrix, mod1, lift, ZZ, gen, - polynomial_ring, characteristic, isone, mod, factor, zeros, group, EuclideanRingResidueRingElem + polynomial_ring, characteristic, isone, mod, factor, zeros, group, EuclideanRingResidueRingElem, + degree import Hecke.Generic.MatSpaceElem import Nemo import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix, rank From e76180c74012c1419e8f6f636ea9c7fa617c3543 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 30 Oct 2025 16:55:40 -0400 Subject: [PATCH 20/21] add gcd --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index 6df30514f..743b16403 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -11,7 +11,7 @@ import Hecke: Group, GroupElem, AdditiveGroupElem, multiplication_table, coefficients, abelian_group, group_algebra, rand, gens, order, is_commutative, FqPolyRingElem, residue_ring, coeff, zero_matrix, mod1, lift, ZZ, gen, polynomial_ring, characteristic, isone, mod, factor, zeros, group, EuclideanRingResidueRingElem, - degree + degree, gcd import Hecke.Generic.MatSpaceElem import Nemo import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix, rank From 1e7d4f4a441fc73a644d9e26b9ad46368e417ee9 Mon Sep 17 00:00:00 2001 From: Fe-r-oz Date: Thu, 30 Oct 2025 17:23:05 -0400 Subject: [PATCH 21/21] polish 2 --- ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl index 743b16403..ec0be7fd1 100644 --- a/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl +++ b/ext/QuantumCliffordHeckeExt/QuantumCliffordHeckeExt.jl @@ -11,7 +11,7 @@ import Hecke: Group, GroupElem, AdditiveGroupElem, multiplication_table, coefficients, abelian_group, group_algebra, rand, gens, order, is_commutative, FqPolyRingElem, residue_ring, coeff, zero_matrix, mod1, lift, ZZ, gen, polynomial_ring, characteristic, isone, mod, factor, zeros, group, EuclideanRingResidueRingElem, - degree, gcd + degree, gcd, nrows, ncols import Hecke.Generic.MatSpaceElem import Nemo import Nemo: characteristic, matrix_repr, GF, ZZ, lift, matrix, rank