diff --git a/.github/workflows/percent-exponent-architecture.yml b/.github/workflows/percent-exponent-architecture.yml
new file mode 100644
index 0000000000..b22fdbd4e0
--- /dev/null
+++ b/.github/workflows/percent-exponent-architecture.yml
@@ -0,0 +1,28 @@
+name: Percent exponent architecture screens
+
+on:
+ pull_request:
+ paths:
+ - 'research/percent-exponent-architecture/**'
+ - '.github/workflows/percent-exponent-architecture.yml'
+ push:
+ paths:
+ - 'research/percent-exponent-architecture/**'
+ - '.github/workflows/percent-exponent-architecture.yml'
+ workflow_dispatch:
+
+jobs:
+ exact-audit:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: ['3.11', '3.14']
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v5
+ with:
+ python-version: ${{ matrix.python-version }}
+ - name: Exact arithmetic and complete finite searches
+ run: python -B -S research/percent-exponent-architecture/verify.py --deep
+ - name: Verification leaves sources unchanged
+ run: git diff --exit-code
diff --git a/research/percent-exponent-architecture/NOTICE b/research/percent-exponent-architecture/NOTICE
new file mode 100644
index 0000000000..617d9e0ac5
--- /dev/null
+++ b/research/percent-exponent-architecture/NOTICE
@@ -0,0 +1,33 @@
+Architecture screens for a conditional exponent saving of 1/100
+Prepared for huxint with substantial OpenAI Codex assistance, October 2026.
+New contributions are licensed under the repository's Apache-2.0 license.
+
+The paired-cube identity, three-stage cover, shared completed-core compiler,
+coordinate-star centers and semantic assembly are inherited from icekylinx
+and the contributors credited in the repository NOTICE. Completed-core bank
+sharing includes an664's contribution. The complex checkpoint is Avi
+Eisenberg/ikeboy's PR193, with its stated Claude assistance, built on
+icekylinx, eumemic and the preceding paired-cube work. The bit checkpoint is
+Rohan Arun/rohanarun's PR187, retaining its own attribution to the preceding
+bit word, source-assisted flow and compiler contributors. These inputs are
+not claimed as new constructions here.
+
+The inequality a < D/C and an exact fixed-word ceiling are also discussed
+in DaysSky's PR192. The balanced assembly ceiling is due to romainhedouin's
+PR183 and the preceding assembly authors. This package's new scope is the
+data-only relaxation, the stated odd-cube family, the rank-minimal center
+support lemma, the common-triangular-flag obstruction, and the bounded
+Fano stub-reuse/all-permutation investigation.
+
+The Fano graph, original balanced model and baseline Python
+meet-in-the-middle implementation come from the repository's retained
+research by Douglas Colkitt and contributors, with its recorded AI
+assistance. The original network-coding seed is attributed there to Das and
+Rai, Generalized Fano and non-Fano networks (arXiv:1609.05815).
+references/SOURCE.json records the original source hashes and the exact
+dependency-binding changes to the bundled baseline. Original algorithm
+bodies and notices are retained.
+
+No priority claim is made for standard Walsh projection identities,
+triangularization facts, entropy cut arguments or meet-in-the-middle
+enumeration. No new all-size integer-multiplication theorem is claimed.
diff --git a/research/percent-exponent-architecture/PROOF.md b/research/percent-exponent-architecture/PROOF.md
new file mode 100644
index 0000000000..043bc4af5e
--- /dev/null
+++ b/research/percent-exponent-architecture/PROOF.md
@@ -0,0 +1,355 @@
+# Cost barriers for a saving of 1/100
+
+This note gives necessary conditions for specified finite interfaces. It does
+not prove a new multiplication bound. In particular, it does not rule out
+`kappa = 0.01` for a different architecture.
+
+## 1. A paid-moment inequality
+
+Let an ordinary finite supplier have ambient width `m`, stock `W`, and `n_r`
+children of width `0 < r < m`. Put
+
+```
+D = m W - sum_r n_r r,
+C = sum_r n_r r log(m/r).
+```
+
+Acceptance at a positive saving `a` requires
+
+```
+sum_r n_r r (m/r)^a < m W.
+```
+
+Since `exp(x) >= 1+x`, necessarily `a C < D`. For any retained submultiset
+of children, `C_keep <= C`, so `a < D/C_keep`. Dropping all other entropy
+costs is a favorable relaxation, not an implementation. Positive wrappers,
+fallbacks and scalar tolls cannot improve this upper bound when they leave
+this moment and its deficit budget intact.
+
+The elementary entropy bound was also used in DaysSky's PR #192. The use
+here is different: discard the entire auxiliary circuit and bound the data
+interface itself. The balanced assembly has `kappa < a/(1+a) < a` for its
+limiting ordinary supplier (cf. PR #183). We use the weaker `kappa < a` for
+the displayed ceilings. No historical factor-of-five assembly is used.
+
+## 2. The current data itineraries already exclude 0.01
+
+The pinned complex profile is PR #193, whose full commit is recorded
+in `inputs/complex-pr193.json`. The bit profile is PR #187, pinned separately
+in `inputs/bit-pr187.json`. The input files contain the complete child
+histograms and the exact source/target subhistograms, with source-file hashes.
+The checker recounts stock, rank, deficit and submultiset inclusion.
+
+In the three-block shared-core interface, `m=3h` and `D=2v-3 ell`.
+The data submultiset consists of three copies of the source and target
+itineraries and `2v` rank-two complement children. It is:
+
+| Profile | h | v | ell | Data children, width: multiplicity |
+| --- | ---: | ---: | ---: | --- |
+| Complex #193 | 22 | 1320 | 440 | 1:15840, 2:6600, 18:7920 |
+| Bit #187 | 24 | 1760 | 528 | 1:18480, 2:6160, 20:5280, 21:2640, 22:2640 |
+
+These give the following strict upper bounds on `a`, with every auxiliary
+entropy cost removed:
+
+| Profile | Retain the copied-center loss | Grant zero center loss, D <= 2v |
+| --- | ---: | ---: |
+| Complex #193 | 0.004433342 | 0.008866683 |
+| Bit #187 | 0.004893592 | 0.008897440 |
+
+At `a=0.01` the data alone require deficit greater than `2.28165 v` and
+`2.27179 v`, respectively. Both exceed even the favorable `2v` budget.
+The required deficit is computed directly from the exponential uplift, not
+by treating the first-order approximation as an equality.
+
+Thus eliminating auxiliary calls or copied-center loss while keeping these
+data calls and `D<=2v` cannot reach 0.01. This does not cover a change in
+data interfaces, cross-stage fusion, a different deficit identity, or a new
+recurrence. A finite-leaf or multitype scheme must be assessed against its
+actual recurrence; it cannot be inserted into this theorem by name alone.
+
+## 3. An odd-dimensional paired-cube extension
+
+This is a proposed algebraic family and an optimistic cost screen. We do
+not supply its complete framed side circuit, bit companion, prime compiler
+or all-size assembly.
+
+Let `d=2t+1 >= 3` and `p>=d+1`. Partition `h=2p` coordinates into pairs.
+Each port chooses one coordinate from each of `d` distinct pairs. There are
+`v=2^d binom(p,d)` ports. Define the scalar fitting matrix
+
+```
+B[T,S] = b_d(|T intersection S|),
+b_d(z) = product_(j=1..t) (z-(2j-1))/(d-(2j-1)).
+```
+
+Its diagonal is one, and every off-diagonal odd intersection is a root.
+Let `B_block` keep only pairs in the same selector cube, and put
+`K=I-B_block`, `H=B_block-B`. Then `K+H+B=I`, and both side terms are
+supported on binary-orthogonal source/target pairs.
+
+### The local K is an involution in every odd dimension
+
+On a selector cube `F2^d`, let `P` project onto Walsh characters of degree
+at most `t`. Exactly half of all characters have that degree, so the
+diagonal of `2P` is one. Complementing a character multiplies its value at
+a difference `x` by `(-1)^|x|`. At every nonzero even-weight `x`, the sum of
+all characters is zero and is twice the low-degree sum. Thus the kernel of
+`2P` vanishes there.
+
+Its radial kernel is a polynomial of degree at most `t` in intersection
+size. The `t` prescribed roots and its diagonal value identify it uniquely
+as `b_d`. Consequently `B_block=2P` and `(I-B_block)^2=I`. Its nonzero
+off-diagonal entries join opposite selector parities. Its entries are
+dyadic by the Walsh formula, irrespective of how the product polynomial is
+written.
+
+Each parity class of addresses spans a binary `d`-space: the pair-difference
+vectors with even selector parity have dimension `d-1`, and adding one
+odd-norm port adds one dimension. The opposite class is orthogonal to it.
+The original-source mixing argument therefore has candidate source chain
+`[d-1,h-d-1,1]`. A retained lexicographic target flag has chain
+`[h-d-1,1,...,1]` with `d` ones. These are compatible endpoint ingredients,
+not a complete global word.
+
+### Copied t-star center budget
+
+The polynomial `b_d(z)` has degree `t`. Write
+`b_d(z)=sum_j b_j binom(z,j)`. For a transversal coordinate t-subset `U`,
+use the star `Z_U=sum_(S containing U) x_S`. The identity
+
+```
+sum_(U subset S, |U|=t) binom(|U intersection T|,j)
+ = binom(|S intersection T|,j) binom(d-j,t-j)
+```
+
+expresses the whole center matrix through these stars, using scatter
+coefficient `sum_j b_j binom(|U intersection T|,j)/binom(d-j,t-j)`.
+There are `2^t binom(p,t)` such stars.
+
+The span of the ports in a fixed star has dimension `h-2t`. The fixed
+partner coordinates vanish; the fixed selected coordinates have one common
+coefficient. Differences of outside ports generate the even-parity space
+on the other `2(p-t)` coordinates: flips generate each pair difference, and
+exchanging selected pairs generates all even pair occupancies. The strict
+inequality `p>d` ensures those exchanges exist. One star port supplies the
+remaining dimension. Thus the copied-star interface has
+
+```
+ell = 2^t binom(p,t) (h-2t),
+D <= 2v-3 ell, m=3h=6p.
+```
+
+The inequality is a hypothesis inherited from this copied-center shared
+compiler, allowing additional nonmonotone losses. A construction that
+changes this center budget is outside the screen.
+
+### A ceiling even with redesigned local data chains
+
+Put `f(r)=r log(3h/r)`, with `f(0)=0`. It is increasing on `[0,h]`.
+A data chain whose endpoints have distance `h-1` has total jump rank at
+least `h-1`. If one jump is at least `h-1`, its entropy is already at least
+`f(h-1)`. Otherwise concavity gives
+`f(r) >= r f(h-1)/(h-1)` for every jump, and summing proves the same bound.
+This permits nonmonotone chains, provided every local jump is at most `h`.
+
+Six source/target chains per port and the two complement children therefore
+give the circuit-independent floor
+
+```
+C_data/v >= 6(h-1) log(3h/(h-1)) + 4 log(3h/2).
+```
+
+Together with `D<=2v-3 ell`, every supplier in this stated family satisfies
+
+```
+a < 0.008094.
+```
+
+The largest relaxed bound in the finite part occurs at `(p,d)=(13,5)` and
+is less than `0.008093706`. Keeping the specific destructive-source and
+lexicographic target chains instead gives `a<0.005164`, with the largest
+relaxation at `(p,d)=(14,5)`.
+
+This is an infinite-family screen, not just a finite parameter scan. For
+`p>=30`, `D/v<=2`, and the data lower bound is strictly greater than
+`(12p-2) log 3`. The resulting ceiling
+`2/((12p-2) log 3)` decreases with p and is already below both finite maxima
+at p=30. The checker exhausts all odd `3<=d
=5`, `h=2p`. Let `A` be
+the port-by-coordinate incidence matrix. A nonzero row in its coordinate
+star span has values
+
+```
+f(S) = sum_(i in S) c_i.
+```
+
+For every such characteristic-zero coefficient vector, the binary span of
+the ports where `f(S)` is nonzero has dimension at least `h-2`.
+
+First suppose the coefficients differ within one coordinate pair i. For
+each outside two-coordinate edge from distinct pairs, at least one of its
+two extensions by pair i has nonzero f: their values differ by a fixed
+nonzero coefficient difference. The projections of these supported ports
+onto the outside coordinates therefore contain all edges of the connected
+complete multipartite graph on the other p-1 coordinate pairs. Its binary
+edge span has dimension `h-3`. Lift the three edges of an outside triangle
+using supported ports. Their outside coordinates sum to zero, while their
+pair-i coordinates have odd total parity and do not vanish. The projection
+kernel has dimension at least one, proving the `h-2` bound.
+
+Otherwise both coefficients in pair i have one value a_i. A coarse triple
+is active when its three a-values sum to a nonzero value; then all its eight
+selectors belong to the support. If one pair i is never active, equations
+`a_i+a_j+a_k=0` for all other j,k force all outside a_j to be one value b
+and `a_i=-2b`. Nonzero f implies b is nonzero. The support is exactly every
+triple avoiding pair i. Since p-1>=4, these ports span all `h-2` outside
+coordinates over F2.
+
+If every pair is active, the support contains all p pair-difference
+directions. If all a_i agree, the whole port family is supported. Otherwise
+choose a_i different from a_j. For each pair k,l outside i,j, at least one
+of the coarse triples `{i,k,l}`, `{j,k,l}` is active. Projecting their
+coarse incidence vectors outside i,j gives all edges on p-2 vertices,
+whose span has dimension p-3. A triangle of such edges lifts to a nonzero
+kernel vector on i,j, giving coarse span at least p-2. Quotienting the
+full coordinate support by the p pair-difference directions thus proves
+dimension at least `p+(p-2)=h-2`.
+
+Now A has rational rank h. Indeed, a coefficient relation zero on every
+port first forces equality within every pair by selector flips, and then
+forces all pair coefficients equal by comparing triples; three times that
+common coefficient is zero. Also
+
+```
+B = (AA^T-J)/2 = A (I-J_h/9) A^T / 2.
+```
+
+The middle matrix is invertible because the even integer h is not 9.
+Hence B has rank h and its row space is exactly the coordinate-star span.
+In any factorization `B=UV` through exactly h scalar centers, V has h
+independent nonzero rows in that same span. The support lemma charges
+at least `h-2` copied-center dimensions per row:
+
+```
+ell >= h(h-2).
+```
+
+The coordinate stars attain equality. Thus merely rotating, mixing or
+rescaling a rank-minimal center basis cannot reduce the selected triple
+construction's center loss. For the selected p=11 this lower bound is 440.
+
+The qualifier **rank-minimal** matters. An overcomplete factor may use
+rows outside the star row space whose contributions cancel after scatter;
+this proof does not bound such a factor. Sharing the center computation
+across stages or replacing copied centers also changes the hypotheses.
+At p=4 the support lemma itself fails: a linear form supported on the one
+cube avoiding a specified pair has binary support rank 4, below h-2=6.
+That is an explicit domain control, not omitted from the checker.
+
+## 5. A common triangular frame flag precludes any bit rank deficit
+
+Consider the general finite bit contract: every role has an arbitrary
+independent input, the completed scalar circuit is a permutation `rho`, all
+incidences of a gate share one rational matrix, and
+
+```
+M_out(rho(w)) - M_in(w) = I_m.
+```
+
+If all source, gate and sink matrices are simultaneously upper triangular
+over one characteristic-zero extension field, then **s >= Wm**. The matrices
+need not commute, be projections, or be diagonalizable.
+
+To prove this, conjugate them by the common basis; rational matrix ranks do
+not change on extending the field. For one diagonal coordinate j, partition
+all vertices by their j-th diagonal entry `lambda`. Regard all gates with
+the same entry as a single processor and allow it free internal computation.
+Its known inputs are exactly the source roles labeled lambda. Every output
+at this processor demands an independent original input labeled lambda-1,
+by the endpoint equation, so none of those requested inputs is initially
+known there.
+
+Each incoming edge from a different label carries one scalar. The rank of
+the requested outside-input transfer, or equivalently its entropy for
+uniform independent bits, forces at least one such incoming edge per output
+at that processor. Summing over processors gives at least W edges whose
+j-th diagonal entries change. This argument permits arbitrary communication
+between gates with the same label, so that relaxation can only strengthen
+the exclusion.
+
+An upper triangular matrix has rank at least its number of nonzero diagonal
+entries: take the principal minor on those entries. Therefore
+
+```
+s = sum_edges rank(M_head-M_tail)
+ >= sum_j number_of_edges_with_changed_diagonal_j
+ >= Wm.
+```
+
+In particular, pairwise commuting frames are excluded: a finite commuting
+family over an algebraically closed characteristic-zero field is
+simultaneously triangularizable, by a common eigenvector and induction on
+the quotient. A rational common eigenbasis is not required.
+
+`triangular_obstruction.py` checks a supplied exact rational common basis,
+or pairwise commutation. Failing either sufficient check does not establish
+a deficit. This theorem concerns the rational-matrix **bit shear** contract;
+it is not a theorem about all binary Lagrangian/Clifford frame families.
+
+## 6. Locally reused Fano networks
+
+The graph and balanced 10-role, 14-vertex model come from the retained
+`scripts/experiments/fano_completion.py` and `balanced_fano.py`, with their
+original attribution. Earlier work excluded the unmodified balanced model
+with the three Fano demands fixed. Here an auxiliary output stub may be
+connected to a later auxiliary input stub. Each stub is used at most once.
+Chronology prevents cycles; no additional decoding circuit is appended.
+
+There are exactly 87 such choices, including the unchanged graph. Inputs
+and outputs after each splice are checked to remain partitions of the
+physical roles. Every remaining input is independent. Sixteen choices
+preserve the original three-demand routing obstruction. On each of these,
+the independent standard-library meet-in-the-middle replay excludes all
+`6^14` choices of local `GL(2,F2)` matrices, with the other outputs free.
+
+The broader C++ check drops even those three terminal obligations. For every
+one of the 87 topologies it enumerates **all** completed scalar permutations
+and all port-routing permutations. The sets are equal. Hence none of these
+scalar completions admits a rational rank deficit in any dimension, by the
+retained routing theorem. Keeping only one prefix per key would be
+insufficient for this claim; the implementation retains every prefix and
+checks every matching suffix/prefix pair.
+
+Each half has `6^7=279936` assignments. A complete product is a permutation
+exactly when the columns of the prefix and inverse suffix agree as
+multisets. Both local direction choices and all auxiliary permutations are
+included. Routing independently enumerates straight/cross choices at the
+14 vertices. Small controls compare this algorithm with direct enumeration
+of every complete local word.
+
+Vector blocks are separate solver experiments. A `sat` result would need an
+independent all-column replay, routing analysis and rational-frame witness.
+An `unsat` solver report is not upgraded here to a separately checked
+impossibility proof; `unknown` and timeout remain unresolved. No vector
+experiment is used in the exact ceilings above.
+
+## Arithmetic and limits
+
+Logarithms use binary range reduction and
+`log x=2 sum_(j>=0) z^(2j+1)/(2j+1)`, `z=(x-1)/(x+1)`, with an explicit
+geometric tail. Lower bounds are rounded down on a `10^-24` rational grid.
+The exponential uplift uses a finite sum of positive Taylor terms. All
+upper ceilings divide by a lower entropy bound, so rounding is favorable
+to the hypothetical candidate. No floating-point value is an acceptance
+criterion.
+
+Finite arithmetic and bounded exhaustive search do not formalize the whole
+multiplication theorem. The inherited analytic, all-size, weighted compiler,
+row restoration, precision and fixed-tape contracts remain separate. The
+results above identify assumptions a successful new architecture must change;
+they do not assert that any suggested replacement will succeed.
diff --git a/research/percent-exponent-architecture/README.md b/research/percent-exponent-architecture/README.md
new file mode 100644
index 0000000000..0ede0b55bc
--- /dev/null
+++ b/research/percent-exponent-architecture/README.md
@@ -0,0 +1,95 @@
+# Architecture screens for kappa = 0.01
+
+This package identifies structural costs that exclude a saving of 0.01 in
+specified continuations of the current construction, and tests a different
+small-network route. **It establishes no new multiplication exponent.**
+
+The target is the saving in `n (log n)^(1-kappa)`, not a measured runtime
+improvement. All inherited all-size and analytic assumptions remain in place.
+
+## Checked results
+
+| Scope | Result |
+| --- | --- |
+| Keep PR193's complex data calls; grant every auxiliary call and all center loss for free | `a < 0.008866683` |
+| Keep PR187's bit data calls under the same relaxation | `a < 0.008897440` |
+| Proposed odd-dimensional paired cubes, copied t-star centers and the retained data flags | `a < 0.005164`, all odd dimensions in the stated domain |
+| Same odd-cube family, allowing arbitrary local data chains of the required endpoint distance | `a < 0.008094` |
+| Paired triples, p>=5, exactly h independent copied centers | Center loss is at least `h(h-2)`; the current stars attain it |
+| General finite bit contract with a common triangular frame flag | `s >= Wm`; no rank deficit |
+| All 87 chronological balanced-Fano stub reuses, all local GL(2,F2) gates, any full output permutation | Every completed scalar permutation is routable; no rational-frame deficit in any dimension |
+
+Here `a` is an ordinary supplier saving; the retained assembly has `kappa=5 时,使用最少的 h 个复制中心,损耗至少为 h(h-2)。现有坐标星已达到这个值。增加中心数量、使用额外行之间的抵消,或跨阶段共享中心,仍不在这个结论的范围内。
+- 检查了 87 种 Fano 网络的辅助输入/输出连接方式,并枚举所有局部可逆二进制运算和最终置换。所有完成的置换都有路由证书对应,因此这批网络不能产生所需的有理矩阵秩节省。
+- 多比特边的后续搜索在 k=2、3、4 时也没有找到候选;这些是求解器记录,未当作独立证明或更大 k 的不可能性结论。
+
+下一种构造必须改变已经触及的假设,例如复制中心的实现、跨阶段数据接口或端口几何。仅重新选择 h 个中心的线性组合,或继续替换同类局部模块,不能完成这次目标。
+
+一个具体的小网络门槛是:三维、最多 30 个独立输入角色、至少一个单位的秩节省。这在原始均匀 bit 递归中足以超过 1/99,但目前没有构造出满足完整端点条件的网络,还需要足够强的 complex 侧与完整装配。
+
+复现:
+
+```sh
+python3 -B -S research/percent-exponent-architecture/verify.py --deep
+```
+
+完整证明见 [PROOF.md](PROOF.md)。所有界限都针对其中明确列出的接口;它们不排除其他架构达到 10^-2。
diff --git a/research/percent-exponent-architecture/audit.py b/research/percent-exponent-architecture/audit.py
new file mode 100644
index 0000000000..9bf9d81573
--- /dev/null
+++ b/research/percent-exponent-architecture/audit.py
@@ -0,0 +1,296 @@
+#!/usr/bin/env python3
+"""Exact necessary-cost screens for a conditional exponent saving of 1/100.
+
+These are upper bounds for explicitly specified interfaces, not achieved
+suppliers or a lower bound for integer multiplication. Standard library only.
+Prepared for huxint with OpenAI Codex assistance. Apache-2.0.
+"""
+from __future__ import annotations
+
+import argparse
+from collections import Counter
+from fractions import Fraction as Q
+from functools import lru_cache
+from hashlib import sha256
+from itertools import combinations, product
+import json
+from math import comb
+from pathlib import Path
+import sys
+
+HERE = Path(__file__).resolve().parent
+GRID = 10**24
+TARGET = Q(1, 100)
+
+
+def need(condition, message):
+ if not condition:
+ raise ValueError(message)
+
+
+def down(x):
+ return Q(x.numerator * GRID // x.denominator, GRID)
+
+
+def atanh_log(x, terms=40):
+ """Rational enclosure, with an explicit geometric tail, for 1<=x<=2."""
+ need(Q(1) <= x <= Q(2), "Log series outside its range")
+ z = (x - 1) / (x + 1)
+ power = z
+ total = Q(0)
+ for j in range(terms):
+ total += 2 * power / (2 * j + 1)
+ power *= z * z
+ tail = 2 * power / ((2 * terms + 1) * (1 - z * z))
+ return total, total + tail
+
+
+@lru_cache(None)
+def log_interval(x):
+ x = Q(x)
+ need(x >= 1, "Only positive-rank child ratios at least one are supported")
+ power = 0
+ while x >= 2:
+ x /= 2
+ power += 1
+ lo2, hi2 = atanh_log(Q(2))
+ lo, hi = atanh_log(x)
+ lo += power * lo2
+ hi += power * hi2
+ return down(lo), Q(-((-hi.numerator * GRID) // hi.denominator), GRID)
+
+
+def cost_floor(m, histogram):
+ need(all(0 < int(r) < m and int(n) > 0 for r, n in histogram.items()),
+ "Data children must have positive multiplicities and widths below m")
+ return sum((Q(int(n) * int(r)) * log_interval(Q(m, int(r)))[0]
+ for r, n in histogram.items()), Q(0))
+
+
+def uplift_floor(m, histogram, saving):
+ """Lower bound on sum n*r*((m/r)^saving-1), using 12 positive terms."""
+ result = Q(0)
+ for r, n in histogram.items():
+ x = saving * log_interval(Q(m, int(r)))[0]
+ term = Q(1)
+ uplift = Q(0)
+ for j in range(1, 13):
+ term = term * x / j
+ uplift += term
+ result += int(n) * int(r) * uplift
+ return down(result)
+
+
+def data_histogram(source, target, v):
+ result = Counter()
+ for hist in (source, target):
+ for r, n in hist.items():
+ if int(r) and int(n):
+ result[int(r)] += 3 * int(n)
+ result[2] += 2 * v
+ return result
+
+
+def checkpoint(name):
+ x = json.loads((HERE / "inputs" / (name + ".json")).read_text())
+ p = x["profile"]
+ m, h, v = p["m"], p["h"], p["v"]
+ delta, loss = p["deficit"], p["loss"]
+ children = {int(r): n for r, n in p["child_histogram"].items() if int(r)}
+ need(m == 3 * h, "Pinned three-block architecture")
+ need(delta == 2 * v - 3 * loss, "Pinned deficit identity")
+ need(sum(r * n for r, n in children.items()) == p["rank"], "Full rank recount")
+ need(m * p["W"] - p["rank"] == delta, "Full stock/deficit recount")
+ for key in ("source_data_histogram", "target_data_histogram"):
+ need(sum(int(r) * n for r, n in p[key].items()) == v * (h - 1),
+ "Complete local data itinerary")
+ data = data_histogram(p["source_data_histogram"], p["target_data_histogram"], v)
+ need(all(children.get(r, 0) >= n for r, n in data.items()), "Data is an actual submultiset")
+ lower = cost_floor(m, data)
+ full_cost = cost_floor(m, children)
+ paid_at_target = uplift_floor(m, data, TARGET)
+ # kappa < a/(1+a) for the retained balanced assembly, so this slightly
+ # stronger saving is necessary even with its strict backoffs removed.
+ assembly_required_saving = TARGET / (1 - TARGET)
+ paid_at_assembly_target = uplift_floor(m, data, assembly_required_saving)
+ need(Q(2 * v) / lower < Q(9, 1000), "Even free centers stay below 0.009")
+ need(paid_at_target > 2 * v, "The fixed data alone rejects a=0.01")
+ return {
+ "name": name, "provenance": x["provenance"], "h": h, "m": m, "v": v,
+ "retained_loss": loss, "retained_deficit": delta,
+ "data_histogram": dict(sorted(data.items())),
+ "data_entropy_floor": str(lower), "data_entropy_floor_per_port": str(lower / v),
+ "full_entropy_floor": str(full_cost),
+ "retained_loss_a_ceiling": str(Q(delta) / lower),
+ "free_center_a_ceiling": str(Q(2 * v) / lower),
+ "fixed_data_required_deficit_at_a_001_lower": str(paid_at_target),
+ "fixed_data_required_deficit_per_port_at_a_001_lower": str(paid_at_target / v),
+ "assembly_required_saving": str(assembly_required_saving),
+ "fixed_data_required_deficit_at_assembly_target_lower": str(paid_at_assembly_target),
+ "available_deficit_even_with_free_centers": 2 * v,
+ "scope": "The pinned data itinerary and deficit identity; all auxiliary entropy is discarded. Free-center relaxation assumes only D<=2v.",
+ }
+
+
+def odd_cube_ledger(p, degree):
+ need(degree >= 3 and degree % 2 == 1 and p >= degree + 1, "Odd-cube family domain")
+ t = (degree - 1) // 2
+ h, m = 2 * p, 6 * p
+ v = 2**degree * comb(p, degree)
+ loss = 2**t * comb(p, t) * (h - 2 * t)
+ delta = 2 * v - 3 * loss
+ # Histograms normalized per port. Repeated widths must accumulate.
+ source = Counter([degree - 1, h - degree - 1, 1])
+ target = Counter([h - degree - 1] + [1] * degree)
+ data = data_histogram(source, target, 1)
+ need(sum(r * n for r, n in data.items()) == 6 * (h - 1) + 4, "Data rank identity")
+ need(max(data) < h, "All data child logarithms exceed log(3)")
+ lower = cost_floor(m, data)
+ relaxed = cost_floor(m, {h - 1: 6, 2: 2})
+ return {"p": p, "degree": degree, "h": h, "m": m, "v": v,
+ "loss": loss, "deficit": delta, "data_histogram_per_port": dict(sorted(data.items())),
+ "data_entropy_floor_per_port": str(lower),
+ "a_ceiling": str(Q(delta, v) / lower) if delta > 0 else None,
+ "arbitrary_local_chains_entropy_floor_per_port": str(relaxed),
+ "arbitrary_local_chains_a_ceiling": str(Q(delta, v) / relaxed) if delta > 0 else None}
+
+
+def binary_rank(vectors):
+ pivots = {}
+ for x in vectors:
+ while x:
+ bit = x.bit_length() - 1
+ if bit in pivots:
+ x ^= pivots[bit]
+ else:
+ pivots[bit] = x
+ break
+ return len(pivots)
+
+
+def b_value(intersection, degree):
+ result = Q(1)
+ for j in range(1, (degree - 1) // 2 + 1):
+ result *= Q(intersection - (2 * j - 1), degree - (2 * j - 1))
+ return result
+
+
+def local_identity(degree):
+ """Independent integer checks of the cube kernel, not a global circuit."""
+ size = 1 << degree
+ denominator = size // 2
+ first = []
+ for mask in range(size):
+ value = b_value(degree - mask.bit_count(), degree) * denominator
+ need(value.denominator == 1, "Local kernel is dyadic")
+ first.append(int(value))
+ eigenvalues = []
+ for character in range(size):
+ eig = sum((-1 if (character & x).bit_count() % 2 else 1) * first[x]
+ for x in range(size))
+ expected = 2 * denominator if character.bit_count() <= (degree - 1) // 2 else 0
+ need(eig == expected, "Walsh projector identity")
+ eigenvalues.append(eig)
+ k = [-b for b in first]
+ k[0] += denominator
+ for shift in range(size):
+ need(sum(k[x] * k[x ^ shift] for x in range(size)) ==
+ (denominator**2 if shift == 0 else 0), "Exact K squared")
+ need(not k[shift] or shift.bit_count() % 2 == 1, "K only joins opposite parities")
+ addresses = [sum(1 << (2 * j + ((mask >> j) & 1)) for j in range(degree))
+ for mask in range(size)]
+ parity_classes = [[addresses[x] for x in range(size) if x.bit_count() % 2 == p]
+ for p in (0, 1)]
+ need(all(binary_rank(xs) == degree for xs in parity_classes), "Parity source frame")
+ need(all((a & b).bit_count() % 2 == 0 for a in parity_classes[0] for b in parity_classes[1]),
+ "Source/target orthogonality")
+ return {"degree": degree, "ports_per_cube": size, "B_rank": size // 2,
+ "K_squared_identity": True, "opposite_parity_source_rank": degree,
+ "denominator": denominator, "kernel_numerators": first}
+
+
+def star_check(p, degree):
+ t = (degree - 1) // 2
+ fixed = tuple(2 * i for i in range(t))
+ vectors = []
+ for pairs in combinations(range(t, p), degree - t):
+ for bits in product((0, 1), repeat=degree - t):
+ vectors.append(sum(1 << i for i in fixed) +
+ sum(1 << (2 * i + b) for i, b in zip(pairs, bits)))
+ observed = binary_rank(vectors)
+ need(observed == 2 * p - 2 * t, "Copied t-star span")
+ return {"p": p, "degree": degree, "fixed_coordinates": list(fixed),
+ "source_count": len(vectors), "rank": observed}
+
+
+def family_screen():
+ rows = [odd_cube_ledger(p, d) for p in range(4, 30) for d in range(3, p, 2)]
+ positive = [r for r in rows if r["a_ceiling"] is not None]
+ best = max(positive, key=lambda r: Q(r["a_ceiling"]))
+ best_relaxed = max(positive, key=lambda r: Q(r["arbitrary_local_chains_a_ceiling"]))
+ claimed_ceiling = Q(5164, 10**6)
+ relaxed_ceiling = Q(8094, 10**6)
+ need(Q(best["a_ceiling"]) < claimed_ceiling, "Finite family ceiling")
+ need(Q(best_relaxed["arbitrary_local_chains_a_ceiling"]) < relaxed_ceiling,
+ "Arbitrary local data chain ceiling")
+ # For p>=30, D/v<=2 and each r (12p-2)*ln(3). This bound decreases with p.
+ tail = Q(2) / ((12 * 30 - 2) * log_interval(Q(3))[0])
+ need(tail < Q(best["a_ceiling"]), "Infinite tail below finite maximum")
+ return {"finite_cases": len(rows), "positive_deficit_cases": len(positive),
+ "finite_scan_sha256": sha256(json.dumps(rows, sort_keys=True).encode()).hexdigest(),
+ "best_optimistic_case": best,
+ "best_arbitrary_local_chains_case": best_relaxed,
+ "tail_from_p": 30, "all_degrees_tail_a_ceiling": str(tail),
+ "strict_global_a_ceiling": str(claimed_ceiling),
+ "strict_arbitrary_local_chains_a_ceiling": str(relaxed_ceiling),
+ "scope": "Odd d>=3, p>=d+1; copied t-star centers and m=6p. The 0.005164 bound keeps the destructive-parity source/target flag. The 0.008094 bound permits any local source/target chains of endpoint distance h-1 with each jump at most h. Both discard all auxiliary entropy. No global side circuit is claimed.",
+ "local_identity_checks": [local_identity(d) for d in (3, 5, 7)],
+ "star_span_checks": [star_check(p, d) for p, d in ((4, 3), (7, 3), (6, 5), (9, 5), (8, 7))]}
+
+
+def small_network_budget():
+ result = []
+ log3_lo, log3_hi = log_interval(Q(3))
+ for stock in (30, 31):
+ lo, hi = log_interval(Q(3 * stock, 3 * stock - 1))
+ lower, upper = lo / log3_hi, hi / log3_lo
+ if stock == 30:
+ need(lower > Q(1, 99), "Thirty-role one-deficit budget")
+ else:
+ need(upper < Q(1, 99), "Thirty-one-role adverse budget control")
+ result.append({"m": 3, "W": stock, "rank_deficit": 1,
+ "uniform_bit_saving_lower": str(lower),
+ "uniform_bit_saving_upper": str(upper),
+ "exceeds_assembly_requirement": stock == 30})
+ return {"necessary_ordinary_saving_for_kappa_001": "1/99", "cases": result,
+ "scope": "Conditional search budget for the raw uniform bit recurrence, assuming a complete all-role rational-frame certificate exists. No such circuit or complex companion is supplied."}
+
+
+def certificate():
+ need(not sys.flags.optimize, "Run the exact audit without -O")
+ return {"status": "SCOPED ARCHITECTURE CEILINGS; NO NEW KAPPA", "target_kappa": str(TARGET),
+ "checkpoints": [checkpoint("complex-pr193"), checkpoint("bit-pr187")],
+ "odd_cube_extension": family_screen(),
+ "small_network_target": small_network_budget()}
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--write", action="store_true")
+ args = parser.parse_args()
+ result = certificate()
+ output = json.dumps(result, sort_keys=True, indent=2) + "\n"
+ frozen = HERE / "ceiling-certificate.json"
+ if args.write:
+ frozen.write_text(output)
+ else:
+ need(frozen.read_text() == output, "Exact ceiling certificate changed")
+ for row in result["checkpoints"]:
+ print(f"PASS {row['name']}: even free centers a < {float(Q(row['free_center_a_ceiling'])):.12f}")
+ print("PASS the specified odd-cube family: a < 0.005164; target 0.01 excluded within this family")
+ print("PASS even arbitrary local data chains: a < 0.008094 with the same copied centers and three-block architecture")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/research/percent-exponent-architecture/ceiling-certificate.json b/research/percent-exponent-architecture/ceiling-certificate.json
new file mode 100644
index 0000000000..43ceb51bf8
--- /dev/null
+++ b/research/percent-exponent-architecture/ceiling-certificate.json
@@ -0,0 +1,389 @@
+{
+ "checkpoints": [
+ {
+ "assembly_required_saving": "1/99",
+ "available_deficit_even_with_free_centers": 2640,
+ "data_entropy_floor": "465224708035415792023453377/1562500000000000000000",
+ "data_entropy_floor_per_port": "14097718425315630061316769/62500000000000000000000",
+ "data_histogram": {
+ "1": 15840,
+ "2": 6600,
+ "18": 7920
+ },
+ "fixed_data_required_deficit_at_a_001_lower": "150589276786738347498830173/50000000000000000000000",
+ "fixed_data_required_deficit_at_assembly_target_lower": "304256163045466013973486521/100000000000000000000000",
+ "fixed_data_required_deficit_per_port_at_a_001_lower": "150589276786738347498830173/66000000000000000000000000",
+ "free_center_a_ceiling": "125000000000000000000000/14097718425315630061316769",
+ "full_entropy_floor": "1881413992825956214088711446887/1000000000000000000000000",
+ "h": 22,
+ "m": 66,
+ "name": "complex-pr193",
+ "provenance": {
+ "commit": "187e1010ac8b259af8e9b5166f68b64bc27b4b47",
+ "path": "research/source-assisted-v4/certificate.json",
+ "pr": 193,
+ "source_file_sha256": "d84406d2fcc6990deba2b135509e6d86600e57123d88f9b21f7b7240e1aeb513"
+ },
+ "retained_deficit": 1320,
+ "retained_loss": 440,
+ "retained_loss_a_ceiling": "62500000000000000000000/14097718425315630061316769",
+ "scope": "The pinned data itinerary and deficit identity; all auxiliary entropy is discarded. Free-center relaxation assumes only D<=2v.",
+ "v": 1320
+ },
+ {
+ "assembly_required_saving": "1/99",
+ "available_deficit_even_with_free_centers": 3520,
+ "data_entropy_floor": "618155352303523457063780689/1562500000000000000000",
+ "data_entropy_floor_per_port": "56195941118502132460343699/250000000000000000000000",
+ "data_histogram": {
+ "1": 18480,
+ "2": 6160,
+ "20": 5280,
+ "21": 2640,
+ "22": 2640
+ },
+ "fixed_data_required_deficit_at_a_001_lower": "3998367945767103076034623033/1000000000000000000000000",
+ "fixed_data_required_deficit_at_assembly_target_lower": "4039190059375994870834134397/1000000000000000000000000",
+ "fixed_data_required_deficit_per_port_at_a_001_lower": "3998367945767103076034623033/1760000000000000000000000000",
+ "free_center_a_ceiling": "500000000000000000000000/56195941118502132460343699",
+ "full_entropy_floor": "1441589852828214420824154291527/500000000000000000000000",
+ "h": 24,
+ "m": 72,
+ "name": "bit-pr187",
+ "provenance": {
+ "commit": "201737a1ec4f936e166e2481fb9e88104cb2ccc7",
+ "path": "research/source-assisted-bit-bootstrap/emitted-physical.json",
+ "pr": 187,
+ "source_file_sha256": "5f1f1d978937b816a14b07fee5ac8fc31f3a9aaf05046a477e8be57bb6d07ce6"
+ },
+ "retained_deficit": 1936,
+ "retained_loss": 528,
+ "retained_loss_a_ceiling": "25000000000000000000000/5108721919863830223667609",
+ "scope": "The pinned data itinerary and deficit identity; all auxiliary entropy is discarded. Free-center relaxation assumes only D<=2v.",
+ "v": 1760
+ }
+ ],
+ "odd_cube_extension": {
+ "all_degrees_tail_a_ceiling": "200000000000000000000000/39330319934318326951949771",
+ "best_arbitrary_local_chains_case": {
+ "a_ceiling": "3750000000000000000000/730092913570099349003623",
+ "arbitrary_local_chains_a_ceiling": "375000000000000000000000/46332299214431808464865457",
+ "arbitrary_local_chains_entropy_floor_per_port": "46332299214431808464865457/250000000000000000000000",
+ "data_entropy_floor_per_port": "730092913570099349003623/2500000000000000000000",
+ "data_histogram_per_port": {
+ "1": 18,
+ "2": 2,
+ "4": 3,
+ "20": 6
+ },
+ "deficit": 61776,
+ "degree": 5,
+ "h": 26,
+ "loss": 6864,
+ "m": 78,
+ "p": 13,
+ "v": 41184
+ },
+ "best_optimistic_case": {
+ "a_ceiling": "2187500000000000000000000/423623562599894110881194009",
+ "arbitrary_local_chains_a_ceiling": "4375000000000000000000000/546747925880884664447120863",
+ "arbitrary_local_chains_entropy_floor_per_port": "49704356898262242222465533/250000000000000000000000",
+ "data_entropy_floor_per_port": "38511232963626737352835819/125000000000000000000000",
+ "data_histogram_per_port": {
+ "1": 18,
+ "2": 2,
+ "4": 3,
+ "22": 6
+ },
+ "deficit": 101920,
+ "degree": 5,
+ "h": 28,
+ "loss": 8736,
+ "m": 84,
+ "p": 14,
+ "v": 64064
+ },
+ "finite_cases": 182,
+ "finite_scan_sha256": "cebf8348bf5dc03f528e809648ed3062340b1d7aaf7b47924e157659f0e374ac",
+ "local_identity_checks": [
+ {
+ "B_rank": 4,
+ "K_squared_identity": true,
+ "degree": 3,
+ "denominator": 4,
+ "kernel_numerators": [
+ 4,
+ 2,
+ 2,
+ 0,
+ 2,
+ 0,
+ 0,
+ -2
+ ],
+ "opposite_parity_source_rank": 3,
+ "ports_per_cube": 8
+ },
+ {
+ "B_rank": 16,
+ "K_squared_identity": true,
+ "degree": 5,
+ "denominator": 16,
+ "kernel_numerators": [
+ 16,
+ 6,
+ 6,
+ 0,
+ 6,
+ 0,
+ 0,
+ -2,
+ 6,
+ 0,
+ 0,
+ -2,
+ 0,
+ -2,
+ -2,
+ 0,
+ 6,
+ 0,
+ 0,
+ -2,
+ 0,
+ -2,
+ -2,
+ 0,
+ 0,
+ -2,
+ -2,
+ 0,
+ -2,
+ 0,
+ 0,
+ 6
+ ],
+ "opposite_parity_source_rank": 5,
+ "ports_per_cube": 32
+ },
+ {
+ "B_rank": 64,
+ "K_squared_identity": true,
+ "degree": 7,
+ "denominator": 64,
+ "kernel_numerators": [
+ 64,
+ 20,
+ 20,
+ 0,
+ 20,
+ 0,
+ 0,
+ -4,
+ 20,
+ 0,
+ 0,
+ -4,
+ 0,
+ -4,
+ -4,
+ 0,
+ 20,
+ 0,
+ 0,
+ -4,
+ 0,
+ -4,
+ -4,
+ 0,
+ 0,
+ -4,
+ -4,
+ 0,
+ -4,
+ 0,
+ 0,
+ 4,
+ 20,
+ 0,
+ 0,
+ -4,
+ 0,
+ -4,
+ -4,
+ 0,
+ 0,
+ -4,
+ -4,
+ 0,
+ -4,
+ 0,
+ 0,
+ 4,
+ 0,
+ -4,
+ -4,
+ 0,
+ -4,
+ 0,
+ 0,
+ 4,
+ -4,
+ 0,
+ 0,
+ 4,
+ 0,
+ 4,
+ 4,
+ 0,
+ 20,
+ 0,
+ 0,
+ -4,
+ 0,
+ -4,
+ -4,
+ 0,
+ 0,
+ -4,
+ -4,
+ 0,
+ -4,
+ 0,
+ 0,
+ 4,
+ 0,
+ -4,
+ -4,
+ 0,
+ -4,
+ 0,
+ 0,
+ 4,
+ -4,
+ 0,
+ 0,
+ 4,
+ 0,
+ 4,
+ 4,
+ 0,
+ 0,
+ -4,
+ -4,
+ 0,
+ -4,
+ 0,
+ 0,
+ 4,
+ -4,
+ 0,
+ 0,
+ 4,
+ 0,
+ 4,
+ 4,
+ 0,
+ -4,
+ 0,
+ 0,
+ 4,
+ 0,
+ 4,
+ 4,
+ 0,
+ 0,
+ 4,
+ 4,
+ 0,
+ 4,
+ 0,
+ 0,
+ -20
+ ],
+ "opposite_parity_source_rank": 7,
+ "ports_per_cube": 128
+ }
+ ],
+ "positive_deficit_cases": 133,
+ "scope": "Odd d>=3, p>=d+1; copied t-star centers and m=6p. The 0.005164 bound keeps the destructive-parity source/target flag. The 0.008094 bound permits any local source/target chains of endpoint distance h-1 with each jump at most h. Both discard all auxiliary entropy. No global side circuit is claimed.",
+ "star_span_checks": [
+ {
+ "degree": 3,
+ "fixed_coordinates": [
+ 0
+ ],
+ "p": 4,
+ "rank": 6,
+ "source_count": 12
+ },
+ {
+ "degree": 3,
+ "fixed_coordinates": [
+ 0
+ ],
+ "p": 7,
+ "rank": 12,
+ "source_count": 60
+ },
+ {
+ "degree": 5,
+ "fixed_coordinates": [
+ 0,
+ 2
+ ],
+ "p": 6,
+ "rank": 8,
+ "source_count": 32
+ },
+ {
+ "degree": 5,
+ "fixed_coordinates": [
+ 0,
+ 2
+ ],
+ "p": 9,
+ "rank": 14,
+ "source_count": 280
+ },
+ {
+ "degree": 7,
+ "fixed_coordinates": [
+ 0,
+ 2,
+ 4
+ ],
+ "p": 8,
+ "rank": 10,
+ "source_count": 80
+ }
+ ],
+ "strict_arbitrary_local_chains_a_ceiling": "4047/500000",
+ "strict_global_a_ceiling": "1291/250000",
+ "tail_from_p": 30
+ },
+ "small_network_target": {
+ "cases": [
+ {
+ "W": 30,
+ "exceeds_assembly_requirement": true,
+ "m": 3,
+ "rank_deficit": 1,
+ "uniform_bit_saving_lower": "5586650299062614245333/549306144334054845697623",
+ "uniform_bit_saving_upper": "11173300598125228490667/1098612288668109691395245"
+ },
+ {
+ "W": 31,
+ "exceeds_assembly_requirement": false,
+ "m": 3,
+ "rank_deficit": 1,
+ "uniform_bit_saving_lower": "5405458052107813841596/549306144334054845697623",
+ "uniform_bit_saving_upper": "10810916104215627683193/1098612288668109691395245"
+ }
+ ],
+ "necessary_ordinary_saving_for_kappa_001": "1/99",
+ "scope": "Conditional search budget for the raw uniform bit recurrence, assuming a complete all-role rational-frame certificate exists. No such circuit or complex companion is supplied."
+ },
+ "status": "SCOPED ARCHITECTURE CEILINGS; NO NEW KAPPA",
+ "target_kappa": "1/100"
+}
diff --git a/research/percent-exponent-architecture/center-basis-certificate.json b/research/percent-exponent-architecture/center-basis-certificate.json
new file mode 100644
index 0000000000..3b57377326
--- /dev/null
+++ b/research/percent-exponent-architecture/center-basis-certificate.json
@@ -0,0 +1,63 @@
+{
+ "excluded_domain_control": {
+ "p": 4,
+ "putative_floor": 6,
+ "support_rank": 4
+ },
+ "finite_sweep": {
+ "certified_support_rank_floor": 8,
+ "coefficient_alphabet": [
+ -1,
+ 0,
+ 1
+ ],
+ "nonzero_vectors_checked": 59048,
+ "p": 5,
+ "scope": "Finite control only; the written lemma handles every characteristic-zero coefficient vector."
+ },
+ "scope": "Exactly h linearly independent copied centers. Overcomplete factors, a different center mechanism, changed port families and global stage fusion remain outside this result.",
+ "sharp_examples": [
+ {
+ "h": 10,
+ "incidence_rank_Q": 10,
+ "omitted_pair_support_rank_F2": 8,
+ "p": 5,
+ "rank_minimal_center_loss_floor": 80,
+ "star_support_rank_F2": 8
+ },
+ {
+ "h": 12,
+ "incidence_rank_Q": 12,
+ "omitted_pair_support_rank_F2": 10,
+ "p": 6,
+ "rank_minimal_center_loss_floor": 120,
+ "star_support_rank_F2": 10
+ },
+ {
+ "h": 22,
+ "incidence_rank_Q": 22,
+ "omitted_pair_support_rank_F2": 20,
+ "p": 11,
+ "rank_minimal_center_loss_floor": 440,
+ "star_support_rank_F2": 20
+ },
+ {
+ "h": 26,
+ "incidence_rank_Q": 26,
+ "omitted_pair_support_rank_F2": 24,
+ "p": 13,
+ "rank_minimal_center_loss_floor": 624,
+ "star_support_rank_F2": 24
+ },
+ {
+ "h": 32,
+ "incidence_rank_Q": 32,
+ "omitted_pair_support_rank_F2": 30,
+ "p": 16,
+ "rank_minimal_center_loss_floor": 960,
+ "star_support_rank_F2": 30
+ }
+ ],
+ "status": "SHARP LOWER BOUND FOR RANK-MINIMAL COPIED CENTERS",
+ "theorem": "For p>=5 and h=2p, every nonzero characteristic-zero linear combination of coordinate stars has binary source-support span at least h-2. Therefore any factorization of B=(AA^T-J)/2 through exactly h copied scalar centers has loss at least h(h-2)."
+}
diff --git a/research/percent-exponent-architecture/center_basis.py b/research/percent-exponent-architecture/center_basis.py
new file mode 100644
index 0000000000..bd95aded50
--- /dev/null
+++ b/research/percent-exponent-architecture/center_basis.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+"""Finite controls for the rank-minimal copied-center lower bound.
+
+The proof for arbitrary characteristic-zero coefficients is in PROOF.md.
+The coefficient sweep below is a finite adversarial control, not its proof.
+"""
+from __future__ import annotations
+
+from itertools import combinations, product
+from math import comb
+
+from audit import binary_rank, need
+from triangular_obstruction import inverse, matrix
+
+
+def ports(p):
+ labels = [tuple(2 * i + b for i, b in zip(coarse, bits))
+ for coarse in combinations(range(p), 3)
+ for bits in product((0, 1), repeat=3)]
+ return labels, [sum(1 << j for j in label) for label in labels]
+
+
+def support_rank(p, coefficients):
+ labels, vectors = ports(p)
+ return binary_rank(q for label, q in zip(labels, vectors)
+ if sum(coefficients[j] for j in label))
+
+
+def sweep(p=5):
+ labels, vectors = ports(p)
+ threshold = 2 * p - 2
+ checked = 0
+ for coefficients in product((-1, 0, 1), repeat=2 * p):
+ if not any(coefficients):
+ continue
+ pivots = {}
+ for (a, b, c), q in zip(labels, vectors):
+ if not coefficients[a] + coefficients[b] + coefficients[c]:
+ continue
+ while q:
+ top = q.bit_length() - 1
+ if top in pivots:
+ q ^= pivots[top]
+ else:
+ pivots[top] = q
+ break
+ if len(pivots) >= threshold:
+ break
+ need(len(pivots) >= threshold, "Finite source-support counterexample")
+ checked += 1
+ return {"p": p, "coefficient_alphabet": [-1, 0, 1], "nonzero_vectors_checked": checked,
+ "certified_support_rank_floor": threshold,
+ "scope": "Finite control only; the written lemma handles every characteristic-zero coefficient vector."}
+
+
+def certificate():
+ sharp = []
+ for p in (5, 6, 11, 13, 16):
+ h = 2 * p
+ gram = matrix([[4 * comb(p - 1, 2) if i == j else 0 if i // 2 == j // 2
+ else 2 * (p - 2) for j in range(h)] for i in range(h)])
+ inverse(gram) # Exact full column rank of the port incidence matrix.
+ center_rank = support_rank(p, [1] + [0] * (h - 1))
+ omitted_pair = support_rank(p, [-2, -2] + [1] * (h - 2))
+ need(center_rank == omitted_pair == h - 2, "Sharp center-support examples")
+ sharp.append({"p": p, "h": h, "incidence_rank_Q": h,
+ "star_support_rank_F2": center_rank,
+ "omitted_pair_support_rank_F2": omitted_pair,
+ "rank_minimal_center_loss_floor": h * (h - 2)})
+ small = support_rank(4, [-2, -2] + [1] * 6)
+ need(small == 4 and small < 8 - 2, "The p>=5 domain is necessary")
+ return {"status": "SHARP LOWER BOUND FOR RANK-MINIMAL COPIED CENTERS",
+ "theorem": "For p>=5 and h=2p, every nonzero characteristic-zero linear combination of coordinate stars has binary source-support span at least h-2. Therefore any factorization of B=(AA^T-J)/2 through exactly h copied scalar centers has loss at least h(h-2).",
+ "sharp_examples": sharp, "finite_sweep": sweep(),
+ "excluded_domain_control": {"p": 4, "support_rank": small, "putative_floor": 6},
+ "scope": "Exactly h linearly independent copied centers. Overcomplete factors, a different center mechanism, changed port families and global stage fusion remain outside this result."}
+
+
+if __name__ == "__main__":
+ import json
+ print(json.dumps(certificate(), sort_keys=True, indent=2))
diff --git a/research/percent-exponent-architecture/discovery/balanced_search.cpp b/research/percent-exponent-architecture/discovery/balanced_search.cpp
new file mode 100644
index 0000000000..34c88f3cc8
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/balanced_search.cpp
@@ -0,0 +1,252 @@
+// Exact GL(2,F2) meet-in-the-middle discovery on an explicit balanced graph.
+// Every output, including all auxiliary outputs, must be a distinct input.
+// Prepared for huxint with OpenAI Codex assistance. Apache-2.0.
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+using Rows = std::array;
+struct Key {
+ uint64_t low = 0, high = 0;
+ bool operator==(const Key& o) const { return low == o.low && high == o.high; }
+};
+struct KeyHash {
+ size_t operator()(const Key& k) const {
+ uint64_t x = k.low ^ (k.high + 0x9e3779b97f4a7c15ULL + (k.low << 6) + (k.low >> 2));
+ x ^= x >> 30; x *= 0xbf58476d1ce4e5b9ULL;
+ x ^= x >> 27; x *= 0x94d049bb133111ebULL;
+ return x ^ (x >> 31);
+ }
+};
+constexpr int GL[6][2] = {{1,2},{2,1},{1,3},{3,2},{2,3},{3,1}};
+constexpr int INVERSE[6] = {0,1,2,3,5,4};
+
+Rows columns(const Rows& rows, int width) {
+ Rows result{};
+ for (int i = 0; i < width; ++i)
+ for (int j = 0; j < width; ++j)
+ result[j] |= ((rows[i] >> j) & 1) << i;
+ return result;
+}
+
+Key key(const Rows& rows, int width, const std::vector& fixed) {
+ const auto cols = columns(rows, width);
+ std::array used{};
+ Rows ordered{};
+ int n = 0;
+ for (int j : fixed) { ordered[n++] = cols[j]; used[j] = true; }
+ for (int j = 0; j < width; ++j) if (!used[j]) ordered[n++] = cols[j];
+ std::sort(ordered.begin() + fixed.size(), ordered.begin() + width);
+ Key k;
+ for (int j = 0; j < width; ++j) {
+ k.high = (k.high << width) | (k.low >> (64 - width));
+ k.low = (k.low << width) | ordered[j];
+ }
+ return k;
+}
+
+Rows apply(Rows rows, int a, int b, int choice) {
+ const uint16_t values[4] = {0, rows[a], rows[b], uint16_t(rows[a] ^ rows[b])};
+ rows[a] = values[GL[choice][0]];
+ rows[b] = values[GL[choice][1]];
+ return rows;
+}
+
+uint64_t packed_permutation(const Rows& values, int width) {
+ uint64_t code = 0;
+ for (int i = 0; i < width; ++i) code |= uint64_t(values[i]) << (4*i);
+ return code;
+}
+
+void all_permutations(int id, int width, const std::vector>& pairs) {
+ const int gates = pairs.size(), split = gates / 2;
+ Rows tokens{};
+ for (int i = 0; i < width; ++i) tokens[i] = i;
+ std::unordered_set routes{packed_permutation(tokens,width)};
+ for (auto [a,b] : pairs) {
+ auto next = routes;
+ for (auto code : routes) {
+ const auto x = (code >> (4*a)) & 15, y = (code >> (4*b)) & 15;
+ next.insert(code ^ ((x ^ y) << (4*a)) ^ ((x ^ y) << (4*b)));
+ }
+ routes.swap(next);
+ }
+ int factorial = 1; for (int i = 2; i <= width; ++i) factorial *= i;
+ if (routes.size() == size_t(factorial)) {
+ std::cout << "{\"id\":" << id << ",\"W\":" << width
+ << ",\"routing_permutations\":" << routes.size()
+ << ",\"all_permutations_routable\":true,\"nonroutable_scalar_permutation\":false}" << std::endl;
+ return;
+ }
+ struct Prefix { Rows cols; uint32_t word; };
+ std::unordered_map,KeyHash> prefixes;
+ prefixes.reserve(300000);
+ Rows identity{};
+ for (int i = 0; i < width; ++i) identity[i] = 1 << i;
+ uint64_t prefix_count = 0, suffix_count = 0, matches = 0;
+ std::function forward = [&](int depth, Rows rows, uint32_t word) {
+ if (depth == split) {
+ prefixes[key(rows,width,{})].push_back({columns(rows,width),word});
+ ++prefix_count; return;
+ }
+ auto [a,b] = pairs[depth];
+ for (int k = 0; k < 6; ++k)
+ forward(depth+1,apply(rows,a,b,k),word | (uint32_t(k) << (3*depth)));
+ };
+ forward(0,identity,0);
+ bool found = false;
+ uint32_t chosen_prefix = 0, chosen_suffix = 0;
+ Rows chosen_rho{};
+ std::unordered_set scalar_permutations;
+ std::function backward = [&](int depth, Rows rows, uint32_t word) {
+ if (found) return;
+ if (depth == gates-split) {
+ ++suffix_count;
+ auto it = prefixes.find(key(rows,width,{}));
+ if (it == prefixes.end()) return;
+ auto cols = columns(rows,width);
+ for (const auto& prefix : it->second) {
+ ++matches;
+ Rows output_tokens{}, rho{};
+ for (int in = 0; in < width; ++in) {
+ int out = 0;
+ while (out < width && cols[out] != prefix.cols[in]) ++out;
+ if (out == width) throw std::runtime_error("Bad column-key match");
+ output_tokens[out] = in; rho[in] = out;
+ }
+ auto code = packed_permutation(output_tokens,width);
+ scalar_permutations.insert(code);
+ if (!routes.count(code)) {
+ found = true; chosen_prefix = prefix.word; chosen_suffix = word;
+ chosen_rho = rho; return;
+ }
+ }
+ return;
+ }
+ auto [a,b] = pairs[gates-1-depth];
+ for (int k = 0; k < 6 && !found; ++k)
+ backward(depth+1,apply(rows,a,b,k),word | (uint32_t(k) << (3*depth)));
+ };
+ backward(0,identity,0);
+ std::cout << "{\"id\":" << id << ",\"W\":" << width
+ << ",\"routing_permutations\":" << routes.size()
+ << ",\"prefix_assignments\":" << prefix_count
+ << ",\"prefix_keys\":" << prefixes.size()
+ << ",\"suffix_assignments\":" << suffix_count
+ << ",\"matching_full_words\":" << matches
+ << ",\"scalar_permutations\":" << scalar_permutations.size()
+ << ",\"nonroutable_scalar_permutation\":" << (found ? "true" : "false");
+ if (found) {
+ std::cout << ",\"choices\":[";
+ std::vector choices;
+ for (int i = 0; i < split; ++i) choices.push_back((chosen_prefix >> (3*i)) & 7);
+ for (int i = gates-split-1; i >= 0; --i) choices.push_back(INVERSE[(chosen_suffix >> (3*i)) & 7]);
+ Rows transfer = identity;
+ for (int i = 0; i < gates; ++i) {
+ if (i) std::cout << ',';
+ std::cout << choices[i];
+ transfer = apply(transfer,pairs[i].first,pairs[i].second,choices[i]);
+ }
+ std::cout << "],\"rho\":[";
+ for (int i = 0; i < width; ++i) {
+ if (transfer[chosen_rho[i]] != (1 << i)) throw std::runtime_error("Wrong recovered permutation");
+ if (i) std::cout << ',';
+ std::cout << chosen_rho[i];
+ }
+ std::cout << ']';
+ }
+ std::cout << "}" << std::endl;
+}
+
+int main(int argc, char** argv) {
+ const bool scan_all = argc == 2 && std::string(argv[1]) == "--all-permutations";
+ if (argc != 1 && !scan_all) throw std::runtime_error("Unknown discovery mode");
+ int id, width, gates, prescribed;
+ while (std::cin >> id >> width >> gates >> prescribed) {
+ if (width < 2 || width > 10 || gates < 0 || gates > 16 || prescribed > width)
+ throw std::runtime_error("Input outside explicit discovery budget");
+ std::vector> pairs(gates);
+ for (auto& p : pairs) {
+ std::cin >> p.first >> p.second;
+ if (p.first < 0 || p.second < 0 || p.first >= width || p.second >= width || p.first == p.second)
+ throw std::runtime_error("Invalid gate pair");
+ }
+ std::vector input_fixed, output_fixed;
+ for (int i = 0, a, b; i < prescribed; ++i) {
+ std::cin >> a >> b; input_fixed.push_back(a); output_fixed.push_back(b);
+ }
+ if (scan_all) { all_permutations(id,width,pairs); continue; }
+ const int split = gates / 2;
+ Rows identity{};
+ for (int j = 0; j < width; ++j) identity[j] = 1 << j;
+ std::unordered_map prefixes;
+ prefixes.reserve(300000);
+ uint64_t prefix_count = 0, suffix_count = 0;
+ std::function forward = [&](int depth, Rows rows, uint32_t word) {
+ if (depth == split) {
+ prefixes.emplace(key(rows, width, input_fixed), word); ++prefix_count; return;
+ }
+ auto [a,b] = pairs[depth];
+ for (int k = 0; k < 6; ++k)
+ forward(depth + 1, apply(rows,a,b,k), word | (uint32_t(k) << (3*depth)));
+ };
+ forward(0,identity,0);
+ bool found = false;
+ uint32_t chosen_prefix = 0, chosen_inverse_suffix = 0;
+ Rows matched_inverse{};
+ std::function backward = [&](int depth, Rows rows, uint32_t word) {
+ if (found) return;
+ if (depth == gates - split) {
+ ++suffix_count;
+ auto it = prefixes.find(key(rows, width, output_fixed));
+ if (it != prefixes.end()) {
+ found = true; chosen_prefix = it->second;
+ chosen_inverse_suffix = word; matched_inverse = rows;
+ }
+ return;
+ }
+ auto [a,b] = pairs[gates - 1 - depth];
+ for (int k = 0; k < 6 && !found; ++k)
+ backward(depth + 1, apply(rows,a,b,k), word | (uint32_t(k) << (3*depth)));
+ };
+ backward(0,identity,0);
+ std::cout << "{\"id\":" << id << ",\"W\":" << width
+ << ",\"prefix_assignments\":" << prefix_count
+ << ",\"prefix_keys\":" << prefixes.size()
+ << ",\"suffix_assignments\":" << suffix_count
+ << ",\"exists\":" << (found ? "true" : "false");
+ if (found) {
+ std::vector choices;
+ for (int i = 0; i < split; ++i) choices.push_back((chosen_prefix >> (3*i)) & 7);
+ for (int i = gates-split-1; i >= 0; --i)
+ choices.push_back(INVERSE[(chosen_inverse_suffix >> (3*i)) & 7]);
+ Rows transfer = identity;
+ for (int i = 0; i < gates; ++i)
+ transfer = apply(transfer,pairs[i].first,pairs[i].second,choices[i]);
+ std::array rho{};
+ std::array occupied{};
+ for (int out = 0; out < width; ++out) {
+ const int row = transfer[out];
+ if (!row || (row & (row-1))) throw std::runtime_error("Nonpermutation recovery");
+ int in = 0; while ((1 << in) != row) ++in;
+ if (occupied[in]) throw std::runtime_error("Repeated permutation input");
+ occupied[in] = true; rho[in] = out;
+ }
+ for (int i = 0; i < prescribed; ++i)
+ if (rho[input_fixed[i]] != output_fixed[i]) throw std::runtime_error("Wrong fixed terminal");
+ std::cout << ",\"choices\":[";
+ for (int i = 0; i < gates; ++i) { if (i) std::cout << ','; std::cout << choices[i]; }
+ std::cout << "],\"rho\":[";
+ for (int i = 0; i < width; ++i) { if (i) std::cout << ','; std::cout << rho[i]; }
+ std::cout << ']';
+ }
+ std::cout << "}" << std::endl;
+ }
+}
diff --git a/research/percent-exponent-architecture/discovery/fano_reuse.py b/research/percent-exponent-architecture/discovery/fano_reuse.py
new file mode 100644
index 0000000000..912d4e6cc5
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/fano_reuse.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+"""Enumerate chronological reuse of the balanced Fano network's free stubs.
+
+This changes the graph before scalar synthesis. It never appends a generic
+decoder. A surviving topology must retain the three original routing demands
+as an obstruction; every remaining input is still independent.
+"""
+from __future__ import annotations
+
+import argparse
+from itertools import product
+import json
+from pathlib import Path
+import sys
+
+PACKAGE = Path(__file__).resolve().parents[1]
+sys.path.insert(0, str(PACKAGE / "references"))
+from balanced_fano import balanced_fano
+
+
+def partial_routes(width, pairs, prescribed):
+ """Exact simultaneous routing of the three prescribed source tokens."""
+ inputs = tuple(sorted(prescribed))
+ states = {inputs}
+ for a, b in pairs:
+ states |= {tuple(b if p == a else a if p == b else p for p in s)
+ for s in states}
+ destination = tuple(prescribed[p] for p in inputs)
+ return {"routable": destination in states,
+ "reachable_token_placements": len(states),
+ "prescribed_destination": list(destination)}
+
+
+def topologies():
+ base = balanced_fano()
+ time = {name: i for i, name in enumerate(base["gate_vertices"])}
+ donors = [(name, role) for name, role in base["auxiliary_outputs"]
+ if any(time[name] < time[rec] for rec, _ in base["auxiliary_inputs"])]
+ recipients = [(name, role) for name, role in base["auxiliary_inputs"]
+ if any(time[don] < time[name] for don, _ in donors)]
+ options = [[None] + [(don, role) for don, role in donors if time[don] < time[rec]]
+ for rec, _ in recipients]
+ count = 0
+ for choice in product(*options):
+ chosen = [p for p in choice if p is not None]
+ if len(chosen) != len(set(chosen)):
+ continue
+ parent = list(range(base["W"]))
+
+ def find(i):
+ while parent[i] != i:
+ i = parent[i]
+ return i
+
+ reused = []
+ removed_inputs = set()
+ for (receiver, r), donor in zip(recipients, choice):
+ if donor is None:
+ continue
+ vertex, d = donor
+ assert time[vertex] < time[receiver]
+ assert find(r) != find(d)
+ parent[find(r)] = find(d)
+ reused.append({"from_vertex": vertex, "from_role": d,
+ "to_vertex": receiver, "to_role": r})
+ removed_inputs.add(r)
+ independent = [i for i in range(base["W"]) if i not in removed_inputs]
+ assert len({find(i) for i in independent}) == len(independent)
+ index = {find(i): k for k, i in enumerate(independent)}
+ renumber = [index[find(i)] for i in range(base["W"])]
+ pairs = [[renumber[a], renumber[b]] for a, b in base["pairs"]]
+ assert all(a != b for a, b in pairs)
+ prescribed = {renumber[i]: renumber[j] for i, j in base["prescribed"].items()}
+ width = len(independent)
+ donated = {d for _, d in chosen}
+ final_roles = list(base["prescribed"].values()) + [
+ r for _, r in base["auxiliary_outputs"] if r not in donated]
+ assert sorted(renumber[r] for r in final_roles) == list(range(width))
+ route = partial_routes(width, pairs, prescribed)
+ yield {"id": count, "W": width, "pairs": pairs,
+ "prescribed": prescribed, "reuse": reused,
+ "independent_original_roles": independent,
+ "old_to_new_roles": renumber, "routing": route}
+ count += 1
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--output", type=Path, required=True)
+ args = parser.parse_args()
+ cases = list(topologies())
+ args.output.mkdir(parents=True, exist_ok=True)
+ (args.output / "topologies.json").write_text(json.dumps(cases, indent=2) + "\n")
+ survivors = [c for c in cases if not c["routing"]["routable"]]
+ lines = []
+ for c in survivors:
+ nums = [c["id"], c["W"], len(c["pairs"]), len(c["prescribed"])]
+ nums += [x for pair in c["pairs"] for x in pair]
+ nums += [x for pair in sorted(c["prescribed"].items()) for x in pair]
+ lines.append(" ".join(map(str, nums)))
+ (args.output / "search-input.txt").write_text("\n".join(lines) + "\n")
+ print(json.dumps({"topologies": len(cases), "routing_obstruction_survivors": len(survivors),
+ "surviving_widths": sorted({c["W"] for c in survivors})}))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/research/percent-exponent-architecture/discovery/receipts/vector-k2.json b/research/percent-exponent-architecture/discovery/receipts/vector-k2.json
new file mode 100644
index 0000000000..87edbf4181
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/receipts/vector-k2.json
@@ -0,0 +1,162 @@
+[
+ {
+ "W": 20,
+ "block": 2,
+ "case_id": 0,
+ "elapsed_seconds": 0.08390658199641621,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 18,
+ "block": 2,
+ "case_id": 3,
+ "elapsed_seconds": 0.04322447300364729,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 18,
+ "block": 2,
+ "case_id": 4,
+ "elapsed_seconds": 0.0316019320016494,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 18,
+ "block": 2,
+ "case_id": 13,
+ "elapsed_seconds": 0.03002273699530633,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 16,
+ "block": 2,
+ "case_id": 16,
+ "elapsed_seconds": 0.035645643998577725,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 18,
+ "block": 2,
+ "case_id": 34,
+ "elapsed_seconds": 0.032037665994721465,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 16,
+ "block": 2,
+ "case_id": 36,
+ "elapsed_seconds": 0.0359503660001792,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 16,
+ "block": 2,
+ "case_id": 37,
+ "elapsed_seconds": 0.027729383000405505,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 16,
+ "block": 2,
+ "case_id": 41,
+ "elapsed_seconds": 0.027134439995279536,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 14,
+ "block": 2,
+ "case_id": 43,
+ "elapsed_seconds": 0.6225613789938507,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 18,
+ "block": 2,
+ "case_id": 47,
+ "elapsed_seconds": 0.0325405019975733,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 16,
+ "block": 2,
+ "case_id": 50,
+ "elapsed_seconds": 0.02946661399619188,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 16,
+ "block": 2,
+ "case_id": 60,
+ "elapsed_seconds": 0.029642137000337243,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 14,
+ "block": 2,
+ "case_id": 62,
+ "elapsed_seconds": 0.18776335099391872,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 18,
+ "block": 2,
+ "case_id": 67,
+ "elapsed_seconds": 0.07445067400112748,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 16,
+ "block": 2,
+ "case_id": 70,
+ "elapsed_seconds": 0.4399162910049199,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ }
+]
diff --git a/research/percent-exponent-architecture/discovery/receipts/vector-k3-canonical.json b/research/percent-exponent-architecture/discovery/receipts/vector-k3-canonical.json
new file mode 100644
index 0000000000..2d10984da3
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/receipts/vector-k3-canonical.json
@@ -0,0 +1,178 @@
+[
+ {
+ "W": 30,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 0,
+ "elapsed_seconds": 0.15675677400577115,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 3,
+ "elapsed_seconds": 0.2439698100060923,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 4,
+ "elapsed_seconds": 0.16877985899918713,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 13,
+ "elapsed_seconds": 0.15741428400360746,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 16,
+ "elapsed_seconds": 0.6926457559966366,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 34,
+ "elapsed_seconds": 0.1434111650014529,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 36,
+ "elapsed_seconds": 0.14983427499828395,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 37,
+ "elapsed_seconds": 0.3101165990010486,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 41,
+ "elapsed_seconds": 0.13760596999782138,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 21,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 43,
+ "elapsed_seconds": 1.192008750003879,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 47,
+ "elapsed_seconds": 0.15285538799798815,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 50,
+ "elapsed_seconds": 0.20848940200085053,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 60,
+ "elapsed_seconds": 0.14178073199582286,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 21,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 62,
+ "elapsed_seconds": 0.22376338899630355,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 67,
+ "elapsed_seconds": 0.14402453799993964,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "canonical_internal_edge_bases": true,
+ "case_id": 70,
+ "elapsed_seconds": 0.24018301400064956,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ }
+]
diff --git a/research/percent-exponent-architecture/discovery/receipts/vector-k3.json b/research/percent-exponent-architecture/discovery/receipts/vector-k3.json
new file mode 100644
index 0000000000..d468c63360
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/receipts/vector-k3.json
@@ -0,0 +1,165 @@
+[
+ {
+ "W": 30,
+ "block": 3,
+ "case_id": 0,
+ "elapsed_seconds": 0.301878983998904,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "case_id": 3,
+ "elapsed_seconds": 0.5156547680016956,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "case_id": 4,
+ "elapsed_seconds": 1.0573794480005745,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "case_id": 13,
+ "elapsed_seconds": 0.1497653759943205,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "case_id": 16,
+ "elapsed_seconds": 1.3012972610013094,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "case_id": 34,
+ "elapsed_seconds": 2.0745798500065575,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "case_id": 36,
+ "elapsed_seconds": 2.4167229930026224,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "case_id": 37,
+ "elapsed_seconds": 1.3961161529950914,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "case_id": 41,
+ "elapsed_seconds": 0.25829674000124214,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 21,
+ "block": 3,
+ "case_id": 43,
+ "elapsed_seconds": 30.004746368998894,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "case_id": 47,
+ "elapsed_seconds": 4.603576653003984,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "case_id": 50,
+ "elapsed_seconds": 5.056007115003013,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "case_id": 60,
+ "elapsed_seconds": 1.6813189849999617,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 21,
+ "block": 3,
+ "case_id": 62,
+ "elapsed_seconds": 30.004507912999543,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 27,
+ "block": 3,
+ "case_id": 67,
+ "elapsed_seconds": 3.4740445950010326,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 24,
+ "block": 3,
+ "case_id": 70,
+ "elapsed_seconds": 30.003693307000503,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ }
+]
diff --git a/research/percent-exponent-architecture/discovery/receipts/vector-k4-canonical.json b/research/percent-exponent-architecture/discovery/receipts/vector-k4-canonical.json
new file mode 100644
index 0000000000..8398d44516
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/receipts/vector-k4-canonical.json
@@ -0,0 +1,178 @@
+[
+ {
+ "W": 40,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 0,
+ "elapsed_seconds": 0.3884478109976044,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 3,
+ "elapsed_seconds": 1.2231093989976216,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 4,
+ "elapsed_seconds": 0.7701890269963769,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 13,
+ "elapsed_seconds": 0.35572365400003036,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 16,
+ "elapsed_seconds": 1.5544145349995233,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 34,
+ "elapsed_seconds": 0.35808689599798527,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 36,
+ "elapsed_seconds": 1.314940808006213,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 37,
+ "elapsed_seconds": 1.4739143309998326,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 41,
+ "elapsed_seconds": 0.3120910979996552,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 28,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 43,
+ "elapsed_seconds": 3.597975317003147,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 47,
+ "elapsed_seconds": 0.3852785830022185,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 50,
+ "elapsed_seconds": 1.1258174190006685,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 60,
+ "elapsed_seconds": 0.33207599100569496,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 28,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 62,
+ "elapsed_seconds": 1.3429372629980207,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 67,
+ "elapsed_seconds": 0.3690150699985679,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "canonical_internal_edge_bases": true,
+ "case_id": 70,
+ "elapsed_seconds": 2.5139326170028653,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ }
+]
diff --git a/research/percent-exponent-architecture/discovery/receipts/vector-k4.json b/research/percent-exponent-architecture/discovery/receipts/vector-k4.json
new file mode 100644
index 0000000000..d6599d688d
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/receipts/vector-k4.json
@@ -0,0 +1,173 @@
+[
+ {
+ "W": 40,
+ "block": 4,
+ "case_id": 0,
+ "elapsed_seconds": 17.614681708000717,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "case_id": 3,
+ "elapsed_seconds": 30.122233105001214,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "case_id": 4,
+ "elapsed_seconds": 30.009896276998916,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "case_id": 13,
+ "elapsed_seconds": 30.007519078004407,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "case_id": 16,
+ "elapsed_seconds": 30.00722944700101,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "case_id": 34,
+ "elapsed_seconds": 17.11180779699498,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "case_id": 36,
+ "elapsed_seconds": 30.006529671001772,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "case_id": 37,
+ "elapsed_seconds": 30.020238129000063,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "case_id": 41,
+ "elapsed_seconds": 30.006549896999786,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 28,
+ "block": 4,
+ "case_id": 43,
+ "elapsed_seconds": 30.097369429000537,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "case_id": 47,
+ "elapsed_seconds": 8.83743350199802,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "case_id": 50,
+ "elapsed_seconds": 30.10296854400076,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "case_id": 60,
+ "elapsed_seconds": 12.264251690001402,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 28,
+ "block": 4,
+ "case_id": 62,
+ "elapsed_seconds": 30.00668929299718,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 36,
+ "block": 4,
+ "case_id": 67,
+ "elapsed_seconds": 10.24407730299572,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unsat",
+ "timeout_ms": 30000
+ },
+ {
+ "W": 32,
+ "block": 4,
+ "case_id": 70,
+ "elapsed_seconds": 30.007083201002388,
+ "reason": "timeout",
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only.",
+ "solver": "5.1.0",
+ "status": "unknown",
+ "timeout_ms": 30000
+ }
+]
diff --git a/research/percent-exponent-architecture/discovery/vector_fano.py b/research/percent-exponent-architecture/discovery/vector_fano.py
new file mode 100644
index 0000000000..3511bed01e
--- /dev/null
+++ b/research/percent-exponent-architecture/discovery/vector_fano.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+"""Search vector-linear, all-input completions on a fixed Fano topology.
+
+Each former edge holds k independent bits. Every vertex may apply any binary
+linear map on all 2k incident bits. Requiring the final map to be a complete
+permutation forces every local square map to be invertible. There are no
+zero-initialized bits and no appended decoder. A solver UNSAT/timeout is only
+a discovery receipt, not an independently checked impossibility certificate.
+"""
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+import time
+
+import z3
+from fano_reuse import topologies
+
+
+def synthesize(case, block, timeout_ms, canonical_edges=False):
+ width = case["W"] * block
+ solver = z3.SolverFor("QF_BV")
+ solver.set(timeout=timeout_ms, random_seed=0)
+ last = [z3.BitVecVal(1 << r, width) for r in range(width)]
+ symbolic_gates = []
+ for index, (a, b) in enumerate(case["pairs"]):
+ roles = [block * r + j for r in (a, b) for j in range(block)]
+ old = [last[r] for r in roles]
+ coefficients = []
+ for out, r in enumerate(roles):
+ row = [z3.Bool(f"c_{index}_{out}_{j}") for j in range(len(roles))]
+ coefficients.append(row)
+ value = z3.BitVecVal(0, width)
+ for coeff, operand in zip(row, old):
+ value = value ^ z3.If(coeff, operand, z3.BitVecVal(0, width))
+ current = z3.BitVec(f"g_{index}_{out}", width)
+ solver.add(current == value)
+ last[r] = current
+ symbolic_gates.append((roles, coefficients))
+ if canonical_edges:
+ # Independent basis changes on each internal block are absorbed
+ # into its adjacent GL(2k) vertices. A final free auxiliary block
+ # can sort its unit vectors; the prescribed blocks are already
+ # sorted. Thus row-reduced internal edge bases lose no existence
+ # cases in this scalar model.
+ for start in (0, block):
+ values = [last[r] for r in roles[start:start + block]]
+ pivots = [x & -x for x in values]
+ for x in values:
+ solver.add(x != 0)
+ for i in range(block - 1):
+ solver.add(z3.ULT(pivots[i], pivots[i + 1]))
+ for i in range(block):
+ for j in range(block):
+ if i != j:
+ solver.add(values[i] & pivots[j] == 0)
+ for row in last:
+ solver.add(row != 0, row & (row - 1) == 0)
+ solver.add(z3.Distinct(*last))
+ for source, target in case["prescribed"].items():
+ for j in range(block):
+ solver.add(last[block * target + j] == 1 << (block * source + j))
+ start = time.monotonic()
+ status = solver.check()
+ result = {"case_id": case["id"], "block": block, "W": width,
+ "status": str(status), "elapsed_seconds": time.monotonic() - start,
+ "solver": z3.get_version_string(), "timeout_ms": timeout_ms,
+ "canonical_internal_edge_bases": canonical_edges,
+ "scope": "Fixed balanced topology, arbitrary GL(2k,F2) gates and free auxiliary bit permutation; solver discovery only."}
+ if status == z3.unknown:
+ result["reason"] = solver.reason_unknown()
+ if status != z3.sat:
+ return result
+ model = solver.model()
+ rows = [1 << r for r in range(width)]
+ gates = []
+ for roles, coefficients in symbolic_gates:
+ matrix = [[int(z3.is_true(model.eval(c, model_completion=True))) for c in row]
+ for row in coefficients]
+ old = [rows[r] for r in roles]
+ new = []
+ for row in matrix:
+ value = 0
+ for c, operand in zip(row, old):
+ if c:
+ value ^= operand
+ new.append(value)
+ for r, value in zip(roles, new):
+ rows[r] = value
+ gates.append({"roles": roles, "matrix": matrix})
+ assert sorted(rows) == [1 << r for r in range(width)]
+ rho = [rows.index(1 << r) for r in range(width)]
+ assert all(rho[block * source + j] == block * target + j
+ for source, target in case["prescribed"].items() for j in range(block))
+ result.update(gates=gates, rho=rho, independently_replayed_all_columns=True)
+ return result
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--block", type=int, default=2)
+ parser.add_argument("--timeout-ms", type=int, default=30000)
+ parser.add_argument("--case", type=int, action="append")
+ parser.add_argument("--canonical-edges", action="store_true")
+ args = parser.parse_args()
+ assert 1 <= args.block <= 4
+ cases = [c for c in topologies() if not c["routing"]["routable"]]
+ if args.case is not None:
+ cases = [c for c in cases if c["id"] in args.case]
+ for case in cases:
+ print(json.dumps(synthesize(case, args.block, args.timeout_ms, args.canonical_edges)), flush=True)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/research/percent-exponent-architecture/enumeration-controls.json b/research/percent-exponent-architecture/enumeration-controls.json
new file mode 100644
index 0000000000..d3ddb3265d
--- /dev/null
+++ b/research/percent-exponent-architecture/enumeration-controls.json
@@ -0,0 +1,4 @@
+{
+ "all_passed": true,
+ "direct_full_word_controls": 8
+}
diff --git a/research/percent-exponent-architecture/fano-all-permutations.json b/research/percent-exponent-architecture/fano-all-permutations.json
new file mode 100644
index 0000000000..f78b1e737f
--- /dev/null
+++ b/research/percent-exponent-architecture/fano-all-permutations.json
@@ -0,0 +1,972 @@
+{
+ "results": [
+ {
+ "W": 10,
+ "id": 0,
+ "matching_full_words": 26112,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 14064,
+ "scalar_permutations": 14064,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 1,
+ "matching_full_words": 44544,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 11120,
+ "scalar_permutations": 11120,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 2,
+ "matching_full_words": 57728,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 9152,
+ "scalar_permutations": 9152,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 3,
+ "matching_full_words": 72448,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 7952,
+ "scalar_permutations": 7952,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 4,
+ "matching_full_words": 101376,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 6448,
+ "scalar_permutations": 6448,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 5,
+ "matching_full_words": 68096,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 9904,
+ "scalar_permutations": 9904,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 6,
+ "matching_full_words": 163456,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 6024,
+ "scalar_permutations": 6024,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 7,
+ "matching_full_words": 205184,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 5312,
+ "scalar_permutations": 5312,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 8,
+ "matching_full_words": 279552,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 4320,
+ "scalar_permutations": 4320,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 9,
+ "matching_full_words": 44544,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 11120,
+ "scalar_permutations": 11120,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 10,
+ "matching_full_words": 80128,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 8032,
+ "scalar_permutations": 8032,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 11,
+ "matching_full_words": 123648,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 5408,
+ "scalar_permutations": 5408,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 12,
+ "matching_full_words": 185856,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 4656,
+ "scalar_permutations": 4656,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 13,
+ "matching_full_words": 95232,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 6464,
+ "scalar_permutations": 6464,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 14,
+ "matching_full_words": 172032,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 4768,
+ "scalar_permutations": 4768,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 15,
+ "matching_full_words": 223488,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 3856,
+ "scalar_permutations": 3856,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 16,
+ "matching_full_words": 405504,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 2816,
+ "scalar_permutations": 2816,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 17,
+ "matching_full_words": 62464,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 9424,
+ "scalar_permutations": 9424,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 18,
+ "matching_full_words": 102144,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 6592,
+ "scalar_permutations": 6592,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 19,
+ "matching_full_words": 151680,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 5264,
+ "scalar_permutations": 5264,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 20,
+ "matching_full_words": 177664,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 28611,
+ "routing_permutations": 3680,
+ "scalar_permutations": 3680,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 21,
+ "matching_full_words": 62464,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 9424,
+ "scalar_permutations": 9424,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 22,
+ "matching_full_words": 151680,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 5264,
+ "scalar_permutations": 5264,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 23,
+ "matching_full_words": 187648,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 4608,
+ "scalar_permutations": 4608,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 24,
+ "matching_full_words": 245760,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 3728,
+ "scalar_permutations": 3728,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 25,
+ "matching_full_words": 102144,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 6592,
+ "scalar_permutations": 6592,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 26,
+ "matching_full_words": 320000,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 2544,
+ "scalar_permutations": 2544,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 27,
+ "matching_full_words": 465408,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 2224,
+ "scalar_permutations": 2224,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 28,
+ "matching_full_words": 253440,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 4128,
+ "scalar_permutations": 4128,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 29,
+ "matching_full_words": 698112,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 2016,
+ "scalar_permutations": 2016,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 30,
+ "matching_full_words": 1133568,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 1392,
+ "scalar_permutations": 1392,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 31,
+ "matching_full_words": 145920,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 4896,
+ "scalar_permutations": 4896,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 32,
+ "matching_full_words": 416128,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 2336,
+ "scalar_permutations": 2336,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 33,
+ "matching_full_words": 434176,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 1648,
+ "scalar_permutations": 1648,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 34,
+ "matching_full_words": 101376,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 6448,
+ "scalar_permutations": 6448,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 35,
+ "matching_full_words": 185856,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 4656,
+ "scalar_permutations": 4656,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 36,
+ "matching_full_words": 288768,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 3216,
+ "scalar_permutations": 3216,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 37,
+ "matching_full_words": 470016,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 2704,
+ "scalar_permutations": 2704,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 38,
+ "matching_full_words": 279552,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 4320,
+ "scalar_permutations": 4320,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 39,
+ "matching_full_words": 903936,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1984,
+ "scalar_permutations": 1984,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 40,
+ "matching_full_words": 1410048,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1696,
+ "scalar_permutations": 1696,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 41,
+ "matching_full_words": 368640,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 2912,
+ "scalar_permutations": 2912,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 42,
+ "matching_full_words": 783360,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1872,
+ "scalar_permutations": 1872,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 43,
+ "matching_full_words": 1935360,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1088,
+ "scalar_permutations": 1088,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 44,
+ "matching_full_words": 245760,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 3728,
+ "scalar_permutations": 3728,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 45,
+ "matching_full_words": 465408,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 2224,
+ "scalar_permutations": 2224,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 46,
+ "matching_full_words": 768000,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1248,
+ "scalar_permutations": 1248,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 47,
+ "matching_full_words": 95232,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 6464,
+ "scalar_permutations": 6464,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 48,
+ "matching_full_words": 223488,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 3856,
+ "scalar_permutations": 3856,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 49,
+ "matching_full_words": 268800,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 3520,
+ "scalar_permutations": 3520,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 50,
+ "matching_full_words": 368640,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 2912,
+ "scalar_permutations": 2912,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 51,
+ "matching_full_words": 172032,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 4768,
+ "scalar_permutations": 4768,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 52,
+ "matching_full_words": 502272,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 2144,
+ "scalar_permutations": 2144,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 53,
+ "matching_full_words": 783360,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1872,
+ "scalar_permutations": 1872,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 54,
+ "matching_full_words": 377856,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 2848,
+ "scalar_permutations": 2848,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 55,
+ "matching_full_words": 953856,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1520,
+ "scalar_permutations": 1520,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 56,
+ "matching_full_words": 1603584,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1216,
+ "scalar_permutations": 1216,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 57,
+ "matching_full_words": 253440,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 4128,
+ "scalar_permutations": 4128,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 58,
+ "matching_full_words": 698112,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 2016,
+ "scalar_permutations": 2016,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 59,
+ "matching_full_words": 732672,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 4995,
+ "routing_permutations": 1536,
+ "scalar_permutations": 1536,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 60,
+ "matching_full_words": 405504,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 873,
+ "routing_permutations": 2816,
+ "scalar_permutations": 2816,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 61,
+ "matching_full_words": 1179648,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 873,
+ "routing_permutations": 1280,
+ "scalar_permutations": 1280,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 62,
+ "matching_full_words": 1935360,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 873,
+ "routing_permutations": 1088,
+ "scalar_permutations": 1088,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 63,
+ "matching_full_words": 1603584,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 873,
+ "routing_permutations": 1216,
+ "scalar_permutations": 1216,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 6,
+ "id": 64,
+ "matching_full_words": 9953280,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 873,
+ "routing_permutations": 400,
+ "scalar_permutations": 400,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 65,
+ "matching_full_words": 1133568,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 873,
+ "routing_permutations": 1392,
+ "scalar_permutations": 1392,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 6,
+ "id": 66,
+ "matching_full_words": 3732480,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 873,
+ "routing_permutations": 432,
+ "scalar_permutations": 432,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 9,
+ "id": 67,
+ "matching_full_words": 72448,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 7952,
+ "scalar_permutations": 7952,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 68,
+ "matching_full_words": 123648,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 5408,
+ "scalar_permutations": 5408,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 69,
+ "matching_full_words": 227968,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 3248,
+ "scalar_permutations": 3248,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 70,
+ "matching_full_words": 288768,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 3216,
+ "scalar_permutations": 3216,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 71,
+ "matching_full_words": 205184,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 5312,
+ "scalar_permutations": 5312,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 72,
+ "matching_full_words": 726400,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 2000,
+ "scalar_permutations": 2000,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 73,
+ "matching_full_words": 903936,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 1984,
+ "scalar_permutations": 1984,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 74,
+ "matching_full_words": 268800,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 3520,
+ "scalar_permutations": 3520,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 75,
+ "matching_full_words": 502272,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 2144,
+ "scalar_permutations": 2144,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 76,
+ "matching_full_words": 1179648,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 1280,
+ "scalar_permutations": 1280,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 77,
+ "matching_full_words": 187648,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 4608,
+ "scalar_permutations": 4608,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 78,
+ "matching_full_words": 320000,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 2544,
+ "scalar_permutations": 2544,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 79,
+ "matching_full_words": 602112,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 25011,
+ "routing_permutations": 1344,
+ "scalar_permutations": 1344,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 8,
+ "id": 80,
+ "matching_full_words": 177664,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 20493,
+ "routing_permutations": 3680,
+ "scalar_permutations": 3680,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 81,
+ "matching_full_words": 602112,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 20493,
+ "routing_permutations": 1344,
+ "scalar_permutations": 1344,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 82,
+ "matching_full_words": 768000,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 20493,
+ "routing_permutations": 1248,
+ "scalar_permutations": 1248,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 83,
+ "matching_full_words": 732672,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 20493,
+ "routing_permutations": 1536,
+ "scalar_permutations": 1536,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 6,
+ "id": 84,
+ "matching_full_words": 3732480,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 20493,
+ "routing_permutations": 432,
+ "scalar_permutations": 432,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 7,
+ "id": 85,
+ "matching_full_words": 434176,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 20493,
+ "routing_permutations": 1648,
+ "scalar_permutations": 1648,
+ "suffix_assignments": 279936
+ },
+ {
+ "W": 6,
+ "id": 86,
+ "matching_full_words": 1544704,
+ "nonroutable_scalar_permutation": false,
+ "prefix_assignments": 279936,
+ "prefix_keys": 20493,
+ "routing_permutations": 432,
+ "scalar_permutations": 432,
+ "suffix_assignments": 279936
+ }
+ ],
+ "scope": "All 87 chronological balanced-Fano stub reuses; all local GL(2,F2) gates; every full output permutation, including arbitrary auxiliary/data exchanges. This does not cover vector gates or other graphs.",
+ "status": "ALL COMPLETED SCALAR PERMUTATIONS ARE ROUTABLE IN THIS FINITE FAMILY",
+ "topologies": 87,
+ "topology_specification_sha256": "c423c71fd035fbb6b0428163b87680939eb3a6596962082e39d0823f3e3183b2",
+ "width_counts": {
+ "6": 4,
+ "7": 32,
+ "8": 38,
+ "9": 12,
+ "10": 1
+ }
+}
diff --git a/research/percent-exponent-architecture/fano-reuse-certificate.json b/research/percent-exponent-architecture/fano-reuse-certificate.json
new file mode 100644
index 0000000000..fac670e9bf
--- /dev/null
+++ b/research/percent-exponent-architecture/fano-reuse-certificate.json
@@ -0,0 +1,2128 @@
+{
+ "cases": [
+ {
+ "scalar_exhaustion": {
+ "W": 10,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 258156,
+ "prefix_sha256": "b34379c5feeb67216fb7531294f13da5f67ce4a22f92b94ff8ea2b26f3aa21ec",
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "a19c1f14c463451e7bdd0900a2aeae701d98bcee790e9145d70e05c316555c38",
+ "witness": null
+ },
+ "topology": {
+ "W": 10,
+ "id": 0,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 3,
+ 8
+ ]
+ ],
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [],
+ "routing": {
+ "prescribed_destination": [
+ 7,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 413,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 9,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 258156,
+ "prefix_sha256": "efc6209f40f81fbe06965bd6ec20901497e07ac7d3c3e01c3c8ac75a33e939c9",
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "55886af3abe760674a3d538ef43559a247469f162c10718676a8792bbfa9ec88",
+ "witness": null
+ },
+ "topology": {
+ "W": 9,
+ "id": 3,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 4
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 3,
+ 8
+ ]
+ ],
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 4,
+ "from_vertex": "u5",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 7,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 319,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 9,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 258156,
+ "prefix_sha256": "efc6209f40f81fbe06965bd6ec20901497e07ac7d3c3e01c3c8ac75a33e939c9",
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "8ab1597800673b81fef726004e7fb56e4261228f07bee6ce19cbcf6d16e53414",
+ "witness": null
+ },
+ "topology": {
+ "W": 9,
+ "id": 4,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 6
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 3,
+ 8
+ ]
+ ],
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 6,
+ "from_vertex": "u6",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 7,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 313,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 9,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 258156,
+ "prefix_sha256": "efc6209f40f81fbe06965bd6ec20901497e07ac7d3c3e01c3c8ac75a33e939c9",
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "f7f40358230ec476f2d199c3f0eb9a100006afdb131c0836ce895850b4a1bf7b",
+ "witness": null
+ },
+ "topology": {
+ "W": 9,
+ "id": 13,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 9
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 4,
+ 8
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 3,
+ 4
+ ]
+ ],
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 4,
+ "from_vertex": "u5",
+ "to_role": 8,
+ "to_vertex": "u7"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 7,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 303,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 8,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 258156,
+ "prefix_sha256": "c0abd91329d32175dca935c243ad0f996e723da4076554dc37278ea897efb902",
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "eb023aa402f0722c242d41989828b5e027b2a272654a61832ef17a48f38c04cc",
+ "witness": null
+ },
+ "topology": {
+ "W": 8,
+ "id": 16,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 4,
+ 6
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ]
+ ],
+ "prescribed": {
+ "0": 7,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 4,
+ "from_vertex": "u5",
+ "to_role": 8,
+ "to_vertex": "u7"
+ },
+ {
+ "from_role": 6,
+ "from_vertex": "u6",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 7,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 216,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 9,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 44181,
+ "prefix_sha256": "d4030c203902fbc56a370dc8bd278611633e7081d38ed94613a7e52bcb352232",
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "22f4b7126d689e11fca1614ea3b2ee85019bdee86c0f37fcdbd6283d80b92b98",
+ "witness": null
+ },
+ "topology": {
+ "W": 9,
+ "id": 34,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8,
+ 9
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 2,
+ 7,
+ 8
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 7,
+ "to_vertex": "u4"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 2,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 336,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 8,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 44181,
+ "prefix_sha256": "531b7872b128b783a283c729a8b50d242e2c2a382b2e456f1f3d00fdd00c1622",
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "9b1dd257806b8f2d8cfd9b12d6d34f3e86477f9a57b361a26c1ab534347f88c4",
+ "witness": null
+ },
+ "topology": {
+ "W": 8,
+ "id": 36,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 2,
+ 7,
+ 4
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 7,
+ "to_vertex": "u4"
+ },
+ {
+ "from_role": 4,
+ "from_vertex": "u5",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 2,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 242,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 8,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 44181,
+ "prefix_sha256": "531b7872b128b783a283c729a8b50d242e2c2a382b2e456f1f3d00fdd00c1622",
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "d1a4d6590ce080244d93ed469bebc3321784d635a3ec470efcc943673984f0d0",
+ "witness": null
+ },
+ "topology": {
+ "W": 8,
+ "id": 37,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 2,
+ 7,
+ 6
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 7,
+ "to_vertex": "u4"
+ },
+ {
+ "from_role": 6,
+ "from_vertex": "u6",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 2,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 240,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 8,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 44181,
+ "prefix_sha256": "531b7872b128b783a283c729a8b50d242e2c2a382b2e456f1f3d00fdd00c1622",
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "6ae7f0465a498692a8577d442031b761a2ba9eb670b2637eb08a15b528f50faa",
+ "witness": null
+ },
+ "topology": {
+ "W": 8,
+ "id": 41,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 9
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 2,
+ 4,
+ 7
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ]
+ ],
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 7,
+ "to_vertex": "u4"
+ },
+ {
+ "from_role": 4,
+ "from_vertex": "u5",
+ "to_role": 8,
+ "to_vertex": "u7"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 2,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 234,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 7,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 44181,
+ "prefix_sha256": "bdf51bb6d89a9be2ef6735a8204f5e84eb11c986c4af6b94af0d212449bfcff2",
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "ee0efcd60581fed7fe9497278b1dab0d99a3c397554632be89c0846d1b99d575",
+ "witness": null
+ },
+ "topology": {
+ "W": 7,
+ "id": 43,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 2,
+ 4,
+ 6
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ]
+ ],
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 7,
+ "to_vertex": "u4"
+ },
+ {
+ "from_role": 4,
+ "from_vertex": "u5",
+ "to_role": 8,
+ "to_vertex": "u7"
+ },
+ {
+ "from_role": 6,
+ "from_vertex": "u6",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 2,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 158,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 9,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 44181,
+ "prefix_sha256": "f1f86b3b3682911d1644451e40c162d286eb8b265133087cca5c2d9b78adbcb8",
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "eda055fb37dcfd685f5b43f6698f2b2c1d2f193b1f9ca8f09d96444daff97a74",
+ "witness": null
+ },
+ "topology": {
+ "W": 9,
+ "id": 47,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 8,
+ 9
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 1,
+ 6,
+ 7,
+ 8
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 1,
+ "from_vertex": "u1",
+ "to_role": 6,
+ "to_vertex": "u3"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 6,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 362,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 8,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 44181,
+ "prefix_sha256": "b27cfb99491a9f1090d01efed26f15b5af9f5cd0d505fa2eba9e7d228de40fcf",
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "d1c1ea4b57f47d4dbbf57168ab560dd1e8fa29ba16d7b0ad4ac7b4d0abaea77d",
+ "witness": null
+ },
+ "topology": {
+ "W": 8,
+ "id": 50,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 1,
+ 6,
+ 7,
+ 1
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 1,
+ "from_vertex": "u1",
+ "to_role": 6,
+ "to_vertex": "u3"
+ },
+ {
+ "from_role": 6,
+ "from_vertex": "u6",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 6,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 254,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 8,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 7560,
+ "prefix_sha256": "b6eeb5263b08f093f8022d161ab0062bbb71dd7c61baff81496cbb8c9a7c4b1c",
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "0a6dc4127dbd3baafed8411d99bb0228f1e646d5676f3b7ab967d647c0658d89",
+ "witness": null
+ },
+ "topology": {
+ "W": 8,
+ "id": 60,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 8,
+ 9
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 1,
+ 2,
+ 6,
+ 7
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 6
+ ]
+ ],
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 1,
+ "from_vertex": "u1",
+ "to_role": 6,
+ "to_vertex": "u3"
+ },
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 7,
+ "to_vertex": "u4"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 2,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 276,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 7,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 7560,
+ "prefix_sha256": "45a9842f5becb39c9b4485389003ec502eba980337aafdb8460af1cd4b8c7391",
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "902181daa3f0d66b663bbb340ed4ce8b20ec59837ab51ce98549ca5906cbf404",
+ "witness": null
+ },
+ "topology": {
+ "W": 7,
+ "id": 62,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 8
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 1,
+ 2,
+ 6,
+ 1
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ]
+ ],
+ "prescribed": {
+ "0": 2,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 1,
+ "from_vertex": "u1",
+ "to_role": 6,
+ "to_vertex": "u3"
+ },
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 7,
+ "to_vertex": "u4"
+ },
+ {
+ "from_role": 6,
+ "from_vertex": "u6",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 2,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 184,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 9,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 231939,
+ "prefix_sha256": "7458afe3e4843fb4b5fb4ade9b2eeef9f7141e1193db11b908fc526dcbd7b098",
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "1b2dc695600aede6e6c31cc71f48b9cab3b5240048523826f54e4a98dbf65051",
+ "witness": null
+ },
+ "topology": {
+ "W": 9,
+ "id": 67,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 8,
+ 9
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 2,
+ 6,
+ 7,
+ 8
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 6,
+ "to_vertex": "u3"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 6,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 386,
+ "routable": false
+ }
+ }
+ },
+ {
+ "scalar_exhaustion": {
+ "W": 8,
+ "exhaustive_negative": true,
+ "exists": false,
+ "full_assignment_count": 78364164096,
+ "gates": 14,
+ "prefix_assignments": 279936,
+ "prefix_keys": 231939,
+ "prefix_sha256": "8551d47c14617a0c1b544f9a48d8c778f491ef0cfd3982b3c55bcd30f9f866d2",
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "scope": "Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.",
+ "split": 7,
+ "suffix_assignments": 279936,
+ "suffix_sha256": "89dd511fb3101845a6774c19ba777383117d8fdc72cc5cfebbde6bc2ff5f1ee4",
+ "witness": null
+ },
+ "topology": {
+ "W": 8,
+ "id": 70,
+ "independent_original_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "old_to_new_roles": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 2,
+ 6,
+ 7,
+ 2
+ ],
+ "pairs": [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ "prescribed": {
+ "0": 6,
+ "1": 0,
+ "2": 3
+ },
+ "reuse": [
+ {
+ "from_role": 2,
+ "from_vertex": "u2",
+ "to_role": 6,
+ "to_vertex": "u3"
+ },
+ {
+ "from_role": 6,
+ "from_vertex": "u6",
+ "to_role": 9,
+ "to_vertex": "u8"
+ }
+ ],
+ "routing": {
+ "prescribed_destination": [
+ 6,
+ 0,
+ 3
+ ],
+ "reachable_token_placements": 266,
+ "routable": false
+ }
+ }
+ }
+ ],
+ "obstruction_preserving_topologies": 16,
+ "other_topologies": 71,
+ "scope": "Chronological pairings of distinct auxiliary output/input stubs of the balanced Fano DAG, retaining the original three-demand obstruction; GL(2,F2) at each of 14 vertices; all other inputs independent with a free output permutation. Other topologies, larger local blocks and different coding graphs are not excluded.",
+ "status": "NO SCALAR COMPLETION IN THE SPECIFIED OBSTRUCTION-PRESERVING REUSE FAMILY",
+ "topologies_enumerated": 87,
+ "width_counts": {
+ "7": 2,
+ "8": 7,
+ "9": 6,
+ "10": 1
+ }
+}
diff --git a/research/percent-exponent-architecture/fano_reuse_verify.py b/research/percent-exponent-architecture/fano_reuse_verify.py
new file mode 100644
index 0000000000..8e0208ca88
--- /dev/null
+++ b/research/percent-exponent-architecture/fano_reuse_verify.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+"""Replay the whole finite stub-reuse screen without a solver or C++.
+
+The complete negative statements below apply only to reuse topologies that
+preserve the original three-demand routing obstruction. The other topologies
+are recorded as outside this particular selection, not proved impossible.
+"""
+from __future__ import annotations
+
+import argparse
+from collections import Counter
+import json
+from pathlib import Path
+import sys
+
+HERE = Path(__file__).resolve().parent
+sys.path.insert(0, str(HERE / "discovery"))
+from fano_reuse import topologies
+from balanced_fano import existence
+
+
+def verify():
+ if sys.flags.optimize:
+ raise ValueError("Run without -O")
+ cases = list(topologies())
+ accepted = [c for c in cases if not c["routing"]["routable"]]
+ if len(cases) != 87 or len(accepted) != 16:
+ raise ValueError("The exhaustively specified topology family changed")
+ certificates = []
+ for i, c in enumerate(accepted):
+ result = existence(c["W"], c["pairs"], c["prescribed"])
+ if result["exists"] or not result["exhaustive_negative"]:
+ raise ValueError("A scalar completion needs further investigation")
+ if result["prefix_assignments"] != 6**7 or result["suffix_assignments"] != 6**7:
+ raise ValueError("The complete halves were not enumerated")
+ certificates.append({"topology": c, "scalar_exhaustion": result})
+ print(f"PASS {i+1}/{len(accepted)}: case {c['id']}, W={c['W']}, all 6^14 assignments excluded", flush=True)
+ return {"status": "NO SCALAR COMPLETION IN THE SPECIFIED OBSTRUCTION-PRESERVING REUSE FAMILY",
+ "topologies_enumerated": len(cases), "obstruction_preserving_topologies": len(accepted),
+ "other_topologies": len(cases) - len(accepted),
+ "width_counts": dict(sorted(Counter(c["W"] for c in accepted).items())),
+ "cases": certificates,
+ "scope": "Chronological pairings of distinct auxiliary output/input stubs of the balanced Fano DAG, retaining the original three-demand obstruction; GL(2,F2) at each of 14 vertices; all other inputs independent with a free output permutation. Other topologies, larger local blocks and different coding graphs are not excluded."}
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--write", action="store_true")
+ args = parser.parse_args()
+ output = json.dumps(verify(), sort_keys=True, indent=2) + "\n"
+ path = HERE / "fano-reuse-certificate.json"
+ if args.write:
+ path.write_text(output)
+ elif path.read_text() != output:
+ raise ValueError("Exact Fano reuse certificate changed")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/research/percent-exponent-architecture/inputs/bit-pr187.json b/research/percent-exponent-architecture/inputs/bit-pr187.json
new file mode 100644
index 0000000000..1a00656788
--- /dev/null
+++ b/research/percent-exponent-architecture/inputs/bit-pr187.json
@@ -0,0 +1,53 @@
+{
+ "profile": {
+ "W": 21108,
+ "child_histogram": {
+ "1": 120168,
+ "10": 2508,
+ "11": 1158,
+ "12": 4320,
+ "13": 1590,
+ "14": 3234,
+ "15": 1230,
+ "16": 3216,
+ "17": 1164,
+ "18": 1332,
+ "19": 918,
+ "2": 64228,
+ "20": 5280,
+ "21": 11160,
+ "22": 11952,
+ "3": 29616,
+ "4": 8970,
+ "5": 7800,
+ "6": 3660,
+ "60": 2200,
+ "7": 3312,
+ "8": 2802,
+ "9": 1812
+ },
+ "deficit": 1936,
+ "h": 24,
+ "loss": 528,
+ "m": 72,
+ "rank": 1517840,
+ "source_data_histogram": {
+ "1": 1760,
+ "2": 880,
+ "20": 880,
+ "22": 880
+ },
+ "target_data_histogram": {
+ "1": 4400,
+ "20": 880,
+ "21": 880
+ },
+ "v": 1760
+ },
+ "provenance": {
+ "commit": "201737a1ec4f936e166e2481fb9e88104cb2ccc7",
+ "path": "research/source-assisted-bit-bootstrap/emitted-physical.json",
+ "pr": 187,
+ "source_file_sha256": "5f1f1d978937b816a14b07fee5ac8fc31f3a9aaf05046a477e8be57bb6d07ce6"
+ }
+}
diff --git a/research/percent-exponent-architecture/inputs/complex-pr193.json b/research/percent-exponent-architecture/inputs/complex-pr193.json
new file mode 100644
index 0000000000..550d0ca928
--- /dev/null
+++ b/research/percent-exponent-architecture/inputs/complex-pr193.json
@@ -0,0 +1,49 @@
+{
+ "profile": {
+ "W": 12052,
+ "child_histogram": {
+ "1": 87534,
+ "10": 2790,
+ "11": 1062,
+ "12": 3591,
+ "13": 381,
+ "14": 2226,
+ "15": 5637,
+ "16": 264,
+ "17": 243,
+ "18": 7959,
+ "19": 501,
+ "2": 39834,
+ "20": 66,
+ "3": 29769,
+ "4": 12627,
+ "5": 5850,
+ "6": 4815,
+ "7": 2118,
+ "8": 4593,
+ "9": 1287
+ },
+ "deficit": 1320,
+ "h": 22,
+ "loss": 440,
+ "m": 66,
+ "rank": 794112,
+ "source_data_histogram": {
+ "1": 1320,
+ "18": 1320,
+ "2": 1320
+ },
+ "target_data_histogram": {
+ "0": 6270,
+ "1": 3960,
+ "18": 1320
+ },
+ "v": 1320
+ },
+ "provenance": {
+ "commit": "187e1010ac8b259af8e9b5166f68b64bc27b4b47",
+ "path": "research/source-assisted-v4/certificate.json",
+ "pr": 193,
+ "source_file_sha256": "d84406d2fcc6990deba2b135509e6d86600e57123d88f9b21f7b7240e1aeb513"
+ }
+}
diff --git a/research/percent-exponent-architecture/references/SOURCE.json b/research/percent-exponent-architecture/references/SOURCE.json
new file mode 100644
index 0000000000..f0df4a2be3
--- /dev/null
+++ b/research/percent-exponent-architecture/references/SOURCE.json
@@ -0,0 +1,8 @@
+{
+ "changes": "Added source/attribution header; replaced two imports by the identical require predicate and FANO_EDGES tuple. Algorithm bodies are unchanged.",
+ "commit": "187e1010ac8b259af8e9b5166f68b64bc27b4b47",
+ "files": {
+ "scripts/experiments/balanced_fano.py": "1586fb1db4f40e79e97bae59f47192675663403bbcacbf5f4e0b702edfd22b0a",
+ "scripts/experiments/fano_completion.py": "6cade2a36b910bf7e68a872dc4fd3560837935cffe80f9526cd012a28b247738"
+ }
+}
diff --git a/research/percent-exponent-architecture/references/balanced_fano.py b/research/percent-exponent-architecture/references/balanced_fano.py
new file mode 100644
index 0000000000..d7369878e2
--- /dev/null
+++ b/research/percent-exponent-architecture/references/balanced_fano.py
@@ -0,0 +1,130 @@
+# Derived from CrocSwap/integer-mult-bounds scripts/experiments/balanced_fano.py.
+# Apache-2.0; original repository attribution retained in ../NOTICE.
+# Only dependency bindings are adapted: require and the original edge tuple are local.
+"""Balance the Fano DAG, then exhaust the local reversible binary model.
+
+The meet-in-the-middle algorithm tests existence with a free permutation of
+unprescribed roles. Keeping one prefix per key is sufficient for existence,
+but not for enumerating all possible complete words or output permutations.
+"""
+from hashlib import sha256
+
+def require(condition, message):
+ if not condition:
+ raise ValueError(message)
+
+
+FANO_EDGES = (('a', 'u1'), ('a', 'tc'), ('b', 'u1'), ('b', 'u2'), ('c', 'u2'), ('c', 'u6'), ('u1', 'u3'), ('u2', 'u4'), ('u3', 'u5'), ('u3', 'u6'), ('u4', 'u5'), ('u4', 'ta'), ('u5', 'u7'), ('u6', 'u8'), ('u7', 'u9'), ('u7', 'tc'), ('u8', 'u9'), ('u8', 'ta'), ('u9', 'u10'), ('u10', 'tb'))
+
+
+GL2 = ((1, 2), (2, 1), (1, 3), (3, 2), (2, 3), (3, 1))
+
+
+def balanced_fano():
+ order = ('a', 'b', 'c', 'u1', 'u2', 'u3', 'u4', 'u5', 'u6', 'u7', 'u8', 'u9', 'u10', 'ta', 'tb', 'tc')
+ source = {'a': 0, 'b': 1, 'c': 2}
+ edge_roles = {}; next_role = 3; pairs = []; gates_at = []
+ auxiliary_inputs = []; auxiliary_outputs = []; targets = {}
+ for vertex in order:
+ incoming = [i for i, (u, v) in enumerate(FANO_EDGES) if v == vertex]
+ outgoing = [i for i, (u, v) in enumerate(FANO_EDGES) if u == vertex]
+ roles = [edge_roles[i] for i in incoming]
+ if vertex in source: roles.append(source[vertex])
+ output_count = len(outgoing)+int(vertex in ('ta', 'tb', 'tc'))
+ width = max(len(roles), output_count)
+ require(width in (1, 2), 'Unexpected local width')
+ while len(roles) < width:
+ auxiliary_inputs.append((vertex, next_role))
+ roles.append(next_role); next_role += 1
+ if width == 2:
+ pairs.append(tuple(roles)); gates_at.append(vertex)
+ for edge, role in zip(outgoing, roles): edge_roles[edge] = role
+ occupied = len(outgoing)
+ if vertex in ('ta', 'tb', 'tc'):
+ targets[vertex] = roles[occupied]; occupied += 1
+ auxiliary_outputs.extend((vertex, r) for r in roles[occupied:])
+ require(next_role == 10 and len(pairs) == 14, 'Wrong balanced model size')
+ outputs = list(targets.values())+[r for v, r in auxiliary_outputs]
+ require(sorted(outputs) == list(range(next_role)), 'Output roles are not a partition')
+ return dict(W=next_role, pairs=pairs, gate_vertices=gates_at,
+ prescribed={0: targets['ta'], 1: targets['tb'], 2: targets['tc']},
+ auxiliary_inputs=auxiliary_inputs, auxiliary_outputs=auxiliary_outputs,
+ edge_roles=[edge_roles[i] for i in range(len(FANO_EDGES))])
+
+
+def execute(W, pairs, choices):
+ require(len(pairs) == len(choices), 'One choice per gate required')
+ rows = [1 << i for i in range(W)]
+ for (a, b), k in zip(pairs, choices):
+ values = (0, rows[a], rows[b], rows[a]^rows[b])
+ x, y = GL2[k]
+ rows[a], rows[b] = values[x], values[y]
+ return tuple(rows)
+
+
+def columns(rows):
+ W = len(rows)
+ return tuple(sum(((row >> j) & 1) << i for i, row in enumerate(rows)) for j in range(W))
+
+
+def assignments(W, pairs):
+ pairs = tuple(pairs)
+ def descend(depth, rows, word):
+ if depth == len(pairs):
+ yield rows, word
+ return
+ a, b = pairs[depth]; x, y = rows[a], rows[b]
+ values = (0, x, y, x^y)
+ for k, (s, t) in enumerate(GL2):
+ new = list(rows); new[a] = values[s]; new[b] = values[t]
+ yield from descend(depth+1, tuple(new), word+(k,))
+ yield from descend(0, tuple(1 << i for i in range(W)), ())
+
+
+def inverse_choice(k):
+ for j in range(6):
+ if execute(2, [(0, 1), (0, 1)], [k, j]) == (1, 2): return j
+ raise ValueError('GL2 inverse missing')
+
+
+def existence(W, pairs, prescribed=None, half_budget=300000):
+ """Exact complete search, not a heuristic or solver-unsat certificate."""
+ prescribed = dict(prescribed or {})
+ require(W >= 2 and all(0 <= i < W and 0 <= j < W for i, j in prescribed.items()), 'Invalid fixed terminals')
+ require(len(set(prescribed.values())) == len(prescribed), 'Fixed terminal outputs repeat')
+ require(all(len(p) == 2 and p[0] != p[1] and all(0 <= i < W for i in p) for p in pairs), 'Invalid ports')
+ split = len(pairs)//2
+ require(max(6**split, 6**(len(pairs)-split)) <= half_budget, 'Half-enumeration budget exceeded')
+ source_fixed = tuple(sorted(prescribed))
+ output_fixed = tuple(prescribed[i] for i in source_fixed)
+ def key(cols, fixed):
+ return tuple(cols[i] for i in fixed)+tuple(sorted(cols[i] for i in range(W) if i not in fixed))
+ width = (W+7)//8
+ def packed(key): return b''.join(v.to_bytes(width, 'big') for v in key)
+ seen = {}; prefix_hash = sha256(); suffix_hash = sha256(); prefix_count = suffix_count = 0
+ for rows, word in assignments(W, pairs[:split]):
+ k = key(columns(rows), source_fixed)
+ seen.setdefault(k, (rows, word))
+ prefix_hash.update(packed(k)); prefix_count += 1
+ found = None
+ for rows, word in assignments(W, list(reversed(pairs[split:]))):
+ # These are inverse-suffix words. Inversion is a bijection on GL2,
+ # so this enumeration covers every possible suffix exactly once.
+ cols = columns(rows); k = key(cols, output_fixed)
+ suffix_hash.update(packed(k)); suffix_count += 1
+ if k not in seen: continue
+ A, prefix_word = seen[k]
+ rho = tuple(cols.index(c) for c in columns(A))
+ suffix_word = tuple(inverse_choice(j) for j in reversed(word))
+ full_word = prefix_word+suffix_word
+ transfer = execute(W, pairs, full_word)
+ require(all(transfer[rho[i]] == 1 << i for i in range(W)), 'Recovered scalar permutation is wrong')
+ require(all(rho[i] == j for i, j in prescribed.items()), 'Recovered terminals are wrong')
+ found = dict(choices=full_word, rho=rho)
+ break
+ return dict(W=W, gates=len(pairs), split=split, prescribed=prescribed,
+ prefix_assignments=prefix_count, prefix_keys=len(seen), suffix_assignments=suffix_count,
+ prefix_sha256=prefix_hash.hexdigest(), suffix_sha256=suffix_hash.hexdigest(),
+ full_assignment_count=6**len(pairs), exists=found is not None,
+ exhaustive_negative=found is None, witness=found,
+ scope='Existence with a free permutation of unprescribed roles; not an enumeration of every matching circuit.')
diff --git a/research/percent-exponent-architecture/test_audit.py b/research/percent-exponent-architecture/test_audit.py
new file mode 100644
index 0000000000..49a8f9839b
--- /dev/null
+++ b/research/percent-exponent-architecture/test_audit.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+"""Adverse controls for exact arithmetic, independent inputs and frame screens."""
+from fractions import Fraction as Q
+import json
+from pathlib import Path
+import tempfile
+import unittest
+from unittest.mock import patch
+
+import audit
+from triangular_obstruction import inverse, matrix, multiply, rejection
+
+
+class ExactAuditTests(unittest.TestCase):
+ def test_log_enclosures_against_longer_series(self):
+ for x in (Q(1), Q(6, 5), Q(2), Q(3), Q(66), Q(72, 22)):
+ lo, hi = audit.log_interval(x)
+ y, power = x, 0
+ while y >= 2:
+ y /= 2
+ power += 1
+ l, u = audit.atanh_log(y, terms=65)
+ l2, u2 = audit.atanh_log(Q(2), terms=65)
+ self.assertLessEqual(lo, l + power * l2)
+ self.assertGreaterEqual(hi, u + power * u2)
+ self.assertLessEqual(hi - lo, Q(2, audit.GRID))
+
+ def test_checkpoint_corruption_rejected(self):
+ original = json.loads((audit.HERE / "inputs/complex-pr193.json").read_text())
+ for field in ("rank", "loss"):
+ changed = json.loads(json.dumps(original))
+ changed["profile"][field] -= 1
+ with tempfile.TemporaryDirectory() as directory:
+ root = Path(directory)
+ (root / "inputs").mkdir()
+ (root / "inputs/complex-pr193.json").write_text(json.dumps(changed))
+ with patch.object(audit, "HERE", root), self.assertRaises(ValueError):
+ audit.checkpoint("complex-pr193")
+
+ def test_cube_kernel_beyond_frozen_controls(self):
+ result = audit.local_identity(9)
+ self.assertEqual(result["B_rank"], 256)
+ self.assertEqual(result["opposite_parity_source_rank"], 9)
+
+ def test_infinite_tail_excludes_target(self):
+ result = audit.family_screen()
+ self.assertLess(Q(result["strict_arbitrary_local_chains_a_ceiling"]), Q(1, 100))
+ self.assertEqual(result["best_arbitrary_local_chains_case"]["p"], 13)
+ self.assertEqual(result["best_arbitrary_local_chains_case"]["degree"], 5)
+
+ def test_common_flag_need_not_commute(self):
+ upper = [matrix([[1, 1], [0, 0]]), matrix([[0, 2], [0, 1]])]
+ basis = matrix([[1, 1], [1, 2]])
+ inv = inverse(basis)
+ frames = [multiply(multiply(basis, a), inv) for a in upper]
+ self.assertFalse(rejection(frames)["rejected"])
+ self.assertTrue(rejection(frames, basis)["rejected"])
+ with self.assertRaises(ValueError):
+ rejection(frames, [[1, 0], [0, 1]])
+
+ def test_commuting_without_rational_eigenbasis(self):
+ rotation = [[0, -1], [1, 0]]
+ translated = [[1, -1], [1, 1]]
+ self.assertTrue(rejection([rotation, translated])["rejected"])
+ with self.assertRaises(ValueError):
+ rejection([rotation], [[1, 0], [0, 1]])
+
+ def test_nontriangular_family_is_only_inconclusive(self):
+ frames = [[[1, 0], [0, 0]], [[Q(1, 2), Q(1, 2)], [Q(1, 2), Q(1, 2)]]]
+ self.assertFalse(rejection(frames)["rejected"])
+ with self.assertRaises(ValueError):
+ rejection(frames, [[1, 0], [0, 1]])
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/research/percent-exponent-architecture/triangular_obstruction.py b/research/percent-exponent-architecture/triangular_obstruction.py
new file mode 100644
index 0000000000..a4eb402499
--- /dev/null
+++ b/research/percent-exponent-architecture/triangular_obstruction.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python3
+"""Exact sufficient rejection checks for a common triangular frame flag.
+
+The written theorem applies over any characteristic-zero splitting field.
+The explicit-basis check uses rational arithmetic; commuting rational frames
+are covered even when their common triangularizing basis is not rational.
+"""
+from __future__ import annotations
+
+from fractions import Fraction as Q
+from itertools import combinations
+
+
+def matrix(a):
+ n = len(a)
+ if not n or any(len(row) != n for row in a):
+ raise ValueError("Square nonempty matrices required")
+ if any(isinstance(v, float) for row in a for v in row):
+ raise ValueError("Use exact entries")
+ return tuple(tuple(Q(v) for v in row) for row in a)
+
+
+def multiply(a, b):
+ if len(a) != len(b):
+ raise ValueError("Dimensions differ")
+ n = len(a)
+ return tuple(tuple(sum((a[i][k] * b[k][j] for k in range(n)), Q(0))
+ for j in range(n)) for i in range(n))
+
+
+def inverse(a):
+ n = len(a)
+ rows = [list(a[i]) + [Q(i == j) for j in range(n)] for i in range(n)]
+ for j in range(n):
+ pivot = next((i for i in range(j, n) if rows[i][j]), None)
+ if pivot is None:
+ raise ValueError("Singular common basis")
+ rows[j], rows[pivot] = rows[pivot], rows[j]
+ scale = rows[j][j]
+ rows[j] = [v / scale for v in rows[j]]
+ for i in range(n):
+ if i != j and rows[i][j]:
+ scale = rows[i][j]
+ rows[i] = [x - scale * y for x, y in zip(rows[i], rows[j])]
+ return tuple(tuple(row[n:]) for row in rows)
+
+
+def rejection(frames, basis=None):
+ frames = tuple(dict.fromkeys(matrix(a) for a in frames))
+ if not frames or any(len(a) != len(frames[0]) for a in frames):
+ raise ValueError("Nonempty common-dimensional frame family required")
+ n = len(frames[0])
+ if basis is not None:
+ basis = matrix(basis)
+ if len(basis) != n:
+ raise ValueError("Wrong common basis dimension")
+ inv = inverse(basis)
+ changed = [multiply(multiply(inv, a), basis) for a in frames]
+ if any(a[i][j] for a in changed for i in range(n) for j in range(i)):
+ raise ValueError("The supplied common basis does not triangularize every frame")
+ return {"rejected": True, "reason": "Exact common triangularizing basis",
+ "unique_frames": len(frames), "rank_lower_bound": "W*m"}
+ commuting = all(multiply(a, b) == multiply(b, a) for a, b in combinations(frames, 2))
+ return {"rejected": commuting,
+ "reason": "Pairwise commuting frames" if commuting else "This sufficient screen is inconclusive",
+ "unique_frames": len(frames), "rank_lower_bound": "W*m" if commuting else None}
diff --git a/research/percent-exponent-architecture/verify.py b/research/percent-exponent-architecture/verify.py
new file mode 100644
index 0000000000..af85ad7f72
--- /dev/null
+++ b/research/percent-exponent-architecture/verify.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python3
+"""Reproduce the exact architecture screens using Python's stdlib and C++17.
+
+No optimizer, network access, supplier checkout or vector-code solver runs.
+--deep adds the independent Python replay of the 16 prescribed-terminal
+negative cases; the default already exhausts all permutations on all 87
+topologies in C++ and checks its matching method against direct enumeration.
+"""
+from __future__ import annotations
+
+import argparse
+from collections import Counter
+from hashlib import sha256
+from itertools import product
+import json
+import os
+from pathlib import Path
+import subprocess
+import sys
+import tempfile
+
+import audit
+import center_basis
+
+HERE = Path(__file__).resolve().parent
+sys.path.insert(0, str(HERE / "discovery"))
+from fano_reuse import topologies
+from balanced_fano import execute
+
+
+def need(condition, message):
+ if not condition:
+ raise ValueError(message)
+
+
+def manifest():
+ paths = [p for p in HERE.rglob("*") if p.is_file() and p.name != "SOURCE.json"
+ and "__pycache__" not in p.parts and p.suffix in (".py", ".cpp", ".md", ".json")]
+ # The reference provenance itself is an input, not this manifest.
+ paths.append(HERE / "references/SOURCE.json")
+ paths.append(HERE / "NOTICE")
+ return {"files": {p.relative_to(HERE).as_posix(): sha256(p.read_bytes()).hexdigest()
+ for p in sorted(set(paths))},
+ "scope": "This self-contained package only; inherited whole-algorithm interfaces are not discharged."}
+
+
+def line(identifier, width, pairs):
+ values = [identifier, width, len(pairs), 0] + [v for pair in pairs for v in pair]
+ return " ".join(map(str, values))
+
+
+def run_binary(binary, cases):
+ text = "\n".join(line(c["id"], c["W"], c["pairs"]) for c in cases) + "\n"
+ done = subprocess.run([str(binary), "--all-permutations"], input=text,
+ text=True, capture_output=True, check=True)
+ rows = [json.loads(s) for s in done.stdout.splitlines()]
+ need([r["id"] for r in rows] == [c["id"] for c in cases], "Missing, duplicate or reordered search case")
+ return rows
+
+
+def brute_control(case):
+ width, pairs = case["W"], case["pairs"]
+ routes = {tuple(range(width))}
+ for a, b in pairs:
+ next_routes = set(routes)
+ for permutation in routes:
+ new = list(permutation)
+ new[a], new[b] = new[b], new[a]
+ next_routes.add(tuple(new))
+ routes = next_routes
+ actual = set()
+ words = 0
+ for choices in product(range(6), repeat=len(pairs)):
+ rows = execute(width, pairs, choices)
+ if sorted(rows) != [1 << j for j in range(width)]:
+ continue
+ words += 1
+ actual.add(tuple(row.bit_length() - 1 for row in rows))
+ return {"routes": len(routes), "scalar_permutations": len(actual),
+ "matching_full_words": words, "outside_routing": bool(actual - routes)}
+
+
+def controls(binary):
+ specs = [(3, []), (3, [(0, 1)]), (4, [(0, 1), (2, 3)]),
+ (4, [(0, 1), (1, 2), (2, 3)]),
+ (4, [(0, 1), (1, 2), (0, 2), (2, 3)]),
+ (4, [(0, 1), (1, 2), (2, 3), (0, 3), (1, 3)]),
+ (5, [(0, 1), (2, 3), (1, 4), (0, 2), (3, 4)]),
+ (5, [(0, 4), (1, 4), (2, 4), (3, 4), (0, 4)])]
+ cases = [{"id": 1000 + i, "W": w, "pairs": pairs} for i, (w, pairs) in enumerate(specs)]
+ results = run_binary(binary, cases)
+ for case, observed in zip(cases, results):
+ expected = brute_control(case)
+ need(observed["routing_permutations"] == expected["routes"], "Routing disagrees with direct enumeration")
+ need(observed["nonroutable_scalar_permutation"] == expected["outside_routing"], "Incorrect routing comparison")
+ if not observed.get("all_permutations_routable"):
+ need(observed["scalar_permutations"] == expected["scalar_permutations"], "Lost scalar permutations")
+ need(observed["matching_full_words"] == expected["matching_full_words"], "Lost matching complete words")
+ return {"direct_full_word_controls": len(cases), "all_passed": True}
+
+
+def all_fano(binary):
+ cases = list(topologies())
+ need(len(cases) == 87, "The finite topology family changed")
+ results = run_binary(binary, cases)
+ for result in results:
+ need(not result["nonroutable_scalar_permutation"], "A nonroutable scalar candidate needs a frame investigation")
+ if not result.get("all_permutations_routable"):
+ need(result["prefix_assignments"] == result["suffix_assignments"] == 6**7,
+ "An enumeration half is incomplete")
+ need(result["scalar_permutations"] == result["routing_permutations"], "Unexpected permutation-set count")
+ return {"status": "ALL COMPLETED SCALAR PERMUTATIONS ARE ROUTABLE IN THIS FINITE FAMILY",
+ "topologies": len(cases), "width_counts": dict(sorted(Counter(c["W"] for c in cases).items())),
+ "topology_specification_sha256": sha256(json.dumps(cases, sort_keys=True).encode()).hexdigest(),
+ "results": results,
+ "scope": "All 87 chronological balanced-Fano stub reuses; all local GL(2,F2) gates; every full output permutation, including arbitrary auxiliary/data exchanges. This does not cover vector gates or other graphs."}
+
+
+def compare(name, value, writing):
+ content = json.dumps(value, sort_keys=True, indent=2) + "\n"
+ path = HERE / name
+ if writing:
+ path.write_text(content)
+ else:
+ need(path.read_text() == content, "Regenerated certificate differs: " + name)
+
+
+def main():
+ need(not sys.flags.optimize, "Run without -O")
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--write", action="store_true")
+ parser.add_argument("--deep", action="store_true")
+ args = parser.parse_args()
+ before = manifest()
+ if not args.write:
+ need(before == json.loads((HERE / "SOURCE.json").read_text()), "Package source closure changed")
+ compare("ceiling-certificate.json", audit.certificate(), args.write)
+ compare("center-basis-certificate.json", center_basis.certificate(), args.write)
+ print("PASS exact data/family ceilings and the sharp rank-minimal center controls", flush=True)
+ env = dict(os.environ, PYTHONDONTWRITEBYTECODE="1")
+ subprocess.run([sys.executable, "-B", str(HERE / "test_audit.py")], check=True, env=env)
+ with tempfile.TemporaryDirectory(prefix="percent-exponent-check-") as directory:
+ binary = Path(directory) / "balanced-search"
+ subprocess.run([os.environ.get("CXX", "c++"), "-std=c++17", "-O3", "-Wall", "-Wextra", "-Werror",
+ str(HERE / "discovery/balanced_search.cpp"), "-o", str(binary)], check=True)
+ compare("enumeration-controls.json", controls(binary), args.write)
+ compare("fano-all-permutations.json", all_fano(binary), args.write)
+ print("PASS all 87 topologies and all scalar permutations; independent full-word controls", flush=True)
+ if args.deep:
+ command = [sys.executable, "-B", str(HERE / "fano_reuse_verify.py")]
+ if args.write:
+ command.append("--write")
+ subprocess.run(command, check=True, env=env)
+ if args.write:
+ (HERE / "SOURCE.json").write_text(json.dumps(manifest(), sort_keys=True, indent=2) + "\n")
+ else:
+ need(manifest() == before, "Verification changed package inputs")
+ print("PASS conditional architecture audit; no new multiplication exponent", flush=True)
+
+
+if __name__ == "__main__":
+ main()