From c3a5b6b7afec35d259c29bc2d8bb8516e975ad31 Mon Sep 17 00:00:00 2001 From: littleBro <3585850+littleBro@users.noreply.github.com> Date: Tue, 13 Oct 2026 03:46:04 +0000 Subject: [PATCH] Certify 33 fixed Clifford register-word exclusions Add a standalone support, rank and torus certificate replay for fixed three-block words, with exact controls and explicit mathematical scope. No new integer-multiplication exponent is claimed. --- .../.gitattributes | 2 + .../MANIFEST.json | 18 ++ .../clifford-relation-obstructions/NOTICE.md | 34 +++ .../ORIGINS.json | 15 ++ .../clifford-relation-obstructions/PROOF.md | 132 ++++++++++ .../clifford-relation-obstructions/README.md | 105 ++++++++ .../VALIDATION.json | 41 +++ .../certificates.json.gz | Bin 0 -> 128009 bytes .../clifford-relation-obstructions/dense.py | 130 ++++++++++ .../independent.py | 176 +++++++++++++ .../clifford-relation-obstructions/model.py | 190 ++++++++++++++ .../rank_support.py | 80 ++++++ .../clifford-relation-obstructions/support.py | 194 ++++++++++++++ .../clifford-relation-obstructions/torus.py | 198 +++++++++++++++ .../clifford-relation-obstructions/verify.py | 237 ++++++++++++++++++ 15 files changed, 1552 insertions(+) create mode 100644 research/clifford-relation-obstructions/.gitattributes create mode 100644 research/clifford-relation-obstructions/MANIFEST.json create mode 100644 research/clifford-relation-obstructions/NOTICE.md create mode 100644 research/clifford-relation-obstructions/ORIGINS.json create mode 100644 research/clifford-relation-obstructions/PROOF.md create mode 100644 research/clifford-relation-obstructions/README.md create mode 100644 research/clifford-relation-obstructions/VALIDATION.json create mode 100644 research/clifford-relation-obstructions/certificates.json.gz create mode 100644 research/clifford-relation-obstructions/dense.py create mode 100644 research/clifford-relation-obstructions/independent.py create mode 100644 research/clifford-relation-obstructions/model.py create mode 100644 research/clifford-relation-obstructions/rank_support.py create mode 100644 research/clifford-relation-obstructions/support.py create mode 100644 research/clifford-relation-obstructions/torus.py create mode 100644 research/clifford-relation-obstructions/verify.py diff --git a/research/clifford-relation-obstructions/.gitattributes b/research/clifford-relation-obstructions/.gitattributes new file mode 100644 index 0000000000..44a23d1fe3 --- /dev/null +++ b/research/clifford-relation-obstructions/.gitattributes @@ -0,0 +1,2 @@ +* text eol=lf +*.gz binary diff --git a/research/clifford-relation-obstructions/MANIFEST.json b/research/clifford-relation-obstructions/MANIFEST.json new file mode 100644 index 0000000000..978b8c04e9 --- /dev/null +++ b/research/clifford-relation-obstructions/MANIFEST.json @@ -0,0 +1,18 @@ +{ + "files_sha256": { + ".gitattributes": "abeba78466be388a1c5f3cb4ad595b915a0aa9402d1d87e37dfe42762e5b91c5", + "dense.py": "760df8621caaa81ab841df39667f910b45b40d9167c02747db346e80649632af", + "independent.py": "6440b846d1dafd540f8d5192602a7e38abf8db5963848306838b8686dd70a954", + "model.py": "5d8c14e1aa62185fcb75725f0c337f00423642cebf121545d38a024567fc6dbf", + "NOTICE.md": "51a6115711b865339854be0d074821a4d360ddc0392c6617e52c118beb64e1b2", + "ORIGINS.json": "afa172d5f1fc8083f8595b7d43c023b834b76e0689a6fe9d66c225c6e92f845a", + "PROOF.md": "62f1f0adaead9ba8beb80118015d6feb81fc120e54a7cc0a0577587f8d5c8eeb", + "rank_support.py": "8999d8cc1a630db23578779cd9b30d15c426917037fbbaaca18b2d390da8bcfb", + "README.md": "9a2f98e47fdab88147630be1c13d108313ec7520612b60c81e60ef587577dc45", + "support.py": "c2dc7ccf0c0e4c7a0513a897ccadda6ffa745d6a0de1addda8b51e9ff956e25d", + "torus.py": "000db69c7d6dc3844655a39fea020cad4354d86793117ccc9ecc3f2863c06ab2", + "VALIDATION.json": "6c235f3c9f055ea87a0a31a6f262711f9f3b93c8c37160c243e6f865a205cd27", + "verify.py": "922c0b18c51155628cf32762479fb3d45721f9a317c93f6288a18e65d80d67d2" + }, + "certificate_payload_sha256": "dafd07d683df169f3c1613bc9ecbab054ce66581d93e7ef0c649286ec2eddc6c" +} diff --git a/research/clifford-relation-obstructions/NOTICE.md b/research/clifford-relation-obstructions/NOTICE.md new file mode 100644 index 0000000000..c14ac4d339 --- /dev/null +++ b/research/clifford-relation-obstructions/NOTICE.md @@ -0,0 +1,34 @@ +# Attribution and source scope + +Prepared by [littleBro](https://github.com/littleBro) with substantial OpenAI +Codex assistance in the research, implementation, proof exposition, packaging +and validation. New contribution under the repository's Apache-2.0 license. +No independent human review or contributor endorsement is represented as +completed. + +The open complex m=3, W=3, s=8 register problem and prior exclusions are +credited to eumemic's [PR #288](https://github.com/CrocSwap/integer-mult-bounds/pull/288), +pinned at `475a088b5862f75f0b10596cfd6842d19531a5ec`, and the predecessors it +credits, including Swapnil Jain's closed-ideas list and P1/P2 and the upstream +Clifford-frame framework. This package does not claim to originate that problem +or the general algebraic methods. + +The implementation is a focused extraction and adaptation of same-author +local exploratory packages. `ORIGINS.json` records hashes of those source +snapshots and of the earlier proof payload. Those provenance hashes are not +external dependencies or a claim that the snapshots were publicly reviewed. +All code and exact witnesses required here are supplied in this directory. + +The source target is CrocSwap/integer-mult-bounds main at +`66849e1475c930fd7732b1a0067ffee7e1e95f60`. Its selected construction was not +changed or replayed as part of this standalone contribution. At that base, +the selected kappa was 0.001635527380375392, conditional as stated in the +selected record and maintainer review. + +Overlap review read the earlier open-PR metadata through #661 and refreshed +recent metadata through #666. PR #620 concerns E8/decoder research; #634 +concerns coding-gap and minrank questions; #651 concerns fixed K-triangle +delivery; #661 concerns fixed-order R420 frame optimality; #662 accelerates +existing helper checks. None of those descriptions supplies these 33 fixed +register-word certificates. This comparison is not an audit of every PR diff +or a proof of literature novelty. The scoped result remains open to review. diff --git a/research/clifford-relation-obstructions/ORIGINS.json b/research/clifford-relation-obstructions/ORIGINS.json new file mode 100644 index 0000000000..558ab920ca --- /dev/null +++ b/research/clifford-relation-obstructions/ORIGINS.json @@ -0,0 +1,15 @@ +{ + "note": "Same-author unpublished research snapshots. These hashes record extraction provenance only; all runtime source and evidence needed for this contribution are included here.", + "local_snapshot_source_sha256": { + "small-register-search/search.py": "4937080f884c6074533e78f296294dbde29c30c93d53b9bc876ff2df15d82811", + "full-block-evolution/verify_blocks.py": "555c83180a34f796b30a97fee66a38b4fcefba3d297d012ea8ba1c73ecede4ef", + "symbolic-generator-evolution/symbolic.py": "953c97bb2eda709ee11e5d4079310f3dd3a196cbba30e52f9fad51d3faea2fcc", + "relation-evolution/support.py": "959f9b730d8c85b1c23efdc9ebfa80e206b01220a4ab77a3d855e6d824ca209b", + "relation-evolution/rank_support.py": "78ced44eb2c5d041955d7816ab5a24d939794971f6e06f9702e3fcdd1ab3b99a", + "relation-evolution/binomial.py": "78ac7052807f65e0c0210ea6769cc1e0db309e78aec3ae18335316758fd6bec8", + "relation-evolution/independent.py": "fe303facfcb59bab2c5738be8fae0f7a99a9719f702fb3aa5300b3f24c1781a0", + "small-register-search/audit.py": "ed8bf19248108f05a940907b1d0dffe471b9277b5ab517bf0e3661863ed774af" + }, + "original_solutions_payload_sha256": "67c74c0c03942f9d6936f9cf8f09e2961750f7d8174ed8097e46493f408df3d2", + "certificate_payload_sha256": "dafd07d683df169f3c1613bc9ecbab054ce66581d93e7ef0c649286ec2eddc6c" +} diff --git a/research/clifford-relation-obstructions/PROOF.md b/research/clifford-relation-obstructions/PROOF.md new file mode 100644 index 0000000000..469f3fdfe2 --- /dev/null +++ b/research/clifford-relation-obstructions/PROOF.md @@ -0,0 +1,132 @@ +# Model and certificate argument + +This written argument concerns the 33 supplied formal words, with arbitrary +complex scalar coefficients. The executable certificate is not a Lean proof. + +## Operators and endpoint + +Use basis vectors |x> indexed by x in F2^3. Let X_v translate x by v, and +Z_v multiply |x> by (-1)^(v dot x). The paid gate, for nonzero v, is + + C_v = ((1+i)/2) I + ((1-i)/2) X_v. + +In particular C_v^2 = X_v. Each occurrence is charged one paid call. The free +unaries are S_j|x> = i^(x_j)|x>, X_j, Z_j, directed CNOT gates +x -> x + x_a e_b, and CZ gates (-1)^(x_a x_b). The 18 free gate indices are +listed explicitly in `model.py`. Their words are fixed inputs, not additional +optimization variables in the exclusion. + +Let G be their projective Clifford group, represented by conjugation on the +six Pauli generators. A Pauli is encoded as i^p X^x Z^z. Scalars that give the +same conjugation action are identified. Let D be the diagonal Pauli subspace +and H its monomial stabilizer. The frame key of g records g^-1(D); equal frame +keys specify the same left coset H g. The Fourier rank rho(g) is the binary +rank of the X parts of the images of the three Z generators. It is constant +on each left H coset. + +A word is a 3-by-3 matrix over C[G], built from fixed unary diagonal matrices +and three arbitrary scalar matrices in GL(3,C). Its required endpoint is: +for each input column s, all nonzero group coefficients across the output +rows lie in one coset H g_s with rho(g_s)=3. This is the precise condition +being excluded. No finite 8-by-8 matrix representation is assumed linearly +independent. The negative conclusion is in the formal group algebra. + +For an intended tensor realization the inherited phase-quotient convention +requires multiplicity divisible by four. The finite dense controls verify +projective operators, not all tensor sizes, compilation or paid bit costs. + +## Necessary Boolean conditions + +Expand the word by paths. A path chooses one scalar entry per block and +contributes their product to one output/input/group coefficient. Equal group +labels are collected before endpoint constraints. The saved words have +coefficient one on each resulting path monomial; the arithmetic checker +explicitly checks this condition when reducing to binomial equations. + +Each scalar entry has a Boolean variable meaning nonzero. Invertibility +requires a nonzero determinant permutation term, although such a term alone +does not imply invertibility. Choose exactly one admissible full-rank frame +per input column. Every coefficient outside that frame must vanish. Exactly +one active monomial in such a coefficient is impossible, so the formula +forbids it. Allowing two or more active terms is only a relaxation. + +There is also a necessary whole-matrix matching test. Augmentation g -> 1 +maps the invertible word to the product of its scalar blocks. If positions +with any full-rank term admit no perfect matching, its augmented endpoint +would be singular. The formula then includes an empty clause. + +Boolean UNSAT is checked by a tree of binary splits, unit reasons and conflict +clauses. The replay uses literal lists, separately from the solver's bitset +propagation. A surviving Boolean model is not an arithmetic solution. + +## Invertibility constraints + +Write a three-block word, in matrix-composition order, as + + diag(w) C diag(v) B diag(u) A diag(t). + +For each middle product g = v_i u_j, let M_g retain the entries B_ij with +that product. Before the outside unaries its coefficient matrix is + + R_g = C M_g A. + +At position (r,s) the outside operations relabel g as w_r g t_s, a bijection +on labels. The chosen endpoint frames thus determine allowed positions of R_g. + +Only classes occupying distinct rows and distinct columns of B receive the +following strengthening. Such an M_g is a partial permutation with scalars. + +1. A required zero column of R_g implies M_g A(:,s)=0 since C is invertible. + Distinct occupied rows imply B_ij A_js=0 at every occupied position. +2. A required zero row implies C(r,:) M_g=0 since A is invertible. + Distinct occupied columns imply C_ri B_ij=0. +3. rank(R_g)=rank(M_g) equals the number of nonzero retained B entries. + A matrix supported on a graph has rank no larger than that graph's maximum + matching. The allowed positions of R_g must admit a matching at least as + large as every active subset of retained B entries. + +These implications yield necessary clauses. Nonpartial classes are left to +the weaker filter. Omitting these constraints cannot create a false exclusion. +The independent encoding builds middle classes from unary group products; +the producer's encoding builds them from path monomials. Their full formulas +are compared for every supplied word. + +## Torus refutations and learned clauses + +Fix one exact entry support and three selected frames. Every retained entry +is in C*. When every unwanted coefficient has at most two active monomials, +its nontrivial equation is x^a+x^b=0, equivalently x^(a-b)=-1. + +The certificate performs unimodular integer row and column operations on the +exponent matrix. Row operations preserve the torus equations; columns give +an invertible monomial substitution x_j=product(z_i^V_ji). A positive diagonal +and zero rows suffice; Smith divisibility is not needed. An odd right-hand +parity on a zero row is inconsistent. + +Otherwise a diagonal entry 1 fixes a sign. An entry 2 with even parity has +both signs as components. Other torsion or excessive component counts are +left unresolved by the arithmetic producer; the negative checker accepts no +certificate that silently omits them. All 78 saved negative certificates have +diagonal entries 1. + +On every component, substitute into det(A) det(B) det(C). If this Laurent +polynomial is identically zero, no point on the component makes all blocks +invertible. The checker directly expands the product using Leibniz's formula, +rather than the producer's successive polynomial products. It checks every +integer operation, the substitution and complete component coverage. + +Such a refutation permits a clause blocking exactly this entry support and +these frame choices. It does not permit blocking neighboring supports or +unspecified frames. The checker verifies the literal learned clause and then +replays the next support proof. A final Boolean contradiction covers all +remaining assignments; the removed ones already have exact refutations. +Therefore the entire fixed word is excluded over C, including scalar blocks +with zero entries. No arithmetic search timeout is used as evidence. + +## Boundaries + +This proves no impossibility for arbitrary three-block words, arbitrary +Clifford circuits, different frame groups or a finite representation that +admits additional linear cancellations. It does not decide the full register +problem in PR #288 or bound integer multiplication. The inputs are 33 explicit +skeletons, not representatives of all possibilities. diff --git a/research/clifford-relation-obstructions/README.md b/research/clifford-relation-obstructions/README.md new file mode 100644 index 0000000000..aa7836d88c --- /dev/null +++ b/research/clifford-relation-obstructions/README.md @@ -0,0 +1,105 @@ +# Exact exclusions for 33 fixed Clifford register words + +**Scoped negative result; no new primitive or kappa claim.** For each of the +33 words in `certificates.json.gz`, no choice of three invertible complex +3-by-3 scalar mixing blocks achieves the specified full-rank coset endpoint +with eight paid calls. This is a statement in a formal projective Clifford +group algebra. It does not exclude arbitrary three-block words or solve the +general m=3, W=3, s=8 register problem left open in [PR #288](https://github.com/CrocSwap/integer-mult-bounds/pull/288). + +The contribution is a self-contained support/rank/torus checker, explicit +fixed-word inputs, exact refutation traces and a written explanation of the +necessary conditions. Every runtime dependency is in this directory or the +Python standard library. No author-local directory, solver installation, +network access or historical research checkout is needed. + +## Reproduce + +From the repository root, with Python 3.10 or later: + +```sh +python -B -S research/clifford-relation-obstructions/verify.py +``` + +Expected final JSON contains: + +```json +{ + "status": "PASS_FIXED_CLIFFORD_WORD_EXCLUSIONS", + "counts": { + "excluded_templates": 33, + "exact_torus_refutations": 78, + "noncommuting_relations": 32 + } +} +``` + +The actual output has additional control counts. The command replays saved +witnesses; it does not rerun the bounded discovery search. It writes no files. +`-O` and `-OO` are explicitly rejected because the checker uses assertions. +`MANIFEST.json` pins source bytes and the decompressed certificate payload; +gzip container bytes are not used to decide mathematical equality. + +## Domain and method + +There are three streams of formal group-algebra elements, and each target +column must be supported in one left monomial coset of Fourier rank three. +Every unary operation and scalar-block location is fixed by the input word. +Each scalar block ranges over all GL(3,C), including matrices with zero +entries. [PROOF.md](PROOF.md) defines the operators, endpoint and model limits. + +For 32 words, the generator prescribed + + U = (I,Q,T), V = (I,P,Q), T = Q^-1 P Q, + +so that PQ = QT and Q is also repeated. P and Q do not commute. P and T each +have one paid gate; Q has one or two, with 16 words of each kind. Free +monomial decorations and outside gates vary, keeping the total at eight. +The other word is a commuting-diamond case from the preceding local search. +All 33 literal words are included; no equivalence-class uniqueness is claimed. + +The support relaxation encodes nonzero entries, a necessary determinant +matching, selected endpoint frames and the fact that a single nonzero term +cannot cancel. Invertibility gives stronger row, column and rank constraints +for partial-permutation middle-product classes. When a Boolean support survives, +binomial torus equations and exact Laurent determinant identities can refute +it. Only that exact support/frame assignment is then forbidden. The final +Boolean proof closes the fixed word. Twenty-nine words close without an +arithmetic cut; four require the 78 saved torus refutations. + +The recorded discovery seed was 521031. The conjugation generator accepted +16 words of each Q cost after 22 and 39 proposals respectively; a 112-gate +representation cap also applied. The final fixed-word search had a 55-second +overall budget, four seconds per word and at most 192 support assignments per +word; it completed all 33 exclusions. These are post-selection research inputs, +not an exhaustive domain or a statistical sample. The seed records provenance; +the literal inputs, rather than a seeded search rerun, define this certificate. + +## Validation and independence + +The checker compares direct trajectory enumeration with sequential polynomial +propagation. It reconstructs rank clauses from unary products and compares +them with the monomial-based encoding. It replays literal Boolean proof trees, +unimodular integer operations and a direct Leibniz expansion of determinant +products. No SAT or arithmetic solver is trusted for a negative conclusion. + +Controls include 33 exact dense skeleton checks, 150 Pauli conjugation +identities, seven paid-gate square identities, four known nine-call solutions, +recovery of their scalar matrices, and an eight-call rejection. A second +eight-call control deliberately survives the Boolean relaxation while its +concrete scalar word fails: Boolean feasibility is not a construction. +Corrupt integer traces, Boolean proofs and learned clauses, missing final +refutations and an unsupported complex-torsion exclusion are rejected. + +The two path/rank encodings share the tableau/coset core. The dense Gaussian +matrix implementation independently checks that core on the finite corpus; +it does not establish an all-size representation theorem. The methods were +implemented and checked with substantial AI assistance, not independent human +peer review. There is no Lean proof or novelty claim for the general support, +rank, torus or determinant techniques. See `VALIDATION.json` for the measured +local checks and [NOTICE.md](NOTICE.md) for attribution. + +The selected frontier, all supplier sources and `upstream/` are unchanged. +This standalone contribution does not replay or strengthen their compiler, +physical, recursive, precision/tape or analytic assumptions. No bit primitive, +complete exponent invoice or practical multiplication speedup is supplied. diff --git a/research/clifford-relation-obstructions/VALIDATION.json b/research/clifford-relation-obstructions/VALIDATION.json new file mode 100644 index 0000000000..e7ca41d9af --- /dev/null +++ b/research/clifford-relation-obstructions/VALIDATION.json @@ -0,0 +1,41 @@ +{ + "status": "PASS", + "environment": { + "system": "Windows", + "python": "3.14.4" + }, + "result": { + "status": "PASS_FIXED_CLIFFORD_WORD_EXCLUSIONS", + "counts": { + "boolean_proof_nodes": 14483, + "support_models_or_refutations": 111, + "dense_skeleton_checks": 33, + "excluded_templates": 33, + "noncommuting_relations": 32, + "exact_torus_refutations": 78, + "dense_generator_identities": 150, + "paid_square_identities": 7, + "positive_nine_call_controls": 4, + "dense_positive_checks": 8, + "relaxation_false_positive": 1, + "negative_eight_call": 1, + "integer_trace_controls": 3, + "corrupt_integer_traces_rejected": 3, + "corrupt_boolean_proofs_rejected": 1, + "corrupt_learned_clauses_rejected": 1, + "missing_final_refutations_rejected": 1, + "unsupported_torsion_exclusions_rejected": 1 + }, + "certificate_payload_sha256": "dafd07d683df169f3c1613bc9ecbab054ce66581d93e7ef0c649286ec2eddc6c" + }, + "checks": { + "fresh_directory_without_repository_or_sibling_packages": "PASS", + "different_working_directory": "PASS", + "changed_gzip_header_and_compression_same_payload": "PASS identical mathematical output", + "corrupt_payload": "rejected", + "-O": "rejected explicitly", + "-OO": "rejected explicitly" + }, + "elapsed_seconds": 78.074, + "scope": "Focused standalone replay only; unchanged repository-wide suite and selected frontier replay not run; no remote CI or human-review claim." +} diff --git a/research/clifford-relation-obstructions/certificates.json.gz b/research/clifford-relation-obstructions/certificates.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..7c1dce19f81f01368797ccffca6b5d4fa73deeb6 GIT binary patch literal 128009 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

