From 527c80c4e20d699abf6c089d825bb9be01288f94 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 19 Oct 2026 20:06:58 +1100 Subject: [PATCH] Implement dirty-scratch lattice lifting for staged544 rank-five residual --- .../.gitattributes | 4 + .../.gitignore | 2 + .../CREDITS.md | 37 + .../FROZEN-SOURCES.json | 106 + .../LEDGER.json | 38 + .../MACRO.json | 102 + .../PROOF.md | 197 + .../README.md | 84 + .../RESULT.json | 164 + .../SOURCES.json | 26 + .../TASK.json | 89 + .../VALIDATION.json | 61 + .../VERIFY.json | 28 + .../bits.py | 65 + .../circuit.py | 63 + .../frozen/NOTICE-PR3945.md | 20 + .../frozen/RECIPES.json | 4236 +++++++++++++++++ .../frozen/SOURCE-CREDITS.md | 14 + .../frozen/WORD-base.json.gz | Bin 0 -> 74428 bytes .../frozen/WORD-extra.json.gz | Bin 0 -> 74425 bytes .../frozen/bw_adapters.py | 165 + .../frozen/bw_transport.py | 416 ++ .../frozen/clifford_exact.py | 149 + .../frozen/exact_phase.py | 154 + .../lattice.py | 94 + .../verify.py | 135 + 26 files changed, 6449 insertions(+) create mode 100644 research/staged544-reversible-lattice-macro/.gitattributes create mode 100644 research/staged544-reversible-lattice-macro/.gitignore create mode 100644 research/staged544-reversible-lattice-macro/CREDITS.md create mode 100644 research/staged544-reversible-lattice-macro/FROZEN-SOURCES.json create mode 100644 research/staged544-reversible-lattice-macro/LEDGER.json create mode 100644 research/staged544-reversible-lattice-macro/MACRO.json create mode 100644 research/staged544-reversible-lattice-macro/PROOF.md create mode 100644 research/staged544-reversible-lattice-macro/README.md create mode 100644 research/staged544-reversible-lattice-macro/RESULT.json create mode 100644 research/staged544-reversible-lattice-macro/SOURCES.json create mode 100644 research/staged544-reversible-lattice-macro/TASK.json create mode 100644 research/staged544-reversible-lattice-macro/VALIDATION.json create mode 100644 research/staged544-reversible-lattice-macro/VERIFY.json create mode 100644 research/staged544-reversible-lattice-macro/bits.py create mode 100644 research/staged544-reversible-lattice-macro/circuit.py create mode 100644 research/staged544-reversible-lattice-macro/frozen/NOTICE-PR3945.md create mode 100644 research/staged544-reversible-lattice-macro/frozen/RECIPES.json create mode 100644 research/staged544-reversible-lattice-macro/frozen/SOURCE-CREDITS.md create mode 100644 research/staged544-reversible-lattice-macro/frozen/WORD-base.json.gz create mode 100644 research/staged544-reversible-lattice-macro/frozen/WORD-extra.json.gz create mode 100644 research/staged544-reversible-lattice-macro/frozen/bw_adapters.py create mode 100644 research/staged544-reversible-lattice-macro/frozen/bw_transport.py create mode 100644 research/staged544-reversible-lattice-macro/frozen/clifford_exact.py create mode 100644 research/staged544-reversible-lattice-macro/frozen/exact_phase.py create mode 100644 research/staged544-reversible-lattice-macro/lattice.py create mode 100644 research/staged544-reversible-lattice-macro/verify.py diff --git a/research/staged544-reversible-lattice-macro/.gitattributes b/research/staged544-reversible-lattice-macro/.gitattributes new file mode 100644 index 0000000000..394331b5c4 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/.gitattributes @@ -0,0 +1,4 @@ +*.py text eol=lf +*.md text eol=lf +*.json text eol=lf +frozen/** -text diff --git a/research/staged544-reversible-lattice-macro/.gitignore b/research/staged544-reversible-lattice-macro/.gitignore new file mode 100644 index 0000000000..7a60b85e14 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +*.pyc diff --git a/research/staged544-reversible-lattice-macro/CREDITS.md b/research/staged544-reversible-lattice-macro/CREDITS.md new file mode 100644 index 0000000000..b2e860939e --- /dev/null +++ b/research/staged544-reversible-lattice-macro/CREDITS.md @@ -0,0 +1,37 @@ +# Attribution and source boundaries + +The staged544 provider and helper 277 residual are Dugongue's PR3945, building +on dataisfire's PR3734 and the retained scalar, frame, native, owner and outer +lineage. No provider-construction credit is transferred by this implementation. +Jeremy Kothe's frame work, Sagar Thakrar, roger-sato and Arham Tahir's audit +contracts, DreamingOfClouds's residual adapters, chafreaky's PR458 wrappers, +and Cinna Davis's dirty-borrowing work remain credited. The complete preserved +predecessor lineage is in frozen/NOTICE-PR3945.md and frozen/SOURCE-CREDITS.md; +these copied files are authenticated byte-for-byte, not rewritten. + +The exact phase recipe and independent Gaussian oracle are reused from +Chris R / Clear1nsight's PR3987 at fc536202fdaa924158789a5ef59ac079bbe21922. +Fresh replay here covers its one helper 277 class. The complete-call allowance +is PR3994 at eb2ac25838a3d39ac8fd6acfa62b8b613c847629; its global theorem is +not claimed as newly derived or its full registry rerun by this package. + +Reversible lifting and modular accumulators are established mathematical ideas. +The borrowed-bit multiple-control decomposition and 4n-8 Toffoli cost are +credited to Adriano Barenco et al., *Elementary gates for quantum computation*, +arXiv:quant-ph/9503016, Lemma 7.2: +https://arxiv.org/pdf/quant-ph/9503016 . The implementation contains a +self-contained derivation and checks, and uses literal classical Toffolis, +not the paper's later relative-phase substitutions. No new general gate +decomposition theorem or first-use claim is made. + +The new contribution is the source-bound dirty half-sum accumulator, its +explicit application/bill/error contract for the actual residual, a fair +constructed clean comparison, and the actual-macro nonadditivity discriminator. +Chris R / Clear1nsight with substantial OpenAI Codex assistance. A coordinating +agent suggested the clean comparison and classical borrowed ladder; a separate +same-team graph agent independently implemented elementary-gate controls. +These AI reviews are neither independent human review nor proof-kernel checks. + +PR3881's exact-residue Gaussian recovery lane was read during overlap checking. +It uses a different numerical producer/consumer and is not a baseline or source +of this macro's constants. No exhaustive novelty claim is made. diff --git a/research/staged544-reversible-lattice-macro/FROZEN-SOURCES.json b/research/staged544-reversible-lattice-macro/FROZEN-SOURCES.json new file mode 100644 index 0000000000..2eb6a59f55 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/FROZEN-SOURCES.json @@ -0,0 +1,106 @@ +[ + { + "path": "frozen/WORD-base.json.gz", + "sha256": "08e6c96fbe3dfec96cb8451b3867ef8c1a214109ecd1e5af7fcc28e0f05728d0", + "source": { + "local_path": "frozen/WORD-base.json.gz", + "sha256": "08e6c96fbe3dfec96cb8451b3867ef8c1a214109ecd1e5af7fcc28e0f05728d0", + "origin_commit": "91f81d131252db704f945891da1ea54e29d46b8b", + "origin": "CrocSwap/integer-mult-bounds research/staged544-terminal-gap-fill; exact public frozen bytes, native receipts are author evidence only", + "origin_repository": "CrocSwap/integer-mult-bounds", + "origin_path": "research/staged544-terminal-gap-fill/inputs/NEW-base.json.gz", + "git_blob": "806784bf99d9d15004d2d227d06268556a0726c8" + } + }, + { + "path": "frozen/WORD-extra.json.gz", + "sha256": "d83c2ec9cecc0ad092d34ea4080b28a4fd7199579356b6d5a8fc6cd53ff93299", + "source": { + "local_path": "frozen/WORD-extra.json.gz", + "sha256": "d83c2ec9cecc0ad092d34ea4080b28a4fd7199579356b6d5a8fc6cd53ff93299", + "origin_commit": "91f81d131252db704f945891da1ea54e29d46b8b", + "origin": "CrocSwap/integer-mult-bounds research/staged544-terminal-gap-fill; exact public frozen bytes, native receipts are author evidence only", + "origin_repository": "CrocSwap/integer-mult-bounds", + "origin_path": "research/staged544-terminal-gap-fill/inputs/NEW-extra.json.gz", + "git_blob": "c531be7383ad3ba941600c7ced14e5e10d6d1c67" + } + }, + { + "path": "frozen/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "source": { + "local_path": "vendor/clifford_exact.py", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962", + "origin_commit": "91f81d131252db704f945891da1ea54e29d46b8b", + "origin": "native/vendor/native/new/code/borrow/vendor/clifford/clifford_exact.py", + "usage": "Only clifford_exact.py used in optional reference generation; independent verifier executes none of these sources", + "origin_repository": "CrocSwap/integer-mult-bounds", + "origin_path": "research/staged544-terminal-gap-fill/native/vendor/native/new/code/borrow/vendor/clifford/clifford_exact.py", + "git_blob": "166841a037f069249f6f7f6dedb89248812f59e2" + } + }, + { + "path": "frozen/bw_adapters.py", + "sha256": "c5907050a9a7fa36d4fcba3ad4fe440d1bec2063360c095013891785ba65c3ce", + "source": { + "local_path": "vendor/bw_adapters.py", + "sha256": "c5907050a9a7fa36d4fcba3ad4fe440d1bec2063360c095013891785ba65c3ce", + "origin_commit": "91f81d131252db704f945891da1ea54e29d46b8b", + "origin": "native/vendor/native/new/code/borrow/bw_adapters.py", + "usage": "Only clifford_exact.py used in optional reference generation; independent verifier executes none of these sources", + "origin_repository": "CrocSwap/integer-mult-bounds", + "origin_path": "research/staged544-terminal-gap-fill/native/vendor/native/new/code/borrow/bw_adapters.py", + "git_blob": "82beaa9c1d13bcd5f79d0a5e10e8a10733eac347" + } + }, + { + "path": "frozen/bw_transport.py", + "sha256": "9818e08b819310b40f1441b89be8c4369584a5b3fa5dfe9b86b1df9a7f5d6a76", + "source": { + "local_path": "vendor/bw_transport.py", + "sha256": "9818e08b819310b40f1441b89be8c4369584a5b3fa5dfe9b86b1df9a7f5d6a76", + "origin_commit": "91f81d131252db704f945891da1ea54e29d46b8b", + "origin": "native/vendor/native/new/code/borrow/bw_transport.py", + "usage": "Only clifford_exact.py used in optional reference generation; independent verifier executes none of these sources", + "origin_repository": "CrocSwap/integer-mult-bounds", + "origin_path": "research/staged544-terminal-gap-fill/native/vendor/native/new/code/borrow/bw_transport.py", + "git_blob": "08248542b18864c94a5ac050c8669f68519838e1" + } + }, + { + "path": "frozen/NOTICE-PR3945.md", + "sha256": "6881464d7731757b63275f056cb9ef8406db04e76c73093d3e5b418529a879cc", + "source": { + "repository": "Clear1nsight/integer-mult-bounds", + "head": "fc536202fdaa924158789a5ef59ac079bbe21922", + "path": "research/staged544-native-quadratic-audit/NOTICE-PR3945.md" + } + }, + { + "path": "frozen/SOURCE-CREDITS.md", + "sha256": "d4a13d8b8ed9cdb594f00efb3d1a336e09d934423330f02a1514308a720c278b", + "source": { + "repository": "Clear1nsight/integer-mult-bounds", + "head": "fc536202fdaa924158789a5ef59ac079bbe21922", + "path": "research/staged544-native-quadratic-audit/SOURCE-CREDITS.md" + } + }, + { + "path": "frozen/RECIPES.json", + "sha256": "64b85f6aef485026eebaec7acddb41999f57e074b0dfde8077b6543700cd684b", + "source": { + "repository": "Clear1nsight/integer-mult-bounds", + "head": "fc536202fdaa924158789a5ef59ac079bbe21922", + "path": "research/staged544-native-quadratic-audit/RECIPES.json" + } + }, + { + "path": "frozen/exact_phase.py", + "sha256": "e3d76b3373ff40a83a4b212b3fe1c0b431b3cfdc807da601d6e7f273c02c6d30", + "source": { + "repository": "Clear1nsight/integer-mult-bounds", + "head": "fc536202fdaa924158789a5ef59ac079bbe21922", + "path": "research/staged544-native-quadratic-audit/exact_phase.py" + } + } +] diff --git a/research/staged544-reversible-lattice-macro/LEDGER.json b/research/staged544-reversible-lattice-macro/LEDGER.json new file mode 100644 index 0000000000..178a24f11d --- /dev/null +++ b/research/staged544-reversible-lattice-macro/LEDGER.json @@ -0,0 +1,38 @@ +{ + "scope": "Actual PR3945 helper277 residual L C5 R, both providers, fixed mathematical map; f spectator lanes and b-bit real data", + "proved": { + "finite_permutation": "All data/scratch bit states; exact inverse and arbitrary dirty scratch return; temporary borrowed pair bits restored after each elementary gate", + "arithmetic_primitives_per_lane": { + "dirty_add_sub_conditional_decrement": 23040, + "constructed_clean_add_sub": 17920, + "real_swaps": 3792, + "real_negations": 2304 + }, + "scratch": "One b+1 bit word, arbitrary initial state restored; no clean ancilla. Data1024bf bits counted separately. Serially reuse scratch across1280f pairs.", + "elementary_gate_upper_bound": "(6b+4)(10240b^2+41584b+10240)f X/CNOT/Toffoli; exact split at b8,32,64 in RESULT.json", + "bounded_fanin_method": "Barenco et al. Lemma7.2 borrowed-bit decomposition, literal classical gates; temporary bits selected only outside current controls/target among pair and scratch", + "numerical_error": "80sqrt(f)Delta completed Hilbert error, conditional on no data wrap; scratch wrap allowed exactly", + "data_range": "Signed range8H is sufficient if Delta<=H/(128sqrt(f)); b=p+4 for Delta=H2^-p, H power of two", + "cut_allowance": "p>=beta+32+ceil(log2sqrt(f)) suffices for PR3994 absolute aggregate-cut allowance H2^(-beta-25)", + "negative_result": "Actual rounded rank5 macro has Q(2e0)-2Q(e0) nonzero at24 coordinates; standalone inverse does not establish whole-provider linear dirty-cleanup identities" + }, + "constructed_comparison": { + "baseline": "Explicit clean accumulator introduced here, not an authenticated predecessor implementation", + "improvement": "Removes requirement to initialize b+1 scratch bits to zero", + "additional_cost": "5120f real-word arithmetic primitives;1280(b^2+5b)f generalized gates. At b32, extra61683200f Toffolis plus X/CNOT delta.", + "no_claim": "No speedup, selected sigma, kappa or admitted recursive replacement" + }, + "inherited": { + "source_paid_object": "One rank5 recursive child, not a scalar primitive allowance", + "source_semantics": "Exact monomial/Clifford recipe and Gaussian dyadic semantics; PR3987 all-column oracle reused and freshly executed for this single class", + "global_word": "PR3994 ideal linear endpoint identities and full-cut error theorem, not rerun wholesale" + }, + "unknown_not_zero": { + "actual_caller_budget": "No authenticated conversion from one paid rank5 child into our serial scalar bit tariff", + "physical_time_space": "Native scheduling, owner stock/tape, parallelism and actual tensor multiplicity", + "borrowed_provider_restoration": "Whole-word nonlinear dirty compensation after interleaved arithmetic and exact recovery/disposal", + "uniform_selected_stock": "Selected m73 producer mapping, all-size recursion and selected sigma", + "hardware_noise": "Boolean permutation model has exact X/CNOT/Toffoli; stochastic hardware faults not modeled" + }, + "family_gate_decision": "Narrow: finite implementation closes a real module-level obligation and exposes precise nonadditivity/affordability stops. No further implementation expansion or new construction search justified without actual consumer budget." +} diff --git a/research/staged544-reversible-lattice-macro/MACRO.json b/research/staged544-reversible-lattice-macro/MACRO.json new file mode 100644 index 0000000000..33e97094fb --- /dev/null +++ b/research/staged544-reversible-lattice-macro/MACRO.json @@ -0,0 +1,102 @@ +{ + "kind": "residual", + "entrance": [], + "terminal": [ + 388, + 74, + 40, + 26, + 1 + ], + "recipe": { + "rank": 5, + "left": { + "matrix_rows": [ + 1, + 48, + 68, + 152, + 26, + 8, + 10, + 260, + 4 + ], + "offset": 0, + "quadratic_rows": [ + 0, + 18, + 0, + 8, + 2, + 0, + 0, + 0, + 0 + ], + "linear_Z4": [ + 2, + 3, + 2, + 3, + 2, + 0, + 0, + 0, + 0 + ], + "phase": 0 + }, + "right": { + "matrix_rows": [ + 1, + 80, + 388, + 8, + 58, + 82, + 260, + 120, + 384 + ], + "offset": 29, + "quadratic_rows": [ + 0, + 106, + 132, + 66, + 80, + 98, + 58, + 132, + 0 + ], + "linear_Z4": [ + 2, + 3, + 3, + 2, + 3, + 1, + 0, + 3, + 2 + ], + "phase": 0 + } + }, + "coverage": [ + { + "provider": "base", + "kind": "terminal", + "helper": 277, + "version": "new" + }, + { + "provider": "extra", + "kind": "terminal", + "helper": 277, + "version": "new" + } + ] +} diff --git a/research/staged544-reversible-lattice-macro/PROOF.md b/research/staged544-reversible-lattice-macro/PROOF.md new file mode 100644 index 0000000000..5a4e52b7d2 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/PROOF.md @@ -0,0 +1,197 @@ +# One actual rank-five residual on a finite lattice + +Chris R / Clear1nsight with substantial OpenAI Codex assistance. Apache-2.0. +This is a finite implementation and an admission discriminator, not a replacement +of the staged544 recursive provider or a new kappa. + +## Source and paid boundary + +PR3945 at `91f81d131252db704f945891da1ea54e29d46b8b` gives helper 277 +an empty entrance and terminal U=[388,74,40,26,1], in both providers. +`bw_adapters.py:S_of,main` constructs its residual T_U and lowers it to +L C_[5] R. The exact serialized L/R recipe is the corresponding PR3987 +descriptor at `fc536202fdaa924158789a5ef59ac079bbe21922`; frozen source and +recipe hashes are authenticated before tests. These definitions include all +global/relative phases. The source's charged object is a rank-five recursive +child, tensored with the other coordinates. Its exact compiler's `zero_state` +uses Gaussian integer numerators and a growing denominator; it is a semantic +evaluator, not a paid finite-precision implementation. + +We implement this actual 512-coordinate residual with spectator multiplicity f. +No scalar instruction, native mathematical map, selected frontier or recursive +paid profile is changed. The basis-size convention is 512f complex coordinates, +so there are 256f pairs at each of five layers, or 1280f pairs. A source caller +using f for a different tensor-factor exponent must convert that dimension; +there is no silent reuse of an incompatible f convention. + +## Reversible half-sum with one dirty word + +Data words have b bits, modulus M=2^b; scratch D has b+1 bits, modulus 2M. +Let a,c be signed b-bit integers and s=a+c or a-c. The following operations +are modular, with source sign-extension into the scratch word: + + D += a; D += (+/- c) + y += floor(unsigned(D)/2) + D -= (+/- c); D -= a + y -= floor(unsigned(D)/2) + y -= (D mod 2) * ((a mod 2) XOR (c mod 2)) + +The four scratch operations restore every possible initial D exactly. For +integers d,s, floor((d+s)/2)-floor(d/2) equals floor(s/2) plus the product +of their parities. Reducing d+s modulo 2M changes its half by a multiple of M, +which vanishes in y. Signed versus unsigned s has the same property. Thus this +implements y += floor(s/2) mod M independently of D. No low bit is discarded +from a data or scratch register; shifts are read-only source slices. The final +parity correction is essential: a=1,c=0,D=1 gives the wrong increment if it is +omitted. Reversing target updates implements the inverse accumulation. + +This costs seven real-word addition/subtraction/conditional-decrement +primitives per component. An explicitly constructed clean comparison starts +D=0 and omits the last two target corrections: five primitives. This comparison +is ours, not a claimed pre-existing physical implementation. Both compute the +same rounded map. The improvement is removal of the clean initialization +requirement for b+1 workspace bits, at a cost of two extra primitives per +half-sum. Scratch is dirty, not absent. + +## Literal bit realization and tariff + +The gate alphabet is NOT and generalized controlled-X with arbitrary positive +or negative controls. Source-controlled addition of 2^j flips target bits +k=b-1,...,j when source_j=1 and all target bits j,...,k-1 are one. +Descending order leaves the lower controls unchanged. Composing these increments +for each source bit is modular addition; reversing the gate list subtracts. +There are b(b+1)/2 gates, with no ancilla. Sign-extension into b+1 target bits +adds the sign bit at position b as well as its ordinary position; its cost is +b(b+3)/2+1 gates. A read-only right shift uses the existing scratch bits 1..b. + +The parity-controlled decrement splits into the two disjoint conjunctions +D0 & a0 & !c0 and D0 & !a0 & c0. For each conjunction, descending target-bit +flips controlled on lower zeros implement decrement. Cost:2b gates; the controls +are preserved source/scratch bits, so no predicate scratch is hidden. A real +word SWAP uses3b CNOTs. Negation uses b NOTs followed by b increment gates. +These conservative counts intentionally retain canceling gates. + +The dirty half-sum costs 3b²+9b+4 gates. Its clean counterpart costs +(5b²+13b+8)/2. These circuits are explicitly simulated against the modular +arithmetic specification on all small-bit states. They are finite Boolean +permutations with no clean ancilla. The next paragraphs supply bounded-fanin +counts; the supplier's recursive stock/tape admission remains separate. + +For n>=3 controls, the classical borrowed-bit construction of Barenco et al., +[Elementary gates for quantum computation, Lemma 7.2](https://arxiv.org/pdf/quant-ph/9503016), +implements controlled-X with 4n-8 literal Toffoli gates and n-2 arbitrary +borrowed bits restored. Here is a self-contained reconstruction. Set +A=Toffoli(a1,a2;d1). Let F compute the chain d2^=d1*a3,..., +d[n-2]^=d[n-3]*a[n-1], flip t by d[n-2]*an, then undo that chain. +For n=3, F is just Toffoli(d1,a3;t). The sequence F,A,F,A cancels all terms +involving the initial dirty bits; changing d1 by a1*a2 changes F's target +increment by the product of all controls. F has 2n-5 gates. Negative controls +are conjugated by X before and after. No relative-phase substitute is used. + +Every actual pair gate has at most b+2 controls and 5b+1 available data/scratch +bits. After excluding its controls and target, at least4b-2 bits remain, enough +for the at most b borrowed bits. They are selected within the existing pair +and scratch, returned after each gate; no additional clean or dirty workspace +is allocated. This requires transient access to those actual bits, explicitly +part of this implementation's interface. Each generalized gate costs at most +4b core elementary gates plus2(b+2) X gates, giving the bound below. +The executable emits literal X/CNOT/Toffoli gate lists, verifies the borrowed +ladder on every small state, and tests complete pair circuits with dirty data. + +## Reversible C pair and completed numerical error + +For C=((1+i)I+(1-i)X)/2, define t(d) by componentwise floor of (1-i)d/2. +On two complex words execute + + x -= y; y += t(x); x *= i; x += y. + +Each half of t uses the preceding accumulator with the same dirty scratch. +The exact inverse is x-=y; x*=-i; y-=t(x); x+=y. Both are permutations on +all b-bit data states, including overflowing states, and return arbitrary D. +Four ordinary real additions and two half-sums give18 word primitives plus +one quarterturn; the clean comparison uses14. With the bit circuit above the +pair costs 8b²+25b+8 gates dirty, versus 7b²+20b+8 clean. + +Numerical interpretation is separate from modular reversibility. Let grid +spacing be Delta. When data operations do not wrap, t(d)=(1-i)d/2+e where +each real component of e lies in [-Delta/2,0]. The exact C output is perturbed +by (e,e), whose two-complex-coordinate Hilbert norm is at most Delta. +This applies to the exact inverse map as well: applying the unitary C^-1 +to the forward error preserves its norm. Alternatively the inverse's explicit +formula gives the same bound directly. Arbitrary dirty D cannot change output. + +At one layer, 256f disjoint pairs contribute squared error at most256f Delta², +so its Hilbert error is at most16 sqrt(f) Delta. Exact C layers and L/R are +unitary; telescoping five layers bounds the completed macro and its inverse by +80 sqrt(f) Delta. This is an absolute bound for arbitrary data, not a sampled +state claim. The scalar inverse controls do not establish linearity of the +rounded transformation. + +With initial whole-block Hilbert norm at most H, every completed layer has +norm at most B=H+80 sqrt(f) Delta. Within a pair the difference has magnitude +at most2B; the half-sum target has magnitude below3B+Delta. Thus signed data +range greater than4B+2Delta is a conservative sufficient no-wrap condition. +Scratch may wrap freely and does not need a numerical range premise. The +sign-extended numerator lives modulo2M and its wrap is handled by the proved +half-accumulation identity. If Delta<=H/(128 sqrt(f)), signed range8H suffices. +For H a power of two and Delta=H2^-p, choose b=p+4, giving that range. + +## Full wrapper and comparison bill + +Each exact monomial is implemented by its fixed coordinate-permutation cycles +and coordinate phases. A cycle of length k takes k-1 complex swaps, decomposed +into two real swaps. Multiplication by i or -i takes a real swap and a real +negation; -1 takes two negations. These use only live coordinate words. +The exact source recipe gives L:1248 real swaps,512 negations; R:1264 swaps, +512 negations per spectator lane. Both phase histograms are [128,128,128,128]. +No full vector copy is needed: cycle swaps use existing data words. The Python +simulator's allocated lists are not claimed as the circuit's workspace. + +The completed rank-five residual therefore costs, per spectator lane: + +* 1280 C pairs,23040 real-word addition/subtraction/conditional-decrement + primitives,3792 real swaps and 2304 real negations; +* 10240b²+41584b+10240 generalized controlled-X/NOT gates; +* one arbitrary dirty (b+1)-bit word, restored exactly and reusable serially + across all pairs and f lanes. The 1024bf data bits are not counted as scratch. + +The constructed clean comparison uses17920 word primitives, the same routing +and quarterturns, and 8960b²+35184b+10240 gates per lane. Dirty operation costs +5120 additional word primitives or1280(b²+5b) additional gates per lane. +Serial depth is at most the total gate count. Five conceptual butterfly layers +do not mean five physical clock steps when sharing one scratch word. + +After borrowed-bit decomposition, the complete dirty macro has at most +`(6b+4)(10240b²+41584b+10240)f` elementary reversible gates and no additional +workspace. RESULT.json records exact X/CNOT/Toffoli counts rather than treating +this coarse upper bound as measured. For example b=32 gives, per spectator +lane, 5482752 X,1031936 CNOT and 442109184 Toffoli gates, versus 76032 X,950016 +CNOT and 380425984 Toffoli for the constructed clean comparison. These large +constructive counts make no speed or recursive-tariff affordability claim. + +## Mapping to PR3994, and why replacement stops here + +PR3994's full-state-cut theorem permits each completed cut an absolute defect +at most H2^(-beta-25). This single macro meets that allowance whenever +80 sqrt(f) Delta <= H2^(-beta-25). For power-of-two H, the sufficient choice +p >= beta+32+ceil(log2(sqrt(f))) meets it. This is an explicit module-to-cut +mapping, conditional on the actual caller placing this macro at that cut and +paying its time/space bill. It is not an improved selected stock coefficient. + +Local bijectivity does NOT preserve the provider's linear dirty-cleanup proof. +The exact source's `bw_transport.py` applies row-linear additions, scales and +operator composition; substituting a nonlinear rounded map is outside that +contract. For the actual rank-five L C_[5] R above, let h=s be real unit input +at coordinate0. The checked witness Q(h+s)-Q(h)-Q(s) has 24 nonzero complex +coordinates; coordinate0 is1 grid unit. Thus a dirty helper increment transformed +before and after adding s depends on h and is not Q(s). This is an actual +source-bound macro witness, not merely a generic nonlinear example. + +Destructive coordinate flooring is worse: even one C followed by its adjoint +and flooring fails to restore the input ((1,0),(0,0)); the verifier records its +round-trip result. Our lift restores it exactly, but the preceding additivity +failure remains. A full implementation must account for its nonlinear errors +and exact borrowed-bit cleanup jointly, or retain extra reversible information +in an affordable lifecycle. A single rank-five child charge is not evidence +that the explicit scalar circuit above fits the recursive tariff. We stop +implementation expansion at that missing actual caller/native budget. diff --git a/research/staged544-reversible-lattice-macro/README.md b/research/staged544-reversible-lattice-macro/README.md new file mode 100644 index 0000000000..65103a43d7 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/README.md @@ -0,0 +1,84 @@ +# Staged544 residual: replace one clean word with dirty reversible scratch + +This implements the actual rank-five residual for helper 277 in both pinned +PR3945 providers on a finite Gaussian lattice. Reversible numerical lifting and +finite-state bit circuits replace a destructive rounding step. One arbitrary +dirty `(b+1)`-bit workspace word is returned exactly, with no clean ancillary +bits in the explicit generalized-controlled-X circuit model. + +Compared with our explicitly constructed clean-accumulator implementation, this +removes `(b+1)` required clean bits and adds four real-word operations per C pair. +The comparison is **a clean-space tradeoff, not a speedup or a paid supplier +improvement**. Both implementations realize the same rounded map. The source +compiler is an exact operator evaluator; it does not provide this physical +finite-grid baseline. + +For one 512-coordinate spectator lane, the completed source-bound `L C_[5] R` +macro has 1280 pairs. Full dirty implementation:23040 real-word arithmetic +primitives,3792 real swaps,2304 real negations, one dirty word reusable serially. +The bit realization costs at most `10240b²+41584b+10240` NOT/generalized +controlled-X gates. The clean comparison costs 17920 word primitives and +`8960b²+35184b+10240` gates, with the same routing. The generalized gates are +also compiled into literal X/CNOT/Toffoli gates, borrowing only existing pair +bits and restoring them after each gate. At b=32, the dirty macro costs 442109184 +Toffolis per lane versus 380425984 for the clean comparison, plus separately +counted X/CNOT gates. Recursive tariff/owner admission remains unknown; this +concrete implementation is expensive. + +For `f` spectator lanes and grid spacing Delta, the completed Hilbert error is +at most `80 sqrt(f) Delta`. Every scratch bit is restored for **every** finite +data/scratch bit pattern. Numerical error claims additionally require the +proved no-wrap data range; scratch itself may overflow freely. The explicit +allowance maps this macro to PR3994's full-state logical-cut bound, retaining +the caller's tensor/range/lifecycle premises. + +**Why direct replacement stops:** the actual rounded rank-five macro is +nonlinear. For dirty helper and source `h=s=e0`, `Q(h+s)-Q(h)-Q(s)` has 24 +nonzero coordinates. Local reversible inversion therefore does not preserve +the whole provider's linear compensation/borrowed-buffer identities after +intervening arithmetic. No provider replacement, selected stock coefficient, +new kappa, or frontier change is claimed. + +## Reproduce + +Run `python3 -B verify.py` and `python3 -O -B verify.py` from this directory. +Default verification is read-only and uses only the standard library. Optional +`--print-result` prints recomputed mathematical evidence without writing files. +The repository registry is `python3 scripts/research_package.py --package +research/staged544-reversible-lattice-macro` from the repository root. + +Checks authenticate source bytes, bind helper 277 in both actual providers, +replay the credited PR3987 canonical-frame/recipe oracle on all 512 columns, +exhaust 279552 modular half-sum cases and 67584 pair states, and compare literal +bit circuits with the arithmetic specification on 17408 half-sum cases and 2048 +pair states. They also check actual full-macro dirty return/inversion, exact +Gaussian error bounds, the nonlinear witness, and meaningful source/parity/ +sign-extension/phase mutations. Finite tests support the parameterized proof; +they do not replace it or prove the full multiplication theorem. + +See PROOF.md for the derivation, RESULT.json for exact replay output, +LEDGER.json for the complete boundary/cost status and FROZEN-SOURCES.json for +immutable source pins. Exact predecessor notices are retained under frozen/. + +## Open next questions + +1. Bind the explicit bounded-fanin circuit to an affordable actual caller and + serial or parallel scratch lifecycle. The rank-five recursive charge alone + cannot pay the scalar circuit by declaration; optimize only after stating + the real allowance. +2. Resolve nonlinear dirty compensation across actual intervening arithmetic. + First replay the exhibited actual-macro witness through one concrete helper + lifetime with reversible recovery information fully charged. Do not infer + whole-word restoration from local invertibility. +3. Bind the actual caller's spectator dimension, dirty amplitude and budget to + the completed-error bound. Only then derive selected stock/tape coefficients. + +Credit Dugongue, dataisfire, Jeremy Kothe, Sagar Thakrar, roger-sato, Arham Tahir, +DreamingOfClouds, chafreaky, Cinna Davis, and the preserved native/owner/outer +lineage. Chris R / Clear1nsight with substantial OpenAI Codex assistance. No +independent human or proof-kernel review is asserted. + +The dirty borrowed-bit controlled-X decomposition is credited to +[Barenco et al., Lemma 7.2](https://arxiv.org/pdf/quant-ph/9503016), not presented +as a new gate theorem. Its finite implementation and application here are +checked independently of that paper's diagram. diff --git a/research/staged544-reversible-lattice-macro/RESULT.json b/research/staged544-reversible-lattice-macro/RESULT.json new file mode 100644 index 0000000000..5343e5915b --- /dev/null +++ b/research/staged544-reversible-lattice-macro/RESULT.json @@ -0,0 +1,164 @@ +{ + "half_exhaustive_cases": 279552, + "pair_exhaustive_cases": 67584, + "literal_bit_half_cases": 17408, + "literal_bit_pair_cases": 2048, + "credited_exact_canonical_recipe_columns": 512, + "rank5_full_cases": 24, + "rank5_max_error_squared_numerator_over_1024": 2212864, + "nonlinear_witness_input": "h=s=e0 real one grid unit", + "nonlinear_witness_first": [ + [ + 0, + [ + 1, + 0 + ] + ], + [ + 26, + [ + -2, + -1 + ] + ], + [ + 40, + [ + -1, + 1 + ] + ], + [ + 41, + [ + -1, + -1 + ] + ], + [ + 50, + [ + 0, + -1 + ] + ], + [ + 51, + [ + 0, + -1 + ] + ], + [ + 74, + [ + 1, + -1 + ] + ], + [ + 75, + [ + 1, + 0 + ] + ] + ], + "nonlinear_nonzero_coordinates": 24, + "naive_roundtrip": [ + [ + 0, + -1 + ], + [ + -1, + -1 + ] + ], + "routing": { + "left": { + "complex_swaps": 496, + "real_swaps": 1248, + "real_negations": 512, + "phase_histogram": [ + 128, + 128, + 128, + 128 + ], + "cycles": 16 + }, + "right": { + "complex_swaps": 504, + "real_swaps": 1264, + "real_negations": 512, + "phase_histogram": [ + 128, + 128, + 128, + 128 + ], + "cycles": 8 + } + }, + "pair_count_per_spectator": 1280, + "real_word_add_primitives_per_spectator": 23040, + "clean_comparison_word_add_primitives": 17920, + "total_real_negations_per_spectator": 2304, + "total_real_swaps_per_spectator": 3792, + "dirty_gate_polynomial_coefficients": [ + 10240, + 41584, + 10240 + ], + "clean_gate_polynomial_coefficients": [ + 8960, + 35184, + 10240 + ], + "dirty_scratch_bits": "b+1, restored; reused serially across all spectator lanes", + "error_bound": "80 sqrt(f) grid units for f spectator lanes", + "status": "PASS_FINITE_MACRO_NOT_PROVIDER_REPLACEMENT", + "dirty_ladder_full_states": 10912, + "elementary_full_pair_states": 2112, + "elementary_bill_per_spectator": { + "8": { + "dirty": { + "X": 389376, + "CNOT": 267392, + "Toffoli": 6765824 + }, + "constructed_clean": { + "X": 20736, + "CNOT": 246912, + "Toffoli": 5437184 + } + }, + "32": { + "dirty": { + "X": 5482752, + "CNOT": 1031936, + "Toffoli": 442109184 + }, + "constructed_clean": { + "X": 76032, + "CNOT": 950016, + "Toffoli": 380425984 + } + }, + "64": { + "dirty": { + "X": 21448960, + "CNOT": 2051328, + "Toffoli": 3557018880 + }, + "constructed_clean": { + "X": 149760, + "CNOT": 1887488, + "Toffoli": 3087619840 + } + } + }, + "bounded_fanin_upper_bound": "(6b+4)(10240b^2+41584b+10240)f elementary gates; no additional workspace" +} diff --git a/research/staged544-reversible-lattice-macro/SOURCES.json b/research/staged544-reversible-lattice-macro/SOURCES.json new file mode 100644 index 0000000000..3eaa7ce796 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/SOURCES.json @@ -0,0 +1,26 @@ +{ + "schema_version": 1, + "base_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "67f085acd86acd7d4e03922d9cf4b26bca66fed5", + "sha256": "47b42433f5a85809a3aadd29c2c339da2c6ed728e4f7762df6b88bccb7874cf0" + } + ], + "external_snapshot": { + "manifest": "FROZEN-SOURCES.json", + "heads": [ + "91f81d131252db704f945891da1ea54e29d46b8b", + "fc536202fdaa924158789a5ef59ac079bbe21922" + ], + "relation": "Exact public predecessor bytes retained and authenticated; not asserted to be Git ancestors. PR3994 eb2ac25838a3d39ac8fd6acfa62b8b613c847629 completed-cut theorem reused with explicit premise." + } +} diff --git a/research/staged544-reversible-lattice-macro/TASK.json b/research/staged544-reversible-lattice-macro/TASK.json new file mode 100644 index 0000000000..7d71cd816a --- /dev/null +++ b/research/staged544-reversible-lattice-macro/TASK.json @@ -0,0 +1,89 @@ +{ + "schema_version": 1, + "task_id": "selected-stock-envelope", + "priority_revision": 6, + "base_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "original_card": { + "id": "selected-stock-envelope", + "question": "What explicit uniform stock envelope does the actual selected stopped producer supply at one bootstrap stage?", + "starting_points": [ + "research/selected-bootstrap-stock-audit/README.md", + "research/bootstrap-cutoff-time-space-split/README.md", + "certificates/selected-result.json", + "docs/research/community-efficient1000-review.md", + "research/stock-margin-chain/README.md" + ], + "methods": [ + "Derive a source-bound reserve recurrence at the actual selected atom widths, separating parent stock from completed inner borrowing.", + "Find an exact missing implication or counterexample to a proposed selected-stage stock envelope." + ], + "acceptance_gate": "Bind every coefficient and depth factor to the selected producer and state the width domain. Compare a proved envelope with the sufficient cutoff guard; a large numerical headroom or a historical m=120 coefficient is not a selected m=73 proof.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read #2972 stock-margin chain and the selected stock audit. The new source archive reports the remaining cutoff comparisons, but leaves every actual stock coefficient unresolved; it is not an independently validated reserve envelope.", + "scope": "Source-bound orientation only. Read the named package and review before relying on its local evidence; this command is not its replay or supplier admission." + }, + "first_experiment": "Choose one actual selected producer/stage and derive its parent reserve and depth coefficient from source. Check whether newer handoffs already cover that exact obligation. Stop with the missing implementation lemma if it cannot be bounded; do not rerun #2972 cutoff/headroom arithmetic as a new contribution.", + "bottleneck_link": "This reduces a concrete inherited implementation obligation without confusing unchanged kappa arithmetic with a completed theorem.", + "allowed_variations": [ + "One stage or one explicit reserve/depth implication.", + "An independently checked same-domain proof repair, retaining all remaining assumptions." + ], + "scope_change_triggers": [ + "Importing the historical 57604 or 252 allowance without a selected-producer binding.", + "Calling a conditional fit lemma a full outer-proof adoption.", + "Replacing an actual selected stock coefficient with cutoff comparisons or a conditional fit inequality." + ], + "overlap_terms": [ + "selected stock", + "stock envelope", + "bootstrap cutoff", + "1956", + "1965", + "1990", + "2972", + "stock-margin-chain", + "actual_stock_coefficient" + ], + "existing_checks": [ + { + "scope": "Retained stock audit identifies missing actual selected-stage coefficients; later cutoff-chain arithmetic does not supply them.", + "evidence": "docs/research/research-family-status.md#revision-6-handoffs-source-archives-awaiting-independent-validation", + "remaining": "Derive one actual reserve/depth coefficient from the selected producer.", + "status": "reviewed", + "source_commit": "836b19bfa309ceafbc8ee32a15e8c4b10dde7e11", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "Finite bit-level realization of the actual helper277 rank5 residual on a Gaussian lattice, dirty workspace tradeoff against an explicitly constructed clean baseline, and actual macro nonadditivity obstruction to provider substitution.", + "scope_change_reason": "Explicit assigned staged544 physical precision follow-up to PR3994. This closes one finite macro arithmetic/scratch implementation; it does not derive selected m73 stock or uniform supplier admission.", + "bottleneck_link": "Connect completed-output error to an actual reversible arithmetic implementation and reject unsupported exact dirty-cleanup substitution.", + "budget_minutes": 60, + "stop_rule": "Finish one source-bound finite macro, full time/space/error ledger, and nonlinear admission discriminator; stop before a recursive replacement without caller budget.", + "outcome": "completed", + "author": "Chris R / Clear1nsight", + "ai_assistance": "Substantial OpenAI Codex assistance. Separate mathematical subtask within a coordinated multi-agent contribution batch; no independent human or proof-kernel review.", + "evidence": "RESULT.json, PROOF.md, LEDGER.json and VALIDATION.json", + "open_questions": [ + { + "question": "Can the finite bit circuit fit an actual recursive caller budget while preserving all dirty-helper cleanup?", + "why_it_matters": "Local reversible approximation alone does not preserve linear compensation after interleaved arithmetic.", + "first_step": "Bind one actual helper lifetime and recovery stock to the explicit nonadditivity witness and full bit bill.", + "blocked_by": "Caller range, tensor multiplicity, recursive tariff and nonlinear recovery contract." + } + ], + "checkpoint": { + "utc": "2026-10-19T08:43:57Z", + "canonical_main": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "priority_revision": 6, + "fetch": "Root canonical shell fetch failed DNS; own GitHub connector confirmed main20ec and existing exact object used for new worktree. No successful shell fetch claim.", + "overlap": "702 open PR bodies complete7pages at08:39:35UTC; partial1166 discussions checked by root. No exhaustive novelty claim." + } +} diff --git a/research/staged544-reversible-lattice-macro/VALIDATION.json b/research/staged544-reversible-lattice-macro/VALIDATION.json new file mode 100644 index 0000000000..3050dba823 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/VALIDATION.json @@ -0,0 +1,61 @@ +{ + "status": "Scientific checks passed; repository registry/export/publication recorded after their actual runs", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "source_scope": "Actual pinned PR3945 words and native sources plus PR3987 exact recipe/oracle; all frozen hashes authenticated before science", + "commands": [ + "python3 -B verify.py", + "python3 -O -B verify.py" + ], + "bounded_same_team_review": "Root separately reviewed final PROOF.md and circuit.py: signed half identity, actual L/R binding, elementary ladder/negative controls/counts, range and cut mapping found consistent. Graph agent independently implemented modular and literal elementary-pair controls, including arbitrary dirty inputs and small-bit overflow boundaries. No independent human or proof-kernel review.", + "independent_graph_review": "round3-graph-moment-session/precision-review/REVIEW-RESULT.json and LITERAL-RESULT.json retained by coordinating session; not included/executed by default registry", + "failed_attempts": [ + "Result comparison initially compared Python tuples against JSON lists; normalized the entire evidence object before final verification.", + "Two prose patch anchors failed before applying; corrected against exact current text." + ], + "unrun": [ + "Complete provider replacement or whole-word rounded cleanup", + "Actual recursive tariff/owner/stock admission", + "Uniform all-size or selected-stage supplier theorem", + "Proof-kernel or human review" + ], + "registered_replay": { + "status": "PASS", + "normal_seconds": 4.017, + "optimized_seconds": 4.771, + "log": "registered-candidate.log" + }, + "git_free_replay": { + "seconds": 8.928, + "files": 25, + "read_only": true, + "Git_free": true, + "bytes_unchanged": true, + "runs": [ + { + "flags": [ + "-B" + ], + "exit": 0, + "stdout": "{\"status\": \"PASS_FINITE_MACRO_NOT_PROVIDER_REPLACEMENT\", \"seconds\": 4.474, \"half_cases\": 279552, \"pair_cases\": 67584, \"full_cases\": 24}\n", + "stderr": "" + }, + { + "flags": [ + "-O", + "-B" + ], + "exit": 0, + "stdout": "{\"status\": \"PASS_FINITE_MACRO_NOT_PROVIDER_REPLACEMENT\", \"seconds\": 4.158, \"half_cases\": 279552, \"pair_cases\": 67584, \"full_cases\": 24}\n", + "stderr": "" + } + ], + "scope": "25-file copy at test time; later CREDITS and documentation updates do not change scientific runtime; final exact copy verification follows" + }, + "latest_overlap": { + "utc": "2026-10-19T09:04:00Z", + "canonical_main": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "open_pr_bodies": 718, + "coverage": "Root complete open-body refresh; Discussion coverage partial; no direct lattice-macro overlap identified." + } +} diff --git a/research/staged544-reversible-lattice-macro/VERIFY.json b/research/staged544-reversible-lattice-macro/VERIFY.json new file mode 100644 index 0000000000..518e31c074 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/VERIFY.json @@ -0,0 +1,28 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 180, + "checks": "Source-bound actual rank5 recipe; exhaustive modular/bit-state implementation, dirty returns, error bill, nonlinear and production mutation controls." + }, + { + "argv": [ + "{python}", + "-O", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 180, + "checks": "Same mathematical admission/rejection checks under optimized Python; explicit checks cannot disappear." + } + ] +} diff --git a/research/staged544-reversible-lattice-macro/bits.py b/research/staged544-reversible-lattice-macro/bits.py new file mode 100644 index 0000000000..d7aced0da5 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/bits.py @@ -0,0 +1,65 @@ +"""Literal ancilla-free generalized-controlled-X circuit simulator. + +Each counted step flips one bit under a conjunction of other bits (positive +or negative controls). This is an explicit gate alphabet, NOT a Toffoli count. +Arbitrary controlled-X decomposition into the supplier's native gates is open. +""" +def add(y,x,b,width=None,extend=False,inverse=False): + width=b if width is None else width + sources=[(j,j)for j in range(b)]+([(b,b-1)]if extend else []) + gates=[(j,k,s)for j,s in sources for k in range(width-1,j-1,-1)] + if inverse:gates.reverse() + for j,k,s in gates: + mask=((1<<(k-j))-1)<>s&1)and y&mask==mask:y^=1<>1,b,inverse=reverse);n+=k + d,k=add(d,c,b,b+1,True,not subtract);n+=k + d,k=add(d,a,b,b+1,True,True);n+=k + if not clean: + y,k=add(y,d>>1,b,inverse=not reverse);n+=k + y,k=parity_decrement(y,a,c,d,b,reverse);n+=k + return y,d,n + +def negate(x,b): + x^=(1<>c&1)==v for c,v in controls):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±ve{cRKW+p~gSnVTb%BFZ)epEJ1I4*AP8ZrRXXU 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 JbW1Cn3jn$nQt1Ey literal 0 HcmV?d00001 diff --git a/research/staged544-reversible-lattice-macro/frozen/WORD-extra.json.gz b/research/staged544-reversible-lattice-macro/frozen/WORD-extra.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c531be7383ad3ba941600c7ced14e5e10d6d1c67 GIT binary patch literal 74425 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 z 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 (y.bit_length() - 1) & 1: x ^= y + if x: return False + return True +def Kop(G_cols): + """BW: K_G = perm(G) then diag(Q), Q = I + G^-T G^-1: PR2226's monomial() and the conjugator inside clifford_exact.canonical_frame.""" + G = transpose(tuple(G_cols), n); gi = inv(G, n) + Q = tuple((1 << i) ^ sum(parity(gi_i & gi_j) << j for j, gi_j in enumerate(transpose(gi, n))) for i, gi_i in enumerate(transpose(gi, n))) + return perm(n, G).then(diag(n, Q)) +def numeric_K(G_cols): + import numpy as np + pv, ph = bw_gauss.monomial(list(G_cols), n) + N = 1 << n; re = np.zeros((N, N), dtype=np.int64); im = np.zeros((N, N), dtype=np.int64) + unit = [(1, 0), (0, 1), (-1, 0), (0, -1)] + for x in range(N): re[pv[x], x], im[pv[x], x] = unit[ph[x]] + return re, im, 0 +def warp_ok(G_cols, rec): + """BW: the serialized monomial equals PR2226's exact numpy K_G on all 512 columns (indep. decode) and its op decodes to K_G exactly.""" + m = bw_gauss.recipe_matrix(rec, n) + if not bw_gauss.equal_scaled(numeric_K(G_cols), m): return False + dec = monomial_op(rec); ref = Kop(G_cols) + return dec.tab == ref.tab and dec.zero_state() == ref.zero_state() + +def main(): + c = json.load(gzip.open(sys.argv[1])); frames = c['frames']; v = c['v'] + starts = sorted({c['start'][r] for r in range(2 * v, len(c['start'])) if c['start'][r] != 0 and c['final'][r] == 1}) + # HPE: (entrance, terminal) pairs of helpers ending at a proper subspace; key 'E:U'. Inherited words have none. + ends = sorted({(c['start'][r], c['final'][r]) for r in range(2 * v, len(c['start'])) if c['final'][r] != 1}) + # COLD-HPE: e == 0 (a cold helper, entrance = bottom, T_0 = I) is allowed: the (0, U) recipe is keyed '0:U' + assert all(len(frames[u]) < n and _contains(frames[u], frames[e]) for e, u in ends) + cold_ends = [(e, u) for e, u in ends if e == 0] + recipes = {} + for f in starts: + U = frames[f]; rec, compiled = lower_child(S_of(U)) + recipes[str(f)] = dict(frame=f, vectors=list(U), entrance_rank=len(U), rank=rec['rank'], left=rec['left'], right=rec['right']) + for e, u in ends: + E, U = frames[e], frames[u]; rec, compiled = lower_child(S_of(E, U)) + recipes['%d:%d' % (e, u)] = dict(frame=e, terminal=u, vectors=list(E), terminal_vectors=list(U), entrance_rank=len(E), + terminal_rank=len(U), rank=rec['rank'], left=rec['left'], right=rec['right']) + # BW: monomial recipes of the warps K_G (anticipatory dirty borrowing, PR2226): one per operator, serialized like a wrapper monomial + warp_recipes = {} + for w in c.get('warps', []): + _, rec_k = mono_of(Kop(w['G_columns'])) + warp_recipes[str(w['op'])] = dict(op=w['op'], from_frame=w['from_frame'], to_frame=w['to_frame'], G_columns=list(w['G_columns']), K=rec_k) + Path(sys.argv[2]).write_text(json.dumps(dict(status='RESIDUAL_ADAPTER_RECIPES', recipes=recipes, warps=warp_recipes), sort_keys=True, separators=(',', ':')) + '\n') + # ---- independent decode of the serialized file + data_all = json.loads(Path(sys.argv[2]).read_text()); data = data_all['recipes'] + dot = lambda a, b: bin(a & b).count('1') & 1 + detail = [] + for f in starts: + rec = data[str(f)]; U = frames[f] + assert wrapped_ok(U, rec), ('wrapper product is not C_[w] x I', f) + detail.append(dict(frame=f, entrance_rank=len(U), residual_width=n - len(U), vectors=list(U), all_even_weight=all(bin(x).count('1') % 2 == 0 for x in U), + totally_isotropic=all(dot(a, b) == 0 for a in U for b in U))) + hdetail = [] + for e, u in ends: # HPE: independent decode, residual width = dim U - dim E + rec = data['%d:%d' % (e, u)]; E, U = frames[e], frames[u] + assert wrapped_ok(E, rec, U), ('HPE wrapper product is not C_[w] x I', e, u) + hdetail.append(dict(frame=e, terminal=u, entrance_rank=len(E), terminal_rank=len(U), residual_width=len(U) - len(E))) + controls = [] + def reject(name, fn): + f = starts[0]; rec = copy.deepcopy(data[str(f)]); fn(rec) + if wrapped_ok(frames[f], rec): raise AssertionError('mutated wrapper accepted: ' + name) + controls.append(name) + reject('wrong global phase', lambda r: r['right'].__setitem__('phase', (r['right']['phase'] + 1) % 4)) + reject('wrong translation', lambda r: r['left'].__setitem__('offset', r['left']['offset'] ^ 1)) + reject('wrong quadratic form', lambda r: r['right'].__setitem__('quadratic_rows', [x ^ 2 if i == 0 else x for i, x in enumerate(r['right']['quadratic_rows'])]) if False else r['right']['linear_Z4'].__setitem__(0, (r['right']['linear_Z4'][0] + 2) % 4)) + reject('sides swapped', lambda r: (r.__setitem__('left', r['right']), r.__setitem__('right', r['left']))) + reject('wrong width', lambda r: r.__setitem__('rank', r['rank'] + 1)) + if ends: # HPE controls on the first (E, U) pair + e, u = next((p for p in ends if p[0] != 0), ends[0]); rec0 = data['%d:%d' % (e, u)] # COLD-HPE: an entering pair if any (= ends[0] without cold ends) + def hreject(name, ok): + if ok: raise AssertionError('HPE mutation accepted: ' + name) + controls.append(name) + hreject('hpe: U-wrapper decoded against a FULL ending', wrapped_ok(frames[e], rec0)) + hreject('hpe: width misreported as 9 - dim E', wrapped_ok(frames[e], dict(rec0, rank=n - len(frames[e])), frames[u])) + other = next(f for f in range(len(frames)) if f != u and len(frames[f]) == len(frames[u]) and _contains(frames[f], frames[e])) + hreject('hpe: wrong terminal hyperplane', wrapped_ok(frames[e], rec0, frames[other])) + fe = next(((e2, u2) for e2, u2 in ends if str(e2) in data), None) + if fe: # an entrance shared with FULL-ended helpers: R_{E,FULL} must not serve as R_{E,U} + r2 = data['%d:%d' % fe] + hreject('hpe: pre wrapper resolved to the FULL recipe R_{E,FULL}', wrapped_ok(frames[fe[0]], dict(r2, right=data[str(fe[0])]['right']), frames[fe[1]])) + hreject('hpe: wrong global phase', wrapped_ok(frames[e], dict(rec0, left=dict(rec0['left'], phase=(rec0['left']['phase'] + 1) % 4)), frames[u])) + if cold_ends: # COLD-HPE controls on the first cold pair (0, U): factor_iff_pre says only R_{0,U} itself may precede + e, u = cold_ends[0]; recc = data['%d:%d' % (e, u)]; E, U = frames[e], frames[u] + ID = dict(matrix_rows=[1 << i for i in range(n)], offset=0, quadratic_rows=[0] * n, linear_Z4=[0] * n, phase=0) + assert monomial_op(ID).tab == identity(n) # the control's wrapper really is the identity + def creject(name, ok): + if ok: raise AssertionError('cold HPE mutation accepted: ' + name) + controls.append(name) + creject('cold hpe: identity pre wrapper instead of R_{0,U}', wrapped_ok(E, dict(recc, right=ID), U)) + creject('cold hpe: identity post wrapper instead of L_{0,U}', wrapped_ok(E, dict(recc, left=ID), U)) + creject('cold hpe: no wrappers (cold FULL convention L = R = I)', wrapped_ok(E, dict(recc, left=ID, right=ID), U)) + creject('cold hpe: U-wrapper decoded against a FULL ending', wrapped_ok(E, recc)) + creject('cold hpe: width misreported as 9', wrapped_ok(E, dict(recc, rank=n), U)) + other = next(f for f in range(len(frames)) if f != u and len(frames[f]) == len(frames[u])) + creject('cold hpe: wrong terminal hyperplane', wrapped_ok(E, recc, frames[other])) + creject('cold hpe: wrong global phase', wrapped_ok(E, dict(recc, right=dict(recc['right'], phase=(recc['right']['phase'] + 1) % 4)), U)) + ent = next((p for p in ends if p[0] != 0 and p[1] == u), None) + same = lambda x, y: monomial_op(x).tab == monomial_op(y).tab and monomial_op(x).zero_state() == monomial_op(y).zero_state() + if ent and not same(data['%d:%d' % ent]['right'], recc['right']): # an entering helper ending at the same U: its R_{E,U} must not serve as R_{0,U} + creject('cold hpe: pre wrapper resolved to an entering recipe R_{E,U}', wrapped_ok(E, dict(recc, right=data['%d:%d' % ent]['right']), U)) + wdetail = [] + for w in c.get('warps', []): # BW: independent decode of every warp recipe, then mutation controls on the first warp + rec = data_all['warps'][str(w['op'])] + assert rec['G_columns'] == w['G_columns'] + assert warp_ok(w['G_columns'], rec['K']), ('warp recipe differs from the exact monomial K_G', w['op']) + wdetail.append(dict(op=w['op'], from_frame=w['from_frame'], to_frame=w['to_frame'], columns_checked=1 << n)) + if c.get('warps'): + w0 = c['warps'][0]; k0 = data_all['warps'][str(w0['op'])]['K'] + def wreject(name, ok): + if ok: raise AssertionError('warp mutation accepted: ' + name) + controls.append(name) + wreject('warp: wrong global phase', warp_ok(w0['G_columns'], dict(k0, phase=(k0['phase'] + 1) % 4))) + wreject('warp: wrong translation', warp_ok(w0['G_columns'], dict(k0, offset=k0['offset'] ^ 1))) + wreject('warp: wrong linear phase', warp_ok(w0['G_columns'], dict(k0, linear_Z4=[(k0['linear_Z4'][0] + 2) % 4] + k0['linear_Z4'][1:]))) + wreject('warp: wrong quadratic form', warp_ok(w0['G_columns'], dict(k0, quadratic_rows=[k0['quadratic_rows'][0] ^ 2, k0['quadratic_rows'][1] ^ 1] + k0['quadratic_rows'][2:]))) + wreject('warp: recipe of another operator', warp_ok(w0['G_columns'], data_all['warps'][str(c['warps'][1]['op'])]['K'])) + wreject('warp: inverse recipe used as the warp', warp_ok(w0['G_columns'], mono_of(Kop(w0['G_columns']).adjoint())[1])) + G2 = list(w0['G_columns']); G2[0] ^= G2[1] + wreject('warp: wrong G (frame-changed column)', warp_ok(G2, k0)) + sing = list(w0['G_columns']); sing[1] = sing[0] + try: Kop(sing); raise SystemExit('non-invertible G accepted') + except (AssertionError, StopIteration, ValueError): controls.append('warp: non-invertible G') + res = dict(status='PASS_RESIDUAL_WRAPPERS_ARE_EXACT', frames=len(detail), **({'hyperplane_end_pairs': hdetail} if ends else {}), **({'cold_hyperplane_end_pairs': len(cold_ends)} if cold_ends else {}), wrappers_reject=controls, all_even_weight=all(d['all_even_weight'] for d in detail), **({'warp_recipes_exact_on_all_512_columns': wdetail} if wdetail else {}), + all_totally_isotropic=all(d['totally_isotropic'] for d in detail), detail=detail) + Path(sys.argv[3]).write_text(json.dumps(res, indent=1) + '\n') + print('Lemma A (exact): L^-1 S_E R^-1 = C_[w] x I for', len(detail), 'entrance frames, global phase included;', len(controls), 'wrapper mutations rejected; all-even-weight:', res['all_even_weight']) +if __name__ == '__main__': main() diff --git a/research/staged544-reversible-lattice-macro/frozen/bw_transport.py b/research/staged544-reversible-lattice-macro/frozen/bw_transport.py new file mode 100644 index 0000000000..08248542b1 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/frozen/bw_transport.py @@ -0,0 +1,416 @@ +"""Transport an explicit BORROW-WORD to the native canonical frame-id form, with warps, and replay it exactly. + +Anticipatory dirty borrowing is the construction of PR2226 (Cinna Davis, @1337isnot1337, with OpenAI Codex +assistance; Apache-2.0): a retiring helper's register is lent to a later helper through a monomial Clifford +logical reference change K_G ("warp"), the retired field's value being replaced by K_G z. The explicit +chronological BORROW-WORD (canonical coordinates, literal frames, warps, cold restoration, inverse cleanup +with private zero buffers) is the builder output of the borrowing work (P1/P2). This script is the +transport stage of the native chain (the analogue of hpe_audit_and_transport.py): it never trusts the builder. +It replays the program in the free operator algebra generated by the warps over every arbitrary input, +in BOTH orientations (forward and inverse-transpose), checks every frame chain and the paid profile, compacts +the helper registers to R' = R - k, and writes the native CANONICAL-WORD. + +usage: bw_transport.py BORROW-WORD.json[.gz] OUT_DIR +""" +if not __debug__: + raise RuntimeError('assertions must remain enabled') # every check of this stage is an assert +import argparse +import copy +import gzip +import hashlib +import json +import sys +import time +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + + +def read(path): + data = path.read_bytes() + return json.loads(gzip.decompress(data) if path.suffix == '.gz' else data) + + +def basis(vs): + pivots = {} + for x in vs: + for k in sorted(pivots, reverse=True): + if x >> k & 1: + x ^= pivots[k] + if x: + k = x.bit_length() - 1 + for j in pivots: + if pivots[j] >> k & 1: + pivots[j] ^= x + pivots[k] = x + return tuple(pivots[k] for k in sorted(pivots, reverse=True)) + + +def span(b): + s = {0} + for x in b: + s |= {t ^ x for t in s} + return frozenset(s) + + +def rank_of(vs): + return len(basis(vs)) + + +def solve_G(cols, h): + """G given as images of e_i; returns (invertible?, image-of-subspace function).""" + def lin(x): + out = 0 + for i, c in enumerate(cols): + if x >> i & 1: + out ^= c + return out + return lin, rank_of(cols) == h + + +# ---- free operator algebra over the warps ------------------------------------------------------------------ +def add_row(dst, src, c): + for key, value in list(src.items()): + z = dst.get(key, Q(0)) + c * value + if z: + dst[key] = z + elif key in dst: + del dst[key] + + +def warp_row(row, op): + out = {} + for (var, word), value in row.items(): + word = word[1:] if word and word[0] == -op else (op,) + word + out[var, word] = value + return out + + +def is_dyadic(q): + return q.denominator & (q.denominator - 1) == 0 + + +def gate_regs(e): + if e[0] == 'add': + return [e[1], e[2]] + if e[0] == 'scale': + return [e[1]] + raise AssertionError(e[0]) + + +def dual(e): + e = list(e) + if e[0] == 'add': + e[1], e[2] = e[2], e[1] + e[3] = -e[3] + elif e[0] == 'scale': + e[2], e[3] = e[3], e[2] + return e + + +def apply_gate(e, rows, back): + if back: + e = dual(e) + if e[0] == 'scale': + q = Q(e[2], e[3]) + assert q + rows[e[1]] = {j: q * x for j, x in rows[e[1]].items()} + else: + assert e[1] != e[2] + add_row(rows[e[1]], rows[e[2]], Q(e[3], e[4])) + + +def run(word_path, out): + t0 = time.monotonic() + word = read(word_path) + assert word['kind'] == 'BORROW-WORD' + v, h, R0 = word['report']['v'], word['report']['h'], word['report']['R'] + assert h == 9 and v == 112 + n0 = 2 * v + R0 + removed = sorted(word['removed']) + assert all(2 * v <= r < n0 for r in removed) and len(set(removed)) == len(removed) + k = len(removed) + kept = [r for r in range(n0) if r not in set(removed)] + newid = {r: i for i, r in enumerate(kept)} + n = len(kept) + R = R0 - k + assert n == 2 * v + R + Zbase = n0 # builder convention: zero buffer of restored c is register n0 + c + ports = word['ports'] + assert len(set(ports)) == v + full = tuple(1 << i for i in range(h - 1, -1, -1)) + frames, frame_ids = [(), full], {(): 0, full: 1} + + def fid(vectors): + frame = basis(vectors) + if frame not in frame_ids: + frame_ids[frame] = len(frames) + frames.append(frame) + return frame_ids[frame] + + def R_(r): # register -> new register (int) or ['Z', c] + if isinstance(r, list): + return r + if r >= Zbase: + return ['Z', newid[r - Zbase]] + return newid[r] + + start = [fid([p]) for p in ports] + [0] * (v + R) + for r, frame in word['start_extra'].items(): + assert 2 * v <= int(r) < n0 and int(r) not in set(removed) + start[newid[int(r)]] = fid(frame) + final = [1] * v + [fid(x for x in range(1, 1 << h) if (x & p).bit_count() % 2 == 0) for p in ports] + [1] * R + helper_final = {} + for r, frame in word['helper_final'].items(): + assert 2 * v <= int(r) < n0 and int(r) not in set(removed) + helper_final[newid[int(r)]] = fid(frame) + final[newid[int(r)]] = helper_final[newid[int(r)]] + zero_buffers = sorted(helper_final) # every restored (hyperplane-ended) helper is replaced by a private zero buffer in the FULL cleanup + + def gate(e): + e = copy.deepcopy(e) + # Four-low lifted-target port (PR2436 mechanism): literal A-phase warp after the entry adapters. + if e[0] == 'warp': + assert len(e) == 5 + return ['warp', R_(e[1]), e[2], fid(e[3]), fid(e[4])] + if e[0] == 'add': + e[1], e[2] = R_(e[1]), R_(e[2]) + else: + e[1] = R_(e[1]) + e[-1] = None if e[-1] is None else fid(e[-1]) + return e + + # warps: operator table; op id = position + 1; G given by images of the basis vectors + warps = [] + for i, (pos, lender, G, frm, to) in enumerate(word['warps']): + warps.append({'op': i + 1, 'B_pos': pos, 'lender': newid[lender], 'G_columns': list(G), + 'from_frame': fid(frm), 'to_frame': fid(to)}) + byp = {} + for w_ in warps: + byp.setdefault(w_['B_pos'], []).append(w_) + + def warp_event(r, op, f0, f1): + return ['warp', r, op, f0, f1] + + # compensation (zero frame): initial corrections first, as twisted additions t += c * W(s) + pre = [] + for term in word['initial_corrections']: + q = Q(term['coefficient']) + pre.append(['tadd', newid[term['target']], newid[term['source']], list(term['operator_word']), + q.numerator, q.denominator, 0]) + precondition = pre + [gate(e) for e in word['precondition']] # the formal initial corrections come first (PR2226 order) + compensation = [gate(e) for e in word['compensation']] + A = [gate(e) for e in word['A']] + cut = [gate(e) for e in word['cut']] + B = [] + for p in range(len(word['B']) + 1): + for w_ in sorted(byp.get(p, []), key=lambda x: x['op']): + B.append(warp_event(w_['lender'], w_['op'], w_['from_frame'], w_['to_frame'])) + if p < len(word['B']): + B.append(gate(word['B'][p])) + assert sum(1 for e in B if e[0] == 'warp') == len(warps) + tail = [gate(e) for e in word['restore']] + cleanup = [] + for e in word['cleanup']: + if e[0] == 'warp': + cleanup.append(warp_event(R_(e[1]), e[2], 1, 1)) + assert basis(e[3]) == full + else: + cleanup.append(gate(e)) + centers = [newid[r] for r in word['centers']] + center_frames = [fid(f) for f in word['center_frames']] + levels = {str(t): fid(f) for t, f in word['target_levels'].items()} + + canonical = dict(h=h, v=v, R=R, ports=ports, frames=frames, start=start, final=final, + precondition=precondition, compensation=compensation, A=A, cut=cut, B=B, tail=tail, + cleanup=cleanup, centers=centers, center_frames=center_frames, target_levels=levels, + warps=warps, zero_buffers=zero_buffers, removed=removed, helper_origin=kept[2 * v:], + borrow=dict(k=k, base=word.get('base'), original_helpers=R0)) + # ---- exact scalar replay in the free algebra over the warps (both orientations) ----------------------------------- + nz = len(zero_buffers) + + def regkey(r): + return tuple(r) if isinstance(r, list) else ('L', r) + + def expand_tadd(e): + _, t, s, wordops, a, b, f = e + ev = [warp_event(s, op, 0, 0) for op in reversed(wordops)] + ev.append(['add', t, s, a, b, 0]) + ev += [warp_event(s, -op, 0, 0) for op in wordops] + return ev + + def program(): + yield 'pre', [x for e in precondition + compensation for x in (expand_tadd(e) if e[0] == 'tadd' else [e])] + yield 'A', A + yield 'A', cut + yield 'B', B + yield 'tail', tail + yield 'cleanup', cleanup + + def fullprog(): + return [(part, e) for part, es in program() for e in es] + prog = fullprog() + for back in (False, True): + rows = {regkey(r): {(r, ()): Q(1)} for r in range(n)} + for c in zero_buffers: + rows[('Z', c)] = {} + for part, e in prog: + if e[0] == 'warp': + key = ('L', e[1]) if not isinstance(e[1], list) else tuple(e[1]) + rows[key] = warp_row(rows[key], e[2]) + else: + if e[0] == 'add': + src, dst = regkey(e[2]), regkey(e[1]) + a, b = e[3], e[4] + if back: + src, dst, a = dst, src, -a + assert src != dst + add_row(rows[dst], rows[src], Q(a, b)) + else: + key = regkey(e[1]) + a, b = (e[3], e[2]) if back else (e[2], e[3]) + q = Q(a, b) + assert q + rows[key] = {j: q * x for j, x in rows[key].items()} + expected = {regkey(r): {(r, ()): Q(1)} for r in range(n)} + for t in range(v): + if back: + expected[('L', t)][(v + t, ())] = Q(-1) + else: + expected[('L', v + t)][(t, ())] = Q(1) + for c in zero_buffers: + expected[('Z', c)] = {} + bad = [key for key in expected if rows[key] != expected[key]] + assert not bad, ('arbitrary-input endpoint (free warp algebra)', back, bad[:8]) + # dyadic primitives + for part, e in prog: + if e[0] == 'add': + assert is_dyadic(Q(e[3], e[4])) + elif e[0] == 'scale': + q = Q(e[2], e[3]) + a = abs(q.numerator) + assert is_dyadic(q) and a and a & (a - 1) == 0 + + wrapped_regs = {r for r in range(2 * v, n) if start[r] != 0 or final[r] != 1} # entering or hyperplane-ended helpers carry wrappers + # ---- frame chains, paid profile, edges, warps ------------------------------------------------------------------- + contains = lambda a, b: basis(frames[a] + frames[b]) == tuple(frames[b]) + cur = start.copy() + paid, edges = Counter(), set() + wsum = {w_['op']: w_ for w_ in warps} + G_of = {} + for w_ in warps: + lin, inv_ = solve_G(w_['G_columns'], h) + assert inv_, ('non-invertible G', w_['op']) + img = basis([lin(x) for x in frames[w_['from_frame']]]) + assert img == tuple(frames[w_['to_frame']]), ('G does not map the from frame onto the to frame', w_['op']) + assert len(frames[w_['from_frame']]) == len(frames[w_['to_frame']]) + G_of[w_['op']] = lin + warp_edges = set() + + def regs_of(e): + return [r for r in gate_regs(e) if not isinstance(r, list)] + + def climb(r, f): + old = cur[r] + assert contains(old, f), ('nonmonotone', r, old, f) + if old != f: + degree = len(frames[f]) - len(frames[old]) + paid[degree] += 1 + edges.add((old, f)) + cur[r] = f + + def do_warp(e): + _, r, op, f0, f1 = e + if isinstance(r, list): + assert r[0] == 'Z' + assert f0 == f1 == 1 + return + assert cur[r] == f0, ('warp frame mismatch', r, op, cur[r], f0) + a = abs(op) + lin = G_of[a] + if op > 0: + ok = basis([lin(x) for x in frames[f0]]) == tuple(frames[f1]) + else: + ok = basis([lin(x) for x in frames[f1]]) == tuple(frames[f0]) + assert ok, ('warp G does not carry the frame', op, f0, f1) + cur[r] = f1 + warp_edges.add((1 if op > 0 else -1, a, f0, f1)) + + # zero-frame phase + for e in precondition + compensation: + if e[0] == 'tadd': + assert start[e[2]] == 0 and start[e[1]] == 0 and e[-1] == 0 and e[2] not in set(wrapped_regs) and all(op != 0 for op in e[3]) + for ev in expand_tadd(e): + if ev[0] == 'warp': + do_warp(ev) # frame 0 -> 0: K_G itself is the physical operator + continue + for r in regs_of(e): + assert start[r] == 0 and e[-1] == 0, ('zero-frame precondition on a nonzero entrance', e) + for part in ('A', 'B'): + if part == 'B': + assert all(cur[r] == f for r, f in zip(centers, center_frames)) + assert all(cur[v + t] == levels.get(str(t), 0) for t in range(v)) + for r, frame in zip(centers, center_frames): + served = {levels.get(str(e[1] - v), 0) for e in cut if e[2] == r} + old = frame + for f in sorted(served, key=lambda f: -len(frames[f])): + assert contains(f, old) + if old != f: + paid[len(frames[old]) - len(frames[f])] += 1 + edges.add((old, f)) + edges.add((f, old)) + old = f + for e in (A if part == 'A' else B): + if e[0] == 'warp': + do_warp(e) + else: + for r in regs_of(e): + climb(r, e[-1]) + for e in tail: + for r in regs_of(e): + climb(r, e[-1]) + for r, f in enumerate(final): + climb(r, f) + for e in cleanup: + if e[0] == 'warp': + do_warp(e) + continue + for r in gate_regs(e): + if isinstance(r, list): + assert r[0] == 'Z' and r[1] in set(zero_buffers) and e[-1] == 1 + else: + assert final[r] == 1 and e[-1] == 1, ('cleanup on a non-FULL end', e) + assert all(len(frames[final[r]]) < h for r in zero_buffers) + assert set(zero_buffers) == set(helper_final) + rep = word['report'] + assert dict(paid) == {int(r): c for r, c in rep['local_profile'].items()}, ('paid profile differs', dict(paid), rep['local_profile']) + canonical['local_profile'] = dict(sorted(paid.items())) + canonical['edges'] = sorted(edges) + canonical['warp_edges'] = sorted(warp_edges) + out.mkdir(parents=True, exist_ok=False) + payload = json.dumps(canonical, sort_keys=True, separators=(',', ':')).encode() + (out / 'CANONICAL-WORD.json.gz').write_bytes(gzip.compress(payload, mtime=0)) + raw = word_path.read_bytes() + (out / 'FULL-WORD.json.gz').write_bytes(gzip.compress(gzip.decompress(raw) if word_path.suffix == '.gz' else raw, mtime=0)) + receipt = dict(status='PASS_BORROW_WORD_FREE_ALGEBRA_ALL_COLUMNS_AND_NATIVE_FRAMES', + input_content_sha256=hashlib.sha256(gzip.decompress(raw) if word_path.suffix == '.gz' else raw).hexdigest(), + canonical_content_sha256=hashlib.sha256(payload).hexdigest(), + live_columns_each_orientation=n, helpers=R, original_helpers=R0, removed_helpers=k, + zero_buffers=nz, warps=len(warps), warp_events=sum(e[0] == 'warp' for part, e in prog), + initial_corrections=len(word['initial_corrections']), + scalar_operations=len([1 for p, e in prog if e[0] != 'warp']), + local_profile=dict(sorted(paid.items())), local_rank_mass=sum(r * z for r, z in paid.items()), + widths=[len(frames[final[r]]) - len(frames[start[r]]) for r in range(2 * v, n)], + frames=len(frames), directed_edges=len(edges), warp_edge_classes=len(warp_edges), + seconds=time.monotonic() - t0, + scope='Fresh exact forward and inverse-transpose replay over a free noncommutative warp algebra on every arbitrary input, native frame chains, dyadic primitives, zero buffers returned to zero. Physical Clifford exactness of every warp is checked by the local replay and the phase recipes.') + (out / 'SCALAR-FRAME-AUDIT.json').write_text(json.dumps(receipt, indent=2) + '\n') + print(json.dumps({k_: x for k_, x in receipt.items() if k_ != 'widths'}, indent=2), flush=True) + + +if __name__ == '__main__': + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument('word', type=Path) + ap.add_argument('out', type=Path) + a = ap.parse_args() + run(a.word, a.out) diff --git a/research/staged544-reversible-lattice-macro/frozen/clifford_exact.py b/research/staged544-reversible-lattice-macro/frozen/clifford_exact.py new file mode 100644 index 0000000000..166841a037 --- /dev/null +++ b/research/staged544-reversible-lattice-macro/frozen/clifford_exact.py @@ -0,0 +1,149 @@ +"""Small exact Gaussian-dyadic Clifford compiler, independent of gx internals. +Paulis use i^p X^x Z^z. State vectors use integer Gaussian numerators / 2^d. +The tableau is supplemented by a literal circuit, so global phases are kept. +""" +from dataclasses import dataclass + +def parity(x):return x.bit_count()&1 +def rank(rows): + p={} + for x in rows: + while x: + b=x.bit_length()-1 + if b not in p:p[b]=x;break + x^=p[b] + return len(p) +def transpose(rows,n):return tuple(sum(((rows[j]>>i)&1)<>j&1);a[j],a[k]=a[k],a[j] + for i in range(n): + if i!=j and a[i]>>j&1:a[i]^=a[j] + assert [r&((1<>n for r in a) +def basis_extend(cols,n): + out=[] + for x in list(cols)+[1<len(out):out.append(x) + assert len(out)==n + return tuple(out) +def nullspace(rows,n): + a=list(rows);p=[];k=0 + for j in range(n): + t=next((i for i in range(k,len(a)) if a[i]>>j&1),None) + if t is None:continue + a[t],a[k]=a[k],a[t] + for i in range(len(a)): + if i!=k and a[i]>>j&1:a[i]^=a[k] + p.append(j);k+=1 + return tuple((1<>j)&1)<>i&1:out=pmul(out,T[i]) + for i in range(n): + if z>>i&1:out=pmul(out,T[n+i]) + return out +def compose(A,B):return tuple(apply(A,p) for p in B) +def inverse(T): + n=len(T)//2;cols=[x|(z<>n;u,v,p=apply(T,(x,z,0));assert (u,v)==identity(n)[j][:2];out.append((x,z,(-p)%4)) + return tuple(out) +def qvalue(Q,alpha,x,n): + return (sum(alpha[i] for i in range(n) if x>>i&1)+2*sum(parity((Q[i]>>(i+1))&(x>>(i+1))) for i in range(n) if x>>i&1))%4 +def mul_i(a,p): + x,y=a;p%=4 + return [(x,y),(-y,x),(-x,-y),(y,-x)][p] +@dataclass +class Op: + n:int + tab:tuple + circuit:list + def then(self,b): + assert self.n==b.n + return Op(self.n,compose(b.tab,self.tab),self.circuit+b.circuit) + def adjoint(self): + circ=[] + for e in reversed(self.circuit): + if e[0]=='P':circ.append(('P',inv(e[1],self.n))) + elif e[0]=='D':circ.append(('D',e[1],tuple((-x)%4 for x in e[2]))) + elif e[0]=='C':circ.append(('C',e[1],-e[2])) + elif e[0]=='phase':circ.append(('phase',(-e[1])%4)) + else:circ.append(e) + return Op(self.n,inverse(self.tab),circ) + def zero_state(self,basis=0): + N=1<>i)&1 for i in range(n)) + assert all(alpha[i]%2==(Q[i]>>i)&1 for i in range(n)) + return Op(n,tuple([(1<>i&1 else 0,1<>i&1 else 0) for i in range(n)]),[('C',q,sgn)]) +def xgate(n,b):return Op(n,tuple([(1<>i)&1)) for i in range(n)]),[('X',b)]) +def fourier(n,axes=None): + out=ident(n) + for i in range(n) if axes is None else axes:out=out.then(cgate(n,1<len(selected):picks.append(j);selected.append(x) + assert len(picks)==r and all(x>>r==0 for x in Bcols) + Br=transpose(selected,r);Bi=inv(Br,r);Dr=transpose([Dcols[j]&((1<>i&1] + q.append((sum(gram[i][i] for i in bits)+2*sum(gram[i][j]for i in bits for j in bits if i>j)&1)==((quad[j]>>i)&1)for i in range(N)for j in range(N)),'symmetric quadratic form') + need(all(alpha[i]%2==((quad[i]>>i)&1)for i in range(N)),'quadratic parity') + perm=[];phasev=[] + for x in range(SIZE): + perm.append(sum(((r&x).bit_count()%2)<>i&1] + phasev.append((phase+sum(alpha[i]for i in bits)+2*sum((quad[i]>>j)&1 for i in bits for j in bits if i0 else 2]+=1 + elif not r:phase_hist[1 if s>0 else 3]+=1 + digest.update(json.dumps([x,da,sorted(a.items())],separators=(',',':')).encode()) + return dict(columns=SIZE,nonzero_coefficients=support,gaussian_axis_phase_histogram=phase_hist,operator_sha256=digest.hexdigest()) + +def lift_cocycle(G,H): + """K_H K_G = K_(HG) Z_ell. Exact finite Z4 phase defect.""" + gp,gq=kernel(tuple(G));hp,hq=kernel(tuple(H)) + HG=tuple(lin(H,c)for c in G);cp,cq=kernel(HG) + defect=[(gq[x]+hq[gp[x]]-cq[x])%4 for x in range(SIZE)] + ell=sum((defect[1<>(b-1)&1 else x + +def half_accumulate(y,a,c,d,b,subtract=False,reverse=False,omit_carry=False): + """y += floor((signed(a) +/- signed(c))/2), restoring arbitrary dirty d. + + y,a,c have b bits; d has b+1 bits. Seven reversible arithmetic primitives: + four scratch adds/subtracts, two shifted target adds/subtracts, one + parity-controlled decrement. Sources a,c are unchanged, even when d wraps. + """ + m=(1<>1))&m + d=(d-cc)&dm; d=(d-aa)&dm + y=(y-direction*(d>>1))&m + if not omit_carry:y=(y-direction*((d&1)&((a^c)&1)))&m + return y,d + +def pair(x,y,d,b,inverse=False,omit_carry=False): + """C or inverse C approximation: two complex b-bit words; one dirty word. + + Exact inverse as a finite permutation on all 2^(5b+1) states. + Numerical C approximation requires the separately stated no-wrap bound. + """ + m=(1<>i&1] + perm.append(sum(((x&r).bit_count()%2)<>j)&1 for i in bits for j in bits if i>j&1:v[x],v[x^(1<>b)&mask);y=((state>>(2*b))&mask,(state>>(3*b))&mask);d=state>>(4*b) + a,z,dd=l.pair(x,y,d,b) + expected=a[0]|(a[1]<