From 62691e395a0458ce089a1c7b5d89e74291e95e29 Mon Sep 17 00:00:00 2001 From: icekylinx Date: Thu, 8 Oct 2026 16:20:42 +0800 Subject: [PATCH 1/7] Batch recursive networks for a conditional kappa > 2^-23 bound --- CITATION.cff | 17 +- CONTRIBUTING.md | 4 +- Makefile | 27 + NOTICE | 41 + PATCHING.md | 28 + README.md | 178 +- SOURCES.json | 99 + artifacts/batched-23-note.pdf | Bin 0 -> 178176 bytes certificates/batched-network.json | 270 ++ certificates/complex-network.json | 143 + certificates/controlled-bit-rank-moment.json | 102 + certificates/fast-gaussian.json | 132 + certificates/prime-field28.json | 241 + docs/reproducibility.md | 189 +- docs/research/batched-review.md | 45 + docs/research/current-status.md | 149 +- notes/batched-23-note.tex | 139 + notes/batched-algorithms.tex | 265 ++ notes/batched-assembly.tex | 155 + notes/batched-bit-rank-accounting.tex | 138 + notes/batched-bit-rows.tex | 123 + notes/batched-complex-rows.tex | 141 + notes/batched-path-budget.tex | 68 + notes/bulk-complex-guard.tex | 168 + notes/chirp-scaling-correction.tex | 30 + notes/complex-circuit-construction.tex | 218 + notes/controlled-projector-basis.tex | 206 + notes/fast-gaussian-resampling.tex | 230 + notes/prime-field28-construction.tex | 260 ++ notes/projector-batching.tex | 152 + patches/batched-23.patch | 4099 ++++++++++++++++++ scripts/batched_bit_rank_moment.py | 122 + scripts/batched_network.py | 174 + scripts/bulk_complex_guard.py | 54 + scripts/complex_circuit.py | 454 ++ scripts/complex_network.py | 120 + scripts/controlled_bit_rank_moment.py | 88 + scripts/fast_gaussian.py | 180 + scripts/make_batched_patch.py | 340 ++ scripts/make_complex_circuit_patch.py | 131 + scripts/make_fast_gaussian_patch.py | 324 ++ scripts/make_prime_field_patch.py | 69 + scripts/paired_complex.py | 19 + scripts/paired_triple_circuit.py | 112 + scripts/prime_field_checks.py | 231 + scripts/prime_field_circuit.py | 136 + scripts/prime_field_network.py | 107 + scripts/prime_field_supports.cpp | 93 + tests/test_batched_network.py | 66 + 49 files changed, 10450 insertions(+), 427 deletions(-) create mode 100644 PATCHING.md create mode 100644 SOURCES.json create mode 100644 artifacts/batched-23-note.pdf create mode 100644 certificates/batched-network.json create mode 100644 certificates/complex-network.json create mode 100644 certificates/controlled-bit-rank-moment.json create mode 100644 certificates/fast-gaussian.json create mode 100644 certificates/prime-field28.json create mode 100644 docs/research/batched-review.md create mode 100644 notes/batched-23-note.tex create mode 100644 notes/batched-algorithms.tex create mode 100644 notes/batched-assembly.tex create mode 100644 notes/batched-bit-rank-accounting.tex create mode 100644 notes/batched-bit-rows.tex create mode 100644 notes/batched-complex-rows.tex create mode 100644 notes/batched-path-budget.tex create mode 100644 notes/bulk-complex-guard.tex create mode 100644 notes/chirp-scaling-correction.tex create mode 100644 notes/complex-circuit-construction.tex create mode 100644 notes/controlled-projector-basis.tex create mode 100644 notes/fast-gaussian-resampling.tex create mode 100644 notes/prime-field28-construction.tex create mode 100644 notes/projector-batching.tex create mode 100644 patches/batched-23.patch create mode 100644 scripts/batched_bit_rank_moment.py create mode 100644 scripts/batched_network.py create mode 100644 scripts/bulk_complex_guard.py create mode 100644 scripts/complex_circuit.py create mode 100644 scripts/complex_network.py create mode 100644 scripts/controlled_bit_rank_moment.py create mode 100644 scripts/fast_gaussian.py create mode 100644 scripts/make_batched_patch.py create mode 100644 scripts/make_complex_circuit_patch.py create mode 100644 scripts/make_fast_gaussian_patch.py create mode 100644 scripts/make_prime_field_patch.py create mode 100644 scripts/paired_complex.py create mode 100644 scripts/paired_triple_circuit.py create mode 100644 scripts/prime_field_checks.py create mode 100644 scripts/prime_field_circuit.py create mode 100644 scripts/prime_field_network.py create mode 100644 scripts/prime_field_supports.cpp create mode 100644 tests/test_batched_network.py diff --git a/CITATION.cff b/CITATION.cff index 4491d3e9f9..742d36a12f 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,18 +6,21 @@ title: "A sharper exponent for integer multiplication" authors: - family-names: Colkitt given-names: Douglas + - family-names: Chen + given-names: Zhihao + - name: eumemic + - name: icekylinx license: Apache-2.0 type: software repository-code: "https://github.com/CrocSwap/integer-mult-bounds" url: "https://github.com/CrocSwap/integer-mult-bounds" abstract: >- - Exact rational certificates, source patches, and research notes for conditional - improvements to OpenAI's integer-multiplication manuscript. Compact dirty-control - fields remove the simultaneous layer's spacing penalty. Together with complete - temporary reservations, local exceptional repair, a separately sized complex - network, and retained refinements, the supplied written proofs support - kappa = 83/10^12 > 2^-34. The complete upstream algorithmic theorem is assumed; - the new arguments are not independently reviewed or formally verified. + Conditional bulk-recursion improvement of the retained integer-multiplication + framework, with kappa = 6149999/50000000000000 > 2^-23. Controlled rational + projector blocks and whole complex residuals give mixed-width recurrences; + a dependency-path guard controls exact intermediate precision. The retained + Gaussian scaling enclosure is corrected without changing P=34p. Finite + checks and exact certificates do not formally verify the full theorem. keywords: - integer multiplication - computational complexity diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 44f0a8fd53..a4d31ea141 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ For a mathematical issue, identify the exact proposition, source label, or inequality; give a counterexample or the missing implication when possible; and distinguish numerical validation from an algorithmic proof obligation. For the current result, start with the -[compact-control review guide](docs/research/compact-control-review.md). +[batched-recursion review guide](docs/research/batched-review.md). The [original audit](docs/audit.md) describes the retained upstream assumptions. For a parameter improvement, supply exact rational choices, the full dependency @@ -21,7 +21,7 @@ make verify ``` Include regenerated certificates and patches in the same change. If the note -changes, also run its corresponding PDF target (`make compact-note` for the +changes, also run its corresponding PDF target (`make batched-note` for the current result) and include the updated PDF. Review changes to claims in the README and note together. Finite tests should address a mathematical identity or a failure mode, rather than simply restating implementation details. diff --git a/Makefile b/Makefile index 885f1671a5..c5179366cb 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,10 @@ .PHONY: verify note audit-note tuned-note reuse-note incidence-note dag-note shared-point-note paired-note compact-note fetch verify: + python3 scripts/prime_field_network.py + python3 scripts/complex_network.py + python3 scripts/fast_gaussian.py + $(MAKE) batched-certificate batched-patch python3 scripts/certify.py python3 scripts/search_network.py python3 scripts/make_patch.py @@ -54,6 +58,7 @@ verify: git apply --check --directory=upstream patches/h46-shared-point.patch git apply --check --directory=upstream patches/h50-paired-59.patch git apply --check --directory=upstream patches/compact-control-34.patch + git apply --check --directory=upstream patches/batched-23.patch note: mkdir -p artifacts @@ -93,3 +98,25 @@ compact-note: fetch: python3 scripts/fetch_upstream.py + +.PHONY: batched-certificate batched-patch batched-note +PDFLATEX ?= pdflatex +TEX_ENGINE ?= pdflatex +TECTONIC ?= tectonic + +batched-certificate: + python3 scripts/controlled_bit_rank_moment.py --output certificates/controlled-bit-rank-moment.json > /dev/null + python3 scripts/batched_network.py --output certificates/batched-network.json --summary + +batched-patch: + python3 scripts/make_batched_patch.py + +batched-note: + mkdir -p artifacts +ifeq ($(TEX_ENGINE),tectonic) + $(TECTONIC) -Z search-path=$(CURDIR) --outdir artifacts notes/batched-23-note.tex +else + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/batched-23-note.tex + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/batched-23-note.tex + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/batched-23-note.tex +endif diff --git a/NOTICE b/NOTICE index 71becbdd19..2383b2faf9 100644 --- a/NOTICE +++ b/NOTICE @@ -14,3 +14,44 @@ as separate files under patches/; upstream source files remain unchanged. The new research note, scripts, certificates, patches, and documentation were prepared by Douglas Colkitt with assistance from OpenAI Codex. This project is not an official OpenAI release or an OpenAI endorsement. + +Ternary five-subset construction and common-four-point resynthesis +Copyright 2026 Zhihao Chen (jacklightChen) + +This is Zhihao Chen's first submission of this specific construction to this +repository. Research, proof development, code and verification were prepared +with substantial assistance from GPT-6 Astra (OpenAI Codex), as identified by +the contributor. This is not independent review or an OpenAI endorsement. +Future research building on this contribution should explicitly acknowledge +Zhihao Chen (jacklightChen), cite the accompanying note and pull request, and +retain the preceding contributors' attribution. This notice records research +provenance; the repository's Apache-2.0 license remains unchanged. + +Dependencies retained from eumemic's Claude-assisted PRs #3 and #5: +https://github.com/CrocSwap/integer-mult-bounds/pull/3 +https://github.com/CrocSwap/integer-mult-bounds/pull/5 +PR #5 commit: d3d370c34937503bd3fa63c83d505a05e8e50893 +These include complex_circuit.py, complex_network.py, fast_gaussian.py, +their generators, construction notes and certificates. The Gaussian input +scaling proof is corrected in this derivative; see the modification notice below. +Aligned pairing also appears in Bortlesboat's PR #2. Retained totals and bank +sharing appear in dleen's PR #4 and cheaper retained centers in eumemic's PR #6. +Their results and ideas are credited separately from this new construction. + +Bulk recursion and controlled tensor basis, 8 October 2026 +Copyright 2026 icekylinx + +The new projector batching, controlled simultaneous basis, mixed-width tape +recursions, whole-residual complex recursion, and dependency-path precision +guard in the batched-23 proof package are contributed by icekylinx, developed +with substantial OpenAI GPT-6 Astra assistance. Review corrections and +repository integration were prepared with OpenAI Codex assistance. They build on the retained +PR #7 finite producers and the preceding contributions credited above. +The new package retains the repository's Apache-2.0 license and the original +authors' attribution. It is not an official OpenAI release or endorsement. + +Modification notice, 8 October 2026 (icekylinx): the retained fast Gaussian +proof now bounds shifted approximation error by F=2^ceil(1.14 alpha^2). +The P=34p precision budget and asymptotic exponent are unchanged. New batching +checks are integrated into make verify. Existing attribution and licenses +are retained. diff --git a/PATCHING.md b/PATCHING.md new file mode 100644 index 0000000000..9cba15ab90 --- /dev/null +++ b/PATCHING.md @@ -0,0 +1,28 @@ +# Applying the manuscript patch + +`patches/batched-23.patch` applies to the original manuscript snapshot at +`adc7f1241b42e322a6451854ab7e4b4c146bf78a`, retained under `upstream/`. +It includes the PR7 dependencies, batched construction, and corrected Gaussian +input error enclosure. + +To generate a complete copy for review, choose a new destination: + +```sh +python3 scripts/make_batched_patch.py --materialize /tmp/integer-mult-batched-review +``` + +The entry point is `/tmp/integer-mult-batched-review/build/main.tex`. +The bundled `upstream/` stays unchanged. With pdfLaTeX installed, compile from +that copy's `build/` directory, including BibTeX and the usual reference reruns. + +Check applicability without modifying the source: + +```sh +git apply --check --directory=upstream patches/batched-23.patch +``` + +The combined patch starts from the original snapshot; historical patches are +alternatives for the same base. PR7 is pinned at +`6725c6a17b17871a35353fd29157f4ed851bc114` for the retained producer sources. +The old uniform recurrences keep their original exponents. The active consumers +use `lem:batched-chunk-swap` and `prop:batched-simultaneous-layer`. diff --git a/README.md b/README.md index b090887cca..c9b8bbe455 100644 --- a/README.md +++ b/README.md @@ -1,151 +1,55 @@ -# A sharper exponent for integer multiplication +# Integer multiplication with a conditional saving beyond 2^-23 -**Research draft by Douglas Colkitt — conditional on the underlying manuscript -and the written extensions supplied here.** - -This draft improves OpenAI's -[*Integer multiplication below n log n*](https://github.com/openai/math/tree/adc7f1241b42e322a6451854ab7e4b4c146bf78a/preprints/Integer-multiplication-below-n-log-n-September-23-2026) -(result family #109). In its fixed finite-alphabet Turing-machine model with a -fixed number of one-dimensional tapes, the strongest supplied witness is - -$$ +\[ T(n)=O\!\left(n(\log n)^{1-\kappa}\right),\qquad -\boxed{\kappa=\frac{83}{10^{12}}=8.3\times10^{-11}>2^{-34}}. -$$ - -The simpler **`kappa = 2^-34`** is a corollary. The witness remains below -`2^-33`. It increases the exponent saving by approximately **47.85 million -fold** over our preceding published `2^-59` witness. The original manuscript -uses `2^-182`. These compare asymptotic exponents, not practical runtimes. - -**[Read the compact-control proof note (PDF)](artifacts/compact-control-note.pdf)** · -[Review the combined source patch](patches/compact-control-34.patch) · -[Inspect the exact certificate](certificates/compact-control-layer.json) · -[Review guide and dependencies](docs/research/compact-control-review.md) - -This is a research claim supported by written proofs and reproducible checks. -The complete upstream theorem is assumed; the new arguments have not received -independent mathematical review or formal verification. - -## What changed - -The new construction moves **compact control fields instead of entire spaced -windows**. For `f` selected axes, it replaces the layer's movement cost -`O(V*((f*K)^tau+1))` by - -$$ -O\!\left(V\bigl((f\log p)^\tau+1\bigr)\right). -$$ - -The proof reserves temporary fields from existing address coordinates, -allows arbitrary initial temporary values, restores them exactly, and charges -exceptional-address repair at every recursion node. The temporary ranges -remain complete through padding and recursive row splitting. - -Removing `K^tau` removes the restriction responsible for the preceding -quadratic dependence on the finite-network saving. The bit network stays at -`h=50`. The original complex network is separately instantiated at `h=25`, -and a generalized stopping-depth guard completes the new parameter witness. -This is a change to the movement construction and its proof, beyond parameter -tuning of the preceding algorithm. - -The exact minimum assembly margin is - -$$ -G_* = \frac{333833}{4\cdot10^{15}} - = 8.345825\times10^{-11} > \kappa. -$$ +\kappa=\frac{6149999}{50000000000000}>2^{-23}. +\] -The remaining bottleneck is the complex layer's saving. With the **fixed -`h=25` complex motif and retained Gaussian/leaf inequalities**, the scoped -ceiling is below `8.369598075e-11`, hence below `2^-33`. This is not a ceiling -for other networks or integer multiplication in general. +The construction batches large rational projector blocks and whole complex +residuals in the finite networks of [PR #7](https://github.com/CrocSwap/integer-mult-bounds/pull/7). +A controlled common basis, mixed-width recursion, and an arithmetic dependency +path bound supply the stated exponent. The conclusion is conditional on the +retained upstream multiplication framework and the written interface proofs. -## Evidence and scope +## Proof and reproduction -| Component | Evidence | -| --- | --- | -| Parameters, logarithm enclosures, final margins | Exact rational certificate | -| Dirty-control identities, inverses and repair | Finite exhaustive cases and seeded tests | -| Wider-control tape bound, reservations and recursion | Written general proofs | -| Separate complex arity and precision guard | Written proofs and exact accounting | -| Source integration | Combined patch, reference checks and manuscript build | -| Full upstream multiplication theorem | Assumed | -| Independent review / full formalization | Not supplied | - -The [review guide](docs/research/compact-control-review.md) identifies the new -proof obligations and their tests. [Current research status](docs/research/current-status.md) -is authoritative when older notes describe superseded barriers or hypothetical -witnesses. The earlier artifacts remain available and unchanged. - -## Reproduce - -With Python 3.11 or newer, Git and Make, run from the repository root: +- [Proof note](artifacts/batched-23-note.pdf) and [LaTeX source](notes/batched-23-note.tex). +- [Exact certificate](certificates/batched-network.json): rank moments, guard, + 29 strict constraints, and seven assembly margins. +- [Combined manuscript patch](patches/batched-23.patch) and [application instructions](PATCHING.md). +- [Review guide](docs/research/batched-review.md) and [source provenance](SOURCES.json). ```sh make verify -git diff --exit-code -- certificates patches +make batched-note ``` -No third-party Python packages or network access are needed for these checks. -They regenerate the certificates and patches, run the tests, verify upstream -hashes, and check each patch against the pinned manuscript. The second command -checks exact regeneration on a clean checkout. - -With Tectonic installed, rebuild the latest note using: +Verification requires Python 3.11+, a C++17 compiler, Git, and Make. It includes +retained producer checks, the new certificates, regression tests, and patch +application checks. The PDF target requires pdfLaTeX. +For just the new arithmetic and manuscript patch: ```sh -make compact-note +make batched-certificate batched-patch ``` -The output is `artifacts/compact-control-note.pdf`. The first PDF build may -download TeX resources. See [reproducibility instructions](docs/reproducibility.md) -for applying the combined patch in a disposable copy and building older notes. -[GitHub Actions](.github/workflows/verify.yml) runs the arithmetic and patch checks. -Passing tests does not establish the complete multiplication theorem; this -repository contains no full multiplication-machine implementation. - -## Earlier witnesses and independent patches - -Each patch applies independently to the **unmodified** pinned source; they are -alternatives, not a sequence to apply together. The -[result history](docs/research/result-history.md) records the earlier mechanisms -and scoped ceilings. - -| Patch | Conditional saving | Scope | -| --- | --- | --- | -| [frozen-154](patches/frozen-154.patch) | `2^-154` | Original network and recurrence exponents | -| [balanced-153](patches/balanced-153.patch) | `2^-153` | Balanced assembly parameters | -| [same-network-129](patches/same-network-129.patch) | `2^-129` | Original network, sharper recurrence comparison | -| [h46-111](patches/h46-111.patch) | `2^-111` | Smaller network, dyadic parameters | -| [h46-109](patches/h46-109.patch) | `2^-109` | Rational recurrence saving, strict final margin | -| [h46-108](patches/h46-108.patch) | `2^-108` | Variable stopping exponent | -| [h46-rational](patches/h46-rational.patch) | `5.8e-33` | Strongest supplied parameter-only witness | -| [nonadjacent-layout](patches/nonadjacent-layout.patch) | Original parameters retained | Routing proof and revised layout cost only | -| [frozen-nonadjacent-107](patches/frozen-nonadjacent-107.patch) | `2^-107` | Direct routing, original network and recurrence exponents | -| [h46-nonadjacent-78](patches/h46-nonadjacent-78.patch) | `2^-78` | Direct routing with the h = 46 network | -| [h46-nonadjacent-76](patches/h46-nonadjacent-76.patch) | `2^-76` | Direct routing with tuned dimension and stopping parameters | -| [h46-shared-side-75](patches/h46-shared-side-75.patch) | `2^-75` | Stage-1/stage-3 side-role sharing, routing, and parameter tuning | -| [h46-incidence-67](patches/h46-incidence-67.patch) | `2^-67` | Rectangle incidence circuits, full auxiliary sharing, routing, and parameter tuning | -| [h46-dag-63](patches/h46-dag-63.patch) | `2^-63` | Shared intermediate sums and reversible role allocation | -| [h46-shared-point](patches/h46-shared-point.patch) | `13*2^-66` | Cross-group sharing | -| [h50-paired-59](patches/h50-paired-59.patch) | `2^-59` | Paired sums, stopped guard and tighter Gaussian setup | -| **[compact-control-34](patches/compact-control-34.patch)** | **`83/10^12 > 2^-34`** | **Compact controls, complete reservations, local repair and separate complex arity** | - -## Attribution, citation, and license - -Author: **Douglas Colkitt**. Research, implementation and drafting were performed -with assistance from OpenAI Codex. The compact-control proposal originated -with a separate research agent; the supplied note develops its tape, layout, -repair and assembly arguments. AI assistance is not independent review or -endorsement by OpenAI. No priority or unrestricted optimality claim is made. - -The original manuscript is by OpenAI, pinned at commit -`adc7f1241b42e322a6451854ab7e4b4c146bf78a`. Source URLs and SHA-256 hashes are in -[upstream/manifest.json](upstream/manifest.json). Files under `upstream/` remain -unchanged; modifications are supplied as separate patches. - -Use [CITATION.cff](CITATION.cff) and also cite the -[upstream manuscript](upstream/README.md). Until a release is archived, include -the repository commit used. Licensed under [Apache-2.0](LICENSE); see -[NOTICE](NOTICE) and [CONTRIBUTING.md](CONTRIBUTING.md). +The bit and complex savings are `246/10^9` and `7/10^7`; the precision guard +exponent is `11999/10000`. The final absorption gap is +`362000001/80000000000000000000000 > 0`. +The retained Gaussian input scaling proof uses the corrected enclosure +`F = 2^ceil(1.14 alpha^2)`, with the existing precision `P = 34p`. + +## Attribution + +Bulk recursion and this integration are contributed by **icekylinx**, with +substantial OpenAI GPT-6 Astra and Codex assistance. The finite ternary network +and paired producers are due to **Zhihao Chen (jacklightChen)**. The construction +builds on **Douglas Colkitt**'s compact-control framework and contributions by +**Bortlesboat**, **eumemic**, and **dleen**; see [NOTICE](NOTICE). + +OpenAI's manuscript is pinned at +`adc7f1241b42e322a6451854ab7e4b4c146bf78a`; its files under `upstream/` are +unchanged. The repository and retained source use Apache-2.0; see +[LICENSE](LICENSE) and [upstream/LICENSE](upstream/LICENSE). +Exact certificates and finite tests do not constitute formal verification +of the full multiplication theorem. diff --git a/SOURCES.json b/SOURCES.json new file mode 100644 index 0000000000..e78ff7ba5f --- /dev/null +++ b/SOURCES.json @@ -0,0 +1,99 @@ +{ + "package": "integer-mult-batched-23", + "date_utc": "2026-10-08", + "headline": { + "kappa": "6149999/50000000000000", + "dyadic_corollary": "2^-23", + "framework": "conditional fixed finite-alphabet, fixed-tape integer multiplication" + }, + "retained_pr7": { + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/7", + "commit": "6725c6a17b17871a35353fd29157f4ed851bc114", + "contributor": "Zhihao Chen (jacklightChen)", + "role": "Ternary five-subset network, paired complex producer, frame schedules, and finite counts" + }, + "repository_main": { + "url": "https://github.com/CrocSwap/integer-mult-bounds", + "commit": "6e564879f51ae16f23d392e9e196c605f36d90df", + "contributor": "Douglas Colkitt", + "role": "Repository framework and compact controls" + }, + "upstream": { + "url": "https://github.com/openai/math", + "commit": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "paper": "preprints/Integer-multiplication-below-n-log-n-September-23-2026", + "manifest": "upstream/manifest.json", + "license": "upstream/LICENSE", + "role": "Retained multiplication theorem, machine model, transforms, analytic estimates, and rounding interfaces" + }, + "preceding_contributions": [ + { + "pr": 2, + "contributor": "Bortlesboat", + "role": "Aligned pair groups", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2" + }, + { + "pr": 3, + "contributor": "eumemic", + "role": "Compressed complex producer", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/3" + }, + { + "pr": 4, + "contributor": "dleen", + "role": "Retained totals and stage sharing", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/4" + }, + { + "pr": 5, + "contributor": "eumemic", + "role": "Fast Gaussian resampling", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/5" + }, + { + "pr": 6, + "contributor": "eumemic", + "role": "Aligned bit circuit and cheaper centers", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/6" + } + ], + "new_contribution": { + "provenance": "Developed by icekylinx with substantial OpenAI GPT-6 Astra assistance; review corrections and repository integration with OpenAI Codex assistance.", + "components": [ + "Large-projector middle-block batching", + "Simultaneous controlled tensor basis and aligned corner batching", + "Arbitrary integer widths and bounded outer row padding", + "Whole-residual complex recursion", + "Dependency-path numerical guard", + "Exact final assembly beyond 2^-23", + "Corrected shifted chirp input error enclosure, retaining P=34p" + ], + "contributor": "icekylinx" + }, + "license": "Apache-2.0; original LICENSE and NOTICE retained", + "integration": { + "retained_source": "upstream/ remains unchanged", + "manuscript_patch": "patches/batched-23.patch", + "instructions": "PATCHING.md" + }, + "proof": "artifacts/batched-23-note.pdf", + "exact_certificate": "certificates/batched-network.json", + "algorithm_specification": "notes/batched-algorithms.tex", + "provided_archive": { + "filename": "integer_mult_batched_23.zip", + "sha256": "6aad9cc551c5fa5cf14e8708e6f2802b33f6233b169c742b205d0b2b74a44e8b", + "status": "Preserved separately; this repository contains a curated, corrected derivative." + }, + "review_corrections": [ + { + "source": "notes/fast-gaussian-resampling.tex", + "change": "Use F=2^ceil(1.14 alpha^2) for magnitude and shifted absolute error; prove P=34p remains sufficient." + }, + { + "source": "Makefile", + "change": "Include new batched certificates and manuscript patch in make verify." + } + ], + "curation": "Retain required producer/generator dependencies, construction sources and certificates. Omit duplicate notes, obsolete alternative batching witness, archive manifests, incremental self-patch, redundant dependency-only manuscript patches, historical standalone PDFs, imported historical tests and local audit outputs. Existing main-branch files are preserved." +} diff --git a/artifacts/batched-23-note.pdf b/artifacts/batched-23-note.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f0d42d430159f3f46dcf447ecb5df8aa9355e208 GIT binary patch literal 178176 zcma&NQ=27R)MXjAZQHh$VcR-k+Zjg23EQ@9E5o)kY+LpA^YlemS6zH}`xlHo*H~*( zDoaQ)vNCbPQ6Ao2y~43_ldzCDn%ck#2rx@o+qnT;n5FDY+yD{)Ge>g(vpm4T(#?v5 zm7R-MNC?i=%>`g$59hU!qPZEnC4u69LjQT1;I#Mx4^xa73j06 zLDHZVW8zmA1q@Y*I@37Ng3F3H(f`fz-PDH2GvgoGR}WojKzSEd8=L>?Q}b)ZwoFp& za>2RG-D(Byg_;`nTja*?tKU$LWT?TAW}#1~jA}vNbs@5Bkz_Py@@_A3JH&J>B&) zGX=x|_7ZhI`In*ew)B4O6GS+``#Hv9Byd3xtx6 zf3d$10;euhrTyO!lR@Z%BzfJ^&<8rHW7-=nkb8d)?P+Z}rYk#{8a0U(9!gNGX=hBk zW>?QRR;&XqI;47tkjOs~EW?+d(=$~V@TlfKd2tQZ$jw*ezGNbz)8@C>Y=M{I2yQWZ zL5pD+^$eW{6;Uh$$5SX9D~$ee$jdH5$L@O5nmaBfn?BjI8#Ys>0U0d)FxHe<0;ckS zfI;QXZ)am=;Te0Mwn-ocifD8-{zt9#Typ|J5g*yb?Wa)0#{7LpZKjL1fp{)KsRQ1r zu9E#L=#@rONw;;lqeliNmEa0-6`OCR+#&u3kH^@b>fyf`Y&#oS^%b|LQ$oMCHe9IU43mC2 z<6urafE2-pq%`az)PXDauZ~Uva)OBS^ zuVEC^VQk*W{rj(8r2oBw2bu3QyT7@OMXipscC#>J!lvJkuo3A@gdH8y-yLElMI$am zF8D}JCZ2iW1A`9)8v88oz7Yb&@<^L$Y5c6})Q4uWeakOHi3Q*Ic-UY&w=^MDW7kuV zk@*{kvQY*@Rv%xU;6CG`*8b1sh+}-(Q-`x?J&p43fq&|4O9u71ih+hH#MYh?X!?DG z^Vs@VAjBIe?5j|-h#xvW%nI3}KZVGrs&NLgO)mnXgo*)PQ<(nx89(F&7kYSgai-TMXu-uXZ*+D*zhO2rA;d_8q>w8Cz5ayDMkb*(@@$9{RhcRPq zSJ@4?m_EU}tY5x}j3hY#kyjp*4oj%`v^60x6xhU%7O!PU?gHruz7@Souvrq%UpiTk zQg1T&B958xJEr`wu(SGoGW-JbX3lc1V9@Qms2rXe;7vb-?g*P<^P zyix1U1JtA{0vi?i(gRjR6$C@;ZP;O+pRj*Gj*nOh-~bNh|1V?zd;LFD=3xIH;+ggT zi|1u+ImZJol-?JuQyOqi`d*3qHAD|=y~jBw7hB(az^Ep#c;8LD_*+4KD-vQR z19OHNA59OOz-0oo6t&Ig+%|V$yY633HXAPILp~_lqOCb6TFe8&Xx`btv*gUnT z3>aV{#P7e6m3U9I3L1xayW@G;(E0Kh*dh3OLM4Jij{#t~_;9^tv zLz{u#<})s{%__5YE)f=r{31s-$PpM=%JDjUaUF(8&`w9~0WYgSnhH+jtOw&_o^ygh z$Ab=Ju(|Cj!n^|gX3E{8^0S_R?fEHtmtop3`#@;OQ?k#v-YtYX;d(ctfR`CtpKg7P z^kmYox-M0`MC&umE3~)Y#}j)3?)2Ouo$Z5zjVVf+!&#g<(=!)eYz{cp8?cu5w;eJx>ee;lL=mH8w;WTU{KO0Rv#Il(3WO`NJE zfUSDwURbo%Z7pgSbh!ww*~qrolZuP@1mE|Ev}}rxP93~0umK*tED)~Q=~PS)We|!m zhy)00x9oacp2!ubvnP89U41x30GB7pQoJo64z^~IQ605VuxPv|9G&l~0?3=C!7JoY zqv?odQ?DB#gmNvtHq$hPDO1x+TU}4LeO>+*$bTuwb*R`;w`Z8QVsXPYe%ITp*F-d| zUyKRh*t{^_lg)VVQybKz(9mW1NzUo))-6pA+QQ@6AivT)gBCDoKeu_=zIY6BsZgH@Fv0X75!|H+x zRbX)C=L&{~dlE@~>E2Bb#Q@N<#fc;xM=Ud!YH-hLTz2N6+9&?4RKq zJP|W2#wdJo<(Cn%<9#A-sv$VLucvsWEEwlFL)p$&MB@+l7M>i3*cFXa1_!SuYsFB& zD|t>{yt<6LE5LyJN88X<}g&vPK0w$Uw|% zc$~JyOS52Lf8BLDDoZr*C~*0Cy{{t~Xl;}?kC}W7?BG<1uZ#l~gBtV%>;6KZ#$$MU zZD+r9b0RQ-i~L-R4%6;xW>G!H!L)5gOp|Ee<>6wp8d@}W``M&V6WE9DHmM~RmZl$A zxq5~_%g@iw<$6L@IU~dRnjRA(x|7RGO)4)cwqZJW1UBzki~-M#l$?A2DZ6GFgVs$wfbfsk8w6x^ALN{d}o)R-PQM1AM-i{nLAZM0r2l{2{KPikE04+)>RE#*iVaQ&Vk`v^uOMp-)F`zx3sRr zll2I0_8!QAnDFY)t$4(ih12@YGrHA&4%fysDh^7-oxYXZEl1z#oB)1x1HIva*by}x zf8Ilrd+SR5V_k1li+6u-f&!V>?>AfBz_33Q49Uh*m(Q6;ityrmjUDaFvLE`=XGew0 z;!pH5B@lvivrVX&HQiJ1ra1OG2%Vvned5BBG7~(Q1!;@Eo30x&c#~s(-Pn zbojB729Ha#6}HB0NRL6!EXlDIHtO@eidhwI8B=OC1v2oidRgn5&yT64s<0OCO840Cc{c4!z-krb6WAOjj zrwU|Cpbx|rQD)Mv6+Ahd*t*i>@?3cb6y+HXo5Wd5DX7Ja<2()aIG>38dBGCMo~pqL zc3RUeh%4QD?yqU;j>r4HRvL7*ztQk^$s~@=u5ypY7(973Ema_@7Ntw0ALBG~dwxfS zu98>&y$1Am=Yj46F9FkhJ*%jN=}{jPjM7W31~GEN9dJ*t-YODJCg(IrKZOtV^hdo@ zSNHcO>qxSWK=yyUJTY63(4+!;O)Wz(2P341Mu4B`63Dp#xg4;ECO=NX?;p!J8`x~% zZ{rC{;K~{AB{&<}*GJ79V6TMu{WG6Kd`^b(=MtdRS2225L<(zTEDZdR$uMwwWw;}x zk@K?zeQ%q_Fb;!{w~e#=ek)nQy;vn9BdEW=7J(v`&&$HAy&s<|q>ez} z5i|z8?_rlClpl(!wLaJeXa! zcWh;2)7oQRwWA4~=pLL(w(bL6=UoO211Jo!zvH^g@uT?yGS0y<{b&vj%us20ySMb& zNS!>bCU+20ULt<4oKk~;)ObIt%)Pw9W~=IOJg#7XQqK%E)a9a(2aanv z<0)zID=>S3yngX5d_FHS%K*{>PVl+IP0N!2)L|%{3jm&&Wq%SMU5~Wy;4HcPNb1!ZBCfKPy(?D$J!k32`P|t^u<9~ zAXU2Wj{Kj2Mw*~M^?lfpfu8F89LCe5e~eVbxssZE@Uj(IfuocE=@|)zultF_%7{bs z8UvVJrse5d0G0V9DzR;$H4-<^rw^7mlot&RNj23f8KH<591!(6BRD?*r@|-Sdnq6i zEtf{*O6uH1$X2e2Ncx<0PR|MybxIqH+9&Fe zD+ijcia&l~(e+QH^0usmKI*C+wwyW~$psSXF=MJI%hm`7D5uTPR>8G6sL$D%Hw`Nl zG5F&YUvZoPfs~P|(=Kw=qTCdWc<^}vUc^NWT^%Dnp4x<4r*M~dnXJrNjyCPKRVPfu-N>Qo0i@YmdXWp=&GI6aBO(h8;9hlK$V zHt!UNWRS`Yi!bBQ%&JT3zj-Z_KUnMj^XjB{tE^b_4;Zk$8fA^7TQ|?BPlzOOEv6a6 zG-Xo}kF1vcYXG(ChG#FjwQn1wE|V7 zr!mVA_8o`{@E~4J)7JZ9boMQ-prD0-(NYg@rBf&!|)2Dc#P0Hr=BzS}7rayxLMc!7e#q2g2DqM4Ck((?=o`>a^DV1Ajxa zqKur7I)ZDILg8~2fo!IRQ;N$uad?w!z;7MxvLIrqGbyxz)otCg3ae^5Nj*DTN zF%?ZuS)J`Syp)@4XqZ6&%`$uYh@iT9D?vIAQ=w6?g&Hm9!)&!6;F|;^{jDrLXi}liWk8W6xrAglHFV;q}r9pTP-i4u#vB zggl)Dexd*UgtIO+jP=D9)bT62GsE5OJN|tise^TtfF9|2V356@ZQbSAKmbG}Xn=@1 zD3DlX*yhUGsf&>dygB2+sl1LLIv{@cN-)h?Ol|A$_Cs8BF65+W_R$)5QSuCN8%!5K zm&8jaGAXo4E56yyvA^J!03Al?5@O8?80B@VsWPMNEJ}4qg}z}<{AYZeSWAzK907u` zk21VrOMYM+3UHW?_%CVfon5yx7o#0*&Ii!`%{ZmcJ2rAvu{S?UNhhI{gY#>BjwdG1y@Y42DIOp`+hP_!Mm$V9~G7a80SvbvoR z@UrCFYD9R6(=*p#P36`a=ul~+iGVBwXX@XzATX{%)1Tnl&o|s1MVC8mv{71SrLr0n z#rLWa3cyoMflrcUu&V=o_||D1qX|dBfylmnmjvf4&=?RCRb*eH8}$lD3PM0X)~V!u zs^ymH2>u#5GN=0CRz>QH+O$A#NQ42-&(^WXDGdjI^%-eR3~g+re5gIPP?9 zpLQfH&)`EtAh`yxvI!UZqYUs7yR`7o^9%4~=`f}j2%1sZz5*_9 zc{H~^{$(L7;HS2q|40~cs#cobY?7u;O9RMNKtv$GGiodRx?oeACy?8`tg4sC( zEE96WR8I{0B!5p>{0r8=w*RSD(LN6C#SlQp~pD`}X;(Jsf%rhR=e5MO{U02kUG_NBXww-Z6b zvm|*k)6aef(G)ipMC0Q*p*bqO9dOTc$ZbxtOYKTT!Lel(FIJFe3V7V}+{g{C3$5)=CJ*+>H3W z$Ya@dG>1>jmWgMVajGCNjh(A6?ud>MaOI2h2xk9DMv{k)%~9J}b#~le5r4x^O!9R6 zp94A<%m2iiae(J)NY@QPhChx;^q%1~OM-Oz_czi7RwJi>6jSyNRkBqaS>})x{ZFZeBB8D;y}_-|j7`e7+tnD_FH()XCLu4x9za z`_#b0DXSta0%}0|$2Gs0w3P#OjRsRpB8QujI6i9*7r!2QtU?~ETIdMgmWLkM~Kn>Y6P+|BR8hU;dP+A z{VD->d;8WCA|X8q$t8aZ3&e5&kQteOY?)b0zQcRit?^ znGh+LML4l`ibtD~(zVeu7;y1-gT2=z@kD|ib^W3W@XXf1GPs87%bMWdx%swZo9>am z+#4vkGhE^LN4&i}1jg4THDHj1{^fbi$7E#sZ^g3DsB|t}aO@eq_6kM>@#?C>#j4lU zrrr6MK?^;8dhr~Eug7hSIPug4yfFTcs5$k|yRygYHTGwnLx4mWnU|)|*FyJ09IDkIOC#q&cVZRvU&HToy@uITJ;0(7q-~x9t0U6g`@A_sdcf}z6 zW2{~vJ>3%8%7;cznA8gCz+p1$K2RQ?$5l%r*D9?Ap$yJTO&9(7RUz1fW;%sUWgg^8 zTg-Nz022)!u}|g>^K?14E|-CRl5?43HCxoumdb^SLM`CY&fCszs5rBMqXb>B##OAH zYtFY8sN%ym{Z`2cWadO*x8ZLDd1(2-|B8g|)}acLBBk`>`(7^mii*bWpa^~|WmvA# zL`a@*KchZrO?vpT%siju@b8=|CE=x_)=bX@oi^TYPtifgl(=YVh>;qoEGNp>xOx)M z_nt;T_XdqxuL(j=91;YvgbbuF2Y4)42;!5Jn;>9Km!$Ne})|q4g3H0{w+g7U0O(fAwlVT?1j1V;Xz)KAH7ie!8|8XzX-a>);mBfCD})amOe^%2wx&1 zL$btin?*TAEK8}B1zrM=m$z%r6^)--?Fu*6y{;f^g=Feez=xRgakfE8VU61s+Fj2A#y|P$#2!(pa&vY$fx7_n6Dj0 zA2C5rhc(&=?E{3MQ7J+zAIQpGA>aQS7vu7OjjC2bpTZa_Fh`j@$poo)BosquzHq%o zMJeLmhz|Q@Ecr@A8JY=1W?D9*kjgi{G@rh-@&7aD4X%htcsPKt0t-oEryZzPD4B_% z1bQxe90~cDMT_Gmh%e^q^(xBabI>-08r0($L&k7gV96Gg%`nMl?Ti_-STlLeSOp*i zF6>yf1zcI{F;e&y!1zb@O2!ey&;PDNXdgM9WO|WzQLHc~4or0ntcq0V@Kz_6X~97t zZ4>x7!fN&j9@~r28IlpO@lM z?Ng{GXj5LNiCz}6hJe8b_ODhLM}VznBa=nLzcnj>0h9%Lu)K2jSl~+kJg!~#ZhozTuM?;3n}RSOugOH$|0BIL zcdY9e9dpfwYyJocGaX!E+J^O2)KUh_*ov}jyI0;FK2v#3rj0gf62qr_&v;t?x~Z0s z{|fxN)(X?O-t1Rl|h?Hx@o4E*3Lby=&`-<2M=_HX@LI^ck#Y z>4IcT!gUTVQ)6TbLt!85$qLGz;l`o@n=*iTyqw;wmXxyMCia)e@f9Y8jn&MwXh88V z-(?yJFlY65y>`h6PKi|?HdC4QM|H-yA4RX7pL{L7Uw|ber3HQ~DXf|4=)^3eSHII$ zl9h!q6Jf?AV!1KNZvCm>P~%#@V>DZNvl3#z-l?F40?od0UI#`KhPc*Fi@(`rmU+be z>Wop?^xcghU09i<6&4!yHC4ZB+DHEzvDo74X6Kx(Xu3B_!*~@j8yXr#5eVgF zjpq$ui>phuB{L-8Of!u6A*wB4)2h!*Z`KW<=G*j;9MOc~Gz^ zgbP*cos9}6Ta3gktE3>jCJR?Ad*9(cQ`$4^l|H6b(iTp}s>VIYPtFiAhuw=-78h2A zuIBKzB!#FEh}z{F;OTvwD#NNg_`+=HczNZ~ zG@Kyqk3oaqxHJD1Q|iw`r;^96pitT)Jn)`dx|4ScN~Vu%dR_VS^y zv#lwf>4mmq#}YT3H6gm!n$2R%OrisK4t(5)x>NdCa`FiY;WQ!|j9S5V zu3cDjMiF$&oHoVAwlkZHcK+3VgsaPPF;a&%iVI=q8F_E2Oxux!83}a?GrUdOqkkRX zg4Co}d{``y!YK2*N*A!`G9xrvUg;`ip2eS>=b<*d%xqlim3#HwI}A}U`$UZzNX7sS zF9kUmDRNCaG1&>>m|d@C`dd9YP=;oE5^EzSW&hm6bV6mNK;{8%4^#SAtBM zOyOq8_=$V#^R~zu3ecCtT^3I_&4iFCrtjY^E7poKqHIknw3~}4@fT8BQV7DNHnn*` zZ@B}r70k#^H(sO92-X3SefL>{2F|GRmMzY!fV23FQaQn0+C+K_AU+=HK#;d>@g7&e zTwe67z+}s@a0xqfs^iDamq+nE$3f)~z#L#w-x|Krv+Obz44|+dj#|l;*>Fb*0`bU# z5AX^rzRl+!Bddjy{f~N>xsf$O3c`H?fDr5iYE>)?8v?dfyQ&e=96a!1COPjAZ|*YO z$~u(96u*8`0R&dv6tSDkTVNSH)FspI3(E<`qFyvdJ}9sv2vv0Nywhh2KrP%?us)n1 zryAA?_44c*yfy%B_Ft5mi_{#YQ-~UTOtwjt&&qpGtTv-G3r_+BDh)!c4^?u<{aHdQ zGu7h)$*|NaSeKmBwB&RieKM6S@s5JQ(fy}C6+;pmSV#O!yNm^S9ZW4 zyI=t(Q2=e5(pbvu>+|DYD6yp|{@&us&-cIb!R_@zQqsziIp;_+Uo;aMGo?0x5 zJc=h4lXsuk-S4a#ay9mf92zQchJ=D!+nU1Sbyi@-vzl*q2$%=p{OY-t04r1%y>xWv ze0-v(u%pS(5i5r?WriLlEIIUv4>&@BXbp#0e=#Z&1}$?@%c+=44Za+Z-H6aE2%VkM zsXhzdrVzzm#i$ZIQcOH(j*0+@+1wIT{yURnDCGq1QPzpKH}f;cWqN^ucS%(@-VjIpEHnM&?HPxD18Q=;F)u1mMt{Be%dwV(c}L z5o>j$lig)*%2I1o4YbX&bcKBBD+U^n5R050*3C?zC2~iRV?~j zbXy1sNTJYpVqH~YQif!M)Ft08_PBWr>xH_*# zS0`h{dBrt7-h97W+W>AAm7<#uf|=)S=?_9@wvpBm7VU?~ZuWcU_88<0|9izo*pMAZ zb~0>DAZO#;#G;H|_MV%_&ep&u7H_l4R$bi72+DmgJ^jZ5yO(9Rk$qAR1fE;iAJ1VV3T%J98>KNd{r!p^ zMC2@hv&shc0+=58Sa=tp*I@>ndN^t+%szL6`2C2pm^OQEYMAodT8F}a0O9XSIQA&7 z+0dLYlhP?XpeLznvf##nYb*T;8`nE6%vHYq=xk(i5nL{&`2v}we4*>fOzTMl`rT$l zBhDb)EBHo4T}4dnAva*(V4E>7%of@P@j~+4{It%PdFzhHs;TP5eeI9IFT_*pl6>_w zuksE1EoFZ%yGn7%;Q2)@z~bDbfx&g0{dznU3?*DGM0y=;8u3M(=xBI;j*r2Yx9%#;-+N}nh3Mih_lCcaXClgNr&>bveL_7p`kaA zE}!zaJ9k3MO(JBD>4umwi713tu(*-ZGG2lZyc@-7R`Pn1=-dkFOCaoW7>oXfBs`s= ziO9Z)>V&&5LAkRKu8`pJ5P0j7kDiACVJHH$eU};WCWRBvzcq(}!vgQElDY>x=4x6X z2g&NJtpIk|oCgPjnk2KdesO$QihQA=H3>_bTPq1-Vo?6&b3=<@VZs>JWmna8oPpn+ zvc(isS|dm*KCb5+Ew1UUOn6OE#zhRpsN<8wGPa=V13p?f%^q&F6+BZiJK(Q6<72=!dna>H)?N+OG;* zHoAoJ+ikuBM0lLy#nc}`Zp_FCx#st4sxj_bpu9-AV5{r+(zvsyaNztRNRp7b_TLQJ zVu)_8gM!Ql6s7dXCx69mcw|5MbC zpm-L}jih|k`uV-uWz=N3b;43=kCq3HsLMbEM8oGZ1HWw@_J;Q6BmKuhCnkW$nb8?j zx3&=jAcE1(LZhil7{m*MrWqBT%6LvgVFqkiB zzbbHH@VvKr5BH#*yEL?30=?>uK&Hg9WyIQ~$w_f>9E376gw=U1;5Dr*f7yO|ubjC0 zdSJ0`i3TaLLUX)Vf;NXs3{nSLeAq0eTp>SxuAz3m_mcfHA^!9GM@J%E3PVv&aPiV& z>rMYvzM%g#3Ku3lh*iT2lpp!luyB2(L1QMs7Mi`5DdM=gga$!E`5Z8=rR(C#__mr! z(bDE;@wYC%gi~t#Xh^>Ump*4PX^4bCCp>_lkR);+?NHm0NTl-dPhU{#HM5x969c0p z)VF-~-`Rv*$>6H-sDUB#89P!7EOO0qHcO~k#_321NNwz~Cc1OursD-BI*?G-OLk+O za5f&jIyDKnm;+_5B?`%rgs-#sXleU`WEtSO>v4uFFB057t9Thruo?uYZkjW`@rXsk zdShNv;9>W2=8v6H#0viE;ao#|I0QCiW{P=u-@wDLm0T??nu8(?axi-33n{~&fwXow z(K%tt2=(0@RUkEsPtPOKY9@%^92kcM_`Dfu4s^p1;n%_aJ_rRLNq-iJL%y~J7nE}j zPtlf$$%1|4dpjspjguB|9o}@%BtRb%trafIAMBzg@E_WIv~l25Okm(Wh)=-)nzP`U zgXT}`d#1GW5%^4#lSUwMbmN`U8q!U;4JfyvcMJI7FxnC=bCrw{0B=IRF%onMfaPAq}wh$~k#h{<2HE zAt?RW`AsluUkm^mAs z+3c^Ran56+enF6A)lBr1fRrv4*1^q;;%}-0zl;b2D=Z`iX4bRGxZ*l2A(^8MOn(I5DuFXktdPbs%@b2#@m> zN}v3#(`C5SV-%`hvf1jO8{txcBS}iFV~aiGeJ zwgLe<01bo?qt~B(+BfGLwV0D5h2Ril<8LY~x4rWC z_V3zAt!sItJXmVhSBk=E*B}+GSCj+=N8rub738zxFM?KSSrwGrkAtOPoSJ50VNU8O zpM-MY$jz}WP(mml|krf*cl@iI;ya^DmL&C}t z|FZ{_!TEt1xgQAFzq*A!;KY^n+0#|j3-?ms|2cF!Jr)Hsoz9m>06evj4c7f--~2B_ zQ3x&MtC8UaRNr0opv5<-DHZWg`%^AaenHd_cnUg`h(F;lJ8XJ!ZfZoRUx=?ku!EYp z6gXTIAUzvYMsE+r8+Si1HC52UZM81AG~AxEQr8y?_9ZC?4cA zP)ym5ObPiaeT?gD$jz3!un?>C$Gld$`fJMMLl7dC^!t%CA8VNilX5v&LjG|927M;y zXw-Xi-vrqm*fbd$SvMvJ0Ut7TCVl5Hj__z~N4+R@yFn#kIV+g5lAK~;^Vm!*(_3p< z^1D1=#vQjtM>gsvl+M$6of73F{*ms9IV1-7VOXi8{4Od&aBI5b!dJC_lAxaY%-Z7fi=eca_Eb=<4?p zcIP3VOWFH^+Y9c^v*_4V-$bye;RRRDtNyRYONC!hWi;L-fDjCg)kaa|(wmLB&yM_LG{Gc1Wj|sY%W|D-Pu*W3NvcbbQTPlDck3Dyn>=9{WA zjMe{K;Xy(LAQdv{;Ax0ELx5Gbg!7=~p#c{14CHc;$A1~I`TW|AC;K51rcRu(C>O0v z;0vN$m_&bHP$3)@QO@0EuF{irtxo*NmY{P?%nJ`?fu7-rBwrNr$$BBY5&RLQ$wG*d z!`N-lEBlWP{(AB0IJJ<9j0Q@NJ@2p!t;nzu!Qwk>7E9H5ObJy3gL+gn`u1wWuA@nA%uJDPO3gYwQz`}YEbdARNldhrH2iROSWO38at)xeIKVPx`z>IO(wOuM4E z5126VcIiKO6@9y@1$5r~4BGQ>Qyi>vFqz8sU6sXsg7JIZEK0Aq6=?Q^qw=+pRXhVt z6+WO?s#e_q-_}%QW}Y0pfeDlsj1XFM>2+1v`B+qK8svVAk`WkI8cSi=K^AMYi6;-r*m6#zC586W|zZ*UUBT!&Lnff zYO;(;nS9V2%VmUZZ?Ti_!gak}7{3g45!_7|!(tQGQ~Zj^DUsf^p?!+|{1`a31}hOj|`-eE2-own>pgguIV+p!yFRs zZ8QaRFbjOOZCtZHNB;cyKW(;E8GRd8^Uw=COm!@8B3CJp_ViGixOd0sL8vaZ1QC7R=A zw@Y=lx$wu|hj(_;J>3m3)5M;A0GH$E(7?dx`cKb9;+Lsszb><>^88nBf zDzsmF9Gy;dF4|9UM%SbsBCE!ghlr6v7cF|CMeH$CC7hs&r3x!{PE>pMoiwFU5rOGR zAD@0?^J&oO1mZF?Fb#R}_5c@IiKw)XMgDfk{JOR|RUwN-BA!N6q-=I!_eFO@mimNJ zkV^beu_^uC6!I>nM?E5qnXLPBLhGHJzvHE9PMGRx0=c@i!vTngp=xd)OP-JZs$eoz zq3@N=eMB7<6bh(RQqloK1h#yaX?b^ouItra-E~|q<7)0;jmp4JV>Y5BI?tQM8>3=I z&xqa~j^5qwZ;1gnUl)?E%r77YToHT^BC|`S{ip<=LTxI zb2EWuPiiTQN)pL2n#`_g@rcwqeP3;poBRS@0g5XM&RQUq2tqAWmA$Q=canIGfW?v5 zk@3*9ZzS#+_`j=resA~dr4HE?BRYx6oiRWP-(8QODu-=Ng{M1F^j3=OY%f9tYwWx{ zSr)nu2MA?tP=FEKg+IPi-7W=$EhN?(~r82#YeA zzCh0efiZ`HJ*(_Q?8f}si9w|S%r|z|Bf7^AI_nzNFc*t!E0dz!aoRf2AT_Jy&)Yro z8>*ioK07twlaTSz!5Qs{7OO|#$0c=WB)w1~%LcZ|<+hzvlEQxWVLi3jo>-0h{Pm;2 z5q9qoD-T4VjWvof@P9FO4#A>C+m=1HZQHhO+qP}nHt(@*+qUg{Y}b7e)uHCwNEfnN)a!hS}u^qoV^H|j<@L>_~!_O&tsCcv&ScJRHj&>*i!&1A^nki}D~ zF--Luh}wD667oATR^$(fUk0GXpny58@(0)>0h|(sZ?dOB6v|ihOq;@RLT%Q-J;+{u z+zj1-eiW-XLFW2v;(s&IQwwuILij|cv6OsE*BFDL7Pj>AkA z5DMiXxV}jJt-gsjo8XDKd-{p&FD~P&{RpTDz+`hLWELQHkwzIpVBX$>rHw$D_B+DU z?kfTRaU*ZD=F_Hfuv4-TRF{PP;REY7R|y1zV+G!{GC|T%<={qW^VQFX<<0TsNrOK6xJ z*A(jxamf&W+=ZE`*;o{ zMU+PseeG$%h(G3y&eA%U_C7K!YR8;f-R2Q$WIUbm8T=-*5=nvme&c%}$y81iwm92e z>7?vA?>3jvP9SuQ&m|S~G*zZ(u2NA^e+r}!U8tc}*BFb=%gUGJk*oZ0ua!JKVmMX7 zx8_&6sAgbKqZ511fm0JYbnK@fEG-sUq6$g>a2C*uc|fJ%ApW60vm?19ThdP}|BX_6 z?P)T+V!C0HB`s^}L>!^aq-w}OZJM5@QF??5DUnj)qk4pqD%Q_0>K361(`1!B(oIB$ z8pK4_*EnKG8X!k%IjgPfS4A&rPw0zo;b^kEyiqA}(#;gwmi!ClrkbBW={!EX4?PrR zTPbze@X=jUsjDyCl>!1tP1StEs}45`K*mG~R)YKrg4cAXH=E=%b8+F}SDb*`nRgEH zKr2bu`S$9-Qv$Alm=Sn}P%6a1I$+YB-AM{1oGf ze1lYF)xiahSvS4Bw$Z)vc03Aw?xlxC5)ZuS5uzw#EoC3{nsWrA;KN~*9h%}A-N(hF zGmz*tiN7P?Un9AUsvyWlQS3WiYP%yaeSUs$mjdsD1u`;!cJvb=nMjlVSrIUU;)<6~ zCO_H~?ISK-Ey@Wz6IJK9dNLTWm{eq34(XckB!kSyq*aUuG~+e(vrD!?2759+rX(}* z;!NsiAZh@~&@V>wM)bUFZJiO1OZ#$#idsXzI(-@yG0g%Dki#9GTURpR`WzX6RiLPZ zwn|=)gY7*!9q&!OUzas--Zr2yZ24;fUx7NrWa5mt_WWio4n!ZEkcNLdg=f5l$lVzj z2Yt8!fo~7Kysp2mN8n@dnN{~7TFcU^M2OPMhTOvq(fS zE#)c=KYpOmkY0QP$r9TDE3s@+z`4#!Dc>detm799=3jHj)Bpbgn`X2Ce%F;*6vwJU-xrK~%xBSd8Q(@%|xXOkY>1 z?owf=2aay|M+e^H^Q8%^pV6Nf7yc5Z&mVmRm0e~gjzn~rp?gx{R!{<`ekJ>42nkUW4taD%1^9WL z`6#F(J&I&Z?Q@)yto~ymY4@301GUunXw6~JyvlqypiGeA>|B$gnjlM#P<;GTbDBzX zm%9;hky3Q?j*9Y+pz2iPZy|64x$K&%jBc%07H@I7B?buKmCDm@D`a)ZP0-lzdrc+k zp$A%bphBoqBklFf3V4%jV($GrI{PA%{3{bGrlvE4S5A|df73q1dd6Mebld1)YgMCVqS3meg8~iy)=a>(@htF z?F4GZfaGzItPFBq zWPHJFQL(}~f<82=A!PSFWHa66AcH?p^5f2wWeygk@m0geGPV!+RwRz@KFLm=BtnF1 z!LGuV(fMeO@)=zY=}v&j8)l_%ZE}!M4!g_d_QqBt*>dT^grzm3F$K2LWS3y?dh0}* zSHg|6nJ`z*oV=wx6QrH5Nd;o>=@^!!@gM)}nK&;gd==iG^!E19WsfdBfHuYwRcW3G zq2mPx_jEZC-cacTAXIEu+bPoL354V!vDRs?hvsmYq~o=t4)!pab;JZgU9@MAvGn5X z@3z?VS^}$23Z-hy`>|<$7N*hpC;&~Y&6#E=4L{A+2D+VHguZs7P$^j;|{WxGjQ za-}gnx;9~7ua0oO`|*dd4m9&2)a{yd`i9a7T-3Xd8-?1w5YopGe0Ef{)lPE?beSJzp8;pV10`qd5oVj_lolyf)r0?uWmzkB-iG<|ncYjMrrqD!lB$W6!>S%;+`1_Ql#OMVX)9Z(0(TA*Tx&NRn+ zHuvo(9UQ+-{gLG@-0dfj_#h29W!KmTh=CatQ|&Ld{Q`ssIa@D7CEpqVb*OTNu;DI&=q?^D^O89!(0 zl)c&OO}*YT@f$bSz24uYHExb(QAo|JQP80Y>kGiMmTm}TJguP6+eHuTlz8psnqq8v zw1?pf1?xEV6-2x5^V9?|(3JbN2-}Ay+eYTw`p&k&J&{MEvon>pw5z zd<<`0cJ13p6W$3ylnrJqO3f+2rof@IgE{4ciHOttzHZLFGRh`tChHor4h4K1YOsF7 zNHzD&bBM56V^97GBn_r|Kf!1>LM3%Px=C z*1xUngVncJN4PtNSFKfehlALKDug6WXv-5q)bz8fGB+c*w2I z*j_M)LwmLOzhFml&6{2ISg`i^_FGn4D`m#Nv#k}At(Rrzi=x_#Qug7myDVkGhjCd> z;z;f}EqspQ+Sy>67Xo%rmcv=l9W zWmil$O+Ah~XsjD3N|g9u_EIl1a?lji50w z!lRY%^mS_dHBcA1PFBx$BR$m3sdzc8jSQO(U0l^5>Y?ds*$X@0m)R?83xqSQ;LaWu z?^ec!aHIQ|RE5qnOA39{+{zH(k3n}O$6Sl|m?pEakU|p}r0o(auOE=ut=4&?PKB_10l)C@852k?}aD(Xv`*)gJ@z;Lf^`2S3E5G@M4=Z zH)u@%IrG1sQ!z63JdR_U((MMZZ@uQ;-VHNZYN5d%J`MY3DT4<1S&PCR zTn($!eLU|sVvx)xLUZZ-X#M{nbKNjWjX=*9 zs;!4Zb1NORxJN&p5B5 z#Vn#o-TvVgTt*u3^;y>B{45#^*c^)E(O=B)!*Wcx>J`3jZK@05AY3UwW}wv|=$(>i zCqF^NktB#S2Vkp3t&1?%q7f!-b^HpW;TS@HPhd4#>So`DMJ*B=Adg+Dy3ZE!%R9dj zK!=6YG%f{)Z`K^FND>E>_efR>)=3TC)!^>L46Q7kS&gEswNrgRPZG!LJT%LUf0u>`AyhCb zlQUJqi$-}+PyECqjWScuTvnc&L<5=1S;-ioL1D=T?xRy8-Z*qX?r#bnV1=Y{ZdX#? z0u8#+6r>yxBRa%mzLtX(VoJbK6tQIfLIvdr+NIPr&Ky&TvRO^6w1Ru=I)G82(;LdM zropgjLg;>R?vb)r!Y(@AfRdi%oJHENZ3pD}&z~qM(u4(v6SHD0l0%t$YFRs;sSuTc z;%P-F^AO$gbm_Tv(I_0979+1y5fn~8y3o#~KMOSJgH!E@A#_K>st%fo4~_kdA!v1` zgSY`x_(n>ZRHbMNBr3x~8_rsg(SkS2tGeH5Vx^m!+N`drkrq0h$5<&Mk{+nyNPco6 z-hDjO^*qBvWvqA&Acq8!bruwhN&%7WAO1AKF|q@!1$Z1H5ola!V88S5W=ntT9po4t zN9Vl|1u#9lDkB;s-E7Z}DJWx#w>KQ9bQjnAOaU@ikq}*Vz)?GbA`+|s*!XGW*h>!8 zr*&qeP? zY<~Evs}}Or4N0nF(^Im-qRYBcTphtN@a*0m?hRF3JDo#4l{+VSr!wi;XEFto?5D&4 z=97~+vWXgbCP$w!ubt}Ti&FM*vThU$94NtQ&K~CA zVWuY==}@i|0ZV+9@4Cx&$np<5;_DU{pb_g&9|Se#?vn6I%O|v#G)aND7QkQ3uylPU z%?5*E(ZNXu%z#B{u5$P5%!MNg@v0`{nO)_{e0pRo%kfTtzLsL;)eI5SI`s6_IJJnH z@jkgaoo5uXi-@x>WifADN;W>4^;6y!Hw92n3s}^F^O;RT>Upgw^Oirsz!Pjz6_$-M zX}wXZ^yfRCN}k0k%=**4ex9TK`z68$7ihv4do1~$qa6vG{>-zxts z3K|wIorJc|xbghi<17a}fwb@`n+28pvYsPCx$Ighh_yDgEEKs&AR7PVdjt{Lc|MDn;8v${Q(93+w_5dRo6N zrfJ}z?*Lc)W&+3iy!wS@k~*bFx}C6)C1nE?nX|kZo1Oo+^ExX_2V8eA75+Ymi}Tzb zJu9vJ#8SW2a(?5nq`}s!qhc~{+t{ap$IPKf$wA<({Ep_5?hraS{>r?O4t*JbE9bFD z4K&e|XW2xdvk=}Gtv;>Oz7|%42K)-mfR-q2#q4{;k6$7btD~~3((>Rn74c}33(~T@ zMqGbxKlUHqnXSKU-^t$`EBzzMB8^Z}d3!VTL?TCRWF~-4C`Lv7i6NY>s7Mo<{!}j- zu)VfI_tP1B&+I6#k7sE$1omy$Ci^|#(pN~=_G$I{ZM);UmokRm$DaeY(m;*JcMQiA z9!d5zk|S2u%Tn?F5x@7fm4CES?QCDvt?i$^h_}Or+%k#JkTS|gQ6Y^2m9U2JqGq}L`9be zHA}^c?%a`W2mO*Z3G;(%mw35sK)lU2DDUCb3jl^@iQ|mro;*MI%%K{(4#%MERGB8D z;bz*H23bsR%jMREmWB16PFq!>#m$JPok-H83A6exGs$Bkpg0U!a&tDJ5YgUhbdWw)s?_vkh_Kq)}~ z06N5*X10_>!|Tc$C3;9``M&z$3P;SsEdj8Xc>>^$s7rO6`~Gc%)Y0zF+UL{V*gktz z`1-BYVj?*&<^_r!JeR3C7plFiOQVJpETaZA-@zZGpw`#+YrO0yju4}THj~BNr9_sn z8&K^6?S=gC^rvos6QJk;vOf(b?_1Ls*h<{iAS`KwWat~R_f2K&Q@`%O_4#dOSr_z ziy~#7>X(q}vW-deXE_mNqy%MMEHoCdh&XaqCPE(A2D&xvu_WIoj7wq=GWLnfFA|4S zHfIdD)X|w$$IwG5j=m>%S2{z;ssg1e!Jj%4LRw?X-Q*m>+8suJUQhQ-Ar&XFy>SU| z-a~v+gJmV8R-7R&)_$mjA&z5A)cu<6c+tjv!QKdsq`EYKyBo!|wUTc&P~hxgJDtZD ziBYg~Uv)&~!?wnQL6!Xd?A`<(ntooP(y(DB+f7Vd6mhqdJKw?D@0XkJ#l0`Z!?2uh zSua*ADsC@#gKa`sK-XfXIAtocQIL+hDK*R{8Aij&mNRjqq(5RA{g&%kZ9VZ(h0$|H zGx^#x5zNy&Vy3|h%*WMxr!JaFzg*0iTqk}jZq)T(($H&O70IHx8XS>6>%|s3L<=hr z8PGt}+ji2=!thulQOh5uV`rWb7Xm}(U;aG29xrD$IU{;!oY3fhv4HLi$dOr_fGX$l zdryAi-~v5D()*!tUD{->1Nm;A$-Sbw$ehh(W1#ZU__i^q6$E^w>81+x9|#ZWly+M} z&DC6i_w)$;&->Vu7g<5G({ByPZ`>w@B>6Q4XB>0j*I$zX+$4zJR0?wy1k%T4`o8@gJAI8I z2$<1$t>)!6C%XJ$+k&D_fCg`cH4c|erwskmV@@SlFD$43TVF;H3l5+N+;|?@W`4K? zsbWE=2*cAYvM#)fLNBgSFMiFh;ybL!%ZEcGDs^x(m2w6zix(`P=c_3`=cZcihoJLq z3)Y6v1ZwMHW1~-F6i1P+xyS2&I0SN{e@8lo-&h;1X`8Rz@GV^1YSp7=R%xVfruITu z5E&UY&=Ot61)^t>m0r8btt0PkUU#kJQ5bxP-oMLD_G|;6p8}75>Ic}ASu)ynKQANV zQthz)*|#LBms4gf9A`ilmagD7K^KC0KvrC0rQrv9Df5taRh6b;v|DBvP20StL+2Yl zTKfTa-PBtuv-hodBT;6wSeo2#-cEdvZOD zSq5yu^MMx{Eq~+OH?`4m{A77il55{xw9MYz*{2|W{ChP{UqFn%aiRLYFU@k1R46dH z`a=ZcE4SQEWj%w_t@Id-f>tgo2z(*@uNGoMeYfwY>=#h*)+qh|gA`c*tEdGh1Iz#G z1YGOab3rXM{*+P6j0ajn-AS<=wt0+VeLHzb=#N@;Tg^IO@TRkb_cB2V3v&pr5;YOP_~m`+6Jh?z~Y) z?Iv3jv`VFtrPyI>Uv6F&C1@EJQfp6L>$QQ1R&};51~%B%Kq_UL?8=H?6`D?ClBFf= z9Tj~^{q*xw?Zpj~H>I>~N-W9MAy_~F04-!_Zh%^M^EMPzZrUV9iSAY%Q#L4j4knzu zcdR~QmZ9rD@vs%6Qe!F;h-~H1f&cTg-t#Psg<4`!>wR`y>nO_X|-w`hfPZV%APw0J^pj-8gy0 z#SBjnZlBD|pde7?^MbwBOtK=1OoKmVVIc&}RuC=hipHzBSK7yPQuKtSZ1{wrnJm;eQr$j7?gVITlil^vMaO;tJ|zw z>^~FODryBSTEE&~vC1GY>BY^d!lLz7o1dm?96HvTW+&X40W%WWo9AhLrWuXcMpX`{_ycCdKYY>jyKH(gwZPhmD#8?#Jjgyp0mNg`Lx)lxn?Z!VhnlR#u{9yrQONftHM5jpZP?U z-Q8c?^}P@3b3Go_emQkeq;>f+b<~skmEQTdmaq0w(j146*lB-qH+$FE2SE++TEo{3 zhzvIKz8gA4QODuX8)m6|dj8zlp^q!dGo!6htkD3a@}H?tUP4ri=}?(c4i>tkb;l6r%S;?fJ-k`zse z;C(1a9+i7;S{i$uzYgBe4SvYEMjXDf3T@bm3FR08&j5^j4S+-iD(E%IDnmwCLb4ja zm5^8Ws1&XcN=ub2_D&Z__#;QE$TwAsFvF+hm}oMNx@;>X1o|oO<0+7GK@%(Jz@p+4 zvVVM$@bQ+=WgI&bpr}@QWD?S~C#WE~f~9eW$u)k4Y`@GrRf6t&9A5(tP8nK5`xUF9 zcX0|g{&H4*M)YIGG_U+M%9DlWvhtem%&8=4;o3(;ud`^{@ zwE7&yv;^otjK~vX6JQ6*V0bKq)s~uCR}AK2_jc5#<$f9v%m)s*Q}cyi2mI1!ua+Q_ z7f&vWvily8w+wgwS`bX>@mEs!+wBz(kA|3&&y|GsE8#_!7JQXmI3BU_u_?E{S(`y} z?4=y^Ny8gDfI=JaULzO^*c?Hy?0Dv+uqIAvi5RGo-C6Mt*Nuhd=s^F3A|(7n(H))k z<7pR?emKP8R@UDUSn?=d}cs2*lH);CX0SkxdJtB z(50bX_k9|=!R_%X3a}=VmV?X*twjhU!V1`N%-?tOWEuRV@R5dFs*~e)sAX@jy zAJZp{flXL*DPYIhim}|4@LR$ns9M?%MVr zYvKj>0ZXYPbY0u;CDJ#X_RgFsK}ZVC*>=fQ03WpGOqB}|?65$JQ2_`VjNfF5cq0!f&3#4CA{?V6# zIEX(jw7{dle1e{iu^t1+WC@E6emaV%6cNMoR5E0bqGCrq2`E96XG=w)(eA9MhR?RmkVXEn zbJvdfHAuL5F98}HfMDDgLqX`Cfr=QtGm0YT z`S+S$QDB~i*^LUHu6;dJVpoB0G#jiS4&NB_oh1(_Tx7cJem@LLa_;QDIW9>;%4%sqm@dU)&`31XFj=rK03!Z4Mb^D3KpoHwmmm~5n;+` z0`}_y{_YwA5WsXym_joM9ces6;a@{6prda-XP|=iGQvByGC~@TrppWv-}W$rJ`q?$ zX)tX%IaQFP!3v1(40S}DB@L5mA~_5ZgI4iIWI>b^Z$Xip3`7wJZ%WB+zXJx~rEp@_ z8hnct6}l?49IHYp(*6ZpslYXOVa5ncoY1Jm&-zG+=^yq!s@J|PrerX*@qVgKD|#$- z?0#6$+iF`ix*G$HdV{di5Cop8&DPy;lQ@=vg)wx(bH?jlW;l#7rjKGnT44rvKgX9m z%E4)h>Jd3NI1~PN?Wvv7u6jN@<8hh5pjC)XWtnHhsNh`mNr6Xt<0z0;GbXzuOelcR z!kF0QOA3NiL<)is63UMilPO3NGzFZ;eG;y%QF5Rylr)A){38dA8FQAhHt7f@rX-Vd zM#4+!!()D9gw+6m2*ftC87hY=)$TDbW)SMF&8@-n>@O#E*Ja zG5$p~nDnNI8Z?7GT5!v(13m(zb)p&r!+&+@MIjVK(R+b-ReN|sObeoFfq=ZbA<-D+ z*KW{d*SPe(df{B8Uo-Fr=zxU`!U91sibqVL1p~qQjc6c6_=7wO~|l zWT2Xb89|@}&0*^DMrbsHECAcgm`a!r;6QySG7L+FBq z#zdyQm3_|WcQh6+7y{tD=9*4@pG=yd9-CxmT!+=nKV=dvhe9SG{0 zL0{!5Vs+Da2Y@!=i%hMTE&EKC&}RuAT5~S{7jXM6{n{{@u@hB}D@%%jksu!JNOoGl9Pu>e^Orh(Yvy;v#wpNU|hFZA_56X)an_m03y^-FG)NGj)JJt6Yx=?olNG(qSd&=cb5+cp~IISJV$0Tri031p! zdm|;^IJ%NU13rV$e_XLGvu@C|+uA zut9z~@`-1xr#V#Yq^H_$8;q73}7 z{vD&znD0lFD#Obor z^;_oyH68_HKO;w86WKor-}^|$niUHL>L`&F%krIB(!r+aF0No|UoegM@LeVpQ0=ou zCm*6Dxm*z zV6Wd1fjgPydv8aom;(JU2&yGajQU!nGCV_u-mV@?WsG+@SrTK>bW&yfM%nTxnM5Hm z-C^;sikPR%6Xj0dT{;>=4w)c>_`ZyAJd_~vOD6r3`l&!P?vH0&r8P92Ozh41CCslu!txp!$sh--XDcCsM`^HnUuCyK1BF$5HE}n&($`5G ztTTLN5XZEuDa|6Khavlo_P@n8ChWLU)5Meyw^d}qXmlxye!D@;W|#}fs|~oMK6UAO ztNKM%CnB{J%$x!3p~94`nGy8zb0G1@*2A2WJNvf>uUe)~q+dnDtZuh#z6!ZczvoLpf2*M((@NJeq{rf$2%} zCY{70(foHl$PZLvbL!knGKdeSE1OKW#hQ%U-D)AiEJjbhz$;+9< zRSsyXCbiY>(kTFpeh|lhLL^ICWMGp^0x!p0u;-f|{0}wdNq(*)j#u2awpp$9b1}3` z4)u#cPI7@5bZd(XZ%IO8d++s`2X2xdF{AcfDXS5S=F&wJRLtSU1DbNC_X*D+v2zbw zux}yi;I4GTY}-X?X2%-rcwbSAbv_IwLZbP~Q5H4)ci@yFs@K=DD>uxFcF^wG7$32~ zJ=Sr8Yx0Zmr5druj7-=DLivWAvE-0nl~HewZ8NB&ZoToPO)JXDQoQ6Jk_lLF9l!a= z{Z){C6)z$VxJ23e=0bhCQ@)v`#DyNTDNulz=yYH(;Y)>pkm=1(iwEn_FI^I7>+mga zl{uaFu8z1+xlLP$&9}`4YijbHno}HLNsL4KJ{@yl!}tWdBca)L1#1{vRALT1x*HPJ@4|^g&+ETGGgrgY+oYft0=(e z2E?&&JT`}%P4@oJ`WKInq5mJ+#_?a#HYSe$A@HndODAu!A@$zY%_}NfJKp;Zw}6wU zuALq~ka%m@uPh>&hqa2ticY*7ui3L>6-Y#7B$DHmC8;o>Km-XCeO}dJ&un~R<}<#f z&sAq=-ayCyPN!j8bcOx;<@kDYevZK#jcOibn$OPA)fM;#_O(1VO|AH!ZdFBx9$V?L zy{XS#oeHhLgMaC_Y^~X^u8jE8|AG#!A26t)Z#!BV^5C3~tw#@;K-puS0eN=_X;Z^= zH!>_r;C`$&+*%klCd5H|$ktgqHYhC4(A!_8mAZFrjlOqyt}HIUvY+JL+*G>tRi%G= zZOzka>>U5?NDEb!8Q$oN>RGN&r{|a!8I^k`V@{*WFxVcpqc^7KM+!ld8ZRVxYbMYc zh*k6I)`TaD^DkI61XGT{_UJG54y4tWb^JL-!m{qbQA)Nsh;oqgb zBHK}SSW1)p?{2DwuZ6u z!84!cr#s#A1rd_1{N%`7ir{9hjZJGY4bv7+#I8Pxnh+Q@%1h9ko^>pH!0VKk;UjP#M8W4NH8?X(FUbJcOX# znh@*Mc?~>vfaoo<-~QQp$<)={v$xNpr#qz#qb^V|^rlNgu_(pKQ_DfFST}o1?QrrE z0vU-!C&fk3w;4D$atLw=OR{i(py5svO`iC;TN%XJRpjY?+aq&HZgtNn@rj2Ws4DCAsGS;T2T~x|%1%xIp9WOSzI%BU zJO#`#mN>=Z`v>QezzX`Jp*A?^g?Fn`5eK67$;!LRKbE$lP% zgFZjq!}5;~`!c~kLXBDz2BjE5Zq;3zL|!R$?AAivTcjeHS&#gOY>X=S+>LE3p(s;t<*$@U?( zHLCC&mJ38?H=NIMOP{8mx`DBsm?8`9mT1x`PO=+2YSqT$QUQ3~jC!kH4GHb^7O^4+ z>0bl63?EncYV83hbun(Lv6L7O7oZ}R?s1>GrvH|+hC-PkyFU#zi@pm5xXFS8mc0~n zU?;`(nZr&}oD8oE)(>buTK%C-s#GRyM-!9B&YD5VIb^*${bQgoj z8ueBjC*H+ziarRCit6|bE?LmRJK-K4@q=E*tukUuuU>9>QI9JLHk>)?y$NgY5 z1#kpA<%>F@F!^)$VJv;H>MBc-WNZP~A{uXS?9Z77lqb>Aq+mdW>VT&|qZG%-&mV7N z(hmbb%8}x{S}3U7(r8|&`9}EVX%VKU1?df!wE+Y~>qnLaSoG}wLx$(nD@gI3iR0%) zfG9*pEWUk_5=F@1`lD0+8KHXyaz#_qF#8;_lR5MaB39WnE$aax9O5{>9k2~`64~kN zjvU)1+GVysV2pK&A}msf@@SdqPk6*zqCW_g-kEvPpwW#xM4xugOxS*4&xG1MtS%&@Rk?~AH~SXGK1TP_%9?kuCjRrmvt zkb8>3Gj3g9rX2%U`b}3JoiG~vuhRwz^mT3IHE@3rX^-_dFso?(LQL6rvV9=58S6!w zg3m=n9>pk^2AHl3!S|ehN|#ki^5rq@yZ6AdY!&c84h2W*P4UFk8uDbg5* zhWo}fwTTgO-^=d2h=2<%ew>tq`Pl8r$xLzXQ|H}@X=#$-ydg<6E1|G|-yioC$|9&m zC##I-H8S(dO4lCY;_{S>nKUM;!ydF1 zCM6DC#(UuR&=K`K1cWERlA1iz`^gFnYp({>r!OFao2q*n@5IXPTjHS4i6hDMel<8u zqu+TLz6SJ_oW_sKAs9fXFy%&`lnNpBO5nk`rw`EM8BSBu&IFbj{OOIVqXikHRY;S0 zyoPn_^wp}Z#8P<@la4}mBi_YA(WRksYs-}*p%?nRXL142rF-%Y9OYK-B-R^~K=GAO|@ zOztQR?+2r-1Q|x?(w1629gA2|t%CAQi5X0S!tp75{KOoBh9j-2WFZoP6XIeMn$dzK zcO_rCBnZ*BxGOz7_O>f4{RQj^?NDrTOr&5;q!dkezQ~;y!d|h&5lMXF8-hI;A;?(7 zxJ!bs3#%=d{nHazx!-xQ5rBe*!3)J&KaKS;$k1zo27+6DihYcZb-siGwrM zjtW5qIfZSyS;uk@ml)Rap{QWXJjek;wR9Mu(>$TrMZCg)8xLx|(?h_CL^JviyvDFz++QYI(sR&zzUlpmkta=X5pu*#V3)H1C*kku zd=_BCL#d2Mm12B)-O)GQC+kaz0^vu`URXtaz%z`F)+q(m*rdUrWQCXqvK({Dya@C1 zGJpSa_Z2ccp_aMvHkEuk!+Y9iKr<*U)$1Dz1|Q~~^A40R&Cwsy?+YTYuZD_jgv`Th zg;EjV>MEynrM~E0Auv|ycDJjuf}O1dYBF#rTEV}o_+3vuX~vJTkz48`yD2IKH_vf& z;Cn*NsGVxpZ(pBBY#LG2LjWvRF!XEg9J%#XbQd}pOfPn=A}i|-oUUBARp}>O7?lUk zDND>;N|9{XS(3i8cRK}<;pLI@B&YW9U{t*vONlk^m>a4zu^A2iCevvk@ zIYsn<$YNCj_qa0vD-&AAi0UouKVgx^YKmjGM5#QzF@o)$0R%8>BO^R_R$&yH3!;5h zBOy7Ndp1`JY*09E%BsU5y6fo@dfrw5?3-MvgQ@?l`eq3dQrwO!myfIY#Fc2unhyo> zI}|L|X2^CDLo7y43|gFbQXYUYb0tr;`M7) z3aAw}ijr2qX7nYqqkD*;Efcmb9N2?xcg~(blT~pgU?0`%`Du!60;{dN?egc~d6fe&(1Ps<@$7=svTkm;h)F;<>Cc-uxDKiR2B) z0wXO=Pavs?)d4iaF5_B)rX#6=D%RKhrlSe^12yo~lmP=}2J7m#oWiZ4?EMP<5fI2# zPDdVGY>|dxta;iX#cp1mbP=9;N!?V&%29mNudR;y-mN0EV_4o_Du#J>-GX@c&DU^) zFAv`FX@gthnsaU=#BP@MSKL%vXue-J>=m03ix6rwMc_P(TKFp`bROX#VQX?sYQ6_E z*(%8WSGtc4nOc2^@Ux^zzPInpr|r&geu1M<06m&6dn&`p$MnnuJ%b5k<_?ANJ!B4( zzAP7n&k92l74cfZ%6PdJp%sF!*xt_Ad`^vQr5F#-uX#XU_J-(;U`Q_rl#>0tNJJ;& z{%6Pw>g=|G*8|mc#SuHh6!nIyf2Bviajhjllny=c0>QaMHf3T`PL zEWlP)e+kBe@_PuN{St98c^3L_L(a1@VlT3D8hAg%>^nel$uqe5jJPU7SZqCXH5A@T z&JYQzOk=;9E^(wer)p=B903G)MZFQ7cYJhh*-T?d#`Ft^t~p>PiFhVX=_5W~f#%kq zF{}^0%VQr{D84=Hw?h6!4&RIkxEp|Uw#xchSV3C0e0@XvOI=NJ=P|$}AmMEyeDdXz zBlwP*zU7tv0FS(McJK}-ZhpK%?WD6m-u}tIhQ(Y0PoB0 zlR!niybo*TK-K{(HWb1fU*MX(J5vealRpT?{Eq~L#3;-{qufEzrGCPma={HpgnoLXHUhWZyWbE zWMp!Xw#saU&DC>V&&?EhPp!*KAAhoy5AU#lh_Q#Vf!3B{EnLDG2Uv&2o2ZR zb;oVQ^gl$xoy*GE&a(6RwS4yJZ<=eiA5L7j^G-e(@RhN1`Qq)T?zXM$*sr-`o07-d zP%dzA)-VvaVc;>SvQETs(EnlVoE8HCv?Uwcwr$&X(y?vZwr$(Ct&VNmR);t9c4y{1 zoX^;`tJbPpVCk#>Khq?^ChY-SH>gwEXcon=3d7ur%6dhJ9t=4j@hOJMmj=FBT$aSG z9%?sP6X{Shv{fKl;_YT ztW8FM*Om*C*`0iIdVO1IHUxW!KoNFwaZjKBwCm2tSsbm|NN_WEd{$m2T%w&;6i8rN zo?jfhvk%ugEN30w?+Ih$eU-bWGlrpbel7~G(Ms9n2Uzaxk1>3lIoLiN)qZfApFip5 z#zu`>;+D-8w94&-K^$9o@G3oCu;8XsGUeAM%RY}onDIW1B%3nE!=q3ayhwFX(~?W| zYIl?)^k^9walbomq?7bPP<*gKMIY&>Eq%7~T$giG9VT0eeZAJpLJlS3(R*#WL<4o| z$jESal|OtiQ^q!hyvC+P+$s}QzcC0xKrTC7?v3>9*t+hr;v$*?I4<+np?y%Ffb_C2 z^OzS7@WjUJ9M?{VNuere($pLpSd@5^s^%7)S5gowL+|^&byF#~fXFIXAP*L1XnvG& zS0dm|i0A;n<_rb62^bs-Hmtd4au#=WTlWm>p=7$^rlQ}dH4K6uZ4JSTWcQSFGfI*t zjc>bTvw=_%`&%kC7Tx0Pkx`>*x}gpR(DN>2KhlM%FQKVnfE%Gy%un16*P)!Z%(7GI z!X0o=A&|^WNVN;HnR;O9PUG^S3WC|{tRSq_qgGi-_}1FY!#yR1ecQW^KVS7`m|0K~RHSQjLbEJ=EM|`IrxKs09!T?j++vfuGzPdA1)N8V zr^RS~wqn>!=2q&rdaHk3I`ItjHr?p-kD!eVVt-@3`oI_{(o*ORVM%K`0fF|^?1BJp zmNyCZSOLQ@ZhXiT3_|wA?l#ZnX3y*C7aWkK5=@9wxyV%rKjrR$K64c8qlg6}4Aqck zJ{!yM?U`(F%5&uaXZOvynKJ!2MfwT#*9B^-U*^l^C;9Y?>4nTiiXa*@ zWj9FmiD7Hqj{j+wh-OvN{%xB_nNwhQcw17&w*uoR6(~zY7XHArizVsT>fD0 z#wu`#79!%?al4V7ID)({BBzW_oQDPcr_44`TzoO#^26l5hjIGzEzCA#k2P-R&hov> zpJKH!VbPvZ%4OZKM#u%zw1s~@CqcF$^Ux2QER3;gF{f9>b{b-^T-vs}YjQooX~g~I zo42evKI{VZ&w))7Jmwd~6Q3-{d7qf$I`D4E@tOrQa0e(v$#2iI*9~^c94xK1C(+G) z)z%co8seaP?_fD_BEJW9-i=bUbb#k-49p_EXc2^0z=5|qCXK%)=z*7c==&h}v8KFC zH3B}P_-6OH1{Mfw&>GsSCaaZHTbodTxWU}@S;}=i;X;Rmte?xmOZP?ZUeNQTr28Z| zlZ_w0;{NdhEK{(8mWatL_oO?lRoY|UgX(X=xdhq-L&V9xz*66{WzA$s17()-f{g4{ z+dnF~cy5G0G4OQw4yfE5Nx1nb2Y^tM65q3_4%y?~H#=95U$31h7(Y2h{g1<0+iKV6 zA^kCXG-;fxS^$nHboF*Ib zaO4}<uzNv1XxAe<;@nQstMwydto6MJE?^`lnOi*=b340@d1sGxAe zMeK$`C_r2(;T6jal)GO+g`z53MvPKq^xPdJ3~r;F2_t1ZycWqH{c9Cyy+atS;VoDh zlxAKXnWkYJopi{|E7$}^nxTAE-@Wb4_1@)aU=bF)iUaUVe?#nNxCc!mNg$gnACMq? zgxHr;9=fM#kCxNr2S-xL$&Q_M58D*9}H=SYzcApF#hTzp0` z2mqD!Sqirxz6m@sZ~*Y1P)u*44oaG) z@$Z*`A@k`7#MOOt1haamxm~BK!#}L~QC=2IwL-+Z&SI79Rcyt^FD zOq%VF;A-hd^ZfYLk~{~7?h`99%1SlWvepJ68!%BRg?@r3pvG+0m#z=__;$uBr;qC; zUBdY~g>4nb;D24u6SNA|{+l|ffhD)91lN&!N@hm}6{WMRzFDZv(Mi;(H*&^Ht<|LNpN=fqR){{eLR8#3Spfmn3Gq%=}b_69A-3bks| zj+u{im$zoez?uloZ@zCliV>=9hL*~kXh|LPqIDz^SRbdKp`EjA%JB(A<5d`A8L)g+mU6MWd5Y}Z`3JjR-6JlJ%IorJPk3J0nw!C*QyCK!a~*LqCZ zTa&w@5`6bh6+<|hN=NVCpEefS-tlzgPv|7v1RuPCytZn@8O+yi;9A{e)i@+%L2ZKr zesmF4q#X>-KTG}xM5tUqW))(1mm+fl@Wd*MbmFJb z_-y+YH2Pp){;jz1n^fEL2@3=#g;I;*Yg{fV;9t7l*CYt!)i{L^$HNbfa{MYAfKEcp zW5uR&*)MH&2ibZX%`k7`=w9a4U1s$i)m3D@v9h_BnN);2?yLUtvg_WuI+JNhbaLjV zY!zd2JsGi?VU9X6UgY7EdoS^}j>FXr9)&ayfb>d#Bne#u&QksOwj@JYTMHrP)KmNQUUoHOpW6a_ zSvqaU)kcPNkVh`VZMr2f-&~g2ay>VNSAtF8bE!W1Li8#s6cWWJaAgHXIY-FQ-ga#Y zHdDc}EO+c^59*NNzW|8SUEW}2gw6zS>b|Lr!oPd*vWUTlb=Dj#*21xm+(kvMuy9_e zQV0(6hiVZ9;73=cY;O(SIDNW6*(4e58dPOEX_sozH4|BwD%oC?8Or4>9Aky4d#2e= zjZk0-&u;p%z{&Jw%XM)9@V;(OXWB>9&^zJ5XI(O#`+^>2FL6~Tc0P;=`%|}mTDD!T z04hzkUv}sP&g}fP^nR?68(Dcg{?;b_6CGK%TBV{0D}rFz>(bP_WU~txgMHY%4I7X3 zo<`LcCd*o#J9bmjX-fRO?`+W}M#f5{cWDf?2TkVP+0+)8q-$FxybOXfI@IDLIU6~H z{+OiAz9#0u3< zLYt>cp6N8LJUrRTb9Kp1iQLtf&(HRKp4S`gxA6}{HCQ^kph5$~k~Qr4JMj;ArLRZi zXq{3QnO`?|zw#|#DdXA1+3xaWnkMh}c`D`V}fw=^<&ztnrCyhQ&7*jn}pJN=HpcPbpxW$-x

9Wj`;>+_`$g1t~*9%614m%v2Yo(GJi(R;COEd1X@n}3^k@>?!Ez5dan zJ<>$A23A<8X)+~A`*EU9XXEZ=Ezyy5=bNK2O0ha!qZGe}JEoNkw94 zy|Z<52~b)xH&NGo&D*y0VfP$c2J*vCI1~|zjA9C~y*_Wmq1)!yXpb zXUmV<;;#4ED*OV}5M9M8$PyT>`z1$eie_0t<>)wN+d2t$!yPzdkK#A*44p;xw1P+t@ZwFFy=7x8F}? zdpTKb?!jlcUoQt%zv4tM#q^lvlm=kb2zYa)3^K4=CLV2iK?fiR6aDZ!2cp)MGbBmX zz;sPXLbzqOH|qqM>yk_;6;drrQ(z{&y0)66Fwy7g?4I5)ET^00ayv$&%ajLX2Ef`0 zMY_nAzMihDma|kQY7oV$Z`72}l`-VjENLlT=#DM>3O7o#71(?=Ykf7oy3GTN_(-HF zTL#elv|2^$t!HXds8Pa4SL^TN3K}#5_Nhxj*mRP~5I(Czx5g=Gf zD(1CiY_{Yw8<#NTMB}%avF33>DFfH@h00B*;_wzTB{K9ISI4^E3ixirW?vF2CX(&J z9Pz6Seu;ar6siMH!`-GulgX5l?P`L%FVYN5l}ipT#+_V=RE6Q`bhoU8-X1Gl%TQ&^ z8U<~KJ}<5wkoqjyOiN8tv`yOlBtmy;fT=U8hpqSmtW>DUQfwJ-Y6b^-G-K7Q;J5+X z((!P^AVd9L+g|)zBFd5MC*=#1z@t`!qBN%dbTC<35xG?%7N+kQpDIh7Bq`0eQFL`1 zrN5T7T3gF0plo67ozux}D8Nvh%%tOUObE6?m?kGhH)&lbX`{ts8d53y_d913s^a(_ z9RAm&kSi5fweP~pEFV?0pUF0NdT%_72g@XSd5;M~}vICWzY+ zdyW2xapZ%*R>izw(3kiLJ!G;%hf(#X-p2?~oMk4s8NfFX!*B&n15-dzbHU@Id*BL_ zC1})&R6?KcW5vmeG0ma=1@ekx;LM>e5Kd1(gzi{aILq5FGW^D+ZgFL3kXzrxED0D4 zw-bL@qrYZ|f)~n`GMv57>}pn2!kG(<9#A6Up%ZZjdc-KMTpCH1Mqr0;l%=+y!1&9u z4Qf&l1DENQ*%+bbJdXNb`fD>^-a06(k|5d)S%DQyE@U<`$Im7-uvmA5z-xmcLUP4V za-LZ&h;jmoK+*ZLLGlPptNLGzDT7zZKogY54+HmC4JM#5QA4Paa2*l60DA{c!L zT$=BHgo#%GN(`WX*$kn`6{4*Gi89iK<}|Ne(pAKDfW~LDa?69Z2n`S+bd}(6#+gk1 z(qRCn0#V2|&hYQ7+Mo+M_>&|z_dMl|DT~0e9xNK|#qC9Ll>q#h^4UhWkjGEk8e12E-pohD#GlR!BomoXzMoRx~P2GzoffYe#VMN+y+ z*G1C3($+PxX|rmyK&NT6#L%b{itI>{s;#s!HAIG2jUiAp3} z2iU1UGs0d6)LX@3a+=?pU^cG>QzZj9P8Wl6us!zo%U)D|F6!Al$|ia3<8wmWCmXt5 zX8ZU=Y5JSdSVY<6zMO6E+xcqhG{@Qp(7RhXNa`0`wg*m-!Ly zsLCq*#T5m(xNo`K-LcGedS3z;4u+YaQBUi;=s_0F_ABb!`UePQS@q2}(1-?a4Mz5r z3+58R%t^s7!0CR9o-<3$gVuo1>Uhnk!4YkVTSf_lyv_T*FjjN1G08+E`fD8dc4rB< zoJV#>Mgv^wQn10(Ic*{%nHB;Z$UIhPMGZsgp*~R5!;s)Da1a#(BPIfb+}*TNw0)yN zR(rL``zC@%=s!HZ!l4cAa?pSo!mQ81>ArzP*sSX+|MrRBc@hgL69lC3w9G;Oi471k zQ>yd&31tAdlg?MdsZ;;CazOQO+!1s(vmYt6BJ1})J0$bO9EEuhy9DvtF%A%?_!+M(odgG65GbELjwYyofEsSM|H$xX??#51=cg972`ymV6J%OK$X|; zCk>QaN+M%?lpEqFn6p~U#tNfYj?u?>Z=iEX_aHXkNjXwq+ zPKGo)m4I#LtZ{Qi6an47D5UjZck!XoqrV&rJyMD6;136RVs)l#nUVzx57XDxV<56J zL~@+Ff8y7o9%(jha*PoEL3M|ih5q5x)#Xni=y6dVeiP-jGbx(w0KRk{9A$ScL#vu_ z$0?>xBZy}2mYHZXwLVExKlhlR zi8u3vAyI9I@yke@^e_!cg9v-tjH7UYxN!+*$c00SMJ3sw3t1FB;KnoH%k7155$eds z<|g1g!R3k3Z18O9a6v6hRXz_xQN+}PkH}M*!x>u!ar7Vx8*lg**gtMsSCO^PbwL5b z?wff11V6)%;kAYniFpXfTj(|z#nZQqWS5RVz8KgiK`L`5YhwNfYY9|_0-BHe!BXj| z^6EhF;O&pRMx2LG3=lYgz+mP-$~f}L&V0jO0Q-2x({#6=F7C)C%3nKNA&*Dw&fnu~ zO``4m_8+%}899IWvRk%JRJKFrz+{#^xKG8KZ;|a#H5mi|a&PQ9tE;kJ9@h~wm>wm^ zEVznG3U%1Hc(5!Wk^Cib&zSJ;z6|@@5C#Y0$;r3*qHx`az(7157ho^Tcj?V=p)7vQ ztmNBqiL(n3QZ%u5IUiNT>&X`3Y^n9HI%831T;&5#m>Oa2`nb1hK*nID`Gj^dDnE_p z8#CZTpEc}1@h^LSOKmf^GVu4BsfvvXLkR+GF0#_?AS4#&N7I zM2orpC358ix77}-`SqWgYYPNwqnbin6UK#*)iTgZn3frQHLg7o5!vdMd&*zF z^O@@KvH0Zg7$wjbV)_J_5+&HNEg-xT5l29aMW&#YYF<>)yScR+_0vGw53J4ek@M}K zOrIz?f0J(^<~3g{wYzrrrx#CE>9}>p;^GKd(mX--@&;T{COHdS@uD!mK@CTORsdmD z>`ac}6^uLmJ?729P<}+>$2?DQ;ybJ97zrAi8n0ON4L>WxoNr>rS;gD)JLzfg4i`M~#iS`LB9{1?0(S z)G{!(?Vk=5eE~8Vs5qYab^X2d$ynjPwQZ0K;5YV#!MUe>kXTJPlrT}-O4)zLfI|Vv zcy-95dMU|}f#mdM^Un$}>2(!guID2dNPhS?X7H?&-%tw|osMF5rJpsD>1+Kli!~^?!1&n6v;H*{?S*#_h2nUS|*Cuw@g($N&zfRX|O0&3d$4W?J)C~_aUrJcR4qQ6kjvu<|pmBP9T1j-LuN3z6vR%N}e0j;Vge}}S(EDy%z^?W& zYUb0k!TWqBa!?j)2Pc{oRxmX2DeIL5>f~~s+U`T)&bP7m!mIClmmVaecFLTIwjT_@ zal5h$zBuu(~hW`coE_kmX9$4AYy=b&%W|L{rCd(FVnT%vA04NN+Ge|cC+ zvNOxKltD`j45Ho+L81(#3Vm~_5QeZ}V|1{auu#8zBm%`}F9v~#8(6nn0(GtV!{r+h z={MAw>4M2c>Ch z7a1~u4t&K{>relzg&&iJluPAxK@a@9rrFu#6@f@`R3Ev``Y6h4XuAr5yG4=OtzW18Kl{b{YKe9$?Od!=^k#236?U;NTMXv-@? zZq6Q=d0}YtLuI-!&_)Zn+7ac?DNwA?2)UakA{dfaqg+MqA1=fnc4U0FHcfvz2X_>M zq&BO+SZH!Kb6pO}2Tbu{ZnsTHjVC zk^K)R|9|E9U}0iq`rkZ{X)W2T!`6h~g~1u|$KUWMI|NDZa9r*#FNcGiwXkWtH6$%V zF(i}3%#4{jc^`n^*SeV}4maNHp*V>G2vmsBvX;tO7yj*0j=$f-Ocgi1Fy38X*EQtE z%iT}jO|Q4lYu;`-H{}CCAVp-?YTR7!fSXou*J{_#WUux6(AQ`=5%(^2o{s$M-J5-1 zz-i@mJ-PAb!xYJyt}$w#b(Yg=+p3M;wPKy)Ix^qKm7P%5>$2@)YS%lj+p5{sZI#b5 zlkED+*S_-eGh5%TJ8k1n&FtpI_mAEWy!~~Vww2nE9H&KqpYcar!j#Nkq1qNor1{;( z;{lo4=teq4l}X`s?KgcNtP4E%6}k^Y50Mgm38i$2uj_~Sc95c{{_TeKIv8@tiXg_k zaYCgEc-j|KnxV=o+#6Q-F2>PQIZHi%!?Uf-{O|__qUlYqjXM)MT7@cxYH{XrLLWOn>X*FGX1N)x&e)RAbx zXF@PN+PcBh1M5>cMZ}x->+sFwKm%IN_2&1J&^I{UCAK3C)C{R=IE2we;d4;dfs`MbVbZQw`{ zeTSD{qv<*T{k&Qxm?St>d<>Rhq4azY@Sl4akwtnSCUKRY?_z<;-0*fr*DL9S6-Kdb z*^oP)*dtT+cA7DpDG4F{QN_W%7jjNY^8!dMGY|s$TuN4Y>o*PO@akkFxE)R^DDO{}8eUCkt!rH7UF3^xnF z9awN7!xvR=QisRUhsVi=D*+4Dc!Z1U;Rs76kaTsz{J5)`i%~--!RmBiC2I>x08NBy zg~qp_T6OP5tl5fA@}7R1vJ5?R}xE`P1l;j(Y#%s-QytgG?N zdLOv4!H-$l4Xk3Cm>h|Z=I$*bHPHYpj)a%nwB-~PdxV21?~l4phd!NFYHZrbEl+r& zL1bEJd+00tT_hA6NXEa_Ti4_8+%C*zYj6nz_nlQ-H->Fj{csIg6@P1h*T-=QaHCgL zb;gTJ-%%o$GfFMQeFtyzTVClk{#Uy8*QrvtFU1%d_Zg{m>|+$odc z@L5;w$7ABz-P`9!O>g1+6$PBlb7F{2f#JC}0hNo`lDf}Q>`|TP7Ye?XoWG!?<&Jf^ z4Sah5u0Ypt9119j!UsYI&=RpmI6^@NKcK5*CqkWJWD1KXNYD`!hMMn*aSafuK#5fm z_fXVJO0n!MZReF{?r&F3Hc*AArq3O#DO^=W!`;tqM9l8mNuvXDKs}dgEq4!ARmSp? zm`C7|3lCNvYdz)5!G#h-A?X}aIOg~(TQj`T#HlfLLIU!~Cw%@QQ2O%)u%Pcjj}s0a zHO72rkH|s?2={ytFqIMv`isyv@0DI&fQwkH4F@0(#9sJZ@sI66WuZb@Ysk~4>lX>% zGnMgoXVMJzAJ`mpHND-EE4(>D*-7x3x^P2$SQAWKYOt zY&9Gdh902hX653`wOg$k>FK$<9Re2H*uFfYIS}{8&#;VLRv1>Igc<1hQGB2fatYY$ z8<%!sxE#GX+se6k3=@;{R;4#OI!je!6p~!+i9l5JL27tdS2?~8>tIaZA%`lyO*Q~U z&o!AvhAr>i_h=K}vs4m^X}?@&9KgRdixy4(8MPV44AROc>}z$t*yAWlX=K|>@%b0| zwS&+k!3pQJ?l*{It+HQK0r{2A{FTil$VU%Vv=DGOj()AHNEz+ax+mO)dPe>r zgi*jxJNAr(|NaH#je-EWmCZI`PK+Ae5qO5Or)~%S^ChHFBUv>L2nEBzG#X^&T!>0$ zn3@J2I=3z_3*IZEj9s#n*#a_6O_1u0>=bc-l}S5oRlo~iN(|`=(`G<;{n0m}IHoJ*k9k_m zeR9^YUS%hM=sMq$5AmkuvUJZq4kbJbtmgd#w0!GFdwH)PD* zq0l08j@*C415Q`#I)F;^{-L8XC^Q5b-P&2McmWC&fq?0=aFG(d(|G%@Ic=_>D~!?U z0gLjn55T*`_9+HuWb^PvKN#PM?XQ7}uDKo=sH~7Kx8qg4v@tY@f9~`~IQGswO4c%fw0 zF=|vwf^%Rd^+{j|;o6e%9;J*gP;>BAg*mJ1%x&yR;*@|wQKB&@+*|-)U--O(COh3w zOkIgG|1ICePB%|r@_QZa-djc+>pwYT=F=uF-Lq>>VYs@%wh>kN+vqxMwcF6K2wBdr zzo@57jf9ki&z~TqR~Ae)g#UzAQku05FlBd*m5v-AdOhL#zv0z>Y2N=0^nw^1_rpf` zO<&%Kyis&9!%>o+dtrWAs>DHnb=**8`@y~$kwEpPJlUuNmdOos^V=eTh@)_}ngD+Q zUrsh!g%u=WlO6f|-2WscL{jm$X}po588gHHKy>rCDm$^S`@Ke$M2PgB z9s(9dE}c zp>O2JiSr&W`WC%fa4=dBL|Kb>#99|Jmve{lTKise2#6B1IPj90OJTfkNEkgu_{_rW zbyo!}VxrZ0ahfv1TR<-PpjhSvVYuU2|Al#}aOm@~IX57UN^SqqO_>;UnKY8=Zi*sX z96_SN*CwGpe9}i+MT!HcbhH|hFAuIEwbJJ~&Kn78N?f4Pa*|%20dwjI;SlAUT?*BZ z(h0KkrRf&Q&Z16-cHqvyC0uj>A-_#Jd~HM6k_R}VMk60qA5&Sha|+it(Oln6n+=-; z?kDDs#8wlVjM|IzXq@ILQVhXR_~+R|i&3{^<_=i=s})Mn#yJ)Co+_iKrd>lP55+jY zwOaS0)WOiHiD&z$yKn`!v~41x__YgmQvP%{1Roa>j3w*&Llpn`Kl$jUYyE;aTZWqY zhdaeQyTh5tzNRb5B7`6x*DKye*ZiM(>e2aGN1peeVB4u^YQDS`!Mju_&P{zEOd#=} z5@*c(dhyLn=VN38;Dq#Ncog%2d!p-(n=g>ARc41O+im z2GfZ`QcRIl2empqBonNuJpU5X&heZu@)Pz81a{0GGeB|O|CoM@ zI|W7u3)?JV38M4|Ea16iOZUoTJpR;Ac6&wmqn0ifsy8ueZYSnsLq`gUB!OSs<+EJ3 z2Nr&k9OkY^=})Ztwy8>`PM~X3$r%Naj=rLdm&euF0%ErsYZ*zE%Fz(fz{juj>x7gN zn;$#8Q%b<$c;mS3cj9#*c8ZbzDzK^j7_tr=YvuVPtGFH>&bgYN%BVW-#2UG|!Oj`R z%)f=6J{VFS!mB!G~4a+c$4N-1qcuLNSDm01Fr7PpxZ&0|<#$6aDUQigp%n zxRF7B7l@$Y@vwrV20_^?B8Q|lQ5v?kfiW;Qw+4&ysb+&W8Kbpb{Mk@j&;afbB@h)U7NI#?}3^{a90Hv_)&S_iEkf=W~j z$r-_WPg?lv4U666$~Se$*{f@wjI9$ez&?ZNFG5F3@eqq0_LU!Ne($zQyW8$YX|c}{ z6)Cb^fYTd$YL0AoO0LNva%~Gt=7(=aQ+Io5Bzp{gM$y)2ma(IXSf{krJ-Z?28nFxD-&VDu zkt0~(4-qi_=siofY6VsQRq_^=$)#wjx)2{ansY%X>su&o+2Q?+68Gx}LX~`KjnRZk zQIZ6t1NeRu+yT)T?rjjV{^xLe{9qql7Nf%=iYYWzGE*G zUWq^dk;K-X1P8hL^@{BtSbS7}l{e#=7W96%lUQ7QrU2x#6$C5zaLHo2pHA2GMKk?X zHBd*YKfo1b6u^twp`)1%N5W3r`Ph@xzWMn<<6g2RcX ziclC3;=#4!r@2$U5J8w|AAN`X-;@UUxiH4`Vxn=My@U*jQh@pa~8PjIP8)NWH5nV$Hlsp5Z#H?)%UJy56QpIQoyb!7)_& zz@@^@547i}^>OS?d9DOpWQza0-uGc% zpc3)O|DSMh{#T_2W=>{?|DAAbbLqq#u{qxULyhUq25YN1d=10pUkmkV7xtHqhyCR< zf!nm1igj%-s4IGz{rFU>i?%EgPuqUlLo^17Dj6qKQ?0Ofe7KOi0ev6MROO^KM8Da& zaR~1MfBrn)gtc|?e^t9GCjSvZ9K5;aeY(Bh3~l%F`m8f7mwz^>j&t+6HvYrAD(unL zHi6F1VzcZwYO8{ClYiJ?iGKmeEi%82{8`YoS*76og_tjnl``_Nq_OMfGd;m;@9_ORVbadB9d}e8QWg6 zAi6nkx6FQc*nyV??3;C<&L0yeP{r8z)?3m`R`a>3BSdIWrtDztxu>vbk{+;PH6vg4 z9^Kv^_y%5|R$zf|-fd--31IyeJgLfSB(h~K#}k$wL><@tG{@6i#X>4kWAIm+pYO)& zn(5}%h>nU_Y|7!6h&;L=plctyo1V$$ai1vTMIYU ze=>dmjuVoRmyul${OmM=Ng~$8qz)T=9YC{hd>2vqW2_Ddr6opRtPIhUR>JbQ*R-4MjhK$-PehsAXo{+z5fq(Jvd~mp59#YA4xj|HLefN z&=Xgkg6!BX&NH`u)7yQ5*~@lwjg7Nl!|0!!f&(B(JuGAx$Cf8eP|Xh0XYgb@(TNly z&9*GzK4hV4qiOtH#Z7;2%o(3VP>V^XIyIfdgE20}UlzTPY;=FKChplx3 zS6TaMNhPv&kmVi$H)dUapZswcjzH zGKuP&y#9>h7@&|44yQqm9R8Oj6~A|xX~>J<{aGnzk6mGs@Ogd+I>=N($jVX6pNjKE za`A_?U1JgbF>t(LCv1$`I%aJ?PCSg#f9GCP*w4@EtTsNyH%{zquaIf(BcwJhdP6?$ z!FPP3JE|!70^kZ0v_%0v%ao#nb1f((XX;`4#a0Pw5I)s)5{D4Tt?CX_i?!iKuK~<~ zy@O}#A~?NIHj!gBA;1M^elg+6$|d&b!KUVp?VcB*2E>8P<@tnNMPn|YE~Fy-8}z74 zAByCwjmippqJ{DhWXgMx&n~t=y5&@Ba$x}nhW(kJ;76+Ng%$_aI2CAw_m)Gi5cMVV zCXcV1l?kEtL*gO1NP|oHXbBOXh~84bxyJlqIVCQ}R&b~nO9J7#V5M(sF!+i8oF#n> zWd`L1l06L$AGWfwrlOJYQ8E5PXk=^Pky63nbueb{0?Ms6h0!;Jpahh%z+$5U7Eu(& z4AcT^p~TnoLZT1&Zy!z--~4e3ruKb*27-(MwelO3v_~M=7eu$CxRxaYPwRHUZQlxh zS&Jc?A6RuwnBvVp^wMtn~<9q-8HDc89~PELz^p zqd5I--*G6AQ^xku0jxCxtB=25K+_(@M0`BoJ68U&uA%BBzw_`tSA1_T%?-mtVN4){ zu};A$uZM0milcjwaIAsE%9h+fs()inlhns?lxk#v41BMJ<2Ism7G&z6>x&0=V`;f| zXSWBo@zE#oCzqA~IyYATS&eYaAeF1v^b_2dsf09G&_y&QBOkSN1P!1ZPPN zMbIZF>{scK5!72(#wdu)M7m2oiH_So-cQIsb9P`}DGF@`Qv0WkPdC0oOGqjR0{$LJ z>OWub{XD47&H$Pd;O5N2;bzRhLHL+m4BCCJ&RY^vZVOiQ!`4Bh&FDcRiEk{-v)Hw| z^wDd{|1fyv&md*q&U^=0J8tx~1w$i%u^W#)N@jtPy^P3E;Y1l?DNca9w?4YH>F80; zg@(%Dqv+z0kUEhsO$&4gh@UjHa|17eLfae~`1yw{2ZV2nHrfun1E zM797um1Xp@e+#80HRCGaOP~Q101z<;!~{xwMdN_T2U#UQC{+LiZpom?%bO$Ny>B#? z^E9LisTu!Pk7!~Q+(%o(I#Pc6zNRn_pG}nZ0}v~O*$kB)F?H%WBe+2I$iSBoW!Ktc z5c$u^BcUp;lSBKxgT4^vbXtf}>1N*1HdTOM35s32{^Co9*r<&nn#f|hxH+3G`q@cQ zTgTh)AVJx$7Q4O}0~n^60o0vgqp%O4*8aFn`>f5^!3#jF0wxji`ybr~5vg{l+*mk= zih0cVH?S9?+m%7SaOLEz<$F4e_G$9vAef}4#UV-3u99+(C%?b26{?}X*?oX2l%`EA zueIYu+OUFol1*3#&gF5Bo%f`0S}od~_Siv0)B}D$F#J*q9IS7WIO?N0@IEA}c?kvC z(eR+&dib>~RJwvSzb|mF*k;w9u3DbFp=6jU)z8owk%rjq;0@RIS@j#nAgJMCL8efA zFsHN2)f>SI7aXSw0qSrRAslqpD>|Gz2zA3$l~ga}d1$6m*bNh(&ZynK@I;2H)QS|R zMF~kH#k9o4pqBHsA#{T2XTbbr*P`VKck~|eEF~EX3UcTOY0M}G;khXd)4bUcxQ>EF zD+x!HG`iX?B})LHeKmsfpEZcXJjdK(VNMi*3Z5*U7hqqTcB~pF!{q{X`>;3`r7UaFMF2keR!ufTyXEGY;}wGVDa9UI={iJ#yL) z0%OBL$=h5bBc&j$i?&j8F%*2-`h+l0kGcQQ5SXIfMg}u?)R}>GwIJ)M&nR>(a#ECO zK;Yjmcu)!K6LoiHfZMVd+Q|c=l}>u{WHX!^I%@u$D@RJA2k1=FLB*amoM5xZYt~9< z3r5Q2J%*6LpJI3MSsastiJmmex<-YS@@r>0oSPMo+EZv!>$tKYV5Sm+U=XI3ckvDz zvssjfi9904LNMvqBN;dJnEZT9;h!lcLe;G*HvxyOErQX1(l9hwwk9u+Ad?)ivUUh4 zyuL062v!|tX!Ev0Uf|K2BhT&~`mo~JFC3Df4XN`NgbF&owx#-0eVZVI)3Tr~Wg=Rf zJ{K(4+pq#^ng!7IIFapk9$17~bM<7BW86LS^?~1=^ZFOP0=&`wbs>~tC6NsvTXV1_ z9o%aJj&-(K%{#AO%C0=#`WstP2Z^6t=v$>3Q+XtS=-AP>QKEK}Jssig z2P@g>AI_?uktB6)(G&O7Q~a?c2s8zI7a zllUokTcsV3#Dstt{ey&_T+cPrArKXWmscSg5YU`NZih#=9WqebkA;Jf>ft`I0u2D~ zSQwbKV_Y3b_mXB?GJF;DPKvX+zem&t&H!J zJEsc^Y+kd%Wwy}tER33u%w>-&;85$T9we#sIdtY`+jB&rcVmOEuEL=kAH(=6T{eO< zjFi&g0Uq$jyiCz?eC^w*=a%O(0Gy0O+VV%(bQ`@dnPf8JYBTI9DWJ@d1n=LK!CM{^ z;$(8KO!pGhdI>RfTSFaH*ED8%v&cm>K)IAZS@Db?COtxdb-3D36+%dXk97-F1MOTz zu1@NnS1wptWyt&-(%Rrt9NwjIugR!(TZCl_6P?-{YrXt%q`lMQs$#a9;31;4K%PJy zmSB;t{tkH*N^YTX;8^k)u_x8I0%rl*bbtW;pEra?@grkL6F+1cJ|8B0u%U4tMTTQ9ool=R4!n;&)lnD;2Wo}j2%FF z*7)box6b%G8i*X1+j80Q1C|hPm7N_ipS1)z0db0kwipG{87wY=L++Da?V*jdQOva9 zKpS=zws$=nZ@|ZHr%{FO=Hou=@F#k%q9kZS7qWS`i)Y5!`E|}x2f=;a&mDgwyg=!Y9$BybLryzeK#4)VW@hHZ)0kz)im-+C_k#3z)#zQKYi7` zer@kB;0*^fk{T1)T0LDFHb@yzZ~8$!8zoh4U4GTO*LA@<_?uNRNRB#coNQ0;rM5Ts zqAOSR!ZmGg&GZx7(C(_P+xyJ%?Jlw)>$a;$HeD7`n~|gKlN)Sy6*(#f*}kEA>B{i` z=;Yk2JHJW;8tjK-&2L{cu*;){bTaTCpv+)@LHNGUvu=Jm&s~WTsug!#TqwTgf3LAt z7s>7-WDJ@(T{~T}aD^^A%NtLW%*|}(7u1@!t2?KK$6E9>;JhL6-*NY|u1Y7dFD?(> ze*NK)KE|uEJ0_wjxAwe|BhLWDSywl)rskS`)NDI*t+w2|KiBZCG%AEhwkbj(0)u^^ zRIH_r5r_nP0#B2kzBDNS32Xrux6;BIW`bUW3TgpTJZwwSNBqLyDC1P6tHorA6)k3* zPu7=1+YOI~L1kH`d|;_cVE4>eQ84*9pB0e z;e?c>^XD$xokjJ84_|idVB(pA@{V+HJm9E z@?fH91fb*osi314ts@cZca^c!Go6LC@#l)U?O^hjU-wc$C23>Xy#&w!-<4z+*es4j zsqJG%i)i?D!5U%ktr{9+z7_Ry#4#e@R_csx%}054+0nzR8f_zXuLd3}|02N1d;%=Q z>7Xn&>bGnHX2{{ICS&1$As%S`cU_y=nwv}<48@gpgN;oWKHPS^+8M#zrmFwL*f}+6 z7H!)$ZQHhO+qSJr+qP}%OI5PcwrxAJ(zb5xw{zm2hy4#`teCMPMxUd%hFc`$_lMno zUb|31lS7*RP>-lVp@vyz0Af%fDRovi7hI=EQ*>e#R(3DyL`Q;G5R68ES%Cp%Bot#l z9NYAPH3AYBYWTB;M_I=jKk~UQaB?d%EKc^8aEqFKr~UPuw>9C~SFjT^1qx6GZVAXj zd1fZ49FhUnU5B$aocU02Rg7AZDC?$~-`P$5ON1pMKIqOXC2)r#cIo#%|Rb&u9Zyc*Os&q1!&GFrlfUd(P>;e7N9DL?jC$Gf1&##`Xy=ffR(r z6jQq9jUQ3s4!Ox{El|Mf!S@NMbv8x(uM`C_0c3?#Zsa%W;_AUKcY1b&9e!Y_!r_g2 zEpF|+zU8+>QfyDe5#d9LEiaS#Y)XaF6~5okd!p@rI#=8kIZX%Ld_c!@df-eY#sH*l zKEXdldkB8|KMPI5bDKp|d-y|R@jArspyR3{P1Yvhi}xhFX^}p8SnHKskTS_Z`|#HD zp^nU74EFI>Q9ZN{2tdS>L}JyzF~2BAMY^nk9K5GaMcX3CN#N^|aFpxr#^c&R7?m|Q zFqa@)XcBl4NpF)@KnrY{)do#)5bcGovO6A=U?Z6jrIwL6dmD~M&P&I@) zvqV>3hHFC-Y30~f-y<6_Muf$F9KkRb78dafS+)Mck{v)TSNM4F;eiMYFhlq}iOw}P zcp1*|8L4*G^Ufh;GWo89=#1eMw@r7vV&m|Bd#@OQ2BHanmgyDMjPC~CnlYJG_uXxi zG}dQ_uBzN{!3M_fOi5E{fM*GjzK+53hXor8hO#qOqvklrH91we}Siu&QNjiKEG=rI|F)>xqsrU8gJ?Z|9 zHPRVJJOuYoB{ML^BFZ+6yb3ANp0{f@mz4Z8OuA*T(FtcMY7xE*5rWh)9#9l4 zi)1s1EBNa~N(*em7{y+6o-YGPH3na&MtqbPRyR<8cxeIf%SNp7fL6Jp_wLZ zpATOZ4&dEA8Y0tp1m1l25Q#$v_%EB3LG0~)pn9%i`(Erxcd=BvTB6ZJ@jP6_*9r4; z%;Q6vjhUJdv}!Gpv^==#d@%;uF$%p30>Xe05K;yfzY|$xblVA0N(^2U zlh6#gA|U>V=|ZZnTYC64i!|xMPo4hMD9U#jOtVr>YOGC z+(`pzkjzvzJj)kJ&;gZ(m6S_wxR7MXuc5{IC+6RC4}8suepvIPcqU8LWpwNHVmupV zvVo-Ga)dw*DYFTT!ay=lXA2oo)OEESTHl$3c$xI7C6`?s`Q)S%Tv8I@rJ-F=oYVw+ z<(l!vW?Z4V`95pPYv}q%e{El zZVCknw0wTR`_yuBKGoSlndL502}BNaLWzTM-Hc62A7@I(egCPOY?%v^Ohl1c&u#Ls;mwy z12+syK)0GUGMorNNg1|rcAVIw;3Phc#~L|pr*s!ov3RgNFfSOZHO z6w~8Bh?%EI^Im1Id=;HAe4Uw=8FtWkGhn@qkxVgFUSBtksIB~_hvkvVe`L4zTanDq zurOAe({JSj{;kx2_n(gMHpku>Vv)ddhJwipZ}oc;$GLCL%kQ#c-d$Xq0jq5VYuP)& zW1m?^dzWFUOo-mBO095<{#a|IV@H<`zib_BcC%RaQl2g9wVxCya-(py^0@+00OT-P zha#3%;tuZ_GCu>h+h6o4RNsF!3}y6czTn~AMsjCtKbkMQPnoIir)a!dL(m-QL z{2N=aq$*bPtsf+uN744KO0KL4JZ&%)|9gZmKx@Gatj_m$d8hsi2{fd@48$3WsX{X$Iv!E@LY zvP-Lag#e7B0VQ4*N6n@IVHa)tJJDkp!xTKH!~30ri{rE7`~jy6`0(SiJr8@2L<+Va zJy2JJRZA0w`zS*R>1Fa|Nks8db{H?%Fc4lSe;(0*m#CvmmBQYbW8AwUpD`aF_&LEA zW>4}!zTyz1UKJvc_+tG>5dIfv$nK7Y8>&JD2@xvP7!;jF(6T4b5_&1?nu~k?kvLQo zhFJWwxBCRLec@w6QnD^KLj(Mc?c)%qo3@IK2<#9q(J!QVw0u}TN__(*=#a*f>nJuazNKpLQwJ2#fZ0ymXX6Ge``nf1_TewX z07;8lBo}Pm9Xen#DIxFN`%Rch(9*Kxa&S1)%=atJ7i_tn!i}ehVE>t@2|}3n3p6!f zbZ~t!=lDZ<@tXd)>tD*nv<+b4t$2s)tWWxcz-giGEmw$3y61OZZIrzDU9{E_m{p&w z`ZeJr41~S6s~A?1p5nGr1S72if#Dh30!xCYwbFlH#M{mTVO5Ys&Z;67)%peu-_IN@ zxDFjGh?oNDyPj^Z57G6VXE;N67q|$}Bllc{B8$$ohCT^*7sHIn)>h=(Dlkr8GGvWf zsu0ketOT3GDj|ofvlb5Z+azMj=tLkW3~GZ$1LG%iVaK!a;!s zC#2L*IQ99B%G=lW@}+_eGt|^=@Z7&thPjj zJMzqM^ zfp$sQV|16+J4dfC=i-^f&SO#-(p)iaHb7b1h5ms-Zyg`h4Lpdbq5Hl%2ATz?7rk)Z zEGvum3nwALFLh$^79MzN3Yatkd?sDPfEqH$SGqc4XetPgG>mm)<;F`pzTphKDn2woz?Xz&QEe=+$a zK_X_=1P&pk2fKkQ@pg@csFMQd3Ec&qlPsB{Pml&uPYy){3%VtU?-B(Q85|(fNwC+l zLG~T(Af;jkznOjyqv|{AK6?aR0`MfDWg`hu5kw^r;%D?GjE$;WU@SlBx%i$s>hsiq zWw07wbJk0qJq?YEqkooZN%`14?d_*C%Yuy`Rb&ju7SMiS;`~~Ep!*{6fWvUZ8;Ghy zM`VoqWN7w%-iS!F9`LMs6C)cj#vU1;6eB@{(l9-~`H`JG)y}>T70t|Svl!o#O~LUY zmQ~G-ba_$#JRSYjW&So=&tgBj19 zOuxtK6=YVeOxU3~*X+8XYc5g@06=qr_l5I1k?1oZuSH9iOwbMK)o^MO{5})>#*o+e z|Hpe~Cf5H3-p9tu&HO*#->>v^T@EGO{~1H~bSoy1HeV(;n$#6c95@)qM^w`y^85m& zq(r82fG1cVZXWWkA)o@Sq8opE(l#GDLkHqOZUbhIc{5fHM!^l4K1VS%=;&U;00A*i z2(tutKZKY+pT>8cH$%Zq1FW;Ty1t%$59r&!PB95N0<^z%m(@II$%h*4&j5PqAD)I+ zH=+9Z=j9vzQHt63YJ|_n96MjGlv9m1=LvFEZm;rAt&O>iz5iNdt}m;IKk*6GccWqd z_<15$av?o4@PoZFe^r5A$@sMZZ%_*q|L%k1#58 z?^3)zjq_*qF!XeM&BLctj-PzvMF$C@k3BpT7!arV+{R%mYt9UeA0CF`Ez3=XH{w-4 z@7%)cX>#X#NT*IMYhc5EUx@wH$NHl(f;Qt_Mzqs7HzE1$Tj-YRF+ksIi#RPPGV~84 z7a`h2y6?Y}{wPEzxD25DcdYl+kw44t^}9nC@I#*f-rwm+4+W80=!TuWy89=$UAt=5 zN5%!nzH+ltgXY;!hJ6uuhk8Y2860t+=k~+!%=YQEv^7mLr40djmRJID0W|R5rQ~bo z%QLEaPWv#vyV6oPjBPC&V&j)DA&P%plpXthkl#Jin`M&hgZh%`WJ5xJpm6)8Juwq{H zs%Pb~I52}I0gIZI2CX4w>?EJUmV7b4L4iOUbv4Hqvu>_s2nAuvq!(_6mjQRP-5ARn zHqT-}Z_@e~5KgP?|EImTpp}(&oC(*sw0Kg4%ev(36&22`K2d`bG$v-JPiGNZi=U;Q zjmxyO?H;^!!8Q4@Vf70ZV9m!gF7~pVD|)6u|2W#&^&2!WXz`l<8r|St#3=j3a-C$s zT&7fKp~THtjbpG%C51%^MP345>oWBZ74bS{WTikeLg&|;W65_wLqs9~n@__AMa@L!O%bDHxvT^&YhKW)i zc<5L3GS~XkqBHBQXeDHv3F!iS=i1*DroKyWBoV@Ov47Zgfvu8+^AQV0fs=j70ISWU z(Bl19q-SE!tc`}WjUWiv9KUtvRoil+FizoZyb9_HC?$FmgPn}UAk}T>d}{!W81vfy zxdV!AaAMjNEVE|MQerYWktNEn$4wuUro^pZy6MtiI&=|(dH=G5K~EqtX$5UfXb6_H zqd9HUF1kcPzFR;UCg|E^NX-thRJ?$N86LWHV4!%y>!xWXvai%XPW^P9OUtoOigL!u zaU-oy(<@8VDR42n+RCIy5I=2BP_KRTZ+CjbA{6hWwXk+khc3DRb2kk69xhH($fl| z^ObgjbYYL@zS>6QBr(6H#HnvtHA~~IawilHt{XFHLZ+|M`ZrU~JjdRqpS#n!6&v{0 z!Vd{^D`(_e9FWQuh@Hp7pOMR6c=T@p3i4_wynMbgJSS+NCxb6jmmX6_hsTwyfR;VVydFuG6E1}JF;zU`Q z1cC7jx-FEs^W;*51B6dGR~E<~s8|8tgS2bPP?Q)wD5;4c5@oAB(-b9in3s4U;0)Ml zA@9M-;rI#PyqIB&q03Y`DdW_S7y%jZu-NW$kADikO~zTr1#P*75^>0X%oHM3p8dI= zX%hjZ=e<*u&T2(e(qW#UHywZXIhUDPT~znv3lsPM4jG8xazn_V~GpZT|tzLScj51*f&KzlB2`YJp{H+uf8Au|`urVyC^3=SkCM=k=^CQW5 zBIh)f9dbKeDQ%~)@g@0lIDL$K5?9kZbxeaDOG=pIUmxSrtF|r{0<>}QSU!y$uHW$8 z^$!yE$Y@m@3je5*Al;E8b=~-!a87;FqRqnvxdS>?SMnN=BfOCe@gk=ap+#izmCX?? z3j{?*0EI^7YLIc(GpxQobTP;bf!aVPoz#3wBC+&%;rB!h3?1#rpS25}=*a~y*i9n{ zIaLM@f(o;mLwKMc_z*g1S|1-n5%>V)#fC1!=|m9$=0;IB3>c?w4FWUtx0x{I{NX56 zlBP-}`4)5A8+Pif++Y__L+C}~f9+alExvU`+KyMl?&eRxy|aM3c$d+9a!4)62(}cONv`~?!7g)RFqyM? z3dC&@?>fCzAx2VidF4tH5Sa-QPrze(Ph3JXS9E2Bz!)1I^^Cd7dc|kjPdQooWr)^S z3fmohR_kdYd3aCd>M`fD2-=8n9pZB9l@LQNG)ZByOk+VI7MHNA*M<8(TUuxNG3()E(%f$=N-f;&r0lSgp=ufX$>Fe_bU$nPeFeM}J+#sMXw? z=)KsktMyh4b?G91vAp&#O3EQGP> zGoQrp`VE&9Ro;Ct21H6GF3(2byrP?S!BIENCn~7|POx)2c1dN;k$4lW5##{`0)%ti zjM`GteIv81$Eqesk|Fp9AlL`g298GwAX-(xPk=3UIIVv_i&+Q$aF;n&d^yv2#qrCN zf8KbTY$1AWvp4c0*VzZqt4x&=kl|l}_Lmkn)K&0I4dU+&;=b4?{1~cAzL6ND!j07W z=EKk{xtQ3Og{`HTz7IWHMr2gGuqCu$)~XMLWp$dWKeUw&s%yk)vT@Vo%aGC|n>KF_ z1e)D4K(FHF;!cX>ThgObZp67{FpOjyL`V2+cge-Rp65r$Yj7<1`ZpjYI*kd#`%V1{ z(g-f`OHnwhMb9Nyjoe}Zj?t|E0E_zP{J}nFP}p%(&Th)+kG##)@fAuKTZM z--SL;%R>rJo03wm_DRnz5bqq4ulL<)l6a?fJEBj_H&FYmgSsktapGXzxThjKU$sa9 zG(>pS5PXxmok?4DS9K+qcr0xYc2!(;e`c)lu+B=wla^3eGuEZBj(eqYt|ORZrnA~A zEUwI^U?ddcot*^3dbgvo<+1zCtPm8TJkZ*c_x6LVXkeRzhLfaCJz~jIK@QH;E<R7at6tAc^dXeN^ARg(^((qE7!vA+~S*Fokf4bdMiN4r20iL5?UgnB-Yp$iT4=nb>?d>A;=Mrxz zj`1A6uipmSvL4p5Y^c{$kZ0P$9(ldM&uQ#$pw4i!)nZRK-5G1>mVpPK#BeC$Q(4F& zwjak}$>%|zT{9T!hVnao&+S}HKC+DyvL!Tfe{Gi4?<^YF){svvR6D+|I&^*$MXT{^ z##f5#<>4E}VPZ&7M5=lmsR$OBC6KU$@Md)^pnVyl@)#=!n1&+jOEq(M*2DNkU}KXP z{|jV{cfdfE-iKzkM0yd<99G?b&(1tMG*6!H4we4aVO z+vsxZLCRgcF%rtnnXh%Eds@ahAd+~caQLWHo8oDxl9xcWEL>L8^EHffR>0}K z1ba$;hUxCwcjiwQB-C(T@g)|LmvM7o?G=V&qfsQg`|In3Qxh<{;%7Q_{=wUWY-v4& zz)iZT_94?ZCgFSn5qc1Jo^BF0^{B=AGb`n>9*eSTXnFr@_5MFN!ukntP%<( z+DOyKTXxS3*H)%eMH2xd^&y7Z?`+@VLj1hNp>zIICLH$WY$I0xfwoeA6M@~^RPT{xev<b{%w|%(3Vo_j0BbBj z`B_9jaJJuGxsx{uy6w7rz4i3ulWQf;KMCkiG|k7wGc8>Iy4H0HskY2-XZmedl*x8( zK`U02XU-vajR;uWKfKc5@R4P$UGwQFe+{E@&q0&Jfz;tLmlH!Rnwe49{go#%X~W?=&OiR* zGqsCJf);c44Ti@@91d#eMD=g@Xp42HsZAU02N72rAO3_sdhKyJfr;rN%0=h9pZpEc zrqdhKN{{^n@xmFRo%bnxO4UUK$rL7AJmv=0@M+DP{ZaxrVjDy3qeLv9mVPsB*Ph;} zLIqS|3TOqH97p6%88-B3(nIwhKDjaM^jE)Lg-OtmZdo{jFaimNf-0#)f;OB=c69wq zl85sM7oYg;YlJcWm?{en2kY|oGiV6iA>Kh$Mix}CbZYCPu|_~ebG|!Ia(6}0t*wjU zb$AOYux;5w7-$Lc3CKnoeC2{^R1DBeNBw$tsNdb3S*fM@ei;_{!^K)m$T%I}8VN&v z218~O9y^GcT`7X!E}%#A(o#mdkoAmqZsk?k$fh4rm8-DhDn|_&*I%Jyn`m! zd1A=G0n7A)O&@qWS3glNo&)e!&!BLg8V(|j(FryY6LROpzgL%#(LFF^JF zTD)3u)>>SNo>s)Z0R%n;v(5#r+xtY4T+aK;0_*xgDQHcMIaZdJ{|8VRK56RpZsS+t zWCweSHTb(cs8+?qLLL8-p}u*qbzlo-1|F1`2&Ud+C9L+RTY$w@zo;uB2%NFT#Jwl# zltg6@uUjQav5ti$7?%=j3h8xLs5R<4XPV~*eGYSj4n3-lCYgo}&i0gJd{E(G#RgLY zF}gp?6{*1UXv~(~MtXx5R2YLQ#R4G{_r$BScG5b3k-E!RuSU_c_8$vP*OYy2?aFmZ z^RLEbnEvO6w3Zz)#8;L~w*WYFNc;Su-pY(%`|}50P9T6o`D^#-PK>x2tJ1$oAep+x zG?-CBr$fWh3vTK?HcarhYIB$h#1xS??P+Wtvf+ELh!*AY^q&jL*sW74i7Z&Fz!(tD z+wV6eUV6%@r=c6A5joc+Zt%0dBtrm7VdiL@j!-V@74uX^TZ|c03pfM zo5A1^qUM(%ns9AHh*-fwx%Av(e?R!SX8dD>Y5zd=aHshx#%qkpuNwi8V%@!sg1Z#w8?pbW+I4%PE{wgk5<@Nx#LJYWy1#9(P5{oEm~752A6H;2KD6oc#_>**JN0;}(}Cpf5fs?;^&1=2ZRFaT0~(Mt0< zhY_(Van>eks5W}aKAYY(`WxR-3PnE?LUNQO5PC@qYu)({?8sKTyOxN%w$Q>J4~A&g zmu&ZK3U`uWoN@pTHzH{X=VQwbBRX0eVk4Kh!~iHlA?hp$VlcbtSP|{A{Vi{CtysMT zJR-gHHd}`9T8vL~fKo}r1cl`+2g-D^m|aN zi0iee-BYMF+}lGSbz8H^Q7=Ay1VR>+`D6R-Hl5%Kp?^qejbK4w5z{!p1Kt44k>warkPaqV4-|$#T4|pFSM|7PTp&ScM zFA$Y?D9@68K<@eFewDH71t26G>4vQS%|m-%Wf|&{oPg8tvAncEs*Th#^sKR$IDja z2k3EQ!yw;&7S+5dc9YT`s)ci}&Lsaj_EpGyIIS{5@>8Ar8l7AZX3MD^p8AXsl9l9y zp3Wo#WJ21{S!zW18P?R{Oqa5IPr>*Zs{a-Bn`rl8zO(Yg#CMZ;APzsY->RcbB(d-H zdu`6SxwAyY{XxO~fjNwiyJ6Wc3wt$e0M~lufV9V|H<+p)co;Mlx=i)NMgwj&iFIt+ zzZsMc#w5Lroq$83o!K-SSawhu*?o3iSq8~$TRh_rf@X<#9e zk5AK{<#AyTu|gO3R+f8opsn!_74L*ZJ|YnDZ0r_pWm3~*^$Ihnd_MbX7wEmmXN9X*s9o;EwRlR^1Sey=`)sVDUd)8hKc)Nx{K?(V>fdo+c~ zlZ88T1Oi_%ag%4wtnFq$OrUK^05!{#34SHPIBzU3Q~8!xJ~YZOYr@i*Jkyje!yb*PD>xI72-^39@9N*~p{Jxi z@np{yy6uxrpAAqnTSuWyFn#tuz`N28{s95B?vd}1KI((g_IqxtN|OjoQ%&)!Dn&gA zWvOSf_E?&TqYrofXlJHu*dE~8bW-SLv}Kkc9%N40RCpLMOAiLxOdWd&fDcDdUd&z8 zh?$F2et|y*05Sx!V;^${Bj8ONQGf^R0uCtm!AO0 zF%((H?|LC&9K17Ho;2JuuNBG+(lrgC>Py8cA8uQ1m8qOAnsO2eI)2LkL1}e?pKn*P zC%BNr53QU6!_^tl&JWQ_ix*ML!xw)A2IFTB|Kn9Pv^Q9a%hl8nd*yh zQtKXLfLt=}tMwVi$YEHK2|Eu_t3H8NS_7imqYx4A=!ahMs{jt}j1>2k3wR5aKG5~L zO07ZKh&Dt5)6YnN+FzQ+!wo$|+goY(ipg>#A1bdr&m4cU0g1}Es5ykWu<+oz8NH97 zXen=`EShU&p*XeunoZ=BC~DF&FVm{Yim{fp8l~Z|rKn^ESM|ZEIKzrPGpr0F&v-Qif8B&-e(5ztE+IXFYhtw4R!bC%=`Kn2m1&7+8Lw2pE46c9t_k4V zGNL)-Dwk=I=$tMX<&%?p%mz`qDh4uDd50Xq(cT>f+#MlNlN(-KU*JBLR`IrT_kQ}A z8bR);7Xco~wOkVylbCMYt?#BRFZ@TN}KhPN8Pcr9~#lefg#qnA7Mn;t%(r^;|rn~*m8`!&Vo7Ir?B8t&1xG`Rii^?90ldH zT34+=t6}L{3=NiUgA#A==TZ{%J|o>8dN`j)CBNr}q{BZ!Z!@&duYMh3`Ms#%(1}My zU87MV%XK`muyxC(k=M4S4usLdJW2;9a%j%YQ4Cez3%pT=2-e34(1B{}sy-B-@N(rn z5;?$l)#sarGJ(o__a=m-K07^N-nY;;4Yd2>#`rr2CE7(4Kl-oL^eA@M^D7}^=U2qV znSK!aT?MPw-OUppNNKs>7f^{&7I>4G{;O;_AO;fW{9ymq;@rwHu>-JMsPgK+t|Z#N zyV|CPBW_4}C?1=3S0)|T-s@Y|&?rFj`jlyJ{tiG1Fr;yQx4Ij8^#O~Wg5P3~9ud6*V5B3WlS&*KtPL?sBN;yJwPO_g(@ z!Jz4;<{h&iSdiu&r{4maVNS&G{vjCD#NR`(8;bqi4q0RbBpM3>%zM2m0As0$B70>C zDF;;yaRz(LG-|ProyA)AjD;Hy{xSwd093i+rWu@$H+?#qcIHo~%eH#^5y>7rV0ihh zr>*f8hEMoBO`sKoXI~V9j^kjQ1yo)rR9`wnEo7m)Y{%`o69=3?yQ#tZIV@`=1JCkH z)1K;r0(^9RizH*>e7<2A&R9!Z)Zg1sUPDo6s8hr^?OCo6bC`UOWziOlw|`LxmrBp4 zvT0q?_F0UIJ~x8!ZutRe-|!Pbfh}6Z}8aJq^zAB6BKF%xUYGG zfzj|EMAuIvyQ#2JAR%Q&aR;em1iD}y%T0Y_m%xQ##!)^Xs#u#GtBJ{n9#N5;|Y z*jN3emP5=?chrk95YclM|lCS%Rj&({Rl|^M{L5(^k2m$EL{In1s#K zVsstW_c1N4M*7FXqG0tEupQ#-O+s~mU+4R%!*O)e!hd#Dy8R-a*}H$8YC3rQ{OgGd z@bfQ^Mszl7bgkie-0gqm9f_+8^6f|~=T>jOZ>gbw4Ml%+vTrENj_T{~e9dkKjG~$F zh3!=>$>79|Tg5wEAbR{V*PgeXc{*!b2h1+LvXaW$rzxM&rhBhDF?u&BbSz!a(nV(- zK#rj2|B)O#*o#gZ&|Ze0$T-_^Gy%+(Q4bd5F*VZQyS{#jEt9{+-TecRo8=>Q;s z$;ioo2ca9kn%8u4rN0jidpoNChhcFrV*_igI!S&lblE0xk6JtIEm+vjI<8ZogMpj# zTf{bV(QjRTu+;Bl$_;=*0rYLZmSCEbUW|uxhCI!4$=bTx^^jgERRS0N;SH z#FtVf<@v;ISC*R8V$`cr<@uq-j!q|LX^L<00ZE_#aC@Ds5!lsRvr*OIuxBuq1#K{5oX>Z!mUzW>vbT5XSkQm3_Em?a(WQJr3 z$xb|ih@GSzQl?ZDaZ^Vd|Jd>(dsA9%&2x{j0SQJKEtq-}`pEgHwg3YbEPPkjGBb(0 z%9ZIFirhS<>Zke-hEW(({1qmQ=6ntRg)CeKZ^fmMgs8Z{rAS#Qr|Q!g7%mHRoo^kT zADJhd%_oKS!V@^q=h%Zu`xw4XW&5d$x;kwHYD(r22O5f2rpp-GF3fKby6<;#d$Dtc z9kS2XJ?DwPx>9+poypwM5<_bYU4F6Y;uzbz@}Dk2Djs$ct7Ik*WOqV7jpno9{a*R0HL}~3y zoW5EY_pO`AKPtq8p+ReUqqz}r#K(U%a4;pd%#6Ft}7ieBy`%_wNo3 z0JElN?D5Gkjv63~t_E*DUF)UPNW9PWm}`vb3SS%hFp_V9nf zRA;jmi=^w}@J`(KoxdLxmvkR9RU_*K%PObjR^RuV!^T>-9!33z9eM&QqB`Hlsc z7rZ%bnbVBI_E+55^5B_czrq{cdg8zEJ6yAY4FGa*xh zg4jpF`Y(^T+4!bM!xd@p1Q z?{*oP> zOd}^o81+-aZOx$v%=BSb57B;ko%#h~*e=;!A68>;Osv}`%1d8%ojZ+M0?raq2g=UI zhaoU=F~STw7I=8Mb1mERlqob~%>^?kaS3%Ee*IZM?JBfjn%FCtx%PAa9>ep*ANaiq z_jh`YIYy`GtB>YBqp(X+#y_4kg0p>#&P+b5avMVx6*{Q#y_t8dXZ%hWx9;dP5a4C5 z{cP?;>95Rb5xzFQ5XfZ~Nz9`+wnivHCH9#r?=tLyj(qW!dP|ddJsKr^vF}ih1^O+l z_qk*_1@kHCYTAwhP18E>ucN$)s>mcVuwnyH*^hgSm(jz+TuHFvgmvPEgY~6J9ddSI zAAqO3+dheirymB%pmTR6-R+uAv#D0fvHsJJ$CQ8Z;cZw@DU_337!G()tgx3s-rv{i z21GcfVxKoxA0qglnSMU)do5l%4{vG=mVJE35_4G(d(LYp=2*BOIFQ84>P8>dHq?&3 z%7Rn+tdY%Y8HVF>kDqd6D2YhH-QE12Q{5W)rY*fsyc9u0w!x3`5d0LsRvx8o5Nop&mB&a_T??qNLbeVX5a-+r?7P zjW3Pdb13Cyx64u89LcYg87-yByTi0=u4`#%L7aY>{U9{;QEh&@_G(gWLdAf=D^0N$ z3x*n#!0SpFUb!Qq$c%CcFTv?3Y41SOl}VZo6`8YTK;`D?&(ik0fX9=n|FxHp-?opu zH5?A4vv0sX{Hj*TroGBX%z)M+HF1MYHzLGR)FFrrM+Ru}?!AvT(V7qtev|PHtwX?? zHg>n3uJ`JF_kYT$c=`9nJxPQCp{tC(qZCLfF{`>CSlVc!;CK=?jWxjq%t953x9Ywp zL%eAq8!FzC8qdtT(Ay5mu7HR%5r^QK617vqoC-onP;pQGuCmM|knAjC6c>p?^(F!0 z0xehsejFwU8MZ7!T?_-A02|e-72C;U#(^wG?7Sufi+IYKJg7)f`BWzKI7&(8Mj)yb z>wzlH9Eq+Sg@2Q+iUezpj>o#zGbS}=ey&>CQEC=M^_zp*y^CT`Le(5Jt{RXQEL<`r=JWyz52QHEj(SQ%1g~L9O_)?~+4w zmHH1sEK4zMZ^c%d1adCqdyX;(sS3Zj%e6m2y4FfaLnJ*g3O!(wMzktZJevzXa%?D- zB7g9%iViGu!Hj7llERzY$)2rb<0ZC2{to=C%?&m9sL>W47Vh3YbNP|&ya313ous!rTG=0UTLJ@;;u0Z-Xonj-@~MN&D^>~i z&5r10ekZn&%qp)jjq?u`r(HmyhjtA%$_W2~L?rYSt|ogeO;P%!dRANDsQfh&q(dSY zZznYqt>NL6VbvA`@%d8>dT$Mu>Ap<_C_x^2=--@svx9WLbz&bw`nIh2%RBdE=E%3H zQlUHMW98on;({C)Uqo^urHy{}8y%fi67sqz32GO(_QlP2lWOo}i_J{$yfq-%=BG%0 z-dME^uAQ@GWPJzrfaTQ)-&(}aGZ$sus?|T5o^jv#zrL)yS~!=8{POsxaV_v&VxPfNZK%3rpK)c3~N$-Au;QXsJ+n_#$>>T~EK&hvbB*J=qr)@AD4LpanVd1_{W}Xm#e|leak1i#_^9i<{*MxmG>^kVVoY)0$j282 z<D&BI=Y!W`wg|CW8ApcvG^RP{dbONgy(8|^$~lXMKt5V zl3E4M$?X{jUcj~z%jAPsk4JgeP;CTv2vHAKk_21s1orza_{L~AB5~IX@l>q?_1F9F zhSQ_##z@c5#fvE5_@^Gn5;*{XAO03yp9~kM3fTIfI2E6p+jHR81%iGNDL#t2eh-J9 z7YP^Q;v?gS-{-B#$UtDdxb+ZyzrDAVKV^^WDqtrsTU1IT0%5xuGbg@yZjJB)&^ayo zvHXQ-xiTJG#_GFSFtjvCRL;8=jBRiI#a4)fFla45G$Zs_I^|W|!<%%gc9Zj*a&caompUSAC1gIao9jl`y{isc{kL>L4 z8dfnfR44SRl&ff9$l6tKgP~!ITUEywy|y7wryv{wr$&XvSQn|ZQHi(+{FJ*!t$O9r|z2m(}y}v1CgiO(}(QLkzlZ#Tq1f1?sJ7u3ci8=UdwIbj43Ies4cC z>!$4mEPr{nk!ch@{4?FOyI1E2W%tJN^OyRFGO_+wC;y1qF<%e zUz@2bd!15r_9#;|z2enU6AbRobsPE&yTuW zQtOwn;S-@n8rbu7Lp8Uk$HQS!Bsni&UdsLI*9x5j7xr~IGU!4ai>q*QpU@N!{zXE1 zOs^KK%L`M#fk^UUr&95Rha0yvkCS&o;??C?a^F>%Sao9( z88q@BXjzV6d3|bKaFV|&l9mv<<(7D&;ap8ho!u7u@0aRXr~%OhFTzP)#t2kpe=MlG zoEUlUUf;nVu#aH{uk1atHDg|q)v6eQR9%&ZYaZq21u=+NSu-N#(1*bHh2tHFemc9h zX|BiuGEO(Eb>vz4gBw>KOS_V$VL=h|QtX2r6;F>{x{c_glwE;Jg9n0dAm6jW@`1H} zx?-rL6=K*vM!yOH6@+ofjt65)yFdU;$SvWTrV%FcSXc5O|FTN()nYsPr`~@vqqX+3 zRhrg+(ps3b>MY}s7UXU>)tA7syyaOCkI|!J91t9tO@e~&$067xkCaX>U#m2Fr1oS8 zVfHj{v)*Q)lrwgT{5vj%?_`hHU(8qGkY%0+m=p7Io!pah%77&?KpS=40|q+ zsF>u%^sinr>W1a(&mWmUAPXO~$W8VSM3lh<6K7w4!)mjOX;COZ8xja+(qeE&6b*Ej za|;p@%HvolJ%R3do zhhHc;+8`x>98#k*$vu_@$jd-zWM|)`|``W%T=XO zcEt&%q~T26;|>ro2Jh3HXs*Yl__K7CV8jb9l;lFzWJFJ~?+QMP?AHyB2m=V!W1LmP z?MiX;TF@sVNfeXAHpg*qna}V6RFaz;iGu@cz1oZ8fJ#~1qpKUNVC$aB*Xd>2e+CMz znzp{3QubA7GJ9I+E0P7g#T1rv$xiDN6+%T_YFgo? zn$>MXCl&RYV0FsrMYYP@9!*ig-VMnBVBhM(tmPL0H2uNqEm^sWggtD|~M}63Y(hc(+prSiMe0CN+2?r`3kkzxlf?rWF}>Zxy7R=h8q}S$h+8?%AjtXAviR^Ou>qfOfQd7F zD|L)8#}JM}n0aV+OD;c7mdlyql}#5liPBf`xHK|DU_8+x_sQ7Lys|{@ueC%(fVAazWSZS#qzF)YRo!RFM3g)@7aIE<{F8TeS;;0dCMy zE#hcw46GwVj;@NH+8$Y*{qs<8MIt2w(Vw6>YSu*TkjMVB34o`!&+rFg?P>pCb%SWf zAHh|B5mfO=KS%X63OpXsHH7}q(MWbx3A1(!&)9=7Mct}5h1HbLQi|_-f`Be#;Zhl! zdwKNcqoCFJ*c6GYCl5yJ3JP*j`zul-(FCLs%t$k;3Cf$M%krF+5Hj{Fe{xF{!XuU2 z`;8-q({`_^aS0>bwHe|*XdzAcF1KNFP;tI&ElK<&)GY$__0yU}NFWfgn%7(l!0cv$ zAuz;0PisJ8o`_?M?SDd&{fEncBO%2G6p#el%14}YG=5v{}0p_qW--+KAVrzR6<4~||L`CCtr`c{*%C+t5gUw%cihrp=-YS~*x>+;7> z=*ykyQ;nerTYQ61(f^NB|K z9cfpESZH6mIt^koZe3(|pNgAhta!hI`*!}dLwpLL8b;ow%?#rX21zy2pMjN#fXK>A z!mc}+rN;C%Dkr#fvHtp>th(3UyGqHWW1~mwYH#XNdF$pMkYq??;%u3d)?&L!iiCP^>c4ercoYd7O@y{3e2TOW7WAD1X(2jSAVMIL%|7;cK# zk~PpBL}wPD20sCR^kwC+UIWBkZ1p)Mk!N zUzwci@+|xFzPq38?(yPgX8$qjOf99xu5HcBU;t7oiw*LXdev9_b}1;o4Lt^I0F^Y( zkuP^btzv-waR{>(klw`Tn;N3--nq9P&D`4qQf?jzoU>LL)P4Ef!bb}@c|oEMr=J>! zG_=GmRqeRbjPir(5F07zr>|G+5VZc;bam3eCxDqiPh4asTG#I4o$&h)Nywcb1YeKu ztit_(Ol3Twf)vj$-EJlW8ckYB7^-YJsWs|r`3z$$Vj0**@K0dRkw&K8k=x&CX4xEK z0DQ)?i0S6kvMJPTi^u$Ac(cb(8bGJO*h6clod~)43%+2ZWqwLv{2O9#MJ{iH>DRbr zJ36VYa3Z~VpCf%xR+yDj#Q+dA&hoPl>RtDCEu7jEH}+bEiR)IKdQ~11LhuJ^8_2x& zW@NB18u-+~7hvVVQ=BuMv~Nk- z-zl$BhQHXa;j%>TMxzF1j^`LB$BprDe#KM?Z39BlVJCuqpDkMD#F>&3vgN*aIiGt@ z;IQTe@rJ-|jRr0KXTryWk`kM)cT_!Mj}I=Ml>A37X~p8Qkmh@5$as2&eYC9Hy83FT z+H_Q*V3Z*P*p|GhGIxh_ceW19SF1RF`37c{!#(_7+fCDFCw;sbyLg;&D&9E8i^aX+ zH1R@+Q+6zW;QkYd6t$nnxdFnc1C0VULC%H8Cy$Pb`}$)$6ZJpCua0)Z;-C%2{5qGDqE-&`TqFHe%d6r-_v_u zm;zlqw)vwwkmW6&>k@UXenpX9?Ha1K1O~@>oK81)Po(IcHZvPW6ov2-UrX~!uNb^o zGsuveVvgmEa%r0f%GkSx@47k7O_#9Y@eLpICj03{UX#W)8U<$mCf{ya+t~&O3~w zSf(_-Zrowy@O6Fr16+O0!}OnqmjABn&d9*>zq{_sT3Sh){~GSMwR458mW+MP&Wn_k>y0tg_yIacAr8vSOEWcF&a zI5RjgBm4YJD`_|I?r$^K?RKYn+-a9(CWtVIt8=?O!myz!?>58MGsAkPbp+j@DaWVu zYTYKMw}m*FcXuc``E6n^OQ$`Xd1_v{ZC4*lO`5man|TKcsT z@c){%bKOvHan`h*em)Rx>y?5}QnAvz#hG+Cs5=h6UTz!lQm*DEBZ2iA&!yqXTWYvL zGpm7+`$N1kg*2*C3#f94?hMtux~OgABl35#a!qyk^!8|BV4nOFf?BYg@ zK-n}oxR6tdoo3|3GY@B8Qo6z(asz41>jtkEY_i*$+G*ufII8fmAQ%=3=SL&Mgi+Nk zJZ)L_`fMcQ6GBMoglw-1CH{McmZ}@52-~s3z#g!}uc|gt^N>aQV&nxkh}Hn^e|h3N z9mZIpLDTt;K3Vd=q&6r%mJXmDx^v;PFVHU>e%0J58=FWXm}#s{Id1CMOx7(F3jo(XCn zEwagAeqNr;0E=ix-EM0##YK`)Z&a?V9diM&+Q7kzobJ_(Mf|K?HSzr+d|kFM+6z@3 zQo(R-#zKVME6%`e*{6C?wqo>z*?mHB0n|_t>zQa^=Z+%+*z!H4>qr?@Jf@35WFHd@ zVDXU)hYYLC0(U-X$q(#%iymEZaj5sRZyU{YJaJK=?jhfNwYW3z1;w-q%KGFwe->X5 zZpBU&-ZNT)&qH?5HmJ;I_03>IoK!dQ)k#UG@5J?kKa48!Pp8 zB+T}qm~3%Cy%q-An?^x4+B967cmk@wRDFfiWA5a_#{X@IliWBx)S0QMgfjv^w zqONIhsuz;4v4K#q*WB}rNvBd=H&!8tq?J+gC_d>1@GK@EtnCC(end5z|G*Ldt|` z8V_%y?s~kz0fppDA(+%cKAHh5n*#e|u+RVD_;T#d7IXdY0MNL%fDrj=x6MzgxH!|# z&uq%OoiiofSQy1P%kJ-cqP`~sX>gCG0yZC0!0@BGEt{9zGXGXWF0<8e%A$RDlG#3e-J}r#4ppbd1SB zk}!<&+gj!w)rKMoEbE`M7B&Lh*vo0MYwLFItUL)!X+(n0G`sJ$TxMng-ScSdhc;X5 zoNM13r#l20`%1z`7^dhZi-lXiqZb4LE5DsV1%3U8V$0+2?VgDRQ2U-hK42vHL*$@V zx1MZuW9f3X`?Z$o2G3~c|2YMniaQpTRrZ4QE1Zrm4aL+U+nk`P4wr`~^2o5RTX?+2 z3Zmhw!jHXO%&uVDITznuTM6R1T5Rn6W^~cA)%@#u&+>T8CMU#HMLjBJ)kYQD)XX3kLwdD)FYTw4#7}^Iv$dZ-rDONNwaQL9ESlnKI4mc{ABkAo`@Y#3# zvS}3);DEC z%)?R)`{2g4be|#3Awj!1N;67G>k1V+shdRnY-`mOr@!jVKFLll4++zU9=vA6*G50y z?}s3fcYX1{J+d47rtuwVLPg$4qHQqGKOyr|v?(cSa28=#OrMkC@ir0++SQndjig+p zQI{+4)x6}qQo5VI2MaX`d70YkTRX9L;KDVb3BWHClV_;7<_EYcH3c7>wtLj(@f)I3 zGc9KB<#l$+Gd}n@{VG;A9p_8-Sxs`dcvq%I?|pDlke;SFQRyU7!dx6jkANGu+aL<6 z&$Pt@cvH?_9R3-!ckS?ql4uiWPrd4YEwqR-_c`qs(axu+eTnX}R#kW*7Wqb5{%ELt zQazVnqP3?4O^;FD#aa4o3}cPF-R-OM6~BxOhyMgF5NHy)`*Pv-uI0wQ#c72{)L%FB z=&G7@a9q!%lsd>NPV4P@WZYJ=$Z_jKscZzD4PvQh4Kd9cd(U4KBvb&BtiS2(}E=li%gEzZ1%fZb{s=E2yMYen57aG{)U()c3xjw{l8c60=lJ&(1B>?Yi$JyI^6xGdafno&1*8 z?Q@O~%786yM8qi&tkx5-v@G1C4p|0PY@C*XzamYam6tSEO2J#4%dps6v>WA|&0q%$ldmWS?^UAC2~F!L`n{2-99_S!M+Gh9|ETzs%1e}Vd0 z2rKmJ5e1tgw`cJ=zRTt1U(8vH@m)yY|Qww!+XbVt3 z^I^eA!rf4%%a5;)uQu&v1^5PGTS0zTM{QO+3f1Q3X|6P(Vc>4Kd&$(}SSov3Y_a(ecJGqm+Ur%H=N%kx!IdKMy$r~6 z8nvBG|0Z4VMVlGs8f`gr8gN&!2aSxC2hoIW3No}pAqF1wR~xVDG)yM@F4qGb0R!&h zpfs407i0%R=%PO%{*C68oaecau(HC1*7?P1zW%a7Ya*~krv+%9bj7LQO?naz83X@o_Gr+ zb0=OdM3rY7;rPMt!*9o&yv_0>jf0GX3P4u%64bU&D8XIuLe7=ZFWkR1=+Y+tR-r$X z*5E)Q$coA|5wAT1=8+9sPg?bS5BmXHtfaO7hd6=hzw3arGyb0r__DTE-2Vp^&J|*{ zoOS4}qysp_-+Q_xH1GG{401uNA$4Z9*piXPo$j7;tB6Jxsc&1}%0#a*WE8<&I$mh^ zIOU`B)4v7o>-E$b8nn~%d^f7!-d!R7`gFftY#&6m8un}Kr<={t?(ov6hCBh$SDlr+ z`rg|<#vON-c64h=&i>tO;2o~SPgCwy#qQXjJlvLQJI=3`f2MaEprht-^?g^zJG?#i z@iM zU-~+ruy(J25d#a+s%}x$Crx{(5sd14uNo6!v(Iw~cPb^qPlLQ{ETIBH+9av``JN9` z;v(ZLyd5CELbp2=H>P8deMqJ7%c{^0dNd7D7(Rjuwm1QL8gi#ORS6-9`ylAn&m7XKhJzMia1wG%h0-fA`@?wq!Y zIqk)je}YjCZGo$l*P`BVZvOriYhw^& zLx^kSuoz0+Kxve%ASd`0()T2U)vHdaM_~kV9^)_LRpJ1ZS_%xBMk6Aj3Ncf6m+}%) zPj;j3MuVb8rJucwuKW1@eJ*6N{Fu?W&KzrZ7ZUt%xGO<*3VwtYIfia!N_(SREqq` zcPeLp4CAbSCI3+h+?|HQ%9EKO7MK!?s_B)I#qw3yVyf{C)r(2L8n%td*UWph`Icu5 zln{c<%La}#e|*wK#x4hcJ1*;cmR3!^0Rcf6edZ(6X?t;4{(aEHQ=MBe{d-lp_$mCT zhgUDQkz|F0$LWs6^_~4T50J5_G77SkQ z`};ip2ka^^s)P&h0c0(>vv%^IW88#jWQKH3VHx06`LXh5KAk~5d*R0M!Jc_=9<{&J ze>oXrrVvQqQhvH!i!6sn^|OKyY{shaPog#FYHN8R$==yeCC`o;XA)sm(jD3$W92)b zOFzvJ^%rR?dTA<-)>7M93_A#h+?eLIa)Z;xzAa$);lRf|-1|`GAO&Mv6CrJ=>Z7pm z4lH_l!gsi{3WZpd9^fPBoOl!e3^X7iU0_IGB2p+h)gooiQGM#DhxswIyB^2V*t4Az zviXg7STbK}!tukm(z5bnp_F*#siWiHRW{rm>DWKR&Dg*xfK_KlhRpnb1F1UXa6I6| z#2mas!mi;LX4Jk}Ns*Iz|Tt7YXH2Q^6CNL4As|aCW z&skO{U&?(s6ox|PER0u66+)?t>SSc$>^y0JTJ#_po3>dd8R{xF-e{)LY6|xUhf8ez zGtmeie*S9eS9h4C>-3#b>@q_g}wwM}~np)q}!>IUsvo>an!qvqFulgLfz#g@hsRg5RjXgAbrLwY%S~*~AOiVUvMg!5u7& z=y@jQu-j_z`7Z{c8zsl#3jqQ7?RO1$u!LQ+ad6=dZ9X0FKI`C}Bw8Jo_C)oLP1Q1S zAnk}c^L#{`%{L+g#N&q@Gtfvm@|kk3n-Hgd3L}*UBnr16a!N*Gi3_QZ(1-&7m>d~R z1zm*)Da2I19o@x8;o*q(@&fY#qP?+&ftse>0ij{Y|DMda>0Du)gyWJeaEtL0BH%XB2&x+ZLpYha=>Dv`m5q z{`h)9toI4LBl9Lr+B9#b98m)l^wz%e(&TzN8IWZAUm0fNGYeP*vxW9KRKVlltxtKe z`v!S^GBR=J9`3iyslMW!kU>13v^z&;uLV(`zvx1<`olj;a_QRJ9t~TQrA*7fDi1_o zIC=65w5ld=7Le>ka<`!PfX(WfNVh$0&-}Rfy8F|FLbj!)&C3ID3_JNJ(eOUTU+saU zV--~|22nh^t>SDS?e zdnd2izNKoBL*LbUU|AL@<~rD=R%2KRtuqT(;5c)J-NG7tG|}C4W3e%1;~8e zMBq+eEeC*SGkU>M($#_t(2+a5i?sfpEXWk%uYc6VFM3veyf5?pyv@?9Q(q3FDM6>A z%~+Lsb1);M81RJ_19|BiD;5<%zN;G05BojYT9=C5;lZGT34Ew^)EwPUQ-m0uI@LO$ zx%QWP=pP>M@Tc*$0|&c=EQ#>*L_gg9;$JR=Kl+o7i>t&Av#BPZ25vmKa>^^pg*dWp z#U5w3Jr#Wr5*4g)iq}Vpfkapg*4*(oxfLaR3G30Vj4VD?Nc;8H6FQ=SS@)jFODG*~ zD*(cGTkRxWee;x;qIwki=|x2gS+?6G%wG2o7Za0OwOc9>jF_v!*)q8*SZg$1AwbE@ z6L9nNMG?=o-%!;C2~+O!^;s$7C-~r!zM`enXt(GqeJSRWkZP6t?qz2!S{$)^atDrg zEP5lj(fcBT8b+LHcafP4L^GHk4&RZCdvh=-qpCE4$FV7X>1wuG0NYXFH&)pL-CQ~7)x&6xL(x?jB%T2tb>^1t&T?4S)_8fEe zHR0plWZM0K{Tho}QDz{jdOX#DSl;3uW7-XC?r-CMLWb?`8pd{P=juV=& z(*kss1{|RyjR)Sb=PMeVQK$&s>X3i}ga#b2M$=-Y-^sb+Va{OFHsZ86=3?aaM zAtgO`#he45o*SSOR2&7PQZ&V_g4kT$Mh5{I_z*02idlI9q2U-$zE;+GviFMP?mcR? z0cfaWpjP2Kq?yvm(HZa|Joi~I_HlqRvl!6{%2PCY5RG3xUiT?eD4JU(cpHxjtqYs# z#HFI=$(q)nKzh%dNY$swZ;wVP2kJbARaLozmC;Bl{qUZG5L78*<){``lKr}|<4;c~ z&wubr>*(pMaI}zrn{&z0;*1-r7ww)B{HHY8JGj_Zc9_`>P$VE?!;g4Z=ZhB~Dr|dV zJ{THnY?Lwl+3*CVE$x3k zk2z#g#y$`HN|56pMv#Mvi<;KZSbmi8o6aAs`mJGynR-MjMchdx9O9i7!g(wv*os+7 z3eFqk0s71gTj6x^a`lNn4YT0W9n_nR1?Mq?p8l6kciaai@pr z?|4EU80bs8qLZGHxXKl`>7G>?Dsy?0MslK`tlzNUABw^$dD{&?=I9G z9bCcmvEo#y;}>O!O`*$`Eg)9vMv*79HMX+oS5KGMRADpSmytnmyTR`sto z%^OQ`F7BYGewG!E=#_u~Q__~ZRu$6~LvmAmuuP;EuI(4>7$?DOE$}Ky;aoKQi0`s4 zJiOKB!6mZm9XqLB`L%U=zZ&^U- z3zPLUMH*P3L8+V97Y~-k8s_=^I?cO9@FEvI=K!@=6G}?8=XI(R;;S4^Poqpvtk&?y zWUge%n}q;kSi0D$>o7t)9p4!>@G7x&2spakx0pmsZ&Fs?R{f-QA_he9zS37+thxaYWXV(?H zBYeyaG2^iaq915fKM0mJ22FF)E9thFmS7Bv3Xed7+ay~3<(Byr%}k2595=Yn$Rkq0 z^^?YC`KfT`N4IW-Z3V?tg_0ioOBHV;drCB(jMdq`l$$tYX35j2z6FWQ7J&3(w6sK- zX!b9O48K}EW-BkbT7OixKNX}eS?Epyy5ryJ@c-O4=%F%>M*HQXf;oy@ebEk3;4t^8uk*tpsIhw2n!lcJsHjo^cd zKtm1((HVbkG}E#OQGQntP^P4gT{wk%XaAB&XkRe3g2|?z>AkQ*U&!H#jWu z)8OizE@2W~tHGxuZqB^@$YEDEV%lA1wbbI?D2=xmU#0I*NPCEykZE;nB&`0kc7HjR zvL0;0GfwV_zL6C{mFN)KMy^B9*LGM&un?@ed$@-i`$1Cf5jN%ANK;#;6&RMf;@z9R zo@dd#Io$$2Vv?O9t74z$PPhhEl)*EZxr6vHa!Ee;4c!{gYG|;GM5XdBy#;lmYpRML zD4i-sC1$XUbc@!0$h}^^i~gaTf@1E4_$dL0h+4xJe@S1+UYtu1Xp|M^_FFP2S-2uk1i?gU#hAUn&oTl*8(=nW8Uo z5sAsK;L_gZeosQp#Qb+yBvKc57}sZL%Tx_4W$IInEf~!#1SzwW*a( zo0O!I<#?5Q;b{ibvZ0j6Cug73_Ud^5ArY;Rs$F&E0tx_it$({N?R;y?g9iFt2r-40 zO`_=cL%XD%;vMkYrSIw1@P3Y*03}rrLP8pi$^=(e-*1gh8kT)|e7NqsY*o9hxz+9d zxqqI1-gZ-CS8JVg(XD;;@bbEU9;Rpi)n+h#by^!IrbIGz>tR;OPX90@O;>Nh4gzlX z9-HiXK3qwbRq4F%0J`Xs(OPVaSo+-=*y);~8+_@oP_sy{#%ipYxOyRKAc`lvy>#ql zb-BQZAdP;gkb!m+)8$L=n7)OkAHkljo7&oAd46?!Cz(`J>2}$&wN3pzgwE*vdKrN2 zJ(u%jlzm%>*?}Lk)7_%e!%yl>SLo+nEb;It^7)gi_Es{n>e~^3%?{std|b%ychM}c zZKH!4GOqe+k;E>TTw){FzZdCy9Xz&qA_39j(EHlkzDtB#TUFV?@>3CDrjY_W)V3;bPq5JS1g`bRr35BSMlZYyOtgZ$nuMp zQ?qk23J$K>zExtA?T0l1GqMIUXU)6)$r*Glf;{$KenTN^kC`lIQmFubIV5d zj8r`${cn0pJiP=TUC8yYi>&a5k*Mb3|LyAcuW3Us_k?)S^S$HZ1hw|-BzUEIR^5cV z8PqMRye_J`-K=i2dht@D>28>JLMf@9;PlSoxzi(X`OacLnL@urxfJrg z<6netmnPgO8MXx9vDn@C<9&xw%DY`sfi=tYoLMo&e^@gU)cJ9Se^NftNOx2$iUL|HEV>U-G=Q_}vF}-j~Xp-&1hJAHi?C zi*t%+)pae5M`8y+VMYJhvJn{K{#f>6!j=knefgmLlOD)~O+PR?$gJhu?x6hs7p=(a*8a=J&OuC=x-(0_1TJ7NSHan}vjxgl%wRmTV#A9`&iA%q3|(z5_r&!lM`fQPE44aW-A zMW3b{yC8tKXkyT^i4ryi1tKDkPLO;*c}-@sU6B$#>aCF(_qnx!DTnW9>m{No>^NVL zc;^&z`tFP>&zuV|{ASC8I2l8^%`@mOlFBPbumwV63yBT~3^QXXquKem-6|icS&0Pr zxGLXfnMBqa3l?0+`hfu!eN+AO?ZN%3P}n*!$qB^Ke?#6Kbr4DEI0;+A!ySdBO;v@K zTa5;;>v$kFBY%|J-FlQ2R9f4LFv_=y?r-PR2Ik9lmd(r#78hrwa> zunamDbdGeo57@5W0W>wQiK64_G$-to#~9b94|4?=`G?eKTBqV_{2w|3NtVJy0#}>` zY!gTmUVy|TM;S(bB|#NtVik`xjeHR+as*SuxTrXE;cr{lkdgvdyr2kIf{+I0fx5-1 z8u0blMv{aCg3)|wH)*g;)D?ddIsn9R6O0_Zb6J?{#~*<}W#=-8GS<>#l>|kpN;!ZD zQ)SlVCu!y9+jC@>A<7ibyz*3LIusd7MH%Uh05QA=(wefcFBW1+0mQ)X_F5RGA|5AgAp*oPv}`X^C6!{iA9O6T}1( zNUZksdF&WNuvbTs_SBnr`+anfK1nocLH8oaE#ou6M+;Q}YNLN^naQ2Ts9d30!7AkzFa=pDtVgc5~Mf`jt7E*l362r z%^o5VAftgzy)sPT3=W1tHbsKQ4pLxkT<9!iKgXsU5Cl_>1M{!Aa3Z?`NK>kH2SQpD zl@E>m+RoM(420T_mt)?#iS4)X*o25&Y4Qg7X0vzAVbQcG#VA#g2%z~E`U3<}vbNSM zTAAQlzK%IG_>8>@(x1gTmB6L-6C)mFO^o9YUfKMMXS2!AW(=vRH*T3NuAW9ws9Eba zRsX_)mcW7NTMyzOFE4~8;kw~thmtE0XOf-b8Gs~&F3eh++kKpSLBm;12EK!WbjY|L{u#gX_0G1_6TIBb2d%zTnM?t?=xt zS2q2tFij*rzA=npbu|wY_^-=74xd7k5N@0dR^TTH`fACN_O>7o+x<~b3~-E_Xn05i zJTt>=IR~{?PY32|nWj3YJyYXbMU9}>Hh@mHao(-$&!yK{umZBnuBTY+5GHlmRa>_` z_fh4a4n9VJZMypEH;r|`Z7Yc!&XqnvP}%@+&Q1^chgWz*Y{>L-A~;wdHp|Ke<+p*1d&L9juj zf2JBY;~up(t^fjR#w7AZ;RNupjc^&Pyf8EL*)ZLr0B+Gu+AwRsdLsOx6L zxtbJ)2Z97Yre4`rWPVj{yWnik2IL@xPZ0voy^{&s;bii zC48IiQY-Dhh#+&*zmfI364sNot@BBXFQwM7si^yK9LKjrv1ug?Wv0Y&*b%MMUGq2n zK09dP-4I4u3H<@c(f`NxmipzC$BLcY0Unh{Zze?=#-B7#`@U~uricJYn^}!e;|)v; z*m&HW=u`^oj#p|d{xh`aoY4y{fYR-X{n5fuC>gIluGE7Wah?S6Bfbqy5( z6lC;GyBNF!-)vWVQW$~9NAG+1^|;h(zTc-_aNNfWCg>_(Hcl_z7c~Z(Prncf+=jrV zTYi;EK97S?IaV<_hZ}0TYK~p_a-_OWVI)Gx4n5LSvtw+OKTZAXTdd~xp zQ=FtNRNJaJuM9Pwv~IYCAJ#HvFB?M-CF(UQck4Hb(RV6MEN~=pkdh>}Z6MzY^-5@* zQ-5-=ABlmJ*LX9NFO2q#Pcd=Sb82Oz!>A-t&_v9c$$CZ8q25R+tHmXdx$7M0$okKkxn&hC9X%=G@#yf~((blQ>am(_76Rni~vc&3mT z@C{)ux7BD)P^HXXGFkH>L!z^{oZXoq9z2GtSvf|OLscat(!3Ajsd$CD2aWhq%dsYQ zFStdJu110gEantTyv;$Y7qi*DwXm1BjKHa;v9!E3^s@;otY7@h=+Ss1U$R_BHXm)l zh`(#9qpnE7r};6H6sq>)PID_p9H0Y_b8Pw$KXSvR^DAatfCEbAL7x1Aa>OOZc-Ed{ zb^PC-FrWI^3`_NC<2ZXV{z7HBdU9rjj4yZ{B*BP$Za8npAPqxlzYa$azo6|q@}?G< z9sCI)Z0cAQ9U3&!c#zow+b!9lZ(S=E(I#09^O_{_^bos_+2dp;AayB@@o&>aJ>)Az zgjwM4`Rd6~o>&h)HA;W&1F0#5N2KZ))dX&6E{5Yx>|S7EedgeAA)miw)GSe@`?^C> zkPx7~3Bm6wAenxiT7QAug!%#h(}cqQ-!Rpf*cmwgcRjya)5dO74C%+WH?YqqVKaXF zRi|YYIFYM*k-KPhO@J>89*kB24N+2AqQds)oA*;FvPg2%;vf$pH7gr;W`^f+s$qUK zTnyybyhx+SBBSVqUh~HO7Vh^OskxpQ3M)wScW7KWe?dfXob$`PSd*I)n>txLQ}rSPfvIo?-WkE0)h0(0 zrqF`gxm$k;!V!&m1a0>NU#tx=hJTXND5QtzT_V-$MPCUVlj*rOEm^yZ=fjv2myADxf;pNwoP$O z)fU44!3vdxAQi**r8O=E;jgbQB;( zuxI}b`@aYwiAPA5E^#@PxbMw?^biGIk+Yd`P8u5;()2${UeocC zl=6tSjIw|QOO91KLm&n5_Ld*5US7Ph;v8W{q?cqu0eM1R{0dAFcfL%xN1|NE^2r!& zI0+{DLCRIn&Hoah-cPRha-siE{J6V+~glQn}@*c><5 zZ7mP%8uhRDYxO6-%n%9Izl3zJgyvD(2AQoX{8o{UzeG#FzGjqY=}B)#xz%x-HrCHs zSYt)7V6EBSZ)_m+gq#41A>Ev_@PAhzpB2FpG70|9UwoH1lAL@j%sCLn2i(aSHM)F5?v~8dG?rY(r zBtcuC=oMIK{ktYeWjTTo%7neRc{h%=lBVHuY)i|>hm=;h4pinVhmd9*oQ^P+xj zpMAEkeaN`}>-85^R5Uk{byr3b6U{%<6`LSJx&VUVQxe4_y9W-aK)aq^8+M`)4=sj8 z>DD>qd|YK;os$>I&n`I_YJw7MX@iOZp@p}LA6-3NhWm@go6UF2khi(t$+HsU!FEq% ziLiefO)1^~tnj=Tw_|)*Anx*&@DW(r+gppa^nQ>0RJEFE^^e`S8*z-O9J_fGkwrd_ z7TWRJ0UO?FUUfqVxM91gOoAk1z1>HTXP2_|8|Z91=vT4`u?l zs)H;vc1^K$h42Nr@#&(h0j`YE0mB|oh`SegW;e};-P{42P>{Wt`ewbKhi35qoUQVP zTghn4k(oe4-(VFM+Q(rp!xig8EUs8aeNA|9{bxcV3Q#I^VQU{4THv$L0Xb4GOw`1g zw1yIru-*V?e@^V{e@tb%%|Zwt*Ipqbn#o7r@E8-k04Ix4pj&;`?32H!P6;Q-K9ihV zx0Hw9<0Xj-_th@Zmsey96u7*F^0Gj($0$`Si&p49Ao&-&A!rRH$TUAOWgpP(M}fP` zQo+ul7Tcg1=5ULR+=g8*FTRgziaR@tpq#;;h$T*aTjj(-{xiY@?Jej_k)1XzQWjU{ zu(fIwJ94Jgzgi9{f0`w0y6f1Z`RYl6UoUAm>57k@g_?S^A$%aAk@ktcOyDIzoP$J! zi9;ea-F3)l#OuGZ7(UJNoGuzBBv{UIYwH>)3{~H zAUtj*oS3Lw4nACiZG{#6BEd;Wn_B~dA+nmCI7vyr;3}nKcsfd%D^6dtaSC8oo%qslmYDXx(&v+Y70^KI#4! zV;INnhw8n-FBQ6IxYveZz#oI~jVB$CI<8MY;TZm%8|*YHPtVxWSiYBH?ArBye!){RlRDDah22|WVF4G_bir3iD)<>arSt8wS3_rpx5Q|F?o^s;!s0xzw`C{eGgsg zv*s)T8#W#bEF@PeeoQ&*sr*hcE+$vYk3| zlH3-xUWgKM(IWBX{=7+U()2;?dF{;ZBbi1u2&XT>Sw_*3mLH$8VCm;9r)SSY5z}FI z#E;!NUBkezzLU$6SNo({^i)T`PEjLYrjqU0{lxyrr2Z;`hi%LnPFZ!W+p}u|bOCJs z+p54wozSM)A;AfjW)rU|wI>&nXWK%@zx1N}s!t3>AM4QQ?jc=>MQs|7oCXa3YHMjK z`_QGLljMZpir6*QjF7L%7|)*DLo4NdrH2z>}n!N{7yFiOeum%rD6kzhW;N;xL? z)nAVqxLteP<+OJJFfi>l-lW6==%RY3;-YO~S%Kz;=R5KXO*cv$8t>cj`0~;lvFEZS z6nP7~#MY?VNHcuu{Nk@X{X9G-$S76Tx(dfMXyoUQ-ERa_w}Ft7t3=$o+J` zP6jg#CW8vdiz2cN-UySGA1ON|>8US^l`D@@YYpg_85}>~?eNQ&`}WlTsqJ|1nh0NC zzOm=ny=s8$+?7hj@jf6=*t+svA)0&3rlxTN|InA)ZFAs2c-BfPw>GOeS0>ZRu7xCf z)l72tPp0KiK&vs-D>)}_t>y96SaSC~I&1AE;5cUR|G3|)jq#YNX?~a;f4Z3=aUBv- zUsz{cwIE$7pRm#6k=ZgGzHdQlqrI-JlG%!AVQ@6)!C&y>05oH zI%+~w-LNz)yKjjg+P^&zE=m4X*16e;lNIeSw`|vU*ZeRNeq|ypjK47N$aewmj}mCt zmJ=OJ6XeJT0JQadjCBAp{xf#bf~nNUDehVXAlcQ=8v^6M>p!rrfTDGg%E_p;uUi); zEI7e;WKkWEq6SJaqBV5g<7QtjfCq!i2FJoYLX`XG%ve$ioe9nKX*yCDhTbj3&*#`D zjKz%(#E%Qaj$y_9{@71ejxCc7MrCzZ75LRyfC@)v`nT-(FF$#%Qo0K9$9aPZGV;ZD z$Wz9R-W%_j+m+862!o%rv_#N7WRTQt<$~*ZW0Lgn8^{{i$pyH10$_8KPF}Pv= zv(;#tY$U^0_Uqew5H0~dqFA9nU~G~iAu>&Yle}asCwX~nBoIspQNcW{sW&Fr3-LW1 z)(Ig*J^c3wqL%q|Bj_JdeI=_th{ES^?kq)WOOyNM+ZG}uK~%hVF|X2bWGsivkq=x0 z`vk9umfgSW!)Mvscq+m96{==OG|nfZ-q|ae>yl~1(XR=kv*C~oz=Vn@dNPcGiFYC? zs%=MvFL5Zx4|Pg5*Jb;$6ePkV*x-itq5|}ARCqjw2`mst1n86|0p41(6)V*Rs zPPLj^+$iD8n0+Hdf2?q5m|?_;*-86YP-h{lW_2DVDiJK8r2`QW=jVl*Vy`A?>ATNy zH;I7=$w=d)LoUU~x@+z%U9OKpeE+FMUN=G!5vurz(1FIf+5-sf&&^PB1utxEM$jww zcn;mVtLlCF&ZfvsF_$w*304wZ2$;bf_N;l#cM-dW#iBGMT|4ToK>Zi^7!M}~726ts zWvKe$7h(|es_9d`^)?ksUWdnxJ3*t`z|EMBep@U{rVj{KAXeKHzjMYAKKJo2=G@F6 z+00EmFvA}H5HcexsYu#}wMGI96{sJqn`{ZsJZllGxA3UM00pOKf$_tBjVq8u17belS@s4kl|60y(DTbypD4tYFL6 z@VT)oh(sC6Q{bRc8k2@^=zb_bAxTSs8v{oKO5V;$`D_e`fHFWs^?T|Jx-|YBd>an) z&tlk!tv|!~(A&SmzuKf{p=ezs!q3v%^mXGwL>XvNkXlCI+48_no8++Jc^&7!hU`46 zHLGVGTWJ^4JR^|vcz~icXW?k4it4ibT5J&=ZTd`jQ5#ZpFEoMW;UHfV-gr4IiMP@??dn-gK7St8 zDbwPJ+t{kI`;{!>#K{c?gK}EU-T6~7(R?wabTYASo?9w5S?>01r@wU)6AU<*mC(6T zZQov%s*dtu45nA@W_ZvCLo3!NVD1zMPoOXlJMa5LV$U$w#b{Lx!G8U)2Y*VFRCI+sny?W&yyCL7xq)id!VEnW;fgpJgK5dKf~bbVR-#%ICauN!6n>F3%LtOcB!}$oL={s zK{vyZifGxRW5Et@!Sv7MPga(nUX~u<3eTHC;Vii_j`k~8uiIHR>!C~iXaTQYzCSO+ zR$W+DSXgFLm<&7&U$v9a7KSmG@AL9s+>cK}hKr(fvY@hxQhM%u``J2@u84tfiW{Kr zc7ORiZCz#d48C&*22=uf%adR)Fp?Sm@j>tn`?CRC_TNUa{~ZXy$nqZ+kZEl#mw#(U zzg>fV31*vrii0$vh8^nB1Ufr4TM6|Q9WyfOIL!EPq2D9D3;N4xm3f(|%o9-99pbSa;oHe|)GcQaM

uDIb;pgku3tl$lm8}z$Wj8P^YbBZ0SXT!PHB)tMOugw79L>JEUS6R` zuc#-0>WL@z84hd4#STgtwW}yzsfTH!88Ueb`b5{nj&v2oPPs(#nFdIf{N3DBJ-7^+ z3+^k>kAH&G1lAh0XG8m{B{?N+oGO-TnkY5AQZ8+ltA>^S?R5QUtIZ+rRxx`9{HG;_ z+Sy%$+}>W^Zcmrz_pi>y${hadCe3V)=a&I1ytaeVeRVt@6SUf1{z1Ac{Ouw@))Tq~ zx%XSjb0Gi=pgN~Gu-}I9nqWynuY>?gB(Az_$`(5a(AGlhswF2!YFRF6bQ}W4UBZ%_Q^xK{2Om~~EEX$<9#CBOxSJrg+_+-N3Q=jbk%wA}aYe>Ii z)|OWI7tV_{VfSz3a3hv~&1bZ-4T>#0wRyUx*5xwE%e@A)%>but^mb@>PeHyBEUZJ` zv>eRNa4GJ%Ak%drENRsU8}si^Un8)Uwj?_G?(yCXo#OIJ&fum6hnoXZrl?Xy)=E~Z zWuAxz%X3x@^^dcwK$yDcerwf>k}74F#%v8is~Kb$Kq|T7yM%P?%Iq3%&Gb!8*}0Pj za}f-nAKs|m zrdo9lg|e2)Lv$Yb%G-70=6ihKe;R-5t?>`lKkq2J$~?Ee`y#R9SMr98p>5#i`tk(0 zhup*r`?b?~Eu=@%L>b=`&n`nm_E$SAmZ;-^ss*A4fP??{Ap zvZOe3n5$R5IUHM9>_uk_(_B@m{;B?gYKS3hrm}nv8V;_opZHX2TNLV`+u}5wS=ql9 zJO`S!E}U)7-uErhZJ1E42+fo*MI*YwYcoU9}|KBWI`kE&A_gUxkocEGD#Rf&-Y z04u4IUnP}q@9e@tQC3dUxszrX+kmsn;Ng9|>X?K~?$7M;C6g5<`bVQ+!0}iXKkdm? zwzkOhp57s0biVKNbc!aMYv_R*XqQ7%Zcd-fo}^l=Vi55AcR1^x9N@cJ^#o(({GPzD zUJX2Qr_sZ4i^BDNNadx1xUqB9Z5qil=lQ~SmP~HFDuhR3#+MV9Qgp+(`GGpM_XgLm z16BTuP9-=$*4Va%S=E=X7I+(kWl_<<46oZiMj2!t^lch=+EOeO%sEwly*TmA)5dJ| znh+b_N|xz1YX< zH6hSvO32Xj2*Z&Ie8*L ze*qA7+(bAaz;eNvzDe`9hzlLk`94~zRfw!a?}DnA+HDynFastbv_`pBln}qR81$S) zX`c_!FIr@vq-fLf+bLi-p#@B;$^m&JBYS4`1iUv&92SF)L2PiKr4`DR>L{S}RWXyk zhIUunk^PIQ9^xXvQ7-2RwmpM8s8AT>K!oC8j^(o)Gi1 zah8&KgyTmjY(W5GV%}31XBm^031$?imMNzUw2lj-h6Rwf(!-xVj8WT$i|9e5VL`1^ zaAvqMC#DOW5k3fAgHNPg{^5x>!nqZ2B<**JOyMlh;n^3-R8G{Or@;6(cVHy%-%+Cy zXsEI!@s4cwS0L8>=n|&daU$H)dB`=o8PXb=@L_NnrAA~~+^qS1*Or|U(`{r#tR?hf zvBKUNz)au**r|nNB`s3duPE@HAtqZ8q5=tX6z|}HWCG4QC4f~=ei4C(d~`U;D?)jY zKcT@9`f!!wJ)^E&FMqn>uN>ywQ+dPl3MBbY*mv@H{xEp(kUZx38zFa|xsUEKE{}6+| zmGSTItE_-9tzXn1knwFWix9Wb%e6vv_Y3j?qVVt4g!v8HJtt8`hIC0-*PqWWA{u*p zmbe5aMYu=aSl4GQm8!+rk{-fP@xk}Ea$>9X3VmeYo*8w%%l6Y2WtCVG6E5(f3^nbq zZ7XQ?Vwrp;!}(h9KmrPsJaQ=L?x`6X7ALSV^mA!*I{1DcSx}#oR2z>S%ia)*;xGic zghB~Q_P$V{lGl=lQ4BmpAQ#@oG$Gy67jQ}@&-Pd4l(F?oLkTQpuq&{GYapt_CSh~r zev_*#i07{*n=*%>#X75J>0%17)XTfCXdo)+y#<-UHNta0n7gOzSd=y>cTUUs=nUf~ zp&{)aHo4eBsDYbalF`|>C60NZjvaLnlHm|W_cldMU8n_gjFx&f zMWb+*pmHEEgj4dO6nMEwmZ?%_IhH2;Pv?c-f}Rdona2~pe`PWKd`)>tl`P{~XmK(; zDB+yRzl|eu9gZ=q4TwDg$QP@gtisIWQw9d|Y9?KmU1x+&ktj=vWQRem;NfC$$hFDx zl!S*;RV9?L~Fi%~KAN*q| zJ)oZ+48B3X9{EcC+Xuq`N)yP!%K1Mr1hsfMl^{mM(3|f_zECV7$ycb+b4v*ZKRAw2 zk-Yk8)O_-Mf}fpV5gP-HT07I%{0<ib#cSp3{6WOhCyH<<@X^fk#DLzW6QK)sV zQJduL6}quwS6_2e5A!ZZET)#QY3dZDs*t-;umC%I6A`%RfBaVOiz8$R=%behLcozm zC^fdmN#8AV;y!mlWg@#u8voU#Xxt+X)0T!;%?Agu$s3Bo(c~)aMCsb>b#po~GZ!($ z>F#ZZ3yZ1WV`69b4*|r+qtpw(v$+YMT=_L*XjIdT@8a#Y#<423} zJVe8L5pXr+As7Y0h}CdGcoI}xEr&n5v#46S z!6k@FTAweeR&;*2Ya#VJ<#gemWX83mdDKKw_Yx$^fxz%yV*oj_mv%nR(mcY>KfyL? zxBBiz?%q0QN}nZ%QK(IEs=~Bq08&LfB6)=T;mGWLr}lFvHNBRC;JBAmV0MsJQZW~V zY#)_Ad(`B4rwnX{#adq1ihWzPhvb88P_IT+`wmdvR7O29KqK6JgAf8t5p+K)Z5^oW6<-c1#s7n7xf5Um=avOdt`Q&YNV?X=6f6@sczQ_ zSp1OA$;e=y3_nt*#@(0P-{7vaPd`Hg?MDaUg>;mbG%s?5y&4ual`R{V#^Gr3>q7%h z6duBh>!(7%0Lns|3v4u{MxFmBVVWtia(_Z-T<3Q97h3M8o2tlW(Bt3iFn8f#-@**M z5S zN=2=qOGl?y)04u!l2Hs}BqCc>lCTZFDUcN`Id`o%a5|({s2BiJP+jCWxded6QWG_X zQ34jl7xGcN${bjYqQ6tShKFJ^{8l=KBI2-$uQhSM7;^y>*>pRo7`v@4gTl+55A@PH zc1-Eq>N2HV%^d|x+p9K>y7pEO@d>7l_}~`TP@0)+fYpZz&4P*|MVx9+$1rj*rx|c5 z$vQ7z6e?-{3PuA~toQ>vETI<~Rj6ti+k7l~Li}2y8@o>qttho#XlXKK2xS!d%DrXY zDWWv>7tU=3S*YG}haG_6u8U;vB;F@4diiN|(F$Of&ny57J`1`o*tq5{^1+L+X8%Sl zzN)#+9Y|c@SY7@;NbCn4fgY|{#n84IJ+~ErV;0yM$Gs6-G-UWvJ*vVZ< zTVE`P%p2{>;V7{;N7x2HN6I?mf&3k zFIFfpaJRCDAv$kN(&h@|cXy-(1K-&55q_*sO-jR75e=WYBoh#btt{_(r8J%EDG=4c z5*`nvI?l9XfulGYyCRYf_2S3j0hhUd@^kDuzSplhs8PA5IuK4Hz7{`lEmd;&ICz=B z_x;20IPAvFF1hMd5C-iH@9{55YgB(n*fmD1ebtY1)I_ef#xM-py;6TInxV{{NetPt z^v8Bs5$MZ}+}YCP3YB<=O>e56ycBQx!%ONZ(SJWLzSoucvYa{^M*v`4P-j(e7JEVe zX6)Y4_wQG$d|_nbDrR8XoHjO1y&H}Fl1<30ZmO**8>Vr684*3uGXTy51>51Rt|wv| z__fmO`vQ(%H8}HMZd9)Shu*0I9L*RMjIC8%?HJ?I;qJ2qMaKDGbVzz8tU{ zn$4aqU$fZK2oqD|GUC4Bu~Q-+Mh~`qwl;joRHdR^J~Jjy1;<>Wf?Wtl&Wvd;TS_~U zF9Qg1UoHPFen2#q&*w@FzMj5jmClF{(sZ94q8T(!+ou`jE$Pbdmcm(ZHdhoR!IKju zPAIn$j4OpQ-Nss;6h0o;MF_?67sG zf`_ct@M*v(x75xlm%UY7#qr$Q%GzKkY!;ALSS&uoRvVEDq^BXA`)Fz9LW*XjBAWAO z%sMf_gl25(7NiGRk1VE$A_y8yMH6-a^eGEVk7};mYm+36CITxfR-Y1RV`7Ty2%mVhu?R%&h3YC@DD<9?^w*%qH2BSiu_6!Bbia>|iZ`durt5(pk=d z*CEoC6M|vdL7I0;W&6J_@hlSBw9Y+}UnD0{j|%&=NbX8mHCCI*Td23l{@HLeS1`!H zJznCa06!)PhNuByYZb+|6mVXJm~|S$wd85Q)JmnzZyI}@EHfsgmX>)WV{48;n#3IP z3ix@y^mr9!*~wZG%^*qO%Dp=#wb*Nf=K|A+mLuoc9<4Nyl@O=m8}xLEy@2fg`>)ZA zD?)YLDdG-B{80CtFI}$leMr*i7{-(>6^tl=rb{|g-1&p*Jds8>+?njuc(1D1U3JCdrh*ZB8~M$tJV6&;7JaJmpkA>U+M z$AYsmo@+>$$J@i7d$@0MVt9XC$ zTqY&$SU?_HELw03Nb!8gG8>CqGJ1lIAZvGrHgwfzs>W(oMU=HTVVx46)*h0W=3DRr z1Ce%ac&svM5wWSlUVJoOcnI0+KuSwds2x{~Mcf^>nwoO2lFTifQyhRf%k8XgHs=olc$$7jh_!LFoXc&17 ztd12`>O|N;veZDhg)9ClJ3Js0&6Jjwo}F`VDJ1*ShQfpih1M;-miIoTS*pwtVCFkG zy3yCVR{uuXmd^~)5eiF#V{Ik}6Ik2?4WMdZ7W^0gH5)8%AWs;BBCiDhhLz7B^MxL# z@DaD8g_C9|1dhTnb)+7asg-mxx1gk|4-&+pYvT~MV(98_8e>H%j}~l(#fP+vx#~VP zeg(lI$$m%QB#0-)5MtnEXM*T*eqLZpu38qmqNc5MhSaVff$SbZWlPD4+)NfL=R(c> zxgDsRRxD04R?6)!+rrJ$kD^5Ly)Bxh7!&96A^tdi_CzEgkS1pAKTbM9Rwi&~A~*CM zoJnYgwSJX}{Brd5*4R1*d!~}tL8=ducp9KfXMq8%8mO-t8%@{!)hQFIP;Za)L@GC9 zb3vX=%?ainXFCchN=X=|VkpoMqdiBvPBRd-)e_B)7oL#TIY7+VGaE{AR;5^g78irN zn~sksMBV*u+?&rp{d9J4aJT39l@AtorGXsPg+VIHL-(o-;q9XO*NE?zoX&1T_67ei6$H!)0gnZy_Q`42Ww)tPczB~@E3LuXBZfl_ZVr77kwfD{KCr*eG-&`&q2 zR!wPgS71rP7OCW>V90xNHMzv6y$RdDy(Zct8JI7|6f}$VZ9eSt0>9l{wcR?5M2LOx zBeJ}}!3DI#(V6*(HP@Gl5<8v8`L~M$iUP=cApLgiv^co~MVbQp^02b)*ZzRG>Ys#U zE^7LkNzFfRNOFa9EDPDK6I=;dM*f!zw-cJh^f9nCmkHk%Oq&xp1U<3`H2x;lj8sM( zNA;Nld@bx7r3!^AOtL(a>geAThDznDbW!5N2*+#6#ynAU)sCOqSBkpS9)S5`OO5zU zCco#^z+F~FgJXu8t*U_|-mTGd#IO|u z=`4j|(3#$4){(f%(f;j&cmq2ej$C)r&tLo1F)HCxe3+1UY_ues|B`XV=>%fa2H=in5uDAr+8p zCiURMdkZ&{0}J8SpV!BWTJLVKaf~r>34AhCUfz8()D?gA=wq-#g@Fy|0$ARZJOLVU z@4$Id)b@_wO-iqp0yL5yAj$>s&&gzHz1n{I4j*KaI0;bw3WRpiy6*fmV~!xmJdv0( zYnrLSOXpZ-`cEJgN=HlJGUIm?78QOr#^2A+gI9NV)0MS14n41Xo?nhz-Cn+;<>ns$ zZf2jaJ;n=VzCgd=jXT5**Gdl`EB@^aygv!@t?r{Pscm}U)7kbK{2sE(VfcQAN3=&l zCT_v&!RvO#v9z8 z7cwkREMn+6-pxoJ@AHA3TRMH8kZMpTP@@~|b9#=NzRK|aSf=Q-AJi{9&-&?Yg9<8) zN`;^AvemGZ=DjUmb&hiIGQ`}ywYmOqJo^XPOf3r7j%q2-TV3wuuLnZv!_{|$=?GWT zcOl#O9>hvmPWo=#5njQ-^YzWS1B0qZv`iHk4WCwcYcjo`=N!;1VXH@@Sx?Olw%br{ z0Sz)J3BIXP73TX?WI||6~(#VQvo&GE7 z0+O1FMuJm4IHAi6Psa)tWoGf7vm~!JK_PP%;|>u2*ua9e)aNM#s4OlJ!Kr6qmtfvJX-$l{r>RhUg8v@zQ(>$?EPuFe3-d&oSj?65H-nN z6wf2Kd6DXV&w4^icf3^Ln~^fy56CEQL?{bXC0?#|^^&D2o#}}j^JPS5HnVt3>5u*@ zFN>Ja&3lYm+r?1)SJ@FcWZF1CeZGl%ADgl z+LPW}6;MOtTgD;Q^b1r8*A_M79HsPEvz7V8JZ<=cI|Vz}Q;>_n`KL_$cq)rGHEfyD zkyMYkTZn-5$~cQ-xu@`Kzw>CGm_*KEcR=g14P@pbvAl;Va7(a^N>(jPK6i zYsEKKsC)D897{1vcND)ryG(>q+pPW4>HLN8{!bJXQ+JEw5*owxLHEsq866xST~~2M z62wM3-16tut)e)0Kf(&1T%4=PSj84P*gz^u?ULc%>@VytT9y(libgOX#Mj*0>YyFR zPD4GP80NHPLr|n4{kwgPut--(Pdz&(;ST zRl9luxYx0Qn-3?mVZC?{eVYpMvBej6uc3)54<6OtZ z+g*JP4ufq0;1>+*v+Nsu_@7k&Z@qTv>bj}tYb-3*bN2Ier(T-Ni38sjq4vadtl(xi8OgF$6lIXre#XhM7>u+G-d1&Pyr#b) zhIJ#0;66`b9w^oh8I`pcX|y%XSq$-)G{s{)zKz9Pwq{O91PP2L8=nYK04a%B(0(sIh#qm(*w}7^%~wmut&tu#-bm zQ5oi?Fq>V7_0?|+W>Q1Q&wkQt^VjaFSW+&1qAKpCSxPG=L0 zmgUBC9ZPE0QU$A#ZguZllJ>Z%cw{O{EcdSxUu!K7vOi@kYUqH2G1AFrLJ!i#WJ3jS za8@f;Pi3L7DXLuIbb}^YYQH_-LU`JQ&~iD)qCLs#z;2r*b6xz_!1>t>WAfC)>&l1M zUxeSu-yq;b%57iCepuF&D0WY%d~=P(m}Z+(weeFk2*!BPJe*W(Qh)LxCXVt^Z`k$D(uR5$MiUoR(;8?UF-87iI>Ym>kx zypOYofI;wGefhufd(|oBWFex@o}BE#a-4-7;QO)n54$Jc}-AB z9Fj$%_{vR;ZK}S~o>d)c-4w)fA>hJ@2>%vAA$JW#DFmF%y~%7+oC0t5&Ury^>AGua zdv!kFnA`%hwO?|lFuwAIoEn2)8s88QdEf;$M}zo^Equgp9#-pAVZ3YJFN~xz_8Tgg zBD$SNePAAv7clIe8Q}M^?_D4ptSi$R-s&m^m$W5{=~4bJ3i;tZI+&aR5Z|TvX4EXQFMe zEoGJKuxMVpv0rJ8mgD2wU*%)9!L*Gzrje@%RZdU#-Mvtp?0IgQ>Nl&W!d$Oig<;c- znXc7mjoQx<1d;E=3I+XxERGxtBAS1lOC~+#Qbaa90U#VXe)klW;hHH-XP0*V#9LttS1n>9xM!aRkHy3v}|9i^Vf z(Y*^<9@rsjU#1Hb0j1B;-orKBaF{=f2_wJ$6T)v|%gl!rNeon5!zw;z^+iOEW1~Z^ z>&F>JNZe1tq36F_Nijr__eu}dxR1{)Q|rtY+~!xBOX!T1CLk3@Z>1GYz=ieuK>!jQ z@jC{*UR;AyMnRf|(d+CLDoctg`W@S-y7z%9Lw)Q5TE4feTrd<%Lp>PGJQ4#kG*pG4 zag38{MNpgX%_k69;8xftvA(Vck-h|%5wHYI?;1-sL>!uPZSm=? zS0BJ&sfD4Fv9xwF8KZbc;y&7bFrydE*f|bqsTR(38@V)bQjZw=-s?!>z~!1T3v>2_ujUL>24xw_4C6dDQ6oA zSIX@lGbQne8Z=8O#vkgBm1-W=KmK`j;(eJ6*(EmmX?-fD2J*Iz;ieg8;Bd0aKh?`HKf1>@Yrg|BW`G(z^! z2fDDpIGsHGOcHe_?I03q4=P+Ll?FMZaPq)&`U^zgP-q27FGp_v zNe-F`5&kWY^3T71lLRb$;98Z+-mPfSvAx(QUseL|e(BJZ?z&w+X$*rbFU*cSINIiv zjp$fVUqN5by=*CTPBjDJ&ApYvqhE?(WQw|ZE5~JfgkrFG%#+R)m>YG~8;bhF`(&D= zQlPT5`f%Z8l?U4~IG?ku$DJQZq@GvD;Ba5}`QSETp<0%eR`qF=+SIlcR3}`eHAG0B z56mbka>cx7^jQUvd`@zo^UJ@~JD{(QQl;`riZYucB;Vo45xA(vkVJOe(ObX9KArpw zSO=6oM)FSV8n=^KOIC}ndE#;!YM%vtP2{SF+5YJmRxPcY(tu zkl*Vu!KW6_A7t`wCq5o#vM%Y5UAy7{;M#_*R!2TKWM|uGMM^p~fgEK`ORk2u!c&~< z%u*eooogsKbO$J%KZ!%{1T_tQmQAg}y&Yw#V(^Ev4MRcp_oS~U1 z7^vMeBq6JtNKe%hiLzIVGF%5x0XhD(A{~C5_SfrRqiuJHO24N|SB}c57BX^Rfl4}) z*p_9>TCjG2e-OCl-|pYJ4tFQ8@j%f0y)i@4y+R=I8FEsaM?4~ng@%x#xI4R!_6afkQI( z-prYXoB9ASw}_(N4=NYvUabT22C_@d1w_T&t?q#1#&2zC^f&KX!vdlP@;%X#kX%rd zkd}DE;P)N;NOyYrb6Y;}rQ%lKy0M;`0Y2h48~g_kgjzwIULHh1fV&vM=CSm~!MSmI zs^Lw=C8l%~7;y))7IO8^x8TPQ;w$wIdb>>cAEujXqW?}{l4a$bG^dMY+vQ4yO%6{~qNBT{kX#l@` zszDVUSOpx6jV39nl}4j_>S)>9S9Y>e-pn|?qKd19?g{-ia9*9skWFoU-KoB{%uc&( zRENG+vYAwXCAF==SZ*2_qQ5>Mr~nTpI#1=UHB+&8xukwAQT4ouOqS`?br>R2osFPY z=3F`Y_eXaA;!he;j00Av2(ZiDesSHPoi?-Q+ zYKT${dp1qXe_jz%>V1KtO(h9lGrVkmrj|4=oL)QxoA*}Ci4-V`&Da&;Jh1Bm- zVr4Z^#^bFlP@2!4jYms&}z?G?2;pP+1-Q81E*J=A~+t}WqXrNrRih+hU>lc0Z<}2iS zhFuG3{{xEuo1g8!O@D0v@3-IodirBwW#jmt)e5~J5v`J{?pzy@i7acv2^dA9 zEOHDvQv{$@7BJJbIYjC*V|v`>vU9fh@~1-Q<-2G1<)de}8+oEXAVHF}rpM@l9Wrzp z9tuvKRBYnpZ3;RzVp1|%wz*rEmRAAV9(fO(C!iUFGi+35Sj0ZITp%)*K{3g6?`BMr z&u@d>?>^e@k!*00gg&WIbiav2s(p8Ka??8?mzax&jfkFqdwX=#`#X!v)MuHGdUAVp z(%0AYQ9p#*&LPmd$fxzgt5%TVg)k(NSJu&Ai^$_oWW*oYXg7_aj<6wHH-zm+uUm4D zpT8W!yIY5QPYj;^0K_6mxky>k*DQnlE-C_Rq~>6lyq!E^ynWmw_wr|Ip2!UOuUO-< zU6q<8T;|c#`$Bbkv z6`|KTl{Puu@}c|}vbEZAdgA4*%EOLo1-jB8Mp zNA)tOz!`#wRJXJ*S9;sM``Q~;uVC^y$FqeynW43Rd9{^DLYnJ@@sg-Ez)eR6^)($P zhLE4cFvDI9LHI4(<~*NNSCLMG9?p(K%Gfbe0tCE3{`!6%=v|I=!tH+DvTw!oOdrAm zd#1AvN~LCF6s)J_;=oD$9uh2#O_9;q&_Q}2@dNM7<@semBJ1r>NsRQ?+vRwnL|Nao z>Y>9j4a1J{m`B6h%j0YdH#b_UF?(dFv{v!=mvLKJQZY30dueqt9%t2){ODT=19<^? z-m;k^NH2fAL!ed}x$I?vu|{q0tg)}*taA*A+gux*03YK3bNG3Pelr&|6Z}#?X81m) zqQ#O$ODo&TL#c^89ipCSIwe}77>zspXPQ|}^-uzj!M;ViMpSVf+5n4*a_gv>ga{C6 z_GI&6i%sYrpKImI#q3&R-{=Yj>(BuET8LjLC1;Bx#o^ zGYSQdJ#J8MfdaZg*2ld~&kilADw!rq1p+EYH%4gM3*TUCHMjxmLw|=u{a1EGSe3xH zK8z5O5zb4brS1qWw<6Xy{GjFKc7Nq+t?ix3KaKwa+GOizgqbe-n|{x9zke?a_ew-5 zLt?W9flM%A-~_#wE!?X_Y!_IkuPKA>a5AY{h8Co#_#b=Y>yWx1g!DM_4hu|jWyO8D$iXsM8ub;P|woUX2 z9xW{1062$cX3%F1uQ%%SFuO{vTe%8l`^4i%A!&OsSv|IW)3tYGmJYdDZm9Ygj@&-H z-THuzGIj9wu&n;xq(ma_SI2|a5D6zMB^3$C^g`oGY!Dn;_-WKNbXDY!2MfMa_g2>8 z!p7PfCpy??drGTZ8t5OKPI#u+$dcjg4wOiJ4g*!%Pr_%!Pg8VE`dt2~W+ySVEd>6Q zM`z#tq2bbE+#XMtV3FsXzW|eW4;i{Z9+K!w%n**5b_0Hq&e)9p3K8iX zdf_it;8)@@VZv{q(@&9E8w#?$TJd-zJU=&yeSS;VOc8{go_8t z;q&2}_{ayI4P3D5dB~UuF$L)?e*uM@g)DCse9+}j2Llbj#mq470A-j?$V4+pcn;aW zTDtebOC_it1;i#w#7nu->N%MykmctVn2Kgne7M~bE(04swOk4V>*14E(zZ7YY7T3A zd<@FjhcDrTub6J!|B6vx4$UNQ83k4N^jkBEdW8T(98Lk`pJ?Q~%u?Z<1mT_eLP|;J zCx6xC;4AK!rG&Bz8TCB%xoojx^JtigTAEF<^P`?QFv2e;qT-S4f|83ARot1t)~rG^ z<5^r_o^e8?=96_<=*h5Bd{9401#wOP9nn&z%|2wmWptEClPREHOhK)4&s)7{riffE z5d)0y8jn!3H`$V48k`2D=L7Gil10lt=_ThSn&^2RdU4x;FQL}PPmvhbE`{X2RZ2wp z0h<^~ABK>#P>yQan``uK{2Mr2Z0PpOa^(sW!ZK(-I2Dx~Ab6LQ;ZSvdg}T=Wh9(>IlDuq?H_*Mz;+1YC5jZW_2Y|J$J)h#{}Dw$Ko1zzv#BHYHHIkm*Tr0 zT~mF%`Ii7#fY&IUMWx-Oj^9wjP-Xjm2%rq~X?@w1?^t7Jahx2cgLTM~oeD)PI%ukMff0G@AZL7_H zY8rpR^3xrmavxZu0CQ$gUoh1w@s58Z-9%Q2oGC#mgK2|ny1Kf>g>f?zk&PS<4t!<& z8OcU0`ekRAeqv}ZtXfe(CbH4Wa<{4}_<<0oK({#_WDV%tIZWVs1d^#-awMN*Giih| zRjILYp(VB`tH)>m;S~E&@#_q(x4AfbP=syIo;g-;&pso1=T{gVc+BWVBSEAfk3)gj^LX$*iDA>yv@l_L5B89h|(Cfj*voKOhAH(%_q?v z3nlx=6|kz8{ujvmc#9{#S}moLV3dVQtdbaM6MAqCK&t!&3VaixH1QQ$EGCw~ZtQ-D{YknW5C6bS zC=Nh}pi}ZsJMRwFWb7X9?R)I}`$EZ5|F+tn?EI}#M(IY-^5J=THCE@7;j+y@h+rVuJw`pysh|& zN!8s*gORh}py#TC8VPf-Zg`qjb!lG7NR2ycdfSux?oZ$TvwTKWVY-r$50I}Y{EP{$ zWmp**7F<@%$(=`w79=kW`yPo$bMP~m4Wn=jM8WYq+wIBrI^)Kd76}txmwSX44cMPi z!-(XMjKrv?$wCl$7W5fyx8_LbEJdxRCP$~FEhH(|Bsq*cHag&77GbxMx2o7Pd?}u) zI+d16=`X7$et_4K+q}6tV4I(eJrv9+@rMmPP4G^BOL@}=!fc#SO)6Cg5s_FlBM$US zY){wd{-XSFa=E?FLG*;lr*7DJ4(~S9g&3VIOmO!!Ur|rlQScjbxb2&GH_Q!h@Hyj= zOyNQ4Z_uR$9QKXf&f+4JcZT(o5>3DO-&1G#ldBq;jxSJV{11sg*JQ_h=IQEr!|A;b z*K%}_dfg8y*Y`}+KbMJYhk1|t!g82^1T~IwmJ@sZO2Fo9*eCBPA-oQ7X=1WnE~ng` z;FGzJLR~{oW1~Ow7W*U=a-|oI;!GMwapUI%-ZG3v37$f_`6e~$beX}P%`C*GBsD9o zeFG0of_NYfX{MQ*V9g&FKqCPeJjWFx1+uJIt>%{2@6Oj}U`&=;u2{r@sn$0XWt3Gr zkvcE#2UlwJ+hT--5SX*SDqW@+D(*u5PTy>1GM?}!R886U&71w<@50i#4s|DRSC#iV?R+77^2#6jT_ZQ?0uhtZ>>xL=*G%WApq#I{-Q626@UVc|W#mfiIdXT3fD2FFi5qpkXgB}Pr`*)cUkvUlhy4BOT$pu9$zt*SZ^Pxn?=MBMWJdwgEcZH@=YY=C7 z*u9CMrdNI>0u~WGP{_L`Z#!JdrsnXq!}@G$1JX07$A-iN!vO#ilMKJWoQ0f~sSWCw z@>x}jBL>^yoc)>pJ-bhGT@vb4XKfx`E7G?l)c#srstQVK*(>Ex_~6GRhtu*s?&w@j z)@f}kdQ`O3WK=BBi|p)7t_$cRRdf2Jlw?jhQ|}jQ4I-U}6FjCLG^)Z#r~kIr{VzQJ z|Gd_*F|+&!zgeu|s*b$6k!!4PYE>3xnKCqGAaNxsTu6!u60M^EPZi;Ze6Au4oYFDb z(V58uBdWwkFF&5#l{|947;Iy{^sFqG_lhSsc0&%yEb)r)%ei{ZHI`_*&T zQ8=lcg9I_W3auvHw0Fb!Dxp}m-~UFS1!e5A5iEgfd3o2Zo3GE!89&uEqnaElUi<*F&3Uv40*OpE2MHSyr)7AQ zZNOwnH1G6E9yxdgBrUjc6-%b-kG*|q}DSmL=9R3340NMc%U9dC9|~9)pDN zLS0EOLQuFja~lPZF*VIIJ+~fS3%VuEqJH`SZCoq?=!vl-B>aNp9A!=FOlR&>GWTC} z?`O|yYt3$)k9$fWwd5 z%pGsfZS8kwK?FVoC-*3Qrk=x%Om+qbuU zNo8A#GWix=-~dHxa)lP<-QuVs8eg`|+XKL^zx{>K-QedNeqTe`(x$%Vg|{}QHXLp4 z#gu^=Sxka{7@_IQX$gkoQGQx)pxp`pP;GxO!=1&e8urdXAldQ7*y3I-XNfzy?Z96u zs@|)cyft+Tv310lV?BvNZrHuf{*(q1l1s*@iH-`OBPn1vH@1{@MGW3IFQBU^V*?9C zkXo4*P{JY-Ke9f-&gb%wD8t;$i@`6h zQ8I{Tmw?vEDwPUQ(+hV62VHwO*xrKJpfQssiMbUO0}DYPs^O@qYG`y_CMH+EAlc=z zs1JRU8IsL|H6CyuwLLVmQR}KnkBem>Kbjljb(gHzHpxXGE@2k0Z1m0nA@@NK5}xk= z&bRaaK1>bBrO^!gh&qCLy&m`fv%wuo{ncGrpK}@)BM7o}RmwtNhh6~&bk z4OtxGGEjAF6xSbIW^s#1Xc9&t#ejEo9lmZcp*8;k0Grk1f$pea1CabkBr566(tCpH>5p^-@mfNflp zxZyWEh*ABC20N+) zjRx1JYQIfcT13UvuI+ZWP8P-!GW8ITe#5w()7RL^Qy=FxAVbuRymRnAfgmEEmY!Of zjnFkU%|aql4O%?@_NCPdKdnJH+E~D?Oexwtrr?2^T9enQ7Ia$RIXi523}J5VrXnxz z<|Z$%;%05FqCz8v-#D7JIDlo)U(Y0NF%hCJPg;g}$LH%9S3Dv>Y2Qha5geCOIVtk% zwU0kZ?g#CVNey3qn{+NReNEn}Lv1CvT4cxd+;WSC<&&m+1sk&mf5Fi2t9v2+25(Zj z*)p~9+TUD8WQW*Owf4)SNwwn{s^yjhI&czvBtgpZAI$8jf z#1g%P#oq?4ftaJBV0Z~TXaA#jCT0ZtQ`rF}OXB+OXqx)qZ_mW6*npZMg5F}zj*V0) z#u0U$_w(_R#y+pk+rV>&7o|75>!@U@d&w&@CGxRHJJCFns=#?)7Bz%GQRRXiK3)2- zxuDRYt55@dpbU~=E-4$>+P22WE0lvGE|=2L9FoBD9N_(1TL9Ju|tB#fUTp z&;Q&X?qyVa=p-%AlWB47_y!c=T;%}_-D4G%%|4Z;9jpwNpyTO*R+ng$6mS>ww!@+? z{Z6!kq*p{4aco8c7D!c4Qrhb*0sd8Inm}STYF8ybPvUP#+-9N#NH92h1IK}p2-Ze5 zb3RXZAC@8O4LJO}7KfvARlN;u*^h=jxIM_`8EW$f%#O4E8!054N2_$D{L!zRjzL+) zn(b})gVZ*z5v745brj!m=<5l{fFqG-pl;&D_7$^A6A%9rtRHTT7O_)CaY*(9AhP{^ zubb3@M@ghmnmO+t9pGsN`5V>swXlf39PbA89m4c;4E%#NH&WOC!`@Pdr! z`zuGBxM}fEW3Je|LO5;3VFF0u-)T!KJQ1|P6i-cel){1c;R5@Zm$Oy*JCAUy+M?WS zml5e_N;!~sD3K0JLbL=m0UBcCH-~e9!Kpx4n4k$ zaR#*Fc7umKau_vZFXl@2X6$ab+xdYyqd6j;WB@b?E7zQ8usL~<#fQ_NDEDzk;Z=a{|1IFXvWggc|6D*fZkLCmaz{}n3~H){R*J& zvHeZXjPyweSUh=->2d3`UJuck*p?s2`fYl?XqKuxwL{TSEdRb*UM!tzpPT7l?~u~N z6Z|%vuxP=73^LxXVCL=8a-aVL7hkO(%K(i6H|Ga-wTL8K&81j0`ed5emRv{cu_ziF zjc`Ms*$>o<5k1xZIJcnbo^oGmzjX&g)posC0JA=QHCscoKNv}92#CZ+$9{g#l0YcM z4E#R1>q(y7VjP7t+LIsV4+C$<&;bz>fG`QG!hFr$QJUvJRNx~uE*fH7=JoqTQs?g; z-bdaB76dZMS4iJu{$pz76Ak_IVyL5rXKuZLMoT9_C{zkSE0tI}JwrHsJT?3>F5z2u zblQqAsNq7IaG^U1g;gM&eG~X@wt-;Ki2Tf+wli5j~uvvpZR^>ULwN zfCT+55o%`0*2p>~PXm@ss#eGowi8DXm(_PDk(w&V&Nqi4D6Y3y)(Pkdt_ds1p@>aE zaO|+S#*o9%Vpb*-o8eAHY%6Ap$H8q3=QJ^IK(UqUgA@6Pm#otRtVjR4+ZhPvsAB@4 zl7OWd9NSen5ypULzYj0~4}s-hh3E986a$vmxiEZLl0Z0ki{D(No9P@T1VnrlEe3O2 zo1nJua=x{^C}!uDH^f3ysT)%t*U~x7mPUm3eo?JBp zO2a-25MLxaE+}+UdX(^Q%05fyJcAQ<^^Ui0jPM*oJ$7$pG>8fTeNkt5Tp@4=a07A{ zViGXQ>c(Uj)+#oRRF&(HQXS4t5YPPQ8Y+#D5*`tUK~%#%8|NOENEf*MYYexDz1(ni zr9vn&$9`)ZP0sUbN~Xjd^iaNnS-aQK-@XIu7~abQ!7SA-sHx6vR7g*=M5G)^+P>p4 zL&sN|*>pfA3D}HfOiyR0nBLLCa^Z_O*rpl35lkmg`%;(*B5Je{GGX?;bz#d(T-#*6 zJiO!gUOKkC1^RJhkv{YpRFYSA4N3y*rJ3Ym^%->He)5Ha%Pp#4DqV`N;2`mpxU187 z0$dzo2E2v+b^A)9DZdb`HPU@G{qCiw`+h!OYJC=%j?6h|nmZb1MArL4jZ%C0Ief7T z&nLKcI+Vmuy|tjzP~eg=0cd+bmBBO{+A=7r^V39 zK{1B~y*{D%vnd4mJntMuLQyv`Cqm~K6}Zbz?yYSWg=-kXXC`U-h*~nc3(sLH6ef20 zBP6!*AesBBuL&jvwodUL{3oLchdeITd&}mA(BaC*ur7Ndf(zn& zA?$kYsZ`%Pnx`t*T+|>ZfwLMRIQHDWYR-ms?sZw&SnVYL0%8KbRYqZN$l6>;ZaYXb z=N4^5)n!|e2Sfn#4|GSaJk7;TfiXaI{#ttM`Cte3B<6#R@p63*)z>nwaN|@wgu>qe zkgW+`<-b-i5seAsCdS1jMQz^MV|0A{KD}XQIJujc5!8%HPlX4%UG`1Gi_|sbV^Ps? z(TK|mi$ElLTmZ9RuE_;!m0T!yAw_~6wD(D;)**FDd82h>LH3?rxI=JFh_N7Wi&LAt zkPqp8?yf0NG8}8Sl34_u|LX?r$lj3(_B^KsJTu+HB)rWKIXo4#H|Wu9jE)+^16h)c z$kWy-s!=vys*66SEEMW<4zhQ+E*9#JvZ4osy-tE6aT2W%&CVf=y7VBP3|}p4^rHx> zVr;hy+JOkoc^)Ec=y1&FR}Zt99m>`{%SW~zFofWw9eBKVK__ z6SWb}M@~IxE$v}L?R|%#6n;P3p53@D+;_BxeT7_oQ7(+^QW<1wEAh4F_I_68HK?Qd3yD8T$rR?Iwy>0x< zkHqy}9QOB+<$5hI^@HW2CSk!mq>}W^vs{m~;M`zAm(6PZ5D1{|530XuB-$XZLsW2rpEhvyD$YnmjW$3N**_goJ*(^!B}c#meNzByue zOJTBlAEP8qM+x?)R_Vw&v|UWi*l-8NQjx5=L5)+%iKn&>XF_v_=IK~06mf$1(a?Uz z|BO{Em_&hU*_c=71dtVvCTT)5@*E2`W!Obo_ATgfCEUo~25-}cnj_5Hh&gS(JHwNj zY^G$W01b@Fm@4-2jv^c7Q_^_RobbRSGY*&HRv`!6^A(njD(*iz9^Vi?lO(yY3so;2 z-{|Sjb8HwtDb^yDZVH6}#;$o*f+jBmnCGlS#rWf_*b}L5%phXzwTo6h)#)MDF{5 zzGYY~rLNqEddmv`M9E`C%$*V@9MN8Ay0q#sJPce9l>nj+ z$5Edys7~SKzF)o1)bMFY+{q6E-U!=+YBAlwIt!hmbOX>L;F3T8&?MlQZ`tJc-+xLl zVL|aOjTR0ghkB@dagmW=&|_7j?8Gf#?lBy2ZQ+fR>l#{_zbE#`5F^EP{g5Ic0GdZ5 z?{hL$PCN8z$;{$=GGL>85A0ZZWRWuJviEXUn9H zl;DxLszK{5n!Y{{0m@XKL!gD2dY2WKjs${9hHxwhjd%xhtbtaRU~TOml}!)A0HtyD z0VzYY- z_@UlRZ1<80XP=M@d1%y$E2TVDa{;MGv^i* zP_&nPb>#d|a|`Ws7+esx(yZsla`E_RNSrK3G+5-CVK_HZ4WR2oYsCGs1J0|mFH?__ zNAyVikSEb%`4EvQmpf4t05pfLd8~4s?+6HIsANa{lr`XYfyas=+_^b#!Kk~D&%3Y% zEN>qkS0XJ1kx@s!gO#S@@;Qgh{49G3;SQ^<%=YG1rU*z713?pAQBF&@{=8mw5_{M8 z3f=|V7nl=8SoLOtbCEgO&8*s=dooX9K#MnLAwrzoT(4VVeH@$E5Hl8>Yu@t4!e##l zXQ{1xW4P^<$BG#ve|@wtPS^(m_KJ0h0m|HkH6cTYxrm~L$;xr>BRW3QPhAJ6hpb7& zIix97X2Y==jPi}=nJgbb)AbJPu_e)+;sY)ch$=2nS9vi8annOucA*4QMpi=V0Y@JS zq7IeYRfHJ?H-y#9NIqM*HZX#WHWu8N={6dFmCY9;(9FpFPx#~!RD3fsnKv({GGSR$IAv5d!m_B^CP9}~2qaxo^I&+IsDzZERqK<2KAPd}K>hlG z?j0R8h^Zj=N8W_M%$>A+~wryV|H%7;tDqhpi{1?bh~jvO43T|#)mf}QHlwXw(twYeTAyz zN+|HNR&-%>Gc=PGM|axN5(L86y+qU$yo75=Y2$ZIim+TP&LW^8-9=+FwN>j-Q{Lzp z1Y#yem@es^E>E40G1+^2dpRZFoF_=*JVvleN3}E5Rh|h@={lmisq2=4IO8?T!dlO? zpd5=qQ}2EwYlyuMDD)^>*oI!{EFTI3ydK?MlDfnFf}vBtYsY$mzh2Kz#gXo`ve+@+ z*V#GVHcC-In(=4t%d5RUb0e7W@as^?7}Fz<5HHXz3=wb4WWh!)Kg*{k9iV37o7F8Q z##F(0#au)cK&`?cp~1=_Hyb*-hI<{4V4atdy$Ay`k)FKVFP8(XFP=x;s+8nr+%s)g z(b$D2tWP6D6p`)9VSaM~1y2uxYvamdsbFAYV!<`MI9?|o!BV>pS9vq~C%y!uRlcz> z)@n9PyroXf z@|86*jXvkb3+I?X)Ha5h@-LQRidVk8|RjTZt1R@P09~G;P_=urEZw>jLm1Ury21k&7k;?g zX!n3=h}-r~5fMh~r^$(~jN}8-+XwIB%63?dFa3FF&d`}KbLaPjCj=fZcJ$Xzw+fz9 z2;E}>njjDs`I$Vs3>;<8EAeZFzctydgQyQTRksQzQQ_YabdkZ7U6LP+^)tc?x=4o> z+_XO8Bcvv4=-lXVUQe_JM{0S-xjiZUk9tZIgnzbE0(_n9jNG)Ve8Z^dVJA7k1)ka$ zeul4C#w(+o@{Zn9>%DhgzHlvx}i% z?u+fgu$wHBIVo`k)Au59{oVpeF~*pERoS~UY?3~?XIcABHV)qA3flYC*I)hdz_Q>y5);MN7& zH5RV|nsU6Mg55?{K~+n03L-Cri`qWg(la+Jh02%8j^@E-> zo0w=4zFuhfz5!c8A@+Le_x0Lw#1sSn7$i>`DkM=*<iRnnK80=R{DsPFyuNU-`6!3=`kVwO%inaOASSH7L`x%UrQi_sBL#@o9lbp10 zQ5fBUNOAVdfvjoboH!vfA}M+>YsK?CJTOIE3ML!E>6mCfr*V&_6lrMow7jeltQv@* zeCrq~x$I>0r1&`0)CMa^>BLC>gYw}%|Hq_jxDQg)K)#U_+D2^G%-8gtqc3q!Q|DxzDZm%v~}5FjFuOFNXXC6UE_ z=9q4a%;WvzY{B!i|4NVBC-?A*WQQ_Bbo+Sx0$>NzdTZa(VO$1KZt-IAh5 zvoT8~XmLA|dRo3ek91-a4JaTCL+0V(T!Kr`m5lZCvSzBcj1BP+99z%Dt^#yz_o~LO z>p;FSthKZ|vh-X6*(sR6w5pS1do^k&CB;a#s%!%5zY#C`3q@!j1q?cb8fy<@$^DP0 zfh?Yb;-{OE?@v}d$V|(d5kv)qhk$G?AK1sVf|KbLOlCFoQmWqfX(i|$np*VWf#4xf z-9rOhWARf4;cc&~Y*Xl5<`4(LJsj>OeyGF(%%QdM8di|$!;HR^mW0K#_~F2-&d*ZJ zImRWLqb3L}3Y|lYigZ&H0s`*o9uTXWUdDF2x*Fb|Lc6?Px0BvanAP{td{ULm*|(dk za|M%2CKpZ}QBzMn-|U@mS5dyba36SJ=1eL7?cn;q;&cAb2Uiwmmj6hQOIC+aM^( z8yYf3^k%S+;v}Vouph}HOnrZ_@y{4H>UrNO8njz3b?b8*pYtiJGpF4UY) z%t^=Vq&lVZBtOM?TKcR;nikd-yW!8vy?*zN%5 zI*oU6>|Xi&S90-b-SGJE+LFoT&@bK@450sXK-!rP@Z)mH`sQK1ZiZGjZ?g{S%GFv- zTO)OC(n;%})#bD{#>e@2!*`+5+7mU#UXj%yZOUhI!W5}oL#n&oY7gD0vK(D+)WO7q zK_&XP3IoP)@X5d`eMcJ4r{H{D{B3QC8agl)4EvQ;xlf2|W`Anh7dX zX8NGl)RghbyfYd-RJzENfeA!olEz3I!(=*26jx({#&8syzH$^sqY#VUaejo-_g}`5 zqJF1r^X&A_^;iqJXSgfW7v9#aPb$7-zJ=ghgR2Ln)p{MNj`Ggs3|r<@>Jv>b3y$%I z`p>f)44wl|?(27-*+W&RDubY!0h9f%=9vzSMg=8XLz~8CwO`%g7ENxG_e_Z=A|UZM z$qy(<5Yc5zBRe9-k_Ra)^AzrX+yhd=OGWs%)Jy*fNPE zA%;ztr2=yvb8vn`nRak915E;54pCeXF&vAPIsK{+cq=;~o-cfeQw&I|-~2Tqo9Og* z3zE04iTp!$OXH2Jsn5Et=hkZGFjIrX4*Oydiu>&=dJd2DVF_B?A;5`7I+$T?S~;dM zJ}lcSlq#SKp8*w-z~&WsRX}oKz$tVMXfDC4+|PEFNE63(;SMw7{2o*Gf(vyZ#|_|f zRa_NKURrG4FYrnp`Qey*t7N|Zqpr=J%XO4gIuHjLz*Dt?XLHUi3e894rJn^N=Y9<4 z3+h~s8XGN2*Nd{EsG;Vp3EZ?BR=7ANb;$_J-*=7KGXvGcI_;V8`@>htl?I3c13vG|U z*YyI$qG|KU9nV7*c!fDd6&G#4KF?jWAifE)dcR2`TBd#71&b z8x*2jzL=FTDmHR3<_U2mCHhHCU_Vf^Kpmm;^Sohtak2a?)M=V%FC-k@F8}L19csQP z@)dfP_i1UbITvCqrG%~o)9)V*rS=t32mWQKae+sCd5X=CJ*s|weA{%NhEH4N@_ari6|ywl1u+x zh} zAsVmWozFF((QdDR6r3uXzRESjfP3T@^2%n;U_#oVoB$k=5vf2Ip&NK8g)}6=^edKR zy1hT^10hl0BnuperF~GQu!6}wZk@9^VfP7em9S@atHA`eG#8fWX|Z++{7?K^L!3Y8wQP2iF=C z4E95KWR6og9H zF=VGq;$Hork9B5*J^(1Lnd-v>l|qy-6i=cDq?VuAAy3y#jD;YTAG6)jRj6LeRkA(Y zz6oMH%p{rW#DT`7<5Y3l&8yfU(B5;iF(IUyXz^gs`VaTMJaLg&J=zAGa@6q;V=%E@ ze-SdmT-?NfDg#*E-;hGVTDTa29`Yl4--!!v`p=ykhX-D4G9Y5Ov_so-+Q|mGny~ExPnXhP71CtaS z6XEvzIBe{fO2lnvn;Y=~y%bw;Cm67214Vl*J`rqh_wryGXWI%WHulcI(kK#q_$*Gq zU~=dId%n&|yuKsdAR=RCdRGEbxj^A`HJVC zA=ivPjy*4=3UM=g7lbEpIQfhpZ>x&rWgHW~BJJ46Qf(Hu(~zKkI!9Wd3>p&Pj)FF&MCNX-~0ivjzpoFI(cKyZe%CeUJ!F zJanG|;!C3RCh6EC^90g0U$1w7VgZV*Vs}Av24srx&fvk~*5j0`%VGI;vU-pUb+ab7 zG2eLseu-;YSn`}qLZ?f>NuK;Mfv6erj2a(o7e%O8K&JodejWk#HQ-lwE11YT$y>i0 zx?aykgsIdM%^OzUdVb_+=B4Z|&kwfGdoTW(m%Zo;WJVS-W5inGvk?m{X(7FqC$w&H zR*xcr8wWYi8~50D?J$cZpTaKN8BP|Ew6Q1UAvH)ya+~vqeq9Le;NR>65-A2_XYKBN z66X0slBG+Ot_w;^A75O$Md+6cKMEgJVhkbjRM7e5okVpw9)*6&J3oRt0gW3N5gSE3 zX&zkOD4zL|73U*!PR@*$<$Wa>8-hUlKkK4|VJXlgSmPc|L_iGCMCR9cQM!coTeSeG z-G*Hz)y^&u_JPBDUPjw$nYBZ^0ikx&cdLoHtG*tEPl(!qbbuGUCzdD0vi|Fk%&OkH z3RkbohK^*B^`iCd0x|P><8!?U5(b}dt+0xBdJ7(N{D;*Fb*6TB9d>0RKddhEh+>)P z^uf?*5_nc4uj)>Ikr|cix+^v&`%FE_Y25gc!!Ni^)nCWeN}?A_5FTB? zhNVg@rn%Qd;gYKK|!?v4O23;f;x2BdSV6z##{7_GDwUp2ox+*N#Dgy9=PcI_{ zU&WF^`!Ri-=c@b z*N6_FGT6&|&VcEpHvuhwXmbqUj`_n=s{WOhV`K4BdSrfnTqF`!FS3)~Hu>KUk@S;m zVcAPS;h3oBU3Tj02o0ChEA(-GhB3;gs0 zfppn<>v=V98fJ9p*XHD@N>y3&gG~l>eXmxBKLerN@wQs>#g=dFUnm{ZJXxmjQ)`n` zDfd3ZNR}mbu4*jjv0TqR)}5Md*m~314$@|D2lpbxCAE=pn*ChZxk5Ih&h?yg%b%~9 zRTAjsR-OhMBXA)K5ybdrmWBq&=@CK(8@)JjO57K{!V%dK_xK{eLtk&YwMsTnM5`|} zlZP-w2hgiwV7G&G=BrZu1|nhpkSI0;XlZm3dN&f10gWv9Y`vU=V^@45%O)!)Jyf#m zV^&NB4bCH6rYL-qrTC$;HQPbXBrm7r#x+px0WQ6xyi={;)Ywav4Ze@sB`BzbuaL~n zePQ5Onl*t9>c^r(gnJ^o1l71aXG)=6Oau&SmWj7DK0JvYJ_I(Nb=x0; z#^)5x%E7YZjxu-6tj6^5Vj|9#ERp7tbE~SVr7FR$fhdaC8tGZ6AJ^}+7+MVT7e*|^ zxJPZv9LFBBPDA95j1PhziYy((xdN3Y=ZBy&6J6_#%-1I*hKW#xlIj_!M3~2cVuUNy z-|xfEc&dh`;#5;tsd*?jjD!*8%zEK|agT+W%<|-XqI+Ld+wBq=Q*k4vskV#U)KbJ$ z=@NEiwt~HpT9p9lC|^`?_L_A&l24s(Yn9}~ z>fGpbNWAiYEpw=J)v?>1$BWQopMi$*jN@X|v)I8mD88279)djfmFzKv7blqnYThW| z7g>)Mz+&^rrzK=(wUIH%V#IWS+DyihQ%%y5BZTjQPiv+zsUp*Y#sp(UN826F6Qwn( zMqao;MaQ;c)f1dlW@OOn1#=^G)}fSzfNZqZ;_b|XC%;T5KAgo!pFPELZ1HVbTo3Q> z^$;5YzHk-Csn7gHR(sSJcg<&UcAC24htuK85&LIs-Cd z{8%fHvD9@j8G*^`ZltG??~OK?f^rFBk{=BU9{xLb8%ZWLMz7@#LuT|tQF;Q}bT(Gr zmyC8R#h0`yS!Km!2pi;|6I+N>P<9wo;+2{ODq1F4A$hcGlJ0^A8O7~DgOhBFY|)2~ zM(t-P@HV4X86{Z8eKhdbLF)U4M*R|xUH!)vTl)s{Xh;9!#+U8e6mp`~+#QwE0>y;f z*4<)WFVI`GIRWAbsI!%^80k1bbzEf-dPcO3Z6zCe4=`M(WIQWWsK zIQTgf5Kd&}eT8^y+g$pM5fk-sQB)vo4KLtki1})K6Nqcqg|A}fhAc4VEBMo0KrdzY z$Q2b<;1&`af?argXdMn$q4`5*pjcnEHf~vBO$AYROm$7@F?=RF^BN7i4!8y-QeAe` zkP$fbqK)`dMJV*b9WNu(c1(ZerZY}Uk43kQs7GN(uC7_+Ii<7&Qf612b}-((x72}x zZQi^65!w5k1Ht!gFgrVI`#TPAn6V8;=Jjn{+thj-E*VU!g7H17+$*&rYRFpZNp1sF z7E}vIO}-{}6;R%ITci^pkOrYn+FRB@0**)DT%mnrKg#7X%ews^8kY^H5mF_X71Utu zp=&Y1;>LvPie5)KOwNc?N;f?HZO^oK0>G|gXKr~>*T!RSsYnm4Ms31MHf$kKD<{4H zho9aOG;DbBxP)K%3Rs(jGv4i-+BT4!S1Nn0(({C%VL~;9;kRzluk^0#$~o+$+{u-y z?qqeFfso!&iR_UoXrU^~OGn&2lC?^F3a4fd-_wFpQhHo+(^>TPRkGKUpe*uWtn`lc z55f@R9avWWuy%M{VCqqsxFr9^AC|^FB0jm=$@~-U`6_GIgcFk05#ynsPe%ImLK7o7 zt%)d7{I)Bvv9#m+c@ekl(`YJqn;n;iZ967SGZSd>qi#1| z^5@si*42F5_?}j~%i#_1W8Bh;=>ZxiY}jNnlF8m$UzL^0g+&YX?+(de7gd^TVh7>o zby|O1R#rkrR=k4q`j)mNUwmec^;&91f;D|BJYO2K>ihfjhcAGAY6Hc8@o5Em)SN_7#etY)3Wbq|B&Zehxz4lB#^4>a% zB$ZSAdyTPLnRaw^%w}>QUr0vK-`R(KQBwN=84B?b!_e!YTT>iRkG~5ErqAvnFd>Xz@=7aSE~`tTo(8VkR|ye?%yv={)xh4dGL}!!-1j&#<3(# zsj7S>IhzFz%T5rYLP-+bGNC3R=idaghiJDDb!$o%9UBkP0}>A6>5}Sm<&miUbiB|t zm~&Pv+m<=%F>Rw9OI~_p7%i5o@ZfHd+GEbinEl9**4R39dyHkRCn-O)pS|k2v`k*M z`JU}7=Y1^wKx)8YNl=$yRjFFDB!CA19Gtl7udqniN&7z$`H5`jZF&q z1$;D@#j6bu86U3KO5|vu?FUBgjCwax7Z=CC+D|b`;p=bvgP#mQj6Y^fQ1*Ji(w9#O zS6jg1epgdZ$Xl!O8z0E+ihmcCi3V%qkbP_dGvJ)+WYBsQYj%18fi|UgJkzHs>X+7CuMHPk(A>g!A+`M{3$CmI-(Ap$Hads#u zc?DOV{4#yo0&e7e|69c`sm$>Az22wYos9Orc4r9~a29w#-}GDxO~1Sw4#RYrOVGOK zscv3TG>wMM33VyI*`z3pv2D2BKew=F(WXaQz#-Sd9^| z0Y??d!?8sfoEj!9!pQAF-O) zc(2S71Ri#ZQ9YyQjB^2``Pi}issv^rdF6iEFGOfY;i5@be_+hgzo@N2TT!r4sYkCg ztr8-J?|7#uM+Rf`CD>ZJ>f6B6x~@08-t|(%!i~OJi<0|QNHAM4CA8y@J5O5x6XTPU z3CRA3vvX|DEZnweY}@JBwr!_l+qRv&v27b2+qP}nX5apJPu2N!e#5S(_NuwY8q;I4 zHoRA0AIuHx3euxRAU6tNT$QXc27#Vb&qotS6Qq5rK-7YoaV2Q<_9F(7I#Q5}u~dWv zorvMsOSqoz1WW4NhOjK-E*vThtUad7S6i0U8X&9$%yS&RC6#0-V@jrSb)?8wS>&!J zSh6LoIDGM0^IUkMr!q%_(KTm^tuxt$@mBJ=jcvNK2ScBbbtQaaJ`;r4XW1!od8J^k zr{*Gv=~Khw0I2AU_eSqAEWM2nM5R^q%Vsq-O^19Na1!~_HRaeM*ARf^1J^|#`>GNK zT@q3783rr0K%WXDgImw~)fyonL)`o>Q-Akk?E`h4Pi>b7OL1;BH{>8A;1+^pAbc*} zFqeR1mY34xG@Q)q zR%UW;i^ZP?4C%bD$SdU4ZE!@}_@#ZEmOhlz*0LIIxQ&M}{2I1hVtt@%)nNC?-E|dLoE!&Cn?VUppkC&ds6gO{0GN z>C}FAncCPz-`39~F_hw4yf}rQSDV%K{tvolpOT)JJ8{W_x7gf7aRaTmVeT;^HgB$4P_>UmKQE;Hm1q%iZl4}eydFe!~`q?Tfc9><&Oi)aF{*$uFP>b)WakI zq~05Uo1h}%#q@U>whT<>FT0RrguR~$PzV*yP$I{X$*n~#x`nH@c$ zBnA%uV4}y>w*hV_uvLp&3;n;6?hb(|5~%V_)k#TeHL94PzxD0PYvmciC?HEaCpB}P zJ2A-2KE?oB(*(HUX~C zz=pLq8BBk`20B=z4>$L5u8e9|__~Hu`ib_^ZXN*5e|Ex+U9%kyrSYXUb%F}s{H(EO z5{+QT=*KI6`ToMPC#DnAR`Vz|k?`A5r6ihvN-+A(I}IF%FyiDfX-4CL#|;J<)h3S< zYZ-^`Vq3T2dDwSq!K!7cYhl8I&vNG4TOzdNrs0lNfq>ipQ2>XN0{Oksa)uJcZ}(nU zaR~Lq*jkqJhfrW~JvP`QMq+d1V5yW+WFYd+UA-U7?1}-_UnG&IyVu!yo`G58ytAJT z39;Agx`)G>Fqx%nwpq8s$88!%7f(&b{Z00)Hy5X-`->M(L$+zRxr{d!t+$=@ z;q`6R4AvgI6XO*}sgOG?eD5$nuk_T1eArVuzd(#O{N-UcFT3ZEM=)xz#1|)WhErKV zbIk=Qs_O1&f%!q!9wSzJweD)u=iN^tL}JuOz7yiV%MN^^&9s2ddfhR}N$()y+;BTy_TW`>%JbS25l5JZs1`$@*c|Y@hNeLoILdM${oe%3MwbS*@qJ zhY)0V%9J6N45~UsfqWD`!I99n)VtCnBzHOnW|EqpG3)QoPKLKMM1As5itDIEd$5ha z;w1yEGP}QYa#ebh2?prTANP!HCl{&ch)q_A#lbabtTUcmCb}`c>I4$cdgU1@Q1Qk? z%B0@(`Cot1na2U-cgh#29x85^EZwTx=ts``4S{mVXdI@aMQZajh0MwQnvl+1O$p>p zt9Wxqn_aawpiG`WBVvXr&}`mrsw-oL5@y}rGdE$eMgzL|6h39+-{;Mho|R;V@OQ^?~8abnl^BP2)2E$!IK<3$ZLQN&A zC@Gs|hc)8G+xN5X9FVP4mjshiACkSOr-VuCLcoB_m>9#xVpPj>IJkrfJ&p9DNupmu zPC^dGTPdgwna*V+M=8}6%UPf}#In@0)*PQhr-br!*Ecz~{$E>^!h~TV(%N_iVRq&& z)l2}npZyx-RGpYdQ=O9Io}8-1@p!PRsVY>Za#eNwp}MGn-|&JokzV>Q8ikt2W3;`D z{q6|E`i0INZ5gfB?XP#j@&4bp=HW6@k%;8UgjxrqG&-olU44LzM+3GBr^eA7buJ6Z z8=cP6B))$*r)VH%@o9)n++hJii-@YHsk3NRB}jT6y-pi3pmeCTymG`hroB_L4!ZI|+%Stu`k@2=~kecgirhKxt#=5|6q9-2W?vLoRvV)=R3{N)b> z80mgggHzUVP`a6dfwu9$EV@~I$fYGB8SRmkWUHR?DDf#pDFJyYpMwU8z4~ zhCPNJuz&8L3L`2AM7vCSiqx)JK(8zeLz(z{ap7LW#*l7k&Svnh(1GAP&7i23NnzsM zlQ0=x@?YsZJ~vaFP3rL0^~Ct*;kVp{72%o=_RW)$*Kgt?Psy!8cA_HNU_u!GxvS9L zUBT*GEdB(yp!dh#g&j-xS($X=-X?yiyi}P9IhW|f-ni$0b=F6hS8*XB-X2W z-$K9ABoarUwqdUkFORS~l9GdpO&`h&pzJVlrdgx~K`iUQ}JPQlISl!hVI^i3;K&Vd1;<9cw+Ob}{6?tv**+WGieD(no) z^bJMp(1;s$ezr@Q`AStwkt*RP#4b`Fx?%XPTaS_vH{)?}Ge89i5gh+~F_uhf z^Rg*su^=(2o!t182KS`bN|CMDP$(}hB^_P$l;IjmAqJ%?p3T&Hbv;o*0G?~-B`9s< z&Kb-)uDYE@JulCU$4ce=9T%H}gsI$%d*pIynjqDg^`(OU{j_v~%{k#TOs$d$0JH3FLoEMgA8DI14lL|Cc}-n-~}x8km?QJ3qZR z#6GON+&|0FjziT>$xX~sv9H2Q%P~w#(SlU``6QaY6A8Nq&@Li!oe)0IIw5waC;dD! zE`L3y8hSoBBUjOaf)4r%A-w|#MSqZh637LE<^{t8QxX#BO3MqTC1?Bk*0_4}8z@=$ zibVUN#uk^s6H{TNQefo0VDuu!*WZta*E3)uJgH#xyn4J~{N9fR`(?pnzIa26m!gNV zSwp{AL*tjALgx%t^9{gXfBl^cFp%TBvXel6o@AJin*!#JKt5v+Gli3lj;7__UA_A@ zuWkSR)@_4$I7_zsDVmn-vO4kYIjW|;psUi=<{kDG=Wg>a{9{Nxwa)JF98f4Y&cbLI zcVq%wK03%B>|dPh?+i8ryx)g%b9XBElE`JxvW5mhkEXL1IXn+k2=svFPhG|T+h_S- zI+TMrFtK#{FEDM_{)&33lES+k)h zBWWyr_QJ`TAdb#Z+g#GYNP#B9(W5Se#aas`rlcM2Yq*`mTq^!3^Y^>!Lgc-T6NUjV zq@*VImUD9|C8B4W?!$C!`8Ns9AN_H9xu;jkj4j4aX8ldhlfA-1y01Jk)OlL#Joh59D${(W>>}*y^VavZyBBjq7>?P(8^|Pr zhpxPi9?9g&8v`@rx*Bt{0dN@kTkkH<%vi_uA#zmm4!fyaa;;f-*9_kF?%lgO<2#Sr zpvV}7hh`7&)BJ%0#K9j_$ZnxA0;y-~D_g9m!E(jl(savNC%%4G-3T-AZG9i0J4513 z(xbCtRdKC}0(kh87d&lvoHvS0gwZp)yn@ORz@LW%&n6?%z=g{BiNb@{j(%5lQ-ogL zShb$r#=~L6cp+DmWs~Ot-wU=S}RC^(!0jEU!( zJ?p49nl}61D-BA*GULNyKJ&M)!kMz;V*9i6_2=fcM_stTFA$_aky4ZKwwWy}jlbJv zy#dN{>vAEy_-)McH$`1+?6h>`*q;BrvO&WyMlmc8GeH9@NrMf+@#kS8p1<5Sg2X3& zcIT?_Ub4Ti1o;GO2d)ynTsOaus67I8O6B|%@4^)+ahM+pm<$gGDHQx~Leoy@HM)GZ zPhwkZeXtUeF)-^{v~ZAd6SDD;(Q`;+!sREU6{O`dQe|!udlxvJq@pEdq9h|Fcd*eD zF!GSoGO-D>@Q7l@BBP^vzaN|0-Ylgu60q+r7tG6KbGUtltTK5?_}S%gUTEJ}kH(L< zS!~L9ZGMvf3?nB*RIF!2+#4cODH%qU(Pp8v@UmrXMI*v0$U$#n<6|bEp{C-Xwy=8{ zuXV81)#{22p@BAY@C>VYeGw zJk04l=z9^-utLQMBV~q|5m7Wj)d*+J(Yrw92&c`_Jwb`XguxP^ZZYiT5ioe@Fbds) zdCIgI6z);=llGhRqxG`{RRmcEnS(Ea_oDJrq!W4Q-31wx?uqr&7N|4o{}H^4+*9qh z4hjtt3t9z_0+#`k0iOh?0iyx00;>YI2D1jg1iJ*s1;Yi;0@DVoLqviC2L)Fh;DDS$ z^yD65a#+ka41N%M6z#m#cG|_Zf-uG9wZ1zQSrV}Vd^w(N6}*cuAjsg(z}e$7*ⅈ z0(SqdgQgMc@LDaG+Y@k8tVG%KSNoXIf8%{SpWV-|$0^78F`aCVBFLOb_ZVFn?i;?; zPmbhbrE&i3-=`5OczrRT@_QbPBt0wqp!oS2P5dTOIM4k!KKD)1OaJOSiuz4kZaSn7 ziRRW*@dQr(8RA_V23GqTeyt@>GY>S`fb)K00hFJ(rv(qHYT)K+S3sm{!PpKdo~En} z)^~CAPy+4TQd_*!gD98fWJ2Hvx9Gu3z*AyAlSgX4=k)wp)_tj+hyb*FETA;87uq?z zsPCtV4ZRe31Zs}WsSE&{wkPOt>MDdUzXcX}Kmld?Gm$NWyqQ~tvggU%Gz9Rw_pC~2 z{^%F{+61SNfQM5lJT|I|dlVvb!EiPCgq?hlaoVQGeLp<2vD!G~7mWGHc+BM61MY25 zx{*z~8$M+6kR~i$#^{zaLf7mc$e_hk$jGSh7hD-JxVL(LD!)_63iu1 zPpgVdm7pjoXQPghPP>lRVhM~4g_2UZz~qJCm@HyByQA#V!+1MtK>Ak3MLC0;LhFP9 zCZ)9qT((I^dp9{k74N5Eu=@)v*GD}nT9lSI;Y~!s5~cOC zh_dD7@jjC&`YCBrwQCC6jYQlHdORh0FcaMET;P3QAEwF~XNImtbw=q~UnzPJ=mh9qFnPgi zSpMkAx8={8)v|5j(vnQ&`lisn^ey>`^cB2z9vx*aJ~|Rh&{%2>HiMO#3Q%r?oh0@9 z!{KDNb5!L+UPLo}7OBwo%4@|(h_Z%aFnoF(o)Lh}3*Kt@ek6|fK!y`VULa4JB0Cfp z;n-AuWpgZ%bGt%#&M75%6K*?h1;Jj$VHWngQncPF%SQYus4a9p%N;1?m-Sa>V0X)J z*WLSL9*!@HhCOqR(6dk2*g9d5&pD5J8F1PH)uP<#Sx>o+7x;V=X?t8yvQ!+IjCCm_ zmq9w(`Z}i8WRBHUb;7M}jYUnfIpj1Kl>*%h`xmwq?q}Ef#N$6si!bS+Rm|x1p((2t z+Bv648Wjz~>h${n6~$rxMNHw#$9|y9Uzu_SRgSEk8_iswb62x#yQc$2C|WrMl6mGT zL77_X*q*WraIVKGHO=09d|-kHg9EOYcnv%7>jSj`)T9o5ln^rpW^`h9wh^T$w@}$- zre!Oht%+AuKqVWNK&4{Vt1I+h7^@3y$g7wbR?Uh?nc6xU)KuVQoBP6AOG3BU?pO-+ zDXC`d`2>`CV`3;EoPPb7V*U=}Ac#3Ag;^59Am*S7QPw8$B>fzsnn>`Qts`P3_9Tix zXr819jM_G_B!t-qmxbEN;efiqL6Xu+^l$mo6@Bp}12+e)JTgz!_n zcqoj8X7>tp?z3sU;D@=gBP8T6d~OOms)1!&Q<^!`7A|}!D&p*A_#iOwaibRg08G(UE&tTebsNbQq12@ z(ruTvOAase%udiV$oplEP`MERdH>60hIu5k$gmzApw z7$ut35((gDu7+=BP`O-%jhzke`m#3k@>#q(is#=;NpkX z4_>yb|Hb7rKYhrj#Ae+!-Xq5m$gS!>H5q(&Lv6Vt)D$_#isP(^h4oXvR@!Jm#%=Hn z!LFZ)Em928>?0113|j-QTb8BufGhP_dLbXsOCB3#W`blMKAz&`L<2>Y`&0W3oA~#7 zF5^Ni3*IfiYk21%^0*V@;Pa2cJRXEwlexxP3Uq|^zcTGM?{|f8e$OINX6R`o8deBn zRwby=c;gy3m5hn}7X*03z1)XGIc79Z7+*(ek0$y(ODO0sbl0dlvFE9jJ?K9mb^3uE z213V~Ne#R;gHs14g_c3JK-VrB&m>4#;n8ZEAI~{DT*CeFw8(5)Dxr0aS z&LWfs7Uf0iMQuscJ1rgg85{Qd$|ajAa|6At$dHiD`X!BLwO0wk{Qe_VqF@DBe)#V4S%Cy7n#IS?&~TG-*$T1&EIxNDec$e#mE;8Q zu^YEkBf`JJyHCvoI=Jd9IpkM?Dq#3Yt9wF!O>xwbL)F}c3MW*e;dNWnv#dP*(i*)# zFV3gC)k4`=yjE2U8?WTlrLb2+b`ROoB_@KV%NW)m{5FN3V`Tb8i$T;)e^c}TpDO!yc^I_UaCNENFogn5umf^zb#{2d*;RtbFdqc#<}vmOKln>YFvX7T z&0%Ax1MsA+m$^uv_fBynVeO5x0vkLF25Oisu`0M0g-|Apop~a!2~c$e(L!m78>_M6 z0*R?TL9=r7!PX~?7Fu8X`0Wti@3C7_yZS*>;Pe14Mzoj(a%YP|q=bJ9(EJMhs_i-;SF3s;5p?jz%_IJ-hU?8BJld&h@jbDi z8+xBZr#?m$4roYM@SvtBe2pM*!t*WwGSFP1@*u646EOtF75yVY4;*_iKh;4(c@c_e z&{DM0rhcnLVbkkxq1YaR(oyFRK-HXvlL_Ex;V+cE`Ngx1}ZDD&F8-?)G4Ca zwm8k?uPMcq6VDJl6a^2h7YC@w?hyERTIl!pK06^gz!h?_Cg2}E35JSH0uN@w{UZC4 z+cB2k*MOa$2SSh;-yDbHI|Qf{6%5xJ#(C39=Hww>FhhtxUE@8!kQoels-1Q&fn%B+r2L!_0g)f4aMe z-Oc^^>8%Vsrv%#tm@$6t2Q+pcS(t(&8_h&_U|}k%HG*R`t~XC=son$IQZ=S(PHaKS zp4g$9x@J*Jx`j<;OfF7u`YlQGZb(TgfpalcDAEHHgUhl%S>y-1wPfk4OX|A`mS{uM z1``_9r{fl@{jh^$uLYr}m)uj$YnRWh&$QEvob`TQ?JgJTpdZOW#2n1v`0lZ&2$cuV zo#3-%we|xbhkZn@?2o%WaXqha^Uh}xC8+H(wOYrIxk8FN1i#5CraPT13MYi zQ^s~#MR`q)POU_6Y#Z_+VKhwGY9*liYUf*wsb_mo2=UtFWDlA0& z;KAT~%CA{3!(YlOpyYp2d?ni^4^9kEqdun&U-AtF5Iwm}P8emxN#I@@jC|9N%yA*7Bc6~xN|x<}z^3tp`|kRW{v{wvA)b!l}@QPGMl zQIsZTfoJ3=3YtO1W)wc*M^Ejxh)c7y30)9}t}EEwI=n_Gn&(z>|J!gBn@y0}Y-pIu)q~FC29+3D*%gmrrw5&Bc^o@sh)SBi@zO9GCAWv)5$E17{|t}1W!a$?hJMM?>g1JVM~nz* z=9l3vLOlR8RrJsTE;HJb$Eie+%)+Nr3bVP}(vlrBizXk7U*kx@`Fl@9grOgC>Dki! z{nt%LR@L8VJn`Xgkvh+Kk)jXF&s!1?f|Nyz^0UbYHb*$hB`K{6a#eKD^(9I&jC{kr z@2+cr5wjS4ckGG=P z-uI^`1YSju2(R}XUtr91PMLMbWSpxX?uBpI$JXl7MMT?jUD-LDP(VVxJ0~cEo2~cn z`!tmf5m#YgmI_N23I&}Y5uY9WN9l4Cm%O~�kcHqvm2OC;-#* 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 2^-23 INTEGER-MULTIPLICATION WITNESS", + "upstream_commit": "adc7f1241b42e322a6451854ab7e4b4c146bf78a" +} diff --git a/certificates/complex-network.json b/certificates/complex-network.json new file mode 100644 index 0000000000..62a6091887 --- /dev/null +++ b/certificates/complex-network.json @@ -0,0 +1,143 @@ +{ + "bit_saving": "37/12500000000", + "circuit": { + "additions": 80595, + "disjoint_additions": 68595, + "h": 25, + "injections": 27600, + "pair_star_additions": 12000, + "roles": 108195, + "roles_per_target": 47.041, + "v": 2300 + }, + "complex_counts": { + "I": 15870000, + "L": 10315500000, + "N": 12167000000, + "W": 1741801270000, + "central_roles": 26, + "deficit": 3703000000, + "eta": "28/205789375", + "h": 25, + "m": 15625, + "original_side_wires_per_invocation": 3693800, + "s": 27215641140750000, + "side_roles_per_invocation": 108195, + "v": 2300 + }, + "complex_deficit_slack": "6761797/8231575000000000", + "complex_saving": "7/500000000", + "gates": { + "gates_per_invocation": 340784, + "total_gates": 5408242080000, + "twelve_W": 20901615240000 + }, + "improvement_over_compact_control": "590/83", + "labels": { + "active_nodes": 82895, + "all_labels_nondegenerate": true, + "all_residuals_have_odd_vectors": true, + "checked_inclusions": 188790 + }, + "log_enclosure": [ + "1003674733095412338935264801206694829502804118660273821722358572561777951813562324984581151664909098376456139346987946438356114944865114544057566309229396051200891281693308045036569381219925884240815457348697380244265196736/103936362434495646010619550865033734742948881177937982419226476521510946436948314218071351858470876811875561920539687733866419026027866373569756270393100104240876895441796280524990301784985328254889750901950661699188332905", + "119905674780465260758132999318298249674205865631153226854493684575647168973933813765866273005815485563618924127097549911779010579460799218169313950759672923946122257420539013677630274686709038285230521425787947340179037163618384721/12416930765507746510068682343342696843957626338057657633016923061769841067667425271918924168691987416458733797440474694605908192976129102762466882436295692453310093108779928980052174719912913882184162241086372384329699504384000000" + ], + "log_m_upper": "483/50", + "role_frames": { + "forward_frames_nested": true, + "reverse_complement_frames_nested": true, + "roles": 108195 + }, + "scope": "Conditional on the pinned upstream interfaces, the compact-control movement and guard proofs, the paired bit network, and the written binary-frame transfer for this complex side circuit. Exact arithmetic and finite checks are not formal verification.", + "scoped_ceiling": { + "below_2_to_minus_30": true, + "scope": "Published h=50 paired bit network and retained Gaussian margin; not a bound on other networks or algorithms.", + "upper": "37/62500000000" + }, + "side_map": { + "coefficients": "+1/2 disjoint, -1/2 intersection two", + "nonzero_coefficients": 3693800, + "side_map_exact": true, + "targets": 2300 + }, + "status": "CONDITIONAL 59/10^11 WITNESS; COMPRESSED COMPLEX SIDE CIRCUIT; NOT FORMAL VERIFICATION", + "upstream_commit": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "witness": { + "absorption_gap": "29261/25000000000000000", + "constraint_slacks": { + "K_dominates_log_p": "19979001/100000000", + "K_smaller_than_ell": "60021999/100000000", + "alpha_below_sqrt_p": "80001/400000", + "beta_below_one": "999/1000", + "beta_positive": "1/1000", + "c_positive": "999/1000", + "crt_layout": "2960037/1250000000000000", + "delta_below_one_eighth": "124999/1000000", + "delta_positive": "1/1000000", + "dimension_upper_bound": "40003/300000", + "epsilon_positive": "19999/100000", + "gamma_sublinear": "40003/200000", + "gaussian_cost": "23/2000000", + "guard_width": "829961/1000000000", + "kappa_positive": "59/100000000000", + "lambda_above_sigma": "5521/500000000000", + "lambda_above_tau": "1/500000000000", + "lambda_below_one": "1479/500000000000", + "lambda_prime_above_lambda": "1/500000000000", + "lambda_prime_below_one": "739/250000000000", + "leaf_cost": "1103/100000000000", + "packed_overhead": "1/500000000000", + "prefix_cost": "60021999/100000000", + "prime_interval_growth": "30001/50000", + "r_superpolynomial": "80001/100000", + "reserved_axes": "249749999261/250000000000", + "scalar_cost": "800009/1000000", + "sigma_below_one": "7/500000000", + "sigma_positive": "499999993/500000000", + "tau_below_one": "37/12500000000", + "tau_positive": "12499999963/12500000000" + }, + "guard": { + "B": 338201706233372774319109678801287590064, + "C0": 321727027889740762489223803495350305328695729120143793284991524019954162292886152000000, + "C1": "49961/10000", + "E": 338201706233372774319082463160146840064, + "beta": "1/1000", + "m": 15625, + "s": 27215641140750000, + "zeta": "1/10000" + }, + "limiting_margins": [ + "g3" + ], + "margins": { + "g1": "60021999/100000000", + "g2": "739223037/1250000000000000000", + "g3": "14779261/25000000000000000", + "g4": "2960037/1250000000000000", + "g5": "23/2000000", + "g6": "800009/1000000", + "g7": "19999/100000" + }, + "minimum_margin": "14779261/25000000000000000", + "parameters": { + "C1": "49961/10000", + "beta": "1/1000", + "c": "999/1000", + "delta": "1/1000000", + "epsilon": "19999/100000", + "kappa": "59/100000000000", + "lam": "499999998521/500000000000", + "lamp": "249999999261/250000000000", + "sigma": "499999993/500000000", + "tau": "12499999963/12500000000" + }, + "recurrence": { + "internal": "12499999963/12500000000", + "layer": "12499999963/12500000000", + "leaf": "499999993007/500000000000", + "preprocessing": "1/1000" + } + } +} diff --git a/certificates/controlled-bit-rank-moment.json b/certificates/controlled-bit-rank-moment.json new file mode 100644 index 0000000000..052e4feff5 --- /dev/null +++ b/certificates/controlled-bit-rank-moment.json @@ -0,0 +1,102 @@ +{ + "bit_saving": "123/500000000", + "bound": "exp(x) <= 1/(1-x), for 0 <= x < 1", + "counts": { + "N": 949282431552000, + "W": 230640858616896000, + "bulk_classes": [ + { + "chunk_digits": 21840, + "copies": 114371146876896000, + "name": "first_third_stage_auxiliary_joins", + "original_rank": 21896, + "singleton_pivots": 56 + }, + { + "additional_corner_chunk_digits": 784, + "chunk_digits": 20384, + "copies": 114371146876896000, + "name": "second_stage_auxiliary_sink_edges", + "original_rank": 21168, + "singleton_pivots": 0 + }, + { + "chunk_digits": 20330, + "copies": 1898564863104000, + "name": "third_stage_data_entrance_edges", + "original_rank": 21141, + "singleton_pivots": 811 + } + ], + "decreasing_dimension": 284784729465600, + "deficit": 379712972620800, + "eta": "39/520019360", + "h": 28, + "m": 21952, + "original_rank_sum": 5063027748645128371200, + "recursive_blocks": [ + { + "chunk_digits": 21840, + "copies": 114371146876896000, + "name": "first_third_stage_auxiliary_joins_middle" + }, + { + "chunk_digits": 20384, + "copies": 114371146876896000, + "name": "second_stage_auxiliary_sink_edges_middle" + }, + { + "chunk_digits": 20330, + "copies": 1898564863104000, + "name": "third_stage_data_entrance_edges_middle" + }, + { + "chunk_digits": 784, + "copies": 114371146876896000, + "name": "second_stage_auxiliary_sink_corner" + } + ], + "roles_per_invocation": 11840940, + "singleton_calls": 105555640096680883200, + "v": 98280 + }, + "dependencies": [ + "Existing PR #7 producer and the three geometric edge-rank classes", + "Controlled simultaneous basis theorem in notes/controlled-projector-basis.tex", + "Large-projector factorization with a contiguous middle identity block", + "Arbitrary integer-width recurrence and row-reservation interface" + ], + "formula": "sum_i weight_i * ratio_i^(-bit_saving) < 1", + "logarithm_enclosures": [ + "9783510713611874968740324958676641351797183861185590270241751393067459533421193281070079476571170870692353531652527679/978682499202054070514978518288927529385914174625480569585810024251742618431732790146055136274785574914156400949260800", + "752961610592309612314996643518501663372257559475371592933653805684939530404648777105957079/147203673914733456013697554910181641937856123544923131706837211789951081567277663359837323800", + "35025714299442486126298115876716162662918448956646645751/472630855784162912361162894771314743836712730207957559900", + "53404399181156136933689340363689022792552574839178853470437480591074329413163834030136424247651341434799811670404198682713156022089356073379849787443/695726486648791779476459920605913380590026345815878430558212303073339808526951117401816302494535159225959335809995011900561258004095128616916596977600", + "1584671188880309800789617048858469074835281257058926758778051/475562404420666665892120587597815814965992091719547797444200" + ], + "logarithm_upper_bounds": [ + "9997/1000", + "16/3125", + "7411/100000", + "48/625", + "33323/10000" + ], + "moment_upper": "832316498477146912564441713716480470146509771830369384326171875/832316498516766812983714413733509306294639695517209061296295401", + "normalized_widths": [ + "1/21952", + "195/196", + "13/14", + "10165/10976", + "1/28" + ], + "rank_mass_weights": [ + "10841531/520019360", + "12827685/26000968", + "855179/1857212", + "20865/2736944", + "65783/3714424" + ], + "status": "EXACT RATIONAL CONTROLLED-BASIS RANK-MOMENT WITNESS", + "strict_gap": "39619900419272700017028836148129923686839676970123526/832316498516766812983714413733509306294639695517209061296295401", + "tau": "499999877/500000000" +} diff --git a/certificates/fast-gaussian.json b/certificates/fast-gaussian.json new file mode 100644 index 0000000000..23190c54a0 --- /dev/null +++ b/certificates/fast-gaussian.json @@ -0,0 +1,132 @@ +{ + "bit_saving": "37/12500000000", + "complex_counts": { + "W": 1741801270000, + "eta": "28/205789375", + "h": 25, + "s": 27215641140750000 + }, + "complex_saving": "7/500000000", + "gaussian_cost_power": "2*epsilon+delta (was 3/4+delta+5*epsilon/4)", + "improvement_over_compact_control": "1479/83", + "improvement_over_compressed_complex": "1479/590", + "neumann_samples": [ + { + "alpha": 128, + "b": 1048576, + "d": 8, + "gamma": 262144, + "n": 129, + "n_hvdh": 12288, + "n_new": 129 + }, + { + "alpha": 1448, + "b": 1073741824, + "d": 64, + "gamma": 268378112, + "n": 1025, + "n_hvdh": 786601, + "n_new": 1025 + }, + { + "alpha": 11723, + "b": 1099511627776, + "d": 1000, + "gamma": 274857458000, + "n": 16001, + "n_hvdh": 192014285, + "n_new": 16001 + } + ], + "scope": "Conditional on the pinned upstream interfaces, the compact-control movement and guard, the compressed complex network, and the written fast resampling lemmas. Exact arithmetic and finite checks are not formal verification.", + "scoped_ceiling": { + "below_2_to_minus_29": true, + "scope": "g2,g3,g4 <= a_b*min(eps,1-eps); published h=50 paired bit network only.", + "upper": "37/25000000000" + }, + "status": "CONDITIONAL 1479/10^12 WITNESS; FAST GAUSSIAN RESAMPLING; NOT FORMAL VERIFICATION", + "step_inequality_minimum_excess": { + "251/256": "0", + "31/32": "0", + "61/64": "0", + "7/8": "0", + "97/101": "0" + }, + "upstream_commit": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "witness": { + "absorption_gap": "47041/100000000000000000", + "constraint_slacks": { + "K_dominates_log_p": "499940001/1000000000", + "K_smaller_than_ell": "69999/1000000000", + "alpha_squared_theta_growth": "1/50000", + "beta_below_one": "6/25", + "beta_positive": "19/25", + "c_positive": "9999/10000", + "crt_layout": "1850037/1250000000000000", + "delta_below_one_eighth": "124999/1000000", + "delta_positive": "1/1000000", + "epsilon_positive": "49999/100000", + "gaussian_cost": "19/1000000", + "guard_width": "19969601/1000000000", + "kappa_positive": "1479/1000000000000", + "lambda_above_sigma": "22081/2000000000000", + "lambda_above_tau": "1/2000000000000", + "lambda_below_one": "5919/2000000000000", + "lambda_prime_above_lambda": "1/2000000000000", + "lambda_prime_below_one": "2959/1000000000000", + "leaf_cost": "401/1000000000000", + "packed_overhead": "1/2000000000000", + "prefix_cost": "69999/1000000000", + "prime_interval_growth": "1/50000", + "r_superpolynomial": "50001/100000", + "reserved_axes": "999899997041/1000000000000", + "scalar_cost": "500009/1000000", + "sigma_below_one": "7/500000000", + "sigma_positive": "499999993/500000000", + "tau_below_one": "37/12500000000", + "tau_positive": "12499999963/12500000000" + }, + "guard": { + "B": 338201706233372774319109678801287590064, + "C0": 321727027889740762489223803495350305328695729120143793284991524019954162292886152000000, + "C1": "19601/10000", + "E": 338201706233372774319082463160146840064, + "beta": "19/25", + "m": 15625, + "s": 27215641140750000, + "zeta": "1/10000" + }, + "limiting_margins": [ + "g3" + ], + "margins": { + "g1": "69999/1000000000", + "g2": "18497780037/12500000000000000000", + "g3": "147947041/100000000000000000", + "g4": "1850037/1250000000000000", + "g5": "19/1000000", + "g6": "500009/1000000", + "g7": "49999/100000" + }, + "minimum_margin": "147947041/100000000000000000", + "parameters": { + "C1": "19601/10000", + "beta": "19/25", + "c": "9999/10000", + "delta": "1/1000000", + "epsilon": "49999/100000", + "kappa": "1479/1000000000000", + "lam": "1999999994081/2000000000000", + "lamp": "999999997041/1000000000000", + "sigma": "499999993/500000000", + "tau": "12499999963/12500000000" + }, + "recurrence": { + "internal": "12499999963/12500000000", + "layer": "12499999963/12500000000", + "leaf": "6249999979/6250000000", + "preprocessing": "1/10000" + } + } +} diff --git a/certificates/prime-field28.json b/certificates/prime-field28.json new file mode 100644 index 0000000000..0c505954e2 --- /dev/null +++ b/certificates/prime-field28.json @@ -0,0 +1,241 @@ +{ + "complex_checks": { + "labels": { + "active_nodes": 64298, + "all_labels_nondegenerate": true, + "all_residuals_have_odd_vectors": true, + "checked_inclusions": 154860 + }, + "map": { + "coefficients": "+1/2 disjoint, -1/2 intersection two", + "nonzero_coefficients": 7780500, + "side_map_exact": true, + "targets": 3276 + }, + "roles": { + "forward_frames_nested": true, + "reverse_complement_frames_nested": true, + "roles": 93838 + }, + "stats": { + "additions": 61022, + "disjoint_additions": 43634, + "h": 28, + "injections": 32816, + "pair_star_additions": 17388, + "roles": 93838, + "roles_per_target": 28.644, + "v": 3276 + } + }, + "matching": { + "distinct_images": 98280, + "domain": 98280, + "every_intersection_two": true, + "h": 28 + }, + "producer": { + "global_before_replacement": { + "all_inputs_active": true, + "exact_support_keys": true, + "h": 28, + "local_inputs": 2600, + "outputs": 983178, + "pruned_additions": 11240978, + "removed_after_merging": 0, + "roles": 12224156, + "topological_order_checked": true, + "unique_additions": 11240978 + }, + "independent_template_check": { + "every_boundary_sum_verified": true, + "every_template_addition_disjoint": true, + "new_star_additions": 2623060, + "old_star_additions": 3006276, + "optimized_additions": 10857762, + "optimized_stars": 20475, + "role_upper_bound": 11840940, + "verified_templates": 365 + }, + "local": { + "additions": 41427, + "additions_by_core": { + "0": 8511, + "1": 18616, + "2": 14300 + }, + "all_disjoint_output_coefficients_exact": true, + "base": 4, + "binary_sha256": "460b55adf31b6128710d162b63ea17843e94786727a7208990b4ef1533b0ebaa", + "inputs": 2600, + "n": 26, + "outputs": 2600, + "retained_additions": 41439, + "retained_total_exact": true, + "roles": 44027, + "roles_per_output": 16.93346153846154, + "status": "SCALAR PRODUCER ONLY; NO COMPLETE NETWORK CLAIM" + }, + "replacements": { + "new_additions": 2623060, + "old_additions": 3006276, + "saved": 383216, + "sha256": "36d4b4bdfc89af922cb39a9f0469e4aa9c18d145ea6a6a542ddb8ddced55a136", + "stars": 20475, + "templates": 365 + } + }, + "proof_sha256": { + "notes/prime-field28-construction.tex": "1f850c13ce37ca15c38ea393dbecced241e666c5f4c11ceb3cb137810772c15c", + "scripts/paired_complex.py": "4f4c28102bfc528e264896e6c32bbd0e66da0973237e96e4044d8ccf7e78a1de", + "scripts/paired_triple_circuit.py": "8f5f2de32fdbd8e0005154638660ff416e5a8cd59623bd0dc03f6f7f97ce2fb1", + "scripts/prime_field_checks.py": "be21a411cdca5fa331fb9f36352ce98c055cb5e973553255e4530d07e99ae5c4", + "scripts/prime_field_circuit.py": "50485ac5a65b2707aab2b870477fbf503f4776699f6dd5ce38fb2006cc95d0f6", + "scripts/prime_field_network.py": "16629edd6aa8357b3fabcd5e1a70027860864a64475e8c0e7c822ee81dcd1ab9", + "scripts/prime_field_supports.cpp": "927dbb2ac2a411f06d8d9e0c440548f7ab965311fd83f4a573668d94d0cff1fe" + }, + "scope": "Full h28 formal support counts and replacement boundary sums; full complex h28 coefficients, binary labels and compiled role frames; all scalar basis inputs and rational physical frames at h8. General tensor-stage, finite-alphabet and multiplication transfer rely on the written proof and retained upstream interfaces.", + "small_controls": { + "all_dirty_basis": { + "all_basis_inputs": 1156, + "corrected_three_stage_exchange": true, + "dirty_scratch_restored": true, + "forward_inverse_exact": true, + "h": 8 + }, + "coefficients": { + "every_node_has_common_pair": true, + "h": 8, + "inputs": 56, + "retained_coefficients_exact": true, + "roles": 1044, + "side_coefficients_exact": true + }, + "physical_frames": { + "frames": [ + { + "every_edge_nested_and_nondegenerate": true, + "loss": 168, + "reverse": false, + "total_rank": 9472 + }, + { + "every_edge_nested_and_nondegenerate": true, + "loss": 168, + "reverse": true, + "total_rank": 9472 + } + ], + "h": 8 + } + }, + "status": "CONDITIONAL 373/10^11 > 2^-28 WITNESS; NOT FULL FORMAL VERIFICATION", + "upstream_commit": "adc7f1241b42e322a6451854ab7e4b4c146bf78a", + "witness": { + "absorption_gap": "2313/250000000000000", + "bit": { + "D": 379712972620800, + "L": 284784729465600, + "N": 949282431552000, + "W": 230640858616896000, + "eta": "39/520019360", + "h": 28, + "m": 21952, + "retained_totals": 378, + "roles": 11840940, + "s": 5063027748645128371200, + "v": 98280 + }, + "complex": { + "D": 18030055680, + "I": 32196528, + "L": 26143580736, + "N": 35158608576, + "W": 2085111546336, + "eta": "5/12693352", + "h": 28, + "m": 21952, + "roles": 93838, + "s": 45772350635112192, + "scalar_gates": 8702721518400, + "v": 3276 + }, + "constraints": { + "K_dominates_log_p": "49985001/100000000", + "K_smaller_than_ell": "24999/100000000", + "alpha_squared_theta_growth": "1/5000", + "beta_below_one": "6/25", + "beta_positive": "19/25", + "c_positive": "9999/10000", + "crt_layout": "15003/4000000000000", + "delta_below_one_eighth": "124999/1000000", + "delta_positive": "1/1000000", + "epsilon_positive": "4999/10000", + "gaussian_cost": "199/1000000", + "guard_width": "2014601/100000000", + "kappa_positive": "373/100000000000", + "lambda_above_sigma": "3151/100000000000", + "lambda_above_tau": "1/100000000000", + "lambda_below_one": "749/100000000000", + "lambda_prime_above_lambda": "1/100000000000", + "lambda_prime_below_one": "187/25000000000", + "leaf_cost": "47/25000000000", + "packed_overhead": "1/100000000000", + "prefix_cost": "24999/100000000", + "prime_interval_growth": "1/5000", + "r_superpolynomial": "5001/10000", + "reserved_axes": "24997499813/25000000000", + "scalar_cost": "500099/1000000", + "sigma_below_one": "39/1000000000", + "sigma_positive": "999999961/1000000000", + "tau_below_one": "3/400000000", + "tau_positive": "399999997/400000000" + }, + "deficit_slacks": { + "bit": "25621089/1300048400000000000", + "complex": "619909/158666900000000" + }, + "guard": { + "B": 580186831374453739191529048436710092608, + "C0": 1330227007428750171975003167066483053874539349448633868671027791264533942584236249186304, + "C1": "19601/10000", + "E": 580186831374453739191483276086074980416, + "beta": "19/25", + "m": 21952, + "s": 45772350635112192, + "zeta": "1/10000" + }, + "log_upper": { + "bit": "9997/1000", + "complex": "10" + }, + "margins": { + "g1": "24999/100000000", + "g2": "149955003/40000000000000000", + "g3": "934813/250000000000000", + "g4": "15003/4000000000000", + "g5": "199/1000000", + "g6": "500099/1000000", + "g7": "4999/10000" + }, + "minimum_margin": "934813/250000000000000", + "parameters": { + "C1": "19601/10000", + "beta": "19/25", + "c": "9999/10000", + "delta": "1/1000000", + "epsilon": "4999/10000", + "kappa": "373/100000000000", + "lam": "99999999251/100000000000", + "lamp": "24999999813/25000000000", + "sigma": "999999961/1000000000", + "tau": "399999997/400000000" + }, + "recurrence": { + "internal": "399999997/400000000", + "layer": "399999997/400000000", + "leaf": "12499999883/12500000000", + "preprocessing": "1/10000" + } + } +} diff --git a/docs/reproducibility.md b/docs/reproducibility.md index 7da9376df5..0aa0b4409d 100644 --- a/docs/reproducibility.md +++ b/docs/reproducibility.md @@ -1,178 +1,61 @@ -# Reproducing the result +# Reproducing the current result -The primary artifacts are the [compact-control note](../artifacts/compact-control-note.pdf), -[combined patch](../patches/compact-control-34.patch), and -[exact layer certificate](../certificates/compact-control-layer.json). -They are conditional on the retained algorithmic interfaces and written -extensions identified in the [review guide](research/compact-control-review.md). - -## Requirements - -The verification path needs Python 3.11 or newer, Git, and Make, with no -third-party Python packages. Run commands from the repository root. All input -source files are bundled, so verification runs without network access. - -The local preparation checks used Python 3.14.6 and Tectonic 0.16.9. The supplied -GitHub workflow targets Python 3.11, 3.13, and 3.14 on Ubuntu 24.04; a workflow -configuration is not a claim that those hosted runs have already passed. - -## Arithmetic, identities, and patches +Run commands from the repository root. Numerical verification needs Python +3.11+, a C++17 compiler, Git, and Make; no third-party Python package or network +access is required. The full h28 support check uses about 1.2 GB of memory. ```sh make verify ``` -This command performs these steps: - -1. `scripts/certify.py` checks the pinned source hashes and parameter inequalities, - then writes `certificates/parameters.json`. -2. `scripts/search_network.py` encloses logarithms with exact rational arithmetic, - checks finite candidates and the infinite tail, and writes - `certificates/network-search.json`. -3. `scripts/make_patch.py` regenerates seven parameter-only patches against the - unchanged upstream files. - `scripts/nonadjacent.py` and `scripts/make_nonadjacent_patch.py` additionally - generate the follow-up routing certificate and three scheduling patches. - `scripts/tune_routing.py` generates the tuned 2^-76 certificate and combined patch. - `scripts/reuse_network.py` and `scripts/make_reuse_patch.py` generate the - stage-sharing 2^-75 certificate and standalone combined patch. - `scripts/incidence_network.py` and `scripts/make_incidence_patch.py` generate - the incidence-circuit 2^-67 certificate and standalone combined patch, including - exhaustive verification of the underlying ordered-pair rectangle partition. - `scripts/dag_network.py` and `scripts/make_dag_patch.py` generate the - shared-computation 2^-63 certificate and standalone combined patch. They - check the exact symbolic linear map and both support-frame directions of - the reversible circuit compiled by `scripts/exclusion_circuit.py`. - `scripts/shared_point_network.py` and `scripts/make_shared_point_patch.py` - generate the cross-group sharing certificate and independent patch for - kappa=13*2^-66. They check exact supports and both frame directions in the - global graph compiled by `scripts/shared_point_circuit.py`. - `scripts/paired_network.py` and `scripts/make_paired_patch.py` generate the - h=50 paired-network certificate and independent patch for kappa=2^-59. They - also check the stopped guard constants and revised Gaussian inequalities; - these proof models are selected explicitly in the parameter checker. - `scripts/prepare_layers.py` records generalized guard and unequal-exponent - recurrence estimates, the independent complex-family search, and clearly - marked hypothetical sparse-primitive targets in `layer-preparation.json`. - This preparation pass does not change the published 2^-59 witness. - `scripts/audit_sparse_fusion.py` records finite phase identities, a bounded - central-frame screen, and the cost targets for future sparse primitives. - Its output is a research audit, not a stronger multiplication certificate. - `scripts/audit_fused_block.py` checks a complete parity-butterfly sandwich - and records the cut-rank obstruction for coordinate-child/pointwise-only - recursion. Its exact identity does not supply a faster multiplication bound. - `scripts/audit_short_guards.py` records logarithmic working guards and a - reduction to a still-unproved fast gathering routine. Exact address tests - check the reduction's maps, not a new tape-time or multiplication bound. - `scripts/audit_gather_schedules.py` checks a reversible merge tree, scoped - interval-schedule obstructions, and optimistic round-reuse accounting. - It does not rule out coded gatherers or certify a new multiplication bound. - `scripts/audit_coded_carries.py` checks an exact but linear carry code and - small controls for a scoped flat affine-circuit obstruction. The bounded - attempt supplies no sublinear recurrence or new kappa. - `scripts/audit_cancellation.py` checks the first cancellation circuit's - scalar map and dirty-scratch restoration, then records nonorthogonal-path - bounds rejecting two topologies under the retained data-stage frames. - `scripts/audit_joint_frames.py` reproduces a complete small bit invocation's - edge ranks and checks rational controls for the fixed-boundary local - optimality proof. It does not certify a stronger multiplication bound. - `scripts/audit_compact_controls.py` checks the compact dirty-control address - maps, inverses and exceptional repair. `scripts/compact_control_layer.py` - records the new conditional `83/10^12 > 2^-34` witness, with reservations, - the revised recurrence, independently sized complex motif, generalized - guards and all assembly margins. Its general tape claims depend on the - written [compact-control proof](../notes/compact-control-note.tex). - `scripts/make_compact_control_patch.py` generates the independent combined - patch, including the changed global exceptional-stream accounting. - `scripts/research_networks.py` and `scripts/search_network_variants.py` - record scoped family bounds and clearly marked exploratory scores. -4. The standard-library unittest suite checks certificate boundaries, selected - finite identities, network counts, patch dependencies, and search bounds. -5. Git checks that each alternative patch applies to the pinned source. - -The generators overwrite their output certificates and patches. To confirm -that the checked-in outputs reproduce exactly, run on a clean checkout: +This rebuilds the retained ternary and complex producers, regenerates the +current and historical certificates and patches, runs the unittest suite, +and checks patch applicability against the pinned manuscript. The new batching +checks are part of this target. On a committed checkout, confirm reproducibility: ```sh git diff --exit-code -- certificates patches ``` -The compact-control note builds with `make compact-note`. Its statement remains -conditional on the identified upstream interfaces and supplied written -extensions. See the -[current research status](research/current-status.md) before treating older -research pages or preparation certificates as current conclusions. - -The theorem certificates and all-h bound comparisons use `fractions.Fraction`; -no floating-point result controls their acceptance. The separate exploratory -higher-subset screen uses floating point to select candidates, then encloses -their scores exactly; it certifies neither a new construction nor optimality. -Sampled finite identity tests use fixed random seeds. -Passing these checks does not prove the full multiplication-machine theorem. - -## Apply one patch for review - -The following creates a fresh local review directory and refuses to reuse an -existing one. It leaves the bundled source untouched: +For the new arithmetic alone: ```sh -mkdir -p build -mkdir build/review -cp -R upstream/build build/review/build -git apply --directory=build/review patches/compact-control-34.patch +make batched-certificate batched-patch ``` -Read `build/review/build/main.tex` and its included sections. The other patches -are alternatives based on the same original manuscript, not successive commits. - -## Build the note +The output reports `kappa=6149999/50000000000000 > 2^-23`, 29 strict constraints, +seven margins, and the positive final absorption gap. These programs check +exact rational inequalities; the matrix construction and tape-time bounds +also require the written proofs in the [review guide](research/batched-review.md). -With Tectonic installed: +## PDF and complete manuscript ```sh -make compact-note +make batched-note ``` -The result is `artifacts/compact-control-note.pdf`. Build the earlier -parameter-only note with `make note`, producing `artifacts/parameter-note.pdf`. -Build the separate routing audit -with `make audit-note`, producing `artifacts/nonadjacent-axis-note.pdf`. -Build the tuning note with `make tuned-note`, producing -`artifacts/routing-tuned-note.pdf`. Build the preserved stage-sharing note with -`make reuse-note`, producing `artifacts/stage-reuse-note.pdf`. -Build the rectangle-circuit note with `make incidence-note`, producing -`artifacts/incidence-note.pdf`. -Build the shared-computation note with `make dag-note`, producing -`artifacts/dag-note.pdf`. -Build the cross-group and paired notes with `make shared-point-note` and -`make paired-note`, producing `artifacts/shared-point-note.pdf` and -`artifacts/paired-note.pdf`, respectively. -The first run may download fonts -and TeX packages; the numerical verification does not use them. PDF builds may -differ in metadata or typesetting across TeX environments. The exact-byte -reproducibility check covers JSON certificates and patches, not the PDF. +This uses pdfLaTeX with AMS, Latin Modern, geometry, hyperref, enumitem, +mathtools, booktabs, and microtype, producing +`artifacts/batched-23-note.pdf`. PDF bytes may differ across TeX environments. +For Tectonic, run from the repository root: -Full patched-manuscript previews were also compiled during preparation. With -Tectonic, the original pdfTeX-only metadata commands `pdfinfoomitdate`, -`pdftrailerid`, and `pdfsuppressptexinfo` must be commented out in a disposable -copy. Those preview-only edits are not included in the mathematical patches. - -## Source provenance +```sh +make batched-note TEX_ENGINE=tectonic +``` -The pinned upstream revision is -`adc7f1241b42e322a6451854ab7e4b4c146bf78a`. -[The manifest](../upstream/manifest.json) records each source URL and SHA-256 -hash. `make fetch` downloads that exact revision and refuses to overwrite -changed source files. Fetching is optional and requires network access. +The [patch instructions](../PATCHING.md) describe materializing the complete +manuscript. With Tectonic, its three pdfTeX-only metadata commands need +compatibility definitions in a disposable wrapper; the mathematical source +remains unchanged. -## Automation +## Sources and automation -[The verification workflow](../.github/workflows/verify.yml) runs `make verify` -and rejects changes to regenerated certificates or patches. It uses immutable -commit pins for the official [checkout](https://github.com/actions/checkout) -and [setup-python](https://github.com/actions/setup-python) actions, with -read-only repository permissions. The PDF is supplied for readers and can be -rebuilt locally using the command above. +[SOURCES.json](../SOURCES.json) records the retained PR7 commit and the supplied +archive's hash. [upstream/manifest.json](../upstream/manifest.json) pins the +original manuscript files. `make fetch` optionally retrieves those exact files +and refuses to overwrite modified source. -Build the latest note with `make compact-note`. The earlier notes and -patches remain available as independent witnesses. +The existing [GitHub workflow](../.github/workflows/verify.yml) runs `make verify` +and checks regenerated certificates and patches. Local success does not imply +that a hosted workflow has run. Older main-branch witnesses remain available +through their existing targets and version history. diff --git a/docs/research/batched-review.md b/docs/research/batched-review.md new file mode 100644 index 0000000000..e2cfd014e2 --- /dev/null +++ b/docs/research/batched-review.md @@ -0,0 +1,45 @@ +# Batched-recursion review guide + +The claim is a conditional bound with +`kappa = 6149999/50000000000000 > 2^-23`. +The [source pins](../../SOURCES.json) identify the retained manuscript and PR7. + +## Proof obligations + +| Obligation | Source | +| --- | --- | +| Large-projector factorization | [projector-batching.tex](../../notes/projector-batching.tex) | +| Common controlled basis and aligned corner | [controlled-projector-basis.tex](../../notes/controlled-projector-basis.tex) | +| Three rank classes | [batched-bit-rank-accounting.tex](../../notes/batched-bit-rank-accounting.tex) | +| Integer widths and bounded row padding | [batched-bit-rows.tex](../../notes/batched-bit-rows.tex) | +| Dependency paths and whole residuals | [batched-path-budget.tex](../../notes/batched-path-budget.tex), [bulk-complex-guard.tex](../../notes/bulk-complex-guard.tex) | +| Complex weighted recursion | [batched-complex-rows.tex](../../notes/batched-complex-rows.tex) | +| Assembly | [batched-assembly.tex](../../notes/batched-assembly.tex) | +| Constructive interchange specification | [batched-algorithms.tex](../../notes/batched-algorithms.tex) | + +## Corrected inherited precision bound + +The retained Gaussian input generator approximates +`2^-B exp(pi alpha^2 beta_j^2)` before shifting by `B=ceil(1.14 alpha^2)`. +The shift amplifies absolute error by `2^B`. The former choice +`F=exp(pi alpha^2/4)` bounded exact magnitude but did not uniformly bound this +amplified error. + +The corrected proof uses `F=2^B`. Its required precision is at most +`32.14p+11 < 34p` for integer `p>100`, preserving the existing budget and all +exponents. See [the correction](../../notes/chirp-scaling-correction.tex) and +[the amended retained proof](../../notes/fast-gaussian-resampling.tex). +Both the standalone note and the combined manuscript include the correction. + +## Verification scope + +`make verify` includes the new certificates, negative exponent controls, +Gaussian precision checks, and source integration checks, together with the +retained producer validation. The numerical guard assumes the dependency-path +topology proved in the notes; a boolean certificate field does not prove that +topology. The large common rational basis is established by the existence +argument, not by materializing every h28 factorization. + +The prior scoped review found no blocking defect in the new batching arguments. +This is not a formal verification or execution of the complete fixed-tape +multiplication machine. Existing upstream assumptions remain explicit. diff --git a/docs/research/current-status.md b/docs/research/current-status.md index 765a312325..52eb003504 100644 --- a/docs/research/current-status.md +++ b/docs/research/current-status.md @@ -1,128 +1,21 @@ -# Current contracts and research status - -Updated October 7, 2026. Author: Douglas Colkitt. All results remain conditional -on the pinned upstream algorithmic interfaces and the identified written -extensions. Nothing in this page asserts formal or independent verification. - -## Current and earlier results - -| State | Exponent saving kappa | Artifacts | -| --- | --- | --- | -| Published baseline | `2^-59` | [paired note](../../artifacts/paired-note.pdf), [certificate](../../certificates/paired-network.json), [patch](../../patches/h50-paired-59.patch) | -| Current conditional research draft | `83/10^12 = 8.3e-11 > 2^-34` | [proof note](../../artifacts/compact-control-note.pdf), [source](../../notes/compact-control-note.tex), [certificate](../../certificates/compact-control-layer.json), [patch](../../patches/compact-control-34.patch) | - -The new witness increases kappa by approximately 47,846,242 times over the -published `2^-59`. This compares asymptotic exponent savings, not practical -runtime. The dyadic statement `kappa=2^-34` is a weaker convenient corollary. -The witness remains below `2^-33`. The earlier published artifacts and pinned -source remain unchanged. - -## What changed - -The finite bit network is unchanged: `h_b=50`, `m_b=125000`, with -`a_b=1-tau=296/10^11`. The new movement construction swaps compact dirty -control fields, rather than the full spaced slots. For f selected axes it -costs `O(V*((f log p)^tau+1))`, including deterministic repair, under the -layer's record regime and the supplied reservation layout. - -Two front fields and one back field are carved out of already existing -address chunks. Their selected kernels are processed individually first. -They remain outside the row index divided among roles, so each child retains -the complete compact ranges and still receives exactly `V/W` volume. The -extra preprocessing is `O(V*(log d+d^(1-c) log p+1))` for the chosen `c<1`. -No independent address coordinates, zero-temporary assumption, or free -gathering operation are used. - -The complex network uses its original construction independently at `h_c=25`, -`m_c=15625`, supporting `a_c=1-sigma=418/10^12`. The separate-arity proof is -now integrated into the source patch. The generalized stopped-depth guard -has `C1=5-4 beta+zeta`. Compact operations only permute complete coefficient -encodings, so they do not increase the coefficient arithmetic depth. - -## Exact current parameters and bottleneck - -The certificate uses - - epsilon = 1999/10000, c = 1/5, - beta = 1/1000, zeta = 1/10000, delta = 1/10^6, - C1 = 49961/10000, - lambda = 1-1671/(4*10^12), - lambda' = 1-167/(4*10^11), - kappa = 83/10^12. - -The internal, leaf and reservation exponents are respectively - - chi = tau+(1-beta)*max(sigma-tau,0), - leaf = sigma+beta*(1-sigma), - reserve = max(1-c,0). - -All lie strictly below lambda' after the stated intermediate-lambda checks. -All seven final margins exceed kappa. Their minimum is - - G = g3 = 333833/(4*10^15), - G-kappa = 1833/(4*10^15) > 0. - -The former quadratic restriction from `K^tau` has been removed by this -construction. The remaining limiting margin is the completed layer's saving, -controlled here by the complex network's stopped leaves. The unchanged h=25 -complex motif and retained Gaussian/leaf inequalities have the scoped upper -bound `kappa < 8.369598075e-11 < 2^-33`. Our simple rational witness is above -99% of that upper enclosure. It is not an unrestricted algorithmic ceiling. - -## Verification boundary - -The general proofs are in the four included construction sources: - -- [movement and deterministic repair](../../notes/compact-control-movement.tex); -- [reservations, row splitting and recurrence](../../notes/compact-control-layout.tex); -- [generalized guard](../../notes/compact-control-guard.tex); -- [independent complex interface](../../notes/independent-complex.tex). - -The [publication review guide](compact-control-review.md) maps each new -obligation to its proof and tests. Release copy and citation metadata have -been updated for this draft. This preparation is not independent review. - -The certificate stores their SHA-256 hashes. The standalone note supplies -the complete assembly comparison and scope. The combined patch also updates -the old global exceptional-stream paragraph: a `p^-3` bad fraction is charged -locally through the volume-weighted recurrence, rather than incorrectly -reusing its old global `o(V)` argument based on `2^-K`. - -Finite tests cover dirty address algebra, both slot orders, modular inverses, -bad-set invariance, exceptional repair, actual two-piece stream rotation, -complete-field preservation through padding and recursive row splits, -recurrence summation for all exponent orderings, and negative parameter cases. -Source integration checks preserve legacy appendix references and distinguish -the bit and complex arities. These checks support the written conditional -proof; they do not prove the upstream theorem or replace mathematical review. - -Completion checks passed: all 163 tests, all 17 patch-application checks, -the nine-page standalone note build, and the combined manuscript build. -Publication preparation also ran the full suite in a separate snapshot with -all proposed files and confirmed exact regeneration against its Git index. -These are reproducibility and consistency checks, not independent proof review. - -Reproduce with `make verify` and `make compact-note`. The combined manuscript -can be materialized with `make_compact_control_patch.patched_files()` into a -copy of `upstream/build`, then compiled with Tectonic after omitting the three -original pdfTeX-only metadata commands in that disposable copy, as described -in [the reproduction instructions](../reproducibility.md). The pinned source -itself must remain unchanged. - -## Next research priority - -First seek independent review of the new primitive, especially the temporary -layout invariant, local repair summation and uniform tape bounds. A substantive -flaw in one of those steps would revoke the new headline. - -If the proof survives, improving the complex finite network is the next route -to a stronger dyadic bound. The incidence/shared-sum/paired bit constructions -cannot simply be copied into it: the scalar coefficients, binary phase labels, -residual orthonormal bases and signed endpoint corrections require a new audit. - -The previous [joint-frame obstruction](joint-frame-audit.md) remains valid -within its fixed-boundary, grouped-gate scope. Splitting central gates or -changing boundaries between invocations are still possible finite-network -experiments, but the compact-control movement goal has succeeded conditionally -without needing that fallback. Older research pages retain their chronology; -use this page when interpreting their stale numerical targets or priorities. +# Current result + +The current conditional saving is +`kappa = 6149999/50000000000000 > 2^-23`. +See the [proof](../../artifacts/batched-23-note.pdf), +[certificate](../../certificates/batched-network.json), and +[combined patch](../../patches/batched-23.patch). + +The result uses the PR7 finite producers with controlled projector-block +recursion, whole complex residuals, integer-width row handling, and a dependency +path precision guard. Parameters and strict margins are in the certificate. +The inherited Gaussian scaling enclosure is corrected while retaining `P=34p`. + +[The review guide](batched-review.md) maps the proof obligations and correction. +The statement remains conditional on the pinned upstream interfaces; finite +checks are not a formal proof of the full multiplication machine. + +The earlier main-branch result `83/10^12` remains in the +[compact-control note](../../artifacts/compact-control-note.pdf) and +[certificate](../../certificates/compact-control-layer.json). +Older research pages document their historical assumptions and targets. diff --git a/notes/batched-23-note.tex b/notes/batched-23-note.tex new file mode 100644 index 0000000000..14b4c40160 --- /dev/null +++ b/notes/batched-23-note.tex @@ -0,0 +1,139 @@ +\documentclass[11pt]{article} +\usepackage[margin=1in]{geometry} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{amsmath,amssymb,amsthm,mathtools,booktabs,longtable} +\usepackage{microtype} +\usepackage{enumitem} +\usepackage[hidelinks]{hyperref} +\setlist{itemsep=3pt,topsep=5pt} +\setlength{\parindent}{1.25em} +\setlength{\parskip}{2pt} +\setlength{\emergencystretch}{2em} +\allowdisplaybreaks[2] +\numberwithin{equation}{section} +\newtheorem{theorem}{Theorem}[section] +\newtheorem{lemma}[theorem]{Lemma} +\newtheorem{proposition}[theorem]{Proposition} +\newtheorem{corollary}[theorem]{Corollary} +\title{Bulk Recursion for Integer Multiplication\\[4pt] + \large Large projector blocks, whole residuals, and a pathwise precision guard} +\author{icekylinx\\\small With substantial OpenAI GPT-6 Astra and Codex assistance} +\date{8 October 2026} +\begin{document} +\maketitle +\begin{abstract} +We batch rational projector blocks and whole complex residuals in the +retained finite networks. A controlled common basis yields contiguous +recursive calls; mixed-width moment bounds and a dependency-path precision +guard give a saving beyond $2^{-23}$. The construction includes integer +remainders, bounded row padding, and a corrected Gaussian input error +bound. The conclusion is conditional on the pinned upstream multiplication +theorem and the retained finite-network and analytic interfaces. +\end{abstract} +\vspace{1.5em} +\[ +\boxed{T(n)=O\!\left(n(\log n)^{1-\kappa}\right),\qquad +\kappa=\frac{6149999}{5\cdot10^{13}}>2^{-23}.} +\] +\clearpage +\tableofcontents +\clearpage + +\section{Result and retained framework} +The model is a fixed finite-alphabet Turing machine with a fixed number +of one-dimensional tapes. Section~\ref{sec:batched-final-assembly} gives +the rational parameters and strict assembly margins. +All constants defining the finite networks, their rational bases, +the address radix, and the number of tapes are fixed independently +of $n$. The scalar domains and the address-label fields are distinct. +The interchange network carries fixed $\mathbb F_3$ payloads and uses +rational address matrices. The complex network carries Gaussian dyadic +values and uses binary subspace labels. + +The finite constructions are those of Zhihao Chen's PR~\#7 +\cite{pr7}, at commit +\begin{center} +\texttt{6725c6a17b17871a35353fd29157f4ed851bc114}. +\end{center} +That contribution supplies the ternary five-subset network, the paired +complex producer, their frame schedules, and their finite counts. +It builds on Douglas Colkitt's compact-control framework +\cite{main}, Bortlesboat's alignment \cite{pr2}, eumemic's complex +producer and Gaussian resampling \cite{pr3,pr5,pr6}, and dleen's +retained totals and stage sharing \cite{pr4}. The upstream manuscript +is pinned at OpenAI commit +\texttt{adc7f1241b42e322a6451854ab7e4b4c146bf78a} +\cite{upstream}. + +\section{Large rational projectors} +\input{notes/projector-batching.tex} + +\section{The explicit interchange recurrence} +\input{notes/batched-bit-rank-accounting.tex} +\input{notes/controlled-projector-basis.tex} + +\section{Integer widths and bit-stream rows} +\input{notes/batched-bit-rows.tex} + +\section{Complex residuals and arithmetic depth} +\input{notes/batched-path-budget.tex} +\input{notes/bulk-complex-guard.tex} + +\section{The complete layer on mixed widths} +\input{notes/batched-complex-rows.tex} + +\section{Exact conditional assembly} +\input{notes/batched-assembly.tex} + +\section{Precision correction to the retained Gaussian interface} +\input{notes/chirp-scaling-correction.tex} + +\section{Constructive algorithm specification} +\input{notes/batched-algorithms.tex} + +\section{Reproduction and attribution} +Run \texttt{make verify} for the finite producers, exact certificates, +regression checks, and manuscript patches. Run \texttt{make batched-note} +to rebuild this note. The source pins and licenses are in +\texttt{SOURCES.json} and \texttt{NOTICE}. + +The bulk-recursion contribution is by icekylinx, with substantial +OpenAI GPT-6 Astra assistance. Review corrections and integration used +OpenAI Codex assistance. Prior constructions retain the attribution +listed above and in the bibliography. + +\clearpage +{\small\raggedright +\begin{thebibliography}{9} +\bibitem{upstream} OpenAI. +\emph{Integer multiplication below $n\log n$}, result family \#109. +Pinned source commit \texttt{adc7f1241b42e322a6451854ab7e4b4c146bf78a}. +\url{https://github.com/openai/math}. +\bibitem{main} Douglas Colkitt. +\emph{A sharper exponent for integer multiplication}. +\texttt{CrocSwap/integer-mult-bounds}, main commit +\texttt{6e564879f51ae16f23d392e9e196c605f36d90df}. +\url{https://github.com/CrocSwap/integer-mult-bounds}. +\bibitem{pr2} Bortlesboat. +\emph{Align pair groups for a conditional $17\cdot2^{-63}$ bound}. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/2}. +\bibitem{pr3} eumemic. +\emph{Compress the complex network for a conditional $59/10^{11}$ bound}. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/3}. +\bibitem{pr4} dleen. +\emph{Combine PR \#3 shared exclusions with retained totals and stage sharing}. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/4}. +\bibitem{pr5} eumemic. +\emph{Faster Gaussian resampling for a conditional $1479/10^{12}$ bound}. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/5}. +\bibitem{pr6} eumemic. +\emph{Aligned bit circuit with cheaper centers for a conditional +$1624/10^{12}$ bound}. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/6}. +\bibitem{pr7} Zhihao Chen (jacklightChen). +\emph{Ternary five-subset networks for a conditional $373/10^{11}$ bound}. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/7}. +\end{thebibliography} +} +\end{document} diff --git a/notes/batched-algorithms.tex b/notes/batched-algorithms.tex new file mode 100644 index 0000000000..557cf12d7c --- /dev/null +++ b/notes/batched-algorithms.tex @@ -0,0 +1,265 @@ +\subsection{Constructive algorithm for batched integer-width interchange} +\label{sec:batched-algorithms} + +The following pseudocode specifies how the fixed finite circuit becomes +an interchange procedure. It uses the retained single-digit streaming, +ordered-affine streaming, finite-circuit transfer, and depth-first tape +primitives. + +\paragraph{One-time finite preparation in the controlled tensor basis.} +Start from the prime-field five-subset circuit, its corrected role +permutation, and its all-role rational endpoint matrices. The payload +alphabet is $\mathbb F_3$; the integer-address radix below is a separate +fixed odd prime $q$. + +Put $H_0=h^2=784$ and reorder the finite label-space tensor factors so +that the original third factor is first. Write the resulting space as +$F\otimes V$, where $\dim F=h$ and $\dim V=H_0$, with coordinates +$(\alpha,i)$, $1\le\alpha\le h$, $1\le i\le H_0$, and $i$ varying +fastest. The controlled basis of +Lemma~\ref{lem:controlled-projector-basis} has the form +\[ + T(u\otimes e_i)=G_i u\otimes e_i, + \qquad S=T(I_F\otimes K), +\] +where $K\in\operatorname{GL}_{H_0}(\mathbb Q)$ and the +$G_i\in\operatorname{GL}_h(\mathbb Q)$ are chosen independently. +This choice applies to the assigned finite matrices; it introduces no +extra change of coordinates on the tape streams. + +\begin{verbatim} +PREPARE_FINITE_DATA(circuit): + Reorder the finite tensor coordinates as (third, first-and-second). + Enumerate rational invertible K and rational invertible G_i. + Form T(u tensor e_i) = G_i*u tensor e_i; S = T*(I tensor K). + Retain the first choice satisfying the finite controlled-basis tests: + A1: its first 2h by last 2h corner is nonsingular. + A3: its first H0+h-1 by last H0+h-1 corner is nonsingular. + A2: its first H0 by last H0 corner is diagonal and nonsingular. + Conjugate every terminal and gate matrix by this same S. + For each edge, form A = matrix_at_head - matrix_at_tail. + If A belongs to A1 or A3, of rank a: + r = m-a; t = 2*a-m. + Store lower-triangular factors A = E1*Pi*E2. + Store r corner pivots and one middle identity block of t slots. + If A belongs to A2: + Store lower-triangular factors A = E1*Pi*E2. + Store the aligned corner identity block of H0 slots and + the middle identity block of m-2*H0 slots. + Store no singleton corner pivots. + Otherwise: + Store the ordinary lower-triangular partial-permutation form. + Choose an odd prime q avoiding all prepared denominators and + all diagonal numerators needed to keep the factors invertible. + Form the fixed list of child multipliers t_i in [1, m-1]. + Set tau = 1 - 246/10^9, using the certified strict moment bound. + Return the finite tables, q, tau, and t_star = 21840. +\end{verbatim} + +The corner tests are applied to the conjugated projectors in the three +selected classes. The controlled-basis lemma proves that the required +rational parameter choice exists, hence that this finite search +terminates. Every test can be performed by rational elimination. +The lower-triangular factorization normalizes every stored pivot to one. +For the second class, +\[ + A_2=(I_F-\Pi_t)\otimes I_V, +\] +the factor $I_F\otimes K$ commutes with $A_2$. Its first-to-last block +after conjugation by $T$ is diagonal in $i$, with entries +$[G_i(I_F-\Pi_t)G_i^{-1}]_{1,h}$. These nonzero entries are normalized +by fixed diagonal units. They therefore give one identity block in +matching physical order between the first $H_0$ fields of $H$ and the +last $H_0$ fields of $D$. The Schur complement supplies the second, +contiguous middle identity block. It is this prescribed matching order +that permits the corner to use a single block interchange. + +The common conjugation preserves every edge rank and every all-role +endpoint difference $I_m$. Ordinary rational elimination constructs +all unselected factorizations. The prime can be selected by trial +division after the finite forbidden factors are known. None of this +preparation depends on the input width. + +For $m=21952$ and $h=28$, write $B=v^2R$ and $N=v^3$. +The prepared calls for the three selected classes are +\[ +\begin{array}{c|c|r|r|l} + \text{class}&\text{copies}&\text{rank}&\text{singletons}& + \text{contiguous block sizes}\\ \hline + A_1\text{, stage 1--3 join}&B&21896&56&21840\\ + A_2\text{, stage 2 sink}&B&21168&0&784,\ 20384\\ + A_3\text{, stage 3 data entrance}&2N&21141&811&20330 +\end{array} +\] +The singleton count, including all ordinary calls on other edges, is +\[ + n_1=s-B(21840+20384+784)-2N\cdot20330 + =105555640096680883200. +\] +Thus the child multipliers are exactly +\[ + 1,\quad 784,\quad 21840,\quad 20384,\quad 20330, +\] +with multiplicities $n_1,B,B,B,2N$, respectively. The exact moment is +\[ + \Psi(x)=\frac{n_1+B(784^x+21840^x+20384^x)+2N\,20330^x}{Wm^x}, + \qquad \Psi(1)=\frac{s}{Wm}. +\] +The controlled-basis certificate proves +\[ + \Psi\!\left(1-\frac{246}{10^9}\right)<1. +\] +All other edges retain the ordinary rank-one implementation, including +any full-rank edge. + +\paragraph{Depth and row contract.} +Every recursive invocation below receives an explicit row field preceding +both target chunks. Its row count $R$ is divisible by $W^{D(e)}$. +Spectator fields of arbitrary lengths may occur elsewhere. + +\begin{verbatim} +DEPTH(e): + depth = 0 + while e >= m: + e = t_star * floor(e/m) + depth = depth + 1 + return depth +\end{verbatim} + +This computes the function $D$ of Section~\ref{sec:mixed-width-rows}. +It terminates, is nondecreasing, and bounds the number of recursive +circuit invocations on every dependency path. Every child of a width-$e$ +node has depth bound at most $D(e)-1$. + +\paragraph{The elementary componentwise shear.} +Suppose two groups each contain $t$ contiguous width-$f$ fields, with the +first group before the second. The groups can be separated by arbitrary +spectators. Addition and subtraction in the following routine are +componentwise modulo $q^f$. + +\begin{verbatim} +BLOCK_SHEAR(H_block, D_block, t, f, R): + for i = 1,...,t: + D_i = D_i + H_i # ordered-affine streaming + INTERCHANGE_WITH_ROWS(H_block, D_block, t*f, R) + for i = 1,...,t: + D_i = H_i - D_i # ordered-affine streaming +\end{verbatim} + +The returned pair is $(H+D,D)$. The sole recursive call exchanges the +two contiguous blocks without reversing their internal field order. +For $t=1$ the same routine implements an ordinary pivot shear, including +when its two fields have different coordinate indices. + +\begin{verbatim} +EDGE_SHEAR(A, H, D, f, R_role): + Read the stored factors A = E1 * Pi * E2. + Apply D = E2*D and H = inverse(E1)*H by ordered streaming. + For each stored singleton pivot (i,j): + BLOCK_SHEAR(H_i, D_j, 1, f, R_role). + For each stored identity block (row_start, column_start, t): + BLOCK_SHEAR(the t consecutive H fields at row_start, + the t consecutive D fields at column_start, + t, f, R_role). + Apply H = E1*H and D = inverse(E2)*D by ordered streaming. +\end{verbatim} + +This is the address shear $(H,D)\mapsto(H+AD,D)$. +The finite factors are invertible over $\mathbb Z/q^f\mathbb Z$ for +all positive $f$. Each unbatched pivot uses one width-$f$ call. Classes $A_1,A_3$ +use their singleton corner calls and one middle-block call. Class $A_2$ +uses two block calls, of widths $784f$ and $20384f$, with no singleton +corner calls. All these widths are strictly less than $mf$. + +\paragraph{The finite circuit on complete rows.} +For a main width $mf$, let $H,D$ denote its two $m$-component field +vectors. All edges below act on one role stream, whose row count is +$R/W$ and logical volume is $V/W$. + +\begin{verbatim} +CIRCUIT_SHEAR(H, D, f, R): + Split each complete row by its index u = W*g + w. + Process the fixed circuit in chronological order: + On each edge e: + EDGE_SHEAR(A_e, H, D, f, R/W) on its role stream. + At each scalar gate: + Apply its fixed F_3 table pointwise at matching addresses. + Merge roles, undoing the known final role permutation. + Return the original row order. + +MAIN_INTERCHANGE(H, D, f, R): + Apply D = D - H componentwise by ordered-affine streaming. + CIRCUIT_SHEAR(H, D, f, R) + Apply D = H - D componentwise by ordered-affine streaming. +\end{verbatim} + +The all-role endpoint identity makes \texttt{CIRCUIT\_SHEAR} equal to +$H\leftarrow H+D$ on every original row, including rows assigned to +auxiliary roles. The three displayed operations in +\texttt{MAIN\_INTERCHANGE} therefore exchange the two main chunks. +All gates allow arbitrary initial auxiliary payloads. Pointwise +operations preserve the row and spectator coordinates, and the final +merge returns every row to its original index. + +\paragraph{An integer width with already available rows.} + +\begin{verbatim} +INTERCHANGE_WITH_ROWS(H, D, e, R): + Require R to be divisible by W^DEPTH(e). + if e < m: + Interchange the e corresponding digits individually; return. + f = floor(e/m); r = e - m*f. + Split H = (H_plus,H_minus), D = (D_plus,D_minus), + with the two high parts of length r. + Interchange the corresponding high-part digits individually. + Gather H_plus immediately before H_minus, obtaining + (D_plus, H_plus, H_minus, gap, D_minus). + MAIN_INTERCHANGE(H_minus, D_minus, f, R). + Move H_plus back immediately before the final H_minus. +\end{verbatim} + +The result is +$(D^+,D^-,\mathrm{gap},H^+,H^-)$. Fewer than a fixed multiple of $m$ +single-digit operations handle the remainder. No chunk range is padded +inside this routine. Every recursive child width is at most +$t_*\lfloor e/m\rfloor$, so splitting the rows once supplies its full +row-divisibility requirement. + +\paragraph{An arbitrary radix-$q$ call without a row promise.} + +\begin{verbatim} +INTERCHANGE_RADIX_Q(H, D, e): + depth = DEPTH(e) + rho = least nonnegative integer with q^(2*rho) >= W^depth + if e < m or 2*rho >= e: + Interchange corresponding digits individually; return. + Split the high rho digits from each chunk. + Interchange those high parts digit by digit. + Gather the two high parts before both remaining chunks. + Regard their joint range q^(2*rho) as an opaque row field. + Pad complete rows to R = W^depth * ceil(q^(2*rho)/W^depth). + INTERCHANGE_WITH_ROWS(the remaining chunks, e-rho, R). + Remove the padded rows. + Undo the gathering move, preserving the completed high-part swap. +\end{verbatim} + +The row range is enlarged by less than two, once. The existing high +digits supply all its other capacity. Since $\rho=O(\log e)$, the +fallback condition $2\rho\ge e$ holds for only a fixed finite set of +widths. Thus its individual-digit cost changes only the constant in +the asymptotic bound. Computing the displayed powers and comparisons +uses ordinary integer arithmetic; no real logarithm is required at +runtime. The row count is divisible by $W^{D(e)}$, hence also by +$W^{D(e-\rho)}$. + +\paragraph{Binary input chunks.} +For equal binary chunk widths $u$, choose the least integer $e$ with +$q^e\ge2^u$. Pad each target range numerically from $[2^u]$ to $[q^e]$, +putting zeros on invalid addresses. Call +\texttt{INTERCHANGE\_RADIX\_Q}, then delete the invalid addresses. +This is the original streaming radix conversion: numerical order is +preserved, each target range expands by less than $q$, and total volume +expands by less than $q^2$. The completed exchange preserves the set of +valid address pairs. Since $q$ is fixed and $e=O(u)$, this gives +$O(Vu^\tau)$ for arbitrary binary chunk widths and arbitrary prefix, +gap, and suffix ranges. diff --git a/notes/batched-assembly.tex b/notes/batched-assembly.tex new file mode 100644 index 0000000000..c92598b1f5 --- /dev/null +++ b/notes/batched-assembly.tex @@ -0,0 +1,155 @@ +\subsection{An exact complex exponent after bulk recursion} +\label{sec:batched-complex-parameters} + +Keep the paired complex producer of PR~\#7. Its constants are +\[ + h=28,\quad v_{\rm c}=\binom{28}{3}=3276,\quad m=21952, + \quad R_{\rm c}=93838. +\] +There are $R_{\rm c}+h+1=93867$ auxiliary roles per invocation, including +the original central roles. Write +\[ + B_{\rm c}=v_{\rm c}^2(R_{\rm c}+h+1)=1007397164592, +\] +\[ + W_{\rm c}=2v_{\rm c}^2(v_{\rm c}+R_{\rm c}+h+1)=2085111546336, +\] +\[ + L_{\rm c}=3v_{\rm c}^2h(h+1)=26143580736, + \qquad + s_{\rm c}=W_{\rm c}m-2v_{\rm c}^3+2L_{\rm c}=45772350635112192. +\] +The two selected whole-residual classes have ranks $a_1=21896$ and +$a_2=21168$, each with $B_{\rm c}$ copies. The number of remaining +singleton children is +\[ + S_{\rm c}=s_{\rm c}-B_{\rm c}(a_1+a_2)=2389799139122304. +\] +Their time moment is +\[ + \Xi(\sigma)=\frac{S_{\rm c}}{W_{\rm c}m^\sigma} + +\frac{B_{\rm c}}{W_{\rm c}} + \left[\left(\frac{a_1}{m}\right)^\sigma + +\left(\frac{a_2}{m}\right)^\sigma\right]. +\] +At $\sigma=1$, this equals +$1-\eta_{\rm c}$ with $\eta_{\rm c}=5/12693352$. + +Take +\[ + a_{\rm c}=\frac7{10^7},\qquad \sigma=1-a_{\rm c}. +\] +The same positive logarithm series used in the bit certificate gives +\[ + \log m<\frac{9997}{1000},\qquad + \log\frac m{a_1}=\log\frac{392}{391}<\frac{2555}{10^6}, + \qquad + \log\frac m{a_2}=\log\frac{28}{27}<\frac{36368}{10^6}. +\] +Let these upper bounds be $\ell_0,\ell_1,\ell_2$ and put +\[ + w_0=\frac{S_{\rm c}}{W_{\rm c}m},\qquad + w_i=\frac{B_{\rm c}a_i}{W_{\rm c}m}\quad(i=1,2). +\] +The exact rational comparison is +\[ + \Xi(1-a_{\rm c}) + <\sum_{i=0}^2\frac{w_i}{1-a_{\rm c}\ell_i}<1. +\] +The gap in the last inequality is +\[ + \frac{24132873235669673777179671369131} + {1525632551364197359955324563293421369131} + >1.58\times10^{-8}. +\] +This certifies the stronger complex exponent with the unchanged +finite producer and the new whole-residual recursion. + +\subsection{Final multiplication parameters and margins} +\label{sec:batched-final-assembly} + +Use the controlled-basis projector-batched interchange saving +$a_{\rm b}=246/10^9$ and the preceding complex saving $a_{\rm c}=7/10^7$. +The complete rational parameter choice is +\[ +\begin{aligned} + \tau&=1-\frac{246}{10^9},& + \sigma&=1-\frac7{10^7},& + \epsilon&=\frac{7999999}{16000000},\\ + c&=1,& \beta&=\frac1{1000},& \delta&=\frac1{10^{10}},\\ + \zeta&=\frac1{10000},& C_1&=\frac{11999}{10000},\\ + \lambda&=1-\frac{246}{10^9}+\frac1{10^{16}},& + \lambda'&=1-\frac{246}{10^9}+\frac2{10^{16}},\\ + \kappa&=\frac{6149999}{5\cdot10^{13}}. +\end{aligned} +\] +The value $c=1$ is allowed by the compact-control construction. Its +reservation exponent $\max\{1-c,0\}$ is zero, while +$1-\epsilon(1+c)=1/8000000>0$ still ensures $K=o(\ell)$ for $K=d$. +The larger fixed constants in the mixed-width row reservations do not +alter any power of $p$. + +Since $\sigma<\tau$, the compact-control internal exponent is $\tau$. +Its leaf exponent is +\[ + \sigma+\beta(1-\sigma)=1-\frac{6993}{10^{10}}<\tau. +\] +The strict gaps of $10^{-16}$ between $\tau,\lambda,\lambda'$ absorb +the fixed powers of $\log p$ in the layer construction. The new +coefficient guard satisfies +\[ + 1-\epsilon C_1=\frac{64008011999}{160000000000}>0. +\] +The fast Gaussian construction retains +$\alpha=\lfloor\sqrt{b/(8d)}\rfloor$ and $\gamma=2d\alpha^2\le b/4$. +Here $1-2\epsilon=1/8000000>0$, so its eventual hypotheses +$b\ge64d^2$, $\alpha^2\theta_i\ge1$ and the prime-interval growth +condition all continue to hold. The numerical maps, their target errors, +the final rounding step and the input/output format are unchanged. +For the retained chirp input generator, use +$F=2^{\lceil1.14\alpha^2\rceil}$ to bound both magnitude and shifted +absolute error; the corrected block argument still uses $P=34p$. + +The seven margins below one in the assembly cost table are +\[ +\begin{aligned} + g_1&=1-\epsilon(1+c),& + g_2&=\epsilon c(1-\tau),& + g_3&=\epsilon(1-\lambda'),\\ + g_4&=(1-\epsilon)(1-\tau),& + g_5&=1-\delta-2\epsilon,& + g_6&=1-\delta-\epsilon,& + g_7&=\epsilon. +\end{aligned} +\] +Their exact values are +\[ +\begin{array}{c|c} + \text{margin}&\text{value}\\\hline + g_1&1/8000000\\ + g_2&983999877/8000000000000000\\ + g_3&9839998762000001/80000000000000000000000\\ + g_4&984000123/8000000000000000\\ + g_5&1249/10000000000\\ + g_6&312500039/625000000\\ + g_7&7999999/16000000 +\end{array} +\] +All twenty-nine parameter constraints are strict. The minimum final +margin is $G=g_3$, and +\[ + G-\kappa= + \frac{362000001}{80000000000000000000000}>0. +\] +This last fixed positive gap absorbs the remaining logarithmic factors. +The resulting conditional multiplication bound is +\[ + \boxed{ + T(n)=O\!\left(n(\log n)^{1-\kappa}\right),\qquad + \kappa=\frac{6149999}{5\cdot10^{13}} + =1.2299998\times10^{-7}>2^{-23}.} +\] + +The exact comparisons are reproduced by +\texttt{scripts/batched\_network.py} and recorded in +\texttt{certificates/batched-network.json}. diff --git a/notes/batched-bit-rank-accounting.tex b/notes/batched-bit-rank-accounting.tex new file mode 100644 index 0000000000..311f6055b5 --- /dev/null +++ b/notes/batched-bit-rank-accounting.tex @@ -0,0 +1,138 @@ +\subsection{Three geometric rank classes in the retained ternary network} +\label{sec:batched-bit-rank-accounting} + +The five-subset producer of PR~\#7 is retained. Put +\[ + h=28,\quad v=\binom{28}{5}=98280,\quad m=h^3=21952, + \quad R=11840940,\quad N=v^3, +\] +\[ + W=2v^2(v+R),\qquad + L=3v^2\binom h2(h-2),\qquad + s=Wm-N+2L. +\] +This subsection needs the producer's proved width upper bound and frame +schedule; it does not enumerate its internal addition graph again. +If the producer uses fewer than $R$ roles, insert dummy auxiliary roles +with identity gates at the ordinary low and high frames of every invocation. +Do this before identifying the first- and third-stage banks. Every dummy +role restores its arbitrary scalar, has no decreasing edge, and contributes +exactly $m$ to the final rank sum. Thus the stated width and the rank classes +below are realized exactly, including any padding. + +Write $a=h^{j-1}$ at tensor stage $j$. With the notation of the retained +frame proof, the early auxiliary frame is +\[ + D_0=(B\otimes F)\otimes Q,\qquad \dim D_0=(a-1)h, +\] +and the final auxiliary frame is +\[ + D_1=(A\otimes F)\otimes Q,\qquad \dim D_1=ah. +\] +The two auxiliary banks give the following edges. + +\begin{enumerate} +\item Each role joining stages one and three passes from a frame of + dimension $h$ to a containing frame of dimension $m-h$. + This is a projector edge of rank $m-2h$. + There are $B=v^2R$ such roles. +\item Each stage-two auxiliary role passes from its final frame of + dimension $h^2$ to the full sink frame of dimension $m$. + Its rank is $m-h^2$, again with $B=v^2R$ copies. +\end{enumerate} + +There is one further large class on the data wires. The incoming physical +$X$ and $Y$ dimensions at stage $j$ are $a$ and $a-1$. Their first relevant +frames have dimensions $(a-1)h+1$ and $(a-1)h$, respectively. Hence both +entrance edges have rank +\[ + d_j=(a-1)(h-1). +\] +The remaining growth of each data role in that stage is $h-1$. +These dimensions hold for the reverse middle-stage schedule as well: +its low source copy and its target-line injection give precisely the same +physical frames. At stage three, +\[ + d_3=(h^2-1)(h-1)=21141>m/2, +\] +and there are $2N$ copies. The special negative source matrix contributes +one rank-one edge on each physical $X$ source, as in PR~\#7. +Consequently the complete data rank sum is +\[ + 2N\sum_{j=1}^3\bigl(d_j+h-1\bigr)+N=2Nm-N. +\] +All remaining auxiliary changes inside an invocation have rank at most +$h$, and a stage-two auxiliary entrance has rank $h^2-h$. Thus the three +classes listed above exhaust the ranks exceeding $m/2$, although exhaustion +is not needed for the certificate: leaving any other edge unbatched can +only weaken the claimed upper bound. + +Apply the large-projector batching lemma to these classes. A rank-$a_i$ +projector with $a_i>m/2$ uses $m-a_i$ singleton pivot interchanges and +one contiguous interchange of $(2a_i-m)$ subfields. The resulting table is +\[ +\begin{array}{c|r|r|r|r} + \text{class}&\text{copies }B_i&\text{rank }a_i& + \text{singleton pivots}&\text{batched width }k_i\\\hline + \text{stage 1--3 join}&v^2R&21896&56&21840\\ + \text{stage 2 sink}&v^2R&21168&784&20384\\ + \text{stage 3 data entrance}&2v^3&21141&811&20330 +\end{array} +\] +Treat every rank unit outside these three middle blocks as a singleton +interchange. The number of singleton calls is therefore exactly +\[ + S=s-\sum_{i=1}^3B_i k_i. +\] +At a parent width $e$, the child widths are $e/m$ with multiplicity $S$ +and $k_i e/m$ with multiplicity $B_i$; all children operate on streams of +volume $V/W$. The finite mixed-width recurrence consequently has normalized +moment +\[ + \Psi(\tau)=\frac{S}{Wm^\tau} + +\sum_{i=1}^3\frac{B_i}{W}\left(\frac{k_i}{m}\right)^\tau. +\] +At $\tau=1$ this is $s/(Wm)=1-\eta$, where +$\eta=39/520019360$. + +\paragraph{The intermediate middle-block certificate.} +This paragraph records the first batching step. The controlled basis in +the following subsection increases its saving from $177/10^9$ to +$246/10^9$, which is the value used in the final assembly. +Set +\[ + a_{\rm b}=\frac{177}{10^9},\qquad \tau=1-a_{\rm b}. +\] +Let $r_0=1/m$, $r_i=k_i/m$, and +\[ + w_0=\frac S{Wm},\qquad w_i=\frac{B_i k_i}{Wm}. +\] +Then $\sum_iw_i=1-\eta$ and +$\Psi(1-a_{\rm b})=\sum_iw_i\exp(a_{\rm b}\log(1/r_i))$. +Use the rational logarithm upper bounds +\[ + \log m<\frac{9997}{1000},\quad + \log\frac{196}{195}<\frac{512}{100000},\quad + \log\frac{14}{13}<\frac{7411}{100000},\quad + \log\frac{21952}{20330}<\frac{768}{10000}. +\] +They follow from the positive series +\[ + \log x=2\sum_{j\ge0}\frac{z^{2j+1}}{2j+1},\qquad + z=\frac{x-1}{x+1}, +\] +using sixteen terms and remainder at most +$2z^{33}/(33(1-z^2))$; for $m$, first extract its power of two. +For $0\le t<1$, $e^t\le(1-t)^{-1}$. Calling the four displayed upper +bounds $\ell_i$, exact rational arithmetic gives +\[ + \Psi(1-a_{\rm b}) + <\sum_{i=0}^3\frac{w_i}{1-a_{\rm b}\ell_i}<1. +\] +The strict gap in this last bound is greater than $1.78\times10^{-10}$. +All integers, rational logarithm enclosures, weights and the exact gap are +supplied by \texttt{scripts/batched\_bit\_rank\_moment.py} and its JSON +certificate. Under the accompanying arbitrary-width recurrence lemma, +this proves the interchange saving $a_{\rm b}=177/10^9$ for the unchanged +finite scalar producer. A smaller role upper bound can be inserted directly +into the same three-class formula. diff --git a/notes/batched-bit-rows.tex b/notes/batched-bit-rows.tex new file mode 100644 index 0000000000..cbaa8cb42c --- /dev/null +++ b/notes/batched-bit-rows.tex @@ -0,0 +1,123 @@ +\subsection{Integer widths, bounded row padding, and mixed contractions} +\label{sec:mixed-width-rows} + +The batched residual construction uses a fixed finite list of child sizes, +not only powers of one radix. The following implementation supplies the +corresponding integer-width recursion. All constants in this subsection +are fixed finite circuit constants, independent of the input length. + +\paragraph{A general moment condition.} +Let $m,W\ge2$ be fixed. At one circuit invocation, let the list +$t_1,\ldots,t_J$ contain integers in $[1,m-1]$. A child of type $i$ has +width $t_i f$, where $f=\lfloor e/m\rfloor$, and operates on exactly +$1/W$ of the parent's logical volume. Repetitions in the list represent +separate calls. An ordinary rank-one call has $t_i=1$; a batched block +has the corresponding larger value of $t_i$. Full-rank edges may retain +their original $m$ rank-one calls, so no same-width recursive call is +needed. Put +\[ + \Psi(x)=\frac1W\sum_{i=1}^J(t_i/m)^x, + \qquad t_* = \max_i t_i \tau$, every internal width is at least $d^\beta$, so +$e^\tau\le d^{\beta(\tau-\sigma)}e^\sigma$; summing the strict +$\sigma$-moment gives +$O(G^\tau d^{\sigma+\beta(\tau-\sigma)})$. +Thus in both cases, with +\[ + \chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}, +\] +the complete normalized layer cost is +\[ + O\!\left((\log p)^3\left[ + d^\chi+d^{\sigma+\beta(1-\sigma)} + +d^{\max\{1-c,0\}}+1\right]\right). +\] +The displayed logarithmic factor conservatively retains the existing +layout and descriptor allowances. Hence the original strict conditions +\[ + \max\{\tau,\sigma,\chi\}<\lambda<\lambda'<1, + \qquad + \max\{\sigma+\beta(1-\sigma),1-c,0\}<\lambda' +\] +continue to imply the complete $O(Vd^{\lambda'})$ layer bound. + +\paragraph{Compatibility with the new dependency guard.} +The separate dependency-path estimate uses $q=m+6h=22120$, observes that +one path crosses at most one selected bulk residual, and bounds its +$\rho$-moment by +\[ + \max\left\{ + \frac q{m^\rho},\quad + \frac{q-a_1}{m^\rho}+\left(\frac{a_1}{m}\right)^\rho,\quad + \frac{q-a_2}{m^\rho}+\left(\frac{a_2}{m}\right)^\rho + \right\}<\frac{999}{1000} + \quad\left(\rho=\frac65\right). +\] +Integer floors only shrink these children. For sufficiently large $d$, +an internal parent has $e\ge d^\beta\ge2m$, hence every recursive child +has width at least $\lfloor e/m\rfloor\ge d^\beta/(2m)$ whenever it +becomes a stopping leaf. The at most $m-1$ individually processed +remainder axes at each internal node belong to its fixed local overhead; +add their bounded coefficient contribution to the guard's fixed constant +$E$. They are not extra arbitrarily small stopping leaves. Thus the +separately established guard exponent +\[ + C_1=\rho-(\rho-1)\beta+\zeta + =\frac65-\frac\beta5+\zeta +\] +applies to this integer-width implementation. All stopping tests can be +performed by the existing rational-power integer comparison. diff --git a/notes/batched-path-budget.tex b/notes/batched-path-budget.tex new file mode 100644 index 0000000000..be338f96e8 --- /dev/null +++ b/notes/batched-path-budget.tex @@ -0,0 +1,68 @@ +\subsection{The weighted arithmetic-path budget} +\label{sec:pathwise-guard} + +The precision analysis uses the length of an arithmetic dependency path +through the framed complex network. We first measure this path in +directional rank units, before grouping some units into bulk children. + +\paragraph{A weighted path bound.} +Use the retained triple-based complex motif on $h$ points, with +$m=h^3$. This includes the paired complex producer and its shared +first- and third-stage auxiliary banks. Regard every scalar gate as a +map from saved inputs to its outputs. All of its inputs and outputs +have one common subspace label. A directed dependency path can therefore +enter a gate on one physical wire and leave on another without changing +label dimension at the gate itself. + +For a network edge $a$, let $U_a^-$ and $U_a^+$ be its labels and write +$r_a=|\dim U_a^+-\dim U_a^-|$. The edge implementation has exactly +$r_a$ recursive calls, each implementing one directional $C$ tensor +on $e/m$ selected axes. Binary changes of coordinates before and after +these calls permute coefficients and add no arithmetic depth. An inverse +direction is implemented using one forward child and its sign and +fourth-root wrappers, so it has the same recursive-call count. + +If $P$ is a directed scalar dependency path, its common gate labels give +the exact identity +\[ + \sum_{a\in P}r_a + =\dim U_{\rm end}-\dim U_{\rm start} + +2\sum_{\substack{a\in P\\\dim U_a^+<\dim U_a^-}} + (\dim U_a^--\dim U_a^+). +\] +The endpoint difference is at most $m$. + +Every side-producer edge is increasing. This follows from nested source +labels for the nonconstant middle mixer, complemented labels in its +reverse-direction counterpart, and constant early and late frames. +The data-wire and interstage edges are increasing as in the retained +motif. The stage-sharing joins are also increasing. The only decreasing +edges are the retained central returns, each of dimension loss $h$. + +There are three tensor stages. Within a stage, the $v^2$ invocations +use disjoint data and auxiliary wires, and each invocation has a single +central-return frontier. Equivalently, its point and total central wires +all return between the same two blocks of the transparent schedule. +A directed path crosses that frontier at most once. Gates acting on +different invocations do not connect their wires. Thus a path encounters +at most one central return per stage, even though the machine executes +all invocations sequentially on its fixed tapes. Sharing stage-1 and +stage-3 banks only links their existing stage boundaries and creates no +additional return. Consequently +\begin{equation}\label{eq:pathwise-child-bound} + \sum_{a\in P}r_a\le q:=m+6h. +\end{equation} +The bound also applies to a path ending at an intermediate gate or inside +an edge implementation: complete its current edge, and then any suffix +to a terminal vertex. All weights are nonnegative. + +\paragraph{From a scalar path to a coefficient path.} +A coefficient dependency path in the actual tape algorithm projects to +a directed path of the scalar network: inside a scalar gate it follows +one of the saved operands that contributes to the chosen output; inside +an edge it stays on the edge's role stream. A child can permute or combine +addresses within that role, but cannot move a value into a different +parent role. The row split, parking, padding and reassembly operations +do not create arithmetic dependencies between distinct parent roles. +This projection justifies using \eqref{eq:pathwise-child-bound} for the +implemented recursion, rather than merely for a drawn finite circuit. diff --git a/notes/bulk-complex-guard.tex b/notes/bulk-complex-guard.tex new file mode 100644 index 0000000000..a37613f05f --- /dev/null +++ b/notes/bulk-complex-guard.tex @@ -0,0 +1,168 @@ +\subsection{A whole-residual complex child} +\label{sec:bulk-complex-child} + +The complex phase interface admits a further batching step. On an edge +with residual dimension $a$, the existing binary change of basis puts +an orthonormal residual basis into the first $a$ slots. If each slot has +$f$ selected axes, those first $a$ slots form one contiguous interval +of $af$ axes. Instead of $a$ child calls on $f$ axes, use one child +on that interval. + +The directions need not all have the same sign. A basis vector's weight +modulo four may make its directional kernel an inverse even on an +increasing edge. Let $B$ be the set of negative residual slots and +let $Z_B$ multiply an address by $-1$ precisely when the parity of its +selected bits in those slots is odd. The exact identity +$C^{-1}=-iZCZ$ gives +\[ + \bigotimes_{j=1}^{a}(C^{\varepsilon_j})^{\otimes f} + =(-i)^{f|B|}Z_B C^{\otimes af}Z_B, + \qquad \varepsilon_j\in\{1,-1\}. +\] +Thus one forward child, two address-sign passes and one fixed +fourth-root phase implement the mixed signs. The same binary basis +changes before and after the child are retained. The wrappers cost +$O(V)$: their sign is computed from the current address descriptor, +whose polynomial work per record is absorbed by the existing +superpolynomial record length. They introduce at most four elementary +coefficient operations per value and no further recursive call. + +We batch only the two specified auxiliary edge classes of ranks +\[ + a_1=m-2h,\qquad a_2=m-h^2. +\] +All other edges continue to use their old one-direction children. +The first class is the increasing join between a completed stage-1 +auxiliary bank, at dimension $h$, and its matched stage-3 bank, at +dimension $m-h$. The second is the stage-2 auxiliary exit from +dimension $h^2$ to the full terminal frame. These are complete +auxiliary banks, including the central roles when those are shared. +If a width bound requires padding, add dummy auxiliary roles with +identity scalar gates at the ordinary low and high frames before +matching the first- and third-stage banks. Their labels only increase, +their arbitrary scalar values are restored, and both counted auxiliary +classes are then present for every padded role. The changed +volume-weighted time expression is consequently +\[ + \frac1W\left[ + \left(s-n_1a_1-n_2a_2\right)m^{-\sigma} + +n_1\left(\frac{a_1}{m}\right)^\sigma + +n_2\left(\frac{a_2}{m}\right)^\sigma + \right], +\] +where $n_1,n_2$ count the chosen edges. It has value $s/(Wm)<1$ +at $\sigma=1$. Strict comparison below one supplies the new complex +recursion exponent. The separate mixed-width row construction handles +$f=\lfloor e/m\rfloor$, the at most $m-1$ individually processed +remaining axes, and a row reservation sufficient for the longer but +still $O(\log d)$ recursion. + +\subsection{A depth guard for the unequal complex children} +\label{sec:bulk-complex-guard} + +The dependency-path argument of Section~\ref{sec:pathwise-guard} +still bounds the sum of edge ranks on one scalar path by +\[ + q=m+6h. +\] +For $h=28$ its relevant constants are +\[ + m=21952,\quad q=22120,\quad a_1=21896,\quad a_2=21168. +\] +Both selected ranks exceed $q/2$. Therefore every arithmetic dependency +path encounters at most one selected bulk edge. At a call on $e$ axes, +put $f=\lfloor e/m\rfloor$. Ignoring the local additive operations, +the path has one of the following child-depth bounds: +\[ + qA(f),\qquad + (q-a_1)A(f)+A(a_1f),\qquad + (q-a_2)A(f)+A(a_2f). +\] +The weight budget accounts for both increasing and decreasing frame +edges and for paths that switch wires at a scalar gate. Inverse-child +and endpoint sign corrections add no child. Individually processing +the fewer than $m$ leftover axes adds at most $8m$ elementary +operations, absorbed into the local constant below. + +Take $\rho=6/5$. The following three normalized path expressions have +a rational common upper bound strictly below one: +\begin{equation}\label{eq:bulk-path-moments} + \max\left\{\frac q{m^\rho},\quad + \frac{q-a_1}{m^\rho}+\left(\frac{a_1}m\right)^\rho,\quad + \frac{q-a_2}{m^\rho}+\left(\frac{a_2}m\right)^\rho\right\} + <\overline\theta:=\frac{999}{1000}. +\end{equation} +Here is an entirely rational verification. First +$160000^5160000$. For $00$, set +\[ + C_1=\rho-(\rho-1)\beta+\zeta, + \qquad + C_0=\left\lceil128m(1+1/\zeta)C_{\rm dep}\right\rceil, + \qquad \Delta=\lceil C_0d^{C_1}\rceil. +\] +The root bound from \eqref{eq:bulk-depth-power} is +$C_{\rm dep}d^{\rho-(\rho-1)\beta}$. This covers the direct arbitrary-width +root construction; it also covers every retained base-$m$ piece. +Even retaining the older bound of +$m(1+1/\zeta)d^\zeta$ such pieces, their concatenation, all reserved +axis kernels, the outer phases and the $b^D$ conversion have depth +at most $C_0d^{C_1}$. The original elementary-depth induction +therefore supplies exact denominator and magnitude guards of +$p+\Delta$ fractional bits and $\Delta+3$ integer/sign bits. +The width remains $O(p)$ when $\epsilon C_1<1$. + +In particular, $\beta=1/1000$ and $\zeta=1/10000$ give +\[ + C_1=\frac{11999}{10000},\qquad + 1-\frac{7999999}{16000000}C_1 + =\frac{64008011999}{160000000000}>0. +\] +Thus bulk complex children preserve the near-half dimension exponent +while allowing the improved complex time exponent to be used with +almost no loss at the stopping leaves. diff --git a/notes/chirp-scaling-correction.tex b/notes/chirp-scaling-correction.tex new file mode 100644 index 0000000000..a7917c5534 --- /dev/null +++ b/notes/chirp-scaling-correction.tex @@ -0,0 +1,30 @@ +\label{sec:chirp-scaling-correction} + +The retained fast Gaussian construction generates +$2^{-B}e^{\pi\alpha^2\beta_j^2}$ at precision $P$, where +$B=\lceil1.14\alpha^2\rceil$, then shifts by $B$ and multiplies by +the disk-grid input $u_j$. The exponential interface gives absolute +error at most $2^{1-P}$ before the shift. Thus the error after shifting +is controlled by $2^{B+1-P}$, not by a constant multiple of +$2^{-P}e^{\pi\alpha^2/4}$ uniformly in $\alpha$. + +Set $F=2^B$ in the retained chirped-correlation block lemma. Since +$|\beta_j|\le1/2$ and $\pi/(4\log 2)<1.14$, this bounds the exact +input magnitude. Including the product and rounding, it also gives +the required input accuracy $|\widetilde f_j-f_j|\le2^{4-P}F$. +The distinction matters: $2^B/e^{\pi\alpha^2/4}$ is unbounded, so +the smaller exact-magnitude bound alone does not justify this accuracy. + +No additional asymptotic precision is needed. For the inherited integer +parameters $p>100$ and $2\le\alpha<\sqrt p$, let +$L_A=3\lceil\sqrt p/(2\alpha)\rceil+1$ and $\Gamma=29p$. +Then $L_A\le p$, $\lceil\log_2 L_A\rceil\le p-1$ and +$B\le1.14p+1$. The block lemma requires +\[ + P\ge p+\Gamma+\lceil\log_2(FL_A)\rceil+11. +\] +Its right side is at most $32.14p+11<34p$, so the retained +$P=34p$ satisfies the corrected error budget. The packing widths +remain $O(p)$, and the target errors, tape-time exponents and final +rounding guarantee are unchanged. The combined manuscript patch +includes this correction directly in the retained Gaussian proof. diff --git a/notes/complex-circuit-construction.tex b/notes/complex-circuit-construction.tex new file mode 100644 index 0000000000..a5887b38d4 --- /dev/null +++ b/notes/complex-circuit-construction.tex @@ -0,0 +1,218 @@ +\subsection{A compressed side circuit for the complex network} +\label{sec:complex-side-circuit} +Keep the complex motif of Section~\ref{sec:independent-complex}: $h=25$, +$v=\binom{25}3=2300$, $N=v^3$, $m=h^3=15625$, scalars in +$\mathbb Z[i,1/2]$, labels in $F=\mathbb F_2^{25}$ with the dot product, the +$h+1$ central wires, and the gather and scatter maps. For a triple $S$ write +$t_S$ for its indicator. The original side wires add +\begin{equation}\label{eq:complex-side-map} + \frac12\sum_{T\cap S=\varnothing}x_T-\frac12\sum_{|T\cap S|=2}x_T +\end{equation} +to $y_S$. With the central coefficient $(|S\cap T|-1)/2$ this gives +$y\gets y+x$. They use one wire per ordered neighbor pair, that is +$vz_{\rm c}=3693800$ side wires per invocation. We compute the same map with +shared sums. + +All sums below are formal sums of inputs $x_T$ whose two summands have +disjoint supports, so a source contributes to a node exactly when a directed +path joins them. Equal supports are identified within each of the two +families below, and nodes that feed no injected piece are removed. + +\paragraph{Disjoint sums.} +Order the points $0,\ldots,24$. For a list of nodes indexed by distinct +points and $k\le3$, the routine $\mathrm{vec}$ returns, for every set $E$ of +at most $k$ of these points, the sum of the nodes whose points avoid $E$. It +splits the list at $\lfloor n/2\rfloor$, recurses, and forms each output by one +addition of a left and a right output whose exclusion sets have total size at +most $k$. For a point list $X$ and weights $w(u,v)$ on its pairs, the routine +$\mathrm{pairs}$ returns the sums over pairs avoiding $E$, $|E|\le3$: split $X$ +into halves $L,R$, recurse on both, apply $\mathrm{vec}$ to each cross row +$(w(u,r))_{r\in R}$, then apply $\mathrm{vec}$ down the columns of these +row outputs with the remaining exclusion budget, and add the three disjoint +regions. The routine $\mathrm{tri}$ does the same for triple sums: with halves +$L,R$ of $X$, put +\[ + P_r=\mathrm{pairs}\bigl(L,(u,v)\mapsto x_{uvr}\bigr),\qquad + P'_u=\mathrm{pairs}\bigl(R,(a,b)\mapsto x_{uab}\bigr), +\] +apply $\mathrm{vec}$ over $r\in R$ to $P_r[E_L]$ and over $u\in L$ to +$P'_u[E_R]$, and add the four disjoint regions: triples in $L$, triples in $R$, +two points in $L$ with one in $R$, and one point in $L$ with two in $R$. + +At the top level $L=\{0,\ldots,11\}$ and $R=\{12,\ldots,24\}$. For a target +$S$ with $S_L=S\cap L$ and $S_R=S\cap R$ the disjoint pieces are +\[ + \mathrm{tri}(L)[S_L],\qquad \mathrm{tri}(R)[S_R], +\] +the two $\mathrm{vec}$ outputs over the halves $R_1=\{12,\ldots,17\}$ and +$R_2=\{18,\ldots,24\}$ of the family $P_r[S_L]$, and the two $\mathrm{vec}$ +outputs over the halves $L_1=\{0,\ldots,5\}$ and $L_2=\{6,\ldots,11\}$ of +the family $P'_u[S_R]$. These six pieces partition the triples disjoint from +$S$. They are internal nodes of the full computations because +$\mathrm{vec}$ splits at the same halves. + +\paragraph{Pair stars.} +For a pair $a(14/10^9)(966/100)$ give, by $e^{-x}>1-x$, +\begin{equation}\label{eq:compressed-complex-exponent} + s_{\rm c}/W_{\rm c}4\pi$, the inner sum is less than +$2e^{-\pi\alpha^2\sigma}(1+2e^{-3\pi\alpha^2\sigma})<2.01e^{-\pi\alpha^2\sigma}$. +\end{proof} + +The original estimate $\|E\|^n<2^{-\alpha^2\theta n}$ gains only +$\alpha^2\theta$ bits per term. The lemma gains about +$\pi\alpha^2\log_2e$ bits per term after a burn-in of order +$\alpha^2/\theta$ bits. + +\begin{corollary} +\label{cor:neumann-count} +Assume $\alpha\geq2$, $\alpha^2\theta\geq1$ and $\theta<1$, and let +$n_{\alpha,\theta}$ be as in Lemma~\ref{lem:no-sort-resampling}. +Then $n_{\alpha,\theta}\leq p$ and $\|E^{n_{\alpha,\theta}}\|\leq2^{-p}$. +\end{corollary} + +\begin{proof} +If $n_{\alpha,\theta}=\lceil p/(\alpha^2\theta)\rceil$, then +$n_{\alpha,\theta}\le p$ and $\|E^{n}\|\le\|E\|^n<2^{-\alpha^2\theta n}\le2^{-p}$ +by \eqref{eq:gaussian-public-facts}. Otherwise +$n=n_{\alpha,\theta}\geq(p+1)/(4\alpha^2)+1/\theta$ and $n<\lceil p/(\alpha^2\theta)\rceil\le p$. +Put $\kappa_0=\pi\log_2e$, so $4.531<\kappa_0<4.534$, and note +$\log_22.01<1.01$. Taking base-two logarithms in +Lemma~\ref{lem:correction-powers}, +\[ + \log_2\|E^n\|\leq\kappa_0\alpha^2\Bigl(\frac1{4\theta}+\frac12\Bigr) + -n(\kappa_0\alpha^2\sigma-1.01). +\] +Since $\sigma>1$ and $\alpha\ge2$, the last bracket is at least +$4\alpha^2$. Also $4.534(1/(4\theta)+1/2)\le4/\theta$ because +$\theta<1$. Hence +$\log_2\|E^n\|\leq4\alpha^2/\theta-4\alpha^2n\leq-p-1$. +\end{proof} + +\begin{lemma}[Gaussian maps by chirped correlation] +\label{lem:chirped-gaussian} +Assume the hypotheses of Lemma~\ref{lem:no-sort-resampling}. There are +fixed multitape algorithms computing approximations +$\widetilde{\mathsf S}':\mathbb D_p^s\to\mathbb D_p^t$ of $\mathsf S'$ +and $\widetilde E:\mathbb D_p^s\to\mathbb D_p^s$ of $E$, with errors less +than $16p$ and $p/3$ respectively, outputs in the disk grid, and time +$O((t+p)p^{1+\delta})$ each. Inputs and outputs occur in increasing +coordinate order. The constants are uniform in $p,s,t,\alpha$. +\end{lemma} + +\begin{proof} +\emph{Chirp identity.} For a rational $y$ and integers $a,b$, put +$\hat a=a+y/\sigma$. Expanding both sides and using $\sigma-\theta=1$, +\[ + (\sigma\hat a-b)^2 + =\sigma\theta\hat a^2+\sigma(\hat a-b)^2-\theta b^2 . +\] +Hence, for rational $\lambda>0$, +\begin{equation}\label{eq:chirp-split} + e^{-\pi\lambda(\sigma a+y-b)^2} + =e^{\pi\lambda\theta b^2}\, + e^{-\pi\lambda\sigma\theta(a+y/\sigma)^2}\, + e^{-\pi\lambda\sigma(a-b+y/\sigma)^2}. +\end{equation} +For inputs $f_a$, $0\le a100$, so $\Gamma=\lceil1.4p\rceil$ suffices. Take +$P=3p$, and apply the factor $(2\alpha)^{-1}$ by one more product at +precision $P$. Each output then has error less than +$2^{-p}(1+1/4+1)<3\cdot2^{-p}$, and its norm is less than +$\|\mathsf S'\|+3\cdot2^{-p}<1$. + +\emph{The map $E$.} With $f_j=e^{\pi\alpha^2\beta_j^2}u_j$ and +$\lambda=\alpha^2$, the definition of $N$ gives +\[ + (Nu)_\ell=\sum_je^{-\pi\lambda(\sigma j-q_\ell)^2}f_j, +\] +and its term $j=\ell$ is exactly $u_\ell$. The inputs $f_j$ are formed by +Lemma~2.14 of \cite{HarveyHoeven2021} for +$2^{-\lceil1.14\alpha^2\rceil}e^{\pi\alpha^2\beta_j^2}$, a shift, and one +product with $u_j$. Put $B=\lceil1.14\alpha^2\rceil$ and $F=2^B$. +The shift multiplies the generator's absolute error by $2^B$; +including the product and rounding, the input errors are at most +$2^{4-P}F$. This same $F$ also bounds $|f_j|$. Let +$m=\lceil\sqrt p/(2\alpha)\rceil$, the window of +\cite[Lemma~4.11]{HarveyHoeven2021}. Partition $0\le\ell100$. In particular it bounds the shifted +approximation error as well as the exact chirp magnitude. Moreover, +\[ + \pi\lambda\theta b'^2\le\pi\theta\alpha^2(2m+2)^2 + \le\frac\pi4\bigl(\sqrt p+4\alpha\bigr)^2<\frac{25\pi}4p, +\] +so $\Gamma=29p$ suffices, using +$(\sqrt p+4\alpha)^2<25p$ and $\theta\le1/4$. +For $\alpha\ge2$ and integer $p>100$, +$L_A=3\lceil\sqrt p/(2\alpha)\rceil+1\le p$ and +$\lceil\log_2 L_A\rceil\le p-1$. Hence the block precision requirement is +\[ + p+\Gamma+\lceil\log_2(FL_A)\rceil+11 + \le 32.14p+11<34p. +\] +Thus $P=34p$ still suffices with the enlarged error enclosure. +Select the outputs +$b=q_\ell$ in order, subtract the exact $u_\ell$, and round. The block +contains every term $0<|h|\le m$ of the truncated sum in that lemma, so +the computed $(\widetilde Eu)_\ell$ differs from $(Eu)_\ell$ by less than +$(3+1+1)2^{-p}<(p/3)2^{-p}$. Its norm is less than +$\|E\|+5\cdot2^{-p}<1$. + +\emph{Cost and tape movement.} The selected indices $q_\ell$, the numerators +$s\beta_\ell$, and the block offsets are generated by the +counters already used for $C$, in $O(p)$ time per index. Before a line, +copy $u$ with $3m+3$ periodic records appended at each end, in $O((s+m)p)$ +time; then every block reads one consecutive interval. Consecutive input +intervals overlap in $O(m)$ records, so all reads, packing and unpacking +cost $O((t+m)p)$. There are $O(t/m+1)$ blocks, each costing +$O(mp^{1+\delta})$; in both cases $m<2p$. This gives the time bound +$O((t+p)p^{1+\delta})$. +\end{proof} diff --git a/notes/prime-field28-construction.tex b/notes/prime-field28-construction.tex new file mode 100644 index 0000000000..21ce20f336 --- /dev/null +++ b/notes/prime-field28-construction.tex @@ -0,0 +1,260 @@ +\subsection{A five-subset interchange motif over $\mathbb F_3$} +Let $h=28$, $\mathcal T=\binom{[h]}5$, $v=98280$, $m=h^3=21952$, +and $N=v^3$. Scalars in the interchange network lie in $\mathbb F_3$. +Use the rational address-label space +\[ + F=\mathbb Q^h,\qquad H=I-\frac2{25}J. +\] +Its exceptional eigenvalue is $1-2h/25=-31/25$, so it is nondegenerate. +For the indicator $t_T$ of a five-set, +\[ + \langle t_S,t_T\rangle=|S\cap T|-2,\qquad + \langle t_T,t_T\rangle=3. +\] +Neighbors have intersection two. For every pair $C\in\binom{[h]}2$, retain +\[ + A_C=\sum_{T\supset C}x_T,\qquad + D_{C,E}=\sum_{T=C\cup U,\ U\cap E=\varnothing}x_T + \quad\left(E\in\binom{[h]\setminus C}3\right). +\] +Scatter $\sum_{C\subset S}A_C$ to $y_S$ and inject +$-\sum_{C\subset S}D_{C,S\setminus C}$. A source and target with intersection +$k$ have coefficient $\binom{k}{2}-[k=2]$ modulo three. For $0\le k\le5$ +this is $[k=5]$. Thus their combined map is the identity. + +\paragraph{Cancellation-free triple exclusion.} +The local producer works with a polynomial of degree at most three whose +monomials have disjoint formal source supports. Pair its point indices. +Aggregate a monomial according to the set of pairs it touches, and recurse +on those pair indices. To exclude a set $E$ of at most three points, let $G$ +be its touched pair indices. Begin with the coarsened sum excluding $G$. +For every nonempty subset $K$ of the surviving partners in the pairs $G$, +add the contraction that selects exactly $K$ there and avoids the remaining +pairs of $G$. These cases partition the permitted monomials. +A one-point contraction has degree at most two and uses the repository's +weighted paired-exclusion recursion. A two-point contraction is a weighted +vector exclusion, and a three-point contraction is one original coefficient. +At at most four points direct summation supplies the base case. The exported +producer checks all $\binom{26}3=2600$ output coefficient vectors exactly. +Retaining the total adds twelve ancestors to its 41427 active additions. + +For each common pair, order the intact global pairs first and place the +partners of its removed points last. Identify equal source supports across +these local producers, retaining an existing decomposition, then remove +unused ancestors. Source-support cardinality strictly increases at every +addition, so this identification cannot create a cycle. There are 11240978 +addition nodes and $q=10v+\binom h2=983178$ designated output uses before +the next compression. + +An addition shared between different common pairs has actual source +intersection of size three or four. In the first case its support is specified +exactly by the common three-set and a bit vector of remaining pairs; in the +second by the common four-set and a bit vector of remaining points. +These are exact keys, with full equality comparison after hashing. Nodes +with common intersection of size two belong to a unique local context. +Consequently the global enumeration does not rely on probabilistic hashes. + +\paragraph{Resynthesizing four-point stars.} +For each four-set $B$, extract every sum of $x_{B\cup\{u\}}$ used by a node +outside that star or by a designated output. Replace the entire star +subgraph by a cancellation-free circuit for precisely those sums. A +reproducible greedy common-subexpression rule combines the pair of current +terms that occurs in most requested sums; ties are broken by increasing +support cardinality, union mask, and operand masks. An already constructed +union is reused. Every maintained expression is a partition of its requested +support. Thus each replacement addition is disjoint and each boundary +coefficient vector is unchanged. + +Canonical ordering puts intact global pairs before the remaining partners. +The 20475 stars require 365 distinct templates. The independent C++ checker +verifies both operands and their disjointness at every template gate and +checks every required boundary sum against the independently reconstructed +global DAG. This replaces 3006276 additions by at most 2623060. Hence the +complete producer has at most +\[ + c=10857762,\qquad q=983178,\qquad R=c+q=11840940 +\] +reversible auxiliary roles. The bound remains valid if a replacement creates +unused nodes: delete them and after stage sharing, pad by untouched auxiliary roles with source +matrix zero and sink matrix $I_m$ when exact width is wanted. + +\paragraph{Nondegenerate source spans.} +Label every producer node by the rational span $U$ of its source indicators. +Each retained node, including every replacement star node, has a common +pair $\{a,b\}$. Every vector $u\in U$ satisfies +$u_a=u_b=t$ and $\sum_i u_i=5t$, so +\[ + u^{\mathsf T}Hu=\sum_{i\notin\{a,b\}}u_i^2. +\] +If the right side vanishes, $\sum_{i\notin\{a,b\}}u_i=3t$ gives $t=0$. +Thus $U$ is positive definite. Along every addition edge source supports +and their spans are nested. Every side-output source meets its target in +exactly two points, so $U\subset t_S^\perp$. Orthogonal complements supply +the increasing labels in the reversed computation as in the shared-point +construction. No binary orthonormal-basis condition is imposed on these +rational labels. + +The retained total $A_C$ has source span of dimension $h-2$. Indeed, its +coordinates outside $C$ are the indicators of all triples on $h-2$ points, +which span the whole rational coordinate space: differences of triples give +all coordinate differences, and any triple has nonzero coordinate sum. +The two coordinates on $C$ are both one third of the outside coordinate sum. + +\paragraph{Transparent retained-total schedule.} +The retained-total wrapper follows PRs~\#4 and~\#6; the paired input ordering +follows the aligned common-point idea in PR~\#2. Use the outgoing-use/pivot +compiler on this addition DAG. Its invertible +mixer $L$ uses one role per addition plus one per output use. Write $V$ for +source copy, $R_0$ for retained-total scatter, and $J$ for the negative side +injection. In chronological order apply +\[ + L,-R_0,-J,L^{-1},V,L,R_0,J,L^{-1},-V. +\] +For arbitrary initial auxiliary vector $z$, this subtracts $(R_0+J)Lz$, +adds $(R_0+J)L(z+Vx)$, restores $z$, and changes the target by $x$. +Its inverse gives the inverse shear. The three tensor stages send +$(X,Y)$ to $(-Y,X)$; a final pointwise negation on $X$, at its existing full +frame, produces the exact exchange and adds zero edge rank. + +Use the original prefix decomposition $A=B\perp P$ and future line $Q$. +Set $D_0=(B\otimes F)\otimes Q$, $D_1=(A\otimes F)\otimes Q$, and +$D_U=D_0\perp(P\otimes U\otimes Q)$. Early mixers and scatters have frame +$D_0$, the source copy its source-line frame, the middle mixer $D_U$, the +retained scatter $D_0$, the side injection its target-complement frame, +and cleanup $D_1$. Only the retained output roles decrease, from $D_U$ to +$D_0$, by $h-2$ each. In the inverse schedule the retained scatter is at +$D_1$ and the following inverse mixer uses $D_{U^\perp}$, giving the same +loss. The source and target data boundaries are the original tensor-stage +boundaries. Thus total decreasing dimension is +\[ + L_{\rm b}=3v^2\binom h2(h-2). +\] + +\paragraph{Sharing first- and third-stage banks.} +An explicit neighbor permutation $\pi$ of the five-sets is obtained by +pairing the ground points. For a set containing no full pair, keep the two +singletons in its least indexed pairs and flip its other three singletons. +For one full pair, keep it and flip the three singletons. For two full pairs, +flip the singleton, and move the unordered pair of full-pair indices to the +next edge of a fixed Euler circuit of the complete graph on the other +thirteen pair indices. That graph has even degree twelve. Its Euler edges +are distinct, consecutive edges meet in exactly one vertex, and their cyclic +successor is a bijection. The three cases preserve their classes and all +have $|T\cap\pi(T)|=2$. + +Match the stage-1 bank with fixed coordinates $(A,B)$ to the stage-3 bank +with fixed coordinates $(B,\pi(A))$, keeping local role indices. Each +invocation restores arbitrary auxiliary inputs. The joining labels are +\[ + E=F\otimes\langle t_A\rangle\otimes\langle t_B\rangle, + \qquad H=(\langle t_B\otimes t_{\pi(A)}\rangle)^\perp\otimes F. +\] +Orthogonality in the middle factor gives $E\subset H$. Their dimensions +are $h$ and $m-h$. Replacing the separate endpoint edges by this join +removes one role and exactly $m$ rank units, preserving the absolute deficit. +All roles retain the required source/sink matrices. Therefore +\[ + W_{\rm b}=2v^2(v+R)=230640858616896000, + \quad s_{\rm b}=W_{\rm b}m-N+2L_{\rm b} + =5063027748645128371200. +\] +The extra $N$ source ranks come from the unchanged negative source projections. +Consequently +\[ + \eta_{\rm b}=\frac{W_{\rm b}m-s_{\rm b}}{W_{\rm b}m} + =\frac{39}{520019360}> + \frac3{400000000}\frac{9997}{1000}, + \qquad \log(21952)<\frac{9997}{1000}. +\] +\begin{proposition}\label{prop:prime-field-bit-interface} +The fixed $\mathbb F_3$ circuit exchanges the two data banks, restores every +auxiliary input, and satisfies the all-role rational endpoint identity with +width $W_{\rm b}$ and rank sum $s_{\rm b}$ above. Its interchange exponent is +$\tau=1-3/400000000$. +\end{proposition} +\begin{proof} +The scalar schedule, nested rational frames, bank matching and negative +source projections just established give the interface. The strict +rank-ratio comparison and the finite-alphabet argument below give the exponent. +\end{proof} + +\paragraph{Finite-alphabet interchange.} +The address radix in the rational-shear construction is still the fixed +prime chosen to avoid the rational matrix denominators; it is unrelated to +the payload field $\mathbb F_3$. Represent original bits as payload symbols +zero and one. Recursive role streams may contain symbol two. Address +permutations commute with pointwise $\mathbb F_3$ gates exactly as they do +with XOR gates, and all local gates are fixed finite tables. At completion +the corrected scalar permutation restores the original payload symbols. +Thus the all-role endpoint identity and the recurrence +$F_k\le(s_{\rm b}/W_{\rm b})F_{k-1}+O(1)$ hold over this fixed alphabet. +There is no conversion between binary and ternary numerical addresses and +no multiplicative per-level encoding cost. Existing record streams may be +processed bit-position by bit-position with this fixed payload alphabet. + +\subsection{Paired triple exclusion on the complex side} +Keep the triple-based complex motif, binary labels, coefficient ring, and +injection rule of eumemic's PR~\#3. Replace only its disjoint producer by +the paired weighted-triple circuit above, now at $h=28$. Transfer its nodes +with coordinate labels, and recursively split any injected node covering +all points outside its target, exactly as in PR~\#3. The pair-star correction +and its labels are unchanged. Every addition is disjoint; the original +coordinate, input-line and pair-star residual proofs apply unchanged. +The full finite check gives 61022 additions, 32816 injected pieces and +$R_{\rm c}=93838$ roles per invocation. + +Share complete stage-1 and stage-3 auxiliary banks, including centers, as +in dleen's PR~\#4. The triple permutation flipping every point to its partner +has even intersection with its input. The join $E\subset H$ above therefore +holds over $\mathbb F_2$. A tensor of coordinate units outside $B$ in its +first and third factors belongs to $H\cap E^\perp$ and has norm one. +Its nonzero residual is nonalternating and has an orthonormal basis. +The phase interface and weight-27 endpoint corrections are unchanged. +With $v_{\rm c}=3276$ and $m_{\rm c}=21952$, +\[ + W_{\rm c}=2v_{\rm c}^2(v_{\rm c}+R_{\rm c}+h+1)=2085111546336, + \quad L_{\rm c}=3v_{\rm c}^2h(h+1), + \quad s_{\rm c}=W_{\rm c}m_{\rm c}-2v_{\rm c}^3+2L_{\rm c}. +\] +Here $\eta_{\rm c}=5/12693352>(39/10^9)\cdot10$ and +$\log m_{\rm c}<10$, giving $\sigma=1-39/10^9$. +\begin{proposition}\label{prop:prime-field-complex-interface} +The paired complex network satisfies the retained binary phase interface, +including arbitrary auxiliary inputs and all endpoint corrections, with the +constants $m_{\rm c},W_{\rm c},s_{\rm c}$ above and $\sigma=1-39/10^9$. +\end{proposition} +\begin{proof} +The unchanged local binary residual proofs apply to the new disjoint +producer, the verified injection splits, and the pair-star correction. +The preceding norm-one join witness covers bank sharing. Telescoping and +the retained weight-27 corrections therefore give the interface, and the +strict logarithm comparison gives the exponent. +\end{proof} +The normalized gate coefficients remain in $\{0,\pm1,\pm1/2\}$. +The scalar gate count is $3v_{\rm c}^2(4(61022+3276)+4v_{\rm c}+4)$, +less than $12W_{\rm c}$; the retained stopped-depth guard applies with these +new constants, subject to its separately checked finite inequalities. + +\subsection{Conditional assembly at $2^{-28}$} +Combine these two finite interfaces with the compact-control movement and +stopping guard and with eumemic's fast Gaussian resampling in PR~\#5. +Take +\[ +\begin{aligned} + \epsilon&=\frac{4999}{10000}, & c&=\frac{9999}{10000}, & \beta&=\frac{19}{25},\\ + \lambda&=1-\frac{749}{10^{11}}, & + \lambda'&=1-\frac{748}{10^{11}}, & \delta&=10^{-6},\\ + \zeta&=10^{-4}, & C_1&=\frac{19601}{10000}, & + \kappa&=\frac{373}{10^{11}}>2^{-28}. +\end{aligned} +\] + +With compact-control packed and reserved-axis exponents, every constraint +is strict. The smallest of the seven assembly margins is +\[ + g_3=\frac{934813}{250000000000000},\qquad + g_3-\kappa=\frac{2313}{250000000000000}>0. +\] +This is a conditional asymptotic exponent claim under the same retained +fixed-tape, analytic and numerical interfaces, not a full formalization of +integer multiplication and not a practical running-time measurement. diff --git a/notes/projector-batching.tex b/notes/projector-batching.tex new file mode 100644 index 0000000000..c4e3984390 --- /dev/null +++ b/notes/projector-batching.tex @@ -0,0 +1,152 @@ +\subsection{Batching a large-rank projector edge} +\label{sec:projector-batching} + +The usual matrix-shear compiler uses one smaller interchange per rank +unit. For a projector of rank close to the ambient dimension, most of +these pivot interchanges can instead be one interchange of two +contiguous longer fields. The construction below does not gather +separated fields or reverse their digits. + +\paragraph{A simultaneous rational change of basis.} +Let $\mathcal P$ be a fixed finite family of rational idempotents of +dimension $m$. For $P\in\mathcal P$ with +$m/20$. On the first and last $r$ coordinates take $r$ disjoint +rank-one blocks +\[ + \frac12\begin{pmatrix}1&1\\1&1\end{pmatrix}, +\] +pairing coordinate $i$ with $m+1-i$, and take the identity on the middle +$t$ coordinates. This is a rational rank-$a$ idempotent whose indicated +corner is invertible. Hence the determinant of that corner of $SPS^{-1}$ +is not the zero rational function of the entries of $S$. Clear powers +of $\det S$ from its denominator. The product of the resulting nonzero +polynomials for the finite family, and $\det S$, is nonzero over +$\mathbb Q$. A nonzero polynomial over the infinite field $\mathbb Q$ +cannot vanish at every rational point. This proves simultaneous existence. + +The choice is effective: enumerate integer matrices and retain the first +invertible one satisfying all the indicated rational determinant tests. +This search terminates. The family and $m$ are fixed, so this finite +calculation is part of the fixed-machine preparation. Conjugate every +terminal and gate matrix by this same $S$. Common gate matrices, +every edge rank, the scalar circuit, and the endpoint identity are +preserved, since $SIS^{-1}=I$. The address prime is then chosen after +this conjugation and the triangular factorizations, avoiding their +finitely many denominators and invertible diagonal numerators as in the +original construction. + +Only the edges selected for batching need belong to $\mathcal P$. +All other matrices can continue to use the original rank-by-rank +compiler. In the present finite network, every selected edge is a +nonzero scalar multiple of an idempotent: for nested nondegenerate +labels $U\subset V$, +\[ + (P_V-P_U)^2=P_V-P_U, +\] +and reversing the edge only changes its sign. Scalar multiples do not +change the pivot locations and are absorbed into the triangular factors. + +\paragraph{The contiguous middle pivots.} +Let $P^2=P$ have rank $a>m/2$, let $r=m-a>0$, and assume its +first-$r$-row, last-$r$-column corner is invertible. Split the ordered +coordinates into +\[ + L=[1,r],\qquad M=[r+1,m-r],\qquad R=[m-r+1,m]. +\] +The complement $Q=I-P$ has rank $r$. Write $Q=UV$, where $U$ has +$r$ columns, $V$ has $r$ rows, and $VU=I_r$. Such a factorization +comes from a basis of $\operatorname{im}Q$. As $L$ and $R$ are disjoint, +\[ + P_{L,R}=-U_LV_R. +\] +Its invertibility makes both square matrices $U_L,V_R$ invertible. + +Run the lower-lower elimination in the retained physical order. Its +first $r$ pivots occupy the rows $L$ and the columns $R$, in some +permutation. Indeed their corner is invertible, so at each of these +steps the next row has a nonzero entry in an as-yet active column of +$R$, which precedes all other candidates in the rightmost-pivot rule. +The active Schur complement on rows $M\cup R$ and columns $L\cup M$ +has middle block +\begin{align*} + P_{M,M}-P_{M,R}P_{L,R}^{-1}P_{L,M} + &=I-U_MV_M + -(-U_MV_R)(-V_R^{-1}U_L^{-1})(-U_LV_M)\\ + &=I_{m-2r}. +\end{align*} +Thus the next $m-2r$ pivots are precisely the diagonal positions +$(i,i)$ with $i\in M$. Columns $L$ lie to their left and are cleared +by the allowed lower-triangular column operations. The remaining +block has rank zero, because the number of isolated pivots is already +$r+(m-2r)=m-r=a$. + +Consequently the factorization $P=E_1\Pi E_2$, with $E_1,E_2$ +invertible lower triangular, has exactly $r$ corner pivots and one +contiguous identity block of size +\[ + t=m-2r=2a-m. +\] +The same conclusion holds for $cP$ with any fixed nonzero rational $c$. +No assertion that an arbitrary rank-$a$ matrix has this pivot profile +is needed; the idempotent identity is what makes the middle block +exactly an identity matrix. + +\paragraph{One call for the identity block.} +Subdivide each original contiguous chunk into $m$ consecutive fields +of width $b$. The triangular factors still cost $O(V)$ in the retained +later-field affine primitive. Each of the $r$ corner pivots uses one +ordinary width-$b$ interchange. For all $i\in M$ together, perform +\[ + D_i\leftarrow D_i+H_i, + \qquad + (H_M,D_M)\leftarrow(D_M,H_M), + \qquad + D_i\leftarrow H_i-D_i, +\] +over $\mathbb Z/q^b\mathbb Z$. +The first and last maps are coordinatewise later-field updates, each +using a fixed number of linear scans. The middle map is a single +interchange of the two contiguous width-$tb$ chunks $H_M,D_M$. +It preserves the order of their $b$-digit fields and hence implements +all diagonal pivots exactly. The intervening fields are spectators. +In particular, addition is componentwise modulo $q^b$, not addition +with carries across the concatenated width-$tb$ chunks. + +The edge cost therefore has $r$ recursive calls of width $b$ and one +of width $tb$, in place of $a$ calls of width $b$, with the same +$O(V)$ nonrecursive work. If $a=m$, one may leave the edge in its +original $m$-singleton form. This avoids any same-width recursion. +For every batched edge in this paragraph, $02^{-23}$, on one fixed finite-alphabet Turing machine with a + fixed finite number of one-dimensional tapes. The algorithm is exact + for every input length and disproves the $n\log n$ optimality conjecture + of Sch\"onhage and Strassen in this model. +--- a/build/sections/00-introduction.tex ++++ b/build/sections/00-introduction.tex +@@ -1,3 +1,7 @@ ++% Modified by Douglas Colkitt, October 7, 2026. ++% Conditional compact-control research draft; see main.tex for scope. ++% Compressed complex network added October 7, 2026. ++% Fast Gaussian resampling added October 8, 2026. + \section{Introduction} + + Sch\"onhage and Strassen proved in 1971 that two $n$-bit integers can +@@ -25,7 +29,7 @@ + inputs. Its worst-case running time satisfies + \[ + T_A(n)=O\!\left(n(\lg n)^{1-\kappa}\right), +- \qquad \kappa=2^{-182}. ++ \qquad \kappa=6149999/50000000000000>2^{-23}. + \] + \end{theorem} + +--- a/build/sections/08-assembly.tex ++++ b/build/sections/08-assembly.tex +@@ -1,3 +1,7 @@ ++% Modified by Douglas Colkitt, October 7, 2026. ++% Conditional compact-control research draft; see main.tex for scope. ++% Compressed complex network added October 7, 2026. ++% Fast Gaussian resampling added October 8, 2026. + \section{Exact integer multiplication and its cost} + \label{sec:assembly} + +@@ -7,45 +11,76 @@ + layer costs $O(Vd^{\lambda'})$ and has coefficient error less than + $\sqrt2\,2^{-p}$. The ordered Gaussian resampling maps are + contractions; their disk-grid approximations have error less than +-$p^2 2^{-p}$ and cost $O(tp^{3/2+\delta}\alpha)$ on a line of length +-$t$. Address permutations and intermediate dyadic arithmetic are ++$p^2 2^{-p}$ and cost $O(n(t+p)p^{1+\delta})$ on a line of length ++$t$, where $n$ is the Neumann count of Lemma~\ref{lem:no-sort-resampling}. Address permutations and intermediate dyadic arithmetic are + exact. We choose compatible parameters for these procedures, recover + the integer coefficients from their approximations, and account for the + remaining tape operations. + + \subsection{A fixed rational choice} + +-The two motif exponents were fixed in \eqref{eq:explicit-motif-exponents}. +-Take the following fixed rational numbers: ++Use Lemma~\ref{lem:batched-chunk-swap} and ++Proposition~\ref{prop:batched-simultaneous-layer}. Their rank moments, ++not the retained uniform recurrences, certify the following exponents. ++Choose + \begin{equation}\label{eq:fixed-parameters} + \begin{gathered} +- \tau=\sigma=1-2^{-50},\qquad \beta=\frac12,\qquad \delta=\frac1{16},\\ +- \lambda=1-2^{-52},\qquad c=2^{-56},\qquad +- \lambda'=1-2^{-54},\\ +- C_1=20,\qquad \epsilon=2^{-75},\qquad \kappa=2^{-182}. ++ \tau=1-\frac{246}{10^9},\quad \sigma=1-\frac7{10^7},\quad ++ \beta=\frac1{1000},\quad\zeta=\frac1{10000},\\ ++ C_1=\frac65-\frac\beta5+\zeta=\frac{11999}{10000},\quad ++ \epsilon=\frac{7999999}{16000000},\quad c=1,\quad ++ \delta=\frac1{10^{10}},\\ ++ \lambda=\tau+\frac1{10^{16}},\quad ++ \lambda'=\tau+\frac2{10^{16}},\quad ++ \kappa=\frac{6149999}{50000000000000}>2^{-23}. + \end{gathered} + \end{equation} +-These constants are deliberately conservative; no optimization is claimed. +- +-The layer conditions hold with room to spare: +-\[ +- \max\{\tau,\sigma\}<\lambda<1,\qquad +- \tau(1+c/\beta)<1-31\cdot2^{-55}<\lambda, +-\] +-and +-\[ +- \sigma+\beta(1-\sigma)=1-2^{-51}<\lambda<\lambda'<1. +-\] +-The strict final inequality absorbs the logarithmic number of groups in +-a base-$m$ partition. The dimension exponent also satisfies +-\[ +-\begin{gathered} +- \epsilon<\frac1{12},\quad \epsilon C_1<1,\quad +- \epsilon(2-\tau)<1-\tau,\quad +- \frac34+\delta+\frac32\epsilon<1,\\ +- \epsilon(1+c)<1,\qquad \epsilon+\delta<1. +-\end{gathered} +-\] ++Since $\sigma<\tau$, the internal exponent is ++$\chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}=\tau$. ++The leaf exponent is $\sigma+\beta(1-\sigma)=1-6993/10^{10}<\tau$. ++The stopping test is $e^{1000}\eta$. Therefore +-\[ +- \alpha^4\theta_i>\frac{12d^2b}{4d}=3db\geq6b=p. +-\] +-The choice of $\alpha$ gives +-$\alpha=\Theta(p^{1/4+\epsilon/2})$, and \eqref{eq:gamma} already +-ensures $2\leq\alpha<\sqrt p$ for large $n$. We also have +-$t_i\leq r\leq T<8n/b<2^{6b}=2^p$. ++Writing $\theta_i=t_i/s_i-1$, the bounds on $s_i$ give ++$\eta<\theta_i<2\eta/(1-2\eta)=1/(2d-1)\le1/4$ once $d\geq3$. Therefore ++\[ ++ \alpha^2\theta_i>\frac b{16d}\cdot\frac1{4d}=\frac b{64d^2}\geq1 ++\] ++once $b\geq64d^2$, which holds for large $n$ because $d^2\le b^{2\epsilon}$ ++and $2\epsilon<1$. The Neumann counts of ++Lemma~\ref{lem:no-sort-resampling} satisfy ++\[ ++ n_{\alpha,\theta_i}\le\frac{p+1}{4\alpha^2}+\frac1{\theta_i}+1 ++ \le\frac{(6b+1)16d}{4b}+4d+1\le30d. ++\] ++We also have $t_i\leq r\leq T<8n/b<2^{6b}=2^p$ and $t_i\ge r/2>p$. + Thus every hypothesis of Lemma~\ref{lem:no-sort-resampling} holds for + all sufficiently large input lengths. The superpolynomial growth of $r$ + established above also supplies the setup condition in +@@ -184,9 +222,9 @@ + All remaining scalar setup, including comparisons for fixed rational + powers, modular inverses, + prime products and shape descriptors, has cost polynomial in $p$. +-For example, $d=\lfloor b^{2^{-75}}\rfloor$ is found by binary search +-using exact comparisons $d^{2^{75}}\le b$; the exponent is fixed. +-The same procedure computes $K$ and all other fixed rational powers. ++For example, $d=\lfloor b^{7999999/16000000}\rfloor$ is found by binary search ++using exact comparisons $d^{16000000}\le b^{7999999}$; the exponent is fixed. ++Here $K=d$ exactly; the same comparison method computes all other fixed rational powers. + All primes and length parameters are therefore generated by the machine; + they are not advice. + +@@ -292,15 +330,28 @@ + offsets therefore cost $O(dTp^C/r)=o(Tp)$ to prepare, since + $t_i\ge r/2$ and $r$ exceeds every fixed power of $p$. + +-The axis widths are $\ell$ or $\ell-1$. To exchange two adjacent axes +-of unequal width, move the longer axis's leading bit outside their +-equal-width pair, swap that pair by the proved chunk-swap procedure, +-and put the leading bit at its new position. This adds a fixed number +-of linear passes to the equal-width swap cost. Reversing all axes +-uses $O(d^2)$ such moves. Therefore the map $\Phi$, its inverse, and +-their padding operations cost +-\[ +- O\bigl(Tp\,d^2(1+\ell^\tau)\bigr). ++The axis widths are $\ell$ or $\ell-1$. Reverse the axis order by ++interchanging physical positions $j$ and $d+1-j$ for ++$j=1,\ldots,\lfloor d/2\rfloor$. Every pair is disjoint, so this uses ++$\lfloor d/2\rfloor$ full-field interchanges, not a sequence of adjacent moves. ++Each is covered by Lemma~\ref{lem:batched-chunk-swap} and its subsequent one-bit-width ++extension, with all intervening fields collapsed into its spectator gap. ++Its cost is $O(Tp(1+\ell^\tau))$. Keep each axis name and width attached ++to that field in the descriptor. The final order is exactly ++$(a_1,\ldots,a_d)$, as required by the triangular updates above. Their target ++order and their requirement that controls precede targets are unchanged. ++The inverse uses the reversed interchange schedule after recovering the digits. ++ ++The completed reversal and its inverse preserve complete records and their ++internal bit order. Padding is inserted before the forward reversal and ++removed only after the inverse reversal, so the insertion/deletion enumeration ++is unchanged. Since $d\le\log_2T$, the named-axis list and all collapsed ++lengths have polynomial length in $\log(2Tp)$. Each call descriptor can thus ++be prepared in $\operatorname{poly}(\log(2Tp))=O(Tp)$ time. The $d$ controlled ++rotations and the padding scans cost $O(dTp)$ as above. Therefore $\Phi$, ++its inverse, and their padding operations cost ++\[ ++ O\bigl(Tp\,d(1+\ell^\tau)\bigr). + \] + This construction describes payload movement from address $a$ to its + new address. It is distinct from the operator convention +@@ -557,8 +608,8 @@ + + \subsection{Precision and exact recovery} + +-Proposition~\ref{prop:simultaneous-layer} uses +-$C_1=20$, so $\epsilon C_1<1$ makes its coefficient width $O(p)$. ++Proposition~\ref{prop:batched-simultaneous-layer} uses ++$C_1=11999/10000$, so $\epsilon C_1<1$ makes its coefficient width $O(p)$. + Lemma~\ref{lem:synthetic-transform-cost} therefore applies to every + synthetic transform here, with error less than + $\sqrt2\ell\,2^{-p}\frac12,\quad g_2=2^{-181},\quad g_3=2^{-129},\quad +- g_4>2^{-51},\quad g_5>\frac18,\quad g_6>\frac12,\quad g_7=2^{-75}. +-\] +-Thus $\min_i g_i=2^{-181}=2\kappa$. This explicit slack will cover +-any remaining fixed power of $\log p$. +- +-Here $d^2$ is absorbed by $d^2\ell^\tau$, and ++ ++The seven margins have the following exact values: ++\[ ++\begin{array}{c|c} ++g_1&\frac{1}{8000000}\\ ++g_2&\frac{983999877}{8000000000000000}\\ ++g_3&\frac{9839998762000001}{80000000000000000000000}\\ ++g_4&\frac{984000123}{8000000000000000}\\ ++g_5&\frac{1249}{10000000000}\\ ++g_6&\frac{312500039}{625000000}\\ ++g_7&\frac{7999999}{16000000}\\ ++\end{array} ++\] ++Exact substitution in the unchanged seven-term assembly accounting gives ++\[ ++ G_*:=\min_i g_i=g_3=\epsilon(1-\lambda') ++ =\frac{9839998762000001}{80000000000000000000000}>\frac{6149999}{50000000000000}=\kappa. ++\] ++The final strict absorption gap is ++\[ ++ G_*-\kappa=\frac{362000001}{80000000000000000000000}>0. ++\] ++The new reservation, compact movement and repair costs are all included ++in the completed-layer term $g_3$. Put $\rho=G_*-\kappa>0$; this fixed ++strict gap absorbs all remaining fixed powers of $\log p$. ++The guard is $O(d^{11999/10000})=o(p)$ because ++\[ ++ \epsilon C_1=\frac{95991988001}{160000000000}<1, ++ \qquad 1-\epsilon C_1=\frac{64008011999}{160000000000}. ++\] ++Furthermore, ++$\alpha=\Theta(p^{8000001/32000000})$ and $\gamma\le b/4$. Also ++$K=\Theta(p^{7999999/16000000})=o(\ell)$, $K/\log p\to\infty$, ++and $\ell=\Theta(p^{8000001/16000000})$. The prime-interval ratio grows as ++$p^{1/8000000}$, and so does $b/d^2$. All construction and precision conditions hold beyond ++a common fixed cutoff. ++ ++Here $d$ is absorbed by $d\ell^\tau$, and + $\log(rp)=O(p^{1-\epsilon}+\log p)=O(p^{1-\epsilon})$. + The first three rows are the terms in + \eqref{eq:synthetic-transform-cost}. The prefix-slot moves and + individual butterfly rounds in Lemma~\ref{lem:synthetic-transform-cost} + use $O(dK)$ linear scans. Its positional layout uses $O(p/K)$ exchanges + of width-$K$ chunks, because $d\ell=O(p)$. Each exchange costs +-$O(VK^\tau)$ by Lemma~\ref{lem:chunk-swap}, so the normalized total is ++$O(VK^\tau)$ by Lemma~\ref{lem:batched-chunk-swap}, so the normalized total is + \[ + O(p/K)\,K^\tau=O(pK^{\tau-1}). + \] + For the at most $\ell$ simultaneous rounds, +-Proposition~\ref{prop:simultaneous-layer} supplies $O(Vd^{\lambda'})$ ++Proposition~\ref{prop:batched-simultaneous-layer} supplies $O(Vd^{\lambda'})$ + per round. Its bound already includes the binary basis changes, +-deterministic repair, row padding and removal, all base-$m$ groups, ++deterministic repair, row padding and removal, all mixed-width children, + and fixed-tape cleanup. + +-Axis exposure and restoration require $O(d^2)$ adjacent axis moves. +-Each costs $O(V(1+\ell^\tau))$: peel a single excess bit when widths +-differ by one, exchange their equal-width parts, and restore the bit. ++Axis exposure and restoration require $O(d)$ nonadjacent full-field ++interchanges by Lemma~\ref{lem:tensor-resampling}; the CRT reversal also ++uses $O(d)$ such interchanges. Each costs $O(V(1+\ell^\tau))$, using the ++arbitrary spectator gap and the one-bit-width extension of ++Lemma~\ref{lem:batched-chunk-swap}. Thus this row has exponent ++$\epsilon+\tau(1-\epsilon)$ rather than $2\epsilon+\tau(1-\epsilon)$. + The $d$ CRT rotations copy valid and invalid intervals in $O(dV)$ time. + Their offset setup was bounded above by $O(dTp^C/r)=o(Tp)$, + using at most $T/t_i$ control prefixes for target $i$. + +-For Gaussian resampling, axis $i$ has at most $T/t_i$ processed lines. +-The line-machine costs therefore sum to ++For Gaussian resampling, axis $i$ has at most $T/t_i$ processed lines, ++each of length $t_i>p$. Since every Neumann count is at most $30d$, the ++line-machine costs sum to + \[ + \sum_{i=1}^d\frac{T}{t_i} +- O(t_i p^{3/2+\delta}\alpha) +- =O(dTp^{3/2+\delta}\alpha). +-\] +-Dividing by $V=Tp$ gives the fifth row. The factor +-$\alpha=\Theta(p^{1/4+\epsilon/2})$ explains its displayed power of $p$. ++ O(30d\,t_i p^{1+\delta}) ++ =O(d^2Tp^{1+\delta}). ++\] ++Dividing by $V=Tp$ gives the fifth row. + + Chirp numerators have $O(p)$ bits and can be computed modulo $2r$ as + sums of $d$ terms $s_i j_i^2(r/t_i)$. Computing their squares and +@@ -930,7 +1013,7 @@ + multiplier and the iterations of the quoted Gaussian algorithms are + already included in their separately charged running times. + The layer and address-layout recursions have constant branching and +-depth $O(\log p)$, and the number of their rounds and base-$m$ groups ++depth $O(\log p)$, and the number of their rounds and root invocations + is polynomial in $p$. Choose a fixed exponent $A$ so that their + total number of visits is at most $p^A$, and a fixed $C$ bounding + descriptor setup performed once per visit by $p^C$ steps. This setup then +@@ -951,7 +1034,7 @@ + The general address-swap subroutine also covers one-bit payloads, + where no polynomial suffix is available. For root volume $V_0$ and + current child volume $V_j$, the descriptor estimate in the proof of +-Proposition~\ref{prop:power-interchange} gives ++Section~\ref{sec:mixed-width-rows} gives + $(\log(2V_0))^{O(1)}=O(V_j)$. It uses the invariant that both original + chunk ranges remain present in every child, and therefore includes + polynomial descriptor work even for a one-bit payload. +@@ -960,29 +1043,19 @@ + does scan the axis descriptors at every coefficient; its + $O(Tdp^{1+\delta})$ cost was included in the chirp row. + +-For one packed change of basis, let $V_{\rm call}$ be its current +-logical volume. The bad-address fraction is +-$O(d2^{-K})$, independently of the payload. Each polynomial record +-has $\Theta(rp)$ payload bits, and an exceptional record adds an +-$O(p)$-bit destination key. Thus the compact exceptional stream has +-length +-\[ +- O\!\left(\frac{V_{\rm call}}{rp}\,d2^{-K}(rp+p)\right) +- =O(V_{\rm call}d2^{-K}). +-\] +-Stable bit sorting makes $O(p)$ scans of this stream, for one-call +-cost $O(V_{\rm call}dp2^{-K})$. Extraction and reinsertion use a +-constant number of scans of the full current volume; those scans are +-already in the node overhead. Since there are at most $p^A$ visits, +-each of volume $O(V)$, the compact sorting costs sum to at most +-\[ +- O\!\left(dp2^{-K}\sum_{\rm calls}V_{\rm call}\right) +- =O(Vp^{A'}2^{-K})=o(V) +-\] +-for another fixed exponent $A'$. Here $d=O(p^\epsilon)$ and +-$K=\Theta(p^{\epsilon c})$ with $\epsilon c>0$. Predicate and key +-arithmetic is the polynomial work per record counted above. This is +-a deterministic worst-case bound. ++For a compact-control change of basis of current volume $V_{\rm call}$, ++the exceptional fraction is at most $5/(128p^3)$ beyond the common cutoff. ++Sorting its keyed exceptional records costs ++\[ ++ O\bigl(V_{\rm call}\delta p(1+1/r)\bigr)=O(V_{\rm call}p^{-2}). ++\] ++Extraction and reinsertion cost $O(V_{\rm call})$, and polynomial predicate ++and key work per record is absorbed by the whole polynomial record suffix. ++These are already charged at \emph{each node} in the compact-control ++recurrence. Their sum is bounded by that volume-weighted recurrence and ++therefore by the completed-layer cost in the table. No claim that their ++global total is $o(V)$ is needed, and the old global estimate using an ++exponentially small $2^{-K}$ bad fraction is not used for this new gadget. + + Finally, all role, arithmetic, and stack tapes form fixed finite + families. A child parks and restores only its parent's streams, with +@@ -992,8 +1065,8 @@ + alphabet symbols. Global setup and prime search cost $o(V)$, as + proved earlier. + +-Each of the seven displayed powers is at most $1-2\kappa$ by +-\eqref{eq:margin-list}. Any fixed power of $\log p$ is at most $p^\kappa$ ++Each of the seven displayed powers is at most $1-G_*$ by ++\eqref{eq:margin-list}. Any fixed power of $\log p$ is at most $p^\rho$ + eventually. The complete large-input bound is consequently + \[ + O(Tp\,p^{1-\kappa})=O(n(\log n)^{1-\kappa}). +--- a/build/sections/03-motifs.tex ++++ b/build/sections/03-motifs.tex +@@ -1,3 +1,7 @@ ++% Modified by Douglas Colkitt, October 7, 2026. ++% Conditional compact-control research draft; see main.tex for scope. ++% Compressed complex network added October 7, 2026. ++% Fast Gaussian resampling added October 8, 2026. + \section{Two finite networks with a rank saving} + \label{sec:finite-networks} + +@@ -13,8 +17,8 @@ + + Put + \[ +- h=100,\qquad v=\binom h3=161700,\qquad +- N=v^3=4227952113000000,\qquad m=h^3=1000000. ++ h=50,\qquad v=\binom h3=19600,\qquad ++ N=v^3=7529536000000,\qquad m=h^3=125000. + \] + Let $\mathcal T$ be the set of three-element subsets of $[h]$. + There are two data banks $X_a,Y_a$, indexed by +@@ -34,7 +38,7 @@ + Each such invocation has its own auxiliary wires, distinct from all + other invocations, including those in other stages. There are + \[ +- I=3v^2=78440670000 ++ I=3v^2=1152480000 + \] + invocations. In a forward invocation, write $x_T$ for the data used as + controls and $y_S$ for the data to be updated; $S,T\in\mathcal T$ are +@@ -127,19 +131,19 @@ + + A fixed triple has + \[ +- z_{\rm b}=3\binom{97}{2}=13968,\qquad +- z_{\rm c}=\binom{97}{3}+3\cdot97=147731 ++ z_{\rm b}=3\binom{47}{2}=3243,\qquad ++ z_{\rm c}=\binom{47}{3}+3\cdot47=16356 + \] + neighbors in the two constructions, respectively. The second count + separates intersection zero and intersection two. Ordered pairs must + be counted: there are $vz$ side wires in each invocation, not $vz/2$. +-With $c_{\rm b}=100$ and $c_{\rm c}=101$ central wires per invocation, ++With $c_{\rm b}=50$ and $c_{\rm c}=51$ central wires per invocation, + the total wire counts are + \begin{align} + W_{\rm b}&=2N+I(vz_{\rm b}+c_{\rm b}) +- =177176569091445000000,\label{eq:bit-wire-count}\\ ++ =73269972440000000,\label{eq:bit-wire-count}\\ + W_{\rm c}&=2N+I(vz_{\rm c}+c_{\rm c}) +- =1873807244643542670000.\label{eq:complex-wire-count} ++ =369474390296480000.\label{eq:complex-wire-count} + \end{align} + All these numbers are fixed, independently of any eventual input length. + +@@ -212,7 +216,7 @@ + \langle x,y\rangle=x^{\mathsf T}(I-J/9)y, + \] + where $J$ is the all-one matrix. This form has eigenvalues $1$ and +-$1-h/9=-91/9$, so it is nondegenerate. For a triple $T$ let $t_T$ be ++$1-h/9=-41/9$, so it is nondegenerate. For a triple $T$ let $t_T$ be + its indicator vector. Then + \[ + \langle t_S,t_T\rangle=|S\cap T|-1, +@@ -225,7 +229,7 @@ + The scalar domain need not equal the label field. + These degree-one intersection formulas specialize the construction + described by Alon~\cite[Section~3, remark after Theorem~1.1]{Alon1998} +-to the prime $2$, with the ground-set size changed to $h=100$. ++to the prime $2$, with the ground-set size changed to $h=50$. + + The ambient label space is $\mathcal F=F^{\otimes3}$ with its tensor + bilinear form. It has dimension $m$ and is nondegenerate. Write +@@ -458,8 +462,8 @@ + + The loss ratios have the exact values + \[ +- \frac{L_{\rm b}}{N}=\frac{100}{539},\qquad +- \frac{L_{\rm c}}{N}=\frac{101}{539}. ++ \frac{L_{\rm b}}{N}=\frac{75}{196},\qquad ++ \frac{L_{\rm c}}{N}=\frac{153}{392}. + \] + In particular, both are smaller than $1/2$. We now turn the dimension + count into the two interfaces needed later. +@@ -503,7 +507,7 @@ + &=\sum_{e}\operatorname{rank}_{\mathbb Q} + (M_{\mathrm{head}(e)}-M_{\mathrm{tail}(e)})\\ + &=W_{\rm b}m-N+2L_{\rm b} +- =1771765690887858612870000000\quad(u\ne0). ++\] ++Thus $U_z$ is nondegenerate. Along every graph edge $z\to w$, ++$U_z\subset U_w$. Forward middle gates use $D_{U_z}$; the physical roles ++follow paths, so these frames increase. A designated output for target $T$ ++has $U_z\subset t_T^\perp$, because every contributing triple is a neighbor. ++ ++For the reversed middle computation use $D_{U_z^\perp}$. The ambient form ++is nondegenerate, so all these complements are nondegenerate. Reversing an ++edge reverses inclusion: $U_w^\perp\subset U_z^\perp$. ++The original output begins at the physical $X$ line ++$\langle t_T\rangle\subset U_z^\perp$; an original input ends at exactly ++its physical $Y$ complement $t_S^\perp$. No positivity assumption on the ++reachable-target spans is needed. At every gate all incident roles receive ++the same frame. Early mixers use $D_0$, and late cleanup uses $D_1$. ++Newly active roles enter from $D_0$ and retired roles grow to $D_1$. ++Tensoring by $Q$ gives the original data-stage boundaries in both orientations. ++The only decreases remain the central returns, each of dimension $h$. ++ ++Share the complete auxiliary bank of a stage-1 invocation $(A,B)$ with stage 3 ++at $(B,\pi(A))$, matching local role indices. Here $\pi$ is a bijection of ++triples with $|T\cap\pi(T)|=1$: pair consecutive ground points; for a triple ++with a full pair and singleton, keep the singleton and cycle the full pair ++among pairs not containing it; otherwise keep the point in the least indexed ++pair and flip the other two to their partners. Each rule is bijective on its ++class. All invocations restore arbitrary scratch, and the joining labels are ++\[ ++ E=F\otimes\langle t_A\rangle\otimes\langle t_B\rangle, ++ \qquad H=\langle t_B\otimes t_{\pi(A)}\rangle^\perp\otimes F. ++\] ++They are nondegenerate and $E\subset H$ by the chosen orthogonality. ++Each join removes one auxiliary role and exactly $m$ of edge rank. ++ ++\begin{proposition}[Paired-block bit interface]\label{prop:paired-bit-interface} ++The new bit network restores arbitrary scratch, exchanges the data banks, ++and satisfies the original all-role endpoint identity with ++\begin{align*} ++ W_{\rm b}^{\rm pair}&=2N+2v^2(R+h)=406321422080000,\\ ++ s_{\rm b}^{\rm pair}&=W_{\rm b}^{\rm pair}m-N+6v^2h^2 ++ =50790175992864000000,\\ ++ W_{\rm b}^{\rm pair}m-s_{\rm b}^{\rm pair}&=1767136000000>0. ++\end{align*} ++\end{proposition} ++\begin{proof} ++The scalar schedule and both frame assignments were verified above. The total ++decreasing dimension is $3v^2h^2$. Telescoping gives total absolute label change ++$W_{\rm b}^{\rm pair}m-2N+6v^2h^2$; the unchanged negative source projections ++add $N$ rational rank. Data endpoints are unchanged and every surviving ++auxiliary role has endpoints zero and $I_m$, with its scalar value restored. ++The original common-frame identity and rational-shear transfer apply. All ++circuits, rational bases, and gates are fixed finite data. ++\end{proof} ++ ++\subsection{Explicit exponents at ground size fifty} ++Take $a=296/10^{11}$, $a_{\rm c}=1/10^{11}$, and $L_0=11737/1000$. ++The exact deficits satisfy ++\[ ++ \eta_{\rm b}^{\rm pair}=\frac{23}{661055000}>aL_0,\qquad ++ \eta_{\rm c}=\frac{239}{1202215191250}>a_{\rm c}L_0. ++\] ++For $1\le x\le2$, put $z=(x-1)/(x+1)$, ++$S(x)=2\sum_{j=0}^{23}z^{2j+1}/(2j+1)$, and ++$E_0(x)=2z^{49}/(49(1-z^2))$. Then ++$S(x)\le\log x\le S(x)+E_0(x)$, and exact rational comparison gives ++\[ ++ \log m\le16(S(2)+E_0(2))+S(m/2^{16})+E_0(m/2^{16})1-x$ therefore proves the required strict bounds with ++\begin{equation}\label{eq:paired-intermediate-exponents} ++ \tau=1-\frac{296}{10^{11}},\qquad \sigma_{50}=1-\frac1{10^{11}}. ++\end{equation} ++The complex network itself is unchanged apart from the ground size $h=50$; ++its construction, binary residual bases, and scalar corrections remain those ++proved above. ++ ++\subsection{An independently sized complex network} ++\label{sec:independent-complex} ++Keep the paired bit network at $h_{\rm b}=50$, with address-swap exponent ++$\tau=1-296/10^{11}$. Instantiate the original complex construction instead ++at $h_{\rm c}=25$. Its constants, distinguished from those of the bit ++network, are ++\[ ++ m_{\rm c}=15625,\quad v_{\rm c}=2300,\quad N_{\rm c}=12167000000, ++\] ++\[ ++ W_{\rm c}=58645352620000,\quad L_{\rm c}=10315500000,\quad ++ s_{\rm c}=916333630984500000. ++\] ++Here $W_{\rm c}=2v_{\rm c}^3+3v_{\rm c}^2(v_{\rm c}z_{\rm c}+26)$, ++$z_{\rm c}=\binom{22}{3}+66$, and $L_{\rm c}=3v_{\rm c}^2\cdot25\cdot26$. ++ ++\begin{proposition}\label{prop:compact-complex-interface} ++The original complex phase interface, including its signed scalar bank ++exchange, arbitrary-scratch restoration, binary residual bases and endpoint ++corrections, holds with these constants. Its normalized residual saving ++supports the strict exponent $\sigma=1-418/10^{12}$. ++\end{proposition} ++\begin{proof} ++The original construction and residual table apply at this ground size. ++For an intersection of size $j$, the center coefficient is $(j-1)/2$; the ++side correction is its negative for distinct even-intersection neighbors. ++Their sum is zero for $j=0,1,2$ and one for $j=3$. The same eight-step ++schedule therefore restores arbitrary scratch and gives the elementary bank ++shear, and the three stages give the signed exchange. ++ ++Binary triple indicators have norm one. The orthogonal decompositions in ++the residual table remain nondegenerate. Every nonzero residual has a ++norm-one vector: choose a coordinate outside the support of a triple or two ++neighboring triples (at most six coordinates), or outside an earlier/future ++tensor indicator (support $3^j<25^j$); tensor with the remaining norm-one ++factors. Thus the original nonalternating-space argument supplies the required ++orthonormal bases. No even-ground-size matching or rational bit-interface ++positivity is needed for this unchanged complex network. ++ ++The rank accounting gives ++\[ ++ s_{\rm c}=W_{\rm c}m_{\rm c}-2N_{\rm c}+2L_{\rm c},\qquad ++ \eta_{\rm c}=\frac{W_{\rm c}m_{\rm c}-s_{\rm c}}{W_{\rm c}m_{\rm c}} ++ =\frac{14}{3464399375}>0. ++\] ++The needed positivity is $L_{\rm c}(418/10^{12})(966/100)$. The inequality ++$e^{-x}>1-x$ then yields $s_{\rm c}/W_{\rm c}(14/10^9)(966/100)$ give, by $e^{-x}>1-x$, ++\begin{equation}\label{eq:compressed-complex-exponent} ++ s_{\rm c}/W_{\rm c} ++ \frac3{400000000}\frac{9997}{1000}, ++ \qquad \log(21952)<\frac{9997}{1000}. ++\] ++\begin{proposition}\label{prop:prime-field-bit-interface} ++The fixed $\mathbb F_3$ circuit exchanges the two data banks, restores every ++auxiliary input, and satisfies the all-role rational endpoint identity with ++width $W_{\rm b}$ and rank sum $s_{\rm b}$ above. Its interchange exponent is ++$\tau=1-3/400000000$. ++\end{proposition} ++\begin{proof} ++The scalar schedule, nested rational frames, bank matching and negative ++source projections just established give the interface. The strict ++rank-ratio comparison and the finite-alphabet argument below give the exponent. ++\end{proof} ++ ++\paragraph{Finite-alphabet interchange.} ++The address radix in the rational-shear construction is still the fixed ++prime chosen to avoid the rational matrix denominators; it is unrelated to ++the payload field $\mathbb F_3$. Represent original bits as payload symbols ++zero and one. Recursive role streams may contain symbol two. Address ++permutations commute with pointwise $\mathbb F_3$ gates exactly as they do ++with XOR gates, and all local gates are fixed finite tables. At completion ++the corrected scalar permutation restores the original payload symbols. ++Thus the all-role endpoint identity and the recurrence ++$F_k\le(s_{\rm b}/W_{\rm b})F_{k-1}+O(1)$ hold over this fixed alphabet. ++There is no conversion between binary and ternary numerical addresses and ++no multiplicative per-level encoding cost. Existing record streams may be ++processed bit-position by bit-position with this fixed payload alphabet. ++ ++\subsection{Paired triple exclusion on the complex side} ++Keep the triple-based complex motif, binary labels, coefficient ring, and ++injection rule of eumemic's PR~\#3. Replace only its disjoint producer by ++the paired weighted-triple circuit above, now at $h=28$. Transfer its nodes ++with coordinate labels, and recursively split any injected node covering ++all points outside its target, exactly as in PR~\#3. The pair-star correction ++and its labels are unchanged. Every addition is disjoint; the original ++coordinate, input-line and pair-star residual proofs apply unchanged. ++The full finite check gives 61022 additions, 32816 injected pieces and ++$R_{\rm c}=93838$ roles per invocation. ++ ++Share complete stage-1 and stage-3 auxiliary banks, including centers, as ++in dleen's PR~\#4. The triple permutation flipping every point to its partner ++has even intersection with its input. The join $E\subset H$ above therefore ++holds over $\mathbb F_2$. A tensor of coordinate units outside $B$ in its ++first and third factors belongs to $H\cap E^\perp$ and has norm one. ++Its nonzero residual is nonalternating and has an orthonormal basis. ++The phase interface and weight-27 endpoint corrections are unchanged. ++With $v_{\rm c}=3276$ and $m_{\rm c}=21952$, ++\[ ++ W_{\rm c}=2v_{\rm c}^2(v_{\rm c}+R_{\rm c}+h+1)=2085111546336, ++ \quad L_{\rm c}=3v_{\rm c}^2h(h+1), ++ \quad s_{\rm c}=W_{\rm c}m_{\rm c}-2v_{\rm c}^3+2L_{\rm c}. ++\] ++Here $\eta_{\rm c}=5/12693352>(39/10^9)\cdot10$ and ++$\log m_{\rm c}<10$, giving $\sigma=1-39/10^9$. ++\begin{proposition}\label{prop:prime-field-complex-interface} ++The paired complex network satisfies the retained binary phase interface, ++including arbitrary auxiliary inputs and all endpoint corrections, with the ++constants $m_{\rm c},W_{\rm c},s_{\rm c}$ above and $\sigma=1-39/10^9$. ++\end{proposition} ++\begin{proof} ++The unchanged local binary residual proofs apply to the new disjoint ++producer, the verified injection splits, and the pair-star correction. ++The preceding norm-one join witness covers bank sharing. Telescoping and ++the retained weight-27 corrections therefore give the interface, and the ++strict logarithm comparison gives the exponent. ++\end{proof} ++The normalized gate coefficients remain in $\{0,\pm1,\pm1/2\}$. ++The scalar gate count is $3v_{\rm c}^2(4(61022+3276)+4v_{\rm c}+4)$, ++less than $12W_{\rm c}$; the retained stopped-depth guard applies with these ++new constants, subject to its separately checked finite inequalities. ++ ++\subsection{Conditional assembly at $2^{-28}$} ++Combine these two finite interfaces with the compact-control movement and ++stopping guard and with eumemic's fast Gaussian resampling in PR~\#5. ++Take ++\[ ++\begin{aligned} ++ \epsilon&=\frac{4999}{10000}, & c&=\frac{9999}{10000}, & \beta&=\frac{19}{25},\\ ++ \lambda&=1-\frac{749}{10^{11}}, & ++ \lambda'&=1-\frac{748}{10^{11}}, & \delta&=10^{-6},\\ ++ \zeta&=10^{-4}, & C_1&=\frac{19601}{10000}, & ++ \kappa&=\frac{373}{10^{11}}>2^{-28}. ++\end{aligned} ++\] ++ ++With compact-control packed and reserved-axis exponents, every constraint ++is strict. The smallest of the seven assembly margins is ++\[ ++ g_3=\frac{934813}{250000000000000},\qquad ++ g_3-\kappa=\frac{2313}{250000000000000}>0. ++\] ++This is a conditional asymptotic exponent claim under the same retained ++fixed-tape, analytic and numerical interfaces, not a full formalization of ++integer multiplication and not a practical running-time measurement. ++ ++The following exponents certify the retained uniform-width baseline: ++\begin{equation}\label{eq:explicit-motif-exponents} ++ \tau=1-3/400000000,\qquad\sigma=1-39/10^9. + \end{equation} +-Both exact deficits displayed above are greater than $20\cdot2^{-50}$. +-Since $m<2^{20}$ and $\log 2<1$, we have $\log m<20$, whence +-\[ +- m^{1-2^{-50}} +- =m\exp(-2^{-50}\log m) +- >m(1-20\cdot2^{-50})>m(1-\eta) +-\] +-for either $\eta=\eta_{\rm b}$ or $\eta=\eta_{\rm c}$. +-Consequently +-\[ +- \frac{s_{\rm b}}{W_{\rm b}}0$. On the first and last $r$ coordinates take $r$ disjoint ++rank-one blocks ++\[ ++ \frac12\begin{pmatrix}1&1\\1&1\end{pmatrix}, ++\] ++pairing coordinate $i$ with $m+1-i$, and take the identity on the middle ++$t$ coordinates. This is a rational rank-$a$ idempotent whose indicated ++corner is invertible. Hence the determinant of that corner of $SPS^{-1}$ ++is not the zero rational function of the entries of $S$. Clear powers ++of $\det S$ from its denominator. The product of the resulting nonzero ++polynomials for the finite family, and $\det S$, is nonzero over ++$\mathbb Q$. A nonzero polynomial over the infinite field $\mathbb Q$ ++cannot vanish at every rational point. This proves simultaneous existence. ++ ++The choice is effective: enumerate integer matrices and retain the first ++invertible one satisfying all the indicated rational determinant tests. ++This search terminates. The family and $m$ are fixed, so this finite ++calculation is part of the fixed-machine preparation. Conjugate every ++terminal and gate matrix by this same $S$. Common gate matrices, ++every edge rank, the scalar circuit, and the endpoint identity are ++preserved, since $SIS^{-1}=I$. The address prime is then chosen after ++this conjugation and the triangular factorizations, avoiding their ++finitely many denominators and invertible diagonal numerators as in the ++original construction. ++ ++Only the edges selected for batching need belong to $\mathcal P$. ++All other matrices can continue to use the original rank-by-rank ++compiler. In the present finite network, every selected edge is a ++nonzero scalar multiple of an idempotent: for nested nondegenerate ++labels $U\subset V$, ++\[ ++ (P_V-P_U)^2=P_V-P_U, ++\] ++and reversing the edge only changes its sign. Scalar multiples do not ++change the pivot locations and are absorbed into the triangular factors. ++ ++\paragraph{The contiguous middle pivots.} ++Let $P^2=P$ have rank $a>m/2$, let $r=m-a>0$, and assume its ++first-$r$-row, last-$r$-column corner is invertible. Split the ordered ++coordinates into ++\[ ++ L=[1,r],\qquad M=[r+1,m-r],\qquad R=[m-r+1,m]. ++\] ++The complement $Q=I-P$ has rank $r$. Write $Q=UV$, where $U$ has ++$r$ columns, $V$ has $r$ rows, and $VU=I_r$. Such a factorization ++comes from a basis of $\operatorname{im}Q$. As $L$ and $R$ are disjoint, ++\[ ++ P_{L,R}=-U_LV_R. ++\] ++Its invertibility makes both square matrices $U_L,V_R$ invertible. ++ ++Run the lower-lower elimination in the retained physical order. Its ++first $r$ pivots occupy the rows $L$ and the columns $R$, in some ++permutation. Indeed their corner is invertible, so at each of these ++steps the next row has a nonzero entry in an as-yet active column of ++$R$, which precedes all other candidates in the rightmost-pivot rule. ++The active Schur complement on rows $M\cup R$ and columns $L\cup M$ ++has middle block ++\begin{align*} ++ P_{M,M}-P_{M,R}P_{L,R}^{-1}P_{L,M} ++ &=I-U_MV_M ++ -(-U_MV_R)(-V_R^{-1}U_L^{-1})(-U_LV_M)\\ ++ &=I_{m-2r}. ++\end{align*} ++Thus the next $m-2r$ pivots are precisely the diagonal positions ++$(i,i)$ with $i\in M$. Columns $L$ lie to their left and are cleared ++by the allowed lower-triangular column operations. The remaining ++block has rank zero, because the number of isolated pivots is already ++$r+(m-2r)=m-r=a$. ++ ++Consequently the factorization $P=E_1\Pi E_2$, with $E_1,E_2$ ++invertible lower triangular, has exactly $r$ corner pivots and one ++contiguous identity block of size ++\[ ++ t=m-2r=2a-m. ++\] ++The same conclusion holds for $cP$ with any fixed nonzero rational $c$. ++No assertion that an arbitrary rank-$a$ matrix has this pivot profile ++is needed; the idempotent identity is what makes the middle block ++exactly an identity matrix. ++ ++\paragraph{One call for the identity block.} ++Subdivide each original contiguous chunk into $m$ consecutive fields ++of width $b$. The triangular factors still cost $O(V)$ in the retained ++later-field affine primitive. Each of the $r$ corner pivots uses one ++ordinary width-$b$ interchange. For all $i\in M$ together, perform ++\[ ++ D_i\leftarrow D_i+H_i, ++ \qquad ++ (H_M,D_M)\leftarrow(D_M,H_M), ++ \qquad ++ D_i\leftarrow H_i-D_i, ++\] ++over $\mathbb Z/q^b\mathbb Z$. ++The first and last maps are coordinatewise later-field updates, each ++using a fixed number of linear scans. The middle map is a single ++interchange of the two contiguous width-$tb$ chunks $H_M,D_M$. ++It preserves the order of their $b$-digit fields and hence implements ++all diagonal pivots exactly. The intervening fields are spectators. ++In particular, addition is componentwise modulo $q^b$, not addition ++with carries across the concatenated width-$tb$ chunks. ++ ++The edge cost therefore has $r$ recursive calls of width $b$ and one ++of width $tb$, in place of $a$ calls of width $b$, with the same ++$O(V)$ nonrecursive work. If $a=m$, one may leave the edge in its ++original $m$-singleton form. This avoids any same-width recursion. ++For every batched edge in this paragraph, $0m/2, ++\] ++and there are $2N$ copies. The special negative source matrix contributes ++one rank-one edge on each physical $X$ source, as in PR~\#7. ++Consequently the complete data rank sum is ++\[ ++ 2N\sum_{j=1}^3\bigl(d_j+h-1\bigr)+N=2Nm-N. ++\] ++All remaining auxiliary changes inside an invocation have rank at most ++$h$, and a stage-two auxiliary entrance has rank $h^2-h$. Thus the three ++classes listed above exhaust the ranks exceeding $m/2$, although exhaustion ++is not needed for the certificate: leaving any other edge unbatched can ++only weaken the claimed upper bound. ++ ++Apply the large-projector batching lemma to these classes. A rank-$a_i$ ++projector with $a_i>m/2$ uses $m-a_i$ singleton pivot interchanges and ++one contiguous interchange of $(2a_i-m)$ subfields. The resulting table is ++\[ ++\begin{array}{c|r|r|r|r} ++ \text{class}&\text{copies }B_i&\text{rank }a_i& ++ \text{singleton pivots}&\text{batched width }k_i\\\hline ++ \text{stage 1--3 join}&v^2R&21896&56&21840\\ ++ \text{stage 2 sink}&v^2R&21168&784&20384\\ ++ \text{stage 3 data entrance}&2v^3&21141&811&20330 ++\end{array} ++\] ++Treat every rank unit outside these three middle blocks as a singleton ++interchange. The number of singleton calls is therefore exactly ++\[ ++ S=s-\sum_{i=1}^3B_i k_i. ++\] ++At a parent width $e$, the child widths are $e/m$ with multiplicity $S$ ++and $k_i e/m$ with multiplicity $B_i$; all children operate on streams of ++volume $V/W$. The finite mixed-width recurrence consequently has normalized ++moment ++\[ ++ \Psi(\tau)=\frac{S}{Wm^\tau} ++ +\sum_{i=1}^3\frac{B_i}{W}\left(\frac{k_i}{m}\right)^\tau. ++\] ++At $\tau=1$ this is $s/(Wm)=1-\eta$, where ++$\eta=39/520019360$. ++ ++\paragraph{The intermediate middle-block certificate.} ++This paragraph records the first batching step. The controlled basis in ++the following subsection increases its saving from $177/10^9$ to ++$246/10^9$, which is the value used in the final assembly. ++Set ++\[ ++ a_{\rm b}=\frac{177}{10^9},\qquad \tau=1-a_{\rm b}. ++\] ++Let $r_0=1/m$, $r_i=k_i/m$, and ++\[ ++ w_0=\frac S{Wm},\qquad w_i=\frac{B_i k_i}{Wm}. ++\] ++Then $\sum_iw_i=1-\eta$ and ++$\Psi(1-a_{\rm b})=\sum_iw_i\exp(a_{\rm b}\log(1/r_i))$. ++Use the rational logarithm upper bounds ++\[ ++ \log m<\frac{9997}{1000},\quad ++ \log\frac{196}{195}<\frac{512}{100000},\quad ++ \log\frac{14}{13}<\frac{7411}{100000},\quad ++ \log\frac{21952}{20330}<\frac{768}{10000}. ++\] ++They follow from the positive series ++\[ ++ \log x=2\sum_{j\ge0}\frac{z^{2j+1}}{2j+1},\qquad ++ z=\frac{x-1}{x+1}, ++\] ++using sixteen terms and remainder at most ++$2z^{33}/(33(1-z^2))$; for $m$, first extract its power of two. ++For $0\le t<1$, $e^t\le(1-t)^{-1}$. Calling the four displayed upper ++bounds $\ell_i$, exact rational arithmetic gives ++\[ ++ \Psi(1-a_{\rm b}) ++ <\sum_{i=0}^3\frac{w_i}{1-a_{\rm b}\ell_i}<1. ++\] ++The strict gap in this last bound is greater than $1.78\times10^{-10}$. ++All integers, rational logarithm enclosures, weights and the exact gap are ++supplied by \texttt{scripts/batched\_bit\_rank\_moment.py} and its JSON ++certificate. Under the accompanying arbitrary-width recurrence lemma, ++this proves the interchange saving $a_{\rm b}=177/10^9$ for the unchanged ++finite scalar producer. A smaller role upper bound can be inserted directly ++into the same three-class formula. ++ ++\subsection{A simultaneous basis with one additional contiguous pivot block} ++\label{sec:controlled-projector-basis} ++ ++The three-class rank bound can be strengthened while keeping the finite ++scalar producer unchanged. The additional structure is used only for the ++stage-two auxiliary sink edges. The same rational change of coordinates ++preserves the needed corner-rank conditions on the other two large classes. ++ ++Put $F=\mathbb Q^h$, $V=\mathbb Q^H$, $H=h^2$, and $m=hH$. ++Reorder the tensor factors so that the original third factor is $F$ and the ++first two factors form $V$. List coordinates in the order ++\[ ++ (\alpha,i),\qquad 1\le\alpha\le h,\quad 1\le i\le H, ++\] ++with $i$ varying fastest. Write $\Pi_t$ and $\Pi_q$ for rank-one ++idempotents, and $\Pi_U$ for a rank-$h$ idempotent. The three large ++projector classes then have the following descriptions: ++\begin{align*} ++ A_1&=I-I_F\otimes\Pi_q-\Pi_t\otimes\Pi_U, ++ &\Pi_q\Pi_U=\Pi_U\Pi_q=0,\\ ++ A_2&=(I_F-\Pi_t)\otimes I_V,\\ ++ A_3&=(I_F-\Pi_t)\otimes(I_V-\Pi_q). ++\end{align*} ++Their nullities are $2h$, $H$, and $H+h-1$, respectively. ++For the first class, $q$ spans the line associated with ++$t_B\otimes t_{\pi(A)}$, $U=F\otimes\langle t_A\rangle$, and ++$t=t_B$. The orthogonality in the bank matching gives the displayed ++zero products and, in particular, $q\notin U$. ++The second class is the stage-two sink projection. The third is the ++stage-three data entrance projection. Transposing any of these matrices ++preserves its displayed form, with the corresponding dual rank-one lines ++and subspaces. ++ ++Choose $K\in\operatorname{GL}(V)$ and independent matrices ++$G_i\in\operatorname{GL}(F)$ for $1\le i\le H$. Define ++\[ ++ T(u\otimes e_i)=G_i u\otimes e_i,\qquad S=T(I_F\otimes K). ++\] ++Thus $T$ changes the $h$ first-factor coordinates independently over each ++of the $H$ multiplicity coordinates. The parameters are rational matrices; ++$S$ is a change of basis in the finite address-label space, not a tape ++operation that must be performed on the input streams. ++ ++\begin{lemma}[Simultaneous controlled basis] ++\label{lem:controlled-projector-basis} ++For the finite collection of projectors in the retained $h=28$ motif, ++one can choose $K,G_1,\ldots,G_H$ over $\mathbb Q$ so that: ++\begin{enumerate} ++\item for every $A_1$, the submatrix of $SA_1S^{-1}$ in its first ++ $2h$ rows and last $2h$ columns is nonsingular; ++\item for every $A_3$, the submatrix of $SA_3S^{-1}$ in its first ++ $H+h-1$ rows and last $H+h-1$ columns is nonsingular; ++\item for every $A_2$, the submatrix of $SA_2S^{-1}$ in its first ++ $H$ rows and last $H$ columns is diagonal and nonsingular. ++\end{enumerate} ++\end{lemma} ++\begin{proof} ++First consider the third assertion. The factor $I_F\otimes K$ commutes ++with $A_2$. At multiplicity coordinate $i$, the transformed operator is ++$G_i(I_F-\Pi_t)G_i^{-1}$. Consequently its first-to-last block is diagonal ++in $i$, with diagonal entry ++\[ ++ [G_i(I_F-\Pi_t)G_i^{-1}]_{1,h}. ++\] ++For a nonzero rank-one projector and $h\ge2$, this entry is a nonzero ++rational function of $G_i$: writing $\Pi_t=t\varphi$ with $\varphi(t)=1$, ++it equals $-(e_1^{\mathsf T}G_it)(\varphi G_i^{-1}e_h)$, and the two ++factors can both be made nonzero. Thus the required diagonal entries can ++all be required to be nonzero. ++ ++For the first assertion, let $Q_1=I-A_1$. Its image is the direct sum ++\[ ++ \operatorname{im}Q_1=(F\otimes q)\oplus(t\otimes U). ++\] ++Choose a basis matrix $B$ of the $h$-space $U$. After applying $K$, write ++$q'=Kq$ and $B'=KB$. The nullspace vector parametrized by $u\in F$ and ++$c\in\mathbb Q^h$ has multiplicity-$i$ coordinate ++\[ ++ G_i(q'_i u+tB'_i c). ++\] ++The first $2h$ coordinate rows therefore evaluate ++\[ ++ q'_i\ell_i(u)+\ell_i(t)B'_i c, ++ \qquad \ell_i=e_1^{\mathsf T}G_i,\quad 1\le i\le2h. ++\] ++We show that their determinant is not identically zero in the parameters. ++Choose $K$ so that $q'_i\ne0$ for $1\le i0$, put ++\[ ++ E=64(W+m+1)^3,\quad B=s+E,\quad C_1=5-4\beta+\zeta, ++\] ++\[ ++ C_0=\left\lceil\max\{128mB^2,18mB^2(1+1/\zeta)\}\right\rceil, + \qquad \Delta=\lceil C_0d^{C_1}\rceil. + \] +-For the stated \(h=100\) construction, the complex network has +-\[ +-\begin{split} +- m&=1{,}000{,}000,\\ +- W&=1{,}873{,}807{,}244{,}643{,}542{,}670{,}000,\\ +- s&=1{,}873{,}807{,}244{,}636{,}671{,}267{,}308{,}000{,}000. +-\end{split} +-\] +-These values give \(m^{10}1$. Individually processed ++row, front and back axes are disjoint and number at most $d$, so their ++depth is at most $8d$. The outer phases and $b^D$ conversion add at most ++$\lfloor D/2\rfloor+9$ units, including denominator shifts. Consequently ++\[ ++ A_{\rm layer}\le9mB^2(1+1/\zeta)d^{C_1}+18d ++ \le C_0d^{C_1}. ++\] ++The exact integer comparison for the final inequality is included in the ++certificate. The usual induction gives denominator exponent at most ++$p+\Delta$ and magnitude at most $2^\Delta$. Thus $p+\Delta$ fractional ++bits and $\Delta+3$ integer/sign bits suffice per component. The condition ++$\epsilon C_1<1$ makes these widths $O(p)$, uniformly over the retained ++parameter bands. Integer power comparisons implement the rational guard ++ceilings in polynomial descriptor time. + + \begin{proposition}[Simultaneous normalized butterfly layer] + \label{prop:simultaneous-layer} +-Fix +-\[ +- \tau=\sigma=1-2^{-50},\qquad \beta=\frac12,\qquad C_1=20. +-\] +-Let $c,\epsilon,\lambda,\lambda'$ be fixed positive rational numbers +-satisfying +-\[ +- \max\{\tau,\sigma\}<\lambda<1,\qquad +- \tau(1+c/\beta)<\lambda,\qquad +- \max\{\lambda,\sigma+\beta(1-\sigma)\}<\lambda'<1, +- \qquad \epsilon C_1<1. ++Fix $\tau=1-3/400000000$ and $\sigma=1-39/10^9$. ++Let $c,\epsilon,\lambda,\lambda',\beta,\zeta$ be fixed positive rational numbers ++with $0<\beta<1$, and put ++\[ ++ C_1=5-4\beta+\zeta,\qquad ++ \chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}. ++\] ++Require ++\[ ++ \max\{\tau,\sigma,\chi\}<\lambda<\lambda'<1,\qquad ++ \max\{\sigma+\beta(1-\sigma),1-c,0\}<\lambda',\qquad ++ \epsilon C_1<1. + \] + Fix positive constants $a_d\le b_d$ and $a_r\le b_r$, and fix + positive constants $C_M,C_{\rm desc},C_w$ with $C_w>1$. +@@ -909,10 +975,11 @@ + The procedure evaluates the entire layer exactly before this final + truncation. Put + \[ +- C_0=128m\bigl(s_{\rm c}+64(W_{\rm c}+m+1)^3\bigr)^2, ++ C_0=\left\lceil\max\{128mB^2,18mB^2(1+1/\zeta)\}\right\rceil, ++ \qquad B=s_{\rm c}+64(W_{\rm c}+m+1)^3, + \] + where $m,W_{\rm c},s_{\rm c}$ are the fixed constants of +-Proposition~\ref{prop:complex-motif-interface}. The procedure uses ++Proposition~\ref{prop:prime-field-complex-interface}. The procedure uses + at most $p+\lceil C_0d^{C_1}\rceil$ fractional bits and + $\lceil C_0d^{C_1}\rceil+3$ integer and sign bits per real component + internally; these widths are $O(p)$. The time includes address changes, +@@ -928,7 +995,7 @@ + descriptor work above. + The phase-frame construction reduces a group of $e$ selected bits to + $s_{\rm c}$ children on $e/m$ selected bits. The row split gives +-each child $1/W_{\rm c}$ of the parent's logical volume. The packed ++each child $1/W_{\rm c}$ of the parent's logical volume. The compact-control + selected-bit procedure supplies the binary basis changes. We verify + that its cost is uniform over the displayed bands for $d,r$. + Put $\Delta=\lceil C_0d^{C_1}\rceil$. Since $d\le b_dp^\epsilon$ +@@ -951,26 +1018,26 @@ + + Uniformly for large $p$, the bands give $f\le d\le p$ and + \[ +- K\ge\tfrac12a_d^c p^{\epsilon c},\qquad ++ K\ge\tfrac12a_d^cp^{\epsilon c},\qquad + r\ge2^{(a_r/b_d)p^{1-\epsilon}}. + \] +-The first inequality follows from $K=\lfloor d^c\rfloor$ once +-$d^c\ge2$. In particular, $K\ge6$ and $K/\log p\to\infty$, while +-$r$ dominates every fixed polynomial. Substituting the common bound +-$A_*\le C_Ap$ into the two additional normalized +-terms in \eqref{eq:packed-rectangle-time} gives +-\[ +-\begin{aligned} +- \frac{A_*^3}{R_{\rm g}} +- &\le\frac{C_A^3p^2}{2r},\\ +- 80(f-1)2^{-K}A_*\left(1+\frac{A_*}{R_{\rm g}}\right) +- &\le80C_Ap^2 2^{-K}\left(1+\frac{C_A}{2r}\right). +-\end{aligned} +-\] +-Both bounds tend to zero uniformly over all current allowed $d,r$. +-Thus Lemma~\ref{lem:packed-selected-bit-rectangle} has the required +-$O(M_{\rm child}R_{\rm g}(L^\tau+1))$ cost for every packed call, +-with one common time constant. ++Thus $K/\log p\to\infty$, $r$ dominates every fixed polynomial, and ++$G=4\lceil\log_2p\rceil+6$ eventually obeys ++$K\ge G+4\lceil\log_2p\rceil+10$. Every role stream retains both complete ++front fields and the complete back field outside its row index. The above ++$A_*\le C_Ap$ bound applies to each compact rectangle. For its repair, ++\[ ++ \frac{A_*^3}{R_{\rm g}}\le\frac{C_A^3p^2}{2r},\qquad ++ \delta A_*\left(1+\frac{A_*}{R_{\rm g}}\right) ++ \le\frac{5C_A}{128p^2}\left(1+\frac{C_A}{2r}\right). ++\] ++The wider-control rotation bound is also uniform, because every polynomial ++offset charge divided by $R_{\rm g}$ tends to zero. Hence ++Proposition~\ref{prop:compact-selected-addition} costs ++$O(M_{\rm child}R_{\rm g}((f\log p)^\tau+1))$ with a common constant. ++Reservation preprocessing costs ++$O(V(\log(2d)+d^{\max\{1-c,0\}}\log p+1))$ and is included by the ++strict condition $1-c<\lambda'$. + The row construction and the recurrence analysis + above give total time $O(Vd^{\lambda'})$ on fixed tapes, including + all padded and auxiliary streams. Equation~\eqref{eq:phase-butterfly-layer} +@@ -994,3 +1061,641 @@ + $2^{-p}$. The truncated numerators have magnitude at most $2^p$, + so the supplied component width can hold them. + \end{proof} ++ ++\subsection{The active bulk-recursion construction} ++The uniform recursion and its guard above remain a separate baseline, ++with their original fixed exponents. We now use the stronger bit ++interchange of Lemma~\ref{lem:batched-chunk-swap} and change the complex ++children to whole residuals. The selected-bit movement lemmas and ++Proposition~\ref{prop:compact-selected-addition} take the exponent of ++their interchange routine as a parameter: their proofs use only its ++$O(Vu^\tau)$ interface. They therefore apply with ++$\tau=1-246/10^9$ in the following construction. ++\subsection{The weighted arithmetic-path budget} ++\label{sec:pathwise-guard} ++ ++The precision analysis uses the length of an arithmetic dependency path ++through the framed complex network. We first measure this path in ++directional rank units, before grouping some units into bulk children. ++ ++\paragraph{A weighted path bound.} ++Use the retained triple-based complex motif on $h$ points, with ++$m=h^3$. This includes the paired complex producer and its shared ++first- and third-stage auxiliary banks. Regard every scalar gate as a ++map from saved inputs to its outputs. All of its inputs and outputs ++have one common subspace label. A directed dependency path can therefore ++enter a gate on one physical wire and leave on another without changing ++label dimension at the gate itself. ++ ++For a network edge $a$, let $U_a^-$ and $U_a^+$ be its labels and write ++$r_a=|\dim U_a^+-\dim U_a^-|$. The edge implementation has exactly ++$r_a$ recursive calls, each implementing one directional $C$ tensor ++on $e/m$ selected axes. Binary changes of coordinates before and after ++these calls permute coefficients and add no arithmetic depth. An inverse ++direction is implemented using one forward child and its sign and ++fourth-root wrappers, so it has the same recursive-call count. ++ ++If $P$ is a directed scalar dependency path, its common gate labels give ++the exact identity ++\[ ++ \sum_{a\in P}r_a ++ =\dim U_{\rm end}-\dim U_{\rm start} ++ +2\sum_{\substack{a\in P\\\dim U_a^+<\dim U_a^-}} ++ (\dim U_a^--\dim U_a^+). ++\] ++The endpoint difference is at most $m$. ++ ++Every side-producer edge is increasing. This follows from nested source ++labels for the nonconstant middle mixer, complemented labels in its ++reverse-direction counterpart, and constant early and late frames. ++The data-wire and interstage edges are increasing as in the retained ++motif. The stage-sharing joins are also increasing. The only decreasing ++edges are the retained central returns, each of dimension loss $h$. ++ ++There are three tensor stages. Within a stage, the $v^2$ invocations ++use disjoint data and auxiliary wires, and each invocation has a single ++central-return frontier. Equivalently, its point and total central wires ++all return between the same two blocks of the transparent schedule. ++A directed path crosses that frontier at most once. Gates acting on ++different invocations do not connect their wires. Thus a path encounters ++at most one central return per stage, even though the machine executes ++all invocations sequentially on its fixed tapes. Sharing stage-1 and ++stage-3 banks only links their existing stage boundaries and creates no ++additional return. Consequently ++\begin{equation}\label{eq:pathwise-child-bound} ++ \sum_{a\in P}r_a\le q:=m+6h. ++\end{equation} ++The bound also applies to a path ending at an intermediate gate or inside ++an edge implementation: complete its current edge, and then any suffix ++to a terminal vertex. All weights are nonnegative. ++ ++\paragraph{From a scalar path to a coefficient path.} ++A coefficient dependency path in the actual tape algorithm projects to ++a directed path of the scalar network: inside a scalar gate it follows ++one of the saved operands that contributes to the chosen output; inside ++an edge it stays on the edge's role stream. A child can permute or combine ++addresses within that role, but cannot move a value into a different ++parent role. The row split, parking, padding and reassembly operations ++do not create arithmetic dependencies between distinct parent roles. ++This projection justifies using \eqref{eq:pathwise-child-bound} for the ++implemented recursion, rather than merely for a drawn finite circuit. ++ ++\subsection{A whole-residual complex child} ++\label{sec:bulk-complex-child} ++ ++The complex phase interface admits a further batching step. On an edge ++with residual dimension $a$, the existing binary change of basis puts ++an orthonormal residual basis into the first $a$ slots. If each slot has ++$f$ selected axes, those first $a$ slots form one contiguous interval ++of $af$ axes. Instead of $a$ child calls on $f$ axes, use one child ++on that interval. ++ ++The directions need not all have the same sign. A basis vector's weight ++modulo four may make its directional kernel an inverse even on an ++increasing edge. Let $B$ be the set of negative residual slots and ++let $Z_B$ multiply an address by $-1$ precisely when the parity of its ++selected bits in those slots is odd. The exact identity ++$C^{-1}=-iZCZ$ gives ++\[ ++ \bigotimes_{j=1}^{a}(C^{\varepsilon_j})^{\otimes f} ++ =(-i)^{f|B|}Z_B C^{\otimes af}Z_B, ++ \qquad \varepsilon_j\in\{1,-1\}. ++\] ++Thus one forward child, two address-sign passes and one fixed ++fourth-root phase implement the mixed signs. The same binary basis ++changes before and after the child are retained. The wrappers cost ++$O(V)$: their sign is computed from the current address descriptor, ++whose polynomial work per record is absorbed by the existing ++superpolynomial record length. They introduce at most four elementary ++coefficient operations per value and no further recursive call. ++ ++We batch only the two specified auxiliary edge classes of ranks ++\[ ++ a_1=m-2h,\qquad a_2=m-h^2. ++\] ++All other edges continue to use their old one-direction children. ++The first class is the increasing join between a completed stage-1 ++auxiliary bank, at dimension $h$, and its matched stage-3 bank, at ++dimension $m-h$. The second is the stage-2 auxiliary exit from ++dimension $h^2$ to the full terminal frame. These are complete ++auxiliary banks, including the central roles when those are shared. ++If a width bound requires padding, add dummy auxiliary roles with ++identity scalar gates at the ordinary low and high frames before ++matching the first- and third-stage banks. Their labels only increase, ++their arbitrary scalar values are restored, and both counted auxiliary ++classes are then present for every padded role. The changed ++volume-weighted time expression is consequently ++\[ ++ \frac1W\left[ ++ \left(s-n_1a_1-n_2a_2\right)m^{-\sigma} ++ +n_1\left(\frac{a_1}{m}\right)^\sigma ++ +n_2\left(\frac{a_2}{m}\right)^\sigma ++ \right], ++\] ++where $n_1,n_2$ count the chosen edges. It has value $s/(Wm)<1$ ++at $\sigma=1$. Strict comparison below one supplies the new complex ++recursion exponent. The separate mixed-width row construction handles ++$f=\lfloor e/m\rfloor$, the at most $m-1$ individually processed ++remaining axes, and a row reservation sufficient for the longer but ++still $O(\log d)$ recursion. ++ ++\subsection{A depth guard for the unequal complex children} ++\label{sec:bulk-complex-guard} ++ ++The dependency-path argument of Section~\ref{sec:pathwise-guard} ++still bounds the sum of edge ranks on one scalar path by ++\[ ++ q=m+6h. ++\] ++For $h=28$ its relevant constants are ++\[ ++ m=21952,\quad q=22120,\quad a_1=21896,\quad a_2=21168. ++\] ++Both selected ranks exceed $q/2$. Therefore every arithmetic dependency ++path encounters at most one selected bulk edge. At a call on $e$ axes, ++put $f=\lfloor e/m\rfloor$. Ignoring the local additive operations, ++the path has one of the following child-depth bounds: ++\[ ++ qA(f),\qquad ++ (q-a_1)A(f)+A(a_1f),\qquad ++ (q-a_2)A(f)+A(a_2f). ++\] ++The weight budget accounts for both increasing and decreasing frame ++edges and for paths that switch wires at a scalar gate. Inverse-child ++and endpoint sign corrections add no child. Individually processing ++the fewer than $m$ leftover axes adds at most $8m$ elementary ++operations, absorbed into the local constant below. ++ ++Take $\rho=6/5$. The following three normalized path expressions have ++a rational common upper bound strictly below one: ++\begin{equation}\label{eq:bulk-path-moments} ++ \max\left\{\frac q{m^\rho},\quad ++ \frac{q-a_1}{m^\rho}+\left(\frac{a_1}m\right)^\rho,\quad ++ \frac{q-a_2}{m^\rho}+\left(\frac{a_2}m\right)^\rho\right\} ++ <\overline\theta:=\frac{999}{1000}. ++\end{equation} ++Here is an entirely rational verification. First ++$160000^5160000$. For $00$, set ++\[ ++ C_1=\rho-(\rho-1)\beta+\zeta, ++ \qquad ++ C_0=\left\lceil128m(1+1/\zeta)C_{\rm dep}\right\rceil, ++ \qquad \Delta=\lceil C_0d^{C_1}\rceil. ++\] ++The root bound from \eqref{eq:bulk-depth-power} is ++$C_{\rm dep}d^{\rho-(\rho-1)\beta}$. This covers the direct arbitrary-width ++root construction; it also covers every retained base-$m$ piece. ++Even retaining the older bound of ++$m(1+1/\zeta)d^\zeta$ such pieces, their concatenation, all reserved ++axis kernels, the outer phases and the $b^D$ conversion have depth ++at most $C_0d^{C_1}$. The original elementary-depth induction ++therefore supplies exact denominator and magnitude guards of ++$p+\Delta$ fractional bits and $\Delta+3$ integer/sign bits. ++The width remains $O(p)$ when $\epsilon C_1<1$. ++ ++In particular, $\beta=1/1000$ and $\zeta=1/10000$ give ++\[ ++ C_1=\frac{11999}{10000},\qquad ++ 1-\frac{7999999}{16000000}C_1 ++ =\frac{64008011999}{160000000000}>0. ++\] ++Thus bulk complex children preserve the near-half dimension exponent ++while allowing the improved complex time exponent to be used with ++almost no loss at the stopping leaves. ++ ++\subsection{The complex layer with unequal recursive axis counts} ++\label{sec:mixed-complex-layer} ++ ++Apply the same integer-depth construction to the complex circuit's list ++of child sizes. For a selected residual of rank $a\tau$, every internal width is at least $d^\beta$, so ++$e^\tau\le d^{\beta(\tau-\sigma)}e^\sigma$; summing the strict ++$\sigma$-moment gives ++$O(G^\tau d^{\sigma+\beta(\tau-\sigma)})$. ++Thus in both cases, with ++\[ ++ \chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}, ++\] ++the complete normalized layer cost is ++\[ ++ O\!\left((\log p)^3\left[ ++ d^\chi+d^{\sigma+\beta(1-\sigma)} ++ +d^{\max\{1-c,0\}}+1\right]\right). ++\] ++The displayed logarithmic factor conservatively retains the existing ++layout and descriptor allowances. Hence the original strict conditions ++\[ ++ \max\{\tau,\sigma,\chi\}<\lambda<\lambda'<1, ++ \qquad ++ \max\{\sigma+\beta(1-\sigma),1-c,0\}<\lambda' ++\] ++continue to imply the complete $O(Vd^{\lambda'})$ layer bound. ++ ++\paragraph{Compatibility with the new dependency guard.} ++The separate dependency-path estimate uses $q=m+6h=22120$, observes that ++one path crosses at most one selected bulk residual, and bounds its ++$\rho$-moment by ++\[ ++ \max\left\{ ++ \frac q{m^\rho},\quad ++ \frac{q-a_1}{m^\rho}+\left(\frac{a_1}{m}\right)^\rho,\quad ++ \frac{q-a_2}{m^\rho}+\left(\frac{a_2}{m}\right)^\rho ++ \right\}<\frac{999}{1000} ++ \quad\left(\rho=\frac65\right). ++\] ++Integer floors only shrink these children. For sufficiently large $d$, ++an internal parent has $e\ge d^\beta\ge2m$, hence every recursive child ++has width at least $\lfloor e/m\rfloor\ge d^\beta/(2m)$ whenever it ++becomes a stopping leaf. The at most $m-1$ individually processed ++remainder axes at each internal node belong to its fixed local overhead; ++add their bounded coefficient contribution to the guard's fixed constant ++$E$. They are not extra arbitrarily small stopping leaves. Thus the ++separately established guard exponent ++\[ ++ C_1=\rho-(\rho-1)\beta+\zeta ++ =\frac65-\frac\beta5+\zeta ++\] ++applies to this integer-width implementation. All stopping tests can be ++performed by the existing rational-power integer comparison. ++\subsection{An exact complex exponent after bulk recursion} ++\label{sec:batched-complex-parameters} ++ ++Keep the paired complex producer of PR~\#7. Its constants are ++\[ ++ h=28,\quad v_{\rm c}=\binom{28}{3}=3276,\quad m=21952, ++ \quad R_{\rm c}=93838. ++\] ++There are $R_{\rm c}+h+1=93867$ auxiliary roles per invocation, including ++the original central roles. Write ++\[ ++ B_{\rm c}=v_{\rm c}^2(R_{\rm c}+h+1)=1007397164592, ++\] ++\[ ++ W_{\rm c}=2v_{\rm c}^2(v_{\rm c}+R_{\rm c}+h+1)=2085111546336, ++\] ++\[ ++ L_{\rm c}=3v_{\rm c}^2h(h+1)=26143580736, ++ \qquad ++ s_{\rm c}=W_{\rm c}m-2v_{\rm c}^3+2L_{\rm c}=45772350635112192. ++\] ++The two selected whole-residual classes have ranks $a_1=21896$ and ++$a_2=21168$, each with $B_{\rm c}$ copies. The number of remaining ++singleton children is ++\[ ++ S_{\rm c}=s_{\rm c}-B_{\rm c}(a_1+a_2)=2389799139122304. ++\] ++Their time moment is ++\[ ++ \Xi(\sigma)=\frac{S_{\rm c}}{W_{\rm c}m^\sigma} ++ +\frac{B_{\rm c}}{W_{\rm c}} ++ \left[\left(\frac{a_1}{m}\right)^\sigma ++ +\left(\frac{a_2}{m}\right)^\sigma\right]. ++\] ++At $\sigma=1$, this equals ++$1-\eta_{\rm c}$ with $\eta_{\rm c}=5/12693352$. ++ ++Take ++\[ ++ a_{\rm c}=\frac7{10^7},\qquad \sigma=1-a_{\rm c}. ++\] ++The same positive logarithm series used in the bit certificate gives ++\[ ++ \log m<\frac{9997}{1000},\qquad ++ \log\frac m{a_1}=\log\frac{392}{391}<\frac{2555}{10^6}, ++ \qquad ++ \log\frac m{a_2}=\log\frac{28}{27}<\frac{36368}{10^6}. ++\] ++Let these upper bounds be $\ell_0,\ell_1,\ell_2$ and put ++\[ ++ w_0=\frac{S_{\rm c}}{W_{\rm c}m},\qquad ++ w_i=\frac{B_{\rm c}a_i}{W_{\rm c}m}\quad(i=1,2). ++\] ++The exact rational comparison is ++\[ ++ \Xi(1-a_{\rm c}) ++ <\sum_{i=0}^2\frac{w_i}{1-a_{\rm c}\ell_i}<1. ++\] ++The gap in the last inequality is ++\[ ++ \frac{24132873235669673777179671369131} ++ {1525632551364197359955324563293421369131} ++ >1.58\times10^{-8}. ++\] ++This certifies the stronger complex exponent with the unchanged ++finite producer and the new whole-residual recursion. ++ ++\begin{proposition}[Batched simultaneous normalized butterfly layer] ++\label{prop:batched-simultaneous-layer} ++Fix $\tau=1-246/10^9$ and $\sigma=1-7/10^7$. ++Let $c,\epsilon,\lambda,\lambda',\beta,\zeta$ be fixed positive rational numbers ++with $0<\beta<1$, and put ++\[ ++ C_1=6/5-\beta/5+\zeta,\qquad ++ \chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}. ++\] ++Require ++\[ ++ \max\{\tau,\sigma,\chi\}<\lambda<\lambda'<1,\qquad ++ \max\{\sigma+\beta(1-\sigma),1-c,0\}<\lambda',\qquad ++ \epsilon C_1<1. ++\] ++Fix positive constants $a_d\le b_d$ and $a_r\le b_r$, and fix ++positive constants $C_M,C_{\rm desc},C_w$ with $C_w>1$. ++For these fixed choices ++there are a cutoff $p_0$, one fixed finite-alphabet multitape procedure, ++and an implicit time constant with the following guarantee. The cutoff ++and time constant may depend on the fixed rational parameters ++and these constants. For every choice of positive integers $p,d,r$ ++with $p\ge p_0$ and ++\[ ++ a_dp^\epsilon\le d\le b_dp^\epsilon,\qquad ++ 2^{a_rp/d}\le r\le 2^{b_rp/d}, ++\] ++put $K=\lfloor d^c\rfloor$, and let $1\le D\le d$, $P,S\ge1$, and ++$0\le\rho100$, $2\leq sp/\alpha^4. ++be integers, with $\gcd(s,t)=1$. Put $\sigma=t/s$ and ++$\theta:=\sigma-1$, and assume ++\[ ++ \alpha^{-2}\le\theta\le\tfrac14,\qquad ++ n_{\alpha,\theta}:=\min\Bigl\{\Bigl\lceil\frac p{\alpha^2\theta}\Bigr\rceil, ++ \Bigl\lceil\frac{p+1}{4\alpha^2}+\frac1\theta\Bigr\rceil\Bigr\}. + \] + Define coordinate permutations by + \[ +@@ -70,11 +77,12 @@ + There are fixed multitape algorithms for approximations + $\widetilde A:\mathbb D_p^s\to\mathbb D_p^t$ and + $\widetilde B_0:\mathbb D_p^t\to\mathbb D_p^s$, each with error less +-than $p^2$ and time +-\[ +- O(tp^{3/2+\delta}\alpha). +-\] +-The constant is uniform in $p,s,t,\alpha$. Inputs and outputs use the ++than $p^2$, using respectively ++\[ ++ O((t+p)p^{1+\delta})\quad\text{and}\quad ++ O(n_{\alpha,\theta}(t+p)p^{1+\delta}) ++\] ++time. The constants are uniform in $p,s,t,\alpha$. Inputs and outputs use the + scalar component format above and occur in increasing coordinate order. + \end{lemma} + +@@ -113,8 +121,10 @@ + \end{equation} + The first identity uses the negative Fourier sign in our definition of + $F_q$; its right-hand permutation is consequently multiplication of the +-frequency by $-s$. Since $\alpha^2p/\alpha^4$, we have +-$\alpha^2\theta>p/\alpha^2>1$. Thus $\|N-I\|<1/2$, so $N$ is invertible ++frequency by $-s$. The cited Lemma~4.6 assumes only $\alpha^2\theta\ge1$, ++which holds here; it gives $\|N-I\|<2.01e^{-\pi/2}<0.42$. The proof of the cited ++Proposition~4.7(i) uses only this bound, $\alpha\ge2$ and the cited Lemma~4.5, ++so its norm bounds below also hold. Thus $\|N-I\|<1/2$, so $N$ is invertible + by the Neumann series. Put + \[ + \mathsf S'=\mathsf S/2,\qquad +@@ -147,17 +157,24 @@ + which is \eqref{eq:no-sort-one-dimensional}. + + \paragraph{Ordered numerical maps.} +-Lemmas~4.8, 4.9 and 4.12 of +-\cite{HarveyHoeven2021} supply the following algorithms. Their inputs +-and outputs are in increasing coordinate order, and every output is in +-the disk grid. The record conversions and tape movement needed to use +-these routines in our format are accounted for below. Their numerical +-guarantees are ++Lemma~4.8 of \cite{HarveyHoeven2021} supplies $\widetilde{\mathsf D}'$. ++Lemma~\ref{lem:chirped-gaussian} below supplies $\widetilde{\mathsf S}'$ ++and an approximation $\widetilde E$ of $E=N-I$ by chirped correlations. ++For $\widetilde{\mathsf J}'$ we use the Neumann evaluation of ++\cite[Lemma~4.12]{HarveyHoeven2021} with this $\widetilde E$ and with ++$n_{\alpha,\theta}$ terms. Its error analysis uses only $\|E\|<1/2$, ++$\varepsilon(\widetilde E)

4\pi$, the inner sum is less than ++$2e^{-\pi\alpha^2\sigma}(1+2e^{-3\pi\alpha^2\sigma})<2.01e^{-\pi\alpha^2\sigma}$. ++\end{proof} ++ ++The original estimate $\|E\|^n<2^{-\alpha^2\theta n}$ gains only ++$\alpha^2\theta$ bits per term. The lemma gains about ++$\pi\alpha^2\log_2e$ bits per term after a burn-in of order ++$\alpha^2/\theta$ bits. ++ ++\begin{corollary} ++\label{cor:neumann-count} ++Assume $\alpha\geq2$, $\alpha^2\theta\geq1$ and $\theta<1$, and let ++$n_{\alpha,\theta}$ be as in Lemma~\ref{lem:no-sort-resampling}. ++Then $n_{\alpha,\theta}\leq p$ and $\|E^{n_{\alpha,\theta}}\|\leq2^{-p}$. ++\end{corollary} ++ ++\begin{proof} ++If $n_{\alpha,\theta}=\lceil p/(\alpha^2\theta)\rceil$, then ++$n_{\alpha,\theta}\le p$ and $\|E^{n}\|\le\|E\|^n<2^{-\alpha^2\theta n}\le2^{-p}$ ++by \eqref{eq:gaussian-public-facts}. Otherwise ++$n=n_{\alpha,\theta}\geq(p+1)/(4\alpha^2)+1/\theta$ and $n<\lceil p/(\alpha^2\theta)\rceil\le p$. ++Put $\kappa_0=\pi\log_2e$, so $4.531<\kappa_0<4.534$, and note ++$\log_22.01<1.01$. Taking base-two logarithms in ++Lemma~\ref{lem:correction-powers}, ++\[ ++ \log_2\|E^n\|\leq\kappa_0\alpha^2\Bigl(\frac1{4\theta}+\frac12\Bigr) ++ -n(\kappa_0\alpha^2\sigma-1.01). ++\] ++Since $\sigma>1$ and $\alpha\ge2$, the last bracket is at least ++$4\alpha^2$. Also $4.534(1/(4\theta)+1/2)\le4/\theta$ because ++$\theta<1$. Hence ++$\log_2\|E^n\|\leq4\alpha^2/\theta-4\alpha^2n\leq-p-1$. ++\end{proof} ++ ++\begin{lemma}[Gaussian maps by chirped correlation] ++\label{lem:chirped-gaussian} ++Assume the hypotheses of Lemma~\ref{lem:no-sort-resampling}. There are ++fixed multitape algorithms computing approximations ++$\widetilde{\mathsf S}':\mathbb D_p^s\to\mathbb D_p^t$ of $\mathsf S'$ ++and $\widetilde E:\mathbb D_p^s\to\mathbb D_p^s$ of $E$, with errors less ++than $16p$ and $p/3$ respectively, outputs in the disk grid, and time ++$O((t+p)p^{1+\delta})$ each. Inputs and outputs occur in increasing ++coordinate order. The constants are uniform in $p,s,t,\alpha$. ++\end{lemma} ++ ++\begin{proof} ++\emph{Chirp identity.} For a rational $y$ and integers $a,b$, put ++$\hat a=a+y/\sigma$. Expanding both sides and using $\sigma-\theta=1$, ++\[ ++ (\sigma\hat a-b)^2 ++ =\sigma\theta\hat a^2+\sigma(\hat a-b)^2-\theta b^2 . ++\] ++Hence, for rational $\lambda>0$, ++\begin{equation}\label{eq:chirp-split} ++ e^{-\pi\lambda(\sigma a+y-b)^2} ++ =e^{\pi\lambda\theta b^2}\, ++ e^{-\pi\lambda\sigma\theta(a+y/\sigma)^2}\, ++ e^{-\pi\lambda\sigma(a-b+y/\sigma)^2}. ++\end{equation} ++For inputs $f_a$, $0\le a100$, so $\Gamma=\lceil1.4p\rceil$ suffices. Take ++$P=3p$, and apply the factor $(2\alpha)^{-1}$ by one more product at ++precision $P$. Each output then has error less than ++$2^{-p}(1+1/4+1)<3\cdot2^{-p}$, and its norm is less than ++$\|\mathsf S'\|+3\cdot2^{-p}<1$. ++ ++\emph{The map $E$.} With $f_j=e^{\pi\alpha^2\beta_j^2}u_j$ and ++$\lambda=\alpha^2$, the definition of $N$ gives ++\[ ++ (Nu)_\ell=\sum_je^{-\pi\lambda(\sigma j-q_\ell)^2}f_j, ++\] ++and its term $j=\ell$ is exactly $u_\ell$. The inputs $f_j$ are formed by ++Lemma~2.14 of \cite{HarveyHoeven2021} for ++$2^{-\lceil1.14\alpha^2\rceil}e^{\pi\alpha^2\beta_j^2}$, a shift, and one ++product with $u_j$. Put $B=\lceil1.14\alpha^2\rceil$ and $F=2^B$. ++The shift multiplies the generator's absolute error by $2^B$; ++including the product and rounding, the input errors are at most ++$2^{4-P}F$. This same $F$ also bounds $|f_j|$. Let ++$m=\lceil\sqrt p/(2\alpha)\rceil$, the window of ++\cite[Lemma~4.11]{HarveyHoeven2021}. Partition $0\le\ell100$. In particular it bounds the shifted ++approximation error as well as the exact chirp magnitude. Moreover, ++\[ ++ \pi\lambda\theta b'^2\le\pi\theta\alpha^2(2m+2)^2 ++ \le\frac\pi4\bigl(\sqrt p+4\alpha\bigr)^2<\frac{25\pi}4p, ++\] ++so $\Gamma=29p$ suffices, using ++$(\sqrt p+4\alpha)^2<25p$ and $\theta\le1/4$. ++For $\alpha\ge2$ and integer $p>100$, ++$L_A=3\lceil\sqrt p/(2\alpha)\rceil+1\le p$ and ++$\lceil\log_2 L_A\rceil\le p-1$. Hence the block precision requirement is ++\[ ++ p+\Gamma+\lceil\log_2(FL_A)\rceil+11 ++ \le 32.14p+11<34p. ++\] ++Thus $P=34p$ still suffices with the enlarged error enclosure. ++Select the outputs ++$b=q_\ell$ in order, subtract the exact $u_\ell$, and round. The block ++contains every term $0<|h|\le m$ of the truncated sum in that lemma, so ++the computed $(\widetilde Eu)_\ell$ differs from $(Eu)_\ell$ by less than ++$(3+1+1)2^{-p}<(p/3)2^{-p}$. Its norm is less than ++$\|E\|+5\cdot2^{-p}<1$. ++ ++\emph{Cost and tape movement.} The selected indices $q_\ell$, the numerators ++$s\beta_\ell$, and the block offsets are generated by the ++counters already used for $C$, in $O(p)$ time per index. Before a line, ++copy $u$ with $3m+3$ periodic records appended at each end, in $O((s+m)p)$ ++time; then every block reads one consecutive interval. Consecutive input ++intervals overlap in $O(m)$ records, so all reads, packing and unpacking ++cost $O((t+m)p)$. There are $O(t/m+1)$ blocks, each costing ++$O(mp^{1+\delta})$; in both cases $m<2p$. This gives the time bound ++$O((t+p)p^{1+\delta})$. + \end{proof} + + \subsection{Growing dimension and the padded array} +@@ -322,15 +555,15 @@ + Also write $F_{\boldsymbol q}^+=\bigotimes_iF_{q_i}^+$. + Both $\mathcal A$ and $\mathcal B_0$ are contractions. The linewise + implementations of $\mathcal A$ and $\mathcal B_0$ each have error +-less than $dp^2$. The total time spent in the +-one-dimensional algorithms for both maps is +-$O(dTp^{3/2+\delta}\alpha)$, with a constant independent of $d$. ++less than $dp^2$. Put $n_*=\max_in_{\alpha,\theta_i}$. If every ++$t_i\ge p$, the total time spent in the one-dimensional algorithms for both ++maps is $O(dTp^{1+\delta}(1+n_*))$, with a constant independent of $d$. + + If each $t_i\in\{r/2,r\}$ with $r=2^\ell$, the array is kept in the + full padded box of $T$ entries, and each entry occupies $O(p)$ bits, + then exposing and restoring all the lines costs + \[ +- O\bigl(Tp\,d^2(1+\ell^\tau)\bigr) ++ O\bigl(Tp\,d(1+\ell^\tau)\bigr) + \] + using the equal-width chunk-swap bound $O(Vu^\tau)$ and the fixed-digit + movement primitive. Any fixed polynomial in $p$ of setup per line is +@@ -368,30 +601,59 @@ + so their cost is bounded by + \[ + \sum_{i=1}^d\frac{T}{t_i} +- O(t_i p^{3/2+\delta}\alpha) +- =O(dTp^{3/2+\delta}\alpha). +-\] ++ O\bigl(n_*(t_i+p)p^{1+\delta}\bigr) ++ =O(dTp^{1+\delta}(1+n_*)), ++\] ++using $t_i\ge p$. + Initial padding costs $O(Tp)$, and scanning and zeroing the remaining + lines costs $O(Tp)$ per axis. Both are within the same bound. + All calls reuse one fixed collection of work + tapes. Loop indices and the growing shape descriptor reside on tapes; + they are not extra heads. + +-The descriptor records which coordinate each physical address field +-holds. Thus moving fields changes their positions, but not the validity +-conditions above. To move an axis past its neighbor, interchange their +-$\ell$-bit or $(\ell-1)$-bit address fields. Equal widths use +-Lemma~\ref{lem:chunk-swap}. For unequal widths, write the longer field as +-a leading bit $e$ followed by $\ell-1$ bits. If it comes first, the order +-is $e\,x\,y$, with $x,y$ of equal width. Interchange $x,y$, then move $e$ +-between them, obtaining $y\,e\,x$. If the longer field comes second, +-first move its leading bit left of the shorter field, then interchange +-the two equal-width pieces. The bit move uses +-Lemma~\ref{lem:elementary-streams}. Each adjacent interchange therefore +-costs $O(Tp(1+\ell^\tau))$. Exposing and restoring one axis needs +-$O(d)$ adjacent interchanges, hence all axes need $O(d^2)$. These are +-exact permutations of the padded box, so they change neither norms nor +-errors. ++The descriptor records which named coordinate each physical address field ++holds, together with its width and valid range. Before processing axis $i$, ++interchange its entire address field with the innermost field; after processing ++its lines, undo precisely that interchange. If it is already innermost, no ++interchange is needed. Thus each axis starts and ends in the original field ++order, and all axes together require at most $2(d-1)$ field interchanges. ++ ++These interchanges need not be adjacent. Lemma~\ref{lem:batched-chunk-swap} permits ++an arbitrary intervening field $[G]$, obtained by collapsing the intervening ++axes, and a suffix containing the complete coefficient word. For widths that ++differ by one, use the explicit nonadjacent construction following that lemma. ++Suppressing the prefix and suffix, its two cases are ++\[ ++ (e,x,G,y)\longmapsto(e,y,G,x)\longmapsto(y,G,e,x), ++\] ++\[ ++ (x,G,e,y)\longmapsto(e,x,G,y)\longmapsto(e,y,G,x), ++\] ++where $x,y$ have equal bit width and $e$ is one bit. Each uses one equal-width ++interchange and one single-bit move. Empty equal-width pieces require no swap. ++The intervening axes keep their internal order, and each complete record keeps ++its bit order. The cost of a full field interchange is ++$O(Tp(1+\ell^\tau))$, including workspace cleanup. ++ ++At a completed interchange the descriptor moves the coordinate names, widths, ++and validity bounds with their fields. A processed line therefore still runs ++through the same named coordinate in increasing numerical order. Other named ++coordinates retain their values; their physical order is immaterial to the ++validity test. After the line algorithm, the inverse interchange restores the ++original field order. The padded box keeps its full physical size throughout. ++Invalid entries remain zero at the completed axis-map boundaries specified ++above; temporary bit moves and the internal arithmetic of a swap need not ++preserve an intermediate validity mask. The completed permutations and their ++inverses are exact, so the contraction and error arguments do not change. ++ ++The list and collapsed descriptors are stored on tapes, not in new heads. ++Here $t_i\ge2$, so $d\le\log_2T$. With $V$ the physical bit volume, ++each collapsed length is at most $V$, and the list of axis names, ranges, ++and widths has length polynomial in $\log(2V)$. Ordinary integer arithmetic ++therefore prepares each call descriptor in $\operatorname{poly}(\log(2V))=O(V)$ ++time. Each primitive reuses its fixed work tapes. Thus all exposure and ++restoration costs ++$O(Tp\,d(1+\ell^\tau))$. + + Since $t_i\geq r/2$, each tensor map invokes at most + $\sum_iT/t_i\leq2dT/r$ lines. For any fixed setup degree $c$, work +--- a/build/sections/06-transforms.tex ++++ b/build/sections/06-transforms.tex +@@ -157,13 +157,13 @@ + + \subsection{A layout on which the parallel layers apply} + +-To apply Proposition~\ref{prop:simultaneous-layer} in a transform round, ++To apply Proposition~\ref{prop:batched-simultaneous-layer} in a transform round, + we must place the selected bits of the participating axes at a common + offset in consecutive $K$-bit chunks. We now construct that layout, + keeping each polynomial's coefficients in a contiguous suffix. The + layout uses the single-bit moves of + Lemma~\ref{lem:elementary-streams} and the chunk interchanges of +-Lemma~\ref{lem:chunk-swap}; each movement is included in the transform ++Lemma~\ref{lem:batched-chunk-swap}; each movement is included in the transform + cost. The layer then supplies one truncated contraction per round, + and its temporary rows and work streams are removed before the next + round begins. +@@ -172,14 +172,14 @@ + \label{lem:synthetic-transform-cost} + Fix the rational parameters and positive comparison constants + $a_d\leq b_d$, $a_r\leq b_r$ of +-Proposition~\ref{prop:simultaneous-layer}. Fix constants $C_\ell>0$ ++Proposition~\ref{prop:batched-simultaneous-layer}. Fix constants $C_\ell>0$ + and $C_w>1$, and choose the layer constants once as + \[ + C_M=C_\ell+1,\qquad + C_{\rm desc}=32(C_\ell+C_w+1). + \] + Use these constants and $C_w$ in +-Proposition~\ref{prop:simultaneous-layer}. These fixed choices determine ++Proposition~\ref{prop:batched-simultaneous-layer}. These fixed choices determine + a cutoff $p_1$, one fixed-tape procedure, and an implicit time constant + with the following guarantee. For every choice of positive integers + $p,d,r$ with $p\geq p_1$ and +@@ -210,7 +210,7 @@ + $\ell=\log_2r$ is obtained from the supplied power of two $r$. + Assume that the header is valid with the stated values and that the + input records use the two's-complement component format of +-Proposition~\ref{prop:simultaneous-layer} with width $w$. ++Proposition~\ref{prop:batched-simultaneous-layer} with width $w$. + + The procedure constructs an explicit positional + layout permutation $L$ of record addresses, preserving their polynomial +@@ -325,7 +325,7 @@ + $\log_2(2M)\leq(C_\ell+1)p=C_Mp$. + The current transform parameters supply $p,d,r,K,w$, and the round + determines $D,P,S$ and the selected offset $\rho$. Encode these values +-as the header $\mathcal E$ of Proposition~\ref{prop:simultaneous-layer}. ++as the header $\mathcal E$ of Proposition~\ref{prop:batched-simultaneous-layer}. + The same fixed descriptor bound covers every axis choice and round. + Indeed $|\Gamma(v)|\leq2\log_2v+1$, and + $\ell+n_P+n_S\leq d\ell\leq C_\ell p$. Also +@@ -466,7 +466,7 @@ + Let $w$ be an integer with $p+2\leq w\leq C_wp$. + The input supplies $\Gamma(p)\Gamma(r)\Gamma(w)$ and two disk grid + polynomials $f,g\in\mathcal R_r$ in the component format of +-Proposition~\ref{prop:simultaneous-layer} with width $w$. ++Proposition~\ref{prop:batched-simultaneous-layer} with width $w$. + One can compute the exact Gaussian integer + numerators of $fg$, and then return $Q_p(fg/r)$ in that same format, in time + $O(rp\log(rp))$ on a fixed number of tapes. The output is a disk diff --git a/scripts/batched_bit_rank_moment.py b/scripts/batched_bit_rank_moment.py new file mode 100644 index 0000000000..594cda4c33 --- /dev/null +++ b/scripts/batched_bit_rank_moment.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +"""Exact three-class rank-moment certificate for the existing F3 producer. + +This calculation uses the PR #7 producer unchanged. It groups the middle +identity pivots of three large-projector edge classes into contiguous chunk +interchanges. The geometric rank classes are proved in the accompanying note; +the general projector batching and arbitrary-width transfer are separate lemmas. +""" +from fractions import Fraction as Q +from math import comb +from pathlib import Path +import argparse +import json + +H = 28 +ROLES_PER_INVOCATION = 11840940 +BIT_SAVING = Q(177, 1000000000) + + +def rational_log_bounds(value, terms=16): + """Positive rational enclosure of log(value) for 1 <= value <= 2.""" + value = Q(value) + if not 1 <= value <= 2: + raise ValueError('Logarithm argument is outside [1, 2]') + z = (value - 1) / (value + 1) + lo = 2 * sum((z ** (2 * j + 1) / (2 * j + 1) + for j in range(terms)), Q(0)) + error = 2 * z ** (2 * terms + 1) / ((2 * terms + 1) * (1 - z * z)) + return lo, lo + error + + +def log_integer_upper(n): + k = n.bit_length() - 1 + return k * rational_log_bounds(2)[1] + rational_log_bounds(Q(n, 2 ** k))[1] + + +def counts(h=H, roles=ROLES_PER_INVOCATION): + v = comb(h, 5) + m = h ** 3 + N = v ** 3 + W = 2 * v * v * (v + roles) + L = 3 * v * v * comb(h, 2) * (h - 2) + deficit = N - 2 * L + s = W * m - deficit + copies = v * v * roles + bulk = [ + dict(name='first_third_stage_auxiliary_joins', + copies=copies, original_rank=m - 2 * h, + singleton_pivots=2 * h, chunk_digits=m - 4 * h), + dict(name='second_stage_auxiliary_sink_edges', + copies=copies, original_rank=m - h * h, + singleton_pivots=h * h, chunk_digits=m - 2 * h * h), + dict(name='third_stage_data_entrance_edges', + copies=2 * N, original_rank=(h * h - 1) * (h - 1), + singleton_pivots=h * h + h - 1, + chunk_digits=m - 2 * h * h - 2 * h + 2), + ] + for row in bulk: + assert 0 < row['chunk_digits'] < m + assert row['original_rank'] > m / 2 + assert row['original_rank'] == row['singleton_pivots'] + row['chunk_digits'] + singleton_calls = s - sum(row['copies'] * row['chunk_digits'] for row in bulk) + assert singleton_calls > 0 + assert singleton_calls + sum(row['copies'] * row['chunk_digits'] for row in bulk) == s + return dict(h=h, v=v, m=m, N=N, W=W, decreasing_dimension=L, + deficit=deficit, original_rank_sum=s, + roles_per_invocation=roles, bulk_classes=bulk, + singleton_calls=singleton_calls, eta=Q(deficit, W * m)) + + +def certificate(a=BIT_SAVING, roles=ROLES_PER_INVOCATION): + n = counts(roles=roles) + m = n['m'] + W = n['W'] + logarithms = [Q(9997, 1000), Q(512, 100000), Q(7411, 100000), Q(768, 10000)] + ratios = [Q(1, m)] + [Q(row['chunk_digits'], m) for row in n['bulk_classes']] + weights = [Q(n['singleton_calls'], W * m)] + [ + Q(row['copies'] * row['chunk_digits'], W * m) for row in n['bulk_classes']] + log_enclosures = [log_integer_upper(m)] + [rational_log_bounds(1 / x)[1] for x in ratios[1:]] + for enclosure, simple in zip(log_enclosures, logarithms): + assert enclosure < simple + assert 0 <= a * simple < 1 + assert sum(weights) == 1 - n['eta'] + # exp(t) <= 1/(1-t) for 0 <= t < 1, with strict inequality for t > 0. + moment_upper = sum((w / (1 - a * bound) + for w, bound in zip(weights, logarithms)), Q(0)) + assert moment_upper < 1, 'The proposed bit saving exceeds this conservative certificate' + return dict(status='EXACT RATIONAL RANK-MOMENT WITNESS', + bit_saving=a, tau=1 - a, counts=n, + normalized_widths=ratios, rank_mass_weights=weights, + logarithm_upper_bounds=logarithms, + logarithm_enclosures=log_enclosures, + moment_upper=moment_upper, strict_gap=1 - moment_upper, + formula='sum_i weight_i * ratio_i^(-bit_saving) < 1', + bound='exp(x) <= 1/(1-x), for 0 <= x < 1', + dependencies=[ + 'Existing PR #7 scalar producer, retained-total frame schedule and bank matching', + 'Width padding given identity gates at the ordinary D0 and D1 bank boundaries', + 'Large-projector lower-triangular factorization with a contiguous middle block', + 'Arbitrary-width finite-tape recurrence using the resulting mixed child widths', + ]) + + +def serializable(value): + if isinstance(value, Q): + return str(value) + if isinstance(value, dict): + return {key: serializable(val) for key, val in value.items()} + if isinstance(value, (tuple, list)): + return [serializable(val) for val in value] + return value + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--output', type=Path) + args = parser.parse_args() + result = serializable(certificate()) + encoded = json.dumps(result, indent=2, sort_keys=True) + '\n' + if args.output: + args.output.write_text(encoded) + print(encoded, end='') diff --git a/scripts/batched_network.py b/scripts/batched_network.py new file mode 100644 index 0000000000..c5904608fb --- /dev/null +++ b/scripts/batched_network.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +"""Exact bit, complex and assembly certificate for batched recursive widths. + +The PR #7 finite producers are consumed unchanged. New proofs give +large-projector bit batching, whole-residual complex batching, arbitrary +integer widths, and the dependency-path coefficient guard. This module +certifies their rational exponent comparisons and final assembly margins. +""" +from dataclasses import asdict +from fractions import Fraction as Q +from hashlib import sha256 +from math import comb +from pathlib import Path +import argparse +import json + +from controlled_bit_rank_moment import ( + BIT_SAVING, certificate as bit_certificate, + rational_log_bounds, log_integer_upper, +) +from bulk_complex_guard import bulk_complex_guard +from certify import Parameters, require +from compact_control_layer import layer_exponents +from fast_gaussian import fast_constraints, fast_margins +from prepare_layers import serializable + + +ROOT = Path(__file__).resolve().parents[1] +COMPLEX_SAVING = Q(7, 10**7) +KAPPA = Q(6149999, 5*10**13) +ZETA = Q(1, 10000) + + +def complex_counts(): + h = 28 + v = comb(h, 3) + m = h**3 + side_roles = 93838 + auxiliary_roles = side_roles+h+1 + N = v**3 + W = 2*v*v*(v+auxiliary_roles) + L = 3*v*v*h*(h+1) + deficit = 2*N-2*L + s = W*m-deficit + copies = v*v*auxiliary_roles + bulk = [ + dict(name='first_third_stage_auxiliary_joins', + copies=copies, rank=m-2*h), + dict(name='second_stage_auxiliary_sink_edges', + copies=copies, rank=m-h*h), + ] + singletons = s-sum(row['copies']*row['rank'] for row in bulk) + require(deficit > 0 and singletons > 0, 'Invalid complex rank masses') + return dict(h=h, v=v, m=m, N=N, side_roles=side_roles, + auxiliary_roles=auxiliary_roles, W=W, L=L, s=s, + deficit=deficit, eta=Q(deficit, W*m), + bulk_classes=bulk, singleton_calls=singletons) + + +def complex_certificate(a=COMPLEX_SAVING): + n = complex_counts() + m, W = n['m'], n['W'] + ratios = [Q(1, m)]+[Q(row['rank'], m) for row in n['bulk_classes']] + weights = [Q(n['singleton_calls'], W*m)]+[ + Q(row['copies']*row['rank'], W*m) for row in n['bulk_classes']] + logarithms = [Q(9997, 1000), Q(2555, 10**6), Q(36368, 10**6)] + enclosures = [log_integer_upper(m)]+[ + rational_log_bounds(1/r)[1] for r in ratios[1:]] + require(sum(weights) == 1-n['eta'], 'Complex rank-mass identity failed') + for rigorous, simple in zip(enclosures, logarithms): + require(rigorous < simple, 'Complex rational logarithm bound failed') + require(0 < a*simple < 1, 'Exponential upper-bound range failed') + upper = sum((w/(1-a*ell) for w, ell in zip(weights, logarithms)), Q(0)) + require(upper < 1, 'Unsupported complex exponent') + return dict(complex_saving=a, sigma=1-a, counts=n, + normalized_widths=ratios, rank_mass_weights=weights, + logarithm_upper_bounds=logarithms, logarithm_enclosures=enclosures, + moment_upper=upper, strict_gap=1-upper, + formula='sum_i weight_i * ratio_i^(-complex_saving) < 1', + bound='exp(x) <= 1/(1-x), for 0 <= x < 1') + + +def parameters(): + return Parameters( + tau=1-BIT_SAVING, sigma=1-COMPLEX_SAVING, + epsilon=Q(7999999, 16000000), c=Q(1), + beta=Q(1, 1000), delta=Q(1, 10**10), + lam=1-BIT_SAVING+Q(1, 10**16), + lamp=1-BIT_SAVING+Q(2, 10**16), + C1=Q(11999, 10000), kappa=KAPPA, + ) + + +def assembly(p=None, cn=None): + p = parameters() if p is None else p + cn = complex_counts() if cn is None else cn + require(1-p.tau == BIT_SAVING and 1-p.sigma == COMPLEX_SAVING, + 'Assembly and motif exponents differ') + require(p.sigma < p.tau, 'The stated mixed-width internal-cost case changed') + g = bulk_complex_guard(cn, p.beta, ZETA) + require(p.C1 == g['C1'], 'Bulk guard exponent mismatch') + exponents = layer_exponents(p.tau, p.sigma, p.beta, p.c) + constraints = fast_constraints(p) + constraints['packed_overhead'] = p.lam-exponents['internal'] + constraints['reserved_axes'] = p.lamp-exponents['preprocessing'] + for name, slack in constraints.items(): + require(slack > 0, 'Assembly constraint failed: '+name) + margins = fast_margins(p) + minimum = min(margins.values()) + require(minimum > p.kappa, 'No strict final absorption gap') + require(p.kappa > Q(1, 2**23), 'Dyadic improvement comparison failed') + return dict(parameters=asdict(p), guard=g, recurrence=exponents, + constraints=constraints, margins=margins, + minimum_margin=minimum, absorption_gap=minimum-p.kappa, + dyadic_corollary='2^-23', + dyadic_gap=p.kappa-Q(1, 2**23)) + + +def certificate(): + b = bit_certificate() + c = complex_certificate() + w = assembly(cn=c['counts']) + source_paths = [ + 'notes/batched-23-note.tex', + 'notes/batched-algorithms.tex', + 'notes/batched-bit-rows.tex', + 'notes/batched-complex-rows.tex', + 'notes/batched-path-budget.tex', + 'notes/projector-batching.tex', + 'notes/batched-bit-rank-accounting.tex', + 'notes/controlled-projector-basis.tex', + 'notes/chirp-scaling-correction.tex', + 'notes/fast-gaussian-resampling.tex', + 'notes/bulk-complex-guard.tex', + 'notes/batched-assembly.tex', + 'scripts/batched_bit_rank_moment.py', + 'scripts/controlled_bit_rank_moment.py', + 'scripts/bulk_complex_guard.py', + 'scripts/batched_network.py', + 'scripts/make_batched_patch.py', + ] + return dict( + status='CONDITIONAL 6149999/(5*10^13) > 2^-23 INTEGER-MULTIPLICATION WITNESS', + upstream_commit='adc7f1241b42e322a6451854ab7e4b4c146bf78a', + retained_PR7_commit='6725c6a17b17871a35353fd29157f4ed851bc114', + bit=b, complex=c, assembly=w, + new_source_sha256={p:sha256((ROOT/p).read_bytes()).hexdigest() for p in source_paths}, + scope='Exact exponent and assembly arithmetic for the new batching and ' + 'dependency-path proofs, consuming the retained PR #7 finite ' + 'producers and the stated upstream analytic and tape interfaces.', + ) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output', type=Path) + parser.add_argument('--summary', action='store_true') + args = parser.parse_args() + result = certificate() + if args.output: + args.output.write_text(json.dumps(serializable(result), indent=2, sort_keys=True)+'\n') + if args.summary: + w = result['assembly'] + print('PASS kappa='+str(KAPPA)+' > 2^-23') + print('bit saving='+str(BIT_SAVING)+'; complex saving='+str(COMPLEX_SAVING)) + print('minimum margin='+str(w['minimum_margin'])) + print('strict absorption gap='+str(w['absorption_gap'])) + print(str(len(w['constraints']))+' strict constraints; '+str(len(w['margins']))+' strict margins') + else: + print(json.dumps(serializable(result), indent=2, sort_keys=True)) + + +if __name__ == '__main__': + main() diff --git a/scripts/bulk_complex_guard.py b/scripts/bulk_complex_guard.py new file mode 100644 index 0000000000..25f32d5130 --- /dev/null +++ b/scripts/bulk_complex_guard.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Exact guard constants for selected whole-residual complex children. + +The proof is in notes/bulk-complex-guard.tex. No finite producer is +regenerated; the input is a supplied fixed complex-network count record. +""" +from fractions import Fraction as Q +import json + +from certify import require +from prepare_layers import serializable + + +def bulk_complex_guard(n, beta=Q(1, 1000), zeta=Q(1, 10000)): + h, m, W, s = n['h'], n['m'], n['W'], n['s'] + q = m+6*h + ranks = (m-2*h, m-h*h) + rho = Q(6, 5) + lower = 160000 + theta = Q(999, 1000) + require(m == 21952 and h == 28, + 'This explicit rational path enclosure is specialized to h=28') + require(lower**5 < m**6, 'Lower bound for m^(6/5) failed') + require(all(2*a > q and a < m for a in ranks), + 'A dependency path could cross two selected bulk edges') + moments = {'no_bulk': Q(q, lower)} + for a in ranks: + t = Q(m-a, m) + power_upper = 1-Q(6, 5)*t+Q(3, 25)*t*t/(1-t) + moments['rank_'+str(a)] = Q(q-a, lower)+power_upper + require(all(x < theta for x in moments.values()), + 'Normalized arithmetic-depth path moment failed') + E = 64*(W+m+1)**3 + require(36*W**3+4*s+4*W+8*m+4 < E, + 'Additive coefficient-depth enclosure failed') + dependency_constant = 1000*(E+16*m+1) + require(dependency_constant*(1-theta) >= E and dependency_constant >= 16*m, + 'Strong-induction constant failed') + C1 = rho-(rho-1)*beta+zeta + raw = 128*m*(1+1/zeta)*dependency_constant + C0 = -(-raw.numerator//raw.denominator) + require(m*(1+1/zeta)*dependency_constant+18 <= C0, + 'Completed-layer guard constant failed') + return dict(h=h, m=m, q=q, selected_ranks=ranks, + at_most_one_selected_edge_per_path=True, + rho=rho, m_to_rho_lower=lower, path_moment_upper=moments, + theta_upper=theta, theta_slack=theta-max(moments.values()), + E=E, dependency_constant=dependency_constant, + beta=beta, zeta=zeta, C0=C0, C1=C1) + + +if __name__ == '__main__': + n = dict(h=28, m=21952, W=2085111546336, s=45772350635112192) + print(json.dumps(serializable(bulk_complex_guard(n)), indent=2, sort_keys=True)) diff --git a/scripts/complex_circuit.py b/scripts/complex_circuit.py new file mode 100644 index 0000000000..9e83a1065c --- /dev/null +++ b/scripts/complex_circuit.py @@ -0,0 +1,454 @@ +#!/usr/bin/env python3 +"""Compressed side correction for the complex network, with binary frames. + +Target S must receive (1/2) * sum{x_T : T disjoint from S} +minus (1/2) * sum{x_T : |S cap T| = 2}. Both sums are computed by +cancellation-free addition graphs and injected as pieces with those weights. + +Labels are subspaces of F2^h with the dot product. A disjoint-sum node carries +the coordinate space of its covered points; a pair-star node carries the span +of its triple indicators, which is orthonormal. An injected piece must leave a +point outside S uncovered: the residual up to t_S^perp then contains an odd +coordinate vector. A disjoint piece covering every point outside S would have +the alternating residual , so the disjoint sum is split. +""" +from fractions import Fraction as Q +from itertools import combinations + +EMPTY = frozenset() + + +def subsets(points, k): + return [frozenset(c) for j in range(min(k, len(points))+1) + for c in combinations(points, j)] + + +class ComplexSideCircuit: + def __init__(self, h): + assert h >= 8, 'Need at least four points outside every target' + self.h = h + self.triples = list(combinations(range(h), 3)) + self.index = {t: i for i, t in enumerate(self.triples)} + self.support = [0]; self.args = [None]; self.kind = [None] + self.lookup = {}; self.input = {} + for i, t in enumerate(self.triples): + self.input[t] = len(self.support) + self.support.append(1 << i); self.args.append(None); self.kind.append('in') + self.points = {} # covered point masks, filled lazily + self.pieces = [] # (target, node, coefficient) + self.build_disjoint() + self.build_pair_stars() + self.prune() + + # -- node store ------------------------------------------------------- + def x(self, *pts): + return self.input[tuple(sorted(pts))] + + def add(self, a, b, kind): + if not a: return b + if not b: return a + sa, sb = self.support[a], self.support[b] + assert not sa & sb, 'Cancellation is forbidden' + key = (kind, sa | sb) + node = self.lookup.get(key) + if node is None: + node = len(self.support) + self.lookup[key] = node + self.support.append(sa | sb); self.args.append((a, b)); self.kind.append(kind) + return node + + def total(self, nodes, kind): + nodes = [x for x in nodes if x] + while len(nodes) > 1: + nodes = [self.add(nodes[i], nodes[i+1], kind) if i+1 < len(nodes) else nodes[i] + for i in range(0, len(nodes), 2)] + return nodes[0] if nodes else 0 + + # -- disjoint sums ---------------------------------------------------- + def vec(self, items, k): + """{E: sum of item nodes whose points avoid E}, |E| <= k.""" + if not items: return {EMPTY: 0} + if len(items) == 1: + p, node = items[0] + return {EMPTY: node, frozenset([p]): 0} if k else {EMPTY: node} + half = len(items)//2 + A = self.vec(items[:half], k); B = self.vec(items[half:], k) + return {ea | eb: self.add(xa, xb, 'd0') for ea, xa in A.items() + for eb, xb in B.items() if len(ea)+len(eb) <= k} + + def pairs(self, pts, weight, k): + """{E: sum of weight(u,v) over pairs avoiding E}, |E| <= k.""" + if len(pts) < 2: return {E: 0 for E in subsets(pts, k)} + half = len(pts)//2; L, R = pts[:half], pts[half:] + PL = self.pairs(L, weight, k); PR = self.pairs(R, weight, k) + rows = {u: self.vec([(r, weight(u, r)) for r in R], k) for u in L} + cross = {} + for ER in subsets(R, k): + for EL, node in self.vec([(u, rows[u][ER]) for u in L], k-len(ER)).items(): + cross[EL, ER] = node + return {EL | ER: self.total([xl, xr, cross[EL, ER]], 'd0') + for EL, xl in PL.items() for ER, xr in PR.items() if len(EL)+len(ER) <= k} + + def tri_parts(self, pts, k): + """Recursive halves and the two mixed families, before combination.""" + half = len(pts)//2; L, R = pts[:half], pts[half:] + TL = self.tri(L, k); TR = self.tri(R, k) + PR = {r: self.pairs(L, lambda u, v, r=r: self.x(u, v, r), k) for r in R} + PL = {u: self.pairs(R, lambda a, b, u=u: self.x(u, a, b), k) for u in L} + return L, R, TL, TR, PR, PL + + def tri(self, pts, k): + """{E: sum of triples inside pts avoiding E}, |E| <= k.""" + if len(pts) < 3: return {E: 0 for E in subsets(pts, k)} + L, R, TL, TR, PR, PL = self.tri_parts(pts, k) + c21 = {}; c12 = {} + for EL in subsets(L, k): + for ER, node in self.vec([(r, PR[r][EL]) for r in R], k-len(EL)).items(): + c21[EL, ER] = node + for ER in subsets(R, k): + for EL, node in self.vec([(u, PL[u][ER]) for u in L], k-len(ER)).items(): + c12[EL, ER] = node + return {EL | ER: self.total([xl, xr, c21[EL, ER], c12[EL, ER]], 'd0') + for EL, xl in TL.items() for ER, xr in TR.items() if len(EL)+len(ER) <= k} + + def build_disjoint(self): + """Six pieces per target, each leaving an outside point uncovered.""" + pts = list(range(self.h)) + L, R, TL, TR, PR, PL = self.tri_parts(pts, 3) + R1, R2 = R[:len(R)//2], R[len(R)//2:] + L1, L2 = L[:len(L)//2], L[len(L)//2:] + for S in self.triples: + E = frozenset(S); EL = E & frozenset(L); ER = E & frozenset(R) + pieces = [TL[EL], TR[ER]] + for half in (R1, R2): + pieces.append(self.vec([(r, PR[r][EL]) for r in half], 3-len(EL))[ER & frozenset(half)]) + for half in (L1, L2): + pieces.append(self.vec([(u, PL[u][ER]) for u in half], 3-len(ER))[EL & frozenset(half)]) + for node in pieces: self.emit(S, node, Q(1, 2)) + + # -- pair stars ------------------------------------------------------- + def build_pair_stars(self): + """Prefix and suffix pair-star sums around each excluded third point.""" + h = self.h + for a, b in combinations(range(h), 2): + others = [u for u in range(h) if u not in (a, b)] + n = len(others) + pre = [0] + for u in others: pre.append(self.add(pre[-1], self.x(a, b, u), 'd2')) + suf = [0]*(n+1) + for i in range(n-1, -1, -1): suf[i] = self.add(self.x(a, b, others[i]), suf[i+1], 'd2') + for i, c in enumerate(others): + S = tuple(sorted((a, b, c))) + self.emit(S, pre[i], Q(-1, 2)); self.emit(S, suf[i+1], Q(-1, 2)) + + def emit(self, S, node, coef): + """Inject a piece, splitting it until it leaves a point outside S uncovered.""" + if not node: return + if self.cover(node) | sum(1 << p for p in S) == (1 << self.h)-1: + a, b = self.args[node] + self.emit(S, a, coef); self.emit(S, b, coef) + else: + self.pieces.append((S, node, coef)) + + # -- bookkeeping ------------------------------------------------------ + def prune(self): + self.active = set(); stack = [node for _, node, _ in self.pieces] + while stack: + node = stack.pop() + if node in self.active: continue + self.active.add(node) + if self.args[node]: stack.extend(self.args[node]) + self.additions = sum(self.args[n] is not None for n in self.active) + self.roles = self.additions + len(self.pieces) + + def cover(self, node): + """Mask of ground points covered by the node's source triples.""" + if node not in self.points: + s = self.support[node]; mask = 0 + while s: + low = s & -s; mask |= sum(1 << p for p in self.triples[low.bit_length()-1]); s ^= low + self.points[node] = mask + return self.points[node] + + def stats(self): + v = len(self.triples) + return dict(h=self.h, v=v, additions=self.additions, injections=len(self.pieces), + roles=self.roles, roles_per_target=round(self.roles/v, 3), + disjoint_additions=sum(self.kind[n] == 'd0' for n in self.active), + pair_star_additions=sum(self.kind[n] == 'd2' for n in self.active)) + + +# -- binary linear algebra on F2^h, vectors as integer masks --------------- +def echelon(vectors): + """Reduced basis {pivot bit: vector}; raises on dependence.""" + basis = {} + for x in vectors: + for bit, b in basis.items(): + if x & bit: x ^= b + assert x, 'Dependent label vectors' + bit = x & -x + for other in basis: + if basis[other] & bit: basis[other] ^= x + basis[bit] = x + return basis + + +def reduce(basis, x): + for bit, b in basis.items(): + if x & bit: x ^= b + return x + + +def dot(x, y): + return (x & y).bit_count() & 1 + + +def rank(rows): + rows = list(rows); r = 0 + for col in range(max((x.bit_length() for x in rows), default=0)): + bit = 1 << col + pivot = next((i for i in range(r, len(rows)) if rows[i] & bit), None) + if pivot is None: continue + rows[r], rows[pivot] = rows[pivot], rows[r] + for i in range(len(rows)): + if i != r and rows[i] & bit: rows[i] ^= rows[r] + r += 1 + return r + + +class Label: + """A binary subspace with a canonical basis.""" + def __init__(self, vectors): + self.basis = echelon(vectors); self.dim = len(self.basis) + self.key = tuple(sorted(self.basis.values())) + + def contains(self, other): + return all(not reduce(self.basis, x) for x in other.basis.values()) + + def nondegenerate(self): + vs = list(self.basis.values()) + return rank([sum(dot(a, b) << j for j, b in enumerate(vs)) for a in vs]) == len(vs) + + def complement_in(self, other): + """Basis of other ∩ self^perp, assuming self ⊆ other.""" + vs = list(other.basis.values()); us = list(self.basis.values()); k = len(us) + rows = [sum(dot(v, u) << j for j, u in enumerate(us)) | 1 << (k+i) + for i, v in enumerate(vs)] + r = 0 + for col in range(k): + bit = 1 << col + piv = next((i for i in range(r, len(rows)) if rows[i] & bit), None) + if piv is None: continue + rows[r], rows[piv] = rows[piv], rows[r] + for i in range(len(rows)): + if i != r and rows[i] & bit: rows[i] ^= rows[r] + r += 1 + out = [] + for row in rows[r:]: + assert not row & ((1 << k)-1) + x = 0 + for i, v in enumerate(vs): + if row >> (k+i) & 1: x ^= v + out.append(x) + return out + + +def odd(vectors): + return any(x.bit_count() & 1 for x in vectors) + + +# -- exact checks ----------------------------------------------------------- +def tmask(t): + return sum(1 << p for p in t) + + +class Checks: + """Exact verification of the side map, labels and compiled roles.""" + def __init__(self, c): + self.c = c; self.h = c.h; self.cache = {}; self.verdicts = {} + self.everything = Label([1 << p for p in range(c.h)]) + + def label(self, node): + if node in self.cache: return self.cache[node] + c = self.c; kind = c.kind[node] + if kind == 'in': + vectors = [tmask(c.triples[node-1])] + elif kind == 'd0': + m = c.cover(node); vectors = [1 << p for p in range(self.h) if m >> p & 1] + else: + s = c.support[node]; ts = [] + while s: + low = s & -s; ts.append(c.triples[low.bit_length()-1]); s ^= low + common = set(ts[0]).intersection(*ts) + assert len(common) >= 2, 'Pair-star node without a common pair' + vectors = [tmask(t) for t in ts] + lab = Label(vectors); self.cache[node] = lab + return lab + + def target_frame(self, S): + t = tmask(S) + key = ('perp', S) + if key not in self.cache: + self.cache[key] = Label([x for x in (1 << p for p in range(self.h)) + if not dot(x, t)] + [tmask((S[0], S[1])), tmask((S[1], S[2]))]) + return self.cache[key] + + def residual_ok(self, small, big): + """small ⊆ big and big ⊖ small is zero or has an odd vector.""" + key = (small.key, big.key) + if key not in self.verdicts: + res = small.complement_in(big) if big.contains(small) else None + self.verdicts[key] = res is not None and (not res or odd(res)) + return self.verdicts[key] + + def label_ok(self, lab): + """Nondegenerate, contains an odd vector, and its complement is zero or does.""" + key = ('label', lab.key) + if key not in self.verdicts: + perp = lab.complement_in(self.everything) + self.verdicts[key] = (lab.nondegenerate() and odd(lab.basis.values()) + and (not perp or odd(perp))) + return self.verdicts[key] + + def verify_map(self): + c = self.c + for node in c.active: + if c.args[node]: + a, b = c.args[node] + assert a < node and b < node and not c.support[a] & c.support[b] + assert c.support[node] == c.support[a] | c.support[b] + got = {} + for S, node, coef in c.pieces: + assert coef in (Q(1, 2), Q(-1, 2)) + key = (S, coef) + assert not got.get(key, 0) & c.support[node], 'Overlapping pieces' + got[key] = got.get(key, 0) | c.support[node] + nonzero = 0 + for S in c.triples: + zero = sum(1 << i for i, T in enumerate(c.triples) if not set(S) & set(T)) + two = sum(1 << i for i, T in enumerate(c.triples) if len(set(S) & set(T)) == 2) + assert got.get((S, Q(1, 2)), 0) == zero and got.get((S, Q(-1, 2)), 0) == two + nonzero += zero.bit_count()+two.bit_count() + return dict(targets=len(c.triples), nonzero_coefficients=nonzero, + side_map_exact=True, coefficients='+1/2 disjoint, -1/2 intersection two') + + def verify_labels(self): + c = self.c; checked = 0 + for node in sorted(c.active): + lab = self.label(node) + assert self.label_ok(lab), node # includes the exit to the full space + if c.args[node]: + for child in c.args[node]: + assert self.residual_ok(self.label(child), lab), (node, child) + checked += 1 + for S, node, coef in c.pieces: + assert self.residual_ok(self.label(node), self.target_frame(S)), (S, node) + checked += 1 + return dict(active_nodes=len(c.active), checked_inclusions=checked, + all_labels_nondegenerate=True, all_residuals_have_odd_vectors=True) + + +def compile_roles(c): + """Reversible roles: one per addition plus one per injected piece.""" + users = {x: [] for x in c.active} + for node in sorted(c.active): + if c.args[node]: + for pos, x in enumerate(c.args[node]): users[x].append(('gate', node, pos)) + for i, (_, node, _) in enumerate(c.pieces): users[node].append(('output', i)) + edge = {}; sources = {}; outputs = {}; gates = []; size = 0 + for node in sorted(c.active): + if c.args[node]: + ins = (edge[node, 0], edge[node, 1]); pivot = ins[0] + else: + pivot = size; size += 1; ins = (pivot,); sources[c.triples[node-1]] = pivot + assert users[node] + outs = (pivot,)+tuple(range(size, size+len(users[node])-1)) + size += len(users[node])-1 + assert len(set(ins)) == len(ins) and set(ins) & set(outs) == {pivot} + gates.append((node, ins, outs)) + for user, slot in zip(users[node], outs): + if user[0] == 'gate': edge[user[1], user[2]] = slot + else: outputs[user[1]] = slot + assert size == c.roles + return dict(roles=size, gates=gates, sources=sources, outputs=outputs) + + +def verify_role_frames(c, checks, code=None): + """Follow every physical role in both directions through its frames.""" + code = code or compile_roles(c) + def step(small, big): assert checks.residual_ok(small, big) + frames = [None]*code['roles'] + for T, slot in code['sources'].items(): frames[slot] = checks.label(c.input[T]) + for node, ins, outs in code['gates']: + lab = checks.label(node) + for slot in set(ins+outs): + if frames[slot] is None: assert checks.label_ok(lab) # entry from D0 + else: step(frames[slot], lab) + frames[slot] = lab + for i, slot in code['outputs'].items(): + S = c.pieces[i][0]; J = checks.target_frame(S) + step(frames[slot], J); frames[slot] = J + for lab in frames: + assert checks.label_ok(lab) # includes the exit residual to D1 + # Reverse stage: complements, traversed backward. U^perp grows iff U shrinks. + # Its entries and exits have the forward residuals U^perp and U, checked above. + back = [None]*code['roles'] + for i, slot in code['outputs'].items(): back[slot] = ('line', c.pieces[i][0]) + for node, ins, outs in reversed(code['gates']): + lab = checks.label(node) + for slot in set(ins+outs): + prev = back[slot] + if prev is None: + assert checks.label_ok(lab) # reverse entry residual is lab^perp + elif prev[0] == 'line': # ⊆ U^perp iff U ⊆ t_S^perp + step(lab, checks.target_frame(prev[1])) + else: + step(lab, prev[1]) # prev^perp ⊆ lab^perp iff lab ⊆ prev + back[slot] = ('node', lab) + for T, slot in code['sources'].items(): + assert back[slot][1].key == checks.label(c.input[T]).key # ends at t_T^perp + return dict(roles=code['roles'], forward_frames_nested=True, + reverse_complement_frames_nested=True) + + +def simulate_invocation(c, code, x, y, side, center, inverse=False): + """Scalar invocation over Q with arbitrary scratch; returns the new state. + + Forward: L,-J,L^-1,-R,V,G,R,L,J,L^-1,G^-1,V^-1 gives y <- y + x. + inverse=True runs the inverted schedule, giving x <- x - y. + """ + h = c.h; T = c.triples + side = list(side); center = dict(center); x = dict(x); y = dict(y) + def L(sign=1): + order = code['gates'] if sign > 0 else list(reversed(code['gates'])) + for node, ins, outs in order: + if sign > 0: + if len(ins) == 2: side[ins[0]] += side[ins[1]] + for o in outs[1:]: side[o] += side[outs[0]] + else: + for o in outs[1:]: side[o] -= side[outs[0]] + if len(ins) == 2: side[ins[0]] -= side[ins[1]] + def J(target, sign): + for i, slot in code['outputs'].items(): + S, _, coef = c.pieces[i]; target[S] += sign*coef*side[slot] + def V(source, sign): + for t, slot in code['sources'].items(): side[slot] += sign*source[t] + def G(source, sign): + for i in range(h): center[i] += sign*sum(source[t] for t in T if i in t) + center['*'] += sign*sum(source.values()) + def R(target, sign): + for t in T: target[t] += sign*(sum(center[i] for i in t)-center['*'])/2 + if not inverse: + L(); J(y, -1); L(-1); R(y, -1); V(x, 1); G(x, 1); R(y, 1) + L(); J(y, 1); L(-1); G(x, -1); V(x, -1) + else: # inverse schedule with logical source y and target x + V(y, 1); G(y, 1); L(); J(x, -1); L(-1); R(x, -1); G(y, -1); V(y, -1) + R(x, 1); L(); J(x, 1); L(-1) + return x, y, side, center + + +if __name__ == '__main__': + import sys, time + for h in map(int, sys.argv[1:] or ['10', '12', '16']): + t = time.time(); c = ComplexSideCircuit(h) + print(c.stats(), f'{time.time()-t:.1f}s', flush=True) diff --git a/scripts/complex_network.py b/scripts/complex_network.py new file mode 100644 index 0000000000..af9bb6d7b3 --- /dev/null +++ b/scripts/complex_network.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Conditional 59/10^11 witness: a compressed complex side circuit. + +The compact-control witness was limited by the original complex motif, whose +v*z_c side wires per invocation dilute its rank deficit. The new side circuit +computes the same correction with shared sums, binary coordinate and pair-star +labels, and the bit network's transparent twelve-operation schedule. The bit +network, compact-control movement and assembly recipe are unchanged. +""" +from fractions import Fraction as Q +from math import comb +from pathlib import Path +import json + +from certify import Parameters, constraints, margins, require, verify_sources +from compact_control_layer import layer_exponents +from complex_circuit import ComplexSideCircuit, Checks, compile_roles, verify_role_frames +from paired_network import BIT_SAVING +from prepare_layers import serializable +from search_network import log_integer_bounds + +ROOT = Path(__file__).resolve().parents[1] +H = 25 +COMPLEX_SAVING = Q(14, 10**9) +LOG_BOUND = Q(966, 100) +KAPPA = Q(59, 10**11) + + +def counts(c): + h = c.h; v = comb(h, 3); m = h**3; N = v**3; I = 3*v*v + R = c.roles; W = 2*N+I*(R+h+1); L = I*(h+1)*h + s = W*m-2*N+2*L + require(L < N, 'Complex deficit is not positive') + return dict(h=h, v=v, m=m, N=N, I=I, side_roles_per_invocation=R, + central_roles=h+1, W=W, L=L, s=s, deficit=W*m-s, eta=Q(W*m-s, W*m), + original_side_wires_per_invocation=v*(comb(h-3, 3)+3*(h-3))) + + +def gate_count(c, n): + """Per invocation: four mixer passes, two copies, two injections, four central gates.""" + per = 4*len(c.active)+4*n['v']+4 + require(n['I']*per <= 12*n['W'], 'The 12W gate bound behind E=64(W+m+1)^3 failed') + return dict(gates_per_invocation=per, total_gates=n['I']*per, twelve_W=12*n['W']) + + +def guard(n, beta, zeta): + """Generalized stopped-depth guard with the new complex constants.""" + m, s, W = n['m'], n['s'], n['W'] + E = 64*(W+m+1)**3; B = s+E + require(m >= 3 and 2 <= s < m**5, 'Unverified coefficient-depth hypothesis') + require(s*(8+E) <= 9*B*B, 'One-piece constant failed') + C1 = 5-4*beta+zeta + raw = max(Q(128*m*B*B), 18*m*B*B*(1+1/zeta)) + C0 = -(-raw.numerator//raw.denominator) + require(9*m*B*B*(1+1/zeta)+18 <= C0, 'Whole-layer constant failed') + return dict(m=m, s=s, E=E, B=B, beta=beta, zeta=zeta, C0=C0, C1=C1) + + +def parameters(): + return Parameters(tau=1-BIT_SAVING, sigma=1-COMPLEX_SAVING, + epsilon=Q(19999, 100000), c=Q(999, 1000), + lam=1-Q(2958, 10**12), lamp=1-Q(2956, 10**12), + kappa=KAPPA, beta=Q(1, 1000), delta=Q(1, 10**6), + C1=Q(49961, 10000)) + + +def witness(p, n): + g = guard(n, p.beta, Q(1, 10000)) + require(p.C1 == g['C1'], 'Guard mismatch') + e = layer_exponents(p.tau, p.sigma, p.beta, p.c) + slacks = constraints(p, layout_model='nonadjacent', assembly_model='tight-gaussian') + slacks['packed_overhead'] = p.lam-e['internal'] # compact control: internal = max exponent + slacks['reserved_axes'] = p.lamp-e['preprocessing'] + for name, slack in slacks.items(): require(slack > 0, 'Constraint failed: '+name) + gs = margins(p, layout_model='nonadjacent', assembly_model='tight-gaussian') + require(min(gs.values()) > p.kappa, 'No final absorption gap') + return dict(parameters=vars(p), guard=g, recurrence=e, constraint_slacks=slacks, + margins=gs, minimum_margin=min(gs.values()), + limiting_margins=[k for k, v in gs.items() if v == min(gs.values())], + absorption_gap=min(gs.values())-p.kappa) + + +def witness_only(): + """Counts and parameter witness without the full finite checks (for the patch).""" + n = counts(ComplexSideCircuit(H)) + require(n['eta'] > COMPLEX_SAVING*LOG_BOUND, 'Complex saving failed') + return witness(parameters(), n) + + +def certificate(): + c = ComplexSideCircuit(H); checks = Checks(c); code = compile_roles(c) + side = checks.verify_map(); labels = checks.verify_labels() + roles = verify_role_frames(c, checks, code) + n = counts(c) + lo, hi = log_integer_bounds(n['m']) + require(hi < LOG_BOUND, 'Logarithm enclosure failed') + require(n['eta'] > COMPLEX_SAVING*LOG_BOUND, 'Complex saving failed') + p = parameters(); w = witness(p, n) + require(Q(1, 2**31) < KAPPA < Q(1, 2**30), 'Unexpected dyadic scale') + # With the bit exponent fixed, g3 <= epsilon*(1-lambda) < epsilon*a_b < a_b/5. + ceiling = BIT_SAVING/5 + require(ceiling < Q(1, 2**30), 'This bit network could cross 2^-30') + return dict(status='CONDITIONAL 59/10^11 WITNESS; COMPRESSED COMPLEX SIDE CIRCUIT; NOT FORMAL VERIFICATION', + upstream_commit=verify_sources(), circuit=c.stats(), side_map=side, + labels=labels, role_frames=roles, gates=gate_count(c, n), + complex_counts=n, complex_saving=COMPLEX_SAVING, log_m_upper=LOG_BOUND, + log_enclosure=(lo, hi), complex_deficit_slack=n['eta']-COMPLEX_SAVING*LOG_BOUND, + bit_saving=BIT_SAVING, witness=w, + improvement_over_compact_control=KAPPA/Q(83, 10**12), + scoped_ceiling=dict(upper=ceiling, below_2_to_minus_30=True, + scope='Published h=50 paired bit network and retained Gaussian margin; not a bound on other networks or algorithms.'), + scope='Conditional on the pinned upstream interfaces, the compact-control movement and guard proofs, the paired bit network, and the written binary-frame transfer for this complex side circuit. Exact arithmetic and finite checks are not formal verification.') + + +if __name__ == '__main__': + result = serializable(certificate()) + (ROOT/'certificates/complex-network.json').write_text(json.dumps(result, indent=2, sort_keys=True)+'\n') + print('PASS conditional', KAPPA, '> 2^-31; minimum margin', result['witness']['minimum_margin']) + print('Side roles per invocation', result['complex_counts']['side_roles_per_invocation'], + 'vs original', result['complex_counts']['original_side_wires_per_invocation']) diff --git a/scripts/controlled_bit_rank_moment.py b/scripts/controlled_bit_rank_moment.py new file mode 100644 index 0000000000..0028f3a2f6 --- /dev/null +++ b/scripts/controlled_bit_rank_moment.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +"""Exact rank moment after controlled changes of rational tensor coordinates. + +The same finite scalar producer is used. A simultaneous rational basis keeps +both previously batched high-rank classes valid and converts the stage-two +sink corner pivots into one contiguous block. See the written basis theorem. +""" +from fractions import Fraction as Q +from pathlib import Path +import argparse +import json +from batched_bit_rank_moment import ( + H, ROLES_PER_INVOCATION, counts as original_counts, + rational_log_bounds, log_integer_upper, serializable, +) + +BIT_SAVING = Q(246, 1000000000) + + +def counts(h=H, roles=ROLES_PER_INVOCATION): + n = original_counts(h=h, roles=roles) + width = h * h + copies = n['v'] * n['v'] * roles + n['singleton_calls'] -= copies * width + n['recursive_blocks'] = [ + dict(name=row['name'] + '_middle', copies=row['copies'], + chunk_digits=row['chunk_digits']) for row in n['bulk_classes'] + ] + n['recursive_blocks'].append(dict( + name='second_stage_auxiliary_sink_corner', copies=copies, + chunk_digits=width)) + n['bulk_classes'][1]['singleton_pivots'] = 0 + n['bulk_classes'][1]['additional_corner_chunk_digits'] = width + assert n['singleton_calls'] > 0 + assert n['singleton_calls'] + sum( + row['copies'] * row['chunk_digits'] for row in n['recursive_blocks'] + ) == n['original_rank_sum'] + return n + + +def certificate(a=BIT_SAVING, roles=ROLES_PER_INVOCATION): + n = counts(roles=roles) + m = n['m'] + W = n['W'] + logarithms = [Q(9997, 1000), Q(512, 100000), Q(7411, 100000), + Q(768, 10000), Q(33323, 10000)] + ratios = [Q(1, m)] + [ + Q(row['chunk_digits'], m) for row in n['recursive_blocks']] + weights = [Q(n['singleton_calls'], W * m)] + [ + Q(row['copies'] * row['chunk_digits'], W * m) + for row in n['recursive_blocks']] + log_enclosures = [log_integer_upper(m)] + [ + rational_log_bounds(1 / x)[1] if 1 / x <= 2 + else log_integer_upper((1 / x).numerator) + for x in ratios[1:]] + assert 1 / ratios[-1] == n['h'] + for enclosure, simple in zip(log_enclosures, logarithms): + assert enclosure < simple + assert 0 <= a * simple < 1 + assert sum(weights) == 1 - n['eta'] + moment_upper = sum((w / (1 - a * bound) + for w, bound in zip(weights, logarithms)), Q(0)) + assert moment_upper < 1, 'The proposed saving exceeds this rank-moment certificate' + return dict( + status='EXACT RATIONAL CONTROLLED-BASIS RANK-MOMENT WITNESS', + bit_saving=a, tau=1 - a, counts=n, + normalized_widths=ratios, rank_mass_weights=weights, + logarithm_upper_bounds=logarithms, logarithm_enclosures=log_enclosures, + moment_upper=moment_upper, strict_gap=1 - moment_upper, + formula='sum_i weight_i * ratio_i^(-bit_saving) < 1', + bound='exp(x) <= 1/(1-x), for 0 <= x < 1', + dependencies=[ + 'Existing PR #7 producer and the three geometric edge-rank classes', + 'Controlled simultaneous basis theorem in notes/controlled-projector-basis.tex', + 'Large-projector factorization with a contiguous middle identity block', + 'Arbitrary integer-width recurrence and row-reservation interface', + ], + ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--output', type=Path) + args = parser.parse_args() + encoded = json.dumps(serializable(certificate()), indent=2, sort_keys=True) + '\n' + if args.output: + args.output.write_text(encoded) + print(encoded, end='') diff --git a/scripts/fast_gaussian.py b/scripts/fast_gaussian.py new file mode 100644 index 0000000000..f534b9e894 --- /dev/null +++ b/scripts/fast_gaussian.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +"""Conditional 1479/10^12 witness: faster Gaussian resampling. + +The retained witness was limited by the Gaussian line maps, whose cost +O(t p^(3/2+delta) alpha) forces epsilon<1/5. Two changes remove that limit: + +* Gaussian sums along a line are evaluated blockwise as chirped correlations, + using the established integer multiplier, in O(p^(1+delta)) per output. +* The correction E of the resampling system has powers decaying like + exp(-pi alpha^2 sigma n) after a burn-in of order 1/theta, so the Neumann + series needs O(p/alpha^2+1/theta) terms rather than p/(alpha^2 theta). + +With alpha^2 about b/(8d) the line maps cost O(d^2 p^delta) per bit, and +epsilon may approach 1/2. The bit and complex networks, compact-control +movement and guard are those of the compressed-complex witness. +""" +from fractions import Fraction as Q +from math import comb, floor, gcd +from pathlib import Path +import json + +from certify import Parameters, constraints, margins, require, verify_sources +from compact_control_layer import layer_exponents +from complex_circuit import ComplexSideCircuit +from complex_network import COMPLEX_SAVING, H, counts, guard +from paired_network import BIT_SAVING +from prepare_layers import serializable + +ROOT = Path(__file__).resolve().parents[1] +KAPPA = Q(1479, 10**12) +ZETA = Q(1, 10000) +# Rational enclosures 333/106 < pi < 355/113 and 693/1000 < log 2 < 6932/10000 +# bound pi*log2(e)=pi/log(2) on both sides. +KAPPA0_LO = Q(333, 106)/Q(6932, 10000) +KAPPA0_HI = Q(355, 113)/Q(693, 1000) + + +def ceil(x): + return -(-x.numerator//x.denominator) + + +def parameters(): + return Parameters(tau=1-BIT_SAVING, sigma=1-COMPLEX_SAVING, + epsilon=Q(49999, 100000), c=Q(9999, 10000), + lam=1-Q(29595, 10**13), lamp=1-Q(2959, 10**12), + kappa=KAPPA, beta=Q(19, 25), delta=Q(1, 10**6), + C1=5-4*Q(19, 25)+ZETA) + + +def fast_constraints(p): + """Tight-Gaussian slacks with the Gaussian conditions of the new line maps. + + The old cost 3/4+delta+5eps/4 becomes 2eps+delta. The old conditions on + alpha and gamma held only for alpha about (db)^(1/4); with alpha about + (b/(8d))^(1/2), gamma<=b/4 holds by construction, alpha=1 holds eventually because 2eps<1. + """ + s = constraints(p, layout_model='nonadjacent', assembly_model='tight-gaussian') + for key in ('gaussian_cost', 'dimension_upper_bound', 'alpha_below_sqrt_p', 'gamma_sublinear'): + del s[key] + s['gaussian_cost'] = 1-p.delta-2*p.epsilon + s['alpha_squared_theta_growth'] = 1-2*p.epsilon + return s + + +def fast_margins(p): + g = margins(p, layout_model='nonadjacent', assembly_model='tight-gaussian') + g['g5'] = 1-p.delta-2*p.epsilon + return g + + +def witness(p, n): + g = guard(n, p.beta, ZETA) + require(p.C1 == g['C1'], 'Guard mismatch') + e = layer_exponents(p.tau, p.sigma, p.beta, p.c) + slacks = fast_constraints(p) + slacks['packed_overhead'] = p.lam-e['internal'] + slacks['reserved_axes'] = p.lamp-e['preprocessing'] + for name, slack in slacks.items(): require(slack > 0, 'Constraint failed: '+name) + gs = fast_margins(p) + require(min(gs.values()) > p.kappa, 'No final absorption gap') + return dict(parameters=vars(p), guard=g, recurrence=e, constraint_slacks=slacks, + margins=gs, minimum_margin=min(gs.values()), + limiting_margins=[k for k, v in gs.items() if v == min(gs.values())], + absorption_gap=min(gs.values())-p.kappa) + + +def witness_only(): + """Counts and parameter witness without the finite checks (for the patch).""" + n = counts(ComplexSideCircuit(H)) + require(n['eta'] > COMPLEX_SAVING*Q(966, 100), 'Complex saving failed') + return witness(parameters(), n) + + +def nearest(x): + """Nearest integer with ties rounded up, as for q_j=floor(tj/s+1/2).""" + return floor(x+Q(1, 2)) + + +def step_inequality(s, t, H): + """Exact check of c(j,h) >= Phi(j+h)-Phi(j)+sigma h^2 for 0<=j= 0, 'Step inequality failed') + require(abs(beta(j+h)) <= Q(1, 2), 'Phase outside the half interval') + worst = excess if worst is None else min(worst, excess) + return worst + + +def neumann_count(p_bits, alpha, theta): + """n_new=ceil((p+1)/(4 alpha^2)+1/theta) and the original count ceil(p/(alpha^2 theta)). + + With L=log2(2.01)<101/100 and pi log2(e) > KAPPA0_LO, each extra power of E + gains at least KAPPA0_LO*alpha^2-L >= 4 alpha^2 bits, and the burn-in costs at + most KAPPA0_HI*alpha^2*(1/(4 theta)+1/2) bits. + """ + a2 = alpha*alpha + require(alpha >= 2 and a2*theta >= 1 and theta < 1, 'Need alpha>=2, alpha^2 theta>=1, theta<1') + require(Q(201, 100)**100 < 2**101, 'log2(2.01)<101/100 failed') + require(KAPPA0_LO*a2-Q(101, 100) >= 4*a2, 'Per-step decay constant failed') + n_new = ceil(Q(p_bits+1, 4*a2)+1/theta) + require(4*a2*n_new >= p_bits+1+KAPPA0_HI*a2*(1/(4*theta)+Q(1, 2)), 'Neumann count failed') + n_hvdh = ceil(Q(p_bits)/(a2*theta)) + return dict(n_new=n_new, n_hvdh=n_hvdh, n=min(n_new, n_hvdh)) + + +def application_counts(d, b): + """Counts at given (d,b): alpha=floor(sqrt(b/(8d))), theta>1/(4d).""" + from math import isqrt + alpha = isqrt(b//(8*d)) + while 8*d*(alpha+1)**2 <= b: alpha += 1 + while 8*d*alpha**2 > b: alpha -= 1 + gamma = 2*d*alpha*alpha + theta = Q(1, 4*d) + require(gamma*4 <= b, 'gamma exceeds b/4') + return dict(d=d, b=b, alpha=alpha, gamma=gamma, **neumann_count(6*b, alpha, theta)) + + +def certificate(): + c = ComplexSideCircuit(H); n = counts(c) + require(n['eta'] > COMPLEX_SAVING*Q(966, 100), 'Complex saving failed') + p = parameters(); w = witness(p, n) + require(Q(1, 2**30) < KAPPA < Q(1, 2**29), 'Unexpected dyadic scale') + steps = {f'{s}/{t}': str(step_inequality(s, t, 6)) for s, t in ((7, 8), (31, 32), (61, 64), (97, 101), (251, 256))} + samples = [application_counts(d, b) for d, b in ((8, 2**20), (64, 2**30), (1000, 2**40))] + for x in samples: require(x['n_new'] <= 30*x['d'], 'Neumann count exceeds 30d') + # Under the retained Gaussian margin the same networks are capped below a_b/5. + return dict(status='CONDITIONAL 1479/10^12 WITNESS; FAST GAUSSIAN RESAMPLING; NOT FORMAL VERIFICATION', + upstream_commit=verify_sources(), complex_counts=dict(h=n['h'], W=n['W'], s=n['s'], eta=n['eta']), + bit_saving=BIT_SAVING, complex_saving=COMPLEX_SAVING, witness=w, + step_inequality_minimum_excess=steps, neumann_samples=samples, + gaussian_cost_power='2*epsilon+delta (was 3/4+delta+5*epsilon/4)', + improvement_over_compressed_complex=KAPPA/Q(59, 10**11), + improvement_over_compact_control=KAPPA/Q(83, 10**12), + scoped_ceiling=dict(upper=BIT_SAVING/2, below_2_to_minus_29=BIT_SAVING/2 < Q(1, 2**29), + scope='g2,g3,g4 <= a_b*min(eps,1-eps); published h=50 paired bit network only.'), + scope='Conditional on the pinned upstream interfaces, the compact-control movement and guard, ' + 'the compressed complex network, and the written fast resampling lemmas. ' + 'Exact arithmetic and finite checks are not formal verification.') + + +if __name__ == '__main__': + result = serializable(certificate()) + (ROOT/'certificates/fast-gaussian.json').write_text(json.dumps(result, indent=2, sort_keys=True)+'\n') + print('PASS conditional', KAPPA, '> 2^-30; minimum margin', result['witness']['minimum_margin'], + 'limiting', result['witness']['limiting_margins']) diff --git a/scripts/make_batched_patch.py b/scripts/make_batched_patch.py new file mode 100644 index 0000000000..7f56a61ef1 --- /dev/null +++ b/scripts/make_batched_patch.py @@ -0,0 +1,340 @@ +#!/usr/bin/env python3 +"""Integrate the controlled bulk-recursion result into the pinned manuscript. + +The retained uniform-width proofs keep their original hypotheses and +exponents. Separate strengthened interfaces are appended, and consumers +are redirected to those interfaces. No producer or upstream file is edited. +""" +import argparse +import difflib +from pathlib import Path +import shutil + +from make_patch import replace_once +from make_prime_field_patch import patched_files as retained_files +from batched_network import certificate + + +ROOT = Path(__file__).resolve().parents[1] + + +def note(name): + return (ROOT / 'notes' / name).read_text() + + +def texq(q): + if q.denominator == 1: + return str(q.numerator) + return rf'\frac{{{q.numerator}}}{{{q.denominator}}}' + + +def new_bit_interface(): + prefix = r''' +\subsection{Replacing the uniform recurrence by contiguous projector blocks} +The preceding power-width and arbitrary-width results are retained +baseline constructions with their stated uniform rank recurrence and +exponent $\tau_0=1-3/400000000$. We now change the recursive compilation. +The new result below does not assert the uniform inequality +$s/W2^{-23}. +\end{gathered} +\end{equation} +Since $\sigma<\tau$, the internal exponent is +$\chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}=\tau$. +The leaf exponent is $\sigma+\beta(1-\sigma)=1-6993/10^{10}<\tau$. +The stopping test is $e^{1000}\frac{373}{10^{11}}=\kappa': + texq(w['minimum_margin'])+'>'+texq(w['parameters']['kappa'])+r'=\kappa', + } + for old, new in replacements.items(): + text = replace_once(text, old, new) + text = replace_once(text, r'\quad K=\lfloor d^c\rfloor.', r'\quad K=\lfloor d^c\rfloor=d.') + text = replace_once(text, + r'The same procedure computes $K$ and all other fixed rational powers.', + r'Here $K=d$ exactly; the same comparison method computes all other fixed rational powers.') + text = replace_once(text, + 'deterministic repair, row padding and removal, all base-$m$ groups,', + 'deterministic repair, row padding and removal, all mixed-width children,') + text = replace_once(text, + 'depth $O(\\log p)$, and the number of their rounds and base-$m$ groups', + 'depth $O(\\log p)$, and the number of their rounds and root invocations') + text = replace_once(text, + 'Proposition~\\ref{prop:power-interchange} gives', + 'Section~\\ref{sec:mixed-width-rows} gives') + text = replace_once(text, + r'The guard is $O(d^{11999/10000})=o(p)$, while', + r'''The guard is $O(d^{11999/10000})=o(p)$ because +\[ + \epsilon C_1=\frac{95991988001}{160000000000}<1, + \qquad 1-\epsilon C_1=\frac{64008011999}{160000000000}. +\] +Furthermore,''') + margin_table = '\nThe seven margins have the following exact values:\n\\[\n\\begin{array}{c|c}\n' + for index, (name, value) in enumerate(w['margins'].items(), start=1): + margin_table += rf'g_{index}&'+texq(value)+r'\\'+'\n' + margin_table += '\\end{array}\n\\]\n' + marker = 'Exact substitution in the unchanged seven-term assembly accounting gives' + text = replace_once(text, marker, margin_table+marker) + text = replace_once(text, + 'The new reservation, compact movement and repair costs are all included', + 'The final strict absorption gap is\n\\[\n G_*-\\kappa=' + +texq(w['absorption_gap'])+'>0.\n\\]\n' + 'The new reservation, compact movement and repair costs are all included') + return text + + +def active_references(text): + return text.replace('lem:chunk-swap', 'lem:batched-chunk-swap').replace( + 'prop:simultaneous-layer', 'prop:batched-simultaneous-layer') + + +def patched_files(): + result = certificate() + w = result['assembly'] + seen = set() + for name, old, text in retained_files(): + seen.add(name) + if name.endswith(('main.tex', '00-introduction.tex')): + text = replace_once(text, r'\kappa=373/10^{11}>2^{-28}', + r'\kappa=6149999/50000000000000>2^{-23}') + if name.endswith('main.tex'): + text = replace_once(text, + r'\small Ternary five-subset contribution: Zhihao Chen (jacklightChen)}', + r'\small Ternary five-subset contribution: Zhihao Chen (jacklightChen)\\'+'\n'+ + r'\small Bulk recursion: icekylinx (with OpenAI GPT-6 Astra and Codex assistance)}') + text = replace_once(text, + "The revised bound is conditional on the original manuscript's retained", + 'The present extension batches controlled rational projector blocks and\n' + 'whole complex residuals, supplies integer-width recursion with rows,\n' + 'and uses a dependency-path precision guard. The bulk-recursion contribution\n' + 'is by icekylinx, with substantial OpenAI GPT-6 Astra assistance;\n' + 'review corrections and integration used OpenAI Codex assistance.\n' + "The revised bound is conditional on the original manuscript's retained") + elif name.endswith('03-motifs.tex'): + text = replace_once(text, + 'The selected exponents used from now on are', + 'The following exponents certify the retained uniform-width baseline:') + elif name.endswith('04-swap.tex'): + text += new_bit_interface() + elif name.endswith('05-layers.tex'): + text = replace_once(text, r'$m_{\rm b}=125000$', r'$m_{\rm b}=21952$') + text += new_layer_interface(text) + elif name.endswith('07-resampling.tex'): + text = active_references(text) + elif name.endswith('08-assembly.tex'): + text = active_references(assembly_changes(text, w)) + yield name, old, text + # The transform source was unchanged by the retained patch chain, but + # its fixed-parameter contract must point at the new layer interface. + name = 'build/sections/06-transforms.tex' + if name in seen: + raise ValueError('Unexpected retained transform patch; integrate explicitly') + old = (ROOT / 'upstream' / name).read_text() + yield name, old, active_references(old) + + +def patch_text(files=None): + files = list(patched_files()) if files is None else files + return ''.join(''.join(difflib.unified_diff( + old.splitlines(keepends=True), new.splitlines(keepends=True), + fromfile='a/'+name, tofile='b/'+name)) for name, old, new in files) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output', type=Path, default=ROOT/'patches/batched-23.patch') + parser.add_argument('--materialize', type=Path, + help='Copy the complete pinned source and apply the generated changes here') + args = parser.parse_args() + files = list(patched_files()) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(patch_text(files)) + if args.materialize: + if args.materialize.resolve() in (ROOT.resolve(), (ROOT/'upstream').resolve()): + raise ValueError('Materialization must use a separate directory') + shutil.copytree(ROOT/'upstream', args.materialize, dirs_exist_ok=True) + for name, old, new in files: + path = args.materialize/name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(new) + print('Wrote '+str(args.output)+'; retained uniform proofs plus active bulk interfaces.') + + +if __name__ == '__main__': + main() diff --git a/scripts/make_complex_circuit_patch.py b/scripts/make_complex_circuit_patch.py new file mode 100644 index 0000000000..29c79b5d50 --- /dev/null +++ b/scripts/make_complex_circuit_patch.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +"""Independent pinned-source patch for the compressed complex network witness. + +Builds on the compact-control patch: the movement, reservation, repair, guard +and bit network are unchanged. The complex motif receives the shared-sum side +circuit, and the layer constants and assembly parameters are updated. +""" +import difflib +from pathlib import Path + +from complex_network import witness_only +from make_patch import replace_once +from make_compact_control_patch import patched_files as compact_files + +ROOT = Path(__file__).resolve().parents[1] + + +def note(name): return (ROOT/'notes'/name).read_text() + + +def motifs(text): + text = replace_once(text, r'''The exponents used from now on are +\begin{equation}\label{eq:explicit-motif-exponents} + \tau=1-296/10^{11},\qquad\sigma=1-418/10^{12}. +\end{equation} +''', r'''With the original side wires these exponents would be +\begin{equation}\label{eq:compact-intermediate-exponents} + \tau=1-296/10^{11},\qquad\sigma_{\rm orig}=1-418/10^{12}. +\end{equation} +We replace the side wires by a shared-sum circuit. + +'''+note('complex-circuit-construction.tex')+r''' +The exponents used from now on are +\begin{equation}\label{eq:explicit-motif-exponents} + \tau=1-296/10^{11},\qquad\sigma=1-14/10^9. +\end{equation} +''') + return text + + +def layers(text): + text = replace_once(text, r'''$m=m_{\rm c}=15625$, $W=W_{\rm c}=58645352620000$ and +$s=s_{\rm c}=916333630984500000$ from''', r'''$m=m_{\rm c}=15625$, $W=W_{\rm c}=1741801270000$ and +$s=s_{\rm c}=27215641140750000$ from''') + text = text.replace('prop:compact-complex-interface', 'prop:compressed-complex-interface') + text = replace_once(text, r'Fix $\tau=1-296/10^{11}$ and $\sigma=1-418/10^{12}$.', + r'Fix $\tau=1-296/10^{11}$ and $\sigma=1-14/10^9$.') + return text + + +def assembly(text): + start = text.index('Put $a=296/10^{11}$') + end = text.index(r'\subsection{Input and transform sizes}', start) + text = text[:start]+r'''Put $a=296/10^{11}$ and $a_{\rm c}=14/10^9$. +Choose +\begin{equation}\label{eq:fixed-parameters} +\begin{gathered} + \tau=1-a,\quad\sigma=1-a_{\rm c},\quad + \beta=\frac1{1000},\quad\zeta=\frac1{10000},\quad + C_1=\frac{49961}{10000},\\ + \epsilon=\frac{19999}{100000},\quad c=\frac{999}{1000},\quad\delta=\frac1{10^6},\\ + \lambda=1-\frac{2958}{10^{12}},\quad + \lambda'=1-\frac{2956}{10^{12}},\quad + \kappa=\frac{59}{10^{11}}>2^{-31}. +\end{gathered} +\end{equation} +Since $\sigma<\tau$, the compact-control recurrence has +$\chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}=\tau$, and exact rational +comparisons give +\[ + \max\{\tau,\sigma,\chi\}<\lambda<\lambda'<1,\quad + \sigma+\beta(1-\sigma)<\lambda',\quad 1-c<\lambda'. +\] +The stopping test is $e^{1000}\frac{83}{10^{12}}=\kappa.''', + r''' =\frac{14779261}{25\cdot10^{15}}>\frac{59}{10^{11}}=\kappa.''') + text = replace_once(text, r'''$\alpha=\Theta(p^{11999/40000})$ and +$\gamma=O(p^{15997/20000})=o(p)$. Also +$K=\Theta(p^{1999/50000})=o(\ell)$, $K/\log p\to\infty$, +and $\ell=\Theta(p^{8001/10000})$. The prime-interval ratio grows as +$p^{3001/5000}$.''', r'''$\alpha=\Theta(p^{119999/400000})$ and +$\gamma=O(p^{159997/200000})=o(p)$. Also +$K=\Theta(p^{19979001/10^8})=o(\ell)$, $K/\log p\to\infty$, +and $\ell=\Theta(p^{80001/100000})$. The prime-interval ratio grows as +$p^{30001/50000}$.''') + return text + + +def patched_files(): + witness_only() # full checks run in complex_network.py and the tests + for name, old, new in compact_files(): + if name.endswith(('main.tex', '00-introduction.tex')): + new = replace_once(new, r'\kappa=83/10^{12}', r'\kappa=59/10^{11}') + if name.endswith('main.tex'): + new = replace_once(new, r'''\small Compact-control modifications: Douglas Colkitt}''', + r'''\small Compact-control modifications: Douglas Colkitt\\ +\small Compressed complex network: eumemic}''') + new = replace_once(new, r'''and retained project refinements, prepared with assistance from OpenAI Codex.''', + r'''and retained project refinements, prepared with assistance from OpenAI Codex, +and a compressed complex network prepared with assistance from Claude +(Anthropic).''') + new = replace_once(new, 'no endorsement by OpenAI is implied.', + 'no endorsement by OpenAI or Anthropic is implied.') + elif name.endswith('03-motifs.tex'): new = motifs(new) + elif name.endswith('05-layers.tex'): new = layers(new) + elif name.endswith('08-assembly.tex'): new = assembly(new) + new = new.replace('% Conditional compact-control research draft; see main.tex for scope.\n', + '% Conditional compact-control research draft; see main.tex for scope.\n' + '% Compressed complex network added October 7, 2026.\n') + yield name, old, new + + +if __name__ == '__main__': + patch = ''.join(''.join(difflib.unified_diff(old.splitlines(keepends=True), + new.splitlines(keepends=True), fromfile=f'a/{name}', tofile=f'b/{name}')) + for name, old, new in patched_files()) + (ROOT/'patches/complex-circuit-31.patch').write_text(patch) + print('Wrote independent compressed-complex patch; conditional kappa=59/10^11 > 2^-31.') diff --git a/scripts/make_fast_gaussian_patch.py b/scripts/make_fast_gaussian_patch.py new file mode 100644 index 0000000000..7d77ef37bb --- /dev/null +++ b/scripts/make_fast_gaussian_patch.py @@ -0,0 +1,324 @@ +#!/usr/bin/env python3 +"""Independent pinned-source patch for the fast Gaussian resampling witness. + +Builds on the compressed-complex patch. The finite networks, compact-control +movement, reservation, repair and guard are unchanged. The one-dimensional +resampling lemma gets chirped-correlation Gaussian maps and a sharper Neumann +count, the tensor interface its new time bound, and the assembly the new +Gaussian width, cost row, margin and parameters. +""" +import difflib +from pathlib import Path + +from fast_gaussian import witness_only +from make_patch import replace_once +from make_complex_circuit_patch import patched_files as complex_files + +ROOT = Path(__file__).resolve().parents[1] + + +def note(name): return (ROOT/'notes'/name).read_text() + + +def resampling(text): + text = replace_once(text, r'''be integers, with $\gcd(s,t)=1$ and +\[ + \theta:=t/s-1>p/\alpha^4. +\]''', r'''be integers, with $\gcd(s,t)=1$. Put $\sigma=t/s$ and +$\theta:=\sigma-1$, and assume +\[ + \alpha^{-2}\le\theta\le\tfrac14,\qquad + n_{\alpha,\theta}:=\min\Bigl\{\Bigl\lceil\frac p{\alpha^2\theta}\Bigr\rceil, + \Bigl\lceil\frac{p+1}{4\alpha^2}+\frac1\theta\Bigr\rceil\Bigr\}. +\]''') + text = replace_once(text, r'''than $p^2$ and time +\[ + O(tp^{3/2+\delta}\alpha). +\] +The constant is uniform in $p,s,t,\alpha$.''', r'''than $p^2$, using respectively +\[ + O((t+p)p^{1+\delta})\quad\text{and}\quad + O(n_{\alpha,\theta}(t+p)p^{1+\delta}) +\] +time. The constants are uniform in $p,s,t,\alpha$.''') + text = replace_once(text, r'''frequency by $-s$. Since $\alpha^2p/\alpha^4$, we have +$\alpha^2\theta>p/\alpha^2>1$. Thus $\|N-I\|<1/2$, so $N$ is invertible''', + r'''frequency by $-s$. The cited Lemma~4.6 assumes only $\alpha^2\theta\ge1$, +which holds here; it gives $\|N-I\|<2.01e^{-\pi/2}<0.42$. The proof of the cited +Proposition~4.7(i) uses only this bound, $\alpha\ge2$ and the cited Lemma~4.5, +so its norm bounds below also hold. Thus $\|N-I\|<1/2$, so $N$ is invertible''') + text = replace_once(text, r'''\paragraph{Ordered numerical maps.} +Lemmas~4.8, 4.9 and 4.12 of +\cite{HarveyHoeven2021} supply the following algorithms. Their inputs +and outputs are in increasing coordinate order, and every output is in +the disk grid. The record conversions and tape movement needed to use +these routines in our format are accounted for below. Their numerical +guarantees are +\[ +\begin{array}{c|c|c} + \text{map}&\text{error bound}&\text{time bound}\\ \hline + \widetilde{\mathsf S}'&16p&O(tp^{3/2+\delta}\alpha)\\ + \widetilde{\mathsf J}'&3p^2/4&O(tp^{3/2+\delta}\alpha)\\ + \widetilde{\mathsf D}'&4&O(tp^{1+\delta}). +\end{array} +\]''', r'''\paragraph{Ordered numerical maps.} +Lemma~4.8 of \cite{HarveyHoeven2021} supplies $\widetilde{\mathsf D}'$. +Lemma~\ref{lem:chirped-gaussian} below supplies $\widetilde{\mathsf S}'$ +and an approximation $\widetilde E$ of $E=N-I$ by chirped correlations. +For $\widetilde{\mathsf J}'$ we use the Neumann evaluation of +\cite[Lemma~4.12]{HarveyHoeven2021} with this $\widetilde E$ and with +$n_{\alpha,\theta}$ terms. Its error analysis uses only $\|E\|<1/2$, +$\varepsilon(\widetilde E)

2^{-30}. +\end{gathered} +\end{equation} +Since $\sigma<\tau$, the compact-control recurrence has +$\chi=\tau+(1-\beta)\max\{\sigma-\tau,0\}=\tau$, and exact rational +comparisons give +\[ + \max\{\tau,\sigma,\chi\}<\lambda<\lambda'<1,\quad + \sigma+\beta(1-\sigma)<\lambda',\quad 1-c<\lambda'. +\] +The stopping test is $e^{1000}\eta$. Therefore +\[ + \alpha^4\theta_i>\frac{32db}{4d}=8b>6b=p. +\] +The choice of $\alpha$ gives +$\alpha=\Theta(p^{1/4+\epsilon/4})$, and \eqref{eq:gamma} already +ensures $2\leq\alpha<\sqrt p$ for large $n$. We also have +$t_i\leq r\leq T<8n/b<2^{6b}=2^p$.''', r'''Writing $\theta_i=t_i/s_i-1$, the bounds on $s_i$ give +$\eta<\theta_i<2\eta/(1-2\eta)=1/(2d-1)\le1/4$ once $d\geq3$. Therefore +\[ + \alpha^2\theta_i>\frac b{16d}\cdot\frac1{4d}=\frac b{64d^2}\geq1 +\] +once $b\geq64d^2$, which holds for large $n$ because $d^2\le b^{2\epsilon}$ +and $2\epsilon<1$. The Neumann counts of +Lemma~\ref{lem:no-sort-resampling} satisfy +\[ + n_{\alpha,\theta_i}\le\frac{p+1}{4\alpha^2}+\frac1{\theta_i}+1 + \le\frac{(6b+1)16d}{4b}+4d+1\le30d. +\] +We also have $t_i\leq r\leq T<8n/b<2^{6b}=2^p$ and $t_i\ge r/2>p$.''') + text = replace_once(text, r'''Gaussian line maps & $dp^{1/2+\delta}\alpha$ & $3/4+\delta+5\epsilon/4$\\''', + r'''Gaussian line maps & $d^2p^\delta$ & $2\epsilon+\delta$\\''') + text = replace_once(text, r''' g_5=1/4-\delta-5\epsilon/4,\\''', r''' g_5=1-\delta-2\epsilon,\\''') + text = replace_once(text, r''' =\frac{14779261}{25\cdot10^{15}}>\frac{59}{10^{11}}=\kappa.''', + r''' =\frac{147947041}{10^{17}}>\frac{1479}{10^{12}}=\kappa.''') + text = replace_once(text, r'''The guard is $O(d^{49961/10000})=o(p)$, while +$\alpha=\Theta(p^{119999/400000})$ and +$\gamma=O(p^{159997/200000})=o(p)$. Also +$K=\Theta(p^{19979001/10^8})=o(\ell)$, $K/\log p\to\infty$, +and $\ell=\Theta(p^{80001/100000})$. The prime-interval ratio grows as +$p^{30001/50000}$.''', r'''The guard is $O(d^{19601/10000})=o(p)$, while +$\alpha=\Theta(p^{50001/200000})$ and $\gamma\le b/4$. Also +$K=\Theta(p^{499940001/10^9})=o(\ell)$, $K/\log p\to\infty$, +and $\ell=\Theta(p^{50001/100000})$. The prime-interval ratio grows as +$p^{1/50000}$, and so does $b/d^2$.''') + text = replace_once(text, r'''For Gaussian resampling, axis $i$ has at most $T/t_i$ processed lines. +The line-machine costs therefore sum to +\[ + \sum_{i=1}^d\frac{T}{t_i} + O(t_i p^{3/2+\delta}\alpha) + =O(dTp^{3/2+\delta}\alpha). +\] +Dividing by $V=Tp$ gives the fifth row. The factor +$\alpha=\Theta(p^{1/4+\epsilon/4})$ explains its displayed power of $p$.''', + r'''For Gaussian resampling, axis $i$ has at most $T/t_i$ processed lines, +each of length $t_i>p$. Since every Neumann count is at most $30d$, the +line-machine costs sum to +\[ + \sum_{i=1}^d\frac{T}{t_i} + O(30d\,t_i p^{1+\delta}) + =O(d^2Tp^{1+\delta}). +\] +Dividing by $V=Tp$ gives the fifth row.''') + return text + + +def patched_files(): + witness_only() # full checks run in fast_gaussian.py and the tests + for name, old, new in complex_files(): + if name.endswith(('main.tex', '00-introduction.tex')): + new = replace_once(new, r'\kappa=59/10^{11}', r'\kappa=1479/10^{12}') + if name.endswith('main.tex'): + new = replace_once(new, r'''\small Compressed complex network: eumemic}''', + r'''\small Compressed complex network and fast resampling: eumemic}''') + new = replace_once(new, r'''and a compressed complex network prepared with assistance from Claude +(Anthropic).''', r'''and a compressed complex network and faster Gaussian resampling prepared +with assistance from Claude (Anthropic).''') + elif name.endswith('07-resampling.tex'): new = resampling(new) + elif name.endswith('08-assembly.tex'): new = assembly(new) + new = new.replace('% Compressed complex network added October 7, 2026.\n', + '% Compressed complex network added October 7, 2026.\n' + '% Fast Gaussian resampling added October 8, 2026.\n') + yield name, old, new + + +if __name__ == '__main__': + patch = ''.join(''.join(difflib.unified_diff(old.splitlines(keepends=True), + new.splitlines(keepends=True), fromfile=f'a/{name}', tofile=f'b/{name}')) + for name, old, new in patched_files()) + (ROOT/'patches/fast-gaussian-30.patch').write_text(patch) + print('Wrote independent fast-Gaussian patch; conditional kappa=1479/10^12 > 2^-30.') diff --git a/scripts/make_prime_field_patch.py b/scripts/make_prime_field_patch.py new file mode 100644 index 0000000000..064f9b345c --- /dev/null +++ b/scripts/make_prime_field_patch.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +"""Pinned-source patch for the conditional 373/10^11 > 2^-28 construction.""" +import difflib +from pathlib import Path +from make_patch import replace_once +from make_fast_gaussian_patch import patched_files as retained_files +from prime_field_network import witness +ROOT=Path(__file__).resolve().parents[1] + + +def patched_files(): + result=witness();cn=result['complex'] + for name,old,new in retained_files(): + if name.endswith(('main.tex','00-introduction.tex')): + new=replace_once(new,r'\kappa=1479/10^{12}',r'\kappa=373/10^{11}>2^{-28}') + if name.endswith('main.tex'): + new=replace_once(new,r'\small Compressed complex network and fast resampling: eumemic}', + r'\small Compressed complex network and fast resampling: eumemic\\'+ '\n'+ + r'\small Ternary five-subset contribution: Zhihao Chen (jacklightChen)}') + new=new.replace('with assistance from Claude (Anthropic).', + 'with assistance from Claude (Anthropic). The ternary five-subset construction, ' + 'star resynthesis and paired complex producer are contributed by Zhihao Chen ' + '(jacklightChen), with substantial GPT-6 Astra assistance (as identified by the contributor).') + elif name.endswith('03-motifs.tex'): + marker=r'''The exponents used from now on are +\begin{equation}\label{eq:explicit-motif-exponents} + \tau=1-296/10^{11},\qquad\sigma=1-14/10^9. +\end{equation} +''' + replacement='The preceding constructions provide the retained interfaces and comparison witnesses.\n'+(ROOT/'notes/prime-field28-construction.tex').read_text()+r''' +The selected exponents used from now on are +\begin{equation}\label{eq:explicit-motif-exponents} + \tau=1-3/400000000,\qquad\sigma=1-39/10^9. +\end{equation} +''' + new=replace_once(new,marker,replacement) + elif name.endswith('04-swap.tex'): + new=new.replace('prop:paired-bit-interface','prop:prime-field-bit-interface') + new=new.replace(r'W=W_{\rm b}^{\rm pair}',r'W=W_{\rm b}').replace(r's=s_{\rm b}^{\rm pair}',r's=s_{\rm b}') + new=new.replace(r'\tau=1-\frac{296}{10^{11}}',r'\tau=1-\frac3{400000000}') + new=new.replace('pointwise bit gates','pointwise finite-alphabet gates').replace('pointwise\nbit gate','pointwise\nfinite-alphabet gate') + elif name.endswith('05-layers.tex'): + new=new.replace('prop:compressed-complex-interface','prop:prime-field-complex-interface') + new=replace_once(new,r'$m=m_{\rm c}=15625$, $W=W_{\rm c}=1741801270000$ and', + '$m=m_{\\rm c}='+str(cn['m'])+'$, $W=W_{\\rm c}='+str(cn['W'])+'$ and') + new=replace_once(new,r'$s=s_{\rm c}=27215641140750000$ from', + '$s=s_{\\rm c}='+str(cn['s'])+'$ from') + new=new.replace('296/10^{11}','3/400000000').replace('14/10^9','39/10^9') + elif name.endswith('08-assembly.tex'): + replacements={r'a=296/10^{11}':r'a=3/400000000',r'a_{\rm c}=14/10^9':r'a_{\rm c}=39/10^9', + r'\epsilon=\frac{49999}{100000}':r'\epsilon=\frac{4999}{10000}', + r'\lambda=1-\frac{29595}{10^{13}}':r'\lambda=1-\frac{749}{10^{11}}', + r"\lambda'=1-\frac{2959}{10^{12}}":r"\lambda'=1-\frac{748}{10^{11}}", + r'\kappa=\frac{1479}{10^{12}}>2^{-30}':r'\kappa=\frac{373}{10^{11}}>2^{-28}', + r'b^{19999/100000}':r'b^{4999/10000}',r'd^{100000}\le b^{19999}':r'd^{10000}\le b^{4999}', + r'\frac{147947041}{10^{17}}>\frac{1479}{10^{12}}=\kappa':r'\frac{934813}{250000000000000}>\frac{373}{10^{11}}=\kappa', + r'p^{50001/200000}':r'p^{5001/20000}',r'p^{499940001/10^9}':r'p^{49985001/10^8}', + r'p^{50001/100000}':r'p^{5001/10000}',r'p^{1/50000}':r'p^{1/5000}'} + for a,b in replacements.items():new=replace_once(new,a,b) + yield name,old,new + + +def patch_text(): + return ''.join(''.join(difflib.unified_diff(old.splitlines(keepends=True),new.splitlines(keepends=True), + fromfile=f'a/{name}',tofile=f'b/{name}')) for name,old,new in patched_files()) + +if __name__=='__main__': + (ROOT/'patches/prime-field28.patch').write_text(patch_text()) + print('Wrote pinned-source patch; conditional 373/10^11 > 2^-28.') diff --git a/scripts/paired_complex.py b/scripts/paired_complex.py new file mode 100644 index 0000000000..6cf1784679 --- /dev/null +++ b/scripts/paired_complex.py @@ -0,0 +1,19 @@ +"""Paired weighted-triple exclusion in eumemic's complex side interface. + +The inherited point-label and injection-splitting verifier is from PR #3. +The new disjoint producer is PairedTriple, with unchanged pair-star correction. +""" +from fractions import Fraction as Q +from math import comb,log,log1p +import argparse,json +from paired_triple_circuit import PairedTriple +from complex_circuit import ComplexSideCircuit,Checks + +class PairedComplex(ComplexSideCircuit): + def build_disjoint(self): + paired=PairedTriple(self.h) + nodes={0:0}|{j+1:self.input[t] for j,t in enumerate(paired.inputs)} + for n in sorted(paired.active): + if paired.args[n]: + a,b=paired.args[n];nodes[n]=self.add(nodes[a],nodes[b],'d0') + for S,n in paired.outputs.items():self.emit(S,nodes[n],Q(1,2)) diff --git a/scripts/paired_triple_circuit.py b/scripts/paired_triple_circuit.py new file mode 100644 index 0000000000..6b10e490b7 --- /dev/null +++ b/scripts/paired_triple_circuit.py @@ -0,0 +1,112 @@ +"""Cancellation-free weighted triple exclusion by recursively paired points. + +Scalar producer for the p=3 five-subset motif and complex disjoint sums. It +generalizes the repository's paired weighted-edge recursion to degree three. +""" +from itertools import combinations +from collections import defaultdict,Counter +import argparse +import json +from paired_exclusion_circuit import PairedExclusionCircuit + + +class PairedTriple(PairedExclusionCircuit): + def __init__(self,n,base=4): + self.n=n;self.base=base + self.inputs=list(combinations(range(n),3)) + self.variables={s:i+1 for i,s in enumerate(self.inputs)} + self.support=[0]+[1<=2 + return dict(h=self.h,inputs=v,roles=self.roles,side_coefficients_exact=True,retained_coefficients_exact=True,every_node_has_common_pair=True) + + +def scalar_control(c): + code=c.compile();v=len(c.inputs);R=c.roles;n=2*v+R + rows=[{i:1} for i in range(n)];x=rows[:v];y=rows[v:2*v];z=rows[2*v:] + def update(a,b,sign): + for k,x in b.items(): + value=(a.get(k,0)+sign*x)%3 + if value:a[k]=value + else:a.pop(k,None) + def L(sign): + for _,ins,outs in code['gates'] if sign==1 else reversed(code['gates']): + if sign==1: + for slot in ins[1:]:update(z[ins[0]],z[slot],1) + for slot in outs[1:]:update(z[slot],z[ins[0]],1) + else: + for slot in outs[1:]:update(z[slot],z[ins[0]],-1) + for slot in ins[1:]:update(z[ins[0]],z[slot],-1) + def V(sign,bank): + for T,slot in code['sources'].items():update(z[slot],bank[c.variables[T]-1],sign) + def J(sign,bank): + for i,j in c.side:update(bank[j],z[code['outputs'][i]],-sign) + def Rscatter(sign,bank): + for i,C in c.totals: + for j,S in enumerate(c.inputs): + if set(C)<=set(S):update(bank[j],z[code['outputs'][i]],sign) + def invoke(source,target,inverse=False): + ops=[(L,1),(Rscatter,-1),(J,-1),(L,-1),(V,1),(L,1),(Rscatter,1),(J,1),(L,-1),(V,-1)] + if inverse:ops=[(op,-sign) for op,sign in reversed(ops)] + for op,sign in ops: + if op is L:op(sign) + else:op(sign,source if op is V else target) + original=[dict(r) for r in rows];invoke(x,y);expected=[dict(r) for r in original] + for j in range(v):update(expected[v+j],expected[j],1) + assert rows==expected + invoke(x,y,True);assert rows==original + invoke(x,y);invoke(y,x,True);invoke(x,y) + for row in x: + for k in row:row[k]=(-row[k])%3 + expected=[dict(r) for r in original];expected[:v]=original[v:2*v];expected[v:2*v]=original[:v] + assert rows==expected + return dict(h=c.h,all_basis_inputs=n,dirty_scratch_restored=True,forward_inverse_exact=True,corrected_three_stage_exchange=True) + + +@lru_cache(None) +def basis(rows): + if not rows:return () + a=[[Q(x) for x in row] for row in rows];r=0 + for j in range(len(a[0])): + k=next((k for k in range(r,len(a)) if a[k][j]),None) + if k is None:continue + a[r],a[k]=a[k],a[r];v=a[r][j];a[r]=[x/v for x in a[r]] + for k in range(len(a)): + if k!=r and a[k][j]: + v=a[k][j];a[k]=[x-v*y for x,y in zip(a[k],a[r])] + r+=1 + if r==len(a):break + return tuple(tuple(row) for row in a[:r]) + + +def frame_control(c): + h=c.h;code=c.compile();v=len(c.inputs);R=c.roles + full=tuple(tuple(int(i==j) for j in range(h)) for i in range(h));zero=() + lines=[(tuple(int(i in T) for i in range(h)),) for T in c.inputs] + labels={} + for node in sorted(c.active): + if c.args[node]: + a,b=c.args[node];labels[node]=basis(labels[a]+labels[b]) + else:labels[node]=basis(lines[node-1]) + @lru_cache(None) + def perp(U): + if not U:return full + equations=basis(tuple(tuple(x-Q(2,25)*sum(u) for x in u) for u in U)) + pivots=[next(i for i,x in enumerate(row) if x) for row in equations] + vectors=[] + for f in range(h): + if f in pivots:continue + vector=[Q(0)]*h;vector[f]=Q(1) + for row,pivot in zip(equations,pivots):vector[pivot]=-row[f] + vectors.append(tuple(vector)) + return basis(tuple(vectors)) + @lru_cache(None) + def nonsingular(U): + gram=tuple(tuple(sum(x*y for x,y in zip(u,v))-Q(2,25)*sum(u)*sum(v) for v in U) for u in U) + return len(basis(gram))==len(U) + for U in labels.values():assert nonsingular(U) + for i,C in c.totals:assert len(labels[c.outputs[i]])==h-2 + @lru_cache(None) + def transition(U,V): + assert nonsingular(U) and nonsingular(V) + if len(U)<=len(V):assert len(basis(U+V))==len(V) + else:assert len(basis(U+V))==len(U) + return abs(len(V)-len(U)),max(len(U)-len(V),0) + results=[] + for reverse in (False,True): + frames=[basis(x) for x in lines]+[zero]*(v+R);total=loss=0 + def gate(wires,U): + nonlocal total,loss + for w in set(wires): + a,b=transition(frames[w],U);total+=a;loss+=b;frames[w]=U + def mix(mode,inverse=False): + for node,ins,outs in reversed(code['gates']) if inverse else code['gates']: + U=zero if mode=='low' else full if mode=='high' else labels[node] if mode=='node' else perp(labels[node]) + gate([2*v+s for s in ins+outs],U) + def copy(bank,mode): + for T,slot in code['sources'].items(): + j=c.variables[T]-1;U=zero if mode=='low' else full if mode=='high' else basis(lines[j]) if mode=='line' else perp(basis(lines[j])) + gate([bank+j,2*v+slot],U) + def inject(bank,mode): + groups=[[] for _ in c.inputs] + for i,j in c.side:groups[j].append(2*v+code['outputs'][i]) + for j,slots in enumerate(groups): + U=zero if mode=='low' else full if mode=='high' else basis(lines[j]) if mode=='line' else perp(basis(lines[j])) + gate([bank+j]+slots,U) + def scatter(bank,U):gate(list(range(bank,bank+v))+[2*v+code['outputs'][i] for i,_ in c.totals],U) + if not reverse: + mix('low');scatter(v,zero);inject(v,'low');mix('low',True);copy(0,'line');mix('node');scatter(v,zero);inject(v,'perp');mix('high',True);copy(0,'high') + else: + copy(v,'low');mix('low');inject(0,'line');scatter(0,full);mix('perp',True);copy(v,'perp');mix('high');inject(0,'high');scatter(0,full);mix('high',True) + for j in range(v):gate([j],full);gate([v+j],perp(basis(lines[j]))) + gate(list(range(2*v,2*v+R)),full) + assert loss==comb(h,2)*(h-2) + assert total==(2*v+R)*h-2*v+2*loss + results.append(dict(reverse=reverse,total_rank=total,loss=loss,every_edge_nested_and_nondegenerate=True)) + return dict(h=h,frames=results) + +if __name__=='__main__': + p=argparse.ArgumentParser();p.add_argument('--h',type=int,default=8);p.add_argument('--frames',action='store_true');a=p.parse_args();start=time.monotonic() + print(json.dumps(dict(matching=matching())),flush=True) + c=SmallProducer(a.h);print(json.dumps(dict(producer=c.verify_map())),flush=True) + print(json.dumps(dict(scalar=scalar_control(c))),flush=True) + if a.frames:print(json.dumps(dict(physical_frames=frame_control(c))),flush=True) + print(json.dumps(dict(elapsed=time.monotonic()-start)),flush=True) diff --git a/scripts/prime_field_circuit.py b/scripts/prime_field_circuit.py new file mode 100644 index 0000000000..e46911168c --- /dev/null +++ b/scripts/prime_field_circuit.py @@ -0,0 +1,136 @@ +"""Exact producer for the retained F3 five-subset network. + +The global graph is enumerated by a standard-library C++ checker. Its keys +are full support descriptions, not fingerprints. A second independent pass +checks the replacement templates and every requested boundary value. +""" +from collections import Counter +from itertools import combinations +from pathlib import Path +from hashlib import sha256 +import json +import struct +import subprocess +import tempfile +from paired_triple_circuit import PairedTriple + + +def point_orders(h,mode='aligned'): + if mode!='aligned' or h%2:raise ValueError('Use aligned pairs at even h') + orders={} + for C in combinations(range(h),2): + intact=[(i,i+1) for i in range(0,h,2) if i not in C and i+1 not in C] + tail=[i for i in range(h) if i not in C and (i^1) in C] + orders[C]=[i for pair in intact for i in pair]+tail + assert sorted(orders[C])==[i for i in range(h) if i not in C] + return orders + + +def export_local(path,n=26): + c=PairedTriple(n);result=c.verify() + total=c.triple(list(range(n)),c.variables)[()] + assert c.support[total]==(1<>i&1);variables=[] + if c.args[node] and fixed: + mask=c.support[node] + while mask: + low=mask&-mask;mask-=low + t=tuple(x for x in c.inputs[low.bit_length()-1] if x not in fixed) + variables.append(t[0]*32+t[1] if len(t)==2 else t[0]) + words(node,a,b,core[node],len(variables),*variables) + for S,node in c.outputs.items():words(*S,node) + words(0xffffffff,0xffffffff,0xffffffff,total) + result['retained_additions']=sum(c.args[x] is not None for x in c.active) + result['retained_total_exact']=True + result['binary_sha256']=sha256(path.read_bytes()).hexdigest() + return result + + +def optimize(masks): + """Greedy disjoint CSE, with fully specified tie breaks and exact supports.""" + leaves=sorted({1<>i&1}) + terms=[set(x for x in leaves if mask&x) for mask in masks] + nodes=set(leaves);gates=[] + while any(len(t)>1 for t in terms): + freq=Counter(p for t in terms for p in combinations(sorted(t),2)) + a,b=min(freq,key=lambda p:(-freq[p],(p[0]|p[1]).bit_count(),p[0]|p[1],p)) + assert not a&b + node=a|b + if node not in nodes:nodes.add(node);gates.append((a,b)) + for t in terms: + if a in t and b in t:t.remove(a);t.remove(b);t.add(node) + for t in terms: + contained=[x for x in t if x&~node==0] + if len(contained)>1 and sum(contained)==node: + t.difference_update(contained);t.add(node) + assert [next(iter(t)) for t in terms]==masks + return gates + + +def canonical(core,masks,h=28): + order=[x for x in range(h) if not core&(1<>x&1) for m in masks)) + + +def export_templates(demands,path,h=28): + cache={};old=new=stars=0 + for line in demands.read_text().splitlines(): + core,before,*masks=map(int,line.split());key=canonical(core,masks,h) + if key not in cache:cache[key]=optimize(list(key)) + old+=before;new+=len(cache[key]);stars+=1 + with path.open('wb') as f: + def words(*xs):f.write(struct.pack('<'+'I'*len(xs),*xs)) + words(h,len(cache)) + for targets,gates in sorted(cache.items()): + words(len(targets),len(gates),*targets) + for a,b in gates:words(a,b) + return dict(stars=stars,templates=len(cache),old_additions=old,new_additions=new, + saved=old-new,sha256=sha256(path.read_bytes()).hexdigest()) + + +def check_global_producer(): + """Rebuild full h28 support count and independently verify all templates. + + Uses about 1.2 GB memory, under 30 MB temporary storage, and a C++17 compiler. + No large generated graph or machine-specific executable is committed. + """ + source=Path(__file__).with_name('prime_field_supports.cpp') + with tempfile.TemporaryDirectory(prefix='prime-field28-') as folder: + root=Path(folder);binary=root/'check';local=root/'local.bin';demands=root/'demands.txt';templates=root/'templates.bin' + local_check=export_local(local) + subprocess.run(['c++','-std=c++17','-O3',str(source),'-o',str(binary)],check=True) + first=subprocess.run([str(binary),str(local),'-',str(demands)],check=True,capture_output=True,text=True) + original=json.loads(first.stdout);original.pop('seconds',None) + replacements=export_templates(demands,templates) + second=subprocess.run([str(binary),str(local),'-',str(demands),str(templates)],check=True,capture_output=True,text=True) + repeated,verified=map(json.loads,second.stdout.splitlines());repeated.pop('seconds',None) + assert original==repeated + assert verified['role_upper_bound']==11840940 + assert verified['old_star_additions']==replacements['old_additions'] + assert verified['new_star_additions']==replacements['new_additions'] + return dict(local=local_check,global_before_replacement=original, + replacements=replacements,independent_template_check=verified) + + +if __name__=='__main__': + print(json.dumps(check_global_producer(),indent=2,sort_keys=True)) diff --git a/scripts/prime_field_network.py b/scripts/prime_field_network.py new file mode 100644 index 0000000000..3492b2ecb2 --- /dev/null +++ b/scripts/prime_field_network.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +"""Conditional 373/10^11 > 2^-28 certificate: new F3 interchange and paired complex circuits. + +Substantial new construction by Zhihao Chen (jacklightChen), with GPT-6 Astra +assistance. The attribution and retained dependencies are in NOTICE and the note. +""" +from dataclasses import asdict +from fractions import Fraction as Q +from hashlib import sha256 +from math import comb +from pathlib import Path +import argparse,json +from certify import Parameters,require,verify_sources +from prepare_layers import serializable +from search_network import log_integer_bounds +from complex_circuit import Checks,verify_role_frames +from complex_network import guard +from fast_gaussian import fast_constraints,fast_margins +from compact_control_layer import layer_exponents +from paired_complex import PairedComplex +from prime_field_circuit import check_global_producer +from prime_field_checks import matching,SmallProducer,scalar_control,frame_control + +ROOT=Path(__file__).resolve().parents[1] +BIT_SAVING=Q(3,400000000) +COMPLEX_SAVING=Q(39,10**9) +KAPPA=Q(373,10**11) +H=28 +BIT_ROLES=11840940 +COMPLEX_ROLES=93838 + + +def bit_counts(roles=BIT_ROLES,center_dimension=H-2): + h=H;v=comb(h,5);m=h**3;N=v**3;c=comb(h,2);W=2*v*v*(v+roles) + L=3*v*v*c*center_dimension;D=N-2*L + require(D>0,'No bit rank deficit') + return dict(h=h,v=v,m=m,N=N,roles=roles,retained_totals=c,W=W,L=L,D=D,s=W*m-D,eta=Q(D,W*m)) + + +def complex_counts(c=None): + h=H;v=comb(h,3);m=h**3;N=v**3;I=3*v*v;R=COMPLEX_ROLES if c is None else c.roles + W=2*v*v*(v+R+h+1);L=I*h*(h+1);D=2*N-2*L + n=dict(h=h,v=v,m=m,N=N,I=I,roles=R,W=W,L=L,D=D,s=W*m-D,eta=Q(D,W*m)) + additions=61022 if c is None else c.additions + gates=I*(4*(additions+v)+4*v+4) + require(gates<=12*W,'Complex scalar gate enclosure failed') + n['scalar_gates']=gates + return n + + +def parameters(): + return Parameters(tau=1-BIT_SAVING,sigma=1-COMPLEX_SAVING, + epsilon=Q(4999,10000),c=Q(9999,10000),lam=1-Q(749,10**11), + lamp=1-Q(748,10**11),kappa=KAPPA,beta=Q(19,25),delta=Q(1,10**6),C1=Q(19601,10000)) + + +def witness(p=None,bn=None,cn=None): + p=parameters() if p is None else p;bn=bit_counts() if bn is None else bn;cn=complex_counts() if cn is None else cn + bit_log=Q(9997,1000);complex_log=Q(10) + require(log_integer_bounds(bn['m'])[1](1-p.tau)*bit_log,'Unsupported bit exponent') + require(cn['eta']>(1-p.sigma)*complex_log,'Unsupported complex exponent') + g=guard(cn,p.beta,Q(1,10000));E=g['E'];W=cn['W'];s=cn['s'] + require(36*W**3+4*s+4*W+40,'Constraint failed: '+name) + margins=fast_margins(p) + require(min(margins.values())>p.kappa,'No strict final absorption gap') + return dict(parameters=asdict(p),bit=bn,complex=cn,guard=g, + log_upper=dict(bit=bit_log,complex=complex_log), + deficit_slacks=dict(bit=bn['eta']-(1-p.tau)*bit_log,complex=cn['eta']-(1-p.sigma)*complex_log), + recurrence=exponents,constraints=constraints,margins=margins, + minimum_margin=min(margins.values()),absorption_gap=min(margins.values())-p.kappa) + + +def certificate(): + producer=check_global_producer() + require(producer['independent_template_check']['role_upper_bound']==BIT_ROLES,'Bit width mismatch') + small=SmallProducer(8);small_map=small.verify_map();scalar=scalar_control(small);frames=frame_control(small) + c=PairedComplex(H);checks=Checks(c) + complex_check=dict(stats=c.stats(),map=checks.verify_map(),labels=checks.verify_labels(),roles=verify_role_frames(c,checks)) + require(c.roles==COMPLEX_ROLES,'Complex width mismatch') + files=['scripts/paired_triple_circuit.py','scripts/prime_field_circuit.py','scripts/prime_field_supports.cpp', + 'scripts/prime_field_checks.py','scripts/paired_complex.py','scripts/prime_field_network.py', + 'notes/prime-field28-construction.tex'] + return dict(status='CONDITIONAL 373/10^11 > 2^-28 WITNESS; NOT FULL FORMAL VERIFICATION', + upstream_commit=verify_sources(),producer=producer,matching=matching(), + small_controls=dict(coefficients=small_map,all_dirty_basis=scalar,physical_frames=frames), + complex_checks=complex_check,witness=witness(cn=complex_counts(c)), + proof_sha256={name:sha256((ROOT/name).read_bytes()).hexdigest() for name in files}, + scope='Full h28 formal support counts and replacement boundary sums; full complex h28 ' + 'coefficients, binary labels and compiled role frames; all scalar basis inputs and ' + 'rational physical frames at h8. General tensor-stage, finite-alphabet and ' + 'multiplication transfer rely on the written proof and retained upstream interfaces.') + + +if __name__=='__main__': + p=argparse.ArgumentParser();p.add_argument('--quick',action='store_true');a=p.parse_args() + result=witness() if a.quick else certificate() + if not a.quick: + (ROOT/'certificates/prime-field28.json').write_text(json.dumps(serializable(result),indent=2,sort_keys=True)+'\n') + print('PASS conditional 373/10^11 > 2^-28; margin',witness()['minimum_margin'],'gap',witness()['absorption_gap']) diff --git a/scripts/prime_field_supports.cpp b/scripts/prime_field_supports.cpp new file mode 100644 index 0000000000..456fd2bf4f --- /dev/null +++ b/scripts/prime_field_supports.cpp @@ -0,0 +1,93 @@ +// Exact global support merging and dead-node pruning for the F3 five-set motif. +// Exact producer audit; the rational-frame and tape-transfer proof is separate. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using U=uint32_t; using V=uint64_t; +struct Record {U id,a,b,core;std::vector vars;}; +struct Key {std::array x{}; bool operator==(Key const& y)const{return x==y.x;}}; +struct Hash {size_t operator()(Key const& k)const {V h=0x9e3779b97f4a7c15ULL;for(V x:k.x){x^=x>>30;x*=0xbf58476d1ce4e5b9ULL;x^=x>>27;x*=0x94d049bb133111ebULL;x^=x>>31;h^=x+0x9e3779b97f4a7c15ULL+(h<<6)+(h>>2);}return h;}}; +U choose(U n,U r){V x=1; if(r>n)return 0;for(U j=1;j<=r;j++)x=x*(n+1-j)/j;return U(x);} +U rank5(U mask){U r=0,j=1;while(mask){U b=__builtin_ctz(mask);mask&=mask-1;r+=choose(b,j++);}assert(j==6);return r+1;} +U read(std::ifstream& f){U x;f.read(reinterpret_cast(&x),4);assert(f);return x;} +int main(int argc,char** argv){ + assert(argc>=2);auto start=std::chrono::steady_clock::now(); + std::ifstream f(argv[1],std::ios::binary);assert(f); + U n=read(f),ni=read(f),nn=read(f),na=read(f),no=read(f),h=n+2;assert(h<=28 && h%2==0);assert(ni==choose(n,3)); + std::vector records;for(U j=0;j> outputs(no);for(auto& r:outputs)for(auto& x:r)x=read(f); + U v=choose(h,5);std::vector> args(v+1,{0,0});std::vector cores(v+1),starmasks(v+1);std::vector roots;roots.reserve(10*v); + std::unordered_map map3;std::unordered_map map4;map3.reserve(6000000);map4.reserve(3500000); + U pairindex[32][32]{};U ix=0;for(U a=0;a order; + for(U x=0;x ids(nn); + for(auto const& r:records){ + U core=common,m=r.core;while(m){U i=__builtin_ctz(m);m&=m-1;core|=1U<second;if(inserted)args.push_back({a,b});} + else {assert(nc==4);U mask=0;for(U i:r.vars)mask|=1U<second;if(inserted)args.push_back({a,b});} + if(cores.size() active(args.size());std::vector stack(roots);V activecount=0,inputs=0; + while(!stack.empty()){U x=stack.back();stack.pop_back();if(active[x])continue;active[x]=1;if(args[x][0]){assert(args[x][0](std::chrono::steady_clock::now()-start).count(); + std::cout<<"{\"h\":"<=4){ + std::unordered_map> demand;std::unordered_map sizes; + std::vector needed(args.size()); + for(U x=1;x keys;for(auto& [key,masks]:demand)keys.push_back(key);std::sort(keys.begin(),keys.end()); + if(argc>=5){ + std::ifstream tf(argv[4],std::ios::binary);assert(read(tf)==h);U nt=read(tf); + std::map,U> templates; + for(U t=0;t target(nout);for(U& x:target)x=read(tf); + std::set computed;for(U i=0;i order; + for(U x=0;x target; + for(U mask:demand[key]){U z=0;assert(!(mask&key));for(U j=0;jsecond; + } + std::cout<<"{\"optimized_stars\":"<=3 && std::string(argv[2])!="-"){std::ofstream out(argv[2],std::ios::binary);U size=args.size(),nr=roots.size();out.write(reinterpret_cast(&v),4);out.write(reinterpret_cast(&size),4);out.write(reinterpret_cast(&nr),4);out.write(reinterpret_cast(args.data()),args.size()*8);out.write(reinterpret_cast(roots.data()),roots.size()*4);out.write(reinterpret_cast(active.data()),active.size());assert(out);} +} diff --git a/tests/test_batched_network.py b/tests/test_batched_network.py new file mode 100644 index 0000000000..fb9ac3d98d --- /dev/null +++ b/tests/test_batched_network.py @@ -0,0 +1,66 @@ +"""Boundary controls for batching and the corrected Gaussian input budget.""" +from dataclasses import replace +from fractions import Fraction as Q +from math import isqrt +from pathlib import Path +import re +import sys +import unittest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / 'scripts')) +from batched_network import assembly, complex_certificate, parameters +from controlled_bit_rank_moment import certificate as bit_certificate +from make_batched_patch import patched_files + + +class BatchedNetworkTests(unittest.TestCase): + def test_exponent_boundaries(self): + self.assertLess(bit_certificate()['moment_upper'], 1) + self.assertLess(complex_certificate()['moment_upper'], 1) + with self.assertRaises(AssertionError): + bit_certificate(a=Q(246, 10**8)) + with self.assertRaises(ValueError): + complex_certificate(a=Q(7, 10**6)) + result = assembly() + self.assertGreater(result['parameters']['kappa'], Q(1, 2**23)) + self.assertGreater(result['absorption_gap'], 0) + with self.assertRaises(ValueError): + assembly(replace(parameters(), kappa=result['minimum_margin'])) + + def test_shifted_chirp_budget_and_old_enclosure_failure(self): + # pi < 355/113 and log(2) > 693/1000 give a rational witness + # that the old exact-magnitude enclosure cannot absorb shift error. + alpha = 100 + B = 11400 + log2_ratio_lower = B - Q(355, 113)*alpha**2/(4*Q(693, 1000)) + self.assertGreater(log2_ratio_lower, 60) + # Check both near-cutoff and larger legal integer inputs, including + # ceil(sqrt(p)/(2 alpha)) and power-of-two length boundaries. + for p in list(range(101, 401)) + [1024, 10000, 20000]: + for alpha in range(2, isqrt(p-1)+1): + B = (114*alpha**2+99)//100 + width = isqrt(p-1)//(2*alpha)+1 + length = 3*width+1 + ceil_log = (length-1).bit_length() + self.assertLessEqual(length, p) + self.assertLess(p+29*p+B+ceil_log+11, 34*p) + + def test_active_manuscript_interfaces_and_correction(self): + root = Path(__file__).resolve().parents[1] + sources = {str(p.relative_to(root/'upstream')): p.read_text() + for p in (root/'upstream').rglob('*.tex')} + sources.update({name:new for name, old, new in patched_files()}) + text = '\n'.join(sources.values()) + labels = re.findall(r'\\label\{([^}]+)\}', text) + self.assertEqual(len(labels), len(set(labels))) + self.assertFalse(set(re.findall(r'\\(?:ref|eqref)\{([^}]+)\}', text))-set(labels)) + for section in ['06-transforms.tex', '08-assembly.tex']: + self.assertIn('prop:batched-simultaneous-layer', sources['build/sections/'+section]) + gaussian = sources['build/sections/07-resampling.tex'] + self.assertIn(r'$F=2^{\lceil1.14\alpha^2\rceil}', gaussian) + self.assertIn(r'\le 32.14p+11<34p', gaussian) + self.assertNotIn(r'Then $F=e^{\pi\alpha^2/4}', gaussian) + + +if __name__ == '__main__': + unittest.main() From f2ab41aebad47861caf6316282c1793e5513845e Mon Sep 17 00:00:00 2001 From: icekylinx Date: Thu, 8 Oct 2026 17:59:58 +0800 Subject: [PATCH 2/7] Use partial-swap networks for conditional kappa = 1.884586e-6 --- Makefile | 18 + NOTICE | 12 + PATCHING.md | 6 +- README.md | 76 +- SOURCES.json | 15 +- artifacts/partial-swap-note.pdf | Bin 0 -> 137389 bytes certificates/partial-swap-input.json | 419 ++++++ certificates/partial-swap-network.json | 1489 +++++++++++++++++++ docs/reproducibility.md | 76 +- docs/research/current-status.md | 34 +- notes/partial-swap-assembly.tex | 76 + notes/partial-swap-basis.tex | 206 +++ notes/partial-swap-complex.tex | 153 ++ notes/partial-swap-construction.tex | 211 +++ notes/partial-swap-note.tex | 94 ++ scripts/partial_swap/README.md | 42 + scripts/partial_swap/__init__.py | 4 + scripts/partial_swap/binary.py | 29 + scripts/partial_swap/binary_io.hpp | 43 + scripts/partial_swap/graph.py | 48 + scripts/partial_swap/match_exported_dag.cpp | 34 + scripts/partial_swap/match_positive_dag.cpp | 37 + scripts/partial_swap/paired.py | 46 + scripts/partial_swap/positive.py | 100 ++ scripts/partial_swap/shared.py | 163 ++ scripts/partial_swap_network.py | 241 +++ scripts/partial_swap_producer.py | 156 ++ tests/test_partial_swap.py | 56 + 28 files changed, 3791 insertions(+), 93 deletions(-) create mode 100644 artifacts/partial-swap-note.pdf create mode 100644 certificates/partial-swap-input.json create mode 100644 certificates/partial-swap-network.json create mode 100644 notes/partial-swap-assembly.tex create mode 100644 notes/partial-swap-basis.tex create mode 100644 notes/partial-swap-complex.tex create mode 100644 notes/partial-swap-construction.tex create mode 100644 notes/partial-swap-note.tex create mode 100644 scripts/partial_swap/README.md create mode 100644 scripts/partial_swap/__init__.py create mode 100644 scripts/partial_swap/binary.py create mode 100644 scripts/partial_swap/binary_io.hpp create mode 100644 scripts/partial_swap/graph.py create mode 100644 scripts/partial_swap/match_exported_dag.cpp create mode 100644 scripts/partial_swap/match_positive_dag.cpp create mode 100644 scripts/partial_swap/paired.py create mode 100644 scripts/partial_swap/positive.py create mode 100644 scripts/partial_swap/shared.py create mode 100644 scripts/partial_swap_network.py create mode 100644 scripts/partial_swap_producer.py create mode 100644 tests/test_partial_swap.py diff --git a/Makefile b/Makefile index c5179366cb..ee6154c7e9 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ .PHONY: verify note audit-note tuned-note reuse-note incidence-note dag-note shared-point-note paired-note compact-note fetch verify: + $(MAKE) partial-swap-producer partial-swap-certificate python3 scripts/prime_field_network.py python3 scripts/complex_network.py python3 scripts/fast_gaussian.py @@ -120,3 +121,20 @@ else $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/batched-23-note.tex $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/batched-23-note.tex endif + +.PHONY: partial-swap-producer partial-swap-certificate partial-swap-note +partial-swap-producer: + python3 scripts/partial_swap_producer.py + +partial-swap-certificate: + python3 scripts/partial_swap_network.py + +partial-swap-note: + mkdir -p artifacts +ifeq ($(TEX_ENGINE),tectonic) + $(TECTONIC) -Z search-path=$(CURDIR) --outdir artifacts notes/partial-swap-note.tex +else + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/partial-swap-note.tex + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/partial-swap-note.tex + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/partial-swap-note.tex +endif diff --git a/NOTICE b/NOTICE index 2383b2faf9..60b1727d43 100644 --- a/NOTICE +++ b/NOTICE @@ -55,3 +55,15 @@ proof now bounds shifted approximation error by F=2^ceil(1.14 alpha^2). The P=34p precision budget and asymptotic exponent are unchanged. New batching checks are integrated into make verify. Existing attribution and licenses are retained. + +Partial-swap extension, 8 October 2026 +Copyright 2026 icekylinx + +The partial-swap framing, binary retained-total triple construction, +dependency-preserving positive labels and carrier reuse, unequal (25,23,57) +common basis, improved complex batching, and exact assembly are contributed +by icekylinx with substantial OpenAI GPT-6 Astra and Codex assistance. +This extension directly inherits PR #10, commit +62691e395a0458ce089a1c7b5d89e74291e95e29. The portable producer adapters +modify the retained paired-exclusion and shared-point implementations credited +above. The original licenses, attribution, and Gaussian correction are retained. diff --git a/PATCHING.md b/PATCHING.md index 9cba15ab90..131a97f2f7 100644 --- a/PATCHING.md +++ b/PATCHING.md @@ -1,4 +1,8 @@ -# Applying the manuscript patch +# Applying the inherited manuscript patch + +This patch is the PR #10 baseline. The current partial-swap extension is +presented in `notes/partial-swap-note.tex` and its PDF; it is not included +in this historical combined manuscript patch. `patches/batched-23.patch` applies to the original manuscript snapshot at `adc7f1241b42e322a6451854ab7e4b4c146bf78a`, retained under `upstream/`. diff --git a/README.md b/README.md index c9b8bbe455..5b0529fa11 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,57 @@ -# Integer multiplication with a conditional saving beyond 2^-23 +# Integer multiplication with conditional saving 1.884586e-6 \[ T(n)=O\!\left(n(\log n)^{1-\kappa}\right),\qquad -\kappa=\frac{6149999}{50000000000000}>2^{-23}. +\kappa=\frac{942293}{500000000000}=1.884586\times10^{-6}. \] -The construction batches large rational projector blocks and whole complex -residuals in the finite networks of [PR #7](https://github.com/CrocSwap/integer-mult-bounds/pull/7). -A controlled common basis, mixed-width recursion, and an arithmetic dependency -path bound supply the stated exponent. The conclusion is conditional on the -retained upstream multiplication framework and the written interface proofs. +This construction extends [PR #10](https://github.com/CrocSwap/integer-mult-bounds/pull/10). +Partial-swap frames remove the source rank penalty. A retained-total triple +producer over the binary field, compatible carrier reuse, positive frames, +and a common rational basis give the selected tensor dimensions `(25,23,57)`. +The paired auxiliary boundary uses five recursive blocks. Whole-residual +batching also improves the retained complex network. + +The result remains conditional on the pinned upstream analytic and tape +interfaces. Exact finite calculations support the written construction; +they do not constitute formal verification of the complete theorem. ## Proof and reproduction -- [Proof note](artifacts/batched-23-note.pdf) and [LaTeX source](notes/batched-23-note.tex). -- [Exact certificate](certificates/batched-network.json): rank moments, guard, - 29 strict constraints, and seven assembly margins. -- [Combined manuscript patch](patches/batched-23.patch) and [application instructions](PATCHING.md). -- [Review guide](docs/research/batched-review.md) and [source provenance](SOURCES.json). +- [Current proof](artifacts/partial-swap-note.pdf) and [LaTeX source](notes/partial-swap-note.tex). +- [Exact certificate](certificates/partial-swap-network.json): both moments, + the precision guard, 29 strict constraints, and seven assembly margins. +- [Producer reconstruction](scripts/partial_swap_producer.py) and + [finite input data](certificates/partial-swap-input.json). +- [Reproduction instructions](docs/reproducibility.md) and [source provenance](SOURCES.json). ```sh make verify -make batched-note +make partial-swap-note ``` -Verification requires Python 3.11+, a C++17 compiler, Git, and Make. It includes -retained producer checks, the new certificates, regression tests, and patch -application checks. The PDF target requires pdfLaTeX. -For just the new arithmetic and manuscript patch: +Verification requires Python 3.11+, a C++17 compiler, Git, and Make. +Selected producer graphs, carrier matches and positive frames are rebuilt +from source in temporary storage. No large binary graph dumps are committed. +For only the current exact arithmetic, run `make partial-swap-certificate`. -```sh -make batched-certificate batched-patch -``` +The component savings are `188459/50000000000` (bit) and `417/100000000` +(complex). The final strict absorption margin exceeds `4.4822e-13`. +The corrected Gaussian input enclosure from #10 is retained with `P=34p`. -The bit and complex savings are `246/10^9` and `7/10^7`; the precision guard -exponent is `11999/10000`. The final absorption gap is -`362000001/80000000000000000000000 > 0`. -The retained Gaussian input scaling proof uses the corrected enclosure -`F = 2^ceil(1.14 alpha^2)`, with the existing precision `P = 34p`. +The [#10 proof](artifacts/batched-23-note.pdf) and +[combined manuscript patch](patches/batched-23.patch) remain the inherited +baseline. The new standalone proof supplies the stronger construction and +parameters; the older patch does not contain this extension. ## Attribution -Bulk recursion and this integration are contributed by **icekylinx**, with -substantial OpenAI GPT-6 Astra and Codex assistance. The finite ternary network -and paired producers are due to **Zhihao Chen (jacklightChen)**. The construction -builds on **Douglas Colkitt**'s compact-control framework and contributions by -**Bortlesboat**, **eumemic**, and **dleen**; see [NOTICE](NOTICE). - -OpenAI's manuscript is pinned at -`adc7f1241b42e322a6451854ab7e4b4c146bf78a`; its files under `upstream/` are -unchanged. The repository and retained source use Apache-2.0; see -[LICENSE](LICENSE) and [upstream/LICENSE](upstream/LICENSE). -Exact certificates and finite tests do not constitute formal verification -of the full multiplication theorem. +The partial-swap construction and integration are contributed by **icekylinx**, +with substantial OpenAI GPT-6 Astra and Codex assistance. This work builds on +**Douglas Colkitt**'s framework, **Zhihao Chen (jacklightChen)**'s finite network +and paired producers, and contributions by **Bortlesboat**, **eumemic**, and +**dleen**. Original notices are retained in [NOTICE](NOTICE). + +OpenAI's manuscript is pinned at `adc7f1241b42e322a6451854ab7e4b4c146bf78a`. +The repository uses Apache-2.0; see [LICENSE](LICENSE) and +[upstream/LICENSE](upstream/LICENSE). diff --git a/SOURCES.json b/SOURCES.json index e78ff7ba5f..042bf4842c 100644 --- a/SOURCES.json +++ b/SOURCES.json @@ -95,5 +95,18 @@ "change": "Include new batched certificates and manuscript patch in make verify." } ], - "curation": "Retain required producer/generator dependencies, construction sources and certificates. Omit duplicate notes, obsolete alternative batching witness, archive manifests, incremental self-patch, redundant dependency-only manuscript patches, historical standalone PDFs, imported historical tests and local audit outputs. Existing main-branch files are preserved." + "curation": "Retain required producer/generator dependencies, construction sources and certificates. Omit duplicate notes, obsolete alternative batching witness, archive manifests, incremental self-patch, redundant dependency-only manuscript patches, historical standalone PDFs, imported historical tests and local audit outputs. Existing main-branch files are preserved.", + "partial_swap_extension": { + "contributor": "icekylinx", + "parent_PR": "https://github.com/CrocSwap/integer-mult-bounds/pull/10", + "parent_commit": "62691e395a0458ce089a1c7b5d89e74291e95e29", + "archive": "integer_mult_partial_swap_25_23_57_complete.zip", + "archive_sha256": "1414e879aef46d84e9c768750fd70d82aef15d0ebdc4a0148cc61192ebdae64f", + "proof": "artifacts/partial-swap-note.pdf", + "certificate": "certificates/partial-swap-network.json", + "producer": "scripts/partial_swap_producer.py", + "scope": "Partial-swap construction with kappa=942293/500000000000; inherits the corrected analytic and tape interfaces from PR #10.", + "curation": "Import selected producer sources, exact data and proof; regenerate large binaries, omit exploratory alternatives and duplicate baseline snapshot.", + "assistance": "Substantial OpenAI GPT-6 Astra and Codex assistance." + } } diff --git a/artifacts/partial-swap-note.pdf b/artifacts/partial-swap-note.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8db9ece570030bcf1acd32a6b8316800ddca394c GIT binary patch literal 137389 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%0AO=6R4${{x7ss`{$i9Lmfcm>Fj6c+wtx9h1+?e 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 literal 0 HcmV?d00001 diff --git a/certificates/partial-swap-input.json b/certificates/partial-swap-input.json new file mode 100644 index 0000000000..f125702774 --- /dev/null +++ b/certificates/partial-swap-input.json @@ -0,0 +1,419 @@ +{ + "status": "Recorded finite construction; regenerated by scripts/partial_swap_producer.py and certified by scripts/partial_swap_network.py.", + "result": { + "kappa": "942293/500000000000", + "kappa_decimal": 1.884586e-06, + "bit_saving": "188459/50000000000", + "complex_saving": "417/100000000", + "bit_moment_gap_lower": "617/10000000000000000", + "complex_moment_gap_lower": "239/10000000000000", + "assembly_absorption_gap_lower": "44822/100000000000000000" + }, + "parameters": { + "dimensions": [ + 25, + 23, + 57 + ], + "m": 32775, + "N": 119184758000, + "B1": 2658286478540, + "B2": 2609547248000, + "B3": 2972637313800, + "E": 314350835260, + "W": 5820554077800, + "L": 78146437600, + "s": "190768577823254200", + "singletons": 179603173231020, + "deficit": 82076640800, + "eta": "12196/28346854275", + "epsilon": "50000000000/100000188459", + "beta": "1/1000", + "delta": "1/10000000000000000", + "c": "1", + "lambda_rule": "tau + 1/10^20", + "lambda_prime_rule": "tau + 2/10^20", + "C1": "11999/10000", + "zeta": "1/10000" + }, + "producers": { + "23": { + "v": 1771, + "additions": 34764, + "outputs": 5336, + "matches": 1324, + "roles": 38776, + "loss": 506, + "histogram": [ + 9840, + 38409, + 32471, + 8898, + 9754, + 2116, + 5737, + 1725, + 4145, + 1547, + 3128, + 1551, + 2893, + 1925, + 2841, + 2450, + 2327, + 3096, + 2344, + 3628, + 9435, + 2110, + 23, + 23 + ] + }, + "25": { + "v": 2300, + "additions": 45963, + "outputs": 6925, + "matches": 1589, + "roles": 51299, + "loss": 600, + "histogram": [ + 12884, + 50477, + 41948, + 11341, + 13202, + 2948, + 6911, + 1451, + 5205, + 2429, + 3751, + 1361, + 3720, + 2639, + 3241, + 1571, + 3334, + 3366, + 2963, + 4019, + 2608, + 4868, + 12360, + 2802, + 25, + 25 + ] + }, + "57": { + "v": 29260, + "additions": 651213, + "outputs": 87837, + "matches": 9264, + "roles": 729786, + "loss": 3192, + "histogram": [ + 171318, + 651573, + 566364, + 137233, + 164158, + 15372, + 75503, + 8071, + 52184, + 13888, + 20431, + 7625, + 32053, + 10364, + 19167, + 8889, + 27939, + 11286, + 19271, + 8785, + 21602, + 9814, + 19261, + 8795, + 22732, + 12389, + 19365, + 8691, + 21012, + 10404, + 19355, + 8701, + 22142, + 12352, + 19459, + 8597, + 20422, + 10196, + 19449, + 8607, + 19956, + 16818, + 19553, + 8503, + 19604, + 20476, + 18289, + 8171, + 18510, + 37106, + 16535, + 46799, + 14592, + 52132, + 167608, + 40250, + 57, + 57 + ] + } + }, + "bit_bulk_width_multiplicities": [ + [ + 3, + 376334241360 + ], + [ + 5, + 308043772960 + ], + [ + 7, + 3086123666780 + ], + [ + 9, + 381340149960 + ], + [ + 11, + 441158012680 + ], + [ + 13, + 401027081840 + ], + [ + 15, + 462487228280 + ], + [ + 17, + 928745128080 + ], + [ + 19, + 861708917300 + ], + [ + 21, + 420174390020 + ], + [ + 23, + 2932046879300 + ], + [ + 25, + 8044659681520 + ], + [ + 27, + 79645234900 + ], + [ + 29, + 34635269900 + ], + [ + 31, + 79852973200 + ], + [ + 33, + 83404890800 + ], + [ + 35, + 74496583700 + ], + [ + 37, + 33282934300 + ], + [ + 39, + 75396783000 + ], + [ + 41, + 151143869800 + ], + [ + 43, + 67352015500 + ], + [ + 45, + 190626366700 + ], + [ + 47, + 59437593600 + ], + [ + 49, + 212349275600 + ], + [ + 51, + 682717666400 + ], + [ + 53, + 163950325000 + ], + [ + 55, + 476971210100 + ], + [ + 57, + 314583013360 + ], + [ + 463, + 238369516000 + ], + [ + 481, + 238369516000 + ], + [ + 529, + 2609547248000 + ], + [ + 575, + 2609547248000 + ], + [ + 31513, + 238369516000 + ], + [ + 31625, + 2609547248000 + ], + [ + 32611, + 2658286478540 + ], + [ + 32661, + 314350835260 + ] + ], + "complex": { + "h": 28, + "v": 3276, + "N": 35158608576, + "m": 21952, + "B": 1007397164592, + "W": 2085111546336, + "s": "45772350635112192", + "singletons": 9668617358400, + "histogram": [ + 13776, + 93912, + 23891, + 21224, + 31667, + 13552, + 9128, + 9240, + 10912, + 5656, + 8456, + 4284, + 7598, + 4872, + 7448, + 4536, + 7803, + 4228, + 8232, + 4872, + 7482, + 7224, + 5901, + 8400, + 11550, + 1512, + 5180, + 0, + 87 + ], + "macro_width_multiplicities": [ + [ + 21896, + 1007397164592 + ], + [ + 21168, + 1007397164592 + ], + [ + 21141, + 70317217152 + ], + [ + 756, + 972238556016 + ], + [ + 729, + 105475825728 + ] + ], + "path_rank_budget": 22120, + "rho": "6/5", + "path_guard": "4999/5000" + }, + "source_pins": { + "repository": "https://github.com/CrocSwap/integer-mult-bounds", + "pr7": "6725c6a17b17871a35353fd29157f4ed851bc114", + "upstream": "adc7f1241b42e322a6451854ab7e4b4c146bf78a" + }, + "selected_basis": { + "a": 25, + "b": 23, + "k": 57, + "r": 7, + "s": 0, + "H": 575, + "boundary_size": 82, + "first_labels": "[I_25, I_7, I_25, I_25]", + "last_inverse_labels": "[I_25, I_25, I_7, I_25]", + "first_residues": [ + 0, + 2, + 9, + 11 + ], + "last_residues": [ + 10, + 12, + 14, + 21 + ] + } +} diff --git a/certificates/partial-swap-network.json b/certificates/partial-swap-network.json new file mode 100644 index 0000000000..ba6f27766e --- /dev/null +++ b/certificates/partial-swap-network.json @@ -0,0 +1,1489 @@ +{ + "assembly": { + "absorption_gap": "448228070071541/1000001884590000000000000000", + "constraints": { + "K_dominates_log_p": "50000000000/100000188459", + "K_smaller_than_ell": "188459/100000188459", + "alpha_squared_theta_growth": "188459/100000188459", + "beta_below_one": "999/1000", + "beta_positive": "1/1000", + "c_positive": "1", + "crt_layout": "9422985516794681/5000009422950000000000", + "delta_below_one_eighth": "1249999999999999/10000000000000000", + "delta_positive": "1/10000000000000000", + "epsilon_positive": "50000000000/100000188459", + "gaussian_cost": "1884589999899999811541/1000001884590000000000000000", + "guard_width": "40005188459/100000188459", + "kappa_positive": "942293/500000000000", + "lambda_above_sigma": "40082000000001/100000000000000000000", + "lambda_above_tau": "1/100000000000000000000", + "lambda_below_one": "376917999999999/100000000000000000000", + "lambda_prime_above_lambda": "1/100000000000000000000", + "lambda_prime_below_one": "188458999999999/50000000000000000000", + "leaf_cost": "19832500000001/50000000000000000000", + "packed_overhead": "1/100000000000000000000", + "prefix_cost": "188459/100000188459", + "prime_interval_growth": "188459/100000188459", + "r_superpolynomial": "50000188459/100000188459", + "reserved_axes": "49999811541000000001/50000000000000000000", + "scalar_cost": "500001884589999899999811541/1000001884590000000000000000", + "sigma_below_one": "417/100000000", + "sigma_positive": "99999583/100000000", + "tau_below_one": "188459/50000000000", + "tau_positive": "49999811541/50000000000" + }, + "margins": { + "g1": "188459/100000188459", + "g2": "188459/100000188459", + "g3": "188458999999999/100000188459000000000", + "g4": "9422985516794681/5000009422950000000000", + "g5": "1884589999899999811541/1000001884590000000000000000", + "g6": "500001884589999899999811541/1000001884590000000000000000", + "g7": "50000000000/100000188459" + }, + "minimum_margin": "1884589999899999811541/1000001884590000000000000000", + "parameters": { + "C1": "11999/10000", + "beta": "1/1000", + "c": "1", + "delta": "1/10000000000000000", + "epsilon": "50000000000/100000188459", + "kappa": "942293/500000000000", + "lam": "99999623082000000001/100000000000000000000", + "lamp": "49999811541000000001/50000000000000000000", + "sigma": "99999583/100000000", + "tau": "49999811541/50000000000" + }, + "recurrence": { + "internal": "49999811541/50000000000", + "layer": "49999811541/50000000000", + "leaf": "99999583417/100000000000", + "preprocessing": "0" + } + }, + "basis_combinatorics": { + "A5_dual_tree": [ + [ + 23, + 0 + ], + [ + 24, + 1 + ], + [ + 16, + 0 + ], + [ + 17, + 1 + ], + [ + 18, + 2 + ], + [ + 19, + 3 + ], + [ + 20, + 4 + ], + [ + 21, + 5 + ], + [ + 22, + 6 + ], + [ + 24, + 10 + ], + [ + 2, + 11 + ], + [ + 3, + 12 + ], + [ + 4, + 13 + ], + [ + 5, + 14 + ], + [ + 6, + 15 + ], + [ + 7, + 16 + ], + [ + 8, + 17 + ], + [ + 9, + 18 + ], + [ + 10, + 19 + ], + [ + 11, + 20 + ], + [ + 12, + 21 + ], + [ + 13, + 22 + ], + [ + 14, + 23 + ], + [ + 15, + 24 + ] + ], + "A5_forward_tree": [ + [ + 0, + 23 + ], + [ + 1, + 24 + ], + [ + 2, + 0 + ], + [ + 3, + 1 + ], + [ + 4, + 2 + ], + [ + 5, + 3 + ], + [ + 6, + 4 + ], + [ + 7, + 5 + ], + [ + 8, + 6 + ], + [ + 9, + 0 + ], + [ + 10, + 1 + ], + [ + 11, + 2 + ], + [ + 12, + 3 + ], + [ + 13, + 4 + ], + [ + 14, + 5 + ], + [ + 15, + 6 + ], + [ + 16, + 7 + ], + [ + 17, + 8 + ], + [ + 18, + 9 + ], + [ + 19, + 10 + ], + [ + 20, + 11 + ], + [ + 21, + 12 + ], + [ + 22, + 13 + ], + [ + 0, + 14 + ] + ], + "inverse_column_labels": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "permutation_completions": [ + [ + 0, + 23, + 14, + 12, + 1, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 24, + 13, + 11, + 2 + ], + [ + 1, + 24, + 15, + 13, + 0, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 14, + 12, + 3 + ], + [ + 2, + 0, + 16, + 14, + 1, + 3, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 15, + 13, + 4 + ], + [ + 3, + 1, + 17, + 15, + 0, + 2, + 4, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 16, + 14, + 5 + ], + [ + 4, + 2, + 18, + 16, + 0, + 1, + 3, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 19, + 20, + 21, + 22, + 23, + 24, + 17, + 15, + 6 + ], + [ + 5, + 3, + 19, + 17, + 0, + 1, + 2, + 4, + 6, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 20, + 21, + 22, + 23, + 24, + 18, + 16, + 7 + ], + [ + 6, + 4, + 20, + 18, + 0, + 1, + 2, + 3, + 5, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 21, + 22, + 23, + 24, + 19, + 17, + 8 + ], + [ + 7, + 5, + 21, + 19, + 0, + 1, + 2, + 3, + 4, + 6, + 8, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 22, + 23, + 24, + 20, + 18, + 9 + ], + [ + 8, + 6, + 22, + 20, + 0, + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 23, + 24, + 21, + 19, + 10 + ], + [ + 9, + 0, + 23, + 21, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 10, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 24, + 22, + 20, + 11 + ], + [ + 10, + 1, + 24, + 22, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 11, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 0, + 23, + 21, + 12 + ], + [ + 11, + 2, + 0, + 23, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 12, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 1, + 24, + 22, + 13 + ], + [ + 12, + 3, + 1, + 24, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 2, + 0, + 23, + 14 + ], + [ + 13, + 4, + 2, + 0, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 14, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 3, + 1, + 24, + 15 + ], + [ + 14, + 5, + 3, + 1, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 4, + 2, + 0, + 16 + ], + [ + 15, + 6, + 4, + 0, + 2, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 16, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 5, + 3, + 1, + 17 + ], + [ + 16, + 7, + 5, + 0, + 1, + 3, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 19, + 20, + 21, + 22, + 23, + 24, + 6, + 4, + 2, + 18 + ], + [ + 17, + 8, + 6, + 0, + 1, + 2, + 4, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 18, + 20, + 21, + 22, + 23, + 24, + 7, + 5, + 3, + 19 + ], + [ + 18, + 9, + 7, + 0, + 1, + 2, + 3, + 5, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 19, + 21, + 22, + 23, + 24, + 8, + 6, + 4, + 20 + ], + [ + 19, + 10, + 8, + 0, + 1, + 2, + 3, + 4, + 6, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 20, + 22, + 23, + 24, + 9, + 7, + 5, + 21 + ], + [ + 20, + 11, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 7, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 21, + 23, + 24, + 10, + 8, + 6, + 22 + ], + [ + 21, + 12, + 10, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 22, + 24, + 11, + 9, + 0, + 23 + ], + [ + 22, + 13, + 11, + 0, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 23, + 12, + 10, + 1, + 24 + ] + ], + "row_labels": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24 + ], + "scope": "Prescription compatibility and A5 trees; remaining generic minors are proved in the note." + }, + "bit": { + "child_width_multiplicities": [ + [ + 1, + 179603173231020 + ], + [ + 3, + 376334241360 + ], + [ + 5, + 308043772960 + ], + [ + 7, + 3086123666780 + ], + [ + 9, + 381340149960 + ], + [ + 11, + 441158012680 + ], + [ + 13, + 401027081840 + ], + [ + 15, + 462487228280 + ], + [ + 17, + 928745128080 + ], + [ + 19, + 861708917300 + ], + [ + 21, + 420174390020 + ], + [ + 23, + 2932046879300 + ], + [ + 25, + 8044659681520 + ], + [ + 27, + 79645234900 + ], + [ + 29, + 34635269900 + ], + [ + 31, + 79852973200 + ], + [ + 33, + 83404890800 + ], + [ + 35, + 74496583700 + ], + [ + 37, + 33282934300 + ], + [ + 39, + 75396783000 + ], + [ + 41, + 151143869800 + ], + [ + 43, + 67352015500 + ], + [ + 45, + 190626366700 + ], + [ + 47, + 59437593600 + ], + [ + 49, + 212349275600 + ], + [ + 51, + 682717666400 + ], + [ + 53, + 163950325000 + ], + [ + 55, + 476971210100 + ], + [ + 57, + 314583013360 + ], + [ + 463, + 238369516000 + ], + [ + 481, + 238369516000 + ], + [ + 529, + 2609547248000 + ], + [ + 575, + 2609547248000 + ], + [ + 31513, + 238369516000 + ], + [ + 31625, + 2609547248000 + ], + [ + 32611, + 2658286478540 + ], + [ + 32661, + 314350835260 + ] + ], + "counts": { + "B1": 2658286478540, + "B2": 2609547248000, + "B3": 2972637313800, + "E": 314350835260, + "L": 78146437600, + "N": 119184758000, + "W": 5820554077800, + "deficit": 82076640800, + "eta": "12196/28346854275", + "m": 32775, + "s": 190768577823254200, + "singletons": 179603173231020 + }, + "enclosure": "1+u+u^2/(2(1-u/3))", + "exponent": "49999811541/50000000000", + "logarithm_upper_bounds": { + "1": "1299677663579/125000000000", + "11": "3999763017917/500000000000", + "13": "7832471951171/1000000000000", + "15": "768937110753/100000000000", + "17": "236381498893/31250000000", + "19": "3726491164733/500000000000", + "21": "7352898870909/1000000000000", + "23": "7261927092703/1000000000000", + "25": "1794636370941/250000000000", + "27": "1775396110657/250000000000", + "29": "3515062739323/500000000000", + "3": "2324702254991/250000000000", + "31": "6963434104147/1000000000000", + "31513": "39265870543/1000000000000", + "31625": "35718082603/1000000000000", + "32611": "5016374879/1000000000000", + "32661": "3484324083/1000000000000", + "33": "3450456873583/500000000000", + "35": "6842073247143/1000000000000", + "37": "1696625848997/250000000000", + "39": "6733859662503/1000000000000", + "41": "835481155241/125000000000", + "43": "6636221192939/1000000000000", + "45": "3295379409431/500000000000", + "463": "2129847127273/500000000000", + "47": "3273636853461/500000000000", + "481": "4221554038527/1000000000000", + "49": "3252800505261/500000000000", + "5": "4393991698099/500000000000", + "51": "1616398918977/250000000000", + "529": "2063216438387/500000000000", + "53": "160678234877/25000000000", + "55": "31950440617/5000000000", + "57": "3177185020399/500000000000", + "575": "808610253567/200000000000", + "7": "8451511159577/1000000000000", + "9": "256256147853/31250000000" + }, + "moment_upper": "115045343453357130081207038016791227081335157724476211158521071744720285953451560866153133856189955418142433364825083061507812816086450908650773593541081913456940485706195863625084274753718132893889774736176009674019303235056089438833426167617603586399441682430889056681777555792649122409089879534038374491247378327929011754658309426491476155613858915439801907422747786072669729613948340083332223468115897582562440658575889196979610012548473134380424121693306411977110452755029987621863923875751463075524779061259734578097511325976430141168566593790758442537673124092791985768040434872267918128900670337480294080188112948248213681755686565411441655301333891520097629220383968430717623940997640835917636953153143537577031756379499299843516352627505320431433745541870010547077998863500924186387944180364453262817770984227667931696069791/115045343453364237358361766378509739193033587111625717698744034836254315330659473539032832548446481176169153778125876974465904314381929429362056173375150181884197891078871331749554477322135034213143399961442747255578489256699360441889486830117568510374863903652751258139579829335347514676437822448199984676429507712120073528681631592296468741674485452462516553787837245961484263552928332651285524690998727589488385871159945550414316169479863101827777902640443697737418029536535321612874970962224933935702145971739684102033733126815996503123998703844266153982784605663698262514099749599929524916820862292545201054300367360546883050213988651369862562576345520193165406405849369976555982434799600735159386904887098031771012200862144353680448343912227606199503612720697891583567479471990828986971960389990449020035000000000000000000000000", + "saving": "188459/50000000000", + "strict_gap": "7107277154728361718512111698429387149506540222963091534029377207912672879698692256525758026720413300793912958091498295478520711282579834068268427257405372675468124470202568416901319253625225266737581559186021643271003056060662499964923975422221221862201457802273542698392267347942914161610185182129384191061774023322165804992586060626537022714646365089459888814533938979992567953301222882830006925945212584056353434706156931389967447353780947137285760307576781505333991011047086473470860177366910479949523936221800839566361955432110053507711445111481570906276746059314727661606787920191955064906974112254412298669368458302085958420907275011628673067777185465401545838358493801959899241749951733954494193980444482645053836931991284722285768069867178827881036489480608489904800584016209625995757217229015772332068303930209/115045343453364237358361766378509739193033587111625717698744034836254315330659473539032832548446481176169153778125876974465904314381929429362056173375150181884197891078871331749554477322135034213143399961442747255578489256699360441889486830117568510374863903652751258139579829335347514676437822448199984676429507712120073528681631592296468741674485452462516553787837245961484263552928332651285524690998727589488385871159945550414316169479863101827777902640443697737418029536535321612874970962224933935702145971739684102033733126815996503123998703844266153982784605663698262514099749599929524916820862292545201054300367360546883050213988651369862562576345520193165406405849369976555982434799600735159386904887098031771012200862144353680448343912227606199503612720697891583567479471990828986971960389990449020035000000000000000000000000" + }, + "complex": { + "child_width_multiplicities": [ + [ + 1, + 9668617358400 + ], + [ + 2, + 769207250448 + ], + [ + 3, + 683339110272 + ], + [ + 4, + 1019567452176 + ], + [ + 5, + 436327347456 + ], + [ + 6, + 293889907584 + ], + [ + 7, + 297495918720 + ], + [ + 8, + 351328513536 + ], + [ + 9, + 182103562368 + ], + [ + 10, + 272253840768 + ], + [ + 11, + 137929925952 + ], + [ + 12, + 244629219744 + ], + [ + 13, + 156861484416 + ], + [ + 14, + 239799740544 + ], + [ + 15, + 146043451008 + ], + [ + 16, + 251229507984 + ], + [ + 17, + 136126920384 + ], + [ + 18, + 265041818496 + ], + [ + 19, + 156861484416 + ], + [ + 20, + 240894422496 + ], + [ + 21, + 232587718272 + ], + [ + 22, + 189991711728 + ], + [ + 23, + 270450835200 + ], + [ + 24, + 371869898400 + ], + [ + 25, + 48681150336 + ], + [ + 26, + 166778015040 + ], + [ + 27, + 0 + ], + [ + 28, + 2801097936 + ], + [ + 729, + 105475825728 + ], + [ + 756, + 972238556016 + ], + [ + 21141, + 70317217152 + ], + [ + 21168, + 1007397164592 + ], + [ + 21896, + 1007397164592 + ] + ], + "counts": { + "B": 1007397164592, + "N": 35158608576, + "W": 2085111546336, + "h": 28, + "m": 21952, + "s": 45772350635112192, + "singletons": 9668617358400, + "v": 3276 + }, + "enclosure": "1/(1-u)", + "exponent": "99999583/100000000", + "logarithm_upper_bounds": { + "1": "4998306765263/500000000000", + "10": "1923507109383/250000000000", + "11": "118729972777/15625000000", + "12": "3755853440369/500000000000", + "13": "1486332834613/200000000000", + "14": "7357556200911/1000000000000", + "15": "455535208089/62500000000", + "16": "3612012404143/500000000000", + "17": "716340018647/100000000000", + "18": "710624177263/100000000000", + "19": "22038045473/3125000000", + "2": "4651733174983/500000000000", + "20": "1750220314243/250000000000", + "21": "6952091092803/1000000000000", + "21141": "37643968531/1000000000000", + "21168": "36367644171/1000000000000", + "21896": "1277139903/500000000000", + "22": "431598192323/62500000000", + "23": "6861119314597/1000000000000", + "24": "3409279850089/500000000000", + "25": "3388868852829/500000000000", + "26": "1347703398501/200000000000", + "27": "3350388332261/500000000000", + "28": "6664409020351/1000000000000", + "3": "4449000620929/500000000000", + "4": "4305159584703/500000000000", + "5": "2096793904523/250000000000", + "6": "4102427030649/500000000000", + "7": "8050703381471/1000000000000", + "729": "3404939798517/1000000000000", + "756": "3368572154347/1000000000000", + "8": "3958585994423/500000000000", + "9": "779938895319/100000000000" + }, + "moment_upper": "426745256150861796840213508156046733477838397579113514925103731940702110403844443041599217550986233340777131286561915381986675740128054742473405594476031277540243398197767001089966443403542815129398006754120343009783295431498337865051166151994812955430874803422035449626583008644493042199199087919391647585309246110763509278961515891050782193153579224257715995722968958377393404678850525575244972069662958862195958580504300638699038500955817787983755665943802879535844554733637299698615721033045898473061763593211806514083608784734380356901033576781983115174318465550178756385310799214929364493990870043720703125000000000/426745256161096016369435650625547226518107504218648549011562554637886880347082768537480988698228823107560123732027005871019488422882886342817997478375628673872414194273768748639321997242359325454398832172269305849220682686713242452973591417509501418089968754329154366593472877943499262755083453757625895089522811200857536263184337202167853493237546133508989627186772574557551877250018212282851104611724733925185910218969338551242517417324423862891540570497868984940619069613878892976005343962534816820693337277528793462154946385502942574203153534876336985376472906861283054094441894990033570193689854650912815679068323857", + "saving": "417/100000000", + "strict_gap": "10234219529222142469500493040269106639535034086458822697184769943238325495881771147242589766782992445465090489032812682754831600344591883899597396332170796076001747549355553838816510325000825418148962839437387255214904587922425265514688462659093950907118916966889869299006220555884365838234247504213565090094026984222821311117071300083966909251273631463803616180158472571167686707606132542061775062989951638465037912543478916368606074907784904554066105404774514880241593277389622929488918347631573684316986948071337600768562217302119958094353870202154441311104297709131095775104205699698984607192112554068323857/426745256161096016369435650625547226518107504218648549011562554637886880347082768537480988698228823107560123732027005871019488422882886342817997478375628673872414194273768748639321997242359325454398832172269305849220682686713242452973591417509501418089968754329154366593472877943499262755083453757625895089522811200857536263184337202167853493237546133508989627186772574557551877250018212282851104611724733925185910218969338551242517417324423862891540570497868984940619069613878892976005343962534816820693337277528793462154946385502942574203153534876336985376472906861283054094441894990033570193689854650912815679068323857" + }, + "guard": { + "C0": 81520223670171146774910169732666814930732056862720000, + "C1": "11999/10000", + "E": 580186831374453739191483276086074980416, + "dependency_constant": 2900934156872268695957416380430376658245000, + "gamma": "4999/5000", + "path_moment_upper": { + "largest": "95770051/95795000", + "no_large": "553/1000", + "other_large": "276853/280000" + }, + "q": 22120, + "rho": "6/5", + "strict_gap": "579/9579500" + }, + "inherited_PR10_commit": "62691e395a0458ce089a1c7b5d89e74291e95e29", + "kappa": "942293/500000000000", + "scope": "Exact finite arithmetic and basis combinatorics. Producer regeneration is separate. The common-basis, recursion, and retained analytic/tape arguments remain written proofs.", + "source_sha256": { + "certificates/partial-swap-input.json": "a213847b157fa4f2fa02a823538d7e636454b1099cfd1d0200017ab43f0228be", + "notes/partial-swap-assembly.tex": "7e520c2d7d041d56953e7c745964f32530e77a403f37a0addd31188f64535bb6", + "notes/partial-swap-basis.tex": "6d3e918fdcc80c5875fad4453bf540d979782da8f67c758b9e50464a2602f984", + "notes/partial-swap-complex.tex": "be50e94bb385f81f63a05ed83ee1f70e0644b492e29dfb740754d01d48b9cbee", + "notes/partial-swap-construction.tex": "d79e3fed618d85944409801cf46624095282f48592318608c8eb8afc6b56d0ba", + "notes/partial-swap-note.tex": "bb9cc56d384973a8343a3789db7d7c1b353903ecbe4a9118522f14a9d4429b13", + "scripts/partial_swap/README.md": "a81a6a59b89f7db539bc317a7dce23ab84a75c7abebae105091de4e2aeb3f941", + "scripts/partial_swap/__init__.py": "0438eaa34134600467a5864f93c3e15142eb025b35cef189c2e969cffea72a7f", + "scripts/partial_swap/binary.py": "d32d7a23548cc738e974e8e55dd1fa2a8b11d2b80228515617ffe35410bb8805", + "scripts/partial_swap/binary_io.hpp": "7e143eb75bb342ac8f0c82a60005e7c35c9ec827de479bf6fb773151f3af5fa1", + "scripts/partial_swap/graph.py": "fd8c567759e26a10d2bad05508fd0355eb70fb116664d4e06e1858d0d8cb2ef9", + "scripts/partial_swap/match_exported_dag.cpp": "7901b0fb1b80b628a24cfd7fda57bbc32f58771594d08b318b90e4b8cdf0ef82", + "scripts/partial_swap/match_positive_dag.cpp": "8a6d64e2d0ac2c69210fb0b8a5bd0d714ad40b3609f75a5fddfcba3291a3d552", + "scripts/partial_swap/paired.py": "ddcecace3a8e04d690914cbd64873ab8dde8c0c3477a255767b0ed6f639bb0c7", + "scripts/partial_swap/positive.py": "1dadf771226d6e4f3bf9ce3aae2e6a2ad7173f4d1c900299d0663fc4c432f3e8", + "scripts/partial_swap/shared.py": "81e9af92cdf38243a540cdcff2062778e449467848d444da37a9553c12ca4c34", + "scripts/partial_swap_network.py": "acdd81b4dea2815f8838a0c3ea8ac4968f2bc13fd7c99173473d865779096782", + "scripts/partial_swap_producer.py": "dba07d742c68e8e4aedd1d93fc4c47a0481778268f7480997463e2b269fdd0a0" + }, + "status": "Conditional partial-swap integer-multiplication witness" +} diff --git a/docs/reproducibility.md b/docs/reproducibility.md index 0aa0b4409d..9e2afffced 100644 --- a/docs/reproducibility.md +++ b/docs/reproducibility.md @@ -1,61 +1,61 @@ # Reproducing the current result -Run commands from the repository root. Numerical verification needs Python -3.11+, a C++17 compiler, Git, and Make; no third-party Python package or network -access is required. The full h28 support check uses about 1.2 GB of memory. +Run from the repository root with Python 3.11+, a C++17 compiler, Git, and Make. +No third-party Python package or network access is required for verification. +The inherited full h28 support check uses about 1.2 GB of memory. ```sh make verify ``` -This rebuilds the retained ternary and complex producers, regenerates the -current and historical certificates and patches, runs the unittest suite, -and checks patch applicability against the pinned manuscript. The new batching -checks are part of this target. On a committed checkout, confirm reproducibility: +This retains the #10 checks and additionally regenerates the selected +`(25,23,57)` scalar graphs, original carrier dependencies, positive labels, +final carrier matches and full rank histograms. The complex h28 histogram is +reconstructed from its retained producer. The new rational certificate +rebuilds the recursive width multiset, checks both moments and the precision +guard, and evaluates all 29 strict constraints and seven assembly margins. +Basis checks cover the prescribed coordinate compatibility and both A5 trees. +The remaining generic-minor and interface arguments are in the proof. -```sh -git diff --exit-code -- certificates patches -``` - -For the new arithmetic alone: +All large intermediate graph and label files are temporary. To retain them: ```sh -make batched-certificate batched-patch +python3 scripts/partial_swap_producer.py --work-dir /tmp/partial-swap-producers ``` -The output reports `kappa=6149999/50000000000000 > 2^-23`, 29 strict constraints, -seven margins, and the positive final absorption gap. These programs check -exact rational inequalities; the matrix construction and tape-time bounds -also require the written proofs in the [review guide](research/batched-review.md). +The portable producer sources are in `scripts/partial_swap/`. They adapt the +retained paired-exclusion and shared-point circuits with base threshold two, +aligned point ordering, retained totals, and dependency-preserving labels. +The selected data in `certificates/partial-swap-input.json` are compared with +regeneration; they are not accepted as the sole producer justification. -## PDF and complete manuscript +For exact arithmetic alone: ```sh -make batched-note +make partial-swap-certificate ``` -This uses pdfLaTeX with AMS, Latin Modern, geometry, hyperref, enumitem, -mathtools, booktabs, and microtype, producing -`artifacts/batched-23-note.pdf`. PDF bytes may differ across TeX environments. -For Tectonic, run from the repository root: +The output certificate uses exact rational numbers. Rounded decimal values in +the prose are explanatory. On a committed checkout, generated artifacts can +be checked with `git diff --exit-code -- certificates patches`. + +## Proof PDF ```sh -make batched-note TEX_ENGINE=tectonic +make partial-swap-note +# Alternatively: +make partial-swap-note TEX_ENGINE=tectonic ``` -The [patch instructions](../PATCHING.md) describe materializing the complete -manuscript. With Tectonic, its three pdfTeX-only metadata commands need -compatibility definitions in a disposable wrapper; the mathematical source -remains unchanged. - -## Sources and automation +The target produces `artifacts/partial-swap-note.pdf`. The default engine is +pdfLaTeX. PDF bytes can differ across TeX environments. The standalone note is +the current proof; the [combined manuscript patch](../PATCHING.md) and its +generator remain the inherited #10 result. -[SOURCES.json](../SOURCES.json) records the retained PR7 commit and the supplied -archive's hash. [upstream/manifest.json](../upstream/manifest.json) pins the -original manuscript files. `make fetch` optionally retrieves those exact files -and refuses to overwrite modified source. +## Provenance -The existing [GitHub workflow](../.github/workflows/verify.yml) runs `make verify` -and checks regenerated certificates and patches. Local success does not imply -that a hosted workflow has run. Older main-branch witnesses remain available -through their existing targets and version history. +[SOURCES.json](../SOURCES.json) records the handoff archive hash, #10 parent, +and retained source pins. The original archive and exploratory alternatives +are kept outside this submission. Existing copyright notices and the Gaussian +scaling correction are preserved. The GitHub workflow runs `make verify` and +checks certificate/patch reproducibility. diff --git a/docs/research/current-status.md b/docs/research/current-status.md index 52eb003504..4d48adc0bb 100644 --- a/docs/research/current-status.md +++ b/docs/research/current-status.md @@ -1,21 +1,23 @@ # Current result -The current conditional saving is -`kappa = 6149999/50000000000000 > 2^-23`. -See the [proof](../../artifacts/batched-23-note.pdf), -[certificate](../../certificates/batched-network.json), and -[combined patch](../../patches/batched-23.patch). +The conditional saving is `kappa = 942293/500000000000 = 1.884586e-6`. +The [proof](../../artifacts/partial-swap-note.pdf) extends +[PR #10](https://github.com/CrocSwap/integer-mult-bounds/pull/10), pinned at +`62691e395a0458ce089a1c7b5d89e74291e95e29`. -The result uses the PR7 finite producers with controlled projector-block -recursion, whole complex residuals, integer-width row handling, and a dependency -path precision guard. Parameters and strict margins are in the certificate. -The inherited Gaussian scaling enclosure is corrected while retaining `P=34p`. +Partial swaps give rank budget `Wm-2N+2L`. The selected binary triple producer +has dimensions `(25,23,57)` and compatible positive frames and carrier reuse. +Its common rational basis batches the paired boundary into widths +`25,7,25,25,32611`. The complex construction batches all internal residuals +in addition to its five macro classes. -[The review guide](batched-review.md) maps the proof obligations and correction. -The statement remains conditional on the pinned upstream interfaces; finite -checks are not a formal proof of the full multiplication machine. +The [certificate](../../certificates/partial-swap-network.json) records exact +moments, precision guard, finite basis combinatorics, and assembly margins. +The [producer checker](../../scripts/partial_swap_producer.py) regenerates +all selected graphs, label assignments, matchings, and internal histograms. +Generic common-basis existence and the tape/analytic interfaces are written +proof obligations, not consequences of the arithmetic checker. -The earlier main-branch result `83/10^12` remains in the -[compact-control note](../../artifacts/compact-control-note.pdf) and -[certificate](../../certificates/compact-control-layer.json). -Older research pages document their historical assumptions and targets. +The earlier [#10 proof](../../artifacts/batched-23-note.pdf) and +[patch](../../patches/batched-23.patch) remain baseline references, including +the Gaussian scaling correction. Older research pages describe earlier results. diff --git a/notes/partial-swap-assembly.tex b/notes/partial-swap-assembly.tex new file mode 100644 index 0000000000..7bf3bbe158 --- /dev/null +++ b/notes/partial-swap-assembly.tex @@ -0,0 +1,76 @@ +\begin{theorem}[Conditional fixed-tape multiplication bound] +Assume the pinned upstream multiplication theorem and retained analytic, +ordered-affine, compact-control, Gaussian-map, and fixed-tape interfaces +specified in the opening section. The partial-swap interchange interface +and the complex layer proved here may be substituted into those +interfaces. They give +\[ + T(n)=O\!\left(n(\log n)^{1-\kappa}\right),\qquad + \boxed{\kappa=\frac{942293}{500000000000} + =1.884586\times10^{-6}}. +\] +\end{theorem} +\begin{proof} +Take the following exact parameters: +\[ +\begin{aligned} + a_b&=\frac{188459}{50000000000},&a_c&=\frac{417}{100000000},\\ + \tau&=1-a_b,&\sigma&=1-a_c,\\ + \epsilon&=\frac1{2+a_b}=\frac{50000000000}{100000188459},&c&=1,\\ + \beta&=\frac1{1000},&\delta&=\frac1{10^{16}},\\ + \lambda&=\tau+\frac1{10^{20}},&\lambda'&=\tau+\frac2{10^{20}},\\ + \zeta&=\frac1{10000},&C_1&=\frac{11999}{10000}. +\end{aligned} +\] +The strict bit and complex moments were certified above. Since +$\sigma<\tau$, the internal layer exponent is $\chi=\tau$. +The complex leaf saving is +\[ + (1-\beta)a_c=\frac{416583}{10^{11}}=4.16583\times10^{-6}>a_b. +\] +Thus both the internal and leaf exponents are strictly below +$\lambda'$, and the displayed gaps between $\tau,\lambda,\lambda'$ +absorb fixed logarithmic factors. The precision guard has +$C_1=6/5-\beta/5+\zeta$ and $1-\epsilon C_1>0$. +Compact control allows $c=1$; its reservation exponent is zero and +$1-\epsilon(1+c)=1-2\epsilon>0$ gives $K=o(\ell)$ with $K=d$. + +For the retained Gaussian parameters +$\alpha=\lfloor\sqrt{b/(8d)}\rfloor$ and +$\gamma_G=2d\alpha^2\le b/4$, the same positive $1-2\epsilon$ +ensures the eventual conditions $b\ge64d^2$, $\alpha^2\theta_i\ge1$, +and prime-interval growth. Use the corrected chirp input bound +$F=2^{\lceil1.14\alpha^2\rceil}$; the following section proves that +$P=34p$ still suffices. The retained target errors and final rounding +therefore apply. + +The seven assembly savings are the exact rational numbers +\[ +\begin{aligned} + g_1&=1-2\epsilon,&g_2&=\epsilon a_b,& + g_3&=\epsilon(a_b-2/10^{20}),\\ + g_4&=(1-\epsilon)a_b,&g_5&=1-\delta-2\epsilon,& + g_6&=1-\delta-\epsilon,&g_7&=\epsilon. +\end{aligned} +\] +Writing $b_0=a_b/(2+a_b)$ gives $g_1=g_2=b_0$, +$g_3=b_0-2\epsilon/10^{20}$, $g_4>b_0$, +and $g_5=b_0-\delta$. Since $\delta>2\epsilon/10^{20}$, +$g_5$ is the least of the seven. Exact rational subtraction gives +\[ + \min_i g_i-\kappa + =\frac{a_b}{2+a_b}-\frac1{10^{16}} + -\frac{942293}{500000000000} + >\frac{44822}{10^{17}}>0. +\] +All retained parameter conditions are strict with this choice; in +particular the finite arithmetic certificate evaluates the complete +29-condition interface and these seven margins with rational arithmetic. +The final positive gap absorbs remaining logarithmic factors, proving +the claimed bound in the retained model. +\end{proof} + +The count and moment data are finite arithmetic certificates for the +specified producer and common-basis construction. The theorem's use of +the pinned analytic interfaces and its fixed rational basis preparation +is separate from checking those integers and rational inequalities. diff --git a/notes/partial-swap-basis.tex b/notes/partial-swap-basis.tex new file mode 100644 index 0000000000..2c54b85c42 --- /dev/null +++ b/notes/partial-swap-basis.tex @@ -0,0 +1,206 @@ +\subsection{The ordinary projector corner} +For a rank-$j$ projector in dimension $h$ with $j>h/2$, put $r=h-j$. +In a generic rational basis its first-$r$/last-$r$ corner is invertible: +one witness pairs these coordinates in rank-one blocks +$\frac12\left(\begin{smallmatrix}1&1\\1&1\end{smallmatrix}\right)$ +and is the identity on the middle $h-2r$ coordinates. Similarity of +rational projectors with the same rank proves that the relevant minor +is a nonzero rational function of the basis. + +Write $I-P=XY$, $YX=I_r$. The corner is $-X_LY_R$, so $X_L,Y_R$ are +invertible. Eliminating it leaves on the middle coordinates +\[ + I-X_MY_M-(-X_MY_R)(-Y_R^{-1}X_L^{-1})(-X_LY_M)=I_{h-2r}. +\] +The resulting lower-lower profile is $r$ singleton pivots and one +contiguous block of width $2j-h$. For $j\le h/2$ retain $j$ singleton +pivots; for $j=h$ use one block of width $h$. The last is still smaller +than the full tensor dimension $m$. Nonzero scalings are absorbed in +the triangular factors. This argument is also the large-projector +identity used in the controlled corners below. + +\subsection{Inner boundary prescriptions} +Use $F_1=\mathbb Q^{25}$, $F_2=\mathbb Q^{23}$, $F_3=\mathbb Q^{57}$, +$H=575$ and $m=32775$. For physical inner index $i=23\alpha+\beta$ set +\[ + K=T_2(I_{25}\otimes L_2),\qquad + T_2(u\otimes e_\beta)=J_\beta u\otimes e_\beta, + \qquad J_\beta=M_\beta L_1, +\] +where $L_1,L_2$ are free invertible rational bases. Put $n=82$, +$I=(0,\ldots,24)$, $\Sigma=(0,\ldots,6)$ and +\[ + R=[I,\Sigma,I,I],\qquad C=[I,I,\Sigma,I]. +\] +For $ih/2$ it is +$h-j$ singletons and one width-$(2j-h)$ block; otherwise it is $j$ +singletons. Width-one blocks are folded into +$c_1=179603173231020$. These prescriptions define every $c_t$ exactly, +without a separate choice of producer histogram. Their rank sum is +\[ + \sum_t c_tt=s=Wm-2N+2L. +\] +All widths are strictly less than $m$. Define +\[ + \Psi(x)=\frac{\sum_tc_tt^x}{Wm^x},\qquad + a_b=\frac{188459}{50000000000},\quad \tau=1-a_b. +\] +For completeness the exact rational enclosure used for the certificate +is as follows. For $1\le y\le2$, put $z=(y-1)/(y+1)$ and +\[ + L(y)=2\sum_{j=0}^{23}\frac{z^{2j+1}}{2j+1} + +\frac{2z^{49}}{49(1-z^2)}\ \ge\log y. +\] +Extract powers of two in $m/t$ and round the resulting upper logarithm +up to a multiple of $10^{-12}$, calling it $\ell_t$. +Since $e^u\le1+u+u^2/(2(1-u/3))$ for $0\le u<3$, +\[ + \Psi(\tau)\le\sum_t\frac{c_tt}{Wm} + \left(1+a_b\ell_t+\frac{(a_b\ell_t)^2}{2(1-a_b\ell_t/3)}\right) + <1-6.1778\times10^{-14}. +\] +The first inequality follows termwise from +$(t/m)^{1-a_b}=(t/m)\exp(a_b\log(m/t))$; the final comparison is an +exact rational certificate. Together with the integer-width and row +construction below, it supplies the retained interchange interface with +exponent $\tau$. diff --git a/notes/partial-swap-complex.tex b/notes/partial-swap-complex.tex new file mode 100644 index 0000000000..98c343640a --- /dev/null +++ b/notes/partial-swap-complex.tex @@ -0,0 +1,153 @@ +\subsection{Five macro classes and the internal histogram} +Keep the retained complex producer with +\[ + h=28,\quad v=3276,\quad m=21952,\quad N=v^3=35158608576, + \quad R_c=93838, +\] +\[ + B=v^2(R_c+29)=1007397164592,\qquad + W=2N+2B=2085111546336. +\] +The 29 center roles are included. The whole-residual macro classes are +\[ +\begin{array}{c|rrrrr} + t&21896&21168&21141&756&729\\\hline + n_t&B&B&2N&B-N&3N +\end{array} +\] +and before internal batching the remaining singleton count is +$91318626008064$. The per-invocation internal histogram, indexed from +zero, is +\begin{small}\begin{align*} + H_c=[&13776,93912,23891,21224,31667,13552,9128,9240,10912,5656,\\ + &8456,4284,7598,4872,7448,4536,7803,4228,8232,4872,7482,7224,\\ + &5901,8400,11550,1512,5180,0,87]. +\end{align*}\end{small} +It satisfies $\sum_r rH_c[r]=2629900=28(R_c+29)+2\cdot28\cdot29$. +For each $r\ge2$, replace $3v^2rH_c[r]$ singleton rank units by +$3v^2H_c[r]$ width-$r$ children. All five macro counts remain unchanged. +The resulting singleton count is $n_1=9668617358400$, and +\[ + \sum_tn_tt=45772350635112192. +\] + +The retained residual basis map puts all $r$ directions into a contiguous +prefix. Their $rf$ selected axes are one child. If directional signs +differ, the exact identity $C^{-1}=-iZCZ$ gives +\[ + \bigotimes_{j=1}^r(C^{\varepsilon_j})^{\otimes f} + =(-i)^{f|B_-|}Z_{B_-}C^{\otimes rf}Z_{B_-}. +\] +The two address-sign passes and fourth-root phase cost $O(V)$, make no +recursive call, and contribute only a fixed number of coefficient +operations per value. This also covers the uniform-sign internal +residuals; it does not assume that arbitrary binary residual directions +always have identical signs. + +Set $a_c=417/100000000$, $\sigma=1-a_c$. Using the same rational +logarithm upper bounds $\ell_t\ge\log(m/t)$ as for the bit moment, +\[ + \mathcal C(\sigma)=\frac1W\sum_t n_t(t/m)^\sigma + \le\sum_t\frac{n_tt}{Wm}\frac1{1-a_c\ell_t} + <1-2.3982\times10^{-11}. +\] +All denominators are positive. The bound $e^u\le(1-u)^{-1}$ for +$0\le u<1$ makes the final comparison entirely rational. + +\subsection{A uniform dependency-path guard} +The retained scalar path argument counts both orientations of frame +edges and paths changing wires at a gate: the total residual rank on +one arithmetic dependency path is at most $q=m+6h=22120$. +Take $\rho=6/5$. The exact integer inequality $160000^5160000$, and at most one residual can exceed $q/2$. +If it is 21896, the remaining rank is at most 224; no 729- or +756-residual fits, so all remaining ranks are at most 28. Hence +\[ + \sum_{\text{path}}(r/m)^\rho + <(391/392)^{6/5}+448/160000 + <0.996941+0.0028<\gamma:=4999/5000. +\] +The middle bound can be checked rationally from +$(1-u)^{6/5}\le1-6u/5+3u^2/(25(1-u))$, at $u=1/392$. +If the large residual is 21168 or 21141, the remaining rank is at +most 979 and remaining widths at most 756; since $756^{1/5}<4$, +\[ + \sum_{\text{path}}(r/m)^\rho<27/28+4\cdot979/160000<0.989. +\] +If none of those three large residuals occurs, every residual is at +most 756 and the bound is $4q/160000<0.554$. Thus $\gamma$ is uniform +for the five macro classes and all internal children together. + +Stop at width $e0$ put +\[ + C_1=\rho-(\rho-1)\beta+\zeta,\qquad + C_0=\left\lceil128m(1+1/\zeta)C_{\rm dep}\right\rceil, + \qquad \Delta=\lceil C_0d^{C_1}\rceil. +\] +The retained elementary-depth induction, including reserved axes, +outer phases and conversion, then gives $p+\Delta$ fractional bits +and $\Delta+3$ integer/sign bits. If $\epsilon C_1<1$, their width +is $O(p)$. + +\subsection{Rows, stopping, and transfer to the layer interface} +Let $t_*0. +\] +Before the initial inverse-stage copy, raise the physical $Y$ data +frame to its common starting frame $D_0$ and copy with both roles at +$D_0$. This moves an existing enlargement earlier; all later frames +contain $D_0$. The direct auxiliary entrance replaces the split entrance +with equal rank mass. It gives exactly $B_2$ copies of class A4 and +$2N$ copies of A5 in the following table. diff --git a/notes/partial-swap-note.tex b/notes/partial-swap-note.tex new file mode 100644 index 0000000000..5799f6a1fe --- /dev/null +++ b/notes/partial-swap-note.tex @@ -0,0 +1,94 @@ +\documentclass[11pt]{article} +\usepackage[margin=1in]{geometry} +\usepackage[T1]{fontenc} +\usepackage{lmodern,amsmath,amssymb,amsthm,mathtools,booktabs,longtable,microtype} +\usepackage[hidelinks]{hyperref} +\setlength{\emergencystretch}{3em} +\allowdisplaybreaks +\newtheorem{theorem}{Theorem}[section] +\newtheorem{lemma}[theorem]{Lemma} +\newtheorem{proposition}[theorem]{Proposition} +\title{Partial-swap frames for integer multiplication\\ +\large Retained triples, controlled blocks, and exact conditional assembly} +\author{icekylinx\\\small With substantial OpenAI GPT-6 Astra and Codex assistance} +\date{8 October 2026} +\begin{document} +\maketitle +\begin{abstract} +We record the selected $(25,23,57)$ retained-triple construction, its +rational partial-swap compiler, compatible carrier histograms, controlled +contiguous blocks, and the strengthened complex recurrence. Subject to the +pinned upstream analytic and fixed-tape interfaces, the exact parameters give +$T(n)=O(n(\log n)^{1-\kappa})$ with +$\kappa=942293/500000000000=1.884586\times10^{-6}$. +The finite arithmetic certificates check counts and inequalities; they are +not a formal verification or an implementation of a complete multiplication +machine. The common-basis step is a rational generic-existence proof. +\end{abstract} + +\section{Scope and attribution} +The computational model is a fixed finite-alphabet multitape Turing machine. +Every finite network, basis, prime, and tape count is fixed independently of +the input length. The bit payload field is $\mathbb F_2$; its address +geometry is rational and is subsequently reduced at a suitable odd prime. +These two fields have different purposes. The complex payload consists of +Gaussian dyadics and uses the retained binary address-label interface. + +The retained framework is Douglas Colkitt's compact-control construction +\cite{main}, with Bortlesboat's alignment \cite{pr2}, eumemic's complex +producer and Gaussian resampling \cite{pr3,pr5,pr6}, dleen's retained totals +and stage sharing \cite{pr4}, and Zhihao Chen's finite-network contribution +\cite{pr7}, pinned at +\texttt{6725c6a17b17871a35353fd29157f4ed851bc114}. +The upstream multiplication manuscript is pinned at +\texttt{adc7f1241b42e322a6451854ab7e4b4c146bf78a} \cite{upstream}. +The partial-swap and selected retained-triple development is by icekylinx, +with substantial OpenAI GPT-6 Astra assistance; review and integration used +OpenAI Codex assistance. Prior contributions retain their attribution and +licenses in \texttt{NOTICE} and \texttt{SOURCES.json}. +This submission extends icekylinx's bulk-recursion PR~\#10 \cite{pr10}, +pinned at \texttt{62691e395a0458ce089a1c7b5d89e74291e95e29}; its +parameterized mixed-width and corrected Gaussian arguments are retained +below with the new construction and constants. + +\section{Partial swaps and the retained scalar producer} +\input{notes/partial-swap-construction.tex} +\section{One controlled rational basis} +\input{notes/partial-swap-basis.tex} +\section{Integer widths and complete bit rows} +The following retained generic mixed-width proof is used with the new +partial-swap child list. Its ordered-affine passes are the triangular +wrappers proved above; a contiguous partial permutation is implemented +directly by an interchange. None of the older numerical moment values is +used. +\input{notes/batched-bit-rows.tex} +\section{Complex residuals and the precision guard} +\input{notes/partial-swap-complex.tex} +\section{Exact conditional assembly} +\input{notes/partial-swap-assembly.tex} +\section{Gaussian input-error correction} +\input{notes/chirp-scaling-correction.tex} + +\begin{thebibliography}{10} +\bibitem{upstream} OpenAI. \emph{Integer multiplication below $n\log n$}, +result family \#109. \url{https://github.com/openai/math}. +\bibitem{main} Douglas Colkitt. \emph{A sharper exponent for integer +multiplication}. Main commit +\texttt{6e564879f51ae16f23d392e9e196c605f36d90df}. +\url{https://github.com/CrocSwap/integer-mult-bounds}. +\bibitem{pr2} Bortlesboat. Alignment contribution. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/2}. +\bibitem{pr3} eumemic. Compressed complex network. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/3}. +\bibitem{pr4} dleen. Retained totals and stage sharing. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/4}. +\bibitem{pr5} eumemic. Faster Gaussian resampling. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/5}. +\bibitem{pr6} eumemic. Aligned circuit and cheaper centers. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/6}. +\bibitem{pr7} Zhihao Chen (jacklightChen). Ternary five-subset networks. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/7}. +\bibitem{pr10} icekylinx. Bulk recursion and controlled projector blocks. +\url{https://github.com/CrocSwap/integer-mult-bounds/pull/10}. +\end{thebibliography} +\end{document} diff --git a/scripts/partial_swap/README.md b/scripts/partial_swap/README.md new file mode 100644 index 0000000000..3e753db831 --- /dev/null +++ b/scripts/partial_swap/README.md @@ -0,0 +1,42 @@ +This directory contains the selected retained-total triple producer, adapted +from the October 2026 partial-swap research handoff. The underlying pair and +shared-point modules originate in jacklightChen/integer-mult-bounds commit +6725c6a17b17871a35353fd29157f4ed851bc114 (CrocSwap PR7). Modifications are +copyright 2026 icekylinx, Apache-2.0, made with AI assistance. + +Run from the repository root: + +```sh +python scripts/partial_swap_producer.py --output certificates/partial-swap-producer-check.json +``` + +Python 3.10+ and a C++17 compiler are required. `CXX` or `--cxx` selects the +compiler. The default command generates all three selected dimensions +25, 23, 57 and derives the complex h=28 histogram from `paired_complex.py`, +which supplies the selected paired producer in the `complex_circuit.py` interface. +It compares every selected count and every histogram entry to +`certificates/partial-swap-input.json`, raising on disagreement. Successful +stdout (or the specified output file) contains the complete generated results. +Progress and matcher phases go to stderr. Large binary intermediates and +compiled matchers are temporary by default; `--work-dir /tmp/partial-swap` +retains them. `--dimensions 23 --skip-complex` selects a smaller diagnostic run. + +`paired.py` parameterizes the weighted pair recursion with base threshold two; +`shared.py` accepts the aligned point order as an ordinary constructor parameter. +There is no runtime source rewriting. `graph.py` retains each common-point total +and its ancestors before pruning the global DAG. The first matcher exports the +original envelope continuation dependencies. `positive.py` propagates output +constraints backward through equal-envelope classes and those dependencies, +then stops after writing the enlarged labels. The research script's alternative +dense-macro candidate is deliberately absent. The second matcher uses enlarged +rank, original rank, and event number to preserve the dependency order. + +Both matchers retain the archived deterministic Hopcroft–Karp traversal order: +increasing donor node, first operand before second operand, consumers before +designated outputs. Binary headers and payloads are explicitly little endian +on all supported hosts. No archived binary graphs are needed or stored here. + +The complex histogram derives ranks from coordinate-cover sizes for disjoint +sum nodes and independent triple counts for pair stars. It counts producer +transitions and adds three full-rank transitions per center role. Data growth +and outer macro transitions are excluded from this per-invocation histogram. diff --git a/scripts/partial_swap/__init__.py b/scripts/partial_swap/__init__.py new file mode 100644 index 0000000000..ba99c12519 --- /dev/null +++ b/scripts/partial_swap/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2026 icekylinx. Licensed under Apache-2.0. +# Adapted with AI assistance from the archived partial-swap research producer. +# Underlying circuit modules: jacklightChen/integer-mult-bounds, PR7 +# commit 6725c6a17b17871a35353fd29157f4ed851bc114; original credits retained. diff --git a/scripts/partial_swap/binary.py b/scripts/partial_swap/binary.py new file mode 100644 index 0000000000..69a398e9af --- /dev/null +++ b/scripts/partial_swap/binary.py @@ -0,0 +1,29 @@ +"""Portable little-endian arrays for the archived producer interchange format. + +Copyright 2026 icekylinx. Apache-2.0; written with AI assistance. +""" +import array +import sys + + +def read_array(stream, code, count): + result = array.array(code) + expected_size = {'I': 4, 'Q': 8, 'B': 1, 'b': 1}[code] + if result.itemsize != expected_size: + raise RuntimeError('Unsupported native array width') + raw = stream.read(count * expected_size) + if len(raw) != count * expected_size: + raise ValueError('Truncated producer array') + result.frombytes(raw) + if sys.byteorder != 'little' and result.itemsize > 1: + result.byteswap() + return result + + +def write_array(stream, values): + if values.itemsize != {'I': 4, 'Q': 8, 'B': 1, 'b': 1}[values.typecode]: + raise RuntimeError('Unsupported native array width') + if sys.byteorder != 'little' and values.itemsize > 1: + values = array.array(values.typecode, values) + values.byteswap() + values.tofile(stream) diff --git a/scripts/partial_swap/binary_io.hpp b/scripts/partial_swap/binary_io.hpp new file mode 100644 index 0000000000..9ec72c629a --- /dev/null +++ b/scripts/partial_swap/binary_io.hpp @@ -0,0 +1,43 @@ +// Copyright 2026 icekylinx. Apache-2.0; written with AI assistance. +// The on-disk arrays are little endian, regardless of the host architecture. +#pragma once +#include +#include + +inline unsigned popcount64(uint64_t value) { + unsigned count = 0; + while (value) { value &= value-1; ++count; } + return count; +} + +inline bool little_endian() { + const uint16_t one = 1; + return *reinterpret_cast(&one) == 1; +} +template void normalize_le(T& value) { + static_assert(std::is_integral::value, "integer array required"); + if (!little_endian()) { + auto p = reinterpret_cast(&value); + std::reverse(p, p + sizeof(T)); + } +} +template void normalize_le(std::array& row) { + for (auto& value : row) normalize_le(value); +} +template void readv(std::ifstream& f, std::vector& values) { + f.read(reinterpret_cast(values.data()), values.size()*sizeof(T)); + if (!f) throw std::runtime_error("Truncated producer array"); + if (!little_endian()) for (auto& value : values) normalize_le(value); +} +template void read_array(std::ifstream& f, T (&values)[N]) { + f.read(reinterpret_cast(values), sizeof(values)); + if (!f) throw std::runtime_error("Truncated producer header"); + for (auto& value : values) normalize_le(value); +} +template void write_array(std::ofstream& f, const T (&values)[N]) { + for (auto value : values) { + normalize_le(value); + f.write(reinterpret_cast(&value), sizeof(T)); + } + if (!f) throw std::runtime_error("Cannot write producer array"); +} diff --git a/scripts/partial_swap/graph.py b/scripts/partial_swap/graph.py new file mode 100644 index 0000000000..ded4462b9f --- /dev/null +++ b/scripts/partial_swap/graph.py @@ -0,0 +1,48 @@ +"""Retained-total triples, aligned global pairs, weighted base threshold two. + +Copyright 2026 icekylinx. Apache-2.0; adapted with AI assistance from +triple_graph.py in the partial-swap handoff, using the PR7 circuit modules. +""" +import array +import struct + +from .binary import write_array +from .paired import PairedExclusionCircuit +from .shared import SharedPointCircuit + + +def aligned_points(h, common): + head = [j for a in range(0, h-1, 2) if common not in (a, a+1) + for j in (a, a+1)] + return head + [j for j in range(h) if j != common and j not in head] + + +def graph(h): + local = PairedExclusionCircuit(h-1) + total = local.pair(list(range(h-1)))[0] + local.outputs[()] = total + stack = [total] + while stack: + node = stack.pop() + if node in local.active: + continue + local.active.add(node) + if local.args[node]: + stack.extend(local.args[node]) + local.additions = sum(local.args[x] is not None for x in local.active) + return SharedPointCircuit(h, local, point_order=aligned_points) + + +def export(circuit, path): + roots = list(circuit.outputs.values()) + kinds = [int(len(target) == 1) for _, target in circuit.outputs] + with open(path, 'wb') as stream: + stream.write(struct.pack('<4I', circuit.h, len(circuit.inputs), + len(circuit.args), len(roots))) + write_array(stream, array.array('I', (y for args in circuit.args + for y in (args or (0, 0))))) + for values in (circuit.core, circuit.union): + write_array(stream, array.array('Q', values)) + for values in (roots, kinds): + write_array(stream, array.array('I', values)) + stream.write(bytes(int(x in circuit.active) for x in range(len(circuit.args)))) diff --git a/scripts/partial_swap/match_exported_dag.cpp b/scripts/partial_swap/match_exported_dag.cpp new file mode 100644 index 0000000000..ea1244ad44 --- /dev/null +++ b/scripts/partial_swap/match_exported_dag.cpp @@ -0,0 +1,34 @@ +// Copyright 2026 icekylinx. Licensed under Apache-2.0. +// Adapted with AI assistance from the archived partial-swap research producer. +// Underlying circuit modules: jacklightChen/integer-mult-bounds, PR7 +// commit 6725c6a17b17871a35353fd29157f4ed851bc114; original credits retained. +#include +#include +#include +#include +#include +#include +#include +using U=uint32_t;using V=uint64_t; +#include "binary_io.hpp" +int main(int argc,char**argv){assert(argc==2||argc==3);std::ifstream f(argv[1],std::ios::binary);U hdr[4];read_array(f,hdr);U h=hdr[0],v=hdr[1],n=hdr[2],q=hdr[3]; +std::vector>args(n);std::vectorcore(n),cover(n);std::vectorroots(q),kind(q);std::vectoractive(n);readv(f,args);readv(f,core);readv(f,cover);readv(f,roots);readv(f,kind);readv(f,active); +std::vectorranks(n),degree(n),begin(n+1);V c=0,inputs=0,loss=0; +for(U x=1;xuses(begin.back()),cursor(begin.begin(),begin.end()-1);for(U x=1;xU{return e>>31?roots[e&0x7fffffff]:e/2;}; +auto before=[&](U a,U b){U x=nd(a),y=nd(b);if(ranks[x]!=ranks[y])return ranks[x]>31?V(n)+(a&0x7fffffff):x,oy=b>>31?V(n)+(b&0x7fffffff):y;return oxdonors;for(U x=1;xleftmatch(n),rightmatch(uses.size()),distance(n,UINT32_MAX),queue;V matches=0;U phase=0,inf=UINT32_MAX,shortest=inf; +while(true){queue.clear();shortest=inf;for(U x:donors){if(!leftmatch[x]){distance[x]=0;queue.push_back(x);}else distance[x]=inf;}for(U at=0;at=shortest)continue;adjacency(x,[&](U j){U y=rightmatch[j];if(!y)shortest=distance[x]+1;else if(distance[y]==inf){distance[y]=distance[x]+1;queue.push_back(y);}return false;});}if(shortest==inf)break; +auto aug=[&](auto&&self,U x)->bool{bool ok=adjacency(x,[&](U j){U y=rightmatch[j];if((!y&&distance[x]+1==shortest)||(y&&distance[y]==distance[x]+1&&self(self,y))){leftmatch[x]=j+1;rightmatch[j]=x;return true;}return false;});if(!ok)distance[x]=inf;return ok;};V gained=0;for(U x:donors)if(!leftmatch[x]&&aug(aug,x)){matches++;gained++;}std::cerr<<"h="<hist(h+1);for(U x=1;x=ranks[y]);hist[r-ranks[y]]++;}}else hist[1]+=degree[x];} +for(U j=0;j>31?target:args[target][e&1];assert(value==args[donor][0]||value==args[donor][1]);if(value==args[donor][0])changed++;U ru=ranks[donor],rv=ranks[value],rt=ranks[target];assert(rt>=ru&&ru>=rv);hist[h-ru]--;hist[rv]--;hist[rt-rv]--;hist[rt-ru]++;} +V R=c+q-matches,sum=0;for(U r=0;r<=h;r++){assert(hist[r]>=0);sum+=r*hist[r];}assert(sum==h*R+2*loss); +if(argc==3){std::ofstream out(argv[2],std::ios::binary);U header[2]={n,U(matches)};write_array(out,header);for(U donor:donors)if(leftmatch[donor]){U edge[2]={donor,nd(uses[leftmatch[donor]-1])};write_array(out,edge);}assert(out);} +std::cout<<"{\"h\":"< +#include +#include +#include +#include +#include +#include +using U=uint32_t;using V=uint64_t; +#include "binary_io.hpp" +int main(int argc,char**argv){assert(argc==3);std::ifstream f(argv[1],std::ios::binary);U hdr[4];read_array(f,hdr);U h=hdr[0],v=hdr[1],n=hdr[2],q=hdr[3]; +std::vector>args(n);std::vectorcore(n),cover(n);std::vectorroots(q),kind(q);std::vectoractive(n);readv(f,args);readv(f,core);readv(f,cover);readv(f,roots);readv(f,kind);readv(f,active); +std::vectorranks(n),degree(n),begin(n+1);V c=0,inputs=0,loss=0; +for(U x=1;xforced(n);std::vectorsymbols(V(n)*h);readv(lf,ranks);readv(lf,forced);readv(lf,symbols); +for(U x:roots)degree[x]++;for(U x=1;xuses(begin.back()),cursor(begin.begin(),begin.end()-1);for(U x=1;xU{return e>>31?roots[e&0x7fffffff]:e/2;}; +auto before=[&](U a,U b){U x=nd(a),y=nd(b);if(ranks[x]!=ranks[y])return ranks[x]>31?V(n)+(a&0x7fffffff):x,oy=b>>31?V(n)+(b&0x7fffffff):y;return oxdonors;for(U x=1;xleftmatch(n),rightmatch(uses.size()),distance(n,UINT32_MAX),queue;V matches=0;U phase=0,inf=UINT32_MAX,shortest=inf; +while(true){queue.clear();shortest=inf;for(U x:donors){if(!leftmatch[x]){distance[x]=0;queue.push_back(x);}else distance[x]=inf;}for(U at=0;at=shortest)continue;adjacency(x,[&](U j){U y=rightmatch[j];if(!y)shortest=distance[x]+1;else if(distance[y]==inf){distance[y]=distance[x]+1;queue.push_back(y);}return false;});}if(shortest==inf)break; +auto aug=[&](auto&&self,U x)->bool{bool ok=adjacency(x,[&](U j){U y=rightmatch[j];if((!y&&distance[x]+1==shortest)||(y&&distance[y]==distance[x]+1&&self(self,y))){leftmatch[x]=j+1;rightmatch[j]=x;return true;}return false;});if(!ok)distance[x]=inf;return ok;};V gained=0;for(U x:donors)if(!leftmatch[x]&&aug(aug,x)){matches++;gained++;}std::cerr<<"h="<hist(h+1);for(U x=1;x=ranks[y]);hist[r-ranks[y]]++;}}else hist[1]+=degree[x];} +for(U j=0;j>31?target:args[target][e&1];assert(value==args[donor][0]||value==args[donor][1]);if(value==args[donor][0])changed++;U ru=ranks[donor],rv=ranks[value],rt=ranks[target];assert(rt>=ru&&ru>=rv);hist[h-ru]--;hist[rv]--;hist[rt-rv]--;hist[rt-ru]++;} +V R=c+q-matches,sum=0;for(U r=0;r<=h;r++){assert(hist[r]>=0);sum+=r*hist[r];}assert(sum==h*R+2*loss); +std::cout<<"{\"h\":"<>a&1 or color[a]>=0:continue + color[a]=0;todo=[a];parts=[0,0];bad=False + while todo: + b=todo.pop();parts[color[b]]|=1<=2 + if key not in newlabels:newlabels[key]=len(newnodes);newnodes.append([]);newranks.append(r) + g=newlabels[key] + for x in xs:newgroup[x]=g;newnodes[g].append(x) + labpath=path+'.positive';fo=open(labpath,'wb');fo.write(struct.pack('<2I',h,n));rr=array.array('I',[0]*n);ff=array.array('Q',[0]*n);sy=array.array('b',[0]*(n*h));keylist=[None]*len(newlabels) + for key,g in newlabels.items():keylist[g]=key + for x in range(1,n): + if not active[x]:continue + g=newgroup[x];rr[x]=newranks[g];key=keylist[g] + if key[0]=='source':F=core[x];comps=[] + else:F=key[0];comps=key[2] + ff[x]=F + for i in range(h): + if F>>i&1:sy[x*h+i]=1 + for j,(pos,neg) in enumerate(comps): + for i in range(h): + if pos>>i&1:sy[x*h+i]=j+2 + elif neg>>i&1:sy[x*h+i]=-(j+2) + for z in (rr,ff,sy):write_array(fo,z) + fo.close() + return dict(h=h, nodes=n, forward_classes=ng, positive_classes=len(newnodes)) diff --git a/scripts/partial_swap/shared.py b/scripts/partial_swap/shared.py new file mode 100644 index 0000000000..a2f0190704 --- /dev/null +++ b/scripts/partial_swap/shared.py @@ -0,0 +1,163 @@ +# Copyright 2026 icekylinx. Licensed under Apache-2.0. +# Adapted with AI assistance from the archived partial-swap research producer. +# Underlying circuit modules: jacklightChen/integer-mult-bounds, PR7 +# commit 6725c6a17b17871a35353fd29157f4ed851bc114; original credits retained. +#!/usr/bin/env python3 +"""Merge equal sums across the common-point circuits, with exact certificates. + +Supports are represented by their provenance in the small pair circuit, not +by half a million dense global bit vectors. A sum that occurs in two distinct +common-point groups must be a pair-star; its fixed pair and union of vertices +identify its support exactly. +""" +from functools import lru_cache +from hashlib import sha256 +from itertools import combinations +import json + +from exclusion_circuit import ExclusionCircuit + + +class SharedPointCircuit: + def __init__(self,h,circuit=None,point_order=None): + assert h>=6 and h!=9, 'The ambient form I-J/9 must be nondegenerate' + self.h=h + self.local=circuit or ExclusionCircuit(h-1) + assert self.local.n==h-1, 'Pair circuit has the wrong ground size' + self.inputs=list(combinations(range(h),3)) + self.variables={t:i+1 for i,t in enumerate(self.inputs)} + self.args=[None]*(len(self.inputs)+1) + self.core=[0]+[sum(1<=2 and key in lookup: + mapping[node]=lookup[key];self.merged+=1 + continue + new=len(self.args);mapping[node]=new + self.args.append((a,b));self.core.append(core);self.union.append(union) + self.provenance.append((common,node)) + if core.bit_count()>=2:lookup[key]=new + for pair,node in sorted(self.local.outputs.items()): + t=tuple(sorted((common,*(self.points[common][x] for x in pair)))) + self.outputs[common,t]=mapping[node] + self.active=set();stack=list(self.outputs.values()) + while stack: + n=stack.pop() + if n in self.active:continue + self.active.add(n) + if self.args[n]:stack.extend(self.args[n]) + self.additions=sum(self.args[n] is not None for n in self.active) + + @lru_cache(maxsize=16384) + def support_in(self,node,common): + """Exact pair-input support in coordinates with this common point.""" + assert self.core[node]&(1<= 1, 'Log argument below one') + power = 0 + while value > 2: + value /= 2 + power += 1 + def series(x): + z = (x-1)/(x+1) + return 2*sum((z**(2*j+1)/(2*j+1) for j in range(24)), Q(0)) + 2*z**49/(49*(1-z*z)) + scaled = (power*series(Q(2)) + series(value))*10**12 + return Q(-(-scaled.numerator//scaled.denominator), 10**12) + + +def moment(m, W, rows, saving, sharp): + upper = Q(0) + logs = {} + for t, count in sorted(rows.items()): + require(0 < t < m and count >= 0, 'Invalid recursive child') + ell = log_upper(Q(m, t)) + u = saving*ell + require(0 <= u < 1, 'Exponential enclosure outside range') + bound = 1+u+u*u/(2*(1-u/3)) if sharp else 1/(1-u) + upper += Q(count*t, W*m)*bound + logs[str(t)] = ell + require(upper < 1, 'Characteristic moment does not contract') + return dict(saving=saving, exponent=1-saving, moment_upper=upper, + strict_gap=1-upper, logarithm_upper_bounds=logs, + child_width_multiplicities=sorted(rows.items()), + enclosure='1+u+u^2/(2(1-u/3))' if sharp else '1/(1-u)') + + +def bit_counts(d): + dims = (25, 23, 57) + ps = d['producers'] + v = [comb(h, 3) for h in dims] + N, m = prod(v), prod(dims) + banks = [N//vi*ps[str(h)]['roles'] for h, vi in zip(dims, v)] + B1, B2, B3 = banks + E = B3-B1 + require(E >= 0, 'Stage-three bank must accommodate stage one') + W = 2*N+B2+B3 + L = N*sum((Q(6, h-2) for h in dims), Q(0)) + require(L.denominator == 1, 'Nonintegral retained loss') + L = int(L) + s = W*m-2*N+2*L + rows = Counter() + profiles = [(B1, (25,7,25,25,32611)), (E,(57,32661)), + (B2,(575,31625)), (B2,(23,529)), + (2*N,(55,463,31513)), (2*N,(481,)), + (2*N,(1,23)), (2*N,(1,21)), (2*N,(1,55))] + rows[1] += 2*N*(113+47) + for count, profile in profiles: + for t in profile: + rows[t] += count + for h, vi in zip(dims, v): + p = ps[str(h)] + require(p['v'] == vi and p['outputs'] == 3*vi+h, 'Producer dimensions') + require(p['roles'] == p['additions']+p['outputs']-p['matches'], 'Role count') + require(p['loss'] == h*(h-1), 'Producer retained loss') + hist = p['histogram'] + require(len(hist) == h+1 and all(n >= 0 for n in hist), 'Histogram range') + require(sum(r*n for r,n in enumerate(hist)) == h*p['roles']+2*h*(h-1), 'Internal rank mass') + for r,n in enumerate(hist): + copies = N//vi*n + block = max(0, 2*r-h) + rows[1] += copies*(r-block) + if block: + rows[block] += copies + computed = dict(m=m,N=N,B1=B1,B2=B2,B3=B3,E=E,W=W,L=L,s=s, + deficit=W*m-s,eta=Q(W*m-s,W*m),singletons=rows[1]) + for name,value in computed.items(): + require(value == Q(d['parameters'][name]), 'Recorded bit count differs: '+name) + require(sorted((t,n) for t,n in rows.items() if t>1) == [tuple(x) for x in d['bit_bulk_width_multiplicities']], 'Recorded bit multiset differs') + require(sum(t*n for t,n in rows.items()) == s, 'Complete bit rank mass') + return computed, rows + + +def complex_counts(d): + p = d['complex'] + h=28; v=comb(h,3); m=h**3; N=v**3 + B=v*v*(93838+h+1); W=2*N+2*B + s=W*m-2*N+6*v*v*h*(h+1) + macros=[(m-2*h,B),(m-h*h,B),((h*h-1)*(h-1),2*N), + (h*(h-1),B-N),((h-1)**2,3*N)] + require(macros == [tuple(x) for x in p['macro_width_multiplicities']], 'Complex macro profiles') + hist=p['histogram'] + require(sum(r*n for r,n in enumerate(hist)) == h*(93838+h+1)+2*h*(h+1), 'Complex internal rank mass') + rows=Counter(dict(macros)) + for r,n in enumerate(hist): + if r>=2: + rows[r] += 3*v*v*n + # The remaining physical and macro singleton transitions are fixed by the + # retained full rank budget; the internal histogram is regenerated separately. + rows[1]=s-sum(t*n for t,n in rows.items()) + counts=dict(h=h,v=v,m=m,N=N,B=B,W=W,s=s,singletons=rows[1]) + for name,value in counts.items(): + require(value == int(p[name]), 'Recorded complex count differs: '+name) + return counts, rows + + +def guard(n): + m=n['m']; W=n['W']; h=n['h']; q=m+6*h + rho=Q(6,5); gamma=Q(4999,5000); lower=160000 + require(lower**5 < m**6 and 28 < 2**5 and 756 < 4**5, 'Guard power bounds') + t=Q(56,m) + # Taylor integral remainder: (1-t)^(6/5) <= 1-6t/5+3t²/[25(1-t)]. + power=1-Q(6,5)*t+Q(3,25)*t*t/(1-t) + bounds=dict(largest=power+Q(2*(q-(m-56)),lower), + other_large=Q(27,28)+Q(4*979,lower), + no_large=Q(4*q,lower)) + require(all(2*r>q for r in (21896,21168,21141)), 'Two large edges on a path') + require(q-21896 < 729, 'Largest-edge remainder admits medium edge') + require(max(bounds.values()) < gamma, 'Precision path does not contract') + E=64*(W+m+1)**3 + require(36*W**3+4*n['s']+4*W+8*m+4 < E, 'Local coefficient allowance') + dep=5000*(E+16*m+1) + beta=Q(1,1000); zeta=Q(1,10000) + raw=128*m*(1+1/zeta)*dep + C0=-(-raw.numerator//raw.denominator) + require(dep*(1-gamma)>=E and dep>=16*m, 'Depth induction allowance') + require(m*(1+1/zeta)*dep+18<=C0, 'Layer allowance') + return dict(q=q,rho=rho,gamma=gamma,path_moment_upper=bounds, + strict_gap=gamma-max(bounds.values()),E=E,dependency_constant=dep, + C0=C0,C1=rho-(rho-1)*beta+zeta) + + +def parameters(): + tau=1-BIT_SAVING + return Parameters(tau=tau,sigma=1-COMPLEX_SAVING, + epsilon=1/(2+BIT_SAVING),c=Q(1),beta=Q(1,1000),delta=Q(1,10**16), + lam=tau+Q(1,10**20),lamp=tau+Q(2,10**20),C1=Q(11999,10000),kappa=KAPPA) + + +def assembly(p=None): + p=parameters() if p is None else p + ex=layer_exponents(p.tau,p.sigma,p.beta,p.c) + cs=fast_constraints(p) + cs['packed_overhead']=p.lam-ex['internal'] + cs['reserved_axes']=p.lamp-ex['preprocessing'] + require(len(cs)==29 and all(v>0 for v in cs.values()), 'Strict assembly constraint') + margins=fast_margins(p) + require(len(margins)==7 and min(margins.values())>p.kappa, 'Strict assembly absorption') + return dict(parameters=asdict(p),recurrence=ex,constraints=cs,margins=margins, + minimum_margin=min(margins.values()),absorption_gap=min(margins.values())-p.kappa) + + +def basis_combinatorics(): + a,b,k=25,23,57; H=a*b; size=k+a + R=list(range(a))+list(range(7))+list(range(a))*2 + C=list(range(a))*2+list(range(7))+list(range(a)) + completions=[] + for beta in range(b): + prescribed={} + def set_entry(row,col): + require(row not in prescribed or prescribed[row]==col, 'Conflicting prescribed row') + require(col not in prescribed.values() or prescribed.get(row)==col, 'Conflicting prescribed column') + prescribed[row]=col + for i,label in enumerate(R): + if i%b==beta: set_entry(i//b,label) + for j,label in enumerate(C): + i=H-size+j + if i%b==beta: set_entry(i//b,label) + unused=iter(c for c in range(a) if c not in prescribed.values()) + completions.append([prescribed[r] if r in prescribed else next(unused) for r in range(a)]) + forward=[(0,23),(1,24)]+[((j+2)%23,j) for j in range(7)]+[((j+9)%23,j) for j in range(15)] + dual=[(23,0),(24,1)]+[(2+((-9+j)%23),j) for j in range(7)]+[(2+((-11+j)%23),j) for j in range(10,25)] + for edges in (forward,dual): + require(len(edges)==24, 'Tree edge count') + seen={0} + while True: + expanded=seen|{y for x,y in edges if x in seen}|{x for x,y in edges if y in seen} + if expanded==seen:break + seen=expanded + require(seen==set(range(25)), 'A5 incidence graph disconnected') + return dict(row_labels=R,inverse_column_labels=C,permutation_completions=completions, + A5_forward_tree=forward,A5_dual_tree=dual, + scope='Prescription compatibility and A5 trees; remaining generic minors are proved in the note.') + + +def certificate(): + d=json.loads(INPUT.read_text()) + bn,br=bit_counts(d); cn,cr=complex_counts(d) + bit=moment(bn['m'],bn['W'],br,BIT_SAVING,True) + comp=moment(cn['m'],cn['W'],cr,COMPLEX_SAVING,False) + require(bit['strict_gap']>Q(617,10**16), 'Bit gap lower bound') + require(comp['strict_gap']>Q(23982,10**15), 'Complex gap lower bound') + a=assembly(); g=guard(cn) + require(g['C1']==a['parameters']['C1'], 'Guard exponent mismatch') + require(a['absorption_gap']>Q(44822,10**17), 'Assembly gap lower bound') + sources=[INPUT,Path(__file__).resolve(),ROOT/'scripts/partial_swap_producer.py'] + sources += sorted(p for p in (ROOT/'scripts/partial_swap').iterdir() if p.is_file()) + sources += sorted((ROOT/'notes').glob('partial-swap-*.tex')) + return dict(status='Conditional partial-swap integer-multiplication witness', + kappa=KAPPA,bit=dict(counts=bn,**bit),complex=dict(counts=cn,**comp), + basis_combinatorics=basis_combinatorics(),guard=g,assembly=a, + source_sha256={str(p.relative_to(ROOT)):sha256(p.read_bytes()).hexdigest() for p in sources}, + inherited_PR10_commit='62691e395a0458ce089a1c7b5d89e74291e95e29', + scope='Exact finite arithmetic and basis combinatorics. Producer regeneration is separate. ' + 'The common-basis, recursion, and retained analytic/tape arguments remain written proofs.') + + +def main(): + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output',type=Path,default=ROOT/'certificates/partial-swap-network.json') + args=parser.parse_args() + result=certificate() + args.output.write_text(json.dumps(serializable(result),indent=2,sort_keys=True)+'\n') + print('PASS partial-swap kappa='+str(KAPPA)+' = 1.884586e-6') + print('29 strict constraints; 7 strict assembly margins; bit/complex moments and precision guard') + +if __name__=='__main__': + main() diff --git a/scripts/partial_swap_producer.py b/scripts/partial_swap_producer.py new file mode 100644 index 0000000000..9a450f15fb --- /dev/null +++ b/scripts/partial_swap_producer.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +"""Regenerate selected F2 producers and compare complete finite certificates. + +Requires Python 3.10+ and a C++17 compiler. Only the standard library is used. +All large DAGs, matching dependencies, positive labels, and executables live in +a temporary directory unless --work-dir is supplied. No archived raw DAG is +used as an input. Copyright 2026 icekylinx, Apache-2.0. AI-assisted adaptation +of the partial-swap research handoff and the credited upstream circuit code. +""" +import argparse +import gc +import json +import os +from pathlib import Path +import shlex +import subprocess +import sys +import tempfile + +from partial_swap.graph import graph, export +from partial_swap.positive import run as positive_labels + +ROOT = Path(__file__).resolve().parents[1] +SOURCE = Path(__file__).resolve().parent / 'partial_swap' + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def complex_histogram(h=28): + """Count auxiliary transitions from the actual complex side DAG. + + d0 labels are coordinate spaces; d2 pair stars have independent triple + indicators. Each full-frame center role contributes three rank-h edges. + This histogram excludes the separately counted data/macro transitions. + """ + from paired_complex import PairedComplex + circuit = PairedComplex(h) + degree = [0] * len(circuit.args) + ranks = [0] * len(circuit.args) + for node in sorted(circuit.active): + kind = circuit.kind[node] + ranks[node] = (1 if kind == 'in' else circuit.cover(node).bit_count() + if kind == 'd0' else circuit.support[node].bit_count()) + if circuit.args[node]: + for operand in circuit.args[node]: + degree[operand] += 1 + for _, node, _ in circuit.pieces: + degree[node] += 1 + hist = [0] * (h+1) + for node in sorted(circuit.active): + r = ranks[node] + if circuit.args[node]: + hist[r] += degree[node]-1 + hist[h-r] += 1 + for operand in circuit.args[node]: + require(r >= ranks[operand], 'Complex frame dimensions decrease') + hist[r-ranks[operand]] += 1 + else: + hist[1] += degree[node] + for _, node, _ in circuit.pieces: + r = ranks[node] + require(r < h, 'Complex injection frame is too large') + hist[h-1-r] += 1 + hist[1] += 1 + hist[h] += 3 * (h+1) + rank_sum = sum(r*n for r, n in enumerate(hist)) + require(rank_sum == h*(circuit.roles+h+1)+2*h*(h+1), + 'Complex rank identity failed') + return dict(h=h, v=len(circuit.triples), roles=circuit.roles, + center_roles=h+1, rank_sum=rank_sum, histogram=hist) + + +def regenerate(work, certificate, dimensions, compiler, include_complex=True): + require(sys.flags.optimize == 0, 'Run without -O: mathematical assertions must remain enabled') + programs = {} + for name in ('match_exported_dag', 'match_positive_dag'): + programs[name] = work / name + subprocess.run([*shlex.split(compiler), '-O3', '-std=c++17', + str(SOURCE / (name+'.cpp')), '-o', str(programs[name])], check=True) + results = {} + for h in dimensions: + print(f'Regenerating h={h}: scalar DAG', file=sys.stderr, flush=True) + circuit = graph(h) + scalar = circuit.verify() + dag = work / f'triple_base2_{h}.bin' + export(circuit, dag) + del circuit + gc.collect() + original = json.loads(subprocess.check_output( + [str(programs['match_exported_dag']), str(dag), str(dag)+'.links'], text=True)) + print(f'Regenerating h={h}: positive labels', file=sys.stderr, flush=True) + labels = positive_labels(str(dag)) + gc.collect() + matched = json.loads(subprocess.check_output( + [str(programs['match_positive_dag']), str(dag), str(dag)+'.positive'], text=True)) + expected = certificate['producers'][str(h)] + for actual_key, expected_key in ( + ('v', 'v'), ('c', 'additions'), ('q', 'outputs'), + ('matched', 'matches'), ('R', 'roles'), ('loss', 'loss'), + ('histogram', 'histogram')): + require(matched[actual_key] == expected[expected_key], + f'h={h}: certificate mismatch for {expected_key}') + require(original['matched'] == matched['matched'], + f'h={h}: positive enlargement changed the selected matching count') + require(matched['loss'] == h*(h-1), f'h={h}: retained-total loss mismatch') + require(matched['rank_sum'] == h*matched['R']+2*h*(h-1), + f'h={h}: rank identity mismatch') + results[str(h)] = dict(**matched, labels=labels, scalar=scalar, + envelope_matching=original, certificate_equal=True) + (work / f'triple_base2_{h}.counts.json').write_text( + json.dumps(results[str(h)], indent=2)+'\n') + answer = dict(producers=results, regenerated_from_source=True) + if include_complex: + print('Regenerating complex h=28 histogram', file=sys.stderr, flush=True) + result = complex_histogram(certificate['complex']['h']) + require(result['histogram'] == certificate['complex']['histogram'], + 'Complex histogram differs from certificate') + require(result['v'] == certificate['complex']['v'], 'Complex source count mismatch') + require(result['v']**2*(result['roles']+result['center_roles']) == certificate['complex']['B'], + 'Complex role count mismatch') + answer['complex'] = dict(**result, certificate_equal=True) + return answer + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--certificate', type=Path, + default=ROOT/'certificates'/'partial-swap-input.json') + parser.add_argument('--dimensions', nargs='+', type=int, choices=(25, 23, 57), + default=[25, 23, 57]) + parser.add_argument('--cxx', default=os.environ.get('CXX', 'c++')) + parser.add_argument('--work-dir', type=Path, help='Keep generated intermediate files here') + parser.add_argument('--skip-complex', action='store_true') + parser.add_argument('--output', type=Path, help='Write the complete JSON report to this file') + args = parser.parse_args() + certificate = json.loads(args.certificate.read_text()) + def run(work): + return regenerate(work, certificate, args.dimensions, args.cxx, not args.skip_complex) + if args.work_dir: + args.work_dir.mkdir(parents=True, exist_ok=True) + result = run(args.work_dir.resolve()) + else: + with tempfile.TemporaryDirectory(prefix='partial-swap-') as directory: + result = run(Path(directory)) + encoded = json.dumps(result, indent=2)+'\n' + if args.output: + args.output.write_text(encoded) + else: + print(encoded, end='') + + +if __name__ == '__main__': + main() diff --git a/tests/test_partial_swap.py b/tests/test_partial_swap.py new file mode 100644 index 0000000000..704b60f13b --- /dev/null +++ b/tests/test_partial_swap.py @@ -0,0 +1,56 @@ +"""Small exact algebra controls for the new frame compiler.""" +from fractions import Fraction as Q +import unittest + + +def mul(a, b): + return [[sum((x*y for x,y in zip(row,col)),Q(0)) for col in zip(*b)] for row in a] + + +def eye(n): + return [[Q(i==j) for j in range(n)] for i in range(n)] + + +def sub(a,b): + return [[x-y for x,y in zip(ar,br)] for ar,br in zip(a,b)] + + +def block(a,b,c,d): + return [x+y for x,y in zip(a,b)]+[x+y for x,y in zip(c,d)] + + +def transpose(a): + return list(map(list,zip(*a))) + + +def swap(p): + complement=sub(eye(len(p)),p) + return block(complement,p,p,complement) + + +class PartialSwapAlgebraTests(unittest.TestCase): + def test_conjugation_with_nonsymmetric_projector(self): + # Nontrivial lower-lower factorization P = L Pi R, with nonzero K. + # Verify D_P G = G S, avoiding a numerical inverse altogether. + L=[[Q(2),Q(0)],[Q(1),Q(1)]] + R=[[Q(1),Q(0)],[Q(0),Q(1)]] + Pi=[[Q(0),Q(1)],[Q(0),Q(0)]] + P=mul(mul(L,Pi),R) + self.assertEqual(mul(P,P),P) + C=mul(R,L) + Qx=mul(Pi,transpose(Pi)); Qy=mul(transpose(Pi),Pi) + K=sub(mul(Qy,C),mul(C,Qx)) + zero=[[Q(0)]*2 for _ in range(2)] + G=mul(block(L,zero,zero,eye(2)),block(eye(2),zero,K,eye(2))) + S=block(sub(eye(2),Qx),Pi,transpose(Pi),sub(eye(2),Qy)) + self.assertEqual(mul(swap(P),G),mul(G,S)) + self.assertEqual(mul(swap(P),swap(P)),eye(4)) + self.assertEqual(mul(swap(sub(eye(2),P)),swap(P)),swap(eye(2))) + + def test_nested_frame_transition(self): + U=[[Q(1),Q(0)],[Q(0),Q(0)]] + V=eye(2) + self.assertEqual(mul(swap(V),swap(U)),swap(sub(V,U))) + +if __name__=='__main__': + unittest.main() From ed90fd940279c336ebc45968631bdebfb087b505 Mon Sep 17 00:00:00 2001 From: icekylinx Date: Thu, 8 Oct 2026 18:44:22 +0800 Subject: [PATCH 3/7] Use endpoint gauges for conditional kappa = 5.98615e-6 --- Makefile | 22 + NOTICE | 11 + PATCHING.md | 4 +- README.md | 50 +- SOURCES.json | 12 + artifacts/endpoint-gauge-note.pdf | Bin 0 -> 144409 bytes certificates/endpoint-gauge-bit-axes.json | 149 ++ .../endpoint-gauge-complex-input.json | 305 +++ certificates/endpoint-gauge-input.json | 131 ++ certificates/endpoint-gauge-network.json | 1952 +++++++++++++++++ docs/reproducibility.md | 66 +- docs/research/current-status.md | 32 +- notes/endpoint-gauge-assembly.tex | 76 + notes/endpoint-gauge-basis.tex | 184 ++ notes/endpoint-gauge-complex.tex | 225 ++ notes/endpoint-gauge-construction.tex | 212 ++ notes/endpoint-gauge-note.tex | 93 + scripts/endpoint_gauge/README.md | 36 + scripts/endpoint_gauge/__init__.py | 1 + scripts/endpoint_gauge/bit.py | 25 + scripts/endpoint_gauge/complex.py | 181 ++ .../endpoint_gauge/match_complex_general.cpp | 40 + scripts/endpoint_gauge_network.py | 225 ++ scripts/endpoint_gauge_producer.py | 132 ++ tests/test_endpoint_gauge.py | 51 + 25 files changed, 4143 insertions(+), 72 deletions(-) create mode 100644 artifacts/endpoint-gauge-note.pdf create mode 100644 certificates/endpoint-gauge-bit-axes.json create mode 100644 certificates/endpoint-gauge-complex-input.json create mode 100644 certificates/endpoint-gauge-input.json create mode 100644 certificates/endpoint-gauge-network.json create mode 100644 notes/endpoint-gauge-assembly.tex create mode 100644 notes/endpoint-gauge-basis.tex create mode 100644 notes/endpoint-gauge-complex.tex create mode 100644 notes/endpoint-gauge-construction.tex create mode 100644 notes/endpoint-gauge-note.tex create mode 100644 scripts/endpoint_gauge/README.md create mode 100644 scripts/endpoint_gauge/__init__.py create mode 100644 scripts/endpoint_gauge/bit.py create mode 100644 scripts/endpoint_gauge/complex.py create mode 100644 scripts/endpoint_gauge/match_complex_general.cpp create mode 100644 scripts/endpoint_gauge_network.py create mode 100644 scripts/endpoint_gauge_producer.py create mode 100644 tests/test_endpoint_gauge.py diff --git a/Makefile b/Makefile index ee6154c7e9..cdd7ac2327 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ .PHONY: verify note audit-note tuned-note reuse-note incidence-note dag-note shared-point-note paired-note compact-note fetch verify: + $(MAKE) endpoint-gauge-producer endpoint-gauge-certificate $(MAKE) partial-swap-producer partial-swap-certificate python3 scripts/prime_field_network.py python3 scripts/complex_network.py @@ -138,3 +139,24 @@ else $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/partial-swap-note.tex $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/partial-swap-note.tex endif + +.PHONY: endpoint-gauge-producer endpoint-gauge-certificate endpoint-gauge-note +endpoint-gauge-producer: + python3 scripts/endpoint_gauge_producer.py + +endpoint-gauge-certificate: + python3 scripts/endpoint_gauge_network.py + +endpoint-gauge-note: + mkdir -p artifacts +ifeq ($(TEX_ENGINE),tectonic) + $(TECTONIC) -Z search-path=$(CURDIR) --outdir artifacts notes/endpoint-gauge-note.tex +else + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/endpoint-gauge-note.tex + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/endpoint-gauge-note.tex + $(PDFLATEX) -interaction=nonstopmode -halt-on-error -output-directory=artifacts notes/endpoint-gauge-note.tex +endif + +.PHONY: endpoint-gauge-verify +endpoint-gauge-verify: endpoint-gauge-producer endpoint-gauge-certificate + python3 -m unittest discover -s tests -p 'test_endpoint_gauge.py' -v diff --git a/NOTICE b/NOTICE index 60b1727d43..f87a852606 100644 --- a/NOTICE +++ b/NOTICE @@ -67,3 +67,14 @@ This extension directly inherits PR #10, commit 62691e395a0458ce089a1c7b5d89e74291e95e29. The portable producer adapters modify the retained paired-exclusion and shared-point implementations credited above. The original licenses, attribution, and Gaussian correction are retained. + +Endpoint-gauge extension, 8 October 2026 +Copyright 2026 icekylinx + +The complementary auxiliary endpoint gauges, (32,30,40) controlled basis, +general nondegenerate binary phase residuals, retained-center complex producer, +updated path guard and exact assembly are contributed by icekylinx with +substantial OpenAI GPT-6 Astra and Codex assistance. This extension inherits +f2ab41aebad47861caf6316282c1793e5513845e and its PR #10 ancestry. New portable +adapters retain the paired-exclusion and shared-point contributions credited +above. Original licenses, notices and the Gaussian correction are retained. diff --git a/PATCHING.md b/PATCHING.md index 131a97f2f7..632160a302 100644 --- a/PATCHING.md +++ b/PATCHING.md @@ -1,7 +1,7 @@ # Applying the inherited manuscript patch -This patch is the PR #10 baseline. The current partial-swap extension is -presented in `notes/partial-swap-note.tex` and its PDF; it is not included +This patch is the PR #10 baseline. The current endpoint-gauge extension is +presented in `notes/endpoint-gauge-note.tex` and its PDF; it is not included in this historical combined manuscript patch. `patches/batched-23.patch` applies to the original manuscript snapshot at diff --git a/README.md b/README.md index 5b0529fa11..5dbe54fb00 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,15 @@ -# Integer multiplication with conditional saving 1.884586e-6 +# Integer multiplication with conditional saving 5.98615e-6 \[ T(n)=O\!\left(n(\log n)^{1-\kappa}\right),\qquad -\kappa=\frac{942293}{500000000000}=1.884586\times10^{-6}. +\kappa=\frac{119723}{20000000000}=5.98615\times10^{-6}. \] -This construction extends [PR #10](https://github.com/CrocSwap/integer-mult-bounds/pull/10). -Partial-swap frames remove the source rank penalty. A retained-total triple -producer over the binary field, compatible carrier reuse, positive frames, -and a common rational basis give the selected tensor dimensions `(25,23,57)`. -The paired auxiliary boundary uses five recursive blocks. Whole-residual -batching also improves the retained complex network. +Complementary auxiliary endpoint gauges combine the middle-stage entrance +and exit without increasing their total rank. A compatible rational basis +and positive binary producer frames give the selected dimensions `(32,30,40)`. +A general binary quadratic-phase normal form permits whole-residual complex +calls, including alternating residuals, with the same dimensions. The result remains conditional on the pinned upstream analytic and tape interfaces. Exact finite calculations support the written construction; @@ -18,35 +17,38 @@ they do not constitute formal verification of the complete theorem. ## Proof and reproduction -- [Current proof](artifacts/partial-swap-note.pdf) and [LaTeX source](notes/partial-swap-note.tex). -- [Exact certificate](certificates/partial-swap-network.json): both moments, +- [Current proof](artifacts/endpoint-gauge-note.pdf) and [LaTeX source](notes/endpoint-gauge-note.tex). +- [Exact certificate](certificates/endpoint-gauge-network.json): both moments, the precision guard, 29 strict constraints, and seven assembly margins. -- [Producer reconstruction](scripts/partial_swap_producer.py) and - [finite input data](certificates/partial-swap-input.json). +- [Producer reconstruction](scripts/endpoint_gauge_producer.py) and + [finite input data](certificates/endpoint-gauge-input.json). - [Reproduction instructions](docs/reproducibility.md) and [source provenance](SOURCES.json). ```sh -make verify -make partial-swap-note +make endpoint-gauge-verify +make endpoint-gauge-note ``` -Verification requires Python 3.11+, a C++17 compiler, Git, and Make. -Selected producer graphs, carrier matches and positive frames are rebuilt -from source in temporary storage. No large binary graph dumps are committed. -For only the current exact arithmetic, run `make partial-swap-certificate`. +Verification requires Python 3.11+, a C++17 compiler, Git, and Make. The new +producer graphs, carrier matches and frames are rebuilt in temporary storage. +No large binary graph dumps are committed. `make verify` additionally runs all +inherited checks; `make endpoint-gauge-certificate` runs only the new arithmetic. -The component savings are `188459/50000000000` (bit) and `417/100000000` -(complex). The final strict absorption margin exceeds `4.4822e-13`. +The component savings are `2993093/250000000000` (bit) and `3/125000` +(complex). The final strict absorption margin exceeds `1.6569e-13`. The corrected Gaussian input enclosure from #10 is retained with `P=34p`. +This extension inherits the [partial-swap proof](artifacts/partial-swap-note.pdf) +at commit `f2ab41aebad47861caf6316282c1793e5513845e`, which extends +[PR #10](https://github.com/CrocSwap/integer-mult-bounds/pull/10). The [#10 proof](artifacts/batched-23-note.pdf) and -[combined manuscript patch](patches/batched-23.patch) remain the inherited -baseline. The new standalone proof supplies the stronger construction and -parameters; the older patch does not contain this extension. +[combined manuscript patch](patches/batched-23.patch) remain historical +baselines. The current standalone proof supplies the stronger construction; +the older patch does not contain these extensions. ## Attribution -The partial-swap construction and integration are contributed by **icekylinx**, +The endpoint-gauge construction and integration are contributed by **icekylinx**, with substantial OpenAI GPT-6 Astra and Codex assistance. This work builds on **Douglas Colkitt**'s framework, **Zhihao Chen (jacklightChen)**'s finite network and paired producers, and contributions by **Bortlesboat**, **eumemic**, and diff --git a/SOURCES.json b/SOURCES.json index 042bf4842c..39a1117f64 100644 --- a/SOURCES.json +++ b/SOURCES.json @@ -108,5 +108,17 @@ "scope": "Partial-swap construction with kappa=942293/500000000000; inherits the corrected analytic and tape interfaces from PR #10.", "curation": "Import selected producer sources, exact data and proof; regenerate large binaries, omit exploratory alternatives and duplicate baseline snapshot.", "assistance": "Substantial OpenAI GPT-6 Astra and Codex assistance." + }, + "endpoint_gauge_extension": { + "contributor": "icekylinx", + "parent_commit": "f2ab41aebad47861caf6316282c1793e5513845e", + "archive": "integer_mult_endpoint_gauge_3_176x_complete.zip", + "archive_sha256": "1c2e8fa0d80597d6f0b02d707651a3b0477ff99d799614cf30b24931969def84", + "proof": "artifacts/endpoint-gauge-note.pdf", + "certificate": "certificates/endpoint-gauge-network.json", + "producer": "scripts/endpoint_gauge_producer.py", + "scope": "Conditional kappa=119723/20000000000; inherits the partial-swap construction and corrected PR #10 analytic and tape interfaces.", + "curation": "Selected producers, counts and proof only; large graphs are regenerated. Omit exploratory variants, duplicate previous-round snapshot and obsolete comparison claims.", + "assistance": "Substantial OpenAI GPT-6 Astra and Codex assistance." } } diff --git a/artifacts/endpoint-gauge-note.pdf b/artifacts/endpoint-gauge-note.pdf new file mode 100644 index 0000000000000000000000000000000000000000..43b15efc39184cd6f7e673fde22259acf1d2c5b1 GIT binary patch literal 144409 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 z%0D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 literal 0 HcmV?d00001 diff --git a/certificates/endpoint-gauge-bit-axes.json b/certificates/endpoint-gauge-bit-axes.json new file mode 100644 index 0000000000..f37510e4c3 --- /dev/null +++ b/certificates/endpoint-gauge-bit-axes.json @@ -0,0 +1,149 @@ +[ + { + "h": 32, + "v": 4960, + "c": 105056, + "q": 14912, + "baseline_R": 119968, + "matched": 3296, + "R": 116672, + "orientation_changes": 1776, + "rank_sum": 3735488, + "loss": 992, + "histogram": [ + 30080, + 112007, + 89574, + 27108, + 26166, + 6025, + 11936, + 5120, + 10640, + 4640, + 4480, + 4176, + 6304, + 4080, + 4768, + 4304, + 5712, + 4480, + 4704, + 4080, + 5712, + 5040, + 4288, + 4025, + 6705, + 5390, + 8728, + 4649, + 8791, + 27632, + 6960, + 32, + 32 + ] + }, + { + "h": 30, + "v": 4060, + "c": 85440, + "q": 12210, + "baseline_R": 97650, + "matched": 2910, + "R": 94740, + "orientation_changes": 1515, + "rank_sum": 2843940, + "loss": 870, + "histogram": [ + 24840, + 90990, + 75396, + 19674, + 21171, + 5499, + 11985, + 3540, + 8370, + 4095, + 4680, + 3150, + 5190, + 3975, + 4785, + 3240, + 4455, + 3990, + 5040, + 3270, + 4155, + 4095, + 6759, + 3546, + 7875, + 3384, + 7641, + 22050, + 5670, + 30, + 30 + ] + }, + { + "h": 40, + "v": 9880, + "c": 214480, + "q": 29680, + "baseline_R": 244160, + "matched": 5120, + "R": 239040, + "orientation_changes": 2460, + "rank_sum": 9564720, + "loss": 1560, + "histogram": [ + 59480, + 222969, + 182768, + 52084, + 53188, + 8891, + 23480, + 8160, + 18020, + 7720, + 7200, + 6580, + 11800, + 6020, + 7680, + 6260, + 11080, + 6460, + 7600, + 6340, + 8640, + 6060, + 7520, + 6300, + 9660, + 7200, + 7440, + 6220, + 10020, + 8020, + 6800, + 6391, + 12821, + 8578, + 16870, + 7411, + 16949, + 55900, + 14060, + 40, + 40 + ] + } +] diff --git a/certificates/endpoint-gauge-complex-input.json b/certificates/endpoint-gauge-complex-input.json new file mode 100644 index 0000000000..a39d70088a --- /dev/null +++ b/certificates/endpoint-gauge-complex-input.json @@ -0,0 +1,305 @@ +{ + "description": "General binary residuals, retained complex centers, carrier reuse, and stage-two source gauge", + "dimensions": [ + 32, + 30, + 40 + ], + "m": 38400, + "N": 198959488000, + "B1": 4939650643200, + "B2": 4878476844800, + "B3": 5113782419200, + "W": 10390178240000, + "L": 117399987200, + "total_rank": 398982681296998400, + "deficit": 163119001600, + "complex_saving": "3/125000", + "complex_saving_decimal": "0.000024", + "scalar_circuits": [ + { + "h": 32, + "v": 4960, + "c": 122512, + "q": 19873, + "baseline_R": 142385, + "matched": 19241, + "R": 123144, + "orientation_changes": 9611, + "rank_sum": 3942656, + "loss": 1024, + "histogram": [ + 22724, + 124265, + 77585, + 37222, + 26882, + 21504, + 14641, + 12240, + 15072, + 6804, + 9744, + 4796, + 9742, + 5310, + 9630, + 4426, + 9993, + 4264, + 9076, + 4920, + 9988, + 4210, + 11128, + 4581, + 9563, + 8507, + 12976, + 9091, + 8624, + 646, + 965, + 32, + 34 + ] + }, + { + "h": 30, + "v": 4060, + "c": 99153, + "q": 16271, + "baseline_R": 115424, + "matched": 15873, + "R": 99551, + "orientation_changes": 7863, + "rank_sum": 2988330, + "loss": 900, + "histogram": [ + 18700, + 101608, + 63321, + 30537, + 22893, + 17943, + 11167, + 10103, + 13266, + 5233, + 8159, + 4445, + 9387, + 4157, + 7464, + 4387, + 9566, + 3759, + 7440, + 3717, + 9859, + 3769, + 8202, + 7415, + 10857, + 7558, + 7285, + 575, + 845, + 30, + 32 + ] + }, + { + "h": 40, + "v": 9880, + "c": 252023, + "q": 39561, + "baseline_R": 291584, + "matched": 37642, + "R": 253942, + "orientation_changes": 18853, + "rank_sum": 10160880, + "loss": 1600, + "histogram": [ + 44113, + 248333, + 155056, + 73906, + 52613, + 42852, + 25867, + 23628, + 26530, + 11768, + 15968, + 7520, + 15376, + 9682, + 15386, + 6902, + 17514, + 7364, + 13936, + 7052, + 15542, + 6614, + 15046, + 6770, + 15944, + 6272, + 14736, + 8136, + 16178, + 6298, + 19514, + 7629, + 15904, + 16131, + 24071, + 17183, + 15580, + 970, + 1525, + 40, + 42 + ] + } + ], + "macros": [ + { + "name": "first-third join", + "width": 38328, + "count": 4939650643200 + }, + { + "name": "third-only source", + "width": 38360, + "count": 174131776000 + }, + { + "name": "gauged stage-two boundary", + "width": 38370, + "count": 4878476844800 + }, + { + "name": "data entrance A3", + "width": 37401, + "count": 397918976000 + }, + { + "name": "data entrance A5", + "width": 899, + "count": 397918976000 + } + ], + "remaining_singleton_rank": 39393978624000, + "child_multiplicities": { + "1": 54358706055200, + "2": 9337640234400, + "3": 4477827684800, + "4": 3259678724800, + "5": 2604815212800, + "6": 1655427405600, + "7": 1461887379200, + "8": 1788928326400, + "9": 766348886400, + "10": 1112246483200, + "11": 561642076800, + "12": 1160422692800, + "13": 611684164800, + "14": 1061895204800, + "15": 531513025600, + "16": 1222317053600, + "17": 503543308800, + "18": 1009297078400, + "19": 521516172800, + "20": 1196763548800, + "21": 486764065600, + "22": 1151302937600, + "23": 683458880800, + "24": 1236717714400, + "25": 837920895200, + "26": 1174251334400, + "27": 556682738400, + "28": 713127936000, + "29": 154209617600, + "30": 433242132000, + "31": 154913360000, + "32": 321632225600, + "33": 324839625600, + "34": 484732169600, + "35": 346024380800, + "36": 313743808000, + "37": 19533472000, + "38": 30709840000, + "39": 805504000, + "40": 845779200, + "899": 397918976000, + "37401": 397918976000, + "38328": 4939650643200, + "38360": 174131776000, + "38370": 4878476844800 + }, + "log_upper_bounds": { + "1": "659738296161/62500000000", + "2": "4815754667/488281250", + "3": "2364300112477/250000000000", + "4": "573094898591/62500000000", + "5": "4473187413071/500000000000", + "6": "2191013317337/250000000000", + "7": "8609902589521/1000000000000", + "8": "264886599903/31250000000", + "9": "208964704031/25000000000", + "10": "4126613822791/500000000000", + "11": "4078958732889/500000000000", + "12": "2017726522197/250000000000", + "13": "1598172676223/200000000000", + "14": "7916755408961/1000000000000", + "15": "3923881268737/500000000000", + "16": "7783224016337/1000000000000", + "17": "193064984863/25000000000", + "18": "191636024517/25000000000", + "19": "761137375941/100000000000", + "20": "3780040232511/500000000000", + "21": "7511290300853/1000000000000", + "22": "3732385142609/500000000000", + "23": "7420318522647/1000000000000", + "24": "1844439727057/250000000000", + "25": "1834234228427/250000000000", + "26": "1459543240111/200000000000", + "27": "1814993968143/250000000000", + "28": "7223608228401/1000000000000", + "29": "718851690859/100000000000", + "30": "3577307678457/500000000000", + "31": "7121825534091/1000000000000", + "32": "7090076835777/1000000000000", + "33": "705930517711/100000000000", + "34": "175736305349/25000000000", + "35": "7000464677087/1000000000000", + "36": "174307345003/25000000000", + "37": "1736223706483/250000000000", + "38": "138364531577/20000000000", + "39": "6892251092447/1000000000000", + "40": "3433466642231/500000000000", + "899": "750905940821/200000000000", + "37401": "26360017563/1000000000000", + "38328": "1876760013/1000000000000", + "38360": "1042209579/1000000000000", + "38370": "156311067/200000000000" + }, + "moment_upper": "4613924789750017470809641961281363284456355138632694534639136305413242653393830338818837434090969255448611737319228980744591192829137098696878262459732791233439185182371633423550243976007022032977891909605258022888356998146760044021766867465613813679766122057883659468324921914206166634957121789831631613273896021440697940355716151765083230727243599255832451614281501616269560277629337821467067136172664429781477044241096495093007475208553680495799274456576034720539890736681833479388483188585955007039906146130250313599152752055786706588991361435427866394936098994961109221559477238053356335251742527923733796993451581957695846368423785795218752093829473098613744535848400487084839217808502369726966474380470465087890625/4613924826337591235435060288525548640453538561015360359727386867424798369361500041437268944120682219793714220088288164248227533010380583764465256860129210910084911574544233473871545088582266422915671502103093105960089427619677501819270047010194396765428365425300765743648635237096925610677392622781686560091683057165179831131589931921697124848897602416217843608430155547221364480826617685508648564194800354635673689911289078294493254804820538466697567423118218556284457248785425574899410475152996976109843166292454382721043870577172513951201641298720857577410600525835035211094320287969054773282792056707970037141561664682757070640013861226887095259364811313353409782511022929668988793969890131678148545067647273038940928", + "strict_gap": "36587573764625418327244185355997183422382665825088250562011555715967669702618431510029712964345102482769059183503636340181243485067586994400396419676645726392172600050321301112575244389937779592497835083071732429472917457797503179544580583085662243367417106275323713322890758975720270832950054946817787035724481890775873780156613894121654003160385391994148653930951804203197279864041581428022135924854196645670192583201485779596266857970898292966542183835744566512103592095510927286567041969069937020162204069121891118521385807362210279863292991182474501530873925989534843049915698438031049528784236240148110082725061224271590075431668343165535338214739665246662622442584149576161387761951182070687176807951050303/4613924826337591235435060288525548640453538561015360359727386867424798369361500041437268944120682219793714220088288164248227533010380583764465256860129210910084911574544233473871545088582266422915671502103093105960089427619677501819270047010194396765428365425300765743648635237096925610677392622781686560091683057165179831131589931921697124848897602416217843608430155547221364480826617685508648564194800354635673689911289078294493254804820538466697567423118218556284457248785425574899410475152996976109843166292454382721043870577172513951201641298720857577410600525835035211094320287969054773282792056707970037141561664682757070640013861226887095259364811313353409782511022929668988793969890131678148545067647273038940928", + "strict_gap_decimal": "7.92981575160764919469161674201616497540846461E-9", + "guard": { + "rho": "19/10", + "gamma": "9997/10000", + "path_rank_budget": 39564, + "largest_child": 38370, + "largest_small_child": 899, + "m_power_lower": 500000000, + "small_power_upper": 460, + "path_moment_upper": "51180270301/51200000000", + "path_moment_upper_decimal": "0.99961465431640625", + "no_large_path_upper": "227493/6250000" + } +} diff --git a/certificates/endpoint-gauge-input.json b/certificates/endpoint-gauge-input.json new file mode 100644 index 0000000000..97105e697e --- /dev/null +++ b/certificates/endpoint-gauge-input.json @@ -0,0 +1,131 @@ +{ + "status": "Conditional endpoint-gauge witness; producer regeneration and exact arithmetic are checked separately.", + "kappa": "119723/20000000000", + "kappa_decimal": 5.98615e-06, + "bit_saving": "2993093/250000000000", + "complex_saving": "3/125000", + "bit": { + "dimensions": [ + 32, + 30, + 40 + ], + "m": 38400, + "N": 198959488000, + "B1": 4680040601600, + "B2": 4642714752000, + "B3": 4813691904000, + "E": 133651302400, + "W": 9854325632000, + "L": 113840729600, + "total_rank": 378405934031283200, + "deficit": 170237516800, + "singletons": 629339590854400, + "child_multiplicities": { + "1": 629339590854400, + "2": 520055584000, + "4": 535654515200, + "6": 537511296000, + "8": 583899225600, + "10": 550774176000, + "12": 522502086400, + "14": 617933335200, + "16": 644506096800, + "18": 763624344000, + "20": 652872441600, + "22": 689629485600, + "24": 1691371634400, + "26": 1558994438400, + "28": 1018295520000, + "30": 5192627235200, + "32": 342595792000, + "34": 1125691840000, + "36": 283134656000, + "38": 796643456000, + "40": 134456806400, + "838": 397918976000, + "882": 397918976000, + "36402": 397918976000, + "38256": 4680040601600, + "38320": 133651302400, + "38340": 4642714752000 + } + }, + "bit_moment_gap": "1910605958716315497169410556560185882793043855873255495277770238749862482198934576413278908166150948365493709503099757564861572580485576965178250394760278653233544114264188444507741587292953380815482189792737306582059605307552655748160869971333242418043103324271385259520568467294234515686899058877242876563957336662750541217432140277234569876991951439945198284544329410123434558838521293690305928648414082931930863284378222680841154231828989182789368415597383364513348534915556135073201975710261299360633692110994469663800947178062923889706994862898971278596350068331993649568997525833896917663237927036160352221631055145631306689899/84267388024452948685063835459911086110413851024692967194838041127482918873752477221422063802499553962342022396755569332610000852533211463036709168999408178905994893219129893198112423704373535247635251458069265856092244157425668456931335104552173777613143702444460617065127587058371378768915274119605216375501220314717400799551108907218890815351930003632090742254521502630243936459987115501578222917846359572387365093166703646512014754996666481908173579418832173378192152147422990789890804946527861007791370869972624773377159212726801237464668496559042138034331478960415335596890112636527914562707426424361205381491782348800000000000000000000000000", + "bit_moment_gap_decimal": 2.267313611479082e-14, + "complex_moment_gap": "36587573764625418327244185355997183422382665825088250562011555715967669702618431510029712964345102482769059183503636340181243485067586994400396419676645726392172600050321301112575244389937779592497835083071732429472917457797503179544580583085662243367417106275323713322890758975720270832950054946817787035724481890775873780156613894121654003160385391994148653930951804203197279864041581428022135924854196645670192583201485779596266857970898292966542183835744566512103592095510927286567041969069937020162204069121891118521385807362210279863292991182474501530873925989534843049915698438031049528784236240148110082725061224271590075431668343165535338214739665246662622442584149576161387761951182070687176807951050303/4613924826337591235435060288525548640453538561015360359727386867424798369361500041437268944120682219793714220088288164248227533010380583764465256860129210910084911574544233473871545088582266422915671502103093105960089427619677501819270047010194396765428365425300765743648635237096925610677392622781686560091683057165179831131589931921697124848897602416217843608430155547221364480826617685508648564194800354635673689911289078294493254804820538466697567423118218556284457248785425574899410475152996976109843166292454382721043870577172513951201641298720857577410600525835035211094320287969054773282792056707970037141561664682757070640013861226887095259364811313353409782511022929668988793969890131678148545067647273038940928", + "complex_moment_gap_decimal": 7.92981575160765e-09, + "parameters": { + "tau": "249997006907/250000000000", + "sigma": "124997/125000", + "epsilon": "250000000000/500002993093", + "c": "1", + "lam": "99998802762800000001/100000000000000000000", + "lamp": "49999401381400000001/50000000000000000000", + "kappa": "119723/20000000000", + "beta": "1/1000", + "delta": "1/10000000000000000", + "C1": "1187/625" + }, + "recurrence_exponents": { + "internal": "249997006907/250000000000", + "leaf": "124997003/125000000", + "preprocessing": "0", + "layer": "249997006907/250000000000" + }, + "constraint_slacks": { + "tau_positive": "249997006907/250000000000", + "tau_below_one": "2993093/250000000000", + "sigma_positive": "124997/125000", + "sigma_below_one": "3/125000", + "c_positive": "1", + "epsilon_positive": "250000000000/500002993093", + "beta_positive": "1/1000", + "beta_below_one": "999/1000", + "lambda_above_tau": "1/100000000000000000000", + "lambda_above_sigma": "1202762800000001/100000000000000000000", + "lambda_below_one": "1197237199999999/100000000000000000000", + "packed_overhead": "1/100000000000000000000", + "lambda_prime_above_lambda": "1/100000000000000000000", + "leaf_cost": "600181400000001/50000000000000000000", + "lambda_prime_below_one": "598618599999999/50000000000000000000", + "guard_width": "25202993093/500002993093", + "crt_layout": "748282208605706649/125000748273250000000000", + "prefix_cost": "2993093/500002993093", + "scalar_cost": "2500029930929999499997006907/5000029930930000000000000000", + "delta_positive": "1/10000000000000000", + "delta_below_one_eighth": "1249999999999999/10000000000000000", + "prime_interval_growth": "2993093/500002993093", + "K_smaller_than_ell": "2993093/500002993093", + "K_dominates_log_p": "250000000000/500002993093", + "r_superpolynomial": "250002993093/500002993093", + "kappa_positive": "119723/20000000000", + "gaussian_cost": "29930929999499997006907/5000029930930000000000000000", + "alpha_squared_theta_growth": "2993093/500002993093", + "reserved_axes": "49999401381400000001/50000000000000000000" + }, + "assembly_margins": { + "g1": "2993093/500002993093", + "g2": "2993093/500002993093", + "g3": "598618599999999/100000598618600000000", + "g4": "748282208605706649/125000748273250000000000", + "g5": "29930929999499997006907/5000029930930000000000000000", + "g6": "2500029930929999499997006907/5000029930930000000000000000", + "g7": "250000000000/500002993093" + }, + "minimum_margin": "29930929999499997006907/5000029930930000000000000000", + "absorption_gap": "828463377506907/5000029930930000000000000000", + "absorption_gap_decimal": 1.6569168364014447e-13, + "complex_guard": { + "rho": "19/10", + "gamma": "9997/10000", + "path_rank_budget": 39564, + "largest_child": 38370, + "largest_small_child": 899, + "m_power_lower": 500000000, + "small_power_upper": 460, + "path_moment_upper": "51180270301/51200000000", + "path_moment_upper_decimal": "0.99961465431640625", + "no_large_path_upper": "227493/6250000" + } +} diff --git a/certificates/endpoint-gauge-network.json b/certificates/endpoint-gauge-network.json new file mode 100644 index 0000000000..a9e5b52e3c --- /dev/null +++ b/certificates/endpoint-gauge-network.json @@ -0,0 +1,1952 @@ +{ + "assembly": { + "absorption_gap": "828463377506907/5000029930930000000000000000", + "constraints": { + "K_dominates_log_p": "250000000000/500002993093", + "K_smaller_than_ell": "2993093/500002993093", + "alpha_squared_theta_growth": "2993093/500002993093", + "beta_below_one": "999/1000", + "beta_positive": "1/1000", + "c_positive": "1", + "crt_layout": "748282208605706649/125000748273250000000000", + "delta_below_one_eighth": "1249999999999999/10000000000000000", + "delta_positive": "1/10000000000000000", + "epsilon_positive": "250000000000/500002993093", + "gaussian_cost": "29930929999499997006907/5000029930930000000000000000", + "guard_width": "25202993093/500002993093", + "kappa_positive": "119723/20000000000", + "lambda_above_sigma": "1202762800000001/100000000000000000000", + "lambda_above_tau": "1/100000000000000000000", + "lambda_below_one": "1197237199999999/100000000000000000000", + "lambda_prime_above_lambda": "1/100000000000000000000", + "lambda_prime_below_one": "598618599999999/50000000000000000000", + "leaf_cost": "600181400000001/50000000000000000000", + "packed_overhead": "1/100000000000000000000", + "prefix_cost": "2993093/500002993093", + "prime_interval_growth": "2993093/500002993093", + "r_superpolynomial": "250002993093/500002993093", + "reserved_axes": "49999401381400000001/50000000000000000000", + "scalar_cost": "2500029930929999499997006907/5000029930930000000000000000", + "sigma_below_one": "3/125000", + "sigma_positive": "124997/125000", + "tau_below_one": "2993093/250000000000", + "tau_positive": "249997006907/250000000000" + }, + "margins": { + "g1": "2993093/500002993093", + "g2": "2993093/500002993093", + "g3": "598618599999999/100000598618600000000", + "g4": "748282208605706649/125000748273250000000000", + "g5": "29930929999499997006907/5000029930930000000000000000", + "g6": "2500029930929999499997006907/5000029930930000000000000000", + "g7": "250000000000/500002993093" + }, + "parameters": { + "C1": "1187/625", + "beta": "1/1000", + "c": "1", + "delta": "1/10000000000000000", + "epsilon": "250000000000/500002993093", + "kappa": "119723/20000000000", + "lam": "99998802762800000001/100000000000000000000", + "lamp": "49999401381400000001/50000000000000000000", + "sigma": "124997/125000", + "tau": "249997006907/250000000000" + }, + "recurrence": { + "internal": "249997006907/250000000000", + "layer": "249997006907/250000000000", + "leaf": "124997003/125000000", + "preprocessing": "0" + } + }, + "basis_combinatorics": { + "A5_dual_tree": [ + [ + 30, + 0 + ], + [ + 31, + 1 + ], + [ + 31, + 2 + ], + [ + 2, + 3 + ], + [ + 3, + 4 + ], + [ + 4, + 5 + ], + [ + 5, + 6 + ], + [ + 6, + 7 + ], + [ + 7, + 8 + ], + [ + 8, + 9 + ], + [ + 9, + 10 + ], + [ + 10, + 11 + ], + [ + 11, + 12 + ], + [ + 12, + 13 + ], + [ + 13, + 14 + ], + [ + 14, + 15 + ], + [ + 15, + 16 + ], + [ + 16, + 17 + ], + [ + 17, + 18 + ], + [ + 18, + 19 + ], + [ + 19, + 20 + ], + [ + 20, + 21 + ], + [ + 21, + 22 + ], + [ + 22, + 23 + ], + [ + 23, + 24 + ], + [ + 24, + 25 + ], + [ + 25, + 26 + ], + [ + 26, + 27 + ], + [ + 27, + 28 + ], + [ + 28, + 29 + ], + [ + 29, + 30 + ] + ], + "A5_forward_tree": [ + [ + 0, + 30 + ], + [ + 1, + 31 + ], + [ + 2, + 1 + ], + [ + 3, + 2 + ], + [ + 4, + 3 + ], + [ + 5, + 4 + ], + [ + 6, + 5 + ], + [ + 7, + 6 + ], + [ + 8, + 7 + ], + [ + 9, + 8 + ], + [ + 10, + 9 + ], + [ + 11, + 10 + ], + [ + 12, + 11 + ], + [ + 13, + 12 + ], + [ + 14, + 13 + ], + [ + 15, + 14 + ], + [ + 16, + 15 + ], + [ + 17, + 16 + ], + [ + 18, + 17 + ], + [ + 19, + 18 + ], + [ + 20, + 19 + ], + [ + 21, + 20 + ], + [ + 22, + 21 + ], + [ + 23, + 22 + ], + [ + 24, + 23 + ], + [ + 25, + 24 + ], + [ + 26, + 25 + ], + [ + 27, + 26 + ], + [ + 28, + 27 + ], + [ + 29, + 28 + ], + [ + 0, + 29 + ] + ], + "inverse_column_labels": [ + 31, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31 + ], + "permutation_completions": [ + [ + 0, + 30, + 29, + 1, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 31, + 3, + 2 + ], + [ + 1, + 31, + 30, + 0, + 2, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 4, + 3 + ], + [ + 2, + 1, + 31, + 0, + 3, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 5, + 4 + ], + [ + 3, + 2, + 0, + 1, + 4, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 6, + 5 + ], + [ + 4, + 3, + 0, + 1, + 2, + 5, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 7, + 6 + ], + [ + 5, + 4, + 0, + 1, + 2, + 3, + 6, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 8, + 7 + ], + [ + 6, + 5, + 0, + 1, + 2, + 3, + 4, + 7, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 9, + 8 + ], + [ + 7, + 6, + 0, + 1, + 2, + 3, + 4, + 5, + 8, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 10, + 9 + ], + [ + 8, + 7, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 9, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 11, + 10 + ], + [ + 9, + 8, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 10, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 12, + 11 + ], + [ + 10, + 9, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 11, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 13, + 12 + ], + [ + 11, + 10, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 12, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 14, + 13 + ], + [ + 12, + 11, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 13, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 15, + 14 + ], + [ + 13, + 12, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 14, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 16, + 15 + ], + [ + 14, + 13, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 15, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 17, + 16 + ], + [ + 15, + 14, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 16, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 18, + 17 + ], + [ + 16, + 15, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 17, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 19, + 18 + ], + [ + 17, + 16, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 18, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 20, + 19 + ], + [ + 18, + 17, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 19, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 21, + 20 + ], + [ + 19, + 18, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 20, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 22, + 21 + ], + [ + 20, + 19, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 21, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 23, + 22 + ], + [ + 21, + 20, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 22, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 24, + 23 + ], + [ + 22, + 21, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 23, + 26, + 27, + 28, + 29, + 30, + 31, + 25, + 24 + ], + [ + 23, + 22, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 24, + 27, + 28, + 29, + 30, + 31, + 26, + 25 + ], + [ + 24, + 23, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 25, + 28, + 29, + 30, + 31, + 27, + 26 + ], + [ + 25, + 24, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 26, + 29, + 30, + 31, + 28, + 27 + ], + [ + 26, + 25, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 27, + 30, + 31, + 29, + 28 + ], + [ + 27, + 26, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 28, + 31, + 0, + 30, + 29 + ], + [ + 28, + 27, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 29, + 31, + 1, + 0, + 30 + ], + [ + 29, + 28, + 0, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 30, + 2, + 1, + 31 + ] + ], + "row_labels": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 0 + ], + "scope": "Finite prescription compatibility and tree connectivity; generic minors are proved in the note." + }, + "bit": { + "child_width_multiplicities": [ + [ + 1, + 629339590854400 + ], + [ + 2, + 520055584000 + ], + [ + 4, + 535654515200 + ], + [ + 6, + 537511296000 + ], + [ + 8, + 583899225600 + ], + [ + 10, + 550774176000 + ], + [ + 12, + 522502086400 + ], + [ + 14, + 617933335200 + ], + [ + 16, + 644506096800 + ], + [ + 18, + 763624344000 + ], + [ + 20, + 652872441600 + ], + [ + 22, + 689629485600 + ], + [ + 24, + 1691371634400 + ], + [ + 26, + 1558994438400 + ], + [ + 28, + 1018295520000 + ], + [ + 30, + 5192627235200 + ], + [ + 32, + 342595792000 + ], + [ + 34, + 1125691840000 + ], + [ + 36, + 283134656000 + ], + [ + 38, + 796643456000 + ], + [ + 40, + 134456806400 + ], + [ + 838, + 397918976000 + ], + [ + 882, + 397918976000 + ], + [ + 36402, + 397918976000 + ], + [ + 38256, + 4680040601600 + ], + [ + 38320, + 133651302400 + ], + [ + 38340, + 4642714752000 + ] + ], + "counts": { + "B1": 4680040601600, + "B2": 4642714752000, + "B3": 4813691904000, + "E": 133651302400, + "L": 113840729600, + "N": 198959488000, + "W": 9854325632000, + "child_multiplicities": { + "1": 629339590854400, + "10": 550774176000, + "12": 522502086400, + "14": 617933335200, + "16": 644506096800, + "18": 763624344000, + "2": 520055584000, + "20": 652872441600, + "22": 689629485600, + "24": 1691371634400, + "26": 1558994438400, + "28": 1018295520000, + "30": 5192627235200, + "32": 342595792000, + "34": 1125691840000, + "36": 283134656000, + "36402": 397918976000, + "38": 796643456000, + "38256": 4680040601600, + "38320": 133651302400, + "38340": 4642714752000, + "4": 535654515200, + "40": 134456806400, + "6": 537511296000, + "8": 583899225600, + "838": 397918976000, + "882": 397918976000 + }, + "deficit": 170237516800, + "dimensions": [ + 32, + 30, + 40 + ], + "m": 38400, + "singletons": 629339590854400, + "total_rank": 378405934031283200 + }, + "enclosure": "1+u+u^2/(2(1-u/3))", + "exponent": "249997006907/250000000000", + "logarithm_upper_bounds": { + "1": "659738296161/62500000000", + "10": "4126613822791/500000000000", + "12": "2017726522197/250000000000", + "14": "7916755408961/1000000000000", + "16": "7783224016337/1000000000000", + "18": "191636024517/25000000000", + "2": "4815754667/488281250", + "20": "3780040232511/500000000000", + "22": "3732385142609/500000000000", + "24": "1844439727057/250000000000", + "26": "1459543240111/200000000000", + "28": "7223608228401/1000000000000", + "30": "3577307678457/500000000000", + "32": "7090076835777/1000000000000", + "34": "175736305349/25000000000", + "36": "174307345003/25000000000", + "36402": "26716870703/500000000000", + "38": "138364531577/20000000000", + "38256": "1878524439/500000000000", + "38320": "521376623/250000000000", + "38340": "1563721977/1000000000000", + "4": "573094898591/62500000000", + "40": "3433466642231/500000000000", + "6": "2191013317337/250000000000", + "8": "264886599903/31250000000", + "838": "1912397319047/500000000000", + "882": "377362068257/100000000000" + }, + "moment_upper": "84267388024451038079105119144413916699857290838810174150982167871987641103513727358939864867923140683433856245807203838900497752775646601464128683422443000655600132940476659653998159515929027506047958504688450373902451420119086397326027551896425616743172369202042573961803315673111858200447979885089529476442343071840836842214446156677673383211652769062213750303081557431959392130576992067019384396552669266458716679083771715648730376773985640753941750429649384009776554764058477441355889390392787805815660608673264139685048218257137436517490433635152431039468579989136739246821780642878345565181592527443542143564746188447778368944854368693310101/84267388024452948685063835459911086110413851024692967194838041127482918873752477221422063802499553962342022396755569332610000852533211463036709168999408178905994893219129893198112423704373535247635251458069265856092244157425668456931335104552173777613143702444460617065127587058371378768915274119605216375501220314717400799551108907218890815351930003632090742254521502630243936459987115501578222917846359572387365093166703646512014754996666481908173579418832173378192152147422990789890804946527861007791370869972624773377159212726801237464668496559042138034331478960415335596890112636527914562707426424361205381491782348800000000000000000000000000", + "saving": "2993093/250000000000", + "strict_gap": "1910605958716315497169410556560185882793043855873255495277770238749862482198934576413278908166150948365493709503099757564861572580485576965178250394760278653233544114264188444507741587292953380815482189792737306582059605307552655748160869971333242418043103324271385259520568467294234515686899058877242876563957336662750541217432140277234569876991951439945198284544329410123434558838521293690305928648414082931930863284378222680841154231828989182789368415597383364513348534915556135073201975710261299360633692110994469663800947178062923889706994862898971278596350068331993649568997525833896917663237927036160352221631055145631306689899/84267388024452948685063835459911086110413851024692967194838041127482918873752477221422063802499553962342022396755569332610000852533211463036709168999408178905994893219129893198112423704373535247635251458069265856092244157425668456931335104552173777613143702444460617065127587058371378768915274119605216375501220314717400799551108907218890815351930003632090742254521502630243936459987115501578222917846359572387365093166703646512014754996666481908173579418832173378192152147422990789890804946527861007791370869972624773377159212726801237464668496559042138034331478960415335596890112636527914562707426424361205381491782348800000000000000000000000000" + }, + "complex": { + "child_width_multiplicities": [ + [ + 1, + 54358706055200 + ], + [ + 2, + 9337640234400 + ], + [ + 3, + 4477827684800 + ], + [ + 4, + 3259678724800 + ], + [ + 5, + 2604815212800 + ], + [ + 6, + 1655427405600 + ], + [ + 7, + 1461887379200 + ], + [ + 8, + 1788928326400 + ], + [ + 9, + 766348886400 + ], + [ + 10, + 1112246483200 + ], + [ + 11, + 561642076800 + ], + [ + 12, + 1160422692800 + ], + [ + 13, + 611684164800 + ], + [ + 14, + 1061895204800 + ], + [ + 15, + 531513025600 + ], + [ + 16, + 1222317053600 + ], + [ + 17, + 503543308800 + ], + [ + 18, + 1009297078400 + ], + [ + 19, + 521516172800 + ], + [ + 20, + 1196763548800 + ], + [ + 21, + 486764065600 + ], + [ + 22, + 1151302937600 + ], + [ + 23, + 683458880800 + ], + [ + 24, + 1236717714400 + ], + [ + 25, + 837920895200 + ], + [ + 26, + 1174251334400 + ], + [ + 27, + 556682738400 + ], + [ + 28, + 713127936000 + ], + [ + 29, + 154209617600 + ], + [ + 30, + 433242132000 + ], + [ + 31, + 154913360000 + ], + [ + 32, + 321632225600 + ], + [ + 33, + 324839625600 + ], + [ + 34, + 484732169600 + ], + [ + 35, + 346024380800 + ], + [ + 36, + 313743808000 + ], + [ + 37, + 19533472000 + ], + [ + 38, + 30709840000 + ], + [ + 39, + 805504000 + ], + [ + 40, + 845779200 + ], + [ + 899, + 397918976000 + ], + [ + 37401, + 397918976000 + ], + [ + 38328, + 4939650643200 + ], + [ + 38360, + 174131776000 + ], + [ + 38370, + 4878476844800 + ] + ], + "counts": { + "B1": 4939650643200, + "B2": 4878476844800, + "B3": 5113782419200, + "L": 117399987200, + "N": 198959488000, + "W": 10390178240000, + "deficit": 163119001600, + "m": 38400, + "remaining_singleton_rank": 39393978624000, + "total_rank": 398982681296998400 + }, + "enclosure": "1/(1-u)", + "exponent": "124997/125000", + "logarithm_upper_bounds": { + "1": "659738296161/62500000000", + "10": "4126613822791/500000000000", + "11": "4078958732889/500000000000", + "12": "2017726522197/250000000000", + "13": "1598172676223/200000000000", + "14": "7916755408961/1000000000000", + "15": "3923881268737/500000000000", + "16": "7783224016337/1000000000000", + "17": "193064984863/25000000000", + "18": "191636024517/25000000000", + "19": "761137375941/100000000000", + "2": "4815754667/488281250", + "20": "3780040232511/500000000000", + "21": "7511290300853/1000000000000", + "22": "3732385142609/500000000000", + "23": "7420318522647/1000000000000", + "24": "1844439727057/250000000000", + "25": "1834234228427/250000000000", + "26": "1459543240111/200000000000", + "27": "1814993968143/250000000000", + "28": "7223608228401/1000000000000", + "29": "718851690859/100000000000", + "3": "2364300112477/250000000000", + "30": "3577307678457/500000000000", + "31": "7121825534091/1000000000000", + "32": "7090076835777/1000000000000", + "33": "705930517711/100000000000", + "34": "175736305349/25000000000", + "35": "7000464677087/1000000000000", + "36": "174307345003/25000000000", + "37": "1736223706483/250000000000", + "37401": "26360017563/1000000000000", + "38": "138364531577/20000000000", + "38328": "1876760013/1000000000000", + "38360": "1042209579/1000000000000", + "38370": "156311067/200000000000", + "39": "6892251092447/1000000000000", + "4": "573094898591/62500000000", + "40": "3433466642231/500000000000", + "5": "4473187413071/500000000000", + "6": "2191013317337/250000000000", + "7": "8609902589521/1000000000000", + "8": "264886599903/31250000000", + "899": "750905940821/200000000000", + "9": "208964704031/25000000000" + }, + "moment_upper": "4613924789750017470809641961281363284456355138632694534639136305413242653393830338818837434090969255448611737319228980744591192829137098696878262459732791233439185182371633423550243976007022032977891909605258022888356998146760044021766867465613813679766122057883659468324921914206166634957121789831631613273896021440697940355716151765083230727243599255832451614281501616269560277629337821467067136172664429781477044241096495093007475208553680495799274456576034720539890736681833479388483188585955007039906146130250313599152752055786706588991361435427866394936098994961109221559477238053356335251742527923733796993451581957695846368423785795218752093829473098613744535848400487084839217808502369726966474380470465087890625/4613924826337591235435060288525548640453538561015360359727386867424798369361500041437268944120682219793714220088288164248227533010380583764465256860129210910084911574544233473871545088582266422915671502103093105960089427619677501819270047010194396765428365425300765743648635237096925610677392622781686560091683057165179831131589931921697124848897602416217843608430155547221364480826617685508648564194800354635673689911289078294493254804820538466697567423118218556284457248785425574899410475152996976109843166292454382721043870577172513951201641298720857577410600525835035211094320287969054773282792056707970037141561664682757070640013861226887095259364811313353409782511022929668988793969890131678148545067647273038940928", + "saving": "3/125000", + "strict_gap": "36587573764625418327244185355997183422382665825088250562011555715967669702618431510029712964345102482769059183503636340181243485067586994400396419676645726392172600050321301112575244389937779592497835083071732429472917457797503179544580583085662243367417106275323713322890758975720270832950054946817787035724481890775873780156613894121654003160385391994148653930951804203197279864041581428022135924854196645670192583201485779596266857970898292966542183835744566512103592095510927286567041969069937020162204069121891118521385807362210279863292991182474501530873925989534843049915698438031049528784236240148110082725061224271590075431668343165535338214739665246662622442584149576161387761951182070687176807951050303/4613924826337591235435060288525548640453538561015360359727386867424798369361500041437268944120682219793714220088288164248227533010380583764465256860129210910084911574544233473871545088582266422915671502103093105960089427619677501819270047010194396765428365425300765743648635237096925610677392622781686560091683057165179831131589931921697124848897602416217843608430155547221364480826617685508648564194800354635673689911289078294493254804820538466697567423118218556284457248785425574899410475152996976109843166292454382721043870577172513951201641298720857577410600525835035211094320287969054773282792056707970037141561664682757070640013861226887095259364811313353409782511022929668988793969890131678148545067647273038940928" + }, + "guard": { + "C0": 23525688073616890449298029824281276859872872513536000000, + "C1": "1187/625", + "E": 143575047241472693851818613452871489945728, + "dependency_constant": "1435750472414726938518186134528714905601290000/3", + "gamma": "9997/10000", + "largest_child": 38370, + "largest_small_child": 899, + "m_power_lower": 500000000, + "no_large_path_upper": "227493/6250000", + "path_moment_upper": "51180270301/51200000000", + "path_rank_budget": 39564, + "rho": "19/10", + "small_power_upper": 460, + "strict_gap": "4369699/51200000000", + "zeta": "1/10000" + }, + "inherited_commit": "f2ab41aebad47861caf6316282c1793e5513845e", + "kappa": "119723/20000000000", + "scope": "Exact arithmetic and finite basis combinatorics; producer regeneration is separate. Generic basis existence, recursive compilation and retained analytic/tape interfaces remain written proofs.", + "source_sha256": { + "certificates/endpoint-gauge-bit-axes.json": "d78a59838f1bcc782eefe2b1951d51a272cfc4c86e6f6ebe9926fd5e3ca445d9", + "certificates/endpoint-gauge-complex-input.json": "04de2cc189c6193172bbf732ea733d8f26eeaded3d956cd0bfe7a65f4324155a", + "certificates/endpoint-gauge-input.json": "dc57167d5b4fd2430d4f28933fde5fe14127c43a81901798ed86777f9408589a", + "notes/endpoint-gauge-assembly.tex": "6e305ded155b02b54c72fc154c772536fa8ea1b19cd7a8d58bedcab6bcaf961e", + "notes/endpoint-gauge-basis.tex": "2dfe641fba04bc6b3560fc24101eb2f188429a8910e450f48695352cf4faa2b8", + "notes/endpoint-gauge-complex.tex": "dfee33b0281e5551bb6927f757ff0240abade60ae1800f715afd88853ae0191e", + "notes/endpoint-gauge-construction.tex": "7dcd7a1b858877d36969fb4d10bf51d2fee2bd5ee9dfdd44329cb71f910d9659", + "notes/endpoint-gauge-note.tex": "54468fce7ad4c2773fd26969c81755d305f233976fb9629b86805f33d13c139b", + "scripts/endpoint_gauge/README.md": "044eb10845ca3c25adfda4d0abe728fd890d7f1c6ecc5da3e254073c189d08c1", + "scripts/endpoint_gauge/__init__.py": "ec74b81eb64a8167df4597a5ab94bd7a99f65acf0186bca684a74bcbec91113a", + "scripts/endpoint_gauge/bit.py": "5b2817bd1b35a42fabb636541907fcbdc394ed2ef1405099a10de9c9cf524b09", + "scripts/endpoint_gauge/complex.py": "dd0e1ff9729eadb65a18dba48fdbe824f423e025003f081f532b443b939f610a", + "scripts/endpoint_gauge/match_complex_general.cpp": "fb83c08125521128a38f5ee53f91d192904cc3372ad8f196ad9576e5f4f727da", + "scripts/endpoint_gauge_network.py": "7af181e30093d593ca58d0a133dca6862b06f2d350db1c5d745e588856258704", + "scripts/endpoint_gauge_producer.py": "484490dda84716f7077b07aa14fa510fbef2f77124c8b0b99e2adef50c232690", + "scripts/partial_swap_network.py": "acdd81b4dea2815f8838a0c3ea8ac4968f2bc13fd7c99173473d865779096782" + }, + "status": "Conditional endpoint-gauge integer-multiplication witness" +} diff --git a/docs/reproducibility.md b/docs/reproducibility.md index 9e2afffced..8f601ddd8d 100644 --- a/docs/reproducibility.md +++ b/docs/reproducibility.md @@ -2,60 +2,66 @@ Run from the repository root with Python 3.11+, a C++17 compiler, Git, and Make. No third-party Python package or network access is required for verification. -The inherited full h28 support check uses about 1.2 GB of memory. ```sh -make verify +make endpoint-gauge-verify ``` -This retains the #10 checks and additionally regenerates the selected -`(25,23,57)` scalar graphs, original carrier dependencies, positive labels, -final carrier matches and full rank histograms. The complex h28 histogram is -reconstructed from its retained producer. The new rational certificate -rebuilds the recursive width multiset, checks both moments and the precision -guard, and evaluates all 29 strict constraints and seven assembly margins. -Basis checks cover the prescribed coordinate compatibility and both A5 trees. -The remaining generic-minor and interface arguments are in the proof. +This regenerates the new binary and complex scalar producers at `(32,30,40)`, +checks their supports, frame assignments, carrier matchings and complete rank +histograms, and compares them with the selected input data. The bit construction +uses the retained ordinary paired base threshold; the complex construction uses +threshold two. These are distinct producers with distinct counts and losses. -All large intermediate graph and label files are temporary. To retain them: +The exact certificate reconstructs both recursive call lists, encloses both +characteristic moments with rational arithmetic, checks the updated precision +guard, and evaluates 29 strict constraints and seven assembly margins. Small +exact algebra checks cover alternating and signed residuals and endpoint phase +normalization. Basis checks cover coordinate prescriptions and both A5 trees; +remaining generic-minor and interface arguments are in the proof. + +`make verify` runs the new checks together with all inherited producers, tests +and historical patch checks. Unchanged inherited checks need not be repeated +when validating only this extension. + +Large intermediate graph and label files are temporary. To retain them: ```sh -python3 scripts/partial_swap_producer.py --work-dir /tmp/partial-swap-producers +python3 scripts/endpoint_gauge_producer.py --work-dir /tmp/endpoint-gauge-producers ``` -The portable producer sources are in `scripts/partial_swap/`. They adapt the -retained paired-exclusion and shared-point circuits with base threshold two, -aligned point ordering, retained totals, and dependency-preserving labels. -The selected data in `certificates/partial-swap-input.json` are compared with -regeneration; they are not accepted as the sole producer justification. +Portable sources are in `scripts/endpoint_gauge/`, with inherited helpers in +`scripts/partial_swap/` and the retained circuit modules. The selected counts +are in `certificates/endpoint-gauge-bit-axes.json` and +`certificates/endpoint-gauge-complex-input.json`. For exact arithmetic alone: ```sh -make partial-swap-certificate +make endpoint-gauge-certificate ``` -The output certificate uses exact rational numbers. Rounded decimal values in -the prose are explanatory. On a committed checkout, generated artifacts can -be checked with `git diff --exit-code -- certificates patches`. +The certificate uses exact rational numbers. Rounded prose values are +explanatory. On a committed checkout, generated artifacts can be checked with +`git diff --exit-code -- certificates patches`. ## Proof PDF ```sh -make partial-swap-note +make endpoint-gauge-note # Alternatively: -make partial-swap-note TEX_ENGINE=tectonic +make endpoint-gauge-note TEX_ENGINE=tectonic ``` -The target produces `artifacts/partial-swap-note.pdf`. The default engine is +The target produces `artifacts/endpoint-gauge-note.pdf`; the default engine is pdfLaTeX. PDF bytes can differ across TeX environments. The standalone note is -the current proof; the [combined manuscript patch](../PATCHING.md) and its -generator remain the inherited #10 result. +the current proof. The [combined manuscript patch](../PATCHING.md) remains +the inherited #10 result. ## Provenance -[SOURCES.json](../SOURCES.json) records the handoff archive hash, #10 parent, +[SOURCES.json](../SOURCES.json) records the new archive hash, parent commit, and retained source pins. The original archive and exploratory alternatives -are kept outside this submission. Existing copyright notices and the Gaussian -scaling correction are preserved. The GitHub workflow runs `make verify` and -checks certificate/patch reproducibility. +are preserved outside this submission. Copyright notices, licenses and the +Gaussian scaling correction are retained. The GitHub workflow runs the full +`make verify` target and checks certificate/patch reproducibility. diff --git a/docs/research/current-status.md b/docs/research/current-status.md index 4d48adc0bb..aa31aeb8e6 100644 --- a/docs/research/current-status.md +++ b/docs/research/current-status.md @@ -1,23 +1,23 @@ # Current result -The conditional saving is `kappa = 942293/500000000000 = 1.884586e-6`. -The [proof](../../artifacts/partial-swap-note.pdf) extends -[PR #10](https://github.com/CrocSwap/integer-mult-bounds/pull/10), pinned at -`62691e395a0458ce089a1c7b5d89e74291e95e29`. +The conditional saving is `kappa = 119723/20000000000 = 5.98615e-6`. +The [proof](../../artifacts/endpoint-gauge-note.pdf) inherits the partial-swap +construction at `f2ab41aebad47861caf6316282c1793e5513845e`, which extends +[PR #10](https://github.com/CrocSwap/integer-mult-bounds/pull/10). -Partial swaps give rank budget `Wm-2N+2L`. The selected binary triple producer -has dimensions `(25,23,57)` and compatible positive frames and carrier reuse. -Its common rational basis batches the paired boundary into widths -`25,7,25,25,32611`. The complex construction batches all internal residuals -in addition to its five macro classes. +Complementary auxiliary endpoint gauges merge the middle-stage entrance and +exit, preserving rank budget `Wm-2N+2L`. The selected bit and complex producers +both use `(32,30,40)` with separate counts. The rational controlled basis +supplies the bit profiles, while a binary quadratic-phase normal form supports +all nondegenerate complex residuals, including alternating ones. -The [certificate](../../certificates/partial-swap-network.json) records exact -moments, precision guard, finite basis combinatorics, and assembly margins. -The [producer checker](../../scripts/partial_swap_producer.py) regenerates -all selected graphs, label assignments, matchings, and internal histograms. -Generic common-basis existence and the tape/analytic interfaces are written -proof obligations, not consequences of the arithmetic checker. +The [certificate](../../certificates/endpoint-gauge-network.json) records exact +moments, the updated precision guard, finite basis combinatorics and assembly. +The [producer checker](../../scripts/endpoint_gauge_producer.py) rebuilds the +new graphs, frames, carrier matchings and internal histograms. Generic basis +existence and the tape/analytic interfaces remain written proof obligations. -The earlier [#10 proof](../../artifacts/batched-23-note.pdf) and +The earlier [partial-swap proof](../../artifacts/partial-swap-note.pdf), +[#10 proof](../../artifacts/batched-23-note.pdf) and [patch](../../patches/batched-23.patch) remain baseline references, including the Gaussian scaling correction. Older research pages describe earlier results. diff --git a/notes/endpoint-gauge-assembly.tex b/notes/endpoint-gauge-assembly.tex new file mode 100644 index 0000000000..1904cae2a6 --- /dev/null +++ b/notes/endpoint-gauge-assembly.tex @@ -0,0 +1,76 @@ +\begin{theorem}[Conditional fixed-tape multiplication bound] +Assume the pinned upstream multiplication theorem and retained analytic, +ordered-affine, compact-control, Gaussian-map, and fixed-tape interfaces +specified in the opening section. The endpoint-gauged interchange interface +and the complex layer proved here may be substituted into those +interfaces. They give +\[ + T(n)=O\!\left(n(\log n)^{1-\kappa}\right),\qquad + \boxed{\kappa=\frac{119723}{20000000000} + =5.98615\times10^{-6}}. +\] +\end{theorem} +\begin{proof} +Take the following exact parameters: +\[ +\begin{aligned} + a_b&=\frac{2993093}{250000000000},&a_c&=\frac{3}{125000},\\ + \tau&=1-a_b,&\sigma&=1-a_c,\\ + \epsilon&=\frac1{2+a_b}=\frac{250000000000}{500002993093},&c&=1,\\ + \beta&=\frac1{1000},&\delta&=\frac1{10^{16}},\\ + \lambda&=\tau+\frac1{10^{20}},&\lambda'&=\tau+\frac2{10^{20}},\\ + \zeta&=\frac1{10000},&C_1&=\frac{1187}{625}. +\end{aligned} +\] +The strict bit and complex moments were certified above. Since +$\sigma<\tau$, the internal layer exponent is $\chi=\tau$. +The complex leaf saving is +\[ + (1-\beta)a_c=\frac{2997}{125000000}=2.3976\times10^{-5}>a_b. +\] +Thus both the internal and leaf exponents are strictly below +$\lambda'$, and the displayed gaps between $\tau,\lambda,\lambda'$ +absorb fixed logarithmic factors. The precision guard has +$C_1=19/10-9\beta/10+\zeta$ and $1-\epsilon C_1>0$. +Compact control allows $c=1$; its reservation exponent is zero and +$1-\epsilon(1+c)=1-2\epsilon>0$ gives $K=o(\ell)$ with $K=d$. + +For the retained Gaussian parameters +$\alpha=\lfloor\sqrt{b/(8d)}\rfloor$ and +$\gamma_G=2d\alpha^2\le b/4$, the same positive $1-2\epsilon$ +ensures the eventual conditions $b\ge64d^2$, $\alpha^2\theta_i\ge1$, +and prime-interval growth. Use the corrected chirp input bound +$F=2^{\lceil1.14\alpha^2\rceil}$; the following section proves that +$P=34p$ still suffices. The retained target errors and final rounding +therefore apply. + +The seven assembly savings are the exact rational numbers +\[ +\begin{aligned} + g_1&=1-2\epsilon,&g_2&=\epsilon a_b,& + g_3&=\epsilon(a_b-2/10^{20}),\\ + g_4&=(1-\epsilon)a_b,&g_5&=1-\delta-2\epsilon,& + g_6&=1-\delta-\epsilon,&g_7&=\epsilon. +\end{aligned} +\] +Writing $b_0=a_b/(2+a_b)$ gives $g_1=g_2=b_0$, +$g_3=b_0-2\epsilon/10^{20}$, $g_4>b_0$, +and $g_5=b_0-\delta$. Since $\delta>2\epsilon/10^{20}$, +$g_5$ is the least of the seven. Exact rational subtraction gives +\[ + \min_i g_i-\kappa + =\frac{a_b}{2+a_b}-\frac1{10^{16}} + -\frac{119723}{20000000000} + =\frac{828463377506907}{5000029930930000000000000000}>0. +\] +All retained parameter conditions are strict with this choice; in +particular the finite arithmetic certificate evaluates the complete +29-condition interface and these seven margins with rational arithmetic. +The final positive gap absorbs remaining logarithmic factors, proving +the claimed bound in the retained model. +\end{proof} + +The count and moment data are finite arithmetic certificates for the +specified producer and common-basis construction. The theorem's use of +the pinned analytic interfaces and its fixed rational basis preparation +is separate from checking those integers and rational inequalities. diff --git a/notes/endpoint-gauge-basis.tex b/notes/endpoint-gauge-basis.tex new file mode 100644 index 0000000000..8bba0203b0 --- /dev/null +++ b/notes/endpoint-gauge-basis.tex @@ -0,0 +1,184 @@ +\subsection{The ordinary projector corner} +For a rank-$j$ projector in dimension $h$ with $j>h/2$, put $r=h-j$. +In a generic rational basis its first-$r$/last-$r$ corner is invertible: +one witness pairs these coordinates in rank-one blocks +$\frac12\left(\begin{smallmatrix}1&1\\1&1\end{smallmatrix}\right)$ +and is the identity on the middle $h-2r$ coordinates. Similarity of +rational projectors with the same rank proves that the relevant minor +is a nonzero rational function of the basis. + +Write $I-P=XY$, $YX=I_r$. The corner is $-X_LY_R$, so $X_L,Y_R$ are +invertible. Eliminating it leaves on the middle coordinates +\[ + I-X_MY_M-(-X_MY_R)(-Y_R^{-1}X_L^{-1})(-X_LY_M)=I_{h-2r}. +\] +The resulting lower-lower profile is $r$ singleton pivots and one +contiguous block of width $2j-h$. For $j\le h/2$ retain $j$ singleton +pivots; for $j=h$ use one block of width $h$. The last is still smaller +than the full tensor dimension $m$. Nonzero scalings are absorbed in +the triangular factors. This argument is also the large-projector +identity used in the controlled corners below. + +\subsection{The selected inner family} +Use physical index $i=b\alpha+\beta$, with $\beta$ fastest, and +\[ + K=T_2(I_a\otimes L_b),\quad + T_2(v\otimes e_\beta)=J_\beta v\otimes e_\beta,\quad + J_\beta=M_\beta L_a. +\] +The bases $L_a,L_b$ are free invertible rational matrices. For +$I=(0,\ldots,a-1)$ prescribe the first $2a$ row labels as +$[I,(1,\ldots,a-1,0)]$ and the last $2a$ inverse-column labels as +$[(a-1,0,\ldots,a-2),I]$. +A row label $c$ at $(\alpha,\beta)$ means +$e_\alpha^tM_\beta=e_c^t$; an inverse-column label means +$M_\beta^{-1}e_\alpha=e_c$, equivalently a prescribed column of $M_\beta$. +Their effective residues $\beta-c$ modulo $b$ are $\{0,1,3\}$ and +$\{25,27,28\}$, respectively. Within one side no coefficient coordinate +is repeated at fixed $\beta$; the two residue sets and the physical +boundary positions are disjoint. Each $M_\beta$ thus has a permutation +completion. These linear constraints define an affine space with a +nonempty irreducible invertible locus. + +The first $a$ rows and last $a$ inverse columns match the coordinate +orders of $L_a,L_a^{-1}$, giving every ordinary axis-$a$ corner. +For axis $b$, the inactive first factor is rank one and its weights +separate, giving a diagonal rescaling of $L_bBL_b^{-1}$. These facts +apply to every internal producer projector and the data residuals. + +\subsection{The A5 tree witnesses} +The inner projector $(I-P_a)\otimes(I-P_b)$ has nullity $a+b-1=61$. +After eliminating its first $b$ nullspace coordinates and rescaling +nonzero line entries, its forward restriction is the incidence matrix +on vertices $0,\ldots,b+1$ with edges +\[ +(0,b),(1,b+1);\quad (j+2,j+1)\ (0\le j\le b-3);\quad (0,b-1). +\] +It is the path on $1,\ldots,b-1,0$ with $b,b+1$ attached at the ends. +The dual restriction has edges +\[ +(b,0),(b+1,1),(b+1,2);\quad (j-2,j-1)\ (4\le j\le b+1), +\] +the path $0,b,b-1,\ldots,2,b+1,1$. +Each tree has $a-1$ edges; leaf elimination gives rank $a-1$. +Both nullspace restrictions are therefore nonsingular. The +large-projector identity gives 61 singleton pivots and one 838-block. + +\subsection{Outer matching and the A1 affine witness} +Set +\[ + S=T(I_k\otimes K),\qquad T(u\otimes e_i)=G_i u\otimes e_i. +\] +For $i=0,\ldots,k-1$ prescribe the first row of $G_i$ as row $i$ of a +free $L_k$. At the last $k$ multiplicity indices prescribe the last +inverse columns in matching $L_k^{-1}$ order. The next $a$ first rows +and preceding $a$ inverse columns remain free. The boundary intervals +of length $a+k=72$ are disjoint. Ordinary axis-$k$ corners and the +full $k$-block for unmatched stage-three roles are retained. + +The paired A1 null projector has the form +\[ + Q_1=I_k\otimes P_q+P_t\otimes P_U,\quad + \operatorname{rank}P_q=1,\quad\operatorname{rank}P_U=a,\quad P_qP_U=0. +\] +Write $q_i$ for the transformed line coordinate and $U_i$ for the +transformed $U$ row, impose $q_i\ne0$, and put $z_i=U_i/q_i$. +Absorbing $L_k$ into outer coordinates, the first $k$ nullspace rows are +$[e_p^t,t_pz_p]$, with $t_p\ne0$. The first $a$ vectors $z_p$ are +nonzero multiples of the $L_a$ coordinate basis. Row $p=a$ repeats +coefficient 1 at $\beta=2$ instead of $\beta=1$; its multiplier is +generically different. Indeed the two distinct motif lines have +coordinate ratios not identically equal in these freely chosen +$L_b$ coordinates. Thus $z_0,\ldots,z_a$ affinely span $\mathbb Q^a$. +For each extra row with free first-row functional $g_i$, eliminating +the first $k$ coordinates leaves +\[ + \sum_{p500000000^{10}$ and +$899^9<460^{10}$ give $m^\rho>500000000$ and +$899^{\rho-1}<460$. +If a path has one large child $t$, its moment is at most +\[ + (t/m)^\rho+(q-t)899^{\rho-1}/m^\rho. +\] +This expression increases over the large-child range, since its +numerator derivative is $\rho t^{\rho-1}-899^{\rho-1}>0$. +Use $t=m-b$ and the concavity bound +$(1-x)^{19/10}\le1-19x/10+9x^2/10$ to obtain +\[ + \sum_{\rm path}(r/m)^\rho + <1-\frac{19}{12800}+\frac9{10\cdot1280^2} + +\frac{1194\cdot460}{500000000} + =\frac{51180270301}{51200000000}<\gamma. +\] +Without a large macro the bound is $227493/6250000<\gamma$. + +For coefficient-depth accounting take $E_0=128(W+m+1)^3$. +There are at most $s$ positive-rank residual calls and $W$ endpoint +normalizations. Combining the quadratic phases with the $S$ factors, +each uses at most two diagonal phase passes and one scalar phase. +The inherited gate and remainder count is therefore bounded conservatively by +\[ + 36W^3+16s+16W+8m+4