q&n6yTH0n-m-u26rB;e) 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

d;lP82du9e!02`#4m~qotQ5QzUDUGJk|6 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 HWQF)&> 3) & 7, value >> 6 + re, im = [0]*64, [0]*64 + for col in range(8): + re[8*(col ^ x)+col], im[8*(col ^ x)+col] = rot(1, 0, p+2*((z & col).bit_count() % 2)) + return normalize(0, re, im) + + +@lru_cache(None) +def operator(op): + name, a, b = op + re, im = [0]*64, [0]*64 + if name == "C": + for col in range(8): + re[8*col+col], im[8*col+col] = 1, 1 + re[8*(col ^ a)+col], im[8*(col ^ a)+col] = 1, -1 + return normalize(1, re, im) + for col in range(8): + row, p = col, 0 + if name == "S": + p = (col >> a) & 1 + elif name == "X": + row ^= 1 << a + elif name == "Z": + p = 2*((col >> a) & 1) + elif name == "CX": + row ^= ((col >> a) & 1) << b + elif name == "CZ": + p = 2*((col >> a) & 1)*((col >> b) & 1) + else: + raise ValueError(op) + re[8*row+col], im[8*row+col] = rot(1, 0, p) + return normalize(0, re, im) + + +@lru_cache(maxsize=10_000) +def signature(matrix): + # Recover all six conjugated generators by GP = P'G, independently of + # the optimized tableau update formulas used by the search. + images = [] + for generator in IDENTITY: + wanted = multiply(matrix, pauli(generator)) + matches = [value for value in range(256) if multiply(pauli(value), matrix) == wanted] + assert len(matches) == 1 + images.append(matches[0]) + return tuple(images) + + +def independent_frame(g): + basis = [value & 63 for value in g] + result = 0 + for value in range(64): + image = 0 + for i in range(6): + if value & (1 << i): + image ^= basis[i] + if image & 7 == 0: + result |= 1 << value + return result + + +def execute(program): + unit = normalize(*identity(), projective=True) + rows = [{(r, unit): Q(1)} for r in range(3)] + for gate in program: + if gate[0] == 'mix3': + changed = [] + for r in range(3): + row = {} + for c in range(3): + for key, value in rows[c].items(): + row[key] = row.get(key, 0)+gate[1+3*r+c]*value + changed.append({key: value for key, value in row.items() if value}) + rows = changed + else: + op = ('C', gate[2], 0) if gate[0] == 'paid' else FREE[gate[2]] + changed = {} + for (column, matrix), value in rows[gate[1]].items(): + key = column, multiply(operator(op), matrix, True) + changed[key] = changed.get(key, 0)+value + rows[gate[1]] = {key: value for key, value in changed.items() if value} + return [{(col, signature(matrix)): value for (col, matrix), value in row.items()} for row in rows] diff --git a/research/clifford-relation-obstructions/independent.py b/research/clifford-relation-obstructions/independent.py new file mode 100644 index 0000000000..f9bb18fddf --- /dev/null +++ b/research/clifford-relation-obstructions/independent.py @@ -0,0 +1,176 @@ +"""Independent path enumeration and literal integer/Laurent proof replay.""" +from collections import defaultdict +from itertools import combinations, permutations, product + +from model import Engine, FREE + + +def layers(program): + result = [[[] for _ in range(3)]] + for gate in program: + if gate[0] == 'mix3': + result.append([[] for _ in range(3)]) + else: + assert gate[0] in ('paid', 'free') + op = ('C', gate[2], 0) if gate[0] == 'paid' else FREE[gate[2]] + result[-1][gate[1]].append(op) + return result + + +def group(ring, operations): + g = 0 + for op in operations: + g = ring.transitions(op, g) + return g + + +def path_rows(ring, program): + stages = layers(program) + blocks = len(stages)-1 + rows = [{} for _ in range(3)] + for trajectory in product(range(3), repeat=blocks+1): + operations, mask = [], 0 + for k, role in enumerate(trajectory): + operations.extend(stages[k][role]) + if k < blocks: + mask |= 1 << (9*k+3*trajectory[k+1]+role) + key = (group(ring, operations) << 2) | trajectory[0] + polynomial = rows[trajectory[-1]].setdefault(key, {}) + polynomial[mask] = polynomial.get(mask, 0)+1 + return tuple(rows), blocks + + +def rank_formula(program, cnf): + """Build strengthened clauses from unary products, not path polynomials.""" + ring, stages = Engine(), layers(program) + assert len(stages) == 4 + selectors = {(x[1], x[2]): i for i, x in enumerate(cnf['labels']) if x and x[0] == 'frame'} + products = defaultdict(list) + for i in range(3): + for j in range(3): + products[group(ring, stages[1][j]+stages[2][i])].append(3*i+j) + counts = defaultdict(int) + for cells in sorted(tuple(v) for v in products.values()): + if len({p//3 for p in cells}) != len(cells) or len({p % 3 for p in cells}) != len(cells): + continue + i, j = divmod(cells[0], 3) + guards = {} + for r in range(3): + for s in range(3): + g = group(ring, stages[0][s]+stages[1][j]+stages[2][i]+stages[3][r]) + frame, rank = ring.frame_info(g) + if rank == 3: + guards[r, s] = selectors[s, frame] + for s, frames in enumerate(cnf['target_frames']): + for frame in frames: + f = selectors[s, frame] + if any(guards.get((r, s)) == f for r in range(3)): + continue + for position in cells: + cnf['clauses'].append([-f, -(10+position), -(3*(position % 3)+s+1)]) + counts['zero_column'] += 1 + for r in range(3): + allowed = sorted({guards[r, s] for s in range(3) if (r, s) in guards}) + for position in cells: + cnf['clauses'].append([-(19+3*r+position//3), -(10+position), *allowed]) + counts['zero_row'] += 1 + for size in range(1, len(cells)+1): + variables = [] + for rs in combinations(range(3), size): + for ss in permutations(range(3), size): + matching = tuple(zip(rs, ss)) + if any(p not in guards for p in matching): + continue + cnf['labels'].append(['rank_matching', list(cells), list(map(list, matching))]) + v = len(cnf['labels'])-1 + variables.append(v) + for f in sorted({guards[p] for p in matching}): + cnf['clauses'].append([-v, f]) + for subset in combinations(cells, size): + cnf['clauses'].append([*(-(10+p) for p in subset), *variables]) + counts['rank_bound'] += 1 + cnf['variables'] = len(cnf['labels'])-1 + cnf['strengthening_counts'] = dict(counts) + return cnf + + +def diagonal_trace(equations, certificate): + a = [list(row) for row in equations['matrix']] + b = list(equations['rhs_parity']) + n = len(equations['nonzero_entries']) + transform = [[int(i == j) for j in range(n)] for i in range(n)] + for step in certificate['steps']: + op, *args = step + if op == 'row_swap': + i, j = args + assert 0 <= i < len(a) and 0 <= j < len(a) and i != j + a[i], a[j] = a[j], a[i] + b[i], b[j] = b[j], b[i] + elif op == 'row_negate': + i, = args + a[i] = [-v for v in a[i]] + b[i] = -b[i] + elif op == 'row_add': + i, j, amount = args + assert i != j and type(amount) is int + a[i] = [a[i][k]+amount*a[j][k] for k in range(n)] + b[i] += amount*b[j] + elif op == 'col_swap': + i, j = args + assert 0 <= i < n and 0 <= j < n and i != j + for row in a+transform: + row[i], row[j] = row[j], row[i] + else: + assert op == 'col_add' + i, j, amount = args + assert i != j and type(amount) is int + for row in a+transform: + row[i] += amount*row[j] + rank = certificate['rank'] + assert certificate['column_transform'] == transform and certificate['rhs'] == b + assert [a[i][i] for i in range(rank)] == certificate['diagonal'] + assert all(v > 0 for v in certificate['diagonal']) + assert all(not a[i][j] for i in range(len(a)) for j in range(n) if i != j or i >= rank) + + +def determinant_identity(equations, certificate, signs): + """One direct Leibniz expansion of the product, not successive products.""" + rank = certificate['rank'] + transform = certificate['column_transform'] + dimension = len(transform)-rank + entries = {old: new for new, old in enumerate(equations['nonzero_entries'])} + coefficients = defaultdict(int) + all_permutations = tuple(permutations(range(3))) + for choices in product(all_permutations, repeat=equations['blocks']): + chosen = [9*k+3*r+permutation[r] for k, permutation in enumerate(choices) for r in range(3)] + if any(entry not in entries for entry in chosen): + continue + exponents = [sum(transform[entries[entry]][j] for entry in chosen) for j in range(len(transform))] + phase = sum(exponents[i]*signs[i] for i in range(rank)) + phase += sum(p[i] > p[j] for p in choices for i in range(3) for j in range(i+1, 3)) + coefficients[tuple(exponents[rank:])] += (-1)**(phase % 2) + return {e: c for e, c in coefficients.items() if c} + + +def binomial_certificate(expected, result): + assert result['equations'] == expected + cert = result['diagonalization'] + diagonal_trace(expected, cert) + odd = any(v % 2 for v in cert['rhs'][cert['rank']:]) + if result['status'] == 'inconsistent_torus': + assert odd + return + assert not odd and result['status'] in ('all_components_singular', 'exact_rational_point') + choices = [] + for d, b in zip(cert['diagonal'], cert['rhs']): + assert d == 1 or (d == 2 and b % 2 == 0) + choices.append([b % 2] if d == 1 else [0, 1]) + expected_signs = list(map(list, product(*choices))) + if result['status'] == 'all_components_singular': + assert [c['signs'] for c in result['components']] == expected_signs + for component in result['components']: + assert component['signs'] in expected_signs + polynomial = determinant_identity(expected, cert, component['signs']) + assert bool(polynomial) != component['determinant_product_zero'] + if result['status'] == 'all_components_singular': + assert not polynomial diff --git a/research/clifford-relation-obstructions/model.py b/research/clifford-relation-obstructions/model.py new file mode 100644 index 0000000000..1ebf1ebd7c --- /dev/null +++ b/research/clifford-relation-obstructions/model.py @@ -0,0 +1,190 @@ +"""Exact three-stream projective Clifford group-algebra model. + +Apache-2.0. Substantial OpenAI Codex assistance; see NOTICE.md. +""" +from fractions import Fraction as Q +from functools import lru_cache +from itertools import combinations + +M = 3 +IDENTITY = tuple([1 << i for i in range(M)] + [1 << (M+i) for i in range(M)]) +Op = tuple[str, int, int] +PAIRS = ((0, 1), (0, 2), (1, 2)) +FREE = tuple([('S', i, 0) for i in range(M)] + + [('X', i, 0) for i in range(M)] + + [('Z', i, 0) for i in range(M)] + + [('CX', i, j) for i in range(M) for j in range(M) if i != j] + + [('CZ', i, j) for i, j in combinations(range(M), 2)]) + + +def pauli_image(op: Op, value: int) -> int: + x, z, p = value & 7, (value >> 3) & 7, value >> 6 + name, a, b = op + if name == "C": + if (z & a).bit_count() & 1: + x ^= a + p -= 1 + elif name == "S": + u = (x >> a) & 1 + p += u + z ^= u << a + elif name == "X": + p += 2*((z >> a) & 1) + elif name == "Z": + p += 2*((x >> a) & 1) + elif name == "CX": + x ^= ((x >> a) & 1) << b + z ^= ((z >> b) & 1) << a + elif name == "CZ": + u, v = (x >> a) & 1, (x >> b) & 1 + p += 2*u*v + z ^= (u << b) | (v << a) + else: + raise ValueError(op) + return x | (z << 3) | ((p % 4) << 6) + + +def rank_binary(values: list[int]) -> int: + pivots: dict[int, int] = {} + for value in values: + while value: + pivot = value.bit_length()-1 + if pivot in pivots: + value ^= pivots[pivot] + else: + pivots[pivot] = value + break + return len(pivots) + + +def fourier_rank(group: tuple[int, ...]) -> int: + return rank_binary([value & 7 for value in group[M:]]) + + +class Engine: + def __init__(self): + self.groups = [IDENTITY] + self.ids = {IDENTITY: 0} + self.transitions = lru_cache(maxsize=150_000)(self._transition) + self.frames = lru_cache(maxsize=40_000)(self._frame) + + def _frame(self, group_id): + g = self.groups[group_id] + basis = [sum((((g[M+i] >> j) & 1) << i) + | (((g[i] >> j) & 1) << (M+i)) for i in range(M)) + for j in range(M)] + span = [0] + for v in basis: + span += [w ^ v for w in span] + assert len(set(span)) == 8 + return sum(1 << v for v in span) + + def _transition(self, op, group_id): + new = tuple(pauli_image(op, value) for value in self.groups[group_id]) + if new not in self.ids: + self.ids[new] = len(self.groups) + self.groups.append(new) + return self.ids[new] + + def frame_info(self, group): + return self.frames(group), fourier_rank(self.groups[group]) + + +def add_poly(target, source, scalar=1, bit=0): + for mask, coefficient in source.items(): + assert not mask & bit + key = mask | bit + value = target.get(key, 0)+scalar*coefficient + if value: + target[key] = value + else: + target.pop(key, None) + + +def generic_paths(ring, program, kind): + """One independent variable per matrix entry, one selected entry per path.""" + rows = [{i: {0: 1}} for i in range(3)] + blocks = 0 + for gate in program: + if gate[0] not in ('mix', 'mix3'): + _, role, index = gate + op = ('C', index, 0) if gate[0] == 'paid' else FREE[index] + rows[role] = {(ring.transitions(op, key >> 2) << 2) | (key & 3): p + for key, p in rows[role].items()} + continue + assert gate[0] == ('mix' if kind == 2 else 'mix3') + roles = PAIRS[gate[1]] if kind == 2 else range(3) + changed = [] + for i in range(kind): + row = {} + for j, role in enumerate(roles): + bit = 1 << (kind*kind*blocks+kind*i+j) + for key, polynomial in rows[role].items(): + add_poly(row.setdefault(key, {}), polynomial, bit=bit) + changed.append(row) + for role, row in zip(roles, changed): + rows[role] = row + blocks += 1 + return tuple(rows), blocks + + +def coefficient_records(ring, rows): + records, targets = [], [set() for _ in range(3)] + for output, row in enumerate(rows): + # Interned integer IDs depend on what an Engine saw earlier. Proof + # row IDs must instead follow stable Clifford tableaus and columns. + for key, polynomial in sorted(row.items(), key=lambda item: (item[0] & 3, ring.groups[item[0] >> 2])): + frame, rank = ring.frame_info(key >> 2) + column = key & 3 + records.append({'output': output, 'column': column, 'frame': frame, + 'rank': rank, 'poly': polynomial}) + if rank == 3: + targets[column].add(frame) + return records, targets + + +def decode(program): + result = [] + for raw in program: + kind = raw[0] + if kind == 'mix3': + assert len(raw) == 10 + gate = (kind, *(Q(x) for x in raw[1:])) + else: + assert kind in ('paid', 'free') and len(raw) == 3 + assert type(raw[1]) is int and 0 <= raw[1] < 3 + assert type(raw[2]) is int + assert (1 <= raw[2] <= 7) if kind == 'paid' else (0 <= raw[2] < 18) + gate = tuple(raw) + result.append(gate) + return tuple(result) + + +def execute(ring, program): + rows = [{i: Q(1)} for i in range(3)] + for gate in program: + if gate[0] == 'mix3': + changed = [] + for r in range(3): + row = {} + for c in range(3): + for key, value in rows[c].items(): + row[key] = row.get(key, 0)+gate[1+3*r+c]*value + changed.append({key: value for key, value in row.items() if value}) + rows = changed + else: + op = ('C', gate[2], 0) if gate[0] == 'paid' else FREE[gate[2]] + rows[gate[1]] = {(ring.transitions(op, key >> 2) << 2) | (key & 3): value + for key, value in rows[gate[1]].items()} + return tuple(rows) + + +def endpoint_frames(ring, rows): + answer = [] + for column in range(3): + values = {ring.frame_info(key >> 2) for row in rows for key, v in row.items() + if v and key & 3 == column} + if len(values) != 1 or next(iter(values))[1] != 3: + return None + answer.append(next(iter(values))[0]) + return answer diff --git a/research/clifford-relation-obstructions/rank_support.py b/research/clifford-relation-obstructions/rank_support.py new file mode 100644 index 0000000000..0c37381b22 --- /dev/null +++ b/research/clifford-relation-obstructions/rank_support.py @@ -0,0 +1,80 @@ +"""Add exact consequences of invertibility to the path-support relaxation. + +For each middle label g: R_g=C M_g A. When M_g is a partial permutation +with scalar entries, its rank is its number of nonzero entries. A zero +column/row of R_g also gives a zero column/row after cancelling C/A. +""" +from collections import defaultdict +from itertools import combinations, permutations + +from model import Engine, generic_paths, coefficient_records +from support import encode_support + + +def strengthen(cnf, records): + assert cnf['blocks'] == 3 + clauses, labels = cnf['clauses'], cnf['labels'] + selectors = {(v[1], v[2]): i for i, v in enumerate(labels) if v and v[0] == 'frame'} + groups = defaultdict(dict) + for record in records: + cells = set() + for mask in record['poly']: + middle = (mask >> 9) & 511 + assert middle.bit_count() == 1 + cells.add(middle.bit_length()-1) + key = tuple(sorted(cells)) + position = record['output'], record['column'] + assert position not in groups[key] + groups[key][position] = record + added = CounterLite() + for cells, grid in sorted(groups.items()): + assert len(grid) == 9 + rows, columns = [i//3 for i in cells], [i % 3 for i in cells] + partial = len(set(rows)) == len(rows) and len(set(columns)) == len(columns) + if not partial: + continue + allowed = {(r, s): selectors[s, record['frame']] for (r, s), record in grid.items() if record['rank'] == 3} + for s, targets in enumerate(cnf['target_frames']): + for frame in targets: + if any(grid[r, s]['rank'] == 3 and grid[r, s]['frame'] == frame for r in range(3)): + continue + for cell in cells: + i, j = divmod(cell, 3) + clauses.append([-selectors[s, frame], -(10+cell), -(3*j+s+1)]) + added['zero_column'] += 1 + for r in range(3): + guards = sorted({allowed[r, s] for s in range(3) if (r, s) in allowed}) + for cell in cells: + i, j = divmod(cell, 3) + clauses.append([-(19+3*r+i), -(10+cell), *guards]) + added['zero_row'] += 1 + for size in range(1, len(cells)+1): + matchings = [] + for rs in combinations(range(3), size): + for ss in permutations(range(3), size): + positions = list(zip(rs, ss)) + if not all(p in allowed for p in positions): + continue + labels.append(['rank_matching', list(cells), [list(p) for p in positions]]) + v = len(labels)-1 + matchings.append(v) + for guard in sorted({allowed[p] for p in positions}): + clauses.append([-v, guard]) + for active in combinations(cells, size): + clauses.append([*(-(10+i) for i in active), *matchings]) + added['rank_bound'] += 1 + cnf['variables'] = len(labels)-1 + cnf['strengthening_counts'] = dict(added) + return cnf + + +class CounterLite(dict): + def __missing__(self, key): + return 0 + + +def compile_support(program): + ring = Engine() + rows, blocks = generic_paths(ring, program, 3) + records, targets = coefficient_records(ring, rows) + return strengthen(encode_support(records, targets, blocks), records) diff --git a/research/clifford-relation-obstructions/support.py b/research/clifford-relation-obstructions/support.py new file mode 100644 index 0000000000..162d9f7b45 --- /dev/null +++ b/research/clifford-relation-obstructions/support.py @@ -0,0 +1,194 @@ +"""Necessary Boolean support conditions, with replayable DPLL refutations. + +Over C, one nonzero monomial cannot sum to zero. Two or more may or may not +cancel. SAT is therefore only a relaxation; UNSAT excludes the whole word. +""" +from collections import Counter +from itertools import permutations +import time + +from model import Engine, generic_paths, coefficient_records + + +def encode_support(records, targets, blocks): + clauses, labels = [], [None] + rank_support = [[any(r['output'] == i and r['column'] == j and r['rank'] == 3 + for r in records) for j in range(3)] for i in range(3)] + # Augmentation sends every group element to 1 and preserves invertibility. + # Its possible nonzero entries must admit a determinant matching. + if not any(all(rank_support[r][p[r]] for r in range(3)) for p in permutations(range(3))): + clauses.append([]) + def variable(label): + labels.append(label) + return len(labels)-1 + for k in range(blocks): + for r in range(3): + for c in range(3): + variable(['entry', k, r, c]) + # Nonsingular matrix => at least one nonzero determinant summand. + matchings = [] + for k in range(blocks): + choices = [] + for permutation in permutations(range(3)): + v = variable(['matching', k, list(permutation)]) + choices.append(v) + for row, col in enumerate(permutation): + clauses.append([-v, 9*k+3*row+col+1]) + clauses.append(choices) + matchings.append(choices) + frames = [] + for column, candidates in enumerate(targets): + choices = {frame: variable(['frame', column, frame]) for frame in sorted(candidates)} + clauses.append(list(choices.values())) + for i, a in enumerate(choices.values()): + for b in list(choices.values())[i+1:]: + clauses.append([-a, -b]) + frames.append(choices) + terms = {} + for record in records: + paths = [] + for mask, coefficient in sorted(record['poly'].items()): + assert coefficient != 0 and mask.bit_count() == blocks + if mask not in terms: + v = variable(['term', mask]) + factors = [i+1 for i in range(9*blocks) if mask & (1 << i)] + for factor in factors: + clauses.append([-v, factor]) + clauses.append([v, *(-factor for factor in factors)]) + terms[mask] = v + paths.append(terms[mask]) + guard = [frames[record['column']][record['frame']]] if record['rank'] == 3 else [] + for v in paths: + clauses.append([-v, *(p for p in paths if p != v), *guard]) + return {'clauses': clauses, 'labels': labels, 'variables': len(labels)-1, + 'blocks': blocks, 'target_frames': [sorted(t) for t in targets], + 'rank_supported_entries': rank_support} + + +def compile_support(program): + ring = Engine() + rows, blocks = generic_paths(ring, program, 3) + records, targets = coefficient_records(ring, rows) + return encode_support(records, targets, blocks) + + +class Limit(Exception): + pass + + +def solve(cnf, seconds=1, max_nodes=40000): + started = time.monotonic() + encoded, frequency = [], Counter() + for clause in cnf['clauses']: + positive = sum(1 << (v-1) for v in set(clause) if v > 0) + negative = sum(1 << (-v-1) for v in set(clause) if v < 0) + assert not positive & negative + encoded.append((positive, negative)) + for v in clause: + frequency[abs(v)] += 1 + nodes, propagations = 0, 0 + def visit(yes, no): + nonlocal nodes, propagations + nodes += 1 + if nodes > max_nodes or time.monotonic()-started >= seconds: + raise Limit + units = [] + while True: + changed, best = False, None + for index, (positive, negative) in enumerate(encoded): + if positive & yes or negative & no: + continue + remaining = (positive | negative) & ~(yes | no) + if not remaining: + return None, {'units': units, 'conflict': index} + count = remaining.bit_count() + if count == 1: + variable = remaining.bit_length() + literal = variable if remaining & positive else -variable + units.append([literal, index]) + if literal > 0: + yes |= remaining + else: + no |= remaining + propagations += 1 + changed = True + elif best is None or count < best[0]: + best = count, remaining + if not changed: + break + if best is None: + return [int(bool(yes & (1 << i))) for i in range(cnf['variables'])], None + candidates = [i+1 for i in range(cnf['variables']) if best[1] & (1 << i)] + variable = max(candidates, key=lambda i: (frequency[i], -i)) + bit = 1 << (variable-1) + model, positive = visit(yes | bit, no) + if model is not None: + return model, None + model, negative = visit(yes, no | bit) + if model is not None: + return model, None + return None, {'units': units, 'split': variable, 'positive': positive, 'negative': negative} + try: + model, proof = visit(0, 0) + status = 'support_feasible' if model is not None else 'support_obstruction' + except Limit: + model, proof, status = None, None, 'resource_limit' + return {'status': status, 'model': model, 'proof': proof, 'nodes': nodes, + 'propagations': propagations, 'elapsed_seconds': time.monotonic()-started, + 'limits': {'seconds': seconds, 'nodes': max_nodes}} + + +def verify(cnf, result): + """Literal-list clause replay; independent of the bitset solving routine.""" + clauses = cnf['clauses'] + if result['status'] == 'support_feasible': + model = result['model'] + assert len(model) == cnf['variables'] and all(v in (0, 1) for v in model) + assert all(any(bool(model[abs(v)-1]) == (v > 0) for v in clause) for clause in clauses) + assert result['proof'] is None + return 0 + if result['status'] == 'resource_limit': + assert result['proof'] is None and result['model'] is None + return 0 + assert result['status'] == 'support_obstruction' and result['model'] is None + nodes = 0 + def check(node, assignment): + nonlocal nodes + nodes += 1 + assignment = dict(assignment) + def residual(index): + assert 0 <= index < len(clauses) + literals = [] + for literal in clauses[index]: + variable = abs(literal) + if variable not in assignment: + literals.append(literal) + else: + assert assignment[variable] != (literal > 0), ('already satisfied', index) + return literals + for literal, reason in node['units']: + assert residual(reason) == [literal] + assert abs(literal) not in assignment + assignment[abs(literal)] = literal > 0 + if 'conflict' in node: + assert not residual(node['conflict']) + else: + v = node['split'] + assert 1 <= v <= cnf['variables'] and v not in assignment + check(node['positive'], {**assignment, v: True}) + check(node['negative'], {**assignment, v: False}) + check(result['proof'], {}) + return nodes + + +def selected_support(cnf, result): + assert result['status'] == 'support_feasible' + entries = [[0]*9 for _ in range(cnf['blocks'])] + frames = [None]*3 + for label, value in zip(cnf['labels'][1:], result['model']): + if label[0] == 'entry': + _, k, r, c = label + entries[k][3*r+c] = value + elif label[0] == 'frame' and value: + frames[label[1]] = label[2] + return {'entry_support': entries, 'frames': frames} diff --git a/research/clifford-relation-obstructions/torus.py b/research/clifford-relation-obstructions/torus.py new file mode 100644 index 0000000000..d1b6fcc097 --- /dev/null +++ b/research/clifford-relation-obstructions/torus.py @@ -0,0 +1,198 @@ +"""Exact torus equations on one Boolean support; no general Groebner search.""" +from fractions import Fraction as Q +from itertools import product, permutations + +from model import Engine, generic_paths, coefficient_records + + +def equations(program, selection): + ring = Engine() + rows, blocks = generic_paths(ring, program, 3) + records, _ = coefficient_records(ring, rows) + nonzero = [9*k+i for k, block in enumerate(selection['entry_support']) for i, v in enumerate(block) if v] + allowed = sum(1 << i for i in nonzero) + equations, equations_seen = [], set() + for record in records: + if record['frame'] == selection['frames'][record['column']]: + continue + terms = [(mask, value) for mask, value in record['poly'].items() if not mask & ~allowed] + if not terms: + continue + assert len(terms) != 1, 'Boolean support should exclude lone unwanted terms' + if len(terms) > 2: + return {'status': 'nonbinomial', 'largest_active_sum': len(terms)} + assert all(coefficient == 1 for _, coefficient in terms) + a, b = terms[0][0], terms[1][0] + row = tuple(((a >> i) & 1)-((b >> i) & 1) for i in nonzero) + if next(v for v in row if v) < 0: + row = tuple(-v for v in row) + if row not in equations_seen: + equations_seen.add(row) + equations.append(list(row)) + return {'status': 'binomial', 'matrix': equations, 'rhs_parity': [1]*len(equations), + 'nonzero_entries': nonzero, 'blocks': blocks} + + +def diagonalize(matrix, rhs, n): + """Unimodular row/column Euclidean operations, with an explicit trace. + + Divisibility between successive diagonal entries is unnecessary. Column + operations give x_j=product(z_k**V[j,k]); row operations transform rhs. + """ + a = [list(row) for row in matrix] + b = list(rhs) + v = [[int(i == j) for j in range(n)] for i in range(n)] + m, steps, k = len(a), [], 0 + def swap_rows(i, j): + a[i], a[j], b[i], b[j] = a[j], a[i], b[j], b[i] + steps.append(['row_swap', i, j]) + def swap_columns(i, j): + for row in a: + row[i], row[j] = row[j], row[i] + for row in v: + row[i], row[j] = row[j], row[i] + steps.append(['col_swap', i, j]) + while k < min(m, n): + pivot = next(((i, j) for i in range(k, m) for j in range(k, n) if a[i][j]), None) + if pivot is None: + break + if pivot[0] != k: + swap_rows(k, pivot[0]) + if pivot[1] != k: + swap_columns(k, pivot[1]) + while True: + row = next((i for i in range(k+1, m) if a[i][k]), None) + if row is not None: + amount = -(a[row][k] // a[k][k]) + a[row] = [x+amount*y for x, y in zip(a[row], a[k])] + b[row] += amount*b[k] + steps.append(['row_add', row, k, amount]) + if a[row][k]: + swap_rows(k, row) + continue + col = next((j for j in range(k+1, n) if a[k][j]), None) + if col is not None: + amount = -(a[k][col] // a[k][k]) + for line in a: + line[col] += amount*line[k] + for line in v: + line[col] += amount*line[k] + steps.append(['col_add', col, k, amount]) + if a[k][col]: + swap_columns(k, col) + continue + break + if a[k][k] < 0: + a[k] = [-x for x in a[k]] + b[k] = -b[k] + steps.append(['row_negate', k]) + k += 1 + assert all(not a[i][j] for i in range(m) for j in range(n) if i != j or i >= k) + return {'rank': k, 'diagonal': [a[i][i] for i in range(k)], 'rhs': b, + 'column_transform': v, 'steps': steps} + + +def multiply(a, b): + out = {} + for ea, ca in a.items(): + for eb, cb in b.items(): + exponent = tuple(x+y for x, y in zip(ea, eb)) + out[exponent] = out.get(exponent, 0)+ca*cb + return {e: c for e, c in out.items() if c} + + +def determinant_product(equations, diagonal, signs): + transform = diagonal['column_transform'] + rank = diagonal['rank'] + dimension = len(transform)-rank + entries = {} + for i, index in enumerate(equations['nonzero_entries']): + phase = sum(transform[i][j]*signs[j] for j in range(rank)) % 2 + entries[index] = (tuple(transform[i][rank:]), (-1)**phase) + total = {(0,)*dimension: 1} + for k in range(equations['blocks']): + determinant = {} + for p in permutations(range(3)): + factors = [entries.get(9*k+3*r+p[r]) for r in range(3)] + if any(f is None for f in factors): + continue + parity = sum(p[i] > p[j] for i in range(3) for j in range(i+1, 3)) + exponent = tuple(sum(f[0][j] for f in factors) for j in range(dimension)) + coefficient = (-1)**parity + for factor in factors: + coefficient *= factor[1] + determinant[exponent] = determinant.get(exponent, 0)+coefficient + determinant = {e: c for e, c in determinant.items() if c} + total = multiply(total, determinant) + if not total: + break + return total, entries + + +def nonzero_point(polynomial, dimension): + current, point = polynomial, [] + assert current + for i in range(dimension): + degree = max(e[i] for e in current)-min(e[i] for e in current) + for value in range(1, degree+2): + substituted = {} + for exponent, coefficient in current.items(): + e = (*exponent[:i], 0, *exponent[i+1:]) + substituted[e] = substituted.get(e, 0)+coefficient*Q(value)**exponent[i] + substituted = {e: c for e, c in substituted.items() if c} + if substituted: + point.append(value) + current = substituted + break + else: + raise AssertionError('a nonzero Laurent polynomial lost all degree+1 points') + assert list(current) == [(0,)*dimension] + return point + + +def complete(program, selection): + eq = equations(program, selection) + if eq['status'] != 'binomial': + return None, eq + diag = diagonalize(eq['matrix'], eq['rhs_parity'], len(eq['nonzero_entries'])) + result = {'equations': eq, 'diagonalization': diag, 'components': []} + if any(b % 2 for b in diag['rhs'][diag['rank']:]): + result['status'] = 'inconsistent_torus' + return None, result + roots = [] + for d, b in zip(diag['diagonal'], diag['rhs']): + if d == 1: + roots.append([b % 2]) + elif d == 2 and b % 2 == 0: + roots.append([0, 1]) + else: + result.update(status='nonreal_torsion_pending', pending_diagonal=d, pending_rhs=b) + return None, result + if sum(len(r) == 2 for r in roots) > 10: + result['status'] = 'component_limit' + return None, result + for signs in product(*roots): + polynomial, entries = determinant_product(eq, diag, signs) + result['components'].append({'signs': list(signs), 'determinant_product_zero': not polynomial}) + if not polynomial: + continue + dimension = len(diag['column_transform'])-diag['rank'] + point = nonzero_point(polynomial, dimension) + matrices = [[Q(0)]*9 for _ in range(eq['blocks'])] + for index, (exponent, coefficient) in entries.items(): + value = Q(coefficient) + for z, e in zip(point, exponent): + value *= Q(z)**e + assert value + matrices[index//9][index % 9] = value + word, k = [], 0 + for gate in program: + if gate[0] == 'mix3': + word.append(('mix3', *matrices[k])) + k += 1 + else: + word.append(gate) + result.update(status='exact_rational_point', free_point=point, matrices=[[str(v) for v in m] for m in matrices]) + return tuple(word), result + result['status'] = 'all_components_singular' + return None, result diff --git a/research/clifford-relation-obstructions/verify.py b/research/clifford-relation-obstructions/verify.py new file mode 100644 index 0000000000..471993bad0 --- /dev/null +++ b/research/clifford-relation-obstructions/verify.py @@ -0,0 +1,237 @@ +"""Replay 33 fixed-word exclusions and mathematical positive/negative controls.""" +if not __debug__: + raise SystemExit('Verification requires assertions; run Python without -O.') + +from collections import Counter +from copy import deepcopy +from hashlib import sha256 +from itertools import permutations +import gzip +import json +from pathlib import Path + +from model import (Engine, IDENTITY, FREE, decode, generic_paths, + coefficient_records, execute, endpoint_frames, pauli_image) +from independent import (path_rows, layers, group, rank_formula, + binomial_certificate, diagonal_trace) +from support import encode_support, verify, selected_support, solve +from rank_support import compile_support as strengthened +from torus import equations, complete, diagonalize +import dense + +ROOT = Path(__file__).resolve().parent + + +def block_selection(cnf, selection): + clause = [] + for i, label in enumerate(cnf['labels']): + if not label: + continue + if label[0] == 'entry': + _, k, r, c = label + clause.append(-i if selection['entry_support'][k][3*r+c] else i) + elif label[0] == 'frame' and selection['frames'][label[1]] == label[2]: + clause.append(-i) + return clause + + +def check_dense(program): + ring = Engine() + rows = execute(ring, program) + wanted = [{(key & 3, ring.groups[key >> 2]): value for key, value in row.items()} for row in rows] + assert wanted == dense.execute(program) + for i, tableau in enumerate(ring.groups): + assert ring.frames(i) == dense.independent_frame(tableau) + return ring, rows + + +def check_template(template, counts, dense_check=True): + program, answer = decode(template['program']), template['result'] + assert sum(g[0] == 'paid' for g in program) == 8 + assert sum(g[0] == 'mix3' for g in program) == 3 + ring = Engine() + rows, blocks = path_rows(ring, program) + assert (rows, blocks) == generic_paths(ring, program, 3) + records, targets = coefficient_records(ring, rows) + cnf = rank_formula(program, encode_support(records, targets, blocks)) + assert cnf == strengthened(program) + assert sha256(json.dumps(cnf, sort_keys=True).encode()).hexdigest() == answer['cnf_sha256'] + assert answer['status'] == 'excluded' and answer['steps'] + for number, step in enumerate(answer['steps']): + result = step['support'] + counts['boolean_proof_nodes'] += verify(cnf, result) + counts['support_models_or_refutations'] += 1 + if result['status'] == 'support_obstruction': + assert number == len(answer['steps'])-1 + continue + assert result['status'] == 'support_feasible' + selection = selected_support(cnf, result) + assert selection == step['selection'] + arithmetic = step['binomial'] + assert arithmetic['status'] in ('all_components_singular', 'inconsistent_torus') + binomial_certificate(equations(program, selection), arithmetic) + assert step['blocking_clause'] == block_selection(cnf, selection) + cnf['clauses'].append(step['blocking_clause']) + counts['exact_torus_refutations'] += 1 + assert answer['steps'][-1]['support']['status'] == 'support_obstruction' + if 'defining_words' in template: + words = {name: decode(word) for name, word in template['defining_words'].items()} + def unary(word): + return group(ring, layers(word)[0][0]) + pq = unary(words['Q']+words['P']) + assert pq == unary(words['T']+words['Q']) + assert pq != unary(words['P']+words['Q']) + assert ring.frame_info(pq)[1] == template['shared_product_rank'] + assert template['q_calls'] in (1, 2) + assert sum(g[0] == 'paid' for g in words['Q']) == template['q_calls'] + counts['noncommuting_relations'] += 1 + if dense_check: + literal = tuple(('mix3', 2, 1, 0, 1, 1, 1, 0, 1, 1) if g[0] == 'mix3' else g for g in program) + check_dense(literal) + counts['dense_skeleton_checks'] += 1 + counts['excluded_templates'] += 1 + + +def actual_boolean_model(cnf, program): + ring = Engine() + frames = endpoint_frames(ring, execute(ring, program)) + assert frames is not None + matrices = [g[1:] for g in program if g[0] == 'mix3'] + active = sum(1 << (9*k+i) for k, matrix in enumerate(matrices) for i, value in enumerate(matrix) if value) + model = [] + for label in cnf['labels'][1:]: + kind, *args = label + if kind == 'entry': + k, r, c = args + value = bool(matrices[k][3*r+c]) + elif kind == 'matching': + k, permutation = args + value = all(matrices[k][3*r+permutation[r]] for r in range(3)) + elif kind == 'frame': + column, frame = args + value = frames[column] == frame + elif kind == 'term': + mask, = args + value = not mask & ~active + else: + assert kind == 'rank_matching' + variable = len(model)+1 + guards = [c[1] for c in cnf['clauses'] if len(c) == 2 and c[0] == -variable] + value = all(model[g-1] for g in guards) + model.append(int(bool(value))) + result = {'status': 'support_feasible', 'model': model, 'proof': None} + verify(cnf, result) + return selected_support(cnf, result) + + +def det3(matrix): + total = 0 + for p in permutations(range(3)): + value = (-1)**sum(p[i] > p[j] for i in range(3) for j in range(i+1, 3)) + for r in range(3): + value *= matrix[3*r+p[r]] + total += value + return total + + +def reject(action): + try: + action() + except (AssertionError, ValueError, KeyError, IndexError): + return + raise AssertionError('corrupt or ineligible witness accepted') + + +def controls(templates, counts): + for op in FREE+tuple(('C', v, 0) for v in range(1, 8)): + matrix = dense.operator(op) + for generator in IDENTITY: + assert dense.multiply(matrix, dense.pauli(generator)) == dense.multiply(dense.pauli(pauli_image(op, generator)), matrix) + counts['dense_generator_identities'] += 1 + for v in range(1, 8): + assert dense.multiply(dense.operator(('C', v, 0)), dense.operator(('C', v, 0))) == dense.pauli(v) + counts['paid_square_identities'] += 1 + for trial, axes in enumerate(((1, 2, 4), (3, 2, 4), (1, 6, 4), (5, 2, 4))): + a = ('mix3', 1, 1, 0, 0, 1, 1, 1, 0, 1) + b = ('mix3', 1, 0, 0, 0, trial+1, 0, 0, 0, -1) + c = ('mix3', 2, 1, 0, 1, 1, 1, 0, 1, 1) + u, v = ((), (axes[0],), axes[:2]), (axes, axes[1:], axes[2:]) + word = tuple([a]+[('paid', r, x) for r, unit in enumerate(u) for x in unit] + +[b]+[('paid', r, x) for r, unit in enumerate(v) for x in unit]+[c]) + ring, rows = check_dense(word) + assert endpoint_frames(ring, rows) is not None + assert all(det3(g[1:]) for g in word if g[0] == 'mix3') + selection = actual_boolean_model(strengthened(word), word) + candidate, result = complete(word, selection) + assert candidate is not None and result['status'] == 'exact_rational_point' + assert all(det3(g[1:]) for g in candidate if g[0] == 'mix3') + ring, rows = check_dense(candidate) + assert endpoint_frames(ring, rows) is not None + binomial_certificate(equations(word, selection), result) + counts['positive_nine_call_controls'] += 1 + counts['dense_positive_checks'] += 2 + if trial == 0: + for removed, wanted in ((1, 'support_feasible'), (6, 'support_obstruction')): + bad = word[:removed]+word[removed+1:] + ring, rows = check_dense(bad) + assert endpoint_frames(ring, rows) is None + cnf = strengthened(bad) + test = solve(cnf, seconds=2) + assert test['status'] == wanted + verify(cnf, test) + counts['relaxation_false_positive' if wanted == 'support_feasible' else 'negative_eight_call'] += 1 + for matrix, rhs in (([[2]], [1]), ([[1], [1]], [0, 1]), ([[2, 3], [4, 6]], [1, 0])): + eq = {'matrix': matrix, 'rhs_parity': rhs, 'nonzero_entries': list(range(len(matrix[0])))} + trace = diagonalize(matrix, rhs, len(matrix[0])) + diagonal_trace(eq, trace) + counts['integer_trace_controls'] += 1 + forged = deepcopy(trace) + forged['rhs'][0] += 1 + reject(lambda: diagonal_trace(eq, forged)) + counts['corrupt_integer_traces_rejected'] += 1 + fixture = {'clauses': [[1, 2], [1, -2], [-1, 2], [-1, -2]], 'variables': 2} + result = solve(fixture) + verify(fixture, result) + node = result['proof'] + while 'conflict' not in node: + node = node['positive'] + node['conflict'] = 0 + reject(lambda: verify(fixture, result)) + counts['corrupt_boolean_proofs_rejected'] += 1 + source = next(t for t in templates if len(t['result']['steps']) > 1) + forged = deepcopy(source) + forged['result']['steps'][0]['blocking_clause'].pop() + reject(lambda: check_template(forged, Counter(), False)) + counts['corrupt_learned_clauses_rejected'] += 1 + forged = deepcopy(source) + forged['result']['steps'].pop() + reject(lambda: check_template(forged, Counter(), False)) + counts['missing_final_refutations_rejected'] += 1 + eq = {'matrix': [[2]], 'rhs_parity': [1], 'nonzero_entries': [0], 'blocks': 3} + false = {'status': 'all_components_singular', 'equations': eq, + 'diagonalization': diagonalize([[2]], [1], 1), 'components': []} + reject(lambda: binomial_certificate(eq, false)) + counts['unsupported_torsion_exclusions_rejected'] += 1 + + +def main(): + manifest = json.loads((ROOT/'MANIFEST.json').read_text(encoding='utf-8')) + for name, wanted in manifest['files_sha256'].items(): + assert sha256((ROOT/name).read_bytes()).hexdigest() == wanted, name + raw = gzip.decompress((ROOT/'certificates.json.gz').read_bytes()) + assert sha256(raw).hexdigest() == manifest['certificate_payload_sha256'] + data = json.loads(raw) + assert data['schema'] == 1 and len(data['templates']) == 33 + assert len({t['id'] for t in data['templates']}) == 33 + counts = Counter() + for template in data['templates']: + check_template(template, counts) + controls(data['templates'], counts) + assert counts['excluded_templates'] == 33 and counts['exact_torus_refutations'] == 78 + assert counts['noncommuting_relations'] == 32 + print(json.dumps({'status': 'PASS_FIXED_CLIFFORD_WORD_EXCLUSIONS', + 'counts': dict(counts), 'certificate_payload_sha256': sha256(raw).hexdigest()}, indent=2)) + + +if __name__ == '__main__': + main()