From de9deae2b787143923c0a504fbcc3871d01cff0b Mon Sep 17 00:00:00 2001 From: ross Date: Tue, 20 Oct 2026 21:29:00 +1100 Subject: [PATCH] Prove the fixed-interface query floor for the shared dirty pair --- .../bit-joint-dirty-pair/INPUT-SOURCES.json | 26 + research/bit-joint-dirty-pair/LICENSE | 201 +++++++ research/bit-joint-dirty-pair/MANIFEST.json | 22 + research/bit-joint-dirty-pair/PROOF.md | 344 ++++++++++++ research/bit-joint-dirty-pair/README.md | 165 ++++++ research/bit-joint-dirty-pair/RESULT.json | 513 ++++++++++++++++++ research/bit-joint-dirty-pair/REVIEW.md | 122 +++++ research/bit-joint-dirty-pair/SOURCE-NOTES.md | 94 ++++ research/bit-joint-dirty-pair/SOURCES.json | 19 + research/bit-joint-dirty-pair/TASK.json | 68 +++ research/bit-joint-dirty-pair/VERIFY.json | 33 ++ research/bit-joint-dirty-pair/check.py | 157 ++++++ .../inputs/GEOMETRY.json.gz | Bin 0 -> 42305 bytes .../inputs/PREDECESSOR-PINS.json | 19 + .../bit-joint-dirty-pair/inputs/WORD.json.gz | Bin 0 -> 105171 bytes research/bit-joint-dirty-pair/source_check.py | 329 +++++++++++ research/bit-joint-dirty-pair/verify.py | 65 +++ 17 files changed, 2177 insertions(+) create mode 100644 research/bit-joint-dirty-pair/INPUT-SOURCES.json create mode 100644 research/bit-joint-dirty-pair/LICENSE create mode 100644 research/bit-joint-dirty-pair/MANIFEST.json create mode 100644 research/bit-joint-dirty-pair/PROOF.md create mode 100644 research/bit-joint-dirty-pair/README.md create mode 100644 research/bit-joint-dirty-pair/RESULT.json create mode 100644 research/bit-joint-dirty-pair/REVIEW.md create mode 100644 research/bit-joint-dirty-pair/SOURCE-NOTES.md create mode 100644 research/bit-joint-dirty-pair/SOURCES.json create mode 100644 research/bit-joint-dirty-pair/TASK.json create mode 100644 research/bit-joint-dirty-pair/VERIFY.json create mode 100644 research/bit-joint-dirty-pair/check.py create mode 100644 research/bit-joint-dirty-pair/inputs/GEOMETRY.json.gz create mode 100644 research/bit-joint-dirty-pair/inputs/PREDECESSOR-PINS.json create mode 100644 research/bit-joint-dirty-pair/inputs/WORD.json.gz create mode 100644 research/bit-joint-dirty-pair/source_check.py create mode 100644 research/bit-joint-dirty-pair/verify.py diff --git a/research/bit-joint-dirty-pair/INPUT-SOURCES.json b/research/bit-joint-dirty-pair/INPUT-SOURCES.json new file mode 100644 index 0000000000..13b50fb71d --- /dev/null +++ b/research/bit-joint-dirty-pair/INPUT-SOURCES.json @@ -0,0 +1,26 @@ +{ + "predecessor_pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/4068", + "predecessor_head": "5a34918402ae2c0c683d8820ad832970e77f6382", + "canonical_base": "bb4bccbf42844d2801487450727c2f63e10d1d0f", + "files": [ + { + "path": "inputs/WORD.json.gz", + "sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "source_path": "research/bit-shared-source-compensation/inputs/WORD.json.gz", + "source_commit": "5a34918402ae2c0c683d8820ad832970e77f6382" + }, + { + "path": "inputs/GEOMETRY.json.gz", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "source_path": "research/bit-shared-source-compensation/inputs/GEOMETRY.json.gz", + "source_commit": "5a34918402ae2c0c683d8820ad832970e77f6382" + }, + { + "path": "inputs/PREDECESSOR-PINS.json", + "sha256": "4d03736c497eae94c4e98d33ac10ecacba9e914f9d604787237ff71075dc4e94", + "source_path": "research/bit-shared-source-compensation/inputs/PREDECESSOR-PINS.json", + "source_commit": "5a34918402ae2c0c683d8820ad832970e77f6382" + } + ], + "scope": "Exact copied input bytes; source attribution is retained in PREDECESSOR-PINS.json. New checker does not import producer code." +} diff --git a/research/bit-joint-dirty-pair/LICENSE b/research/bit-joint-dirty-pair/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/bit-joint-dirty-pair/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/bit-joint-dirty-pair/MANIFEST.json b/research/bit-joint-dirty-pair/MANIFEST.json new file mode 100644 index 0000000000..c7cc621b30 --- /dev/null +++ b/research/bit-joint-dirty-pair/MANIFEST.json @@ -0,0 +1,22 @@ +{ + "files": { + "INPUT-SOURCES.json": "bbccd32d1decb57d9a0250055080c0b8687ee6ef0e75a6b550340c87d73d7c7c", + "LICENSE": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4", + "PROOF.md": "be917cba2bac53328ca6471c9a40720b11b3b686d93d3654758be9c10e1c7e69", + "README.md": "b307851d4260d59391ff77c25a7332baf81bba59f8843a98e77b97959ab8f3b1", + "RESULT.json": "3cb0c3f09a22bd9b2f6b1823390f0aed520ad473b4827aaf1d8296a6a1a6c5b5", + "REVIEW.md": "aa2c1e8c83a6679d944401698840e47eb12f358f966c30ecc49126b201c7aa10", + "SOURCE-NOTES.md": "3bb4a2c3d55135aba1925039c4548b2eb777ccd3d7a08cc87e31023abf1a0ae6", + "SOURCES.json": "150f944dc05d1d6a65a171ebf7f92ab331280676d859e7d23ab08bbdde6731c5", + "TASK.json": "a4afcd24ee1c30d67ca9ee6aa7b6b3acdbe17783abfc58b76abefcbd2fbea33f", + "VERIFY.json": "686022a6c6a25a107ea4e6b2616c32ede1a1d13a5a79b8d89b810e8b99645408", + "check.py": "c1cf94026e5733784dfa1d92ba007a7b6e2d3148e33e7daf88630cdfdef7c01b", + "inputs/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "inputs/PREDECESSOR-PINS.json": "4d03736c497eae94c4e98d33ac10ecacba9e914f9d604787237ff71075dc4e94", + "inputs/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "source_check.py": "cfd840feef006198d3efe27560cf034719dea6831825e48b466360851b7bf421", + "verify.py": "bcb67a10939ba0b5c42005972f2c9bf9bb7e0dad8d1067c17b10ec179a9abfc0" + }, + "schema_version": 1, + "scope": "Byte integrity plus complete semantic receipts; not formal-kernel or native proof." +} diff --git a/research/bit-joint-dirty-pair/PROOF.md b/research/bit-joint-dirty-pair/PROOF.md new file mode 100644 index 0000000000..2465a0e838 --- /dev/null +++ b/research/bit-joint-dirty-pair/PROOF.md @@ -0,0 +1,344 @@ +# A sharp query tariff for two independent dirty inputs + +This is a written all-parameter proof in the model below, not a formal-kernel +verification. The finite source checks accompanying it bind a particular pair +to the hypotheses; they do not replace this proof. + +## Model and theorem + +Fix an integer address half-dimension `d >= 2` and an independent common price +parameter `m > 0`. For each odd prime `ell`, the address space is + +\[ +\Omega_\ell=\mathbf F_\ell^{2d},\qquad N=|\Omega_\ell|=\ell^{2d}. +\] + +A VALUE register is an arbitrary function `Omega_ell -> F_2`. Free operations +are invertible matrices over `F_2` mixing whole VALUE registers, with the same +scalar coefficients at every address. They include register permutations and +CNOTs. They do not include address-dependent mixing, nonlinear gates, or free +address permutations. + +For a dyadic rational idempotent `P` of size `d` and rank `r > 0`, define + +\[ +S(P)=\begin{pmatrix}I-P&P\\P&I-P\end{pmatrix}. +\] + +A paid query applies this address involution to one VALUE register and leaves +all other registers unchanged. There are no frame-path restrictions or costs +in this relaxed model: every such fixed dyadic projector is eligible as a paid +query. This relaxation does not enlarge the free gate set just specified. +At parameter `0 <= b <= 1`, its tariff is + +\[ +H_r(m)=m^b r^{1-b}. +\] + +The price parameter `m` is not the address half-dimension `d`. For each fixed +pair `(d,m)`, the number of registers, finite gate word, scalar matrices, +and rational projectors must be independent of `ell`. The same word must have +the required endpoint for every sufficiently large odd prime `ell`. + +Let `p=S(P)` and `q=S(Q)` be distinct rank-two partial swaps. Initially there +are `a >= 2` arbitrary independent VALUE registers and any finite number of +additional zero VALUE registers. The first two arbitrary inputs must become +`p f_1` and `q f_2`; every other arbitrary input must be restored, and every +initially zero register must return to zero. No arbitrary-input column is +omitted from these requirements. The notation for the address action is fixed +below. + +**Theorem.** Every such word has tariff at least + +\[ +2H_2(m)=2m^b2^{1-b}. +\] + +Two separate queries, one applying `p` to register 1 and one applying `q` to +register 2, attain this tariff. Thus it is the exact optimum in this model, +including arbitrary restored dirty spectators and restored clean ancillas. + +## 1. Partial swaps and their Boolean operator defect + +All matrices are reduced modulo an odd prime using their dyadic entries. Since +`P^2=P`, its rational characteristic polynomial is +`X^(d-r)(X-1)^r`. The same polynomial identity holds after reduction at every +odd prime. An idempotent is diagonalizable with eigenvalues 0 and 1 over every +field, so the reduced projector still has rank exactly `r`. + +In the invertible coordinates `(x+y,x-y)`, the partial swap acts as + +\[ +(u,v)\longmapsto (u,(I-2P)v). +\] + +It is an involution, has rational determinant `(-1)^r`, and fixes exactly +`ell^(2d-r)` addresses. Its permutation of `Omega_ell` therefore consists of +that many fixed points and + +\[ +D_r=\frac{\ell^{2d}-\ell^{2d-r}}2 + =\frac N2(1-\ell^{-r}) +\] + +two-cycles. On Boolean VALUE functions, each two-cycle contributes rank one +to the operator `I+rho_ell(S(P))`, and each fixed point contributes zero. +Consequently this Boolean operator has rank exactly `D_r` over `F_2`. + +Here and throughout, + +\[ +(\rho_\ell(g)f)(z)=f(g^{-1}z). +\] + +This inverse pullback makes `rho_ell(g h)=rho_ell(g)rho_ell(h)`. For a queried +involution its inverse is itself, so this convention does not change the query. + +## 2. Scalar normalization and the full endpoint + +Let there be `R >= a` registers, ordered so the arbitrary inputs precede the +zero inputs, and let `J` be the constant `R`-by-`a` coordinate inclusion. The +endpoint is the equality of complete `R`-by-`a` VALUE operators + +\[ +WJ=JD,\qquad D=\operatorname{diag}(p,q,I,\ldots,I). \tag{1} +\] + +Here an address label means its VALUE action. In the dirty-only case `R=a`, +this specifies the entire square operator. When `R>a`, it specifies all +arbitrary input columns and the zero final rows of the clean ancillas; it does +not assert any action on hypothetical nonzero inputs in the clean slots. + +Write the word, in operator order, as + +\[ +W=A_k Q_k A_{k-1}\cdots Q_1 A_0, +\] + +where all `A_i` are scalar invertible matrices, and query `Q_i` acts on one +register with address label `g_i`. Let + +\[ +S=A_k\cdots A_0,\qquad B_i=A_{i-1}\cdots A_0. +\] + +Then the exact factorization is + +\[ +W=S T_k\cdots T_1,\qquad +T_i=B_i^{-1}Q_i B_i=I+(g_i+1)E_i, \tag{2} +\] + +where `E_i=u_i v_i` is a scalar rank-one idempotent: `u_i` is a column, +`v_i` a row, and `v_i u_i=1`. Scalar entries commute with address labels, but +address labels themselves are not commuted in (2). + +Queries fix constant VALUE functions. Applying (1) to arbitrary constants in +the first `a` slots therefore gives + +\[ +SJ=J. \tag{3} +\] + +In particular `S=I` in the dirty-only case. With clean slots only (3), not +`S=I`, is warranted. + +## 3. Zero, one, or two queries + +Fix any odd prime at which the endpoint holds. Applying (2), (3), and the +matrix-rank inequality `rank(AB-I) <= rank(A-I)+rank(B-I)` gives + +\[ +\begin{aligned} +2D_2 + &=\operatorname{rank}(JD-J)\\ + &=\operatorname{rank}\bigl(S(T_k\cdots T_1-I)J\bigr)\\ + &\le \sum_{i=1}^k \operatorname{rank}(T_i-I) + =\sum_{i=1}^k D_{r_i}. \tag{4} +\end{aligned} +\] + +The target rank is a sum because its two defects occupy independent input and +output register blocks. Conjugation by scalar invertible matrices preserves +each query's Boolean defect rank. + +Zero or one query cannot satisfy (4): `D_r < N/2`, whereas +`2D_2=N(1-ell^(-2)) > N/2`. If there are two queries and one has rank one, +then, for the other rank `s`, + +\[ +D_1+D_s + 2`. Thus a two-query word has +both ranks at least two, and its tariff is at least `2H_2(m)`. This argument +already holds over any single odd prime field where the endpoint holds. + +## 4. Lifting the uniform endpoint to a group algebra + +Let `G` be the subgroup of `GL_(2d)(Q)` generated by the finite collection of +queried address maps together with `p` and `q`. Interpret the fixed word in +the matrix algebra over `F_2[G]`. Distinct group elements are distinct +rational linear maps; a fixed finite-field permutation representation need +not be faithful on this group algebra. + +Nevertheless, the uniform endpoint (1) implies its formal `F_2[G]` version. +To see this, collect the finitely many distinct labels in each coefficient of +`WJ-JD`. For the finite union of these labels, choose an integer address `z` +such that all `g^{-1}z` are distinct over `Q`. Such a choice exists: each +coincidence is a proper rational linear subspace, and a finite union of these +subspaces cannot cover all integer vectors. More explicitly one can use +`z=(1,t,...,t^(2d-1))` for an integer `t` avoiding the roots of finitely many +nonzero rational polynomials. + +Clear denominators and, for each pair of distinct images, select one nonzero +integer coordinate of their difference. Outside the finitely many primes +dividing these selected numerators or denominators, the images remain +distinct after reduction. For a chosen input register, an indicator VALUE +function at any one of these images separates its coefficient from all other +labels, when the output is evaluated at `z`. Hence a nonzero formal +coefficient would violate (1) at every sufficiently large prime. This proves +the formal identity. + +This step uses fixed finite data and uniform correctness over sufficiently +large odd primes. It does not assert a lower bound for arbitrary +modulus-dependent words from one fixed-field representation. + +## 5. Three rank-one queries are impossible, including clean ancillas + +The determinant sign of a rational address map defines a homomorphism + +\[ +G\longrightarrow C_2,\qquad g\longmapsto t^{\sigma(g)}, +\] + +where `sigma(g)=0` for positive determinant and `1` for negative determinant. +All generators have determinant `+1` or `-1`. For a rank-`r` partial swap this +image is `t^r`. The induced ring map has codomain + +\[ +\mathbf F_2[C_2] + =\mathbf F_2[\varepsilon]/(\varepsilon^2),\qquad t=1+\varepsilon. +\] + +Suppose now that `k=3` and all three queries have rank one. Each label maps to +`1+epsilon`, while the even-rank target labels `p,q` both map to 1. Using the +formal identity from Section 4 and factorization (2), + +\[ +T_3T_2T_1\longmapsto I+\varepsilon(E_1+E_2+E_3). +\] + +Set + +\[ +U=\begin{pmatrix}u_1&u_2&u_3\end{pmatrix},\qquad +V=\begin{pmatrix}v_1\\v_2\\v_3\end{pmatrix}. +\] + +The constant coefficient of (1) is (3); its `epsilon` coefficient is +`SUVJ=0`. Since `S` is invertible, + +\[ +UVJ=0. \tag{5} +\] + +On the other hand, expand the ordered product `T_3T_2T_1-I` in `F_2[G]`. +Each scalar matrix multiplying an address word is a linear combination of +nonempty ordered products of the `E_i`. Every such product has the form + +\[ +E_{i_1}\cdots E_{i_s} + =u_{i_1}(v_{i_1}u_{i_2})\cdots + (v_{i_{s-1}}u_{i_s})v_{i_s}. +\] + +Therefore every group-label coefficient of + +\[ +WJ-J=S(T_3T_2T_1-I)J +\] + +has image contained in `im(SU)` and row space contained in `row(VJ)`. +Cancellation or coinciding address words cannot enlarge either containing +space. + +But the two distinct nonidentity target labels `p` and `q` have respective +coefficient matrices `e_1 e_1^T J` and `e_2 e_2^T J` in `JD-J`. Their images +span two independent register directions and their rows span two independent +input directions. Thus + +\[ +\operatorname{rank}U\ge2,\qquad +\operatorname{rank}(VJ)\ge2. +\] + +Sylvester's rank inequality over `F_2` now gives + +\[ +\operatorname{rank}(UVJ) + \ge \operatorname{rank}U+\operatorname{rank}(VJ)-3 + \ge1, +\] + +contradicting (5). This excludes three rank-one queries without assuming that +the clean inputs were arbitrary. It also does not require noncommutativity, +an intersection condition on the two projector images, or a bounded number +of restored spectators beyond finiteness. + +For comparison, in the dirty-only case a shorter parity argument is +available: taking determinants after the same ring map gives +`t^(sum r_i)=det(D)=1`, hence `sum r_i` is even. Each conjugated query has a +rank-one register coupling and determinant `t^r`; every scalar invertible +`F_2` matrix has determinant 1. This square-operator determinant argument alone +would not justify the clean-ancilla extension; the rectangular argument above +supplies it. + +## 6. Completing the tariff bound + +Put `alpha=1-b`, so `0 <= alpha <= 1`, and divide all tariffs by `m^b`. + +- With at most one query the endpoint is impossible. +- With two queries, Section 3 gives a cost of at least `2*2^alpha`. +- With three queries, Section 5 excludes three rank-one queries. At least one + rank is therefore at least two, giving cost at least `2+2^alpha`, which is + at least `2*2^alpha` because `2^alpha <= 2`. +- With at least four queries, each has positive integer rank and costs at + least 1, giving total at least `4 >= 2*2^alpha`. + +The two direct rank-two queries meet the bound, proving the theorem for every +`b` in the closed interval, including both endpoints. + +## 7. Conditional application and remaining scope + +The theorem applies to a source rewrite only after its required endpoint has +been identified with (1), including all independent dirty columns and restored +rows. It permits jointly mixing the two dirty inputs with each other and with +any finite number of restored dirty or clean registers. The lower bound is +on their complete replacement operator, not on an individual spelling of the +two original queries. + +One sufficient application condition is a fixed rejoining cut followed by an +unchanged injective suffix, with equality of the entire final state required. +When a replacement introduces clean ancillas, compare both words on the same +extended state space and extend the frozen suffix by the identity on those +new slots. This common extension remains injective, so equality of the entire +final state forces equality of the whole state at the cut, including zero in +the new slots. Cleaning them later with added gates changes the extended +suffix even if every old suffix record remains present. + +The source-specific audit must still identify the cut, the independent inputs, +and the target operator. Equality of selected public outputs alone does not +supply this implication. A changed later compensation or cleanup word is a +different endpoint problem and is not excluded by this theorem. + +The result charges only the stipulated query tariff with its independent +common parameter `m`; any native interpretation of that tariff is an inherited +conditional pricing premise, not a new conversion here. It does not certify a +native frame schedule, workspace or tape bound, integer precision bound, +compiler cost, or improved multiplication exponent. The field-uniform word, +linear scalar free gates, one-register queries, and complete endpoint are +substantive hypotheses. Other interfaces, nonlinear or address-dependent +free operations, and modulus-dependent constructions require new arguments. diff --git a/research/bit-joint-dirty-pair/README.md b/research/bit-joint-dirty-pair/README.md new file mode 100644 index 0000000000..507f2eb091 --- /dev/null +++ b/research/bit-joint-dirty-pair/README.md @@ -0,0 +1,165 @@ +# Joint dirty processing does not lower this pair's unary-query tariff + +For the two independently dirty rank-two inputs identified in +[PR4068](https://github.com/CrocSwap/integer-mult-bounds/pull/4068), the original +two queries attain the minimum tariff in the uniform unary-query model below. +Arbitrary scalar mixing and any finite number of restored dirty or initially +zero registers are allowed for free. The exact minimum remains +`2 Phi_m(2)`, where `Phi_m(r)=m^b r^(1-b)` and `0 <= b <= 1`. +There is no recursive-query saving or new kappa from this local mechanism. + +This is a written all-parameter proof with finite source and algebra controls, +not a proof-kernel certificate or a new native supplier. The substantive +premises are fixed rational address maps, one VALUE stream per query, scalar +mixing independent of the address, the same finite word for all sufficiently +large odd address primes, and restoration of the complete required state. +The price parameter `m` is independent of the address half-dimension `d`. + +## Actual source and endpoint + +The frozen input bytes are copied from PR4068 head +`5a34918402ae2c0c683d8820ad832970e77f6382` and independently pinned in +[INPUT-SOURCES.json](INPUT-SOURCES.json). This package starts from canonical +main `bb4bccbf42844d2801487450727c2f63e10d1d0f` and changes no predecessor. + +| Helper | Original record | Frames | Query rank | +|---|---:|---|---:| +| 413 | 23405 | 509 to 390 | 2 | +| 444 | 23424 | 509 to 392 | 2 | + +Both queries can be moved to the quiet cut before record23339, preserving the +remaining scalar word and frames. All660 ordinary rows at that cut are +independently arbitrary: a complete inverse-prefix replay returns their660 +input columns. The existing private slot660 is inactive and zero. The proof +grants access to additional clean scratch as a favorable relaxation, so it +does not depend on treating that private slot as dirty or unavailable. + +The two rank-two increment projectors `P,Q` satisfy `(PQ-QP)[0,1]=1/8`. +Their partial-swap address labels `p=S(P), q=S(Q)` are distinct. A nonzero +dyadic minor `1/256` also certifies `rank[P Q]=4`; the principal proof does +not require that stronger geometric fact or noncommutativity. + +The required local operator is `diag(p,q,I,...)` on all arbitrary rows, +with initially zero auxiliary rows returned to zero. This is the necessary +endpoint for a replacement that rejoins the same injective suffix and +preserves the entire final state. Reversible ADD/MOVE operations and guarded +COPY/ERASE pairs make the frozen suffix injective on its valid states. +New auxiliary ports have identity continuation, or the same explicitly +injective continuation on both sides. Cleaning them later with new gates +changes the extended suffix even if every old record remains. +The earlier two-public-output minor alone would not justify this endpoint +for arbitrary perturbations to other source, helper or output rows. +A rewrite that changes later compensation has a different endpoint problem. + +## Why all cheaper call profiles fail + +[PROOF.md](PROOF.md) gives the full argument, including clean input columns. +Let `N=ell^(2d)`. A rank-r partial swap has Boolean operator defect rank +`D_r=N(1-ell^(-r))/2`. Scalar mixing fixes the constant-input normalization, +so query defects must supply the target's two independent defects `2D_2`. +This excludes one query of any rank and two queries with either rank equal +to one. In particular, replacing `(2,2)` by `(1,3)` is impossible. + +For three rank-one queries, fixed uniform correctness lifts to the formal +group algebra: finitely many distinct rational address maps separate on a +generic integer address and remain separated modulo all sufficiently large +good primes. The address determinant character then maps odd queries to +`1+epsilon`, with `epsilon^2=0`, while both targets map to1. If `U` collects +the three query output directions and `VJ` their arbitrary-input directions, +this forces `UVJ=0`. The two required target coefficients force both ranks +to be at least two, contradicting Sylvester's inequality through a +three-dimensional intermediate space. This argument allows clean ancillas. + +Writing `x=2^(1-b)`, with `1 <= x <= 2`, exhausts every call count: + +| Calls | Necessary normalized tariff | +|---:|---| +| 0 or1 | Impossible | +| 2 | Both ranks at least2, hence at least `2x` | +| 3 | Not all rank1, hence at least `2+x >= 2x` | +| 4 or more | At least `4 >= 2x` | + +The two original rank-two calls attain `2x`. Free workspace and scalar +operations only favor a proposed replacement; charging them cannot turn +this local result into a saving. + +The uniform-prime hypothesis is essential to the argument. Our explicit +control sums all24 coordinate permutations of four coordinates. It is a +nonzero formal group-algebra element whose Boolean operator is zero on +all81 addresses over F3, yet is nonzero at a separating F5 address. +A single finite-address representation cannot silently replace the bridge. + +## Packing proposals and their missing costs + +The direct-product carrier `H(x,y)=f(x)+g(y)`, together with the anchor +`c=f(0)`, encodes both functions injectively. Applying the single address +map `diag(p,q)` to H and decoding its slices gives `pf` and `qg` because +linear maps fix zero. Its partial-swap rank is four after reordering +coordinates. But its address carrier has `N^2` cells, plus the anchor, +instead of the original `2N` cells. Encoding, access, scratch, restoration +and the query's changed payload volume are unpriced. It cannot be invoiced +as one original-sized `Phi_m(4)` call. + +A tagged two-bank primitive could instead specify +`F(0,x)=f(x), F(1,x)=g(x)` and act by `(0,x)->(0,px)`, +`(1,x)->(1,qx)`. This is a precise functional interface, but it is a +tag-controlled choice between two address maps, not the admitted single +linear partial swap on the original carrier. Rank-two involutions can also +be conjugated to a common label, but encoding and decoding that conjugation +on one bank require address adapters and a justified enlarged-carrier tariff. +Neither construction supplies those missing native costs. + +Even the hypothetical tariff `Phi_m(4)` leaves only +`m^b(2x-x^2)` of margin against `2 Phi_m(2)`. Since `x(2-x) <= 1`, +one extra ordinary rank-one query consumes that entire margin. A useful +tagged mechanism therefore needs both a genuinely admitted joint tariff +and a packing/consumer contract with no additional ordinary query overhead. +These are interface proposals, not positive query savings. + +## Reproduction and evidence + +From the repository root: + +```sh +python3.12 -B scripts/research_package.py --package research/bit-joint-dirty-pair +``` + +The self-contained package also runs without Git, predecessor checkouts, +network access or writable package files: + +```sh +python3 -I -B /absolute/path/to/bit-joint-dirty-pair/verify.py +python3 -I -O -B /absolute/path/to/bit-joint-dirty-pair/verify.py +``` + +The verifier checks immutable input hashes, the focused source prefix and +local retiming, all660 independent columns, private-slot guards, exact +projector geometry, finite Boolean defect ranks, all32768 pairs of small +matrices in the stated Sylvester control, and the finite-field representation +counterexample. Complete canonical JSON receipts are compared, including +Boolean types. The code does not verify the all-parameter proof in a kernel. +Normal and optimized execution run the same checks. + +[REVIEW.md](REVIEW.md) records separate AI mathematical and source reviews. +[SOURCE-NOTES.md](SOURCE-NOTES.md) retains attribution and overlap limits. +No physical controller, owner allocation, all-size precision/storage proof, +changed whole-word histogram, supplier admission or selected-frontier change +is claimed. + +## Open next questions + +The next concrete route is a larger joint helper/consumer rewrite that changes +the full rejoin state and cancels its effects later. Pin its earliest changed +reader and every borrowed row, then compare the entire output map and paid +query profile. No such downstream word is supplied here, and a public-output +projection alone does not establish restoration. + +A second route is to implement the tagged two-bank interface with its true +payload volume, physical layout and full adapter/cleanup price. The first +test is whether an actual packet already supplies and consumes the needed +layout without paid conversion. Its joint recursive price remains unknown. +Structured relevance, first steps and blockers are in [TASK.json](TASK.json). + +Ross Richardson, with substantial OpenAI Codex assistance in mathematics, +implementation and writing, and separate AI checks. Apache-2.0. No independent +human or formal-kernel review is claimed. diff --git a/research/bit-joint-dirty-pair/RESULT.json b/research/bit-joint-dirty-pair/RESULT.json new file mode 100644 index 0000000000..f555297f24 --- /dev/null +++ b/research/bit-joint-dirty-pair/RESULT.json @@ -0,0 +1,513 @@ +{ + "finite_controls": { + "defect_rank": { + "actual_permutation_cases": [ + { + "address_dimension": 2, + "boolean_defect_rank": 0, + "fixed_addresses": 9, + "prime": 3, + "query_rank": 0 + }, + { + "address_dimension": 2, + "boolean_defect_rank": 3, + "fixed_addresses": 3, + "prime": 3, + "query_rank": 1 + }, + { + "address_dimension": 4, + "boolean_defect_rank": 0, + "fixed_addresses": 81, + "prime": 3, + "query_rank": 0 + }, + { + "address_dimension": 4, + "boolean_defect_rank": 27, + "fixed_addresses": 27, + "prime": 3, + "query_rank": 1 + }, + { + "address_dimension": 4, + "boolean_defect_rank": 36, + "fixed_addresses": 9, + "prime": 3, + "query_rank": 2 + }, + { + "address_dimension": 6, + "boolean_defect_rank": 0, + "fixed_addresses": 729, + "prime": 3, + "query_rank": 0 + }, + { + "address_dimension": 6, + "boolean_defect_rank": 243, + "fixed_addresses": 243, + "prime": 3, + "query_rank": 1 + }, + { + "address_dimension": 6, + "boolean_defect_rank": 324, + "fixed_addresses": 81, + "prime": 3, + "query_rank": 2 + }, + { + "address_dimension": 6, + "boolean_defect_rank": 351, + "fixed_addresses": 27, + "prime": 3, + "query_rank": 3 + }, + { + "address_dimension": 4, + "boolean_defect_rank": 0, + "fixed_addresses": 625, + "prime": 5, + "query_rank": 0 + }, + { + "address_dimension": 4, + "boolean_defect_rank": 250, + "fixed_addresses": 125, + "prime": 5, + "query_rank": 1 + }, + { + "address_dimension": 4, + "boolean_defect_rank": 300, + "fixed_addresses": 25, + "prime": 5, + "query_rank": 2 + } + ], + "even_address_characteristic_does_not_have_strict_gap": true, + "normalized_target_minus_relaxed_rank1_plus_any_rank": { + "11": "9/242", + "3": "1/18", + "5": "3/50", + "7": "5/98" + } + }, + "limits": [ + "finite controls do not prove the all-parameter theorem", + "the uniform-prime bridge is a written proof", + "no changed consumer or native execution is verified" + ], + "no_new_kappa": true, + "odd_call_rank_obstruction": { + "complete_matrix_pairs": 32768, + "four_columns_allow_zero_product_with_two_directions": true, + "one_direction_allows_two_columns": true, + "pairs_with_both_ranks_at_least_two": 19404, + "zero_products_in_that_class": 0 + }, + "status": "PASS_FINITE_JOINT_QUERY_CONTROLS", + "uniformity_control": { + "F3_addresses_with_zero_operator_column": 81, + "F5_generic_point": [ + 0, + 1, + 2, + 3 + ], + "distinct_images_at_F5_point": 24, + "formal_support_size": 24, + "scope": "S4 coordinate-permutation example; not a counterexample to the uniform-prime bridge" + }, + "written_tariff_reduction": { + "attainment": "the original separate rank-two queries", + "four_or_more_queries": "cost >= 4 >= 2*x", + "three_queries": "not all rank one; cost >= 2+x >= 2*x", + "two_queries": "each rank >= 2; cost >= 2*x", + "x": "2^(1-b), with 1 <= x <= 2 for 0 <= b <= 1", + "zero_or_one_queries": "impossible by actual-action defect rank" + } + }, + "source": { + "address_displacement_concat_rank_over_Q": 4, + "address_swap_commutator_0_1": "1/4", + "commutator_0_1": "1/8", + "entrance_cut": 23339, + "geometric_concat_rank_over_Q": 4, + "geometric_minor": { + "columns": [ + 0, + 1, + 8, + 9 + ], + "determinant": "1/256", + "rows": [ + 0, + 1, + 2, + 4 + ] + }, + "independent_dirty_pivot": [ + [ + 1, + 0 + ], + [ + 0, + 1 + ] + ], + "limits": [ + "prefix and local retiming only; no repeated full-word metric audit", + "address geometry over Q is not a representation of payload F2[G]", + "formal common-cut diagonal endpoint requires its own algebra theorem", + "no changed-tail or source-compensation lower bound", + "no native physical execution, recursive moment improvement or new kappa" + ], + "negative_controls": { + "Q_replaced_by_P_collapses_concat_rank": true, + "Q_replaced_by_P_fails_noncommutation": true, + "clean_private_COPY_ERASE_control_accepted": true, + "dirty_private_port_rejected_by_original_COPY": true, + "discarding_independent_dirty_input_loses_rank": true, + "omitted_second_query_fails_frame_contract": true + }, + "no_new_kappa": true, + "ordinary_independent_input_columns": 660, + "predecessor_head": "5a34918402ae2c0c683d8820ad832970e77f6382", + "prefix_columns_sha256": "ed967ce61b4f04e73d8cf6c281ec880ee3ff03a2eb80d7af400e8716dee6e756", + "prefix_inverse_returns_all_660_columns": true, + "private_port": { + "contract": "inactive private zero, not a free active arbitrary-dirty role", + "first_future_COPY_record": 23524, + "frame": null, + "index": 660, + "prior_COPY_count": 0, + "value": "zero" + }, + "projectors": { + "P": [ + [ + "1/4", + "-1/4", + "0", + "0", + "1/4", + "-1/4", + "0", + "0" + ], + [ + "-1/4", + "1/2", + "0", + "1/4", + "0", + "1/4", + "-1/4", + "0" + ], + [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + [ + "0", + "1/4", + "0", + "1/4", + "1/4", + "0", + "-1/4", + "0" + ], + [ + "1/4", + "0", + "0", + "1/4", + "1/2", + "-1/4", + "-1/4", + "0" + ], + [ + "-1/4", + "1/4", + "0", + "0", + "-1/4", + "1/4", + "0", + "0" + ], + [ + "0", + "-1/4", + "0", + "-1/4", + "-1/4", + "0", + "1/4", + "0" + ], + [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ] + ], + "Q": [ + [ + "1/2", + "-1/4", + "-1/4", + "0", + "1/4", + "0", + "0", + "-1/4" + ], + [ + "-1/4", + "1/4", + "1/4", + "1/4", + "0", + "0", + "0", + "0" + ], + [ + "-1/4", + "1/4", + "1/4", + "1/4", + "0", + "0", + "0", + "0" + ], + [ + "0", + "1/4", + "1/4", + "1/2", + "1/4", + "0", + "0", + "-1/4" + ], + [ + "1/4", + "0", + "0", + "1/4", + "1/4", + "0", + "0", + "-1/4" + ], + [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + [ + "-1/4", + "0", + "0", + "-1/4", + "-1/4", + "0", + "0", + "1/4" + ] + ], + "common_frame": [ + [ + "1/2", + "1/4", + "1/4", + "0", + "-1/4", + "0", + "0", + "1/4" + ], + [ + "1/4", + "1/2", + "0", + "-1/4", + "0", + "-1/4", + "1/4", + "0" + ], + [ + "1/4", + "0", + "1/2", + "-1/4", + "0", + "1/4", + "-1/4", + "0" + ], + [ + "0", + "-1/4", + "-1/4", + "1/2", + "-1/4", + "0", + "0", + "1/4" + ], + [ + "-1/4", + "0", + "0", + "-1/4", + "1/2", + "1/4", + "1/4", + "0" + ], + [ + "0", + "-1/4", + "1/4", + "0", + "1/4", + "1/2", + "0", + "1/4" + ], + [ + "0", + "1/4", + "-1/4", + "0", + "1/4", + "0", + "1/2", + "1/4" + ], + [ + "1/4", + "0", + "0", + "1/4", + "0", + "1/4", + "1/4", + "1/2" + ] + ] + }, + "query_rank_profile": { + "2": 2 + }, + "query_records": { + "23405": [ + 0, + 413, + 509, + 390, + 2, + 0 + ], + "23424": [ + 0, + 444, + 509, + 392, + 2, + 0 + ] + }, + "quiet_window_half_open": [ + 23339, + 23405 + ], + "record_indexing": "zero based original WORD", + "retimed_all_columns_and_frames_equal": true, + "retimed_end_columns_sha256": "46bdd46c654e1f2225693a5ee516173a823fc1575435890aa7b85f4b17c33d7b", + "retimed_local_inverse_checked": true, + "retimed_window_half_open": [ + 23339, + 23426 + ], + "selected_common_frame": 509, + "selected_rows": { + "17": { + "17": 1 + }, + "413": { + "17": 1, + "22": 1, + "33": 1, + "413": 1, + "469": -1, + "60": 1, + "605": -1, + "67": 1, + "87": 1, + "92": 1 + }, + "444": { + "17": 1, + "22": 1, + "33": 1, + "369": -1, + "38": 1, + "444": 1, + "60": 1, + "77": 1, + "87": 1, + "92": 1 + } + }, + "source17_unchanged_until_before": 24523, + "source_hashes": { + "inputs/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "inputs/PREDECESSOR-PINS.json": "4d03736c497eae94c4e98d33ac10ecacba9e914f9d604787237ff71075dc4e94", + "inputs/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + "status": "PASS_ACTUAL_JOINT_DIRTY_SOURCE_BINDING", + "trace_commutator_squared": "-1", + "word_canonical_sha256": "3bca74a2a8427eb18e86566baa19de597f10d0bc40c30b7443febd499ee2189a" + } +} diff --git a/research/bit-joint-dirty-pair/REVIEW.md b/research/bit-joint-dirty-pair/REVIEW.md new file mode 100644 index 0000000000..705427f422 --- /dev/null +++ b/research/bit-joint-dirty-pair/REVIEW.md @@ -0,0 +1,122 @@ +# Final scoped package review + +Reviewed the root-authored README, verifier wrapper, finite-control checker, +and source checker in `research/bit-joint-dirty-pair`. The all-parameter proof +was checked only for consistency with those claims, not independently +re-reviewed by its author. No full suite was rerun. The root owns final normal, +optimized, read-only-export, and mutant runs; their manifest/results were not +complete when this review began. + +## Verdict + +No remaining blocking mathematical or implementation finding in the reviewed +bytes. One source-to-execution binding issue was reported and fixed during +review. The README accurately limits the optimum to the uniform unary-query +full-endpoint model and keeps native packing and changed-tail questions open. + +## Reported issue and verified correction + +The initial `verify.py` hashed each child source and subsequently executed its +pathname. The bytes executed were therefore not bound to the authenticated +snapshot. This was an integrity gap, not a counterexample to the mathematics. + +The corrected `verify.py:10-17,44-47` bootstrap reads the child once, compares +its hash with the retained manifest value, and compiles those identical bytes. +It sets the correct `__file__` and `__name__` and retains isolated/optimized +interpreter flags. At lines50-57 the expected receipt is parsed from the +authenticated bytes, and package bytes/inventory are checked again afterward. +A focused wrong-hash subprocess probe rejected with +`executed checker hash check.py` before producing any checker output. This +probe did not execute either full checker. + +## Claim and capacity checks + +- **Full endpoint and clean continuation (README:42-52).** The source pair is + compared at a common cut with all ordinary rows independently arbitrary. + The same injective suffix must act on the same extended state space. The + added clarification correctly gives new ancillary slots identity + continuation, or an identical injective continuation in both words. Later + new cleanup gates change that extended suffix even when old records remain. + The corresponding clarification was added, under explicit parent ownership + authorization, to the proof's application paragraph. Public-output equality + alone remains insufficient. + +- **Product carrier (README:94-101).** The proposed encoding is injective: + with `H(x,y)=f(x)+g(y)` and `c=f(0)`, recover + `g(y)=H(0,y)+c`, `g(0)=H(0,0)+c`, and + `f(x)=H(x,0)+H(0,0)+c`. A linear address map fixes zero, so the same slice + identities decode after applying `diag(p,q)`. Reordering the two address + halves identifies this map with `S(P direct_sum Q)`, whose projector rank + is four. However the carrier has `N^2` VALUE cells plus the anchor, versus + `2N` original cells. The text does not invoice this larger payload as a + native original-size rank-four call or omit the unpriced encoding/cleanup. + +- **Tagged interface (README:103-110).** Choosing `p` or `q` according to a + bank tag is not the stated single linear partial swap on the original + address carrier. Conjugating one target to a common label does not make the + bank's address adapters free. The text preserves both missing obligations: + an admitted joint primitive and its actual carrier/adapter tariff. + +- **Hypothetical margin (README:112-117).** For `x=2^(1-b)` in `[1,2]`, + `Phi_m(4)=m^b x^2` and the optimistic saving is + `m^b*x*(2-x)=m^b*(1-(x-1)^2) <= m^b=Phi_m(1)`. Thus one extra ordinary + positive-rank query eliminates any strict saving under this hypothetical + price. At `b=1` it exactly consumes the margin; at `b=0` the initial margin + is zero. No positive saving is claimed. This is a necessary overhead screen, + not proof of an implementable tagged supplier. + +- **Tariff and geometry scope (README:3-16,37-40,54-90).** The price parameter + `m` is separated from address half-dimension `d`. Distinct/noncommuting + rational projector geometry is not used as a faithful representation of + payload `F_2[G]`. The finite-field kernel example supports the caution, while + the actual uniform lifting step remains a written proof. The minimum is + conditioned on a fixed finite word, scalar address-independent free gates, + one VALUE stream per paid query, and the complete endpoint. + +## Code coverage assessment + +`check.py` correctly implements bit-packed GF(2) row elimination and matrix +multiplication for the stated dimensions. The 32768 Sylvester cases are all +512 binary 3-by-3 matrices times all64 binary 3-by-2 matrices. Its four-column +and one-output positive controls prevent treating the three-column/two-output +obstruction as universal. The direct permutation controls measure Boolean +defect rank, rather than merely substituting the predicted formula. Their +coordinate-projector samples are expressly finite controls, not an exhaustive +test of all rational projectors. The S4 toggle computation really sums all24 +distinct formal labels and cancels on every F3 address; the F5 tuple has24 +distinct images. No fixed-field faithfulness is inferred. + +`source_check.py` authenticates the frozen compressed inputs before +decompressing those same bytes. Its prefix replay checks660 independent +columns, common frames, private-slot guards, and the exact inverse. The quiet +window predicates cover both reads and writes of the two selected helpers; +therefore moving the two queries across that window does not silently cross a +reader. Local retiming compares every row and frame and checks its literal +inverse. Exact rational geometry reconstructs P,Q from the supplied lines, +checks idempotence/rank/nesting/dyadic entries, and verifies the specified +commutator and nonzero rank-four minor. These are sufficient for the stated +source pair; they are not a new full-word precision or changed-tail audit. + +The wrapper compares complete canonical JSON receipts, including Boolean +values distinct from integer one, and all substantive checks use explicit +exceptions rather than assertions. This supports equal normal/optimized +coverage, subject to the root's pending complete executions. + +The omitted-query negative control in the source checker accepts any +`ValueError`; its current fixture is rejected by the next frame contract. +Making that control reason-specific would be optional hardening. No present +claim relies on interpreting an unrelated exception as a mathematical proof, +and this review does not treat that stylistic improvement as a blocker. + +## Reviewed content hashes + +| File | SHA256 | +|---|---| +| README.md | `b307851d4260d59391ff77c25a7332baf81bba59f8843a98e77b97959ab8f3b1` | +| verify.py | `bcb67a10939ba0b5c42005972f2c9bf9bb7e0dad8d1067c17b10ec179a9abfc0` | +| check.py | `c1cf94026e5733784dfa1d92ba007a7b6e2d3148e33e7daf88630cdfdef7c01b` | +| source_check.py | `cfd840feef006198d3efe27560cf034719dea6831825e48b466360851b7bf421` | +| PROOF.md (consistency only) | `be917cba2bac53328ca6471c9a40720b11b3b686d93d3654758be9c10e1c7e69` | + +This review does not certify the not-yet-generated manifest/receipts, a native +cost conversion, publication, human review, or a formal-kernel theorem. diff --git a/research/bit-joint-dirty-pair/SOURCE-NOTES.md b/research/bit-joint-dirty-pair/SOURCE-NOTES.md new file mode 100644 index 0000000000..63cb82c0ca --- /dev/null +++ b/research/bit-joint-dirty-pair/SOURCE-NOTES.md @@ -0,0 +1,94 @@ +# Sources, attribution and overlap + +This user-assigned follow-up starts from canonical +`bb4bccbf42844d2801487450727c2f63e10d1d0f`, priority revision6, and the +frozen shared-source package in +[PR4068](https://github.com/CrocSwap/integer-mult-bounds/pull/4068) at +`5a34918402ae2c0c683d8820ad832970e77f6382`. That predecessor saves four +scalar ADDs and identifies the two independent dirty query inputs; it does +not claim a recursive-query saving. Its new query-sharing question motivates +this package's broader scalar-mixing model and precise fixed-join answer. + +The bundled WORD and GEOMETRY are copied byte for byte from that public head. +Their paths and hashes are in [INPUT-SOURCES.json](INPUT-SOURCES.json). +The unchanged `inputs/PREDECESSOR-PINS.json` records historical lineage at +`8eefab699338b93400ca72ab22c6cf64352f7e05` and +`b628ba738802587a38e61affaa01fd188d0644f9`. Public byte-identical archives +also occur in [PR4021](https://github.com/CrocSwap/integer-mult-bounds/pull/4021) +at `c01f97ecfc7fa64847f6abd8f7b231e1df8c7b70`, as recorded in PR4068's +PUBLIC-PREDECESSOR.json. Reproduction needs only the bundled copies, not +historical local commits or checkouts. + +The source lineage credits Ali Romman's R438/PR1043 substitution, Sagar +Thakrar's transported word and window analysis, PR540 frame conventions, +PR589 hosting, PR1023 width-eight hosting, and the five-terminal package. +The retained controller lineage credits DreamingOfClouds, Zhihao Chen, +eumemic and chafreaky. These constructions are inherited, not new results. +The focused source checker was written for this package without importing +the producer implementation; the full predecessor metric audit is not repeated. + +## Mathematical antecedents + +Jose Manuel's +[two-register-three-mix / PR2108](https://github.com/CrocSwap/integer-mult-bounds/blob/bb4bccbf42844d2801487450727c2f63e10d1d0f/research/two-register-three-mix/README.md) +(package commit `b25eb9b6a95d8b644c582a5c0d8229bc2ffc3eb7`) is a direct +antecedent: two registers, arbitrary group and field, at most three +nonmonomial scalar blocks, and full group-diagonal endpoint admit unary +routes without increasing a subadditive tariff. A two-query word has at +most three scalar blocks, so the no-ancilla two-query case is not presented +as a new general discovery. Its bounded operator-separation argument also +motivates care about formal versus actual address actions. + +The source-archived +[S4 four-role census](https://github.com/CrocSwap/integer-mult-bounds/blob/bb4bccbf42844d2801487450727c2f63e10d1d0f/research/s4-noncommuting-threecycle-r4-seeda27b/README.md) +at package commit `90405b9498e4abfdd7d0eececcf11c7e83c6d13b` +uses formal F2[S4], four dirty roles and adjacent-transposition labels to +certify four-call minima for eight three-cycle target pairs. Its fixed +alphabet, role count and unit tariff differ from the present actual +rank-two involution pair and arbitrary finite clean/dirty ancilla allowance. + +The +[binary-affine register bound](https://github.com/CrocSwap/integer-mult-bounds/blob/bb4bccbf42844d2801487450727c2f63e10d1d0f/research/binary-affine-register-bound/PROOF.md) +at `7f25b6d0e1d7e995d4d2840f231d98b1a1a9fec2` is a precedent for +augmentation normalization and representation-rank bounds with arbitrary +restored dirty registers. Its homogeneous address representation has +characteristic two. Rational dyadic address matrices cannot simply be +substituted into that representation over the payload field F2. + +The +[nonlinear frame-cut bound](https://github.com/CrocSwap/integer-mult-bounds/blob/bb4bccbf42844d2801487450727c2f63e10d1d0f/research/nonlinear-frame-cut-bound/README.md) +at `78a1810e44bf08f845252cfe4c785ccc967c07a2` gives weighted cut +certificates and a common-flag corollary. The present pair has +`tr([P,Q]^2)=-1`, excluding simultaneous triangularization over any +characteristic-zero extension, so that common-flag corollary is not used +to certify this pair. Its general certificate framework is not refuted. + +These sources were read for attribution and scope; their full suites were +not rerun or silently imported as broader theorems. Defect rank, +telescoping, generic-point separation, the sign quotient and Sylvester's +inequality are standard tools. The contribution here is their complete +source-bound tariff argument, including clean input columns and the +explicit field-uniformity premise, together with reproducible controls. + +## Interface leads and limits + +Hanson Sun's [PR1522](https://github.com/CrocSwap/integer-mult-bounds/pull/1522), +building on Ross Richardson's PR953 and Wentao Li's PR840, already gives +restored source tours for distinct additive outputs. These do not supply +the missing action on two independent dirty helper inputs. The tagged +joint-child proposal in [PR1764](https://github.com/CrocSwap/integer-mult-bounds/pull/1764) +was read through its cached metadata/body as an interface lead; its source +implementation was not replayed or used as proof of an admitted BIT tariff. +Our product-carrier and tagged-bank discussion is explicitly conditional. + +The entry overlap scan at 2026-10-19T21:06:25.817477Z covered797 open PRs +and2627 Discussion records with complete pagination and no warnings. It +searched public titles/bodies and local package notes, not every code diff +or all closed PRs; it is not a novelty certificate. The three coordination +hubs and relevant nearby package statements were read. Local standalone +scope and review records preserve the full scan and exact source reads. + +The selected record and its inherited supplier assumptions remain unchanged. +No global BIT lower bound, native supplier admission, outer recurrence +improvement, human certification or new kappa is claimed. Ross Richardson, +with substantial OpenAI Codex assistance and separate AI review. Apache-2.0. diff --git a/research/bit-joint-dirty-pair/SOURCES.json b/research/bit-joint-dirty-pair/SOURCES.json new file mode 100644 index 0000000000..902d9ac98f --- /dev/null +++ b/research/bit-joint-dirty-pair/SOURCES.json @@ -0,0 +1,19 @@ +{ + "schema_version": 1, + "base_commit": "bb4bccbf42844d2801487450727c2f63e10d1d0f", + "files": [ + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "67f085acd86acd7d4e03922d9cf4b26bca66fed5", + "sha256": "47b42433f5a85809a3aadd29c2c339da2c6ed728e4f7762df6b88bccb7874cf0" + }, + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ], + "bundled_input_provenance": "INPUT-SOURCES.json authenticates copies from public PR4068 head5a34918402ae2c0c683d8820ad832970e77f6382; inputs/PREDECESSOR-PINS.json preserves older lineage. Replay needs no predecessor checkout." +} diff --git a/research/bit-joint-dirty-pair/TASK.json b/research/bit-joint-dirty-pair/TASK.json new file mode 100644 index 0000000000..612645089e --- /dev/null +++ b/research/bit-joint-dirty-pair/TASK.json @@ -0,0 +1,68 @@ +{ + "schema_version": 1, + "task_id": "bit-new-register-model", + "base_commit": "bb4bccbf42844d2801487450727c2f63e10d1d0f", + "original_card": { + "id": "bit-new-register-model", + "question": "Can an explicitly larger or nonabelian register model escape the scoped three-register obstruction?", + "starting_points": [ + "docs/research/research-family-status.md", + "research/bit-three-register-lower-bound/README.md", + "certificates/selected-result.json", + "research/bit-gl3-mixed-targets-length10/README.md", + "docs/research/community-efficient1000-review.md" + ], + "methods": [ + "Construct the smallest exact identity in a newly specified legal operation alphabet.", + "Derive a target-specific relaxation bound for that same explicit alphabet." + ], + "acceptance_gate": "Name the changed hypothesis, all counted roles and a uniform identity; finite column tests alone do not certify it. A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read Model section 1 of the three-register bound and identify the exact excluded free operations.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "First compare the alphabet, role count and length with the fully replayed #1974 census and #2027 mixed-root tariff. Identify a changed premise and a legal native implementation; then price one smallest completed instance before searching larger words.", + "bottleneck_link": "A small-width completed saving changes the bit primitive; a finite-address identity alone is insufficient.", + "allowed_variations": [ + "Choose a fixed larger register count or a specified nonabelian operation family." + ], + "scope_change_triggers": [ + "Remaining inside the already-excluded three-register abelian model.", + "Repeating the two-register GL3 census or a covered three-register length without changing a hypothesis; a formal group-algebra word without native conversion is a partial result." + ], + "overlap_terms": [ + "three-register", + "nonabelian", + "group algebra" + ] + }, + "scope_status": "changed", + "actual_scope": "Decide the local recursive-query cost of jointly processing the two independently dirty rank-two helper inputs from PR4068, allowing arbitrary free scalar mixing and finite restored dirty or clean ancillas, in a fixed uniform rational unary-query model.", + "scope_change_reason": "User-assigned follow-up to the source-only screen. This is an actual-pair theorem with an explicit uniform-prime and full-state rejoin contract, not the entire catalogue question.", + "bottleneck_link": "The shared-source four-ADD saving has zero query delta. A local joint rewrite would need to beat the two rank-two calls to improve the recursive query profile.", + "stop_rule": "Close the fixed local mechanism if even a relaxation granting free scalar mixing and clean/dirty workspace has the original tariff as a sharp lower bound; do not declare a global supplier obstruction.", + "evidence": "PROOF.md; RESULT.json; REVIEW.md; README.md", + "author": "Ross Richardson", + "ai_assistance": "Substantial OpenAI Codex mathematics, implementation and writing, with separate AI constructive, source and proof checks; no independent human or proof-kernel review.", + "outcome": "negative-result", + "open_questions": [ + { + "question": "Can a larger joint helper/consumer rewrite eliminate one transformed independent demand without repaying its query cost?", + "why_it_matters": "The sharp local floor requires full state equality before the same suffix; changing future compensation changes that contract.", + "first_step": "Pin the earliest changed consumer, specify every borrowed row and compare the full resulting input/output map and complete query histogram.", + "blocked_by": "No changed downstream word or paid restoration schedule has been constructed here." + }, + { + "question": "Can a two-bank controlled query be implemented at a genuinely subadditive total tariff?", + "why_it_matters": "Calling a tagged direct sum one query does not establish its recursive cost.", + "first_step": "Specify the physical bank layout, permitted tag alphabet, address adapters, recursive child and complete packing/unpacking bill; compare with 2 Phi_m(2).", + "blocked_by": "The joint primitive and its price are hypotheses, not supplied mechanisms; any extra ordinary paid query consumes the optimistic rank-four margin." + } + ] +} diff --git a/research/bit-joint-dirty-pair/VERIFY.json b/research/bit-joint-dirty-pair/VERIFY.json new file mode 100644 index 0000000000..0243b1d861 --- /dev/null +++ b/research/bit-joint-dirty-pair/VERIFY.json @@ -0,0 +1,33 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/bit-joint-dirty-pair/inputs/WORD.json.gz", + "research/bit-joint-dirty-pair/inputs/GEOMETRY.json.gz" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 60, + "checks": "Focused source binding, complete source-prefix columns, local retiming and finite defect/Sylvester/uniformity controls; full receipts and file hashes. Written proof is not kernel-checked." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 60, + "checks": "The same coverage with assertions disabled; canonical JSON receipts must still match, including Boolean types." + } + ] +} diff --git a/research/bit-joint-dirty-pair/check.py b/research/bit-joint-dirty-pair/check.py new file mode 100644 index 0000000000..664423dad4 --- /dev/null +++ b/research/bit-joint-dirty-pair/check.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +"""Finite controls for the written joint-dirty query bound; not a proof kernel. + +Apache-2.0. Ross Richardson, with substantial OpenAI Codex assistance. +Only Python's standard library is used; normal execution writes no files. +""" +from fractions import Fraction +from itertools import permutations, product +import json + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def binary_rank(rows): + pivots = {} + for row in rows: + while row: + pivot = row.bit_length() - 1 + if pivot in pivots: + row ^= pivots[pivot] + else: + pivots[pivot] = row + break + return len(pivots) + + +def multiply(a, b): + """Rows of a encode coefficients selecting whole rows of b.""" + out = [] + for row in a: + value = 0 + for j, selected in enumerate(b): + if row >> j & 1: + value ^= selected + out.append(value) + return tuple(out) + + +def defect_controls(): + results = [] + for prime, half_dimension in ((3, 1), (3, 2), (3, 3), (5, 2)): + dimension = 2 * half_dimension + addresses = list(product(range(prime), repeat=dimension)) + index = {v: i for i, v in enumerate(addresses)} + size = len(addresses) + for rank in range(half_dimension + 1): + action = [] + for point in addresses: + moved = list(point) + for i in range(rank): + moved[i], moved[half_dimension+i] = moved[half_dimension+i], moved[i] + action.append(index[tuple(moved)]) + require(all(action[action[i]] == i for i in range(size)), 'involution') + fixed = sum(i == j for i, j in enumerate(action)) + # The independently eliminated Boolean matrix is I + permutation. + measured = binary_rank((1 << i) ^ (1 << j) for i, j in enumerate(action)) + predicted_fixed = prime ** (dimension-rank) + predicted_defect = (size-predicted_fixed)//2 + require(fixed == predicted_fixed and measured == predicted_defect, + 'actual permutation defect formula') + results.append({'prime': prime, 'address_dimension': dimension, + 'query_rank': rank, 'fixed_addresses': fixed, + 'boolean_defect_rank': measured}) + # With one rank-one query and any second rank, the upper bound remains + # strictly below the two-rank-two target. The written proof covers all q>2. + gaps = {str(q): str(Fraction(q-2, 2*q*q)) for q in (3, 5, 7, 11)} + require(all(Fraction(v) > 0 for v in gaps.values()), 'strict two-call gap') + require(Fraction(2-2, 2*2*2) == 0, 'characteristic-two boundary control') + return {'actual_permutation_cases': results, + 'normalized_target_minus_relaxed_rank1_plus_any_rank': gaps, + 'even_address_characteristic_does_not_have_strict_gap': True} + + +def sylvester_controls(): + # All U in M_3(F2) and VJ in M_(3,2)(F2). This finite check corroborates + # the written all-dimension inequality; it does not supply its quantifier. + cases = 0 + both_ranks_at_least_two = 0 + zero_products = 0 + for u in product(range(8), repeat=3): + rank_u = binary_rank(u) + for v in product(range(4), repeat=3): + cases += 1 + rank_v = binary_rank(v) + rank_uv = binary_rank(multiply(u, v)) + require(rank_uv >= rank_u+rank_v-3, 'Sylvester inequality') + if rank_u >= 2 and rank_v >= 2: + both_ranks_at_least_two += 1 + zero_products += rank_uv == 0 + require(cases == 32768 and zero_products == 0, 'three-column obstruction') + # Four odd calls are allowed by this quotient: two duplicate columns/rows + # give UV=0 with both ranks two. The invariant must not reject this case. + u4 = (0b0101, 0b1010) + v4 = (0b01, 0b10, 0b01, 0b10) + require(binary_rank(u4) == binary_rank(v4) == 2 and multiply(u4, v4) == (0, 0), + 'four-column boundary positive control') + # A single required target direction does not force both ranks to be two. + u2, v2 = (0b11,), (1, 1) + require(binary_rank(u2) == binary_rank(v2) == 1 and multiply(u2, v2) == (0,), + 'one-output boundary positive control') + return {'complete_matrix_pairs': cases, + 'pairs_with_both_ranks_at_least_two': both_ranks_at_least_two, + 'zero_products_in_that_class': zero_products, + 'four_columns_allow_zero_product_with_two_directions': True, + 'one_direction_allows_two_columns': True} + + +def representation_controls(): + # A concrete reason a single finite address field cannot simply be called + # a faithful group-algebra model. S4 permutes four coordinates over F3. + # Every point has a repeated coordinate; its stabilizer has even order. + # Thus the sum of all 24 formal group elements is a nonzero formal vector + # whose Boolean permutation operator vanishes on all 81 addresses. + group = list(permutations(range(4))) + zero_columns = 0 + for point in product(range(3), repeat=4): + odd_images = set() + for permutation in group: + image = tuple(point[i] for i in permutation) + if image in odd_images: + odd_images.remove(image) + else: + odd_images.add(image) + zero_columns += not odd_images + require(len(group) == 24 and zero_columns == 81, 'fixed-field algebra kernel') + generic = (0, 1, 2, 3) + images = {tuple(generic[i] for i in permutation) for permutation in group} + require(len(images) == 24, 'generic point separates all labels over F5') + return {'formal_support_size': 24, 'F3_addresses_with_zero_operator_column': zero_columns, + 'F5_generic_point': list(generic), 'distinct_images_at_F5_point': len(images), + 'scope': 'S4 coordinate-permutation example; not a counterexample to the uniform-prime bridge'} + + +def main(): + result = {'status': 'PASS_FINITE_JOINT_QUERY_CONTROLS', + 'defect_rank': defect_controls(), + 'odd_call_rank_obstruction': sylvester_controls(), + 'uniformity_control': representation_controls(), + 'written_tariff_reduction': { + 'x': '2^(1-b), with 1 <= x <= 2 for 0 <= b <= 1', + 'zero_or_one_queries': 'impossible by actual-action defect rank', + 'two_queries': 'each rank >= 2; cost >= 2*x', + 'three_queries': 'not all rank one; cost >= 2+x >= 2*x', + 'four_or_more_queries': 'cost >= 4 >= 2*x', + 'attainment': 'the original separate rank-two queries'}, + 'no_new_kappa': True, + 'limits': ['finite controls do not prove the all-parameter theorem', + 'the uniform-prime bridge is a written proof', + 'no changed consumer or native execution is verified']} + print(json.dumps(result, sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/research/bit-joint-dirty-pair/inputs/GEOMETRY.json.gz b/research/bit-joint-dirty-pair/inputs/GEOMETRY.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8 GIT binary patch literal 42305 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%0D#o{m4v0S^lXMc!B^5s|rQj}G= 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 literal 0 HcmV?d00001 diff --git a/research/bit-joint-dirty-pair/inputs/PREDECESSOR-PINS.json b/research/bit-joint-dirty-pair/inputs/PREDECESSOR-PINS.json new file mode 100644 index 0000000000..c593121ce2 --- /dev/null +++ b/research/bit-joint-dirty-pair/inputs/PREDECESSOR-PINS.json @@ -0,0 +1,19 @@ +{ + "schema_version": 1, + "source_commit": "8eefab699338b93400ca72ab22c6cf64352f7e05", + "original_package_commit": "b628ba738802587a38e61affaa01fd188d0644f9", + "scientific_base": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "source_path": "research/bit-partial-demand-closure/inputs/partial-progress/boundary/inputs/", + "files": [ + { + "path": "inputs/WORD.json.gz", + "sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + { + "path": "inputs/GEOMETRY.json.gz", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + } + ], + "word_canonical_sha256": "3bca74a2a8427eb18e86566baa19de597f10d0bc40c30b7443febd499ee2189a", + "scope": "Two literal query records and their exact native projectors only; no full supplier replay." +} diff --git a/research/bit-joint-dirty-pair/inputs/WORD.json.gz b/research/bit-joint-dirty-pair/inputs/WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..aa9ec3c341ad87d7513b9ea6934d5253035b8d30 GIT binary patch literal 105171 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 H`HlYziN5}> literal 0 HcmV?d00001 diff --git a/research/bit-joint-dirty-pair/source_check.py b/research/bit-joint-dirty-pair/source_check.py new file mode 100644 index 0000000000..bf569a6bbb --- /dev/null +++ b/research/bit-joint-dirty-pair/source_check.py @@ -0,0 +1,329 @@ +#!/usr/bin/env python3 +"""Focused exact binding of the PR4068 common-cut query pair. + +Apache-2.0; substantial OpenAI Codex assistance. No producer imports. +Default execution writes deterministic JSON only to stdout. +""" +from fractions import Fraction as F +from functools import lru_cache +from hashlib import sha256 +from pathlib import Path +import gzip +import json + +ROOT = Path(__file__).resolve().parent +HEAD = '5a34918402ae2c0c683d8820ad832970e77f6382' +CANONICAL_WORD = '3bca74a2a8427eb18e86566baa19de597f10d0bc40c30b7443febd499ee2189a' +PINS = { + 'inputs/WORD.json.gz': 'c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c', + 'inputs/GEOMETRY.json.gz': 'a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022', + 'inputs/PREDECESSOR-PINS.json': '4d03736c497eae94c4e98d33ac10ecacba9e914f9d604787237ff71075dc4e94', +} +N, CUT, END = 660, 23339, 23426 +QUERY_RECORDS = {23405: [0, 413, 509, 390, 2, 0], + 23424: [0, 444, 509, 392, 2, 0]} + + +def require(ok, why): + if not ok: + raise ValueError(why) + + +def identity_rows(): + return [{i: 1} for i in range(N)]+[{}] + + +def add(a, b, coefficient): + out = a.copy() + for j, v in b.items(): + out[j] = out.get(j, 0)+coefficient*v + if not out[j]: + del out[j] + return out + + +def replay(records, values, frames, inverse=False): + values, frames = [x.copy() for x in values], frames[:] + opened = None + copies = 0 + ordered = list(reversed(records)) if inverse else records + for op, d, s, c, f, section in ordered: + if op == 0: + before, after = (c, s) if inverse else (s, c) + require(frames[d] == before, 'MOVE entrance frame') + frames[d] = after + elif op == 1: + require(d != s and d < N and 0 <= s <= N, 'ordinary ADD operands') + require(frames[d] == frames[s] == f, 'ADD common frame') + require(d != opened, 'COPY source immutability') + values[d] = add(values[d], values[s], -c if inverse else c) + elif op == (3 if inverse else 2): + require(s == N and opened is None and not values[N], 'COPY zero slot') + require(frames[d] == c and frames[N] is None, 'COPY frame') + opened, values[N], frames[N] = d, values[d].copy(), f + copies += 1 + else: + require(op == (2 if inverse else 3), 'known opcode') + require(s == N and opened == d and frames[d] == c and frames[N] == f, + 'ERASE matching source') + require(values[N] == values[d], 'ERASE equality') + opened, values[N], frames[N] = None, {}, None + require(opened is None, 'no live private copy at selected endpoint') + return values, frames, copies + + +def multiply(a, b): + return tuple(tuple(sum(x*y for x, y in zip(row, col)) for col in zip(*b)) + for row in a) + + +def subtract(a, b): + return tuple(tuple(x-y for x, y in zip(row, other)) for row, other in zip(a, b)) + + +def eye(n): + return tuple(tuple(F(i == j) for j in range(n)) for i in range(n)) + + +def matrix_rank(a): + a = [list(row) for row in a] + rank = 0 + for j in range(len(a[0])): + pivot = next((i for i in range(rank, len(a)) if a[i][j]), None) + if pivot is None: + continue + a[rank], a[pivot] = a[pivot], a[rank] + value = a[rank][j] + a[rank] = [x/value for x in a[rank]] + for i in range(rank+1, len(a)): + value = a[i][j] + a[i] = [x-value*y for x, y in zip(a[i], a[rank])] + rank += 1 + if rank == len(a): + break + return rank + + +def determinant(a): + a = [list(row) for row in a] + result = F(1) + for j in range(len(a)): + pivot = next((i for i in range(j, len(a)) if a[i][j]), None) + if pivot is None: + return F(0) + if pivot != j: + result = -result + a[j], a[pivot] = a[pivot], a[j] + value = a[j][j] + result *= value + a[j] = [x/value for x in a[j]] + for i in range(j+1, len(a)): + value = a[i][j] + a[i] = [x-value*y for x, y in zip(a[i], a[j])] + return result + + +def projector(raw, f): + basis = [] + for label in raw['frames'][f]: + v = list(map(F, raw['lines'][label])) + for u in basis: + coefficient = sum(x*y for x, y in zip(v, u))/sum(x*x for x in u) + v = [x-coefficient*y for x, y in zip(v, u)] + if any(v): + basis.append(v) + if len(basis) == 8: + break + out = tuple(tuple(sum((u[i]*u[j]/sum(x*x for x in u) + for u in basis), F(0)) for j in range(8)) + for i in range(8)) + require(multiply(out, out) == out and tuple(zip(*out)) == out, + 'orthogonal frame projector') + return out + + +def swap(p): + q = subtract(eye(8), p) + return tuple(q[i]+p[i] for i in range(8))+tuple(p[i]+q[i] for i in range(8)) + + +def same_frame_pair(record): + return record[1] in (413, 444) or (record[0] == 1 and record[2] in (413, 444)) + + +def row_digest(rows): + canonical = [[[j, row[j]] for j in sorted(row)] for row in rows] + return sha256(json.dumps(canonical, separators=(',', ':')).encode()).hexdigest() + + +def rejected(call, expected_reason=None): + try: + call() + except ValueError as exc: + return expected_reason is None or str(exc) == expected_reason + return False + + +def check_source(): + sources = json.loads((ROOT/'INPUT-SOURCES.json').read_text()) + require(sources['predecessor_head'] == HEAD, 'predecessor head') + manifest_files = {entry['path']: entry for entry in sources['files']} + blobs = {} + for path, digest in PINS.items(): + blobs[path] = (ROOT/path).read_bytes() + require(sha256(blobs[path]).hexdigest() == digest, 'immutable source '+path) + entry = manifest_files[path] + require(entry['sha256'] == digest and entry['source_commit'] == HEAD, + 'manifest source binding '+path) + pins = json.loads(blobs['inputs/PREDECESSOR-PINS.json']) + word_bytes = gzip.decompress(blobs['inputs/WORD.json.gz']) + require(sha256(word_bytes).hexdigest() == CANONICAL_WORD == pins['word_canonical_sha256'], + 'canonical word binding') + word = json.loads(word_bytes) + raw = json.loads(gzip.decompress(blobs['inputs/GEOMETRY.json.gz'])) + require(len(word['start']) == len(word['final']) == N and raw['h'] == 8, + 'source dimensions') + records = word['records'] + for i, record in QUERY_RECORDS.items(): + require(records[i] == record, 'actual query record '+str(i)) + require(records[23325] == [1, 444, 17, 1, 509, 2] and + records[23333] == [1, 413, 17, 1, 509, 2], 'actual common source reads') + + start_frames = word['start']+[None] + rows, frames, copies = replay(records[:CUT], identity_rows(), start_frames) + require(copies == 0 and rows[N] == {} and frames[N] is None, + 'private slot inactive at cut') + restored, old_frames, back_copies = replay(records[:CUT], rows, frames, inverse=True) + require(restored == identity_rows() and old_frames == start_frames and back_copies == 0, + 'all 660 cut rows unrestricted by exact inverse prefix') + expected_rows = { + 17: {17: 1}, + 413: {413: 1, 469: -1, 605: -1, 87: 1, 17: 1, 22: 1, + 33: 1, 60: 1, 67: 1, 92: 1}, + 444: {444: 1, 369: -1, 77: 1, 17: 1, 22: 1, 33: 1, + 60: 1, 87: 1, 38: 1, 92: 1}, + } + require(all(rows[h] == v and frames[h] == 509 for h, v in expected_rows.items()), + 'full shared source payload rows') + dirty_pivot = [[rows[h].get(j, 0) for j in (413, 444)] for h in (413, 444)] + require(dirty_pivot == [[1, 0], [0, 1]], 'independent dirty pivot') + require(all(word['start'][h] == 0 and word['final'][h] == 1 for h in (413, 444)), + 'selected helpers ZERO to FULL') + require(not any(same_frame_pair(r) for r in records[CUT:23405]), 'common quiet window') + require(not any(r[1] == 444 or (r[0] == 1 and r[2] == 444) for r in records[CUT:23424]), + 'second target has no earlier touch') + require(not any(r[0] in (0, 1) and r[1] == 17 for r in records[CUT:24523]), + 'source17 unchanged through window') + + old_local = records[CUT:END] + new_local = [records[23405], records[23424]]+[ + r for i, r in enumerate(old_local, CUT) if i not in QUERY_RECORDS] + old_end, old_end_frames, _ = replay(old_local, rows, frames) + new_end, new_end_frames, _ = replay(new_local, rows, frames) + require(old_end == new_end and old_end_frames == new_end_frames, + 'retiming preserves every relevant column and frame') + back, back_frames, _ = replay(new_local, new_end, new_end_frames, inverse=True) + require(back == rows and back_frames == frames, 'retimed local literal inverse') + + @lru_cache(None) + def p(f): + return projector(raw, f) + common = p(509) + P, Q = subtract(p(390), common), subtract(p(392), common) + zero8 = tuple((F(0),)*8 for _ in range(8)) + for delta in (P, Q): + require(multiply(delta, delta) == delta and tuple(zip(*delta)) == delta, + 'orthogonal query increment') + require(matrix_rank(delta) == 2 and multiply(delta, common) == zero8, + 'rank2 and nested query increment') + require(all(x.denominator & (x.denominator-1) == 0 for row in delta for x in row), + 'dyadic increment') + comm = subtract(multiply(P, Q), multiply(Q, P)) + require(comm[0][1] == F(1, 8), 'distinct noncommuting address labels') + require(sum(comm[i][j]*comm[j][i] for i in range(8) for j in range(8)) == -1, + 'no common characteristic-zero flag') + concat = tuple(P[i]+Q[i] for i in range(8)) + require(matrix_rank(concat) == 4, 'address span dimension4') + minor_rows, minor_cols = [0, 1, 2, 4], [0, 1, 8, 9] + minor = tuple(tuple(concat[i][j] for j in minor_cols) for i in minor_rows) + require(determinant(minor) == F(1, 256), 'dyadic address span minor') + S, T = swap(P), swap(Q) + require(multiply(S, S) == eye(16) and multiply(T, T) == eye(16), 'query involutions') + sdisp, tdisp = subtract(S, eye(16)), subtract(T, eye(16)) + require(matrix_rank(tuple(sdisp[i]+tdisp[i] for i in range(16))) == 4, + 'address displacement span dimension4') + require(subtract(multiply(S, T), multiply(T, S))[0][1] == F(1, 4), + 'address action noncommutation') + + first_copy_index = next(i for i in range(CUT, len(records)) if records[i][0] == 2) + first_copy = records[first_copy_index] + copy_frames = [None]*(N+1) + copy_frames[first_copy[1]] = first_copy[3] + dirty_zero_port = identity_rows() + dirty_zero_port[N] = {N: 1} + zero_port_rejected = rejected( + lambda: replay([first_copy], dirty_zero_port, copy_frames), 'COPY zero slot') + matching_erase = [3]+first_copy[1:] + clean_copy_rows, clean_copy_frames, clean_copy_count = replay( + [first_copy, matching_erase], identity_rows(), copy_frames) + clean_copy_accepted = (clean_copy_rows == identity_rows() and + clean_copy_frames == copy_frames and clean_copy_count == 1) + missing_query = [r for i, r in enumerate(old_local, CUT) if i != 23424] + controls = { + 'dirty_private_port_rejected_by_original_COPY': zero_port_rejected, + 'clean_private_COPY_ERASE_control_accepted': clean_copy_accepted, + 'Q_replaced_by_P_fails_noncommutation': + subtract(multiply(P, P), multiply(P, P))[0][1] != F(1, 8), + 'Q_replaced_by_P_collapses_concat_rank': matrix_rank(tuple(row+row for row in P)) == 2, + 'omitted_second_query_fails_frame_contract': rejected(lambda: replay(missing_query, rows, frames)), + } + bad_rows = [r.copy() for r in rows] + bad_rows[444].pop(444) + bad_pivot = [[F(bad_rows[h].get(j, 0)) for j in (413, 444)] for h in (413, 444)] + controls['discarding_independent_dirty_input_loses_rank'] = matrix_rank(bad_pivot) == 1 + require(all(controls.values()), 'all semantic defect controls detected') + + def strings(a): + return [[str(x) for x in row] for row in a] + return { + 'status': 'PASS_ACTUAL_JOINT_DIRTY_SOURCE_BINDING', + 'predecessor_head': HEAD, 'word_canonical_sha256': CANONICAL_WORD, + 'source_hashes': PINS, 'record_indexing': 'zero based original WORD', + 'entrance_cut': CUT, 'query_records': QUERY_RECORDS, + 'ordinary_independent_input_columns': N, + 'prefix_columns_sha256': row_digest(rows), + 'prefix_inverse_returns_all_660_columns': True, + 'selected_rows': expected_rows, 'independent_dirty_pivot': dirty_pivot, + 'selected_common_frame': 509, + 'private_port': {'index': N, 'value': 'zero', 'frame': None, + 'prior_COPY_count': copies, 'first_future_COPY_record': first_copy_index, + 'contract': 'inactive private zero, not a free active arbitrary-dirty role'}, + 'quiet_window_half_open': [CUT, 23405], + 'source17_unchanged_until_before': 24523, + 'retimed_window_half_open': [CUT, END], + 'retimed_all_columns_and_frames_equal': True, + 'retimed_local_inverse_checked': True, + 'retimed_end_columns_sha256': row_digest(new_end), + 'query_rank_profile': {'2': 2}, + 'projectors': {'common_frame': strings(common), 'P': strings(P), 'Q': strings(Q)}, + 'commutator_0_1': '1/8', 'address_swap_commutator_0_1': '1/4', + 'trace_commutator_squared': '-1', + 'geometric_concat_rank_over_Q': 4, + 'address_displacement_concat_rank_over_Q': 4, + 'geometric_minor': {'rows': minor_rows, 'columns': minor_cols, 'determinant': '1/256'}, + 'negative_controls': controls, + 'limits': ['prefix and local retiming only; no repeated full-word metric audit', + 'address geometry over Q is not a representation of payload F2[G]', + 'formal common-cut diagonal endpoint requires its own algebra theorem', + 'no changed-tail or source-compensation lower bound', + 'no native physical execution, recursive moment improvement or new kappa'], + 'no_new_kappa': True, + } + + +def main(): + print(json.dumps(check_source(), indent=2, sort_keys=True)) + + +if __name__ == '__main__': + main() diff --git a/research/bit-joint-dirty-pair/verify.py b/research/bit-joint-dirty-pair/verify.py new file mode 100644 index 0000000000..cb36494d2e --- /dev/null +++ b/research/bit-joint-dirty-pair/verify.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +"""Replay the source-bound finite evidence; the written proof is not kernel checked.""" +from hashlib import sha256 +from pathlib import Path +import json +import subprocess +import sys + +ROOT = Path(__file__).resolve().parent +BOOTSTRAP = """from hashlib import sha256 +from pathlib import Path +import sys +p = Path(sys.argv[1]).resolve() +b = p.read_bytes() +if sha256(b).hexdigest() != sys.argv[2]: + raise ValueError('executed checker hash ' + p.name) +exec(compile(b, str(p), 'exec'), {'__name__': '__main__', '__file__': str(p)}) +""" + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + # String comparison preserves distinctions such as true versus 1. + return json.dumps(value, sort_keys=True, separators=(',', ':'), allow_nan=False) + + +def main(): + manifest_bytes = (ROOT/'MANIFEST.json').read_bytes() + manifest = json.loads(manifest_bytes) + expected_names = set(manifest['files']) + observed_names = {str(p.relative_to(ROOT)) for p in ROOT.rglob('*') if p.is_file()} + require(observed_names == expected_names | {'MANIFEST.json'}, 'complete package file inventory') + authenticated = {} + for name, digest in manifest['files'].items(): + path = ROOT/name + authenticated[name] = path.read_bytes() + require(not path.is_symlink() and sha256(authenticated[name]).hexdigest() == digest, + 'package hash '+name) + flags = ['-I', '-B'] + (['-O'] if sys.flags.optimize else []) + receipts = {} + for key, filename in (('source', 'source_check.py'), ('finite_controls', 'check.py')): + replay = subprocess.run([sys.executable, *flags, '-c', BOOTSTRAP, + str(ROOT/filename), manifest['files'][filename]], + check=True, capture_output=True, text=True, timeout=45) + require(not replay.stderr, 'unexpected checker stderr '+filename) + receipts[key] = json.loads(replay.stdout) + expected = json.loads(authenticated['RESULT.json']) + require(canonical(receipts) == canonical(expected), 'full semantic receipts') + require(receipts['source']['no_new_kappa'] is True and + receipts['finite_controls']['no_new_kappa'] is True, 'scope markers') + for name, original in authenticated.items(): + require((ROOT/name).read_bytes() == original, 'package changed during replay '+name) + require(observed_names == {str(p.relative_to(ROOT)) for p in ROOT.rglob('*') if p.is_file()}, + 'package inventory changed during replay') + require((ROOT/'MANIFEST.json').read_bytes() == manifest_bytes, 'manifest changed during replay') + print('PASS_JOINT_DIRTY_PAIR source_columns=660 sylvester_pairs=32768 ' + 'optimum=2Phi_m(2) uniform_unary_full_endpoint no_new_kappa') + + +if __name__ == '__main__': + main()