Effective generators for a binary matrix kernel #
theorem
MIPRE.LowDegree.BinaryLinear.typedReduceStep_eq_linear
{n t : ℕ}
(r : Row n t)
(p : Pivot n t)
:
In characteristic two, conditional row addition is a linear map.
Equations
- MIPRE.LowDegree.BinaryLinear.reduceStepLinear p = LinearMap.id + (LinearMap.proj p.1 ∘ₗ LinearMap.fst (ZMod 2) (Fin n → ZMod 2) (Fin t → ZMod 2)).smulRight p.2
Instances For
@[simp]
theorem
MIPRE.LowDegree.BinaryLinear.reduceStepLinear_apply
{n t : ℕ}
(p : Pivot n t)
(r : Row n t)
:
@[simp]
theorem
MIPRE.LowDegree.BinaryLinear.reduceLinear_apply
{n t : ℕ}
(b : List (Pivot n t))
(r : Row n t)
:
Compute at most n generators of an m-by-n binary matrix kernel.
The explicit unary input is the number of columns.
Equations
- One or more equations did not get rendered due to their size.
Instances For
theorem
MIPRE.LowDegree.BinaryLinear.kernelGeneratorsProg_encoding
{m n : ℕ}
(A : Matrix (Fin m) (Fin n) (ZMod 2))
:
kernelGeneratorsProg.toFun (Cost.unary n, matrixBits A) = List.ofFn fun (j : Fin n) => vectorBits ((kernelMap A) (Pi.single j 1))
The raw program prints canonical vectors spanning the full matrix kernel.
theorem
MIPRE.LowDegree.BinaryLinear.kernelGeneratorsProg_correct
{m n : ℕ}
(A : Matrix (Fin m) (Fin n) (ZMod 2))
:
(kernelGeneratorsProg.toFun (Cost.unary n, matrixBits A)).length = n ∧ (∀ v ∈ kernelGeneratorsProg.toFun (Cost.unary n, matrixBits A),
List.length v = n ∧ vectorValue n v ∈ A.mulVecLin.ker) ∧ Submodule.span (ZMod 2)
{x : Fin n → ZMod 2 | ∃ v ∈ kernelGeneratorsProg.toFun (Cost.unary n, matrixBits A), vectorValue n v = x} = A.mulVecLin.ker
The generated family has polynomial length and every vector lies in the kernel.