Research source · python

verify-flat-koszul-blocks.py

site/public/evidence/sylvester-mobius-syzygies/verify-flat-koszul-blocks.py

321 lines. Source is displayed for inspection; it is not executed by this page.

File fingerprint

SHA-256: ea17f7712ed8c4a95b4de27192938f9859a1663e72775e2d7b8a23acd73fc174

#!/usr/bin/env python3
"""Dependency-free exact calibration for flatwise GMA Koszul blocks.

For the graded Moebius algebra A(M), the basis vectors of the Koszul
complex are pairs (F, J), with F a flat and J an exterior subset.  The
script verifies that

    X(F, J) = closure(F union J)

is preserved by every nonzero differential term.  It then computes H_2
over Q both globally and as the sum of its X-labelled blocks.

The examples are deliberately structural controls:

* U(2,6), PG(2,2), and AG(2,3) are Sylvester examples used in the source;
* M(K4) is quadratic but not Sylvester, and should have beta_(2,4) = 3.

All matrix ranks use sparse Gaussian elimination with Fraction, so the
reported values are exact over Q and require only the Python standard
library.
"""

from __future__ import annotations

from dataclasses import dataclass
from fractions import Fraction
from itertools import combinations
from typing import Callable, Iterable


Subset = frozenset[int]
BasisVector = tuple[Subset, tuple[int, ...]]


def gf_rank(rows: list[list[int]], prime: int) -> int:
    """Rank of a small matrix over the prime field GF(prime)."""
    if not rows:
        return 0
    matrix = [[entry % prime for entry in row] for row in rows]
    row_count, column_count = len(matrix), len(matrix[0])
    rank = 0
    for column in range(column_count):
        pivot = next(
            (row for row in range(rank, row_count) if matrix[row][column]),
            None,
        )
        if pivot is None:
            continue
        matrix[rank], matrix[pivot] = matrix[pivot], matrix[rank]
        inverse = pow(matrix[rank][column], -1, prime)
        matrix[rank] = [(inverse * entry) % prime for entry in matrix[rank]]
        for row in range(row_count):
            if row == rank or not matrix[row][column]:
                continue
            factor = matrix[row][column]
            matrix[row] = [
                (entry - factor * pivot_entry) % prime
                for entry, pivot_entry in zip(matrix[row], matrix[rank])
            ]
        rank += 1
        if rank == row_count:
            break
    return rank


def rational_sparse_rank(rows: Iterable[dict[int, int]]) -> int:
    """Exact row rank over Q for a sparse integer matrix."""
    pivots: dict[int, dict[int, Fraction]] = {}
    for integer_row in rows:
        row = {
            column: Fraction(value)
            for column, value in integer_row.items()
            if value
        }
        while row:
            column = min(row)
            if column not in pivots:
                leading = row[column]
                row = {key: value / leading for key, value in row.items()}
                pivots[column] = row
                break
            factor = row[column]
            for key, value in pivots[column].items():
                updated = row.get(key, Fraction(0)) - factor * value
                if updated:
                    row[key] = updated
                else:
                    row.pop(key, None)
    return len(pivots)


@dataclass(frozen=True)
class Matroid:
    name: str
    size: int
    rank_function: Callable[[Subset], int]

    def rank(self, subset: Subset) -> int:
        return self.rank_function(subset)

    def closure(self, subset: Subset) -> Subset:
        rank = self.rank(subset)
        return frozenset(
            element
            for element in range(self.size)
            if self.rank(subset | {element}) == rank
        )

    def flats(self) -> list[Subset]:
        all_flats = {
            self.closure(frozenset(subset))
            for length in range(self.size + 1)
            for subset in combinations(range(self.size), length)
        }
        return sorted(all_flats, key=lambda flat: (self.rank(flat), tuple(flat)))


def uniform_rank_two(size: int) -> Matroid:
    return Matroid(f"U(2,{size})", size, lambda subset: min(2, len(subset)))


def vector_matroid(
    name: str, columns: list[tuple[int, ...]], prime: int
) -> Matroid:
    def rank_function(subset: Subset) -> int:
        rows = [
            [columns[column][coordinate] for column in subset]
            for coordinate in range(len(columns[0]))
        ]
        return gf_rank(rows, prime)

    return Matroid(name, len(columns), rank_function)


def fano_plane() -> Matroid:
    columns = [tuple((value >> bit) & 1 for bit in range(3)) for value in range(1, 8)]
    return vector_matroid("PG(2,2)", columns, 2)


def affine_plane_order_three() -> Matroid:
    columns = [(x, y, 1) for x in range(3) for y in range(3)]
    return vector_matroid("AG(2,3)", columns, 3)


def complete_graph_four() -> Matroid:
    edges = list(combinations(range(4), 2))
    columns = []
    for left, right in edges:
        column = tuple(
            int(vertex == left) + int(vertex == right) for vertex in range(3)
        )
        columns.append(column)
    return vector_matroid("M(K4)", columns, 2)


def koszul_basis(
    matroid: Matroid,
    flats_by_rank: dict[int, list[Subset]],
    homological_degree: int,
    internal_degree: int,
) -> list[BasisVector]:
    coefficient_degree = internal_degree - homological_degree
    if coefficient_degree < 0:
        return []
    return [
        (flat, wedge)
        for flat in flats_by_rank.get(coefficient_degree, [])
        for wedge in combinations(range(matroid.size), homological_degree)
    ]


