diff --git a/research/clifford-tensor-gram/ADVANCES-MUTATIONS.json b/research/clifford-tensor-gram/ADVANCES-MUTATIONS.json new file mode 100644 index 0000000000..cadc0398be --- /dev/null +++ b/research/clifford-tensor-gram/ADVANCES-MUTATIONS.json @@ -0,0 +1,45 @@ +{ + "cases": [ + { + "mutation": "conjugate native C factor", + "optimized": false, + "rejection": "Native trace phase" + }, + { + "mutation": "conjugate native C factor", + "optimized": true, + "rejection": "Native trace phase" + }, + { + "mutation": "ignore native inverse sign", + "optimized": false, + "rejection": "Native entry phase" + }, + { + "mutation": "ignore native inverse sign", + "optimized": true, + "rejection": "Native entry phase" + }, + { + "mutation": "omit output prefix constraint", + "optimized": false, + "rejection": "Native partial inner product" + }, + { + "mutation": "omit output prefix constraint", + "optimized": true, + "rejection": "Native partial inner product" + }, + { + "mutation": "omit final native return", + "optimized": false, + "rejection": "Compact complete endpoint" + }, + { + "mutation": "omit final native return", + "optimized": true, + "rejection": "Compact complete endpoint" + } + ], + "status": "PASS_CLIFFORD_ADVANCE_MUTATIONS" +} diff --git a/research/clifford-tensor-gram/ADVANCES-RESULT.json b/research/clifford-tensor-gram/ADVANCES-RESULT.json new file mode 100644 index 0000000000..2e8e73ba23 --- /dev/null +++ b/research/clifford-tensor-gram/ADVANCES-RESULT.json @@ -0,0 +1,50 @@ +{ + "code_fourier_values": 256, + "complete_programs": 48, + "controls": [ + "singular permutation", + "diagonal parity", + "asymmetric diagonal", + "wrong C sign", + "unknown gate", + "coordinate out of range", + "invalid prefix", + "negative axes" + ], + "exact_native_relations": 9, + "exhaustive_quadratic_forms": 640, + "filter_axis_counts": 65, + "general_test_widths": "8n-3 through 8n+4 for n>=2", + "large_native_programs": [ + { + "axes": 64, + "base_dimension": "18446744073709551616", + "equivalent": false + }, + { + "axes": 65, + "base_dimension": "36893488147419103232", + "equivalent": true + } + ], + "literal_witnesses": 48, + "native_entries": 3328, + "native_traces": 128, + "native_words": 128, + "one_axis": { + "group_sha256": "32481fd502c5f388244bcd56d20fbc0e0ca3933f47dbbdbbd8215397cea0238d", + "image_of_i": 256, + "prime": 65537, + "rank": 96, + "widths": [ + 5, + 6, + 7, + 8 + ] + }, + "partial_inner_products": 304, + "scalar_phase_traps": 1, + "stable_separation": "75/76", + "status": "PASS_CLIFFORD_ADVANCES_NO_NEW_KAPPA" +} diff --git a/research/clifford-tensor-gram/ADVANCES.md b/research/clifford-tensor-gram/ADVANCES.md new file mode 100644 index 0000000000..340c54f752 --- /dev/null +++ b/research/clifford-tensor-gram/ADVANCES.md @@ -0,0 +1,251 @@ +# Fewer widths and exact computation without dense matrices + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. + +This note extends [PROOF.md](PROOF.md). It uses the same group C_n, exact +global phases, complete register endpoints and coefficients that do not +depend on the positive tensor width f. Set D=2^n. No result changes kappa. + +## 1. Eight widths suffice for every axis count + +For n>=1, a fixed residual vanishes at every positive width if and only if +it vanishes at the eight widths + + 8n-3, 8n-2, ..., 8n+4. + +For n=0, use widths 1,2,3,4. For n=1, Section 3 improves the test to +widths 5,6,7,8. The number of tests and the largest tested width are +different quantities. The general maximum 8n+4 has not decreased. + +Let E be the binary code generated by the four length-eight rows +11111111, 11110000, 11001100 and 10101010. It has dimension four. Its +weights are 0,4,8, and E=E-perp for the binary dot product. Define T_n +in (C^D) tensor-power 8 by summing the basis vectors whose n binary rows +all belong to E. This vector is nonzero. + +The vector T_n is fixed by the eighth tensor power of each native generator: + +- S on one axis contributes i to the power of that row's weight. This is 1. +- CNOT adds one code row to another. It permutes the summands. +- The native Hadamard is ((1+i)/2) times the binary Fourier matrix. + Its eighth tensor power has coefficient 1/16. The Fourier sum of E + is 16 times the indicator of E-perp=E. Thus it fixes T_n, with phase 1. +- The scalar iI has eighth power 1. + +These gates generate C_n. Here is a direct reduction argument. The image +of Z_1 under a Clifford is a nonidentity Pauli. Single-axis H and S gates +convert each nonzero component to Z. CNOT gates reduce the resulting +nonempty Z string to Z_1. An X gate corrects its sign. The image of X_1 +then anticommutes with Z_1. CNOT and controlled-Z gates with control 1 +remove its components on the other axes. An S gate removes its remaining +Z_1 component, and Z_1 corrects its sign. These changes preserve Z_1. +The remaining operator fixes X_1 and Z_1, so it has the form I tensor V. +Repeat on V. The final scalar is a dyadic Gaussian unit of absolute value +one, hence one of 1,i,-1,-i, as proved in PROOF.md. Replace each ordinary +H in this argument by the native Hadamard. The Pauli action is unchanged; +the final scalar still belongs to the same four-element group. + +Normalize T_n to a unit vector tau. The injection J_f(v)=v tensor tau +satisfies + + (sum_g c_g g^(tensor(f+8))) J_f + = J_f (sum_g c_g g^(tensor f)). + +Thus vanishing at f+8 implies vanishing at f. Every integer from 1 to +F=8n+4 can be increased by a multiple of eight to a member of F-7,...,F. +The first theorem in PROOF.md now gives the stated eight-width test. +Apply the argument separately to every input and output role. + +This argument does not transfer the dimension-free stability constant +to the eight selected widths. The bound in Section 2 uses all widths +1,...,8n+4. A direct restriction argument loses powers of D. + +The code invariant is classical. See Runge's prior results as credited in +[Nebe, Rains and Sloane, The invariants of the Clifford groups, Sections 4 +and 6](https://arxiv.org/pdf/math/0001038). The contribution here is its +use in the fixed-coefficient endpoint test, with the native phase checked. + +## 2. Uniform separation improves from 14/15 to 75/76 + +For distinct exact operators and M=sum_g |c_g|^2, let +E_f=D^(-f)||sum_g c_g g^(tensor f)||_HS^2. Then + + max_(1<=f<=8n+4) E_f >= (75/76) M. + +Use the same filter as PROOF.md. Write r=-1/4, m=2n and + + P_m(t) = product_(j=1..m) (t-r^j)/(1-r^j), + q_n(z) = (z+z^2+z^3+z^4) P_m(z^4)/4. + +The four residue classes of coefficients do not overlap. Therefore the +sum of absolute coefficients of q_n equals that of P_m. + +In descending degree, the coefficient with index l has sign +s_l=(-1)^(l(l+3)/2), namely ++--++--. To check this, the elementary +symmetric function in r,...,r^m equals + + r^(l(l+1)/2) product_(k=1..l) (1-r^(m-l+k))/(1-r^k). + +This identity follows by separating subsets that contain the last root; +the empty product gives the initial case. Every factor in the product +is positive. Include the coefficient sign (-1)^l to get s_l. + +Let u_l be the absolute coefficients of P_(2n), L their sum, and U_odd +their sum over odd l. Add the next two roots -a,b, where +b=16^(-(n+1)) and a=4b. The new factor is +(t^2+(a-b)t-ab)/((1+a)(1-b)). The sign rule gives + + L_new - L = [2ab L - 2(a-b) U_odd]/((1+a)(1-b)). + +For n>=1, the unnormalized coefficient of t^(2n-1) has magnitude +(1-16^(-n))/5 >=3/16. The sum of the unnormalized absolute coefficients +is at most product_j(1+4^(-j)) <=3/2. The last inequality follows by +expanding the product and bounding it by the geometric series whose +ratio is sum_j 4^(-j)<=1/3. Hence U_odd/L>=1/8. On the other hand, +ab/(a-b)=4b/3<=1/192. Thus L_new=1. + +For n=1, P_2(t)=(64t^2+12t-1)/75, so L=77/75. For n=0, L=1. +Consequently the positive coefficient mass of q_n is at most +(1+77/75)/2=76/75. The exact identity sum_f b_f E_f=M and E_f>=0 +give the claimed bound. This is a bound for this filter; optimality of +the operator stability constant is not claimed. + +The implementation forms the integer numerator +product_j(4^j t-(-1)^j) and the common denominator +product_j(4^j-(-1)^j) first. It reduces fractions only when it emits q_n. +This gives the same polynomial and avoids repeated large rational reductions. + +## 3. The one-axis maximum cutoff is exactly eight + +The frozen native C and S gates generate all 96 exact operators of C_1. +Their closure and phases are checked in verify.py. Let + + K[g,h] = sum_(f=5..8) (tr(g* h)/2)^f. + +The file [ONE-AXIS-RANK.json](ONE-AXIS-RANK.json) contains an inverse of K +after reduction to F_65537 with i mapped to 256. The checker reconstructs +K, checks that 65537 is prime and 256^2=-1, and multiplies K by this +inverse. It does not use the elimination routine to check the inverse. +All original denominators are powers of two. A nonzero reduced determinant +therefore proves that the characteristic-zero determinant is nonzero. +The positive semidefinite Gram sum K has zero kernel. This proves that +widths 5,6,7,8 suffice for every fixed residual on C_1. + +The Reynolds example in PROOF.md vanishes at widths 1 through 7 and is +nonzero at width 8. The maximum cutoff eight is therefore sharp. +At least four tested widths are required: for each residue r modulo four, +the four scalar operators give the residual + + sum_(k=0..3) i^(-rk) (i^k I)^(tensor f). + +It vanishes unless f is congruent to r modulo four. A test set that omits +one residue cannot detect this residual. Thus four is also the minimum +number of widths for a fixed universal test on C_1. Neither conclusion +establishes a sharp cutoff for n>=2. + +## 4. A phase-exact quadratic path calculation + +[quadratic.py](quadratic.py) accepts the frozen native P, X, D, C and +phase gate grammar. It keeps a list of binary affine output bits and a +phase polynomial modulo four. The polynomial has arbitrary linear +coefficients and even cross coefficients. It also keeps an exact Gaussian +scalar factor. It never allocates an array indexed by the 2^n base states. + +Start with n input variables. P and X change only the affine output bits. +D adds its stated linear and even quadratic phase. For C(q,s), use + + C(q,s) = ((1+s i)/2) (I + i^(-s) X_q). + +Add one binary path variable a, multiply the scalar factor by (1+s i)/2, +add -s a to the phase and add a q to the output bits. Keep the literal +phase gate. The formula also covers q=0. The number of variables is +m=n+h, where h is the number of C gates in the literal word. + +An affine parity has, modulo four, its constant and linear terms plus +even pair terms. Terms of degree at least three vanish modulo four. +Twice a product of parities needs only the product over F_2. Thus every +gate preserves this representation, including affine translations. + +An entry fixes the input and output bits. A trace equates them. Binary +elimination either rejects inconsistent equations or gives an affine +parametrization with one assignment per solution. Substitute this map +in the phase. The remaining unconstrained sum is evaluated as follows: + +- For an odd linear coefficient a of variable x, write its part as + a x+2 x L. Summing x gives (1+i^a) i^(-a L). Remove x and add the + indicated parity phase. This keeps the same quadratic form class. +- If every linear coefficient is even and a cross term remains, sum one + variable x. The result is twice the sum subject to a binary affine + constraint on its neighbors. Eliminate that constraint. +- If no cross terms remain, a linear coefficient 2 makes the sum zero. + Otherwise each remaining variable supplies a factor two. + +Each step removes at least one variable. The code uses direct polynomial +substitution. A conservative bound is O(m^5) arithmetic operations per +sum, plus O(L m^4) to build a path form for L native gates. It uses +polynomial space. This bound is not a +claim of optimal stabilizer simulation or constant-time integer arithmetic. +Coefficient bit lengths are polynomial in the literal word length. + +The use of binary quadratic forms for Clifford operations is classical; +see [Dehaene and De Moor, Sections III-V](https://arxiv.org/pdf/quant-ph/0304125). +The new implementation derives its phases directly from the pinned native +kernel. The dense frozen kernel remains a separate finite test oracle. + +## 5. Bitwise witness extraction removes the D^2 scan + +For two operators g,h and fixed prefixes of the output and input bits, +define B(g,h) as the sum of conjugate(g[x,y])h[x,y] over the unspecified +bits. Combine two path sums, negate the left phase, equate their input +and output bits, and impose the prefix equations. Section 4 computes B +in polynomial time, with at most the sum of both path-variable counts. + +With r tensor factors still after the current factor, the conditional +squared norm is + + sum_(g,h) conjugate(c_g)c_h B(g,h) (tr(g* h)/D)^r. + +It is real and nonnegative. The two choices for the next coordinate bit +partition its sum. Choose the larger child. After 2n choices, the current +base coordinate pair is fixed; multiply each coefficient by g[x,y] and +continue with the next tensor factor. There are 2nf bit choices, each +with two children, instead of fD^2 coordinate trials. + +At the start of one factor the conditional norm is D E. The 2n splits +lose at most D^2. Induction gives the same final entry bound as PROOF.md: + + |entry|^2 >= E_f D^(-f). + +[compact.py](compact.py) also expands complete register endpoints as +signed native words. It retains every input and return role. It merges +two unitary words exactly when tr(g* h)/D=1; the identity +||g-h||_HS^2=2D-2 Re tr(g* h) proves this test. Global phases stay inside +the operator keys, not in coefficients outside the tensor power. + +For expanded support s and a maximum literal path size m, pair traces +cost O(s^2 poly(m)). A witness costs O(n f s^2 poly(m)) arithmetic +operations, with polynomial space in these parameters. No 2^n matrix or +2^(nf) tensor is built. The symbolic support s can still grow exponentially +in the register-program length. This result does not remove that obstacle. + +## Verification and limits + +[verify_advances.py](verify_advances.py) checks the code invariant, exact +filter bounds, modular inverse certificate, exhaustive small quadratic +sums, frozen native entries and traces, conditional inner products, and +complete programs against the original dense compiler. It checks larger +native examples without a dense matrix. ADVANCES-RESULT.json records the +executed counts. Normal and optimized Python must produce the same receipt. + +The proofs above are written arguments, not proof-kernel certificates. +The code invariant and quadratic-form method have classical predecessors. +The sparse full-program adapter, finite-width refinements and native phase +bindings are the present contribution. No complete current provider or +physical cost invoice has been run. No selected frontier changes here. + +## Open next questions + +1. Prove a sharper maximum cutoff for n>=2, or give a matching obstruction. +2. Bound support growth on one complete current provider before a large run. +3. Derive a useful stability constant for the eight selected widths. +4. Improve the quadratic elimination cost after a measured provider needs it. diff --git a/research/clifford-tensor-gram/LICENSE b/research/clifford-tensor-gram/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/clifford-tensor-gram/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/clifford-tensor-gram/MUTATIONS.json b/research/clifford-tensor-gram/MUTATIONS.json new file mode 100644 index 0000000000..9263be8739 --- /dev/null +++ b/research/clifford-tensor-gram/MUTATIONS.json @@ -0,0 +1,45 @@ +{ + "cases": [ + { + "mutation": "omit final trace root", + "optimized": false, + "rejection": "Polynomial endpoints" + }, + { + "mutation": "omit final trace root", + "optimized": true, + "rejection": "Polynomial endpoints" + }, + { + "mutation": "ignore inverse", + "optimized": false, + "rejection": "Signed-word complete endpoint" + }, + { + "mutation": "ignore inverse", + "optimized": true, + "rejection": "Signed-word complete endpoint" + }, + { + "mutation": "omit final return", + "optimized": false, + "rejection": "Zero-axis scalar group" + }, + { + "mutation": "omit final return", + "optimized": true, + "rejection": "Zero-axis scalar group" + }, + { + "mutation": "remove Gram normalization", + "optimized": false, + "rejection": "Independent dense norm" + }, + { + "mutation": "remove Gram normalization", + "optimized": true, + "rejection": "Independent dense norm" + } + ], + "status": "PASS_CLIFFORD_GRAM_MUTATIONS" +} diff --git a/research/clifford-tensor-gram/ONE-AXIS-RANK.json b/research/clifford-tensor-gram/ONE-AXIS-RANK.json new file mode 100644 index 0000000000..6138b717d1 --- /dev/null +++ b/research/clifford-tensor-gram/ONE-AXIS-RANK.json @@ -0,0 +1,9422 @@ +{ + "group_sha256": "32481fd502c5f388244bcd56d20fbc0e0ca3933f47dbbdbbd8215397cea0238d", + "image_of_i": 256, + "inverse": [ + [ + 32344, + 51075, + 51075, + 43700, + 17417, + 17417, + 43700, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 7672, + 7672, + 24403, + 7672, + 24403, + 7672, + 7672, + 24403, + 24403, + 7672, + 51075, + 59027, + 51075, + 59027, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 17417, + 43700, + 4446, + 17417, + 53551, + 43700, + 4446, + 17417, + 17417, + 43700, + 17417, + 4446, + 4446, + 17417, + 4446, + 43700, + 4446, + 38637, + 6061, + 38637, + 60702, + 6061, + 6061, + 38637, + 6061, + 60702, + 38637, + 6061, + 38637, + 6061, + 60702, + 38637, + 60702, + 41134, + 41134, + 24403, + 41134, + 7672, + 41134, + 41134, + 41134, + 57865, + 7672, + 41134, + 24403, + 41134, + 39000, + 59027, + 39000, + 39000, + 59027, + 39000, + 39000, + 39000, + 4446, + 18453, + 4446, + 38637 + ], + [ + 60702, + 32344, + 7672, + 51075, + 51075, + 51075, + 59027, + 43700, + 17417, + 17417, + 43700, + 17417, + 43700, + 4446, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 6061, + 38637, + 60702, + 7672, + 24403, + 7672, + 24403, + 7672, + 7672, + 24403, + 24403, + 7672, + 41134, + 41134, + 24403, + 41134, + 7672, + 51075, + 59027, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 39000, + 39000, + 59027, + 17417, + 53551, + 43700, + 4446, + 17417, + 17417, + 43700, + 17417, + 4446, + 4446, + 17417, + 4446, + 43700, + 4446, + 4446, + 18453, + 6061, + 6061, + 38637, + 6061, + 60702, + 38637, + 6061, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 41134, + 41134, + 41134, + 57865, + 7672, + 41134, + 24403, + 41134, + 39000, + 39000, + 39000, + 4446 + ], + [ + 60702, + 7672, + 32344, + 59027, + 51075, + 51075, + 51075, + 4446, + 43700, + 17417, + 17417, + 43700, + 17417, + 43700, + 60702, + 38637, + 38637, + 38637, + 6061, + 38637, + 60702, + 38637, + 38637, + 38637, + 7672, + 7672, + 24403, + 41134, + 24403, + 7672, + 7672, + 41134, + 41134, + 7672, + 24403, + 7672, + 24403, + 24403, + 59027, + 59027, + 59027, + 59027, + 51075, + 39000, + 39000, + 51075, + 51075, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 4446, + 17417, + 4446, + 4446, + 17417, + 53551, + 4446, + 43700, + 18453, + 17417, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 38637, + 6061, + 60702, + 38637, + 60702, + 6061, + 6061, + 38637, + 6061, + 60702, + 6061, + 38637, + 38637, + 41134, + 41134, + 24403, + 41134, + 7672, + 57865, + 41134, + 41134, + 39000, + 39000, + 39000, + 4446 + ], + [ + 43700, + 60702, + 38637, + 32344, + 7672, + 7672, + 24403, + 51075, + 51075, + 51075, + 59027, + 51075, + 59027, + 59027, + 17417, + 17417, + 43700, + 17417, + 43700, + 4446, + 17417, + 53551, + 43700, + 4446, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 6061, + 38637, + 60702, + 6061, + 6061, + 38637, + 6061, + 60702, + 7672, + 24403, + 7672, + 7672, + 24403, + 24403, + 7672, + 41134, + 41134, + 24403, + 41134, + 7672, + 41134, + 41134, + 41134, + 57865, + 7672, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 39000, + 39000, + 59027, + 39000, + 39000, + 17417, + 17417, + 43700, + 17417, + 4446, + 4446, + 17417, + 4446, + 43700, + 4446, + 4446, + 18453, + 4446, + 38637, + 6061, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 41134, + 24403, + 41134, + 39000 + ], + [ + 4446, + 60702, + 60702, + 7672, + 32344, + 7672, + 7672, + 59027, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 43700, + 17417, + 17417, + 43700, + 17417, + 43700, + 4446, + 17417, + 4446, + 4446, + 38637, + 38637, + 38637, + 6061, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 24403, + 41134, + 24403, + 7672, + 7672, + 41134, + 41134, + 7672, + 24403, + 7672, + 24403, + 24403, + 41134, + 41134, + 24403, + 41134, + 7672, + 59027, + 51075, + 39000, + 39000, + 51075, + 51075, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 39000, + 17417, + 53551, + 4446, + 43700, + 18453, + 17417, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 4446, + 6061, + 6061, + 38637, + 6061, + 60702, + 6061, + 38637, + 38637, + 57865, + 41134, + 41134, + 39000 + ], + [ + 4446, + 60702, + 60702, + 7672, + 7672, + 32344, + 7672, + 59027, + 59027, + 51075, + 59027, + 51075, + 51075, + 59027, + 4446, + 43700, + 4446, + 17417, + 17417, + 4446, + 43700, + 17417, + 17417, + 43700, + 60702, + 60702, + 38637, + 38637, + 60702, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 7672, + 7672, + 7672, + 24403, + 7672, + 41134, + 24403, + 24403, + 7672, + 41134, + 41134, + 41134, + 24403, + 24403, + 41134, + 41134, + 24403, + 59027, + 51075, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 39000, + 43700, + 17417, + 4446, + 17417, + 4446, + 43700, + 53551, + 4446, + 17417, + 18453, + 17417, + 4446, + 43700, + 38637, + 6061, + 38637, + 6061, + 60702, + 6061, + 38637, + 6061, + 41134, + 41134, + 57865, + 39000 + ], + [ + 43700, + 38637, + 60702, + 24403, + 7672, + 7672, + 32344, + 59027, + 59027, + 51075, + 51075, + 59027, + 51075, + 51075, + 4446, + 17417, + 43700, + 17417, + 53551, + 17417, + 4446, + 43700, + 43700, + 17417, + 38637, + 60702, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 6061, + 60702, + 38637, + 60702, + 38637, + 38637, + 41134, + 24403, + 7672, + 41134, + 24403, + 57865, + 41134, + 7672, + 7672, + 24403, + 41134, + 41134, + 7672, + 41134, + 7672, + 24403, + 7672, + 39000, + 59027, + 39000, + 59027, + 59027, + 51075, + 39000, + 39000, + 39000, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 4446, + 17417, + 18453, + 4446, + 4446, + 17417, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 4446, + 38637, + 6061, + 60702, + 38637, + 60702, + 6061, + 38637, + 38637, + 41134, + 24403, + 41134, + 39000 + ], + [ + 51075, + 43700, + 17417, + 60702, + 38637, + 38637, + 38637, + 32344, + 7672, + 7672, + 24403, + 7672, + 24403, + 7672, + 51075, + 51075, + 59027, + 51075, + 59027, + 59027, + 51075, + 51075, + 59027, + 59027, + 17417, + 43700, + 17417, + 43700, + 4446, + 17417, + 53551, + 43700, + 4446, + 17417, + 17417, + 43700, + 17417, + 4446, + 38637, + 38637, + 60702, + 38637, + 6061, + 38637, + 60702, + 6061, + 6061, + 38637, + 6061, + 60702, + 38637, + 6061, + 38637, + 6061, + 60702, + 7672, + 24403, + 24403, + 7672, + 41134, + 41134, + 24403, + 41134, + 7672, + 41134, + 41134, + 41134, + 57865, + 7672, + 41134, + 24403, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 39000, + 39000, + 59027, + 39000, + 39000, + 39000, + 4446, + 17417, + 4446, + 43700, + 4446, + 4446, + 18453, + 4446, + 38637, + 60702, + 38637, + 41134 + ], + [ + 59027, + 4446, + 43700, + 60702, + 60702, + 38637, + 38637, + 7672, + 32344, + 7672, + 7672, + 24403, + 41134, + 24403, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 39000, + 39000, + 17417, + 17417, + 43700, + 17417, + 43700, + 4446, + 17417, + 4446, + 4446, + 17417, + 53551, + 4446, + 43700, + 18453, + 38637, + 6061, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 6061, + 6061, + 38637, + 6061, + 60702, + 7672, + 7672, + 41134, + 41134, + 7672, + 24403, + 7672, + 24403, + 24403, + 41134, + 41134, + 24403, + 41134, + 7672, + 57865, + 41134, + 51075, + 51075, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 39000, + 39000, + 17417, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 4446, + 6061, + 38637, + 38637, + 41134 + ], + [ + 59027, + 4446, + 4446, + 60702, + 60702, + 60702, + 60702, + 7672, + 7672, + 32344, + 7672, + 7672, + 7672, + 7672, + 59027, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 51075, + 59027, + 59027, + 43700, + 4446, + 17417, + 17417, + 4446, + 43700, + 17417, + 17417, + 43700, + 43700, + 17417, + 4446, + 17417, + 4446, + 38637, + 38637, + 60702, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 38637, + 6061, + 38637, + 6061, + 60702, + 24403, + 7672, + 41134, + 24403, + 24403, + 7672, + 41134, + 41134, + 41134, + 24403, + 24403, + 41134, + 41134, + 24403, + 41134, + 41134, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 39000, + 39000, + 43700, + 53551, + 4446, + 17417, + 18453, + 17417, + 4446, + 43700, + 6061, + 38637, + 6061, + 57865 + ], + [ + 59027, + 43700, + 4446, + 38637, + 60702, + 38637, + 60702, + 24403, + 7672, + 7672, + 32344, + 41134, + 24403, + 7672, + 59027, + 51075, + 51075, + 59027, + 51075, + 51075, + 39000, + 59027, + 39000, + 59027, + 17417, + 43700, + 17417, + 53551, + 17417, + 4446, + 43700, + 43700, + 17417, + 4446, + 17417, + 18453, + 4446, + 4446, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 6061, + 60702, + 38637, + 60702, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 41134, + 24403, + 57865, + 41134, + 7672, + 7672, + 24403, + 41134, + 41134, + 7672, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 59027, + 51075, + 39000, + 39000, + 39000, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 17417, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 4446, + 6061, + 38637, + 38637, + 41134 + ], + [ + 59027, + 4446, + 43700, + 60702, + 38637, + 60702, + 38637, + 7672, + 24403, + 7672, + 41134, + 32344, + 7672, + 24403, + 59027, + 59027, + 39000, + 51075, + 59027, + 39000, + 51075, + 51075, + 51075, + 59027, + 4446, + 4446, + 43700, + 4446, + 18453, + 17417, + 17417, + 17417, + 4446, + 17417, + 43700, + 17417, + 53551, + 43700, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 6061, + 38637, + 7672, + 7672, + 7672, + 7672, + 41134, + 24403, + 41134, + 24403, + 24403, + 41134, + 7672, + 57865, + 41134, + 41134, + 24403, + 41134, + 59027, + 59027, + 59027, + 51075, + 59027, + 39000, + 51075, + 39000, + 59027, + 39000, + 59027, + 39000, + 59027, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 17417, + 38637, + 38637, + 6061, + 41134 + ], + [ + 59027, + 43700, + 4446, + 38637, + 38637, + 60702, + 60702, + 24403, + 41134, + 7672, + 24403, + 7672, + 32344, + 7672, + 39000, + 59027, + 39000, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 51075, + 4446, + 18453, + 17417, + 43700, + 4446, + 17417, + 43700, + 53551, + 17417, + 4446, + 4446, + 43700, + 17417, + 17417, + 38637, + 60702, + 60702, + 6061, + 38637, + 6061, + 38637, + 38637, + 60702, + 6061, + 6061, + 6061, + 60702, + 38637, + 38637, + 38637, + 38637, + 41134, + 24403, + 24403, + 7672, + 41134, + 7672, + 57865, + 41134, + 41134, + 7672, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 39000, + 59027, + 39000, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 51075, + 59027, + 59027, + 4446, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 38637, + 38637, + 6061, + 41134 + ], + [ + 51075, + 17417, + 43700, + 38637, + 38637, + 38637, + 60702, + 7672, + 24403, + 7672, + 7672, + 24403, + 7672, + 32344, + 59027, + 51075, + 59027, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 17417, + 4446, + 53551, + 17417, + 43700, + 17417, + 17417, + 17417, + 17417, + 4446, + 43700, + 4446, + 43700, + 43700, + 6061, + 38637, + 60702, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 60702, + 6061, + 60702, + 38637, + 60702, + 41134, + 41134, + 41134, + 7672, + 41134, + 24403, + 41134, + 57865, + 24403, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 4446, + 17417, + 18453, + 4446, + 4446, + 43700, + 4446, + 4446, + 38637, + 60702, + 38637, + 41134 + ], + [ + 7672, + 59027, + 51075, + 4446, + 43700, + 17417, + 17417, + 60702, + 60702, + 38637, + 38637, + 38637, + 6061, + 38637, + 32344, + 7672, + 7672, + 24403, + 41134, + 24403, + 7672, + 7672, + 41134, + 41134, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 39000, + 39000, + 51075, + 51075, + 59027, + 59027, + 39000, + 43700, + 17417, + 43700, + 4446, + 17417, + 4446, + 4446, + 17417, + 53551, + 4446, + 43700, + 18453, + 17417, + 17417, + 43700, + 17417, + 4446, + 60702, + 38637, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 6061, + 6061, + 38637, + 6061, + 60702, + 6061, + 38637, + 7672, + 24403, + 7672, + 24403, + 24403, + 41134, + 41134, + 24403, + 41134, + 7672, + 57865, + 41134, + 41134, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 39000, + 39000, + 43700, + 4446, + 4446, + 38637 + ], + [ + 7672, + 59027, + 59027, + 4446, + 4446, + 43700, + 4446, + 60702, + 60702, + 60702, + 60702, + 38637, + 38637, + 60702, + 7672, + 32344, + 7672, + 7672, + 7672, + 7672, + 24403, + 7672, + 41134, + 24403, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 17417, + 17417, + 4446, + 43700, + 17417, + 17417, + 43700, + 43700, + 17417, + 4446, + 17417, + 4446, + 43700, + 53551, + 4446, + 17417, + 18453, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 38637, + 6061, + 38637, + 6061, + 60702, + 6061, + 38637, + 24403, + 7672, + 41134, + 41134, + 41134, + 24403, + 24403, + 41134, + 41134, + 24403, + 41134, + 41134, + 57865, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 39000, + 39000, + 17417, + 4446, + 43700, + 6061 + ], + [ + 24403, + 59027, + 59027, + 43700, + 4446, + 17417, + 43700, + 38637, + 60702, + 38637, + 60702, + 6061, + 6061, + 38637, + 7672, + 7672, + 32344, + 41134, + 24403, + 7672, + 41134, + 24403, + 57865, + 41134, + 51075, + 51075, + 59027, + 51075, + 51075, + 39000, + 59027, + 39000, + 59027, + 59027, + 51075, + 39000, + 39000, + 39000, + 17417, + 53551, + 17417, + 4446, + 43700, + 43700, + 17417, + 4446, + 17417, + 18453, + 4446, + 4446, + 17417, + 17417, + 4446, + 43700, + 4446, + 38637, + 38637, + 6061, + 6061, + 60702, + 38637, + 60702, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 6061, + 38637, + 7672, + 7672, + 24403, + 41134, + 41134, + 7672, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 17417, + 43700, + 4446, + 38637 + ], + [ + 7672, + 59027, + 59027, + 4446, + 43700, + 4446, + 4446, + 60702, + 38637, + 60702, + 38637, + 60702, + 60702, + 60702, + 24403, + 7672, + 41134, + 32344, + 7672, + 24403, + 7672, + 7672, + 7672, + 7672, + 59027, + 39000, + 51075, + 59027, + 39000, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 43700, + 4446, + 18453, + 17417, + 17417, + 17417, + 4446, + 17417, + 43700, + 17417, + 53551, + 43700, + 4446, + 17417, + 43700, + 17417, + 4446, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 41134, + 24403, + 41134, + 24403, + 24403, + 41134, + 7672, + 57865, + 41134, + 41134, + 24403, + 41134, + 41134, + 39000, + 51075, + 39000, + 59027, + 39000, + 59027, + 39000, + 59027, + 43700, + 4446, + 17417, + 6061 + ], + [ + 24403, + 59027, + 39000, + 43700, + 4446, + 4446, + 18453, + 38637, + 38637, + 60702, + 60702, + 38637, + 60702, + 60702, + 41134, + 7672, + 24403, + 7672, + 32344, + 7672, + 41134, + 24403, + 24403, + 7672, + 59027, + 39000, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 51075, + 39000, + 59027, + 39000, + 59027, + 59027, + 17417, + 43700, + 4446, + 17417, + 43700, + 53551, + 17417, + 4446, + 4446, + 43700, + 17417, + 17417, + 4446, + 17417, + 4446, + 43700, + 4446, + 6061, + 38637, + 6061, + 38637, + 38637, + 60702, + 6061, + 6061, + 6061, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 41134, + 7672, + 57865, + 41134, + 41134, + 7672, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 41134, + 59027, + 51075, + 39000, + 59027, + 39000, + 51075, + 59027, + 59027, + 17417, + 43700, + 17417, + 6061 + ], + [ + 7672, + 51075, + 59027, + 17417, + 43700, + 17417, + 4446, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 60702, + 24403, + 7672, + 7672, + 24403, + 7672, + 32344, + 41134, + 41134, + 41134, + 7672, + 51075, + 59027, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 53551, + 17417, + 43700, + 17417, + 17417, + 17417, + 17417, + 4446, + 43700, + 4446, + 43700, + 43700, + 4446, + 17417, + 18453, + 4446, + 4446, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 60702, + 6061, + 60702, + 38637, + 60702, + 38637, + 60702, + 41134, + 24403, + 41134, + 57865, + 24403, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 41134, + 59027, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 43700, + 4446, + 4446, + 38637 + ], + [ + 7672, + 59027, + 51075, + 4446, + 17417, + 43700, + 17417, + 60702, + 38637, + 38637, + 6061, + 60702, + 38637, + 38637, + 7672, + 24403, + 41134, + 7672, + 41134, + 41134, + 32344, + 7672, + 7672, + 24403, + 59027, + 59027, + 59027, + 39000, + 39000, + 51075, + 51075, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 4446, + 4446, + 4446, + 43700, + 17417, + 4446, + 18453, + 53551, + 17417, + 17417, + 17417, + 4446, + 43700, + 43700, + 17417, + 17417, + 43700, + 60702, + 38637, + 60702, + 60702, + 6061, + 6061, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 24403, + 41134, + 7672, + 7672, + 7672, + 57865, + 24403, + 41134, + 41134, + 24403, + 41134, + 41134, + 24403, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 39000, + 59027, + 4446, + 4446, + 43700, + 38637 + ], + [ + 24403, + 39000, + 59027, + 18453, + 4446, + 4446, + 43700, + 60702, + 60702, + 60702, + 38637, + 60702, + 38637, + 38637, + 7672, + 7672, + 24403, + 7672, + 24403, + 41134, + 7672, + 32344, + 24403, + 41134, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 51075, + 59027, + 39000, + 51075, + 51075, + 59027, + 51075, + 39000, + 4446, + 43700, + 4446, + 4446, + 43700, + 43700, + 4446, + 17417, + 17417, + 43700, + 17417, + 4446, + 17417, + 17417, + 17417, + 53551, + 4446, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 6061, + 6061, + 38637, + 6061, + 6061, + 7672, + 7672, + 24403, + 7672, + 41134, + 41134, + 7672, + 41134, + 24403, + 41134, + 41134, + 57865, + 41134, + 59027, + 51075, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 17417, + 43700, + 17417, + 6061 + ], + [ + 24403, + 59027, + 59027, + 43700, + 17417, + 4446, + 43700, + 38637, + 6061, + 38637, + 6061, + 60702, + 60702, + 38637, + 41134, + 41134, + 57865, + 7672, + 24403, + 41134, + 7672, + 24403, + 32344, + 7672, + 39000, + 39000, + 59027, + 39000, + 39000, + 51075, + 59027, + 51075, + 59027, + 59027, + 39000, + 51075, + 51075, + 51075, + 4446, + 18453, + 4446, + 17417, + 43700, + 43700, + 4446, + 17417, + 4446, + 53551, + 17417, + 17417, + 4446, + 4446, + 17417, + 43700, + 17417, + 38637, + 38637, + 60702, + 60702, + 6061, + 38637, + 6061, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 60702, + 38637, + 41134, + 41134, + 24403, + 7672, + 7672, + 41134, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 4446, + 43700, + 17417, + 38637 + ], + [ + 7672, + 51075, + 59027, + 17417, + 17417, + 43700, + 4446, + 38637, + 6061, + 38637, + 38637, + 38637, + 60702, + 60702, + 41134, + 24403, + 41134, + 7672, + 7672, + 7672, + 24403, + 41134, + 7672, + 32344, + 59027, + 39000, + 51075, + 59027, + 59027, + 51075, + 59027, + 51075, + 51075, + 39000, + 39000, + 59027, + 59027, + 51075, + 17417, + 4446, + 4446, + 53551, + 17417, + 17417, + 43700, + 43700, + 4446, + 17417, + 17417, + 17417, + 18453, + 43700, + 4446, + 4446, + 43700, + 6061, + 6061, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 60702, + 57865, + 41134, + 41134, + 41134, + 7672, + 24403, + 24403, + 41134, + 41134, + 24403, + 7672, + 7672, + 24403, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 4446, + 4446, + 43700, + 38637 + ], + [ + 60702, + 7672, + 7672, + 59027, + 59027, + 51075, + 59027, + 4446, + 4446, + 43700, + 4446, + 17417, + 17417, + 4446, + 60702, + 60702, + 60702, + 38637, + 38637, + 60702, + 38637, + 38637, + 6061, + 38637, + 32344, + 7672, + 7672, + 7672, + 7672, + 24403, + 7672, + 41134, + 24403, + 24403, + 7672, + 41134, + 41134, + 41134, + 51075, + 51075, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 51075, + 39000, + 59027, + 39000, + 43700, + 17417, + 17417, + 43700, + 43700, + 17417, + 4446, + 17417, + 4446, + 43700, + 53551, + 4446, + 17417, + 18453, + 17417, + 4446, + 38637, + 38637, + 38637, + 6061, + 38637, + 38637, + 6061, + 38637, + 6061, + 60702, + 6061, + 38637, + 6061, + 24403, + 24403, + 41134, + 41134, + 24403, + 41134, + 41134, + 57865, + 59027, + 39000, + 39000, + 43700 + ], + [ + 38637, + 24403, + 7672, + 59027, + 59027, + 51075, + 51075, + 43700, + 4446, + 17417, + 43700, + 17417, + 53551, + 17417, + 60702, + 38637, + 60702, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 6061, + 7672, + 32344, + 41134, + 24403, + 7672, + 41134, + 24403, + 57865, + 41134, + 7672, + 7672, + 24403, + 41134, + 41134, + 59027, + 51075, + 51075, + 39000, + 59027, + 39000, + 59027, + 59027, + 51075, + 39000, + 39000, + 39000, + 51075, + 59027, + 59027, + 59027, + 59027, + 4446, + 43700, + 43700, + 17417, + 4446, + 17417, + 18453, + 4446, + 4446, + 17417, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 60702, + 38637, + 60702, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 6061, + 38637, + 38637, + 7672, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 59027, + 59027, + 39000, + 4446 + ], + [ + 60702, + 7672, + 24403, + 59027, + 59027, + 59027, + 39000, + 4446, + 43700, + 4446, + 4446, + 43700, + 4446, + 18453, + 38637, + 60702, + 38637, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 7672, + 41134, + 32344, + 7672, + 24403, + 7672, + 7672, + 7672, + 7672, + 41134, + 24403, + 41134, + 24403, + 24403, + 51075, + 59027, + 39000, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 39000, + 51075, + 39000, + 59027, + 39000, + 17417, + 17417, + 17417, + 4446, + 17417, + 43700, + 17417, + 53551, + 43700, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 41134, + 7672, + 57865, + 41134, + 41134, + 24403, + 41134, + 41134, + 59027, + 39000, + 59027, + 17417 + ], + [ + 38637, + 24403, + 41134, + 59027, + 39000, + 59027, + 39000, + 43700, + 4446, + 4446, + 18453, + 17417, + 43700, + 4446, + 38637, + 60702, + 60702, + 38637, + 60702, + 60702, + 6061, + 38637, + 6061, + 38637, + 7672, + 24403, + 7672, + 32344, + 7672, + 41134, + 24403, + 24403, + 7672, + 41134, + 7672, + 57865, + 41134, + 41134, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 51075, + 39000, + 59027, + 39000, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 17417, + 43700, + 53551, + 17417, + 4446, + 4446, + 43700, + 17417, + 17417, + 4446, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 38637, + 60702, + 6061, + 6061, + 6061, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 7672, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 41134, + 51075, + 59027, + 59027, + 17417 + ], + [ + 38637, + 7672, + 24403, + 51075, + 59027, + 51075, + 59027, + 17417, + 43700, + 17417, + 4446, + 53551, + 17417, + 43700, + 38637, + 38637, + 60702, + 6061, + 38637, + 60702, + 6061, + 6061, + 6061, + 38637, + 7672, + 7672, + 24403, + 7672, + 32344, + 41134, + 41134, + 41134, + 7672, + 41134, + 24403, + 41134, + 57865, + 24403, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 39000, + 59027, + 17417, + 17417, + 17417, + 17417, + 4446, + 43700, + 4446, + 43700, + 43700, + 4446, + 17417, + 18453, + 4446, + 4446, + 43700, + 4446, + 38637, + 38637, + 38637, + 6061, + 38637, + 60702, + 6061, + 60702, + 38637, + 60702, + 38637, + 60702, + 38637, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 41134, + 59027, + 59027, + 39000, + 4446 + ], + [ + 60702, + 7672, + 7672, + 59027, + 51075, + 59027, + 59027, + 4446, + 17417, + 43700, + 17417, + 4446, + 4446, + 4446, + 38637, + 38637, + 6061, + 60702, + 38637, + 38637, + 60702, + 38637, + 60702, + 60702, + 24403, + 41134, + 7672, + 41134, + 41134, + 32344, + 7672, + 7672, + 24403, + 24403, + 41134, + 7672, + 7672, + 7672, + 59027, + 39000, + 39000, + 51075, + 51075, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 43700, + 17417, + 4446, + 18453, + 53551, + 17417, + 17417, + 17417, + 4446, + 43700, + 43700, + 17417, + 17417, + 43700, + 4446, + 4446, + 6061, + 6061, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 57865, + 24403, + 41134, + 41134, + 24403, + 41134, + 41134, + 24403, + 39000, + 39000, + 59027, + 43700 + ], + [ + 60702, + 24403, + 7672, + 39000, + 59027, + 59027, + 59027, + 18453, + 4446, + 4446, + 43700, + 4446, + 43700, + 4446, + 60702, + 60702, + 38637, + 60702, + 38637, + 38637, + 60702, + 60702, + 38637, + 38637, + 7672, + 24403, + 7672, + 24403, + 41134, + 7672, + 32344, + 24403, + 41134, + 7672, + 7672, + 24403, + 7672, + 41134, + 59027, + 59027, + 39000, + 59027, + 51075, + 59027, + 39000, + 51075, + 51075, + 59027, + 51075, + 39000, + 59027, + 51075, + 59027, + 51075, + 39000, + 4446, + 43700, + 43700, + 4446, + 17417, + 17417, + 43700, + 17417, + 4446, + 17417, + 17417, + 17417, + 53551, + 4446, + 17417, + 43700, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 6061, + 6061, + 38637, + 6061, + 6061, + 6061, + 41134, + 7672, + 41134, + 24403, + 41134, + 41134, + 57865, + 41134, + 59027, + 39000, + 59027, + 17417 + ], + [ + 38637, + 24403, + 41134, + 59027, + 59027, + 39000, + 39000, + 43700, + 17417, + 4446, + 43700, + 4446, + 18453, + 4446, + 6061, + 38637, + 6061, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 60702, + 41134, + 57865, + 7672, + 24403, + 41134, + 7672, + 24403, + 32344, + 7672, + 41134, + 41134, + 24403, + 7672, + 7672, + 59027, + 39000, + 39000, + 51075, + 59027, + 51075, + 59027, + 59027, + 39000, + 51075, + 51075, + 51075, + 39000, + 59027, + 59027, + 59027, + 59027, + 17417, + 43700, + 43700, + 4446, + 17417, + 4446, + 53551, + 17417, + 17417, + 4446, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 6061, + 38637, + 6061, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 60702, + 38637, + 38637, + 41134, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 59027, + 59027, + 51075, + 17417 + ], + [ + 38637, + 7672, + 41134, + 51075, + 59027, + 59027, + 39000, + 17417, + 17417, + 43700, + 4446, + 17417, + 4446, + 4446, + 6061, + 38637, + 38637, + 38637, + 60702, + 60702, + 6061, + 6061, + 38637, + 60702, + 24403, + 41134, + 7672, + 7672, + 7672, + 24403, + 41134, + 7672, + 32344, + 57865, + 41134, + 41134, + 41134, + 7672, + 51075, + 59027, + 59027, + 51075, + 59027, + 51075, + 51075, + 39000, + 39000, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 53551, + 17417, + 17417, + 43700, + 43700, + 4446, + 17417, + 17417, + 17417, + 18453, + 43700, + 4446, + 4446, + 43700, + 4446, + 4446, + 6061, + 38637, + 6061, + 6061, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 60702, + 38637, + 24403, + 24403, + 41134, + 41134, + 24403, + 7672, + 7672, + 24403, + 59027, + 59027, + 59027, + 43700 + ], + [ + 38637, + 41134, + 7672, + 39000, + 59027, + 59027, + 51075, + 4446, + 4446, + 43700, + 17417, + 4446, + 17417, + 17417, + 60702, + 38637, + 38637, + 38637, + 6061, + 6061, + 60702, + 60702, + 38637, + 6061, + 24403, + 7672, + 41134, + 41134, + 41134, + 24403, + 7672, + 41134, + 57865, + 32344, + 7672, + 7672, + 7672, + 41134, + 39000, + 59027, + 59027, + 39000, + 59027, + 39000, + 39000, + 51075, + 51075, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 18453, + 4446, + 4446, + 43700, + 43700, + 17417, + 4446, + 4446, + 4446, + 53551, + 43700, + 17417, + 17417, + 43700, + 17417, + 17417, + 60702, + 38637, + 60702, + 60702, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 6061, + 38637, + 24403, + 24403, + 7672, + 7672, + 24403, + 41134, + 41134, + 24403, + 59027, + 59027, + 59027, + 43700 + ], + [ + 38637, + 41134, + 24403, + 39000, + 39000, + 59027, + 59027, + 4446, + 18453, + 4446, + 4446, + 43700, + 17417, + 43700, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 6061, + 6061, + 7672, + 7672, + 24403, + 7672, + 24403, + 41134, + 7672, + 41134, + 41134, + 7672, + 32344, + 41134, + 24403, + 57865, + 59027, + 51075, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 51075, + 51075, + 59027, + 51075, + 39000, + 4446, + 4446, + 17417, + 17417, + 4446, + 43700, + 4446, + 43700, + 43700, + 17417, + 17417, + 43700, + 17417, + 4446, + 53551, + 17417, + 60702, + 60702, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 6061, + 6061, + 7672, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 41134, + 51075, + 59027, + 59027, + 17417 + ], + [ + 38637, + 24403, + 7672, + 59027, + 51075, + 59027, + 51075, + 43700, + 17417, + 17417, + 53551, + 4446, + 43700, + 17417, + 38637, + 6061, + 6061, + 38637, + 6061, + 6061, + 60702, + 38637, + 60702, + 38637, + 41134, + 24403, + 41134, + 57865, + 41134, + 7672, + 24403, + 24403, + 41134, + 7672, + 41134, + 32344, + 7672, + 7672, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 39000, + 51075, + 59027, + 51075, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 4446, + 43700, + 18453, + 4446, + 17417, + 17417, + 43700, + 4446, + 4446, + 17417, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 38637, + 6061, + 60702, + 60702, + 60702, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 41134, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 7672, + 39000, + 59027, + 59027, + 4446 + ], + [ + 38637, + 41134, + 24403, + 39000, + 59027, + 39000, + 59027, + 4446, + 43700, + 4446, + 17417, + 18453, + 4446, + 43700, + 38637, + 38637, + 6061, + 60702, + 38637, + 6061, + 60702, + 60702, + 60702, + 38637, + 41134, + 41134, + 24403, + 41134, + 57865, + 7672, + 7672, + 7672, + 41134, + 7672, + 24403, + 7672, + 32344, + 24403, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 51075, + 59027, + 4446, + 4446, + 4446, + 4446, + 17417, + 43700, + 17417, + 43700, + 43700, + 17417, + 4446, + 53551, + 17417, + 17417, + 43700, + 17417, + 38637, + 38637, + 38637, + 60702, + 38637, + 6061, + 60702, + 6061, + 38637, + 6061, + 38637, + 6061, + 38637, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 7672, + 59027, + 59027, + 51075, + 17417 + ], + [ + 38637, + 7672, + 24403, + 51075, + 51075, + 59027, + 59027, + 17417, + 53551, + 17417, + 17417, + 43700, + 4446, + 43700, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 60702, + 60702, + 41134, + 41134, + 24403, + 41134, + 24403, + 7672, + 41134, + 7672, + 7672, + 41134, + 57865, + 7672, + 24403, + 32344, + 59027, + 39000, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 39000, + 39000, + 59027, + 39000, + 51075, + 17417, + 17417, + 4446, + 4446, + 17417, + 43700, + 17417, + 43700, + 43700, + 4446, + 4446, + 43700, + 4446, + 17417, + 18453, + 4446, + 6061, + 6061, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 60702, + 60702, + 41134, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 7672, + 39000, + 59027, + 59027, + 4446 + ], + [ + 4446, + 60702, + 38637, + 7672, + 24403, + 7672, + 41134, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 39000, + 43700, + 4446, + 4446, + 43700, + 4446, + 18453, + 17417, + 17417, + 17417, + 4446, + 60702, + 38637, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 32344, + 7672, + 24403, + 7672, + 7672, + 7672, + 7672, + 41134, + 24403, + 41134, + 24403, + 24403, + 41134, + 7672, + 57865, + 41134, + 41134, + 51075, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 39000, + 51075, + 39000, + 59027, + 39000, + 59027, + 39000, + 17417, + 43700, + 17417, + 53551, + 43700, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 17417, + 38637, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 24403, + 41134, + 41134, + 59027 + ], + [ + 43700, + 38637, + 38637, + 24403, + 41134, + 7672, + 24403, + 59027, + 39000, + 59027, + 39000, + 51075, + 51075, + 59027, + 4446, + 4446, + 18453, + 17417, + 43700, + 4446, + 17417, + 43700, + 53551, + 17417, + 60702, + 60702, + 38637, + 60702, + 60702, + 6061, + 38637, + 6061, + 38637, + 38637, + 60702, + 6061, + 6061, + 6061, + 7672, + 32344, + 7672, + 41134, + 24403, + 24403, + 7672, + 41134, + 7672, + 57865, + 41134, + 41134, + 7672, + 7672, + 41134, + 24403, + 41134, + 59027, + 59027, + 51075, + 51075, + 39000, + 59027, + 39000, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 51075, + 59027, + 4446, + 4446, + 43700, + 17417, + 17417, + 4446, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 7672, + 24403, + 41134, + 59027 + ], + [ + 17417, + 38637, + 38637, + 7672, + 24403, + 7672, + 7672, + 51075, + 59027, + 51075, + 59027, + 51075, + 51075, + 51075, + 43700, + 17417, + 4446, + 53551, + 17417, + 43700, + 17417, + 17417, + 17417, + 17417, + 38637, + 60702, + 6061, + 38637, + 60702, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 24403, + 7672, + 32344, + 41134, + 41134, + 41134, + 7672, + 41134, + 24403, + 41134, + 57865, + 24403, + 7672, + 41134, + 24403, + 41134, + 7672, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 4446, + 43700, + 4446, + 43700, + 43700, + 4446, + 17417, + 18453, + 4446, + 4446, + 43700, + 4446, + 4446, + 60702, + 6061, + 60702, + 38637, + 60702, + 38637, + 60702, + 38637, + 24403, + 7672, + 41134, + 39000 + ], + [ + 4446, + 60702, + 38637, + 7672, + 7672, + 24403, + 41134, + 59027, + 51075, + 59027, + 59027, + 59027, + 39000, + 39000, + 17417, + 43700, + 17417, + 4446, + 4446, + 4446, + 43700, + 17417, + 4446, + 18453, + 38637, + 6061, + 60702, + 38637, + 38637, + 60702, + 38637, + 60702, + 60702, + 6061, + 6061, + 38637, + 38637, + 60702, + 7672, + 41134, + 41134, + 32344, + 7672, + 7672, + 24403, + 24403, + 41134, + 7672, + 7672, + 7672, + 57865, + 24403, + 41134, + 41134, + 24403, + 51075, + 51075, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 39000, + 53551, + 17417, + 17417, + 17417, + 4446, + 43700, + 43700, + 17417, + 17417, + 43700, + 4446, + 4446, + 43700, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 41134, + 41134, + 24403, + 59027 + ], + [ + 18453, + 60702, + 60702, + 24403, + 7672, + 7672, + 24403, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 4446, + 4446, + 43700, + 4446, + 43700, + 4446, + 4446, + 43700, + 43700, + 4446, + 60702, + 38637, + 60702, + 38637, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 7672, + 24403, + 41134, + 7672, + 32344, + 24403, + 41134, + 7672, + 7672, + 24403, + 7672, + 41134, + 41134, + 7672, + 41134, + 24403, + 41134, + 59027, + 51075, + 59027, + 39000, + 51075, + 51075, + 59027, + 51075, + 39000, + 59027, + 51075, + 59027, + 51075, + 39000, + 59027, + 39000, + 17417, + 17417, + 43700, + 17417, + 4446, + 17417, + 17417, + 17417, + 53551, + 4446, + 17417, + 43700, + 17417, + 6061, + 38637, + 6061, + 6061, + 38637, + 6061, + 6061, + 6061, + 41134, + 57865, + 41134, + 59027 + ], + [ + 43700, + 38637, + 6061, + 24403, + 41134, + 41134, + 57865, + 59027, + 59027, + 39000, + 39000, + 59027, + 39000, + 39000, + 17417, + 4446, + 43700, + 4446, + 18453, + 4446, + 17417, + 43700, + 43700, + 4446, + 38637, + 6061, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 60702, + 6061, + 38637, + 6061, + 38637, + 38637, + 7672, + 24403, + 41134, + 7672, + 24403, + 32344, + 7672, + 41134, + 41134, + 24403, + 7672, + 7672, + 41134, + 7672, + 41134, + 24403, + 41134, + 51075, + 59027, + 51075, + 59027, + 59027, + 39000, + 51075, + 51075, + 51075, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 17417, + 4446, + 53551, + 17417, + 17417, + 4446, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 17417, + 38637, + 60702, + 6061, + 38637, + 6061, + 60702, + 38637, + 38637, + 7672, + 24403, + 7672, + 51075 + ], + [ + 17417, + 38637, + 6061, + 7672, + 41134, + 24403, + 41134, + 51075, + 59027, + 59027, + 39000, + 51075, + 59027, + 59027, + 17417, + 43700, + 4446, + 17417, + 4446, + 4446, + 53551, + 17417, + 17417, + 43700, + 38637, + 38637, + 38637, + 60702, + 60702, + 6061, + 6061, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 7672, + 7672, + 7672, + 24403, + 41134, + 7672, + 32344, + 57865, + 41134, + 41134, + 41134, + 7672, + 24403, + 24403, + 41134, + 41134, + 24403, + 51075, + 59027, + 51075, + 51075, + 39000, + 39000, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 43700, + 4446, + 17417, + 17417, + 17417, + 18453, + 43700, + 4446, + 4446, + 43700, + 4446, + 4446, + 43700, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 60702, + 38637, + 7672, + 7672, + 24403, + 59027 + ], + [ + 4446, + 38637, + 60702, + 41134, + 7672, + 24403, + 7672, + 39000, + 59027, + 59027, + 51075, + 39000, + 59027, + 59027, + 4446, + 43700, + 17417, + 4446, + 17417, + 17417, + 18453, + 4446, + 4446, + 43700, + 38637, + 38637, + 38637, + 6061, + 6061, + 60702, + 60702, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 41134, + 41134, + 41134, + 24403, + 7672, + 41134, + 57865, + 32344, + 7672, + 7672, + 7672, + 41134, + 24403, + 24403, + 7672, + 7672, + 24403, + 39000, + 59027, + 39000, + 39000, + 51075, + 51075, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 43700, + 17417, + 4446, + 4446, + 4446, + 53551, + 43700, + 17417, + 17417, + 43700, + 17417, + 17417, + 43700, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 6061, + 38637, + 41134, + 41134, + 24403, + 59027 + ], + [ + 4446, + 38637, + 60702, + 41134, + 24403, + 7672, + 7672, + 39000, + 39000, + 59027, + 59027, + 59027, + 51075, + 59027, + 18453, + 4446, + 4446, + 43700, + 17417, + 43700, + 4446, + 4446, + 17417, + 17417, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 6061, + 6061, + 60702, + 60702, + 38637, + 38637, + 6061, + 24403, + 7672, + 24403, + 41134, + 7672, + 41134, + 41134, + 7672, + 32344, + 41134, + 24403, + 57865, + 7672, + 7672, + 24403, + 7672, + 41134, + 39000, + 59027, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 51075, + 51075, + 59027, + 51075, + 39000, + 51075, + 59027, + 4446, + 43700, + 4446, + 43700, + 43700, + 17417, + 17417, + 43700, + 17417, + 4446, + 53551, + 17417, + 17417, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 6061, + 6061, + 24403, + 41134, + 41134, + 59027 + ], + [ + 43700, + 38637, + 38637, + 24403, + 7672, + 41134, + 24403, + 59027, + 51075, + 59027, + 51075, + 39000, + 39000, + 59027, + 17417, + 17417, + 53551, + 4446, + 43700, + 17417, + 4446, + 43700, + 18453, + 4446, + 6061, + 6061, + 38637, + 6061, + 6061, + 60702, + 38637, + 60702, + 38637, + 38637, + 6061, + 60702, + 60702, + 60702, + 41134, + 57865, + 41134, + 7672, + 24403, + 24403, + 41134, + 7672, + 41134, + 32344, + 7672, + 7672, + 41134, + 41134, + 7672, + 24403, + 7672, + 59027, + 59027, + 39000, + 39000, + 51075, + 59027, + 51075, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 39000, + 59027, + 17417, + 17417, + 43700, + 4446, + 4446, + 17417, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 41134, + 24403, + 7672, + 59027 + ], + [ + 4446, + 38637, + 38637, + 41134, + 24403, + 41134, + 41134, + 39000, + 59027, + 39000, + 59027, + 39000, + 39000, + 39000, + 43700, + 4446, + 17417, + 18453, + 4446, + 43700, + 4446, + 4446, + 4446, + 4446, + 38637, + 6061, + 60702, + 38637, + 6061, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 24403, + 41134, + 57865, + 7672, + 7672, + 7672, + 41134, + 7672, + 24403, + 7672, + 32344, + 24403, + 41134, + 7672, + 24403, + 7672, + 41134, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 17417, + 43700, + 17417, + 43700, + 43700, + 17417, + 4446, + 53551, + 17417, + 17417, + 43700, + 17417, + 17417, + 6061, + 60702, + 6061, + 38637, + 6061, + 38637, + 6061, + 38637, + 24403, + 41134, + 7672, + 51075 + ], + [ + 17417, + 38637, + 6061, + 7672, + 24403, + 41134, + 41134, + 51075, + 51075, + 59027, + 59027, + 59027, + 39000, + 59027, + 53551, + 17417, + 17417, + 43700, + 4446, + 43700, + 17417, + 17417, + 4446, + 4446, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 60702, + 60702, + 6061, + 6061, + 38637, + 38637, + 60702, + 24403, + 41134, + 24403, + 7672, + 41134, + 7672, + 7672, + 41134, + 57865, + 7672, + 24403, + 32344, + 41134, + 41134, + 24403, + 41134, + 7672, + 51075, + 59027, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 39000, + 39000, + 59027, + 39000, + 51075, + 39000, + 59027, + 17417, + 43700, + 17417, + 43700, + 43700, + 4446, + 4446, + 43700, + 4446, + 17417, + 18453, + 4446, + 4446, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 60702, + 60702, + 24403, + 7672, + 7672, + 59027 + ], + [ + 17417, + 6061, + 38637, + 41134, + 41134, + 24403, + 7672, + 59027, + 39000, + 59027, + 59027, + 59027, + 51075, + 51075, + 4446, + 43700, + 4446, + 17417, + 17417, + 17417, + 43700, + 4446, + 17417, + 53551, + 38637, + 60702, + 6061, + 38637, + 38637, + 6061, + 38637, + 6061, + 6061, + 60702, + 60702, + 38637, + 38637, + 6061, + 41134, + 7672, + 7672, + 57865, + 41134, + 41134, + 24403, + 24403, + 7672, + 41134, + 41134, + 41134, + 32344, + 24403, + 7672, + 7672, + 24403, + 39000, + 39000, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 51075, + 18453, + 4446, + 4446, + 4446, + 17417, + 43700, + 43700, + 4446, + 4446, + 43700, + 17417, + 17417, + 43700, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 7672, + 7672, + 24403, + 59027 + ], + [ + 4446, + 38637, + 38637, + 41134, + 41134, + 24403, + 41134, + 39000, + 39000, + 39000, + 39000, + 59027, + 59027, + 39000, + 4446, + 18453, + 4446, + 4446, + 4446, + 4446, + 43700, + 4446, + 17417, + 43700, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 7672, + 7672, + 41134, + 24403, + 7672, + 7672, + 24403, + 24403, + 7672, + 41134, + 7672, + 41134, + 24403, + 32344, + 41134, + 7672, + 57865, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 59027, + 51075, + 59027, + 51075, + 39000, + 51075, + 59027, + 43700, + 4446, + 17417, + 17417, + 17417, + 43700, + 43700, + 17417, + 17417, + 43700, + 17417, + 17417, + 53551, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 6061, + 6061, + 7672, + 41134, + 24403, + 51075 + ], + [ + 17417, + 6061, + 38637, + 41134, + 24403, + 41134, + 7672, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 51075, + 43700, + 17417, + 17417, + 43700, + 17417, + 53551, + 4446, + 4446, + 4446, + 17417, + 6061, + 38637, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 57865, + 41134, + 24403, + 41134, + 41134, + 41134, + 41134, + 7672, + 24403, + 7672, + 24403, + 24403, + 7672, + 41134, + 32344, + 7672, + 7672, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 51075, + 39000, + 51075, + 59027, + 51075, + 59027, + 51075, + 4446, + 43700, + 4446, + 18453, + 43700, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 4446, + 38637, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 24403, + 7672, + 7672, + 59027 + ], + [ + 43700, + 6061, + 38637, + 57865, + 41134, + 41134, + 24403, + 39000, + 39000, + 39000, + 59027, + 39000, + 59027, + 59027, + 4446, + 4446, + 43700, + 4446, + 43700, + 17417, + 4446, + 18453, + 43700, + 17417, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 60702, + 38637, + 6061, + 60702, + 60702, + 38637, + 60702, + 6061, + 41134, + 24403, + 41134, + 41134, + 24403, + 24403, + 41134, + 7672, + 7672, + 24403, + 7672, + 41134, + 7672, + 7672, + 7672, + 32344, + 41134, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 51075, + 51075, + 59027, + 51075, + 51075, + 4446, + 4446, + 43700, + 4446, + 17417, + 17417, + 4446, + 17417, + 43700, + 17417, + 17417, + 53551, + 17417, + 38637, + 60702, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 7672, + 24403, + 7672, + 51075 + ], + [ + 17417, + 38637, + 38637, + 7672, + 7672, + 24403, + 7672, + 51075, + 51075, + 51075, + 51075, + 59027, + 59027, + 51075, + 17417, + 53551, + 17417, + 17417, + 17417, + 17417, + 43700, + 17417, + 4446, + 43700, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 41134, + 41134, + 7672, + 24403, + 41134, + 41134, + 24403, + 24403, + 41134, + 7672, + 41134, + 7672, + 24403, + 57865, + 7672, + 41134, + 32344, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 59027, + 39000, + 59027, + 39000, + 51075, + 39000, + 59027, + 43700, + 17417, + 4446, + 4446, + 4446, + 43700, + 43700, + 4446, + 4446, + 43700, + 4446, + 4446, + 18453, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 60702, + 60702, + 41134, + 7672, + 24403, + 39000 + ], + [ + 59027, + 4446, + 17417, + 60702, + 38637, + 38637, + 6061, + 7672, + 7672, + 24403, + 41134, + 7672, + 41134, + 41134, + 51075, + 59027, + 59027, + 59027, + 39000, + 39000, + 51075, + 51075, + 59027, + 39000, + 43700, + 17417, + 4446, + 4446, + 4446, + 43700, + 17417, + 4446, + 18453, + 53551, + 17417, + 17417, + 17417, + 4446, + 60702, + 38637, + 38637, + 60702, + 38637, + 60702, + 60702, + 6061, + 6061, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 32344, + 7672, + 7672, + 24403, + 24403, + 41134, + 7672, + 7672, + 7672, + 57865, + 24403, + 41134, + 41134, + 24403, + 41134, + 41134, + 51075, + 59027, + 51075, + 51075, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 39000, + 59027, + 43700, + 43700, + 17417, + 17417, + 43700, + 4446, + 4446, + 43700, + 38637, + 38637, + 38637, + 24403 + ], + [ + 39000, + 18453, + 4446, + 60702, + 60702, + 60702, + 38637, + 24403, + 7672, + 7672, + 24403, + 7672, + 24403, + 41134, + 59027, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 51075, + 59027, + 39000, + 4446, + 43700, + 4446, + 43700, + 4446, + 4446, + 43700, + 43700, + 4446, + 17417, + 17417, + 43700, + 17417, + 4446, + 60702, + 38637, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 6061, + 6061, + 38637, + 7672, + 32344, + 24403, + 41134, + 7672, + 7672, + 24403, + 7672, + 41134, + 41134, + 7672, + 41134, + 24403, + 41134, + 41134, + 57865, + 51075, + 51075, + 59027, + 51075, + 39000, + 59027, + 51075, + 59027, + 51075, + 39000, + 59027, + 39000, + 59027, + 17417, + 17417, + 17417, + 53551, + 4446, + 17417, + 43700, + 17417, + 6061, + 6061, + 6061, + 41134 + ], + [ + 59027, + 43700, + 17417, + 38637, + 6061, + 38637, + 6061, + 24403, + 41134, + 41134, + 57865, + 7672, + 24403, + 41134, + 59027, + 39000, + 39000, + 59027, + 39000, + 39000, + 51075, + 59027, + 51075, + 59027, + 4446, + 43700, + 4446, + 18453, + 4446, + 17417, + 43700, + 43700, + 4446, + 17417, + 4446, + 53551, + 17417, + 17417, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 60702, + 6061, + 38637, + 6061, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 7672, + 24403, + 32344, + 7672, + 41134, + 41134, + 24403, + 7672, + 7672, + 41134, + 7672, + 41134, + 24403, + 41134, + 7672, + 24403, + 59027, + 39000, + 51075, + 51075, + 51075, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 4446, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 17417, + 60702, + 38637, + 38637, + 7672 + ], + [ + 51075, + 17417, + 17417, + 38637, + 6061, + 38637, + 38637, + 7672, + 41134, + 24403, + 41134, + 7672, + 7672, + 7672, + 59027, + 59027, + 39000, + 51075, + 59027, + 59027, + 51075, + 59027, + 51075, + 51075, + 43700, + 4446, + 17417, + 4446, + 4446, + 53551, + 17417, + 17417, + 43700, + 43700, + 4446, + 17417, + 17417, + 17417, + 38637, + 60702, + 60702, + 6061, + 6061, + 38637, + 60702, + 6061, + 38637, + 6061, + 6061, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 24403, + 41134, + 7672, + 32344, + 57865, + 41134, + 41134, + 41134, + 7672, + 24403, + 24403, + 41134, + 41134, + 24403, + 7672, + 7672, + 39000, + 39000, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 18453, + 43700, + 4446, + 4446, + 43700, + 4446, + 4446, + 43700, + 60702, + 60702, + 38637, + 24403 + ], + [ + 39000, + 4446, + 4446, + 38637, + 60702, + 38637, + 38637, + 41134, + 7672, + 24403, + 7672, + 41134, + 41134, + 41134, + 59027, + 59027, + 51075, + 39000, + 59027, + 59027, + 39000, + 59027, + 39000, + 39000, + 43700, + 17417, + 4446, + 17417, + 17417, + 18453, + 4446, + 4446, + 43700, + 43700, + 17417, + 4446, + 4446, + 4446, + 38637, + 6061, + 6061, + 60702, + 60702, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 24403, + 7672, + 41134, + 57865, + 32344, + 7672, + 7672, + 7672, + 41134, + 24403, + 24403, + 7672, + 7672, + 24403, + 41134, + 41134, + 51075, + 51075, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 53551, + 43700, + 17417, + 17417, + 43700, + 17417, + 17417, + 43700, + 6061, + 6061, + 38637, + 24403 + ], + [ + 39000, + 4446, + 18453, + 38637, + 60702, + 60702, + 60702, + 41134, + 24403, + 7672, + 7672, + 24403, + 7672, + 24403, + 39000, + 59027, + 59027, + 59027, + 51075, + 59027, + 39000, + 59027, + 59027, + 59027, + 4446, + 4446, + 43700, + 17417, + 43700, + 4446, + 4446, + 17417, + 17417, + 4446, + 43700, + 4446, + 43700, + 43700, + 38637, + 38637, + 38637, + 38637, + 60702, + 6061, + 6061, + 60702, + 60702, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 41134, + 7672, + 41134, + 41134, + 7672, + 32344, + 41134, + 24403, + 57865, + 7672, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 59027, + 51075, + 39000, + 59027, + 39000, + 51075, + 51075, + 59027, + 51075, + 39000, + 51075, + 59027, + 59027, + 17417, + 17417, + 43700, + 17417, + 4446, + 53551, + 17417, + 17417, + 6061, + 6061, + 6061, + 41134 + ], + [ + 59027, + 43700, + 17417, + 38637, + 38637, + 6061, + 6061, + 24403, + 7672, + 41134, + 24403, + 41134, + 57865, + 41134, + 51075, + 59027, + 51075, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 39000, + 17417, + 53551, + 4446, + 43700, + 17417, + 4446, + 43700, + 18453, + 4446, + 17417, + 17417, + 43700, + 4446, + 4446, + 38637, + 6061, + 6061, + 60702, + 38637, + 60702, + 38637, + 38637, + 6061, + 60702, + 60702, + 60702, + 6061, + 38637, + 38637, + 38637, + 38637, + 7672, + 24403, + 24403, + 41134, + 7672, + 41134, + 32344, + 7672, + 7672, + 41134, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 51075, + 59027, + 51075, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 39000, + 59027, + 59027, + 17417, + 4446, + 17417, + 43700, + 17417, + 4446, + 43700, + 4446, + 38637, + 38637, + 60702, + 7672 + ], + [ + 39000, + 4446, + 43700, + 38637, + 38637, + 38637, + 6061, + 41134, + 24403, + 41134, + 41134, + 24403, + 41134, + 57865, + 59027, + 39000, + 59027, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 4446, + 17417, + 18453, + 4446, + 43700, + 4446, + 4446, + 4446, + 4446, + 17417, + 43700, + 17417, + 43700, + 43700, + 60702, + 38637, + 6061, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 6061, + 60702, + 6061, + 38637, + 6061, + 7672, + 7672, + 7672, + 41134, + 7672, + 24403, + 7672, + 32344, + 24403, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 17417, + 4446, + 53551, + 17417, + 17417, + 43700, + 17417, + 17417, + 38637, + 6061, + 38637, + 7672 + ], + [ + 51075, + 17417, + 53551, + 38637, + 6061, + 6061, + 6061, + 7672, + 24403, + 41134, + 41134, + 24403, + 41134, + 24403, + 51075, + 59027, + 59027, + 59027, + 39000, + 59027, + 51075, + 59027, + 59027, + 59027, + 17417, + 17417, + 43700, + 4446, + 43700, + 17417, + 17417, + 4446, + 4446, + 17417, + 43700, + 17417, + 43700, + 43700, + 38637, + 38637, + 38637, + 38637, + 6061, + 60702, + 60702, + 6061, + 6061, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 7672, + 41134, + 7672, + 7672, + 41134, + 57865, + 7672, + 24403, + 32344, + 41134, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 59027, + 39000, + 51075, + 59027, + 51075, + 39000, + 39000, + 59027, + 39000, + 51075, + 39000, + 59027, + 59027, + 4446, + 4446, + 43700, + 4446, + 17417, + 18453, + 4446, + 4446, + 60702, + 60702, + 60702, + 7672 + ], + [ + 59027, + 17417, + 4446, + 6061, + 38637, + 38637, + 60702, + 41134, + 41134, + 24403, + 7672, + 41134, + 7672, + 7672, + 39000, + 59027, + 59027, + 59027, + 51075, + 51075, + 39000, + 39000, + 59027, + 51075, + 43700, + 4446, + 17417, + 17417, + 17417, + 43700, + 4446, + 17417, + 53551, + 18453, + 4446, + 4446, + 4446, + 17417, + 6061, + 38637, + 38637, + 6061, + 38637, + 6061, + 6061, + 60702, + 60702, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 57865, + 41134, + 41134, + 24403, + 24403, + 7672, + 41134, + 41134, + 41134, + 32344, + 24403, + 7672, + 7672, + 24403, + 7672, + 7672, + 39000, + 59027, + 39000, + 39000, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 51075, + 59027, + 43700, + 43700, + 4446, + 4446, + 43700, + 17417, + 17417, + 43700, + 38637, + 38637, + 38637, + 24403 + ], + [ + 39000, + 4446, + 4446, + 38637, + 38637, + 60702, + 38637, + 41134, + 41134, + 24403, + 41134, + 7672, + 7672, + 41134, + 39000, + 39000, + 39000, + 59027, + 59027, + 39000, + 59027, + 59027, + 51075, + 59027, + 18453, + 4446, + 4446, + 4446, + 4446, + 43700, + 4446, + 17417, + 43700, + 43700, + 4446, + 17417, + 17417, + 17417, + 60702, + 60702, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 60702, + 6061, + 38637, + 6061, + 24403, + 7672, + 7672, + 24403, + 24403, + 7672, + 41134, + 7672, + 41134, + 24403, + 32344, + 41134, + 7672, + 57865, + 7672, + 41134, + 59027, + 59027, + 59027, + 51075, + 59027, + 59027, + 51075, + 59027, + 51075, + 39000, + 51075, + 59027, + 51075, + 43700, + 43700, + 17417, + 17417, + 43700, + 17417, + 17417, + 53551, + 38637, + 6061, + 6061, + 24403 + ], + [ + 59027, + 17417, + 43700, + 6061, + 38637, + 6061, + 38637, + 41134, + 24403, + 41134, + 7672, + 57865, + 41134, + 24403, + 59027, + 59027, + 51075, + 39000, + 59027, + 51075, + 39000, + 39000, + 39000, + 59027, + 17417, + 17417, + 43700, + 17417, + 53551, + 4446, + 4446, + 4446, + 17417, + 4446, + 43700, + 4446, + 18453, + 43700, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 60702, + 38637, + 41134, + 41134, + 41134, + 41134, + 7672, + 24403, + 7672, + 24403, + 24403, + 7672, + 41134, + 32344, + 7672, + 7672, + 24403, + 7672, + 59027, + 59027, + 59027, + 39000, + 59027, + 51075, + 39000, + 51075, + 59027, + 51075, + 59027, + 51075, + 59027, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 4446, + 38637, + 38637, + 60702, + 7672 + ], + [ + 39000, + 43700, + 4446, + 6061, + 38637, + 38637, + 38637, + 57865, + 41134, + 41134, + 24403, + 41134, + 24403, + 41134, + 39000, + 39000, + 59027, + 39000, + 59027, + 59027, + 39000, + 39000, + 59027, + 59027, + 4446, + 43700, + 4446, + 43700, + 17417, + 4446, + 18453, + 43700, + 17417, + 4446, + 4446, + 43700, + 4446, + 17417, + 38637, + 38637, + 6061, + 38637, + 60702, + 38637, + 6061, + 60702, + 60702, + 38637, + 60702, + 6061, + 38637, + 60702, + 38637, + 60702, + 6061, + 41134, + 24403, + 24403, + 41134, + 7672, + 7672, + 24403, + 7672, + 41134, + 7672, + 7672, + 7672, + 32344, + 41134, + 7672, + 24403, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 51075, + 51075, + 59027, + 51075, + 51075, + 51075, + 17417, + 4446, + 17417, + 43700, + 17417, + 17417, + 53551, + 17417, + 38637, + 6061, + 38637, + 7672 + ], + [ + 51075, + 17417, + 17417, + 38637, + 38637, + 6061, + 38637, + 7672, + 7672, + 24403, + 7672, + 41134, + 41134, + 7672, + 51075, + 51075, + 51075, + 59027, + 59027, + 51075, + 59027, + 59027, + 39000, + 59027, + 53551, + 17417, + 17417, + 17417, + 17417, + 43700, + 17417, + 4446, + 43700, + 43700, + 17417, + 4446, + 4446, + 4446, + 6061, + 6061, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 6061, + 60702, + 38637, + 60702, + 24403, + 41134, + 41134, + 24403, + 24403, + 41134, + 7672, + 41134, + 7672, + 24403, + 57865, + 7672, + 41134, + 32344, + 41134, + 7672, + 59027, + 59027, + 59027, + 39000, + 59027, + 59027, + 39000, + 59027, + 39000, + 51075, + 39000, + 59027, + 39000, + 43700, + 43700, + 4446, + 4446, + 43700, + 4446, + 4446, + 18453, + 38637, + 60702, + 60702, + 24403 + ], + [ + 59027, + 17417, + 43700, + 6061, + 6061, + 38637, + 38637, + 41134, + 57865, + 41134, + 41134, + 24403, + 7672, + 24403, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 51075, + 51075, + 4446, + 4446, + 43700, + 4446, + 43700, + 17417, + 4446, + 17417, + 17417, + 4446, + 18453, + 17417, + 43700, + 53551, + 38637, + 60702, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 60702, + 60702, + 38637, + 60702, + 6061, + 41134, + 41134, + 7672, + 7672, + 41134, + 24403, + 41134, + 24403, + 24403, + 7672, + 7672, + 24403, + 7672, + 41134, + 32344, + 7672, + 39000, + 39000, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 51075, + 51075, + 4446, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 17417, + 60702, + 38637, + 38637, + 7672 + ], + [ + 51075, + 53551, + 17417, + 6061, + 6061, + 6061, + 38637, + 24403, + 41134, + 41134, + 24403, + 41134, + 24403, + 7672, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 39000, + 59027, + 51075, + 17417, + 43700, + 17417, + 43700, + 17417, + 17417, + 43700, + 43700, + 17417, + 4446, + 4446, + 43700, + 4446, + 17417, + 6061, + 38637, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 60702, + 60702, + 38637, + 41134, + 57865, + 24403, + 7672, + 41134, + 41134, + 24403, + 41134, + 7672, + 7672, + 41134, + 7672, + 24403, + 7672, + 7672, + 32344, + 39000, + 39000, + 59027, + 39000, + 51075, + 59027, + 39000, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 4446, + 4446, + 4446, + 18453, + 17417, + 4446, + 43700, + 4446, + 60702, + 60702, + 60702, + 7672 + ], + [ + 41134, + 39000, + 59027, + 4446, + 4446, + 43700, + 17417, + 38637, + 60702, + 38637, + 38637, + 38637, + 6061, + 6061, + 7672, + 24403, + 7672, + 41134, + 41134, + 41134, + 24403, + 7672, + 41134, + 57865, + 59027, + 51075, + 39000, + 59027, + 59027, + 39000, + 59027, + 39000, + 39000, + 51075, + 51075, + 59027, + 59027, + 39000, + 4446, + 17417, + 17417, + 18453, + 4446, + 4446, + 43700, + 43700, + 17417, + 4446, + 4446, + 4446, + 53551, + 43700, + 17417, + 17417, + 43700, + 60702, + 60702, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 6061, + 6061, + 32344, + 7672, + 7672, + 7672, + 41134, + 24403, + 24403, + 7672, + 7672, + 24403, + 41134, + 41134, + 24403, + 51075, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 59027, + 17417, + 17417, + 43700, + 38637 + ], + [ + 41134, + 39000, + 39000, + 4446, + 18453, + 4446, + 4446, + 38637, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 24403, + 7672, + 7672, + 24403, + 7672, + 24403, + 41134, + 7672, + 41134, + 41134, + 59027, + 59027, + 59027, + 51075, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 51075, + 39000, + 59027, + 39000, + 43700, + 17417, + 43700, + 4446, + 4446, + 17417, + 17417, + 4446, + 43700, + 4446, + 43700, + 43700, + 17417, + 17417, + 43700, + 17417, + 4446, + 38637, + 60702, + 6061, + 6061, + 60702, + 60702, + 38637, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 6061, + 7672, + 32344, + 41134, + 24403, + 57865, + 7672, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 41134, + 51075, + 51075, + 59027, + 51075, + 39000, + 51075, + 59027, + 59027, + 53551, + 17417, + 17417, + 6061 + ], + [ + 24403, + 59027, + 51075, + 43700, + 17417, + 17417, + 53551, + 38637, + 38637, + 6061, + 6061, + 38637, + 6061, + 6061, + 7672, + 41134, + 24403, + 41134, + 57865, + 41134, + 7672, + 24403, + 24403, + 41134, + 59027, + 51075, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 39000, + 51075, + 59027, + 51075, + 59027, + 59027, + 4446, + 43700, + 17417, + 4446, + 43700, + 18453, + 4446, + 17417, + 17417, + 43700, + 4446, + 4446, + 17417, + 4446, + 17417, + 43700, + 17417, + 60702, + 38637, + 60702, + 38637, + 38637, + 6061, + 60702, + 60702, + 60702, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 7672, + 41134, + 32344, + 7672, + 7672, + 41134, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 7672, + 59027, + 39000, + 51075, + 59027, + 51075, + 39000, + 59027, + 59027, + 4446, + 43700, + 4446, + 60702 + ], + [ + 41134, + 39000, + 59027, + 4446, + 43700, + 4446, + 17417, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 6061, + 24403, + 41134, + 41134, + 24403, + 41134, + 57865, + 7672, + 7672, + 7672, + 41134, + 39000, + 59027, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 51075, + 59027, + 18453, + 4446, + 43700, + 4446, + 4446, + 4446, + 4446, + 17417, + 43700, + 17417, + 43700, + 43700, + 17417, + 4446, + 53551, + 17417, + 17417, + 60702, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 6061, + 60702, + 6061, + 38637, + 6061, + 38637, + 6061, + 7672, + 24403, + 7672, + 32344, + 24403, + 41134, + 7672, + 24403, + 7672, + 41134, + 24403, + 41134, + 7672, + 59027, + 59027, + 51075, + 51075, + 59027, + 59027, + 59027, + 51075, + 43700, + 17417, + 17417, + 38637 + ], + [ + 7672, + 51075, + 51075, + 17417, + 53551, + 17417, + 17417, + 38637, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 24403, + 41134, + 41134, + 24403, + 41134, + 24403, + 7672, + 41134, + 7672, + 7672, + 59027, + 59027, + 59027, + 39000, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 43700, + 4446, + 43700, + 17417, + 17417, + 4446, + 4446, + 17417, + 43700, + 17417, + 43700, + 43700, + 4446, + 4446, + 43700, + 4446, + 17417, + 38637, + 6061, + 60702, + 60702, + 6061, + 6061, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 60702, + 41134, + 57865, + 7672, + 24403, + 32344, + 41134, + 41134, + 24403, + 41134, + 7672, + 24403, + 7672, + 7672, + 39000, + 39000, + 59027, + 39000, + 51075, + 39000, + 59027, + 59027, + 18453, + 4446, + 4446, + 60702 + ], + [ + 41134, + 59027, + 39000, + 17417, + 4446, + 43700, + 4446, + 6061, + 38637, + 38637, + 60702, + 6061, + 38637, + 38637, + 41134, + 24403, + 7672, + 41134, + 7672, + 7672, + 57865, + 41134, + 41134, + 24403, + 59027, + 59027, + 59027, + 51075, + 51075, + 39000, + 39000, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 17417, + 17417, + 17417, + 43700, + 4446, + 17417, + 53551, + 18453, + 4446, + 4446, + 4446, + 17417, + 43700, + 43700, + 4446, + 4446, + 43700, + 6061, + 38637, + 6061, + 6061, + 60702, + 60702, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 24403, + 7672, + 41134, + 41134, + 41134, + 32344, + 24403, + 7672, + 7672, + 24403, + 7672, + 7672, + 24403, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 51075, + 59027, + 17417, + 17417, + 43700, + 38637 + ], + [ + 41134, + 39000, + 39000, + 4446, + 4446, + 18453, + 4446, + 38637, + 38637, + 60702, + 38637, + 60702, + 60702, + 38637, + 41134, + 24403, + 41134, + 7672, + 7672, + 41134, + 24403, + 7672, + 7672, + 24403, + 39000, + 39000, + 59027, + 59027, + 39000, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 4446, + 4446, + 4446, + 43700, + 4446, + 17417, + 43700, + 43700, + 4446, + 17417, + 17417, + 17417, + 43700, + 43700, + 17417, + 17417, + 43700, + 38637, + 60702, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 6061, + 24403, + 7672, + 41134, + 7672, + 41134, + 24403, + 32344, + 41134, + 7672, + 57865, + 7672, + 41134, + 24403, + 59027, + 51075, + 59027, + 51075, + 39000, + 51075, + 59027, + 51075, + 17417, + 17417, + 53551, + 6061 + ], + [ + 41134, + 59027, + 59027, + 17417, + 43700, + 17417, + 17417, + 6061, + 38637, + 6061, + 38637, + 6061, + 6061, + 6061, + 24403, + 41134, + 7672, + 57865, + 41134, + 24403, + 41134, + 41134, + 41134, + 41134, + 59027, + 51075, + 39000, + 59027, + 51075, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 43700, + 17417, + 53551, + 4446, + 4446, + 4446, + 17417, + 4446, + 43700, + 4446, + 18453, + 43700, + 17417, + 4446, + 43700, + 4446, + 17417, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 7672, + 24403, + 7672, + 24403, + 24403, + 7672, + 41134, + 32344, + 7672, + 7672, + 24403, + 7672, + 7672, + 51075, + 39000, + 51075, + 59027, + 51075, + 59027, + 51075, + 59027, + 43700, + 17417, + 4446, + 60702 + ], + [ + 57865, + 39000, + 39000, + 43700, + 4446, + 4446, + 43700, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 41134, + 41134, + 24403, + 41134, + 24403, + 41134, + 41134, + 24403, + 24403, + 41134, + 39000, + 59027, + 39000, + 59027, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 4446, + 43700, + 17417, + 4446, + 18453, + 43700, + 17417, + 4446, + 4446, + 43700, + 4446, + 17417, + 17417, + 4446, + 17417, + 43700, + 17417, + 38637, + 60702, + 38637, + 6061, + 60702, + 60702, + 38637, + 60702, + 6061, + 38637, + 60702, + 38637, + 60702, + 6061, + 38637, + 6061, + 7672, + 7672, + 24403, + 7672, + 41134, + 7672, + 7672, + 7672, + 32344, + 41134, + 7672, + 24403, + 7672, + 51075, + 59027, + 51075, + 51075, + 59027, + 51075, + 51075, + 51075, + 17417, + 53551, + 17417, + 38637 + ], + [ + 7672, + 51075, + 51075, + 17417, + 17417, + 53551, + 17417, + 38637, + 38637, + 6061, + 38637, + 6061, + 6061, + 38637, + 7672, + 24403, + 7672, + 41134, + 41134, + 7672, + 24403, + 41134, + 41134, + 24403, + 51075, + 51075, + 59027, + 59027, + 51075, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 17417, + 17417, + 17417, + 43700, + 17417, + 4446, + 43700, + 43700, + 17417, + 4446, + 4446, + 4446, + 43700, + 43700, + 4446, + 4446, + 43700, + 38637, + 6061, + 38637, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 60702, + 24403, + 41134, + 7672, + 41134, + 7672, + 24403, + 57865, + 7672, + 41134, + 32344, + 41134, + 7672, + 24403, + 59027, + 39000, + 59027, + 39000, + 51075, + 39000, + 59027, + 39000, + 4446, + 4446, + 18453, + 60702 + ], + [ + 41134, + 59027, + 39000, + 17417, + 43700, + 4446, + 4446, + 6061, + 6061, + 38637, + 38637, + 38637, + 60702, + 38637, + 57865, + 41134, + 41134, + 24403, + 7672, + 24403, + 41134, + 41134, + 7672, + 7672, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 51075, + 51075, + 39000, + 39000, + 59027, + 59027, + 51075, + 43700, + 4446, + 43700, + 17417, + 4446, + 17417, + 17417, + 4446, + 18453, + 17417, + 43700, + 53551, + 4446, + 4446, + 43700, + 4446, + 17417, + 6061, + 38637, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 60702, + 60702, + 38637, + 60702, + 6061, + 60702, + 38637, + 41134, + 24403, + 41134, + 24403, + 24403, + 7672, + 7672, + 24403, + 7672, + 41134, + 32344, + 7672, + 7672, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 51075, + 51075, + 43700, + 17417, + 17417, + 38637 + ], + [ + 24403, + 51075, + 59027, + 53551, + 17417, + 17417, + 43700, + 6061, + 6061, + 6061, + 38637, + 6061, + 38637, + 38637, + 41134, + 41134, + 24403, + 41134, + 24403, + 7672, + 41134, + 57865, + 24403, + 7672, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 39000, + 59027, + 51075, + 39000, + 39000, + 59027, + 39000, + 51075, + 17417, + 43700, + 17417, + 17417, + 43700, + 43700, + 17417, + 4446, + 4446, + 43700, + 4446, + 17417, + 4446, + 4446, + 4446, + 18453, + 17417, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 60702, + 60702, + 38637, + 60702, + 60702, + 41134, + 41134, + 24403, + 41134, + 7672, + 7672, + 41134, + 7672, + 24403, + 7672, + 7672, + 32344, + 7672, + 59027, + 39000, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 4446, + 43700, + 4446, + 60702 + ], + [ + 41134, + 59027, + 59027, + 17417, + 17417, + 43700, + 17417, + 6061, + 6061, + 6061, + 6061, + 38637, + 38637, + 6061, + 41134, + 57865, + 41134, + 41134, + 41134, + 41134, + 24403, + 41134, + 7672, + 24403, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 4446, + 4446, + 17417, + 43700, + 4446, + 4446, + 43700, + 43700, + 4446, + 17417, + 4446, + 17417, + 43700, + 18453, + 17417, + 4446, + 53551, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 38637, + 60702, + 38637, + 60702, + 6061, + 60702, + 38637, + 24403, + 41134, + 7672, + 7672, + 7672, + 24403, + 24403, + 7672, + 7672, + 24403, + 7672, + 7672, + 32344, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 51075, + 51075, + 4446, + 17417, + 43700, + 60702 + ], + [ + 6061, + 41134, + 41134, + 59027, + 39000, + 59027, + 59027, + 17417, + 4446, + 43700, + 4446, + 17417, + 17417, + 17417, + 38637, + 38637, + 60702, + 6061, + 38637, + 38637, + 6061, + 38637, + 6061, + 6061, + 24403, + 7672, + 41134, + 7672, + 7672, + 57865, + 41134, + 41134, + 24403, + 24403, + 7672, + 41134, + 41134, + 41134, + 59027, + 51075, + 51075, + 39000, + 39000, + 59027, + 51075, + 39000, + 59027, + 39000, + 39000, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 43700, + 4446, + 17417, + 53551, + 18453, + 4446, + 4446, + 4446, + 17417, + 43700, + 43700, + 4446, + 4446, + 43700, + 17417, + 17417, + 60702, + 60702, + 38637, + 38637, + 6061, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 38637, + 32344, + 24403, + 7672, + 7672, + 24403, + 7672, + 7672, + 24403, + 51075, + 51075, + 59027, + 43700 + ], + [ + 38637, + 41134, + 41134, + 39000, + 39000, + 39000, + 39000, + 4446, + 4446, + 18453, + 4446, + 4446, + 4446, + 4446, + 38637, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 60702, + 38637, + 38637, + 24403, + 41134, + 7672, + 7672, + 41134, + 24403, + 7672, + 7672, + 24403, + 24403, + 7672, + 41134, + 7672, + 41134, + 59027, + 59027, + 39000, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 59027, + 51075, + 59027, + 51075, + 39000, + 43700, + 4446, + 17417, + 43700, + 43700, + 4446, + 17417, + 17417, + 17417, + 43700, + 43700, + 17417, + 17417, + 43700, + 17417, + 17417, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 6061, + 6061, + 24403, + 32344, + 41134, + 7672, + 57865, + 7672, + 41134, + 24403, + 51075, + 59027, + 51075, + 53551 + ], + [ + 6061, + 41134, + 24403, + 59027, + 59027, + 59027, + 51075, + 17417, + 43700, + 17417, + 17417, + 43700, + 17417, + 53551, + 38637, + 6061, + 38637, + 6061, + 6061, + 6061, + 38637, + 38637, + 38637, + 6061, + 41134, + 7672, + 57865, + 41134, + 24403, + 41134, + 41134, + 41134, + 41134, + 7672, + 24403, + 7672, + 24403, + 24403, + 39000, + 59027, + 51075, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 51075, + 39000, + 51075, + 59027, + 51075, + 4446, + 4446, + 4446, + 17417, + 4446, + 43700, + 4446, + 18453, + 43700, + 17417, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 60702, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 60702, + 38637, + 38637, + 38637, + 60702, + 7672, + 41134, + 32344, + 7672, + 7672, + 24403, + 7672, + 7672, + 59027, + 51075, + 59027, + 4446 + ], + [ + 6061, + 57865, + 41134, + 39000, + 39000, + 39000, + 59027, + 43700, + 4446, + 4446, + 43700, + 4446, + 43700, + 17417, + 38637, + 38637, + 38637, + 38637, + 38637, + 6061, + 38637, + 60702, + 38637, + 6061, + 41134, + 24403, + 41134, + 24403, + 41134, + 41134, + 24403, + 24403, + 41134, + 7672, + 7672, + 24403, + 7672, + 41134, + 39000, + 59027, + 59027, + 39000, + 39000, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 59027, + 51075, + 51075, + 59027, + 4446, + 18453, + 43700, + 17417, + 4446, + 4446, + 43700, + 4446, + 17417, + 17417, + 4446, + 17417, + 43700, + 17417, + 17417, + 53551, + 60702, + 60702, + 38637, + 60702, + 6061, + 38637, + 60702, + 38637, + 60702, + 6061, + 38637, + 6061, + 38637, + 7672, + 7672, + 7672, + 32344, + 41134, + 7672, + 24403, + 7672, + 51075, + 51075, + 51075, + 17417 + ], + [ + 38637, + 7672, + 7672, + 51075, + 51075, + 51075, + 51075, + 17417, + 17417, + 53551, + 17417, + 17417, + 17417, + 17417, + 38637, + 6061, + 38637, + 6061, + 6061, + 38637, + 38637, + 6061, + 38637, + 38637, + 24403, + 7672, + 41134, + 41134, + 7672, + 24403, + 41134, + 41134, + 24403, + 24403, + 41134, + 7672, + 41134, + 7672, + 59027, + 59027, + 51075, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 59027, + 39000, + 59027, + 59027, + 39000, + 59027, + 39000, + 51075, + 43700, + 17417, + 4446, + 43700, + 43700, + 17417, + 4446, + 4446, + 4446, + 43700, + 43700, + 4446, + 4446, + 43700, + 4446, + 4446, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 6061, + 60702, + 38637, + 60702, + 38637, + 60702, + 60702, + 24403, + 57865, + 7672, + 41134, + 32344, + 41134, + 7672, + 24403, + 39000, + 59027, + 39000, + 18453 + ], + [ + 6061, + 41134, + 57865, + 59027, + 39000, + 39000, + 39000, + 17417, + 43700, + 4446, + 4446, + 43700, + 4446, + 43700, + 6061, + 38637, + 38637, + 38637, + 60702, + 38637, + 6061, + 38637, + 38637, + 38637, + 41134, + 41134, + 24403, + 7672, + 24403, + 41134, + 41134, + 7672, + 7672, + 41134, + 24403, + 41134, + 24403, + 24403, + 59027, + 59027, + 59027, + 59027, + 39000, + 51075, + 51075, + 39000, + 39000, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 17417, + 4446, + 17417, + 17417, + 4446, + 18453, + 17417, + 43700, + 53551, + 4446, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 38637, + 60702, + 6061, + 38637, + 6061, + 60702, + 60702, + 38637, + 60702, + 6061, + 60702, + 38637, + 38637, + 7672, + 7672, + 24403, + 7672, + 41134, + 32344, + 7672, + 7672, + 51075, + 51075, + 51075, + 17417 + ], + [ + 6061, + 24403, + 41134, + 51075, + 59027, + 59027, + 59027, + 53551, + 17417, + 17417, + 43700, + 17417, + 43700, + 17417, + 6061, + 6061, + 38637, + 6061, + 38637, + 38637, + 6061, + 6061, + 38637, + 38637, + 41134, + 24403, + 41134, + 24403, + 7672, + 41134, + 57865, + 24403, + 7672, + 41134, + 41134, + 24403, + 41134, + 7672, + 59027, + 59027, + 51075, + 59027, + 39000, + 59027, + 51075, + 39000, + 39000, + 59027, + 39000, + 51075, + 59027, + 39000, + 59027, + 39000, + 51075, + 17417, + 43700, + 43700, + 17417, + 4446, + 4446, + 43700, + 4446, + 17417, + 4446, + 4446, + 4446, + 18453, + 17417, + 4446, + 43700, + 38637, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 60702, + 60702, + 38637, + 60702, + 60702, + 60702, + 7672, + 41134, + 7672, + 24403, + 7672, + 7672, + 32344, + 7672, + 59027, + 51075, + 59027, + 4446 + ], + [ + 6061, + 41134, + 41134, + 59027, + 59027, + 39000, + 59027, + 17417, + 17417, + 43700, + 17417, + 4446, + 4446, + 17417, + 6061, + 6061, + 6061, + 38637, + 38637, + 6061, + 38637, + 38637, + 60702, + 38637, + 57865, + 41134, + 41134, + 41134, + 41134, + 24403, + 41134, + 7672, + 24403, + 24403, + 41134, + 7672, + 7672, + 7672, + 39000, + 39000, + 59027, + 59027, + 39000, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 39000, + 51075, + 59027, + 51075, + 43700, + 4446, + 4446, + 43700, + 43700, + 4446, + 17417, + 4446, + 17417, + 43700, + 18453, + 17417, + 4446, + 53551, + 4446, + 17417, + 38637, + 38637, + 38637, + 60702, + 38637, + 38637, + 60702, + 38637, + 60702, + 6061, + 60702, + 38637, + 60702, + 24403, + 24403, + 7672, + 7672, + 24403, + 7672, + 7672, + 32344, + 59027, + 51075, + 51075, + 43700 + ], + [ + 17417, + 6061, + 6061, + 41134, + 57865, + 41134, + 41134, + 59027, + 39000, + 39000, + 39000, + 59027, + 59027, + 59027, + 43700, + 4446, + 4446, + 43700, + 4446, + 43700, + 17417, + 4446, + 17417, + 17417, + 38637, + 38637, + 38637, + 60702, + 38637, + 6061, + 38637, + 38637, + 38637, + 38637, + 60702, + 6061, + 38637, + 6061, + 24403, + 7672, + 24403, + 41134, + 41134, + 7672, + 7672, + 41134, + 24403, + 41134, + 24403, + 24403, + 7672, + 7672, + 24403, + 7672, + 41134, + 59027, + 39000, + 51075, + 51075, + 39000, + 39000, + 59027, + 59027, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 51075, + 4446, + 18453, + 17417, + 43700, + 53551, + 4446, + 4446, + 43700, + 4446, + 17417, + 43700, + 17417, + 17417, + 60702, + 60702, + 38637, + 60702, + 6061, + 60702, + 38637, + 38637, + 32344, + 7672, + 7672, + 51075 + ], + [ + 53551, + 6061, + 6061, + 24403, + 41134, + 41134, + 24403, + 51075, + 59027, + 59027, + 59027, + 59027, + 59027, + 51075, + 17417, + 17417, + 43700, + 17417, + 43700, + 17417, + 17417, + 43700, + 43700, + 17417, + 6061, + 38637, + 6061, + 38637, + 38637, + 6061, + 6061, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 38637, + 41134, + 24403, + 7672, + 41134, + 57865, + 24403, + 7672, + 41134, + 41134, + 24403, + 41134, + 7672, + 7672, + 41134, + 7672, + 24403, + 7672, + 59027, + 39000, + 59027, + 51075, + 39000, + 39000, + 59027, + 39000, + 51075, + 59027, + 39000, + 59027, + 39000, + 51075, + 59027, + 51075, + 4446, + 4446, + 43700, + 4446, + 17417, + 4446, + 4446, + 4446, + 18453, + 17417, + 4446, + 43700, + 4446, + 60702, + 38637, + 60702, + 60702, + 38637, + 60702, + 60702, + 60702, + 7672, + 32344, + 7672, + 59027 + ], + [ + 17417, + 6061, + 6061, + 41134, + 41134, + 57865, + 41134, + 59027, + 59027, + 39000, + 59027, + 39000, + 39000, + 59027, + 17417, + 43700, + 17417, + 4446, + 4446, + 17417, + 43700, + 4446, + 4446, + 43700, + 6061, + 6061, + 38637, + 38637, + 6061, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 41134, + 41134, + 41134, + 24403, + 41134, + 7672, + 24403, + 24403, + 41134, + 7672, + 7672, + 7672, + 24403, + 24403, + 7672, + 7672, + 24403, + 59027, + 39000, + 59027, + 59027, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 51075, + 43700, + 4446, + 17417, + 4446, + 17417, + 43700, + 18453, + 17417, + 4446, + 53551, + 4446, + 17417, + 43700, + 38637, + 60702, + 38637, + 60702, + 6061, + 60702, + 38637, + 60702, + 7672, + 7672, + 32344, + 51075 + ], + [ + 59027, + 17417, + 17417, + 6061, + 6061, + 6061, + 6061, + 41134, + 41134, + 57865, + 41134, + 41134, + 41134, + 41134, + 59027, + 39000, + 59027, + 39000, + 39000, + 59027, + 59027, + 39000, + 59027, + 59027, + 43700, + 17417, + 4446, + 4446, + 17417, + 43700, + 4446, + 4446, + 43700, + 43700, + 4446, + 17417, + 4446, + 17417, + 38637, + 38637, + 6061, + 38637, + 38637, + 60702, + 38637, + 38637, + 38637, + 38637, + 60702, + 38637, + 38637, + 60702, + 38637, + 60702, + 6061, + 24403, + 41134, + 7672, + 24403, + 24403, + 41134, + 7672, + 7672, + 7672, + 24403, + 24403, + 7672, + 7672, + 24403, + 7672, + 7672, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 39000, + 51075, + 59027, + 51075, + 59027, + 51075, + 51075, + 43700, + 18453, + 17417, + 4446, + 53551, + 4446, + 17417, + 43700, + 60702, + 38637, + 60702, + 32344 + ] + ], + "prime": 65537, + "rank": 96, + "widths": [ + 5, + 6, + 7, + 8 + ] +} diff --git a/research/clifford-tensor-gram/PROOF.md b/research/clifford-tensor-gram/PROOF.md new file mode 100644 index 0000000000..cb8b75a33d --- /dev/null +++ b/research/clifford-tensor-gram/PROOF.md @@ -0,0 +1,268 @@ +# A finite and stable tensor test for dyadic Clifford programs + +The [continuation](ADVANCES.md) reduces the number of tested widths, +improves 14/15 to 75/76, proves the sharp one-axis cutoff, and supplies +a compact native implementation. This note retains the original proof. + +## Result + +Let R = Z[i,1/2], let D = 2^n, and let C_n be the unitary matrices in +M_D(R) that normalize the n-axis Pauli group. Keep their exact global phase. +This class includes the source Gaussian gate + + C_v = (1+i)I/2 + (1-i)X_v/2, + +its inverse, quadratic phase gates, affine binary permutations and the +source Hadamard gate. It is larger than the monomial subgroup. + +Consider two finite scalar register programs. Each role has an independent +arbitrary input in (C^D)^(tensor f). Instructions can add a scalar multiple +of one role to another, scale a role, exchange roles, or apply U^(tensor f) +for U in C_n. Queries can add c U^(tensor f) v_s to v_d. Self queries are +permitted. Both programs and their scalar coefficients are fixed as f varies. +Every input and return role is part of the contract. + +**Theorem.** The complete endpoints agree for every positive integer f if +and only if they agree for f = 1,...,8n+4. There is no program-length or +support-size term in this cutoff. This is not a claim that these widths are +minimal, or that dense tensor matrices can be tested at low cost. + +There is a stronger quantitative statement. In one endpoint entry, combine +equal exact native matrices and write the residual as + + A_f = sum_(g in S) c_g g^(tensor f), + +where the matrices in S are distinct. Set + + M = sum_g |c_g|^2, + E_f = D^(-f) ||A_f||_HS^2. + +Then + + max_(1 <= f <= 8n+4) E_f >= (14/15) M. (1) + +The proof gives explicit rational weights b_f such that + + sum_(f=1)^(8n+4) b_f E_f = M. (2) + +Each E_f can be computed from base-dimension pair traces. It does not require +a tensor matrix. A nonzero E_f gives an exact nonzero tensor entry by a finite +sequence of conditional norm tests. The executable uses Q(i); the theorem +allows arbitrary complex scalar coefficients. + +This result changes an infinite algebraic obligation into a finite test for +this native class. It does not supply a native layout, a physical cost bound, +rounding, stock, a recursive supplier, or a change to the complete kappa. + +## 1. The exact trace alphabet + +Use Hermitian Paulis P_v, labelled by v in F_2^(2n), as an orthogonal basis +of M_D(C). A Clifford U acts by + + U P_v U* = epsilon(v) P_(S v), + +where S is symplectic and each epsilon(v) is 1 or -1. On the fixed space +L = ker(S-I), the signs form an additive character. Indeed, multiplication +P_u P_v = gamma(u,v) P_(u+v), followed by conjugation, cancels the same +nonzero gamma on both sides and gives epsilon(u+v)=epsilon(u)epsilon(v). + +The trace of conjugation on all matrices is |tr U|^2. The Pauli basis gives +the same trace as sum_(v in L) epsilon(v). A nontrivial sign character sums +to zero; the trivial character sums to |L|. Thus + + |tr U|^2 is zero or 2^d, with 0 <= d <= 2n. (3) + +We also need the phase of this trace. C_n is a finite group. Its conjugation +action on the finite Pauli group has finite image. Its kernel consists of +scalar matrices: commuting with all Z generators forces a diagonal matrix, +and commuting with all X generators makes that diagonal constant. A scalar +in R with absolute value one is in {1,i,-1,-i}. To see this, write it as +(a+bi)/2^k. Unique factorization in Z[i], with 2=-i(1+i)^2, shows that a +Gaussian rational with denominator a power of two and norm one is a unit. +The kernel therefore has four elements. + +Every U has finite order. Its eigenvalues are roots of unity, so its trace +is an algebraic integer. The trace is also in Q(i). The ring of integers of +Q(i) is Z[i], so tr U is a Gaussian integer. Factoring its norm in (3) now +shows + + tr U in {0} union {i^k (1+i)^d : 0 <= k < 4, + 0 <= d <= 2n}. (4) + +The same statement holds for U*V. In particular, no arbitrary rational +unit-circle phase may be admitted. For example (3+4i)I/5 is unitary and +normalizes Paulis, but is outside the dyadic hypothesis. + +Finally tr(U*V)=D holds exactly when U=V. All eigenvalues of U*V have absolute +value one. Equality in their sum being the positive real number D forces +every eigenvalue to be one; a unitary matrix with those eigenvalues is I. + +## 2. An explicit polynomial that selects the identity + +Let z = tr U / D. In addition to zero and the four scalar values 1,i,-1,-i, +every possible z satisfies + + z^4 = (-1)^j 4^(-j), for some 1 <= j <= 2n. + +Define the rational polynomial + + q_n(z) = z(1+z+z^2+z^3)/4 + * product_(j=1)^(2n) + (z^4 - (-1)^j 4^(-j))/(1 - (-1)^j 4^(-j)). (5) + +It has zero constant term, degree 8n+4, and q_n(1)=1. It vanishes at every +other value in the trace alphabet. Therefore, for exact matrices U,V in C_n, + + q_n(tr(U*V)/D) = 1 if U=V, and 0 otherwise. (6) + +Write q_n(z)=sum_f b_f z^f. The triangle inequality for polynomial +coefficient norms gives a dimension-independent bound. The first factor +has coefficient norm one. Each odd-j factor has nonnegative coefficients +whose sum is one. The norm of the even factor j=2k is + + (1+16^(-k))/(1-16^(-k)). + +For nonnegative a,b with a+b<1, + + [(1+a)/(1-a)] [(1+b)/(1-b)] + = (1+t)/(1-t), where t=(a+b)/(1+ab) <= a+b. + +Induction and sum_(k>=1) 16^(-k)=1/15 show + + sum_f |b_f| <= product_(k=1)^n (1+16^(-k))/(1-16^(-k)) < 8/7. (7) + +For n=0 the norm is one and the same strict bound holds. Also sum_f b_f=1. +It follows that the sum of the positive coefficients is less than 15/14. + +## 3. The Gram identity and stable separation + +The Hilbert-Schmidt inner product is multiplicative under tensor products. +Thus + + E_f = sum_(g,h in S) conjugate(c_g)c_h (tr(g^* h)/D)^f, (8) + +where g* denotes the adjoint, so the trace argument is g* h. Apply (6) to +(8) and sum against b_f. All terms with g != h vanish and the diagonal +terms give M. This proves (2). + +Each E_f is a nonnegative real number. Terms with b_f<0 can be removed from +the right side of (2) when taking an upper bound. Hence + + M <= (sum_(b_f>0) b_f) max_f E_f < (15/14) max_f E_f + +when M>0. The weaker non-strict form (1) also covers M=0. If the first 8n+4 +residual matrices vanish, (2) forces M=0. Every exact coefficient c_g is then +zero, so A_f vanishes at every positive width. The reverse implication is +immediate. Apply this argument to each input/output entry to obtain the full +dirty-register theorem. + +This proof uses only pair traces and a rational polynomial. It does not need +an irreducible character table or a census of C_n. Burnside-Brauer supplies +a related classical tensor-generation argument; (5)-(8) give the explicit +native cutoff, quantitative bound and computational certificate used here. + +## 4. Extract a tensor entry without a tensor matrix + +Suppose E_f>0. For one output coordinate x and input coordinate y in the +first tensor factor, put c'_g=c_g g[x,y]. The remaining tensor operator is +sum_g c'_g g^(tensor (f-1)). Its normalized squared norm is obtained from +the same pair-trace matrix by (8). The sum of these conditional norms over +the D^2 choices of (x,y) is D E_f. At least one choice is positive, and a +maximizing choice is at least E_f/D. + +Repeat until no tensor factors remain. The final scalar is exactly the +chosen entry of A_f. It is nonzero and its squared absolute value is at +least E_f/D^f. Start at a width attaining the maximum in (1) to obtain + + |entry|^2 >= (14/15) M D^(-f). (9) + +The independent witness checker uses a separate signed-word interpreter, +multiplies the base matrices in their literal order, and computes this one +entry as a product of base entries. It does not use traces, the cutoff, +the interpolation polynomial, or the producer's register compiler. + +## 5. Cost, input validation and trust + +For s distinct residual operators supplied as D-by-D matrices, all pair +traces cost O(s^2 D^2) exact scalar operations. Equal traces can be collected +into at most 8n+5 buckets, including zero. The full norm sequence then costs +O(n^2+s^2) further scalar operations after the pair traces, apart from +coefficient storage. Coefficient bit sizes are not bounded by this count. + +The direct entry extractor uses O(f D^2 s^2 log(f+1)) scalar operations in the +worst case, with base matrices and their Gram matrix in memory. The logarithm +accounts for repeated squaring of pair traces. It never allocates +a D^f-by-D^f matrix. Word support can grow exponentially during compilation; +the program compiler is not asserted to be polynomial in instruction count. +The base dimension D itself is exponential in n. No practical full-supplier +speedup is inferred from these bounds. + +The frontend checks every supplied matrix for dyadic entries, unitarity and +Pauli normalization on all 2n generators. The last check is sufficient: +the generators generate the Pauli group, and invertible conjugation gives +an injective map of that finite group into itself. Products and adjoints +remain in C_n. Exact matrix keys include global phase. Scalar coefficients +remain outside tensor powers. The checker does not move a scalar phase +from an operator into a coefficient. + +The actual source kernel uses precisely the gates in the first section. +Its C formula has eigenvalues 1 and i. Its Hadamard convention is S C S, +so H^2=iI, not I. The retained source bytes and the independent column +formula are checked in verify.py. These checks bind the algebraic grammar; +they do not run a complete native supplier or its physical implementation. + +The proof is written mathematics. Python, the compiler, the frozen Gaussian +arithmetic and the native-source transcription remain trusted. The direct +tensor, signed-word and source-column checks test different implications. +They are not an independent human review or a proof-assistant theorem. + +## 6. A finite test that misses a real failure + +The one-axis source C and S gates generate a group G of 96 exact matrices. +There are at most 24 signed images of an ordered anticommuting Pauli pair, +and at most four scalar lifts of each image. Thus this group is the complete +one-axis dyadic normalizer, not just a proper subgroup used for calibration. +Let one dirty target receive + + y <- y + (1/96) sum_(g in G) g^(tensor f) x. + +The source x is unchanged. The average is an orthogonal projector, so its +trace equals its rank. Complete exact enumeration gives rank zero at widths +1 through 7 and rank 15 at width 8. The all-zero input/output tuple has +entry 5/24 at width 8. Thus seven full small-width checks can all accept +a false all-width identity. The registered example and literal witness +checker reproduce this counterexample without building its tensor matrix. + +## 7. Scope and credit + +The program must have fixed scalar coefficients and a fixed native word as +width changes. This theorem does not cover a different program at each f, +arbitrary continuous phases, nonunitary scaled operators, non-Clifford gates, +positive characteristic, nonlinear leaves or physical aliasing. A caller +with restricted clean inputs needs its own input contract. Rounded equality +is not exact equality. No complete multiplication theorem or kappa changes. + +The finite-group algebra viewpoint is prior work. The repository's +projection-recursion-check already uses positive-width Burnside-Brauer +separation, following Jacob Alan Sussman's engine model. The free-word +tensor audit of Cinna Davis's programs and the certificates by zxv and +Krzysztof Wojt retain their separate contributions. Chris R's retained-helper +and passive-query proofs already use finite Clifford alphabets and tensor +Gram separation. For fixed scalar coefficients, this package supplies the +explicit filter and dimension-independent stability constant above. It does +not replace their statements about width-dependent coefficients. The +concurrent PR #5369 targets the smaller +affine-quadratic monomial class with four selected widths. This package does +not claim its result. README.md links these related sources. + +Classical provenance: Burnside and Brauer's tensor-generation theorem, as +reviewed by Benjamin Steinberg in +[On the Burnside-Brauer-Steinberg theorem](https://arxiv.org/abs/1409.7632), +the Pauli conjugation basis, Gaussian-integer factorization, polynomial +interpolation and Gram identities. No global mathematical priority is +claimed. The new package provides the explicit dyadic-Clifford trace +filter, stable bound, complete program frontend, compressed failure +certificate and source-bound checks. The exact source and credit map is +in README.md and SOURCES.json. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. diff --git a/research/clifford-tensor-gram/PROVIDER.md b/research/clifford-tensor-gram/PROVIDER.md new file mode 100644 index 0000000000..7b7dfa9e48 --- /dev/null +++ b/research/clifford-tensor-gram/PROVIDER.md @@ -0,0 +1,281 @@ +# Complete selected-provider check and a pair-fusion obstruction + +The new verifier passes the complete local provider selected from PR4610. +It also excludes **30,328 fixed pair fusions at every positive tensor width**. +This contribution does not increase kappa. The paid profile does not change. + +The provider is the exact word at main commit +`1ec1119972c9aefe42525172d07b332fcff81cb4`. Its author head is +`20bb93cd990d2ff683e4d0fc56b87a42cd5d3296`. The paid catalogue comes from +the independent PR5241 admission at +`13efb5fc5f3b7c14ec2cfa181dd9eb6480972cf2`. +`provider/SOURCES.json` binds each copied input to its source Git object and +SHA-256. Frozen source files are not changed. + +## Result and coverage + +Each direction has 21,449 source events, 632 independent persistent inputs, +and one independent owned input. Every persistent output is checked. The owned +output must be zero. All 408 helper inputs remain arbitrary. Their outputs +have their specified native frame changes; they are not assumed to be zero. + +The new quadratic-sum engine checks 7,000 oriented recipe classes: + +| Class | Checks | Coverage | +| --- | ---: | --- | +| Paid transitions | 5,710 | All 6,596 event instances across both directions | +| Native warps | 360 | All 480 signed event instances | +| Helper boundaries | 34 | All 408 roles in each direction | +| Main adapters | 896 | All 448 adapter events in each direction | + +These counts refer to labelled classes. They do not count distinct matrices. +For two unitary circuits U,V on D=512 coordinates, the checker requires +`tr(U* V)/D = 1`. Here `*` is the conjugate transpose. This equality proves +U=V, including absolute phase. Each circuit then has the same tensor power at +every positive width. A recipe's stored PASS status is not an input to this +test. The main adapter generator only proposes data. Acceptance does not +import or execute that generator or its native compiler. + +The complete physical programs are also passed directly to `compact.certify`. +Their references contain every input and output role. The result is equality +at every positive width, with no nonzero endpoint entry. The complete sparse +expansion gives these measured support counts: + +| Direction | Scalar/native instructions | Native symbols | Peak total terms | Peak terms in one row | Final terms | +| --- | ---: | ---: | ---: | ---: | ---: | +| Forward | 24,827 | 1,297 | 22,331 | 156 | 744 | +| Backward | 24,819 | 1,297 | 12,930 | 148 | 744 | + +These are counts for this fixed provider. General program support can still +grow exponentially. No dense tensor matrix is made. The separate check of +the displayed failure witnesses uses base-space vectors with 512 entries. + +## Exact boundary and translation + +Let F_U be the source canonical frame, C_q the source Gaussian gate, and +F_full the full frame. Write E_i for the entrance frame of persistent role i +and H_i for its exit frame. In the forward orientation: + +- For 0<=i<112, E_i=C_(q_i) and H_i=F_full. +- For 112<=i<224, E_i=I and H_i=F_full C_(q_(i-112))^-1. +- For 224<=i<632, E_i=F_(start_i) and H_i=F_(final_i). + +The backward orientation uses the entrywise conjugate of each native frame +and operator. A negative warp uses the inverse before this conjugation. +Conjugation is not replaced by the adjoint. + +In these logical coordinates, the forward endpoint is +`L_(112+j) <- L_(112+j) + L_j` for 0<=j<112. The backward endpoint is +`L_j <- L_j - L_(112+j)`. All other persistent logical coordinates return +unchanged. Thus the persistent physical endpoint is + + diag(H_i^tensor f) T diag((E_i^-1)^tensor f). + +This operator is invertible for every positive f. The owned input is erased, +and its output is zero. All scalar coefficients remain outside tensor powers. + +The importer expands a paid transition a->b as F_b F_a^-1. A signed warp +becomes F_b K_signed F_a^-1. A scalar ADD retains its literal rational +coefficient. Owned CLEAR becomes scalar multiplication by zero. Owned COPY +becomes CLEAR followed by ADD. Borrowed CLEAR and COPY are rejected. + +The 448 main adapter markers are included. An entrance adapter is +F_start E_i^-1. An exit adapter is H_i F_final^-1. There is a source detail +that must not be hidden: some identity exit markers precede the final climb. +The importer permits a marker at a different current frame only when the +adapter circuit is exactly the identity. A nonidentity marker must use its +actual current frame. +Every nonidentity entrance adapter must precede all uses of its role. Every +nonidentity exit adapter must follow all uses. The word audit checks both +conditions. Thus an adapter inside a candidate interval changes its endpoint +frame and has the identity logical map. + +The sparse interpreter expands all independent inputs together. The existing +`compact.certify` interpreter expands one input at a time. Both complete +endpoints agree with the same explicit physical reference. The earlier +PR5241 free-group argument already proves this provider's algebraic lift. +The new contribution here is an executable application of the new Gram +engine, complete support measurements, and the obstruction below. It is not +a priority claim for that earlier lift argument. + +## Fusion class + +For each persistent role, list its paid climbs in chronological order. Take +every pair in this list, at all positive ranks. Paid events on the same role +or on other roles may occur between the two climbs. Native warps, scalar contacts, +adapters and complete owned-center windows may also occur between them. +There are **7,582 pairs per direction**. No adjacency or common middle-frame +condition is imposed. The domain includes all 2,658 adjacent pairs, including +all 1,363 adjacent rank-one pairs, per direction. + +Let A and B be the literal physical operators of the first and second climb. +Let T be the complete interval between them. The original local map is BTA. +Two replacements are tested: + +- Early fusion: apply BA at the first slot and remove the second slot. The + local map becomes TBA. +- Late fusion: remove the first slot and apply BA at the second slot. The + local map becomes BAT. + +Every other physical operation is fixed. In particular, no scalar contact +is changed to a new native query. The product BA is used with its exact +phase, even when the middle frames differ. This gives 2*2*7582=30,328 candidate +rewrites. The domain does not include a new intermediate placement, a +changed pair of operators, simultaneous fusions, or a pair on different roles. + +The initial invoice opportunity was two H1 jobs replaced by one H2 job. +For a legal replacement in each of 18 local calls, the complete delta would +be -36 H1 +18 H2. This is the physical-pair gap in the PR5243 handoff. +The proof also applies to the other rank pairs. The endpoint obstruction +rejects every candidate before a new complete pricing step. +No such saving is charged to the complete kappa calculation. + +## Closed-cut lemma + +At every persistent climb in this source, the owned register is either +unused and about to be initialized before any read, or is zero after a +completed lifetime. The word audit checks this property. It also checks +that only the owned register can be overwritten and that all reads occur +after initialization. + +Set the unused owned entry to zero. At either end of each candidate interval, +the state is therefore determined by the 632 persistent fields. Each prefix, +interval and suffix defines a square linear map on those fields. This remains +true when the interval contains a whole owned-center window. + +For a fixed positive f, write the complete baseline as S(BTA)P on persistent +fields. The complete endpoint above is invertible. A product of square +matrices over Q(i) can be invertible only when every factor is invertible. +Thus P and S are invertible. It follows that + + S(C-BTA)P = 0 if and only if C-BTA = 0. + +A nonzero interval defect therefore survives to the complete provider's +return. This argument does not require the persistent prefix or suffix to +be unitary. It does not carry a numerical norm bound through those maps. +It would fail at a cut with live owned information omitted from the state. + +## A quantitative contact obstruction + +Use the moving logical frames at the interval boundaries. Let M be the +interval's logical matrix. Frame changes and adapter changes are identity +maps in these coordinates. Scalar instructions remain scalar instructions. +Each native warp is the corresponding phase-bearing K operator. + +For each candidate, the saved certificate gives an off-diagonal block of M +that touches the changed role r. That block is exactly + + M_(r,j) = q U^tensor f or M_(j,r) = q U^tensor f, j != r, + +where q is a nonzero rational and U is a signed word of native unitary maps. +The coefficient is obtained by exact free-group arithmetic. It is not a +sampled equality and holds for all positive f. The second replay checks every +saved coefficient with the earlier independent-input engine. A separate +role-list census checks that the saved pairs cover the entire declared class. + +For early fusion, let G1 and G2 be the diagonal physical frames immediately +after A and immediately before B. Let G3 be the frame immediately after B. +Then the changed logical interval is L M R, where + + L = G3^-1 G2, + R = G1^-1 B G1. + +Both corrections act only on role r. Their r-blocks are conjugates of B^-1 +and B. For late fusion the corresponding corrections have r-blocks conjugate +to A and A^-1. These formulas do not require the two middle frames to agree. + +On the saved off-diagonal block, only one correction acts. The defect is a +unitary left or right multiple of q(V^tensor f-I), where V is a conjugate of +the relevant paid operator or its inverse. Let + + tau = tr(V)/D, D=512. + +The normalized squared Hilbert-Schmidt defect of this block is exactly + + q^2 (2 - 2 Re(tau^f)). + +The new quadratic-sum engine calculates every required trace with exact +Gaussian rational arithmetic. In every case it checks + + Re(tau) <= 1/2, |tau|^2 <= 1/2. + +For f=1, the first inequality gives Re(tau^f)<=1/2. For f>=2, the second +gives |tau|^f<=1/2. The same bounds hold for the inverse, whose trace is the +complex conjugate. Consequently every saved block has normalized squared +defect at least **q^2>0 at every positive width**. The closed-cut lemma lifts +this obstruction to the complete provider. +The smallest saved q^2 is **1/256**, which is a uniform lower bound on the +selected cut-block defects. It is not a lower bound on the full-provider +defect after multiplication by its prefix and suffix. + +`provider/FUSIONS.json.gz` contains all 15,164 contact certificates, the exact +event positions, ranks, four frame IDs, native word, scalar coefficient and two +traces. Each certificate excludes the early and late replacement. +`provider/WITNESSES.json` also gives twelve literal width-one basis witnesses +from the complete physical programs. They cover both directions, both +placements, equal and unequal middle frames, and nonadjacent pairs with a +higher-rank climb. The native source +amplitude evaluator checks each value without Gram traces or quadratic sums. + +## Verification and limits + +From the repository root, with Python 3.12 and the standard library: + +```sh +python3.12 -I -W error -B research/clifford-tensor-gram/verify_provider.py +python3.12 -I -O -W error -B research/clifford-tensor-gram/verify_provider.py +``` + +Expected final line: + +```text +PASS_COMPLETE_PR4610_PROVIDER_AND_30328_FUSION_OBSTRUCTIONS +``` + +The replay checks source bytes, every recipe class, both complete programs, +the complete pair census, every contact coefficient, exact trace bounds and +the full-program witnesses. Negative controls cover an omitted paid class, +a wrong absolute phase, borrowed erasure, a cut with live owned data and a +missing contact. An identity interval is a positive control: no obstruction +is inferred merely from the presence of two paid operations. + +The local paid profile remains `{1:2201,2:412,3:510,4:127,5:40,8:8}`: 3,298 jobs +and rank mass 5,327 per direction. The complete selected kappa remains +0.0030217758. This work does not reprice the controller, run a new outer +admission, or change the selected record. The five selected framework +assumptions remain. The result covers this ideal finite local provider and +its tensor substitution; it does not prove physical tape, precision, stock, +analytic recovery or the complete multiplication theorem. + +The obstruction does not exclude changed contacts, joint use of several +fields, simultaneous rewrites, interior placement, owned-center pairs, +new operators or later source providers. In particular, it does not +subsume the separate frozen eight-relation row argument in PR5393. + +## Open next questions + +1. Can a changed scalar contact supply the missing transformed operand at a + lower complete cost? Start from a saved contact certificate. Replace that + actual contact, retain dirty restoration, and price the replacement query. +2. Can several coordinated fusions cancel their endpoint defects? Start with + a small explicit set of saved pairs. Run the complete native endpoint test; + individual rejection does not prove joint rejection. +3. Can the eight-width criterion help with a complete program whose endpoint + cannot first be reduced by free-group identities? This provider gives a + manageable support example, not a bound for other programs. + +## Credit + +Cao Yifan / intqwq supplies the selected PR4610 construction. Chris R / +Clear1nsight supplies the PR5241 independent paid catalogue, complete admission +and earlier quantified lift proof. Cinna Davis / 1337isnot1337 supplies the +retained controller, native warp and helper chain. zxv, Jacob Alan Sussman, +Dugongue, Rohan Arun, Jeremy Kothe, icekylinx, DreamingOfClouds and chafreaky +retain credit for the relevant native, frame, helper and adapter sources. +The source notices and `provider/NOTICE.md` give the source links. The scalar +arithmetic and frozen native kernel retain their existing notices. + +The new provider importer, Gram application, cut proof, complete pair census +and receipts are by Ali Romman with substantial OpenAI Codex assistance. +The checks are author checks. Independent human review and a proof-kernel +verification are not claimed. Apache-2.0. diff --git a/research/clifford-tensor-gram/README.md b/research/clifford-tensor-gram/README.md new file mode 100644 index 0000000000..9f6cdf24c5 --- /dev/null +++ b/research/clifford-tensor-gram/README.md @@ -0,0 +1,234 @@ +# Finite, stable tensor tests for the full dyadic Clifford group + +**A uniform algebraic interface theorem and an exact verifier; no new kappa.** +For fixed scalar register programs on n binary axes, with unitary dyadic +Clifford operators and every dirty input/return retained, equality at the +**eight widths 8n-3 through 8n+4 implies equality at every positive width** +for n>=2. For one axis, **widths 5,6,7,8 suffice**, and both the maximum +cutoff eight and the number of tests four are sharp. For zero axes use +widths 1,2,3,4. This +covers Gaussian and Hadamard gates as well as phase-monomial maps. The cutoff +does not depend on program length or expanded support. + +The [original proof](PROOF.md) and [extensions](ADVANCES.md) give a stable test. +Let M be the squared coefficient +norm after equal exact native operators are combined. Some tested width has +normalized squared Hilbert-Schmidt residual at least **(75/76)M** among all +widths 1 through 8n+4. An explicit +rational polynomial recovers M from the finite norm sequence. Base-space pair +traces suffice. The compact implementation uses exact quadratic sums and +bitwise conditional norms. It builds **neither a dense base matrix nor a +tensor matrix**, and it removes the original D^2 coordinate scan. + +For the source's nine binary axes, **eight tests at widths 69 through 76** suffice. +This is an algebraic bound, not a full supplier replay or a minimal cutoff. +The complete kappa calculation and selected frontier are unchanged. + +The [complete-provider application](PROVIDER.md) now passes both directions +of the selected PR4610 local provider: all 633 inputs and returns, 7,000 +oriented native recipe classes, and the full physical programs. It also +excludes **30,328 early/late pair fusions at every positive tensor width**. +The domain contains every pair of paid climbs on one persistent role, at +all ranks and without an adjacency condition. The [result](provider/RESULT.json), +[full-program witnesses](provider/WITNESSES.json), and +[research notes](provider/RESEARCH-NOTES.md) preserve the evidence and limits. +No paid job is removed and kappa does not increase. + +## A concrete small-width trap + +The [Reynolds example](examples/reynolds.json) adds the average of the 96 +one-axis native group operators to a dirty target. It preserves the source. +Its complete endpoint is the identity at widths **1 through 7**, but fails at +width **8**, with a literal entry **5/24**. The +[certificate](examples/reynolds.certificate.json) gives the roles and coordinates. +This example uses the full group, not a numerical sample. + +## Use + +Python 3.12 and the standard library suffice. From the repository root: + +```sh +python3.12 -B scripts/research_package.py --package research/clifford-tensor-gram +``` + +The registered commands print `PASS_CLIFFORD_TENSOR_GRAM_NO_NEW_KAPPA` and +`PASS_CLIFFORD_ADVANCES_NO_NEW_KAPPA` in normal and optimized Python. +The provider commands also print +`PASS_COMPLETE_PR4610_PROVIDER_AND_30328_FUSION_OBSTRUCTIONS`. +Direct commands also work in a Git-free export: + +```sh +python3.12 -I -W error -B research/clifford-tensor-gram/verify.py +python3.12 -I -O -W error -B research/clifford-tensor-gram/verify.py +python3.12 -I -W error -B research/clifford-tensor-gram/verify_advances.py +python3.12 -I -O -W error -B research/clifford-tensor-gram/verify_advances.py +python3.12 -I -W error -B research/clifford-tensor-gram/verify_provider.py +python3.12 -I -O -W error -B research/clifford-tensor-gram/verify_provider.py +python3.12 -I -B research/clifford-tensor-gram/compact.py \ + research/clifford-tensor-gram/examples/native-64.json +python3.12 -I -B research/clifford-tensor-gram/certify.py \ + research/clifford-tensor-gram/examples/native-relation.json +python3.12 -I -B research/clifford-tensor-gram/check_witness.py \ + research/clifford-tensor-gram/examples/reynolds.json \ + research/clifford-tensor-gram/examples/reynolds.certificate.json +python3.12 -I -B research/clifford-tensor-gram/audit_mutations.py +python3.12 -I -B research/clifford-tensor-gram/audit_advances.py +``` + +The producer prints JSON. Read `equivalent_at_all_positive_widths`; a successful +process means the decision completed, and a counterexample is a valid result. +The independent witness checker prints `PASS_LITERAL_TENSOR_WITNESS 5/24`. +Relative to the original dense producer, it uses a separate signed-word +interpreter and literal matrix entries, with +no producer import, trace calculation or interpolation argument. Only the +frozen scalar arithmetic is shared. +It checks the literal nonzero entry, not the claimed norms or the universal +cutoff theorem. + +The compact producer reuses that signed-word expansion. Its differential +checks use the original dense compiler, frozen source matrices and literal +entries. It is not an independent checker of itself. The research record is +saved in [RESEARCH-NOTES.md](RESEARCH-NOTES.md). + +## Input contract + +`compact.py` uses the same roles and instructions below, but each value in +`operators` is a literal native circuit. See the +[64-axis example](examples/native-64.json) and +[65-axis phase relation](examples/native-65.json). The native gate forms are +`["P", rows]`, `["X", offset]`, `["D", rows, alpha]`, `["C", mask, sign]` +and `["phase", exponent]`. Binary matrix rows are integer masks. Diagonal +alpha values belong to 0,1,2,3 and have the diagonal row parity. C signs +are +1 or -1. The parser checks the native gate conditions. + +The compact certificate records the reduced decision widths. For a negative +result it still computes all 8n+4 norm values to use the stronger stability +bound and select its witness. The eight-width theorem alone does not give +that dimension-free bound on the selected eight norms. + +The [native relation example](examples/native-relation.json) gives the format. +`axes` is n; `roles` counts arbitrary independent inputs and returns. +`operators` contains exact 2^n-by-2^n matrices, with integer entries or +Gaussian-rational strings such as `1/2-1/2i`. Floats are rejected. The frontend +checks dyadic entries, unitarity and normalization of all Pauli generators. +`program` and `reference` are complete instruction lists. An empty reference +is identity on every role. + +| Instruction | Required fields | Action | +| --- | --- | --- | +| `add` | `src`, `dst` | Add a scalar multiple of a role | +| `query` | `src`, `dst`, `symbol` | Add an operator image of a role | +| `apply` | `dst`, `symbol` | Apply an operator to a role | +| `scale` | `dst`, `coefficient` | Scale a role | +| `swap` | `src`, `dst` | Exchange roles | + +`add` and `query` accept an optional `coefficient`, default one. `query` and +`apply` accept Boolean `inverse`, default false. Self queries read the previous +value. Global phase stays inside the tensor power; scalar coefficients stay +outside. The source convention has H^2=iI. Replacing that operator with scalar +scaling by i passes width one and fails width two, as the +[phase example](examples/phase-trap.json) shows. Scalar coefficients need not +be dyadic. + +## Evidence and limits + +[ADVANCES-RESULT.json](ADVANCES-RESULT.json) records the continuation: +256 code Fourier values, exact filter bounds for n=0,...,64, a rank-96 +modular inverse certificate, 640 exhaustive small quadratic sums, 3,328 +native entries, 128 native traces, 304 partial inner products, 48 complete +program comparisons and literal witnesses, nine exact native relations, +a scalar-phase trap and eight rejection controls. The large cases use +64 and 65 axes. Their base dimensions are 2^64 and 2^65; no dense base +array is allocated. The 64-axis witness is the exact entry 1/4294967296. +The 65-axis relation retains H^2=iI as a native operator identity. + +[RESULT.json](RESULT.json) records 96 group elements, 689 exact trace-filter +values, 2,124 source columns, 48 entangling trace cases, 60 explicit tensor +norms, 72 complete endpoint comparisons, 24 full tensor program comparisons, +16 random literal witnesses, two zero-axis boundary cases and 20 controls. +The source columns include both +orientations of an actual nine-axis Gaussian gate. Controls reject nonunitary +inputs, non-dyadic phases, Toffoli, malformed instructions, wrong tensor phases, +missing helper returns and false witnesses. Source hashes are checked before +the replay imports the frozen files. + +[MUTATIONS.json](MUTATIONS.json) records four private-copy defects rejected in +both Python modes: a missing trace factor, an ignored inverse, an omitted +dirty return and a missing Gram normalization. The audit prints +`PASS_CLIFFORD_GRAM_MUTATIONS`. The local runs used CPython 3.12.13 on macOS +with no third-party packages. + +[ADVANCES-MUTATIONS.json](ADVANCES-MUTATIONS.json) records four additional +defects rejected in both modes: a wrong native C phase, an ignored native +inverse sign, a missing prefix constraint and an omitted dirty return. +The audit prints `PASS_CLIFFORD_ADVANCE_MUTATIONS`. + +The written proof supplies the universal quantifiers. Finite tests corroborate +it. This is author-checked with substantial AI assistance, not independent +human or proof-kernel acceptance. Compilation can expand exponentially many +terms. The compact path and witness algorithms use polynomial work in the +axis count, literal word length, tensor width and expanded support. The +original dense frontend still uses base dimension 2^n. No polynomial-time claim in instruction +length or practical full-supplier speedup follows. The provider application +checks the complete selected local word and its native recipes. A selected +controller/compiler cold replay, new admission, Lean and Docker are not run. +Physical storage, tapes, stock, precision and outer recovery remain separate. +Programs that change with f, non-Clifford gates, continuous phases, nonunitary +native operators, rounded leaves and restricted clean-input contracts are excluded. + +## Sources and credit + +Base: canonical main `7c472563474e60185e6ca101a17622133d047e56`, priority 7. +[SOURCES.json](SOURCES.json) binds exact sources. No predecessor is modified. +The provider application has the separate current-main pin +`1ec1119972c9aefe42525172d07b332fcff81cb4`; its source copies and full credit +are in [provider/SOURCES.json](provider/SOURCES.json) and +[provider/NOTICE.md](provider/NOTICE.md). +Rohan Arun supplies the retained native compiler, following Jeremy Kothe and +the native lineage. Tekalign's retention and Cinna Davis's borrowing work keep +their credit. The complete [notice](vendor/NATIVE-LINEAGE-NOTICE) accompanies +the byte-identical kernel. + +zxv's [PR #5235](https://github.com/CrocSwap/integer-mult-bounds/pull/5235) +supplies the independent-symbol interface and frozen Gaussian arithmetic. +Krzysztof Wojt's [PR #5262](https://github.com/CrocSwap/integer-mult-bounds/pull/5262) +supplies the inverse-aware interface and native-relation handoff. lm1909's +[projection-recursion check](https://github.com/CrocSwap/integer-mult-bounds/blob/7c472563474e60185e6ca101a17622133d047e56/research/projection-recursion-check/README.md) +already uses positive-width group separation, following Jacob Alan Sussman's +engine model. Cinna Davis, ToikY, Sagar Thakrar, roger-sato and the retained +free-word/tensor audits keep their earlier results and attribution. + +Chris R's [PR #4928](https://github.com/CrocSwap/integer-mult-bounds/pull/4928) +and [PR #4978](https://github.com/CrocSwap/integer-mult-bounds/pull/4978) +already use finite Clifford alphabets and tensor Gram separation. Their +[general separation proof](https://github.com/CrocSwap/integer-mult-bounds/blob/7c472563474e60185e6ca101a17622133d047e56/research/two-full-retained-helper-ceiling/science/PROOF.md) +and [passive-query clarification](https://github.com/CrocSwap/integer-mult-bounds/blob/7c472563474e60185e6ca101a17622133d047e56/research/passive-saved-query-ceiling/evidence/frozen/pr4948-saved-query-macro-gate/UNIFORM-ALPHABET-ADDENDUM.md) +retain that credit. This package adds an explicit linear cutoff and constant +stability bound for fixed scalar coefficients in the full dyadic class. + +Concurrent [PR #5369](https://github.com/CrocSwap/integer-mult-bounds/pull/5369) +proves a four-width criterion for affine-quadratic monomial maps. +Its scope excludes Hadamard gates. The +[coordination claim](https://github.com/CrocSwap/integer-mult-bounds/discussions/5236#discussioncomment-19153620) +records this package's larger class, Gram test and stability claim. Public +PR/Discussion bodies and relevant main notes were checked. Historical diffs +and unpublished work remain outside coverage. + +Classical ingredients are credited in [PROOF.md](PROOF.md). No new general +Burnside-Brauer theorem, general circuit identity algorithm or global priority +is claimed. The contribution is the explicit native trace filter, stable +cutoff, program frontend, compact witness and source-bound validation. +The code invariant follows Runge and Nebe, Rains and Sloane. The binary +quadratic-form method follows Dehaene and De Moor. [ADVANCES.md](ADVANCES.md) +links those sources and derives the native phase conventions used here. + +## Open next questions + +1. Find the sharp maximum cutoff for n>=2. The one-axis maximum eight is + now sharp. The general eight-width test still reaches 8n+4. +2. Prove a useful stability constant on the eight selected widths. The + present 75/76 bound uses the full range 1,...,8n+4. +3. Bind a complete current provider and measure support growth. Retain every + input/return and native phase. Physical admission and a full bill remain open. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. diff --git a/research/clifford-tensor-gram/RESEARCH-NOTES.md b/research/clifford-tensor-gram/RESEARCH-NOTES.md new file mode 100644 index 0000000000..dc3244e15d --- /dev/null +++ b/research/clifford-tensor-gram/RESEARCH-NOTES.md @@ -0,0 +1,133 @@ +# Continuation research record + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. + +## Starting point + +The first result is commit 0db0609042d3bee25028ef6515fcee40a33e958d in +[PR #5376](https://github.com/CrocSwap/integer-mult-bounds/pull/5376). +It proves the 8n+4 positive-width cutoff and a 14/15 separation bound. +Both local modes, the export, mutation checks and hosted CI passed. +The continuation refresh found main at +1ec1119972c9aefe42525172d07b332fcff81cb4. Priority revision 7 and both +consumed kernels are unchanged. The selected kappa is not part of this work. + +## Questions and acceptance tests + +1. Can a degree-eight invariant reduce the number of widths to eight? + Prove invariance under a complete native generating set. Prove the + resulting kernel inclusion, with all width and coefficient quantifiers. +2. Can the filter bound improve from 14/15 to 75/76? + Prove the coefficient signs and control their total absolute value for + every n. Numerical samples do not establish the uniform bound. +3. What is the sharp one-axis positive-width cutoff? + Combine an exact full-rank Gram certificate with an explicit lower-bound + example. Do not generalize a one-axis result to other axis counts. +4. Can exact traces and entries avoid a dense 2^n base matrix? + Derive a phase-exact quadratic-sum algorithm. Compare it with the frozen + source and independent dense cases, including inverses and zero traces. + Preserve possible exponential growth in expanded circuit support. + +## Initial observations, not yet new accepted results + +For n=1,...,12, exact filter coefficient sums give reciprocal positive mass +at least 75/76. The n=1 value is exactly 75/76. The later values increase +toward approximately 0.9887179563. These samples suggest a monotonicity +proof; they do not prove it. + +The extended binary Hamming code of length eight is self-dual and doubly +even. Its row-code tensor is a candidate invariant for every axis count. +The classical code-invariant construction is prior work of Runge and +Nebe, Rains and Sloane, not a new invariant discovered here. + +The original direct witness search examines all D^2 coordinate pairs at +each tensor factor. Even a compact trace routine alone does not remove +that search. A complete scalable extractor needs a separate argument. + +## Results of the continuation + +The proofs and algorithms are saved in [ADVANCES.md](ADVANCES.md), +[quadratic.py](quadratic.py) and [compact.py](compact.py). + +1. The length-eight code invariant gives kernel inclusion from f+8 to f. + Eight selected widths now suffice. For nine axes these are 69 through 76. +2. The coefficient sign pattern ++-- gives a monotonicity proof for the + filter norm. Its maximum is 77/75 at n=1. Positive mass is at most 76/75, + so the stable separation improves from 14/15 to 75/76. +3. The one-axis Gram sum at widths 5,6,7,8 has rank 96. A saved inverse + over F_65537 proves this rank in characteristic zero. The previous + Reynolds example proves that the maximum cutoff eight is sharp. + Central scalar characters also prove that four widths are necessary. +4. Exact quadratic path sums retain the native global phase. Conditional + sums with coordinate prefixes give a bitwise witness extractor. This + removes both the dense base matrix and the D^2 coordinate scan. + +The first modular experiment gave cumulative ranks modulo 65537 of +4,14,34,57,77,91,95,96 at widths 1 through 8. These are modular ranks; +the lower-width values alone are not characteristic-zero rank certificates. +The final proof uses the rank-96 inverse and the separate Reynolds obstruction. + +The replay includes 640 exhaustive small quadratic sums, every one-axis +native group word, entangling two- and three-axis words, complete register +programs and exact positive relations. The large cases certify an explicit +64-axis entry and the phase relation on 65 axes. Full counts and literal +certificates are saved with the package. + +## Performance correction + +The initial filter routine repeatedly reduced rational coefficients. The +continuation instead multiplies integer numerator factors and keeps one +denominator. A direct comparison with the function from commit +0db0609042d3bee25028ef6515fcee40a33e958d gave identical coefficient lists +at n=0,1,2,9,16,32. One local CPython 3.14.7 measurement at n=32 took +0.283 seconds before and 0.0149 seconds after. This is one measurement of +the filter builder, not a full-verifier or provider speed claim. +The registered validation uses CPython 3.12.13 and checks the original +receipts as well as the new results. + +The first read-only continuation replay found a receipt-comparison defect: +native gate tuples serialize as JSON arrays. Comparing the loaded arrays +with in-memory tuples fails even when the serialized bytes agree. The +receipt check now compares canonical serialized bytes. This fixes the +serialization boundary without changing mathematical values or certificates. + +## Limits and routes not established + +The eight-width embedding does not preserve the dimension-free stability +constant. The 75/76 bound still uses all widths from 1 through 8n+4. A +trace routine alone would not remove the coordinate search; the conditional +two-path sum is needed for that step. The general maximum cutoff is not +proved sharp, and the one-axis result cannot be extrapolated to n>=2. + +The code invariant and binary quadratic-form method are classical. No +literature priority claim is made for those methods. The native phase +derivation, program binding, width refinements and reproducible certificates +are the contribution here. Symbolic word support can still be exponential. +No complete current provider, physical invoice or kappa improvement follows. +The written proofs remain author-checked with substantial AI assistance. + +The final upstream refresh kept main at +1ec1119972c9aefe42525172d07b332fcff81cb4. The selected result and source +pins did not change. The canonical Discussion claim remains the coordination +point. This continuation updates the same focused PR. + +## Local verification closeout + +The registered runner passed all four commands on CPython 3.12.13: +the original replay and the continuation replay, each in normal and +optimized mode. One complete local run took 88.42 seconds. The original +receipts remain unchanged after the integer filter optimization. + +Both mutation audits passed. Each of eight defects was rejected in both +Python modes, for 16 negative runs. The new defects change a native phase, +an inverse sign, a coordinate constraint and a dirty return. The metadata +and pinned-source check also passed. Exact commands are in README.md. + +The final advisory overlap refresh at 2026-10-23 21:12 UTC covered 337 +open PRs and 4,676 Discussion records, with complete remote pagination. +The new-term matches were this contribution and an unrelated occurrence +of 75/76 in a prior pencil-selection note. The sparse local checkout covers +only 16 of 7,269 note paths. Relevant predecessor proofs were read +separately. Historical diffs and unpublished work remain outside coverage. +The concurrent monomial PR remains at its previously reviewed head and +has not been changed by this work. diff --git a/research/clifford-tensor-gram/RESULT.json b/research/clifford-tensor-gram/RESULT.json new file mode 100644 index 0000000000..bd440a4b06 --- /dev/null +++ b/research/clifford-tensor-gram/RESULT.json @@ -0,0 +1,98 @@ +{ + "closure_edges": 192, + "complete_endpoint_comparisons": 72, + "controls": [ + "wrong witness value", + "wrong witness width", + "wrong certificate schema", + "wrong certificate problem_sha256", + "wrong certificate axes", + "wrong certificate cutoff", + "nonunitary", + "continuous rational phase", + "wrong shape", + "floating scalar", + "non-Clifford dyadic unitary", + "invalid instruction 11", + "invalid instruction 12", + "invalid instruction 13", + "invalid instruction 14", + "invalid instruction 15", + "invalid instruction 16", + "omitted helper return detected", + "noncommuting order detected", + "phase outside tensor detected" + ], + "cutoff": "8n+4", + "dense_norm_cases": 60, + "entangling_trace_cases": 48, + "full_tensor_programs": 24, + "native_source_columns": 2124, + "one_axis_group_order": 96, + "polynomial_values": 689, + "random_literal_witnesses": 16, + "reynolds": { + "coefficient_norm_squared": "1/96", + "first_nonzero_width": 8, + "input_role": 0, + "normalized_squared_norms": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "15/256", + "0", + "0", + "0", + "155/4096" + ], + "output_role": 1, + "support": 96, + "trace_buckets": 13, + "witness": { + "discrepancy": "5/24", + "input_tuple": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "output_tuple": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "width": 8 + } + }, + "separation": "14/15", + "status": "PASS_CLIFFORD_TENSOR_GRAM_NO_NEW_KAPPA", + "trace_histogram": { + "-1": 8, + "-1+1i": 6, + "-1-1i": 6, + "-2": 1, + "0": 36, + "0+1i": 8, + "0+2i": 1, + "0-1i": 8, + "0-2i": 1, + "1": 8, + "1+1i": 6, + "1-1i": 6, + "2": 1 + }, + "zero_axis_cases": 2 +} diff --git a/research/clifford-tensor-gram/SOURCES.json b/research/clifford-tensor-gram/SOURCES.json new file mode 100644 index 0000000000..874eb9c3f4 --- /dev/null +++ b/research/clifford-tensor-gram/SOURCES.json @@ -0,0 +1,141 @@ +{ + "schema_version": 1, + "base_commit": "7c472563474e60185e6ca101a17622133d047e56", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "c35482cd9035843b15a634cc8276a7e1e40e8395", + "sha256": "6fe0a099b89aa2aed796a13c3a21dafc63f3388ebf397464e44e0451893b9375" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "f126dd2e2dad2b669e75d1d0d0bd05c600725602", + "sha256": "f7a48bfa2659b88378282a8eee7d9fe52cdf505594124c4d1686b58510fffd72" + }, + { + "path": "research/inverse-dirty-certificates/PROOF.md", + "usage": "provenance", + "git_blob": "d2433c24ca46a1cf4af481f6ae9b281991cdafac", + "sha256": "de0820379f76fb4ab680c6401c852cc9ea127e447de11ca93a1453471d858f11" + }, + { + "path": "research/projection-recursion-check/README.md", + "usage": "provenance", + "git_blob": "1d8c9f7b1b96cd098a9a00a90022143bbced8b64", + "sha256": "59204f11aa3aae59df44fc69228cd017660139587b2dc18ece1999a98d097996" + }, + { + "path": "research/t74-native-fast/vendor/native/new/code/borrow/vendor/clifford/clifford_exact.py", + "usage": "input", + "git_blob": "166841a037f069249f6f7f6dedb89248812f59e2", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + { + "path": "research/universal-dirty-certificates/fields.py", + "usage": "input", + "git_blob": "f1b6dc83e26bd9fd9ec67ded3fedb330ef89598d", + "sha256": "0829ad6ed3775ba6e3d11cf04cfb3513ac763549b730aaed74958b1238e660d7" + }, + { + "path": "research/t74-native-fast/NATIVE-LINEAGE-NOTICE", + "usage": "provenance", + "git_blob": "380e979f0e84e00a22bd890615d87cc4684ad740", + "sha256": "ee0c73ca35877aad0e0b6adc560a3881cb82276dba4cf2d4fc58cd19e57cc420" + }, + { + "path": "research/t74-native-fast/LICENSE", + "usage": "provenance", + "git_blob": "261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64", + "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" + }, + { + "path": "research/two-full-retained-helper-ceiling/science/PROOF.md", + "usage": "provenance", + "git_blob": "85eb3ade566aecd21b681085543eff617fc0f5db", + "sha256": "63ec5034fb526dc9243de487f97477e51221773f4b7cae21b38df719ba1362c7" + }, + { + "path": "research/passive-saved-query-ceiling/evidence/frozen/pr4948-saved-query-macro-gate/UNIFORM-ALPHABET-ADDENDUM.md", + "usage": "provenance", + "git_blob": "d742381500d94759a3278050d86b7d1dcc726a7e", + "sha256": "f51448dc7551e8b61613c642d9487282f06e2ddc6274b1693276920688d5496f" + }, + { + "path": "research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz", + "git_blob": "46d929df83817b85a5387bcdb9745e0627d6366e", + "sha256": "7679daa4ec6a40f56fc7f0202379a6f454310e94945aba4f48beaaaafb838d05", + "retained_copy": "provider/WORD.json.gz" + }, + { + "path": "research/final4610-independent-admission/PAID-CATALOG.jsonl.gz", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/final4610-independent-admission/PAID-CATALOG.jsonl.gz", + "git_blob": "73fa3ced93981949ad8f2432af840b787d9182c0", + "sha256": "964aa2e28057936825a67872ebe5c6b0abc3228e71a545dda6c1fc11adb983d5", + "retained_copy": "provider/PAID.jsonl.gz" + }, + { + "path": "research/kappa-round3-warp-20261022/PHASE-VALIDATION.json.gz", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/kappa-round3-warp-20261022/PHASE-VALIDATION.json.gz", + "git_blob": "ac77b78547d6dbf2e6bd102e1047c5b16c1bca88", + "sha256": "6eae66ed3cfa8a1533e89b9660a57276908e6646640a12f8b1e3489f4ea1354b", + "retained_copy": "provider/PHASES.json.gz" + }, + { + "path": "research/joint-helper-lattice/NATIVE.json.gz", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/joint-helper-lattice/NATIVE.json.gz", + "git_blob": "0910f74138decf498e7fc445cc2daff4390169d6", + "sha256": "74582cce642c80f0235be7fcbce3716174666326ac6a1d46d02a62a75d7be4c6", + "retained_copy": "provider/HELPERS.json.gz" + }, + { + "path": "research/kappa-round3-warp-20261022/PROOF.md", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/kappa-round3-warp-20261022/PROOF.md", + "git_blob": "97f1d19ad423fe5540cc2986fb51af24a251d57c", + "sha256": "19178996b776a33f94c8df905b2ef07cc3069e4b6004180f8ec58e140f0c7f7c" + }, + { + "path": "research/final4610-independent-admission/PROOF.md", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/final4610-independent-admission/PROOF.md", + "git_blob": "cc71e69b34835eff261b6073606dd585355e442c", + "sha256": "e573cbbe6fa5481c0533e773de404e10f4dc7907b5ebfe404bdcd02dcf9844d8" + }, + { + "path": "research/joint-helper-lattice/PROOF.md", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/joint-helper-lattice/PROOF.md", + "git_blob": "e41106031da41fade7a7419c17a32c1bd9aa103b", + "sha256": "43ef4251cc300f1b18cbe8cdb060f96f95748e6797d2478b4c04b79a8373ef91" + }, + { + "path": "docs/research/community-native4610-contributors.md", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:docs/research/community-native4610-contributors.md", + "git_blob": "977eab508c183efd5f725617e30ed7ccd19a1ff2", + "sha256": "ecfd9d5d00a116d1f92c374b6daf0bf64dcc4274bf262f98ef34ac26de605c8f" + }, + { + "path": "research/t74-native-fast/vendor/native/new/code/borrow/bw_phases.py", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/t74-native-fast/vendor/native/new/code/borrow/bw_phases.py", + "git_blob": "99f351785ebca5fbf3336bedcd7b48bac9c255e5", + "sha256": "9d1a620e26715f4c42fd0347ecc14ef5a4a9031867869b64e8bae4d8526a821e" + }, + { + "path": "research/t74-native-fast/vendor/native/new/code/borrow/bw_adapters.py", + "usage": "provenance", + "pin": "head:1ec1119972c9aefe42525172d07b332fcff81cb4:research/t74-native-fast/vendor/native/new/code/borrow/bw_adapters.py", + "git_blob": "82beaa9c1d13bcd5f79d0a5e10e8a10733eac347", + "sha256": "c5907050a9a7fa36d4fcba3ad4fe440d1bec2063360c095013891785ba65c3ce" + } + ], + "attribution": "Rohan Arun and the retained native lineage supply the exact kernel; Tekalign retained its source. zxv supplies fields.py. Krzysztof Wojt supplies the inverse-interface handoff. lm1909 and Jacob Alan Sussman supply the prior positive-width group-separation use. See README.md and the retained notice. New material by Ali Romman with substantial OpenAI Codex assistance; Apache-2.0. Chris R / Clear1nsight supplies the related finite-alphabet tensor separation in PR4928 and PR4978. The current provider application retains Cao Yifan / intqwq, Chris R / Clear1nsight, Cinna Davis and all source frame/helper/adapter credit in provider/NOTICE.md. Current source bytes are copied and authenticated inside the package; their source paths are provenance pins." +} diff --git a/research/clifford-tensor-gram/TASK.json b/research/clifford-tensor-gram/TASK.json new file mode 100644 index 0000000000..220174d087 --- /dev/null +++ b/research/clifford-tensor-gram/TASK.json @@ -0,0 +1,133 @@ +{ + "schema_version": 1, + "task_id": "formal-interface-lemma", + "priority_revision": 7, + "base_commit": "7c472563474e60185e6ca101a17622133d047e56", + "original_card": { + "id": "formal-interface-lemma", + "question": "Can one uncovered interface implication be formalized with exact caller and certificate bindings?", + "starting_points": [ + "docs/research/research-family-status.md", + "certificates/selected-result.json", + "research/gate-operand-parity-lean/README.md", + "research/staged544-certified-endpoint/README.md", + "research/unconditional-batched-crt/README.md" + ], + "methods": [ + "Formalize a missing boundary lemma identified by the selected review.", + "Audit a formal theorem-to-certificate binding independently." + ], + "acceptance_gate": "State the exact formalized proposition and remaining assumptions; avoid duplicate arithmetic formalizations already present.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Inventory the gate-operand parity lemma (#3807) and certified endpoint arithmetic (#3857). Neither is a full multiplication proof. For #4100, audit the compact-switch statement and its hypotheses before formalizing it.", + "scope": "Source-binding orientation only; no scientific replay, theorem acceptance or supplier admission. Budget any heavy replay separately." + }, + "first_experiment": "Write one missing statement with quantified hypotheses, actual caller and existing coverage. A compact-switch lemma is a candidate only after its mathematical contract is reviewed. Establish a bounded proof plan before a separately budgeted proof-assistant build; do not rerun large Lean jobs as orientation.", + "bottleneck_link": "A missing interface proof can reduce the conditional gap even if it does not change kappa.", + "allowed_variations": [ + "Narrow to one formal lemma or one theorem-to-certificate binding." + ], + "scope_change_triggers": [ + "Formalizing already-covered arithmetic and claiming the full multiplication theorem." + ], + "overlap_terms": [ + "hyperplane end", + "formal interface", + "Lean binding", + "3807", + "3857", + "4100", + "gate-operand-parity-lean", + "staged544-certified-endpoint", + "unconditional-batched-crt" + ], + "existing_checks": [ + { + "scope": "PR #3807: scoped gate-operand parity formalization.", + "evidence": "research/gate-operand-parity-lean/README.md", + "remaining": "Exact theorem-to-caller binding and genuinely uncovered interface lemmas.", + "status": "author-checked", + "source_commit": "4c3530f42a6abcc48e7a6bcffd6c901911dc8269", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "scope": "PR #3857: certified real-power moment/endpoint arithmetic.", + "evidence": "research/staged544-certified-endpoint/README.md", + "remaining": "Uniform algorithmic implications, not another endpoint digit.", + "status": "author-checked", + "source_commit": "ef4315b8caa605e47a2515004845eb2d2ed71a86", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "scope": "PR #4100: compact-switch formalization proposed as future validation.", + "evidence": "research/unconditional-batched-crt/README.md", + "remaining": "Audit the statement and assumptions before a formal proof campaign.", + "status": "author-checked", + "source_commit": "337d04939571a637aeab54a0f58f54fde811663a", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "Eight-width full dyadic Clifford tests, compact exact native certificates, complete selected-provider replay and a uniform obstruction to all 30328 early/late fusions of two paid climbs on one persistent role.", + "scope_change_reason": "Supply a written native-relation interface theorem and executable certificate rather than repeat a formal arithmetic endpoint.", + "bottleneck_link": "A fixed native program needs an all-width endpoint proof. The trace filter supplies a uniform finite test and a quantified failure certificate for the full dyadic Clifford class.", + "budget_minutes": 60, + "stop_rule": "Prove the stated cutoff and stability bound, check source and independent tensor fixtures, then publish one scoped package. No supplier or selected-frontier update.", + "outcome": "completed", + "evidence": "PROOF.md, ADVANCES.md, PROVIDER.md, all result and mutation receipts, source-bound complete provider inputs and registered normal/optimized replays.", + "author": "Ali Romman with substantial OpenAI Codex assistance", + "ai_assistance": "Substantial OpenAI Codex assistance in derivation, implementation, self-review, validation and publication. No independent human or proof-kernel review.", + "open_questions": [ + { + "question": "What is the sharp maximum cutoff for n>=2?", + "why_it_matters": "Eight tests still reach width 8n+4.", + "first_step": "Find a smaller representation-theoretic bound or a matching explicit residual.", + "blocked_by": "The one-axis modular certificate does not generalize." + }, + { + "question": "Can the eight selected widths retain a dimension-free stability constant?", + "why_it_matters": "The 75/76 bound uses the full range of widths.", + "first_step": "Bound the selected-width Gram spectrum.", + "blocked_by": "The invariant embedding alone loses powers of the base dimension." + }, + { + "question": "Can a changed contact provide the transformed operand at lower complete cost?", + "why_it_matters": "Every fixed pair fusion retains a nonzero contact defect.", + "first_step": "Use one saved contact certificate and replace its literal scalar contact with a priced native query.", + "blocked_by": "Whole-caller endpoint, dirty restoration and full cost remain." + }, + { + "question": "Can coordinated pair rewrites cancel their defects?", + "why_it_matters": "The obstruction covers one pair at a time.", + "first_step": "Name a small joint rewrite and run its complete native endpoint.", + "blocked_by": "No joint-rewrite or physical invoice certificate exists." + } + ], + "coordination": "https://github.com/CrocSwap/integer-mult-bounds/discussions/5236#discussioncomment-19153620", + "continuation": { + "user_requested": true, + "main_checkpoint": "1ec1119972c9aefe42525172d07b332fcff81cb4", + "previous_result": "0db0609042d3bee25028ef6515fcee40a33e958d", + "source_pins_changed": false, + "notes": "RESEARCH-NOTES.md" + }, + "provider_application": { + "user_requested": true, + "main_checkpoint": "1ec1119972c9aefe42525172d07b332fcff81cb4", + "verifier_predecessor": "5370f4465388dbbfff3ba45d5d6ae99d447b1766", + "scope": "Complete selected local provider in both directions, then early/late fusion of every pair of paid persistent climbs on one role. All positive tensor widths.", + "decision": "Narrow after the full fixed pair-fusion domain fails. Changed contacts or coordinated rewrites require a new test.", + "outcome": "No kappa improvement; complete provider certificates and a uniform scoped obstruction.", + "paid_profile_changed": false, + "unknown_costs": "No changed physical, compiler or outer cost is assumed zero. All candidate rewrites fail the algebraic endpoint.", + "notes": "provider/RESEARCH-NOTES.md", + "sources": "provider/SOURCES.json" + } +} diff --git a/research/clifford-tensor-gram/VERIFY.json b/research/clifford-tensor-gram/VERIFY.json new file mode 100644 index 0000000000..b41360ab97 --- /dev/null +++ b/research/clifford-tensor-gram/VERIFY.json @@ -0,0 +1,87 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/t74-native-fast/vendor/native/new/code/borrow/vendor/clifford/clifford_exact.py", + "research/universal-dirty-certificates/fields.py" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-W", + "error", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 90, + "checks": "Exact trace filter, complete one-axis group, source columns, independent tensor norms and endpoints, literal witnesses and rejection controls." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 90, + "checks": "Exact trace filter, complete one-axis group, source columns, independent tensor norms and endpoints, literal witnesses and rejection controls." + }, + { + "argv": [ + "{python}", + "-I", + "-W", + "error", + "-B", + "{package}/verify_advances.py" + ], + "timeout_seconds": 90, + "checks": "Code invariant, stronger filter bound, one-axis rank certificate, quadratic sums, complete native programs, bitwise witnesses and large-axis phase cases." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/verify_advances.py" + ], + "timeout_seconds": 90, + "checks": "Code invariant, stronger filter bound, one-axis rank certificate, quadratic sums, complete native programs, bitwise witnesses and large-axis phase cases." + }, + { + "argv": [ + "{python}", + "-I", + "-W", + "error", + "-B", + "{package}/verify_provider.py" + ], + "timeout_seconds": 420, + "checks": "All 7000 native recipe classes, both complete selected provider directions, all 30328 pair fusions, separate contact and coverage replays, literal full-program witnesses and controls." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/verify_provider.py" + ], + "timeout_seconds": 420, + "checks": "All 7000 native recipe classes, both complete selected provider directions, all 30328 pair fusions, separate contact and coverage replays, literal full-program witnesses and controls." + } + ] +} diff --git a/research/clifford-tensor-gram/audit_advances.py b/research/clifford-tensor-gram/audit_advances.py new file mode 100644 index 0000000000..0429c569ab --- /dev/null +++ b/research/clifford-tensor-gram/audit_advances.py @@ -0,0 +1,58 @@ +"""Reject compact-computation defects in private package copies. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +import json +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile + +HERE = Path(__file__).resolve().parent +MUTATIONS = [ + ("conjugate native C factor", "quadratic.py", "G.pair(1, sign)/2", "G.pair(1, -sign)/2", "Native trace phase"), + ("ignore native inverse sign", "quadratic.py", "out.append((kind, gate[1], -gate[2]))", + "out.append((kind, gate[1], gate[2]))", "Native entry phase"), + ("omit output prefix constraint", "quadratic.py", + "equations += [left.outputs[j] ^ x for j, x in enumerate(output_prefix)]", + "equations += []", "Native partial inner product"), + ("omit final native return", "compact.py", "enumerate(zip(left, right))", + "enumerate(zip(left[:-1], right[:-1]))", "Compact complete endpoint"), +] + + +def audit(write=False): + results = [] + for label, filename, old, new, expected in MUTATIONS: + for optimized in (False, True): + with tempfile.TemporaryDirectory(prefix="clifford-advance-mutation-") as directory: + target = Path(directory) / "package" + shutil.copytree(HERE, target, ignore=shutil.ignore_patterns("__pycache__")) + source = target / filename + original = source.read_text(encoding="utf-8") + if original.count(old) != 1: + raise ValueError("Mutation target is not unique: "+label) + source.write_text(original.replace(old, new), encoding="utf-8") + command = [sys.executable, "-I", "-W", "error", "-B"] + if optimized: + command.append("-O") + command += [str(target / "verify_advances.py"), "--write"] + run = subprocess.run(command, text=True, capture_output=True, timeout=180) + if run.returncode == 0 or "ValueError: "+expected not in run.stderr: + raise ValueError("Mutation did not fail at its semantic check: "+label+"\n"+run.stdout+run.stderr) + results.append({"mutation": label, "optimized": optimized, "rejection": expected}) + receipt = {"status": "PASS_CLIFFORD_ADVANCE_MUTATIONS", "cases": results} + path = HERE / "ADVANCES-MUTATIONS.json" + if write: + path.write_text(json.dumps(receipt, indent=2, sort_keys=True)+"\n", encoding="utf-8") + elif json.loads(path.read_text(encoding="utf-8")) != receipt: + raise ValueError("Committed advance mutation receipt mismatch") + print(receipt["status"]) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--write", action="store_true", help="Regenerate the advance mutation receipt") + audit(parser.parse_args().write) diff --git a/research/clifford-tensor-gram/audit_mutations.py b/research/clifford-tensor-gram/audit_mutations.py new file mode 100644 index 0000000000..11fd235740 --- /dev/null +++ b/research/clifford-tensor-gram/audit_mutations.py @@ -0,0 +1,57 @@ +"""Check that semantic defects fail in private package copies. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +import json +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile + +HERE = Path(__file__).resolve().parent +MUTATIONS = [ + ("omit final trace root", "range(1, 2*n+1)", "range(1, 2*n)", "Polynomial endpoints"), + ("ignore inverse", "adjoint(operators[symbol]) if inverse else operators[symbol]", + "operators[symbol]", "Signed-word complete endpoint"), + ("omit final return", "enumerate(zip(left, right))", "enumerate(zip(left[:-1], right[:-1]))", + "Zero-axis scalar group"), + ("remove Gram normalization", "G(0))/d\n for right", "G(0))\n for right", + "Independent dense norm"), +] + + +def audit(write=False): + results = [] + for label, old, new, expected in MUTATIONS: + for optimized in (False, True): + with tempfile.TemporaryDirectory(prefix="clifford-gram-mutation-") as directory: + target = Path(directory) / "package" + shutil.copytree(HERE, target, ignore=shutil.ignore_patterns("__pycache__")) + source = target / "certify.py" + original = source.read_text(encoding="utf-8") + if original.count(old) != 1: + raise ValueError("Mutation target is not unique: "+label) + source.write_text(original.replace(old, new), encoding="utf-8") + command = [sys.executable, "-I", "-W", "error", "-B"] + if optimized: + command.append("-O") + command += [str(target / "verify.py"), "--write"] + run = subprocess.run(command, text=True, capture_output=True, timeout=180) + if run.returncode == 0 or "ValueError: "+expected not in run.stderr: + raise ValueError("Mutation did not fail at its semantic check: "+label+"\n"+run.stdout+run.stderr) + results.append({"mutation": label, "optimized": optimized, "rejection": expected}) + receipt = {"status": "PASS_CLIFFORD_GRAM_MUTATIONS", "cases": results} + path = HERE / "MUTATIONS.json" + if write: + path.write_text(json.dumps(receipt, indent=2, sort_keys=True)+"\n", encoding="utf-8") + elif json.loads(path.read_text(encoding="utf-8")) != receipt: + raise ValueError("Committed mutation receipt mismatch") + print(receipt["status"]) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--write", action="store_true", help="Regenerate the mutation receipt") + audit(parser.parse_args().write) diff --git a/research/clifford-tensor-gram/certify.py b/research/clifford-tensor-gram/certify.py new file mode 100644 index 0000000000..95c1cbf710 --- /dev/null +++ b/research/clifford-tensor-gram/certify.py @@ -0,0 +1,329 @@ +"""Decide complete tensor identities for dyadic Clifford register programs. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +The trace interpolation proof is in PROOF.md. No tensor matrix is built. +""" +import argparse +from fractions import Fraction as Q +import hashlib +import json +from pathlib import Path +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parent / "vendor")) +from fields import Gaussian as G + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def conjugate(z): + return G.pair(z.real, -z.imag) + + +def norm2(z): + return z.real*z.real + z.imag*z.imag + + +def power(z, k): + result = G(1) + while k: + if k & 1: + result = result*z + z = z*z + k //= 2 + return result + + +def scalar(x): + require(type(x) in (str, int), "Use an integer or an exact Gaussian string") + return G(x) + + +def identity(d): + return tuple(tuple(G(int(i == j)) for j in range(d)) for i in range(d)) + + +def adjoint(a): + return tuple(tuple(conjugate(a[j][i]) for j in range(len(a))) for i in range(len(a))) + + +def multiply(a, b): + d = len(a) + out = [[G(0) for _ in range(d)] for _ in range(d)] + sparse_b = [[(j, x) for j, x in enumerate(row) if x] for row in b] + for i, row in enumerate(a): + for k, x in enumerate(row): + if x: + for j, y in sparse_b[k]: + out[i][j] = out[i][j] + x*y + return tuple(tuple(row) for row in out) + + +def key(a): + return tuple(tuple((z.real, z.imag) for z in row) for row in a) + + +def pauli(n, x, z, phase=0): + d = 1 << n + unit = power(G("i"), phase % 4) + return tuple( + tuple(unit*(-1 if (z & j).bit_count() % 2 else 1) if i == j ^ x else G(0) + for j in range(d)) for i in range(d)) + + +def pauli_signature(a): + """Return the exact X/Z/phase label, or reject a non-Pauli matrix.""" + d = len(a) + n = d.bit_length()-1 + first = [(i, row[0]) for i, row in enumerate(a) if row[0]] + require(len(first) == 1, "Conjugated generator is not a Pauli") + x, unit = first[0] + units = [G(1), G("i"), G(-1), G("-i")] + require(unit in units, "Conjugated generator has a non-Pauli phase") + z = 0 + for j in range(n): + value = a[x ^ (1 << j)][1 << j] + require(value in (unit, -unit), "Conjugated generator is not a Pauli") + if value == -unit: + z |= 1 << j + phase = units.index(unit) + require(a == pauli(n, x, z, phase), "Conjugated generator is not a Pauli") + return x, z, phase + + +def validate_operator(a, n): + d = 1 << n + require(len(a) == d and all(len(row) == d for row in a), "Operator shape") + for row in a: + for value in row: + for part in (value.real, value.imag): + den = part.denominator + require(den & (den-1) == 0, "Operator entry is not dyadic") + star = adjoint(a) + require(multiply(star, a) == identity(d), "Operator is not unitary") + return [pauli_signature(multiply(multiply(a, pauli(n, x, z)), star)) + for x, z in [(1 << j, 0) for j in range(n)] + [(0, 1 << j) for j in range(n)]] + + +def parse_problem(problem): + require(type(problem) is dict and set(problem) == {"axes", "roles", "operators", "program", "reference"}, + "Problem keys") + n, r = problem["axes"], problem["roles"] + require(type(n) is int and n >= 0 and type(r) is int and r > 0, "Axes or roles") + require(type(problem["operators"]) is dict, "Operators must be an object") + matrices = {} + for name, rows in problem["operators"].items(): + require(type(name) is str and bool(name) and type(rows) is list and + all(type(row) is list for row in rows), "Operator format") + a = tuple(tuple(scalar(x) for x in row) for row in rows) + validate_operator(a, n) + matrices[name] = a + return n, r, matrices + + +def accumulate(out, label, coefficient): + value = out.get(label, G(0)) + coefficient + if value: + out[label] = value + else: + out.pop(label, None) + + +def compile_difference(problem): + """Keep phases in matrix keys and keep scalar coefficients outside them.""" + n, roles, operators = parse_problem(problem) + eye = identity(1 << n) + bank = {key(eye): eye} + products = {} + + def execute(instructions): + require(type(instructions) is list, "Instruction list") + rows = [{(i, key(eye)): G(1)} for i in range(roles)] + for instruction in instructions: + require(type(instruction) is dict, "Instruction object") + kind = instruction.get("op") + allowed = {"add": {"op", "src", "dst", "coefficient"}, + "scale": {"op", "dst", "coefficient"}, + "swap": {"op", "src", "dst"}, + "apply": {"op", "dst", "symbol", "inverse"}, + "query": {"op", "src", "dst", "symbol", "inverse", "coefficient"}} + require(kind in allowed and set(instruction) <= allowed[kind], "Instruction keys") + dst = instruction.get("dst") + require(type(dst) is int and 0 <= dst < roles, "Destination role") + src = instruction.get("src", dst) + require(type(src) is int and 0 <= src < roles, "Source role") + if kind in ("add", "query", "swap"): + require("src" in instruction, "Missing source role") + if kind == "swap": + rows[src], rows[dst] = rows[dst], rows[src] + continue + if kind == "scale": + coefficient = scalar(instruction["coefficient"]) + rows[dst] = {k: coefficient*v for k, v in rows[dst].items() if coefficient*v} + continue + image = rows[src].copy() + if kind in ("apply", "query"): + symbol = instruction.get("symbol") + inverse = instruction.get("inverse", False) + require(type(inverse) is bool and type(symbol) is str and symbol in operators, "Operator reference") + a = adjoint(operators[symbol]) if inverse else operators[symbol] + image = {} + for (i, old), coefficient in rows[src].items(): + cache_key = symbol, inverse, old + if cache_key not in products: + product = multiply(a, bank[old]) + new = key(product) + bank[new] = product + products[cache_key] = new + accumulate(image, (i, products[cache_key]), coefficient) + if kind == "apply": + rows[dst] = image + else: + coefficient = scalar(instruction.get("coefficient", 1)) + updated = rows[dst].copy() + for label, value in image.items(): + accumulate(updated, label, coefficient*value) + rows[dst] = updated + return rows + + left, right = execute(problem["program"]), execute(problem["reference"]) + result = [] + for output, (a, b) in enumerate(zip(left, right)): + row = a.copy() + for label, coefficient in b.items(): + accumulate(row, label, -coefficient) + for input_role in range(roles): + terms = [(coefficient, bank[operator]) for (i, operator), coefficient in row.items() if i == input_role] + if terms: + result.append((output, input_role, terms)) + return n, result + + +def cutoff_polynomial(n): + require(type(n) is int and n >= 0, "Nonnegative axis count") + coefficients, denominator = [1], 1 + for j in range(1, 2*n+1): + scale, sign = 4**j, (-1)**j + new = [0]*(len(coefficients)+1) + for degree, coefficient in enumerate(coefficients): + new[degree] -= sign*coefficient + new[degree+1] += scale*coefficient + coefficients = new + denominator *= scale-sign + return [Q(0)]+[Q(a, 4*denominator) for a in coefficients for _ in range(4)] + + +def gram(matrices): + d = len(matrices[0]) + return [[sum((conjugate(a)*b for row_a, row_b in zip(left, right) + for a, b in zip(row_a, row_b)), G(0))/d + for right in matrices] for left in matrices] + + +def energy(coefficients, inner, width): + value = sum((conjugate(a)*b*power(inner[i][j], width) + for i, a in enumerate(coefficients) for j, b in enumerate(coefficients)), G(0)) + require(value.imag == 0 and value.real >= 0, "Invalid squared residual norm") + return value.real + + +def trace_buckets(coefficients, inner): + out = {} + for i, a in enumerate(coefficients): + for j, b in enumerate(coefficients): + value = inner[i][j] + accumulate(out, (value.real, value.imag), conjugate(a)*b) + return out + + +def bucket_energies(buckets, cutoff): + powers = {label: G(1) for label in buckets} + answer = [] + for _ in range(cutoff): + for label in powers: + powers[label] = powers[label]*G.pair(*label) + value = sum((coefficient*powers[label] for label, coefficient in buckets.items()), G(0)) + require(value.imag == 0 and value.real >= 0, "Invalid bucket norm") + answer.append(value.real) + return answer + + +def tensor_entry(coefficients, matrices, output, input_tuple): + answer = G(0) + for coefficient, a in zip(coefficients, matrices): + value = coefficient + for x, y in zip(output, input_tuple): + value = value*a[x][y] + answer = answer+value + return answer + + +def entry_witness(coefficients, matrices, inner, width): + """Choose an entry by exact conditional squared norms.""" + d = len(matrices[0]) + initial = energy(coefficients, inner, width) + require(initial > 0, "The requested width has zero residual") + current = list(coefficients) + output, input_tuple = [], [] + for remaining in range(width-1, -1, -1): + best = None + for x in range(d): + for y in range(d): + candidate = [c*a[x][y] for c, a in zip(current, matrices)] + value = energy(candidate, inner, remaining) + if best is None or value > best[0]: + best = value, x, y, candidate + require(best[0] > 0, "Conditional tensor norm lost the witness") + _, x, y, current = best + output.append(x) + input_tuple.append(y) + value = sum(current, G(0)) + require(norm2(value)*d**width >= initial, "Tensor entry lower bound") + return {"width": width, "output_tuple": output, "input_tuple": input_tuple, + "discrepancy": str(value)} + + +def analyze(n, terms): + """Analyze distinct validated Clifford matrices with nonzero coefficients.""" + coefficients, matrices = zip(*terms) + require(len(set(key(a) for a in matrices)) == len(matrices), "Merge equal exact operators first") + inner = gram(matrices) + polynomial = cutoff_polynomial(n) + buckets = trace_buckets(coefficients, inner) + energies = bucket_energies(buckets, len(polynomial)-1) + mass = sum(norm2(c) for c in coefficients) + require(sum(b*v for b, v in zip(polynomial[1:], energies)) == mass, "Trace interpolation failed") + require(max(energies) >= Q(14, 15)*mass, "Stable separation failed") + width = 1 + max(range(len(energies)), key=energies.__getitem__) + witness = entry_witness(coefficients, matrices, inner, width) + return {"support": len(terms), "trace_buckets": len(buckets), "coefficient_norm_squared": str(mass), + "normalized_squared_norms": [str(x) for x in energies], + "first_nonzero_width": 1+next(i for i, x in enumerate(energies) if x), + "witness": witness} + + +def certify(problem): + n, residuals = compile_difference(problem) + digest = hashlib.sha256(json.dumps(problem, sort_keys=True, separators=(",", ":")).encode()).hexdigest() + result = {"schema": "clifford-tensor-gram/v1", "problem_sha256": digest, + "axes": n, "cutoff": 8*n+4, "equivalent_at_all_positive_widths": not residuals, + "nonzero_endpoint_entries": len(residuals)} + if residuals: + output, input_role, terms = residuals[0] + result["failure"] = {"output_role": output, "input_role": input_role, **analyze(n, terms)} + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("problem", type=Path) + args = parser.parse_args() + result = certify(json.loads(args.problem.read_text(encoding="utf-8"))) + print(json.dumps(result, indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/clifford-tensor-gram/check_witness.py b/research/clifford-tensor-gram/check_witness.py new file mode 100644 index 0000000000..a3bca57b43 --- /dev/null +++ b/research/clifford-tensor-gram/check_witness.py @@ -0,0 +1,150 @@ +"""Check a tensor entry by a separate signed-word interpreter. + +This module does not import the certificate producer or use Gram traces. +It shares only the frozen exact scalar arithmetic. Word support can grow. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +import hashlib +import json +from pathlib import Path +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parent / "vendor")) +from fields import Gaussian as G + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def star(a): + return tuple(tuple(G.pair(a[j][i].real, -a[j][i].imag) + for j in range(len(a))) for i in range(len(a))) + + +def product(a, b): + return tuple(tuple(sum((x*y for x, y in zip(row, column)), G(0)) + for column in zip(*b)) for row in a) + + +def eye(d): + return tuple(tuple(G(int(i == j)) for j in range(d)) for i in range(d)) + + +def add_term(row, word, coefficient): + row[word] = row.get(word, G(0))+coefficient + if not row[word]: + del row[word] + + +def word_endpoint(problem, instructions, input_role): + r = problem["roles"] + rows = [{(): G(1)} if j == input_role else {} for j in range(r)] + for instruction in instructions: + kind, d = instruction["op"], instruction["dst"] + need(type(d) is int and 0 <= d < r, "Destination role") + s = instruction.get("src", d) + need(type(s) is int and 0 <= s < r, "Source role") + if kind == "swap": + rows[d], rows[s] = rows[s], rows[d] + continue + if kind == "scale": + coefficient = G(instruction["coefficient"]) + rows[d] = {w: coefficient*c for w, c in rows[d].items() if coefficient*c} + continue + image = rows[s].copy() + if kind in ("query", "apply"): + symbol, inverse = instruction["symbol"], instruction.get("inverse", False) + need(symbol in problem["operators"] and type(inverse) is bool, "Operator reference") + letter = (symbol, inverse) + image = {} + for word, coefficient in rows[s].items(): + if word and word[0] == (symbol, not inverse): + new_word = word[1:] + else: + new_word = (letter,)+word + add_term(image, new_word, coefficient) + if kind == "apply": + rows[d] = image + else: + need(kind in ("add", "query"), "Instruction kind") + coefficient = G(instruction.get("coefficient", 1)) + updated = rows[d].copy() + for word, value in image.items(): + add_term(updated, word, coefficient*value) + rows[d] = updated + return rows + + +def matrices(problem): + d = 1 << problem["axes"] + bank = {} + for name, rows in problem["operators"].items(): + a = tuple(tuple(G(x) for x in row) for row in rows) + need(len(a) == d and all(len(row) == d for row in a), "Matrix shape") + inverse = star(a) + need(product(a, inverse) == eye(d), "Inverse requires a unitary matrix") + bank[name, False], bank[name, True] = a, inverse + return bank + + +def evaluate_word(word, bank, d): + out = eye(d) + for letter in word: + out = product(out, bank[letter]) + return out + + +def discrepancy(problem, output_role, input_role, output_tuple, input_tuple): + width = len(output_tuple) + d, r = 1 << problem["axes"], problem["roles"] + need(width > 0 and len(input_tuple) == width, "Positive tensor width") + need(all(type(x) is int and 0 <= x < d for x in output_tuple+input_tuple), "Tensor coordinate") + need(type(output_role) is int and 0 <= output_role < r and + type(input_role) is int and 0 <= input_role < r, "Endpoint role") + bank = matrices(problem) + left = word_endpoint(problem, problem["program"], input_role)[output_role] + right = word_endpoint(problem, problem["reference"], input_role)[output_role] + words = left.copy() + for word, coefficient in right.items(): + add_term(words, word, -coefficient) + answer = G(0) + for word, coefficient in words.items(): + a = evaluate_word(word, bank, d) + value = coefficient + for x, y in zip(output_tuple, input_tuple): + value = value*a[x][y] + answer = answer+value + return answer + + +def check(problem, certificate): + need(certificate.get("schema") == "clifford-tensor-gram/v1", "Certificate schema") + digest = hashlib.sha256(json.dumps(problem, sort_keys=True, separators=(",", ":")).encode()).hexdigest() + need(certificate.get("problem_sha256") == digest, "Problem digest") + need(type(certificate.get("axes")) is int and certificate["axes"] == problem["axes"], "Axis count") + need(type(certificate.get("cutoff")) is int and certificate["cutoff"] == 8*problem["axes"]+4, "Cutoff") + need(certificate["equivalent_at_all_positive_widths"] is False, "Expected a negative certificate") + failure = certificate["failure"] + witness = failure["witness"] + need(type(witness["width"]) is int and 1 <= witness["width"] <= certificate["cutoff"], "Witness width") + need(witness["width"] == len(witness["input_tuple"]) == len(witness["output_tuple"]), "Width mismatch") + value = discrepancy(problem, failure["output_role"], failure["input_role"], + witness["output_tuple"], witness["input_tuple"]) + need(value != 0 and value == G(witness["discrepancy"]), "The literal discrepancy does not match") + return str(value) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("problem", type=Path) + parser.add_argument("certificate", type=Path) + args = parser.parse_args() + value = check(json.loads(args.problem.read_text()), json.loads(args.certificate.read_text())) + print("PASS_LITERAL_TENSOR_WITNESS", value) + + +if __name__ == "__main__": + main() diff --git a/research/clifford-tensor-gram/compact.py b/research/clifford-tensor-gram/compact.py new file mode 100644 index 0000000000..aa83f0f565 --- /dev/null +++ b/research/clifford-tensor-gram/compact.py @@ -0,0 +1,182 @@ +"""Certify complete native programs with quadratic sums and bitwise witnesses. + +Program support can grow exponentially. No base or tensor matrix is built. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +from fractions import Fraction as Q +import hashlib +import json +from pathlib import Path +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import certify as c +from check_witness import word_endpoint, add_term +from quadratic import Paths, partial_inner, inverse_circuit + + +def decision_widths(n): + if n == 0: + return list(range(1, 5)) + if n == 1: + return list(range(5, 9)) + return list(range(8*n-3, 8*n+5)) + + +def validate(problem): + c.require(type(problem) is dict and set(problem) == {"axes", "roles", "operators", "program", "reference"}, + "Native problem keys") + n, roles = problem["axes"], problem["roles"] + c.require(type(n) is int and n >= 0 and type(roles) is int and roles > 0, "Axes or roles") + c.require(type(problem["operators"]) is dict, "Native operators") + bank = {} + for name, circuit in problem["operators"].items(): + c.require(type(name) is str and bool(name) and type(circuit) is list, "Native operator format") + Paths(n, circuit) + bank[name, False] = circuit + bank[name, True] = inverse_circuit(n, circuit) + allowed = {"add": {"op", "src", "dst", "coefficient"}, + "scale": {"op", "dst", "coefficient"}, "swap": {"op", "src", "dst"}, + "apply": {"op", "dst", "symbol", "inverse"}, + "query": {"op", "src", "dst", "symbol", "inverse", "coefficient"}} + for instructions in (problem["program"], problem["reference"]): + c.require(type(instructions) is list, "Native instruction list") + for op in instructions: + c.require(type(op) is dict and op.get("op") in allowed, "Instruction object") + kind = op["op"] + c.require(set(op) <= allowed[kind], "Instruction keys") + c.require(type(op.get("dst")) is int and 0 <= op["dst"] < roles, "Destination role") + if kind in ("add", "query", "swap"): + c.require(type(op.get("src")) is int and 0 <= op["src"] < roles, "Source role") + if kind in ("query", "apply"): + c.require(type(op.get("symbol")) is str and op["symbol"] in problem["operators"] and + type(op.get("inverse", False)) is bool, "Operator reference") + if kind == "scale": + c.require("coefficient" in op, "Scale coefficient") + if "coefficient" in op: + c.scalar(op["coefficient"]) + return bank + + +def merge_terms(coefficients, paths): + """For unitary matrices, normalized inner product one means equality.""" + d = 1 << paths[0].n + inner = [[partial_inner(a, b)/d for b in paths] for a in paths] + representatives, merged = [], [] + for j, coefficient in enumerate(coefficients): + i = next((i for i, k in enumerate(representatives) if inner[k][j] == 1), None) + if i is None: + representatives.append(j) + merged.append(coefficient) + else: + merged[i] = merged[i]+coefficient + keep = [i for i, coefficient in enumerate(merged) if coefficient] + indices = [representatives[i] for i in keep] + return ([merged[i] for i in keep], [paths[j] for j in indices], + [[inner[i][j] for j in indices] for i in indices]) + + +def residuals(problem): + bank = validate(problem) + n = problem["axes"] + paths = {} + out = [] + for input_role in range(problem["roles"]): + left = word_endpoint(problem, problem["program"], input_role) + right = word_endpoint(problem, problem["reference"], input_role) + for output_role, (a, b) in enumerate(zip(left, right)): + words = a.copy() + for word, coefficient in b.items(): + add_term(words, word, -coefficient) + if not words: + continue + for word in words: + if word not in paths: + circuit = [gate for letter in reversed(word) for gate in bank[letter]] + paths[word] = Paths(n, circuit) + coefficients, operators, inner = merge_terms(list(words.values()), [paths[word] for word in words]) + if coefficients: + out.append((output_role, input_role, coefficients, operators, inner)) + return out + + +def entry_witness(coefficients, paths, inner, width): + """Choose each coordinate bit from two exact conditional norms.""" + n, d = paths[0].n, 1 << paths[0].n + initial = c.energy(coefficients, inner, width) + c.require(initial > 0, "Positive residual norm") + current = list(coefficients) + output, inputs = [], [] + partial_cache = {} + + def score(x, y, remaining): + key = tuple(x), tuple(y) + if key not in partial_cache: + partial_cache[key] = [[partial_inner(a, b, x, y) for b in paths] for a in paths] + partial = partial_cache[key] + value = sum((c.conjugate(a)*b*partial[i][j]*c.power(inner[i][j], remaining) + for i, a in enumerate(current) for j, b in enumerate(current)), c.G(0)) + c.require(value.imag == 0 and value.real >= 0, "Conditional squared norm") + return value.real + + for remaining in range(width-1, -1, -1): + x, y = [], [] + parent = d*c.energy(current, inner, remaining+1) + for coordinate in (x, y): + for _ in range(n): + children = [] + for bit in (0, 1): + coordinate.append(bit) + children.append(score(x, y, remaining)) + coordinate.pop() + c.require(sum(children) == parent, "Conditional norm split") + bit = int(children[1] > children[0]) + coordinate.append(bit) + parent = children[bit] + c.require(parent > 0, "Conditional witness vanished") + a, b = sum(bit << j for j, bit in enumerate(x)), sum(bit << j for j, bit in enumerate(y)) + output.append(a) + inputs.append(b) + current = [coefficient*path.entry(a, b) for coefficient, path in zip(current, paths)] + value = sum(current, c.G(0)) + c.require(c.norm2(value)*d**width >= initial, "Compact entry lower bound") + return {"width": width, "output_tuple": output, "input_tuple": inputs, "discrepancy": str(value)} + + +def analyze(n, coefficients, paths, inner): + polynomial = c.cutoff_polynomial(n) + mass = sum(c.norm2(a) for a in coefficients) + norms = c.bucket_energies(c.trace_buckets(coefficients, inner), 8*n+4) + c.require(sum(b*v for b, v in zip(polynomial[1:], norms)) == mass, "Compact trace interpolation") + c.require(max(norms) >= Q(75, 76)*mass, "Improved stable separation") + c.require(any(norms[f-1] for f in decision_widths(n)), "Reduced width criterion") + width = 1+max(range(len(norms)), key=norms.__getitem__) + return {"support": len(paths), "coefficient_norm_squared": str(mass), + "normalized_squared_norms": [str(x) for x in norms], + "witness": entry_witness(coefficients, paths, inner, width)} + + +def certify(problem): + entries = residuals(problem) + n = problem["axes"] + result = {"schema": "clifford-tensor-gram/native-v1", "axes": n, + "problem_sha256": hashlib.sha256(json.dumps(problem, sort_keys=True, separators=(",", ":")).encode()).hexdigest(), + "cutoff": 8*n+4, "decision_widths": decision_widths(n), + "equivalent_at_all_positive_widths": not entries, "nonzero_endpoint_entries": len(entries)} + if entries: + output, input_role, coefficients, paths, inner = entries[0] + result["failure"] = {"output_role": output, "input_role": input_role, + **analyze(n, coefficients, paths, inner)} + return result + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("problem", type=Path) + args = parser.parse_args() + print(json.dumps(certify(json.loads(args.problem.read_text())), indent=2, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/clifford-tensor-gram/examples/native-64.certificate.json b/research/clifford-tensor-gram/examples/native-64.certificate.json new file mode 100644 index 0000000000..e2a64e17cc --- /dev/null +++ b/research/clifford-tensor-gram/examples/native-64.certificate.json @@ -0,0 +1,552 @@ +{ + "axes": 64, + "cutoff": 516, + "decision_widths": [ + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516 + ], + "equivalent_at_all_positive_widths": false, + "failure": { + "coefficient_norm_squared": "1", + "input_role": 0, + "normalized_squared_norms": [ + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1", + "1" + ], + "output_role": 1, + "support": 1, + "witness": { + "discrepancy": "1/4294967296", + "input_tuple": [ + 0 + ], + "output_tuple": [ + 0 + ], + "width": 1 + } + }, + "nonzero_endpoint_entries": 1, + "problem_sha256": "79b256e48a82a194351bda191bdf195a598cbd6bb4f855b78965216595f4ad34", + "schema": "clifford-tensor-gram/native-v1" +} diff --git a/research/clifford-tensor-gram/examples/native-64.json b/research/clifford-tensor-gram/examples/native-64.json new file mode 100644 index 0000000000..16577e87db --- /dev/null +++ b/research/clifford-tensor-gram/examples/native-64.json @@ -0,0 +1,613 @@ +{ + "axes": 64, + "operators": { + "H": [ + [ + "D", + [ + 1, + 2, + 4, + 8, + 16, + 32, + 64, + 128, + 256, + 512, + 1024, + 2048, + 4096, + 8192, + 16384, + 32768, + 65536, + 131072, + 262144, + 524288, + 1048576, + 2097152, + 4194304, + 8388608, + 16777216, + 33554432, + 67108864, + 134217728, + 268435456, + 536870912, + 1073741824, + 2147483648, + 4294967296, + 8589934592, + 17179869184, + 34359738368, + 68719476736, + 137438953472, + 274877906944, + 549755813888, + 1099511627776, + 2199023255552, + 4398046511104, + 8796093022208, + 17592186044416, + 35184372088832, + 70368744177664, + 140737488355328, + 281474976710656, + 562949953421312, + 1125899906842624, + 2251799813685248, + 4503599627370496, + 9007199254740992, + 18014398509481984, + 36028797018963968, + 72057594037927936, + 144115188075855872, + 288230376151711744, + 576460752303423488, + 1152921504606846976, + 2305843009213693952, + 4611686018427387904, + 9223372036854775808 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ], + [ + "C", + 1, + 1 + ], + [ + "C", + 2, + 1 + ], + [ + "C", + 4, + 1 + ], + [ + "C", + 8, + 1 + ], + [ + "C", + 16, + 1 + ], + [ + "C", + 32, + 1 + ], + [ + "C", + 64, + 1 + ], + [ + "C", + 128, + 1 + ], + [ + "C", + 256, + 1 + ], + [ + "C", + 512, + 1 + ], + [ + "C", + 1024, + 1 + ], + [ + "C", + 2048, + 1 + ], + [ + "C", + 4096, + 1 + ], + [ + "C", + 8192, + 1 + ], + [ + "C", + 16384, + 1 + ], + [ + "C", + 32768, + 1 + ], + [ + "C", + 65536, + 1 + ], + [ + "C", + 131072, + 1 + ], + [ + "C", + 262144, + 1 + ], + [ + "C", + 524288, + 1 + ], + [ + "C", + 1048576, + 1 + ], + [ + "C", + 2097152, + 1 + ], + [ + "C", + 4194304, + 1 + ], + [ + "C", + 8388608, + 1 + ], + [ + "C", + 16777216, + 1 + ], + [ + "C", + 33554432, + 1 + ], + [ + "C", + 67108864, + 1 + ], + [ + "C", + 134217728, + 1 + ], + [ + "C", + 268435456, + 1 + ], + [ + "C", + 536870912, + 1 + ], + [ + "C", + 1073741824, + 1 + ], + [ + "C", + 2147483648, + 1 + ], + [ + "C", + 4294967296, + 1 + ], + [ + "C", + 8589934592, + 1 + ], + [ + "C", + 17179869184, + 1 + ], + [ + "C", + 34359738368, + 1 + ], + [ + "C", + 68719476736, + 1 + ], + [ + "C", + 137438953472, + 1 + ], + [ + "C", + 274877906944, + 1 + ], + [ + "C", + 549755813888, + 1 + ], + [ + "C", + 1099511627776, + 1 + ], + [ + "C", + 2199023255552, + 1 + ], + [ + "C", + 4398046511104, + 1 + ], + [ + "C", + 8796093022208, + 1 + ], + [ + "C", + 17592186044416, + 1 + ], + [ + "C", + 35184372088832, + 1 + ], + [ + "C", + 70368744177664, + 1 + ], + [ + "C", + 140737488355328, + 1 + ], + [ + "C", + 281474976710656, + 1 + ], + [ + "C", + 562949953421312, + 1 + ], + [ + "C", + 1125899906842624, + 1 + ], + [ + "C", + 2251799813685248, + 1 + ], + [ + "C", + 4503599627370496, + 1 + ], + [ + "C", + 9007199254740992, + 1 + ], + [ + "C", + 18014398509481984, + 1 + ], + [ + "C", + 36028797018963968, + 1 + ], + [ + "C", + 72057594037927936, + 1 + ], + [ + "C", + 144115188075855872, + 1 + ], + [ + "C", + 288230376151711744, + 1 + ], + [ + "C", + 576460752303423488, + 1 + ], + [ + "C", + 1152921504606846976, + 1 + ], + [ + "C", + 2305843009213693952, + 1 + ], + [ + "C", + 4611686018427387904, + 1 + ], + [ + "C", + 9223372036854775808, + 1 + ], + [ + "D", + [ + 1, + 2, + 4, + 8, + 16, + 32, + 64, + 128, + 256, + 512, + 1024, + 2048, + 4096, + 8192, + 16384, + 32768, + 65536, + 131072, + 262144, + 524288, + 1048576, + 2097152, + 4194304, + 8388608, + 16777216, + 33554432, + 67108864, + 134217728, + 268435456, + 536870912, + 1073741824, + 2147483648, + 4294967296, + 8589934592, + 17179869184, + 34359738368, + 68719476736, + 137438953472, + 274877906944, + 549755813888, + 1099511627776, + 2199023255552, + 4398046511104, + 8796093022208, + 17592186044416, + 35184372088832, + 70368744177664, + 140737488355328, + 281474976710656, + 562949953421312, + 1125899906842624, + 2251799813685248, + 4503599627370496, + 9007199254740992, + 18014398509481984, + 36028797018963968, + 72057594037927936, + 144115188075855872, + 288230376151711744, + 576460752303423488, + 1152921504606846976, + 2305843009213693952, + 4611686018427387904, + 9223372036854775808 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + ], + "iI": [ + [ + "phase", + 1 + ] + ] + }, + "program": [ + { + "dst": 1, + "op": "query", + "src": 0, + "symbol": "H" + } + ], + "reference": [], + "roles": 2 +} diff --git a/research/clifford-tensor-gram/examples/native-65.certificate.json b/research/clifford-tensor-gram/examples/native-65.certificate.json new file mode 100644 index 0000000000..583db4f717 --- /dev/null +++ b/research/clifford-tensor-gram/examples/native-65.certificate.json @@ -0,0 +1,18 @@ +{ + "axes": 65, + "cutoff": 524, + "decision_widths": [ + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524 + ], + "equivalent_at_all_positive_widths": true, + "nonzero_endpoint_entries": 0, + "problem_sha256": "adfd67b1b9af2f1f70c0cc32e33dd5a98979beb1592b76c11af06f61e4430a30", + "schema": "clifford-tensor-gram/native-v1" +} diff --git a/research/clifford-tensor-gram/examples/native-65.json b/research/clifford-tensor-gram/examples/native-65.json new file mode 100644 index 0000000000..f663e259bd --- /dev/null +++ b/research/clifford-tensor-gram/examples/native-65.json @@ -0,0 +1,632 @@ +{ + "axes": 65, + "operators": { + "H": [ + [ + "D", + [ + 1, + 2, + 4, + 8, + 16, + 32, + 64, + 128, + 256, + 512, + 1024, + 2048, + 4096, + 8192, + 16384, + 32768, + 65536, + 131072, + 262144, + 524288, + 1048576, + 2097152, + 4194304, + 8388608, + 16777216, + 33554432, + 67108864, + 134217728, + 268435456, + 536870912, + 1073741824, + 2147483648, + 4294967296, + 8589934592, + 17179869184, + 34359738368, + 68719476736, + 137438953472, + 274877906944, + 549755813888, + 1099511627776, + 2199023255552, + 4398046511104, + 8796093022208, + 17592186044416, + 35184372088832, + 70368744177664, + 140737488355328, + 281474976710656, + 562949953421312, + 1125899906842624, + 2251799813685248, + 4503599627370496, + 9007199254740992, + 18014398509481984, + 36028797018963968, + 72057594037927936, + 144115188075855872, + 288230376151711744, + 576460752303423488, + 1152921504606846976, + 2305843009213693952, + 4611686018427387904, + 9223372036854775808, + 18446744073709551616 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ], + [ + "C", + 1, + 1 + ], + [ + "C", + 2, + 1 + ], + [ + "C", + 4, + 1 + ], + [ + "C", + 8, + 1 + ], + [ + "C", + 16, + 1 + ], + [ + "C", + 32, + 1 + ], + [ + "C", + 64, + 1 + ], + [ + "C", + 128, + 1 + ], + [ + "C", + 256, + 1 + ], + [ + "C", + 512, + 1 + ], + [ + "C", + 1024, + 1 + ], + [ + "C", + 2048, + 1 + ], + [ + "C", + 4096, + 1 + ], + [ + "C", + 8192, + 1 + ], + [ + "C", + 16384, + 1 + ], + [ + "C", + 32768, + 1 + ], + [ + "C", + 65536, + 1 + ], + [ + "C", + 131072, + 1 + ], + [ + "C", + 262144, + 1 + ], + [ + "C", + 524288, + 1 + ], + [ + "C", + 1048576, + 1 + ], + [ + "C", + 2097152, + 1 + ], + [ + "C", + 4194304, + 1 + ], + [ + "C", + 8388608, + 1 + ], + [ + "C", + 16777216, + 1 + ], + [ + "C", + 33554432, + 1 + ], + [ + "C", + 67108864, + 1 + ], + [ + "C", + 134217728, + 1 + ], + [ + "C", + 268435456, + 1 + ], + [ + "C", + 536870912, + 1 + ], + [ + "C", + 1073741824, + 1 + ], + [ + "C", + 2147483648, + 1 + ], + [ + "C", + 4294967296, + 1 + ], + [ + "C", + 8589934592, + 1 + ], + [ + "C", + 17179869184, + 1 + ], + [ + "C", + 34359738368, + 1 + ], + [ + "C", + 68719476736, + 1 + ], + [ + "C", + 137438953472, + 1 + ], + [ + "C", + 274877906944, + 1 + ], + [ + "C", + 549755813888, + 1 + ], + [ + "C", + 1099511627776, + 1 + ], + [ + "C", + 2199023255552, + 1 + ], + [ + "C", + 4398046511104, + 1 + ], + [ + "C", + 8796093022208, + 1 + ], + [ + "C", + 17592186044416, + 1 + ], + [ + "C", + 35184372088832, + 1 + ], + [ + "C", + 70368744177664, + 1 + ], + [ + "C", + 140737488355328, + 1 + ], + [ + "C", + 281474976710656, + 1 + ], + [ + "C", + 562949953421312, + 1 + ], + [ + "C", + 1125899906842624, + 1 + ], + [ + "C", + 2251799813685248, + 1 + ], + [ + "C", + 4503599627370496, + 1 + ], + [ + "C", + 9007199254740992, + 1 + ], + [ + "C", + 18014398509481984, + 1 + ], + [ + "C", + 36028797018963968, + 1 + ], + [ + "C", + 72057594037927936, + 1 + ], + [ + "C", + 144115188075855872, + 1 + ], + [ + "C", + 288230376151711744, + 1 + ], + [ + "C", + 576460752303423488, + 1 + ], + [ + "C", + 1152921504606846976, + 1 + ], + [ + "C", + 2305843009213693952, + 1 + ], + [ + "C", + 4611686018427387904, + 1 + ], + [ + "C", + 9223372036854775808, + 1 + ], + [ + "C", + 18446744073709551616, + 1 + ], + [ + "D", + [ + 1, + 2, + 4, + 8, + 16, + 32, + 64, + 128, + 256, + 512, + 1024, + 2048, + 4096, + 8192, + 16384, + 32768, + 65536, + 131072, + 262144, + 524288, + 1048576, + 2097152, + 4194304, + 8388608, + 16777216, + 33554432, + 67108864, + 134217728, + 268435456, + 536870912, + 1073741824, + 2147483648, + 4294967296, + 8589934592, + 17179869184, + 34359738368, + 68719476736, + 137438953472, + 274877906944, + 549755813888, + 1099511627776, + 2199023255552, + 4398046511104, + 8796093022208, + 17592186044416, + 35184372088832, + 70368744177664, + 140737488355328, + 281474976710656, + 562949953421312, + 1125899906842624, + 2251799813685248, + 4503599627370496, + 9007199254740992, + 18014398509481984, + 36028797018963968, + 72057594037927936, + 144115188075855872, + 288230376151711744, + 576460752303423488, + 1152921504606846976, + 2305843009213693952, + 4611686018427387904, + 9223372036854775808, + 18446744073709551616 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + ], + "iI": [ + [ + "phase", + 1 + ] + ] + }, + "program": [ + { + "dst": 0, + "op": "apply", + "symbol": "H" + }, + { + "dst": 0, + "op": "apply", + "symbol": "H" + } + ], + "reference": [ + { + "dst": 0, + "op": "apply", + "symbol": "iI" + } + ], + "roles": 2 +} diff --git a/research/clifford-tensor-gram/examples/native-relation.json b/research/clifford-tensor-gram/examples/native-relation.json new file mode 100644 index 0000000000..70c67084e5 --- /dev/null +++ b/research/clifford-tensor-gram/examples/native-relation.json @@ -0,0 +1,65 @@ +{ + "axes": 1, + "operators": { + "C": [ + [ + "1/2+1/2i", + "1/2-1/2i" + ], + [ + "1/2-1/2i", + "1/2+1/2i" + ] + ], + "H": [ + [ + "1/2+1/2i", + "1/2+1/2i" + ], + [ + "1/2+1/2i", + "-1/2-1/2i" + ] + ], + "S": [ + [ + "1", + "0" + ], + [ + "0", + "0+1i" + ] + ], + "iI": [ + [ + "0+1i", + "0" + ], + [ + "0", + "0+1i" + ] + ] + }, + "program": [ + { + "dst": 1, + "op": "apply", + "symbol": "H" + }, + { + "dst": 1, + "op": "apply", + "symbol": "H" + } + ], + "reference": [ + { + "dst": 1, + "op": "apply", + "symbol": "iI" + } + ], + "roles": 3 +} diff --git a/research/clifford-tensor-gram/examples/phase-trap.certificate.json b/research/clifford-tensor-gram/examples/phase-trap.certificate.json new file mode 100644 index 0000000000..ca3a24abcd --- /dev/null +++ b/research/clifford-tensor-gram/examples/phase-trap.certificate.json @@ -0,0 +1,44 @@ +{ + "axes": 1, + "cutoff": 12, + "equivalent_at_all_positive_widths": false, + "failure": { + "coefficient_norm_squared": "2", + "first_nonzero_width": 2, + "input_role": 1, + "normalized_squared_norms": [ + "0", + "2", + "4", + "2", + "0", + "2", + "4", + "2", + "0", + "2", + "4", + "2" + ], + "output_role": 1, + "support": 2, + "trace_buckets": 3, + "witness": { + "discrepancy": "0-2i", + "input_tuple": [ + 0, + 0, + 0 + ], + "output_tuple": [ + 0, + 0, + 0 + ], + "width": 3 + } + }, + "nonzero_endpoint_entries": 1, + "problem_sha256": "940062ace2db113edfadf94db380b7c0c1c44d884037f9d8bb26ae63a5e1e392", + "schema": "clifford-tensor-gram/v1" +} diff --git a/research/clifford-tensor-gram/examples/phase-trap.json b/research/clifford-tensor-gram/examples/phase-trap.json new file mode 100644 index 0000000000..a76136d600 --- /dev/null +++ b/research/clifford-tensor-gram/examples/phase-trap.json @@ -0,0 +1,65 @@ +{ + "axes": 1, + "operators": { + "C": [ + [ + "1/2+1/2i", + "1/2-1/2i" + ], + [ + "1/2-1/2i", + "1/2+1/2i" + ] + ], + "H": [ + [ + "1/2+1/2i", + "1/2+1/2i" + ], + [ + "1/2+1/2i", + "-1/2-1/2i" + ] + ], + "S": [ + [ + "1", + "0" + ], + [ + "0", + "0+1i" + ] + ], + "iI": [ + [ + "0+1i", + "0" + ], + [ + "0", + "0+1i" + ] + ] + }, + "program": [ + { + "dst": 1, + "op": "apply", + "symbol": "H" + }, + { + "dst": 1, + "op": "apply", + "symbol": "H" + } + ], + "reference": [ + { + "coefficient": "i", + "dst": 1, + "op": "scale" + } + ], + "roles": 3 +} diff --git a/research/clifford-tensor-gram/examples/reynolds.certificate.json b/research/clifford-tensor-gram/examples/reynolds.certificate.json new file mode 100644 index 0000000000..f9940e488f --- /dev/null +++ b/research/clifford-tensor-gram/examples/reynolds.certificate.json @@ -0,0 +1,54 @@ +{ + "axes": 1, + "cutoff": 12, + "equivalent_at_all_positive_widths": false, + "failure": { + "coefficient_norm_squared": "1/96", + "first_nonzero_width": 8, + "input_role": 0, + "normalized_squared_norms": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "15/256", + "0", + "0", + "0", + "155/4096" + ], + "output_role": 1, + "support": 96, + "trace_buckets": 13, + "witness": { + "discrepancy": "5/24", + "input_tuple": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "output_tuple": [ + 0, + 1, + 0, + 1, + 0, + 1, + 0, + 1 + ], + "width": 8 + } + }, + "nonzero_endpoint_entries": 1, + "problem_sha256": "c843711bf4c635a80f4d96b711bc224598d2b8aa9c3a50f56b1fc12b18b27e1b", + "schema": "clifford-tensor-gram/v1" +} diff --git a/research/clifford-tensor-gram/examples/reynolds.json b/research/clifford-tensor-gram/examples/reynolds.json new file mode 100644 index 0000000000..8ca3752efe --- /dev/null +++ b/research/clifford-tensor-gram/examples/reynolds.json @@ -0,0 +1,1641 @@ +{ + "axes": 1, + "operators": { + "0": [ + [ + "1", + "0" + ], + [ + "0", + "1" + ] + ], + "1": [ + [ + "1/2+1/2i", + "1/2-1/2i" + ], + [ + "1/2-1/2i", + "1/2+1/2i" + ] + ], + "10": [ + [ + "1/2+1/2i", + "1/2-1/2i" + ], + [ + "-1/2+1/2i", + "-1/2-1/2i" + ] + ], + "11": [ + [ + "0", + "0+1i" + ], + [ + "1", + "0" + ] + ], + "12": [ + [ + "1/2+1/2i", + "-1/2+1/2i" + ], + [ + "1/2-1/2i", + "-1/2-1/2i" + ] + ], + "13": [ + [ + "1", + "0" + ], + [ + "0", + "0-1i" + ] + ], + "14": [ + [ + "1/2-1/2i", + "1/2+1/2i" + ], + [ + "-1/2+1/2i", + "1/2+1/2i" + ] + ], + "15": [ + [ + "1/2+1/2i", + "1/2+1/2i" + ], + [ + "-1/2+1/2i", + "1/2-1/2i" + ] + ], + "16": [ + [ + "0", + "1" + ], + [ + "-1", + "0" + ] + ], + "17": [ + [ + "1/2+1/2i", + "-1/2+1/2i" + ], + [ + "1/2+1/2i", + "1/2-1/2i" + ] + ], + "18": [ + [ + "0+1i", + "0" + ], + [ + "0", + "0-1i" + ] + ], + "19": [ + [ + "1/2+1/2i", + "1/2-1/2i" + ], + [ + "-1/2-1/2i", + "1/2-1/2i" + ] + ], + "2": [ + [ + "1", + "0" + ], + [ + "0", + "0+1i" + ] + ], + "20": [ + [ + "1/2-1/2i", + "-1/2+1/2i" + ], + [ + "1/2+1/2i", + "1/2+1/2i" + ] + ], + "21": [ + [ + "0", + "0+1i" + ], + [ + "0+1i", + "0" + ] + ], + "22": [ + [ + "0", + "-1" + ], + [ + "1", + "0" + ] + ], + "23": [ + [ + "1/2+1/2i", + "-1/2-1/2i" + ], + [ + "1/2-1/2i", + "1/2-1/2i" + ] + ], + "24": [ + [ + "1/2+1/2i", + "1/2+1/2i" + ], + [ + "-1/2-1/2i", + "1/2+1/2i" + ] + ], + "25": [ + [ + "1/2-1/2i", + "1/2+1/2i" + ], + [ + "-1/2-1/2i", + "-1/2+1/2i" + ] + ], + "26": [ + [ + "0+1i", + "0" + ], + [ + "0", + "1" + ] + ], + "27": [ + [ + "-1/2+1/2i", + "1/2+1/2i" + ], + [ + "-1/2-1/2i", + "1/2-1/2i" + ] + ], + "28": [ + [ + "0", + "1" + ], + [ + "0-1i", + "0" + ] + ], + "29": [ + [ + "1/2+1/2i", + "-1/2-1/2i" + ], + [ + "1/2+1/2i", + "1/2+1/2i" + ] + ], + "3": [ + [ + "0", + "1" + ], + [ + "1", + "0" + ] + ], + "30": [ + [ + "1/2+1/2i", + "-1/2+1/2i" + ], + [ + "-1/2+1/2i", + "1/2+1/2i" + ] + ], + "31": [ + [ + "-1/2+1/2i", + "-1/2-1/2i" + ], + [ + "1/2+1/2i", + "1/2-1/2i" + ] + ], + "32": [ + [ + "-1/2+1/2i", + "1/2-1/2i" + ], + [ + "1/2-1/2i", + "1/2-1/2i" + ] + ], + "33": [ + [ + "1/2-1/2i", + "-1/2+1/2i" + ], + [ + "-1/2+1/2i", + "-1/2+1/2i" + ] + ], + "34": [ + [ + "0", + "0+1i" + ], + [ + "-1", + "0" + ] + ], + "35": [ + [ + "1/2-1/2i", + "-1/2-1/2i" + ], + [ + "1/2+1/2i", + "-1/2+1/2i" + ] + ], + "36": [ + [ + "0", + "-1" + ], + [ + "0+1i", + "0" + ] + ], + "37": [ + [ + "0", + "0-1i" + ], + [ + "1", + "0" + ] + ], + "38": [ + [ + "-1/2+1/2i", + "1/2+1/2i" + ], + [ + "1/2-1/2i", + "1/2+1/2i" + ] + ], + "39": [ + [ + "0", + "0+1i" + ], + [ + "0-1i", + "0" + ] + ], + "4": [ + [ + "1/2+1/2i", + "1/2-1/2i" + ], + [ + "1/2+1/2i", + "-1/2+1/2i" + ] + ], + "40": [ + [ + "1/2-1/2i", + "1/2+1/2i" + ], + [ + "1/2-1/2i", + "-1/2-1/2i" + ] + ], + "41": [ + [ + "-1/2+1/2i", + "1/2-1/2i" + ], + [ + "1/2+1/2i", + "1/2+1/2i" + ] + ], + "42": [ + [ + "0+1i", + "0" + ], + [ + "0", + "0+1i" + ] + ], + "43": [ + [ + "-1", + "0" + ], + [ + "0", + "1" + ] + ], + "44": [ + [ + "-1/2-1/2i", + "1/2+1/2i" + ], + [ + "1/2-1/2i", + "1/2-1/2i" + ] + ], + "45": [ + [ + "1/2+1/2i", + "-1/2-1/2i" + ], + [ + "-1/2+1/2i", + "-1/2+1/2i" + ] + ], + "46": [ + [ + "1/2+1/2i", + "-1/2+1/2i" + ], + [ + "-1/2-1/2i", + "-1/2+1/2i" + ] + ], + "47": [ + [ + "0", + "0-1i" + ], + [ + "0+1i", + "0" + ] + ], + "48": [ + [ + "-1/2+1/2i", + "-1/2-1/2i" + ], + [ + "-1/2+1/2i", + "1/2+1/2i" + ] + ], + "49": [ + [ + "-1/2-1/2i", + "1/2-1/2i" + ], + [ + "1/2+1/2i", + "1/2-1/2i" + ] + ], + "5": [ + [ + "1/2+1/2i", + "1/2+1/2i" + ], + [ + "1/2-1/2i", + "-1/2+1/2i" + ] + ], + "50": [ + [ + "1/2-1/2i", + "-1/2+1/2i" + ], + [ + "-1/2-1/2i", + "-1/2-1/2i" + ] + ], + "51": [ + [ + "-1/2+1/2i", + "-1/2+1/2i" + ], + [ + "-1/2-1/2i", + "1/2+1/2i" + ] + ], + "52": [ + [ + "1/2-1/2i", + "-1/2-1/2i" + ], + [ + "-1/2+1/2i", + "-1/2-1/2i" + ] + ], + "53": [ + [ + "0", + "-1" + ], + [ + "-1", + "0" + ] + ], + "54": [ + [ + "1/2-1/2i", + "1/2-1/2i" + ], + [ + "1/2+1/2i", + "-1/2-1/2i" + ] + ], + "55": [ + [ + "-1/2-1/2i", + "1/2+1/2i" + ], + [ + "1/2+1/2i", + "1/2+1/2i" + ] + ], + "56": [ + [ + "-1/2+1/2i", + "1/2+1/2i" + ], + [ + "1/2+1/2i", + "-1/2+1/2i" + ] + ], + "57": [ + [ + "-1/2-1/2i", + "-1/2+1/2i" + ], + [ + "1/2-1/2i", + "1/2+1/2i" + ] + ], + "58": [ + [ + "1/2-1/2i", + "-1/2+1/2i" + ], + [ + "1/2-1/2i", + "1/2-1/2i" + ] + ], + "59": [ + [ + "-1/2+1/2i", + "1/2-1/2i" + ], + [ + "-1/2+1/2i", + "-1/2+1/2i" + ] + ], + "6": [ + [ + "1", + "0" + ], + [ + "0", + "-1" + ] + ], + "60": [ + [ + "0+1i", + "0" + ], + [ + "0", + "-1" + ] + ], + "61": [ + [ + "-1/2-1/2i", + "1/2-1/2i" + ], + [ + "-1/2+1/2i", + "1/2+1/2i" + ] + ], + "62": [ + [ + "-1", + "0" + ], + [ + "0", + "0+1i" + ] + ], + "63": [ + [ + "0-1i", + "0" + ], + [ + "0", + "1" + ] + ], + "64": [ + [ + "1/2+1/2i", + "-1/2-1/2i" + ], + [ + "-1/2-1/2i", + "-1/2-1/2i" + ] + ], + "65": [ + [ + "-1/2+1/2i", + "-1/2+1/2i" + ], + [ + "1/2-1/2i", + "-1/2+1/2i" + ] + ], + "66": [ + [ + "0", + "0-1i" + ], + [ + "-1", + "0" + ] + ], + "67": [ + [ + "-1/2+1/2i", + "-1/2-1/2i" + ], + [ + "-1/2-1/2i", + "-1/2+1/2i" + ] + ], + "68": [ + [ + "1/2-1/2i", + "1/2-1/2i" + ], + [ + "-1/2+1/2i", + "1/2-1/2i" + ] + ], + "69": [ + [ + "0", + "-1" + ], + [ + "0-1i", + "0" + ] + ], + "7": [ + [ + "1/2-1/2i", + "1/2+1/2i" + ], + [ + "1/2+1/2i", + "1/2-1/2i" + ] + ], + "70": [ + [ + "1/2-1/2i", + "-1/2-1/2i" + ], + [ + "-1/2-1/2i", + "1/2-1/2i" + ] + ], + "71": [ + [ + "-1/2-1/2i", + "1/2+1/2i" + ], + [ + "-1/2+1/2i", + "-1/2+1/2i" + ] + ], + "72": [ + [ + "-1/2+1/2i", + "1/2+1/2i" + ], + [ + "-1/2+1/2i", + "-1/2-1/2i" + ] + ], + "73": [ + [ + "0-1i", + "0" + ], + [ + "0", + "0+1i" + ] + ], + "74": [ + [ + "-1/2-1/2i", + "-1/2+1/2i" + ], + [ + "1/2+1/2i", + "-1/2+1/2i" + ] + ], + "75": [ + [ + "1/2-1/2i", + "-1/2-1/2i" + ], + [ + "1/2-1/2i", + "1/2+1/2i" + ] + ], + "76": [ + [ + "-1/2+1/2i", + "1/2-1/2i" + ], + [ + "-1/2-1/2i", + "-1/2-1/2i" + ] + ], + "77": [ + [ + "-1/2+1/2i", + "-1/2+1/2i" + ], + [ + "1/2+1/2i", + "-1/2-1/2i" + ] + ], + "78": [ + [ + "-1/2-1/2i", + "1/2-1/2i" + ], + [ + "-1/2-1/2i", + "-1/2+1/2i" + ] + ], + "79": [ + [ + "-1", + "0" + ], + [ + "0", + "-1" + ] + ], + "8": [ + [ + "0", + "1" + ], + [ + "0+1i", + "0" + ] + ], + "80": [ + [ + "1/2-1/2i", + "1/2-1/2i" + ], + [ + "-1/2-1/2i", + "1/2+1/2i" + ] + ], + "81": [ + [ + "-1/2+1/2i", + "-1/2-1/2i" + ], + [ + "1/2-1/2i", + "-1/2-1/2i" + ] + ], + "82": [ + [ + "0", + "0-1i" + ], + [ + "0-1i", + "0" + ] + ], + "83": [ + [ + "-1/2-1/2i", + "-1/2-1/2i" + ], + [ + "1/2-1/2i", + "-1/2+1/2i" + ] + ], + "84": [ + [ + "-1/2-1/2i", + "1/2+1/2i" + ], + [ + "-1/2-1/2i", + "-1/2-1/2i" + ] + ], + "85": [ + [ + "-1/2+1/2i", + "-1/2+1/2i" + ], + [ + "-1/2+1/2i", + "1/2-1/2i" + ] + ], + "86": [ + [ + "0-1i", + "0" + ], + [ + "0", + "-1" + ] + ], + "87": [ + [ + "-1/2-1/2i", + "-1/2+1/2i" + ], + [ + "-1/2+1/2i", + "-1/2-1/2i" + ] + ], + "88": [ + [ + "1/2-1/2i", + "1/2-1/2i" + ], + [ + "1/2-1/2i", + "-1/2+1/2i" + ] + ], + "89": [ + [ + "-1", + "0" + ], + [ + "0", + "0-1i" + ] + ], + "9": [ + [ + "1/2+1/2i", + "1/2+1/2i" + ], + [ + "1/2+1/2i", + "-1/2-1/2i" + ] + ], + "90": [ + [ + "-1/2-1/2i", + "1/2-1/2i" + ], + [ + "1/2-1/2i", + "-1/2-1/2i" + ] + ], + "91": [ + [ + "-1/2-1/2i", + "-1/2-1/2i" + ], + [ + "1/2+1/2i", + "-1/2-1/2i" + ] + ], + "92": [ + [ + "-1/2-1/2i", + "-1/2+1/2i" + ], + [ + "-1/2-1/2i", + "1/2-1/2i" + ] + ], + "93": [ + [ + "0-1i", + "0" + ], + [ + "0", + "0-1i" + ] + ], + "94": [ + [ + "-1/2-1/2i", + "-1/2-1/2i" + ], + [ + "-1/2+1/2i", + "1/2-1/2i" + ] + ], + "95": [ + [ + "-1/2-1/2i", + "-1/2-1/2i" + ], + [ + "-1/2-1/2i", + "1/2+1/2i" + ] + ] + }, + "program": [ + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "0" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "1" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "2" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "3" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "4" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "5" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "6" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "7" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "8" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "9" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "10" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "11" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "12" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "13" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "14" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "15" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "16" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "17" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "18" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "19" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "20" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "21" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "22" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "23" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "24" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "25" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "26" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "27" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "28" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "29" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "30" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "31" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "32" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "33" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "34" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "35" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "36" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "37" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "38" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "39" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "40" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "41" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "42" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "43" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "44" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "45" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "46" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "47" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "48" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "49" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "50" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "51" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "52" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "53" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "54" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "55" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "56" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "57" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "58" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "59" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "60" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "61" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "62" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "63" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "64" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "65" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "66" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "67" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "68" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "69" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "70" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "71" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "72" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "73" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "74" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "75" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "76" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "77" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "78" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "79" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "80" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "81" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "82" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "83" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "84" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "85" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "86" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "87" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "88" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "89" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "90" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "91" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "92" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "93" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "94" + }, + { + "coefficient": "1/96", + "dst": 1, + "op": "query", + "src": 0, + "symbol": "95" + } + ], + "reference": [], + "roles": 2 +} diff --git a/research/clifford-tensor-gram/provider.py b/research/clifford-tensor-gram/provider.py new file mode 100644 index 0000000000..9faabb34d0 --- /dev/null +++ b/research/clifford-tensor-gram/provider.py @@ -0,0 +1,407 @@ +"""Bind the selected PR4610 local provider to exact native circuits. + +The source word and recipes are data. No source evaluator is imported. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +from collections import Counter +from fractions import Fraction as Q +from functools import lru_cache +import gzip +import hashlib +import json +from pathlib import Path + +from check_witness import need +from quadratic import inverse_circuit, rank + +HERE = Path(__file__).resolve().parent +N, D, PERSISTENT, OWNED = 9, 512, 632, 632 + + +def read_inputs(): + manifest = json.loads((HERE / "provider/SOURCES.json").read_bytes()) + objects = {} + for item in manifest["inputs"]: + raw = (HERE / "provider" / item["file"]).read_bytes() + need(hashlib.sha256(raw).hexdigest() == item["sha256"], "Provider source bytes: " + item["file"]) + payload = gzip.decompress(raw) if item["file"].endswith(".gz") else raw + objects[item["name"]] = ([json.loads(line) for line in payload.splitlines()] + if ".jsonl" in item["file"] else json.loads(payload)) + return manifest, objects + + +def transpose(rows): + return [sum(((row >> j) & 1) << k for k, row in enumerate(rows)) for j in range(N)] + + +def inverse(rows): + work = [v | (1 << (N+j)) for j, v in enumerate(rows)] + for j in range(N): + pivot = next((k for k in range(j, N) if work[k] >> j & 1), None) + need(pivot is not None, "Invertible native address map") + work[j], work[pivot] = work[pivot], work[j] + for k in range(N): + if k != j and work[k] >> j & 1: + work[k] ^= work[j] + return [v >> N for v in work] + + +def native_map(columns): + rows = transpose(columns) + inverse_columns = transpose(inverse(rows)) + quadratic = [(1 << j) ^ sum(((a & b).bit_count() % 2) << k + for k, b in enumerate(inverse_columns)) + for j, a in enumerate(inverse_columns)] + return [["P", rows], ["D", quadratic, [(quadratic[j] >> j) & 1 for j in range(N)]]] + + +def conjugate(circuit): + out = [] + for gate in circuit: + if gate[0] == "D": + out.append(["D", gate[1], [(-a) % 4 for a in gate[2]]]) + elif gate[0] in ("C", "phase"): + out.append(list(gate[:-1]) + [-gate[-1]]) + else: + out.append(gate) + return out + + +def normalizer(rec): + need(set(rec) == {"matrix_rows", "quadratic_rows", "linear_Z4", "offset", "phase"}, + "Complete monomial recipe") + need(type(rec["phase"]) is int and 0 <= rec["phase"] < 4, "Canonical native phase") + return [["D", rec["quadratic_rows"], rec["linear_Z4"]], + ["P", rec["matrix_rows"]], ["X", rec["offset"]], ["phase", rec["phase"]]] + + +def recipe(rec): + need(set(rec) == {"left", "right", "rank"}, "Complete paid recipe") + r = rec["rank"] + need(type(r) is int and 0 <= r <= N, "Recipe rank") + if not r: + need(rec["right"] is None, "Rank-zero recipe shape") + return normalizer(rec["left"]) + return normalizer(rec["right"]) + [["C", 1 << j, 1] for j in range(r)] + normalizer(rec["left"]) + + +class Provider: + def __init__(self, word): + self.word = word + self.c = word["canonical"] + c = self.c + need(c["h"] == N and c["v"] == 112 and len(c["start"]) == len(c["final"]) == PERSISTENT, + "Complete selected local boundary") + need(set(word["programs"]) == {"forward", "backward"}, "Both provider directions") + need(all(len(u) <= N and all(type(x) is int and 0 < x < D for x in u) + and rank(u) == len(u) for u in c["frames"]), "Independent native frame bases") + self.maps = {row["op"]: native_map(row["G_columns"]) for row in c["warps"]} + need(set(self.maps) == set(range(1, 73)) and len(c["warps"]) == 72, "All 72 native maps") + + @lru_cache(None) + def frame(self, index): + basis = self.c["frames"][index] + r = len(basis) + if not r: + return [] + if r == N: + return [["C", 1 << j, 1] for j in range(N)] + extended = [] + for v in basis + [1 << j for j in range(N)]: + if rank(extended + [v]) > len(extended): + extended.append(v) + change = native_map(extended) + return inverse_circuit(N, change) + [["C", 1 << j, 1] for j in range(r)] + change + + def edge(self, a, b, direction): + circuit = inverse_circuit(N, self.frame(a)) + self.frame(b) + return conjugate(circuit) if direction == "backward" else circuit + + def warp(self, signed, a, b, direction): + middle = self.maps[abs(signed)] + if signed < 0: + middle = inverse_circuit(N, middle) + circuit = inverse_circuit(N, self.frame(a)) + middle + self.frame(b) + return conjugate(circuit) if direction == "backward" else circuit + + def old_frame(self, role, entrance): + if role >= 224: + return self.frame(self.c["start" if entrance else "final"][role]) + if entrance: + return [["C", self.c["ports"][role], 1]] if role < 112 else [] + return self.frame(1) if role < 112 else [["C", self.c["ports"][role-112], -1]] + self.frame(1) + + def audit_word(self, direction): + """Check every event, frame contact, owned lifetime and paid charge.""" + c, program = self.c, self.word["programs"][direction] + current = list(c["start"]) + [None] + live, paid, counts, adapters, pairs, warps = False, Counter(), Counter(), {}, {}, set() + contacts = {r: [] for r in range(224)} + for j, event in enumerate(program): + kind = event[0] + counts[kind] += 1 + if kind in ("climb", "center"): + if kind == "climb": + _, _, target, a, b, r = event + need(0 <= target < PERSISTENT and not live, "Persistent climb at a closed owned cut") + need(len(c["frames"][b]) > len(c["frames"][a]), "Ascending persistent edge") + else: + _, target, a, b, r = event + need(target == 0 and live, "Live owned center") + target = OWNED + u, v = c["frames"][a], c["frames"][b] + need(current[target] == a and r == abs(len(u)-len(v)) > 0 + and rank(u+v) == max(len(u), len(v)), "Chronological nested paid edge") + current[target] = b + if target < 224: + contacts[target].append(j) + paid[r] += 1 + pairs[a, b] = r + elif kind == "warp": + _, register, signed, a, b = event + target = role(register) + if target < 224: + contacts[target].append(j) + need(current[target] == a and abs(signed) in self.maps, "Chronological signed warp") + rows = transpose(next(row["G_columns"] for row in c["warps"] if row["op"] == abs(signed))) + if signed < 0: + rows = inverse(rows) + mapped = [sum(((v & row).bit_count() % 2) << k for k, row in enumerate(rows)) + for v in c["frames"][a]] + need(rank(mapped+c["frames"][b]) == len(mapped) == len(c["frames"][b]), + "Actual signed warp transports its source subspace") + current[target] = b + warps.add((signed, a, b)) + elif kind == "scalar": + gate, f = event[1:] + target = role(gate[1]) + if target < 224: + contacts[target].append(j) + op = gate[0] + if op in ("clear", "copy"): + need(target == OWNED, "Only owned storage can be overwritten") + if op == "clear": + live = False + current[target] = f + continue + need(current[target] == f, "Scalar receiver frame") + if op in ("add", "copy"): + source = role(gate[2]) + if source < 224: + contacts[source].append(j) + need(source != target and current[source] == f, "Scalar source frame") + need(source != OWNED or live, "Owned source is initialized") + if op == "copy": + need(not live, "Copy starts an owned lifetime") + live = True + else: + q = Q(gate[3], gate[4]) + need(q and q.denominator & (q.denominator-1) == 0, "Nonzero dyadic shear") + if target == OWNED: + live = True + else: + need(op == "scale", "Known scalar operation") + q = Q(gate[2], gate[3]) + a = abs(q.numerator) + need(a and a & (a-1) == 0 and q.denominator & (q.denominator-1) == 0, + "Invertible dyadic scale") + elif kind == "adapter": + _, side, target, f = event + need(0 <= target < 224 and side in ("old_to_new", "new_to_old"), "Main adapter domain") + entrance = side == "old_to_new" + need(f == c["start" if entrance else "final"][target], "Exact main adapter boundary") + need(current[target] == f or self.old_frame(target, entrance) == self.frame(f), + "A moved adapter must be exactly the identity") + need((side, target) not in adapters, "No repeated main adapter") + adapters[side, target] = j + else: + need(kind == "phase", "Known provider event") + need(not live and current[:PERSISTENT] == c["final"], "Complete final frame and owned return") + need(set(adapters) == {(side, r) for side in ("old_to_new", "new_to_old") for r in range(224)}, + "All 448 main adapter events") + for (side, target), position in adapters.items(): + entrance = side == "old_to_new" + f = c["start" if entrance else "final"][target] + if self.old_frame(target, entrance) != self.frame(f): + need(all(position < j if entrance else j < position for j in contacts[target]), + "Nonidentity adapters surround every use of their role") + need(dict(paid) == {int(k): v for k, v in c["local_profile"].items()}, "Complete paid profile") + return dict(events=dict(counts), paid=dict(sorted(paid.items())), pairs=pairs, warps=warps) + + def problem(self, direction): + """Expand every physical event and keep all 633 input and return roles.""" + bank = {} + + def put(name, circuit): + if not circuit: + return None + oriented = conjugate(circuit) if direction == "backward" else circuit + need(name not in bank or bank[name] == oriented, "One circuit per symbol") + bank[name] = oriented + return name + + def frame(index): + return put("frame_" + str(index), self.frame(index)) + + def old(register, entrance): + circuit = self.old_frame(register, entrance) + index = self.c["start" if entrance else "final"][register] + if circuit == self.frame(index): + return frame(index) + return put(("entrance_" if entrance else "exit_") + str(register), circuit) + + def apply(out, target, symbol, inverse=False): + if symbol is not None: + out.append(dict(op="apply", dst=target, symbol=symbol, inverse=inverse)) + + program = [] + offsets = [] + for event in self.word["programs"][direction]: + offsets.append(len(program)) + kind = event[0] + if kind in ("climb", "center", "warp"): + if kind == "climb": + target, a, b = event[2:5] + elif kind == "center": + target, a, b = OWNED, event[2], event[3] + else: + target, signed, a, b = role(event[1]), *event[2:] + apply(program, target, frame(a), True) + if kind == "warp": + apply(program, target, put("warp_" + str(abs(signed)), self.maps[abs(signed)]), signed < 0) + apply(program, target, frame(b)) + elif kind == "adapter": + _, side, target, f = event + if side == "old_to_new": + apply(program, target, old(target, True), True) + apply(program, target, frame(f)) + else: + apply(program, target, frame(f), True) + apply(program, target, old(target, False)) + elif kind == "scalar": + gate = event[1] + target, op = role(gate[1]), gate[0] + if op in ("clear", "copy"): + program.append(dict(op="scale", dst=target, coefficient="0")) + if op in ("copy", "add"): + program.append(dict(op="add", dst=target, src=role(gate[2]), + coefficient=str(Q(1) if op == "copy" else Q(gate[3], gate[4])))) + elif op == "scale": + program.append(dict(op="scale", dst=target, coefficient=str(Q(gate[2], gate[3])))) + else: + need(kind == "phase", "Known physical program marker") + offsets.append(len(program)) + reference = [] + for register in range(PERSISTENT): + apply(reference, register, old(register, True), True) + for j in range(112): + source, target, sign = (112+j, j, -1) if direction == "backward" else (j, 112+j, 1) + reference.append(dict(op="add", dst=target, src=source, coefficient=str(sign))) + for register in range(PERSISTENT): + apply(reference, register, old(register, False)) + reference.append(dict(op="scale", dst=OWNED, coefficient="0")) + return dict(axes=N, roles=PERSISTENT+1, operators=bank, program=program, reference=reference), offsets + + +def role(register): + need(type(register) is list and len(register) == 2, "Register syntax") + tag, index = register + need(type(index) is int and ((tag == "L" and 0 <= index < PERSISTENT) or (tag == "C" and index == 0)), + "Register domain") + return index if tag == "L" else OWNED + + +def add(target, source, coefficient=Q(1)): + for key, value in tuple(source.items()): + value = target.get(key, Q(0)) + coefficient*value + if value: + target[key] = value + else: + target.pop(key, None) + + +def append_letter(word, letter, right=False): + if right: + return word[:-1] if word and word[-1] == -letter else word + (letter,) + return word[1:] if word and word[0] == -letter else (letter,) + word + + +def interval(program, first, second, register, transpose_row=False): + """Compute one full row or column of the logical interval matrix.""" + rows = [{} for _ in range(PERSISTENT+1)] + rows[register][()] = Q(1) + events = program[first+1:second] + for event in reversed(events) if transpose_row else events: + kind = event[0] + if kind == "warp": + target, signed = role(event[1]), event[2] + rows[target] = {append_letter(w, signed, transpose_row): q for w, q in rows[target].items()} + elif kind == "scalar": + gate = event[1] + target, op = role(gate[1]), gate[0] + if op == "clear": + rows[target] = {} + elif op == "copy": + source = role(gate[2]) + if transpose_row: + add(rows[source], rows[target]) + rows[target] = {} + else: + rows[target] = rows[source].copy() + elif op == "add": + source, q = role(gate[2]), Q(gate[3], gate[4]) + add(rows[source], rows[target], q) if transpose_row else add(rows[target], rows[source], q) + else: + need(op == "scale", "Known interval scalar") + q = Q(gate[2], gate[3]) + rows[target] = {w: q*v for w, v in rows[target].items()} + return rows[:PERSISTENT] + + +def fusion_pairs(program): + previous, out = {}, [] + for j, event in enumerate(program): + if event[0] != "climb": + continue + target = event[2] + for k, earlier in previous.get(target, []): + out.append((k, j, target, earlier[3], earlier[4], event[3], event[4])) + previous.setdefault(target, []).append((j, event)) + return out + + +def contact_witness(program, pair): + first, second, target, a, b, c, d = pair + for transposed in (False, True): + rows = interval(program, first, second, target, transposed) + for other, entry in enumerate(rows): + if other != target and len(entry) == 1: + word, coefficient = next(iter(entry.items())) + return dict(first=first, second=second, role=target, frames=[a, b, c, d], + ranks=[program[first][5], program[second][5]], + output=target if transposed else other, input=other if transposed else target, + coefficient=str(coefficient), word=list(word)) + raise ValueError("No single-term contact certificate for " + str(pair)) + + +def complete_endpoint(problem, instructions): + """Expand all independent inputs together. Coefficients remain rational.""" + symbols = {name: j+1 for j, name in enumerate(problem["operators"])} + rows = [{(j, ()): Q(1)} for j in range(problem["roles"])] + total = peak_total = problem["roles"] + peak_row = 1 + for instruction in instructions: + target, op = instruction["dst"], instruction["op"] + total -= len(rows[target]) + if op == "apply": + signed = symbols[instruction["symbol"]] * (-1 if instruction.get("inverse", False) else 1) + rows[target] = {(entry, append_letter(word, signed)): q for (entry, word), q in rows[target].items()} + elif op == "add": + add(rows[target], rows[instruction["src"]], Q(instruction["coefficient"])) + else: + need(op == "scale", "Known complete program instruction") + q = Q(instruction["coefficient"]) + rows[target] = {key: q*value for key, value in rows[target].items()} if q else {} + total += len(rows[target]) + peak_total, peak_row = max(peak_total, total), max(peak_row, len(rows[target])) + return rows, dict(peak_total_terms=peak_total, peak_row_terms=peak_row, final_terms=total) diff --git a/research/clifford-tensor-gram/provider/FUSIONS.json.gz b/research/clifford-tensor-gram/provider/FUSIONS.json.gz new file mode 100644 index 0000000000..895c0d4c4a Binary files /dev/null and b/research/clifford-tensor-gram/provider/FUSIONS.json.gz differ diff --git a/research/clifford-tensor-gram/provider/HELPERS.json.gz b/research/clifford-tensor-gram/provider/HELPERS.json.gz new file mode 100644 index 0000000000..0910f74138 Binary files /dev/null and b/research/clifford-tensor-gram/provider/HELPERS.json.gz differ diff --git a/research/clifford-tensor-gram/provider/MAIN-ADAPTERS.json b/research/clifford-tensor-gram/provider/MAIN-ADAPTERS.json new file mode 100644 index 0000000000..ffb5bc17c4 --- /dev/null +++ b/research/clifford-tensor-gram/provider/MAIN-ADAPTERS.json @@ -0,0 +1 @@ +[{"entrance":true,"frame":2,"recipe":{"left":{"linear_Z4":[1,1,0,0,0,0,0,0,0],"matrix_rows":[2,1,4,11,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[3,3,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":0},{"entrance":true,"frame":3,"recipe":{"left":{"linear_Z4":[1,1,0,0,0,0,0,0,0],"matrix_rows":[2,1,4,8,19,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[3,3,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":1},{"entrance":true,"frame":4,"recipe":{"left":{"linear_Z4":[1,1,0,0,0,0,0,0,0],"matrix_rows":[2,1,4,8,16,35,64,128,256],"offset":0,"phase":0,"quadratic_rows":[3,3,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":2},{"entrance":true,"frame":5,"recipe":{"left":{"linear_Z4":[1,1,0,0,0,0,0,0,0],"matrix_rows":[2,1,4,8,16,32,67,128,256],"offset":0,"phase":0,"quadratic_rows":[3,3,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":3},{"entrance":true,"frame":6,"recipe":{"left":{"linear_Z4":[1,1,0,0,0,0,0,0,0],"matrix_rows":[2,1,4,8,16,32,64,131,256],"offset":0,"phase":0,"quadratic_rows":[3,3,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":4},{"entrance":true,"frame":7,"recipe":{"left":{"linear_Z4":[1,1,0,0,0,0,0,0,0],"matrix_rows":[2,1,4,8,16,32,64,128,259],"offset":0,"phase":0,"quadratic_rows":[3,3,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":5},{"entrance":true,"frame":8,"recipe":{"left":{"linear_Z4":[1,0,1,0,0,0,0,0,0],"matrix_rows":[4,2,1,13,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[5,0,5,0,0,0,0,0,0]},"rank":0,"right":null},"role":6},{"entrance":true,"frame":9,"recipe":{"left":{"linear_Z4":[1,0,1,0,0,0,0,0,0],"matrix_rows":[4,2,1,8,21,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[5,0,5,0,0,0,0,0,0]},"rank":0,"right":null},"role":7},{"entrance":true,"frame":10,"recipe":{"left":{"linear_Z4":[1,0,1,0,0,0,0,0,0],"matrix_rows":[4,2,1,8,16,37,64,128,256],"offset":0,"phase":0,"quadratic_rows":[5,0,5,0,0,0,0,0,0]},"rank":0,"right":null},"role":8},{"entrance":true,"frame":11,"recipe":{"left":{"linear_Z4":[1,0,1,0,0,0,0,0,0],"matrix_rows":[4,2,1,8,16,32,69,128,256],"offset":0,"phase":0,"quadratic_rows":[5,0,5,0,0,0,0,0,0]},"rank":0,"right":null},"role":9},{"entrance":true,"frame":12,"recipe":{"left":{"linear_Z4":[1,0,1,0,0,0,0,0,0],"matrix_rows":[4,2,1,8,16,32,64,133,256],"offset":0,"phase":0,"quadratic_rows":[5,0,5,0,0,0,0,0,0]},"rank":0,"right":null},"role":10},{"entrance":true,"frame":13,"recipe":{"left":{"linear_Z4":[1,0,1,0,0,0,0,0,0],"matrix_rows":[4,2,1,8,16,32,64,128,261],"offset":0,"phase":0,"quadratic_rows":[5,0,5,0,0,0,0,0,0]},"rank":0,"right":null},"role":11},{"entrance":true,"frame":14,"recipe":{"left":{"linear_Z4":[1,0,0,1,0,0,0,0,0],"matrix_rows":[8,2,4,1,16,41,64,128,256],"offset":0,"phase":0,"quadratic_rows":[9,0,0,9,0,0,0,0,0]},"rank":0,"right":null},"role":12},{"entrance":true,"frame":15,"recipe":{"left":{"linear_Z4":[1,0,0,1,0,0,0,0,0],"matrix_rows":[8,2,4,1,16,32,73,128,256],"offset":0,"phase":0,"quadratic_rows":[9,0,0,9,0,0,0,0,0]},"rank":0,"right":null},"role":13},{"entrance":true,"frame":16,"recipe":{"left":{"linear_Z4":[1,0,0,1,0,0,0,0,0],"matrix_rows":[8,2,4,1,16,32,64,137,256],"offset":0,"phase":0,"quadratic_rows":[9,0,0,9,0,0,0,0,0]},"rank":0,"right":null},"role":14},{"entrance":true,"frame":17,"recipe":{"left":{"linear_Z4":[1,0,0,1,0,0,0,0,0],"matrix_rows":[8,2,4,1,16,32,64,128,265],"offset":0,"phase":0,"quadratic_rows":[9,0,0,9,0,0,0,0,0]},"rank":0,"right":null},"role":15},{"entrance":true,"frame":18,"recipe":{"left":{"linear_Z4":[1,0,0,0,1,0,0,0,0],"matrix_rows":[16,2,4,8,1,49,64,128,256],"offset":0,"phase":0,"quadratic_rows":[17,0,0,0,17,0,0,0,0]},"rank":0,"right":null},"role":16},{"entrance":true,"frame":19,"recipe":{"left":{"linear_Z4":[1,0,0,0,1,0,0,0,0],"matrix_rows":[16,2,4,8,1,32,81,128,256],"offset":0,"phase":0,"quadratic_rows":[17,0,0,0,17,0,0,0,0]},"rank":0,"right":null},"role":17},{"entrance":true,"frame":20,"recipe":{"left":{"linear_Z4":[1,0,0,0,1,0,0,0,0],"matrix_rows":[16,2,4,8,1,32,64,145,256],"offset":0,"phase":0,"quadratic_rows":[17,0,0,0,17,0,0,0,0]},"rank":0,"right":null},"role":18},{"entrance":true,"frame":21,"recipe":{"left":{"linear_Z4":[1,0,0,0,1,0,0,0,0],"matrix_rows":[16,2,4,8,1,32,64,128,273],"offset":0,"phase":0,"quadratic_rows":[17,0,0,0,17,0,0,0,0]},"rank":0,"right":null},"role":19},{"entrance":true,"frame":22,"recipe":{"left":{"linear_Z4":[1,0,0,0,0,1,0,0,0],"matrix_rows":[32,2,4,8,16,1,64,161,256],"offset":0,"phase":0,"quadratic_rows":[33,0,0,0,0,33,0,0,0]},"rank":0,"right":null},"role":20},{"entrance":true,"frame":23,"recipe":{"left":{"linear_Z4":[1,0,0,0,0,1,0,0,0],"matrix_rows":[32,2,4,8,16,1,64,128,289],"offset":0,"phase":0,"quadratic_rows":[33,0,0,0,0,33,0,0,0]},"rank":0,"right":null},"role":21},{"entrance":true,"frame":24,"recipe":{"left":{"linear_Z4":[1,0,0,0,0,0,1,0,0],"matrix_rows":[64,2,4,8,16,32,1,193,256],"offset":0,"phase":0,"quadratic_rows":[65,0,0,0,0,0,65,0,0]},"rank":0,"right":null},"role":22},{"entrance":true,"frame":25,"recipe":{"left":{"linear_Z4":[1,0,0,0,0,0,1,0,0],"matrix_rows":[64,2,4,8,16,32,1,128,321],"offset":0,"phase":0,"quadratic_rows":[65,0,0,0,0,0,65,0,0]},"rank":0,"right":null},"role":23},{"entrance":true,"frame":26,"recipe":{"left":{"linear_Z4":[1,0,0,0,0,0,0,1,0],"matrix_rows":[128,2,4,8,16,32,64,1,385],"offset":0,"phase":0,"quadratic_rows":[129,0,0,0,0,0,0,129,0]},"rank":0,"right":null},"role":24},{"entrance":true,"frame":27,"recipe":{"left":{"linear_Z4":[0,1,1,0,0,0,0,0,0],"matrix_rows":[1,4,2,14,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,6,6,0,0,0,0,0,0]},"rank":0,"right":null},"role":25},{"entrance":true,"frame":28,"recipe":{"left":{"linear_Z4":[0,1,1,0,0,0,0,0,0],"matrix_rows":[1,4,2,8,22,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,6,6,0,0,0,0,0,0]},"rank":0,"right":null},"role":26},{"entrance":true,"frame":29,"recipe":{"left":{"linear_Z4":[0,1,1,0,0,0,0,0,0],"matrix_rows":[1,4,2,8,16,38,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,6,6,0,0,0,0,0,0]},"rank":0,"right":null},"role":27},{"entrance":true,"frame":30,"recipe":{"left":{"linear_Z4":[0,1,1,0,0,0,0,0,0],"matrix_rows":[1,4,2,8,16,32,70,128,256],"offset":0,"phase":0,"quadratic_rows":[0,6,6,0,0,0,0,0,0]},"rank":0,"right":null},"role":28},{"entrance":true,"frame":31,"recipe":{"left":{"linear_Z4":[0,1,1,0,0,0,0,0,0],"matrix_rows":[1,4,2,8,16,32,64,134,256],"offset":0,"phase":0,"quadratic_rows":[0,6,6,0,0,0,0,0,0]},"rank":0,"right":null},"role":29},{"entrance":true,"frame":32,"recipe":{"left":{"linear_Z4":[0,1,1,0,0,0,0,0,0],"matrix_rows":[1,4,2,8,16,32,64,128,262],"offset":0,"phase":0,"quadratic_rows":[0,6,6,0,0,0,0,0,0]},"rank":0,"right":null},"role":30},{"entrance":true,"frame":33,"recipe":{"left":{"linear_Z4":[0,1,0,1,0,0,0,0,0],"matrix_rows":[1,8,4,2,26,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,10,0,10,0,0,0,0,0]},"rank":0,"right":null},"role":31},{"entrance":true,"frame":34,"recipe":{"left":{"linear_Z4":[0,1,0,1,0,0,0,0,0],"matrix_rows":[1,8,4,2,16,32,74,128,256],"offset":0,"phase":0,"quadratic_rows":[0,10,0,10,0,0,0,0,0]},"rank":0,"right":null},"role":32},{"entrance":true,"frame":35,"recipe":{"left":{"linear_Z4":[0,1,0,1,0,0,0,0,0],"matrix_rows":[1,8,4,2,16,32,64,138,256],"offset":0,"phase":0,"quadratic_rows":[0,10,0,10,0,0,0,0,0]},"rank":0,"right":null},"role":33},{"entrance":true,"frame":36,"recipe":{"left":{"linear_Z4":[0,1,0,1,0,0,0,0,0],"matrix_rows":[1,8,4,2,16,32,64,128,266],"offset":0,"phase":0,"quadratic_rows":[0,10,0,10,0,0,0,0,0]},"rank":0,"right":null},"role":34},{"entrance":true,"frame":37,"recipe":{"left":{"linear_Z4":[0,1,0,0,1,0,0,0,0],"matrix_rows":[1,16,4,8,2,50,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,18,0,0,18,0,0,0,0]},"rank":0,"right":null},"role":35},{"entrance":true,"frame":38,"recipe":{"left":{"linear_Z4":[0,1,0,0,1,0,0,0,0],"matrix_rows":[1,16,4,8,2,32,64,146,256],"offset":0,"phase":0,"quadratic_rows":[0,18,0,0,18,0,0,0,0]},"rank":0,"right":null},"role":36},{"entrance":true,"frame":39,"recipe":{"left":{"linear_Z4":[0,1,0,0,1,0,0,0,0],"matrix_rows":[1,16,4,8,2,32,64,128,274],"offset":0,"phase":0,"quadratic_rows":[0,18,0,0,18,0,0,0,0]},"rank":0,"right":null},"role":37},{"entrance":true,"frame":40,"recipe":{"left":{"linear_Z4":[0,1,0,0,0,1,0,0,0],"matrix_rows":[1,32,4,8,16,2,98,128,256],"offset":0,"phase":0,"quadratic_rows":[0,34,0,0,0,34,0,0,0]},"rank":0,"right":null},"role":38},{"entrance":true,"frame":41,"recipe":{"left":{"linear_Z4":[0,1,0,0,0,1,0,0,0],"matrix_rows":[1,32,4,8,16,2,64,162,256],"offset":0,"phase":0,"quadratic_rows":[0,34,0,0,0,34,0,0,0]},"rank":0,"right":null},"role":39},{"entrance":true,"frame":42,"recipe":{"left":{"linear_Z4":[0,1,0,0,0,1,0,0,0],"matrix_rows":[1,32,4,8,16,2,64,128,290],"offset":0,"phase":0,"quadratic_rows":[0,34,0,0,0,34,0,0,0]},"rank":0,"right":null},"role":40},{"entrance":true,"frame":43,"recipe":{"left":{"linear_Z4":[0,1,0,0,0,0,1,0,0],"matrix_rows":[1,64,4,8,16,32,2,194,256],"offset":0,"phase":0,"quadratic_rows":[0,66,0,0,0,0,66,0,0]},"rank":0,"right":null},"role":41},{"entrance":true,"frame":44,"recipe":{"left":{"linear_Z4":[0,1,0,0,0,0,1,0,0],"matrix_rows":[1,64,4,8,16,32,2,128,322],"offset":0,"phase":0,"quadratic_rows":[0,66,0,0,0,0,66,0,0]},"rank":0,"right":null},"role":42},{"entrance":true,"frame":45,"recipe":{"left":{"linear_Z4":[0,1,0,0,0,0,0,1,0],"matrix_rows":[1,128,4,8,16,32,64,2,386],"offset":0,"phase":0,"quadratic_rows":[0,130,0,0,0,0,0,130,0]},"rank":0,"right":null},"role":43},{"entrance":true,"frame":46,"recipe":{"left":{"linear_Z4":[0,0,1,1,0,0,0,0,0],"matrix_rows":[1,2,8,4,28,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,12,12,0,0,0,0,0]},"rank":0,"right":null},"role":44},{"entrance":true,"frame":47,"recipe":{"left":{"linear_Z4":[0,0,1,1,0,0,0,0,0],"matrix_rows":[1,2,8,4,16,44,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,12,12,0,0,0,0,0]},"rank":0,"right":null},"role":45},{"entrance":true,"frame":48,"recipe":{"left":{"linear_Z4":[0,0,1,1,0,0,0,0,0],"matrix_rows":[1,2,8,4,16,32,64,140,256],"offset":0,"phase":0,"quadratic_rows":[0,0,12,12,0,0,0,0,0]},"rank":0,"right":null},"role":46},{"entrance":true,"frame":49,"recipe":{"left":{"linear_Z4":[0,0,1,1,0,0,0,0,0],"matrix_rows":[1,2,8,4,16,32,64,128,268],"offset":0,"phase":0,"quadratic_rows":[0,0,12,12,0,0,0,0,0]},"rank":0,"right":null},"role":47},{"entrance":true,"frame":50,"recipe":{"left":{"linear_Z4":[0,0,1,0,1,0,0,0,0],"matrix_rows":[1,2,16,8,4,32,84,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,20,0,20,0,0,0,0]},"rank":0,"right":null},"role":48},{"entrance":true,"frame":51,"recipe":{"left":{"linear_Z4":[0,0,1,0,1,0,0,0,0],"matrix_rows":[1,2,16,8,4,32,64,148,256],"offset":0,"phase":0,"quadratic_rows":[0,0,20,0,20,0,0,0,0]},"rank":0,"right":null},"role":49},{"entrance":true,"frame":52,"recipe":{"left":{"linear_Z4":[0,0,1,0,1,0,0,0,0],"matrix_rows":[1,2,16,8,4,32,64,128,276],"offset":0,"phase":0,"quadratic_rows":[0,0,20,0,20,0,0,0,0]},"rank":0,"right":null},"role":50},{"entrance":true,"frame":53,"recipe":{"left":{"linear_Z4":[0,0,1,0,0,1,0,0,0],"matrix_rows":[1,2,32,8,16,4,100,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,36,0,0,36,0,0,0]},"rank":0,"right":null},"role":51},{"entrance":true,"frame":54,"recipe":{"left":{"linear_Z4":[0,0,1,0,0,1,0,0,0],"matrix_rows":[1,2,32,8,16,4,64,164,256],"offset":0,"phase":0,"quadratic_rows":[0,0,36,0,0,36,0,0,0]},"rank":0,"right":null},"role":52},{"entrance":true,"frame":55,"recipe":{"left":{"linear_Z4":[0,0,1,0,0,1,0,0,0],"matrix_rows":[1,2,32,8,16,4,64,128,292],"offset":0,"phase":0,"quadratic_rows":[0,0,36,0,0,36,0,0,0]},"rank":0,"right":null},"role":53},{"entrance":true,"frame":56,"recipe":{"left":{"linear_Z4":[0,0,1,0,0,0,1,0,0],"matrix_rows":[1,2,64,8,16,32,4,196,256],"offset":0,"phase":0,"quadratic_rows":[0,0,68,0,0,0,68,0,0]},"rank":0,"right":null},"role":54},{"entrance":true,"frame":57,"recipe":{"left":{"linear_Z4":[0,0,1,0,0,0,1,0,0],"matrix_rows":[1,2,64,8,16,32,4,128,324],"offset":0,"phase":0,"quadratic_rows":[0,0,68,0,0,0,68,0,0]},"rank":0,"right":null},"role":55},{"entrance":true,"frame":58,"recipe":{"left":{"linear_Z4":[0,0,1,0,0,0,0,1,0],"matrix_rows":[1,2,128,8,16,32,64,4,388],"offset":0,"phase":0,"quadratic_rows":[0,0,132,0,0,0,0,132,0]},"rank":0,"right":null},"role":56},{"entrance":true,"frame":59,"recipe":{"left":{"linear_Z4":[0,0,0,1,1,0,0,0,0],"matrix_rows":[1,2,4,16,8,56,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,24,24,0,0,0,0]},"rank":0,"right":null},"role":57},{"entrance":true,"frame":60,"recipe":{"left":{"linear_Z4":[0,0,0,1,1,0,0,0,0],"matrix_rows":[1,2,4,16,8,32,88,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,24,24,0,0,0,0]},"rank":0,"right":null},"role":58},{"entrance":true,"frame":61,"recipe":{"left":{"linear_Z4":[0,0,0,1,1,0,0,0,0],"matrix_rows":[1,2,4,16,8,32,64,152,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,24,24,0,0,0,0]},"rank":0,"right":null},"role":59},{"entrance":true,"frame":62,"recipe":{"left":{"linear_Z4":[0,0,0,1,1,0,0,0,0],"matrix_rows":[1,2,4,16,8,32,64,128,280],"offset":0,"phase":0,"quadratic_rows":[0,0,0,24,24,0,0,0,0]},"rank":0,"right":null},"role":60},{"entrance":true,"frame":63,"recipe":{"left":{"linear_Z4":[0,0,0,1,0,1,0,0,0],"matrix_rows":[1,2,4,32,16,8,104,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,40,0,40,0,0,0]},"rank":0,"right":null},"role":61},{"entrance":true,"frame":64,"recipe":{"left":{"linear_Z4":[0,0,0,1,0,1,0,0,0],"matrix_rows":[1,2,4,32,16,8,64,168,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,40,0,40,0,0,0]},"rank":0,"right":null},"role":62},{"entrance":true,"frame":65,"recipe":{"left":{"linear_Z4":[0,0,0,1,0,1,0,0,0],"matrix_rows":[1,2,4,32,16,8,64,128,296],"offset":0,"phase":0,"quadratic_rows":[0,0,0,40,0,40,0,0,0]},"rank":0,"right":null},"role":63},{"entrance":true,"frame":66,"recipe":{"left":{"linear_Z4":[0,0,0,1,0,0,1,0,0],"matrix_rows":[1,2,4,64,16,32,8,200,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,72,0,0,72,0,0]},"rank":0,"right":null},"role":64},{"entrance":true,"frame":67,"recipe":{"left":{"linear_Z4":[0,0,0,1,0,0,1,0,0],"matrix_rows":[1,2,4,64,16,32,8,128,328],"offset":0,"phase":0,"quadratic_rows":[0,0,0,72,0,0,72,0,0]},"rank":0,"right":null},"role":65},{"entrance":true,"frame":68,"recipe":{"left":{"linear_Z4":[0,0,0,1,0,0,0,1,0],"matrix_rows":[1,2,4,128,16,32,64,8,392],"offset":0,"phase":0,"quadratic_rows":[0,0,0,136,0,0,0,136,0]},"rank":0,"right":null},"role":66},{"entrance":true,"frame":69,"recipe":{"left":{"linear_Z4":[0,0,0,0,1,1,0,0,0],"matrix_rows":[1,2,4,8,32,16,112,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,48,48,0,0,0]},"rank":0,"right":null},"role":67},{"entrance":true,"frame":70,"recipe":{"left":{"linear_Z4":[0,0,0,0,1,1,0,0,0],"matrix_rows":[1,2,4,8,32,16,64,176,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,48,48,0,0,0]},"rank":0,"right":null},"role":68},{"entrance":true,"frame":71,"recipe":{"left":{"linear_Z4":[0,0,0,0,1,1,0,0,0],"matrix_rows":[1,2,4,8,32,16,64,128,304],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,48,48,0,0,0]},"rank":0,"right":null},"role":69},{"entrance":true,"frame":72,"recipe":{"left":{"linear_Z4":[0,0,0,0,1,0,1,0,0],"matrix_rows":[1,2,4,8,64,32,16,208,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,80,0,80,0,0]},"rank":0,"right":null},"role":70},{"entrance":true,"frame":73,"recipe":{"left":{"linear_Z4":[0,0,0,0,1,0,1,0,0],"matrix_rows":[1,2,4,8,64,32,16,128,336],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,80,0,80,0,0]},"rank":0,"right":null},"role":71},{"entrance":true,"frame":74,"recipe":{"left":{"linear_Z4":[0,0,0,0,1,0,0,1,0],"matrix_rows":[1,2,4,8,128,32,64,16,400],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,144,0,0,144,0]},"rank":0,"right":null},"role":72},{"entrance":true,"frame":75,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,1,1,0,0],"matrix_rows":[1,2,4,8,16,64,32,224,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,96,96,0,0]},"rank":0,"right":null},"role":73},{"entrance":true,"frame":76,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,1,1,0,0],"matrix_rows":[1,2,4,8,16,64,32,128,352],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,96,96,0,0]},"rank":0,"right":null},"role":74},{"entrance":true,"frame":77,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,1,0,1,0],"matrix_rows":[1,2,4,8,16,128,64,32,416],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,160,0,160,0]},"rank":0,"right":null},"role":75},{"entrance":true,"frame":78,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,1,1,0],"matrix_rows":[1,2,4,8,16,32,128,64,448],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,192,192,0]},"rank":0,"right":null},"role":76},{"entrance":true,"frame":79,"recipe":{"left":{"linear_Z4":[0,0,1,1,1,1,1,1,0],"matrix_rows":[1,2,248,244,236,220,188,124,508],"offset":0,"phase":0,"quadratic_rows":[0,0,252,252,252,252,252,252,0]},"rank":0,"right":null},"role":77},{"entrance":true,"frame":80,"recipe":{"left":{"linear_Z4":[0,1,0,1,1,1,1,1,0],"matrix_rows":[1,248,4,242,234,218,186,122,506],"offset":0,"phase":0,"quadratic_rows":[0,250,0,250,250,250,250,250,0]},"rank":0,"right":null},"role":78},{"entrance":true,"frame":81,"recipe":{"left":{"linear_Z4":[0,1,1,0,1,1,1,1,0],"matrix_rows":[1,244,242,8,230,214,182,118,502],"offset":0,"phase":0,"quadratic_rows":[0,246,246,0,246,246,246,246,0]},"rank":0,"right":null},"role":79},{"entrance":true,"frame":82,"recipe":{"left":{"linear_Z4":[0,1,1,1,0,1,1,1,0],"matrix_rows":[1,236,234,230,16,206,174,110,494],"offset":0,"phase":0,"quadratic_rows":[0,238,238,238,0,238,238,238,0]},"rank":0,"right":null},"role":80},{"entrance":true,"frame":83,"recipe":{"left":{"linear_Z4":[0,1,1,1,1,0,1,1,0],"matrix_rows":[1,220,218,214,206,32,158,94,478],"offset":0,"phase":0,"quadratic_rows":[0,222,222,222,222,0,222,222,0]},"rank":0,"right":null},"role":81},{"entrance":true,"frame":84,"recipe":{"left":{"linear_Z4":[0,1,1,1,1,1,0,1,0],"matrix_rows":[1,188,186,182,174,158,64,62,446],"offset":0,"phase":0,"quadratic_rows":[0,190,190,190,190,190,0,190,0]},"rank":0,"right":null},"role":82},{"entrance":true,"frame":85,"recipe":{"left":{"linear_Z4":[0,1,1,1,1,1,1,0,0],"matrix_rows":[1,124,122,118,110,94,62,128,382],"offset":0,"phase":0,"quadratic_rows":[0,126,126,126,126,126,126,0,0]},"rank":0,"right":null},"role":83},{"entrance":true,"frame":86,"recipe":{"left":{"linear_Z4":[0,1,1,1,1,1,1,0,0],"matrix_rows":[1,124,122,118,110,94,62,254,256],"offset":0,"phase":0,"quadratic_rows":[0,126,126,126,126,126,126,0,0]},"rank":0,"right":null},"role":84},{"entrance":true,"frame":87,"recipe":{"left":{"linear_Z4":[1,0,0,1,1,1,1,1,0],"matrix_rows":[248,2,4,241,233,217,185,121,505],"offset":0,"phase":0,"quadratic_rows":[249,0,0,249,249,249,249,249,0]},"rank":0,"right":null},"role":85},{"entrance":true,"frame":88,"recipe":{"left":{"linear_Z4":[1,0,1,0,1,1,1,1,0],"matrix_rows":[244,2,241,8,229,213,181,117,501],"offset":0,"phase":0,"quadratic_rows":[245,0,245,0,245,245,245,245,0]},"rank":0,"right":null},"role":86},{"entrance":true,"frame":89,"recipe":{"left":{"linear_Z4":[1,0,1,1,0,1,1,1,0],"matrix_rows":[236,2,233,229,16,205,173,109,493],"offset":0,"phase":0,"quadratic_rows":[237,0,237,237,0,237,237,237,0]},"rank":0,"right":null},"role":87},{"entrance":true,"frame":90,"recipe":{"left":{"linear_Z4":[1,0,1,1,1,0,1,1,0],"matrix_rows":[220,2,217,213,205,32,157,93,477],"offset":0,"phase":0,"quadratic_rows":[221,0,221,221,221,0,221,221,0]},"rank":0,"right":null},"role":88},{"entrance":true,"frame":91,"recipe":{"left":{"linear_Z4":[1,0,1,1,1,1,0,1,0],"matrix_rows":[188,2,185,181,173,157,64,61,445],"offset":0,"phase":0,"quadratic_rows":[189,0,189,189,189,189,0,189,0]},"rank":0,"right":null},"role":89},{"entrance":true,"frame":92,"recipe":{"left":{"linear_Z4":[1,0,1,1,1,1,1,0,0],"matrix_rows":[124,2,121,117,109,93,61,128,381],"offset":0,"phase":0,"quadratic_rows":[125,0,125,125,125,125,125,0,0]},"rank":0,"right":null},"role":90},{"entrance":true,"frame":93,"recipe":{"left":{"linear_Z4":[1,0,1,1,1,1,1,0,0],"matrix_rows":[124,2,121,117,109,93,61,253,256],"offset":0,"phase":0,"quadratic_rows":[125,0,125,125,125,125,125,0,0]},"rank":0,"right":null},"role":91},{"entrance":true,"frame":94,"recipe":{"left":{"linear_Z4":[1,1,0,0,1,1,1,1,0],"matrix_rows":[242,241,4,8,227,211,179,115,499],"offset":0,"phase":0,"quadratic_rows":[243,243,0,0,243,243,243,243,0]},"rank":0,"right":null},"role":92},{"entrance":true,"frame":95,"recipe":{"left":{"linear_Z4":[1,1,0,1,0,1,1,1,0],"matrix_rows":[234,233,4,227,16,203,171,107,491],"offset":0,"phase":0,"quadratic_rows":[235,235,0,235,0,235,235,235,0]},"rank":0,"right":null},"role":93},{"entrance":true,"frame":96,"recipe":{"left":{"linear_Z4":[1,1,0,1,1,0,1,1,0],"matrix_rows":[218,217,4,211,203,32,155,91,475],"offset":0,"phase":0,"quadratic_rows":[219,219,0,219,219,0,219,219,0]},"rank":0,"right":null},"role":94},{"entrance":true,"frame":97,"recipe":{"left":{"linear_Z4":[1,1,0,1,1,1,0,1,0],"matrix_rows":[186,185,4,179,171,155,64,59,443],"offset":0,"phase":0,"quadratic_rows":[187,187,0,187,187,187,0,187,0]},"rank":0,"right":null},"role":95},{"entrance":true,"frame":98,"recipe":{"left":{"linear_Z4":[1,1,0,1,1,1,1,0,0],"matrix_rows":[122,121,4,115,107,91,59,128,379],"offset":0,"phase":0,"quadratic_rows":[123,123,0,123,123,123,123,0,0]},"rank":0,"right":null},"role":96},{"entrance":true,"frame":99,"recipe":{"left":{"linear_Z4":[1,1,0,1,1,1,1,0,0],"matrix_rows":[122,121,4,115,107,91,59,251,256],"offset":0,"phase":0,"quadratic_rows":[123,123,0,123,123,123,123,0,0]},"rank":0,"right":null},"role":97},{"entrance":true,"frame":100,"recipe":{"left":{"linear_Z4":[1,1,1,0,0,1,1,1,0],"matrix_rows":[230,229,227,8,16,199,167,103,487],"offset":0,"phase":0,"quadratic_rows":[231,231,231,0,0,231,231,231,0]},"rank":0,"right":null},"role":98},{"entrance":true,"frame":101,"recipe":{"left":{"linear_Z4":[1,1,1,0,1,0,1,1,0],"matrix_rows":[214,213,211,8,199,32,151,87,471],"offset":0,"phase":0,"quadratic_rows":[215,215,215,0,215,0,215,215,0]},"rank":0,"right":null},"role":99},{"entrance":true,"frame":102,"recipe":{"left":{"linear_Z4":[1,1,1,0,1,1,0,1,0],"matrix_rows":[182,181,179,8,167,151,64,55,439],"offset":0,"phase":0,"quadratic_rows":[183,183,183,0,183,183,0,183,0]},"rank":0,"right":null},"role":100},{"entrance":true,"frame":103,"recipe":{"left":{"linear_Z4":[1,1,1,0,1,1,1,0,0],"matrix_rows":[118,117,115,8,103,87,55,128,375],"offset":0,"phase":0,"quadratic_rows":[119,119,119,0,119,119,119,0,0]},"rank":0,"right":null},"role":101},{"entrance":true,"frame":104,"recipe":{"left":{"linear_Z4":[1,1,1,0,1,1,1,0,0],"matrix_rows":[118,117,115,8,103,87,55,247,256],"offset":0,"phase":0,"quadratic_rows":[119,119,119,0,119,119,119,0,0]},"rank":0,"right":null},"role":102},{"entrance":true,"frame":105,"recipe":{"left":{"linear_Z4":[1,1,1,1,0,0,1,1,0],"matrix_rows":[206,205,203,199,16,32,143,79,463],"offset":0,"phase":0,"quadratic_rows":[207,207,207,207,0,0,207,207,0]},"rank":0,"right":null},"role":103},{"entrance":true,"frame":106,"recipe":{"left":{"linear_Z4":[1,1,1,1,0,1,0,1,0],"matrix_rows":[174,173,171,167,16,143,64,47,431],"offset":0,"phase":0,"quadratic_rows":[175,175,175,175,0,175,0,175,0]},"rank":0,"right":null},"role":104},{"entrance":true,"frame":107,"recipe":{"left":{"linear_Z4":[1,1,1,1,0,1,1,0,0],"matrix_rows":[110,109,107,103,16,79,47,128,367],"offset":0,"phase":0,"quadratic_rows":[111,111,111,111,0,111,111,0,0]},"rank":0,"right":null},"role":105},{"entrance":true,"frame":108,"recipe":{"left":{"linear_Z4":[1,1,1,1,0,1,1,0,0],"matrix_rows":[110,109,107,103,16,79,47,239,256],"offset":0,"phase":0,"quadratic_rows":[111,111,111,111,0,111,111,0,0]},"rank":0,"right":null},"role":106},{"entrance":true,"frame":109,"recipe":{"left":{"linear_Z4":[1,1,1,1,1,0,0,1,0],"matrix_rows":[158,157,155,151,143,32,64,31,415],"offset":0,"phase":0,"quadratic_rows":[159,159,159,159,159,0,0,159,0]},"rank":0,"right":null},"role":107},{"entrance":true,"frame":110,"recipe":{"left":{"linear_Z4":[1,1,1,1,1,0,1,0,0],"matrix_rows":[94,93,91,87,79,32,31,128,351],"offset":0,"phase":0,"quadratic_rows":[95,95,95,95,95,0,95,0,0]},"rank":0,"right":null},"role":108},{"entrance":true,"frame":111,"recipe":{"left":{"linear_Z4":[1,1,1,1,1,0,1,0,0],"matrix_rows":[94,93,91,87,79,32,31,223,256],"offset":0,"phase":0,"quadratic_rows":[95,95,95,95,95,0,95,0,0]},"rank":0,"right":null},"role":109},{"entrance":true,"frame":112,"recipe":{"left":{"linear_Z4":[1,1,1,1,1,1,0,0,0],"matrix_rows":[62,61,59,55,47,31,64,128,319],"offset":0,"phase":0,"quadratic_rows":[63,63,63,63,63,63,0,0,0]},"rank":0,"right":null},"role":110},{"entrance":true,"frame":113,"recipe":{"left":{"linear_Z4":[1,1,1,1,1,1,0,0,0],"matrix_rows":[62,61,59,55,47,31,64,191,256],"offset":0,"phase":0,"quadratic_rows":[63,63,63,63,63,63,0,0,0]},"rank":0,"right":null},"role":111},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":112},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":113},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":114},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":115},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":116},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":117},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":118},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":119},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":120},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":121},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":122},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":123},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":124},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":125},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":126},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":127},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":128},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":129},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":130},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":131},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":132},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":133},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":134},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":135},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":136},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":137},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":138},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":139},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":140},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":141},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":142},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":143},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":144},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":145},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":146},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":147},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":148},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":149},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":150},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":151},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":152},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":153},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":154},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":155},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":156},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":157},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":158},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":159},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":160},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":161},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":162},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":163},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":164},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":165},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":166},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":167},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":168},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":169},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":170},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":171},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":172},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":173},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":174},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":175},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":176},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":177},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":178},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":179},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":180},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":181},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":182},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":183},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":184},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":185},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":186},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":187},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":188},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":189},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":190},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":191},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":192},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":193},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":194},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":195},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":196},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":197},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":198},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":199},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":200},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":201},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":202},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":203},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":204},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":205},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":206},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":207},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":208},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":209},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":210},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":211},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":212},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":213},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":214},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":215},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":216},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":217},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":218},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":219},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":220},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":221},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":222},{"entrance":true,"frame":0,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":223},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":0},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":1},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":2},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":3},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":4},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":5},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":6},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":7},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":8},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":9},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":10},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":11},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":12},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":13},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":14},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":15},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":16},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":17},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":18},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":19},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":20},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":21},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":22},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":23},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":24},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":25},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":26},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":27},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":28},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":29},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":30},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":31},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":32},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":33},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":34},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":35},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":36},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":37},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":38},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":39},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":40},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":41},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":42},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":43},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":44},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":45},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":46},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":47},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":48},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":49},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":50},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":51},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":52},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":53},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":54},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":55},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":56},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":57},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":58},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":59},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":60},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":61},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":62},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":63},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":64},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":65},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":66},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":67},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":68},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":69},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":70},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":71},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":72},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":73},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":74},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":75},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":76},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":77},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":78},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":79},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":80},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":81},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":82},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":83},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":84},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":85},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":86},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":87},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":88},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":89},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":90},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":91},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":92},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":93},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":94},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":95},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":96},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":97},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":98},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":99},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":100},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":101},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":102},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":103},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":104},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":105},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":106},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":107},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":108},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":109},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":110},{"entrance":false,"frame":1,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,128,256],"offset":0,"phase":0,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":111},{"entrance":false,"frame":142,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,9,16,32,64,128,256],"offset":11,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":112},{"entrance":false,"frame":143,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,8,17,32,64,128,256],"offset":19,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":113},{"entrance":false,"frame":144,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,8,16,33,64,128,256],"offset":35,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":114},{"entrance":false,"frame":145,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,8,16,32,65,128,256],"offset":67,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":115},{"entrance":false,"frame":146,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,8,16,32,64,129,256],"offset":131,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":116},{"entrance":false,"frame":147,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,8,16,32,64,128,257],"offset":259,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":117},{"entrance":false,"frame":148,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,9,16,32,64,128,256],"offset":13,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":118},{"entrance":false,"frame":149,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,8,17,32,64,128,256],"offset":21,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":119},{"entrance":false,"frame":150,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,8,16,33,64,128,256],"offset":37,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":120},{"entrance":false,"frame":151,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,8,16,32,65,128,256],"offset":69,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":121},{"entrance":false,"frame":152,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,8,16,32,64,129,256],"offset":133,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":122},{"entrance":false,"frame":153,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,8,16,32,64,128,257],"offset":261,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":123},{"entrance":false,"frame":154,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,9,16,33,64,128,256],"offset":41,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":124},{"entrance":false,"frame":155,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,9,16,32,65,128,256],"offset":73,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":125},{"entrance":false,"frame":156,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,9,16,32,64,129,256],"offset":137,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":126},{"entrance":false,"frame":157,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,9,16,32,64,128,257],"offset":265,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":127},{"entrance":false,"frame":158,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,17,33,64,128,256],"offset":49,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":128},{"entrance":false,"frame":159,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,17,32,65,128,256],"offset":81,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":129},{"entrance":false,"frame":160,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,17,32,64,129,256],"offset":145,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":130},{"entrance":false,"frame":161,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,17,32,64,128,257],"offset":273,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":131},{"entrance":false,"frame":162,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,33,64,129,256],"offset":161,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":132},{"entrance":false,"frame":163,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,33,64,128,257],"offset":289,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":133},{"entrance":false,"frame":164,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,65,129,256],"offset":193,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":134},{"entrance":false,"frame":165,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,65,128,257],"offset":321,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":135},{"entrance":false,"frame":166,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,129,257],"offset":385,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":136},{"entrance":false,"frame":167,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,10,16,32,64,128,256],"offset":14,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":137},{"entrance":false,"frame":168,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,8,18,32,64,128,256],"offset":22,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":138},{"entrance":false,"frame":169,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,8,16,34,64,128,256],"offset":38,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":139},{"entrance":false,"frame":170,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,8,16,32,66,128,256],"offset":70,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":140},{"entrance":false,"frame":171,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,8,16,32,64,130,256],"offset":134,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":141},{"entrance":false,"frame":172,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,8,16,32,64,128,258],"offset":262,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":142},{"entrance":false,"frame":173,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,10,18,32,64,128,256],"offset":26,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":143},{"entrance":false,"frame":174,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,10,16,32,66,128,256],"offset":74,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":144},{"entrance":false,"frame":175,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,10,16,32,64,130,256],"offset":138,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":145},{"entrance":false,"frame":176,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,10,16,32,64,128,258],"offset":266,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":146},{"entrance":false,"frame":177,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,18,34,64,128,256],"offset":50,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":147},{"entrance":false,"frame":178,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,18,32,64,130,256],"offset":146,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":148},{"entrance":false,"frame":179,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,18,32,64,128,258],"offset":274,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":149},{"entrance":false,"frame":180,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,34,66,128,256],"offset":98,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":150},{"entrance":false,"frame":181,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,34,64,130,256],"offset":162,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":151},{"entrance":false,"frame":182,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,34,64,128,258],"offset":290,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":152},{"entrance":false,"frame":183,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,66,130,256],"offset":194,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":153},{"entrance":false,"frame":184,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,66,128,258],"offset":322,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":154},{"entrance":false,"frame":185,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,130,258],"offset":386,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":155},{"entrance":false,"frame":186,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,12,20,32,64,128,256],"offset":28,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":156},{"entrance":false,"frame":187,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,12,16,36,64,128,256],"offset":44,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":157},{"entrance":false,"frame":188,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,12,16,32,64,132,256],"offset":140,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":158},{"entrance":false,"frame":189,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,12,16,32,64,128,260],"offset":268,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":159},{"entrance":false,"frame":190,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,20,32,68,128,256],"offset":84,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":160},{"entrance":false,"frame":191,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,20,32,64,132,256],"offset":148,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":161},{"entrance":false,"frame":192,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,20,32,64,128,260],"offset":276,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":162},{"entrance":false,"frame":193,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,36,68,128,256],"offset":100,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":163},{"entrance":false,"frame":194,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,36,64,132,256],"offset":164,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":164},{"entrance":false,"frame":195,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,36,64,128,260],"offset":292,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":165},{"entrance":false,"frame":196,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,68,132,256],"offset":196,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":166},{"entrance":false,"frame":197,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,68,128,260],"offset":324,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":167},{"entrance":false,"frame":198,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,132,260],"offset":388,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":168},{"entrance":false,"frame":199,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,24,40,64,128,256],"offset":56,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":169},{"entrance":false,"frame":200,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,24,32,72,128,256],"offset":88,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":170},{"entrance":false,"frame":201,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,24,32,64,136,256],"offset":152,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":171},{"entrance":false,"frame":202,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,24,32,64,128,264],"offset":280,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":172},{"entrance":false,"frame":203,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,40,72,128,256],"offset":104,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":173},{"entrance":false,"frame":204,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,40,64,136,256],"offset":168,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":174},{"entrance":false,"frame":205,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,40,64,128,264],"offset":296,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":175},{"entrance":false,"frame":206,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,72,136,256],"offset":200,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":176},{"entrance":false,"frame":207,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,72,128,264],"offset":328,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":177},{"entrance":false,"frame":208,"recipe":{"left":{"linear_Z4":[0,0,0,2,0,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,136,264],"offset":392,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":178},{"entrance":false,"frame":209,"recipe":{"left":{"linear_Z4":[0,0,0,0,2,0,0,0,0],"matrix_rows":[1,2,4,8,16,48,80,128,256],"offset":112,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":179},{"entrance":false,"frame":210,"recipe":{"left":{"linear_Z4":[0,0,0,0,2,0,0,0,0],"matrix_rows":[1,2,4,8,16,48,64,144,256],"offset":176,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":180},{"entrance":false,"frame":211,"recipe":{"left":{"linear_Z4":[0,0,0,0,2,0,0,0,0],"matrix_rows":[1,2,4,8,16,48,64,128,272],"offset":304,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":181},{"entrance":false,"frame":212,"recipe":{"left":{"linear_Z4":[0,0,0,0,2,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,80,144,256],"offset":208,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":182},{"entrance":false,"frame":213,"recipe":{"left":{"linear_Z4":[0,0,0,0,2,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,80,128,272],"offset":336,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":183},{"entrance":false,"frame":214,"recipe":{"left":{"linear_Z4":[0,0,0,0,2,0,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,144,272],"offset":400,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":184},{"entrance":false,"frame":215,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,2,0,0,0],"matrix_rows":[1,2,4,8,16,32,96,160,256],"offset":224,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":185},{"entrance":false,"frame":216,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,2,0,0,0],"matrix_rows":[1,2,4,8,16,32,96,128,288],"offset":352,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":186},{"entrance":false,"frame":217,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,2,0,0,0],"matrix_rows":[1,2,4,8,16,32,64,160,288],"offset":416,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":187},{"entrance":false,"frame":218,"recipe":{"left":{"linear_Z4":[0,0,0,0,0,0,2,0,0],"matrix_rows":[1,2,4,8,16,32,64,192,320],"offset":448,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":188},{"entrance":false,"frame":219,"recipe":{"left":{"linear_Z4":[0,0,2,0,0,0,0,0,0],"matrix_rows":[1,2,4,12,20,36,68,132,260],"offset":508,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":189},{"entrance":false,"frame":220,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,10,18,34,66,130,258],"offset":506,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":190},{"entrance":false,"frame":221,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,8,18,34,66,130,258],"offset":502,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":191},{"entrance":false,"frame":222,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,10,16,34,66,130,258],"offset":494,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":192},{"entrance":false,"frame":223,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,10,18,32,66,130,258],"offset":478,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":193},{"entrance":false,"frame":224,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,10,18,34,64,130,258],"offset":446,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":194},{"entrance":false,"frame":225,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,10,18,34,66,128,258],"offset":382,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":195},{"entrance":false,"frame":226,"recipe":{"left":{"linear_Z4":[0,2,0,0,0,0,0,0,0],"matrix_rows":[1,2,6,10,18,34,66,130,256],"offset":254,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":196},{"entrance":false,"frame":227,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,4,9,17,33,65,129,257],"offset":505,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":197},{"entrance":false,"frame":228,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,8,17,33,65,129,257],"offset":501,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":198},{"entrance":false,"frame":229,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,9,16,33,65,129,257],"offset":493,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":199},{"entrance":false,"frame":230,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,9,17,32,65,129,257],"offset":477,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":200},{"entrance":false,"frame":231,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,9,17,33,64,129,257],"offset":445,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":201},{"entrance":false,"frame":232,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,9,17,33,65,128,257],"offset":381,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":202},{"entrance":false,"frame":233,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,2,5,9,17,33,65,129,256],"offset":253,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":203},{"entrance":false,"frame":234,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,8,17,33,65,129,257],"offset":499,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":204},{"entrance":false,"frame":235,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,9,16,33,65,129,257],"offset":491,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":205},{"entrance":false,"frame":236,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,9,17,32,65,129,257],"offset":475,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":206},{"entrance":false,"frame":237,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,9,17,33,64,129,257],"offset":443,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":207},{"entrance":false,"frame":238,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,9,17,33,65,128,257],"offset":379,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":208},{"entrance":false,"frame":239,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,4,9,17,33,65,129,256],"offset":251,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":209},{"entrance":false,"frame":240,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,8,16,33,65,129,257],"offset":487,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":210},{"entrance":false,"frame":241,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,8,17,32,65,129,257],"offset":471,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":211},{"entrance":false,"frame":242,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,8,17,33,64,129,257],"offset":439,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":212},{"entrance":false,"frame":243,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,8,17,33,65,128,257],"offset":375,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":213},{"entrance":false,"frame":244,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,8,17,33,65,129,256],"offset":247,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":214},{"entrance":false,"frame":245,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,16,32,65,129,257],"offset":463,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":215},{"entrance":false,"frame":246,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,16,33,64,129,257],"offset":431,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":216},{"entrance":false,"frame":247,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,16,33,65,128,257],"offset":367,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":217},{"entrance":false,"frame":248,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,16,33,65,129,256],"offset":239,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":218},{"entrance":false,"frame":249,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,17,32,64,129,257],"offset":415,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":219},{"entrance":false,"frame":250,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,17,32,65,128,257],"offset":351,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":220},{"entrance":false,"frame":251,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,17,32,65,129,256],"offset":223,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":221},{"entrance":false,"frame":252,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,17,33,64,128,257],"offset":319,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":222},{"entrance":false,"frame":253,"recipe":{"left":{"linear_Z4":[2,0,0,0,0,0,0,0,0],"matrix_rows":[1,3,5,9,17,33,64,129,256],"offset":191,"phase":3,"quadratic_rows":[0,0,0,0,0,0,0,0,0]},"rank":0,"right":null},"role":223}] diff --git a/research/clifford-tensor-gram/provider/NOTICE.md b/research/clifford-tensor-gram/provider/NOTICE.md new file mode 100644 index 0000000000..50ee0013c3 --- /dev/null +++ b/research/clifford-tensor-gram/provider/NOTICE.md @@ -0,0 +1,55 @@ +# Provider sources and attribution + +New material: Ali Romman, with substantial OpenAI Codex assistance in the +proof, implementation, checks and publication. Apache-2.0. The checks do not +constitute independent human review or a proof-kernel verification. + +The source checkpoint is canonical main +`1ec1119972c9aefe42525172d07b332fcff81cb4`. `SOURCES.json` records exact +source paths, Git objects and SHA-256 values for the copied data. + +- **Cao Yifan / intqwq** supplies the final + [PR #4610](https://github.com/CrocSwap/integer-mult-bounds/pull/4610) + native word and phase data. His + [construction proof](https://github.com/CrocSwap/integer-mult-bounds/blob/1ec1119972c9aefe42525172d07b332fcff81cb4/research/kappa-round3-warp-20261022/PROOF.md) + records the changed construction and its OpenAI assistance. `WORD.json.gz` + and `PHASES.json.gz` are byte-exact copies of that selected source. +- **Chris R / Clear1nsight** supplies the + [PR #5241](https://github.com/CrocSwap/integer-mult-bounds/pull/5241) + independent admission and paid catalogue. `PAID.jsonl.gz` is a byte-exact + copy. The [admission proof](https://github.com/CrocSwap/integer-mult-bounds/blob/1ec1119972c9aefe42525172d07b332fcff81cb4/research/final4610-independent-admission/PROOF.md) + already contains a quantified free-group lift. The new work does not claim + priority for that argument. The prior source uses substantial OpenAI + Codex assistance and retains Apache-2.0. +- **Cinna Davis / 1337isnot1337** supplies the joint-helper, native warp, + query-thinned controller and preceding construction chain. `HELPERS.json.gz` + retains the recipes from the + [joint-helper source](https://github.com/CrocSwap/integer-mult-bounds/blob/1ec1119972c9aefe42525172d07b332fcff81cb4/research/joint-helper-lattice/PROOF.md). + **zxv**, **Jacob Alan Sussman** and **Dugongue** retain credit for productive + helpers, mixed-target recursion and frame/physical interfaces. See the + [selected contributor map](https://github.com/CrocSwap/integer-mult-bounds/blob/1ec1119972c9aefe42525172d07b332fcff81cb4/docs/research/community-native4610-contributors.md). +- **Rohan Arun**, **Jeremy Kothe** and the full native lineage supply the + retained exact Clifford kernel. **Tekalign / tekuuu** retains it in the + source package. The byte-exact kernel, scalar layer and full lineage + notice remain in `../vendor/`. The scalar layer is from **zxv**. +- **icekylinx** supplies the earlier phase-lowering source, with Codex + assistance. **DreamingOfClouds** supplies the wrapper source, with Claude + Opus 5.5 assistance; that source credits **chafreaky** for the residual + wrapper construction. Cinna Davis adds native warp support. The + [phase source](https://github.com/CrocSwap/integer-mult-bounds/blob/1ec1119972c9aefe42525172d07b332fcff81cb4/research/t74-native-fast/vendor/native/new/code/borrow/bw_phases.py) + gives the exact main-adapter formula used here. The + [wrapper source](https://github.com/CrocSwap/integer-mult-bounds/blob/1ec1119972c9aefe42525172d07b332fcff81cb4/research/t74-native-fast/vendor/native/new/code/borrow/bw_adapters.py) + retains the source notice and predecessor credit. + +The [PR #5243 handoff](https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19147021) +motivates the initial paid-pair test. The separate +[PR #5393](https://github.com/CrocSwap/integer-mult-bounds/pull/5393) concerns +zero-row deletion and single-field reachability on a frozen eight-relation +provider. It is related work, not an input to this proof or an additional gain. + +The source construction, proposed recipe compiler, new quadratic-sum checker, +complete word interpreters and literal witness checker have different roles. +The Gaussian scalar layer is shared. The proof and implementation are not +independent of all earlier source definitions. No general stabilizer-method +priority is claimed; the classical code and quadratic-form work is credited +in `../ADVANCES.md`. diff --git a/research/clifford-tensor-gram/provider/PAID.jsonl.gz b/research/clifford-tensor-gram/provider/PAID.jsonl.gz new file mode 100644 index 0000000000..73fa3ced93 Binary files /dev/null and b/research/clifford-tensor-gram/provider/PAID.jsonl.gz differ diff --git a/research/clifford-tensor-gram/provider/PHASES.json.gz b/research/clifford-tensor-gram/provider/PHASES.json.gz new file mode 100644 index 0000000000..ac77b78547 Binary files /dev/null and b/research/clifford-tensor-gram/provider/PHASES.json.gz differ diff --git a/research/clifford-tensor-gram/provider/RESEARCH-NOTES.md b/research/clifford-tensor-gram/provider/RESEARCH-NOTES.md new file mode 100644 index 0000000000..83b4901e17 --- /dev/null +++ b/research/clifford-tensor-gram/provider/RESEARCH-NOTES.md @@ -0,0 +1,97 @@ +# Provider experiment record + +The user requested an application of the new verifier to a complete current +provider, with a real kappa gain or a useful obstruction as the target. + +## Source and decision + +Canonical main was refreshed to +`1ec1119972c9aefe42525172d07b332fcff81cb4`, priority revision 7. The selected +record points to the final PR4610 word and PR5241 admission. The selected +value is 0.0030217758. The older verifier proof inputs remain pinned to their +original base. This application uses a separate current-source manifest. + +The first live overlap check covered 347 open PRs and 4,681 Discussion +records, with complete remote pagination. Local notes were sparse. The +PR5243 handoff asks for a physical H1+H1->H2 pair. PR5393 proves a different +zero-row result on a frozen eight-relation provider. The new scope is the +complete selected local provider and literal early/late fusion on one +persistent role. The first test uses adjacent rank-one climbs. No other +chat's work is changed. + +A second live check at 22:28 UTC on 2026-10-23 covered 350 open PRs and +4,684 Discussion records, with complete remote pagination. The terms were +`pair fusion`, `paid climbs`, `same persistent role`, `30328` and +`clifford-tensor-gram`. No competing claim for this exact provider audit was +found. Local coverage was 16 of 7,269 note paths; this check is not a full +historical novelty certificate. + +## Experiments and corrections + +1. The source has 21,449 events in each direction, 632 persistent roles and + one owned role. The 5,710 paid class records cover 6,596 instances. Only + checking a single native warp would not cover this boundary. +2. The first importer required each adapter marker's frame to be the current + frame. This rejected 82 source exit markers. Source inspection showed that + these adapters are identities. The importer now proves identity for a + moved marker. It still rejects a nonidentity adapter at a wrong frame. +3. The first owned-lifetime tracker marked COPY but not ADD into a cleared + owned register as live. The backward source accumulates its center by + ADD. The tracker was corrected before any complete-provider claim. +4. The native inverse circuit returns tuple gates. The first conjugation + helper combined a tuple with a list. This was a representation error, + not a mathematical failure. The helper now makes the new gate list + explicitly. Both orientations are replayed. +5. All 5,710 paid recipes then passed the new phase-exact Gram test. The + rank-one normalized traces were zero or `(1+i)/2^j` and its conjugate, + with j from 1 to 4. The proof uses the more general checked bounds + `Re(tau)<=1/2` and `|tau|^2<=1/2`. +6. The initial fusion scan required a common middle frame. It found 1,341 + pairs per direction and a single-term off-diagonal contact for every + pair. The two-sided cut formula removed that unnecessary restriction. + The second census covers all 1,363 adjacent rank-one pairs per direction, + including 22 with an intervening change of middle frame. It excludes + both endpoint placements for each pair: 5,452 replacements in total. + The same proof then applies to all 2,658 adjacent pairs at all ranks. + A final extension removes adjacency as well: all 7,582 pairs on one + persistent role per direction have a certificate. The final result + excludes 30,328 endpoint placements. Each extension changes the search + domain explicitly; it does not reuse a smaller-domain receipt as proof. +7. The complete physical programs pass the existing compact verifier. A + separate sparse expansion measures peak total support 22,331 forward + and 12,930 backward. Support growth is manageable for this source. No + general polynomial support bound follows. +8. The proof is stronger than a width-one rejection: each saved contact + defect has normalized squared norm at least q^2 at every positive + width. The full-provider norm need not have that bound, because its + prefix and suffix can be nonunitary. Invertibility transfers nonzero + defect, not a condition-number estimate. +9. The final proof audit checks the positions of all 224 nonidentity main + adapters in each direction. Each entrance precedes all uses of its role; + each exit follows all uses. This check is part of the importer. It makes + the interval's logical-frame interpretation explicit. All receipts keep + the same mathematical values. + A separate negative check moved role 112's nonidentity exit adapter from + event 15,723 to event 14,298, before its last scalar contact. The audit + rejected it with `Nonidentity adapters surround every use of their role`. +10. The first hosted replay on Linux / CPython 3.12.15 passed the four earlier + checks, all native recipe classes and both complete provider endpoints. + Its 240-second provider limit then expired during the remaining checks. + No mathematical failure was reported. The manifest now assigns 90 seconds + to each earlier check and 420 seconds to each provider check. The total + stays 1,200 seconds. Source code, proof and scientific receipts are + unchanged by this budget correction. + +No promising fusion survived the exact endpoint test. The source remains +unchanged. The hypothetical invoice delta is not an achieved saving, so a +new compiler or outer arithmetic run is not warranted by this experiment. + +## Verification record + +`RESULT.json` contains the deterministic complete result. `FUSIONS.json.gz` +contains every contact certificate. `WITNESSES.json` contains full physical +program counterexamples. The same commands run in normal and optimized +Python. The repository replay manifest includes both modes. Final export, +committed-byte and publication results are recorded in the public handoff. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. diff --git a/research/clifford-tensor-gram/provider/RESULT.json b/research/clifford-tensor-gram/provider/RESULT.json new file mode 100644 index 0000000000..0e471c979c --- /dev/null +++ b/research/clifford-tensor-gram/provider/RESULT.json @@ -0,0 +1 @@ +{"achieved_paid_delta":{},"admission_head":"13efb5fc5f3b7c14ec2cfa181dd9eb6480972cf2","complete_local_provider":{"backward":{"certificate":{"axes":9,"cutoff":76,"decision_widths":[69,70,71,72,73,74,75,76],"equivalent_at_all_positive_widths":true,"nonzero_endpoint_entries":0,"problem_sha256":"94d24c4876b09ca464c6f3bed1b14f59219dc7ffc3360b7a8a772b14c6b8a2cc","schema":"clifford-tensor-gram/native-v1"},"events":{"adapter":448,"center":8,"climb":3290,"phase":10,"scalar":17453,"warp":240},"instructions":24819,"native_symbols":1297,"paid":{"1":2201,"2":412,"3":510,"4":127,"5":40,"8":8},"support":{"final_terms":744,"peak_row_terms":148,"peak_total_terms":12930}},"forward":{"certificate":{"axes":9,"cutoff":76,"decision_widths":[69,70,71,72,73,74,75,76],"equivalent_at_all_positive_widths":true,"nonzero_endpoint_entries":0,"problem_sha256":"d141a880691f5f0fb79266b5e8a990fa59b399d3f63f3458b7a8582446ecb433","schema":"clifford-tensor-gram/native-v1"},"events":{"adapter":448,"center":8,"climb":3290,"phase":10,"scalar":17453,"warp":240},"instructions":24827,"native_symbols":1297,"paid":{"1":2201,"2":412,"3":510,"4":127,"5":40,"8":8},"support":{"final_terms":744,"peak_row_terms":156,"peak_total_terms":22331}}},"controls":[{"name":"missing_paid_class","rejected":"All oriented paid classes, without gaps"},{"name":"paid_absolute_phase","rejected":"Exact native Gram equality with absolute phase"},{"name":"borrowed_erasure","rejected":"Only owned storage can be overwritten"},{"name":"live_owned_cut","rejected":"Persistent climb at a closed owned cut"},{"name":"missing_contact_is_not_a_certificate","rejected":"No single-term contact certificate for (-1, 0, 0, 0, 2, 2, 3)"}],"full_program_basis_witnesses":12,"fusion":{"contact_types":{"backward_column":6632,"backward_row":950,"forward_column":6640,"forward_row":942},"normalized_squared_cut_defect_lower_bound":"coefficient^2","pairs_by_direction":{"backward":7582,"forward":7582},"rank_pairs":{"[1, 1]":8132,"[1, 2]":1220,"[1, 3]":1098,"[1, 4]":542,"[1, 5]":64,"[2, 1]":1210,"[2, 2]":274,"[2, 3]":150,"[2, 4]":30,"[2, 5]":24,"[3, 1]":1156,"[3, 2]":234,"[3, 3]":476,"[3, 4]":2,"[4, 1]":330,"[4, 2]":70,"[5, 1]":152},"rejected_fusions":30328,"separate_contact_replays":15164,"trace_counts":{"-1/128+1/128i":30,"-1/128-1/128i":30,"-1/16":228,"-1/16+1/16i":626,"-1/16-1/16i":626,"-1/32":320,"-1/32+1/32i":347,"-1/32-1/32i":347,"-1/4":126,"-1/4+1/4i":373,"-1/4-1/4i":373,"-1/64+1/64i":21,"-1/64-1/64i":21,"-1/8":88,"-1/8+1/8i":201,"-1/8-1/8i":201,"0":5558,"0+1/16i":120,"0+1/2i":356,"0+1/32i":45,"0+1/4i":289,"0+1/8i":553,"0-1/16i":120,"0-1/2i":356,"0-1/32i":45,"0-1/4i":289,"0-1/8i":553,"1/16+1/16i":4,"1/16-1/16i":4,"1/2+1/2i":3984,"1/2-1/2i":3984,"1/4+1/4i":5051,"1/4-1/4i":5051,"1/8+1/8i":4,"1/8-1/8i":4},"uniform_squared_cut_block_lower_bound":"1/256","width_domain":"every positive integer"},"fusion_payload_sha256":"03ad505c868b60c806e2af85824291b39c599becf2cb48d76e5b34860cbf63d2","limits":"Fixed early/late fusion of any two persistent paid climbs on one role; no changed contacts, coupled fusions, new controller or physical/outer admission.","native":{"helper_oriented_classes":34,"helper_profile":{"4":28,"7":7,"8":47,"9":326},"helper_roles":408,"main_adapter_oriented_classes":896,"paid_oriented_classes":5710,"warp_oriented_classes":360},"new_kappa":false,"provider_head":"20bb93cd990d2ff683e4d0fc56b87a42cd5d3296","source_main":"1ec1119972c9aefe42525172d07b332fcff81cb4","status":"PASS_COMPLETE_PR4610_PROVIDER_AND_30328_FUSION_OBSTRUCTIONS","witness_payload_sha256":"fa8a6dc9f201f4662fd823f8825dd2a90b2f0d1b4ade619d55b1e61efe2a9362"} diff --git a/research/clifford-tensor-gram/provider/SOURCES.json b/research/clifford-tensor-gram/provider/SOURCES.json new file mode 100644 index 0000000000..88f285b65d --- /dev/null +++ b/research/clifford-tensor-gram/provider/SOURCES.json @@ -0,0 +1,40 @@ +{ + "schema": "clifford-provider-inputs/v1", + "base_commit": "1ec1119972c9aefe42525172d07b332fcff81cb4", + "provider_head": "20bb93cd990d2ff683e4d0fc56b87a42cd5d3296", + "admission_head": "13efb5fc5f3b7c14ec2cfa181dd9eb6480972cf2", + "inputs": [ + { + "name": "word", + "file": "WORD.json.gz", + "source_path": "research/kappa-round3-warp-20261022/ACTUAL-WORD.json.gz", + "source_commit": "1ec1119972c9aefe42525172d07b332fcff81cb4", + "git_blob": "46d929df83817b85a5387bcdb9745e0627d6366e", + "sha256": "7679daa4ec6a40f56fc7f0202379a6f454310e94945aba4f48beaaaafb838d05" + }, + { + "name": "paid", + "file": "PAID.jsonl.gz", + "source_path": "research/final4610-independent-admission/PAID-CATALOG.jsonl.gz", + "source_commit": "1ec1119972c9aefe42525172d07b332fcff81cb4", + "git_blob": "73fa3ced93981949ad8f2432af840b787d9182c0", + "sha256": "964aa2e28057936825a67872ebe5c6b0abc3228e71a545dda6c1fc11adb983d5" + }, + { + "name": "phases", + "file": "PHASES.json.gz", + "source_path": "research/kappa-round3-warp-20261022/PHASE-VALIDATION.json.gz", + "source_commit": "1ec1119972c9aefe42525172d07b332fcff81cb4", + "git_blob": "ac77b78547d6dbf2e6bd102e1047c5b16c1bca88", + "sha256": "6eae66ed3cfa8a1533e89b9660a57276908e6646640a12f8b1e3489f4ea1354b" + }, + { + "name": "helpers", + "file": "HELPERS.json.gz", + "source_path": "research/joint-helper-lattice/NATIVE.json.gz", + "source_commit": "1ec1119972c9aefe42525172d07b332fcff81cb4", + "git_blob": "0910f74138decf498e7fc445cc2daff4390169d6", + "sha256": "74582cce642c80f0235be7fcbce3716174666326ac6a1d46d02a62a75d7be4c6" + } + ] +} diff --git a/research/clifford-tensor-gram/provider/WITNESSES.json b/research/clifford-tensor-gram/provider/WITNESSES.json new file mode 100644 index 0000000000..aea924193c --- /dev/null +++ b/research/clifford-tensor-gram/provider/WITNESSES.json @@ -0,0 +1 @@ +[{"direction":"forward","discrepancy":"1/32+1/16i","input_role":0,"input_tuple":[104],"mutated_program_sha256":"8d5931d2cdb7736001998571f07879d5c9a0fdce8fa6cd900f269ab8a6f46985","normalized_squared_norm":"1/2","output_role":115,"output_tuple":[0],"pair":[8266,8268,57,342,358,358,310],"placement":"early","width":1},{"direction":"forward","discrepancy":"-1/32+1/32i","input_role":0,"input_tuple":[72],"mutated_program_sha256":"24bb1821ce0ca31ba74b175e653851300b97755ce775bd5eb9225fe1dcd07b11","normalized_squared_norm":"1/4","output_role":115,"output_tuple":[0],"pair":[8266,8268,57,342,358,358,310],"placement":"late","width":1},{"direction":"forward","discrepancy":"1/32+1/32i","input_role":0,"input_tuple":[2],"mutated_program_sha256":"71475c660fb76a79a7b4f6a8080f5d9130bf97e44ea1a919c5f432ce91e42841","normalized_squared_norm":"1/4","output_role":112,"output_tuple":[0],"pair":[11981,11999,112,344,638,1164,659],"placement":"early","width":1},{"direction":"forward","discrepancy":"-1/32+1/32i","input_role":0,"input_tuple":[144],"mutated_program_sha256":"aafc8616eb3feb46e753690040f9046b6444355a002b913e9c9f37c7b1bddd79","normalized_squared_norm":"1/4","output_role":112,"output_tuple":[0],"pair":[11981,11999,112,344,638,1164,659],"placement":"late","width":1},{"direction":"forward","discrepancy":"1/32+1/32i","input_role":0,"input_tuple":[2],"mutated_program_sha256":"71475c660fb76a79a7b4f6a8080f5d9130bf97e44ea1a919c5f432ce91e42841","normalized_squared_norm":"1/4","output_role":112,"output_tuple":[0],"pair":[11981,11999,112,344,638,1164,659],"placement":"early","width":1},{"direction":"forward","discrepancy":"-1/32+1/32i","input_role":0,"input_tuple":[144],"mutated_program_sha256":"aafc8616eb3feb46e753690040f9046b6444355a002b913e9c9f37c7b1bddd79","normalized_squared_norm":"1/4","output_role":112,"output_tuple":[0],"pair":[11981,11999,112,344,638,1164,659],"placement":"late","width":1},{"direction":"backward","discrepancy":"1/64-3/64i","input_role":184,"input_tuple":[2],"mutated_program_sha256":"b0fbabb0790d8f7bd56d88425f0e1787a9182bf8cb9d77fcd4464f983a6d1696","normalized_squared_norm":"1/2","output_role":2,"output_tuple":[0],"pair":[11988,11990,184,364,640,640,1162],"placement":"early","width":1},{"direction":"backward","discrepancy":"1/64-3/64i","input_role":184,"input_tuple":[128],"mutated_program_sha256":"c3b2e621fe071d6718f1878aabd32ff270e89ec9c978a491cb84ae752ac7b397","normalized_squared_norm":"1/2","output_role":2,"output_tuple":[0],"pair":[11988,11990,184,364,640,640,1162],"placement":"late","width":1},{"direction":"backward","discrepancy":"-1/64+1/64i","input_role":112,"input_tuple":[0],"mutated_program_sha256":"ba85c9ccfa6a071fe615c1f3c6c1893709d7dbe002fc36ede676e454d4d67419","normalized_squared_norm":"1/16","output_role":1,"output_tuple":[0],"pair":[11982,12000,112,344,638,1164,659],"placement":"early","width":1},{"direction":"backward","discrepancy":"1/64-1/64i","input_role":112,"input_tuple":[144],"mutated_program_sha256":"1cb67d6c76dd8ab6b80bcc8b6bf20c0042114e4b5856993808d70b09cbd15a1f","normalized_squared_norm":"1/16","output_role":1,"output_tuple":[0],"pair":[11982,12000,112,344,638,1164,659],"placement":"late","width":1},{"direction":"backward","discrepancy":"-1/64+1/64i","input_role":112,"input_tuple":[0],"mutated_program_sha256":"ba85c9ccfa6a071fe615c1f3c6c1893709d7dbe002fc36ede676e454d4d67419","normalized_squared_norm":"1/16","output_role":1,"output_tuple":[0],"pair":[11982,12000,112,344,638,1164,659],"placement":"early","width":1},{"direction":"backward","discrepancy":"1/64-1/64i","input_role":112,"input_tuple":[144],"mutated_program_sha256":"1cb67d6c76dd8ab6b80bcc8b6bf20c0042114e4b5856993808d70b09cbd15a1f","normalized_squared_norm":"1/16","output_role":1,"output_tuple":[0],"pair":[11982,12000,112,344,638,1164,659],"placement":"late","width":1}] diff --git a/research/clifford-tensor-gram/provider/WORD.json.gz b/research/clifford-tensor-gram/provider/WORD.json.gz new file mode 100644 index 0000000000..46d929df83 Binary files /dev/null and b/research/clifford-tensor-gram/provider/WORD.json.gz differ diff --git a/research/clifford-tensor-gram/provider/generate_adapters.py b/research/clifford-tensor-gram/provider/generate_adapters.py new file mode 100644 index 0000000000..b256bc0ca0 --- /dev/null +++ b/research/clifford-tensor-gram/provider/generate_adapters.py @@ -0,0 +1,47 @@ +"""Propose main adapter recipes with the frozen source compiler. + +The verifier checks these data with quadratic sums. It does not run this file. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +import json +from pathlib import Path +import sys + +PACKAGE = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(PACKAGE)) +sys.path.insert(0, str(PACKAGE / "vendor")) +import clifford_exact as source +import provider + + +def generate(): + _, data = provider.read_inputs() + model = provider.Provider(data["word"]) + rows = [] + for entrance in (True, False): + for role in range(224): + f = model.c["start" if entrance else "final"][role] + old = model.old_frame(role, entrance) + circuit = provider.inverse_circuit(9, old) + model.frame(f) + # Tableau generation is part of proposal generation only. + op = source.ident(9) + for gate in circuit: + kind = gate[0] + if kind == "P": + part = source.perm(9, tuple(gate[1])) + elif kind == "D": + part = source.diag(9, tuple(gate[1]), tuple(gate[2])) + else: + provider.need(kind == "C", "Adapter generator gate") + part = source.cgate(9, gate[1], gate[2]) + op = op.then(part) + recipe, _ = source.lower_child(op) + provider.need(recipe["rank"] == 0, "Proposed main adapter is monomial") + rows.append(dict(entrance=entrance, role=role, frame=f, recipe=recipe)) + return rows + + +if __name__ == "__main__": + target = Path(__file__).resolve().parent / "MAIN-ADAPTERS.json" + target.write_text(json.dumps(generate(), sort_keys=True, separators=(",", ":")) + "\n") + print("PROPOSED_448_MAIN_ADAPTERS_REQUIRES_GRAM_CHECK") diff --git a/research/clifford-tensor-gram/quadratic.py b/research/clifford-tensor-gram/quadratic.py new file mode 100644 index 0000000000..a57ba96a01 --- /dev/null +++ b/research/clifford-tensor-gram/quadratic.py @@ -0,0 +1,256 @@ +"""Exact sums of native Clifford paths, with no state vector. + +The proof and cost bounds are in ADVANCES.md. Binary affine forms use bit +zero for the constant and bit j+1 for variable j. All phases are retained. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +from itertools import combinations +from pathlib import Path +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parent / "vendor")) +from fields import Gaussian as G + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def bits(mask): + while mask: + low = mask & -mask + yield low.bit_length()-1 + mask ^= low + + +def parity_sum(values): + out = 0 + for value in values: + out ^= value + return out + + +class Phase: + """A constant plus linear terms and even quadratic terms modulo four.""" + + def __init__(self, variables): + self.constant = 0 + self.linear = [0]*variables + self.cross = set() + + def toggle(self, i, j): + if i == j: + self.linear[i] = (self.linear[i]+2) % 4 + else: + term = tuple(sorted((i, j))) + self.cross.symmetric_difference_update((term,)) + + def add_parity(self, mask, coefficient): + constant = mask & 1 + variables = list(bits(mask >> 1)) + self.constant = (self.constant+coefficient*constant) % 4 + for i in variables: + self.linear[i] = (self.linear[i]+coefficient*(1-2*constant)) % 4 + if coefficient % 2: + self.cross.symmetric_difference_update(combinations(variables, 2)) + + def add_product(self, left, right): + """Add twice the product of two binary affine forms.""" + if left & 1: + self.add_parity(right, 2) + if right & 1: + self.add_parity(left ^ (left & 1), 2) + for i in bits(left >> 1): + for j in bits(right >> 1): + self.toggle(i, j) + + def substitute(self, mapping, variables): + out = Phase(variables) + out.constant = self.constant + for i, coefficient in enumerate(self.linear): + out.add_parity(mapping[i], coefficient) + for i, j in self.cross: + out.add_product(mapping[i], mapping[j]) + return out + + def restrict(self, equations): + pivots = {} + for equation in equations: + while equation > 1: + pivot = equation.bit_length()-1 + if pivot not in pivots: + pivots[pivot] = equation + break + equation ^= pivots[pivot] + if equation == 1: + return None + mapping, free = [], 0 + for j in range(1, len(self.linear)+1): + if j in pivots: + equation = pivots[j] ^ (1 << j) + value = (equation & 1) ^ parity_sum(mapping[k] for k in bits(equation >> 1)) + else: + free += 1 + value = 1 << free + mapping.append(value) + return self.substitute(mapping, free) + + def drop(self, j): + mapping = [0 if k == j else 1 << (k+1-(k > j)) for k in range(len(self.linear))] + return self.substitute(mapping, len(mapping)-1), mapping + + +def gauss_sum(phase, equations=()): + """Sum i**phase over all solutions of the binary equations.""" + phase = phase.restrict(equations) + if phase is None: + return G(0) + factor = G(1) + units = (G(1), G("i"), G(-1), G("-i")) + while phase.linear: + j = next((j for j, a in enumerate(phase.linear) if a % 2), None) + if j is not None: + a = phase.linear[j] + neighbors = [u if v == j else v for u, v in phase.cross if j in (u, v)] + phase, mapping = phase.drop(j) + phase.add_parity(parity_sum(mapping[k] for k in neighbors), -a) + factor = factor*(1+units[a]) + elif phase.cross: + j = min(phase.cross)[0] + constant = phase.linear[j]//2 + neighbors = [u if v == j else v for u, v in phase.cross if j in (u, v)] + phase, mapping = phase.drop(j) + equation = constant ^ parity_sum(mapping[k] for k in neighbors) + phase = phase.restrict((equation,)) + if phase is None: + return G(0) + factor = factor*2 + else: + if any(phase.linear): + return G(0) + factor = factor*(1 << len(phase.linear)) + phase.linear = [] + return factor*units[phase.constant] + + +def rank(rows): + pivots = {} + for row in rows: + while row: + j = row.bit_length()-1 + if j not in pivots: + pivots[j] = row + break + row ^= pivots[j] + return len(pivots) + + +class Paths: + """Build a quadratic path sum from the frozen native gate grammar.""" + + def __init__(self, n, circuit): + need(type(n) is int and n >= 0, "Nonnegative axis count") + self.n = n + self.phase = Phase(n) + self.inputs = [1 << (j+1) for j in range(n)] + self.outputs = self.inputs.copy() + self.factor = G(1) + limit = 1 << n + + def mask(x): + return type(x) is int and 0 <= x < limit + + for gate in circuit: + need(type(gate) in (tuple, list) and bool(gate), "Native gate") + kind = gate[0] + if kind == "P": + need(len(gate) == 2 and len(gate[1]) == n and all(mask(x) for x in gate[1]) + and rank(gate[1]) == n, "Invertible native permutation") + self.outputs = [parity_sum(self.outputs[j] for j in bits(row)) for row in gate[1]] + elif kind == "X": + need(len(gate) == 2 and mask(gate[1]), "Native translation") + self.outputs = [x ^ ((gate[1] >> j) & 1) for j, x in enumerate(self.outputs)] + elif kind == "D": + need(len(gate) == 3 and len(gate[1]) == len(gate[2]) == n, "Native diagonal shape") + rows, alpha = gate[1:] + need(all(mask(x) for x in rows) and all(type(a) is int and 0 <= a < 4 for a in alpha), + "Native diagonal entries") + need(all((rows[i] >> j) & 1 == (rows[j] >> i) & 1 for i in range(n) for j in range(n)) + and all(alpha[j] % 2 == (rows[j] >> j) & 1 for j in range(n)), "Native diagonal parity") + for j, a in enumerate(alpha): + self.phase.add_parity(self.outputs[j], a) + for i, row in enumerate(rows): + for j in bits(row >> (i+1)): + self.phase.add_product(self.outputs[i], self.outputs[j+i+1]) + elif kind == "C": + need(len(gate) == 3 and mask(gate[1]) and type(gate[2]) is int and gate[2] in (-1, 1), + "Native C gate") + q, sign = gate[1:] + self.phase.linear.append((-sign) % 4) + variable = 1 << len(self.phase.linear) + self.outputs = [x ^ (variable if q >> j & 1 else 0) for j, x in enumerate(self.outputs)] + self.factor = self.factor*G.pair(1, sign)/2 + elif kind == "phase": + need(len(gate) == 2 and type(gate[1]) is int, "Native global phase") + self.phase.constant = (self.phase.constant+gate[1]) % 4 + else: + raise ValueError("Unknown native gate") + + def entry(self, output, input_index): + need(type(output) is int and type(input_index) is int and + 0 <= output < 1 << self.n and 0 <= input_index < 1 << self.n, "Base coordinate") + equations = [x ^ ((input_index >> j) & 1) for j, x in enumerate(self.inputs)] + equations += [x ^ ((output >> j) & 1) for j, x in enumerate(self.outputs)] + return self.factor*gauss_sum(self.phase, equations) + + def trace(self): + return self.factor*gauss_sum(self.phase, [x ^ y for x, y in zip(self.inputs, self.outputs)]) + + +def partial_inner(left, right, output_prefix=(), input_prefix=()): + """Sum conjugate(left[x,y])*right[x,y] over the unspecified bits.""" + need(left.n == right.n, "Common axis count") + n = left.n + need(len(output_prefix) <= n and len(input_prefix) <= n and + all(type(b) is int and b in (0, 1) for b in (*output_prefix, *input_prefix)), "Coordinate prefix") + a, b = len(left.phase.linear), len(right.phase.linear) + phase = Phase(a+b) + phase.constant = (-left.phase.constant+right.phase.constant) % 4 + phase.linear = [(-x) % 4 for x in left.phase.linear]+right.phase.linear + phase.cross = left.phase.cross | {(i+a, j+a) for i, j in right.phase.cross} + + def shift(mask): + return (mask & 1) | ((mask >> 1) << (a+1)) + + equations = [x ^ shift(y) for x, y in zip(left.inputs, right.inputs)] + equations += [x ^ shift(y) for x, y in zip(left.outputs, right.outputs)] + equations += [left.outputs[j] ^ x for j, x in enumerate(output_prefix)] + equations += [left.inputs[j] ^ x for j, x in enumerate(input_prefix)] + factor = G.pair(left.factor.real, -left.factor.imag)*right.factor + return factor*gauss_sum(phase, equations) + + +def inverse_circuit(n, circuit): + """Invert a circuit after Paths has checked its gate data.""" + out = [] + for gate in reversed(circuit): + kind = gate[0] + if kind == "P": + rows = [x | (1 << (n+j)) for j, x in enumerate(gate[1])] + for j in range(n): + k = next(k for k in range(j, n) if rows[k] >> j & 1) + rows[j], rows[k] = rows[k], rows[j] + for k in range(n): + if k != j and rows[k] >> j & 1: + rows[k] ^= rows[j] + out.append((kind, tuple(x >> n for x in rows))) + elif kind == "D": + out.append((kind, gate[1], tuple((-a) % 4 for a in gate[2]))) + elif kind == "C": + out.append((kind, gate[1], -gate[2])) + elif kind == "phase": + out.append((kind, -gate[1])) + else: + out.append(gate) + return out diff --git a/research/clifford-tensor-gram/vendor/NATIVE-LINEAGE-NOTICE b/research/clifford-tensor-gram/vendor/NATIVE-LINEAGE-NOTICE new file mode 100644 index 0000000000..380e979f0e --- /dev/null +++ b/research/clifford-tensor-gram/vendor/NATIVE-LINEAGE-NOTICE @@ -0,0 +1,14 @@ +Anticipatory dirty borrowing: PR2226 (Cinna Davis / 1337isnot1337, with substantial OpenAI Codex assistance) is credited first. Its alias rule, changed-reference K_G handoffs, initial compensation and exact free-operator replay (vendored under new/code/borrow/vendor, see new/code/borrow/NOTICE-PR2226.md) are applied here to the T74 pivot-566+554 words; the native lowering, window-exact owner fill and independent audit of the borrow words are new in this package. Bootstrap carried-cutoff repair: PR1956 (Josie Elliston); Lemma G label/adapter checks and X/Y/Z mutants: PR1964 (thakrarsagar), extended here with borrow warp/zero-buffer controls. + +New research prepared by Rohan Arun with substantial OpenAI Codex assistance. Apache-2.0. Parent words and build recipe method derive from Jeremy Kothe PR1274 and Rohan Arun PR1218, with lineage credited in README.md. All inherited mathematical qualifications are retained. +Additional pivot555 and567 composition by Rohan Arun with substantial OpenAI Codex assistance. + +T74 exact-fill owner construction by Rohan Arun with substantial OpenAI Codex assistance. + +PR1377 grid refinement credited to Jeremy Kothe. Outer witness refinement by Rohan Arun with OpenAI Codex assistance; construction unchanged. + +Pivot-566 kernel, words, edits, rebuild.py and rebind.py: PR1625 (mdumitrean). Endpoint/outer-witness stacking, fine_cache.py and oracle stage by jeremykothe2 with oh-my-pi assistance. + +The preceding paragraphs are inherited source notices, not attribution of this derivative. +This joint twelve-source construction, generator, independent replay, hosting composition and package: Tekalign (@tekuuu), with substantial OpenAI Codex assistance. No independent human review claimed. +Credits: Cinna Davis/PR2226 anticipatory dirty borrowing; Tekalign/PR2436 four lifted targets; Jeremy Kothe/PR2462,2588,2673 source pipeline, source-label swap and order/fill; zxv/PR2530 eight aliases; Mason Hale/PR2696 concentrated source-partner assignment and independent local interpreter; Philippe Van Velzen/PR2559,2679 evacuation, six pre-life hosts and refit/alias; themilkman216/PR2621 priority order; Marius-Paul Dumitrean/PR2733 independent concentrated/pre-life composition; Vlado Vojdanovski/PR2322 generator utilities. PR2720's fixed-old-path cut obstruction motivates the changed premise. The retained owner/native/bit/modern outer lineage and their notices remain in the pinned source. New work Apache-2.0. diff --git a/research/clifford-tensor-gram/vendor/clifford_exact.py b/research/clifford-tensor-gram/vendor/clifford_exact.py new file mode 100644 index 0000000000..166841a037 --- /dev/null +++ b/research/clifford-tensor-gram/vendor/clifford_exact.py @@ -0,0 +1,149 @@ +"""Small exact Gaussian-dyadic Clifford compiler, independent of gx internals. +Paulis use i^p X^x Z^z. State vectors use integer Gaussian numerators / 2^d. +The tableau is supplemented by a literal circuit, so global phases are kept. +""" +from dataclasses import dataclass + +def parity(x):return x.bit_count()&1 +def rank(rows): + p={} + for x in rows: + while x: + b=x.bit_length()-1 + if b not in p:p[b]=x;break + x^=p[b] + return len(p) +def transpose(rows,n):return tuple(sum(((rows[j]>>i)&1)<>j&1);a[j],a[k]=a[k],a[j] + for i in range(n): + if i!=j and a[i]>>j&1:a[i]^=a[j] + assert [r&((1<>n for r in a) +def basis_extend(cols,n): + out=[] + for x in list(cols)+[1<len(out):out.append(x) + assert len(out)==n + return tuple(out) +def nullspace(rows,n): + a=list(rows);p=[];k=0 + for j in range(n): + t=next((i for i in range(k,len(a)) if a[i]>>j&1),None) + if t is None:continue + a[t],a[k]=a[k],a[t] + for i in range(len(a)): + if i!=k and a[i]>>j&1:a[i]^=a[k] + p.append(j);k+=1 + return tuple((1<>j)&1)<>i&1:out=pmul(out,T[i]) + for i in range(n): + if z>>i&1:out=pmul(out,T[n+i]) + return out +def compose(A,B):return tuple(apply(A,p) for p in B) +def inverse(T): + n=len(T)//2;cols=[x|(z<>n;u,v,p=apply(T,(x,z,0));assert (u,v)==identity(n)[j][:2];out.append((x,z,(-p)%4)) + return tuple(out) +def qvalue(Q,alpha,x,n): + return (sum(alpha[i] for i in range(n) if x>>i&1)+2*sum(parity((Q[i]>>(i+1))&(x>>(i+1))) for i in range(n) if x>>i&1))%4 +def mul_i(a,p): + x,y=a;p%=4 + return [(x,y),(-y,x),(-x,-y),(y,-x)][p] +@dataclass +class Op: + n:int + tab:tuple + circuit:list + def then(self,b): + assert self.n==b.n + return Op(self.n,compose(b.tab,self.tab),self.circuit+b.circuit) + def adjoint(self): + circ=[] + for e in reversed(self.circuit): + if e[0]=='P':circ.append(('P',inv(e[1],self.n))) + elif e[0]=='D':circ.append(('D',e[1],tuple((-x)%4 for x in e[2]))) + elif e[0]=='C':circ.append(('C',e[1],-e[2])) + elif e[0]=='phase':circ.append(('phase',(-e[1])%4)) + else:circ.append(e) + return Op(self.n,inverse(self.tab),circ) + def zero_state(self,basis=0): + N=1<>i)&1 for i in range(n)) + assert all(alpha[i]%2==(Q[i]>>i)&1 for i in range(n)) + return Op(n,tuple([(1<>i&1 else 0,1<>i&1 else 0) for i in range(n)]),[('C',q,sgn)]) +def xgate(n,b):return Op(n,tuple([(1<>i)&1)) for i in range(n)]),[('X',b)]) +def fourier(n,axes=None): + out=ident(n) + for i in range(n) if axes is None else axes:out=out.then(cgate(n,1<len(selected):picks.append(j);selected.append(x) + assert len(picks)==r and all(x>>r==0 for x in Bcols) + Br=transpose(selected,r);Bi=inv(Br,r);Dr=transpose([Dcols[j]&((1<= 0 else "")+str(self.imag)+"i" + + __repr__ = __str__ + + +def scalars(problem): + p = problem.get("field", "Q") + if p == "Q": + return Fraction + if p == "Qi": + return Gaussian + if type(p) is not int: + raise ValueError("field must be Q, Qi or a prime at most 2^31-1") + return prime_scalars(p) + + +@lru_cache(maxsize=32) +def prime_scalars(p): + if not 2 <= p <= 2**31-1 or any(p % d == 0 for d in range(2, isqrt(p)+1)): + raise ValueError("field must be Q, Qi or a prime at most 2^31-1") + + class Prime: + def __init__(self, x=0): + if isinstance(x, Prime): + self.value = x.value + else: + q = Fraction(x) + self.value = q.numerator*pow(q.denominator, -1, p) % p + + def __add__(self, other): + return Prime(self.value+Prime(other).value) + + __radd__ = __add__ + + def __mul__(self, other): + return Prime(self.value*Prime(other).value) + + __rmul__ = __mul__ + + def __neg__(self): + return Prime(-self.value) + + def __sub__(self, other): + return self+-Prime(other) + + def __rsub__(self, other): + return Prime(other)+-self + + def __truediv__(self, other): + return Prime(self.value*pow(Prime(other).value, -1, p)) + + def __rtruediv__(self, other): + return Prime(other)/self + + def __eq__(self, other): + return self.value == Prime(other).value + + def __bool__(self): + return bool(self.value) + + def __str__(self): + return str(self.value) + + __repr__ = __str__ + + return Prime diff --git a/research/clifford-tensor-gram/verify.py b/research/clifford-tensor-gram/verify.py new file mode 100644 index 0000000000..ff3365a66c --- /dev/null +++ b/research/clifford-tensor-gram/verify.py @@ -0,0 +1,351 @@ +"""Check the trace proof, native source and literal tensor failures. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +from collections import Counter, deque +from fractions import Fraction as Q +import hashlib +import json +from pathlib import Path +import random +import sys + +HERE = Path(__file__).resolve().parent + + +def need(condition, message): + if not condition: + raise ValueError(message) + + +def source_integrity(): + sources = json.loads((HERE / "SOURCES.json").read_text()) + pairs = {"fields.py": "research/universal-dirty-certificates/fields.py", + "clifford_exact.py": "research/t74-native-fast/vendor/native/new/code/borrow/vendor/clifford/clifford_exact.py"} + for local, original in pairs.items(): + record = next(item for item in sources["files"] if item["path"] == original) + need(hashlib.sha256((HERE / "vendor" / local).read_bytes()).hexdigest() == record["sha256"], "Frozen source: "+local) + + +source_integrity() +sys.path.insert(0, str(HERE)) +sys.path.insert(0, str(HERE / "vendor")) +import certify as c +import check_witness as independent +import clifford_exact as native +G = c.G + + +def source_matrix(op): + columns = [] + for j in range(1 << op.n): + values, exponent = op.zero_state(j) + columns.append([G.pair(Q(a, 1 << exponent), Q(b, 1 << exponent)) for a, b in values]) + return tuple(tuple(column[i] for column in columns) for i in range(1 << op.n)) + + +def example(operators, program, reference=(), axes=1, roles=3): + return {"axes": axes, "roles": roles, "operators": {name: [[str(x) for x in row] for row in a] for name, a in operators.items()}, + "program": list(program), "reference": list(reference)} + + +def group_one_axis(): + generators = [native.cgate(1, 1), native.diag(1, (1,))] + bank = {c.key(c.identity(2)): (c.identity(2), native.ident(1))} + queue = deque(bank.values()) + edges = 0 + while queue: + a, op = queue.popleft() + for generator in generators: + product = c.multiply(source_matrix(generator), a) + label = c.key(product) + edges += 1 + if label not in bank: + following = product, op.then(generator) + bank[label] = following + queue.append(following) + need(len(bank) == 96 and edges == 192, "Complete group closure") + for a, op in bank.values(): + need(a == source_matrix(op), "Literal native word phase") + c.validate_operator(a, 1) + return [a for a, _ in bank.values()] + + +def kron(a, b): + return tuple(tuple(x*y for x in row_a for y in row_b) for row_a in a for row_b in b) + + +def dense_tensor_norm(terms, width): + d = len(terms[0][1])**width + out = [[G(0) for _ in range(d)] for _ in range(d)] + for coefficient, a in terms: + tensor = ((G(1),),) + for _ in range(width): + tensor = kron(tensor, a) + for i in range(d): + for j in range(d): + out[i][j] = out[i][j]+coefficient*tensor[i][j] + return sum(c.norm2(z) for row in out for z in row)/d + + +def dense_program(problem, instructions, width): + d, r = (1 << problem["axes"])**width, problem["roles"] + count = d*r + rows = [[[G(int(i == role*d+j)) for i in range(count)] for j in range(d)] for role in range(r)] + lifted = {} + for name, encoded in problem["operators"].items(): + a = tuple(tuple(G(x) for x in row) for row in encoded) + tensor = ((G(1),),) + for _ in range(width): + tensor = kron(tensor, a) + lifted[name, False], lifted[name, True] = tensor, independent.star(tensor) + for op in instructions: + kind, dst = op["op"], op["dst"] + src = op.get("src", dst) + if kind == "swap": + rows[dst], rows[src] = rows[src], rows[dst] + elif kind == "scale": + rows[dst] = [[G(op["coefficient"])*x for x in row] for row in rows[dst]] + else: + image = rows[src] + if kind in ("apply", "query"): + a = lifted[op["symbol"], op.get("inverse", False)] + image = [[sum((a[j][k]*rows[src][k][i] for k in range(d)), G(0)) for i in range(count)] for j in range(d)] + if kind == "apply": + rows[dst] = image + else: + rows[dst] = [[x+G(op.get("coefficient", 1))*y for x, y in zip(a, b)] for a, b in zip(rows[dst], image)] + return rows + + +def independent_residual(problem): + bank = independent.matrices(problem) + d, r = 1 << problem["axes"], problem["roles"] + result = {} + for input_role in range(r): + left = independent.word_endpoint(problem, problem["program"], input_role) + right = independent.word_endpoint(problem, problem["reference"], input_role) + for output in range(r): + row = {} + for sign, words in [(1, left[output]), (-1, right[output])]: + for word, coefficient in words.items(): + a = independent.evaluate_word(word, bank, d) + c.accumulate(row, (output, input_role, c.key(a)), coefficient*sign) + result.update(row) + return result + + +def verify(write=False): + rng = random.Random(20261023) + group = group_one_axis() + C, S = source_matrix(native.cgate(1, 1)), source_matrix(native.diag(1, (1,))) + H, I = source_matrix(native.hadamard(1, [0])), c.identity(2) + phase_i = tuple(tuple(G("i")*z for z in row) for row in I) + need(c.multiply(H, H) == phase_i, "Source Hadamard phase") + operators = {"C": C, "S": S, "H": H, "iI": phase_i} + zero_axis = example({str(k): ((c.power(G("i"), k),),) for k in range(4)}, + [{"op": "query", "src": 0, "dst": 1, "symbol": str(k), "coefficient": "1/4"} + for k in range(4)], axes=0, roles=2) + zero_certificate = c.certify(zero_axis) + need(not zero_certificate["equivalent_at_all_positive_widths"], "Zero-axis scalar group") + need(zero_certificate["failure"]["normalized_squared_norms"] == ["0", "0", "0", "1"], "Zero-axis scalar group") + independent.check(zero_axis, zero_certificate) + need(c.certify(example({}, [], axes=0, roles=1))["equivalent_at_all_positive_widths"], "Empty zero-axis program") + polynomial_values = 0 + for n in range(13): + polynomial = c.cutoff_polynomial(n) + need(len(polynomial) == 8*n+5 and polynomial[0] == 0 and sum(polynomial) == 1, "Polynomial endpoints") + need(sum(abs(b) for b in polynomial) < Q(8, 7), "Coefficient norm") + need(sum(b for b in polynomial if b > 0) < Q(15, 14), "Positive coefficient mass") + alphabet = [G(0)] + [c.power(G("i"), k)*c.power(G("1+1i"), d)/(1 << n) for d in range(2*n+1) for k in range(4)] + for z in alphabet: + value = G(0) + for b in reversed(polynomial): + value = value*z+b + need(value == int(z == 1), "Trace-filter value") + polynomial_values += 1 + source_columns = 192 + native_fixtures = [] + for n in range(1, 5): + for q in range(1, 1 << n): + for sign in (-1, 1): + a = source_matrix(native.cgate(n, q, sign)) + first, second = G.pair(Q(1, 2), Q(sign, 2)), G.pair(Q(1, 2), Q(-sign, 2)) + expected = tuple(tuple(first if i == j else second if i == (j ^ q) else G(0) for j in range(1 << n)) for i in range(1 << n)) + need(a == expected, "Source C column formula") + c.validate_operator(a, n) + source_columns += 1 << n + if n <= 3: + native_fixtures.append((n, a)) + for sign in (-1, 1): + op = native.cgate(9, 173, sign) + for j in range(512): + values, den = op.zero_state(j) + expected = [(0, 0)]*512 + expected[j], expected[j ^ 173] = (1, sign), (1, -sign) + need(den == 1 and values == expected, "Nine-axis source column") + source_columns += 1 + entangling_trace_cases = 0 + for n in (2, 3): + for _ in range(24): + op = native.ident(n) + for _ in range(4): + source_axis, target_axis = rng.sample(range(n), 2) + rows = [1 << j for j in range(n)] + rows[target_axis] ^= 1 << source_axis + phase_rows = tuple(1 << j if j == target_axis else 0 for j in range(n)) + op = op.then(native.cgate(n, rng.randrange(1, 1 << n), rng.choice([-1, 1]))) + op = op.then(native.diag(n, phase_rows)).then(native.perm(n, rows)) + a = source_matrix(op) + need(tuple(c.validate_operator(a, n)) == op.tab, "Entangling source tableau") + trace = sum((a[j][j] for j in range(1 << n)), G(0)) + fixed_sum = 0 + for x in range(1 << n): + for z in range(1 << n): + phase = (x & z).bit_count() % 4 + u, v, p = native.apply(op.tab, (x, z, phase)) + if (u, v) == (x, z): + need((p-phase) % 4 in (0, 2), "Hermitian Pauli sign") + fixed_sum += 1 if p == phase else -1 + need(c.norm2(trace) == fixed_sum, "Pauli conjugation trace identity") + alphabet = [G(0)] + [c.power(G("i"), k)*c.power(G("1+1i"), d) for d in range(2*n+1) for k in range(4)] + need(trace in alphabet, "Entangling trace alphabet") + native_fixtures.append((n, a)) + source_columns += 1 << n + entangling_trace_cases += 1 + dense_norm_cases = 0 + for n in (1, 2): + pool = group if n == 1 else list({c.key(a): a for k, a in native_fixtures if k == n}.values()) + for _ in range(12): + selected = rng.sample(pool, 4) + terms = [(G(rng.choice([-2, -1, "i", "1/2", "1/2-1/2i"])), a) for a in selected] + inner = c.gram(selected) + for width in range(1, 4 if n == 1 else 3): + need(c.energy([x for x, _ in terms], inner, width) == dense_tensor_norm(terms, width), "Independent dense norm") + dense_norm_cases += 1 + result = c.analyze(n, terms) + w = result["witness"] + need(c.tensor_entry([x for x, _ in terms], selected, w["output_tuple"], w["input_tuple"]) == G(w["discrepancy"]) != 0, "Tensor entry") + differential_cases = literal_witnesses = full_column_cases = 0 + for trial in range(72): + instructions = [] + for _ in range(8): + kind = rng.choice(["add", "query", "apply", "scale", "swap"]) + op = {"op": kind, "dst": rng.randrange(3)} + if kind in ("add", "query", "swap"): + op["src"] = rng.randrange(3) + if kind in ("query", "apply"): + op.update(symbol=rng.choice(list(operators)), inverse=bool(rng.randrange(2))) + if kind in ("add", "query", "scale"): + op["coefficient"] = rng.choice([-1, 0, 1, "1/2", "i"]) + instructions.append(op) + problem = example(operators, instructions, instructions if trial % 3 == 0 else []) + _, differences = c.compile_difference(problem) + observed = {(o, i, c.key(a)): x for o, i, terms in differences for x, a in terms} + need(observed == independent_residual(problem), "Signed-word complete endpoint") + differential_cases += 1 + if trial < 12: + for width in (1, 2): + left = dense_program(problem, problem["program"], width) + right = dense_program(problem, problem["reference"], width) + lookup = {(o, i): terms for o, i, terms in differences} + d = 2**width + for o in range(3): + for i in range(3): + terms = lookup.get((o, i), []) + for x in range(d): + for y in range(d): + xt = [(x >> k) & 1 for k in reversed(range(width))] + yt = [(y >> k) & 1 for k in reversed(range(width))] + value = c.tensor_entry([a for a, _ in terms], [b for _, b in terms], xt, yt) + need(value == left[o][x][i*d+y]-right[o][x][i*d+y], "Full tensor program column") + full_column_cases += 1 + if trial < 24: + certificate = c.certify(problem) + if not certificate["equivalent_at_all_positive_widths"]: + independent.check(problem, certificate) + literal_witnesses += 1 + positive = example(operators, [{"op": "apply", "dst": 1, "symbol": "H"}]*2, + [{"op": "apply", "dst": 1, "symbol": "iI"}]) + need(c.certify(positive)["equivalent_at_all_positive_widths"], "Native relation") + phase_trap = example(operators, positive["program"], [{"op": "scale", "dst": 1, "coefficient": "i"}]) + phase_certificate = c.certify(phase_trap) + need(phase_certificate["failure"]["first_nonzero_width"] == 2, "Phase outside tensor") + independent.check(phase_trap, phase_certificate) + reynolds = example({str(i): a for i, a in enumerate(group)}, + [{"op": "query", "src": 0, "dst": 1, "symbol": str(i), "coefficient": "1/96"} for i in range(96)], roles=2) + reynolds_certificate = c.certify(reynolds) + norms = reynolds_certificate["failure"]["normalized_squared_norms"] + need(norms == ["0"]*7+["15/256", "0", "0", "0", "155/4096"], "Reynolds norm sequence") + independent.check(reynolds, reynolds_certificate) + need(independent.discrepancy(reynolds, 1, 0, [0]*8, [0]*8) == G("5/24"), "Reynolds entry") + for f, expected in enumerate(norms, 1): + rank = sum((c.power(sum((a[i][i] for i in range(2)), G(0)), f) for a in group), G(0))/96 + need(rank.imag == 0 and rank.real.denominator == 1 and rank/(2**f) == G(expected), "Projector rank") + controls = [] + def reject(label, function): + try: + function() + except (ValueError, KeyError, TypeError, ZeroDivisionError): + controls.append(label) + return + raise ValueError("Accepted control: "+label) + bad = json.loads(json.dumps(reynolds_certificate)) + bad["failure"]["witness"]["discrepancy"] = "0" + reject("wrong witness value", lambda: independent.check(reynolds, bad)) + bad_width = json.loads(json.dumps(reynolds_certificate)) + bad_width["failure"]["witness"]["width"] = 7 + reject("wrong witness width", lambda: independent.check(reynolds, bad_width)) + for field, value in [("schema", "other"), ("problem_sha256", "0"*64), ("axes", 2), ("cutoff", 13)]: + altered = json.loads(json.dumps(reynolds_certificate)) + altered[field] = value + reject("wrong certificate "+field, lambda altered=altered: independent.check(reynolds, altered)) + for label, matrix in [("nonunitary", [[2, 0], [0, 2]]), ("continuous rational phase", [["3/5+4/5i", 0], [0, "3/5+4/5i"]]), + ("wrong shape", [[1]]), ("floating scalar", [[1.0, 0], [0, 1]])]: + invalid = example({"C": C}, []) + invalid["operators"]["C"] = matrix + reject(label, lambda invalid=invalid: c.certify(invalid)) + toffoli = [[int(i == (j ^ (4 if j & 3 == 3 else 0))) for j in range(8)] for i in range(8)] + invalid = {"axes": 3, "roles": 1, "operators": {"T": toffoli}, "program": [], "reference": []} + reject("non-Clifford dyadic unitary", lambda: c.certify(invalid)) + for op in [{"op": "apply", "dst": 3, "symbol": "C"}, {"op": "apply", "dst": 0, "symbol": "missing"}, + {"op": "apply", "dst": 0, "symbol": "C", "inverse": 1}, {"op": "add", "src": 0, "dst": 1, "coefficient": 0.5}, + {"op": "query", "dst": 0, "symbol": "C"}, {"op": "apply", "dst": 0, "symbol": "C", "phase": 0}]: + reject("invalid instruction "+str(len(controls)), lambda op=op: c.certify(example(operators, [op]))) + helper = example(operators, [{"op": "query", "src": 0, "dst": 2, "symbol": "C"}]) + helper_certificate = c.certify(helper) + need(helper_certificate["failure"]["output_role"] == 2, "Dirty helper return") + independent.check(helper, helper_certificate) + controls.append("omitted helper return detected") + order = example(operators, [{"op": "apply", "dst": 0, "symbol": "C"}, {"op": "apply", "dst": 0, "symbol": "S"}], + [{"op": "apply", "dst": 0, "symbol": "S"}, {"op": "apply", "dst": 0, "symbol": "C"}]) + independent.check(order, c.certify(order)) + controls += ["noncommuting order detected", "phase outside tensor detected"] + receipt = {"status": "PASS_CLIFFORD_TENSOR_GRAM_NO_NEW_KAPPA", "cutoff": "8n+4", "separation": "14/15", + "one_axis_group_order": 96, "closure_edges": 192, + "trace_histogram": dict(sorted(Counter(str(sum((a[i][i] for i in range(2)), G(0))) for a in group).items())), + "polynomial_values": polynomial_values, "native_source_columns": source_columns, + "entangling_trace_cases": entangling_trace_cases, + "dense_norm_cases": dense_norm_cases, "complete_endpoint_comparisons": differential_cases, + "full_tensor_programs": full_column_cases, "random_literal_witnesses": literal_witnesses, + "zero_axis_cases": 2, + "reynolds": reynolds_certificate["failure"], "controls": controls} + files = {"RESULT.json": receipt, "examples/native-relation.json": positive, "examples/phase-trap.json": phase_trap, + "examples/phase-trap.certificate.json": phase_certificate, "examples/reynolds.json": reynolds, + "examples/reynolds.certificate.json": reynolds_certificate} + for name, data in files.items(): + path = HERE / name + if write: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(data, indent=2, sort_keys=True)+"\n", encoding="utf-8") + else: + need(json.loads(path.read_text()) == data, "Committed result mismatch: "+name) + print(receipt["status"]) + return receipt + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--write", action="store_true", help="Regenerate the receipt and examples") + verify(parser.parse_args().write) diff --git a/research/clifford-tensor-gram/verify_advances.py b/research/clifford-tensor-gram/verify_advances.py new file mode 100644 index 0000000000..22437672d9 --- /dev/null +++ b/research/clifford-tensor-gram/verify_advances.py @@ -0,0 +1,288 @@ +"""Replay the width refinements and compact native computation. + +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +from collections import deque +from fractions import Fraction as Q +import hashlib +import json +from pathlib import Path +import random +import sys + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +import verify as v +import compact as compact +import quadratic as q + + +def saved(name, data, write): + path = HERE / name + encoded = json.dumps(data, indent=2, sort_keys=True)+"\n" + if write: + path.write_text(encoded, encoding="utf-8") + else: + v.need(path.read_text(encoding="utf-8") == encoded, "Committed advance receipt: "+name) + + +def modular_inverse(matrix, p): + n = len(matrix) + rows = [row[:] + [int(i == j) for j in range(n)] for i, row in enumerate(matrix)] + for j in range(n): + k = next(k for k in range(j, n) if rows[k][j]) + rows[k], rows[j] = rows[j], rows[k] + scale = pow(rows[j][j], -1, p) + rows[j] = [x*scale % p for x in rows[j]] + for k in range(n): + if k != j: + scale = rows[k][j] + rows[k] = [(x-scale*y) % p for x, y in zip(rows[k], rows[j])] + return [row[n:] for row in rows] + + +def one_axis_certificate(group, write): + p, root = 65537, 256 + v.need(all(p % d for d in range(2, 257)) and root*root % p == p-1, "Prime field") + inner = v.c.gram(group) + + def reduce(z): + def part(x): + return x.numerator*pow(x.denominator, -1, p) + return (part(z.real)+root*part(z.imag)) % p + + matrix = [[sum(pow(reduce(z), f, p) for f in range(5, 9)) % p for z in row] for row in inner] + digest = hashlib.sha256(json.dumps([[[str(z) for z in row] for row in a] for a in group]).encode()).hexdigest() + path = HERE / "ONE-AXIS-RANK.json" + if write: + inverse = modular_inverse(matrix, p) + else: + inverse = json.loads(path.read_text())["inverse"] + v.need(type(inverse) is list and len(inverse) == 96 and all(type(row) is list and len(row) == 96 and + all(type(x) is int and 0 <= x < p for x in row) for row in inverse), "Modular inverse shape") + for i, row in enumerate(matrix): + for j, column in enumerate(zip(*inverse)): + v.need(sum(x*y for x, y in zip(row, column)) % p == int(i == j), "One-axis inverse product") + certificate = {"prime": p, "image_of_i": root, "widths": [5, 6, 7, 8], + "group_sha256": digest, "rank": 96, "inverse": inverse} + saved("ONE-AXIS-RANK.json", certificate, write) + return {key: value for key, value in certificate.items() if key != "inverse"} + + +def check_forms(rng): + count = 0 + units = (q.G(1), q.G("i"), q.G(-1), q.G("-i")) + for m in range(8): + for _ in range(80): + phase = q.Phase(m) + phase.constant = rng.randrange(4) + phase.linear = [rng.randrange(4) for _ in range(m)] + phase.cross = {(i, j) for i in range(m) for j in range(i+1, m) if rng.randrange(2)} + equations = [rng.randrange(1 << (m+1)) for _ in range(rng.randrange(m+1))] + expected = q.G(0) + for x in range(1 << m): + if any((e & 1) ^ (((e >> 1) & x).bit_count() % 2) for e in equations): + continue + exponent = phase.constant+sum(a*((x >> i) & 1) for i, a in enumerate(phase.linear)) + exponent += 2*sum(((x >> i) & 1)*((x >> j) & 1) for i, j in phase.cross) + expected = expected+units[exponent % 4] + v.need(q.gauss_sum(phase, equations) == expected, "Exhaustive constrained quadratic sum") + count += 1 + return count + + +def native_words(): + bank = {v.c.key(v.c.identity(2)): v.native.ident(1)} + queue = deque(bank.values()) + generators = (v.native.cgate(1, 1), v.native.diag(1, (1,))) + while queue: + op = queue.popleft() + for generator in generators: + new = op.then(generator) + label = v.c.key(v.source_matrix(new)) + if label not in bank: + bank[label] = new + queue.append(new) + v.need(len(bank) == 96, "Native word group closure") + return list(bank.values()) + + +def check_native(rng): + words = native_words() + for n in (2, 3): + for _ in range(16): + op = v.native.ident(n) + for _ in range(8): + raw = [rng.randrange(1 << n) for _ in range(n)] + rows = [sum(((raw[min(i, j)] >> max(i, j)) & 1) << j for j in range(n)) for i in range(n)] + alpha = [((rows[i] >> i) & 1)+2*rng.randrange(2) for i in range(n)] + source, target = rng.sample(range(n), 2) + permutation = [1 << j for j in range(n)] + permutation[target] ^= 1 << source + op = op.then(v.native.diag(n, rows, alpha)).then(v.native.perm(n, permutation)) + op = op.then(v.native.cgate(n, rng.randrange(1 << n), rng.choice((-1, 1)))) + op = op.then(v.native.xgate(n, rng.randrange(1 << n))) + words.append(op) + entries, traces, partials = 0, 0, 0 + for op in words: + matrix = v.source_matrix(op) + paths = q.Paths(op.n, op.circuit) + inverse = q.Paths(op.n, q.inverse_circuit(op.n, op.circuit)) + star = v.c.adjoint(matrix) + d = 1 << op.n + v.need(paths.trace() == sum((matrix[j][j] for j in range(d)), q.G(0)), "Native trace phase") + traces += 1 + for x in range(d): + for y in range(d): + v.need(paths.entry(x, y) == matrix[x][y] and inverse.entry(x, y) == star[x][y], "Native entry phase") + entries += 2 + for k in range(op.n+1): + xp = [rng.randrange(2) for _ in range(k)] + yp = [rng.randrange(2) for _ in range(op.n-k)] + expected = sum((v.c.conjugate(matrix[x][y])*star[x][y] + for x in range(d) for y in range(d) + if all(((x >> j) & 1) == bit for j, bit in enumerate(xp)) and + all(((y >> j) & 1) == bit for j, bit in enumerate(yp))), q.G(0)) + v.need(q.partial_inner(paths, inverse, xp, yp) == expected, "Native partial inner product") + partials += 1 + return {"native_words": len(words), "native_entries": entries, "native_traces": traces, + "partial_inner_products": partials} + + +def check_programs(rng): + count, witnesses, relations = 0, 0, 0 + for n in range(3): + ops = {"I": v.native.ident(n), "iI": v.native.Op(n, v.native.identity(n), [("phase", 1)])} + if n: + ops.update(C=v.native.cgate(n, (1 << n)-1), H=v.native.hadamard(n, range(n)), + S=v.native.diag(n, tuple(1 << j for j in range(n)))) + for _ in range(16): + program = [] + for _ in range(8): + kind = rng.choice(("query", "apply", "add", "scale", "swap")) + instruction = {"op": kind, "dst": rng.randrange(3)} + if kind in ("query", "add", "swap"): + instruction["src"] = rng.randrange(3) + if kind in ("query", "apply"): + instruction.update(symbol=rng.choice(list(ops)), inverse=bool(rng.randrange(2))) + if kind in ("scale", "query", "add"): + instruction["coefficient"] = rng.choice(("1", "-1", "i", "1/2")) + program.append(instruction) + problem = {"axes": n, "roles": 3, "operators": {s: o.circuit for s, o in ops.items()}, + "program": program, "reference": []} + dense = v.example({s: v.source_matrix(o) for s, o in ops.items()}, program, axes=n) + _, expected_entries = v.c.compile_difference(dense) + expected = {(output, source): {v.c.key(a): coefficient for coefficient, a in terms} + for output, source, terms in expected_entries} + actual = {} + for output, source, coefficients, paths, _ in compact.residuals(problem): + matrices = [tuple(tuple(path.entry(x, y) for y in range(1 << n)) for x in range(1 << n)) for path in paths] + actual[output, source] = {v.c.key(a): coefficient for coefficient, a in zip(coefficients, matrices)} + v.need(actual == expected, "Compact complete endpoint") + certificate = compact.certify(problem) + v.need(certificate["equivalent_at_all_positive_widths"] == (not expected), "Compact decision") + if "failure" in certificate: + f = certificate["failure"] + w = f["witness"] + value = v.independent.discrepancy(dense, f["output_role"], f["input_role"], w["output_tuple"], w["input_tuple"]) + v.need(value != 0 and str(value) == w["discrepancy"], "Compact literal witness") + witnesses += 1 + count += 1 + for n in (1, 2, 3): + ops = {"C": v.native.cgate(n, (1 << n)-1), "H": v.native.hadamard(n, range(n)), + "phase": v.native.Op(n, v.native.identity(n), [("phase", n)])} + cases = [([{"op": "apply", "dst": 2, "symbol": "C"}]*4, []), + ([{"op": "apply", "dst": 1, "symbol": "H"}]*2, + [{"op": "apply", "dst": 1, "symbol": "phase"}]), + ([{"op": "apply", "dst": 0, "symbol": "C"}, + {"op": "apply", "dst": 0, "symbol": "C", "inverse": True}], [])] + for program, reference in cases: + problem = {"axes": n, "roles": 3, "operators": {s: o.circuit for s, o in ops.items()}, + "program": program, "reference": reference} + dense = v.example({s: v.source_matrix(o) for s, o in ops.items()}, program, reference, axes=n) + v.need(compact.certify(problem)["equivalent_at_all_positive_widths"] and + v.c.certify(dense)["equivalent_at_all_positive_widths"], "Compact exact native relation") + relations += 1 + phase_trap = {"axes": 1, "roles": 1, "operators": {"iI": [("phase", 1)]}, + "program": [{"op": "apply", "dst": 0, "symbol": "iI"}], + "reference": [{"op": "scale", "dst": 0, "coefficient": "i"}]} + norms = compact.certify(phase_trap)["failure"]["normalized_squared_norms"] + v.need(norms[0] == "0" and Q(norms[1]) > 0, "Compact phase stays inside tensor") + return {"complete_programs": count, "literal_witnesses": witnesses, "exact_native_relations": relations, + "scalar_phase_traps": 1} + + +def verify(write=False): + rng = random.Random(5376) + code = {q.parity_sum(row for j, row in enumerate((255, 240, 204, 170)) if mask >> j & 1) for mask in range(16)} + v.need(len(code) == 16 and all(x.bit_count() % 4 == 0 for x in code), "Doubly even code") + for y in range(256): + v.need(sum((-1)**((x & y).bit_count() % 2) for x in code) == 16*int(y in code), "Code Fourier invariant") + h = v.source_matrix(v.native.hadamard(1, [0])) + v.need(h == ((q.G("1/2+1/2i"), q.G("1/2+1/2i")), + (q.G("1/2+1/2i"), q.G("-1/2-1/2i"))) and v.c.power(h[0][0], 8) == q.G("1/16"), + "Eight-copy native phase") + previous = None + for n in range(65): + polynomial = v.c.cutoff_polynomial(n) + norm = sum(abs(x) for x in polynomial) + v.need(norm <= Q(77, 75) and sum(x for x in polynomial if x > 0) <= Q(76, 75), "Improved filter bound") + descending = list(reversed(polynomial[1::4])) + v.need(all((x > 0) == ((-1)**(j*(j+3)//2) == 1) for j, x in enumerate(descending)), "Filter coefficient signs") + if n >= 2: + v.need(norm < previous, "Filter norm decreases") + previous = norm + forms = check_forms(rng) + rank_certificate = one_axis_certificate(v.group_one_axis(), write) + native = check_native(rng) + programs = check_programs(rng) + large = [] + for n in (64, 65): + h = v.native.hadamard(n, range(n)) + operators = {"H": h.circuit, "iI": [("phase", 1)]} + if n == 64: + program = [{"op": "query", "src": 0, "dst": 1, "symbol": "H"}] + reference = [] + else: + program = [{"op": "apply", "dst": 0, "symbol": "H"}]*2 + reference = [{"op": "apply", "dst": 0, "symbol": "iI"}] + problem = {"axes": n, "roles": 2, "operators": operators, "program": program, "reference": reference} + certificate = compact.certify(problem) + v.need(certificate["equivalent_at_all_positive_widths"] == (n == 65), "Large native decision") + if n == 64: + v.need(certificate["failure"]["witness"] == {"width": 1, "output_tuple": [0], "input_tuple": [0], + "discrepancy": "1/4294967296"}, "Large literal Hadamard entry") + saved(f"examples/native-{n}.json", problem, write) + saved(f"examples/native-{n}.certificate.json", certificate, write) + large.append({"axes": n, "base_dimension": str(1 << n), "equivalent": n == 65}) + controls = [] + for label, function in [ + ("singular permutation", lambda: q.Paths(2, [("P", [1, 1])])), + ("diagonal parity", lambda: q.Paths(1, [("D", [1], [0])])), + ("asymmetric diagonal", lambda: q.Paths(2, [("D", [2, 0], [0, 0])])), + ("wrong C sign", lambda: q.Paths(1, [("C", 1, 0)])), + ("unknown gate", lambda: q.Paths(1, [("H", 0)])), + ("coordinate out of range", lambda: q.Paths(1, []).entry(2, 0)), + ("invalid prefix", lambda: q.partial_inner(q.Paths(1, []), q.Paths(1, []), [2])), + ("negative axes", lambda: q.Paths(-1, [])), + ]: + try: + function() + except ValueError: + controls.append(label) + else: + raise ValueError("Accepted control: "+label) + receipt = {"status": "PASS_CLIFFORD_ADVANCES_NO_NEW_KAPPA", "general_test_widths": "8n-3 through 8n+4 for n>=2", + "stable_separation": "75/76", "filter_axis_counts": 65, "code_fourier_values": 256, + "one_axis": rank_certificate, "exhaustive_quadratic_forms": forms, + **native, **programs, "large_native_programs": large, "controls": controls} + saved("ADVANCES-RESULT.json", receipt, write) + print(receipt["status"]) + return receipt + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--write", action="store_true", help="Regenerate the advance receipts") + verify(parser.parse_args().write) diff --git a/research/clifford-tensor-gram/verify_provider.py b/research/clifford-tensor-gram/verify_provider.py new file mode 100644 index 0000000000..6a63161f9d --- /dev/null +++ b/research/clifford-tensor-gram/verify_provider.py @@ -0,0 +1,310 @@ +"""Check the complete selected provider and the fixed pair-fusion domain. + +Use --write to save receipts. Normal replay does not change package files. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +""" +from collections import Counter +from copy import deepcopy +from fractions import Fraction as Q +import gzip +import hashlib +import json +from pathlib import Path +import sys + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import compact +import certify as c +import provider as p +from check_witness import word_endpoint +from quadratic import Paths, partial_inner, inverse_circuit +from verify import source_integrity + +HERE = Path(__file__).resolve().parent + + +def canonical(value): + return (json.dumps(value, sort_keys=True, separators=(",", ":")) + "\n").encode() + + +def saved(name, value, write): + raw = canonical(value) + path = HERE / "provider" / name + if write: + path.write_bytes(gzip.compress(raw, mtime=0) if name.endswith(".gz") else raw) + else: + expected = path.read_bytes() + if name.endswith(".gz"): + expected = gzip.decompress(expected) + p.need(expected == raw, "Provider receipt differs: " + name) + return hashlib.sha256(raw).hexdigest() + + +def equal(left, right): + a, b = Paths(p.N, left), Paths(p.N, right) + value = partial_inner(a, b) / p.D + p.need(value == 1, "Exact native Gram equality with absolute phase") + return a + + +def check_catalogue(model, data, audits): + expected = {(a, b, direction): rank for direction, audit in audits.items() + for (a, b), rank in audit["pairs"].items()} + header, *records = data["paid"] + raw = gzip.decompress((HERE / "provider/WORD.json.gz").read_bytes()) + p.need(header["word_payload_sha256"] == hashlib.sha256(raw).hexdigest() + and not header["partial"], "Complete catalogue bound to the exact word") + seen, traces = set(), {} + for row in records: + a, b, direction = row["input"], row["output"], row["direction"] + key = a, b, direction + p.need(key in expected and key not in seen and row["rank"] == row["recipe"]["rank"] == expected[key], + "Unique actual paid class and rank") + actual = equal(model.edge(a, b, direction), p.recipe(row["recipe"])) + traces[key] = actual.trace() / p.D + seen.add(key) + p.need(seen == set(expected) and len(seen) == header["expected_complete_oriented_classes"], + "All oriented paid classes, without gaps") + + warp_records = {(row["operator"], row["input"], row["output"]): row + for row in data["phases"]["actual_warp_classes"]} + p.need(len(warp_records) == len(data["phases"]["actual_warp_classes"]), "No duplicate warp classes") + for direction, audit in audits.items(): + p.need(set(warp_records) == audit["warps"], "All actual native warp classes") + for (signed, a, b), row in warp_records.items(): + rec = row["recipes"][direction] + p.need(rec["rank"] == 0, "Every warp is a monomial") + equal(model.warp(signed, a, b, direction), p.recipe(rec)) + + helpers = {} + for row in data["helpers"]["new_physical_edges_and_boundaries"]: + helpers[row["old"], row["new"]] = row + for row in data["phases"]["changed_helper_boundaries"]: + helpers[row["input"], row["output"]] = row + actual_helpers = Counter(zip(model.c["start"][224:], model.c["final"][224:])) + helper_profile = Counter() + for (a, b), count in sorted(actual_helpers.items()): + u, v = model.c["frames"][a], model.c["frames"][b] + r = len(v)-len(u) + p.need(r > 0 and p.rank(u+v) == len(v), "Strict productive helper boundary") + helper_profile[r] += count + for direction in ("forward", "backward"): + rec = helpers[a, b]["recipes"][direction] + p.need(rec["rank"] == r, "Complete helper recipe rank") + equal(model.edge(a, b, direction), p.recipe(rec)) + + adapters = json.loads((HERE / "provider/MAIN-ADAPTERS.json").read_bytes()) + adapter_seen = set() + for row in adapters: + entrance, register, f = row["entrance"], row["role"], row["frame"] + p.need(type(entrance) is bool and type(register) is int and 0 <= register < 224, + "Main adapter label") + key = entrance, register + p.need(key not in adapter_seen and f == model.c["start" if entrance else "final"][register], + "Exact complete adapter boundary") + p.need(row["recipe"]["rank"] == 0, "Main adapter is a monomial") + target = inverse_circuit(p.N, model.old_frame(register, entrance)) + model.frame(f) + decoded = p.recipe(row["recipe"]) + for direction in ("forward", "backward"): + equal(target if direction == "forward" else p.conjugate(target), + decoded if direction == "forward" else p.conjugate(decoded)) + adapter_seen.add(key) + p.need(adapter_seen == {(side, r) for side in (False, True) for r in range(224)}, + "All main adapters in both orientations") + return traces, dict(paid_oriented_classes=len(seen), warp_oriented_classes=2*len(warp_records), + helper_oriented_classes=2*len(actual_helpers), helper_roles=sum(actual_helpers.values()), + helper_profile=dict(sorted(helper_profile.items())), + main_adapter_oriented_classes=2*len(adapter_seen)) + + +def fusion_census(model, traces): + evidence, trace_counts, kinds, ranks = {}, Counter(), Counter(), Counter() + for direction, program in model.word["programs"].items(): + rows = [] + for pair in p.fusion_pairs(program): + row = p.contact_witness(program, pair) + a, b, c0, d = row["frames"] + for name, key in (("late_trace", (a, b, direction)), ("early_trace", (c0, d, direction))): + tau = traces[key] + # f=1: Re(tau)<=1/2. f>=2: |tau|^f<=1/2. + p.need(tau.real <= Q(1, 2) and c.norm2(tau) <= Q(1, 2), "Uniform noncentral trace bound") + row[name] = str(tau) + trace_counts[str(tau)] += 1 + p.need(Q(row["coefficient"]) != 0, "Nonzero contact coefficient") + kinds[direction + ("_row" if row["output"] == row["role"] else "_column")] += 1 + ranks[str(row["ranks"])] += 1 + rows.append(row) + evidence[direction] = rows + minimum = min(Q(row["coefficient"])**2 for rows in evidence.values() for row in rows) + return evidence, dict(trace_counts=dict(sorted(trace_counts.items())), contact_types=dict(sorted(kinds.items())), + rank_pairs=dict(sorted(ranks.items())), uniform_squared_cut_block_lower_bound=str(minimum), + pairs_by_direction={d: len(rows) for d, rows in evidence.items()}, + rejected_fusions=2*sum(map(len, evidence.values())), + width_domain="every positive integer", + normalized_squared_cut_defect_lower_bound="coefficient^2") + + +def check_contact_certificates(model, evidence): + """Check coverage by role lists, then use the older input-column engine.""" + count = 0 + for direction, certificates in evidence.items(): + events = model.word["programs"][direction] + expected = set() + for register in range(p.PERSISTENT): + climbs = [(j, event) for j, event in enumerate(events) + if event[0] == "climb" and event[2] == register] + expected.update((a, b) for j, (a, _) in enumerate(climbs) for b, _ in climbs[j+1:]) + p.need(len(certificates) == len(expected) and {(r["first"], r["second"]) for r in certificates} == expected, + "Independent complete same-role pair census") + skeleton = [] + for event in events: + instructions = [] + if event[0] == "warp": + instructions.append(dict(op="apply", dst=p.role(event[1]), symbol=str(abs(event[2])), inverse=event[2] < 0)) + elif event[0] == "scalar": + gate = event[1] + target, op = p.role(gate[1]), gate[0] + if op in ("clear", "copy"): + instructions.append(dict(op="scale", dst=target, coefficient="0")) + if op in ("copy", "add"): + instructions.append(dict(op="add", src=p.role(gate[2]), dst=target, + coefficient=str(Q(1) if op == "copy" else Q(gate[3], gate[4])))) + elif op == "scale": + instructions.append(dict(op="scale", dst=target, coefficient=str(Q(gate[2], gate[3])))) + skeleton.append(instructions) + interface = dict(roles=p.PERSISTENT+1, operators={str(j): None for j in range(1, 73)}) + for row in certificates: + program = [instruction for event in skeleton[row["first"]+1:row["second"]] for instruction in event] + result = word_endpoint(interface, program, row["input"])[row["output"]] + word = tuple((str(abs(signed)), signed < 0) for signed in row["word"]) + p.need(result == {word: c.G(row["coefficient"])}, "Separate complete contact coefficient replay") + count += 1 + return count + + +def fused_program(problem, offsets, pair, early): + first, second, *_ = pair + program = problem["program"] + merged = program[offsets[first]:offsets[first+1]] + program[offsets[second]:offsets[second+1]] + return (program[:offsets[first]] + (merged if early else []) + + program[offsets[first+1]:offsets[second]] + ([] if early else merged) + + program[offsets[second+1]:]) + + +def full_witness(problem, program, reference): + """Find a width-one basis witness, then check a separate input-column replay.""" + actual, _ = p.complete_endpoint(problem, program) + names = list(problem["operators"]) + bank = compact.validate(problem) + for output, (left, right) in enumerate(zip(actual, reference)): + difference = left.copy() + p.add(difference, right, Q(-1)) + for entry in sorted({key[0] for key in difference}): + terms = [(word, q) for (source, word), q in difference.items() if source == entry] + circuits = [[gate for signed in reversed(word) + for gate in bank[names[abs(signed)-1], signed < 0]] for word, q in terms] + coefficients, paths, inner = compact.merge_terms([c.G(q) for word, q in terms], + [Paths(p.N, circuit) for circuit in circuits]) + if not coefficients or c.energy(coefficients, inner, 1) == 0: + continue + witness = compact.entry_witness(coefficients, paths, inner, 1) + literal = word_endpoint(problem, program, entry)[output] + wanted = word_endpoint(problem, problem["reference"], entry)[output] + from check_witness import add_term + for word, q in wanted.items(): + add_term(literal, word, -q) + # Independent source amplitude evaluator; no Gram or path sum. + sys.path.insert(0, str(HERE / "vendor")) + import clifford_exact as source + value = c.G(0) + for word, q in literal.items(): + circuit = [gate for letter in reversed(word) for gate in bank[letter]] + vector, denominator = source.Op(p.N, source.identity(p.N), circuit).zero_state(witness["input_tuple"][0]) + real, imag = vector[witness["output_tuple"][0]] + value += q*c.G.pair(Q(real, 1 << denominator), Q(imag, 1 << denominator)) + p.need(value != 0 and str(value) == witness["discrepancy"], "Independent complete-provider basis witness") + return dict(output_role=output, input_role=entry, **witness, + normalized_squared_norm=str(c.energy(coefficients, inner, 1)), + mutated_program_sha256=hashlib.sha256(canonical(program)).hexdigest()) + raise ValueError("No width-one full-program witness") + + +def rejection(name, action): + try: + action() + except (ValueError, KeyError) as error: + return dict(name=name, rejected=str(error)) + raise ValueError("Accepted negative control: " + name) + + +def verify(write=False): + source_integrity() + manifest, data = p.read_inputs() + model = p.Provider(data["word"]) + audits = {d: model.audit_word(d) for d in ("forward", "backward")} + traces, native = check_catalogue(model, data, audits) + print("PASS_ALL_PROVIDER_NATIVE_CLASSES", native, flush=True) + results, witnesses = {}, [] + for direction in ("forward", "backward"): + problem, offsets = model.problem(direction) + actual, support = p.complete_endpoint(problem, problem["program"]) + reference, _ = p.complete_endpoint(problem, problem["reference"]) + p.need(actual == reference, "Complete sparse physical endpoint") + certificate = compact.certify(problem) + p.need(certificate["equivalent_at_all_positive_widths"], "Complete compact provider certificate") + p.need(not actual[p.OWNED], "Arbitrary owned input is erased at return") + results[direction] = dict(certificate=certificate, support=support, instructions=len(problem["program"]), + native_symbols=len(problem["operators"]), events=audits[direction]["events"], + paid=audits[direction]["paid"]) + pairs = p.fusion_pairs(model.word["programs"][direction]) + selected = [min(pairs, key=lambda row: (row[1]-row[0], row)), + min((row for row in pairs if row[4] != row[5]), key=lambda row: (row[1]-row[0], row))] + events = model.word["programs"][direction] + selected.append(min((row for row in pairs if max(events[row[0]][5], events[row[1]][5]) > 1 + and any(event[0] == "climb" and event[2] == row[2] + for event in events[row[0]+1:row[1]])), + key=lambda row: (row[1]-row[0], row))) + for pair in selected: + for early in (True, False): + witness = full_witness(problem, fused_program(problem, offsets, pair, early), reference) + witnesses.append(dict(direction=direction, placement="early" if early else "late", + pair=list(pair), **witness)) + print("PASS_COMPLETE_PROVIDER", direction, support, flush=True) + fusions, fusion_result = fusion_census(model, traces) + fusion_result["separate_contact_replays"] = check_contact_certificates(model, fusions) + controls = [] + bad = deepcopy(data) + bad["paid"] = bad["paid"][:-1] + controls.append(rejection("missing_paid_class", lambda: check_catalogue(model, bad, audits))) + first = data["paid"][1] + wrong = deepcopy(first["recipe"]) + wrong["left"]["phase"] = (wrong["left"]["phase"]+1) % 4 + controls.append(rejection("paid_absolute_phase", lambda: equal(model.edge(first["input"], first["output"], first["direction"]), p.recipe(wrong)))) + broken = deepcopy(data["word"]) + broken["programs"]["forward"].insert(0, ["scalar", ["clear", ["L", 224]], broken["canonical"]["start"][224]]) + controls.append(rejection("borrowed_erasure", lambda: p.Provider(broken).audit_word("forward"))) + broken_live = deepcopy(data["word"]) + prog = broken_live["programs"]["backward"] + at = next(j for j, event in enumerate(prog) if event[0] == "center") + prog.insert(at, next(event for event in prog if event[0] == "climb")) + controls.append(rejection("live_owned_cut", lambda: p.Provider(broken_live).audit_word("backward"))) + # A block with no contact can permit fusion. The exclusion needs its contact witness. + p.need(all(not row for j, row in enumerate(p.interval([], -1, 0, 0)) if j != 0), "Identity interval positive control") + controls.append(rejection("missing_contact_is_not_a_certificate", lambda: p.contact_witness([], (-1, 0, 0, 0, 2, 2, 3)))) + evidence_sha = saved("FUSIONS.json.gz", fusions, write) + witness_sha = saved("WITNESSES.json", witnesses, write) + result = dict(status="PASS_COMPLETE_PR4610_PROVIDER_AND_30328_FUSION_OBSTRUCTIONS", source_main=manifest["base_commit"], + provider_head=manifest["provider_head"], admission_head=manifest["admission_head"], + complete_local_provider=results, native=native, fusion=fusion_result, + fusion_payload_sha256=evidence_sha, witness_payload_sha256=witness_sha, + full_program_basis_witnesses=len(witnesses), controls=controls, + new_kappa=False, achieved_paid_delta={}, + limits="Fixed early/late fusion of any two persistent paid climbs on one role; no changed contacts, coupled fusions, new controller or physical/outer admission.") + saved("RESULT.json", result, write) + print(result["status"], flush=True) + return result + + +if __name__ == "__main__": + p.need(sys.argv[1:] in ([], ["--write"]), "Use --write or no argument") + verify("--write" in sys.argv)