HGP, part two: the compression identity, the transpose code, and the single-block weight lower #
bound (continued)
The first part (GF2/HGP) gives the construction and the CSS orthogonality. This module
supplies the three building blocks needed for the distance analysis.
1. The compression identity #
Read a vector v as two matrices over the two blocks of the column space, blockL v
($n_1\times n_2$) and blockR v ($r_1\times r_2$). Entrywise computation gives
$$H_X\, v = 0 \iff H_1 \cdot \mathrm{blockL}\,v = \mathrm{blockR}\,v \cdot H_2,\qquad H_Z\, v = 0 \iff \mathrm{blockL}\,v \cdot H_2^\top = H_1^\top \cdot \mathrm{blockR}\,v.$$
The first of the two presents the pair $U = \mathrm{blockL}\,v$, $R = \mathrm{blockR}\,v$ as a commuting square ($H_1 U = R H_2$), which is exactly the entrywise form of the "chain map" picture of the hypergraph product. Every case of the distance lower bound starts from the identity on that same side.
2. The transpose code #
Take the inputs transposed and use them as new parity-check matrices. Then the column
space of hgpHZ H₁ᵀ H₂ᵀ is $(r_1 r_2) \oplus (n_1 n_2)$ (the two blocks exchange their
shapes), and after "swapping the two blocks" its row (a, d) agrees entrywise with the
same row of hgpHX H₁ H₂:
hgpHZ H₁ᵀ H₂ᵀ x c = hgpHX H₁ H₂ x (sumComm c).
So HGP(H₁ᵀ, H₂ᵀ) is exactly the transpose code of HGP(H₁, H₂): the X-side analysis
and the Z-side analysis are two applications of one and the same argument, which is the
source of the distance of ker H₂ᵀ (the transpose-code distance) appearing in the lower
bound formula.
3. The single-block weight lower bound #
If an X-type operator has support only in the left block (blockR v = 0), the compression
identity forces every column to be a kernel vector of $H_1$; the weight of any nonzero
column is at least the left-code distance d₁, and the weight of a single column is at
most the weight of the whole vector:
d₁ ≤ hammingNorm (column) ≤ hammingNorm v
The right block gives d₂ᵀ (the distance of $\ker H_2^\top$) in the same way. The case
where both blocks are nonzero at once, that is, where the two contributions cancel each
other, requires the cleaning/quotient argument provided by GF2/HGPCleaning; this module
supplies the single-block bounds used by that argument.
Main results #
hgpHX_mulVec_eq_zero_iff/hgpHZ_mulVec_eq_zero_iff: the compression identity.hgpHZ_transpose_inputs_apply: the transpose-code relation.hgp_hammingNorm_ge_of_pure_left/_of_pure_right: the single-block weight lower bound.
Reading the blocks #
Slicing lemmas for the entrywise computation #
The compression identity #
X side, entrywise: (H_X v)_{(i,j)} = (H_1 · U)_{ij} + (R · H_2)_{ij}, where
U = blockL v and R = blockR v.
The two sums reduce by the definitions of H_X, H_1 ⊗ I and I ⊗ H_2 (at the rfl
level), and one slicing lemma each then collapses the sum over the product index into a
sum over a single index.
Compression identity (X side): $H_X v = 0 \iff H_1\,U = R\,H_2$.
The equality on the right is the statement that $(U, R)$ is a chain map; the whole case analysis of the distance lower bound unfolds from it.
The transpose code #
Transpose-code relation: the Z parity-check matrix obtained from the transposed
inputs agrees entrywise with the original X parity-check matrix, under the column
relabelling that swaps the two blocks. Hence HGP(H₁ᵀ, H₂ᵀ) is the transpose code of
HGP(H₁, H₂), and the X-side and Z-side distance analyses are two applications of one
and the same argument.
The single-block weight lower bound #
Pulling a vector back along an injection does not increase its weight (the support embeds under the injection).
Single-block weight lower bound (left): an X-type operator supported only in the
left block has weight at least the left-code distance d₁.
Every column of the left block lies in ker H₁ (compression identity plus blockR v = 0),
a nonzero column has weight at least d₁, and a single column weighs no more than the
whole vector.
Single-block weight lower bound (right): an X-type operator supported only in the
right block has weight at least the distance of ker H₂ᵀ (the transpose-code distance
d₂ᵀ), which is exactly why the transpose code appears in the lower bound formula.
Every row r_i of the right block satisfies H₂ᵀ r_i = 0 (compression identity plus
blockL v = 0).