Research source · python

matrix_vass_review.py

site/public/research-artifacts/result-review-2026-09-01-batch-19/matrix_vass_review.py

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

File fingerprint

SHA-256: 5c1f7fb299ccffea7e30c8fa0ab0d3c2ce62e6cc5f34ec0324436fb0b39d15e0

#!/usr/bin/env python3
"""Independent finite checks for the matrix-power and reversible-rewriting review.

The matrix checks are exact integer computations.  The rewriting check uses a
small dependency-free Buchberger implementation over Q, independently of the
reachability search it is compared with.
"""

from __future__ import annotations

from collections import deque
from fractions import Fraction
from itertools import combinations, permutations, product
import json
import math


def matmul(a, b):
    n = len(a)
    return tuple(
        tuple(sum(a[i][k] * b[k][j] for k in range(n)) for j in range(n))
        for i in range(n)
    )


def eye(n):
    return tuple(tuple(int(i == j) for j in range(n)) for i in range(n))


def nonnegative(a):
    return all(x >= 0 for row in a for x in row)


def signed_permutation_matrix(perm, signs):
    n = len(perm)
    return tuple(
        tuple(signs[i] if j == perm[i] else 0 for j in range(n))
        for i in range(n)
    )


def signed_permutation_audit():
    checked = 0
    positive_hits = 0
    maximum_period = 0
    for n in range(1, 6):
        ident = eye(n)
        for perm in permutations(range(n)):
            for signs in product((-1, 1), repeat=n):
                m = signed_permutation_matrix(perm, signs)
                powers = [ident]
                p = ident
                while True:
                    p = matmul(p, m)
                    if p == ident:
                        break
                    powers.append(p)
                    assert len(powers) <= 2 * math.lcm(*range(1, n + 1))
                period = len(powers)
                good = {k for k, value in enumerate(powers) if nonnegative(value)}
                # Multiples of a good positive exponent stay good.
                for k in good - {0}:
                    assert all((r * k) % period in good for r in range(1, period + 1))
                checked += 1
                positive_hits += bool(good - {0})
                maximum_period = max(maximum_period, period)
    return {
        "signed_permutation_matrices": checked,
        "with_positive_nonnegative_power": positive_hits,
        "maximum_group_period": maximum_period,
    }


def signed_cycle_first_hit(p):
    perm = tuple((i + 1) % p for i in range(p))
    signs = (-1,) + (1,) * (p - 1)
    m = signed_permutation_matrix(perm, signs)
    power = eye(p)
    for n in range(1, 2 * p + 1):
        power = matmul(power, m)
        if nonnegative(power):
            return n
    raise AssertionError("signed cycle did not attain its predicted hit")


def matrix_lrs_audit():
    matrices = 0
    entry_recurrences = 0
    interleaved_values = 0
    quantifier_separations = 0
    for entries in product((-1, 0, 1), repeat=4):
        m = (entries[:2], entries[2:])
        powers = [eye(2)]
        for _ in range(12):
            powers.append(matmul(powers[-1], m))
        trace = m[0][0] + m[1][1]
        determinant = m[0][0] * m[1][1] - m[0][1] * m[1][0]
        for i, j in product(range(2), repeat=2):
            for n in range(11):
                assert powers[n + 2][i][j] == (
                    trace * powers[n + 1][i][j] - determinant * powers[n][i][j]
                )
                entry_recurrences += 1
        entries_by_index = [(i, j) for i in range(2) for j in range(2)]
        interleaved = [
            powers[n][i][j]
            for n in range(13)
            for i, j in entries_by_index
        ]
        for n in range(13):
            for r, (i, j) in enumerate(entries_by_index):
                assert interleaved[4 * n + r] == powers[n][i][j]
                interleaved_values += 1
        good = [nonnegative(p) for p in powers]
        if any(good[1:]) and not all(good[7:]):
            quantifier_separations += 1
        matrices += 1
    assert signed_cycle_first_hit(3) == 6
    assert signed_cycle_first_hit(5) == 10
    assert signed_cycle_first_hit(7) == 14
    assert signed_cycle_first_hit(11) == 22
    assert not nonnegative(((-1,),)) and nonnegative(((1,),))
    return {
        "small_integer_matrices": matrices,
        "cayley_hamilton_entry_checks": entry_recurrences,
        "interleaved_value_checks": interleaved_values,
        "bounded_quantifier_separations": quantifier_separations,
        "signed_cycle_primes": [3, 5, 7, 11],
    }


def monomials(nvars, degree):
    if nvars == 1:
        return [(degree,)]
    answer = []
    for first in range(degree + 1):
        for rest in monomials(nvars - 1, degree - first):
            answer.append((first,) + rest)
    return answer


def divides(a, b):
    return all(x <= y for x, y in zip(a, b))


def sub(a, b):
    return tuple(x - y for x, y in zip(a, b))


def add(a, b):
    return tuple(x + y for x, y in zip(a, b))


