diff --git a/.github/workflows/bit-reuse-147.yml b/.github/workflows/bit-reuse-147.yml new file mode 100644 index 0000000000..6a8d3a27ec --- /dev/null +++ b/.github/workflows/bit-reuse-147.yml @@ -0,0 +1,29 @@ +name: Verify recycled bit registers on the paired-cube bit word + +on: + push: + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + certificate: + runs-on: ubuntu-24.04 + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + python-version: ['3.11', '3.14'] + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + with: + python-version: ${{ matrix.python-version }} + - name: Reproduce PR144, run the ledger, check exact nesting, replay and reprice + run: python3 research/bit-reuse-147/verify.py + - name: Require committed files to remain unchanged + run: git diff --exit-code diff --git a/research/bit-reuse-147/NOTICE b/research/bit-reuse-147/NOTICE new file mode 100644 index 0000000000..aaeb125cab --- /dev/null +++ b/research/bit-reuse-147/NOTICE @@ -0,0 +1,21 @@ +Recycled bit registers on the paired-cube shared cores, 9 October 2026 +Copyright 2026 DaysSky. Apache-2.0. + +Prepared by DaysSky with Anthropic Claude assistance. The contribution is the late read timetable, the hand-off +of dead bit registers to later deferred births on this word, and their verification. No priority over concurrent +work is claimed. + +Credits for what this package uses: + +- icekylinx: #144 and #130 (paired-cube and three-stage cover framework, selected gauges, completed-core ledger, + pricing and assembly), and #104. +- hpst3r (William Porter): #147, terminal elimination on this bit word. Its plan of 1,549 eliminated slots is used + unchanged, and price147.py follows its pricing approach. +- jamesyc (James Chang): #124, the birth-read reuse operation. +- SovereignSteak: #122, terminal accumulator elimination. +- Swapnil Jain: the round-seven deferred bit word and its exact frame tools. +- Zhihao Chen (jacklightChen): the PR97 ledger. +- an664: #128, completed-core sharing. +- gupt1156: #148, the atom exponent 1/2000 reported as a secondary value. + +All inherited licenses, notices and assistance disclosures remain in force and unchanged. diff --git a/research/bit-reuse-147/PROOF.md b/research/bit-reuse-147/PROOF.md new file mode 100644 index 0000000000..03bb202330 --- /dev/null +++ b/research/bit-reuse-147/PROOF.md @@ -0,0 +1,96 @@ +# Recycling dead bit registers at deferred births: argument and scope + +**Setting.** This is the bit branch of the merged #144 (icekylinx), after the terminal elimination of #147 (hpst3r). +Its word is Swapnil Jain's round-seven PR97 word at h = 23: + +- non-deferred and omitted reads at frame 0; +- early V gates, phase 1 and the copied centres; +- deferred reads of the selected slots at their sigma frames, in the inherited readout order; +- late V gates, the rest of L, the output reads, then L^-1 and V^-1 at the full frame. + +#144 charges the resulting chains per vertex in dimension m = 69: auxiliary chain steps, source and target chains and +copied centres, each three times; one gauge child 3 dim(sigma) per selected slot; and 2v endpoint children. +W = 2v + R and the deficit is 2,024 per vertex. #147 deletes 1,549 terminal output slots; that plan is used here +unchanged, as is #144's choice of 9,543 selected gauges. + +**Two changes.** Nothing else in the word moves. + +1. *Reads run late.* The selected reads keep their inherited relative order, but each one is executed as late as + these constraints allow, instead of in one block after phase 1: + - a read precedes the first operation that touches its slot, and that slot's V gate follows the read; + - the V gates of one leaf keep their inherited chain order; + - every read on a target precedes the first redirected write into that target. +2. *Dead registers are reused.* A slot D that is neither an output slot nor a retained centre is never touched + again after its last operation, where it sits at the frame U_D of that operation. For 3,338 pairs (B, D) with D's last operation + before B's read and U_D inside sigma_B, the register of D is moved from U_D to sigma_B and becomes B. B is then a + deferred slot without an entrance gauge. This is jamesyc's #124 birth-read operation, applied to the bit word. + +**Scalar identity.** The inherited identity holds for arbitrary start values of all slots: a slot s with start value +z_s contributes C_{T,s} z_s to target T through L and the root reads, and its read subtracts exactly that, where C is +the exact integer adjoint. + +- Delaying a read does not change what it reads. Until its first operation or V gate, the register holds its start + value, and a read only writes into targets, which nothing reads back. +- For a recycled pair, B's start value is whatever D left behind, a linear form in the data and the other start + values. D's last operation is before the read and B's first operation is after it, so B's read sees that value + and B's own contribution carries the same value with the same coefficients. The two cancel as before. +- D's remaining contributions are unchanged, because no operation reads D after its last operation. +- The inverse pass undoes the register updates (operations and V gates) in exact reverse order, at the full frame. + On a recycled register this removes B's V gate before D's operations are undone. The inherited order, with every + V^-1 after L^-1, would not restore the registers; `verify.py` checks that it fails. + +`word147.complete` runs the literal word on the 23,979 physical registers with every data port, target and +register as its own formal variable, over F2 (bitmasks) and over Z (integer linear forms with the exact integer +coefficients). Every register must end as its own variable and every target as its start variable plus exactly +its defining sum. This check is complete and uses no random vectors. `word147.replay` then runs the word on random +scratch and data, where three tampered words must break the Z identity: a recycled read of the register's entrance +value, a recycled read taken before its donor's last write, and the inherited inverse order. + +**Frames.** Every frame is an original frame key of the PR97 word, so nondegeneracy is inherited. A hand-off is the +difference of two inherited projectors; it adds finitely many rank-witness primes for the fixed prime q of #130's +weighted compiler to avoid, and nothing else. `word147.ledger` +executes the forward word on frame keys. Each scalar gate must find all its registers at one common key, and no +register may retreat in dimension. The check of actual nesting is separate: + +- A move between two keys of one inherited certified chain, in that chain's order, is nested by the pinned audits + (`check_lifted.py` D, `check_frames.py` X and Q) that #144 relies on. Those chains are the original slot chains, + the X chains in their original V order, and the target chains in readout order with positive Z support, ending + at t_T^perp. A subsequence of a nested chain is nested. +- Every other move is checked exactly over Q with integer bases rebuilt by `check_lifted.py`, and both frames are + checked nondegenerate. There are 4,878 such moves: + - 3,338 hand-offs U_D -> sigma_B (993 of them have equal dimension, so the two frames are equal); + - 935 target moves from the last remaining level to a redirected V frame; + - 605 target moves from one eliminated slot's redirected frame to another's V frame. These arise because a + redirected V write now runs just before its slot's first operation rather than in the late-V block. + +Delaying the reads does not reorder any chain. With no elimination and no recycling, the delayed word reproduces +every histogram of #144's row; `verify.py` checks this as a control. + +**Accounting.** #144's ledger (`notes/paired-cube-sharing.tex`) charges a physical role by its entrance gauge and +its frame chain. A recycled register enters with its first occupant's gauge, follows one nested chain to the full +frame, and has its raw value restored, so it satisfies the same completed-core contract. Relative to #147, one pair +(B, D) with d = dim U_D and f = dim sigma_B + +- removes D's final step of rank 23 - d (three copies) and B's gauge child of width 3f; +- adds the hand-off step of rank f - d (three copies); +- lowers W by one. + +The removed rank is 3(23 - d) + 3f and the added rank is 3(f - d), so the mass drops by 69 = m and the deficit stays +2,024. The row is rebuilt from the actual ledger moves (`word147.row`) and priced with #144's own functions +(`price147.py`): `exact_moment`, the full rare-class fallback, the complex certificate, the finite bridge and the +47-constraint assembly. The largest child falls from 66 to 60, which only shortens the recursion depth bound. + +**Scope.** This is a finite conditional construction. Every interface that #144 retains stays an assumption: + +- the unchanged complete scalar word and the inherited rational frame audit of PR97; +- the paired source scheduling and completed-core sharing; +- the uniform recursion, analytic and tape contracts. + +Not established here: + +- The replay runs one core on its own bank, as in #147. That is the premise the shared-core argument uses. +- The pinned PR97 frame audits are relied on, not rerun. +- The plan is one legal choice found by a matching heuristic (`make_plan.py`). No optimality is claimed, and the + certified value does not depend on how the plan was found. +- The headline uses the merged atom exponent 1/1000. The value at 1/2000 (gupt1156's #148) is reported separately + and rests on the retained requirement a_bit < beta < 1 - a_bit. diff --git a/research/bit-reuse-147/README.md b/research/bit-reuse-147/README.md new file mode 100644 index 0000000000..44fe6de1da --- /dev/null +++ b/research/bit-reuse-147/README.md @@ -0,0 +1,71 @@ +# Recycled bit registers on #144's shared cores + +Under the interfaces retained by the merged #144, this package certifies + + T(n) = O(n (log n)^(1 - κ)), κ = 471809569/10^12 = 4.71809569e-4 + +That is +1.54% over #147 (4646633/10^10) and +2.36% over the merged #144 (4609169/10^10). It adds this directory +and one workflow; no existing file changes. + +## What changes + +Only the bit word changes, and #144 is bit-limited. Starting from #147's reduced word: + +- The selected deferred reads keep their order but run as late as the word allows, instead of in one block. +- 3,338 auxiliary registers that are dead (never touched again) are handed to a later deferred slot whose entrance + frame contains the dead register's frame. The recipient's inherited read cancels what the donor left. This is + jamesyc's #124 birth-read operation, applied to the bit word. + +Each hand-off removes one physical role, the donor's final step and the recipient's gauge child, and adds one +shorter step. [PROOF.md](PROOF.md) gives the argument and its scope. + +| | roles R | W per vertex | coarse bit saving | κ | +|---|---|---|---|---| +| #144 (merged) | 28,866 | 32,408 | 4617656/10^10 | 4609169/10^10 | +| #147 | 27,317 | 30,859 | 4655227/10^10 | 4646633/10^10 | +| this package | 23,979 | 27,521 | 472689442/10^12 | **471809569/10^12** | + +The deficit per vertex (2,024) is unchanged. The complex side (4856569/10^10) still has about 2.9% headroom. + +The headline keeps the merged atom exponent 1/1000. At gupt1156's 1/2000 (#148) the same row gives +472026274/10^12 = 4.72026274e-4; `verify.py` checks both. + +Not composed here: Th0rgal's exact min-cut gauge subset (#146). #144's own 9,543 selected gauges are used. + +## Verify + + python3 research/bit-reuse-147/verify.py # stdlib only, about 2 minutes; do not use -O + python3 research/bit-reuse-147/verify.py --all # also re-checks every inherited frame move, about 9 minutes + +`verify.py` runs these checks: + +1. It reproduces #144's coarse saving, stopped saving and κ exactly on #144's own grid. +2. With no elimination and no recycling, the delayed-read word reproduces every histogram of #144's row. +3. It runs the frame ledger of the frozen plan: every scalar gate at one common frame, no register retreating. The + row rebuilt from the actual moves must equal `row.json`. +4. It checks all 4,878 new adjacent frame pairs for exact nesting over Q, with bases rebuilt by `check_lifted.py`. + A control must reject mismatched hand-offs. +5. It runs the literal word on the 23,979 physical registers with all 27,521 inputs as formal variables, over F2 + and over Z, and requires the exact identity. This is complete, with no random vectors. A random replay then + confirms that three tampered words break the identity. +6. It prices the row with #144's assembly (47 constraints, 7 margins); the next grid points are rejected. + +## Files + +- `word147.py`: timetable, literal events, scalar replay, frame ledger and row. +- `frames147.py`: exact integer frame bases and nesting over Q. +- `price147.py`: pricing with #144's `paired_cube_network.py` functions. As in #147, the one relaxed check is the + bit dimension test, which accepts R <= 28866. +- `plan.json`: the eliminated slots (#147's plan, unchanged), the remaining gauge slots and the 3,338 pairs. +- `row.json`, `expected.json`: the resulting row and the certified values. +- `make_plan.py`: how the plan was found (needs numpy and scipy). Verification does not use it. + +## Limits + +- This is a finite conditional construction. Everything #144 retains stays an assumption, and the pinned PR97 + frame audits are relied on, not rerun. +- The replay runs one core on its own bank, as in #147. +- The plan is one legal choice from a matching heuristic. No optimality is claimed. +- The complete `make verify` and the formal targets were not run locally; the fork's CI runs them. + +Credits are in [NOTICE](NOTICE). diff --git a/research/bit-reuse-147/expected.json b/research/bit-reuse-147/expected.json new file mode 100644 index 0000000000..138271dc03 --- /dev/null +++ b/research/bit-reuse-147/expected.json @@ -0,0 +1,5 @@ +{ + "coarse": "236344721/500000000000", + "kappa": "471809569/1000000000000", + "kappa_atom_2000": "236013137/500000000000" +} diff --git a/research/bit-reuse-147/frames147.py b/research/bit-reuse-147/frames147.py new file mode 100644 index 0000000000..a336706b48 --- /dev/null +++ b/research/bit-reuse-147/frames147.py @@ -0,0 +1,72 @@ +"""Exact integer bases of the frames that the recycled word joins in a new order, and exact nesting over Q. + +Stdlib only. Node frames, late-copy intersections and root frames are rebuilt from the pinned PR97 witness with +Swapnil Jain's check_lifted.py machinery, exactly as check_frames.py derives them; sigma and V-leaf frames are the +primitive integer bases of the pinned data file.""" +import sys +from fractions import Fraction +from math import gcd + + +def prim(r): + r = [Fraction(x) for x in r]; den = 1 + for x in r: den = den * x.denominator // gcd(den, x.denominator) + z = [int(x * den) for x in r]; g = 0 + for x in z: g = gcd(g, x) + return [x // g for x in z] if g else z + + +class Exact: + def __init__(self, S, W, folder): + sys.path.insert(0, str(folder)) + import check_lifted as cl + from linalg import null_exact, rank_mod, Q31 + self.S = S; self.h = h = S.h; self.cl = cl; self.null_exact = null_exact; self.rank_mod = rank_mod; self.Q31 = Q31 + pr = cl.Prog(W); bas, dn = cl.spans(pr); self.users = cl.users_of(pr, dn) + fr = self.fr = cl.Frames(pr, dn, bas, self.users); fr.cobases(); d, _ = fr.dims(); self.ld, _ = cl.late_frames(fr, pr, self.users) + assert all(S.node_dims[n] == d[n] for n in pr.act) and len(S.node_dims) == len(pr.act), 'recorded node dimensions' + self.full = [[int(i == j) for j in range(h)] for i in range(h)] + self._basis = {}; self._null = {} + + def ukey(self, n, k): + u = self.users[n][k] + return ('n', u[1]) if u[0] == 'gate' else self.cl.root_key(u) + + def basis(self, key): + if key not in self._basis: + S, fr = self.S, self.fr; kind = key[0] + if kind == 'sigma': B = S.sigma[key[1]] + elif kind == 'v': B = S.vstart[key[1]] + elif kind == '0': B = [] + elif kind == 'F': B = self.full + elif kind == 'out': B = [prim(r) for r in fr.exact_basis(('out', key[2][0], tuple(key[2])))] + elif kind == 'c': + n, lt = key[1], key[2] + B = self.basis(self.ukey(n, lt[-1])) + for kk in reversed(lt[:-1]): B = fr.intersect_exact(self.basis(self.ukey(n, kk)), B) + B = [prim(r) for r in B] + else: B = [prim(r) for r in fr.exact_basis(key)] + assert len(B) == S.dim(key), ('exact dimension', key) + self._basis[key] = B + return self._basis[key] + + def null(self, key): + if key not in self._null: + B = self.basis(key) + self._null[key] = [prim(z) for z in self.null_exact(B, self.h)] if B else self.full + return self._null[key] + + def inside(self, a, b): + """span(a) <= span(b), exactly over Q (integer dot products with an exact integer basis of b's annihilator).""" + A = self.basis(a) + if not A or len(self.basis(b)) == self.h: return True + if len(A) > len(self.basis(b)): return False + return all(sum(x * z for x, z in zip(ra, rz)) == 0 for ra in A for rz in self.null(b)) + + def nondegenerate(self, key): + """G = I - J/9 nondegenerate on the frame: det(9 B G B^T) nonzero mod 2^31-1, hence over Z.""" + B = self.basis(key) + if not B or len(B) == self.h: return True + sm = [sum(b) for b in B] + gram = [[9 * sum(x * y for x, y in zip(a, b)) - sa * sb for b, sb in zip(B, sm)] for a, sa in zip(B, sm)] + return self.rank_mod(gram, self.Q31) == len(B) diff --git a/research/bit-reuse-147/make_plan.py b/research/bit-reuse-147/make_plan.py new file mode 100644 index 0000000000..2c927ee469 --- /dev/null +++ b/research/bit-reuse-147/make_plan.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""Regenerate plan.json: a heavy matching of dead registers to later deferred births. + +Needs numpy and scipy. verify.py does not use this file: it checks the frozen plan directly, so the certified value +does not depend on how the plan was found, and no optimality is claimed. + + elim taken unchanged from the existing plan.json (hpst3r's #147 plan at 29383a28d96b9880edbe59ed930f1da1dd6fdfa6); + level #144's selected gauges that survive the elimination; + donors every remaining slot that is neither an output slot nor a retained centre, at its last frame; + edge donor D -> level slot B when D's last operation precedes B's read in the latest timetable and U_D is + inside sigma_B (screened modulo a prime here, verified exactly over Q by verify.py); + weight the first-order moment saved, 3 phi(23 - d) + phi(3f) - 3 phi(f - d); + matching maximum total weight (scipy.optimize.linear_sum_assignment). +""" +import json +import sys +from pathlib import Path + +import numpy as np +from scipy.optimize import linear_sum_assignment + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +import word147 # noqa: E402 +from frames147 import Exact # noqa: E402 + +PRIME = 1048573 +SAVING = 4.73e-4 + + +def main(): + dr, W, D, S, record, folder = word147.load_schedule() + h, m = S.h, 3 * S.h + sel = json.loads((word147.ROOT / record['selection_file']).read_text()) + elim = json.loads((HERE / 'plan.json').read_text())['elim']; gone = set(elim) + level = [s for s in sel['retained_readout_order'] if s not in gone] + word = word147.Word(S, elim, level, []) + exact = Exact(S, W, folder) + donors = [s for s in range(S.R) if s not in S.out and s not in S.ret and s not in gone] + last = {d: [k for k in S.chain_keys(d) if k[0] != 'F'][-1] for d in donors} + rows, owner = [], [] + for i, d in enumerate(donors): + for r in exact.basis(last[d]): rows.append([x % PRIME for x in r]); owner.append(i) + V = np.array(rows, dtype=np.int64); owner = np.array(owner); size = np.bincount(owner, minlength=len(donors)) + inside = {} + for b in level: + key = tuple(map(tuple, S.sigma[b])) + if key not in inside: + if len(key) == h: inside[key] = np.arange(len(donors)) + else: + N = np.array([[x % PRIME for x in z] for z in exact.null(('sigma', b))], dtype=np.int64) + ok = (((V @ N.T) % PRIME) == 0).all(axis=1) + inside[key] = np.nonzero(np.bincount(owner[ok], minlength=len(donors)) == size)[0] + phi = lambda r: r * ((m / r) ** SAVING - 1) / SAVING if r else 0.0 + edges = [] + for j, b in enumerate(level): + f = S.f[b] + for i in inside[tuple(map(tuple, S.sigma[b]))]: + d = donors[int(i)] + if d == b or word.death[d] >= word.p[b]: continue + dd = S.dim(last[d]) + edges.append((int(i), j, 3 * phi(h - dd) + phi(3 * f) - 3 * phi(f - dd))) + used_r = sorted({e[0] for e in edges}); used_c = sorted({e[1] for e in edges}) + rr = {r: i for i, r in enumerate(used_r)}; cc = {c: i for i, c in enumerate(used_c)} + A = np.zeros((len(used_r), len(used_c))) + for r, c, x in edges: A[rr[r], cc[c]] = x + ri, ci = linear_sum_assignment(A, maximize=True) + pairs = sorted((level[used_c[c]], donors[used_r[r]]) for r, c in zip(ri, ci) if A[r, c] > 0) + taken = {b for b, _ in pairs} + plan = dict(elim=sorted(elim), retained=[s for s in level if s not in taken], pairs=[list(p) for p in pairs]) + out = Path(sys.argv[1]) if len(sys.argv) > 1 else HERE / 'plan.json' + out.write_text(json.dumps(plan, separators=(',', ':')) + '\n') + print('edges %d, pairs %d, first-order gain %.0f -> %s' % (len(edges), len(pairs), sum(A[r, c] for r, c in zip(ri, ci)), out)) + + +if __name__ == '__main__': + main() diff --git a/research/bit-reuse-147/plan.json b/research/bit-reuse-147/plan.json new file mode 100644 index 0000000000..6384777f51 --- /dev/null +++ b/research/bit-reuse-147/plan.json @@ -0,0 +1 @@ +{"elim":[12,13,26,27,40,41,54,55,68,69,82,83,96,97,110,111,124,125,138,139,282,294,306,318,330,342,354,366,378,383,507,519,531,543,555,567,579,591,596,708,720,732,744,756,768,780,785,885,897,909,921,933,945,950,1038,1050,1062,1074,1086,1091,1167,1179,1191,1203,1208,1272,1284,1296,1301,1353,1365,1370,1410,1415,1436,1445,1450,1451,1456,1462,1463,1468,1474,1475,1480,1486,1487,1492,1498,1499,1504,1510,1511,1516,1522,1523,1528,1534,1535,1540,1546,1547,1552,1559,1560,1566,1572,1573,1579,1585,1586,1592,1598,1599,1605,1611,1612,1618,1624,1625,1631,1637,1638,1644,1650,1651,1657,1663,1664,1670,1676,1677,1686,1693,1698,1699,1704,1710,1711,1716,1722,1723,1728,1734,1735,1740,1746,1747,1752,1758,1759,1764,1770,1771,1776,1782,1783,1788,1795,1796,1802,1808,1809,1815,1821,1822,1828,1834,1835,1841,1847,1848,1854,1860,1861,1867,1873,1874,1880,1886,1887,1893,1899,1900,1909,1916,1921,1922,1927,1933,1934,1939,1945,1946,1951,1957,1958,1963,1969,1970,1975,1981,1982,1987,1993,1994,1999,2006,2007,2013,2019,2020,2026,2032,2033,2039,2045,2046,2052,2058,2059,2065,2071,2072,2078,2084,2085,2091,2097,2098,2107,2114,2119,2120,2125,2131,2132,2137,2143,2144,2149,2155,2156,2161,2167,2168,2173,2179,2180,2185,2192,2193,2199,2205,2206,2212,2218,2219,2225,2231,2232,2238,2244,2245,2251,2257,2258,2264,2270,2271,2280,2287,2292,2293,2298,2304,2305,2310,2316,2317,2322,2328,2329,2334,2340,2341,2346,2353,2354,2360,2366,2367,2373,2379,2380,2386,2392,2393,2399,2405,2406,2412,2418,2419,2428,2435,2440,2441,2446,2452,2453,2458,2464,2465,2470,2476,2477,2482,2489,2490,2496,2502,2503,2509,2515,2516,2522,2528,2529,2535,2541,2542,2551,2558,2563,2564,2569,2575,2576,2581,2587,2588,2593,2600,2601,2607,2613,2614,2620,2626,2627,2633,2639,2640,2649,2656,2661,2662,2667,2673,2674,2679,2686,2687,2693,2699,2700,2706,2712,2713,2722,2729,2734,2735,2740,2747,2748,2754,2760,2761,2770,2777,2783,2784,2793,2806,2807,2820,2821,2834,2835,2848,2849,2862,2863,2876,2877,2890,2891,2904,2905,2918,2919,3050,3062,3074,3086,3098,3110,3122,3134,3139,3251,3263,3275,3287,3299,3311,3323,3328,3428,3440,3452,3464,3476,3488,3493,3581,3593,3605,3617,3629,3634,3710,3722,3734,3746,3751,3815,3827,3839,3844,3896,3908,3913,3953,3958,3979,3988,3993,3994,3999,4005,4006,4011,4017,4018,4023,4029,4030,4035,4041,4042,4047,4053,4054,4059,4065,4066,4071,4077,4078,4083,4090,4091,4097,4103,4104,4110,4116,4117,4123,4129,4130,4136,4142,4143,4149,4155,4156,4162,4168,4169,4175,4181,4182,4188,4194,4195,4204,4211,4216,4217,4222,4228,4229,4234,4240,4241,4246,4252,4253,4258,4264,4265,4270,4276,4277,4282,4288,4289,4294,4301,4302,4308,4314,4315,4321,4327,4328,4334,4340,4341,4347,4353,4354,4360,4366,4367,4373,4379,4380,4386,4392,4393,4402,4409,4414,4415,4420,4426,4427,4432,4438,4439,4444,4450,4451,4456,4462,4463,4468,4474,4475,4480,4487,4488,4494,4500,4501,4507,4513,4514,4520,4526,4527,4533,4539,4540,4546,4552,4553,4559,4565,4566,4575,4582,4587,4588,4593,4599,4600,4605,4611,4612,4617,4623,4624,4629,4635,4636,4641,4648,4649,4655,4661,4662,4668,4674,4675,4681,4687,4688,4694,4700,4701,4707,4713,4714,4723,4730,4735,4736,4741,4747,4748,4753,4759,4760,4765,4771,4772,4777,4784,4785,4791,4797,4798,4804,4810,4811,4817,4823,4824,4830,4836,4837,4846,4853,4858,4859,4864,4870,4871,4876,4882,4883,4888,4895,4896,4902,4908,4909,4915,4921,4922,4928,4934,4935,4944,4951,4956,4957,4962,4968,4969,4974,4981,4982,4988,4994,4995,5001,5007,5008,5017,5024,5029,5030,5035,5042,5043,5049,5055,5056,5065,5072,5078,5079,5088,5101,5102,5115,5116,5129,5130,5143,5144,5157,5158,5171,5172,5185,5186,5199,5200,5319,5331,5343,5355,5367,5379,5391,5396,5496,5508,5520,5532,5544,5556,5561,5649,5661,5673,5685,5697,5702,5778,5790,5802,5814,5819,5883,5895,5907,5912,5964,5976,5981,6021,6026,6047,6056,6061,6062,6067,6073,6074,6079,6085,6086,6091,6097,6098,6103,6109,6110,6115,6121,6122,6127,6133,6134,6139,6146,6147,6153,6159,6160,6166,6172,6173,6179,6185,6186,6192,6198,6199,6205,6211,6212,6218,6224,6225,6231,6237,6238,6247,6254,6259,6260,6265,6271,6272,6277,6283,6284,6289,6295,6296,6301,6307,6308,6313,6319,6320,6325,6332,6333,6339,6345,6346,6352,6358,6359,6365,6371,6372,6378,6384,6385,6391,6397,6398,6404,6410,6411,6420,6427,6432,6433,6438,6444,6445,6450,6456,6457,6462,6468,6469,6474,6480,6481,6486,6493,6494,6500,6506,6507,6513,6519,6520,6526,6532,6533,6539,6545,6546,6552,6558,6559,6568,6575,6580,6581,6586,6592,6593,6598,6604,6605,6610,6616,6617,6622,6629,6630,6636,6642,6643,6649,6655,6656,6662,6668,6669,6675,6681,6682,6691,6698,6703,6704,6709,6715,6716,6721,6727,6728,6733,6740,6741,6747,6753,6754,6760,6766,6767,6773,6779,6780,6789,6796,6801,6802,6807,6813,6814,6819,6826,6827,6833,6839,6840,6846,6852,6853,6862,6869,6874,6875,6880,6887,6888,6894,6900,6901,6910,6917,6923,6924,6933,6946,6947,6960,6961,6974,6975,6988,6989,7002,7003,7016,7017,7030,7031,7138,7150,7162,7174,7186,7198,7203,7291,7303,7315,7327,7339,7344,7420,7432,7444,7456,7461,7525,7537,7549,7554,7606,7618,7623,7663,7668,7689,7698,7703,7704,7709,7715,7716,7721,7727,7728,7733,7739,7740,7745,7751,7752,7757,7763,7764,7769,7776,7777,7783,7789,7790,7796,7802,7803,7809,7815,7816,7822,7828,7829,7835,7841,7842,7848,7854,7855,7864,7871,7876,7877,7882,7888,7889,7894,7900,7901,7906,7912,7913,7918,7924,7925,7930,7937,7938,7944,7950,7951,7957,7963,7964,7970,7976,7977,7983,7989,7990,7996,8002,8003,8012,8019,8024,8025,8030,8036,8037,8042,8048,8049,8054,8060,8061,8066,8073,8074,8080,8086,8087,8093,8099,8100,8106,8112,8113,8119,8125,8126,8135,8142,8147,8148,8153,8159,8160,8165,8171,8172,8177,8184,8185,8191,8197,8198,8204,8210,8211,8217,8223,8224,8233,8240,8245,8246,8251,8257,8258,8263,8270,8271,8277,8283,8284,8290,8296,8297,8306,8313,8318,8319,8324,8331,8332,8338,8344,8345,8354,8361,8367,8368,8377,8390,8391,8404,8405,8418,8419,8432,8433,8446,8447,8460,8461,8556,8568,8580,8592,8604,8609,8685,8697,8709,8721,8726,8790,8802,8814,8819,8871,8883,8888,8928,8933,8954,8963,8968,8969,8974,8980,8981,8986,8992,8993,8998,9004,9005,9010,9016,9017,9022,9029,9030,9036,9042,9043,9049,9055,9056,9062,9068,9069,9075,9081,9082,9088,9094,9095,9104,9111,9116,9117,9122,9128,9129,9134,9140,9141,9146,9152,9153,9158,9165,9166,9172,9178,9179,9185,9191,9192,9198,9204,9205,9211,9217,9218,9227,9234,9239,9240,9245,9251,9252,9257,9263,9264,9269,9276,9277,9283,9289,9290,9296,9302,9303,9309,9315,9316,9325,9332,9337,9338,9343,9349,9350,9355,9362,9363,9369,9375,9376,9382,9388,9389,9398,9405,9410,9411,9416,9423,9424,9430,9436,9437,9446,9453,9459,9460,9469,9482,9483,9496,9497,9510,9511,9524,9525,9538,9539,9622,9634,9646,9658,9663,9727,9739,9751,9756,9808,9820,9825,9865,9870,9891,9900,9905,9906,9911,9917,9918,9923,9929,9930,9935,9941,9942,9947,9954,9955,9961,9967,9968,9974,9980,9981,9987,9993,9994,10000,10006,10007,10016,10023,10028,10029,10034,10040,10041,10046,10052,10053,10058,10065,10066,10072,10078,10079,10085,10091,10092,10098,10104,10105,10114,10121,10126,10127,10132,10138,10139,10144,10151,10152,10158,10164,10165,10171,10177,10178,10187,10194,10199,10200,10205,10212,10213,10219,10225,10226,10235,10242,10248,10249,10258,10271,10272,10285,10286,10299,10300,10313,10314,10385,10397,10409,10414,10466,10478,10483,10523,10528,10549,10558,10563,10564,10569,10575,10576,10581,10587,10588,10593,10600,10601,10607,10613,10614,10620,10626,10627,10633,10639,10640,10649,10656,10661,10662,10667,10673,10674,10679,10686,10687,10693,10699,10700,10706,10712,10713,10722,10729,10734,10735,10740,10747,10748,10754,10760,10761,10770,10777,10783,10784,10793,10806,10807,10820,10821,10834,10835,10894,10906,10911,10951,10956,10977,10986,10991,10992,10997,11003,11004,11009,11016,11017,11023,11029,11030,11036,11042,11043,11052,11059,11064,11065,11070,11077,11078,11084,11090,11091,11100,11107,11113,11114,11123,11136,11137,11150,11151,11198,11203,11224,11233,11238,11239,11244,11251,11252,11258,11264,11265,11274,11281,11287,11288,11297,11310,11311,11339,11348,11354,11355,11364,28670,28671,28675,28676,28680,28681,28685,28686,28691],"retained":[22967,23065,23159,23249,23335,23417,23495,23569,23836,23838,23840,23842,23844,23846,23848,23850,23852,23854,23857,23894,23896,23898,23900,23902,23904,23906,23908,23910,23913,24010,24094,24162,24173,24175,24187,24201,24213,24214,24247,24463,24466,24469,24472,24475,24667,24669,24895,25085,25087,25311,25487,25499,25501,25909,25911,26315,26317,26717,26719,27115,27117,27509,27511,27711,27899,27901,28097,28099,28285,28287,28297,28481,22918,22922,22924,22926,22928,22930,22932,22934,22969,22971,22973,22975,22977,22979,23016,23020,23022,23024,23026,23028,23030,23032,23067,23069,23071,23073,23075,23077,23161,23163,23165,23167,23206,23208,23210,23212,23216,23251,23253,23255,23257,23296,23298,23302,23337,23339,23378,23380,23384,23419,23421,23462,23536,24189,24245,24250,24253,24256,24259,24668,24672,24675,24678,24681,24833,24835,25072,25086,25093,25096,25099,25251,25252,25488,25503,25507,25510,25513,25667,25669,25894,25913,25920,25923,26077,26078,26127,26302,26322,26326,26329,26485,26487,26700,26724,26731,26887,26888,26928,27100,27125,27129,27287,27289,27490,27519,27681,27682,27709,27713,27882,28073,28075,28264,28459,28460,28482,28648,23835,23837,23893,23895,23947,23949,23997,23999,24043,24045,24085,24087,24123,24125,24157,24159,24246,24249,24252,24255,24310,24311,24313,24314,24352,24353,24355,24356,24382,24383,24385,24386,24400,24401,24403,24404,24406,24407,24409,24410,24411,24412,24413,24414,24415,24416,24418,24420,24421,24422,24424,24426,24427,24428,24430,24432,24433,24434,24436,24438,24439,24440,24462,24465,24468,24471,24526,24527,24529,24530,24568,24569,24571,24572,24598,24599,24601,24602,24616,24617,24619,24620,24622,24623,24625,24626,24628,24631,24634,24637,24640,24643,24646,24649,24652,24654,24655,24656,24671,24674,24677,24731,24735,24736,24774,24775,24777,24778,24804,24805,24807,24808,24822,24823,24825,24826,24828,24829,24831,24832,24834,24836,24838,24840,24841,24842,24844,24846,24847,24848,24850,24852,24853,24854,24856,24858,24859,24860,24862,24882,24885,24888,24891,24946,24947,24949,24950,24988,24989,24991,24992,25018,25019,25021,25022,25036,25037,25039,25040,25042,25043,25044,25048,25051,25054,25057,25060,25063,25066,25069,25071,25073,25074,25075,25089,25092,25095,25149,25152,25192,25193,25195,25196,25222,25223,25225,25226,25240,25241,25243,25244,25246,25247,25249,25250,25254,25256,25257,25258,25260,25262,25263,25264,25266,25268,25269,25270,25272,25274,25275,25276,25278,25279,25298,25301,25304,25307,25362,25363,25365,25366,25404,25405,25407,25408,25434,25435,25437,25438,25452,25453,25455,25456,25457,25460,25464,25467,25470,25473,25476,25479,25482,25484,25485,25486,25489,25498,25500,25506,25509,25563,25566,25605,25609,25610,25636,25637,25639,25640,25654,25655,25657,25658,25660,25661,25663,25664,25665,25666,25668,25670,25672,25674,25675,25676,25678,25680,25681,25682,25684,25686,25687,25688,25690,25691,25692,25710,25713,25716,25719,25774,25775,25777,25778,25816,25817,25819,25820,25846,25847,25849,25850,25864,25865,25866,25869,25872,25876,25879,25882,25885,25888,25891,25893,25895,25896,25897,25898,25899,25907,25908,25910,25916,25919,25973,25976,26015,26018,26046,26047,26049,26050,26064,26065,26067,26068,26070,26071,26073,26074,26075,26076,26080,26082,26083,26084,26086,26088,26089,26090,26092,26094,26095,26096,26098,26099,26100,26101,26118,26121,26124,26182,26183,26185,26186,26224,26225,26227,26228,26254,26255,26257,26258,26271,26274,26277,26280,26284,26287,26290,26293,26296,26298,26299,26300,26303,26304,26305,26312,26313,26314,26316,26319,26325,26379,26382,26421,26424,26451,26455,26456,26470,26471,26473,26474,26476,26477,26479,26480,26481,26482,26483,26484,26486,26488,26490,26492,26493,26494,26496,26498,26499,26500,26502,26503,26504,26505,26506,26522,26525,26528,26531,26586,26587,26589,26590,26628,26629,26631,26632,26658,26659,26660,26675,26678,26681,26684,26688,26691,26694,26697,26699,26701,26702,26703,26704,26705,26706,26707,26713,26714,26715,26716,26718,26721,26727,26781,26784,26823,26826,26853,26856,26872,26873,26875,26876,26878,26879,26881,26882,26883,26884,26885,26886,26890,26892,26893,26894,26896,26898,26899,26900,26902,26903,26904,26905,26906,26907,26922,26925,26931,26986,26987,26989,26990,27028,27029,27031,27032,27057,27060,27075,27078,27081,27084,27088,27091,27094,27096,27097,27098,27101,27102,27103,27104,27105,27110,27111,27112,27113,27114,27116,27119,27122,27179,27182,27221,27224,27251,27254,27269,27273,27274,27276,27277,27279,27280,27281,27282,27283,27284,27285,27286,27288,27290,27292,27294,27295,27296,27298,27299,27300,27301,27302,27303,27304,27318,27321,27324,27327,27382,27383,27385,27386,27424,27425,27426,27453,27456,27471,27474,27477,27480,27484,27487,27489,27491,27492,27493,27494,27495,27496,27497,27498,27499,27503,27504,27505,27506,27507,27508,27510,27513,27516,27573,27576,27615,27618,27645,27648,27663,27666,27670,27671,27673,27674,27675,27676,27677,27678,27679,27680,27684,27686,27687,27688,27690,27691,27692,27693,27694,27695,27696,27697,27710,27716,27719,27774,27775,27777,27778,27815,27818,27845,27848,27863,27866,27869,27872,27875,27876,27877,27878,27879,27880,27883,27884,27885,27886,27887,27888,27889,27892,27893,27894,27895,27896,27897,27898,27900,27903,27906,27909,27963,27966,28005,28008,28035,28038,28053,28056,28059,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28074,28076,28078,28079,28080,28081,28082,28083,28084,28085,28086,28098,28101,28104,28107,28162,28163,28164,28203,28206,28233,28236,28251,28254,28257,28260,28263,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28277,28278,28279,28280,28281,28282,28283,28284,28286,28289,28292,28295,28349,28352,28391,28394,28421,28424,28439,28442,28445,28448,28451,28452,28453,28454,28455,28456,28457,28458,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28485,28488,28491,28545,28548,28587,28590,28617,28620,28635,28638,28641,28644,28647,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28687,28688,28689,28690,280,286,292,298,304,310,316,322,328,334,340,346,352,358,364,370,376,420,426,432,438,444,450,456,462,468,474,480,486,511,517,523,529,535,541,547,553,559,565,571,577,583,589,621,627,633,639,645,651,657,663,669,675,681,687,712,718,724,730,736,742,748,754,760,766,772,778,810,816,822,828,834,840,846,852,858,864,889,895,901,907,913,919,925,931,937,943,975,981,987,993,999,1005,1011,1017,1042,1048,1054,1060,1066,1072,1078,1084,1116,1122,1128,1134,1140,1146,1171,1177,1183,1189,1195,1201,1233,1239,1245,1251,1276,1282,1288,1294,1332,1351,1357,1363,1449,1455,1461,1467,1473,1479,1485,1491,1497,1503,1509,1515,1521,1527,1533,1539,1545,1551,1564,1571,1577,1584,1590,1597,1603,1610,1616,1623,1629,1636,1642,1649,1655,1662,1668,1675,1709,1715,1721,1727,1733,1739,1745,1751,1757,1763,1769,1775,1781,1787,1813,1820,1826,1833,1839,1846,1852,1859,1865,1872,1878,1885,1891,1898,1920,1926,1932,1938,1944,1950,1956,1962,1968,1974,1980,1986,1992,1998,2011,2018,2024,2031,2037,2044,2050,2057,2063,2070,2076,2083,2089,2096,2130,2136,2142,2148,2154,2160,2166,2172,2178,2184,2210,2217,2223,2230,2236,2243,2249,2256,2262,2269,2303,2309,2315,2321,2327,2333,2339,2345,2371,2378,2384,2391,2397,2404,2410,2417,2451,2457,2463,2469,2475,2481,2494,2501,2507,2514,2520,2527,2533,2540,2574,2580,2586,2592,2618,2625,2631,2638,2660,2666,2672,2678,2691,2698,2704,2711,2957,2963,2969,2975,2981,2987,2993,2999,3005,3011,3017,3023,3029,3054,3060,3066,3072,3078,3084,3090,3096,3102,3108,3114,3120,3126,3132,3158,3164,3170,3176,3182,3188,3194,3200,3206,3212,3218,3224,3230,3243,3249,3255,3261,3267,3273,3279,3285,3291,3297,3303,3309,3315,3321,3353,3359,3365,3371,3377,3383,3389,3395,3401,3407,3420,3426,3432,3438,3444,3450,3456,3462,3468,3474,3480,3486,3512,3518,3524,3530,3536,3542,3548,3554,3560,3573,3579,3585,3591,3597,3603,3609,3615,3621,3627,3647,3653,3659,3665,3671,3677,3683,3689,3702,3708,3714,3720,3726,3732,3738,3744,3776,3782,3788,3794,3819,3825,3831,3837,3857,3863,3869,3875,3888,3894,3900,3906,4004,4010,4016,4022,4028,4034,4040,4046,4052,4058,4064,4070,4076,4082,4102,4108,4115,4121,4128,4134,4141,4147,4154,4160,4167,4173,4180,4186,4193,4215,4221,4227,4233,4239,4245,4251,4257,4263,4269,4275,4281,4287,4293,4306,4313,4319,4326,4332,4339,4345,4352,4358,4365,4371,4378,4384,4391,4413,4419,4425,4431,4437,4443,4449,4455,4461,4467,4473,4479,4492,4499,4505,4512,4518,4525,4531,4538,4544,4551,4557,4564,4586,4592,4598,4604,4610,4616,4622,4628,4634,4640,4653,4660,4666,4673,4679,4686,4692,4699,4705,4712,4734,4740,4746,4752,4758,4764,4770,4776,4789,4796,4802,4809,4815,4822,4828,4835,4863,4869,4875,4881,4887,4900,4907,4913,4920,4926,4933,4955,4961,4967,4973,4986,4993,4999,5006,5220,5226,5232,5238,5244,5250,5256,5262,5268,5274,5280,5286,5292,5298,5311,5317,5323,5329,5335,5341,5347,5353,5359,5365,5371,5377,5383,5389,5409,5415,5421,5427,5433,5439,5445,5451,5457,5463,5469,5475,5488,5494,5500,5506,5512,5518,5524,5530,5536,5542,5548,5554,5574,5580,5586,5592,5598,5604,5610,5616,5622,5628,5641,5647,5653,5659,5665,5671,5677,5683,5689,5695,5715,5721,5727,5733,5739,5745,5751,5757,5770,5776,5782,5788,5794,5800,5806,5812,5832,5838,5844,5850,5856,5862,5875,5881,5887,5893,5899,5905,5925,5931,5937,5943,5956,5962,5968,5974,6013,6019,6060,6066,6072,6078,6084,6090,6096,6102,6108,6114,6120,6126,6132,6138,6151,6158,6164,6171,6177,6184,6190,6197,6203,6210,6216,6223,6229,6236,6258,6264,6270,6276,6282,6288,6294,6300,6306,6312,6318,6324,6337,6344,6350,6357,6363,6370,6376,6383,6389,6396,6402,6409,6431,6437,6443,6449,6455,6461,6467,6473,6479,6485,6498,6505,6511,6518,6524,6531,6537,6544,6550,6557,6579,6585,6591,6597,6603,6609,6615,6621,6634,6641,6647,6654,6660,6667,6673,6680,6702,6708,6714,6720,6726,6732,6745,6752,6758,6765,6771,6778,6800,6806,6812,6818,6831,6838,6844,6851,6873,6879,6892,6899,7051,7057,7063,7069,7075,7081,7087,7093,7099,7105,7111,7117,7130,7136,7142,7148,7154,7160,7166,7172,7178,7184,7190,7196,7216,7222,7228,7234,7240,7246,7252,7258,7264,7270,7283,7289,7295,7301,7307,7313,7319,7325,7331,7337,7357,7363,7369,7375,7381,7387,7393,7399,7412,7418,7424,7430,7436,7442,7448,7454,7474,7480,7486,7492,7498,7504,7517,7523,7529,7535,7541,7547,7567,7573,7579,7585,7598,7604,7610,7616,7636,7642,7655,7661,7702,7708,7714,7720,7726,7732,7738,7744,7750,7756,7762,7768,7781,7788,7794,7801,7807,7814,7820,7827,7833,7840,7846,7853,7875,7881,7887,7893,7899,7905,7911,7917,7923,7929,7942,7949,7955,7962,7968,7975,7981,7988,7994,8001,8023,8029,8035,8041,8047,8053,8059,8065,8078,8085,8091,8098,8104,8111,8117,8124,8146,8152,8158,8164,8170,8176,8189,8196,8202,8209,8215,8222,8244,8250,8256,8262,8275,8282,8288,8295,8317,8323,8336,8343,8481,8487,8493,8499,8505,8511,8517,8523,8529,8535,8548,8554,8560,8566,8572,8578,8584,8590,8596,8602,8622,8628,8634,8640,8646,8652,8658,8664,8677,8683,8689,8695,8701,8707,8713,8719,8739,8745,8751,8757,8763,8769,8782,8788,8794,8800,8806,8812,8832,8838,8844,8850,8863,8869,8875,8881,8901,8907,8920,8926,8967,8973,8979,8985,8991,8997,9003,9009,9015,9021,9034,9041,9047,9054,9060,9067,9073,9080,9086,9093,9115,9121,9127,9133,9139,9145,9151,9157,9170,9177,9183,9190,9196,9203,9209,9216,9238,9244,9250,9256,9262,9268,9281,9288,9294,9301,9307,9314,9336,9342,9348,9354,9367,9374,9380,9387,9409,9415,9428,9435,9559,9565,9571,9577,9583,9589,9595,9601,9614,9620,9626,9632,9638,9644,9650,9656,9676,9682,9688,9694,9700,9706,9719,9725,9731,9737,9743,9749,9769,9775,9781,9787,9800,9806,9812,9818,9838,9844,9857,9863,9904,9910,9916,9922,9928,9934,9940,9946,9959,9966,9972,9979,9985,9992,9998,10005,10027,10033,10039,10045,10051,10057,10070,10077,10083,10090,10096,10103,10125,10131,10137,10143,10156,10163,10169,10176,10198,10204,10217,10224,10334,10340,10346,10352,10358,10364,10377,10383,10389,10395,10401,10407,10427,10433,10439,10445,10458,10464,10470,10476,10496,10502,10515,10521,10562,10568,10574,10580,10586,10592,10605,10612,10618,10625,10631,10638,10660,10666,10672,10678,10691,10698,10704,10711,10733,10739,10752,10759,10855,10861,10867,10873,10886,10892,10898,10904,10924,10930,10943,10949,10990,10996,11002,11008,11021,11028,11034,11041,11063,11069,11082,11089,11171,11177,11190,11196,11237,11243,11256,11263,23806,23808,23810,23812,23814,23816,23818,23820,23822,23824,23839,23841,23843,23845,23847,23849,23851,23853,23897,23899,23901,23903,23905,23907,23909,23951,23953,23955,23957,23959,23961,24001,24003,24005,24007,24009,24047,24049,24051,24053,24089,24091,24093,24127,24129,24161,24309,24312,24351,24354,24381,24384,24399,24402,24405,24408,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24474,24477,24480,24483,24486,24489,24492,24495,24498,24501,24504,24507,24510,24513,24516,24519,24522,24531,24534,24537,24540,24543,24546,24549,24552,24555,24558,24561,24564,24573,24576,24579,24582,24585,24588,24591,24594,24603,24606,24609,24612,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24683,24684,24685,24686,24687,24688,24695,24696,24697,24698,24699,24700,24707,24708,24709,24710,24711,24712,24719,24720,24721,24722,24723,24724,24732,24733,24734,24773,24776,24803,24806,24821,24824,24827,24830,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24894,24936,24937,24938,24942,24943,24944,24978,24979,24980,24984,24985,24986,25008,25009,25010,25014,25015,25016,25026,25027,25028,25032,25033,25034,25045,25046,25076,25077,25078,25079,25080,25081,25082,25083,25084,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25150,25151,25153,25154,25191,25194,25221,25224,25239,25242,25245,25248,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25310,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25458,25459,25461,25462,25490,25491,25492,25493,25494,25495,25496,25497,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25564,25565,25567,25568,25569,25570,25571,25572,25573,25574,25581,25582,25583,25584,25585,25586,25593,25594,25595,25596,25597,25598,25606,25607,25608,25635,25638,25653,25656,25659,25662,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25722,25752,25753,25754,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25794,25795,25796,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25824,25825,25826,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25867,25868,25870,25871,25873,25874,25900,25901,25902,25903,25904,25905,25906,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25974,25975,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26016,26017,26019,26020,26045,26048,26063,26066,26069,26072,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26130,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26272,26273,26275,26276,26278,26279,26281,26282,26306,26307,26308,26309,26310,26311,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26380,26381,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26422,26423,26425,26426,26427,26428,26429,26430,26431,26432,26439,26440,26441,26442,26443,26444,26452,26453,26454,26469,26472,26475,26478,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26534,26552,26553,26554,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26594,26595,26596,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26676,26677,26679,26680,26682,26683,26685,26686,26708,26709,26710,26711,26712,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26782,26783,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26824,26825,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26854,26855,26857,26858,26871,26874,26877,26880,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26934,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27058,27059,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27076,27077,27079,27080,27082,27083,27085,27086,27106,27107,27108,27109,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27180,27181,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27222,27223,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27252,27253,27255,27256,27257,27258,27259,27260,27261,27262,27270,27271,27272,27275,27278,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27330,27336,27337,27338,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27454,27455,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27472,27473,27475,27476,27478,27479,27481,27482,27500,27501,27502,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27574,27575,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27616,27617,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27646,27647,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27664,27665,27667,27668,27669,27672,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27722,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27816,27817,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27846,27847,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27864,27865,27867,27868,27870,27871,27873,27874,27890,27891,27912,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27964,27965,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28006,28007,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28036,28037,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28054,28055,28057,28058,28060,28061,28062,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28110,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28204,28205,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28234,28235,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28252,28253,28255,28256,28258,28259,28261,28262,28276,28298,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28350,28351,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28392,28393,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28422,28423,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28440,28441,28443,28444,28446,28447,28449,28450,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28494,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28546,28547,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28588,28589,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28618,28619,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28636,28637,28639,28640,28642,28643,28645,28646,28668,28673,28678,28683,28693,28695,28696,28698,28699,28701,28702,28704,28705,28707,28708,28710,28711,28713,28714,28716,28717,28719,28720,28722,28723,28725,28726,28728,28729,28731,28732,28734,28735,28737,28738,28740,28742,28745,28747,28749,28750,28752,28753,28755,28756,28758,28759,28761,28762,28764,28765,28767,28768,28770,28771,28773,28774,28776,28777,28779,28780,28782,28784,28787,28789,28791,28792,28794,28795,28797,28798,28800,28801,28803,28804,28806,28807,28809,28810,28812,28814,28817,28819,28821,28822,28824,28825,28827,28828,28830,28832,28835,28838,28841,23882,23936,23986,24032,24074,24112,24146,24176,24202],"pairs":[[5,12862],[6,12363],[19,11919],[20,5188],[33,24242],[34,7019],[47,23772],[48,8449],[61,21873],[62,9527],[75,3936],[76,10302],[89,21871],[90,10823],[103,3969],[104,11139],[117,21191],[118,11299],[131,11331],[132,11955],[154,5947],[155,22883],[159,38],[160,20188],[161,11577],[165,52],[166,21536],[167,11596],[171,24],[172,17533],[173,11579],[177,66],[178,17537],[179,11618],[183,80],[184,17535],[185,11580],[189,94],[190,17547],[191,11643],[195,108],[196,17527],[197,11581],[201,122],[202,20212],[203,11671],[207,136],[208,2021],[209,11583],[213,2797],[214,147],[215,11702],[219,2811],[220,17481],[221,11585],[225,2825],[226,20178],[227,11736],[231,2839],[232,2047],[233,11587],[237,2853],[238,20175],[239,11773],[243,2867],[244,20170],[245,11590],[249,2881],[250,1690],[251,11813],[255,2895],[256,2073],[257,12348],[261,2920],[262,148],[263,11957],[268,4799],[269,11591],[270,5202],[274,2909],[275,2504],[276,12374],[281,2108],[287,17493],[288,11377],[293,17499],[299,17521],[300,11381],[305,17489],[311,2220],[312,11385],[317,2650],[323,17525],[324,11389],[329,2246],[335,2381],[336,11393],[341,2259],[347,2517],[348,11397],[353,2194],[359,2233],[360,11401],[365,2207],[371,17559],[372,12102],[377,2491],[384,20214],[385,4197],[391,22283],[392,11610],[396,5127],[397,17539],[398,11598],[402,5113],[403,2756],[404,11620],[408,7041],[409,20189],[410,11599],[414,2929],[415,20167],[416,11645],[421,20209],[422,11600],[427,17497],[428,11673],[433,2688],[434,11602],[439,21530],[440,11704],[445,17483],[446,11604],[451,17487],[452,11738],[457,17491],[458,11606],[463,2766],[464,11775],[469,1442],[470,11609],[475,17519],[476,11815],[481,17523],[482,12313],[487,17545],[488,11953],[493,21600],[494,13717],[495,12077],[499,5141],[500,17503],[501,5392],[505,5155],[506,17543],[512,17551],[513,5557],[518,21528],[524,2628],[525,5698],[530,20184],[536,2008],[537,5815],[542,17531],[548,2749],[549,5908],[554,2407],[560,22311],[561,5977],[566,2086],[572,2060],[573,6022],[578,2034],[584,2498],[585,12100],[590,2602],[597,21906],[598,3138],[604,23765],[605,11632],[609,3331],[610,19704],[611,11621],[615,4205],[616,1836],[617,11646],[622,20203],[623,11622],[628,20207],[629,11674],[634,20200],[635,11624],[640,20182],[641,11705],[646,17477],[647,11626],[652,20177],[653,11739],[658,50],[659,11628],[664,2443],[665,11776],[670,20169],[671,11631],[676,2111],[677,11816],[682,20194],[683,12280],[688,120],[689,11952],[694,21632],[695,14482],[696,12074],[700,5399],[701,17529],[702,7199],[706,6050],[707,2771],[713,1687],[714,7340],[719,17485],[725,17517],[726,7457],[731,17495],[737,1587],[738,7550],[743,17541],[749,1875],[750,7619],[755,17501],[761,134],[762,7664],[767,17549],[773,1849],[774,12098],[779,1823],[786,21541],[787,3327],[793,21203],[794,11657],[798,8416],[799,20204],[800,11647],[804,8430],[805,20174],[806,11675],[811,1665],[812,11649],[817,1639],[818,11706],[823,17479],[824,11651],[829,1613],[830,11740],[835,20197],[836,11653],[841,143],[842,11777],[847,1913],[848,11656],[853,2355],[854,11817],[859,2511],[860,12249],[865,1561],[866,11949],[871,21664],[872,15157],[873,12066],[877,8444],[878,2537],[879,8605],[883,8458],[884,92],[890,2566],[891,8722],[896,21538],[902,19699],[903,8815],[908,21529],[914,64],[915,8884],[920,78],[926,2789],[927,8929],[932,106],[938,19703],[939,12096],[944,19701],[951,21534],[952,3492],[958,19605],[959,11685],[963,3637],[964,22642],[965,11677],[969,4576],[970,1810],[971,11708],[976,17469],[977,11679],[982,17473],[983,11742],[988,17471],[989,11681],[994,2547],[995,11779],[1000,2701],[1001,11684],[1006,2432],[1007,11819],[1012,2615],[1013,12220],[1018,2524],[1019,11946],[1024,21696],[1025,15742],[1026,12055],[1030,5705],[1031,17557],[1032,9659],[1036,6421],[1037,1797],[1043,2718],[1044,9752],[1049,2479],[1055,2737],[1056,9821],[1061,2578],[1067,2676],[1068,9866],[1073,2708],[1079,2695],[1080,12094],[1085,2622],[1092,19706],[1093,3633],[1099,23775],[1100,11716],[1104,10297],[1105,17475],[1106,11710],[1110,10311],[1111,2664],[1112,11744],[1117,2645],[1118,11712],[1123,2635],[1124,11781],[1129,2284],[1130,11715],[1135,2590],[1136,11821],[1141,2609],[1142,12193],[1147,22308],[1148,11943],[1153,21728],[1154,16237],[1155,12041],[1159,10797],[1160,22309],[1161,10410],[1165,10811],[1166,8],[1172,21531],[1173,10479],[1178,22],[1184,19705],[1185,10524],[1190,17567],[1196,17563],[1197,22312],[1202,17561],[1209,21532],[1210,3750],[1216,19609],[1217,11750],[1221,3847],[1222,19700],[1223,11746],[1227,4847],[1228,1888],[1229,11783],[1234,2774],[1235,11749],[1240,2653],[1241,11823],[1246,2726],[1247,12168],[1252,2388],[1253,11940],[1258,21760],[1259,16642],[1260,12024],[1264,5915],[1265,2343],[1266,10907],[1270,6692],[1271,2467],[1277,2429],[1278,10952],[1283,2414],[1289,2455],[1290,22643],[1295,36],[1302,21533],[1303,3843],[1309,23784],[1310,11787],[1314,11148],[1315,2555],[1316,11786],[1320,11301],[1321,2424],[1322,11826],[1326,11321],[1327,2331],[1328,12145],[1333,2401],[1334,11936],[1339,21792],[1340,16957],[1341,12004],[1345,11312],[1346,20192],[1347,11199],[1352,2375],[1358,2362],[1359,22965],[1364,21247],[1371,2530],[1372,3912],[1378,19613],[1379,11827],[1383,3961],[1384,22641],[1385,11959],[1389,5018],[1390,1862],[1391,11933],[1396,21824],[1397,17182],[1398,11981],[1402,6029],[1403,21542],[1404,23837],[1408,6863],[1409,2319],[1416,19708],[1417,3957],[1423,21204],[1424,20112],[1429,21856],[1430,11870],[1431,20118],[1437,19702],[1438,24451],[1444,7403],[1457,23806],[1469,22916],[1481,22622],[1493,22289],[1505,11396],[1517,11400],[1529,11404],[1541,11408],[1553,11411],[1558,20310],[1565,22619],[1578,20144],[1591,21224],[1604,19675],[1617,22284],[1630,19671],[1643,19673],[1656,146],[1669,642],[1684,3185],[1685,19672],[1692,21200],[1697,5169],[1703,5183],[1705,22918],[1717,22624],[1729,22291],[1741,11430],[1753,11434],[1765,11438],[1777,11442],[1789,11445],[1794,20406],[1800,5197],[1801,21526],[1807,6937],[1814,953],[1827,17417],[1840,17457],[1853,17441],[1866,17429],[1879,17425],[1892,17421],[1907,5253],[1908,19678],[1915,21510],[1928,22626],[1940,22293],[1952,11460],[1964,11464],[1976,11468],[1988,11472],[2000,11475],[2005,20502],[2012,19670],[2025,21515],[2038,22285],[2051,19669],[2064,21513],[2077,20127],[2090,22287],[2105,13299],[2106,21517],[2113,20115],[2118,9473],[2124,9487],[2126,22295],[2138,11486],[2150,11490],[2162,11494],[2174,11498],[2186,11501],[2191,20598],[2197,9501],[2198,17385],[2204,9515],[2211,17461],[2224,17393],[2237,17401],[2250,216],[2263,17445],[2278,13325],[2279,192],[2286,22592],[2291,7347],[2297,7865],[2299,11508],[2311,11512],[2323,11516],[2335,11520],[2347,11523],[2352,20694],[2358,8612],[2359,22620],[2365,8957],[2372,20134],[2385,21522],[2398,145],[2411,17397],[2426,13347],[2427,19676],[2434,20111],[2439,10825],[2445,10836],[2447,11530],[2459,11534],[2471,11538],[2483,11541],[2488,20790],[2495,1373],[2508,149],[2521,20126],[2534,17389],[2549,13365],[2550,21514],[2557,20113],[2562,7557],[2568,8136],[2570,11548],[2582,11552],[2594,11555],[2599,20886],[2605,8822],[2606,19674],[2612,9228],[2619,20141],[2632,21518],[2647,5713],[2648,21525],[2655,11373],[2668,11562],[2680,11565],[2685,20982],[2692,20119],[2705,21512],[2720,5725],[2721,21516],[2728,5761],[2733,7671],[2739,8307],[2741,11571],[2746,21078],[2752,8936],[2753,21880],[2759,9399],[2768,5737],[2769,21520],[2776,7121],[2782,21174],[2791,5749],[2792,20166],[2799,12864],[2800,19572],[2813,24241],[2814,14484],[2827,19607],[2828,15159],[2841,21179],[2842,15744],[2855,19611],[2856,16239],[2869,21180],[2870,16644],[2883,19615],[2884,16959],[2897,2879],[2898,17184],[2911,17309],[2912,12900],[2934,13719],[2935,12557],[2939,6965],[2940,17739],[2941,6149],[2945,6951],[2946,20285],[2947,12545],[2951,1439],[2952,17687],[2953,6063],[2958,4786],[2959,12546],[2964,4329],[2965,6075],[2970,2927],[2971,12547],[2976,4945],[2977,6087],[2982,4303],[2983,12549],[2988,17683],[2989,6099],[2994,4355],[2995,12551],[3000,22357],[3001,6111],[3006,4812],[3007,12553],[3012,9],[3013,6123],[3018,2928],[3019,12556],[3024,17725],[3025,13258],[3030,4502],[3031,12898],[3036,21568],[3037,13701],[3038,13022],[3042,6979],[3043,17689],[3044,12560],[3048,6993],[3049,17693],[3055,4702],[3056,12379],[3061,17691],[3067,4738],[3068,12383],[3073,4541],[3079,4515],[3080,12387],[3085,20305],[3091,4489],[3092,12391],[3097,4403],[3103,20271],[3104,12395],[3109,17697],[3115,4381],[3116,12399],[3121,4923],[3127,4904],[3128,13045],[3133,17745],[3140,21956],[3141,6240],[3147,19570],[3148,12579],[3152,1910],[3153,19762],[3154,6156],[3159,4131],[3160,12568],[3165,5066],[3166,6169],[3171,20278],[3172,12569],[3177,21570],[3178,6182],[3183,3982],[3184,12571],[3189,19757],[3190,6195],[3195,17695],[3196,12573],[3201,17685],[3202,6208],[3207,17741],[3208,12575],[3213,19759],[3214,6221],[3219,297],[3220,12578],[3225,17717],[3226,13225],[3231,4118],[3232,12897],[3237,22044],[3238,14467],[3239,13019],[3244,21573],[3245,12585],[3250,17721],[3256,17729],[3257,12413],[3262,17701],[3268,4170],[3269,12417],[3274,4144],[3280,17699],[3281,12421],[3286,17743],[3292,17747],[3293,12425],[3298,17751],[3304,17719],[3305,12429],[3310,17723],[3316,4650],[3317,13043],[3322,4676],[3329,21560],[3330,5395],[3336,19576],[3337,12604],[3341,9529],[3342,4750],[3343,6342],[3347,9540],[3348,20270],[3349,12594],[3354,20263],[3355,6355],[3360,17731],[3361,12596],[3366,17749],[3367,6368],[3372,17703],[3373,12598],[3378,4793],[3379,6381],[3384,2923],[3385,12600],[3390,369],[3391,6394],[3396,345],[3397,12603],[3402,321],[3403,13194],[3408,19761],[3409,12894],[3414,22082],[3415,15143],[3416,13011],[3421,4897],[3422,12613],[3427,5044],[3433,17727],[3434,12443],[3439,4983],[3445,273],[3446,12447],[3451,21561],[3457,4819],[3458,12451],[3463,4832],[3469,4806],[3470,12455],[3475,4842],[3481,4861],[3482,13041],[3487,4873],[3494,21566],[3495,5560],[3501,19574],[3502,12632],[3506,2281],[3507,22684],[3508,6503],[3513,4105],[3514,12624],[3519,21563],[3520,6516],[3525,325],[3526,12626],[3531,17757],[3532,6529],[3537,17761],[3538,12628],[3543,4774],[3544,6542],[3549,4885],[3550,12631],[3555,17759],[3556,13165],[3561,4762],[3562,12891],[3567,22116],[3568,15729],[3569,13000],[3574,19764],[3575,12644],[3580,4917],[3586,4959],[3587,12469],[3592,4971],[3598,4930],[3599,12473],[3604,4940],[3610,5003],[3611,12477],[3616,5013],[3622,4990],[3623,13039],[3628,5061],[3635,21562],[3636,5701],[3642,19580],[3643,12663],[3648,5032],[3649,6639],[3654,5051],[3655,12657],[3660,5084],[3661,6652],[3666,277],[3667,12659],[3672,289],[3673,6665],[3678,19763],[3679,12662],[3684,22354],[3685,13138],[3690,337],[3691,12888],[3696,22146],[3697,16225],[3698,12986],[3703,301],[3704,12678],[3709,22355],[3715,313],[3716,12491],[3721,4719],[3727,4709],[3728,12495],[3733,4670],[3739,4696],[3740,22358],[3745,4683],[3752,21564],[3753,5818],[3759,19578],[3760,12697],[3764,2552],[3765,19758],[3766,6750],[3770,9759],[3771,4183],[3772,12693],[3777,20288],[3778,6763],[3783,4561],[3784,12696],[3789,361],[3790,13113],[3795,4724],[3796,12885],[3801,22172],[3802,16631],[3803,12969],[3807,10017],[3808,21565],[3809,12715],[3813,10417],[3814,17767],[3820,349],[3821,12509],[3826,373],[3832,4614],[3833,22685],[3838,17763],[3845,4825],[3846,5911],[3852,19584],[3853,12734],[3858,4657],[3859,6836],[3864,4638],[3865,12733],[3870,4626],[3871,13090],[3876,21574],[3877,12881],[3882,22194],[3883,16947],[3884,12949],[3889,4602],[3890,12755],[3895,4590],[3901,4571],[3902,23063],[3907,21291],[3914,4554],[3915,5980],[3921,19582],[3922,12774],[3926,1418],[3927,22683],[3928,12904],[3932,2723],[3933,4157],[3934,12878],[3939,22212],[3940,17173],[3941,12926],[3945,9873],[3946,19760],[3947,23895],[3951,10188],[3952,19766],[3959,4528],[3960,6025],[3966,21181],[3967,21171],[3972,22226],[3973,12817],[3974,22229],[3980,4092],[3981,24871],[3987,21878],[3992,7007],[3998,7021],[4000,23016],[4012,22666],[4024,22337],[4036,12394],[4048,12398],[4060,12402],[4072,12406],[4084,12409],[4089,6644],[4095,7032],[4096,0],[4109,20240],[4122,11378],[4135,19735],[4148,20217],[4161,19731],[4174,20218],[4187,2926],[4202,5406],[4203,19732],[4210,8462],[4223,22668],[4235,22339],[4247,12424],[4259,12428],[4271,12432],[4283,12436],[4295,12439],[4300,8088],[4307,11402],[4320,21547],[4333,22333],[4346,19729],[4359,21545],[4372,20223],[4385,22335],[4400,7048],[4401,21549],[4408,19657],[4421,22341],[4433,12450],[4445,12454],[4457,12458],[4469,12462],[4481,12465],[4486,9180],[4493,17585],[4506,17657],[4519,17641],[4532,17593],[4545,11394],[4558,17597],[4573,8490],[4574,11386],[4581,19617],[4594,12472],[4606,12476],[4618,12480],[4630,12484],[4642,12487],[4647,9969],[4654,22664],[4667,20230],[4680,21554],[4693,2925],[4706,21546],[4721,7049],[4722,19736],[4729,19641],[4742,12494],[4754,12498],[4766,12502],[4778,12505],[4783,9625],[4790,3],[4803,3916],[4816,20222],[4829,17589],[4844,7061],[4845,21548],[4852,7589],[4857,10552],[4865,12512],[4877,12516],[4889,12519],[4894,9718],[4901,19734],[4914,20237],[4927,21550],[4942,7073],[4943,21557],[4950,8668],[4963,12526],[4975,12529],[4980,9681],[4987,17621],[5000,20215],[5015,7085],[5016,21544],[5023,9605],[5028,10531],[5034,10723],[5036,12535],[5041,9693],[5047,10959],[5048,21932],[5054,11053],[5063,7097],[5064,21552],[5071,9791],[5077,9705],[5086,7109],[5087,20262],[5094,3236],[5095,13874],[5108,21206],[5109,5090],[5122,21193],[5123,5104],[5136,7646],[5137,5118],[5150,21216],[5151,5132],[5164,7679],[5165,5146],[5178,21221],[5179,5160],[5192,3971],[5193,13755],[5215,20110],[5216,20479],[5221,19816],[5222,13425],[5227,3077],[5228,13450],[5233,6911],[5234,6261],[5239,17923],[5240,13426],[5245,17895],[5246,6094],[5251,2804],[5252,13428],[5257,19811],[5258,6106],[5263,17943],[5264,13430],[5269,17885],[5270,6118],[5275,17893],[5276,13432],[5281,19813],[5282,6309],[5287,510],[5288,13435],[5293,17917],[5294,14077],[5299,3065],[5300,6132],[5305,21628],[5306,13436],[5307,1336],[5312,21605],[5313,13441],[5318,20381],[5324,20366],[5325,6175],[5330,6790],[5336,6828],[5337,6188],[5342,17889],[5348,17901],[5349,6201],[5354,3113],[5360,17941],[5361,6214],[5366,6657],[5372,17921],[5373,13306],[5378,6631],[5384,17949],[5385,13895],[5390,3089],[5397,21592],[5398,7857],[5404,23778],[5405,13461],[5410,20359],[5411,6496],[5416,17929],[5417,13451],[5422,6742],[5423,6280],[5428,5204],[5429,13453],[5434,6521],[5435,6292],[5440,6547],[5441,13455],[5446,17891],[5447,6304],[5452,17899],[5453,13457],[5458,6768],[5459,6470],[5464,17919],[5465,13460],[5470,17927],[5471,14046],[5476,17931],[5477,6318],[5482,9193],[5483,3413],[5484,13866],[5489,17887],[5490,6348],[5495,17903],[5501,20374],[5502,6361],[5507,21602],[5513,17947],[5514,6374],[5519,17951],[5525,21593],[5526,6387],[5531,6495],[5537,582],[5538,13332],[5543,558],[5549,534],[5550,13893],[5555,19815],[5562,21598],[5563,7202],[5569,21509],[5570,13489],[5575,22722],[5576,6441],[5581,3053],[5582,6577],[5587,21595],[5588,6453],[5593,22397],[5594,13483],[5599,17957],[5600,6465],[5605,17897],[5606,13485],[5611,19817],[5612,6606],[5617,22396],[5618,13488],[5623,6360],[5624,14017],[5629,17925],[5630,6479],[5635,9982],[5636,3566],[5637,13855],[5642,19818],[5643,13500],[5648,6386],[5654,3041],[5655,6522],[5660,17961],[5666,6174],[5667,6535],[5672,6226],[5678,6200],[5679,13354],[5684,17959],[5690,17963],[5691,13891],[5696,6148],[5703,21594],[5704,7343],[5710,23781],[5711,13520],[5716,6889],[5717,6589],[5722,17967],[5723,6700],[5728,164],[5729,6601],[5734,5097],[5735,13516],[5740,5111],[5741,6717],[5746,5125],[5747,13519],[5752,5153],[5753,13990],[5758,5167],[5759,6615],[5764,9613],[5765,3695],[5766,13841],[5771,5181],[5772,6645],[5777,5195],[5783,6064],[5784,6658],[5789,6076],[5795,6100],[5796,13372],[5801,6112],[5807,6124],[5808,22400],[5813,6155],[5820,21596],[5821,7460],[5827,21511],[5828,13554],[5833,19812],[5834,6712],[5839,3125],[5840,6798],[5845,6569],[5846,6803],[5851,20384],[5852,13553],[5857,21331],[5858,13965],[5863,21606],[5864,6726],[5869,9564],[5870,3800],[5871,13824],[5876,21597],[5877,13571],[5882,17945],[5888,6334],[5889,13386],[5894,6248],[5900,5139],[5901,22723],[5906,6088],[5913,6399],[5914,7553],[5920,23787],[5921,13591],[5926,6136],[5927,8280],[5932,6168],[5933,13590],[5938,6181],[5939,13942],[5944,6194],[5945,6812],[5950,9576],[5951,3881],[5952,13804],[5957,6233],[5958,13611],[5963,6243],[5969,6220],[5970,23157],[5975,6262],[5982,6670],[5983,7622],[5989,22236],[5990,13631],[5994,11206],[5995,22721],[5996,13759],[6000,11227],[6001,3101],[6002,6873],[6007,9588],[6008,3938],[6009,13781],[6014,19814],[6015,23949],[6020,19820],[6027,6347],[6028,7667],[6034,21207],[6035,21151],[6040,9600],[6041,13674],[6042,21861],[6048,6373],[6049,25287],[6055,868],[6068,5220],[6080,5232],[6092,5244],[6104,5256],[6116,5268],[6128,5280],[6140,5292],[6145,21624],[6152,11436],[6165,21579],[6178,22377],[6191,19785],[6204,21577],[6217,20319],[6230,22379],[6245,11450],[6246,11420],[6253,21867],[6266,5409],[6278,5421],[6290,5433],[6302,5445],[6314,5457],[6326,5469],[6331,21656],[6338,17785],[6351,17857],[6364,17841],[6377,5736],[6390,5583],[6403,5712],[6418,11476],[6419,11428],[6426,22593],[6439,5574],[6451,5586],[6463,5598],[6475,5610],[6487,5622],[6492,21688],[6499,5841],[6512,5984],[6525,20326],[6538,5206],[6551,20318],[6566,796],[6567,21578],[6574,20109],[6587,5715],[6599,5727],[6611,5739],[6623,5751],[6628,21720],[6635,21586],[6648,17],[6661,5210],[6674,5430],[6689,808],[6690,21580],[6697,21865],[6710,5832],[6722,5844],[6734,5856],[6739,21752],[6746,5607],[6759,20333],[6772,12376],[6787,820],[6788,21576],[6795,21183],[6808,5925],[6820,5937],[6825,21784],[6832,12384],[6845,17789],[6860,832],[6861,21582],[6868,22595],[6881,5994],[6886,21816],[6893,21584],[6908,844],[6909,5229],[6916,1150],[6922,21848],[6931,856],[6932,20358],[6939,5401],[6940,21209],[6953,19606],[6954,21187],[6967,19612],[6968,21213],[6981,19610],[6982,21188],[6995,19616],[6996,21218],[7009,6991],[7010,19614],[7023,6039],[7024,14520],[7046,19608],[7047,14228],[7052,20491],[7053,7940],[7058,8355],[7059,14218],[7064,20470],[7065,7724],[7070,21634],[7071,14220],[7076,18079],[7077,7736],[7082,19861],[7083,14222],[7088,21625],[7089,7748],[7094,8101],[7095,14224],[7100,5098],[7101,7914],[7106,19863],[7107,14227],[7112,19865],[7113,14805],[7118,3254],[7119,7762],[7124,21662],[7125,5481],[7126,14631],[7131,2818],[7132,7792],[7137,8234],[7143,20462],[7144,7805],[7149,8272],[7155,18093],[7156,7818],[7161,18149],[7167,18085],[7168,7831],[7173,18141],[7179,18121],[7180,14122],[7185,7965],[7191,3278],[7192,14652],[7197,8075],[7204,21630],[7205,9097],[7211,6935],[7212,14256],[7217,22756],[7218,7885],[7223,3242],[7224,8021],[7229,21627],[7230,7897],[7235,18091],[7236,14250],[7241,18157],[7242,7909],[7247,18097],[7248,14252],[7253,19867],[7254,8050],[7259,18119],[7260,14255],[7265,7804],[7266,14776],[7271,18125],[7272,7923],[7277,21694],[7278,5634],[7279,14620],[7284,19868],[7285,14266],[7290,20495],[7296,7830],[7297,7966],[7302,18161],[7308,3302],[7309,7979],[7314,18101],[7320,18129],[7321,14144],[7326,2944],[7332,5334],[7333,14650],[7338,5358],[7345,21626],[7346,8608],[7352,6949],[7353,14287],[7358,5382],[7359,8033],[7364,7035],[7365,8144],[7370,18095],[7371,8045],[7376,18099],[7377,14283],[7382,8212],[7383,8161],[7388,18123],[7389,14286],[7394,18127],[7395,14749],[7400,18131],[7401,8059],[7406,9637],[7407,5763],[7408,14606],[7413,18087],[7414,8089],[7419,18103],[7425,18159],[7426,8102],[7431,22435],[7437,771],[7438,14162],[7443,22434],[7449,18163],[7450,22438],[7455,18117],[7462,18089],[7463,8725],[7469,6963],[7470,14321],[7475,19862],[7476,8156],[7481,3314],[7482,8242],[7487,8013],[7488,8247],[7493,7991],[7494,14320],[7499,21367],[7500,14724],[7505,747],[7506,8170],[7511,9730],[7512,5868],[7513,14589],[7518,21629],[7519,14337],[7524,18145],[7530,7778],[7531,14176],[7536,7692],[7542,20480],[7543,22757],[7548,18143],[7555,7843],[7556,8818],[7562,6977],[7563,14358],[7568,18147],[7569,9372],[7574,18151],[7575,14357],[7580,18167],[7581,14701],[7586,21638],[7587,8256],[7592,9799],[7593,5949],[7594,14569],[7599,723],[7600,14377],[7605,699],[7611,5310],[7612,23247],[7617,7939],[7624,8114],[7625,8887],[7631,6037],[7632,14398],[7637,22755],[7638,14524],[7643,3290],[7644,8317],[7649,9774],[7650,6006],[7651,14546],[7656,19864],[7657,23999],[7662,19870],[7669,7791],[7670,8932],[7676,21189],[7677,21166],[7682,9786],[7683,14441],[7684,21869],[7690,7817],[7691,25699],[7697,19585],[7710,7051],[7722,7063],[7734,7075],[7746,7087],[7758,7099],[7770,7111],[7775,21660],[7782,17975],[7795,21611],[7808,20417],[7821,19837],[7834,20418],[7847,20415],[7862,11484],[7863,11458],[7870,10877],[7883,7216],[7895,7228],[7907,7240],[7919,7252],[7931,7264],[7936,21692],[7943,7483],[7956,7626],[7969,20422],[7982,7037],[7995,20414],[8010,11506],[8011,21610],[8018,19593],[8031,7357],[8043,7369],[8055,7381],[8067,7393],[8072,21726],[8079,21618],[8092,31],[8105,5092],[8118,7072],[8133,11524],[8134,21612],[8141,19601],[8154,7474],[8166,7486],[8178,7498],[8183,21758],[8190,7249],[8203,20429],[8216,12414],[8231,1102],[8232,21608],[8239,10315],[8252,7567],[8264,7579],[8269,21790],[8276,17989],[8289,17993],[8304,1114],[8305,21614],[8312,19597],[8325,7636],[8330,21822],[8337,21616],[8352,1126],[8353,13291],[8360,19645],[8366,21854],[8375,1138],[8376,20454],[8383,7276],[8384,15295],[8397,9848],[8398,22282],[8411,23768],[8412,24244],[8425,9881],[8426,23790],[8439,19653],[8440,21201],[8453,7681],[8454,15195],[8476,10449],[8477,20667],[8482,22786],[8483,8977],[8488,3157],[8489,9113],[8494,21659],[8495,8989],[8500,5499],[8501,14927],[8506,18285],[8507,9001],[8512,18297],[8513,14929],[8518,19913],[8519,9142],[8524,22468],[8525,14932],[8530,18317],[8531,15442],[8536,18325],[8537,9015],[8542,21658],[8543,14933],[8544,22884],[8549,19914],[8550,14942],[8555,20591],[8561,18301],[8562,9058],[8567,3467],[8573,18357],[8574,9071],[8579,7177],[8585,18329],[8586,14847],[8591,7153],[8597,18361],[8598,15316],[8603,3443],[8610,9364],[8611,10009],[8617,8379],[8618,14964],[8623,2956],[8624,9125],[8629,22469],[8630,9236],[8635,5547],[8636,9137],[8641,8465],[8642,14960],[8647,5523],[8648,9253],[8653,9304],[8654,14963],[8659,18323],[8660,15415],[8665,18327],[8666,9151],[8671,7411],[8672,7405],[8673,15281],[8678,18287],[8679,9181],[8684,18295],[8690,18299],[8691,9194],[8696,18303],[8702,18331],[8703,14865],[8708,18359],[8714,18363],[8715,22472],[8720,18367],[8727,9326],[8728,9662],[8734,8393],[8735,14998],[8740,19908],[8741,9248],[8746,3479],[8747,9334],[8752,9105],[8753,9339],[8758,20576],[8759,14997],[8764,21399],[8765,15390],[8770,9057],[8771,9262],[8776,7362],[8777,7510],[8778,15264],[8783,21661],[8784,15013],[8789,18293],[8795,18341],[8796,14879],[8801,18345],[8807,18349],[8808,22787],[8813,7141],[8820,7189],[8821,9755],[8827,8407],[8828,15035],[8833,7129],[8834,10161],[8839,6944],[8840,15034],[8845,3419],[8846,15367],[8851,21670],[8852,9348],[8857,7374],[8858,7591],[8859,15244],[8864,9083],[8865,15053],[8870,18343],[8876,18347],[8877,23333],[8882,18351],[8889,9206],[8890,9824],[8896,8421],[8897,15075],[8902,22785],[8903,15199],[8908,3455],[8909,9409],[8914,7165],[8915,7648],[8916,15221],[8921,19910],[8922,24045],[8927,19916],[8934,18321],[8935,9869],[8941,21210],[8942,21147],[8947,7398],[8948,15118],[8949,20106],[8955,9167],[8956,26107],[8962,11152],[8975,8481],[8987,8493],[8999,8505],[9011,8517],[9023,8529],[9028,21690],[9035,8748],[9048,8891],[9061,20518],[9074,8467],[9087,20510],[9102,21674],[9103,21642],[9110,21190],[9123,8622],[9135,8634],[9147,8646],[9159,8658],[9164,21722],[9171,21650],[9184,45],[9197,5106],[9210,12448],[9225,21706],[9226,21644],[9233,21874],[9246,8739],[9258,8751],[9270,8763],[9275,21754],[9282,8514],[9295,20525],[9308,12440],[9323,21738],[9324,21640],[9331,11372],[9344,8832],[9356,8844],[9361,21786],[9368,14107],[9381,18189],[9396,21770],[9397,21646],[9404,21866],[9417,8901],[9422,21818],[9429,21648],[9444,21802],[9445,13317],[9452,21868],[9458,21850],[9467,21834],[9468,20550],[9475,8614],[9476,19636],[9489,19634],[9490,24243],[9503,19640],[9504,19655],[9517,9499],[9518,19638],[9531,8946],[9532,15780],[9554,10934],[9555,15551],[9560,18475],[9561,9914],[9566,21691],[9567,10025],[9572,22499],[9573,9926],[9578,18485],[9579,15547],[9584,8387],[9585,10042],[9590,19955],[9591,15550],[9596,22498],[9597,15988],[9602,18517],[9603,9940],[9608,7435],[9609,8670],[9610,15866],[9615,3608],[9616,9970],[9621,18497],[9627,18501],[9628,9983],[9633,7318],[9639,18525],[9640,15481],[9645,18529],[9651,3584],[9652,22502],[9657,7294],[9664,10115],[9665,10642],[9671,9471],[9672,15585],[9677,19950],[9678,10037],[9683,3620],[9684,10123],[9689,9894],[9690,10128],[9695,20672],[9696,15584],[9701,21427],[9702,15963],[9707,21702],[9708,10051],[9713,7528],[9714,8775],[9715,15849],[9720,21693],[9721,15599],[9726,18493],[9732,18541],[9733,15495],[9738,18545],[9744,18549],[9745,22813],[9750,7282],[9757,7330],[9758,10413],[9764,9485],[9765,15622],[9770,7056],[9771,10696],[9776,6958],[9777,15621],[9782,18557],[9783,15940],[9788,18561],[9789,10137],[9794,7597],[9795,8856],[9796,15829],[9801,3346],[9802,15639],[9807,2968],[9813,5640],[9814,23415],[9819,9543],[9826,9995],[9827,10482],[9833,8944],[9834,15662],[9839,22811],[9840,15784],[9845,3596],[9846,10198],[9851,7306],[9852,8913],[9853,15806],[9858,19952],[9859,24087],[9864,19958],[9871,18521],[9872,10527],[9878,21195],[9879,21162],[9884,7584],[9885,15705],[9886,20116],[9892,9956],[9893,26511],[9899,140],[9912,9559],[9924,9571],[9936,9583],[9948,9595],[9953,21724],[9960,20635],[9973,9828],[9986,20641],[9999,9545],[10014,21708],[10015,21676],[10022,21182],[10035,9676],[10047,9688],[10059,9700],[10064,21756],[10071,14848],[10084,20621],[10097,20606],[10112,21740],[10113,21672],[10120,5201],[10133,9769],[10145,9781],[10150,21788],[10157,5120],[10170,18389],[10185,21772],[10186,21678],[10193,19589],[10206,9838],[10211,21820],[10218,21680],[10233,21804],[10234,5407],[10241,19625],[10247,21852],[10256,21836],[10257,20646],[10264,9712],[10265,16344],[10278,10967],[10279,23794],[10292,11214],[10293,23792],[10306,9883],[10307,16275],[10329,8854],[10330,20114],[10335,19988],[10336,10572],[10341,3737],[10342,10658],[10347,9480],[10348,10663],[10353,20768],[10354,16081],[10359,21451],[10360,16443],[10365,21734],[10366,10586],[10371,7540],[10372,16082],[10373,20853],[10378,21725],[10379,16095],[10384,18685],[10390,18741],[10391,16024],[10396,18757],[10402,7221],[10403,16365],[10408,18745],[10415,7447],[10416,11045],[10422,10260],[10423,16119],[10428,18749],[10429,11026],[10434,18761],[10435,16118],[10440,7068],[10441,16420],[10446,6972],[10447,10672],[10452,9649],[10453,9793],[10454,16324],[10459,3358],[10460,16135],[10465,2980],[10471,5579],[10472,23493],[10477,10318],[10484,18693],[10485,10910],[10491,10274],[10492,16159],[10497,22833],[10498,16279],[10503,3713],[10504,10733],[10509,7014],[10510,9850],[10511,16301],[10516,19990],[10517,24125],[10522,19996],[10529,7423],[10530,10955],[10536,21214],[10537,21141],[10542,7028],[10543,16202],[10544,21853],[10550,18721],[10551,26911],[10557,19629],[10570,10334],[10582,10346],[10594,10358],[10599,9742],[10606,14866],[10619,20717],[10632,20702],[10647,21736],[10648,21704],[10655,21864],[10668,10427],[10680,10439],[10685,9811],[10692,5134],[10705,18589],[10720,21768],[10721,21710],[10728,21870],[10741,10496],[10746,9856],[10753,21712],[10768,21800],[10769,5419],[10776,19621],[10782,9843],[10791,21832],[10792,20742],[10799,10419],[10800,19656],[10813,10795],[10814,19654],[10827,10541],[10828,16680],[10850,11329],[10851,16526],[10856,11104],[10857,16525],[10862,9494],[10863,16565],[10868,20864],[10869,16807],[10874,21471],[10875,11002],[10880,6986],[10881,10451],[10882,16729],[10887,21766],[10888,16541],[10893,18941],[10899,18957],[10900,23567],[10905,18945],[10912,7080],[10913,11267],[10919,10539],[10920,16566],[10925,22851],[10926,16684],[10931,3806],[10932,11063],[10937,7104],[10938,10508],[10939,16706],[10944,10983],[10945,24159],[10950,20024],[10957,7516],[10958,11202],[10964,21199],[10965,21159],[10970,7116],[10971,16609],[10972,20030],[10978,7233],[10979,27307],[10985,21175],[10998,10855],[11010,10867],[11015,7609],[11022,18839],[11035,20813],[11050,21774],[11051,21742],[11058,21197],[11071,10924],[11076,7654],[11083,21744],[11098,21806],[11099,5431],[11106,19649],[11112,7641],[11121,21838],[11122,20838],[11129,10847],[11130,16883],[11143,10969],[11144,16995],[11166,10916],[11167,17021],[11172,22865],[11173,16999],[11178,3769],[11179,11237],[11184,7479],[11185,10936],[11186,21037],[11191,10803],[11192,24189],[11197,20054],[11204,7000],[11205,17269],[11211,21219],[11212,21133],[11217,7092],[11218,16926],[11219,20060],[11225,7245],[11226,27699],[11232,21196],[11245,11171],[11250,7491],[11257,21776],[11272,5455],[11273,5443],[11280,5479],[11286,7503],[11295,5467],[11296,20934],[11303,11216],[11304,17220],[11326,20080],[11327,21156],[11332,7257],[11333,17153],[11334,20086],[11340,7386],[11341,28087],[11347,21222],[11353,3028],[11362,21126],[11363,21030],[22981,10],[23079,386],[23169,5099],[23259,788],[23292,8402],[23294,8388],[23341,9549],[23423,1094],[23456,10283],[23458,10269],[23497,10845],[23571,1304],[23606,11134],[23866,3026],[23868,3227],[23870,3404],[23872,3557],[23874,3686],[23876,3791],[23878,3872],[23880,3929],[23922,5223],[23924,5412],[23926,5577],[23928,5718],[23930,5835],[23932,5928],[23934,5997],[23974,7054],[23976,7219],[23978,7360],[23980,7477],[23982,7570],[23984,7639],[24022,8484],[24024,8625],[24026,8742],[24028,8835],[24030,8904],[24066,9562],[24068,9679],[24070,9772],[24072,9841],[24106,10337],[24108,10430],[24110,10499],[24142,10858],[24144,10927],[24174,11174],[24258,20140],[24261,22239],[24262,429],[24263,387],[24264,22885],[24265,23802],[24266,600],[24267,17372],[24268,807],[24269,789],[24270,17370],[24271,23801],[24272,150],[24273,20147],[24274,22892],[24275,405],[24276,17405],[24277,21521],[24278,954],[24279,17376],[24280,17407],[24281,1095],[24282,17374],[24283,20123],[24284,168],[24285,22895],[24286,477],[24287,1305],[24288,17409],[24289,21519],[24290,20146],[24291,17380],[24292,17411],[24293,20121],[24294,17378],[24295,20124],[24296,1212],[24297,22904],[24298,489],[24299,453],[24300,17413],[24301,20135],[24302,1374],[24303,17384],[24304,17415],[24305,1419],[24306,17382],[24307,264],[24308,20122],[24315,20150],[24316,22898],[24317,17375],[24318,20137],[24319,21223],[24320,17371],[24321,17408],[24322,20153],[24323,17369],[24324,17406],[24325,20131],[24326,17373],[24327,22901],[24328,855],[24329,20149],[24330,20160],[24331,21225],[24332,17377],[24333,17412],[24334,20157],[24335,17379],[24336,17410],[24337,20132],[24338,20129],[24339,22907],[24340,867],[24341,831],[24342,20165],[24343,21884],[24344,17381],[24345,17416],[24346,20162],[24347,17383],[24348,17414],[24349,690],[24350,20130],[24357,22238],[24358,1137],[24359,20156],[24360,22888],[24361,23804],[24362,20152],[24363,17436],[24364,1323],[24365,20155],[24366,17434],[24367,23803],[24368,20159],[24369,22910],[24370,1149],[24371,20161],[24372,17453],[24373,20145],[24374,1113],[24375,17440],[24376,17455],[24377,20136],[24378,17438],[24379,1020],[24380,20164],[24387,22914],[24388,1335],[24389,17439],[24390,22912],[24391,1392],[24392,17435],[24393,17456],[24394,1425],[24395,17433],[24396,17454],[24397,1254],[24398,17437],[24441,11915],[24442,11917],[24443,11900],[24444,11901],[24445,11903],[24446,11905],[24447,11907],[24448,11909],[24449,11911],[24450,11913],[24478,22241],[24479,2394],[24481,22935],[24482,23832],[24484,17472],[24485,2368],[24487,17470],[24488,23831],[24490,20195],[24491,22942],[24493,17505],[24494,21537],[24496,17476],[24497,17507],[24499,17474],[24500,20171],[24502,22945],[24503,1652],[24505,17509],[24506,21535],[24508,17480],[24509,17511],[24511,17478],[24512,20172],[24514,22954],[24515,114],[24517,17513],[24518,20183],[24520,17484],[24521,17515],[24523,17482],[24524,128],[24525,20196],[24528,20173],[24532,20198],[24533,22948],[24535,20185],[24536,21246],[24538,17508],[24539,20201],[24541,17506],[24542,20179],[24544,22951],[24545,1626],[24547,20208],[24548,21248],[24550,17512],[24551,20205],[24553,17510],[24554,20180],[24556,22957],[24557,86],[24559,20213],[24560,21910],[24562,17516],[24563,20210],[24565,17514],[24566,100],[24567,20199],[24570,20181],[24574,22240],[24575,1600],[24577,22938],[24578,23834],[24580,17536],[24581,1574],[24583,17534],[24584,23833],[24586,22960],[24587,58],[24589,17553],[24590,20193],[24592,17540],[24593,17555],[24595,17538],[24596,72],[24597,20202],[24600,20187],[24604,22964],[24605,30],[24607,22962],[24608,16],[24610,17556],[24611,2],[24613,17554],[24614,44],[24615,20206],[24618,20191],[24621,20211],[24624,21909],[24680,20236],[24689,17572],[24690,3350],[24691,3332],[24692,17570],[24693,23861],[24694,3143],[24701,17576],[24702,17607],[24703,3638],[24704,17574],[24705,20219],[24706,3497],[24713,17580],[24714,17611],[24715,3848],[24716,17578],[24717,20220],[24718,3755],[24725,17584],[24726,17615],[24727,3962],[24728,17582],[24729,266],[24730,3917],[24737,20246],[24738,22998],[24739,17575],[24740,20233],[24741,21269],[24742,17571],[24743,17608],[24744,20249],[24745,17569],[24746,17606],[24747,20227],[24748,17573],[24749,23001],[24750,3398],[24751,20245],[24752,20256],[24753,21271],[24754,17577],[24755,17612],[24756,20253],[24757,17579],[24758,17610],[24759,20228],[24760,20225],[24761,23007],[24762,3410],[24763,3374],[24764,20261],[24765,21936],[24766,17581],[24767,17616],[24768,20258],[24769,17583],[24770,17614],[24771,3233],[24772,20226],[24779,22242],[24780,3680],[24781,20252],[24782,22988],[24783,23864],[24784,20248],[24785,17636],[24786,3866],[24787,20251],[24788,17634],[24789,23863],[24790,20255],[24791,23010],[24792,3692],[24793,20257],[24794,17653],[24795,20241],[24796,3656],[24797,17640],[24798,17655],[24799,20232],[24800,17638],[24801,3563],[24802,20260],[24809,23014],[24810,3878],[24811,17639],[24812,23012],[24813,3935],[24814,17635],[24815,17656],[24816,3968],[24817,17633],[24818,17654],[24819,3797],[24820,17637],[24861,12860],[24863,12845],[24864,12846],[24865,12848],[24866,12850],[24867,12852],[24868,12854],[24869,12856],[24870,12858],[24897,4689],[24898,22245],[24899,5021],[24900,23033],[24901,23890],[24902,4948],[24903,4663],[24904,17672],[24905,4850],[24906,17670],[24907,23889],[24908,5069],[24909,20291],[24910,23040],[24911,4579],[24912,17705],[24913,21569],[24914,4910],[24915,17676],[24916,17707],[24917,4996],[24918,17674],[24919,20267],[24920,4727],[24921,23043],[24922,357],[24923,20290],[24924,17709],[24925,21567],[24926,4406],[24927,17680],[24928,17711],[24929,4208],[24930,17678],[24931,20268],[24932,20265],[24933,23052],[24934,2894],[24935,4368],[24939,17684],[24940,17715],[24941,20266],[24945,20292],[24948,20269],[24951,20294],[24952,23046],[24953,17675],[24954,20281],[24955,21290],[24956,17671],[24957,17708],[24958,20297],[24959,17669],[24960,17706],[24961,20275],[24962,17673],[24963,23049],[24964,333],[24965,20293],[24966,20304],[24967,21292],[24968,17677],[24969,17712],[24970,20301],[24971,17679],[24972,17710],[24973,20276],[24974,20273],[24975,23055],[24976,2866],[24977,4342],[24981,17716],[24982,20306],[24983,20274],[24987,20295],[24990,20277],[24993,22244],[24994,309],[24995,20300],[24996,23036],[24997,23892],[24998,20296],[24999,17736],[25000,285],[25001,20299],[25002,17734],[25003,23891],[25004,20303],[25005,23058],[25006,2838],[25007,4316],[25011,17740],[25012,17755],[25013,20280],[25017,20298],[25020,20283],[25023,23062],[25024,2810],[25025,17735],[25029,17756],[25030,152],[25031,17733],[25035,20302],[25038,20287],[25041,20307],[25098,20332],[25155,20342],[25156,23094],[25157,17775],[25158,20329],[25159,21311],[25160,17771],[25161,17808],[25162,20345],[25163,17769],[25164,17806],[25165,20323],[25166,17773],[25167,5466],[25168,23097],[25169,20341],[25170,20352],[25171,21313],[25172,17777],[25173,17812],[25174,20349],[25175,17779],[25176,17810],[25177,20324],[25178,20321],[25179,5478],[25180,23103],[25181,5442],[25182,20357],[25183,21984],[25184,17781],[25185,17816],[25186,20354],[25187,17783],[25188,5301],[25189,17814],[25190,20322],[25197,5748],[25198,22246],[25199,20348],[25200,23084],[25201,23920],[25202,20344],[25203,5934],[25204,17836],[25205,20347],[25206,17834],[25207,23919],[25208,20351],[25209,5760],[25210,23106],[25211,5724],[25212,17853],[25213,20337],[25214,20356],[25215,17840],[25216,17855],[25217,20353],[25218,5631],[25219,17838],[25220,20328],[25227,5946],[25228,23110],[25229,17839],[25230,6003],[25231,23108],[25232,17835],[25233,6036],[25234,17856],[25235,17833],[25236,5865],[25237,17854],[25238,17837],[25277,13715],[25280,3035],[25281,13703],[25282,13705],[25283,13707],[25284,13709],[25285,13711],[25286,13713],[25313,6534],[25314,22249],[25315,6866],[25316,23127],[25317,23944],[25318,6793],[25319,6508],[25320,17872],[25321,6695],[25322,17870],[25323,23943],[25324,6914],[25325,20387],[25326,23134],[25327,6424],[25328,17905],[25329,21601],[25330,6755],[25331,17876],[25332,17907],[25333,6841],[25334,17874],[25335,20363],[25336,6572],[25337,23137],[25338,570],[25339,6053],[25340,17909],[25341,21599],[25342,20386],[25343,17880],[25344,17911],[25345,20361],[25346,17878],[25347,20364],[25348,6251],[25361,20388],[25364,20365],[25367,20390],[25368,23140],[25369,17875],[25370,20377],[25371,21330],[25372,17871],[25373,17908],[25374,20393],[25375,17869],[25376,17906],[25377,20371],[25378,17873],[25379,23143],[25380,546],[25381,20389],[25382,20400],[25383,21332],[25384,17877],[25385,17912],[25386,20397],[25387,17879],[25388,17910],[25389,20372],[25390,20369],[25403,20391],[25406,20373],[25409,22248],[25410,522],[25411,20396],[25412,23130],[25413,23946],[25414,20392],[25415,17936],[25416,498],[25417,20395],[25418,17934],[25419,23945],[25420,20399],[25433,20394],[25436,20379],[25451,20398],[25454,20383],[25512,20428],[25575,18008],[25576,20441],[25577,17969],[25578,18006],[25579,20419],[25580,17973],[25587,18012],[25588,20445],[25589,17979],[25590,18010],[25591,20420],[25592,17977],[25599,18016],[25600,20450],[25601,17983],[25602,5303],[25603,18014],[25604,17981],[25611,7390],[25612,22250],[25613,20444],[25614,23176],[25615,23972],[25616,20440],[25617,7576],[25618,18036],[25619,20443],[25620,18034],[25621,23971],[25622,20447],[25623,7402],[25624,23198],[25625,7366],[25626,18053],[25627,20433],[25628,20452],[25629,18040],[25630,18055],[25631,20449],[25632,7273],[25633,18038],[25634,20424],[25641,7588],[25642,23202],[25643,18039],[25644,7645],[25645,23200],[25646,18035],[25647,7678],[25648,18056],[25649,18033],[25650,7507],[25651,18054],[25652,18037],[25689,14480],[25693,5304],[25694,14470],[25695,14472],[25696,14474],[25697,14476],[25698,14478],[25725,7978],[25726,22253],[25727,8310],[25728,23217],[25729,23994],[25730,8237],[25731,7952],[25732,18072],[25733,8139],[25734,18070],[25735,23993],[25736,8358],[25737,20483],[25738,23224],[25739,7868],[25740,18105],[25741,21633],[25742,8199],[25743,18076],[25744,18107],[25745,8285],[25746,18074],[25747,20459],[25748,8016],[25749,23227],[25750,759],[25751,20482],[25755,18080],[25756,18111],[25757,20457],[25773,20484],[25776,20461],[25779,20486],[25780,23230],[25781,18075],[25782,20473],[25783,21366],[25784,18071],[25785,18108],[25786,20489],[25787,18069],[25788,18106],[25789,20467],[25790,18073],[25791,23233],[25792,735],[25793,20485],[25797,18112],[25798,20493],[25799,20465],[25815,20487],[25818,20469],[25821,22252],[25822,711],[25823,20488],[25827,18136],[25828,401],[25829,20492],[25845,20490],[25848,20475],[25863,20494],[25922,20524],[26021,8655],[26022,22254],[26023,20540],[26024,23264],[26025,24020],[26026,20536],[26027,8841],[26028,18236],[26029,20539],[26030,18234],[26031,24019],[26032,20543],[26033,8667],[26034,23286],[26035,8631],[26036,18253],[26037,20529],[26038,20548],[26039,18240],[26040,18255],[26041,20545],[26042,8538],[26043,18238],[26044,20520],[26051,8853],[26052,23290],[26053,18239],[26054,8910],[26055,23288],[26056,18235],[26057,8943],[26058,18256],[26059,18233],[26060,8772],[26061,18254],[26062,18237],[26097,15155],[26102,7123],[26103,15147],[26104,15149],[26105,15151],[26106,15153],[26133,9070],[26134,22257],[26135,9402],[26136,23303],[26137,24040],[26138,9329],[26139,9044],[26140,18272],[26141,9231],[26142,18270],[26143,24039],[26144,9450],[26145,20579],[26146,23310],[26147,8960],[26148,18305],[26149,21665],[26150,9291],[26151,18276],[26152,18307],[26153,9377],[26154,18274],[26155,20555],[26156,9108],[26181,20580],[26184,20557],[26187,20582],[26188,23316],[26189,18275],[26190,20569],[26191,21398],[26192,18271],[26193,18308],[26194,20585],[26195,18269],[26196,18306],[26197,20563],[26198,18273],[26223,20583],[26226,20565],[26253,20586],[26256,20571],[26328,20620],[26433,9778],[26434,18436],[26435,20636],[26436,18434],[26437,24063],[26438,20639],[26445,18440],[26446,18455],[26447,20616],[26448,8540],[26449,18438],[26450,20644],[26457,9790],[26458,23374],[26459,18439],[26460,9847],[26461,23372],[26462,18435],[26463,9880],[26464,18456],[26465,18433],[26466,9709],[26467,18454],[26468,18437],[26501,15740],[26507,8541],[26508,15734],[26509,15736],[26510,15738],[26537,8583],[26538,22261],[26539,10191],[26540,23385],[26541,24082],[26542,10118],[26543,8559],[26544,18472],[26545,10020],[26546,18470],[26547,24081],[26548,10239],[26549,20675],[26550,23392],[26551,10080],[26555,18476],[26556,18507],[26557,10166],[26585,20676],[26588,20653],[26591,20678],[26592,23398],[26593,18471],[26597,18508],[26598,20681],[26599,18469],[26627,20679],[26630,20661],[26657,20682],[26730,20716],[26859,10448],[26860,23454],[26861,18639],[26862,10505],[26863,23452],[26864,18635],[26865,10538],[26866,18656],[26867,18633],[26868,10367],[26869,18654],[26870,18637],[26901,16235],[26908,9607],[26909,16231],[26910,16233],[26937,8700],[26938,22265],[26939,10726],[26940,23463],[26941,24120],[26942,10653],[26943,8676],[26944,18672],[26945,10555],[26946,18670],[26947,24119],[26948,10774],[26985,20772],[26988,20749],[27027,20775],[27030,20757],[27128,20812],[27263,10966],[27264,18856],[27265,18833],[27266,10369],[27267,18854],[27268,18837],[27297,16640],[27305,10370],[27306,16638],[27333,8793],[27334,22269],[27335,11056],[27339,8627],[27340,18872],[27341,10268],[27381,20868],[27384,20845],[27423,20871],[27522,20908],[27689,16955],[27698,10879],[27773,20964],[27776,20941],[28077,11183],[28161,21060],[28667,2907],[28669,127],[28672,3144],[28674,2931],[28677,7043],[28679,7208],[28682,9551],[28684,9668],[28694,3564],[28697,15],[28700,7274],[28703,2795],[28706,29],[28709,43],[28712,2809],[28715,2823],[28718,57],[28721,71],[28724,2837],[28727,2851],[28730,85],[28733,99],[28736,2865],[28739,1426],[28741,11323],[28743,113],[28744,17319],[28746,2893],[28748,3333],[28751,3498],[28754,5212],[28757,5566],[28760,3639],[28763,3756],[28766,5707],[28769,5824],[28772,3849],[28775,3918],[28778,5917],[28781,5986],[28783,5174],[28785,3963],[28786,6031],[28788,7005],[28790,7349],[28793,7466],[28796,8473],[28799,8731],[28802,7559],[28805,7628],[28808,8824],[28811,8893],[28813,7673],[28815,8435],[28816,8938],[28818,9513],[28820,9761],[28823,9830],[28826,10326],[28829,10488],[28831,9875],[28833,10288],[28834,10533],[28836,10809],[28837,10961],[28839,11125],[28840,11163],[28842,11208]]} diff --git a/research/bit-reuse-147/price147.py b/research/bit-reuse-147/price147.py new file mode 100644 index 0000000000..adbe8342ea --- /dev/null +++ b/research/bit-reuse-147/price147.py @@ -0,0 +1,104 @@ +"""Price a shared-core bit row with the merged #144 arithmetic (scripts/paired_cube_network.py, icekylinx). + +Stdlib only. The functions used are #144's own: exact_moment(), the rare-class contamination of bit_certificate(), +complex_certificate(), finite_bridge() and the 47-constraint assembly. As in hpst3r's #147, the one relaxed check is +the bit dimension test, which here accepts R <= 28866; every other check of shared_profile() is kept verbatim. The +coarse saving and kappa are the largest points of a 10^-12 grid that pass, and the next points are rejected. On +#144's own 10^-10 grid and row this reproduces 4617656/10^10, 4613422943/10^13 and 4609169/10^10 exactly. +""" +import json +import sys +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +sys.path.insert(0, str(ROOT / 'scripts')) +import paired_cube_network as pcn # noqa: E402 + +GRID = 10**12 + + +def bit_profile(row): + require = pcn.require + h, v, R, ell = (row[k] for k in ('h', 'v', 'R', 'loss')) + m, W, H = 3 * h, 2 * v + R, Counter() + selected = {int(r): n for r, n in row['selected_rank_histogram'].items()} + require(sum(selected.values()) == row['selected_roles'], 'Selected gauge count') + for r, n in selected.items(): + require(0 < r < h and n > 0, 'Proper local gauges') + H[3 * r] += n + require((h, v, ell) == (23, 1771, 506) and 0 < R <= 28866, 'Retained bit local dimensions (R reduced)') + for name in ('auxiliary_histogram', 'source_data_histogram', 'target_data_histogram', 'copied_center_histogram'): + for r, n in row[name].items(): + H[int(r)] += 3 * n + H[2] += 2 * v + H = pcn.clean(H) + require(all(0 < r < m and n > 0 for r, n in H.items()), 'Proper shared-core children') + mass = sum(r * n for r, n in H.items()) + require(H == pcn.clean(row['child_histogram']), 'Saved complete child histogram') + require((m, W, mass, W * m - mass) == (row['m'], row['W_per_vertex'], row['rank_per_vertex'], row['deficit_per_vertex']), + 'Saved sharing dimensions and rank') + require(W * m - mass == 2 * v - 3 * ell, 'Shared-core telescoping deficit') + return dict(m=m, local_dimension=h, W_per_vertex=W, rank_per_vertex=mass, deficit_per_vertex=W * m - mass, + child_multiplicities=H, maxchild=max(H), edge_count=sum(H.values())) + + +def bit_gap(p, coarse): + """bit_certificate()'s strict moment gap at a coarse saving, or None if either strict inequality fails.""" + try: + exact = pcn.exact_moment(p, coarse) + except (AssertionError, ValueError): + return None + m, W = p['m'], p['W_per_vertex']; fallback = 32 * m * m + added = pcn.BAD * Q(fallback * p['edge_count'], W * m) * pcn.exp_upper(coarse * pcn.log_upper(Q(m))) + rank_upper = Q(p['rank_per_vertex']) + pcn.BAD * fallback * p['edge_count'] + gap = 1 - exact['moment_upper'] - added + return gap if gap > 0 and rank_upper < W * m else None + + +def largest(ok, lo, hi): + assert ok(lo) and not ok(hi) + while hi - lo > 1: + mid = (lo + hi) // 2 + lo, hi = (mid, hi) if ok(mid) else (lo, mid) + return lo + + +def price(row, atom=None, grid=GRID): + """atom None: the merged #144 atom exponent 1/1000. grid 10^10 is #144's own grid.""" + atom = pcn.ATOM if atom is None else atom + p = bit_profile(row) + assert Q(2 * p['m']**3, 2**80) < pcn.BAD + k = largest(lambda k: bit_gap(p, Q(k, grid)) is not None, 4 * grid // 10**4, 6 * grid // 10**4) + coarse = Q(k, grid) + ab = (1 - atom) * coarse + atom * pcn.OLD + assert ab < atom < 1 - ab, 'Subordinate adapter and row tolls' + assembly_bit = min(ab, (1 - pcn.PHASE_STOP) * pcn.AC - Q(1, 10**10)) + assert assembly_bit == ab, 'the bit side still binds' + crow = json.loads((ROOT / 'certificates' / 'paired-cube-complex-input.json').read_text()) + phase = pcn.complex_certificate(crow) + bridge = pcn.finite_bridge(phase, None, crow) + assert Q(json.loads((ROOT / 'certificates' / 'copied-centers-network.json').read_text())['bit']['saving']) == pcn.OLD + def accepts(kk): + try: pcn.assembly(assembly_bit, pcn.AC, bridge, Q(kk, grid), beta=pcn.PHASE_STOP) + except (AssertionError, ValueError): return False + return True + kap = largest(accepts, 0, int(pcn.AC * grid) + 1) + res = pcn.assembly(assembly_bit, pcn.AC, bridge, Q(kap, grid), beta=pcn.PHASE_STOP) + assert len(res['strict_constraints']) == 47 and len(res['margins']) == 7 + assert all(value > 0 for value in res['strict_constraints'].values()) + return dict(R=row['R'], W_per_vertex=p['W_per_vertex'], maxchild=p['maxchild'], atom=atom, + coarse=coarse, coarse_gap=bit_gap(p, coarse), coarse_next_rejected=Q(k + 1, grid), + stopped=ab, complex=pcn.AC, kappa=Q(kap, grid), kappa_next_rejected=Q(kap + 1, grid), + absorption_gap=res['absorption_gap']) + + +if __name__ == '__main__': + assert not sys.flags.optimize + row = json.loads(Path(sys.argv[1]).read_text()) + for atom in (None, Q(1, 2000)): + r = price(row, atom) + print('atom %s: R %d W %d coarse %s stopped %.12e kappa %s = %.10e' % ( + r['atom'], r['R'], r['W_per_vertex'], r['coarse'], float(r['stopped']), r['kappa'], float(r['kappa']))) diff --git a/research/bit-reuse-147/row.json b/research/bit-reuse-147/row.json new file mode 100644 index 0000000000..39ec6220bc --- /dev/null +++ b/research/bit-reuse-147/row.json @@ -0,0 +1,99 @@ +{ + "R": 23979, + "W_per_vertex": 27521, + "auxiliary_histogram": { + "1": 53031, + "10": 175, + "11": 338, + "12": 216, + "13": 501, + "14": 110, + "15": 628, + "16": 896, + "17": 1566, + "18": 635, + "19": 743, + "2": 64836, + "20": 2273, + "21": 262, + "3": 12632, + "4": 10831, + "5": 5848, + "6": 1619, + "7": 688, + "8": 1142, + "9": 497 + }, + "child_histogram": { + "1": 188241, + "10": 525, + "11": 1014, + "12": 648, + "13": 1536, + "14": 330, + "15": 1884, + "16": 3564, + "17": 5292, + "18": 3312, + "19": 9936, + "2": 200567, + "20": 6819, + "21": 789, + "22": 75, + "3": 38040, + "4": 33117, + "48": 72, + "5": 17577, + "51": 118, + "54": 806, + "57": 3651, + "6": 4857, + "60": 9, + "7": 2064, + "8": 3426, + "9": 1491 + }, + "copied_center_histogram": { + "22": 23 + }, + "deficit_per_vertex": 2024, + "eliminated_roles": 1549, + "h": 23, + "loss": 506, + "m": 69, + "omitted_roles": 2022, + "rank_per_vertex": 1896925, + "recycled_roles": 3338, + "selected_rank_histogram": { + "16": 72, + "17": 118, + "18": 806, + "19": 3651, + "20": 9 + }, + "selected_roles": 4656, + "source_data_histogram": { + "1": 5061, + "13": 11, + "16": 198, + "17": 22, + "19": 1540, + "3": 23, + "4": 208, + "5": 11 + }, + "source_manifest": "references/partial-gauge/pr97/SOURCE.json", + "source_manifest_sha256": "68fb539abcd6df21d142e4e204b6e9482eb7f9cd3907650f54bd058070266596", + "target_data_histogram": { + "1": 4655, + "16": 94, + "17": 176, + "18": 469, + "19": 1029, + "2": 839, + "21": 1, + "22": 2, + "3": 25 + }, + "v": 1771 +} diff --git a/research/bit-reuse-147/verify.py b/research/bit-reuse-147/verify.py new file mode 100644 index 0000000000..1408992788 --- /dev/null +++ b/research/bit-reuse-147/verify.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +"""Verify the recycled bit word from the pinned sources (Python stdlib only; a few minutes; do not use -O). + + 1. #144 control. On #144's own 10^-10 grid, the merged #144 row prices to its coarse saving 4617656/10^10, + stopped saving 4613422943/10^13 and kappa 4609169/10^10 exactly, with the next grid points rejected. + 2. Timetable control. With no elimination and no recycling, the delayed-read word of this package reproduces every + histogram of #144's reconstruct() row: delaying reads in the inherited order changes no charge. + 3. The frozen plan is legal, its timetable satisfies every ordering constraint, and the frame ledger runs: every + scalar gate finds its registers at one common frame key and no register ever retreats. The row rebuilt from the + actual ledger moves equals row.json. + 4. Every adjacent frame pair that is not an ordered pair of one inherited certified chain is nested exactly over Q + and both frames are nondegenerate. Control: a recipient given a donor whose frame is not inside sigma is + rejected by the same test. + 5. The literal scalar word on the physical registers. First on formal variables, over F2 and over Z with the + exact integer read coefficients: every register must end as its own variable and every target as its start + variable plus exactly its defining sum. This is complete and uses no random vectors. Then with random + scratch and data, where three tampered words must break the Z identity: a recycled read of the register's + entrance value, a recycled read taken before its donor's last write, and the inherited inverse order. + 6. #144's assembly on the new row: kappa and its next grid point, at the merged atom exponent 1/1000 and at 1/2000. +Usage: python3 research/bit-reuse-147/verify.py [--all] + --all also checks exact nesting of every distinct ledger move, including those the pinned audits already certify + (about seven more minutes). +""" +import json +import random +import sys +import time +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +T0 = time.time() +def log(*a): print('[%5.0fs]' % (time.time() - T0), *a, flush=True) + +EXPECT = json.loads((HERE / 'expected.json').read_text()) + + +def clean(H): return {str(k): n for k, n in H.items() if n} + + +def main(): + assert not sys.flags.optimize, 'run without -O' + import word147 + import price147 + from frames147 import Exact + from paired_cube_bit import reconstruct + ROOT = word147.ROOT + + base = reconstruct() + r0 = price147.price(base, grid=10**10) + assert (r0['coarse'], r0['stopped'], r0['kappa']) == (Q(4617656, 10**10), Q(4613422943, 10**13), Q(4609169, 10**10)), r0 + log('PASS #144 control: coarse 4617656/10^10, stopped 4613422943/10^13, kappa 4609169/10^10 (next rejected)') + + dr, W, D, S, record, folder = word147.load_schedule() + outputs = {(c, tuple(T)): n for c, T, n in W['outputs']} + sel = json.loads((ROOT / record['selection_file']).read_text()) + plain = word147.Word(S, [], sel['retained_readout_order'], []) + led0 = plain.ledger(); row0 = plain.row(led0, record) + for key in ('auxiliary_histogram', 'source_data_histogram', 'target_data_histogram', 'selected_rank_histogram', + 'child_histogram'): + assert clean(row0[key]) == clean(base[key]), key + assert (row0['R'], row0['W_per_vertex'], row0['rank_per_vertex']) == (base['R'], base['W_per_vertex'], base['rank_per_vertex']) + assert plain.replay(2, random.Random(1), outputs) and plain.replay(0, random.Random(2), outputs) + log('PASS timetable control: #144 row reproduced with reads delayed to positions %d..%d of %d; replay holds' % ( + min(plain.p.values()), max(plain.p.values()), plain.N)) + + plan = json.loads((HERE / 'plan.json').read_text()) + assert set(plan['retained']) <= set(sel['retained_readout_order']), "level slots are among #144's selected gauges" + assert {b for b, _ in plan['pairs']} <= set(sel['retained_readout_order']) + word = word147.Word(S, plan['elim'], plan['retained'], plan['pairs']) + led = word.ledger(); row = word.row(led, record) + assert row == json.loads((HERE / 'row.json').read_text()), 'row differs' + occupants = Counter(led['phys'].values()) + log('PASS ledger: %d eliminated, %d recycled, %d physical roles (longest occupant chain %d); row equals row.json' % ( + len(plan['elim']), len(plan['pairs']), row['R'], max(occupants.values()))) + + exact = Exact(S, W, folder) + fresh = word.new_moves(led) + kinds = Counter((reg, a[0], b[0]) for reg, a, b in fresh) + for reg, a, b in fresh: + assert exact.inside(a, b), ('not nested', reg, a, b) + assert exact.nondegenerate(a) and exact.nondegenerate(b), ('degenerate', a, b) + handoffs = {(('n', 0), ('sigma', b)) for b in word.donor_of} + assert kinds['a', 'n', 'sigma'] + kinds['a', 'ret', 'sigma'] + kinds['a', 'c', 'sigma'] + kinds['a', 'v', 'sigma'] + \ + kinds['a', 'sigma', 'sigma'] + kinds['a', 'out', 'sigma'] <= len(handoffs) + assert all(reg == 'y' or b[0] == 'sigma' for reg, a, b in fresh), 'only hand-offs and target chains are new' + rng = random.Random(20261009); rejected = 0; tried = 0 + donors = sorted(word.recipient_of) + while tried < 200: + b = rng.choice(sorted(word.donor_of)); d = rng.choice(donors) + key = [k for k in S.chain_keys(d) if k[0] != 'F'][-1] + if S.dim(key) > S.f[b]: continue + tried += 1; rejected += not exact.inside(key, ('sigma', b)) + assert rejected > 0, 'the nesting test never rejects' + log('PASS exact nesting over Q of all %d new adjacent pairs %s; control rejected %d of %d mismatched hand-offs' % ( + len(fresh), dict(kinds), rejected, tried)) + if '--all' in sys.argv: # optional: every distinct move, inherited ones included + every = sorted(led['moves'], key=str) + for reg, a, b in every: assert exact.inside(a, b), ('not nested', reg, a, b) + log('PASS exact nesting over Q of all %d distinct ledger moves, inherited ones included' % len(every)) + + assert word.complete(2, outputs) and word.complete(0, outputs), 'scalar identity on formal variables' + log('PASS complete scalar identity on all %d formal variables, over F2 and over Z (no random vectors)' % (2 * S.v + row['R'])) + rng = random.Random(20261009) + okF = all(word.replay(2, rng, outputs) for _ in range(3)); okZ = all(word.replay(0, rng, outputs) for _ in range(2)) + assert okF and okZ, 'scalar identity' + for tamper in ('stale', 'early', 'vlast'): + assert not word.replay(0, rng, outputs, tamper), 'tamper accepted: ' + tamper + log('PASS literal replay on %d physical registers over Z and F2; stale read, premature read and inherited inverse ' + 'order all rejected' % row['R']) + + for atom, name in ((None, 'kappa'), (Q(1, 2000), 'kappa_atom_2000')): + r = price147.price(row, atom) + assert str(r['kappa']) == EXPECT[name] and str(r['coarse']) == EXPECT['coarse'], (name, str(r['kappa']), str(r['coarse'])) + log('PASS atom %s: kappa %s = %.10e (next %s rejected); coarse %s, stopped %.12e, R %d, W %d, largest child %d' % ( + r['atom'], r['kappa'], float(r['kappa']), r['kappa_next_rejected'], r['coarse'], float(r['stopped']), + r['R'], r['W_per_vertex'], r['maxchild'])) + + +if __name__ == '__main__': + main() diff --git a/research/bit-reuse-147/word147.py b/research/bit-reuse-147/word147.py new file mode 100644 index 0000000000..bbad02df6e --- /dev/null +++ b/research/bit-reuse-147/word147.py @@ -0,0 +1,438 @@ +"""The recycled bit word: #147's reduced PR97 word with dead auxiliary slots handed to later deferred births. + +Stdlib only. A plan is three lists over the slots of Swapnil Jain's round-seven PR97 word (h = 23): + + elim terminal output slots deleted exactly as in #147 (hpst3r; SovereignSteak's #122 operation); + retained first occupants that keep their entrance gauge sigma (as in #144); + pairs [recipient B, donor D]: the physical register of D, dead after its last touch at frame U_D, is moved to + sigma_B and becomes B. B's inherited deferred read then cancels the value D left behind (jamesyc's #124 + birth-read operation, here on the bit word). + +Level slots (retained or recipients) are read at their sigma frames, in the inherited readout order, but each read is +executed as late as the constraints below allow instead of in one block after phase one. Everything else keeps its +inherited place. This module derives the timetable, the literal event list, the scalar replay, the frame ledger and +the resulting row; verify.py drives it. +""" +import gzip +import importlib.util +import json +import sys +from collections import Counter, defaultdict +from pathlib import Path + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +sys.path.insert(0, str(ROOT / 'scripts')) +from partial_gauge_bit import frozen_sources # noqa: E402 + + +def load_schedule(): + record = json.loads((ROOT / 'certificates/paired-cube-bit-input.json').read_text()) + folder, _ = frozen_sources(record) + spec = importlib.util.spec_from_file_location('pr97_deferred_reuse', folder / 'deferred.py') + dr = importlib.util.module_from_spec(spec); spec.loader.exec_module(dr) + W = json.load(gzip.open(folder / 'witness_23.json.gz', 'rt')); D = json.load(gzip.open(folder / 'deferred_23.json.gz', 'rt')) + return dr, W, D, dr.Schedule(W, D), record, folder + + +class Word: + def __init__(self, S, elim, retained, pairs): + self.S = S; self.h = S.h; self.v = S.v; self.R = S.R + self.orig_sel = set(S.sel); self.readout = list(S.readout) + self.elim = set(elim); self.retained = set(retained) + self.donor_of = {b: d for b, d in pairs}; self.recipient_of = {d: b for b, d in pairs} + self.level = self.retained | set(self.donor_of) + ops = self.ops = S.ops + prev = {}; pred = defaultdict(list); last = {}; first = {} + for i, op in enumerate(ops): + for s in S.touch(op): + if s in prev: pred[i].append(prev[s]) + prev[s] = i; last[s] = i; first.setdefault(s, i) + anc = set(); stack = [last[s] for s in S.ret] + while stack: + i = stack.pop() + if i in anc: continue + anc.add(i); stack.extend(pred[i]) + assert not any(set(S.touch(ops[i])) & self.orig_sel for i in anc) + self.ph1 = [i for i in range(len(ops)) if i in anc and ops[i][0] != 'src'] + self.rest = [i for i in range(len(ops)) if i not in anc and ops[i][0] != 'src'] + self.pos = {i: k for k, i in enumerate(self.rest)}; self.N = len(self.rest) + self.first_pos = {s: (self.pos[first[s]] if first[s] in self.pos else -1) for s in first} + self.death = {s: (self.pos[last[s]] if last[s] in self.pos else -1) for s in last} + self.early_v = sorted(set(S.srcop) - self.orig_sel, key=lambda s: (S.srcop[s], len(S.vstart[s]), s)) + src = Counter() + for op in ops: + if op[0] == 'add': src[op[2]] += 1 + elif op[0] == 'fan': src[op[1]] += 1 + self.never_source = {s for s in range(S.R) if src[s] == 0} + self.adj = S.adjoint() + self.target_of = {u: S.tid[S.out[u][1]] for u in self.elim} + self.check_plan() + self.timetable() + + # ---------------------------------------------------------------------------------------- plan legality + def check_plan(self): + S = self.S + assert all(u in S.out and u in self.orig_sel and u in self.never_source for u in self.elim), 'eliminated slots' + assert self.retained <= self.orig_sel and set(self.donor_of) <= self.orig_sel, 'level slots are deferred slots' + assert not (self.retained & set(self.donor_of)), 'a recipient has no entrance gauge' + assert not (self.level & self.elim) and not (set(self.recipient_of) & self.elim) + assert len(self.recipient_of) == len(self.donor_of), 'one recipient per donor' + assert not (set(self.recipient_of) & set(S.out)), 'an output slot is read at the end and never dies' + assert not (set(self.recipient_of) & set(S.ret)), 'a retained centre is not used as a donor' + for b, d in self.donor_of.items(): assert b != d + + # ---------------------------------------------------------------------------------------- timetable + def timetable(self): + """Latest read position p[B] (the read runs just before rest operation p[B]) and V time tau[s] of every + deferred V slot, as the greatest solution of + p[B] <= first operation touching B; reads keep the inherited readout order; + a level V slot takes its V gate right after its read (tau = p); + tau[s] <= first operation touching s; V gates of one leaf keep the inherited chain order; + every read on a target precedes the first redirected write into that target. + """ + S, N = self.S, self.N + order = [b for b in self.readout if b in self.level] + p = {b: self.first_pos[b] for b in order} + late = [s for s in S.late_v] + tau = {s: self.first_pos[s] for s in late if s not in self.level} + def get(s): return p[s] if s in p else tau[s] + def cap(s, value): + if s in p: + if value < p[s]: p[s] = value; return True + elif value < tau[s]: tau[s] = value; return True + return False + chains = [] + late_set = set(late) + for n, us in S.xs: + ch = [s for s in us if s in late_set] + if len(ch) > 1: chains.append(ch) + first_write = {} # target -> eliminated slots writing into it + for u in self.elim: first_write.setdefault(self.target_of[u], []).append(u) + readers = defaultdict(list) + for b in order: + for t in self.adj[b]: + if t in first_write: readers[t].append(b) + changed = True + while changed: + changed = False + for a, b in zip(reversed(order[:-1]), reversed(order[1:])): + changed |= cap(a, p[b]) + for ch in chains: + for a, b in zip(reversed(ch[:-1]), reversed(ch[1:])): + changed |= cap(a, get(b)) + for t, us in first_write.items(): + w = min((tau[u] if u in tau else self.first_pos[u]) for u in us) + for b in readers[t]: changed |= cap(b, w) + assert all(0 <= x <= N for x in p.values()) and all(0 <= x <= N for x in tau.values()) + self.order = order; self.p = p; self.tau = tau + for b, d in self.donor_of.items(): + assert self.death[d] < p[b], ('donor still live at the recipient read', b, d) + + # ---------------------------------------------------------------------------------------- literal events + def events(self): + """Forward events of the middle section, in execution order: + ('read', B) | ('v', s) | ('vred', u) | ('op', i). Reads and V events with time k run before rest op k.""" + S = self.S + at = defaultdict(list) + rank = {b: i for i, b in enumerate(self.readout)} + lpos = {s: i for i, s in enumerate(S.late_v)} + for b in self.order: + at[self.p[b]].append((0, rank[b], 'read', b)) + if b in S.srcop: at[self.p[b]].append((1, lpos[b], 'v', b)) + for s, k in self.tau.items(): at[k].append((1, lpos[s], 'vred' if s in self.elim else 'v', s)) + out = [] + for k in range(self.N + 1): + out.extend((kind, s) for _, _, kind, s in sorted(at.get(k, ()))) + if k < self.N: out.append(('op', self.rest[k])) + return out + + def physical(self): + phys = {} + for s in range(self.R): + if s in self.elim: continue + r = s + while r in self.donor_of: r = self.donor_of[r] + phys[s] = r + return phys + + # ---------------------------------------------------------------------------------------- scalar replay + def replay(self, ring, rng, outputs, tamper=None): + """Literal scalar word on physical registers with arbitrary scratch and data. ring 0: exact integers with the + exact integer read coefficients; ring 2: the F2 word. Returns True iff every physical register is restored + and every target receives exactly its defining sum (over F2 also exactly x_T).""" + S = self.S; trip, v = S.trip, S.v; ops = self.ops; srcop = S.srcop; elim = self.elim + mod = (lambda z: z & 1) if ring == 2 else (lambda z: z) + phys = self.physical() + x = [rng.randrange(-10**6, 10**6) for _ in range(v)] + a0 = {r: rng.randrange(-10**6, 10**6) for r in set(phys.values())} + y0 = [rng.randrange(-10**6, 10**6) for _ in range(v)] + a = dict(a0); y = list(y0); done = []; count = [0] + def coefficient(c): return c & 1 if ring == 2 else c + def read(s): + value = a[phys[s]] + if tamper == 'stale' and s in self.donor_of and count[0] == 0: + count[0] = 1; value = a0[phys[s]] # reads the register's entrance value, not what D left + for t, c in self.adj[s].items(): y[t] -= coefficient(c) * value + def redirected(t, value): + y[t] += value + def vgate(s, sign=1): a[phys[s]] += sign * x[srcop[s] - 1] + def runop(i, sign=1): + op = ops[i] + if op[0] == 'add': + if op[1] in elim: + if sign == 1: redirected(self.target_of[op[1]], a[phys[op[2]]]) + return + a[phys[op[1]]] += sign * a[phys[op[2]]] + else: + for g in op[2]: + if g in elim: + if sign == 1: redirected(self.target_of[g], a[phys[op[1]]]) + continue + a[phys[g]] += sign * a[phys[op[1]]] + for s in range(self.R): + if s not in self.level and s not in elim: read(s) + for s in self.early_v: vgate(s); done.append(('v', s)) + for i in self.ph1: runop(i); done.append(('op', i)) + for s, c in S.ret.items(): + for t, T in enumerate(trip): + if c in T: y[t] += a[phys[s]] + events = self.events() + if tamper == 'early': # one recycled read executed before its donor's last write + written = {} + for j, (kind, s) in enumerate(events): + if kind == 'v': written[s] = j + elif kind == 'op': + op = ops[s] + for g in ([op[1]] if op[0] == 'add' else op[2]): written[g] = j + b = next(e[1] for e in events if e[0] == 'read' and self.donor_of.get(e[1]) in written) + j = written[self.donor_of[b]] + assert events.index(('read', b)) > j + events = [e for e in events if e != ('read', b)]; events.insert(j, ('read', b)) + for kind, s in events: + if kind == 'read': read(s) + elif kind == 'v': vgate(s); done.append(('v', s)) + elif kind == 'vred': redirected(self.target_of[s], x[srcop[s] - 1]) + else: runop(s); done.append(('op', s)) + for s, (c, T) in S.out.items(): + if s not in elim: y[S.tid[T]] += a[phys[s]] + if tamper == 'vlast': # the inherited inverse order: every V^-1 after L^-1 + done = [e for e in done if e[0] == 'v'] + [e for e in done if e[0] == 'op'] + for kind, s in reversed(done): + if kind == 'v': vgate(s, -1) + else: runop(s, -1) + if any(mod(a[r] - a0[r]) for r in a0): return False + want = [0] * v + for (c, T), n in outputs.items(): + A_, B_ = [q for q in T if q != c] + want[S.tid[T]] += sum(x[i] for i, Sx in enumerate(trip) if c in Sx and A_ not in Sx and B_ not in Sx) + for c in range(S.h): + tot = sum(x[i] for i, Sx in enumerate(trip) if c in Sx) + for t, T in enumerate(trip): + if c in T: want[t] += tot + if any(mod(y[t] - y0[t] - want[t]) for t in range(v)): return False + if ring == 2 and any(mod(y[t] - y0[t] - x[t]) for t in range(v)): return False + return True + + def complete(self, ring, outputs): + """The same literal word on formal variables: every data port, target and physical register starts as its + own variable. ring 2: bitmasks over the variables; ring 0: sparse integer linear forms. Deterministic and + complete: returns True iff every register ends as its own variable and every target ends as its start + variable plus exactly its defining sum (over F2: plus x_T). No random vectors are involved.""" + S = self.S; trip, v = S.trip, S.v; ops = self.ops; srcop = S.srcop; elim = self.elim + phys = self.physical(); regs = sorted(set(phys.values())) + index = {r: 2 * v + k for k, r in enumerate(regs)} + want = [dict() for _ in range(v)] + for (c, T), n in outputs.items(): + A_, B_ = [q for q in T if q != c] + row = want[S.tid[T]] + for i, Sx in enumerate(trip): + if c in Sx and A_ not in Sx and B_ not in Sx: row[i] = row.get(i, 0) + 1 + for c in range(S.h): + star = [i for i, Sx in enumerate(trip) if c in Sx] + for t, T in enumerate(trip): + if c in T: + for i in star: want[t][i] = want[t].get(i, 0) + 1 + if ring == 2: + a = {r: 1 << index[r] for r in regs}; y = [1 << (v + t) for t in range(v)]; x = [1 << i for i in range(v)] + def into_y(t, value, c): + if c & 1: y[t] ^= value + def into_a(r, value, sign): a[r] ^= value + else: + a = {r: {index[r]: 1} for r in regs}; y = [{v + t: 1} for t in range(v)]; x = [{i: 1} for i in range(v)] + def accumulate(dst, value, c): + for k, z in value.items(): + z = dst.get(k, 0) + c * z + if z: dst[k] = z + else: del dst[k] + def into_y(t, value, c): accumulate(y[t], value, c) + def into_a(r, value, sign): accumulate(a[r], value, sign) + done = [] + def read(s): + value = a[phys[s]] + for t, c in self.adj[s].items(): into_y(t, value, -c) + def vgate(s, sign=1): into_a(phys[s], x[srcop[s] - 1], sign) + def runop(i, sign=1): + op = ops[i] + if op[0] == 'add': + if op[1] in elim: + if sign == 1: into_y(self.target_of[op[1]], a[phys[op[2]]], 1) + return + into_a(phys[op[1]], a[phys[op[2]]], sign) + else: + for g in op[2]: + if g in elim: + if sign == 1: into_y(self.target_of[g], a[phys[op[1]]], 1) + continue + into_a(phys[g], a[phys[op[1]]], sign) + for s in range(self.R): + if s not in self.level and s not in elim: read(s) + for s in self.early_v: vgate(s); done.append(('v', s)) + for i in self.ph1: runop(i); done.append(('op', i)) + for s, c in S.ret.items(): + for t, T in enumerate(trip): + if c in T: into_y(t, a[phys[s]], 1) + for kind, s in self.events(): + if kind == 'read': read(s) + elif kind == 'v': vgate(s); done.append(('v', s)) + elif kind == 'vred': into_y(self.target_of[s], x[srcop[s] - 1], 1) + else: runop(s); done.append(('op', s)) + for s, (c, T) in S.out.items(): + if s not in elim: into_y(S.tid[T], a[phys[s]], 1) + for kind, s in reversed(done): + if kind == 'v': vgate(s, -1) + else: runop(s, -1) + if ring == 2: + if any(a[r] != 1 << index[r] for r in regs): return False + if any({i for i, c in want[t].items() if c & 1} != {t} for t in range(v)): return False + return all(y[t] == (1 << (v + t)) ^ (1 << t) for t in range(v)) + if any(a[r] != {index[r]: 1} for r in regs): return False + for t in range(v): + expected = dict(want[t]); expected[v + t] = 1 + if y[t] != expected: return False + return True + + # ---------------------------------------------------------------------------------------- frame ledger + def ledger(self): + """Run the forward word on frame keys. Every scalar gate must find its registers at one common frame key; + every register only moves forward. Returns the moves (register kind, old key, new key) in time order, the + key sequence of every register, and the rank histograms of the actual moves.""" + S = self.S; h, v = S.h, S.v; ops = self.ops; elim = self.elim; phys = self.physical() + def norm(k): return ('out', 0, tuple(k[2])) if k[0] == 'out' else k + dim = S.dim + cur = {}; seq = {} + for r in set(phys.values()): + cur['a', r] = ('sigma', r) if r in self.retained else ('0',) + for n, _ in S.xs: cur['x', n] = ('n', n) + for t in range(v): cur['y', t] = ('0',) + for reg, k in cur.items(): seq[reg] = [k] + hist = {'a': Counter(), 'x': Counter(), 'y': Counter()} + moves = Counter() + def move(reg, dst): + dst = norm(dst); old = cur[reg] + if old == dst: return + r = dim(dst) - dim(old) + assert r >= 0, ('retreat', reg, old, dst) + moves[reg[0], old, dst] += 1 + if r: hist[reg[0]][r] += 1 + cur[reg] = dst; seq[reg].append(dst) + def gate(regs, frame): + for reg in regs: move(reg, frame) + assert all(cur[reg] == norm(frame) for reg in regs) + A = lambda s: ('a', phys[s]) + leaf = S.srcop + def operation(i): + op = ops[i] + if op[0] == 'add': + _, p, o, n = op; frame = ('n', n) + gate([('y', self.target_of[p]) if p in elim else A(p), A(o)], frame) + else: + for g in sorted(op[2], key=lambda s: dim(S.start_key(s))): + frame = S.start_key(g) + gate([A(op[1]), ('y', self.target_of[g]) if g in elim else A(g)], frame) + for s in range(self.R): + if s not in self.level and s not in elim: + assert cur[A(s)] == ('0',) and s == phys[s], 'zero-prelude read of a first occupant at frame zero' + for s in self.early_v: gate([A(s), ('x', leaf[s])], ('v', s)) + for i in self.ph1: operation(i) + centres = 0 + for s, c in S.ret.items(): + move(A(s), ('ret', c)) + assert all(cur['y', t] == ('0',) for t, T in enumerate(S.trip) if c in T) + centres += 1 + for kind, s in self.events(): + if kind == 'read': + f = ('sigma', s) + if s in self.donor_of: move(A(s), f) + assert cur[A(s)] == f, ('read frame', s) + for t, c in self.adj[s].items(): + assert c > 0 + gate([('y', t)], f) + elif kind == 'v': gate([A(s), ('x', leaf[s])], ('v', s)) + elif kind == 'vred': gate([('x', leaf[s]), ('y', self.target_of[s])], ('v', s)) + else: operation(s) + for s, (c, T) in S.out.items(): + if s not in elim: gate([A(s), ('y', S.tid[T])], ('out', 0, T)) + for t, T in enumerate(S.trip): move(('y', t), ('out', 0, T)) + for r in set(phys.values()): move(('a', r), ('F',)) + for n, _ in S.xs: move(('x', n), ('F',)) + return dict(moves=moves, seq=seq, hist=hist, centres=centres, phys=phys) + + # ---------------------------------------------------------------------------------------- inherited nestings + def inherited(self): + """Adjacent frame pairs whose nesting the pinned PR97 audits already certify (check_lifted.py D and + check_frames.py X/Q, relied on by #144): consecutive keys of every original slot chain, of every X chain in + its original V order, and of every y chain in readout order with positive Z support; plus sigma <= start and + sigma <= t_T^perp. Chains are nested sequences, so any ordered pair taken from one chain is nested too.""" + S = self.S + def norm(k): return ('out', 0, tuple(k[2])) if k[0] == 'out' else k + keep = S.sel; S.sel = set(self.orig_sel) + chains = [] + for s in range(S.R): chains.append([norm(k) for k in S.chain_keys(s)]) + S.sel = keep + for n, us in S.xs: chains.append([('n', n)] + [('v', s) for s in us] + [('F',)]) + byt = defaultdict(list) + for s in self.readout: + for t, c in self.adj[s].items(): + if c > 0: byt[t].append(('sigma', s)) + for t, T in enumerate(S.trip): chains.append([('0',)] + byt[t] + [('out', 0, T), ('F',)]) + return chains + + def row(self, led, record): + """#144's shared-core bit row from the actual ledger moves.""" + S = self.S; h, v = S.h, S.v + aux, source, target = led['hist']['a'], led['hist']['x'], led['hist']['y'] + assert +source == Counter(r for path in S.xdata() for r in path if r), 'source chains unchanged' + assert sum(r * n for r, n in target.items()) == v * (h - 1) and led['centres'] == h + gauges = Counter(S.f[s] for s in self.retained) + children = Counter() + for local in (aux, source, target, Counter({h - 1: h})): + for r, n in local.items(): + if r and n: children[r] += 3 * n + for r, n in gauges.items(): children[3 * r] += n + children[2] += 2 * v + Rn = len(set(led['phys'].values())) + assert Rn == S.R - len(self.elim) - len(self.donor_of) + enc = lambda H: {str(r): n for r, n in sorted(H.items()) if n} + row = dict(record) + row.update(R=Rn, W_per_vertex=2 * v + Rn, selected_roles=sum(gauges.values()), selected_rank_histogram=enc(gauges), + auxiliary_histogram=enc(aux), source_data_histogram=enc(source), target_data_histogram=enc(target), + child_histogram=enc(children), rank_per_vertex=sum(r * n for r, n in children.items()), + eliminated_roles=len(self.elim), recycled_roles=len(self.donor_of), + omitted_roles=len(self.orig_sel) - len(self.elim) - len(self.level)) + row.pop('selection_file', None); row.pop('selection_sha256', None) + assert row['W_per_vertex'] * row['m'] - row['rank_per_vertex'] == row['deficit_per_vertex'] == 2024 + return row + + def new_moves(self, led): + """Distinct moves of the ledger that are not an ordered pair of one inherited certified chain.""" + where = defaultdict(dict) + for ci, chain in enumerate(self.inherited()): + for i, k in enumerate(chain): where[k].setdefault(ci, i) + def certified(a, b): + if a == ('0',) or b == ('F',): return True + wa, wb = where.get(a), where.get(b) + if not wa or not wb: return False + small, big = (wa, wb) if len(wa) <= len(wb) else (wb, wa) + return any(ci in big and wa[ci] <= wb[ci] for ci in small) + return sorted((m for m in led['moves'] if not certified(m[1], m[2])), key=str)