def total_flat(matroid: Matroid, vector: BasisVector) -> Subset:
    flat, wedge = vector
    return matroid.closure(flat | frozenset(wedge))


def differential_rows(
    matroid: Matroid,
    source: list[BasisVector],
    target: list[BasisVector],
) -> tuple[list[dict[int, int]], list[dict[int, int]]]:
    """Return a differential as sparse rows and sparse columns."""
    target_index = {vector: index for index, vector in enumerate(target)}
    rows: list[dict[int, int]] = [dict() for _ in target]
    columns: list[dict[int, int]] = [dict() for _ in source]
    for source_index, (flat, wedge) in enumerate(source):
        flat_rank = matroid.rank(flat)
        source_label = total_flat(matroid, (flat, wedge))
        for position, element in enumerate(wedge):
            joined = matroid.closure(flat | {element})
            if matroid.rank(joined) != flat_rank + 1:
                continue
            output = (joined, wedge[:position] + wedge[position + 1 :])
            assert total_flat(matroid, output) == source_label
            target_row = target_index[output]
            value = -1 if position % 2 else 1
            rows[target_row][source_index] = value
            columns[source_index][target_row] = value
    return rows, columns


def assert_chain_zero(
    first_columns: list[dict[int, int]],
    second_columns: list[dict[int, int]],
) -> None:
    """Assert that the product of two consecutive differentials is zero."""
    for source_column in second_columns:
        composite: dict[int, int] = {}
        for middle_index, second_value in source_column.items():
            for target_index, first_value in first_columns[middle_index].items():
                composite[target_index] = (
                    composite.get(target_index, 0)
                    + second_value * first_value
                )
        assert not {index: value for index, value in composite.items() if value}


def restricted_rank(
    rows: list[dict[int, int]],
    target_labels: list[Subset],
    source_labels: list[Subset],
    label: Subset,
) -> int:
    selected_columns = [
        index for index, source_label in enumerate(source_labels) if source_label == label
    ]
    column_map = {old: new for new, old in enumerate(selected_columns)}
    selected_rows = []
    for row, target_label in zip(rows, target_labels):
        if target_label != label:
            continue
        selected_rows.append(
            {column_map[column]: value for column, value in row.items()}
        )
    return rational_sparse_rank(selected_rows)


def three_circuit_counts(matroid: Matroid) -> list[int]:
    counts = []
    for left, right in combinations(range(matroid.size), 2):
        counts.append(
            sum(
                1
                for third in range(matroid.size)
                if third not in {left, right}
                and matroid.rank(frozenset({left, right, third})) == 2
            )
        )
    return counts


def audit(matroid: Matroid) -> list[str]:
    flats = matroid.flats()
    flats_by_rank: dict[int, list[Subset]] = {}
    for flat in flats:
        flats_by_rank.setdefault(matroid.rank(flat), []).append(flat)
    matroid_rank = matroid.rank(frozenset(range(matroid.size)))
    circuit_counts = three_circuit_counts(matroid)
    sylvester = min(circuit_counts) > 0
    output = [
        (
            f"{matroid.name}: n={matroid.size}, rank={matroid_rank}, "
            f"flats={len(flats)}, Sylvester={sylvester}, "
            f"third-points-per-pair=[{min(circuit_counts)},{max(circuit_counts)}]"
        )
    ]

    for internal_degree in range(3, matroid_rank + 3):
        k1 = koszul_basis(matroid, flats_by_rank, 1, internal_degree)
        k2 = koszul_basis(matroid, flats_by_rank, 2, internal_degree)
        k3 = koszul_basis(matroid, flats_by_rank, 3, internal_degree)
        d2_rows, d2_columns = differential_rows(matroid, k2, k1)
        d3_rows, d3_columns = differential_rows(matroid, k3, k2)
        assert_chain_zero(d2_columns, d3_columns)

        rank_d2 = rational_sparse_rank(d2_rows)
        rank_d3 = rational_sparse_rank(d3_rows)
        h2 = len(k2) - rank_d2 - rank_d3

        labels1 = [total_flat(matroid, vector) for vector in k1]
        labels2 = [total_flat(matroid, vector) for vector in k2]
        labels3 = [total_flat(matroid, vector) for vector in k3]
        all_labels = sorted(
            set(labels1 + labels2 + labels3),
            key=lambda flat: (matroid.rank(flat), tuple(flat)),
        )
        block_h2 = 0
        nonzero_blocks = 0
        for label in all_labels:
            block_k2 = sum(block_label == label for block_label in labels2)
            block_rank_d2 = restricted_rank(
                d2_rows, labels1, labels2, label
            )
            block_rank_d3 = restricted_rank(
                d3_rows, labels2, labels3, label
            )
            block_dimension = block_k2 - block_rank_d2 - block_rank_d3
            assert block_dimension >= 0
            block_h2 += block_dimension
            nonzero_blocks += int(block_dimension > 0)
        assert h2 == block_h2
        output.append(
            f"  degree {internal_degree}: dim K2={len(k2)}, "
            f"rank(d2)={rank_d2}, rank(d3)={rank_d3}, "
            f"H2={h2}, block-sum={block_h2}, "
            f"nonzero-blocks={nonzero_blocks}"
        )
    return output


if __name__ == "__main__":
    examples = [
        uniform_rank_two(6),
        fano_plane(),
        affine_plane_order_three(),
        complete_graph_four(),
    ]
    for position, example in enumerate(examples):
        if position:
            print()
        print("\n".join(audit(example)))