def reachable(source, target, rules):
    todo = deque([source])
    seen = {source}
    while todo:
        current = todo.popleft()
        if current == target:
            return True
        for left, right in rules:
            for before, after in ((left, right), (right, left)):
                if divides(before, current):
                    nxt = add(sub(current, before), after)
                    if nxt not in seen:
                        seen.add(nxt)
                        todo.append(nxt)
    return False


def poly_clean(p):
    return {m: c for m, c in p.items() if c}


def poly_add(p, q, factor=Fraction(1)):
    out = dict(p)
    for m, c in q.items():
        out[m] = out.get(m, Fraction(0)) + factor * c
    return poly_clean(out)


def poly_mul_monomial(p, monomial, coefficient=Fraction(1)):
    return {add(m, monomial): coefficient * c for m, c in p.items()}


def leading(p):
    m = max(p)
    return m, p[m]


def reduce_poly(p, basis):
    p = poly_clean(p)
    remainder = {}
    while p:
        lm, lc = leading(p)
        divisor = None
        for g in basis:
            gm, gc = leading(g)
            if divides(gm, lm):
                divisor = (g, gm, gc)
                break
        if divisor is None:
            remainder[lm] = remainder.get(lm, Fraction(0)) + lc
            del p[lm]
        else:
            g, gm, gc = divisor
            p = poly_add(
                p,
                poly_mul_monomial(g, sub(lm, gm), lc / gc),
                factor=Fraction(-1),
            )
    return poly_clean(remainder)


def s_polynomial(f, g):
    fm, fc = leading(f)
    gm, gc = leading(g)
    lcm = tuple(max(x, y) for x, y in zip(fm, gm))
    first = poly_mul_monomial(f, sub(lcm, fm), Fraction(1, 1) / fc)
    second = poly_mul_monomial(g, sub(lcm, gm), Fraction(1, 1) / gc)
    return poly_add(first, second, factor=Fraction(-1))


def groebner(generators):
    basis = [poly_clean(g) for g in generators if poly_clean(g)]
    pairs = deque(combinations(range(len(basis)), 2))
    while pairs:
        i, j = pairs.popleft()
        remainder = reduce_poly(s_polynomial(basis[i], basis[j]), basis)
        if remainder:
            new_index = len(basis)
            basis.append(remainder)
            for old in range(new_index):
                pairs.append((old, new_index))
    return basis


def binomial(left, right):
    if left == right:
        return {}
    return poly_clean({left: Fraction(-1), right: Fraction(1)})


def ideal_contains_difference(source, target, basis):
    return not reduce_poly(binomial(source, target), basis)


def reversible_rewriting_audit():
    systems = 0
    queries = 0
    nvars = 2
    rule_monomials = monomials(nvars, 2)
    rule_universe = list(combinations(rule_monomials, 2))
    for mask in range(1 << len(rule_universe)):
        rules = [rule_universe[i] for i in range(len(rule_universe)) if mask & (1 << i)]
        basis = groebner([binomial(a, b) for a, b in rules])
        systems += 1
        for degree in range(1, 6):
            states = monomials(nvars, degree)
            for source in states:
                for target in states:
                    assert reachable(source, target, rules) == ideal_contains_difference(
                        source, target, basis
                    )
                    queries += 1

    # Three-variable hostile extension with a fixed six-edge rule universe.
    nvars = 3
    degree_two = monomials(nvars, 2)
    selected_edges = [
        (degree_two[0], degree_two[1]),
        (degree_two[1], degree_two[2]),
        (degree_two[0], degree_two[3]),
        (degree_two[2], degree_two[4]),
        (degree_two[3], degree_two[5]),
        (degree_two[4], degree_two[5]),
    ]
    for mask in range(1 << len(selected_edges)):
        rules = [selected_edges[i] for i in range(len(selected_edges)) if mask & (1 << i)]
        basis = groebner([binomial(a, b) for a, b in rules])
        systems += 1
        states = monomials(nvars, 3)
        for source in states:
            for target in states:
                assert reachable(source, target, rules) == ideal_contains_difference(
                    source, target, basis
                )
                queries += 1

    # Ideals forget orientation: y-x is in <y-x>, but y cannot reach x
    # in the one-way system x -> y.
    x, y = (1, 0), (0, 1)
    directed_reverse_reachable = False
    directed_ideal_membership = ideal_contains_difference(y, x, groebner([binomial(x, y)]))
    assert directed_ideal_membership and not directed_reverse_reachable
    return {
        "degree_preserving_reversible_systems": systems,
        "reachability_ideal_comparisons": queries,
        "directed_hostile_example": {
            "reverse_reachable": directed_reverse_reachable,
            "ideal_membership": directed_ideal_membership,
        },
    }


def main():
    output = {
        "matrix_lrs": matrix_lrs_audit(),
        "signed_permutations": signed_permutation_audit(),
        "reversible_rewriting": reversible_rewriting_audit(),
        "status": "pass",
    }
    print(json.dumps(output, indent=2, sort_keys=True))


if __name__ == "__main__":
    main()