diff --git a/research/complex-small-m-lower-bounds/.gitattributes b/research/complex-small-m-lower-bounds/.gitattributes new file mode 100644 index 0000000000..ce9465a62f --- /dev/null +++ b/research/complex-small-m-lower-bounds/.gitattributes @@ -0,0 +1,2 @@ +# Keep the package bytes exact: verify.py and SOURCES.json record the sha256 of the data files. +* -text diff --git a/research/complex-small-m-lower-bounds/PROOF.md b/research/complex-small-m-lower-bounds/PROOF.md new file mode 100644 index 0000000000..c90faf4ff2 --- /dev/null +++ b/research/complex-small-m-lower-bounds/PROOF.md @@ -0,0 +1,199 @@ +# The written arguments + +Each part is headed by its status, in the words of the README. "Argued by hand" means a written argument that no +person and no proof checker has checked. The setting and the words are those of README section 3: W arrays of 2^m +complex numbers, calls C_v = aI + bX_v (a = (1+i)/2, b = (1−i)/2), free steps by game, and correctness at every +number f of digit columns, where every letter acts the same way on each of the f columns. + +## 1. The kept-subspace bound + +*Status: proved in Lean for the engine game with rational mixing (`engine_lower_bound`). The form below, over any +field and with any linear mixing, is argued by hand.* + +**Setting.** Fix a width f and let V be the data space of one array at that width. A program has R ≥ W registers; +registers 1..W start with the inputs y_1..y_W, the others start at 0. Three kinds of step: +- *mixing* (free): replace one register by any linear combination of all registers (copies into scratch, overwriting + and erasing included; nothing is assumed invertible); +- *a free letter* (free): apply a map b of a group B to one register; +- *a call* (paid): apply an invertible map g to one register. + +At the end, for each l, some register (a different one for each l) holds T_l·y_l, the target of array l. + +Let N ⊆ V be a subspace with b(N) = N for every free letter b, and let raise(g) = dim(N + gN) − dim N. + +**Theorem.** In every correct run, the sum of raise(g) over the calls is at least raise(T_1) + ... + raise(T_W). If +every call has raise at most `cap` and every target has raise at least `demand`, then cap · s ≥ W · demand. + +*Proof.* A state gives a linear map M from V^W (the inputs) to V^R (the registers). Let A = M(N^W), the image of the +inputs taken from N, and Φ = dim(A + N^R) − R·dim N: what the state adds beyond N in each register. +- At the start A = N^W ⊕ 0 lies in N^R, so Φ = 0. +- Mixing multiplies M by an R × R matrix acting on registers, and a free letter multiplies one block by b. Both map + N^R into itself, so they map A + N^R into (new A) + N^R. The new quotient is an image of the old one, so Φ does not + grow (an erasure may lower it). +- A call g on register r multiplies block r by g. Call this map D; it is invertible, so dim(DA + N^R) = + dim(A + D^(−1)N^R). The space D^(−1)N^R is N in every block except block r, where it is g^(−1)N, and it exceeds N^R + by dim(N + g^(−1)N) − dim N = raise(g) dimensions. So Φ grows by at most raise(g). +- At the end, keep only the W delivering registers. There the image of A is the direct sum over l of + (N + T_l N)/N, because the y_l vary independently over N. Dropping blocks cannot raise a dimension, so + Φ ≥ Σ_l raise(T_l). + +Φ starts at 0, ends at least at Σ_l raise(T_l), and grows by at most raise(g) per call. ∎ + +In the Lean form, the free letters are the engine's shifts, address maps and phases, mixing takes a rational matrix, +and correctness is required at every width (`GLiveKernel`). The one step that uses the mixing, that it maps N^R into +itself, needs only that N is a complex subspace; so the same proof works for complex mixing. That last sentence is +argued, not in Lean. + +## 2. The hook: kept, its cap, and the demands + +*Status: kept and cap proved in Lean at every block size (`hook_kept`, `hook_cap`); demands 8 (block 2) and 224 +(block 3) proved in Lean; the block-4 demand 86,592 checked by computer, with the split into 16 equal character +blocks argued by hand.* + +At block m and width f = j + 2 write the data space of one array as V ⊗ V^(⊗(j+1)), V = C^(2^m), and keep only its +part V ⊗ Λ^(j+1) V (every letter acts the same on each column, so it keeps this part). The hook is + + N = span{ e_x ⊗ e_T : T a (j+1)-subset of addresses, x in T }. + +- *Kept.* A free letter inside one array sends each address x to one address π(x) and multiplies by a number c(x), + the same in every column. It sends e_x ⊗ e_T to a multiple of e_π(x) ⊗ e_π(T), and π(x) lies in π(T). So N is kept + by every shift, every address map (not only the affine ones) and every diagonal phase. +- *Cap.* A call dir(z) pairs each address a with a + z. For each pair and each j-subset w, the vector + e_a ⊗ (e_a ∧ e_w) − e_(a+z) ⊗ (e_(a+z) ∧ e_w) lies in N and its image stays in N. These vectors have disjoint + supports (the w that contain both a and a + z give nothing), so they span a subspace of N of dimension + dim N − (2^m/2)·C(2^m − 2, j) that the call keeps inside N; hence raise(dir z) ≤ (2^m/2)·C(2^m − 2, j). At block 3 (j = 3) that is 280 − 200 = 80; `verify.py` builds the 200 vectors + exactly over the Gaussian integers for all 7 directions, and checks that 80 is attained. (Lean proves the formula + at every block by its own route.) +- *Demand.* raise(C^(⊗m)) is the rank of the block of C^(⊗m) acting on V ⊗ Λ^(j+1) V from N to its complement. At + block 2 it is at least 8 (Lean, `dem2`). At block 3 the block is 280 × 280 and its rank is at least 224: the + characters of F_2^3 (the shifts commute with the kernel) split it into 8 blocks, each of rank at least 28 (Lean, `dem3`). + At block 4 the same split gives 16 blocks; one has rank at least 5,412 by a certificate checked by computer (a + second block was checked too), and that all 16 have that rank is argued by hand. So the demand is at least + 16 × 5,412 = 86,592. + +**Consequences.** With the theorem of section 1: block 2 gives 8W ≤ 4s, so s ≥ 2W; block 3 gives 224W ≤ 80s, so +s ≥ 14W/5; block 4 gives 86,592W ≤ 27,456s, so s ≥ 41W/13. At block 3, a run of two calls on one array raises the +hook by at most 144 < 160 (136 exact vectors, checked by computer), so a grouped call of rank 2 also fits the bound. + +**The widened game** (every address permutation and every phase pattern free). *Status: argued by hand; three AI +reviewers upheld it (one re-derived the bound against the Lean engine, one checked keptness exactly for 199 free +steps including Toffoli, CCZ and controlled-S, one redid the numbers).* The kept bullet above covers every +permutation and every diagonal, and nothing else changes, so 14W/5 and 41W/13 hold there too. + +## 3. Complex mixing and Harvey's B-calls + +*Status: argued by hand, not checked by a person. The numbers it uses are the ones proved in Lean in section 2.* + +- *Complex mixing.* Section 1's proof uses only that mixing is linear and maps N^R into N^R, which holds for complex + coefficients. So 2W and 14W/5 hold with complex mixing. +- *B-calls.* B = (1 − i)·S·C·S with S = diag(1, i). A B-call along an axis at width f is (1 − i)^f times a C-call + between two diagonal maps (S on that bit, in every column). For invertible diagonals D_1, D_2 (which keep N) and a + nonzero scalar λ, raise(λ D_1 C D_2) = dim(D_1^(−1)N + C D_2 N) − dim N = raise(C). The same holds for the target + B^(⊗3) = (1 − i)^3 S^(⊗3) C^(⊗3) S^(⊗3). The program at width 5 is a fixed linear program, so section 1 applies + at that one width, which is all the block-3 proof uses. So 4 arrays at block 3 need at least 12 B-calls too. + +## 4. One array needs m calls + +*Status: argued by hand, not checked by a person. AI reviewers re-derived the general form in two rounds; the +single-array support count was re-derived by one AI reviewer.* + +**Without scratch** (David Harvey's single-array programs P_M0 A_i1 P_M1 ⋯ A_ig P_Mg, with any free steps that send +one address to one address). Follow one input basis vector e_x. A free step sends a basis vector to a multiple of +one basis vector; a call sends it to a combination of at most two (at width f, of at most 2^f). After g calls, +e_x has spread to at most 2^g addresses (2^(gf) at width f). Every column of the target has all its entries nonzero: +the entries of B^(⊗m) are ±1, and those of C^(⊗m) are a^(m−d) b^d with d the distance between the two addresses. +So 2^g ≥ 2^m and g ≥ m, at every width, width 1 included. + +**With scratch and mixing**, in every game whose free letters have at most c nonzeros in each column, with c not +depending on f. The output of array l is a sum over the paths through the program, with fixed coefficients, of +words in the letters; the number of paths does not depend on f. A path with j calls and k free letters gives an +operator with at most c^k 2^(jf) nonzeros per column. If every path from input l to output l had at most m − 1 calls, +the coefficient of input l in output l would have at most (number of paths)·c^(k_max)·2^((m−1)f) nonzeros per column, +fewer than the target's 2^(mf) once f is large. So some path has at least m calls, and one array needs m calls. + +This needs correctness at large f. At width 1, one zero scratch array makes C^(⊗3) free: copy the array into the +scratch, shift the copy by e_i, replace the array by a·(array) + b·(copy), for i = 1, 2, 3. The result is +C_(e_3) C_(e_2) C_(e_1) = C^(⊗3) at width 1, but at width 2 it is a·I + b·(X_v ⊗ X_v) per direction instead of +C_v ⊗ C_v. *Checked by computer* (`verify.py`, part `width`: equal at width 1, all 4,096 entries differ at width 2). + +## 5. Block 3 without phase letters: s ≥ 3W for every group of address maps + +*Status: argued by hand, not checked by a person; one AI reviewer re-derived it and recomputed the certificate with +its own exact code. The certificate's numbers are checked by computer here (`verify.py`, part `face3`).* + +**Statement.** In the game with calls, shifts, any complex mixing with scratch, and address maps from any subgroup H +of GL(3, 2), but no phase letters, every unit for W arrays at block 3 uses at least 3W calls. + +*Proof.* +- *The group.* The calls dir(z) and the shifts X_a generate an abelian group A (every element is a polynomial in the + shifts). An address map h is not in A unless h = 1, and h^(−1) dir(z) h = dir(h^(−1) z), h^(−1) X_a h = + X_(h^(−1) a). So the letters generate the semidirect product A ⋊ H. A program right at every width is an identity + in the group algebra C[A ⋊ H]. +- *Trading address maps for arrays.* C[A ⋊ H] is a free right C[A]-module with basis H. Left multiplication gives an + injective algebra map ρ into n × n matrices over C[A] (n = |H|), with ρ(a) = diag_h(h^(−1) a h) for a in A and + ρ(h′) a permutation matrix. Apply ρ to every step. Each register becomes n registers; a call dir(z) becomes n + calls dir(h^(−1) z), one on each copy; a shift becomes shifts; an address map becomes a permutation of registers, + which is mixing. The result is a program with no address maps for nW arrays with nM calls, in which array (l, h) + is owed h^(−1) K h = dir(h^(−1) e_1) dir(h^(−1) e_2) dir(h^(−1) e_3): the kernel in another basis. +- *The certificate.* At width 3 take the antisymmetric part Λ³(C^8), which every letter keeps, and N = the span of + the 24 *face* triples (three addresses that agree in one bit). Shifts and every diagonal map keep N. For every + direction, raise(dir z) = 8; for every basis b of F_2^3, raise(K_b) = 24 (exact ranks over Q(i)). +- *Count.* Section 1 on the new program gives 8·nM ≥ 24·nW, so M ≥ 3W. ∎ + +**Scope.** Pauli Z phases and scalars do not break it. The engine's phase letters do: S·dir(e_1)·S is a scalar times +a Hadamard on one bit, a product of S phases gives CZ, and conjugating CZ by a Hadamard gives a CNOT, an address map. +Then ρ produces address maps inside the new program, and they leak out of N (`verify.py` checks that a CNOT raises N +by 8). Without address maps, phase letters alone also give 3W at block 3 (argued by hand). So a block-3 saver must +use address maps and phase letters together. Harvey's §7.4 model has neither, and his §6 relabellings with C-calls +fall under this section; his §6 B-calls along relabelled axes bring phases, and there only section 2's 14W/5 +applies. + +## 6. W + m and 2W in every game with bounded free steps + +*Status: argued by hand, not checked by a person. One AI reviewer re-derived 2W line by line and checked its key +orthogonality fact with its own code over a wider set of free steps; one AI reviewer upheld the trace-limit version +of W + m and reproduced its numbers. Below is the outline of the written proofs.* + +**Setting.** Free letters have at most s_0 nonzeros per row and column, each of modulus at most c_0, independent of f +(this includes address maps, phases, Toffoli, controlled-S and maps that mix neighbouring digit columns). A unit is +a straight-line program u_k = D_k c_k, c_k = Σ_(i m. + +## 7. From block 4 on: 2.9447 calls per array in the engine game + +*Status: argued by hand from exact computations, not checked by a person; two AI reviewers reproduced every number +with their own code, and Maximilian Lutz checked it independently (#4643).* The block-4 hook is carried upward +through projections between the frame graphs of the engine, controlled by a coupling argument; the exact values are +834,241/278,850 = 2.99172 at block 5 and 1,188,222/399,685 = 2.97290 at block 6, and the bound stays above 2.9447 at +every block. Its inputs are the exact cap a_1 = 27,456 and lower bounds on what two, three and four moves in +independent directions do to the block-4 hook: a_2 ≥ 48,576, a_3 ≥ 68,320 and a_4 ≥ 86,592 (a_1 and a_4 as in section 2). For a_2 and +a_3, part `depth` of `verify.py` splits the hook over the address bits the moves leave untouched, which turns each +into ranks of at most 280 × 280 that it computes modulo a prime (a lower bound over Q(i)), and it recomputes +834,241/278,850 and 1,188,222/399,685 from that profile; two stored minor certificates, checked on all 16 characters, +are author evidence (`author-evidence/check_mj.c`). The written proof is +`author-evidence/induction-across-block-sizes.md`, an unchanged copy of the file of my repository named in +SOURCES.json, headed by the corrections its AI reviewers asked for; none of them touches this bound. The projections +use the engine's frames, so nothing here carries it to the widened game; there the bounds at blocks 5 and 6 are 62/29 +and 63/31 (checked by computer). diff --git a/research/complex-small-m-lower-bounds/README.md b/research/complex-small-m-lower-bounds/README.md new file mode 100644 index 0000000000..8e140d056a --- /dev/null +++ b/research/complex-small-m-lower-bounds/README.md @@ -0,0 +1,394 @@ +# Lower bounds for small complex units, and the smallest open cases + +No new κ. + +Jacob Sussman. Apache-2.0. Written with AI agents (Anthropic Claude); see *AI assistance and credit*. + +## 1. What this is + +A small unit that transforms W arrays with fewer than W·m calls at block size m would give a large saving, since +the saving is ln(mW/s)/ln m for s calls. With a team of AI agents I looked for one and found none. What came out +instead are lower bounds on s at small m, and a short list of the smallest shapes nobody has settled. This note +collects them in one place, with their status, so that others can use them or start from the open cases. + +| Result | Game | Status | +|---|---|---| +| The kept-subspace bound: s ≥ W · demand / cap for any subspace that every free step keeps | engine game, on the engine's own definitions | proved in Lean | +| Block 2 never saves: s ≥ 2W | engine game; every game with bounded free steps | proved in Lean; argued by hand in the bounded games (one AI reviewer) | +| Block 3: s ≥ 14W/5, so a block-3 unit saves at most 6.28e-2 and every unit with 4 or fewer arrays is excluded | engine game; widened game | proved in Lean; argued by hand in the widened game (three AI reviewers) | +| Block 4: s ≥ 41W/13, so a block-4 unit saves at most 1.71e-1 | engine and widened games | checked by computer; in the widened game it also rests on the keptness argument, argued by hand | +| From block 4 on: at least 2.9447 calls per array (2.99172 at block 5, 2.97290 at block 6) | engine game | argued by hand (two AI reviewers reproduced every number); its block-4 inputs are checked by computer here | +| Block 3 without phase letters: s ≥ 3W, whatever the address maps | no-phase game | argued by hand (one AI reviewer); its certificate is checked by computer here | +| One array needs m calls | every game with bounded free steps | argued by hand (AI reviewers in two rounds) | +| Two or more arrays need at least max(W + m, 2W) calls | every game with bounded free steps | argued by hand (one AI reviewer for each half) | + +Section 7 uses two of these to answer the two questions about small gadgets in David Harvey's recent note on the +proposed o(n log n) algorithm. Nothing here is about κ or about integer multiplication itself: every +result is a statement about units in a stated game. + +**Status words.** I use the words of my public repository. *Proved in Lean*: Lean 4 accepted the proof with only +the three standard axioms. *Checked by computer*: an exact computation or a stored certificate, checked by a +separate program. *Argued by hand*: a written argument; no person and no proof checker has checked it. Where an AI +reviewer (an agent whose only job was to break the result) re-derived it, I say so. *Open*: nobody has settled it. + +## 2. What was known, and what this note adds + +The method and the first cases are not mine. + +- **eumemic's #288** (its text is kept on main; the path is in Sources) has + the certificate method, its "FO lemma", of which the kept-subspace bound is a general form. It shows that m = 2 + never saves in its models ("Hence s ≥ 2W = Wm"). At m = 3 it gives s ≥ 50W/21 in its Clifford model and leaves + "only W = 2 with s = 5 and W = 3 with s = 8 at small W", and it states the m = 3 case open in its full register + model. It also gives s ≥ 2W at m = 3 in its enlarged model. +- **Swapnil Jain's papers P1 and P2**, which #288 says "independently prove the overlapping statements" of the FO + lemma. I cite them on #288's word and have not compared them with this note line by line. +- **jmbarrancoml's #2108** treats #288's five-call case at m = 3: a five-call + solution "must therefore contain at least four nonmonomial scalar mixing blocks", and "We do not settle the + five-call problem". +- **The bit side** asks the same question for registers of bits: #468 (three registers at m = 3: "Nine calls are + necessary and sufficient"), #720 (three target frames need nine calls), #1882 and #2167 (dirty and clean + auxiliary registers), #825 (a common complete flag), #203 (a pull request still open: a common triangular flag forces s ≥ Wm) and + #2613 (2-integral matrices never save). These are parallels in other models, not inputs to this note. + +What this note adds, item by item. Closest prior work first; then what is new. + +- *Kept-subspace bound.* #288's FO lemma; this adds a Lean proof on the definitions of a Lean engine, with scratch + arrays and singular mixing allowed, and a family of certificates (the hook) that works at every block size. +- *Block 2.* #288 (a) in its models; this adds a Lean proof in the engine game, and the same bound in games whose + free steps mix neighbouring digit columns (argued by hand). +- *Block 3.* #288's 50W/21 and #2108; this adds 14W/5 in the engine game (Lean). In that game it excludes the + shapes #288 left open (2 in 5 and 3 in 8; the first is the five-call question of #2108). I have not checked + whether #288's full register model lies inside the engine game or the widened game, so I do not claim to settle + those cases in #288's model. +- *2W at every block.* #288 gives s ≥ 2W at m = 3 in its enlarged model, and a doubled-import bound, E + σ ≥ 2W in + its notation, which "agrees with P1's 'at least 2W children' row"; this adds 2W at every block in every game with + bounded free steps, including games whose free steps mix neighbouring digit columns (argued by hand). +- *Block 4 and above, block 3 without phases, W + m, the open-case list.* I found no hub package with these. That + is a search result, not a proof of novelty. +- *One array.* #288's row (f) says "The target still costs m per register" on the bit side; this adds a + complex-side argument that covers scratch arrays and free steps that mix neighbouring digit columns. + +#288 also proves that one natural kind of certificate cannot exist at m = 3 ("No torus-invariant FO certificate +exists in characteristic ≠ 2"; one of its hypotheses is that the certificate "gives a rank-linear bound"). The hook +is a certificate at m = 3, but it proves only 14W/5, not the 3W that would settle m = 3. I have not examined how it +relates to that obstruction. + +## 3. The model, in plain words + +- **Arrays and calls.** An array holds 2^m complex numbers, addressed by x in F_2^m. A *call* applies the 2-point + kernel C = aI + bX along one direction v to a whole array: C_v = aI + bX_v, with a = (1+i)/2, b = (1−i)/2 and X_v + the shift x ↦ x + v. This is exactly David Harvey's C_v and the direction letter of OpenAI's Lean engine. The + target is C^(⊗m) on each of the W arrays; done one array at a time it costs W·m calls. "W in s" means W arrays + in s calls. +- **Digit width.** Inside the recursion every entry of an array is itself a sub-array, so a unit must stay right + when C is replaced by C^(⊗f) for every number f of digit columns. All bounds here are for such units. This + matters: at width 1 a call is a sum of two free steps, and with one zero scratch array C^(⊗3) costs no call at all + (checked by computer here, part `width`); the same program is wrong at width 2. +- **Games.** They differ only in what is free. + - *Engine game*: the letters of the Lean engine in my repository. OpenAI's letters (calls, shifts, mixing of + arrays by any rational matrix, with any number of scratch arrays) plus two free letters I added: invertible + XOR-linear maps of the address bits, and phases i^(z·x + c). + - *Widened game*: also every permutation of the addresses (Toffoli included) and every pattern of phases 1, i, −1, −i. + - *No-phase game*: the engine game without phase letters, with any complex mixing. + - *Commutative slice*: calls, shifts and any complex mixing only. + - *Games with bounded free steps*: every free step touches a bounded number of entries per row, whatever the + width. This includes all of the above and also maps that mix neighbouring digit columns. + +How Harvey's models sit among these is in section 7. + +## 4. The method in one page + +**The kept-subspace bound.** Take a subspace N of the data space (at some width f) that every free step keeps. For a +letter g, let raise(g) = dim(N + gN) − dim N. Follow the dimension of what the program's state adds beyond N in each +array. It starts at 0. A free step never raises it. A call raises it by at most the *cap*, the largest raise of one +call. At the end each finished array contributes the *demand*, raise(C^(⊗m)). So W · demand ≤ cap · s. Scratch +arrays, copies, erasures and singular mixing are all allowed. The proof is in [PROOF.md](PROOF.md), section 1. + +**The hook.** At block m and width f = j + 2, inside V ⊗ Λ^(j+1) V with V = C^(2^m), take +N = span{e_x ⊗ e_T : x in T}. Every free letter that acts inside one array (a shift, an address map, a phase) +keeps it, because it sends each address to one address and multiplies by a number, the same in every column; mixing +of arrays is handled by the bound itself. One call raises it by at most (2^m/2)·C(2^m − 2, j). + +| block m | width f | cap | demand | calls per array | status of the numbers | +|---|---|---|---|---|---| +| 2 | 3 | 4 | 8 | 2 | proved in Lean | +| 3 | 5 | 80 | 224 | 14/5 | proved in Lean | +| 4 | 9 | 27,456 | 86,592 = 16 × 5,412 | 41/13 | cap proved in Lean; demand checked by computer | + +At block 3, two calls in a row raise the hook by at most 144 (checked by computer), so the 6.28e-2 cap also holds +when grouped calls are priced the way the Lean engine prices them. + +**Block 3 without phase letters** uses a different certificate: the span of the 24 "face" triples in Λ³(C^8) at +width 3, with cap 8 and demand 24 in every basis, so 3 calls per array. Address maps do not keep it, so the proof +first trades every address map for extra arrays with relabelled targets (PROOF.md, section 5). With the engine's +phase letters that trade fails, because calls and phases together make CNOT-type address maps. So a block-3 saver +must use address maps and phase letters together (argued by hand). + +## 5. What the Lean proves + +The Lean files are public in my repository ([lean-block2-block3](https://github.com/jacobalansussman/wht-power-saving-lean/tree/86e575e28ed94890872dcff1bb2621d7ff559cbd/research/block-bounds-and-new-rules/programs/lean-block2-block3), +11 files, 1,662 lines; Lean 4.34.1 and the Mathlib revision pinned by that repository). The hub's intake does not +run Lean, and this package does not ask it to. These are the statements, copied from the files: + +```lean +-- TheoremR.lean: the kept-subspace bound for the engine's words (α, ρ, f, N are variables of the file) +theorem engine_lower_bound {σ : Type*} [Fintype σ] {e : σ → ρ} (he : Function.Injective e) + (hN : Kept N) (cap : ℕ) (hcap : ∀ z : Space α, z ≠ 0 → raise N (matL f (dir z)) ≤ cap) + (w : GWord α ρ) (hw : GLiveKernel e w) : + Fintype.card σ * raise N (matL f (kernel α)) ≤ cap * w.cost id + +-- Hook.lean: the hook is kept by every free letter; the cap at every block size +theorem hook_kept (j : ℕ) : Kept (hookN (α := α) j) -- statement only; the `where` proof is omitted +theorem hook_cap (j : ℕ) (z : Space α) (hz : z ≠ 0) : + raise (hookN (α := α) j) (matL (j+2) (dir z)) ≤ + (Fintype.card (Space α) / 2) * (Fintype.card (Space α) - 2).choose j + +-- Bounds.lean +theorem block2_bound {ρ σ : Type*} [Fintype ρ] [DecidableEq ρ] [Fintype σ] + {e : σ → ρ} (he : Function.Injective e) (w : GWord (Fin 2) ρ) (hw : GLiveKernel e w) : + 2 * Fintype.card σ ≤ w.cost id +theorem block3_cap (z : Space (Fin 3)) (hz : z ≠ 0) : + raise (hookN (α := Fin 3) 3) (matL 5 (dir z)) ≤ 80 + +-- Dem3Final.lean +theorem dem3 : 224 ≤ raise (hookN (α := Fin 3) 3) (matL 5 (kernel (Fin 3))) +theorem block3_bound {ρ σ : Type*} [Fintype ρ] [DecidableEq ρ] [Fintype σ] + {e : σ → ρ} (he : Function.Injective e) (w : GWord (Fin 3) ρ) (hw : GLiveKernel e w) : + 14 * Fintype.card σ ≤ 5 * w.cost id +``` + +How to read them. `GWord α ρ` is a program of the engine on the arrays ρ, of which the injective map e marks the W +live ones (`Fintype.card σ` = W); the rest are scratch. `GLiveKernel e w` says that for every width f and every input +with zero scratch, each live array ends holding C^(⊗m) of its input. `w.cost id` counts calls (a grouped call of rank +r counts r). The mixing letter takes a rational matrix (`pointL (f : ℕ) (g : Matrix ρ ρ ℚ)`), so the Lean statements +are for rational mixing. + +The demand fact `dem3` says that a 280 × 280 matrix has rank at least 224. Lean's kernel is too slow for that in one +piece, so the proof splits it, using the characters of F_2^3, into eight blocks of 28 × 28 and proves in Lean that +the split is valid. Each block is shown invertible modulo 65537 by an +inverse computed outside Lean, which the kernel checks entry by entry (`decide +kernel`, no `native_decide`). +Changing one inverse entry by 1 makes Lean reject the check. `dem3`, `block3_bound` and `block2_bound` depend on +`propext`, `Classical.choice` and `Quot.sound` only; the block checks on `propext` only. The last build took 11 +minutes on an 8-core Linux machine with 50 GB, with a peak of 10.06 GB; the eight kernel checks took 562 seconds. +Two AI reviewers checked the development: one restated the theorem in its own words and Lean accepted the same +proof, and it built a one-array program that meets the hypothesis, so the theorem is not vacuous; the other rebuilt +everything in a fresh copy and replayed it with Lean's independent checker. The files were built in a copy of Ryan +Shea's public Lean tree, which pins the same Lean and Mathlib and holds byte-identical copies of the engine files; +they have not yet been built inside a checkout of my repository itself. + +This package's `verify.py` re-does, in Python, the exact check the kernel ran on the data file (part `leandata`), but +not the Lean proof that the split is valid. + +## 6. The smallest open cases + +The engine game unless stated. Savings are ln(mW/s)/ln m. + +| m | Best lower bound, calls per array | Largest saving left open | Smallest open shapes (saving) | What is known around them | +|---|---|---|---|---| +| 2 | 2 (proved in Lean) | 0 | none | | +| 3 | 14/5 (proved in Lean) | 6.28e-2 | **5 in 14** (6.28e-2), 6 in 17 (5.20e-2), 7 in 20 (4.44e-2), 8 in 23 (3.87e-2) | 5 in 14 sits exactly on the bound: 14 × 80 = 5 × 224, so every call must gain the full 80. A saver must use address maps and phase letters together (argued by hand) | +| 3, bounded games | max(W + 3, 2W) calls in all, not per array (argued by hand) | 3.69e-1 | 2 in 5 (1.66e-1), 3 in 6 (3.69e-1) | Open in games that make neighbouring-column maps free | +| 4 | 41/13 (checked by computer) | 1.71e-1 | **2 in 7** (9.63e-2), 3 in 10 (1.32e-1), 4 in 13 (1.50e-1), 5 in 16 (1.61e-1), 6 in 19 (1.69e-1) | For 2 in 7 in which each array ends on a call of its own, the best certificate known (the hook at width 9) leaves room of only 640 out of 137,280. With address maps and phase letters only at the two ends (and no mixing between those end letters), 2 in 7, 3 in 10, 3 in 11 and 4 in 13 are excluded (checked by computer). In the commutative slice block 4 never saves (checked by computer) | +| 5 | 2.99172 and W + m (argued by hand) | 3.19e-1 | 2 in 7 (2.22e-1); 3 in 9 (3.17e-1), not excluded by any bound I know | | +| 6 | 2.97290 and W + m (argued by hand) | 3.92e-1 | 2 in 8 (2.26e-1); 3 in 9 (3.87e-1), not excluded by any bound I know | | + +Each listed shape is the smallest number of calls not excluded for its number of arrays. `verify.py` (part `table`) +recomputes every figure and every exclusion above from the bounds. Many searches for these shapes found nothing; +those are statements about the searched domains only, and they are told in my repository's +[moonshot sections](https://github.com/jacobalansussman/wht-power-saving-lean/tree/86e575e28ed94890872dcff1bb2621d7ff559cbd/research). + +## 7. Two questions in David Harvey's note + +David Harvey's note "On the recently proposed o(n log n) integer multiplication algorithm" (20 October 2026, +[subnlogn.pdf](https://web.maths.unsw.edu.au/~davidharvey/research/subnlogn.pdf)) asks two things about small gadgets +that the results above answer. I give the answers with their status, in case they help. + +**Where his models sit.** My reading of his text, argued by hand and checked against it by two AI reviewers: his §7.4 +model (calls C_v and C_v^(−1), free shifts, adding a complex multiple of one register to another) is inside the +commutative slice. With the relabellings x ↦ Mx of his §6 (M any invertible +matrix over F_2) and rational mixing it is inside the engine game. With complex mixing it is inside the engine game +with complex mixing, which is not in Lean. His butterfly calls (A in his §6, B in §7) differ from C-calls by a scalar +and fixed diagonal phases (B = (1 − i)·S·C·S with S = diag(1, i)), so between relabellings they bring phases with +them. + +**(1) One array.** In §6 he writes that Fable told him a single array cannot be done in g < m calls, "but I do not +follow the argument yet". Here is the argument for his single-array programs P_M0 A_i1 P_M1 ⋯ A_ig P_Mg. Follow one +input basis vector e_x. A relabelling sends it to one basis vector; a call sends each basis vector to a combination of +at most two. So after g calls it has spread to at most 2^g addresses. But every entry of B^(⊗m) is ±1, so every +column has 2^m nonzero entries. Hence 2^g ≥ 2^m and g ≥ m. This holds at every width, width 1 included, and with +any free steps that send one address to one address. With scratch arrays and mixing the same count works path by +path through the program, for programs right at every width (PROOF.md, section 4). Status: argued by hand, not +checked by a person; AI reviewers re-derived it (the general version in two rounds). The width condition is needed +there: at width 1, one zero scratch array makes the transform free (section 3). + +**(2) The gadget "I ⊗ B^(⊗3) acting on C^4 ⊗ (C^2)^(⊗3)".** In §8 he suggests a brute-force search: "Who knows, +maybe it's possible to write down a non-trivial gadget for I ⊗ B^(⊗3) acting on C^4 ⊗ (C^2)^(⊗3) or something silly +like that." That is 4 arrays at block 3, where plain costs 12 calls. By the block-3 bound, 4 arrays need at least +14 × 4 / 5 = 11.2 calls, and since 14 × 4 = 56 > 55 = 5 × 11, at least 12. So no such gadget exists among programs +that are right at every digit width, which is what amplification needs. Status: + +- proved in Lean for C-calls with rational mixing, any relabellings, shifts, phases and scratch (`block3_bound`); +- argued by hand, not checked by a person, for complex mixing and for B-calls. The mixing enters the Lean proof at + one step that uses only that the kept subspace is a complex subspace. A B-call at width f is (1 − i)^f times a + C-call between diagonal phases, and neither a scalar nor a diagonal changes the cap or the demand at the one width + the proof uses. + +At width 1 the question degenerates: C^(⊗3) costs no call there (section 3). His remark that "achieving even one +fewer slice call, for a fixed m and W, is enough" is right for programs that stay right at every width, as his +constructions do. + +**For a calibration run.** In his §7.4 model as written, blocks 3 and 4 never save: block 3 by the no-phase bound +(argued by hand; one AI reviewer) and block 4 by an exact linear-programming certificate for the commutative slice +(checked by computer; one AI reviewer rebuilt it). Both bounds are for programs right at every digit width. So a +search there must come back empty if it tests each candidate at width 2 or more (or symbolically). Tested at width 1 +only, it will find programs with no calls at all (section 3). That makes it a good test of a search program. The +smallest engine-game shapes still open need more than that model: 5 in 14 at block 3 needs relabellings and phase +letters together (argued by hand), and 2 in 7 at block 4 needs relabellings or phases in the middle of the program, +or arrays mixed between its end letters (by the two computer checks in section 6). His §6 B-calls along relabelled axes +supply both. + +## 8. How to re-check + +```sh +python3 -B research/complex-small-m-lower-bounds/verify.py --part main # PASS_COMPLEX_SMALL_M_LOWER_BOUNDS_MAIN +python3 -B research/complex-small-m-lower-bounds/verify.py --part controls # PASS_COMPLEX_SMALL_M_LOWER_BOUNDS_CONTROLS +python3 scripts/research_package.py --package research/complex-small-m-lower-bounds --check-only +python3.12 -B scripts/research_package.py --package research/complex-small-m-lower-bounds +``` + +Standard library only; both parts together take a few seconds and under 50 MB. `--part main` checks: the block-2 +and block-3 caps (exact vectors over the Gaussian integers, and attained), the block-2 demand, the block-3 demand +(a certified minor and the rank of the whole block), the two-call cap 144, the character block of rank at least 28 (two file +formats, two routines), the eight Lean data blocks, the face certificate of the no-phase bound, the block-4 +arithmetic and the format of its certificate, the inputs 48,576 and 68,320 of the bound from block 4 on (re-derived +from small ranks, PROOF.md section 7) with the exact block-5 and block-6 bounds and the format of their two +certificates, the width-1 program, and every figure in sections 1 and 6. +`--part controls` feeds it corrupted certificates and false claims (a repeated row, a composite modulus, a row +inside the hook, a 225 × 225 minor, a changed vector, a repeated vector, a cap of 79, the three corrupted certificates of my +repository, one Lean inverse entry plus 1, a face cap of 7, a CNOT that should keep the face span, the width-1 +program at width 2, three shapes on either side of a bound, a two-move certificate with a repeated pair or with the +wrong moves in its header, and two moves in the same direction claimed to count as two); each must be rejected. + +Not registered (author evidence, outside the hub's limits): +- the block-4 demand: `cc -O2 -o check_m0 author-evidence/check_m0.c && ./check_m0 data/cert_m4_M0.txt` checks + the 5,412 × 5,412 minor modulo 2,147,483,629 (determinant 1797789153; about an hour and 250 MB); +- the inputs 48,576 and 68,320 on all 16 characters: `cc -O2 -o check_mj author-evidence/check_mj.c`, then + `./check_mj data/cert_m4_g2_M0.txt A` and `./check_mj data/cert_m4_g3_M0.txt A` for every character A = 0 to 15 + (32 runs, 42 minutes with six at a time on an Apple M4, at most 146 MB each; outputs in + `author-evidence/out_check_m4_g2.txt` and `out_check_m4_g3.txt`, every one PASS); +- the Lean build (section 5; about 10 GB of memory); +- the written proof of the bound from block 4 on (`author-evidence/induction-across-block-sizes.md`; its AI + reviewers' reports and programs are beside it in my repository), and the other bounds argued by hand, in my + repository. + +## 9. Limits of this work + +- No person has read any of these proofs. Lean checked the Lean statements; AI agents tried to break the rest. +- Each bound is about its game. The Lean statements are for the engine game with rational mixing. +- The bounds are for units right at every digit width, which is what the recursion uses. +- Nothing here bounds κ, and nothing is claimed about integer multiplication. +- The open-case table lists what the quoted bounds leave open. A shape being open does not mean anyone expects a + unit there. + +## 10. Everything else + +My repository's [research folder](https://github.com/jacobalansussman/wht-power-saving-lean/tree/86e575e28ed94890872dcff1bb2621d7ff559cbd/research) +has the rest of this work, each section with its programs, statuses and open problems: why the known savers save, +the Reed-Muller family and one-call units, existence routes, frame packing for two arrays, and speed on real +processors. Its `other-fields` folder has notes for readers from neighbouring fields. This note makes no claim from +any of them. + +## Open next questions + +The same questions, with first steps, are in `TASK.json`. + +1. **5 in 14 at block 3** (6.28e-2), exactly on the bound. First step: decide one sector of the S8 sub-game exactly, + one representative per symmetry orbit, judging each candidate by its end condition at width 6, not by cheap + tests. +2. **2 in 7 at block 4** (9.63e-2). First step: an exact search confined to address maps in the middle and phase + letters between calls; or a certificate above 3.5 calls per array, starting from the finite-group form of the + best-bound relaxation at block 3. +3. **Block 3 in games with bounded free steps**: 2 in 5 (1.66e-1) or 3 in 6 (3.69e-1). First step: finish the + third-layer case split for W = 2, s = m + 2. +4. **#288's open m = 3 cases in its full register model.** First step: list the free elements that model allows + and test whether each keeps the hook (any map sending one address to one address, the same in every column, + does). +5. **Lean for complex mixing, the widened game and block 4.** First step: change the mixing letter to complex + matrices (one proof step uses it); for 41W/13, split the 16 character blocks further and time the kernel on one. +6. **Blocks 5 and 6**: 2 in 7 at block 5, 2 in 8 at block 6, and 3 in 9 at both. First step: the third-layer + argument for "2 in m + 2 is impossible"; for 3 in 9, a certificate above 3 calls per array at block 5. + +## AI assistance and credit + +Substantial AI assistance: the programs, checks, proofs, Lean files and texts were written by AI agents (Anthropic +Claude) under my direction; I set the goals and chose what to pursue. The Lean proofs are checked by Lean's kernel. +No independent human review of this package or of the work behind it is claimed. + +Credit: eumemic (#288) for the certificate method and the m = 2 and m = 3 results it builds on; Swapnil Jain (P1, +P2); jmbarrancoml (#2108); the bit-side authors above (aliromman, davidgovea, waynenilsen, navinor, huxint, +thakrarsagar); OpenAI for the Lean engine and cost model this game extends; Ryan Shea for the Lean tree the files were +built in; David Harvey for the questions of section 7; Maximilian Lutz (#4643) for an independent check of the bound +from block 4 on, which found that two of its inputs had no stored certificate and proved its tail for every k. + +## Files + +- `README.md`, `PROOF.md` (the written arguments, each headed by its status), `TASK.json`, `SOURCES.json`, + `VERIFY.json`, `verify.py`, `.gitattributes` (`* -text`, keeps the data bytes exact). +- `data/`: certificates copied unchanged from my repository: `cert_m3_dem.json`, `cert_m3_B2.json`, + `cert_m3_M0.json`, `cert_m3_M0_c.txt`, `cert_m2_M0.txt`, `cert_m4_M0.txt`, the three corrupted ones `neg_m3_*.txt`, + and `Dem3Data.lean` (the certificate data of the Lean proof). +- `data/cert_m4_g2_M0.txt`, `data/cert_m4_g3_M0.txt`: the minor certificates for the inputs 48,576 and 68,320 of + the bound from block 4 on (copied unchanged from my repository, added on 23 October 2026). +- `author-evidence/check_m0.c`: the C checker of the block-4 demand certificate (not registered). +- `author-evidence/check_mj.c`, `out_check_m4_g2.txt`, `out_check_m4_g3.txt`: the C checker of those two + certificates and its output on all 16 characters (not registered). +- `author-evidence/induction-across-block-sizes.md`: the written proof of PROOF.md section 7, an unchanged copy (its + relative links refer to my repository). + +## Sources + +- Hub base commit `f626db5c3a3d781d8f7695038776c621651f75e1`; task card `scope-navigation` (catalogue priority + revision 7). +- Hub work credited: #288 (eumemic; `research/abelian-cayley-metric-scope/sources/pr288-README.md`, quotes from + sections 1.1 (a), (b), the table row (f) and section 4); #2108 (jmbarrancoml; `research/two-register-three-mix/README.md`); + #468 (`research/bit-three-register-lower-bound`), #720 (`research/three-register-no-target-flag`), #1882 + (`research/bit-dirty-auxiliary-registers`), #2167 (`research/bit-clean-ancilla-registers`), #825 + (`research/common-flag-frame-obstruction`), #203 (pull request still open), #2613 (`research/bit-full-borel-2adic-floor`); Swapnil + Jain, P1 doi:10.5281/zenodo.23265442 and P2 doi:10.5281/zenodo.23266393. +- My repository: https://github.com/jacobalansussman/wht-power-saving-lean at commit + `86e575e28ed94890872dcff1bb2621d7ff559cbd`, folder `research/`: + - Lean: `block-bounds-and-new-rules/programs/lean-block2-block3/` (`PfLean/TheoremR.lean` lines 382-385 and 153, + `Hook.lean` 196 and 432-434, `Bounds.lean`, `Dem3Final.lean`, `NegControl.lean`, `logs/statements.txt`, + `logs/rebuild_2026-10-19.txt` (build of 19 October 2026 on a Colab machine), `skeptic-restatement/`); the + engine's `GLiveKernel` is in `Work/GFrame/Engine/Letters.lean` (at the repository root, not under `research/`) lines 176-178. + - Block bounds and certificates: `block-bounds-and-new-rules/README.md` sections 1-2 and its `results.json` + findings 1-3, 7, 8, 10, 11, 13, 14, 20, 36; `programs/hook-certificates-blocks-2-to-6/` (`check_m3.py`, of which + part `block3` of `verify.py` is a port, and `check_m0.c`); `data/hook-certificates/` (re-run log + `rerun_check_m4_2026-10-19.txt`: determinant 1797789153, 56 minutes, 235 MB on an Apple M4); + `data/engine-bounds-blocks-5-and-6/out_induct.txt` (834241/278850 and 1188222/399685). + - Bounded games: `moonshot-small-blocks/README.md` section 4.1 and `results.json` findings 1 and 3; + one array: `theory-of-theories-and-logic/results.json` finding 31 and `notes/zx-proof.md`. + - No-phase block 3: `reed-muller-and-one-move/proofs/address-maps-per-array-targets-and-block3.md` section 8.9, + `programs/address-maps-and-small-lift/independent-check/vk_face3.py` (ported in part `face3`), `results.json` + findings RM1, RM3, RM5. + - Commutative slice at block 4: `existence-routes/proofs/families-commutative-slice.md` (Theorem 17) and + `results.json` finding 35. + - Open cases: `open-problems.md`; `moonshot-block4-block5/results.json` findings 1 and 7 (the 640). +- Added on 23 October 2026, after #4643, in the same repository and folder: commit + `ce3c2615cff7fc524c1fde3ddb99d151ba4ceee4` (the certificates for 48,576 and 68,320: + `block-bounds-and-new-rules/programs/hook-certificates-blocks-2-to-6/` `gen_mj.c`, `check_mj.c`, `run_depth.sh`, + and `data/hook-certificates/cert_m4_g2_M0.txt`, `cert_m4_g3_M0.txt`, `outputs/`) and commit + `f08d308ff93f4867165a1e80765fe985c06b4edf` (`block-bounds-and-new-rules/proofs/induction-across-block-sizes.md` + and its AI reviewers' reports beside it; `programs/engine-bounds-blocks-5-and-6/skeptic-checks/fcheck.py`, the + split that part `depth` uses). +- An update to my earlier hub pull request #4268: its A-fc figure (1.7887046e-3, computed when that pull request was + opened) has since been proved in Lean at 1.7887045e-3 and verified on the bigospeedrun board + (https://github.com/bigospeedrun/verifier/pull/29; final verification result `lean_and_axiom_passed`, 21 October 2026). +- David Harvey, "On the recently proposed o(n log n) integer multiplication algorithm", UNSW Sydney, 20 October 2026, + https://web.maths.unsw.edu.au/~davidharvey/research/subnlogn.pdf: §6 (single-array programs and "I do not follow + the argument yet"; "achieving even one fewer slice call"), §7.1 (B = (1 − i)·S·C·S up to his normalisation), + §7.2 (C_v), §7.4 (the allowed operations), §8 (the suggested search). +- Section 7's placement of his models comes from one AI agent's reading of his note against the Lean sources + (22 October 2026), checked by two more agents, one on the models and one on numbers and statuses. The digit-width + point and the B-call argument come from the model-checking agent alone; no other agent has checked them. The + width-1 program is re-checked by `verify.py`. diff --git a/research/complex-small-m-lower-bounds/SOURCES.json b/research/complex-small-m-lower-bounds/SOURCES.json new file mode 100644 index 0000000000..cf0d3ee133 --- /dev/null +++ b/research/complex-small-m-lower-bounds/SOURCES.json @@ -0,0 +1,196 @@ +{ + "schema_version": 1, + "base_commit": "f626db5c3a3d781d8f7695038776c621651f75e1", + "upstream_repository": "https://github.com/CrocSwap/integer-mult-bounds", + "files": [ + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "64bfc5af6709ed9811171e0a2108f05e1219cb65", + "sha256": "352a6184713b8843d96fd2c2071eb7aeaa655906b7c51d45ad444912666c8a96" + }, + { + "path": "research/abelian-cayley-metric-scope/sources/pr288-README.md", + "usage": "provenance", + "git_blob": "dc04f533bd0f3b185969bb259e876a73714f7285", + "sha256": "c091e98c415e2a80bb28402b789363eb97dd3492061ca8875e421ae437de7482" + }, + { + "path": "research/two-register-three-mix/README.md", + "usage": "provenance", + "git_blob": "593549db00fac1a10734868380eab28bcb584cc2", + "sha256": "3353fe948c75fbfc56841260db02d5e14aba966d157d3390fe3d4785e397af60" + } + ], + "inputs_note": "No live inputs from this repository. The two research provenance rows are the predecessor texts quoted in README.md section 2 (#288 by eumemic, retained on main; #2108 by jmbarrancoml). verify.py reads only files inside this package.", + "external_sources": [ + { + "what": "the files under data/ and author-evidence/ listed here: copied unchanged from my public repository (the files added on 23 October 2026 are listed in the next two entries); verify.py checks each file's sha256 (part pins). The commit is not a Git object of this repository, so it cannot be pinned with a source pin; the byte equality is recorded here.", + "repository": "https://github.com/jacobalansussman/wht-power-saving-lean", + "commit": "86e575e28ed94890872dcff1bb2621d7ff559cbd", + "copies": [ + { + "package_path": "data/cert_m3_dem.json", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m3_dem.json", + "source_git_blob": "76678077d87cd677caf91d56e306e2df3aab2b38", + "sha256": "99235c4fbfb37a2205a888b18292edbfa3be07970dd0550c47f79bbe66e802c3" + }, + { + "package_path": "data/cert_m3_B2.json", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m3_B2.json", + "source_git_blob": "de6959c8ad45046f9a540c2c1c73051c75c8c9aa", + "sha256": "078eb2a6a481f5a176b2fce2331fb285dbe8e20b034c5bb4558abc2455a27cf6" + }, + { + "package_path": "data/cert_m3_M0.json", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m3_M0.json", + "source_git_blob": "3be65e03f6b3b2069ccc597f7caa48b17bb57d48", + "sha256": "325f47b568ce2fee4d1b8848f19b0e27772340de5b4a04702d8799b3b1763748" + }, + { + "package_path": "data/cert_m3_M0_c.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m3_M0_c.txt", + "source_git_blob": "2f5a07b14cf103e178d706f877d4196af3a486f1", + "sha256": "82169f3e70bc11ebdabc9b573f82f50f92e0a8073c5e747deb64714a84c0e6bc" + }, + { + "package_path": "data/cert_m2_M0.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m2_M0.txt", + "source_git_blob": "40be8de96cbfe05b688e1b8f5fe2b5bcbe032359", + "sha256": "884bc29dbaf3714cb23426f56e28039e1dafb9b13f63a6b595b8dc15423f3cf0" + }, + { + "package_path": "data/neg_m3_29.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/neg_m3_29.txt", + "source_git_blob": "fc5c183f52c9f224f909528fcd3ad7ff461507f3", + "sha256": "1d89519b59d32f23ca4dd5355b45ed03a226bec430bc90aeafaac0d001bbfa36" + }, + { + "package_path": "data/neg_m3_comp.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/neg_m3_comp.txt", + "source_git_blob": "742b35a6db984ad1eae2b36e48d8cbdfef539b4f", + "sha256": "4ebc926017f670b43345af6d984039b4b93327ddb387e6d95d8f861133f65a8c" + }, + { + "package_path": "data/neg_m3_dup.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/neg_m3_dup.txt", + "source_git_blob": "7bc7ff614a149449b0caf8f88a7b724ba65446cc", + "sha256": "f6fe0a5d3025396dcfe168214a33e4730e20c46187b5b68a5aeaf86cabbfa928" + }, + { + "package_path": "data/cert_m4_M0.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m4_M0.txt", + "source_git_blob": "254beec5222daedda500ecdaac28ca712a3d6d7f", + "sha256": "72530af84ea9a702b9e48b1dd8d5e69e9b0552840096f38b5caac9667c4236e2" + }, + { + "package_path": "data/Dem3Data.lean", + "source_path": "research/block-bounds-and-new-rules/programs/lean-block2-block3/PfLean/Dem3Data.lean", + "source_git_blob": "13b707be01006223776af137c661eaaf090446d1", + "sha256": "0982f9cf408a7d2f930b4e65d1e2b1bd6a22b3c0601c372886fa7d9bf4c0cc52" + }, + { + "package_path": "author-evidence/check_m0.c", + "source_path": "research/block-bounds-and-new-rules/programs/hook-certificates-blocks-2-to-6/check_m0.c", + "source_git_blob": "5748359d049c7a4e10479b5f1487e118acc4db41", + "sha256": "8242342188fe73eb8ab0db9e48727d086ec78c38032bdfb76b38a3af40ceef6e" + } + ] + }, + { + "what": "the Lean proofs quoted in README.md section 5 (not copied; the hub's intake does not run Lean)", + "repository": "https://github.com/jacobalansussman/wht-power-saving-lean", + "commit": "86e575e28ed94890872dcff1bb2621d7ff559cbd", + "path": "research/block-bounds-and-new-rules/programs/lean-block2-block3", + "toolchain": "leanprover/lean4:v4.34.1; Mathlib d13f23b723b8a846827a245b89c10fc7d3f11612", + "build_log": "research/block-bounds-and-new-rules/programs/lean-block2-block3/logs/rebuild_2026-10-19.txt", + "statements_log": "research/block-bounds-and-new-rules/programs/lean-block2-block3/logs/statements.txt" + }, + { + "what": "the written arguments condensed in PROOF.md sections 4 to 7, and the programs behind the statuses", + "repository": "https://github.com/jacobalansussman/wht-power-saving-lean", + "commit": "86e575e28ed94890872dcff1bb2621d7ff559cbd", + "paths": [ + "research/block-bounds-and-new-rules/README.md", + "research/moonshot-small-blocks/README.md", + "research/theory-of-theories-and-logic/README.md", + "research/reed-muller-and-one-move/proofs/address-maps-per-array-targets-and-block3.md", + "research/existence-routes/proofs/families-commutative-slice.md", + "research/open-problems.md" + ] + }, + { + "what": "the certificates for the block-4 inputs of section 7 (a_2 >= 48,576 and a_3 >= 68,320, one nonsingular minor per character, 16 characters each), their checker and its outputs, added on 23 October 2026 after #4643: copied unchanged; verify.py checks each file's sha256 (part pins) and their format (part depth)", + "repository": "https://github.com/jacobalansussman/wht-power-saving-lean", + "commit": "ce3c2615cff7fc524c1fde3ddb99d151ba4ceee4", + "copies": [ + { + "package_path": "data/cert_m4_g2_M0.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m4_g2_M0.txt", + "source_git_blob": "c205e36cd1112391cfe026c2c6d454bc8b02ad06", + "sha256": "1961d7482576245953e4b0368603ecf6295b02a8543334816e5c0139d64601c3" + }, + { + "package_path": "data/cert_m4_g3_M0.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/cert_m4_g3_M0.txt", + "source_git_blob": "85151a1fb2fa087141b287296f32101090e7ce75", + "sha256": "b04afdc7cb060c96605aeff19ee8a1ceb0968785208f6e66a938ebec7c3125ca" + }, + { + "package_path": "author-evidence/check_mj.c", + "source_path": "research/block-bounds-and-new-rules/programs/hook-certificates-blocks-2-to-6/check_mj.c", + "source_git_blob": "31f01fa28312aa2f0c1fa350c03f6c37b9b6fdf5", + "sha256": "ca59130c3153da31eac93282126c797afd555d9a0934f60ecb38e304f46e82e0" + }, + { + "package_path": "author-evidence/out_check_m4_g2.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/outputs/out_check_m4_g2.txt", + "source_git_blob": "faecc5517d04475dcfe394e2b98b64289b6513c8", + "sha256": "7c4291efee95581d491be507e3f024d8ad36095d58440efd37c2ce9a1e5ea3c1" + }, + { + "package_path": "author-evidence/out_check_m4_g3.txt", + "source_path": "research/block-bounds-and-new-rules/data/hook-certificates/outputs/out_check_m4_g3.txt", + "source_git_blob": "fa9efe468f0eb034cea724ff49306eda96aefa9b", + "sha256": "f82df0cd636ac90734699b2d4cf269354b59e4332687732a027f6bffe254f97a" + } + ] + }, + { + "what": "the written proof of section 7 (my induction note, kept as written; its relative links refer to that repository), published on 23 October 2026: copied unchanged; verify.py checks its sha256", + "repository": "https://github.com/jacobalansussman/wht-power-saving-lean", + "commit": "f08d308ff93f4867165a1e80765fe985c06b4edf", + "copies": [ + { + "package_path": "author-evidence/induction-across-block-sizes.md", + "source_path": "research/block-bounds-and-new-rules/proofs/induction-across-block-sizes.md", + "source_git_blob": "9343bbd87a8e2d2b5b2b8fbca34da04033d95ce7", + "sha256": "0c2f6f5a07f1deccfa2b838c6d29bc6d86567069569890c37c820b03f7d888ef" + } + ] + }, + { + "what": "the two AI reviewers' reports on that proof, their programs (fcheck.py is the split that part depth uses) and Fact A's matrices (not copied)", + "repository": "https://github.com/jacobalansussman/wht-power-saving-lean", + "commit": "f08d308ff93f4867165a1e80765fe985c06b4edf", + "paths": [ + "research/block-bounds-and-new-rules/proofs/induction-across-block-sizes-skeptics.md", + "research/block-bounds-and-new-rules/programs/engine-bounds-blocks-5-and-6/skeptic-checks/", + "research/block-bounds-and-new-rules/programs/engine-bounds-blocks-5-and-6/fact-a/", + "research/block-bounds-and-new-rules/data/engine-bounds-blocks-5-and-6/" + ] + }, + { + "what": "David Harvey, 'On the recently proposed o(n log n) integer multiplication algorithm', UNSW Sydney, 20 October 2026 (quoted in README.md section 7)", + "url": "https://web.maths.unsw.edu.au/~davidharvey/research/subnlogn.pdf" + }, + { + "what": "Swapnil Jain's papers P1 and P2, cited through #288", + "doi": [ + "10.5281/zenodo.23265442", + "10.5281/zenodo.23266393" + ] + } + ], + "source_boundary": "Only this new package is submitted. No file outside research/complex-small-m-lower-bounds changes." +} diff --git a/research/complex-small-m-lower-bounds/TASK.json b/research/complex-small-m-lower-bounds/TASK.json new file mode 100644 index 0000000000..71ce2918c8 --- /dev/null +++ b/research/complex-small-m-lower-bounds/TASK.json @@ -0,0 +1,91 @@ +{ + "schema_version": 1, + "task_id": "scope-navigation", + "priority_revision": 7, + "base_commit": "f626db5c3a3d781d8f7695038776c621651f75e1", + "original_card": { + "id": "scope-navigation", + "question": "Can one misleading historical-current claim or missing research cross-reference be corrected?", + "starting_points": [ + "docs/research/current-status.md", + "docs/research/pr-ledger.md", + "certificates/selected-result.json" + ], + "methods": [ + "Trace one confusing path from onboarding to its authoritative source.", + "Index one tightly related family of obstructions with explicit excluded and open hypotheses." + ], + "acceptance_gate": "Produce evidence-backed navigation, preserve historical records and avoid a duplicate global survey.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Follow one link from the selected record to its review and compare a potentially stale historical claim.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "Repair one confusing path or produce a scoped map of one related obstruction family.", + "bottleneck_link": "Clear navigation lowers entry cost for central research; a global survey without a concrete fix is not required.", + "allowed_variations": [ + "One historical-current ambiguity or one bounded family index." + ], + "scope_change_triggers": [ + "Rewriting frozen scientific packages just to change their historical wording." + ], + "overlap_terms": [ + "current status", + "historical checkpoint", + "scope navigation" + ] + }, + "scope_status": "changed", + "actual_scope": "One bounded family index: lower bounds on the number of paid calls s that a unit for W complex arrays needs at small block sizes m, each in a stated game, and the smallest shapes (W in s) they leave open. In the engine game of my Lean engine (calls C_v, shifts, invertible XOR-linear address maps, phases i^(z.x+c), rational mixing with scratch; correct at every digit width): block 2 needs 2W and block 3 needs 14W/5 (proved in Lean), block 4 needs 41W/13 (checked by computer), blocks from 4 on need 2.9447 per array (argued by hand). Also: block 3 without phase letters needs 3W for every address group; one array needs m calls and two or more need max(W + m, 2W) in every game with bounded free steps (argued by hand). The README answers two questions in David Harvey's note on the proposed o(n log n) algorithm (one array; 4 arrays at block 3 need 12 calls). The registered check re-derives the certificate numbers, the Lean certificate data and every figure in the tables from package data.", + "scope_change_reason": "The card's method 'Index one tightly related family of obstructions with explicit excluded and open hypotheses' fits, but this package also adds bounds that are not on main (14W/5 at m = 3 in the engine game, 41W/13 at m = 4, the bound from m = 4 on, the no-phase m = 3 bound, W + m and 2W in games with bounded free steps), so it is more than navigation. Each is stated with its game and status, and the predecessors (#288, #2108, the bit-side small-register packages) are credited and quoted rather than rewritten.", + "bottleneck_link": "A single small complex unit with s < Wm would give a large complex-side saving (ln(mW/s)/ln m, for example 6.28e-2 for 5 in 14 at m = 3). The bounds say where such a unit cannot exist and list the smallest shapes where it still could, so that searches start there; none of them changes κ.", + "budget_minutes": 240, + "stop_rule": "Post results already public in my repository with a status no stronger than there, plus the short answers to David Harvey's note in README section 7 (each labelled argued by hand, or checked by verify.py); every figure re-derived by verify.py; every control rejected; Lean statements quoted verbatim from the files; no new search, Lean build or reviewer round for this package.", + "outcome": "negative-result", + "evidence": "verify.py --part main (standard library, about 2 s): sha256 of every data file; block 2: caps <= 4 by exact Z[i] vectors in all 3 directions and attained, demand >= 8; block 3: caps <= 80 by 200 exact vectors in all 7 directions and attained (rank mod p), demand >= 224 by a certified 224 x 224 minor and by the rank of the whole 280 x 280 block, two calls in a row <= 144 by 136 exact vectors, the character block M_0 of rank >= 28 in two formats by two routines; the eight 28 x 28 blocks of the Lean data file Dem3Data.lean times the formula matrix equal the identity mod 65537 (the check Lean's kernel ran); the face certificate of the no-phase bound (cap 8 in 7 directions, demand 24 in all 28 bases, exact over Q(i)); the block-4 arithmetic 27,456 / 86,592 / 41/13 and the format of the 5,412 x 5,412 certificate; the inputs of section 7: two and three moves in independent directions raise the block-4 hook by at least 48,576 and 68,320 (the hook split over the untouched address bits into ranks of at most 280 x 280 mod p; the same split gives the cap 27,456 and block 3's 80 and 144), the exact block-5 and block-6 bounds 834241/278850 and 1188222/399685 from that profile, and the format of the two minor certificates for 48,576 and 68,320 (their determinants on all 16 characters are author evidence); the width-1 zero-call program for C^(x)3 and its failure at width 2; every saving and exclusion in README sections 1 and 6. verify.py --part controls: 20 corrupted certificates and false claims, each rejected. Outside this repository: the Lean proofs (block2_bound, block3_bound, dem3, hook_kept, hook_cap, engine_lower_bound; three standard axioms; a negative control rejected) the hour-long C check of the block-4 determinant (author-evidence/check_m0.c), and the 42-minute C check of the two minor certificates for 48,576 and 68,320 on all 16 characters (author-evidence/check_mj.c, outputs out_check_m4_g2.txt and out_check_m4_g3.txt).", + "author": "Jacob Sussman", + "ai_assistance": "Substantial AI assistance: the programs, checks, proofs, Lean files and texts were written by AI agents (Anthropic Claude) under my direction. The Lean proofs are checked by Lean's kernel; the other proofs were checked only by AI reviewers, as each status says. No independent human review of this package is claimed.", + "open_questions": [ + { + "question": "Is there a 5 in 14 at block 3 in the engine game (saving 6.28e-2)? It sits exactly on the hook bound (14 x 80 = 5 x 224).", + "why_it_matters": "It is the only block-3 shape with five arrays that the bound proved in Lean leaves open, and the largest block-3 saving still possible.", + "first_step": "Decide one sector of the S8 sub-game of my repository's idea-rounds section exactly, one representative per symmetry orbit, judging each candidate by its per-array end condition at width 6 rather than by the cheap tests.", + "blocked_by": "None." + }, + { + "question": "Is there a 2 in 7 at block 4 (saving 9.63e-2)?", + "why_it_matters": "It is the smallest open shape at any block; with private ends the best certificate known leaves room of only 640 out of 137,280.", + "first_step": "An exact search confined to address maps in the middle of the program and phase letters between calls (with letters only at the ends, and no mixing between the end letters, it is excluded); in parallel, the finite-group form of the best-bound relaxation at block 3, then at block 4, looking for a certificate above 3.5 calls per array.", + "blocked_by": "None." + }, + { + "question": "In games whose free steps may mix neighbouring digit columns, is there a 2 in 5 or a 3 in 6 at block 3 (exactly on max(W + 3, 2W))?", + "why_it_matters": "There the best bound is only max(W + m, 2W), so a saving up to 3.69e-1 is not excluded.", + "first_step": "Finish the third-layer case split of the W + m argument for W = 2, s = m + 2, which would close 2 in 5 there and 2 in 7 at block 5.", + "blocked_by": "None." + }, + { + "question": "Does 14W/5 hold in #288's full register model, settling its open m = 3 cases (W = 2, s = 5 with two or more inserted free elements; W = 3, s = 8)?", + "why_it_matters": "#288 and #2108 left these open; they are excluded in the engine game, but I have not checked that #288's model sits inside it.", + "first_step": "List the free elements #288's full register model allows and check that each keeps the block-3 hook; every map that sends one address to one address and acts the same on every column does.", + "blocked_by": "None." + }, + { + "question": "Can the Lean statements be extended to complex mixing, the widened game and block 4?", + "why_it_matters": "Complex mixing and Harvey's B-calls are argued by hand from the Lean proof; 41W/13 rests on a computer-checked certificate.", + "first_step": "Change the mixing letter's matrix from rational to complex (one proof step uses it). For 41W/13, split the 16 character blocks further by the bit-swap group and time Lean's kernel on one block before committing.", + "blocked_by": "A Lean build of the block-3 files needs about 10 GB of memory." + }, + { + "question": "At blocks 5 and 6: is there a 2 in 7 (block 5), a 2 in 8 (block 6), or a 3 in 9 at either block?", + "why_it_matters": "These would save 2.22e-1 to 3.87e-1; 3 in 9 is not excluded by any bound I know.", + "first_step": "Write the third-layer argument for '2 in m + 2 is impossible' in the two small games where the top two levels alone admit a 2 in 5; for 3 in 9, look for a certificate above 3 calls per array at block 5, starting with the best-bound relaxation restricted to frames within distance 2 of the start and of the target.", + "blocked_by": "None." + } + ] +} diff --git a/research/complex-small-m-lower-bounds/VERIFY.json b/research/complex-small-m-lower-bounds/VERIFY.json new file mode 100644 index 0000000000..b3a1405769 --- /dev/null +++ b/research/complex-small-m-lower-bounds/VERIFY.json @@ -0,0 +1,31 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "--part", + "main" + ], + "timeout_seconds": 120, + "checks": "Standard library, about 2 s and 35 MB. sha256 of every data file; block 2: caps <= 4 (exact Z[i] vectors, 3 directions, attained), demand >= 8; block 3: caps <= 80 (200 exact vectors per direction, 7 directions, attained mod p), demand >= 224 (a certified 224 x 224 minor nonzero mod p, and the rank of the whole 280 x 280 block), two calls in a row <= 144 (136 exact vectors), the character block M_0 of rank >= 28 (two certificate formats, two determinant routines); the eight 28 x 28 blocks of Dem3Data.lean times the formula matrix = identity mod 65537 (the check Lean's kernel ran, re-done in Python); the face certificate of the no-phase bound (shifts and diagonals keep it, cap 8 in 7 directions, demand 24 in all 28 bases, exact over Q(i)); block-4 arithmetic and the format of the 5,412 x 5,412 certificate (its determinant is author evidence); the inputs of section 7: two and three moves in independent directions raise the block-4 hook by at least 48,576 and 68,320 (the hook split over the untouched address bits into ranks of at most 280 x 280 mod p; the same split gives the cap 27,456 and block 3's 80 and 144), the exact block-5 and block-6 bounds 834241/278850 and 1188222/399685 from that profile, and the format of the two minor certificates for 48,576 and 68,320 (their determinants on all 16 characters are author evidence); the zero-call width-1 program for C^(x)3 and its failure at width 2; every saving, exclusion and smallest open shape in README sections 1 and 6. Prints PASS_COMPLEX_SMALL_M_LOWER_BOUNDS_MAIN." + }, + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py", + "--part", + "controls" + ], + "timeout_seconds": 60, + "checks": "Each corrupted certificate or false claim must be rejected: demand certificate with a repeated row, a composite modulus, a row inside the hook, and a 225 x 225 minor; two-call certificate with a vector changed and with a repeated vector; a block-3 cap of 79; the three corrupted M_0 certificates of the source repository (size 29, composite modulus, repeated row); the Lean data with one inverse entry + 1 (as NegControl.lean); a face cap of 7; a CNOT claimed to keep the face span; the width-1 program at width 2; 4 in 11 at block 3 claimed allowed; 5 in 14 at block 3 and 2 in 7 at block 4 claimed excluded; the two-move certificate with a repeated row and column pair, and relabelled as a one-move certificate; two moves in the same direction claimed to raise the block-4 hook by 48,576. Prints PASS_COMPLEX_SMALL_M_LOWER_BOUNDS_CONTROLS." + } + ] +} diff --git a/research/complex-small-m-lower-bounds/author-evidence/check_m0.c b/research/complex-small-m-lower-bounds/author-evidence/check_m0.c new file mode 100644 index 0000000000..5748359d04 --- /dev/null +++ b/research/complex-small-m-lower-bounds/author-evidence/check_m0.c @@ -0,0 +1,87 @@ +/* pf-logging, 13 Oct 2026. INDEPENDENT CHECKER of a nonsingular-minor certificate for the block M_alpha + * (shares no code with gen_m0.c; different determinant routine, no subset tables, no sorting signs). + * Definitions (PROOF.md, Lemma C): n = 2^m, Q[u][v] = (-i)^{popcount(u xor v)} with i -> I (I^2 = -1 mod p); + * for a row set U = {u_1 < ... < u_k} (0 not in U) and a column set T = {t_1 < ... < t_k} (0 in T): + * M_alpha[U][T] = sum over s in F_2^m of (-1)^{alpha.s} * Q[0][s] * det( Q[u_a][t_b xor s] )_{a,b=1..k}. + * The certificate file lists p, I, and `size` pairs (row mask, col mask). The checker verifies: p is prime, + * I^2 = -1 mod p, the row masks are distinct k-subsets of {1..n-1}, the col masks distinct k-subsets containing 0, + * then builds the size x size matrix from the formula above and computes its determinant mod p. + * Nonzero determinant mod p => the same minor of M_alpha over Z[i] (scaled entries) is nonzero => + * rank M_alpha over Q(i) >= size. + * Build: cc -O2 -o check_m0 check_m0.c Run: ./check_m0 CERTFILE + */ +#include +#include +#include +typedef uint64_t u64; +static u64 p; +static u64 mulm(u64 a, u64 b) { return a * b % p; } /* exact: p < 2^31 is checked, so a*b < 2^62 */ +static u64 powm(u64 b, u64 e) { u64 r = 1; b %= p; while (e) { if (e & 1) r = mulm(r, b); b = mulm(b, b); e >>= 1; } return r; } +static int bits(unsigned x) { int c = 0; while (x) { c += x & 1; x >>= 1; } return c; } +/* determinant mod p of an N x N matrix (row-major, destroyed), Gaussian elimination with row swaps */ +static u64 detm(u64 *A, int N) { + u64 det = 1; + for (int c = 0; c < N; c++) { + int piv = -1; + for (int r = c; r < N; r++) if (A[(size_t)r * N + c] % p) { piv = r; break; } + if (piv < 0) return 0; + if (piv != c) { + for (int j = 0; j < N; j++) { u64 t = A[(size_t)c * N + j]; A[(size_t)c * N + j] = A[(size_t)piv * N + j]; A[(size_t)piv * N + j] = t; } + det = (p - det) % p; + } + u64 a = A[(size_t)c * N + c]; det = mulm(det, a); + u64 ia = powm(a, p - 2); + for (int r = c + 1; r < N; r++) { + u64 b = A[(size_t)r * N + c]; if (!b) continue; + u64 f = mulm(b, ia); + u64 *rr = A + (size_t)r * N, *rc = A + (size_t)c * N; + for (int j = c; j < N; j++) rr[j] = (rr[j] + p - mulm(f, rc[j])) % p; + } + } + return det; +} +int main(int argc, char **argv) { + if (argc < 2) { fprintf(stderr, "usage: check_m0 CERT\n"); return 2; } + FILE *fi = fopen(argv[1], "r"); if (!fi) { perror("cert"); return 2; } + int m, k, size; unsigned alpha; unsigned long long pp, II; + if (fscanf(fi, "m %d k %d alpha %u p %llu I %llu size %d", &m, &k, &alpha, &pp, &II, &size) != 6) { fprintf(stderr, "bad header\n"); return 2; } + p = pp; u64 I = II; int n = 1 << m; + /* p prime (trial division), I^2 = -1 */ + int prime = p > 2 && p < (1ULL << 31); + for (u64 d = 2; d * d <= p && prime; d++) if (p % d == 0) prime = 0; + int okI = mulm(I, I) == p - 1; + unsigned *R = malloc(sizeof(unsigned) * size), *C = malloc(sizeof(unsigned) * size); + for (int i = 0; i < size; i++) if (fscanf(fi, "%u %u", &R[i], &C[i]) != 2) { fprintf(stderr, "short cert\n"); return 2; } + fclose(fi); + char *seenR = calloc((size_t)1 << n, 1), *seenC = calloc((size_t)1 << n, 1); int okS = 1; + for (int i = 0; i < size; i++) { + if (R[i] >> n || C[i] >> n || bits(R[i]) != k || bits(C[i]) != k || (R[i] & 1) || !(C[i] & 1) || seenR[R[i]] || seenC[C[i]]) okS = 0; + else { seenR[R[i]] = 1; seenC[C[i]] = 1; } + } + printf("cert: m=%d k=%d alpha=%u p=%llu (prime: %s) I^2=-1: %s, %d distinct well-formed rows/cols: %s\n", + m, k, alpha, pp, prime ? "yes" : "NO", okI ? "yes" : "NO", size, okS ? "yes" : "NO"); + if (!(prime && okI && okS)) { printf("RESULT: FAIL (format)\n"); return 1; } + u64 mi[4] = {1, p - I, p - 1, I}; /* (-i)^0, (-i)^1, (-i)^2, (-i)^3 */ + u64 *A = malloc(sizeof(u64) * (size_t)size * size); if (!A) { fprintf(stderr, "alloc\n"); return 1; } + u64 *B = malloc(sizeof(u64) * k * k); + for (int i = 0; i < size; i++) { + int u[32], L = 0; for (int x = 0; x < n; x++) if (R[i] >> x & 1) u[L++] = x; + for (int j = 0; j < size; j++) { + int t[32], L2 = 0; for (int x = 0; x < n; x++) if (C[j] >> x & 1) t[L2++] = x; + u64 acc = 0; + for (int s = 0; s < n; s++) { + for (int a = 0; a < k; a++) for (int b = 0; b < k; b++) B[a * k + b] = mi[bits((unsigned)(u[a] ^ (t[b] ^ s))) & 3]; + u64 d = detm(B, k); + u64 term = mulm(mi[bits((unsigned)s) & 3], d); + if (bits(alpha & (unsigned)s) & 1) term = (p - term) % p; + acc = (acc + term) % p; + } + A[(size_t)i * size + j] = acc; + } + if (i % 500 == 0) { fprintf(stderr, " built row %d / %d\n", i, size); } + } + u64 d = detm(A, size); + printf("det mod p of the %d x %d minor of M_%u = %llu\n", size, size, alpha, (unsigned long long)d); + printf("RESULT: %s -> rank M_%u over Q(i) >= %d%s\n", d ? "PASS" : "FAIL", alpha, d ? size : 0, d ? "" : " (not certified)"); + return d ? 0 : 1; +} diff --git a/research/complex-small-m-lower-bounds/author-evidence/check_mj.c b/research/complex-small-m-lower-bounds/author-evidence/check_mj.c new file mode 100644 index 0000000000..31f01fa283 --- /dev/null +++ b/research/complex-small-m-lower-bounds/author-evidence/check_mj.c @@ -0,0 +1,111 @@ +/* 23 Oct 2026. INDEPENDENT CHECKER of a nonsingular-minor certificate for the hook demand of a partial product of + * letters g_L = prod over b in L of dir(e_b) (shares no code with gen_mj.c; different determinant routine, no subset + * tables, no sorting signs; it extends check_m0.c, which is the case L = all bits). + * Definitions: n = 2^m; Q_L[u][v] = (-i)^{popcount(u xor v)} if u xor v lies inside L, else 0, with i -> I + * (I^2 = -1 mod p); g_L = ((1+i)/2)^|L| Q_L. For a row set U = {u_1 < ... < u_k} (0 not in U) and a column set + * T = {t_1 < ... < t_k} (0 in T): + * M_alpha[U][T] = sum over s in F_2^m of (-1)^{alpha.s} * Q_L[0][s] * det( Q_L[u_a][t_b xor s] )_{a,b=1..k}. + * The hook N = span{e_x (x) e_T : x in T} is a coordinate subspace of V (x) Lambda^k V; the shifts X^s act freely + * on its basis and on the complementary basis (rows (0,U), columns (0,T) are orbit representatives) and commute + * with g_L, so the demand f(g_L) = rank (1 - P_N) G P_N, G = g_L (x) Lambda^k g_L, is the sum over the 2^m + * characters alpha of rank M_alpha. + * The certificate file lists m, k, lab (the mask of L), alpha, p, I, and `size` pairs (row mask, col mask). The + * checker verifies: p is prime, I^2 = -1 mod p, the row masks are distinct k-subsets of {1..n-1}, the col masks + * distinct k-subsets containing 0; then, for alpha from the header (or for each ALPHA given on the command line, + * the same rows and columns), builds the size x size matrix from the formula above and computes its determinant + * mod p. Nonzero determinant mod p => the minor of M_alpha over Z[i] is nonzero => rank M_alpha over + * Q(i) >= size. With every alpha in 0..n-1 passing: f(g_L) >= n * size, with no further lemma. + * Build: cc -O2 -o check_mj check_mj.c Run: ./check_mj CERTFILE [ALPHA ...] + */ +#include +#include +#include +typedef uint64_t u64; +static u64 p; +static u64 mulm(u64 a, u64 b) { return a * b % p; } /* exact: p < 2^31 is checked, so a*b < 2^62 */ +static u64 powm(u64 b, u64 e) { u64 r = 1; b %= p; while (e) { if (e & 1) r = mulm(r, b); b = mulm(b, b); e >>= 1; } return r; } +static int bits(unsigned x) { int c = 0; while (x) { c += x & 1; x >>= 1; } return c; } +/* determinant mod p of an N x N matrix (row-major, destroyed), Gaussian elimination with row swaps */ +static u64 detm(u64 *A, int N) { + u64 det = 1; + for (int c = 0; c < N; c++) { + int piv = -1; + for (int r = c; r < N; r++) if (A[(size_t)r * N + c] % p) { piv = r; break; } + if (piv < 0) return 0; + if (piv != c) { + for (int j = 0; j < N; j++) { u64 t = A[(size_t)c * N + j]; A[(size_t)c * N + j] = A[(size_t)piv * N + j]; A[(size_t)piv * N + j] = t; } + det = (p - det) % p; + } + u64 a = A[(size_t)c * N + c]; det = mulm(det, a); + u64 ia = powm(a, p - 2); + for (int r = c + 1; r < N; r++) { + u64 b = A[(size_t)r * N + c]; if (!b) continue; + u64 f = mulm(b, ia); + u64 *rr = A + (size_t)r * N, *rc = A + (size_t)c * N; + for (int j = c; j < N; j++) rr[j] = (rr[j] + p - mulm(f, rc[j])) % p; + } + } + return det; +} +int main(int argc, char **argv) { + if (argc < 2) { fprintf(stderr, "usage: check_mj CERT [ALPHA ...]\n"); return 2; } + FILE *fi = fopen(argv[1], "r"); if (!fi) { perror("cert"); return 2; } + int m, k, size; unsigned lab, alpha0; unsigned long long pp, II; + if (fscanf(fi, "m %d k %d lab %u alpha %u p %llu I %llu size %d", &m, &k, &lab, &alpha0, &pp, &II, &size) != 7) { fprintf(stderr, "bad header\n"); return 2; } + p = pp; u64 I = II; int n = 1 << m; + int prime = p > 2 && p < (1ULL << 31); + for (u64 d = 2; d * d <= p && prime; d++) if (p % d == 0) prime = 0; + int okI = mulm(I, I) == p - 1; + int okL = m >= 1 && m <= 4 && lab != 0 && !(lab >> m) && k >= 1 && k < n; + unsigned *R = malloc(sizeof(unsigned) * size), *C = malloc(sizeof(unsigned) * size); + for (int i = 0; i < size; i++) if (fscanf(fi, "%u %u", &R[i], &C[i]) != 2) { fprintf(stderr, "short cert\n"); return 2; } + fclose(fi); + char *seenR = calloc((size_t)1 << n, 1), *seenC = calloc((size_t)1 << n, 1); int okS = okL; + for (int i = 0; i < size && okS; i++) { + if (R[i] >> n || C[i] >> n || bits(R[i]) != k || bits(C[i]) != k || (R[i] & 1) || !(C[i] & 1) || seenR[R[i]] || seenC[C[i]]) okS = 0; + else { seenR[R[i]] = 1; seenC[C[i]] = 1; } + } + printf("cert: m=%d k=%d lab=%u p=%llu (prime: %s) I^2=-1: %s, %d distinct well-formed rows/cols: %s\n", + m, k, lab, pp, prime ? "yes" : "NO", okI ? "yes" : "NO", size, okS ? "yes" : "NO"); + if (!(prime && okI && okS)) { printf("RESULT: FAIL (format)\n"); return 1; } + int na = argc > 2 ? argc - 2 : 1; + unsigned *alphas = malloc(sizeof(unsigned) * na); + for (int a = 0; a < na; a++) { + alphas[a] = argc > 2 ? (unsigned)strtoul(argv[2 + a], NULL, 10) : alpha0; + if (alphas[a] >> m) { printf("RESULT: FAIL (alpha %u out of range)\n", alphas[a]); return 1; } + } + u64 mi[4] = {1, p - I, p - 1, I}; /* (-i)^0, (-i)^1, (-i)^2, (-i)^3 */ + u64 *A = malloc(sizeof(u64) * (size_t)size * size); if (!A) { fprintf(stderr, "alloc\n"); return 1; } + u64 *B = malloc(sizeof(u64) * k * k); + int allok = 1; + for (int ai = 0; ai < na; ai++) { + unsigned alpha = alphas[ai]; + for (int i = 0; i < size; i++) { + int u[32], L = 0; for (int x = 0; x < n; x++) if (R[i] >> x & 1) u[L++] = x; + for (int j = 0; j < size; j++) { + int t[32], L2 = 0; for (int x = 0; x < n; x++) if (C[j] >> x & 1) t[L2++] = x; + u64 acc = 0; + for (int s = 0; s < n; s++) { + if ((unsigned)s & ~lab) continue; /* Q_L[0][s] = 0 */ + for (int a = 0; a < k; a++) for (int b = 0; b < k; b++) { + unsigned d = (unsigned)(u[a] ^ (t[b] ^ s)); + B[a * k + b] = (d & ~lab) ? 0 : mi[bits(d) & 3]; + } + u64 dd = detm(B, k); + u64 term = mulm(mi[bits((unsigned)s) & 3], dd); + if (bits(alpha & (unsigned)s) & 1) term = (p - term) % p; + acc = (acc + term) % p; + } + A[(size_t)i * size + j] = acc; + } + if (i % 500 == 0) { fprintf(stderr, " alpha %u: built row %d / %d\n", alpha, i, size); } + } + u64 d = detm(A, size); + printf("det mod p of the %d x %d minor of M_%u (lab %u) = %llu\n", size, size, alpha, lab, (unsigned long long)d); + printf("ALPHA %u: %s -> rank M_%u over Q(i) >= %d%s\n", alpha, d ? "PASS" : "FAIL", alpha, d ? size : 0, d ? "" : " (not certified)"); + fflush(stdout); + if (!d) allok = 0; + } + printf("RESULT: %s (%d alpha value%s checked, %d x %d each)\n", allok ? "PASS" : "FAIL", na, na == 1 ? "" : "s", size, size); + return allok ? 0 : 1; +} diff --git a/research/complex-small-m-lower-bounds/author-evidence/induction-across-block-sizes.md b/research/complex-small-m-lower-bounds/author-evidence/induction-across-block-sizes.md new file mode 100644 index 0000000000..9343bbd87a --- /dev/null +++ b/research/complex-small-m-lower-bounds/author-evidence/induction-across-block-sizes.md @@ -0,0 +1,216 @@ +> **Working note, kept as written.** An AI agent wrote this on the evening of 13 October 2026 (the induction track +> of the proofs round), and it is the written argument behind the bound of 2.9447 moves per array at every block from +> 4 on. Private paths were replaced by public ones (listed below) and nothing else was changed. No person has checked +> it. Two AI skeptics then read it: one went through every step by hand, the other recomputed every number with its +> own code. Neither found an error in the bounds of section 4. Their reports are in +> [induction-across-block-sizes-skeptics.md](induction-across-block-sizes-skeptics.md), and they asked for these +> corrections, which the note below does not contain: +> +> - **Proposition 7(c) is false as stated.** "General tensor products: at most 2 × the best" fails for families whose +> dimension varies from frame to frame: at block 2 two cut families give 28/13 times the better factor. It holds +> for families of constant dimension, which includes every certificate and every projection, pullback or sum of +> one. +> - **"No growth" says more than was proved.** What is proved is that each single operation (projection, pullback, +> direct sum, tensor product of certificate families) stays within a fixed factor of the ratio it starts from, so +> a computation at block m0 fed through them certifies at most about 2·m0 at any block size. Small rises do +> happen: the perfect block-2 family goes from 2 to 2.2 higher up, and the block-3 hook from 2.636 at block 4 to +> 2.653 at block 5. Combinations such as tensor products of several pullbacks are not covered. +> - **The corollary of Theorem 4 needs one more sentence.** It checks that the profile built from the lower bounds +> for f_2, f_3, f_4 is nondecreasing, not the true profile. That is enough, because every T_m and every R_r grows +> with each f_s, while ā_1 depends only on f_1, which is exact. +> - **κ_m = 2 − 2^(1−m)** is checked exactly up to block 40 (the second skeptic) and argued beyond. +> +> **Since then.** Fact B calls f_2 ≥ 48,576 and f_3 ≥ 68,320 "certified mod-p lower bounds", but no certificate +> for them was stored until 23 October 2026. Now one is, checked on all 16 characters, in +> `../programs/hook-certificates-blocks-2-to-6/`, next to the 5,412 × 5,412 minor behind f_4 ≥ 86,592. Maximilian +> Lutz checked section 4 independently with his own code, and proved the two domination inequalities for every k +> ([#4643](https://github.com/CrocSwap/integer-mult-bounds/pull/4643)). +> +> **Names of my working notes used below, and where to read them here.** +> +> | In the note | Here | +> |---|---| +> | Theorem R (`w-bounds` section 2) | section 1.1 of [the README](../README.md); proved in Lean in `../programs/lean-block2-block3/` | +> | the Averaging Lemma and the triangle inequality (`w-bounds` section 3) | Lemma 2 of [two-arrays.md](../../../notes/network-coding/two-arrays.md), written there at block 3; its proof uses only that the letter group carries every ordered pair of frames to every other pair at the same distance, which Fact A gives at every m. The triangle inequality δ(U,W) ≤ δ(U,V) + δ(V,W) holds because intersecting Y_U ∩ Y_V with Y_W removes at most δ(V,W) dimensions. | +> | `engine_m.py` and its outputs (v-b56-methods) | `../programs/engine-bounds-blocks-5-and-6/fact-a/` and `../data/engine-bounds-blocks-5-and-6/fact-a/` | +> | the exact table of N_r(s) (b56-methods, v-b56-methods) | `../data/engine-bounds-blocks-5-and-6/exact-projection-table/` | +> | the earlier engine-game bounds (b56-note, b56-methods: 2.665, 2.641, 35/17, …) | `../data/certificate-ceilings/out_numbers.txt` | +> | b56-compute, v-b56-compute (the block-4 hook values) | `../data/block4-hook/`; the skeptic's own check is `fcheck.py` below | +> | w-bounds section 5.4 (certificates A to E) | certificate A (the label permutation module) is the function `A` of `../../existence-routes/programs/boosters/certlib.py`; the others are not published | +> | the programs and outputs named in the note | `../programs/engine-bounds-blocks-5-and-6/` and `../data/engine-bounds-blocks-5-and-6/` | + +# Induction across block sizes (pf-induction) + +Proofs round, 13 October 2026, evening. One agent; no skeptic has read this yet. Nothing posted. Labels: [proved] (full proof here), [computed] (exact arithmetic, script named), [argued], [guess]. Everything is "given Theorem R" (`w-bounds` section 2) and holds in the **engine game** unless it says otherwise. + +## What came out + +1. **A finite computation at block 4 now bounds every block size** [proved + computed]. Carrying the block-4 hook (k = 8) up by the projection recursion gives, in the engine game, at least **2.9447 moves per array at every block size m ≥ 4**, with exact values 834241/278850 = 2.99172 at block 5 and 1188222/399685 = 2.97290 at block 6. The previous engine-game bounds were 2.665 (block 5) and 2.641 (block 6). The saving left open drops from 0.391 to 0.319 at block 5, and from 0.458 to 0.392 at block 6. At every m it is at most ln(m/2.9447)/ln m. (Theorem 4.) +2. **The bound does not grow. No induction of the projection kind can make it grow** [proved]. Projection from a block-m0 family never exceeds (its best profile ratio) × (2^(m0+1)+1)/(2^(m0+1)−2), at any m. From block 4 that is at most 4.4 even for a perfect block-4 family, and 3.47 for the hook. Pullbacks along arbitrary maps (equivariant or not) gain at most a factor κ_m = 2 − 2^(1−m) < 2. Direct sums never beat their best part. Tensor products of certificate families never beat their best factor. (Theorems 5 and 6, Proposition 7.) +3. **The question has a clean dichotomy** [proved]. The best engine-game Theorem-R bound L*_m is subadditive: L*_(a+b) ≤ L*_a + L*_b. So L*_m/m converges to λ* = inf L*_m/m. Either λ* > 0, in which case ε_m is bounded and the method's bounds grow linearly (savings → 0), or λ* = 0 and ε_m → ∞. No finite computation at small m, fed through any of the inductions above, can decide which: they all stay within a factor of about 2 of the base block. (Lemma 1, section 9.) +4. **Coordinate families are capped below 2 at every block size** [proved for m ≤ 12; argued for all m]. A family spanned by basis vectors chosen per frame (any permutation module) certifies at most κ_m = 2 − 2^(1−m) moves per array. This is attained by the point cut, and explains certificates A to E of w-bounds 5.4 (1.75 = κ_3). (Theorem 6.) +5. **One array always needs m moves** [proved, 6 lines]. A one-array unit cannot use fewer than m moves at block m, at engine prices too. So "1 in 3" at blocks 5 and 6 is excluded. (Proposition 8.) +6. **Units embed, and so do the bounds** [proved]. True costs satisfy μ_(m+1)(W) ≤ μ_m(W) + W and μ_(a+b) ≤ μ_a + μ_b, which mirrors the subadditivity of L*. (Lemma 1(d).) + +**What this does not settle.** Whether any Theorem-R certificate in the engine game can certify more than 4 per array at large m is still open. The answer is "no" for every construction built by induction from small blocks: projections and other pullbacks, sums, tensors, and coordinate families. A "yes" needs a global object, a family of subspaces on the whole dual polar graph with average edge excess ε_m = o(m). Section 9 says what such an object must look like. + +--- + +## 0. Setting + +- **Frames.** At block m, frames are the Lagrangians of F_2^(2m), with the form x·z′ + x′·z. Distance is d(U,V) = m − dim(U∩V). This is the dual polar graph DSp(2m,2): diameter m, valency 2(2^m − 1). L_0 is the diagonal-Pauli frame {(0|z)}. +- **Families.** A family Y gives each frame U a subspace Y_U of one vector space over a field of characteristic 0. Put δ(U,V) = dim Y_U − dim(Y_U ∩ Y_V). ā_r is the mean of δ over ordered pairs at distance r. The profile ratios are R_r = ā_r/ā_1, and the top ratio is T(Y) = R_m. A family is **distance-determined** when δ(U,V) depends only on d(U,V). +- **L\*_m** is the supremum of T(Y) over all families at block m: the best moves-per-array bound that Theorem R can give in the engine game. ε_m = m/L_m − 1 (b56-note). + +**Fact A (letters at every m)** [proved; matrices at m = 3, 4, 5 in `../data/engine-bounds-blocks-5-and-6/fact-a/out_engine_m*.txt`]. The letters are those typed from the Lean source in `../programs/engine-bounds-blocks-5-and-6/fact-a/engine_m.py`: shift X^z, dir z = ((1+i)/2)·I + ((1−i)/2)·X^z, address maps for G in GL(m,2), and phaseMat z c = diag(i^((z·x) xor c)). Their frame actions are as follows: +- The address maps act as diag(A, A^−T), which gives all of GL(m,2). +- phaseMat z c acts as the transvection along (0|z). With D = diag(i^[z·x]), D X^a D^−1 = X^a if z·a = 0, and = i·X^a Z^z (up to the fixed sign convention) if z·a = 1. That is (a|b) ↦ (a|b + (z·a)z). Sums of zz^T give every symmetric matrix over F_2, for example [[0,1],[1,0]] = (e1+e2)(e1+e2)^T + e1e1^T + e2e2^T. So the free letters give the whole stabiliser P of L_0, and they fix L_0. +- dir z is the transvection along (z|0). A block dir z_1⋯dir z_j acts as [[I,T],[0,I]] with T = Σ z_i z_i^T, so it moves L_0 to distance rank T ≤ j. The kernel has T = I, which is distance m (opposite). + +P acts transitively on each sphere around L_0. By Witt's theorem every pair of Lagrangians at distance d has a symplectic basis e, f with U = ⟨e⟩ and V = ⟨e_1..e_(m−d), f_(m−d+1)..f_m⟩. Since rank-d blocks reach distance d, the letter group Γ is transitive on frames. Its image contains P, so |image| ≥ |frames|·|P| = |Sp(2m,2)|, so the image is Sp(2m,2), which is distance-transitive. These are exactly the hypotheses of the Averaging Lemma (w-bounds section 3) at every m. Hence for every family, moves ≥ W·ā_m/ā_1, using ā_j ≤ j·ā_1 for a block of rank j. + +**Fact B (certificates are distance-determined families)** [proved]. Let (V, N) be a certificate with N kept by the free group B. The kernel of Γ → Sp(2m,2) consists of the Paulis and the scalars ±1, ±i. The Paulis are in B: the X^z are shifts, and the Z^z are squares of phaseMat. If cI ∈ Γ, then c ∈ Q(i) and c^n = det(cI) is a product of letter determinants, each a power of i, since the letters have eigenvalues in {±1, ±i}. So c is a root of unity in Q(i), that is ±1 or ±i, and i = phaseMat 0 1 ∈ B. So B is the whole preimage of P = Stab(L_0). Hence Y_U := gN, for any g with gL_0 = U, is well defined. Its δ(U,V) = f(g_U^−1 g_V) is constant on each B-double coset, that is, on each distance. So δ = f_d with f_d = f(any block of rank d). The block-4 hook has f_1 = 27456 (exact, proved closed form), f_2 ≥ 48576, f_3 ≥ 68320 and f_4 ≥ 86592 (certified mod-p lower bounds: `../data/block4-hook/out_rank2_blocks.txt`, `out_m4_hook8_G.txt`; upheld by v-b56-compute). + +## 1. Lemma 1: profiles, residues, subadditivity, units + +(a) [proved] For every family and every r, s with r+s ≤ m: ā_(r+s) ≤ ā_r + ā_s. +*Proof.* Take U, W at distance r+s and a frame V on a geodesic, at distance r from U and s from W. Then δ(U,W) ≤ δ(U,V) + δ(V,W) (w-bounds section 3). Average over a uniformly random pair (U,W) and a uniformly random such V. By distance-transitivity, (U,V) is a uniform pair at distance r and (V,W) a uniform pair at distance s. ∎ + +(b) [proved] **Residue restriction.** For every family at block m and every r ≤ m: R_r ≤ L\*_r. +*Proof.* The frames containing a fixed isotropic I of dimension m−r form a copy of DSp(2r,2), via U ↦ U/I in I^⊥/I, and distances are preserved. Restricted to it, Y is a block-r family. Average over I. Pairs (U,V) in a residue at distance s ≤ r are uniform among all pairs at distance s, by transitivity. So the averaged residue family has the profile ā_1..ā_r of Y, and its top ratio R_r is at most L\*_r. A direct sum over all I has the averaged profile. ∎ + +(c) [proved] **Subadditivity.** L\*_(a+b) ≤ L\*_a + L\*_b. Hence (Fekete) L\*_m/m → λ\* = inf_m L\*_m/m. ε_m is bounded if and only if λ\* > 0. +*Proof.* By (a), ā_(a+b) ≤ ā_a + ā_b. By (b), this is at most (L\*_a + L\*_b)·ā_1. Fekete's lemma applies to the subadditive sequence L\*_m. ε_m = m/L\*_m − 1 is bounded if and only if L\*_m ≥ cm for some c > 0. ∎ + +(d) [proved, given Fact A's letter list] **Units embed.** Let μ_m(W) be the fewest paid moves of a correct block-m word for W live arrays. Then μ_(m+1)(W) ≤ μ_m(W) + W and μ_(a+b)(W) ≤ μ_a(W) + μ_b(W). +*Proof.* The map g ↦ g ⊗ I_2 on the last address bit sends block-m letters to block-(m+1) letters of the same kind and rank: dir z ↦ dir (z,0), shift and phase likewise, and the address map G ↦ G ⊕ id. It is a group homomorphism, so it maps formal identities to formal identities. The block-(m+1) kernel is (K_m ⊗ I)·dir e_(m+1). So run the lifted word, then one direction per live array. Likewise K_(a+b) = (K_a ⊗ I)(I ⊗ K_b): run the two lifted words one after the other. ∎ +(c) is the certificate-side mirror of (d). Neither gives growth. + +## 2. Lemma 2: the projection counts, closed form [proved; computed check] + +For a point p, π_p(U) = (U∩p^⊥ + p)/p ∈ Lag(p^⊥/p). For L, M at distance r, put H = L∩M, of dimension m−r, so that L+M = H^⊥. The number N_r(s) of nonzero p with d(π_pL, π_pM) = s is: + +| s | N_r(s) | which p | +|---|---|---| +| r | (2^(m−r) − 1) + (4^m − 2^(m+r)) | p ∈ H, or p ∉ L+M | +| r−1 | 2(2^m − 2^(m−r)) + (2^r − 1)·2^(r−1)·2^(m−r) | p ∈ (L∪M) \ H; or p = l+m′ with ⟨l,m′⟩ = 1 | +| r−2 | (2^r − 1)(2^(r−1) − 1)·2^(m−r) | p = l+m′ (l ∈ L\H, m′ ∈ M\H) with ⟨l,m′⟩ = 0 | + +*Proof.* Upstairs, π_pL ∩ π_pM = {a + εp = b + ε′p : a ∈ L∩p^⊥, b ∈ M∩p^⊥}, so a = b or a + b = p. +- (i) If p ∈ H, the intersection is H, so s = r. +- (ii) If p ∉ L+M, then a + b = p is impossible. The intersection is (H∩p^⊥) + ⟨p⟩, of dimension m−r, so s = r. +- (iii) If p ∈ L\H, then π_pL = L/p, and the intersection is H + ⟨p⟩, so s = r−1. The case p ∈ M\H is symmetric. +- (iv) Otherwise p = l + m′. Here ⟨h,p⟩ = 0 for h ∈ H, and for a = l + h we get ⟨a,p⟩ = ⟨l,m′⟩, which does not depend on the decomposition. If it is 0, the intersection is H + ⟨l, p⟩ and s = r−2. If it is 1, the intersection is H + ⟨p⟩ and s = r−1. + +The pairing L/H × M/H → F_2 is perfect. So, counting the nonzero pairs (l̄, m̄′), (2^r−1)(2^(r−1)−1) have pairing 0 and (2^r−1)·2^(r−1) have pairing 1, and each pair gives 2^(m−r) points p. ∎ + +[computed, `nrs.py` → `out_nrs.txt`] The formula agrees with all 20 exact (m,r) rows of b56-methods/v-b56-methods (m = 2..6) and with 23 fresh brute-force counts on random symplectic frames (m = 2..5). There were 0 mismatches. + +## 3. Theorem 3: the projection recursion as a Markov chain [proved] + +Let f_0 = 0, f_1, …, f_(m0) be the profile of a distance-determined block-m0 family. For k > m0 put Y^(k)_U = ⊕_p Y^(k−1)(ι_p π_p U), summed over the nonzero points p, where each ι_p is a fixed symplectic identification p^⊥/p ≅ F_2^(2k−2). + +**Claim 1.** ā^(k)_r = Σ_s N^(k)_r(s)·ā^(k−1)_s (b56-methods). *Proof.* Fix p. Stab(p) maps onto Sp(p^⊥/p), π_p is equivariant, and the uniform law on pairs at distance r is invariant. So, given s, the pair (π_pU, π_pV) is uniform among pairs at distance s, and E[δ | s] = ā^(k−1)_s. Summing P(d_p = s) over p gives E[#{p : d_p = s}] = N_r(s), by Lemma 2. ∎ + +**Claim 2.** Write P_k = 4^k − 1. Let D_m, D_(m−1), …, D_(m0) be the Markov chain on distances with step law N^(k)_r(s)/P_k from block k to block k−1, in which 0 is absorbing. Then ā^(m)_r = (Π_(k=m0+1..m) P_k)·E[f_(D_(m0)) | D_m = r]. In particular ā^(m)_1 = (Π P_k)·f_1·S_m with S_m = Π_(k=m0+1..m) A_1(k)/P_k, where A_1(k) = 4^k − 3·2^(k−1) − 1. *Proof.* Induction on m, using Claim 1. From distance 1 the chain stays at 1 with probability A_1(k)/P_k or falls to 0. ∎ + +So T_m = E[f_(D_(m0)) | D_m = m] / (f_1·S_m). + +## 4. Theorem 4: a bound for every block size from block 4 [proved + computed] + +Let J_k = k − D_k be the **deficit**. An opposite pair starts at J_m = 0. One step at block k from deficit j (distance r = k−j ≥ 1) goes as follows: down to j−1 with probability A_r/P_k; stay at j with probability B_r/P_k; up to j+1 with probability C_r/P_k. Here A, B, C are the three rows of Lemma 2. From distance 0 the chain always goes down. + +**Domination** [proved]. For all k ≥ 1 and 0 ≤ j < k: +- C_r ≤ 2^(−j−1)·P_k. Indeed C_r = 2^(2k−j−1) − 3·2^(k−1) + 2^j and 2^(−j−1)P_k = 2^(2k−j−1) − 2^(−j−1), so the claim reduces to 2^j + 2^(−j−1) ≤ 3·2^(k−1), which holds for j ≤ k−1. +- For j ≥ 1, A_r ≥ (1 − 2^(−j))·P_k, because the difference is 2^j − 2^(−j) ≥ 0. [exact check for k ≤ 80 in `tail.py`: 0 violations] + +Let J\* be the homogeneous birth-death chain with up-probability 2^(−j−1) and down-probability 1 − 2^(−j) (j ≥ 1), and at j = 0 up 1/2, stay 1/2. It is stochastically monotone, since p_up(j) + p_down(j+1) = 1. The real chain is dominated by it step by step: P(next ≥ j+1) ≤ p\*_up and P(next ≥ j) ≤ 1 − p\*_down. Hence, starting both at 0, J_t ≤_st J\*_t. A monotone chain started at its bottom state increases stochastically to its stationary law. So J_t ≤_st π\*, where by detailed balance π\*(j+1)/π\*(j) = 1/(2^(j+1) − 1). That is, π\* ∝ 1, 1, 1/3, 1/21, 1/315, …, with normaliser 2.3842310290. + +**Theorem 4.** Fix M > m0. Suppose the block-M profile r ↦ R^(M)_r (with R_0 = 0) is nondecreasing. Then for every m ≥ M: + +T_m ≥ c\*_M := Σ_j π\*(j)·R^(M)_(M−j) (terms with M−j ≤ 0 count as 0). + +*Proof.* Condition on J_M. Then E[f_(D_(m0)) | J_m = 0] = Σ_j P(J_M = j)·h(j), with h(j) = ā^(M)_(M−j)/Π_(k≤M)P_k = R^(M)_(M−j)·f_1·S_M by Claim 2 at block M. So T_m = (S_M/S_m)·Σ_j P(J_M = j)·R^(M)_(M−j). Here S_M/S_m ≥ 1 because every factor is ≤ 1. Since j ↦ R^(M)_(M−j) is nonincreasing and J_M ≤_st π\* (the chain from block m down to M is dominated), the sum is at least Σ_j π\*(j)·R^(M)_(M−j). ∎ + +**Corollary (block-4 hook)** [computed, `tail.py` → `out_tail.txt`, exact integers and fractions; normaliser of π\* bounded from above]. The base profile is (27456, 48576, 68320, 86592). All of its entries are certified lower bounds, and f_1 is exact, so every T_m below is a certified lower bound. +- T_5 = 834241/278850 = 2.991720, T_6 = 1188222/399685 = 2.972896, T_7 = 2361819/799370 = 2.954600. +- T_m decreases to 2.944709234 by m = 60. +- The block-60 profile is nondecreasing, and c\*_60 = 2.944709234120998, equal to the exact top at m = 60. + +Hence, in the engine game, **every unit at block m ≥ 5 uses at least 2.9447·W moves**, and block 4 keeps 41/13. The block-5 and block-6 values are exact rationals. Cross-checks: the same code reproduces b56-methods' 29/11, 9486/3575 and 405993/153725 from the block-3 hook, and 35/17, … from the perfect block-2 family (`out_induct.txt`). + +| Block | Old engine-game bound (b56-note) | New | Saving left open, old → new | Units now excluded (moves, engine game) | +|---|---|---|---|---| +| 5 | 2.665 | 2.99172 (exact fraction) | 0.391 → 0.319 | 3 in 8, 4 in 11, and every W in 3W−1 with W ≤ 120 | +| 6 | 2.641 | 2.97290 (exact fraction) | 0.458 → 0.392 | 3 in 8, 4 in 11, 5 in 14, and every W in 3W−1 with W ≤ 36 | +| m ≥ 7 | none | 2.9447 | 1 − ln 2.9447/ln m | — | + +Engine prices [computed, indicative: they need f_j from above for j ≥ 2, which mod-p ranks do not give; `out_prices.txt`]. The engine-priced caps are 0.713 (block 5; hooks gave 0.83) and 0.796 (block 6; hooks 0.91). From block 7 on they exceed 0.9, because f_(m−1)/f_m → 1: rank-(m−1) blocks are priced almost as a whole array. The bounds hold in the engine game only, as do all projection bounds (Toffoli letters do not act on frames). + +## 5. Theorem 5: projection cannot grow [proved] + +For every base profile and every m > m0: + +T_m ≤ (max_s f_s / f_1) / S_∞(m0), with S_∞(m0) = Π_(k>m0) A_1(k)/P_k = 2(2^(m0) − 1)/(2^(m0+1) + 1). + +*Proof.* E[f_(D_(m0))] ≤ max_s f_s and S_m ≥ S_∞. For the product, write x = 2^k. Then A_1/P_k = (x−2)(2x+1)/(2(x−1)(x+1)), and both factors telescope: Π (2^k − 2)/(2^k − 1) → (2^(m0) − 1)/2^(m0) and Π (2^(k+1) + 1)/(2(2^k + 1)) → 2^(m0+1)/(2^(m0+1) + 1). ∎ [computed: S_∞ = 2/3, 14/17, 10/11 for m0 = 2, 3, 4, agreeing with the 400-term product] + +Every family has max_s f_s/f_1 ≤ m0 by Lemma 1(a). So **projection from block m0 never certifies more than m0·(2^(m0+1)+1)/(2^(m0+1)−2)**, at any block size: 3, 3.643, 4.4, 5.24 for m0 = 2, 3, 4, 5. Even a perfect block-4 family (which does not exist in characteristic 0) would give at most 4.4. The block-4 hook gives at most 3.469, and in fact converges to 2.9447. + +**Why** [proved by Lemma 2]. An edge survives a point projection with probability 1 − 3·2^(k−1)/P_k ≈ 1 − 3·2^(−k−1), but an opposite pair loses a step of distance with probability (2^(k−1)−1)/(2^k+1) ≈ 1/2, every time. The deficit settles at π\*, near 0.42/0.42/0.14 on deficits 0/1/2. So the projected top ratio is a fixed weighted sum of the base's top ratios. For the block-4 hook the limit is 0.491·R_4 + 0.460·R_3 + 0.134·R_2 + 0.014·R_1 = 2.944709 [computed, `checks.py` → `out_checks.txt`: the exact law of the block-4 distance of an opposite pair projected down from block 60 is 0.446/0.418/0.122/0.013 on 4/3/2/1, divided by S_60]. That is why R_3 = 2.49 of the hook matters almost as much as R_4 = 3.15. A block-4 certificate with a better R_3 would raise the bound for every m. + +## 6. Theorem 6: cuts, coordinate families and pullbacks along any map + +**κ_m** := the largest P_m(cut)/P_1(cut) over the nontrivial cuts S of DSp(2m,2), where P_d(cut) is the probability that a uniform pair at distance d is separated. For a 0/1 function, P_d = ½·E_d|1_S(U) − 1_S(V)|² = Σ_θ (1 − u_d(θ))·‖f_θ‖² (spectral decomposition of the distance-regular graph). So κ_m ≤ max_(θ≠k) (1 − u_m(θ))/(1 − u_1(θ)). + +[proved for m = 2..12 by exact computation, `cutceil.py` → `out_cutceil.txt`] I used the intersection array b_i = 2^(i+1)(2^(m−i) − 1) and c_i = 2^i − 1, which agrees with the sphere sizes of engine_m.py at m = 3, 4, 5. All m+1 eigenvalues were found as exact integer roots. The maximum is **κ_m = 2 − 2^(1−m)** (3/2, 7/4, 15/8, …), at the eigenvalue 2^m − 3. It is attained by the point cut {U : v ∈ U}: brute force at m = 2, 3 gives exactly 3/2 and 7/4, and the general count is in section 9. [argued for m > 12: the same eigenvalue maximises; a closed-form check of the q-Krawtchouk cosines is the missing step] + +**Consequences** [proved, for every m with κ_m as above]. +- (i) A **coordinate family**, with Y_U = span{e_x : x ∈ S(U)} for one fixed basis, has δ(U,V) = |S(U) \ S(V)| = Σ_x [x ∈ S(U), x ∉ S(V)]. This is a sum of directed cuts, so its ratio is ≤ κ_m < 2. This covers every permutation-module certificate. w-bounds 5.4's certificate A has ratio exactly 7/4 = κ_3; B (2W) is a quotient, not a coordinate family. +- (ii) **Pullbacks along arbitrary maps.** Let φ: Lag(2m,2) → Lag(2m′,2) be any map, and F′ a distance-determined family with 0 < f′_1 ≤ f′_s ≤ f′_max (s ≥ 1). Then Y_U = F′(φU) has ratio ≤ (f′_max/f′_1)·κ_m. *Proof.* The numerator is ≤ f′_max·q_m and the denominator ≥ f′_1·q_1, where q_d = P_d(φU ≠ φV) = Σ_fibres C P_d(U ∈ C, V ∉ C) is a sum of directed cuts, so q_m/q_1 ≤ κ_m. ∎ +- So any pullback induction from a block-m′ certificate family gives at most 2·(its ratio) ≤ 2m′ at any block size. The equivariant point projection gives the sharper factor of Theorem 5. + +## 7. Proposition 7: sums and tensor products [proved] + +- (a) **Direct sums:** ā_r adds, so T(F ⊕ G) is a mediant, at most max(T(F), T(G)). +- (b) **Tensor products of distance-determined families** (every certificate family, by Fact B): T(F_1 ⊗ ⋯ ⊗ F_k) ≤ max_i T(F_i). + - *Proof.* With D_i = dim and x_i = δ_i/D_i, we have δ_⊗/ΠD_i = 1 − Π(1 − x_i). On edges x_i = e_i, a constant, and on opposite pairs x_i = t_i ≤ min(1, R·e_i), with R = max T(F_i). Put g(ρ) = 1 − Π(1 − min(1, ρe_i)). Each factor is nonnegative, nonincreasing and convex in ρ, and a product of such functions is convex ((uv)″ = u″v + 2u′v′ + uv″ ≥ 0). So g is concave, and g(0) = 0. Hence g(R) ≤ R·g(1) for R ≥ 1. The numerator 1 − Π(1 − t_i) is at most g(R), and the denominator is g(1). So the top ratio is ≤ R. ∎ +- (c) **General tensor products:** T(F ⊗ G) ≤ 2·max(T(F), T(G)), because x + y − xy ≥ (x+y)/2. + +## 8. Proposition 8: one array needs m moves, at any price [proved] + +Expand a correct word multilinearly. Every term of the final content of live register 1 comes from a history, which is a sequence of letters applied to y_1, and its group element is the product of those letters. The coefficient of [K]y_1 is 1, so some history has product K. Along it, d(ℓgL_0, L_0) ≤ d(gL_0, L_0) + d(ℓL_0, L_0) (because d(ℓgL_0, ℓL_0) = d(gL_0, L_0)). That step adds 0 for a free letter (Fact A) and at most j for a block of rank j. K is at distance m, so the paid blocks on that history, which are distinct steps of the word, have total rank ≥ m. Their engine price is Σ(j_i/m)^z ≥ Σ j_i/m ≥ 1 for z ≤ 1. ∎ So "1 in 3" (blocks 5 and 6, b56-note) is excluded, and a saving needs W ≥ 2 with shared paid steps. + +## 9. The question asked, and checks against the exact table + +- **Growth theorem from induction: impossible** [proved, sections 5 to 7]. The inductions named in the brief have these limits: + - Projection (point and isotropic) gains at most a factor (2^(m0+1)+1)/(2^(m0+1)−2), and for the hook it converges to a weighted mean of its top ratios. + - Pullbacks along any maps gain at most a factor < 2. + - Sums and tensor products of certificate families gain nothing. + - Lifting units only gives μ_(m+1) ≤ μ_m + 1. + + So no theorem of the form "block-m bound ⇒ larger block-(m+1) bound" exists inside this toolbox. A finite computation at block m0 caps what these inductions can certify at about 2·m0 at most. They do give a uniform bound for every m, which is Theorem 4. +- **No-go for the whole method (≤ 4 for every certificate): not proved.** It holds for every certificate that is coordinate (< 2), projected or pulled back from small blocks (< 2·base), a sum or a tensor of those, a hook (< 4, b56) or a Venn set (< 4, b56). The general case is exactly the λ\* dichotomy of Lemma 1(c). λ\* > 0 needs a family whose average edge excess ε_m stays bounded. + - In such a family, the triangle inequality must be nearly tight along most geodesics. Equivalently, Y_U ∩ Y_W ⊂ Y_V must hold for most frames V between U and W. + - Then on the copy of the subspace lattice of L inside the graph (A ↦ A + (A^⊥ ∩ M) for M opposite L; distance = dim(A+B) − dim(A∩B), an isometric embedding), A ↦ Y_L ∩ Y_(F_A) must be close to a lattice representation of PG(m−1,2) in characteristic 0. That is the Fano obstruction (Theorem F), now needed in every rank-3 residue at once. + - [guess] I expect λ\* = 0 (ε_m → ∞), because the clean part of every known family (the pair frames of the perfect lift) has density → 0. Turning this into a proof needs a quantitative, characteristic-dependent rank inequality on PG(m−1,2) configurations whose violation count grows with m. I did not find one. +- **Checks at m = 2..6** [computed]: + - The N_r(s) closed form equals the exact table (section 2). + - The recursion reproduces b56-methods' bounds exactly (35/17, 400/187, 26319/12155, 228354/104533; 29/11, 9486/3575, 405993/153725). + - κ_2 = 3/2 < 2 = L_2, so block 2 needs a non-coordinate family (the perfect lift). κ_3 = 7/4 equals certificate A of w-bounds 5.4. + - New m = 5, 6 values: 2.99172 ≥ widened 31/14 and 2.97290 ≥ 63/31, consistent since engine bounds must dominate widened ones. + - Lemma 1 on the new families [computed, `out_checks.txt`]: block-5 profile 1, 1.737, 2.359, 2.806, 2.992 and block-6 profile 1, 1.723, 2.306, 2.694, 2.865, 2.973. Both are nondecreasing and satisfy R_(r+s) ≤ R_r + R_s and R_r ≤ r. So does the base block-4 profile (lower bounds) 1, 1.769, 2.488, 3.154. + - ε_5 = 5/2.99172 − 1 = 0.671 and ε_6 = 1.018. Ruling out a saving of 0.1 needs 0.175 and 0.196 (b56-note). +- **Point cut count (for Theorem 6):** P_m(cut) = 2/(2^m+1) and P_1(cut) = 2·(1/(2^m+1))·2^(m−1)/(2^m−1), so the ratio is (2^m−1)/2^(m−1) = 2 − 2^(1−m). The count: of the 2(2^m−1) neighbours of U ∋ v, 2^m are reached through hyperplanes H ∌ v, and those neighbours do not contain v. + +## Files (`../programs/engine-bounds-blocks-5-and-6/`, outputs in `../data/engine-bounds-blocks-5-and-6/`) + +- `nrs.py`, `nrs_closed.py` → `out_nrs.txt`: Lemma 2 and its checks. +- `induct.py` → `out_induct.txt`: the recursion from three bases, with and without the triangle improvement (identical values). +- `tail.py` → `out_tail.txt`: domination inequalities, π\*, c\*, the all-m bound, S_∞ and the no-growth ceilings. +- `cutceil.py` → `out_cutceil.txt`: κ_m for m = 2..12, with a brute-force check at m = 2, 3. +- `prices.py` → `out_prices.txt`: indicative engine-price caps. +- `checks.py` → `out_checks.txt`: Lemma 1 on the projected profiles, and the limiting deficit law. +- `RUNLOG.txt`, `STATUS.txt` (in my private archive). + +All runs went through a memory guard, each under 15 s and 100 MB. diff --git a/research/complex-small-m-lower-bounds/author-evidence/out_check_m4_g2.txt b/research/complex-small-m-lower-bounds/author-evidence/out_check_m4_g2.txt new file mode 100644 index 0000000000..faecc5517d --- /dev/null +++ b/research/complex-small-m-lower-bounds/author-evidence/out_check_m4_g2.txt @@ -0,0 +1,98 @@ +check_mj on cert_m4_g2_M0.txt (lab 3), one run per character alpha = 0..15, 23 October 2026, Apple M4 Mac mini, +six runs at a time at background priority under the memory guard (run_depth.sh 6). + +$ ./check_mj cert_m4_g2_M0.txt 0 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_0 (lab 3) = 1909127140 +ALPHA 0: PASS -> rank M_0 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 1 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_1 (lab 3) = 1909127140 +ALPHA 1: PASS -> rank M_1 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 2 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_2 (lab 3) = 1909127140 +ALPHA 2: PASS -> rank M_2 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 3 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_3 (lab 3) = 1909127140 +ALPHA 3: PASS -> rank M_3 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 4 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_4 (lab 3) = 1909127140 +ALPHA 4: PASS -> rank M_4 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 5 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_5 (lab 3) = 1909127140 +ALPHA 5: PASS -> rank M_5 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 6 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_6 (lab 3) = 1909127140 +ALPHA 6: PASS -> rank M_6 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 7 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_7 (lab 3) = 1909127140 +ALPHA 7: PASS -> rank M_7 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 8 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_8 (lab 3) = 1909127140 +ALPHA 8: PASS -> rank M_8 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 9 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_9 (lab 3) = 1909127140 +ALPHA 9: PASS -> rank M_9 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 10 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_10 (lab 3) = 1909127140 +ALPHA 10: PASS -> rank M_10 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 11 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_11 (lab 3) = 1909127140 +ALPHA 11: PASS -> rank M_11 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 12 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_12 (lab 3) = 1909127140 +ALPHA 12: PASS -> rank M_12 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 13 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_13 (lab 3) = 1909127140 +ALPHA 13: PASS -> rank M_13 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 14 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_14 (lab 3) = 1909127140 +ALPHA 14: PASS -> rank M_14 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) + +$ ./check_mj cert_m4_g2_M0.txt 15 +cert: m=4 k=8 lab=3 p=2147483629 (prime: yes) I^2=-1: yes, 3036 distinct well-formed rows/cols: yes +det mod p of the 3036 x 3036 minor of M_15 (lab 3) = 1909127140 +ALPHA 15: PASS -> rank M_15 over Q(i) >= 3036 +RESULT: PASS (1 alpha value checked, 3036 x 3036 each) diff --git a/research/complex-small-m-lower-bounds/author-evidence/out_check_m4_g3.txt b/research/complex-small-m-lower-bounds/author-evidence/out_check_m4_g3.txt new file mode 100644 index 0000000000..fa9efe468f --- /dev/null +++ b/research/complex-small-m-lower-bounds/author-evidence/out_check_m4_g3.txt @@ -0,0 +1,98 @@ +check_mj on cert_m4_g3_M0.txt (lab 7), one run per character alpha = 0..15, 23 October 2026, Apple M4 Mac mini, +six runs at a time at background priority under the memory guard (run_depth.sh 6). + +$ ./check_mj cert_m4_g3_M0.txt 0 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_0 (lab 7) = 11780961 +ALPHA 0: PASS -> rank M_0 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 1 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_1 (lab 7) = 11780961 +ALPHA 1: PASS -> rank M_1 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 2 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_2 (lab 7) = 2135702668 +ALPHA 2: PASS -> rank M_2 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 3 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_3 (lab 7) = 2135702668 +ALPHA 3: PASS -> rank M_3 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 4 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_4 (lab 7) = 2135702668 +ALPHA 4: PASS -> rank M_4 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 5 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_5 (lab 7) = 2135702668 +ALPHA 5: PASS -> rank M_5 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 6 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_6 (lab 7) = 11780961 +ALPHA 6: PASS -> rank M_6 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 7 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_7 (lab 7) = 11780961 +ALPHA 7: PASS -> rank M_7 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 8 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_8 (lab 7) = 11780961 +ALPHA 8: PASS -> rank M_8 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 9 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_9 (lab 7) = 11780961 +ALPHA 9: PASS -> rank M_9 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 10 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_10 (lab 7) = 2135702668 +ALPHA 10: PASS -> rank M_10 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 11 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_11 (lab 7) = 2135702668 +ALPHA 11: PASS -> rank M_11 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 12 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_12 (lab 7) = 2135702668 +ALPHA 12: PASS -> rank M_12 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 13 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_13 (lab 7) = 2135702668 +ALPHA 13: PASS -> rank M_13 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 14 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_14 (lab 7) = 11780961 +ALPHA 14: PASS -> rank M_14 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) + +$ ./check_mj cert_m4_g3_M0.txt 15 +cert: m=4 k=8 lab=7 p=2147483629 (prime: yes) I^2=-1: yes, 4270 distinct well-formed rows/cols: yes +det mod p of the 4270 x 4270 minor of M_15 (lab 7) = 11780961 +ALPHA 15: PASS -> rank M_15 over Q(i) >= 4270 +RESULT: PASS (1 alpha value checked, 4270 x 4270 each) diff --git a/research/complex-small-m-lower-bounds/data/Dem3Data.lean b/research/complex-small-m-lower-bounds/data/Dem3Data.lean new file mode 100644 index 0000000000..13b707be01 --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/Dem3Data.lean @@ -0,0 +1,17 @@ +import Mathlib + +/-! Certificate data for the block-3 hook demand (px-lean, 14 Oct 2026). Generated by py/emit_lean.py +from py/blocks.py; untrusted: every use is checked by the kernel. -/ + +namespace OAI.PowerSaving.PfLean.Dem3Data + +/-- Selected row representatives `(0, u1, u2, u3, u4)` per character block: the `u`s. -/ +def rowsD : List (List (List ℕ)) := [[[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]]] + +/-- Selected column representatives `(0, 0, t1, t2, t3)` per character block: the `t`s. -/ +def colsD : List (List (List ℕ)) := [[[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]], [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7]]] + +/-- Inverses mod 65537 of the selected 28 x 28 blocks. -/ +def invD : List (List (List ℕ)) := [[[65280, 65280, 0, 0, 65280, 65280, 0, 257, 0, 0, 0, 257, 0, 0, 0, 65280, 257, 0, 257, 65280, 0, 0, 0, 257, 0, 257, 0, 0], [65280, 0, 257, 0, 257, 0, 0, 0, 257, 0, 0, 0, 0, 65280, 0, 65280, 0, 0, 0, 0, 257, 0, 257, 0, 0, 0, 0, 0], [0, 0, 257, 257, 0, 0, 0, 0, 257, 0, 257, 0, 0, 65280, 0, 0, 257, 0, 0, 0, 0, 257, 0, 257, 0, 257, 257, 0], [0, 0, 0, 65280, 0, 0, 257, 257, 65280, 0, 0, 0, 65280, 0, 0, 0, 65280, 0, 0, 0, 0, 65280, 0, 0, 0, 0, 0, 0], [257, 257, 0, 0, 65280, 257, 257, 0, 65280, 0, 0, 257, 65280, 0, 0, 257, 0, 0, 257, 0, 65280, 0, 65280, 0, 0, 0, 0, 0], [65280, 0, 0, 0, 0, 0, 0, 0, 257, 0, 65280, 0, 0, 65280, 65280, 257, 65280, 257, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 0, 0, 0, 257, 257, 0, 0, 0, 257, 0, 0, 0, 0, 257, 65280, 0, 65280, 65280], [65280, 0, 0, 0, 0, 65280, 257, 0, 65280, 65280, 0, 0, 0, 0, 257, 0, 65280, 514, 0, 0, 0, 257, 0, 0, 257, 0, 0, 0], [0, 0, 0, 0, 65280, 0, 65280, 257, 257, 257, 0, 257, 0, 0, 65280, 0, 0, 65280, 257, 65280, 257, 0, 0, 257, 65023, 0, 0, 65023], [0, 0, 65280, 65280, 257, 0, 0, 0, 0, 65280, 257, 65280, 65280, 0, 0, 0, 0, 257, 0, 0, 0, 257, 65280, 0, 257, 0, 0, 257], [0, 0, 0, 0, 0, 65280, 65280, 0, 0, 65280, 65280, 0, 0, 65280, 0, 257, 0, 257, 0, 0, 257, 257, 0, 0, 257, 0, 0, 0], [0, 0, 257, 257, 257, 65280, 65280, 0, 0, 0, 0, 65280, 257, 65280, 0, 65280, 0, 0, 0, 0, 257, 0, 257, 0, 0, 0, 0, 257], [0, 0, 65280, 65280, 0, 0, 65280, 257, 0, 0, 65280, 0, 65280, 65280, 0, 0, 0, 0, 0, 65280, 257, 65280, 65280, 0, 0, 0, 257, 0], [0, 0, 0, 0, 257, 0, 257, 65280, 0, 65280, 0, 65280, 0, 257, 0, 0, 0, 257, 65023, 257, 65280, 0, 0, 65023, 257, 0, 65280, 257], [0, 0, 257, 257, 0, 257, 0, 257, 0, 65280, 0, 0, 257, 0, 0, 257, 0, 257, 0, 65280, 0, 0, 257, 0, 257, 0, 257, 0], [257, 0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 65280, 0, 65280, 0, 257, 0, 0, 65280, 0, 0, 0, 65280, 0], [257, 257, 65280, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 257, 65280, 0, 65280, 0], [0, 0, 0, 65280, 0, 0, 0, 0, 0, 65280, 0, 65280, 65280, 0, 257, 0, 65280, 514, 0, 0, 0, 257, 0, 0, 257, 0, 0, 257], [0, 0, 0, 0, 257, 0, 0, 0, 0, 65280, 0, 65280, 65280, 0, 257, 0, 65280, 257, 65280, 0, 0, 0, 65280, 0, 514, 65280, 0, 514], [0, 257, 0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 65280, 0, 257, 0, 0, 65280, 257, 65280, 0, 0, 0], [0, 0, 0, 0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 257, 65280, 257, 0, 0, 257, 65280, 0, 0, 65280], [0, 257, 0, 65280, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 257, 0, 65280, 0, 65280, 0, 0, 0, 0, 65280], [0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 65280, 257, 257, 257, 0, 257, 0, 0], [0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 65280, 0, 0, 65280, 65280, 0, 0, 65280, 65280, 0, 0], [0, 0, 0, 257, 65280, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 65280, 257, 0, 0, 65280, 257, 0, 65280, 257, 0, 65280], [0, 65280, 0, 0, 0, 65280, 0, 257, 0, 0, 65280, 257, 0, 0, 0, 0, 0, 0, 257, 65023, 0, 0, 0, 257, 0, 257, 257, 0], [0, 0, 0, 0, 65280, 65280, 0, 257, 0, 0, 65280, 257, 0, 0, 0, 65280, 0, 0, 514, 65280, 0, 65280, 0, 514, 0, 0, 257, 65280], [0, 257, 0, 0, 257, 0, 0, 0, 0, 0, 0, 65023, 0, 0, 0, 257, 0, 0, 65280, 257, 0, 257, 0, 65280, 0, 65280, 0, 257]], [[255, 65282, 0, 0, 255, 255, 0, 65282, 0, 0, 0, 255, 0, 0, 0, 65282, 65282, 0, 65282, 65282, 0, 0, 0, 255, 0, 255, 0, 0], [65282, 0, 255, 0, 255, 0, 0, 0, 65282, 0, 0, 0, 0, 255, 0, 255, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 0, 0, 0], [0, 0, 65282, 255, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 65282, 0, 0, 65282, 0, 0, 0, 0, 255, 0, 255, 0, 255, 65282, 0], [0, 0, 0, 255, 0, 0, 65282, 255, 255, 0, 0, 0, 65282, 0, 0, 0, 65282, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0], [65282, 255, 0, 0, 255, 65282, 255, 0, 65282, 0, 0, 255, 255, 0, 0, 255, 0, 0, 65282, 0, 255, 0, 65282, 0, 0, 0, 0, 0], [255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 0, 65282, 255, 255, 255, 255, 0, 0, 65282, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 255, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 255, 0, 65282, 65282], [255, 0, 0, 0, 0, 255, 255, 0, 65282, 255, 0, 0, 0, 0, 65282, 0, 255, 510, 0, 0, 0, 255, 0, 0, 255, 0, 0, 0], [0, 0, 0, 0, 65282, 0, 255, 255, 65282, 255, 0, 65282, 0, 0, 65282, 0, 0, 255, 255, 255, 255, 0, 0, 65282, 510, 0, 0, 65027], [0, 0, 255, 65282, 65282, 0, 0, 0, 0, 255, 65282, 65282, 255, 0, 0, 0, 0, 255, 0, 0, 0, 255, 65282, 0, 255, 0, 0, 65282], [0, 0, 0, 0, 0, 65282, 255, 0, 0, 65282, 65282, 0, 0, 255, 0, 65282, 0, 65282, 0, 0, 255, 65282, 0, 0, 65282, 0, 0, 0], [0, 0, 65282, 255, 65282, 255, 65282, 0, 0, 0, 0, 65282, 65282, 65282, 0, 65282, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 0, 0, 65282], [0, 0, 255, 65282, 0, 0, 65282, 65282, 0, 0, 255, 0, 255, 65282, 0, 0, 0, 0, 0, 65282, 65282, 65282, 65282, 0, 0, 0, 65282, 0], [0, 0, 0, 0, 255, 0, 65282, 65282, 0, 65282, 0, 255, 0, 65282, 0, 0, 0, 65282, 65027, 65282, 65282, 0, 0, 510, 65282, 0, 65282, 255], [0, 0, 65282, 255, 0, 65282, 0, 65282, 0, 255, 0, 0, 65282, 0, 0, 255, 0, 255, 0, 65282, 0, 0, 255, 0, 255, 0, 65282, 0], [255, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 0, 65282, 0, 0, 255, 0, 0, 0, 65282, 0], [65282, 255, 255, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 255, 65282, 0, 255, 0], [0, 0, 0, 255, 0, 0, 0, 0, 0, 65282, 0, 255, 65282, 0, 255, 0, 65282, 65027, 0, 0, 0, 65282, 0, 0, 65282, 0, 0, 255], [0, 0, 0, 0, 65282, 0, 0, 0, 0, 255, 0, 65282, 255, 0, 65282, 0, 255, 255, 255, 0, 0, 0, 65282, 0, 510, 65282, 0, 65027], [0, 65282, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 65282, 0, 0, 255, 65282, 255, 0, 0, 0], [0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 65282, 65282, 65282, 0, 0, 255, 65282, 0, 0, 255], [0, 65282, 0, 255, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 0, 255, 0, 65282, 0, 255, 0, 0, 0, 0, 65282], [0, 0, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 65282, 65282, 65282, 65282, 0, 65282, 0, 0], [0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 65282, 0, 0, 255, 65282, 0, 0, 65282, 65282, 0, 0], [0, 0, 0, 65282, 65282, 0, 0, 0, 0, 0, 0, 65027, 0, 0, 0, 0, 0, 255, 255, 0, 0, 255, 65282, 0, 255, 65282, 0, 65282], [0, 255, 0, 0, 0, 65282, 0, 255, 0, 0, 65282, 65282, 0, 0, 0, 0, 0, 0, 255, 510, 0, 0, 0, 65282, 0, 65282, 255, 0], [0, 0, 0, 0, 255, 255, 0, 65282, 0, 0, 255, 255, 0, 0, 0, 65282, 0, 0, 65027, 65282, 0, 65282, 0, 510, 0, 0, 65282, 255], [0, 65282, 0, 0, 255, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 65282, 0, 0, 65282, 65282, 0, 65282, 0, 255, 0, 255, 0, 255]], [[255, 255, 0, 0, 255, 65282, 0, 65282, 0, 0, 0, 65282, 0, 0, 0, 65282, 65282, 0, 255, 255, 0, 0, 0, 255, 0, 65282, 0, 0], [65282, 0, 65282, 0, 255, 0, 0, 0, 65282, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 0, 0, 0], [0, 0, 65282, 65282, 0, 0, 0, 0, 65282, 0, 65282, 0, 0, 65282, 0, 0, 255, 0, 0, 0, 0, 65282, 0, 65282, 0, 255, 255, 0], [0, 0, 0, 65282, 0, 0, 65282, 65282, 65282, 0, 0, 0, 65282, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 0, 0, 0, 0, 0, 0], [65282, 65282, 0, 0, 255, 255, 65282, 0, 65282, 0, 0, 65282, 65282, 0, 0, 255, 0, 0, 255, 0, 255, 0, 65282, 0, 0, 0, 0, 0], [65282, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 65282, 255, 65282, 65282, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 255, 65282, 0, 0, 0, 65282, 0, 0, 0, 0, 65282, 65282, 0, 65282, 65282], [255, 0, 0, 0, 0, 65282, 65282, 0, 65282, 255, 0, 0, 0, 0, 255, 0, 255, 65027, 0, 0, 0, 255, 0, 0, 65282, 0, 0, 0], [0, 0, 0, 0, 255, 0, 255, 65282, 255, 65282, 0, 65282, 0, 0, 65282, 0, 0, 255, 255, 255, 65282, 0, 0, 255, 510, 0, 0, 510], [0, 0, 65282, 65282, 65282, 0, 0, 0, 0, 255, 255, 255, 65282, 0, 0, 0, 0, 65282, 0, 0, 0, 255, 65282, 0, 65282, 0, 0, 65282], [0, 0, 0, 0, 0, 255, 65282, 0, 0, 65282, 255, 0, 0, 65282, 0, 65282, 0, 255, 0, 0, 255, 65282, 0, 0, 255, 0, 0, 0], [0, 0, 65282, 65282, 255, 255, 65282, 0, 0, 0, 0, 65282, 65282, 65282, 0, 255, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 0, 0, 255], [0, 0, 255, 255, 0, 0, 65282, 255, 0, 0, 255, 0, 255, 65282, 0, 0, 0, 0, 0, 65282, 255, 255, 255, 0, 0, 0, 255, 0], [0, 0, 0, 0, 255, 0, 255, 65282, 0, 65282, 0, 65282, 0, 255, 0, 0, 0, 255, 510, 255, 65282, 0, 0, 510, 255, 0, 65282, 255], [0, 0, 255, 255, 0, 255, 0, 65282, 0, 255, 0, 0, 255, 0, 0, 255, 0, 65282, 0, 255, 0, 0, 255, 0, 65282, 0, 65282, 0], [65282, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 65282, 0, 255, 0, 65282, 0, 0, 65282, 0, 0, 0, 255, 0], [65282, 65282, 65282, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 0], [0, 0, 0, 255, 0, 0, 0, 0, 0, 65282, 0, 65282, 255, 0, 65282, 0, 65282, 510, 0, 0, 0, 65282, 0, 0, 255, 0, 0, 255], [0, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 0, 65282, 255, 0, 65282, 0, 65282, 255, 255, 0, 0, 0, 255, 0, 510, 65282, 0, 510], [0, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 65282, 0, 255, 0, 0, 255, 65282, 65282, 0, 0, 0], [0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65282, 0, 0, 255, 255, 0, 0, 255], [0, 65282, 0, 65282, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 255, 0, 255, 0, 65282, 0, 0, 0, 0, 255], [0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 0, 65282, 0, 0], [0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 255, 65282, 0, 0, 255, 255, 0, 0], [0, 0, 0, 65282, 65282, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, 65282, 65282, 0, 0, 255, 65282, 0, 65282, 255, 0, 65282], [0, 65282, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 65282, 65027, 0, 0, 0, 65282, 0, 255, 255, 0], [0, 0, 0, 0, 65282, 255, 0, 255, 0, 0, 255, 255, 0, 0, 0, 255, 0, 0, 65027, 65282, 0, 255, 0, 65027, 0, 0, 255, 65282], [0, 65282, 0, 0, 65282, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 255, 0, 0, 65282, 65282, 0, 255, 0, 65282, 0, 255, 0, 65282]], [[257, 65280, 0, 0, 257, 65280, 0, 65280, 0, 0, 0, 257, 0, 0, 0, 257, 65280, 0, 257, 65280, 0, 0, 0, 65280, 0, 257, 0, 0], [257, 0, 257, 0, 65280, 0, 0, 0, 65280, 0, 0, 0, 0, 65280, 0, 257, 0, 0, 0, 0, 65280, 0, 65280, 0, 0, 0, 0, 0], [0, 0, 65280, 257, 0, 0, 0, 0, 257, 0, 65280, 0, 0, 257, 0, 0, 257, 0, 0, 0, 0, 257, 0, 257, 0, 65280, 257, 0], [0, 0, 0, 65280, 0, 0, 65280, 257, 65280, 0, 0, 0, 257, 0, 0, 0, 65280, 0, 0, 0, 0, 65280, 0, 0, 0, 0, 0, 0], [65280, 257, 0, 0, 257, 257, 257, 0, 257, 0, 0, 257, 65280, 0, 0, 65280, 0, 0, 257, 0, 257, 0, 257, 0, 0, 0, 0, 0], [65280, 0, 0, 0, 0, 0, 0, 0, 257, 0, 257, 0, 0, 257, 257, 257, 65280, 65280, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 257, 257, 0, 0, 0, 257, 0, 0, 0, 0, 65280, 65280, 0, 257, 257], [257, 0, 0, 0, 0, 65280, 257, 0, 257, 257, 0, 0, 0, 0, 257, 0, 257, 514, 0, 0, 0, 65280, 0, 0, 257, 0, 0, 0], [0, 0, 0, 0, 65280, 0, 257, 257, 257, 257, 0, 65280, 0, 0, 257, 0, 0, 257, 65280, 257, 257, 0, 0, 257, 514, 0, 0, 65023], [0, 0, 65280, 257, 65280, 0, 0, 0, 0, 257, 257, 65280, 65280, 0, 0, 0, 0, 257, 0, 0, 0, 65280, 257, 0, 257, 0, 0, 65280], [0, 0, 0, 0, 0, 65280, 65280, 0, 0, 257, 65280, 0, 0, 65280, 0, 65280, 0, 257, 0, 0, 65280, 65280, 0, 0, 257, 0, 0, 0], [0, 0, 65280, 257, 257, 257, 257, 0, 0, 0, 0, 257, 65280, 257, 0, 65280, 0, 0, 0, 0, 257, 0, 257, 0, 0, 0, 0, 257], [0, 0, 257, 65280, 0, 0, 257, 257, 0, 0, 257, 0, 257, 257, 0, 0, 0, 0, 0, 257, 257, 65280, 65280, 0, 0, 0, 257, 0], [0, 0, 0, 0, 65280, 0, 257, 257, 0, 257, 0, 65280, 0, 257, 0, 0, 0, 257, 65023, 257, 257, 0, 0, 514, 257, 0, 257, 65280], [0, 0, 257, 65280, 0, 257, 0, 65280, 0, 257, 0, 0, 257, 0, 0, 65280, 0, 257, 0, 65280, 0, 0, 65280, 0, 257, 0, 65280, 0], [257, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 65280, 0, 257, 0, 65280, 0, 0, 65280, 0, 0, 0, 65280, 0], [65280, 257, 65280, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 65280, 0, 257, 0], [0, 0, 0, 257, 0, 0, 0, 0, 0, 257, 0, 65280, 65280, 0, 257, 0, 257, 514, 0, 0, 0, 65280, 0, 0, 257, 0, 0, 65280], [0, 0, 0, 0, 257, 0, 0, 0, 0, 65280, 0, 257, 257, 0, 65280, 0, 65280, 65280, 257, 0, 0, 0, 65280, 0, 65023, 257, 0, 514], [0, 257, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 65280, 0, 257, 0, 0, 257, 65280, 65280, 0, 0, 0], [0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 257, 65280, 65280, 0, 0, 65280, 65280, 0, 0, 257], [0, 65280, 0, 65280, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 65280, 0, 65280, 0, 65280, 0, 0, 0, 0, 65280], [0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 65280, 257, 257, 257, 0, 65280, 0, 0], [0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 65280, 0, 0, 257, 257, 0, 0, 65280, 65280, 0, 0], [0, 0, 0, 65280, 257, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 65280, 257, 0, 0, 257, 65280, 0, 65280, 257, 0, 257], [0, 65280, 0, 0, 0, 65280, 0, 65280, 0, 0, 65280, 257, 0, 0, 0, 0, 0, 0, 257, 65023, 0, 0, 0, 65280, 0, 257, 65280, 0], [0, 0, 0, 0, 65280, 257, 0, 257, 0, 0, 257, 65280, 0, 0, 0, 65280, 0, 0, 65023, 257, 0, 65280, 0, 514, 0, 0, 257, 65280], [0, 65280, 0, 0, 257, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 257, 0, 0, 257, 65280, 0, 257, 0, 65280, 0, 257, 0, 257]], [[65282, 65282, 0, 0, 255, 65282, 0, 65282, 0, 0, 0, 65282, 0, 0, 0, 65282, 255, 0, 65282, 255, 0, 0, 0, 65282, 0, 255, 0, 0], [255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 255, 0, 255, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 0, 0, 0], [0, 0, 255, 255, 0, 0, 0, 0, 255, 0, 255, 0, 0, 255, 0, 0, 65282, 0, 0, 0, 0, 255, 0, 255, 0, 65282, 65282, 0], [0, 0, 0, 65282, 0, 0, 255, 255, 65282, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 0, 0, 0, 0, 0, 0], [65282, 65282, 0, 0, 65282, 65282, 255, 0, 65282, 0, 0, 255, 255, 0, 0, 65282, 0, 0, 255, 0, 65282, 0, 255, 0, 0, 0, 0, 0], [255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 255, 65282, 65282, 255, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 0, 0, 0, 65282, 255, 0, 0, 0, 255, 0, 0, 0, 0, 255, 255, 0, 255, 255], [255, 0, 0, 0, 0, 255, 255, 0, 65282, 65282, 0, 0, 0, 0, 255, 0, 255, 510, 0, 0, 0, 255, 0, 0, 65282, 0, 0, 0], [0, 0, 0, 0, 65282, 0, 65282, 255, 255, 255, 0, 255, 0, 0, 65282, 0, 0, 65282, 255, 65282, 255, 0, 0, 255, 510, 0, 0, 510], [0, 0, 255, 255, 65282, 0, 0, 0, 0, 255, 65282, 255, 65282, 0, 0, 0, 0, 65282, 0, 0, 0, 65282, 65282, 0, 255, 0, 0, 255], [0, 0, 0, 0, 0, 65282, 255, 0, 0, 255, 255, 0, 0, 65282, 0, 255, 0, 65282, 0, 0, 65282, 65282, 0, 0, 255, 0, 0, 0], [0, 0, 65282, 65282, 65282, 65282, 255, 0, 0, 0, 0, 255, 255, 65282, 0, 65282, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 0, 0, 255], [0, 0, 255, 255, 0, 0, 255, 65282, 0, 0, 255, 0, 65282, 65282, 0, 0, 0, 0, 0, 255, 65282, 255, 65282, 0, 0, 0, 255, 0], [0, 0, 0, 0, 65282, 0, 65282, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 65282, 510, 65282, 255, 0, 0, 510, 255, 0, 65282, 255], [0, 0, 65282, 65282, 0, 255, 0, 65282, 0, 255, 0, 0, 255, 0, 0, 255, 0, 65282, 0, 255, 0, 0, 255, 0, 255, 0, 255, 0], [65282, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 65282, 0, 255, 0, 0, 255, 0, 0, 0, 255, 0], [65282, 65282, 65282, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 255, 0], [0, 0, 0, 65282, 0, 0, 0, 0, 0, 65282, 0, 65282, 255, 0, 255, 0, 255, 510, 0, 0, 0, 255, 0, 0, 65282, 0, 0, 65282], [0, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 0, 65282, 255, 0, 255, 0, 255, 255, 65282, 0, 0, 0, 255, 0, 65027, 255, 0, 65027], [0, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 255, 0, 65282, 0, 0, 65282, 65282, 65282, 0, 0, 0], [0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 65282, 255, 65282, 0, 0, 65282, 65282, 0, 0, 65282], [0, 255, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 65282, 0, 255, 0, 65282, 0, 0, 0, 0, 65282], [0, 0, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 65282, 255, 65282, 0, 255, 0, 0], [0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 255, 255, 0, 0, 65282, 65282, 0, 0], [0, 0, 0, 65282, 255, 0, 0, 0, 0, 0, 0, 65027, 0, 0, 0, 0, 0, 255, 65282, 0, 0, 255, 255, 0, 65282, 255, 0, 65282], [0, 255, 0, 0, 0, 255, 0, 255, 0, 0, 65282, 255, 0, 0, 0, 0, 0, 0, 255, 65027, 0, 0, 0, 255, 0, 65282, 65282, 0], [0, 0, 0, 0, 65282, 255, 0, 255, 0, 0, 65282, 255, 0, 0, 0, 255, 0, 0, 510, 65282, 0, 65282, 0, 510, 0, 0, 65282, 255], [0, 65282, 0, 0, 255, 0, 0, 0, 0, 0, 0, 65027, 0, 0, 0, 65282, 0, 0, 65282, 255, 0, 255, 0, 65282, 0, 255, 0, 65282]], [[65280, 257, 0, 0, 257, 65280, 0, 65280, 0, 0, 0, 257, 0, 0, 0, 257, 257, 0, 65280, 65280, 0, 0, 0, 257, 0, 65280, 0, 0], [65280, 0, 65280, 0, 65280, 0, 0, 0, 257, 0, 0, 0, 0, 257, 0, 257, 0, 0, 0, 0, 65280, 0, 65280, 0, 0, 0, 0, 0], [0, 0, 257, 65280, 0, 0, 0, 0, 65280, 0, 257, 0, 0, 65280, 0, 0, 65280, 0, 0, 0, 0, 65280, 0, 65280, 0, 257, 65280, 0], [0, 0, 0, 65280, 0, 0, 257, 65280, 65280, 0, 0, 0, 65280, 0, 0, 0, 65280, 0, 0, 0, 0, 65280, 0, 0, 0, 0, 0, 0], [65280, 257, 0, 0, 65280, 65280, 65280, 0, 257, 0, 0, 65280, 257, 0, 0, 257, 0, 0, 257, 0, 65280, 0, 65280, 0, 0, 0, 0, 0], [257, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 65280, 0, 0, 65280, 65280, 257, 257, 65280, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 0, 0, 0, 65280, 65280, 0, 0, 0, 65280, 0, 0, 0, 0, 257, 257, 0, 65280, 65280], [257, 0, 0, 0, 0, 257, 65280, 0, 257, 65280, 0, 0, 0, 0, 257, 0, 257, 65023, 0, 0, 0, 65280, 0, 0, 257, 0, 0, 0], [0, 0, 0, 0, 257, 0, 65280, 65280, 257, 65280, 0, 257, 0, 0, 257, 0, 0, 65280, 65280, 65280, 65280, 0, 0, 257, 514, 0, 0, 65023], [0, 0, 257, 65280, 65280, 0, 0, 0, 0, 257, 65280, 65280, 65280, 0, 0, 0, 0, 257, 0, 0, 0, 257, 257, 0, 65280, 0, 0, 257], [0, 0, 0, 0, 0, 257, 257, 0, 0, 65280, 65280, 0, 0, 65280, 0, 257, 0, 65280, 0, 0, 257, 65280, 0, 0, 257, 0, 0, 0], [0, 0, 65280, 257, 65280, 65280, 65280, 0, 0, 0, 0, 65280, 257, 257, 0, 257, 0, 0, 0, 0, 65280, 0, 65280, 0, 0, 0, 0, 257], [0, 0, 257, 65280, 0, 0, 65280, 65280, 0, 0, 257, 0, 65280, 257, 0, 0, 0, 0, 0, 65280, 65280, 65280, 257, 0, 0, 0, 257, 0], [0, 0, 0, 0, 257, 0, 65280, 65280, 0, 65280, 0, 257, 0, 257, 0, 0, 0, 65280, 65023, 65280, 65280, 0, 0, 514, 257, 0, 257, 65280], [0, 0, 65280, 257, 0, 257, 0, 65280, 0, 257, 0, 0, 257, 0, 0, 65280, 0, 257, 0, 65280, 0, 0, 65280, 0, 65280, 0, 257, 0], [257, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 257, 0, 65280, 0, 257, 0, 0, 257, 0, 0, 0, 65280, 0], [65280, 257, 65280, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 65280, 0, 257, 0], [0, 0, 0, 65280, 0, 0, 0, 0, 0, 257, 0, 65280, 65280, 0, 65280, 0, 65280, 514, 0, 0, 0, 257, 0, 0, 65280, 0, 0, 257], [0, 0, 0, 0, 257, 0, 0, 0, 0, 65280, 0, 257, 257, 0, 257, 0, 257, 65280, 65280, 0, 0, 0, 65280, 0, 514, 65280, 0, 65023], [0, 257, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 257, 0, 65280, 0, 0, 65280, 65280, 65280, 0, 0, 0], [0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 65280, 65280, 65280, 0, 0, 257, 257, 0, 0, 65280], [0, 257, 0, 257, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 0, 257, 0, 65280, 0, 65280, 0, 0, 0, 0, 257], [0, 0, 0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 65280, 65280, 257, 65280, 0, 257, 0, 0], [0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 65280, 0, 0, 257, 65280, 0, 0, 257, 257, 0, 0], [0, 0, 0, 65280, 65280, 0, 0, 0, 0, 0, 0, 65023, 0, 0, 0, 0, 0, 257, 257, 0, 0, 257, 257, 0, 65280, 257, 0, 257], [0, 257, 0, 0, 0, 65280, 0, 65280, 0, 0, 257, 257, 0, 0, 0, 0, 0, 0, 65280, 65023, 0, 0, 0, 257, 0, 65280, 257, 0], [0, 0, 0, 0, 65280, 257, 0, 257, 0, 0, 65280, 65280, 0, 0, 0, 65280, 0, 0, 514, 257, 0, 257, 0, 65023, 0, 0, 65280, 257], [0, 65280, 0, 0, 65280, 0, 0, 0, 0, 0, 0, 65023, 0, 0, 0, 65280, 0, 0, 257, 257, 0, 257, 0, 65280, 0, 257, 0, 257]], [[65280, 65280, 0, 0, 257, 257, 0, 65280, 0, 0, 0, 65280, 0, 0, 0, 257, 257, 0, 257, 257, 0, 0, 0, 257, 0, 257, 0, 0], [65280, 0, 257, 0, 65280, 0, 0, 0, 257, 0, 0, 0, 0, 65280, 0, 257, 0, 0, 0, 0, 65280, 0, 65280, 0, 0, 0, 0, 0], [0, 0, 257, 257, 0, 0, 0, 0, 257, 0, 257, 0, 0, 65280, 0, 0, 257, 0, 0, 0, 0, 257, 0, 257, 0, 257, 257, 0], [0, 0, 0, 257, 0, 0, 257, 257, 257, 0, 0, 0, 65280, 0, 0, 0, 257, 0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0], [65280, 65280, 0, 0, 65280, 257, 257, 0, 257, 0, 0, 257, 65280, 0, 0, 257, 0, 0, 65280, 0, 65280, 0, 65280, 0, 0, 0, 0, 0], [65280, 0, 0, 0, 0, 0, 0, 0, 257, 0, 65280, 0, 0, 65280, 65280, 65280, 65280, 65280, 0, 0, 65280, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 0, 0, 0, 257, 257, 0, 0, 0, 257, 0, 0, 0, 0, 257, 65280, 0, 65280, 65280], [257, 0, 0, 0, 0, 65280, 257, 0, 257, 65280, 0, 0, 0, 0, 65280, 0, 257, 514, 0, 0, 0, 65280, 0, 0, 65280, 0, 0, 0], [0, 0, 0, 0, 65280, 0, 65280, 257, 65280, 257, 0, 257, 0, 0, 257, 0, 0, 65280, 65280, 65280, 257, 0, 0, 65280, 514, 0, 0, 514], [0, 0, 65280, 65280, 65280, 0, 0, 0, 0, 257, 257, 257, 257, 0, 0, 0, 0, 65280, 0, 0, 0, 257, 257, 0, 257, 0, 0, 257], [0, 0, 0, 0, 0, 65280, 65280, 0, 0, 65280, 257, 0, 0, 257, 0, 257, 0, 257, 0, 0, 257, 65280, 0, 0, 65280, 0, 0, 0], [0, 0, 65280, 65280, 257, 65280, 65280, 0, 0, 0, 0, 65280, 257, 257, 0, 65280, 0, 0, 0, 0, 257, 0, 257, 0, 0, 0, 0, 65280], [0, 0, 257, 257, 0, 0, 65280, 257, 0, 0, 257, 0, 65280, 257, 0, 0, 0, 0, 0, 65280, 257, 257, 65280, 0, 0, 0, 65280, 0], [0, 0, 0, 0, 257, 0, 257, 65280, 0, 65280, 0, 65280, 0, 65280, 0, 0, 0, 257, 514, 257, 65280, 0, 0, 514, 65280, 0, 257, 65280], [0, 0, 257, 257, 0, 65280, 0, 65280, 0, 257, 0, 0, 65280, 0, 0, 65280, 0, 65280, 0, 257, 0, 0, 65280, 0, 257, 0, 257, 0], [65280, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 65280, 0, 65280, 0, 257, 0, 0, 65280, 0, 0, 0, 257, 0], [65280, 65280, 257, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 257, 0, 257, 0], [0, 0, 0, 65280, 0, 0, 0, 0, 0, 257, 0, 257, 257, 0, 257, 0, 65280, 65023, 0, 0, 0, 257, 0, 0, 257, 0, 0, 257], [0, 0, 0, 0, 65280, 0, 0, 0, 0, 257, 0, 257, 257, 0, 257, 0, 65280, 65280, 65280, 0, 0, 0, 257, 0, 514, 65280, 0, 514], [0, 65280, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 65280, 0, 257, 0, 0, 65280, 65280, 257, 0, 0, 0], [0, 0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 257, 257, 65280, 0, 0, 257, 65280, 0, 0, 65280], [0, 257, 0, 65280, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65280, 0, 0, 257, 0, 257, 0, 257, 0, 0, 0, 0, 65280], [0, 0, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 257, 257, 65280, 257, 0, 257, 0, 0], [0, 65280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, 257, 0, 0, 257, 65280, 0, 0, 65280, 65280, 0, 0], [0, 0, 0, 65280, 65280, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 65280, 65280, 0, 0, 257, 257, 0, 257, 65280, 0, 257], [0, 65280, 0, 0, 0, 257, 0, 65280, 0, 0, 65280, 65280, 0, 0, 0, 0, 0, 0, 257, 514, 0, 0, 0, 257, 0, 257, 257, 0], [0, 0, 0, 0, 257, 257, 0, 65280, 0, 0, 65280, 65280, 0, 0, 0, 257, 0, 0, 514, 257, 0, 65280, 0, 514, 0, 0, 257, 65280], [0, 65280, 0, 0, 257, 0, 0, 0, 0, 0, 0, 65023, 0, 0, 0, 257, 0, 0, 257, 257, 0, 65280, 0, 257, 0, 257, 0, 65280]], [[255, 65282, 0, 0, 65282, 65282, 0, 255, 0, 0, 0, 65282, 0, 0, 0, 255, 65282, 0, 65282, 255, 0, 0, 0, 255, 0, 255, 0, 0], [65282, 0, 255, 0, 65282, 0, 0, 0, 65282, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 0, 0, 0], [0, 0, 65282, 255, 0, 0, 0, 0, 255, 0, 65282, 0, 0, 65282, 0, 0, 65282, 0, 0, 0, 0, 255, 0, 255, 0, 255, 65282, 0], [0, 0, 0, 65282, 0, 0, 65282, 255, 65282, 0, 0, 0, 65282, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 0, 0, 0, 0, 0, 0], [255, 65282, 0, 0, 255, 65282, 255, 0, 255, 0, 0, 255, 255, 0, 0, 255, 0, 0, 255, 0, 255, 0, 65282, 0, 0, 0, 0, 0], [255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 0, 65282, 255, 65282, 255, 65282, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 255, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 255, 0, 65282, 65282], [65282, 0, 0, 0, 0, 255, 255, 0, 255, 255, 0, 0, 0, 0, 255, 0, 65282, 510, 0, 0, 0, 65282, 0, 0, 65282, 0, 0, 0], [0, 0, 0, 0, 65282, 0, 255, 255, 255, 255, 0, 65282, 0, 0, 255, 0, 0, 255, 65282, 255, 255, 0, 0, 255, 65027, 0, 0, 510], [0, 0, 255, 65282, 255, 0, 0, 0, 0, 65282, 65282, 255, 65282, 0, 0, 0, 0, 65282, 0, 0, 0, 255, 255, 0, 255, 0, 0, 65282], [0, 0, 0, 0, 0, 65282, 255, 0, 0, 65282, 255, 0, 0, 65282, 0, 65282, 0, 65282, 0, 0, 255, 255, 0, 0, 255, 0, 0, 0], [0, 0, 255, 65282, 65282, 255, 65282, 0, 0, 0, 0, 65282, 65282, 255, 0, 65282, 0, 0, 0, 0, 65282, 0, 255, 0, 0, 0, 0, 255], [0, 0, 65282, 255, 0, 0, 65282, 65282, 0, 0, 65282, 0, 255, 255, 0, 0, 0, 0, 0, 65282, 65282, 255, 65282, 0, 0, 0, 255, 0], [0, 0, 0, 0, 255, 0, 65282, 65282, 0, 65282, 0, 255, 0, 255, 0, 0, 0, 65282, 510, 65282, 65282, 0, 0, 65027, 255, 0, 255, 65282], [0, 0, 65282, 255, 0, 255, 0, 255, 0, 65282, 0, 0, 255, 0, 0, 65282, 0, 65282, 0, 255, 0, 0, 65282, 0, 255, 0, 65282, 0], [65282, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 255, 0, 255, 0, 65282, 0, 0, 255, 0, 0, 0, 255, 0], [255, 65282, 65282, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 255, 0, 65282, 0], [0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 65282, 255, 0, 255, 0, 65282, 510, 0, 0, 0, 65282, 0, 0, 65282, 0, 0, 255], [0, 0, 0, 0, 255, 0, 0, 0, 0, 65282, 0, 255, 65282, 0, 65282, 0, 255, 65282, 255, 0, 0, 0, 255, 0, 510, 65282, 0, 65027], [0, 255, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 65282, 0, 0, 255, 255, 65282, 0, 0, 0], [0, 0, 0, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 65282, 255, 255, 0, 0, 255, 65282, 0, 0, 255], [0, 65282, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 255, 0, 255, 0, 65282, 0, 0, 0, 0, 65282], [0, 0, 0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65282, 255, 65282, 255, 65282, 0, 65282, 0, 0], [0, 65282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 0, 65282, 65282, 0, 0, 65282, 65282, 0, 0], [0, 0, 0, 255, 65282, 0, 0, 0, 0, 0, 0, 65027, 0, 0, 0, 0, 0, 255, 65282, 0, 0, 65282, 65282, 0, 65282, 255, 0, 255], [0, 255, 0, 0, 0, 255, 0, 65282, 0, 0, 65282, 255, 0, 0, 0, 0, 0, 0, 255, 65027, 0, 0, 0, 65282, 0, 65282, 255, 0], [0, 0, 0, 0, 65282, 65282, 0, 255, 0, 0, 255, 65282, 0, 0, 0, 255, 0, 0, 65027, 255, 0, 65282, 0, 510, 0, 0, 65282, 255], [0, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, 65282, 0, 0, 255, 65282, 0, 255, 0, 65282, 0, 65282, 0, 65282]]] + +end OAI.PowerSaving.PfLean.Dem3Data diff --git a/research/complex-small-m-lower-bounds/data/cert_m2_M0.txt b/research/complex-small-m-lower-bounds/data/cert_m2_M0.txt new file mode 100644 index 0000000000..40be8de96c --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m2_M0.txt @@ -0,0 +1,3 @@ +m 2 k 2 alpha 0 p 2147483629 I 1518275076 size 2 +6 3 +10 5 diff --git a/research/complex-small-m-lower-bounds/data/cert_m3_B2.json b/research/complex-small-m-lower-bounds/data/cert_m3_B2.json new file mode 100644 index 0000000000..de6959c8ad --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m3_B2.json @@ -0,0 +1 @@ +{"m": 3, "k": 4, "map": "B2' = (2 dir e1)(2 dir e2)", "basis_S": [[0, [0, 1, 2, 3]], [0, [0, 1, 2, 4]], [0, [0, 1, 2, 5]], [0, [0, 1, 2, 6]], [0, [0, 1, 2, 7]], [0, [0, 1, 3, 4]], [0, [0, 1, 3, 5]], [0, [0, 1, 3, 6]], [0, [0, 1, 3, 7]], [0, [0, 1, 4, 5]], [0, [0, 1, 4, 6]], [0, [0, 1, 4, 7]], [0, [0, 1, 5, 6]], [0, [0, 1, 5, 7]], [0, [0, 1, 6, 7]], [0, [0, 2, 3, 4]], [0, [0, 2, 3, 5]], [0, [0, 2, 3, 6]], [0, [0, 2, 3, 7]], [0, [0, 2, 4, 5]], [0, [0, 2, 4, 6]], [0, [0, 2, 4, 7]], [0, [0, 2, 5, 6]], [0, [0, 2, 5, 7]], [0, [0, 2, 6, 7]], [0, [0, 3, 4, 5]], [0, [0, 3, 4, 6]], [0, [0, 3, 4, 7]], [0, [0, 3, 5, 6]], [0, [0, 3, 5, 7]], [0, [0, 3, 6, 7]], [0, [0, 4, 5, 6]], [0, [0, 4, 5, 7]], [0, [0, 4, 6, 7]], [0, [0, 5, 6, 7]], [1, [0, 1, 2, 3]], [1, [0, 1, 2, 4]], [1, [0, 1, 2, 5]], [1, [0, 1, 2, 6]], [1, [0, 1, 2, 7]], [1, [0, 1, 3, 4]], [1, [0, 1, 3, 5]], [1, [0, 1, 3, 6]], [1, [0, 1, 3, 7]], [1, [0, 1, 4, 5]], [1, [0, 1, 4, 6]], [1, [0, 1, 4, 7]], [1, [0, 1, 5, 6]], [1, [0, 1, 5, 7]], [1, [0, 1, 6, 7]], [1, [1, 2, 3, 4]], [1, [1, 2, 3, 5]], [1, [1, 2, 3, 6]], [1, [1, 2, 3, 7]], [1, [1, 2, 4, 5]], [1, [1, 2, 4, 6]], [1, [1, 2, 4, 7]], [1, [1, 2, 5, 6]], [1, [1, 2, 5, 7]], [1, [1, 2, 6, 7]], [1, [1, 3, 4, 5]], [1, [1, 3, 4, 6]], [1, [1, 3, 4, 7]], [1, [1, 3, 5, 6]], [1, [1, 3, 5, 7]], [1, [1, 3, 6, 7]], [1, [1, 4, 5, 6]], [1, [1, 4, 5, 7]], [1, [1, 4, 6, 7]], [1, [1, 5, 6, 7]], [2, [0, 1, 2, 3]], [2, [0, 1, 2, 4]], [2, [0, 1, 2, 5]], [2, [0, 1, 2, 6]], [2, [0, 1, 2, 7]], [2, [0, 2, 3, 4]], [2, [0, 2, 3, 5]], [2, [0, 2, 3, 6]], [2, [0, 2, 3, 7]], [2, [0, 2, 4, 5]], [2, [0, 2, 4, 6]], [2, [0, 2, 4, 7]], [2, [0, 2, 5, 6]], [2, [0, 2, 5, 7]], [2, [0, 2, 6, 7]], [2, [1, 2, 3, 4]], [2, [1, 2, 3, 5]], [2, [1, 2, 3, 6]], [2, [1, 2, 3, 7]], [2, [1, 2, 4, 5]], [2, [1, 2, 4, 6]], [2, [1, 2, 4, 7]], [2, [1, 2, 5, 6]], [2, [1, 2, 5, 7]], [2, [1, 2, 6, 7]], [2, [2, 3, 4, 5]], [2, [2, 3, 4, 6]], [2, [2, 3, 4, 7]], [2, [2, 3, 5, 6]], [2, [2, 3, 5, 7]], [2, [2, 3, 6, 7]], [2, [2, 4, 5, 6]], [2, [2, 4, 5, 7]], [2, [2, 4, 6, 7]], [2, [2, 5, 6, 7]], [3, [0, 1, 2, 3]], [3, [0, 1, 3, 4]], [3, [0, 1, 3, 5]], [3, [0, 1, 3, 6]], [3, [0, 1, 3, 7]], [3, [0, 2, 3, 4]], [3, [0, 2, 3, 5]], [3, [0, 2, 3, 6]], [3, [0, 2, 3, 7]], [3, [0, 3, 4, 5]], [3, [0, 3, 4, 6]], [3, [0, 3, 4, 7]], [3, [0, 3, 5, 6]], [3, [0, 3, 5, 7]], [3, [0, 3, 6, 7]], [3, [1, 2, 3, 4]], [3, [1, 2, 3, 5]], [3, [1, 2, 3, 6]], [3, [1, 2, 3, 7]], [3, [1, 3, 4, 5]], [3, [1, 3, 4, 6]], [3, [1, 3, 4, 7]], [3, [1, 3, 5, 6]], [3, [1, 3, 5, 7]], [3, [1, 3, 6, 7]], [3, [2, 3, 4, 5]], [3, [2, 3, 4, 6]], [3, [2, 3, 4, 7]], [3, [2, 3, 5, 6]], [3, [2, 3, 5, 7]], [3, [2, 3, 6, 7]], [3, [3, 4, 5, 6]], [3, [3, 4, 5, 7]], [3, [3, 4, 6, 7]], [3, [3, 5, 6, 7]], [4, [0, 1, 2, 4]], [4, [0, 1, 3, 4]], [4, [0, 1, 4, 5]], [4, [0, 1, 4, 6]], [4, [0, 1, 4, 7]], [4, [0, 2, 3, 4]], [4, [0, 2, 4, 5]], [4, [0, 2, 4, 6]], [4, [0, 2, 4, 7]], [4, [0, 3, 4, 5]], [4, [0, 3, 4, 6]], [4, [0, 3, 4, 7]], [4, [0, 4, 5, 6]], [4, [0, 4, 5, 7]], [4, [0, 4, 6, 7]], [4, [1, 2, 3, 4]], [4, [1, 2, 4, 5]], [4, [1, 2, 4, 6]], [4, [1, 2, 4, 7]], [4, [1, 3, 4, 5]], [4, [1, 3, 4, 6]], [4, [1, 3, 4, 7]], [4, [1, 4, 5, 6]], [4, [1, 4, 5, 7]], [4, [1, 4, 6, 7]], [4, [2, 3, 4, 5]], [4, [2, 3, 4, 6]], [4, [2, 3, 4, 7]], [4, [2, 4, 5, 6]], [4, [2, 4, 5, 7]], [4, [2, 4, 6, 7]], [4, [3, 4, 5, 6]], [4, [3, 4, 5, 7]], [4, [3, 4, 6, 7]], [4, [4, 5, 6, 7]], [5, [0, 1, 2, 5]], [5, [0, 1, 3, 5]], [5, [0, 1, 4, 5]], [5, [0, 1, 5, 6]], [5, [0, 1, 5, 7]], [5, [0, 2, 3, 5]], [5, [0, 2, 4, 5]], [5, [0, 2, 5, 6]], [5, [0, 2, 5, 7]], [5, [0, 3, 4, 5]], [5, [0, 3, 5, 6]], [5, [0, 3, 5, 7]], [5, [0, 4, 5, 6]], [5, [0, 4, 5, 7]], [5, [0, 5, 6, 7]], [5, [1, 2, 3, 5]], [5, [1, 2, 4, 5]], [5, [1, 2, 5, 6]], [5, [1, 2, 5, 7]], [5, [1, 3, 4, 5]], [5, [1, 3, 5, 6]], [5, [1, 3, 5, 7]], [5, [1, 4, 5, 6]], [5, [1, 4, 5, 7]], [5, [1, 5, 6, 7]], [5, [2, 3, 4, 5]], [5, [2, 3, 5, 6]], [5, [2, 3, 5, 7]], [5, [2, 4, 5, 6]], [5, [2, 4, 5, 7]], [5, [2, 5, 6, 7]], [5, [3, 4, 5, 6]], [5, [3, 4, 5, 7]], [5, [3, 5, 6, 7]], [5, [4, 5, 6, 7]], [6, [0, 1, 2, 6]], [6, [0, 1, 3, 6]], [6, [0, 1, 4, 6]], [6, [0, 1, 5, 6]], [6, [0, 1, 6, 7]], [6, [0, 2, 3, 6]], [6, [0, 2, 4, 6]], [6, [0, 2, 5, 6]], [6, [0, 2, 6, 7]], [6, [0, 3, 4, 6]], [6, [0, 3, 5, 6]], [6, [0, 3, 6, 7]], [6, [0, 4, 5, 6]], [6, [0, 4, 6, 7]], [6, [0, 5, 6, 7]], [6, [1, 2, 3, 6]], [6, [1, 2, 4, 6]], [6, [1, 2, 5, 6]], [6, [1, 2, 6, 7]], [6, [1, 3, 4, 6]], [6, [1, 3, 5, 6]], [6, [1, 3, 6, 7]], [6, [1, 4, 5, 6]], [6, [1, 4, 6, 7]], [6, [1, 5, 6, 7]], [6, [2, 3, 4, 6]], [6, [2, 3, 5, 6]], [6, [2, 3, 6, 7]], [6, [2, 4, 5, 6]], [6, [2, 4, 6, 7]], [6, [2, 5, 6, 7]], [6, [3, 4, 5, 6]], [6, [3, 4, 6, 7]], [6, [3, 5, 6, 7]], [6, [4, 5, 6, 7]], [7, [0, 1, 2, 7]], [7, [0, 1, 3, 7]], [7, [0, 1, 4, 7]], [7, [0, 1, 5, 7]], [7, [0, 1, 6, 7]], [7, [0, 2, 3, 7]], [7, [0, 2, 4, 7]], [7, [0, 2, 5, 7]], [7, [0, 2, 6, 7]], [7, [0, 3, 4, 7]], [7, [0, 3, 5, 7]], [7, [0, 3, 6, 7]], [7, [0, 4, 5, 7]], [7, [0, 4, 6, 7]], [7, [0, 5, 6, 7]], [7, [1, 2, 3, 7]], [7, [1, 2, 4, 7]], [7, [1, 2, 5, 7]], [7, [1, 2, 6, 7]], [7, [1, 3, 4, 7]], [7, [1, 3, 5, 7]], [7, [1, 3, 6, 7]], [7, [1, 4, 5, 7]], [7, [1, 4, 6, 7]], [7, [1, 5, 6, 7]], [7, [2, 3, 4, 7]], [7, [2, 3, 5, 7]], [7, [2, 3, 6, 7]], [7, [2, 4, 5, 7]], [7, [2, 4, 6, 7]], [7, [2, 5, 6, 7]], [7, [3, 4, 5, 7]], [7, [3, 4, 6, 7]], [7, [3, 5, 6, 7]], [7, [4, 5, 6, 7]]], "vectors": [{"0": [1, 0], "35": [1, 0], "70": [1, 0], "105": [1, 0], "174": [1, 0], "209": [1, 0], "244": [1, 0], "279": [1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [1, 0], "123": [-1, 0], "152": [-1, 0], "198": [1, 0], "239": [-1, 0], "278": [1, 0], "2": [1, 0], "40": [-1, 0], "78": [1, 0], "122": [-1, 0], "162": [-1, 0], "188": [1, 0], "242": [-1, 0], "275": [1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [1, 0], "123": [-1, 0], "152": [-1, 0], "198": [1, 0], "239": [-1, 0], "278": [1, 0], "3": [1, 0], "43": [-1, 0], "75": [1, 0], "121": [-1, 0], "168": [-1, 0], "207": [1, 0], "223": [-1, 0], "269": [1, 0]}, {"1": [-1, 0], "41": [1, 0], "77": [-1, 0], "123": [1, 0], "152": [1, 0], "198": [-1, 0], "239": [1, 0], "278": [-1, 0], "4": [1, 0], "42": [-1, 0], "76": [1, 0], "120": [-1, 0], "171": [-1, 0], "204": [1, 0], "233": [-1, 0], "259": [1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [-1, 0], "113": [1, 0], "153": [1, 0], "197": [-1, 0], "240": [1, 0], "277": [-1, 0], "6": [1, 0], "36": [-1, 0], "88": [1, 0], "112": [-1, 0], "163": [-1, 0], "187": [1, 0], "243": [-1, 0], "274": [1, 0]}, {"5": [1, 0], "37": [-1, 0], "87": [1, 0], "113": [-1, 0], "153": [-1, 0], "197": [1, 0], "240": [-1, 0], "277": [1, 0], "7": [1, 0], "39": [-1, 0], "85": [1, 0], "111": [-1, 0], "169": [-1, 0], "206": [1, 0], "224": [-1, 0], "268": [1, 0]}, {"5": [1, 0], "37": [-1, 0], "87": [1, 0], "113": [-1, 0], "153": [-1, 0], "197": [1, 0], "240": [-1, 0], "277": [1, 0], "8": [1, 0], "38": [-1, 0], "86": [1, 0], "110": [-1, 0], "172": [-1, 0], "203": [1, 0], "234": [-1, 0], "258": [1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [1, 0], "109": [-1, 0], "154": [-1, 0], "199": [1, 0], "238": [-1, 0], "276": [1, 0], "16": [1, 0], "50": [-1, 0], "74": [1, 0], "108": [-1, 0], "164": [-1, 0], "189": [1, 0], "241": [-1, 0], "273": [1, 0]}, {"15": [-1, 0], "51": [1, 0], "73": [-1, 0], "109": [1, 0], "154": [1, 0], "199": [-1, 0], "238": [1, 0], "276": [-1, 0], "17": [1, 0], "53": [-1, 0], "71": [1, 0], "107": [-1, 0], "170": [-1, 0], "208": [1, 0], "222": [-1, 0], "267": [1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [1, 0], "109": [-1, 0], "154": [-1, 0], "199": [1, 0], "238": [-1, 0], "276": [1, 0], "18": [1, 0], "52": [-1, 0], "72": [1, 0], "106": [-1, 0], "173": [-1, 0], "205": [1, 0], "232": [-1, 0], "257": [1, 0]}, {"14": [-1, 0], "49": [-1, 0], "95": [-1, 0], "130": [-1, 0], "165": [-1, 0], "200": [-1, 0], "214": [-1, 0], "249": [-1, 0], "19": [1, 0], "60": [-1, 0], "84": [-1, 0], "129": [1, 0], "143": [1, 0], "179": [-1, 0], "235": [-1, 0], "271": [1, 0], "25": [1, 0], "54": [-1, 0], "94": [-1, 0], "119": [1, 0], "144": [1, 0], "178": [-1, 0], "236": [-1, 0], "270": [1, 0]}, {"10": [1, 0], "48": [-1, 0], "96": [-1, 0], "134": [1, 0], "146": [1, 0], "194": [-1, 0], "218": [-1, 0], "266": [1, 0], "23": [-1, 0], "61": [-1, 0], "83": [-1, 0], "125": [-1, 0], "160": [-1, 0], "183": [-1, 0], "229": [-1, 0], "252": [-1, 0], "26": [1, 0], "58": [1, 0], "90": [1, 0], "118": [1, 0], "148": [1, 0], "195": [1, 0], "217": [1, 0], "264": [1, 0]}, {"12": [1, 0], "46": [-1, 0], "97": [-1, 0], "133": [1, 0], "156": [1, 0], "184": [-1, 0], "221": [-1, 0], "263": [1, 0], "22": [-1, 0], "62": [-1, 0], "81": [-1, 0], "127": [-1, 0], "157": [-1, 0], "186": [-1, 0], "219": [-1, 0], "262": [-1, 0], "27": [1, 0], "57": [1, 0], "92": [1, 0], "116": [1, 0], "151": [1, 0], "192": [1, 0], "227": [1, 0], "254": [1, 0]}, {"11": [1, 0], "47": [-1, 0], "98": [-1, 0], "132": [1, 0], "149": [1, 0], "191": [-1, 0], "228": [-1, 0], "256": [1, 0], "21": [-1, 0], "63": [-1, 0], "82": [-1, 0], "126": [-1, 0], "150": [-1, 0], "193": [-1, 0], "226": [-1, 0], "255": [-1, 0], "28": [1, 0], "56": [1, 0], "91": [1, 0], "117": [1, 0], "158": [1, 0], "185": [1, 0], "220": [1, 0], "261": [1, 0]}, {"13": [1, 0], "45": [-1, 0], "99": [-1, 0], "131": [1, 0], "159": [1, 0], "181": [-1, 0], "231": [-1, 0], "253": [1, 0], "20": [-1, 0], "64": [-1, 0], "80": [-1, 0], "128": [-1, 0], "147": [-1, 0], "196": [-1, 0], "216": [-1, 0], "265": [-1, 0], "29": [1, 0], "55": [1, 0], "93": [1, 0], "115": [1, 0], "161": [1, 0], "182": [1, 0], "230": [1, 0], "251": [1, 0]}, {"9": [-1, 0], "44": [-1, 0], "100": [-1, 0], "135": [-1, 0], "142": [-1, 0], "177": [-1, 0], "237": [-1, 0], "272": [-1, 0], "24": [1, 0], "65": [-1, 0], "79": [-1, 0], "124": [1, 0], "166": [1, 0], "202": [-1, 0], "212": [-1, 0], "248": [1, 0], "30": [1, 0], "59": [-1, 0], "89": [-1, 0], "114": [1, 0], "167": [1, 0], "201": [-1, 0], "213": [-1, 0], "247": [1, 0]}, {"31": [-1, 0], "67": [1, 0], "103": [-1, 0], "139": [1, 0], "140": [1, 0], "176": [-1, 0], "215": [1, 0], "260": [-1, 0], "32": [-1, 0], "66": [1, 0], "104": [-1, 0], "138": [1, 0], "141": [1, 0], "175": [-1, 0], "225": [1, 0], "250": [-1, 0], "33": [1, 0], "69": [-1, 0], "101": [1, 0], "137": [-1, 0], "145": [-1, 0], "190": [1, 0], "210": [-1, 0], "246": [1, 0], "34": [1, 0], "68": [-1, 0], "102": [1, 0], "136": [-1, 0], "155": [-1, 0], "180": [1, 0], "211": [-1, 0], "245": [1, 0]}, {"0": [1, 0], "35": [-1, 0], "70": [1, 0], "105": [-1, 0], "174": [1, 0], "209": [-1, 0], "244": [1, 0], "279": [-1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [-1, 0], "123": [-1, 0], "152": [1, 0], "198": [1, 0], "239": [1, 0], "278": [1, 0], "2": [1, 0], "40": [1, 0], "78": [1, 0], "122": [1, 0], "162": [-1, 0], "188": [-1, 0], "242": [-1, 0], "275": [-1, 0]}, {"1": [1, 0], "41": [1, 0], "77": [1, 0], "123": [1, 0], "152": [-1, 0], "198": [-1, 0], "239": [-1, 0], "278": [-1, 0], "3": [1, 0], "43": [1, 0], "75": [1, 0], "121": [1, 0], "168": [-1, 0], "207": [-1, 0], "223": [-1, 0], "269": [-1, 0]}, {"1": [1, 0], "41": [1, 0], "77": [1, 0], "123": [1, 0], "152": [-1, 0], "198": [-1, 0], "239": [-1, 0], "278": [-1, 0], "4": [1, 0], "42": [1, 0], "76": [1, 0], "120": [1, 0], "171": [-1, 0], "204": [-1, 0], "233": [-1, 0], "259": [-1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [1, 0], "113": [1, 0], "153": [-1, 0], "197": [-1, 0], "240": [-1, 0], "277": [-1, 0], "6": [1, 0], "36": [1, 0], "88": [1, 0], "112": [1, 0], "163": [-1, 0], "187": [-1, 0], "243": [-1, 0], "274": [-1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [1, 0], "113": [1, 0], "153": [-1, 0], "197": [-1, 0], "240": [-1, 0], "277": [-1, 0], "7": [1, 0], "39": [1, 0], "85": [1, 0], "111": [1, 0], "169": [-1, 0], "206": [-1, 0], "224": [-1, 0], "268": [-1, 0]}, {"5": [-1, 0], "37": [-1, 0], "87": [-1, 0], "113": [-1, 0], "153": [1, 0], "197": [1, 0], "240": [1, 0], "277": [1, 0], "8": [1, 0], "38": [1, 0], "86": [1, 0], "110": [1, 0], "172": [-1, 0], "203": [-1, 0], "234": [-1, 0], "258": [-1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [-1, 0], "109": [-1, 0], "154": [1, 0], "199": [1, 0], "238": [1, 0], "276": [1, 0], "16": [1, 0], "50": [1, 0], "74": [1, 0], "108": [1, 0], "164": [-1, 0], "189": [-1, 0], "241": [-1, 0], "273": [-1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [-1, 0], "109": [-1, 0], "154": [1, 0], "199": [1, 0], "238": [1, 0], "276": [1, 0], "17": [1, 0], "53": [1, 0], "71": [1, 0], "107": [1, 0], "170": [-1, 0], "208": [-1, 0], "222": [-1, 0], "267": [-1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [-1, 0], "109": [-1, 0], "154": [1, 0], "199": [1, 0], "238": [1, 0], "276": [1, 0], "18": [1, 0], "52": [1, 0], "72": [1, 0], "106": [1, 0], "173": [-1, 0], "205": [-1, 0], "232": [-1, 0], "257": [-1, 0]}, {"14": [-1, 0], "49": [1, 0], "95": [-1, 0], "130": [1, 0], "165": [-1, 0], "200": [1, 0], "214": [-1, 0], "249": [1, 0], "19": [-1, 0], "60": [-1, 0], "84": [1, 0], "129": [1, 0], "143": [-1, 0], "179": [-1, 0], "235": [1, 0], "271": [1, 0], "25": [1, 0], "54": [1, 0], "94": [-1, 0], "119": [-1, 0], "144": [1, 0], "178": [1, 0], "236": [-1, 0], "270": [-1, 0]}, {"10": [1, 0], "48": [1, 0], "96": [-1, 0], "134": [-1, 0], "146": [1, 0], "194": [1, 0], "218": [-1, 0], "266": [-1, 0], "23": [1, 0], "61": [-1, 0], "83": [1, 0], "125": [-1, 0], "160": [1, 0], "183": [-1, 0], "229": [1, 0], "252": [-1, 0], "26": [1, 0], "58": [-1, 0], "90": [1, 0], "118": [-1, 0], "148": [1, 0], "195": [-1, 0], "217": [1, 0], "264": [-1, 0]}, {"12": [1, 0], "46": [1, 0], "97": [-1, 0], "133": [-1, 0], "156": [1, 0], "184": [1, 0], "221": [-1, 0], "263": [-1, 0], "22": [1, 0], "62": [-1, 0], "81": [1, 0], "127": [-1, 0], "157": [1, 0], "186": [-1, 0], "219": [1, 0], "262": [-1, 0], "27": [1, 0], "57": [-1, 0], "92": [1, 0], "116": [-1, 0], "151": [1, 0], "192": [-1, 0], "227": [1, 0], "254": [-1, 0]}, {"11": [1, 0], "47": [1, 0], "98": [-1, 0], "132": [-1, 0], "149": [1, 0], "191": [1, 0], "228": [-1, 0], "256": [-1, 0], "21": [1, 0], "63": [-1, 0], "82": [1, 0], "126": [-1, 0], "150": [1, 0], "193": [-1, 0], "226": [1, 0], "255": [-1, 0], "28": [1, 0], "56": [-1, 0], "91": [1, 0], "117": [-1, 0], "158": [1, 0], "185": [-1, 0], "220": [1, 0], "261": [-1, 0]}, {"13": [1, 0], "45": [1, 0], "99": [-1, 0], "131": [-1, 0], "159": [1, 0], "181": [1, 0], "231": [-1, 0], "253": [-1, 0], "20": [1, 0], "64": [-1, 0], "80": [1, 0], "128": [-1, 0], "147": [1, 0], "196": [-1, 0], "216": [1, 0], "265": [-1, 0], "29": [1, 0], "55": [-1, 0], "93": [1, 0], "115": [-1, 0], "161": [1, 0], "182": [-1, 0], "230": [1, 0], "251": [-1, 0]}, {"9": [-1, 0], "44": [1, 0], "100": [-1, 0], "135": [1, 0], "142": [-1, 0], "177": [1, 0], "237": [-1, 0], "272": [1, 0], "24": [-1, 0], "65": [-1, 0], "79": [1, 0], "124": [1, 0], "166": [-1, 0], "202": [-1, 0], "212": [1, 0], "248": [1, 0], "30": [1, 0], "59": [1, 0], "89": [-1, 0], "114": [-1, 0], "167": [1, 0], "201": [1, 0], "213": [-1, 0], "247": [-1, 0]}, {"31": [1, 0], "67": [1, 0], "103": [1, 0], "139": [1, 0], "140": [-1, 0], "176": [-1, 0], "215": [-1, 0], "260": [-1, 0], "32": [-1, 0], "66": [-1, 0], "104": [-1, 0], "138": [-1, 0], "141": [1, 0], "175": [1, 0], "225": [1, 0], "250": [1, 0], "33": [-1, 0], "69": [-1, 0], "101": [-1, 0], "137": [-1, 0], "145": [1, 0], "190": [1, 0], "210": [1, 0], "246": [1, 0], "34": [1, 0], "68": [1, 0], "102": [1, 0], "136": [1, 0], "155": [-1, 0], "180": [-1, 0], "211": [-1, 0], "245": [-1, 0]}, {"0": [1, 0], "35": [1, 0], "70": [-1, 0], "105": [-1, 0], "174": [1, 0], "209": [1, 0], "244": [-1, 0], "279": [-1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [-1, 0], "123": [1, 0], "152": [-1, 0], "198": [1, 0], "239": [1, 0], "278": [-1, 0], "2": [1, 0], "40": [-1, 0], "78": [-1, 0], "122": [1, 0], "162": [-1, 0], "188": [1, 0], "242": [1, 0], "275": [-1, 0]}, {"1": [-1, 0], "41": [1, 0], "77": [1, 0], "123": [-1, 0], "152": [1, 0], "198": [-1, 0], "239": [-1, 0], "278": [1, 0], "3": [1, 0], "43": [-1, 0], "75": [-1, 0], "121": [1, 0], "168": [-1, 0], "207": [1, 0], "223": [1, 0], "269": [-1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [-1, 0], "123": [1, 0], "152": [-1, 0], "198": [1, 0], "239": [1, 0], "278": [-1, 0], "4": [1, 0], "42": [-1, 0], "76": [-1, 0], "120": [1, 0], "171": [-1, 0], "204": [1, 0], "233": [1, 0], "259": [-1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [1, 0], "113": [-1, 0], "153": [1, 0], "197": [-1, 0], "240": [-1, 0], "277": [1, 0], "6": [1, 0], "36": [-1, 0], "88": [-1, 0], "112": [1, 0], "163": [-1, 0], "187": [1, 0], "243": [1, 0], "274": [-1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [1, 0], "113": [-1, 0], "153": [1, 0], "197": [-1, 0], "240": [-1, 0], "277": [1, 0], "7": [1, 0], "39": [-1, 0], "85": [-1, 0], "111": [1, 0], "169": [-1, 0], "206": [1, 0], "224": [1, 0], "268": [-1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [1, 0], "113": [-1, 0], "153": [1, 0], "197": [-1, 0], "240": [-1, 0], "277": [1, 0], "8": [1, 0], "38": [-1, 0], "86": [-1, 0], "110": [1, 0], "172": [-1, 0], "203": [1, 0], "234": [1, 0], "258": [-1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [-1, 0], "109": [1, 0], "154": [-1, 0], "199": [1, 0], "238": [1, 0], "276": [-1, 0], "16": [1, 0], "50": [-1, 0], "74": [-1, 0], "108": [1, 0], "164": [-1, 0], "189": [1, 0], "241": [1, 0], "273": [-1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [-1, 0], "109": [1, 0], "154": [-1, 0], "199": [1, 0], "238": [1, 0], "276": [-1, 0], "17": [1, 0], "53": [-1, 0], "71": [-1, 0], "107": [1, 0], "170": [-1, 0], "208": [1, 0], "222": [1, 0], "267": [-1, 0]}, {"15": [-1, 0], "51": [1, 0], "73": [1, 0], "109": [-1, 0], "154": [1, 0], "199": [-1, 0], "238": [-1, 0], "276": [1, 0], "18": [1, 0], "52": [-1, 0], "72": [-1, 0], "106": [1, 0], "173": [-1, 0], "205": [1, 0], "232": [1, 0], "257": [-1, 0]}, {"14": [1, 0], "49": [1, 0], "95": [-1, 0], "130": [-1, 0], "165": [1, 0], "200": [1, 0], "214": [-1, 0], "249": [-1, 0], "19": [1, 0], "60": [-1, 0], "84": [1, 0], "129": [-1, 0], "143": [1, 0], "179": [-1, 0], "235": [1, 0], "271": [-1, 0], "25": [1, 0], "54": [-1, 0], "94": [1, 0], "119": [-1, 0], "144": [1, 0], "178": [-1, 0], "236": [1, 0], "270": [-1, 0]}, {"10": [-1, 0], "48": [1, 0], "96": [-1, 0], "134": [1, 0], "146": [-1, 0], "194": [1, 0], "218": [-1, 0], "266": [1, 0], "23": [-1, 0], "61": [-1, 0], "83": [1, 0], "125": [1, 0], "160": [-1, 0], "183": [-1, 0], "229": [1, 0], "252": [1, 0], "26": [1, 0], "58": [1, 0], "90": [-1, 0], "118": [-1, 0], "148": [1, 0], "195": [1, 0], "217": [-1, 0], "264": [-1, 0]}, {"12": [-1, 0], "46": [1, 0], "97": [-1, 0], "133": [1, 0], "156": [-1, 0], "184": [1, 0], "221": [-1, 0], "263": [1, 0], "22": [-1, 0], "62": [-1, 0], "81": [1, 0], "127": [1, 0], "157": [-1, 0], "186": [-1, 0], "219": [1, 0], "262": [1, 0], "27": [1, 0], "57": [1, 0], "92": [-1, 0], "116": [-1, 0], "151": [1, 0], "192": [1, 0], "227": [-1, 0], "254": [-1, 0]}, {"11": [-1, 0], "47": [1, 0], "98": [-1, 0], "132": [1, 0], "149": [-1, 0], "191": [1, 0], "228": [-1, 0], "256": [1, 0], "21": [-1, 0], "63": [-1, 0], "82": [1, 0], "126": [1, 0], "150": [-1, 0], "193": [-1, 0], "226": [1, 0], "255": [1, 0], "28": [1, 0], "56": [1, 0], "91": [-1, 0], "117": [-1, 0], "158": [1, 0], "185": [1, 0], "220": [-1, 0], "261": [-1, 0]}, {"13": [-1, 0], "45": [1, 0], "99": [-1, 0], "131": [1, 0], "159": [-1, 0], "181": [1, 0], "231": [-1, 0], "253": [1, 0], "20": [-1, 0], "64": [-1, 0], "80": [1, 0], "128": [1, 0], "147": [-1, 0], "196": [-1, 0], "216": [1, 0], "265": [1, 0], "29": [1, 0], "55": [1, 0], "93": [-1, 0], "115": [-1, 0], "161": [1, 0], "182": [1, 0], "230": [-1, 0], "251": [-1, 0]}, {"9": [1, 0], "44": [1, 0], "100": [-1, 0], "135": [-1, 0], "142": [1, 0], "177": [1, 0], "237": [-1, 0], "272": [-1, 0], "24": [1, 0], "65": [-1, 0], "79": [1, 0], "124": [-1, 0], "166": [1, 0], "202": [-1, 0], "212": [1, 0], "248": [-1, 0], "30": [1, 0], "59": [-1, 0], "89": [1, 0], "114": [-1, 0], "167": [1, 0], "201": [-1, 0], "213": [1, 0], "247": [-1, 0]}, {"31": [1, 0], "67": [-1, 0], "103": [-1, 0], "139": [1, 0], "140": [-1, 0], "176": [1, 0], "215": [1, 0], "260": [-1, 0], "32": [1, 0], "66": [-1, 0], "104": [-1, 0], "138": [1, 0], "141": [-1, 0], "175": [1, 0], "225": [1, 0], "250": [-1, 0], "33": [1, 0], "69": [-1, 0], "101": [-1, 0], "137": [1, 0], "145": [-1, 0], "190": [1, 0], "210": [1, 0], "246": [-1, 0], "34": [1, 0], "68": [-1, 0], "102": [-1, 0], "136": [1, 0], "155": [-1, 0], "180": [1, 0], "211": [1, 0], "245": [-1, 0]}, {"0": [1, 0], "35": [-1, 0], "70": [-1, 0], "105": [1, 0], "174": [1, 0], "209": [-1, 0], "244": [-1, 0], "279": [1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [1, 0], "123": [1, 0], "152": [1, 0], "198": [1, 0], "239": [-1, 0], "278": [-1, 0], "2": [1, 0], "40": [1, 0], "78": [-1, 0], "122": [-1, 0], "162": [-1, 0], "188": [-1, 0], "242": [1, 0], "275": [1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [1, 0], "123": [1, 0], "152": [1, 0], "198": [1, 0], "239": [-1, 0], "278": [-1, 0], "3": [1, 0], "43": [1, 0], "75": [-1, 0], "121": [-1, 0], "168": [-1, 0], "207": [-1, 0], "223": [1, 0], "269": [1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [1, 0], "123": [1, 0], "152": [1, 0], "198": [1, 0], "239": [-1, 0], "278": [-1, 0], "4": [1, 0], "42": [1, 0], "76": [-1, 0], "120": [-1, 0], "171": [-1, 0], "204": [-1, 0], "233": [1, 0], "259": [1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [-1, 0], "113": [-1, 0], "153": [-1, 0], "197": [-1, 0], "240": [1, 0], "277": [1, 0], "6": [1, 0], "36": [1, 0], "88": [-1, 0], "112": [-1, 0], "163": [-1, 0], "187": [-1, 0], "243": [1, 0], "274": [1, 0]}, {"5": [-1, 0], "37": [-1, 0], "87": [1, 0], "113": [1, 0], "153": [1, 0], "197": [1, 0], "240": [-1, 0], "277": [-1, 0], "7": [1, 0], "39": [1, 0], "85": [-1, 0], "111": [-1, 0], "169": [-1, 0], "206": [-1, 0], "224": [1, 0], "268": [1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [-1, 0], "113": [-1, 0], "153": [-1, 0], "197": [-1, 0], "240": [1, 0], "277": [1, 0], "8": [1, 0], "38": [1, 0], "86": [-1, 0], "110": [-1, 0], "172": [-1, 0], "203": [-1, 0], "234": [1, 0], "258": [1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [1, 0], "109": [1, 0], "154": [1, 0], "199": [1, 0], "238": [-1, 0], "276": [-1, 0], "16": [1, 0], "50": [1, 0], "74": [-1, 0], "108": [-1, 0], "164": [-1, 0], "189": [-1, 0], "241": [1, 0], "273": [1, 0]}, {"15": [1, 0], "51": [1, 0], "73": [-1, 0], "109": [-1, 0], "154": [-1, 0], "199": [-1, 0], "238": [1, 0], "276": [1, 0], "17": [1, 0], "53": [1, 0], "71": [-1, 0], "107": [-1, 0], "170": [-1, 0], "208": [-1, 0], "222": [1, 0], "267": [1, 0]}, {"15": [1, 0], "51": [1, 0], "73": [-1, 0], "109": [-1, 0], "154": [-1, 0], "199": [-1, 0], "238": [1, 0], "276": [1, 0], "18": [1, 0], "52": [1, 0], "72": [-1, 0], "106": [-1, 0], "173": [-1, 0], "205": [-1, 0], "232": [1, 0], "257": [1, 0]}, {"14": [1, 0], "49": [-1, 0], "95": [-1, 0], "130": [1, 0], "165": [1, 0], "200": [-1, 0], "214": [-1, 0], "249": [1, 0], "19": [-1, 0], "60": [-1, 0], "84": [-1, 0], "129": [-1, 0], "143": [-1, 0], "179": [-1, 0], "235": [-1, 0], "271": [-1, 0], "25": [1, 0], "54": [1, 0], "94": [1, 0], "119": [1, 0], "144": [1, 0], "178": [1, 0], "236": [1, 0], "270": [1, 0]}, {"10": [-1, 0], "48": [-1, 0], "96": [-1, 0], "134": [-1, 0], "146": [-1, 0], "194": [-1, 0], "218": [-1, 0], "266": [-1, 0], "23": [1, 0], "61": [-1, 0], "83": [-1, 0], "125": [1, 0], "160": [1, 0], "183": [-1, 0], "229": [-1, 0], "252": [1, 0], "26": [1, 0], "58": [-1, 0], "90": [-1, 0], "118": [1, 0], "148": [1, 0], "195": [-1, 0], "217": [-1, 0], "264": [1, 0]}, {"12": [-1, 0], "46": [-1, 0], "97": [-1, 0], "133": [-1, 0], "156": [-1, 0], "184": [-1, 0], "221": [-1, 0], "263": [-1, 0], "22": [1, 0], "62": [-1, 0], "81": [-1, 0], "127": [1, 0], "157": [1, 0], "186": [-1, 0], "219": [-1, 0], "262": [1, 0], "27": [1, 0], "57": [-1, 0], "92": [-1, 0], "116": [1, 0], "151": [1, 0], "192": [-1, 0], "227": [-1, 0], "254": [1, 0]}, {"11": [-1, 0], "47": [-1, 0], "98": [-1, 0], "132": [-1, 0], "149": [-1, 0], "191": [-1, 0], "228": [-1, 0], "256": [-1, 0], "21": [1, 0], "63": [-1, 0], "82": [-1, 0], "126": [1, 0], "150": [1, 0], "193": [-1, 0], "226": [-1, 0], "255": [1, 0], "28": [1, 0], "56": [-1, 0], "91": [-1, 0], "117": [1, 0], "158": [1, 0], "185": [-1, 0], "220": [-1, 0], "261": [1, 0]}, {"13": [-1, 0], "45": [-1, 0], "99": [-1, 0], "131": [-1, 0], "159": [-1, 0], "181": [-1, 0], "231": [-1, 0], "253": [-1, 0], "20": [1, 0], "64": [-1, 0], "80": [-1, 0], "128": [1, 0], "147": [1, 0], "196": [-1, 0], "216": [-1, 0], "265": [1, 0], "29": [1, 0], "55": [-1, 0], "93": [-1, 0], "115": [1, 0], "161": [1, 0], "182": [-1, 0], "230": [-1, 0], "251": [1, 0]}, {"9": [1, 0], "44": [-1, 0], "100": [-1, 0], "135": [1, 0], "142": [1, 0], "177": [-1, 0], "237": [-1, 0], "272": [1, 0], "24": [-1, 0], "65": [-1, 0], "79": [-1, 0], "124": [-1, 0], "166": [-1, 0], "202": [-1, 0], "212": [-1, 0], "248": [-1, 0], "30": [1, 0], "59": [1, 0], "89": [1, 0], "114": [1, 0], "167": [1, 0], "201": [1, 0], "213": [1, 0], "247": [1, 0]}, {"31": [-1, 0], "67": [-1, 0], "103": [1, 0], "139": [1, 0], "140": [1, 0], "176": [1, 0], "215": [-1, 0], "260": [-1, 0], "32": [1, 0], "66": [1, 0], "104": [-1, 0], "138": [-1, 0], "141": [-1, 0], "175": [-1, 0], "225": [1, 0], "250": [1, 0], "33": [-1, 0], "69": [-1, 0], "101": [1, 0], "137": [1, 0], "145": [1, 0], "190": [1, 0], "210": [-1, 0], "246": [-1, 0], "34": [1, 0], "68": [1, 0], "102": [-1, 0], "136": [-1, 0], "155": [-1, 0], "180": [-1, 0], "211": [1, 0], "245": [1, 0]}, {"0": [1, 0], "35": [1, 0], "70": [1, 0], "105": [1, 0], "174": [-1, 0], "209": [-1, 0], "244": [-1, 0], "279": [-1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [1, 0], "123": [-1, 0], "152": [1, 0], "198": [-1, 0], "239": [1, 0], "278": [-1, 0], "2": [1, 0], "40": [-1, 0], "78": [1, 0], "122": [-1, 0], "162": [1, 0], "188": [-1, 0], "242": [1, 0], "275": [-1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [1, 0], "123": [-1, 0], "152": [1, 0], "198": [-1, 0], "239": [1, 0], "278": [-1, 0], "3": [1, 0], "43": [-1, 0], "75": [1, 0], "121": [-1, 0], "168": [1, 0], "207": [-1, 0], "223": [1, 0], "269": [-1, 0]}, {"1": [-1, 0], "41": [1, 0], "77": [-1, 0], "123": [1, 0], "152": [-1, 0], "198": [1, 0], "239": [-1, 0], "278": [1, 0], "4": [1, 0], "42": [-1, 0], "76": [1, 0], "120": [-1, 0], "171": [1, 0], "204": [-1, 0], "233": [1, 0], "259": [-1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [-1, 0], "113": [1, 0], "153": [-1, 0], "197": [1, 0], "240": [-1, 0], "277": [1, 0], "6": [1, 0], "36": [-1, 0], "88": [1, 0], "112": [-1, 0], "163": [1, 0], "187": [-1, 0], "243": [1, 0], "274": [-1, 0]}, {"5": [1, 0], "37": [-1, 0], "87": [1, 0], "113": [-1, 0], "153": [1, 0], "197": [-1, 0], "240": [1, 0], "277": [-1, 0], "7": [1, 0], "39": [-1, 0], "85": [1, 0], "111": [-1, 0], "169": [1, 0], "206": [-1, 0], "224": [1, 0], "268": [-1, 0]}, {"5": [1, 0], "37": [-1, 0], "87": [1, 0], "113": [-1, 0], "153": [1, 0], "197": [-1, 0], "240": [1, 0], "277": [-1, 0], "8": [1, 0], "38": [-1, 0], "86": [1, 0], "110": [-1, 0], "172": [1, 0], "203": [-1, 0], "234": [1, 0], "258": [-1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [1, 0], "109": [-1, 0], "154": [1, 0], "199": [-1, 0], "238": [1, 0], "276": [-1, 0], "16": [1, 0], "50": [-1, 0], "74": [1, 0], "108": [-1, 0], "164": [1, 0], "189": [-1, 0], "241": [1, 0], "273": [-1, 0]}, {"15": [-1, 0], "51": [1, 0], "73": [-1, 0], "109": [1, 0], "154": [-1, 0], "199": [1, 0], "238": [-1, 0], "276": [1, 0], "17": [1, 0], "53": [-1, 0], "71": [1, 0], "107": [-1, 0], "170": [1, 0], "208": [-1, 0], "222": [1, 0], "267": [-1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [1, 0], "109": [-1, 0], "154": [1, 0], "199": [-1, 0], "238": [1, 0], "276": [-1, 0], "18": [1, 0], "52": [-1, 0], "72": [1, 0], "106": [-1, 0], "173": [1, 0], "205": [-1, 0], "232": [1, 0], "257": [-1, 0]}, {"14": [-1, 0], "49": [-1, 0], "95": [-1, 0], "130": [-1, 0], "165": [1, 0], "200": [1, 0], "214": [1, 0], "249": [1, 0], "19": [1, 0], "60": [-1, 0], "84": [-1, 0], "129": [1, 0], "143": [-1, 0], "179": [1, 0], "235": [1, 0], "271": [-1, 0], "25": [1, 0], "54": [-1, 0], "94": [-1, 0], "119": [1, 0], "144": [-1, 0], "178": [1, 0], "236": [1, 0], "270": [-1, 0]}, {"10": [1, 0], "48": [-1, 0], "96": [-1, 0], "134": [1, 0], "146": [-1, 0], "194": [1, 0], "218": [1, 0], "266": [-1, 0], "23": [-1, 0], "61": [-1, 0], "83": [-1, 0], "125": [-1, 0], "160": [1, 0], "183": [1, 0], "229": [1, 0], "252": [1, 0], "26": [1, 0], "58": [1, 0], "90": [1, 0], "118": [1, 0], "148": [-1, 0], "195": [-1, 0], "217": [-1, 0], "264": [-1, 0]}, {"12": [1, 0], "46": [-1, 0], "97": [-1, 0], "133": [1, 0], "156": [-1, 0], "184": [1, 0], "221": [1, 0], "263": [-1, 0], "22": [-1, 0], "62": [-1, 0], "81": [-1, 0], "127": [-1, 0], "157": [1, 0], "186": [1, 0], "219": [1, 0], "262": [1, 0], "27": [1, 0], "57": [1, 0], "92": [1, 0], "116": [1, 0], "151": [-1, 0], "192": [-1, 0], "227": [-1, 0], "254": [-1, 0]}, {"11": [1, 0], "47": [-1, 0], "98": [-1, 0], "132": [1, 0], "149": [-1, 0], "191": [1, 0], "228": [1, 0], "256": [-1, 0], "21": [-1, 0], "63": [-1, 0], "82": [-1, 0], "126": [-1, 0], "150": [1, 0], "193": [1, 0], "226": [1, 0], "255": [1, 0], "28": [1, 0], "56": [1, 0], "91": [1, 0], "117": [1, 0], "158": [-1, 0], "185": [-1, 0], "220": [-1, 0], "261": [-1, 0]}, {"13": [1, 0], "45": [-1, 0], "99": [-1, 0], "131": [1, 0], "159": [-1, 0], "181": [1, 0], "231": [1, 0], "253": [-1, 0], "20": [-1, 0], "64": [-1, 0], "80": [-1, 0], "128": [-1, 0], "147": [1, 0], "196": [1, 0], "216": [1, 0], "265": [1, 0], "29": [1, 0], "55": [1, 0], "93": [1, 0], "115": [1, 0], "161": [-1, 0], "182": [-1, 0], "230": [-1, 0], "251": [-1, 0]}, {"9": [-1, 0], "44": [-1, 0], "100": [-1, 0], "135": [-1, 0], "142": [1, 0], "177": [1, 0], "237": [1, 0], "272": [1, 0], "24": [1, 0], "65": [-1, 0], "79": [-1, 0], "124": [1, 0], "166": [-1, 0], "202": [1, 0], "212": [1, 0], "248": [-1, 0], "30": [1, 0], "59": [-1, 0], "89": [-1, 0], "114": [1, 0], "167": [-1, 0], "201": [1, 0], "213": [1, 0], "247": [-1, 0]}, {"31": [-1, 0], "67": [1, 0], "103": [-1, 0], "139": [1, 0], "140": [-1, 0], "176": [1, 0], "215": [-1, 0], "260": [1, 0], "32": [-1, 0], "66": [1, 0], "104": [-1, 0], "138": [1, 0], "141": [-1, 0], "175": [1, 0], "225": [-1, 0], "250": [1, 0], "33": [1, 0], "69": [-1, 0], "101": [1, 0], "137": [-1, 0], "145": [1, 0], "190": [-1, 0], "210": [1, 0], "246": [-1, 0], "34": [1, 0], "68": [-1, 0], "102": [1, 0], "136": [-1, 0], "155": [1, 0], "180": [-1, 0], "211": [1, 0], "245": [-1, 0]}, {"0": [1, 0], "35": [-1, 0], "70": [1, 0], "105": [-1, 0], "174": [-1, 0], "209": [1, 0], "244": [-1, 0], "279": [1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [-1, 0], "123": [-1, 0], "152": [-1, 0], "198": [-1, 0], "239": [-1, 0], "278": [-1, 0], "2": [1, 0], "40": [1, 0], "78": [1, 0], "122": [1, 0], "162": [1, 0], "188": [1, 0], "242": [1, 0], "275": [1, 0]}, {"1": [1, 0], "41": [1, 0], "77": [1, 0], "123": [1, 0], "152": [1, 0], "198": [1, 0], "239": [1, 0], "278": [1, 0], "3": [1, 0], "43": [1, 0], "75": [1, 0], "121": [1, 0], "168": [1, 0], "207": [1, 0], "223": [1, 0], "269": [1, 0]}, {"1": [1, 0], "41": [1, 0], "77": [1, 0], "123": [1, 0], "152": [1, 0], "198": [1, 0], "239": [1, 0], "278": [1, 0], "4": [1, 0], "42": [1, 0], "76": [1, 0], "120": [1, 0], "171": [1, 0], "204": [1, 0], "233": [1, 0], "259": [1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [1, 0], "113": [1, 0], "153": [1, 0], "197": [1, 0], "240": [1, 0], "277": [1, 0], "6": [1, 0], "36": [1, 0], "88": [1, 0], "112": [1, 0], "163": [1, 0], "187": [1, 0], "243": [1, 0], "274": [1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [1, 0], "113": [1, 0], "153": [1, 0], "197": [1, 0], "240": [1, 0], "277": [1, 0], "7": [1, 0], "39": [1, 0], "85": [1, 0], "111": [1, 0], "169": [1, 0], "206": [1, 0], "224": [1, 0], "268": [1, 0]}, {"5": [-1, 0], "37": [-1, 0], "87": [-1, 0], "113": [-1, 0], "153": [-1, 0], "197": [-1, 0], "240": [-1, 0], "277": [-1, 0], "8": [1, 0], "38": [1, 0], "86": [1, 0], "110": [1, 0], "172": [1, 0], "203": [1, 0], "234": [1, 0], "258": [1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [-1, 0], "109": [-1, 0], "154": [-1, 0], "199": [-1, 0], "238": [-1, 0], "276": [-1, 0], "16": [1, 0], "50": [1, 0], "74": [1, 0], "108": [1, 0], "164": [1, 0], "189": [1, 0], "241": [1, 0], "273": [1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [-1, 0], "109": [-1, 0], "154": [-1, 0], "199": [-1, 0], "238": [-1, 0], "276": [-1, 0], "17": [1, 0], "53": [1, 0], "71": [1, 0], "107": [1, 0], "170": [1, 0], "208": [1, 0], "222": [1, 0], "267": [1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [-1, 0], "109": [-1, 0], "154": [-1, 0], "199": [-1, 0], "238": [-1, 0], "276": [-1, 0], "18": [1, 0], "52": [1, 0], "72": [1, 0], "106": [1, 0], "173": [1, 0], "205": [1, 0], "232": [1, 0], "257": [1, 0]}, {"14": [-1, 0], "49": [1, 0], "95": [-1, 0], "130": [1, 0], "165": [1, 0], "200": [-1, 0], "214": [1, 0], "249": [-1, 0], "19": [-1, 0], "60": [-1, 0], "84": [1, 0], "129": [1, 0], "143": [1, 0], "179": [1, 0], "235": [-1, 0], "271": [-1, 0], "25": [1, 0], "54": [1, 0], "94": [-1, 0], "119": [-1, 0], "144": [-1, 0], "178": [-1, 0], "236": [1, 0], "270": [1, 0]}, {"10": [1, 0], "48": [1, 0], "96": [-1, 0], "134": [-1, 0], "146": [-1, 0], "194": [-1, 0], "218": [1, 0], "266": [1, 0], "23": [1, 0], "61": [-1, 0], "83": [1, 0], "125": [-1, 0], "160": [-1, 0], "183": [1, 0], "229": [-1, 0], "252": [1, 0], "26": [1, 0], "58": [-1, 0], "90": [1, 0], "118": [-1, 0], "148": [-1, 0], "195": [1, 0], "217": [-1, 0], "264": [1, 0]}, {"12": [1, 0], "46": [1, 0], "97": [-1, 0], "133": [-1, 0], "156": [-1, 0], "184": [-1, 0], "221": [1, 0], "263": [1, 0], "22": [1, 0], "62": [-1, 0], "81": [1, 0], "127": [-1, 0], "157": [-1, 0], "186": [1, 0], "219": [-1, 0], "262": [1, 0], "27": [1, 0], "57": [-1, 0], "92": [1, 0], "116": [-1, 0], "151": [-1, 0], "192": [1, 0], "227": [-1, 0], "254": [1, 0]}, {"11": [1, 0], "47": [1, 0], "98": [-1, 0], "132": [-1, 0], "149": [-1, 0], "191": [-1, 0], "228": [1, 0], "256": [1, 0], "21": [1, 0], "63": [-1, 0], "82": [1, 0], "126": [-1, 0], "150": [-1, 0], "193": [1, 0], "226": [-1, 0], "255": [1, 0], "28": [1, 0], "56": [-1, 0], "91": [1, 0], "117": [-1, 0], "158": [-1, 0], "185": [1, 0], "220": [-1, 0], "261": [1, 0]}, {"13": [1, 0], "45": [1, 0], "99": [-1, 0], "131": [-1, 0], "159": [-1, 0], "181": [-1, 0], "231": [1, 0], "253": [1, 0], "20": [1, 0], "64": [-1, 0], "80": [1, 0], "128": [-1, 0], "147": [-1, 0], "196": [1, 0], "216": [-1, 0], "265": [1, 0], "29": [1, 0], "55": [-1, 0], "93": [1, 0], "115": [-1, 0], "161": [-1, 0], "182": [1, 0], "230": [-1, 0], "251": [1, 0]}, {"9": [-1, 0], "44": [1, 0], "100": [-1, 0], "135": [1, 0], "142": [1, 0], "177": [-1, 0], "237": [1, 0], "272": [-1, 0], "24": [-1, 0], "65": [-1, 0], "79": [1, 0], "124": [1, 0], "166": [1, 0], "202": [1, 0], "212": [-1, 0], "248": [-1, 0], "30": [1, 0], "59": [1, 0], "89": [-1, 0], "114": [-1, 0], "167": [-1, 0], "201": [-1, 0], "213": [1, 0], "247": [1, 0]}, {"31": [1, 0], "67": [1, 0], "103": [1, 0], "139": [1, 0], "140": [1, 0], "176": [1, 0], "215": [1, 0], "260": [1, 0], "32": [-1, 0], "66": [-1, 0], "104": [-1, 0], "138": [-1, 0], "141": [-1, 0], "175": [-1, 0], "225": [-1, 0], "250": [-1, 0], "33": [-1, 0], "69": [-1, 0], "101": [-1, 0], "137": [-1, 0], "145": [-1, 0], "190": [-1, 0], "210": [-1, 0], "246": [-1, 0], "34": [1, 0], "68": [1, 0], "102": [1, 0], "136": [1, 0], "155": [1, 0], "180": [1, 0], "211": [1, 0], "245": [1, 0]}, {"0": [1, 0], "35": [1, 0], "70": [-1, 0], "105": [-1, 0], "174": [-1, 0], "209": [-1, 0], "244": [1, 0], "279": [1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [-1, 0], "123": [1, 0], "152": [1, 0], "198": [-1, 0], "239": [-1, 0], "278": [1, 0], "2": [1, 0], "40": [-1, 0], "78": [-1, 0], "122": [1, 0], "162": [1, 0], "188": [-1, 0], "242": [-1, 0], "275": [1, 0]}, {"1": [-1, 0], "41": [1, 0], "77": [1, 0], "123": [-1, 0], "152": [-1, 0], "198": [1, 0], "239": [1, 0], "278": [-1, 0], "3": [1, 0], "43": [-1, 0], "75": [-1, 0], "121": [1, 0], "168": [1, 0], "207": [-1, 0], "223": [-1, 0], "269": [1, 0]}, {"1": [1, 0], "41": [-1, 0], "77": [-1, 0], "123": [1, 0], "152": [1, 0], "198": [-1, 0], "239": [-1, 0], "278": [1, 0], "4": [1, 0], "42": [-1, 0], "76": [-1, 0], "120": [1, 0], "171": [1, 0], "204": [-1, 0], "233": [-1, 0], "259": [1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [1, 0], "113": [-1, 0], "153": [-1, 0], "197": [1, 0], "240": [1, 0], "277": [-1, 0], "6": [1, 0], "36": [-1, 0], "88": [-1, 0], "112": [1, 0], "163": [1, 0], "187": [-1, 0], "243": [-1, 0], "274": [1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [1, 0], "113": [-1, 0], "153": [-1, 0], "197": [1, 0], "240": [1, 0], "277": [-1, 0], "7": [1, 0], "39": [-1, 0], "85": [-1, 0], "111": [1, 0], "169": [1, 0], "206": [-1, 0], "224": [-1, 0], "268": [1, 0]}, {"5": [-1, 0], "37": [1, 0], "87": [1, 0], "113": [-1, 0], "153": [-1, 0], "197": [1, 0], "240": [1, 0], "277": [-1, 0], "8": [1, 0], "38": [-1, 0], "86": [-1, 0], "110": [1, 0], "172": [1, 0], "203": [-1, 0], "234": [-1, 0], "258": [1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [-1, 0], "109": [1, 0], "154": [1, 0], "199": [-1, 0], "238": [-1, 0], "276": [1, 0], "16": [1, 0], "50": [-1, 0], "74": [-1, 0], "108": [1, 0], "164": [1, 0], "189": [-1, 0], "241": [-1, 0], "273": [1, 0]}, {"15": [1, 0], "51": [-1, 0], "73": [-1, 0], "109": [1, 0], "154": [1, 0], "199": [-1, 0], "238": [-1, 0], "276": [1, 0], "17": [1, 0], "53": [-1, 0], "71": [-1, 0], "107": [1, 0], "170": [1, 0], "208": [-1, 0], "222": [-1, 0], "267": [1, 0]}, {"15": [-1, 0], "51": [1, 0], "73": [1, 0], "109": [-1, 0], "154": [-1, 0], "199": [1, 0], "238": [1, 0], "276": [-1, 0], "18": [1, 0], "52": [-1, 0], "72": [-1, 0], "106": [1, 0], "173": [1, 0], "205": [-1, 0], "232": [-1, 0], "257": [1, 0]}, {"14": [1, 0], "49": [1, 0], "95": [-1, 0], "130": [-1, 0], "165": [-1, 0], "200": [-1, 0], "214": [1, 0], "249": [1, 0], "19": [1, 0], "60": [-1, 0], "84": [1, 0], "129": [-1, 0], "143": [-1, 0], "179": [1, 0], "235": [-1, 0], "271": [1, 0], "25": [1, 0], "54": [-1, 0], "94": [1, 0], "119": [-1, 0], "144": [-1, 0], "178": [1, 0], "236": [-1, 0], "270": [1, 0]}, {"10": [-1, 0], "48": [1, 0], "96": [-1, 0], "134": [1, 0], "146": [1, 0], "194": [-1, 0], "218": [1, 0], "266": [-1, 0], "23": [-1, 0], "61": [-1, 0], "83": [1, 0], "125": [1, 0], "160": [1, 0], "183": [1, 0], "229": [-1, 0], "252": [-1, 0], "26": [1, 0], "58": [1, 0], "90": [-1, 0], "118": [-1, 0], "148": [-1, 0], "195": [-1, 0], "217": [1, 0], "264": [1, 0]}, {"12": [-1, 0], "46": [1, 0], "97": [-1, 0], "133": [1, 0], "156": [1, 0], "184": [-1, 0], "221": [1, 0], "263": [-1, 0], "22": [-1, 0], "62": [-1, 0], "81": [1, 0], "127": [1, 0], "157": [1, 0], "186": [1, 0], "219": [-1, 0], "262": [-1, 0], "27": [1, 0], "57": [1, 0], "92": [-1, 0], "116": [-1, 0], "151": [-1, 0], "192": [-1, 0], "227": [1, 0], "254": [1, 0]}, {"11": [-1, 0], "47": [1, 0], "98": [-1, 0], "132": [1, 0], "149": [1, 0], "191": [-1, 0], "228": [1, 0], "256": [-1, 0], "21": [-1, 0], "63": [-1, 0], "82": [1, 0], "126": [1, 0], "150": [1, 0], "193": [1, 0], "226": [-1, 0], "255": [-1, 0], "28": [1, 0], "56": [1, 0], "91": [-1, 0], "117": [-1, 0], "158": [-1, 0], "185": [-1, 0], "220": [1, 0], "261": [1, 0]}, {"13": [-1, 0], "45": [1, 0], "99": [-1, 0], "131": [1, 0], "159": [1, 0], "181": [-1, 0], "231": [1, 0], "253": [-1, 0], "20": [-1, 0], "64": [-1, 0], "80": [1, 0], "128": [1, 0], "147": [1, 0], "196": [1, 0], "216": [-1, 0], "265": [-1, 0], "29": [1, 0], "55": [1, 0], "93": [-1, 0], "115": [-1, 0], "161": [-1, 0], "182": [-1, 0], "230": [1, 0], "251": [1, 0]}, {"9": [1, 0], "44": [1, 0], "100": [-1, 0], "135": [-1, 0], "142": [-1, 0], "177": [-1, 0], "237": [1, 0], "272": [1, 0], "24": [1, 0], "65": [-1, 0], "79": [1, 0], "124": [-1, 0], "166": [-1, 0], "202": [1, 0], "212": [-1, 0], "248": [1, 0], "30": [1, 0], "59": [-1, 0], "89": [1, 0], "114": [-1, 0], "167": [-1, 0], "201": [1, 0], "213": [-1, 0], "247": [1, 0]}, {"31": [1, 0], "67": [-1, 0], "103": [-1, 0], "139": [1, 0], "140": [1, 0], "176": [-1, 0], "215": [-1, 0], "260": [1, 0], "32": [1, 0], "66": [-1, 0], "104": [-1, 0], "138": [1, 0], "141": [1, 0], "175": [-1, 0], "225": [-1, 0], "250": [1, 0], "33": [1, 0], "69": [-1, 0], "101": [-1, 0], "137": [1, 0], "145": [1, 0], "190": [-1, 0], "210": [-1, 0], "246": [1, 0], "34": [1, 0], "68": [-1, 0], "102": [-1, 0], "136": [1, 0], "155": [1, 0], "180": [-1, 0], "211": [-1, 0], "245": [1, 0]}, {"0": [1, 0], "35": [-1, 0], "70": [-1, 0], "105": [1, 0], "174": [-1, 0], "209": [1, 0], "244": [1, 0], "279": [-1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [1, 0], "123": [1, 0], "152": [-1, 0], "198": [-1, 0], "239": [1, 0], "278": [1, 0], "2": [1, 0], "40": [1, 0], "78": [-1, 0], "122": [-1, 0], "162": [1, 0], "188": [1, 0], "242": [-1, 0], "275": [-1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [1, 0], "123": [1, 0], "152": [-1, 0], "198": [-1, 0], "239": [1, 0], "278": [1, 0], "3": [1, 0], "43": [1, 0], "75": [-1, 0], "121": [-1, 0], "168": [1, 0], "207": [1, 0], "223": [-1, 0], "269": [-1, 0]}, {"1": [-1, 0], "41": [-1, 0], "77": [1, 0], "123": [1, 0], "152": [-1, 0], "198": [-1, 0], "239": [1, 0], "278": [1, 0], "4": [1, 0], "42": [1, 0], "76": [-1, 0], "120": [-1, 0], "171": [1, 0], "204": [1, 0], "233": [-1, 0], "259": [-1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [-1, 0], "113": [-1, 0], "153": [1, 0], "197": [1, 0], "240": [-1, 0], "277": [-1, 0], "6": [1, 0], "36": [1, 0], "88": [-1, 0], "112": [-1, 0], "163": [1, 0], "187": [1, 0], "243": [-1, 0], "274": [-1, 0]}, {"5": [-1, 0], "37": [-1, 0], "87": [1, 0], "113": [1, 0], "153": [-1, 0], "197": [-1, 0], "240": [1, 0], "277": [1, 0], "7": [1, 0], "39": [1, 0], "85": [-1, 0], "111": [-1, 0], "169": [1, 0], "206": [1, 0], "224": [-1, 0], "268": [-1, 0]}, {"5": [1, 0], "37": [1, 0], "87": [-1, 0], "113": [-1, 0], "153": [1, 0], "197": [1, 0], "240": [-1, 0], "277": [-1, 0], "8": [1, 0], "38": [1, 0], "86": [-1, 0], "110": [-1, 0], "172": [1, 0], "203": [1, 0], "234": [-1, 0], "258": [-1, 0]}, {"15": [-1, 0], "51": [-1, 0], "73": [1, 0], "109": [1, 0], "154": [-1, 0], "199": [-1, 0], "238": [1, 0], "276": [1, 0], "16": [1, 0], "50": [1, 0], "74": [-1, 0], "108": [-1, 0], "164": [1, 0], "189": [1, 0], "241": [-1, 0], "273": [-1, 0]}, {"15": [1, 0], "51": [1, 0], "73": [-1, 0], "109": [-1, 0], "154": [1, 0], "199": [1, 0], "238": [-1, 0], "276": [-1, 0], "17": [1, 0], "53": [1, 0], "71": [-1, 0], "107": [-1, 0], "170": [1, 0], "208": [1, 0], "222": [-1, 0], "267": [-1, 0]}, {"15": [1, 0], "51": [1, 0], "73": [-1, 0], "109": [-1, 0], "154": [1, 0], "199": [1, 0], "238": [-1, 0], "276": [-1, 0], "18": [1, 0], "52": [1, 0], "72": [-1, 0], "106": [-1, 0], "173": [1, 0], "205": [1, 0], "232": [-1, 0], "257": [-1, 0]}, {"14": [1, 0], "49": [-1, 0], "95": [-1, 0], "130": [1, 0], "165": [-1, 0], "200": [1, 0], "214": [1, 0], "249": [-1, 0], "19": [-1, 0], "60": [-1, 0], "84": [-1, 0], "129": [-1, 0], "143": [1, 0], "179": [1, 0], "235": [1, 0], "271": [1, 0], "25": [1, 0], "54": [1, 0], "94": [1, 0], "119": [1, 0], "144": [-1, 0], "178": [-1, 0], "236": [-1, 0], "270": [-1, 0]}, {"10": [-1, 0], "48": [-1, 0], "96": [-1, 0], "134": [-1, 0], "146": [1, 0], "194": [1, 0], "218": [1, 0], "266": [1, 0], "23": [1, 0], "61": [-1, 0], "83": [-1, 0], "125": [1, 0], "160": [-1, 0], "183": [1, 0], "229": [1, 0], "252": [-1, 0], "26": [1, 0], "58": [-1, 0], "90": [-1, 0], "118": [1, 0], "148": [-1, 0], "195": [1, 0], "217": [1, 0], "264": [-1, 0]}, {"12": [-1, 0], "46": [-1, 0], "97": [-1, 0], "133": [-1, 0], "156": [1, 0], "184": [1, 0], "221": [1, 0], "263": [1, 0], "22": [1, 0], "62": [-1, 0], "81": [-1, 0], "127": [1, 0], "157": [-1, 0], "186": [1, 0], "219": [1, 0], "262": [-1, 0], "27": [1, 0], "57": [-1, 0], "92": [-1, 0], "116": [1, 0], "151": [-1, 0], "192": [1, 0], "227": [1, 0], "254": [-1, 0]}, {"11": [-1, 0], "47": [-1, 0], "98": [-1, 0], "132": [-1, 0], "149": [1, 0], "191": [1, 0], "228": [1, 0], "256": [1, 0], "21": [1, 0], "63": [-1, 0], "82": [-1, 0], "126": [1, 0], "150": [-1, 0], "193": [1, 0], "226": [1, 0], "255": [-1, 0], "28": [1, 0], "56": [-1, 0], "91": [-1, 0], "117": [1, 0], "158": [-1, 0], "185": [1, 0], "220": [1, 0], "261": [-1, 0]}, {"13": [-1, 0], "45": [-1, 0], "99": [-1, 0], "131": [-1, 0], "159": [1, 0], "181": [1, 0], "231": [1, 0], "253": [1, 0], "20": [1, 0], "64": [-1, 0], "80": [-1, 0], "128": [1, 0], "147": [-1, 0], "196": [1, 0], "216": [1, 0], "265": [-1, 0], "29": [1, 0], "55": [-1, 0], "93": [-1, 0], "115": [1, 0], "161": [-1, 0], "182": [1, 0], "230": [1, 0], "251": [-1, 0]}, {"9": [1, 0], "44": [-1, 0], "100": [-1, 0], "135": [1, 0], "142": [-1, 0], "177": [1, 0], "237": [1, 0], "272": [-1, 0], "24": [-1, 0], "65": [-1, 0], "79": [-1, 0], "124": [-1, 0], "166": [1, 0], "202": [1, 0], "212": [1, 0], "248": [1, 0], "30": [1, 0], "59": [1, 0], "89": [1, 0], "114": [1, 0], "167": [-1, 0], "201": [-1, 0], "213": [-1, 0], "247": [-1, 0]}, {"31": [-1, 0], "67": [-1, 0], "103": [1, 0], "139": [1, 0], "140": [-1, 0], "176": [-1, 0], "215": [1, 0], "260": [1, 0], "32": [1, 0], "66": [1, 0], "104": [-1, 0], "138": [-1, 0], "141": [1, 0], "175": [1, 0], "225": [-1, 0], "250": [-1, 0], "33": [-1, 0], "69": [-1, 0], "101": [1, 0], "137": [1, 0], "145": [-1, 0], "190": [-1, 0], "210": [1, 0], "246": [1, 0], "34": [1, 0], "68": [1, 0], "102": [-1, 0], "136": [-1, 0], "155": [1, 0], "180": [1, 0], "211": [-1, 0], "245": [-1, 0]}]} \ No newline at end of file diff --git a/research/complex-small-m-lower-bounds/data/cert_m3_M0.json b/research/complex-small-m-lower-bounds/data/cert_m3_M0.json new file mode 100644 index 0000000000..3be65e03f6 --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m3_M0.json @@ -0,0 +1 @@ +{"m": 3, "k": 4, "p": 1000000009, "I": 569522298, "alpha": 0, "rows": [[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [1, 2, 4, 7], [1, 2, 3, 6], [1, 2, 4, 6], [1, 3, 4, 6], [2, 3, 4, 6], [1, 2, 5, 6], [1, 2, 6, 7], [1, 3, 5, 6], [1, 4, 5, 6], [2, 4, 5, 6], [2, 3, 4, 7], [1, 2, 3, 7], [1, 4, 6, 7], [1, 3, 4, 7], [2, 3, 5, 6], [1, 2, 5, 7], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 7], [2, 3, 5, 7], [3, 4, 5, 7], [1, 5, 6, 7], [2, 4, 5, 7], [3, 4, 5, 6]], "cols": [[0, 1, 2, 3], [0, 1, 2, 4], [0, 1, 2, 5], [0, 1, 2, 6], [0, 1, 2, 7], [0, 1, 3, 4], [0, 1, 3, 5], [0, 1, 3, 6], [0, 1, 3, 7], [0, 1, 4, 5], [0, 1, 4, 6], [0, 1, 4, 7], [0, 1, 5, 6], [0, 1, 5, 7], [0, 1, 6, 7], [0, 2, 3, 4], [0, 2, 3, 5], [0, 2, 3, 6], [0, 2, 3, 7], [0, 2, 4, 5], [0, 2, 4, 6], [0, 2, 4, 7], [0, 2, 5, 6], [0, 2, 5, 7], [0, 2, 6, 7], [0, 4, 5, 6], [0, 4, 5, 7], [0, 4, 6, 7]]} \ No newline at end of file diff --git a/research/complex-small-m-lower-bounds/data/cert_m3_M0_c.txt b/research/complex-small-m-lower-bounds/data/cert_m3_M0_c.txt new file mode 100644 index 0000000000..2f5a07b14c --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m3_M0_c.txt @@ -0,0 +1,29 @@ +m 3 k 4 alpha 0 p 2147483629 I 1518275076 size 28 +30 15 +46 23 +60 27 +78 29 +54 39 +86 43 +142 45 +90 51 +102 53 +150 57 +58 71 +92 75 +154 77 +106 83 +156 85 +166 89 +114 99 +170 101 +172 105 +198 113 +120 135 +108 139 +178 141 +116 147 +180 163 +202 177 +184 197 +210 209 diff --git a/research/complex-small-m-lower-bounds/data/cert_m3_dem.json b/research/complex-small-m-lower-bounds/data/cert_m3_dem.json new file mode 100644 index 0000000000..76678077d8 --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m3_dem.json @@ -0,0 +1 @@ +{"m": 3, "k": 4, "p": 1000000009, "I": 569522298, "map": "Q = (-i)^wt(x xor y) (K up to a nonzero scalar)", "rows": [[0, [1, 2, 3, 4]], [0, [1, 2, 3, 5]], [0, [1, 2, 3, 6]], [0, [1, 2, 3, 7]], [1, [0, 2, 3, 4]], [0, [1, 2, 4, 5]], [0, [1, 2, 4, 6]], [0, [1, 2, 4, 7]], [1, [0, 2, 3, 5]], [0, [1, 2, 5, 6]], [0, [1, 2, 5, 7]], [1, [0, 2, 3, 6]], [0, [1, 2, 6, 7]], [1, [0, 2, 3, 7]], [2, [0, 1, 3, 4]], [0, [1, 3, 4, 5]], [0, [1, 3, 4, 6]], [0, [1, 3, 4, 7]], [1, [0, 2, 4, 5]], [0, [1, 3, 5, 6]], [0, [1, 3, 5, 7]], [1, [0, 2, 4, 6]], [0, [1, 3, 6, 7]], [1, [0, 2, 4, 7]], [2, [0, 1, 3, 5]], [0, [1, 4, 5, 6]], [0, [1, 4, 5, 7]], [1, [0, 2, 5, 6]], [0, [1, 4, 6, 7]], [1, [0, 2, 5, 7]], [2, [0, 1, 3, 6]], [0, [1, 5, 6, 7]], [1, [0, 2, 6, 7]], [2, [0, 1, 3, 7]], [3, [0, 1, 2, 4]], [1, [0, 3, 4, 5]], [1, [0, 3, 4, 6]], [1, [0, 3, 4, 7]], [2, [0, 1, 4, 5]], [3, [0, 1, 2, 5]], [1, [0, 3, 5, 6]], [1, [0, 3, 5, 7]], [2, [0, 1, 4, 6]], [3, [0, 1, 5, 7]], [1, [0, 3, 6, 7]], [2, [0, 1, 4, 7]], [3, [0, 1, 4, 5]], [4, [0, 1, 2, 6]], [5, [0, 1, 3, 7]], [3, [0, 1, 5, 6]], [0, [2, 3, 4, 5]], [0, [2, 3, 4, 6]], [0, [2, 3, 4, 7]], [1, [2, 3, 4, 5]], [0, [2, 3, 5, 6]], [0, [2, 3, 5, 7]], [1, [2, 3, 4, 6]], [0, [2, 3, 6, 7]], [1, [2, 3, 4, 7]], [2, [0, 3, 4, 5]], [0, [2, 4, 5, 6]], [0, [2, 4, 5, 7]], [1, [2, 3, 5, 6]], [0, [2, 4, 6, 7]], [1, [2, 3, 5, 7]], [2, [0, 3, 4, 6]], [0, [2, 5, 6, 7]], [1, [2, 3, 6, 7]], [2, [0, 3, 4, 7]], [3, [1, 2, 4, 5]], [2, [0, 1, 5, 6]], [2, [0, 1, 5, 7]], [3, [0, 1, 4, 6]], [2, [1, 3, 4, 5]], [3, [0, 1, 2, 6]], [2, [0, 3, 5, 6]], [2, [0, 4, 5, 6]], [2, [0, 3, 6, 7]], [3, [0, 2, 6, 7]], [2, [0, 4, 5, 7]], [2, [0, 3, 5, 7]], [3, [0, 2, 4, 6]], [4, [0, 1, 2, 5]], [3, [0, 2, 5, 6]], [6, [0, 2, 3, 7]], [1, [0, 4, 5, 6]], [1, [0, 4, 5, 7]], [2, [1, 3, 4, 6]], [3, [0, 1, 4, 7]], [1, [0, 4, 6, 7]], [2, [1, 3, 4, 7]], [3, [0, 4, 5, 6]], [3, [0, 2, 4, 5]], [4, [0, 1, 3, 7]], [5, [0, 1, 2, 6]], [0, [3, 4, 5, 6]], [0, [3, 4, 5, 7]], [1, [2, 4, 5, 6]], [0, [3, 4, 6, 7]], [1, [2, 4, 5, 7]], [2, [1, 3, 5, 6]], [0, [3, 5, 6, 7]], [1, [2, 4, 6, 7]], [2, [1, 3, 5, 7]], [3, [1, 2, 4, 6]], [3, [0, 1, 2, 7]], [2, [0, 1, 6, 7]], [3, [0, 1, 6, 7]], [2, [1, 4, 5, 6]], [3, [0, 2, 4, 7]], [1, [3, 4, 5, 6]], [1, [3, 4, 5, 7]], [3, [0, 2, 5, 7]], [3, [1, 2, 4, 7]], [1, [0, 5, 6, 7]], [2, [0, 5, 6, 7]], [3, [0, 4, 5, 7]], [3, [0, 4, 6, 7]], [4, [0, 2, 3, 7]], [5, [1, 2, 3, 6]], [2, [1, 3, 6, 7]], [2, [3, 4, 5, 6]], [3, [1, 2, 5, 7]], [3, [1, 2, 6, 7]], [2, [0, 4, 6, 7]], [2, [1, 4, 5, 7]], [3, [0, 5, 6, 7]], [4, [0, 1, 3, 5]], [3, [1, 4, 6, 7]], [6, [1, 2, 3, 7]], [1, [2, 5, 6, 7]], [2, [1, 4, 6, 7]], [3, [1, 2, 5, 6]], [4, [0, 2, 3, 6]], [5, [1, 2, 3, 7]], [3, [2, 4, 5, 7]], [0, [4, 5, 6, 7]], [1, [4, 5, 6, 7]], [2, [4, 5, 6, 7]], [3, [4, 5, 6, 7]], [4, [0, 1, 2, 7]], [4, [0, 1, 3, 6]], [4, [0, 1, 5, 6]], [4, [0, 1, 5, 7]], [5, [0, 1, 4, 6]], [4, [0, 2, 3, 5]], [4, [0, 2, 5, 6]], [4, [0, 2, 5, 7]], [5, [0, 2, 4, 6]], [4, [0, 3, 5, 6]], [4, [0, 3, 5, 7]], [5, [0, 3, 4, 6]], [4, [0, 5, 6, 7]], [5, [0, 4, 6, 7]], [6, [0, 4, 5, 7]], [4, [1, 2, 3, 5]], [2, [1, 5, 6, 7]], [3, [1, 5, 6, 7]], [4, [1, 2, 3, 7]], [1, [3, 4, 6, 7]], [4, [1, 2, 3, 6]], [3, [1, 4, 5, 6]], [4, [0, 1, 6, 7]], [5, [0, 1, 2, 7]], [4, [0, 2, 6, 7]], [4, [1, 2, 5, 7]], [2, [3, 4, 5, 7]], [3, [2, 4, 5, 6]], [4, [0, 3, 6, 7]], [4, [1, 2, 5, 6]], [6, [0, 1, 2, 7]], [4, [1, 5, 6, 7]], [4, [1, 3, 5, 6]], [5, [0, 1, 3, 6]], [4, [1, 2, 6, 7]], [5, [0, 1, 6, 7]], [5, [0, 1, 4, 7]], [4, [1, 3, 5, 7]], [5, [0, 2, 4, 7]], [5, [0, 2, 3, 6]], [1, [3, 5, 6, 7]], [3, [1, 4, 5, 7]], [4, [1, 3, 6, 7]], [2, [3, 4, 6, 7]], [5, [0, 3, 4, 7]], [3, [2, 5, 6, 7]], [5, [1, 2, 4, 7]], [5, [1, 3, 4, 6]], [5, [0, 2, 3, 7]], [4, [2, 3, 5, 6]], [4, [2, 3, 6, 7]], [5, [0, 2, 6, 7]], [4, [2, 5, 6, 7]], [5, [1, 3, 4, 7]], [5, [0, 3, 6, 7]], [5, [1, 4, 6, 7]], [6, [1, 4, 5, 7]], [5, [2, 3, 4, 7]], [5, [1, 2, 4, 6]], [5, [1, 2, 6, 7]], [5, [1, 3, 6, 7]], [5, [2, 3, 6, 7]], [5, [3, 4, 6, 7]], [6, [0, 1, 3, 7]], [4, [2, 3, 5, 7]], [5, [2, 3, 4, 6]], [2, [3, 5, 6, 7]], [3, [2, 4, 6, 7]], [6, [0, 1, 4, 7]], [6, [0, 2, 4, 7]], [6, [0, 2, 5, 7]], [6, [0, 3, 4, 7]], [6, [1, 2, 5, 7]], [6, [1, 2, 4, 7]], [6, [0, 1, 5, 7]], [6, [2, 3, 4, 7]], [6, [0, 3, 5, 7]], [6, [1, 3, 4, 7]], [6, [1, 3, 5, 7]], [6, [2, 3, 5, 7]], [4, [3, 5, 6, 7]], [5, [2, 4, 6, 7]], [6, [2, 4, 5, 7]], [6, [3, 4, 5, 7]]], "cols": [[0, [0, 1, 2, 3]], [0, [0, 1, 2, 4]], [0, [0, 1, 2, 5]], [0, [0, 1, 2, 6]], [0, [0, 1, 2, 7]], [0, [0, 1, 3, 4]], [0, [0, 1, 3, 5]], [0, [0, 1, 3, 6]], [0, [0, 1, 3, 7]], [0, [0, 1, 4, 5]], [0, [0, 1, 4, 6]], [0, [0, 1, 4, 7]], [0, [0, 1, 5, 6]], [0, [0, 1, 5, 7]], [0, [0, 1, 6, 7]], [0, [0, 2, 3, 4]], [0, [0, 2, 3, 5]], [0, [0, 2, 3, 6]], [0, [0, 2, 3, 7]], [0, [0, 2, 4, 5]], [0, [0, 2, 4, 6]], [0, [0, 2, 4, 7]], [0, [0, 2, 5, 6]], [0, [0, 2, 5, 7]], [0, [0, 2, 6, 7]], [0, [0, 3, 4, 5]], [0, [0, 3, 4, 6]], [0, [0, 3, 4, 7]], [0, [0, 3, 5, 6]], [0, [0, 3, 5, 7]], [0, [0, 3, 6, 7]], [0, [0, 4, 5, 6]], [0, [0, 4, 5, 7]], [0, [0, 4, 6, 7]], [0, [0, 5, 6, 7]], [1, [0, 1, 2, 3]], [1, [0, 1, 2, 4]], [1, [0, 1, 2, 5]], [1, [0, 1, 2, 6]], [1, [0, 1, 2, 7]], [1, [0, 1, 3, 4]], [1, [0, 1, 3, 5]], [1, [0, 1, 3, 6]], [1, [0, 1, 3, 7]], [1, [0, 1, 4, 5]], [1, [0, 1, 4, 6]], [1, [0, 1, 4, 7]], [1, [0, 1, 5, 6]], [1, [0, 1, 5, 7]], [1, [0, 1, 6, 7]], [1, [1, 2, 3, 4]], [1, [1, 2, 3, 5]], [1, [1, 2, 3, 6]], [1, [1, 2, 3, 7]], [1, [1, 2, 4, 5]], [1, [1, 2, 4, 6]], [1, [1, 2, 4, 7]], [1, [1, 2, 5, 6]], [1, [1, 2, 5, 7]], [1, [1, 2, 6, 7]], [1, [1, 3, 4, 5]], [1, [1, 3, 4, 6]], [1, [1, 3, 4, 7]], [1, [1, 3, 5, 6]], [1, [1, 3, 5, 7]], [1, [1, 3, 6, 7]], [1, [1, 4, 5, 6]], [1, [1, 4, 5, 7]], [1, [1, 4, 6, 7]], [1, [1, 5, 6, 7]], [2, [0, 1, 2, 3]], [2, [0, 1, 2, 4]], [2, [0, 1, 2, 5]], [2, [0, 1, 2, 6]], [2, [0, 1, 2, 7]], [2, [0, 2, 3, 4]], [2, [0, 2, 3, 5]], [2, [0, 2, 3, 6]], [2, [0, 2, 3, 7]], [2, [0, 2, 4, 5]], [2, [0, 2, 4, 6]], [2, [0, 2, 4, 7]], [2, [0, 2, 5, 6]], [2, [0, 2, 5, 7]], [2, [0, 2, 6, 7]], [2, [1, 2, 3, 4]], [2, [1, 2, 3, 5]], [2, [1, 2, 3, 6]], [2, [1, 2, 3, 7]], [2, [1, 2, 4, 5]], [2, [1, 2, 4, 6]], [2, [1, 2, 4, 7]], [2, [1, 2, 5, 6]], [2, [1, 2, 5, 7]], [2, [1, 2, 6, 7]], [2, [2, 3, 4, 5]], [2, [2, 3, 4, 6]], [2, [2, 3, 4, 7]], [2, [2, 3, 5, 6]], [2, [2, 3, 5, 7]], [2, [2, 3, 6, 7]], [2, [2, 4, 5, 6]], [2, [2, 4, 5, 7]], [2, [2, 4, 6, 7]], [2, [2, 5, 6, 7]], [3, [0, 1, 2, 3]], [3, [0, 1, 3, 4]], [3, [0, 1, 3, 5]], [3, [0, 1, 3, 6]], [3, [0, 1, 3, 7]], [3, [0, 2, 3, 4]], [3, [0, 2, 3, 5]], [3, [0, 2, 3, 6]], [3, [0, 2, 3, 7]], [3, [0, 3, 4, 5]], [3, [0, 3, 4, 6]], [3, [0, 3, 4, 7]], [3, [0, 3, 5, 6]], [3, [0, 3, 5, 7]], [3, [0, 3, 6, 7]], [3, [1, 2, 3, 4]], [3, [1, 2, 3, 5]], [3, [1, 2, 3, 6]], [3, [1, 2, 3, 7]], [3, [1, 3, 4, 5]], [3, [1, 3, 4, 6]], [3, [1, 3, 4, 7]], [3, [1, 3, 5, 6]], [3, [1, 3, 5, 7]], [3, [1, 3, 6, 7]], [3, [2, 3, 4, 5]], [3, [2, 3, 4, 6]], [3, [2, 3, 4, 7]], [3, [2, 3, 5, 6]], [3, [2, 3, 5, 7]], [3, [2, 3, 6, 7]], [3, [3, 4, 5, 6]], [3, [3, 4, 5, 7]], [3, [3, 4, 6, 7]], [3, [3, 5, 6, 7]], [4, [0, 1, 2, 4]], [4, [0, 1, 3, 4]], [4, [0, 1, 4, 5]], [4, [0, 1, 4, 6]], [4, [0, 1, 4, 7]], [4, [0, 2, 3, 4]], [4, [0, 2, 4, 5]], [4, [0, 2, 4, 6]], [4, [0, 2, 4, 7]], [4, [0, 3, 4, 5]], [4, [0, 3, 4, 6]], [4, [0, 3, 4, 7]], [4, [0, 4, 5, 6]], [4, [0, 4, 5, 7]], [4, [0, 4, 6, 7]], [4, [1, 2, 3, 4]], [4, [1, 2, 4, 5]], [4, [1, 2, 4, 6]], [4, [1, 2, 4, 7]], [4, [1, 3, 4, 5]], [4, [1, 3, 4, 6]], [4, [1, 3, 4, 7]], [4, [1, 4, 5, 6]], [4, [1, 4, 5, 7]], [4, [1, 4, 6, 7]], [4, [2, 3, 4, 5]], [4, [2, 3, 4, 6]], [4, [2, 3, 4, 7]], [4, [2, 4, 5, 6]], [4, [2, 4, 5, 7]], [4, [2, 4, 6, 7]], [4, [3, 4, 5, 6]], [4, [3, 4, 5, 7]], [4, [3, 4, 6, 7]], [5, [0, 1, 2, 5]], [5, [0, 1, 3, 5]], [5, [0, 1, 4, 5]], [5, [0, 1, 5, 6]], [5, [0, 1, 5, 7]], [5, [0, 2, 3, 5]], [5, [0, 2, 4, 5]], [5, [0, 2, 5, 6]], [5, [0, 2, 5, 7]], [5, [0, 3, 4, 5]], [5, [0, 3, 5, 6]], [5, [0, 3, 5, 7]], [5, [0, 4, 5, 6]], [5, [0, 4, 5, 7]], [5, [1, 2, 3, 5]], [5, [1, 2, 4, 5]], [5, [1, 2, 5, 6]], [5, [1, 2, 5, 7]], [5, [1, 3, 4, 5]], [5, [1, 3, 5, 6]], [5, [1, 3, 5, 7]], [5, [1, 4, 5, 6]], [5, [1, 4, 5, 7]], [5, [2, 3, 4, 5]], [5, [2, 3, 5, 6]], [5, [2, 3, 5, 7]], [5, [2, 4, 5, 6]], [5, [2, 4, 5, 7]], [5, [3, 4, 5, 6]], [5, [3, 4, 5, 7]], [6, [0, 1, 2, 6]], [6, [0, 1, 3, 6]], [6, [0, 1, 4, 6]], [6, [0, 1, 5, 6]], [6, [0, 2, 3, 6]], [6, [0, 2, 4, 6]], [6, [0, 2, 5, 6]], [6, [0, 3, 4, 6]], [6, [0, 3, 5, 6]], [6, [0, 4, 5, 6]], [6, [1, 2, 3, 6]], [6, [1, 2, 4, 6]], [6, [1, 2, 5, 6]], [6, [1, 3, 4, 6]], [6, [1, 3, 5, 6]], [6, [1, 4, 5, 6]], [6, [2, 3, 4, 6]], [6, [2, 3, 5, 6]], [6, [2, 4, 5, 6]], [6, [3, 4, 5, 6]]]} \ No newline at end of file diff --git a/research/complex-small-m-lower-bounds/data/cert_m4_M0.txt b/research/complex-small-m-lower-bounds/data/cert_m4_M0.txt new file mode 100644 index 0000000000..254beec522 --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m4_M0.txt @@ -0,0 +1,5413 @@ +m 4 k 8 alpha 0 p 2147483629 I 1518275076 size 5412 +510 255 +766 383 +1020 447 +1278 479 +2302 495 +4350 503 +8446 507 +16638 509 +894 639 +1406 703 +2430 735 +4478 751 +8574 759 +16766 763 +33022 765 +990 831 +958 863 +1014 879 +1006 887 +1530 891 +1018 893 +1662 927 +1886 943 +1854 951 +1910 955 +1470 957 +1758 975 +1726 983 +1782 987 +1774 989 +1950 999 +2006 1003 +1902 1005 +1974 1011 +1966 1013 +1998 1017 +1502 1151 +1786 1215 +2494 1247 +4542 1263 +8638 1271 +16830 1275 +33214 1277 +1526 1343 +1518 1375 +1532 1391 +1788 1399 +1978 1403 +1914 1405 +1980 1439 +1916 1455 +2010 1463 +2022 1467 +2026 1469 +2526 1487 +2012 1495 +2542 1499 +2550 1501 +2034 1511 +2878 1515 +2974 1517 +2028 1523 +2036 1525 +2910 1529 +2040 1599 +2554 1631 +2750 1647 +2686 1655 +2556 1659 +2798 1661 +2782 1695 +3002 1711 +2938 1719 +2806 1723 +2810 1725 +3294 1743 +3198 1751 +2926 1755 +3034 1757 +3422 1767 +2990 1771 +3004 1773 +2934 1779 +2940 1781 +3022 1785 +2812 1823 +2998 1839 +3030 1847 +3036 1851 +3046 1853 +3390 1871 +3438 1879 +3050 1883 +3446 1885 +3694 1895 +3052 1899 +3058 1901 +3262 1907 +3542 1909 +3310 1913 +3646 1935 +3060 1943 +3064 1947 +3318 1949 +3450 1959 +3486 1963 +3502 1965 +3894 1971 +3452 1973 +3510 1977 +3534 1991 +3546 1995 +3548 1997 +3514 2003 +3926 2005 +3516 2009 +3558 2019 +3706 2021 +3742 2025 +3898 2033 +3322 2175 +3324 2239 +3562 2271 +4574 2287 +8670 2295 +16862 2299 +33246 2301 +3564 2367 +3758 2399 +3766 2415 +3770 2423 +3570 2427 +3772 2429 +3572 2463 +3790 2479 +3576 2487 +3678 2491 +3702 2493 +3826 2511 +3900 2519 +3818 2523 +3832 2525 +4590 2535 +3798 2539 +3946 2541 +3708 2547 +3960 2549 +3930 2553 +3932 2623 +3990 2655 +4958 2671 +4734 2679 +4988 2683 +3942 2685 +5438 2719 +5470 2735 +5246 2743 +5494 2747 +3814 2749 +5534 2767 +4830 2775 +5366 2779 +3828 2781 +5342 2791 +5590 2795 +3994 2797 +5486 2803 +3802 2805 +3804 2809 +3820 2847 +4974 2863 +4926 2871 +4982 2875 +4798 2877 +3948 2895 +4860 2903 +4986 2907 +5022 2909 +5038 2919 +5078 2923 +5046 2925 +4854 2931 +3870 2933 +3886 2937 +4006 2959 +5498 2967 +5726 2971 +5052 2973 +5966 2983 +5974 2987 +5082 2989 +5750 2995 +4858 2997 +5070 3001 +5084 3015 +5112 3019 +5310 3021 +5050 3027 +3996 3029 +4010 3033 +5108 3043 +5106 3045 +5550 3049 +5558 3057 +5742 3135 +5500 3167 +5838 3183 +5562 3191 +5754 3195 +5934 3197 +6462 3231 +6494 3247 +5582 3255 +6334 3259 +6366 3261 +6558 3279 +5594 3287 +6394 3291 +6586 3293 +5942 3303 +6618 3307 +6766 3309 +4080 3315 +5756 3317 +6522 3321 +3918 3359 +4044 3375 +5694 3383 +5618 3387 +5370 3389 +5790 3407 +5624 3415 +6830 3419 +5564 3421 +6862 3431 +5806 3435 +5596 3437 +5620 3443 +5372 3445 +5814 3449 +5818 3471 +5820 3479 +5846 3483 +6574 3485 +6838 3495 +6958 3499 +6042 3501 +5850 3507 +5852 3509 +5862 3513 +6966 3527 +7054 3531 +7066 3533 +5866 3539 +5874 3541 +6842 3545 +5880 3555 +5918 3557 +5946 3561 +7278 3569 +3982 3615 +5948 3631 +5868 3639 +5876 3643 +5994 3645 +6942 3663 +6008 3671 +6990 3675 +6030 3677 +7374 3687 +5978 3691 +6038 3693 +5980 3699 +6054 3701 +6058 3705 +7454 3727 +6060 3735 +6072 3739 +6972 3741 +7502 3751 +7510 3755 +6814 3757 +5990 3763 +6068 3765 +5996 3769 +7382 3783 +7566 3787 +7578 3789 +6086 3795 +6270 3797 +6582 3801 +6510 3811 +6606 3813 +6614 3817 +6390 3825 +7470 3855 +7710 3863 +10014 3867 +18206 3869 +11038 3879 +19230 3883 +34590 3885 +6002 3891 +6044 3893 +6090 3897 +11550 3911 +19742 3915 +35614 3917 +6114 3923 +6004 3925 +6128 3929 +6098 3939 +6518 3941 +6642 3945 +6750 3953 +11806 3975 +19998 3979 +36126 3981 +6092 3987 +6718 3989 +6648 3993 +6998 4003 +6778 4005 +6780 4009 +8926 4017 +6844 4035 +7478 4037 +7484 4041 +17118 4049 +33150 4065 +3954 4223 +3956 4287 +4020 4319 +4598 4335 +8686 4343 +16878 4347 +33262 4349 +6066 4415 +6100 4447 +4846 4463 +4602 4471 +4604 4475 +5094 4477 +6104 4511 +5358 4527 +5098 4535 +5100 4539 +5606 4541 +6382 4559 +5612 4567 +6588 4571 +5610 4573 +6120 4583 +6116 4587 +6630 4589 +6524 4595 +6634 4597 +6620 4601 +6396 4671 +6636 4703 +4038 4719 +6644 4727 +6774 4731 +6870 4733 +6874 4767 +4012 4783 +6876 4791 +6886 4795 +6890 4797 +6892 4815 +6898 4823 +6900 4827 +6904 4829 +6970 4839 +8942 4843 +7002 4845 +8700 4851 +7004 4853 +7018 4857 +7020 4895 +7028 4911 +7026 4919 +9022 4923 +7032 4925 +7062 4943 +7014 4951 +7068 4955 +7078 4957 +7082 4967 +7084 4971 +7090 4973 +12606 4979 +7092 4981 +7110 4985 +7114 5007 +7116 5015 +7122 5019 +7124 5021 +7128 5031 +7138 5035 +7140 5037 +12862 5043 +7144 5045 +7152 5049 +7230 5063 +7262 5067 +7286 5069 +7290 5075 +7292 5077 +7326 5081 +7342 5091 +7350 5093 +7354 5097 +7356 5105 +7386 5183 +7388 5215 +7398 5231 +7402 5239 +7404 5243 +7410 5245 +7412 5279 +7740 5295 +7416 5303 +7482 5307 +7514 5309 +4042 5327 +7516 5335 +8694 5339 +8698 5341 +8830 5351 +7526 5355 +9084 5357 +8894 5363 +8956 5365 +9118 5369 +7530 5407 +7532 5423 +7538 5431 +7540 5435 +7544 5437 +7574 5455 +7580 5463 +7590 5467 +17758 5469 +7594 5479 +7596 5483 +7602 5485 +12638 5491 +20830 5493 +7604 5497 +8950 5519 +7608 5527 +7622 5531 +7626 5533 +7634 5543 +7650 5547 +7652 5549 +12654 5555 +7656 5557 +7664 5561 +7782 5575 +7786 5579 +7788 5581 +13406 5587 +21598 5589 +7794 5593 +7800 5603 +7846 5605 +7850 5609 +7852 5617 +7858 5663 +7796 5679 +7860 5687 +7864 5691 +7878 5693 +7882 5711 +7884 5719 +7906 5723 +8954 5725 +7890 5735 +7912 5739 +33470 5741 +9070 5747 +16886 5749 +33502 5753 +9054 5775 +7920 5783 +7892 5787 +7974 5789 +7896 5799 +7908 5803 +7978 5805 +9078 5811 +7980 5813 +7986 5817 +7988 5831 +7992 5835 +8006 5837 +8010 5843 +17022 5845 +8012 5849 +9204 5859 +17086 5861 +33982 5865 +8034 5873 +7726 5903 +7734 5911 +7758 5915 +7738 5917 +8018 5927 +8020 5931 +7830 5933 +13086 5939 +7822 5941 +7766 5945 +8040 5959 +8024 5963 +8048 5965 +13598 5971 +21790 5973 +9082 5977 +9134 5987 +17534 5989 +33406 5993 +9142 6001 +8070 6023 +8074 6027 +9146 6029 +8036 6035 +8082 6037 +8084 6041 +9148 6051 +9166 6053 +9174 6057 +9178 6065 +9180 6083 +9190 6085 +9194 6089 +9196 6097 +9202 6113 +9208 6207 +9342 6239 +9406 6255 +9438 6263 +9454 6267 +9462 6269 +9466 6303 +9468 6319 +9534 6327 +9566 6331 +9582 6333 +9590 6351 +9594 6359 +9596 6363 +9630 6365 +9646 6375 +9654 6379 +9658 6381 +9660 6387 +9678 6389 +9686 6393 +8088 6431 +8098 6447 +9690 6455 +9692 6459 +9702 6461 +9706 6479 +9708 6487 +9714 6491 +9716 6493 +9720 6503 +9790 6507 +9822 6509 +12662 6515 +12666 6517 +9838 6521 +9850 6543 +9852 6551 +9886 6555 +9902 6557 +9910 6567 +9914 6571 +9916 6573 +12718 6579 +12668 6581 +12730 6585 +9934 6599 +9942 6603 +9946 6605 +12894 6611 +13430 6613 +13110 6617 +9948 6627 +9962 6629 +9964 6633 +9970 6641 +9972 6687 +8130 6703 +9976 6711 +10030 6715 +10038 6717 +10042 6735 +10044 6743 +10062 6747 +10070 6749 +10074 6759 +10076 6763 +10090 6765 +10092 6771 +10098 6773 +10100 6777 +10104 6799 +10126 6807 +10134 6811 +10138 6813 +10430 6823 +10926 6827 +10140 6829 +10150 6835 +10154 6837 +10156 6841 +10162 6855 +10164 6859 +10168 6861 +10182 6867 +10186 6869 +10188 6873 +10194 6883 +10196 6885 +10200 6889 +10210 6897 +7770 6927 +7834 6935 +7772 6939 +7958 6941 +10212 6951 +10216 6955 +10224 6957 +13102 6963 +7964 6965 +10366 6969 +10462 6983 +10478 6987 +10486 6989 +13134 6995 +13622 6997 +10490 7001 +10492 7011 +10558 7013 +10590 7017 +10606 7025 +10614 7047 +11068 7051 +10618 7053 +13198 7059 +13626 7061 +13654 7065 +10620 7075 +10654 7077 +10670 7081 +10678 7089 +10682 7107 +10684 7109 +10702 7113 +10710 7121 +10714 7137 +10716 7199 +10726 7215 +10730 7223 +10732 7227 +10738 7229 +8100 7247 +10740 7255 +10744 7259 +10814 7261 +10846 7271 +10862 7275 +10870 7277 +10874 7283 +16890 7285 +16892 7289 +10876 7311 +10910 7319 +10934 7323 +10940 7325 +10958 7335 +10966 7339 +10970 7341 +10972 7347 +10994 7349 +10996 7353 +11470 7367 +17134 7371 +13142 7373 +17142 7379 +17270 7381 +17274 7385 +17598 7395 +17146 7397 +17148 7401 +11054 7409 +7836 7439 +7950 7447 +11062 7451 +7962 7453 +11066 7463 +11086 7467 +11094 7469 +13434 7475 +11098 7477 +11100 7481 +11114 7495 +11116 7499 +13658 7501 +13646 7507 +21838 7509 +13526 7513 +11122 7523 +17630 7525 +17214 7529 +11124 7537 +11128 7559 +11150 7563 +11158 7565 +13614 7571 +13684 7573 +13628 7577 +11162 7587 +11164 7589 +11186 7593 +11188 7601 +17646 7619 +17774 7621 +17782 7625 +11206 7633 +11358 7649 +11210 7695 +11212 7703 +11218 7707 +11382 7709 +11220 7719 +11234 7723 +11236 7725 +11326 7731 +11374 7733 +11386 7737 +11388 7751 +11422 7755 +11478 7757 +12414 7763 +17726 7765 +11438 7769 +11446 7779 +17246 7781 +33518 7785 +11450 7793 +11484 7815 +11482 7819 +11494 7821 +12478 7827 +13422 7829 +13486 7833 +11498 7843 +11506 7845 +11508 7849 +11512 7857 +17276 7875 +17338 7877 +17340 7881 +12534 7889 +11566 7905 +12046 7943 +20238 7947 +36382 7949 +12702 7955 +12758 7957 +12726 7961 +12538 7971 +12510 7973 +12526 7977 +12750 7985 +12540 8003 +13660 8005 +12774 8009 +13674 8017 +12910 8033 +12732 8067 +13518 8069 +12918 8073 +13146 8081 +12762 8097 +13470 8129 +4018 8319 +4024 8383 +4050 8415 +8076 8431 +11224 8439 +17310 8443 +33270 8445 +12764 8511 +11574 8543 +8112 8559 +11580 8567 +11598 8571 +11606 8573 +11610 8607 +8104 8623 +11452 8631 +11500 8635 +11612 8637 +8132 8655 +11622 8663 +11626 8667 +11628 8669 +11578 8679 +11634 8683 +11248 8685 +11636 8691 +11640 8693 +11662 8697 +11670 8767 +11674 8799 +11676 8815 +11686 8823 +11690 8827 +11692 8829 +11698 8863 +11000 8879 +11700 8887 +10988 8891 +11704 8893 +11718 8911 +11730 8919 +17658 8923 +11732 8925 +17786 8935 +17822 8939 +11736 8941 +17372 8947 +11746 8949 +11760 8953 +13116 8991 +11822 9007 +9846 9015 +11830 9019 +11724 9021 +11834 9039 +7096 9047 +11836 9051 +7636 9053 +11854 9063 +11862 9067 +11866 9069 +12778 9075 +11868 9077 +11882 9081 +11884 9103 +11890 9111 +11892 9115 +11896 9117 +11918 9127 +11180 9131 +11926 9133 +12922 9139 +11930 9141 +12974 9145 +11954 9159 +12016 9163 +12054 9165 +12058 9171 +12060 9173 +12070 9177 +12780 9187 +12074 9189 +12082 9193 +12084 9201 +11752 9279 +12088 9311 +12102 9327 +12786 9335 +17262 9339 +12106 9341 +12108 9375 +12114 9391 +11932 9399 +12116 9403 +12120 9405 +17334 9423 +17326 9431 +17358 9435 +12924 9437 +17388 9447 +17396 9451 +12788 9453 +17370 9459 +12792 9461 +12130 9465 +12132 9503 +12136 9519 +12144 9527 +12166 9531 +12170 9533 +12958 9551 +12982 9559 +12986 9563 +11956 9565 +7628 9575 +11722 9579 +7640 9581 +12988 9587 +11978 9589 +12172 9593 +12178 9615 +12180 9623 +12184 9627 +13006 9629 +13014 9639 +13018 9643 +11974 9645 +13020 9651 +13030 9653 +13034 9657 +13036 9671 +13042 9675 +11986 9677 +13044 9683 +12194 9685 +13048 9689 +13114 9699 +13148 9701 +13158 9705 +13162 9713 +13164 9759 +11748 9775 +11988 9783 +13172 9787 +13176 9789 +13206 9807 +13210 9815 +13212 9819 +13222 9821 +13228 9831 +13236 9835 +13240 9837 +13254 9843 +11992 9845 +12002 9849 +13260 9871 +13266 9879 +13282 9883 +13374 9885 +13436 9895 +11948 9899 +13494 9901 +13498 9907 +13500 9909 +13530 9913 +11980 9927 +13532 9931 +12004 9933 +13542 9939 +13546 9941 +13548 9945 +17400 9955 +13554 9957 +13556 9961 +13560 9969 +13670 9999 +13676 10007 +13682 10011 +13688 10013 +13710 10023 +13718 10027 +13722 10029 +13724 10035 +13734 10037 +13738 10041 +13740 10055 +17394 10059 +13746 10061 +13748 10067 +13226 10069 +13752 10073 +13766 10083 +13770 10085 +13772 10089 +13778 10097 +13780 10119 +13784 10123 +13794 10125 +13796 10131 +13800 10133 +13808 10137 +13854 10147 +13870 10149 +13878 10153 +13882 10161 +13884 10179 +13902 10181 +13910 10185 +13914 10193 +17654 10209 +12208 10303 +17366 10335 +17660 10351 +17788 10359 +17838 10363 +13916 10365 +17846 10399 +17850 10415 +17852 10423 +17870 10427 +13930 10429 +17878 10447 +17882 10455 +17894 10459 +13932 10461 +17898 10471 +17900 10475 +13940 10477 +17906 10483 +13944 10485 +13966 10489 +13974 10527 +13978 10543 +13980 10551 +13990 10555 +13996 10557 +14002 10575 +14004 10583 +14008 10587 +14022 10589 +14026 10599 +14028 10603 +14034 10605 +14036 10611 +14040 10613 +14056 10617 +17382 10639 +17982 10647 +14064 10651 +14094 10653 +14102 10663 +14106 10667 +14108 10669 +17884 10675 +14122 10677 +14124 10681 +17908 10695 +18014 10699 +14132 10701 +18268 10707 +14136 10709 +14150 10713 +18558 10723 +14154 10725 +14156 10729 +14162 10737 +12076 10783 +11192 10799 +12196 10807 +11960 10811 +14164 10813 +17912 10831 +18038 10839 +18030 10843 +14168 10845 +18042 10855 +18044 10859 +14184 10861 +18078 10867 +14214 10869 +14218 10873 +18094 10895 +18262 10903 +20846 10907 +14220 10909 +18292 10919 +21846 10923 +11240 10925 +20854 10931 +14226 10933 +12008 10937 +18102 10951 +18284 10955 +14228 10957 +18782 10963 +14232 10965 +14244 10969 +20950 10979 +18134 10981 +18388 10985 +12226 10993 +14248 11023 +14256 11031 +14398 11035 +14430 11037 +14446 11047 +14454 11051 +14458 11053 +14460 11059 +14494 11061 +14510 11065 +18140 11079 +18806 11083 +14518 11085 +21110 11091 +14522 11093 +14542 11097 +21334 11107 +14550 11109 +14554 11113 +14556 11121 +19038 11143 +20860 11147 +14566 11149 +24950 11155 +14570 11157 +14572 11161 +25206 11171 +14578 11173 +14580 11177 +14584 11185 +18164 11203 +14622 11205 +14638 11209 +14646 11217 +18106 11233 +14524 11295 +18254 11311 +14650 11319 +14652 11323 +14670 11325 +18108 11343 +14678 11351 +14682 11355 +14684 11357 +14694 11367 +14698 11371 +14700 11373 +18222 11379 +14706 11381 +14708 11385 +19550 11407 +18230 11415 +18296 11419 +14712 11421 +18266 11431 +19798 11435 +14734 11437 +18236 11443 +14742 11445 +18126 11449 +14746 11463 +18290 11467 +18234 11469 +18318 11475 +18138 11477 +18326 11481 +18750 11491 +18156 11493 +18374 11497 +18342 11505 +14748 11535 +14758 11543 +14764 11547 +14770 11549 +14772 11559 +18380 11563 +14776 11565 +14790 11571 +14794 11573 +14796 11577 +18162 11591 +18332 11595 +14802 11597 +20606 11603 +13994 11605 +14804 11609 +18678 11619 +14808 11621 +14818 11625 +14820 11633 +18386 11655 +19006 11659 +14832 11661 +21054 11667 +14878 11669 +14894 11673 +18932 11683 +14902 11685 +14906 11689 +14908 11697 +20670 11715 +18168 11717 +18348 11721 +18282 11729 +18798 11745 +14926 11791 +18416 11799 +14934 11803 +14938 11805 +18622 11815 +21340 11819 +14940 11821 +19316 11827 +14954 11829 +14956 11833 +19260 11847 +19828 11851 +15118 11853 +20798 11859 +14962 11861 +14964 11865 +21806 11875 +18330 11877 +18354 11881 +18356 11889 +19772 11911 +20054 11915 +14968 11917 +24702 11923 +18360 11925 +14990 11929 +25150 11939 +18670 11941 +21364 11945 +14998 11953 +20702 11971 +18392 11973 +18654 11977 +19186 11985 +19188 12001 +15002 12039 +20246 12043 +36630 12045 +15126 12051 +15004 12053 +15020 12057 +19790 12067 +15028 12069 +15032 12073 +15046 12081 +20726 12099 +15630 12101 +18378 12105 +15052 12113 +20718 12129 +21174 12163 +15638 12165 +18684 12169 +15058 12177 +20858 12193 +18404 12225 +15060 12351 +15064 12383 +18402 12399 +17386 12407 +18682 12411 +18154 12413 +18346 12447 +18810 12463 +18812 12471 +18846 12475 +15088 12477 +18862 12495 +18870 12503 +18874 12507 +18876 12509 +18894 12519 +18902 12523 +18906 12525 +18908 12531 +18918 12533 +18922 12537 +15130 12575 +15132 12591 +9958 12599 +13296 12603 +13938 12605 +15148 12623 +10982 12631 +11110 12635 +14050 12637 +13170 12647 +14052 12651 +14178 12653 +14274 12659 +14762 12661 +14824 12665 +15156 12687 +15174 12695 +15178 12699 +14192 12701 +15180 12711 +15186 12715 +15188 12717 +15192 12723 +15202 12725 +15204 12729 +14242 12743 +15208 12747 +15390 12749 +18150 12755 +18408 12757 +15406 12761 +18924 12771 +15414 12773 +15420 12777 +18930 12785 +15438 12831 +15446 12847 +10086 12855 +15450 12859 +15216 12861 +18936 12879 +13234 12887 +14180 12891 +15026 12893 +15238 12903 +15452 12907 +15250 12909 +18278 12915 +15462 12917 +15466 12921 +19054 12943 +15468 12951 +19062 12955 +15474 12957 +19066 12967 +15076 12971 +15502 12973 +19068 12979 +15510 12981 +15514 12985 +15516 12999 +19102 13003 +19118 13005 +19126 13011 +19130 13013 +19132 13017 +19150 13027 +19158 13029 +19162 13033 +19164 13041 +16134 13071 +11878 13079 +15526 13083 +15558 13085 +13926 13095 +21302 13099 +15562 13101 +15564 13107 +25398 13109 +37686 13113 +14950 13127 +19174 13131 +15570 13133 +15572 13139 +15050 13141 +15244 13145 +28982 13155 +15576 13157 +15586 13161 +41782 13169 +15588 13191 +19178 13195 +15642 13197 +15654 13203 +15644 13205 +15658 13209 +29238 13219 +15686 13221 +15690 13225 +45366 13233 +19180 13251 +19254 13253 +33526 13257 +19192 13265 +19278 13281 +16138 13343 +19286 13359 +19246 13367 +19290 13371 +15810 13373 +19258 13391 +11174 13399 +15660 13403 +15242 13405 +15692 13415 +15666 13419 +16146 13421 +19292 13427 +19302 13429 +19306 13433 +19308 13455 +19314 13463 +19320 13467 +15750 13469 +19342 13479 +19350 13483 +19354 13485 +19356 13491 +19366 13493 +19370 13497 +16066 13511 +19372 13515 +19378 13517 +19380 13523 +19384 13525 +19398 13529 +19402 13539 +19404 13541 +19410 13545 +19412 13553 +19416 13583 +11942 13591 +14118 13595 +14130 13597 +15142 13607 +15754 13611 +15154 13613 +15756 13619 +15080 13621 +15592 13625 +15014 13639 +15146 13643 +15698 13645 +19426 13651 +21862 13653 +19428 13657 +19440 13667 +19518 13669 +19566 13673 +19574 13681 +15700 13703 +15812 13707 +16194 13709 +15886 13715 +15252 13717 +15942 13721 +16162 13731 +19578 13733 +16196 13737 +19580 13745 +19614 13763 +19630 13765 +19638 13769 +19642 13777 +19644 13793 +19662 13839 +19432 13847 +19670 13851 +15704 13853 +19674 13863 +19676 13867 +15714 13869 +19686 13875 +19690 13877 +19692 13881 +19698 13895 +19700 13899 +19758 13901 +19766 13907 +20894 13909 +19770 13913 +19802 13923 +19804 13925 +33630 13929 +19814 13937 +19818 13959 +15946 13963 +19820 13965 +19826 13971 +19832 13973 +19854 13977 +19862 13987 +19866 13989 +19868 13993 +19878 14001 +20910 14019 +19882 14021 +19884 14025 +19890 14033 +20918 14049 +19892 14087 +19896 14091 +19910 14093 +19914 14099 +15266 14101 +19916 14105 +29462 14115 +19922 14117 +19924 14121 +45622 14129 +20922 14147 +20956 14149 +20924 14153 +20730 14161 +20732 14177 +20942 14211 +19938 14213 +19940 14217 +19952 14225 +20014 14241 +21086 14273 +20022 14367 +20026 14383 +20028 14391 +21350 14395 +15762 14397 +20046 14415 +20058 14423 +20060 14427 +20070 14429 +20074 14439 +20076 14443 +20082 14445 +20084 14451 +20088 14453 +20110 14457 +20118 14479 +20122 14487 +20124 14491 +20134 14493 +20294 14503 +21460 14507 +20138 14509 +20140 14515 +20146 14517 +20148 14521 +16258 14535 +20152 14539 +20166 14541 +20170 14547 +20178 14549 +20208 14553 +20966 14563 +20250 14565 +20252 14569 +20262 14577 +20266 14607 +20268 14615 +20274 14619 +15716 14621 +20276 14631 +20972 14635 +15720 14637 +20306 14643 +20336 14645 +15764 14649 +20954 14663 +20970 14667 +20978 14669 +21102 14675 +20980 14677 +21114 14681 +21180 14691 +21116 14693 +21150 14697 +21166 14705 +21178 14727 +21198 14731 +21206 14733 +21278 14739 +21210 14741 +21212 14745 +25246 14755 +21222 14757 +21226 14761 +21228 14769 +21234 14787 +21236 14789 +21240 14793 +21294 14801 +21306 14817 +21308 14863 +21326 14871 +21338 14875 +15778 14877 +21362 14887 +21850 14891 +20280 14893 +21354 14899 +21356 14901 +21368 14905 +21390 14919 +21398 14923 +21402 14925 +21404 14931 +21414 14933 +21418 14937 +21814 14947 +21420 14949 +21426 14953 +21428 14961 +21432 14983 +21820 14987 +21446 14989 +25404 14995 +21450 14997 +21452 15001 +25910 15011 +21868 15013 +23210 15017 +21458 15025 +21464 15043 +21474 15045 +21476 15049 +21480 15057 +21488 15073 +21566 15111 +22070 15115 +20322 15117 +21614 15123 +21622 15125 +21626 15129 +29478 15139 +21628 15141 +21662 15145 +45846 15153 +21678 15171 +21686 15173 +21710 15177 +22838 15185 +25014 15201 +28790 15235 +21718 15237 +21722 15241 +23094 15249 +26166 15265 +24766 15297 +21724 15375 +21734 15383 +15600 15387 +21740 15389 +21746 15399 +21748 15403 +21818 15405 +24894 15411 +21866 15413 +34638 15417 +21874 15431 +21880 15435 +21902 15437 +21910 15443 +21692 15445 +21914 15449 +21916 15459 +21926 15461 +22590 15465 +21930 15473 +16140 15495 +21938 15499 +21940 15501 +24814 15507 +21958 15509 +21962 15513 +24822 15523 +21964 15525 +21970 15529 +21976 15537 +21986 15555 +24798 15557 +33918 15561 +49374 15569 +49390 15585 +21988 15623 +22046 15627 +22062 15629 +28958 15635 +22074 15637 +22076 15641 +28734 15651 +22094 15653 +22102 15657 +28986 15665 +22622 15683 +22106 15685 +22108 15689 +22118 15697 +22122 15713 +24826 15747 +22124 15749 +22130 15753 +22132 15761 +22136 15777 +49278 15809 +22158 15879 +22166 15883 +22170 15885 +28854 15891 +22172 15893 +22182 15897 +25270 15907 +22188 15909 +24926 15913 +27190 15921 +22194 15939 +22196 15941 +22638 15945 +24828 15953 +24942 15969 +24956 16003 +22200 16005 +22646 16009 +28766 16017 +25020 16033 +49342 16065 +29214 16131 +22214 16133 +25006 16137 +28988 16145 +29242 16161 +28794 16193 +28830 16257 +4052 16511 +4066 16575 +4056 16607 +8136 16623 +12232 16631 +20298 16635 +33274 16637 +22218 16703 +20984 16735 +8144 16751 +20400 16759 +13258 16763 +21932 16765 +20300 16799 +13268 16815 +22000 16823 +14288 16827 +22186 16829 +14276 16847 +22220 16855 +15894 16859 +20194 16861 +13284 16871 +12240 16875 +14304 16877 +16006 16883 +20308 16885 +16068 16889 +15816 16959 +20312 16991 +33694 17007 +20358 17015 +33742 17019 +33530 17021 +15256 17055 +15268 17071 +15728 17079 +15898 17083 +16320 17085 +15298 17103 +15900 17111 +15300 17115 +20180 17117 +12228 17127 +33710 17131 +33724 17133 +16018 17139 +20364 17141 +33756 17145 +22226 17183 +15768 17199 +22228 17207 +15840 17211 +22650 17213 +15532 17231 +22232 17239 +15824 17243 +22242 17245 +20372 17255 +15780 17259 +16148 17261 +15948 17267 +22244 17269 +34206 17273 +15792 17295 +22248 17303 +16200 17307 +22256 17309 +16260 17319 +15910 17323 +15954 17325 +20328 17331 +22286 17333 +22294 17337 +15280 17351 +16164 17355 +15784 17357 +15914 17363 +21690 17365 +22298 17369 +20362 17379 +22300 17381 +34462 17385 +20386 17393 +20388 17471 +20370 17503 +33772 17519 +20172 17527 +34014 17531 +34042 17533 +20376 17567 +15312 17583 +21738 17591 +22310 17595 +22314 17597 +19704 17615 +20392 17623 +20418 17627 +19944 17629 +20432 17639 +35006 17643 +35230 17645 +21752 17651 +22316 17653 +35038 17657 +22322 17695 +22324 17711 +22328 17719 +22342 17723 +22346 17725 +22348 17743 +10938 17751 +15074 17755 +21852 17757 +15530 17767 +15922 17771 +15970 17773 +22354 17779 +22360 17781 +34222 17785 +22370 17807 +22372 17815 +16010 17819 +22376 17821 +16080 17831 +22384 17835 +22406 17837 +22410 17843 +22412 17845 +22418 17849 +22420 17863 +22424 17867 +20200 17869 +22434 17875 +22436 17877 +22448 17881 +22466 17891 +22468 17893 +34478 17897 +22472 17905 +22480 17951 +33598 17967 +22496 17975 +22652 17979 +22686 17981 +33722 17999 +20196 18007 +22702 18011 +22710 18013 +22714 18023 +22716 18027 +33654 18029 +22734 18035 +22742 18037 +22746 18041 +16012 18063 +22748 18071 +22758 18075 +22762 18077 +22764 18087 +22770 18091 +22772 18093 +22776 18099 +22814 18101 +22830 18105 +22842 18119 +22844 18123 +22862 18125 +22870 18131 +22874 18133 +22876 18137 +22886 18147 +22890 18149 +22892 18153 +33658 18161 +15418 18191 +22898 18199 +15538 18203 +22900 18205 +22904 18215 +33718 18219 +34110 18221 +22926 18227 +22934 18229 +34170 18233 +22938 18247 +34234 18251 +35134 18253 +22940 18259 +22950 18261 +33660 18265 +33750 18275 +37182 18277 +22954 18281 +34290 18289 +22956 18311 +22962 18315 +35166 18317 +22964 18323 +22968 18325 +22982 18329 +22986 18339 +22988 18341 +33754 18345 +15960 18353 +22994 18371 +22996 18373 +33770 18377 +23000 18385 +34296 18401 +23010 18495 +35194 18527 +23012 18543 +23016 18551 +23024 18555 +33784 18557 +37054 18591 +23070 18607 +23086 18615 +23098 18619 +23100 18621 +35258 18639 +23118 18647 +35246 18651 +35260 18653 +23126 18663 +35254 18667 +35290 18669 +23130 18675 +23132 18677 +35278 18681 +23142 18719 +15956 18735 +23148 18743 +16208 18747 +23154 18749 +23156 18767 +23182 18775 +23190 18779 +23194 18781 +23196 18791 +23206 18795 +23212 18797 +23218 18803 +23220 18805 +23224 18809 +37662 18831 +23238 18839 +23244 18843 +34266 18845 +23250 18855 +23252 18859 +23266 18861 +23268 18867 +23272 18869 +23280 18873 +23310 18887 +34714 18891 +35738 18893 +23318 18899 +23322 18901 +23324 18905 +23334 18915 +23338 18917 +23340 18921 +16272 18929 +23346 18975 +15328 18991 +23348 18999 +15972 19003 +23352 19005 +23366 19023 +23372 19031 +23378 19035 +23380 19037 +23394 19047 +23396 19051 +23400 19053 +23408 19059 +23430 19061 +33778 19065 +23434 19087 +23436 19095 +23442 19099 +23444 19101 +23448 19111 +23458 19115 +23460 19117 +23464 19123 +23472 19125 +23490 19129 +23492 19143 +23496 19147 +23504 19149 +23520 19155 +23582 19157 +23598 19161 +23606 19171 +23610 19173 +35740 19177 +23612 19185 +15476 19215 +23630 19223 +15976 19227 +23146 19229 +16020 19239 +15160 19243 +15984 19245 +16224 19251 +23638 19253 +23642 19257 +23644 19271 +23654 19275 +23658 19277 +23660 19283 +23666 19285 +23668 19289 +23672 19299 +23694 19301 +23702 19305 +23706 19313 +23708 19335 +23718 19339 +23722 19341 +23724 19347 +23730 19349 +23732 19353 +23736 19363 +23750 19365 +23754 19369 +23756 19377 +23762 19395 +23764 19397 +23778 19401 +23780 19409 +23784 19425 +35320 19487 +23792 19503 +23822 19511 +23830 19515 +23834 19517 +19928 19535 +23836 19543 +23846 19547 +20184 19549 +23850 19559 +23852 19563 +34230 19565 +23858 19571 +23860 19573 +35486 19577 +35514 19599 +23864 19607 +35516 19611 +35768 19613 +23878 19623 +34236 19627 +35756 19629 +23882 19635 +23884 19637 +23896 19641 +25198 19655 +36250 19659 +39322 19661 +25710 19667 +34142 19669 +23906 19673 +24954 19683 +33646 19685 +35800 19689 +23908 19697 +15540 19727 +24990 19735 +23242 19739 +23912 19741 +25018 19751 +16152 19755 +25038 19757 +25046 19763 +25050 19765 +25052 19769 +23920 19783 +23942 19787 +23768 19789 +25062 19795 +23946 19797 +25066 19801 +25068 19811 +25074 19813 +25076 19817 +23948 19825 +25080 19847 +35644 19851 +37306 19853 +25182 19859 +25210 19861 +25212 19865 +25262 19875 +25718 19877 +25274 19881 +23954 19889 +26158 19907 +33780 19909 +25276 19913 +23956 19921 +34254 19937 +15668 19983 +25294 19991 +16176 19995 +23370 19997 +25302 20007 +34366 20011 +34490 20013 +25306 20019 +25308 20021 +34426 20025 +25318 20039 +35726 20043 +37786 20045 +25322 20051 +25324 20053 +34546 20057 +37438 20067 +37816 20069 +25330 20073 +34492 20081 +25332 20103 +35734 20107 +36280 20109 +25336 20115 +25374 20117 +25390 20121 +25694 20131 +26190 20133 +35576 20137 +25402 20145 +34030 20163 +34486 20165 +37308 20169 +23970 20177 +35066 20193 +15924 20231 +23972 20235 +36634 20237 +25422 20243 +25430 20245 +25434 20249 +25436 20259 +25446 20261 +34172 20265 +25450 20273 +25452 20291 +37114 20293 +35998 20297 +25458 20305 +37242 20321 +25460 20355 +25464 20357 +36156 20361 +25486 20369 +33276 20385 +34942 20417 +23984 20543 +24002 20575 +35286 20591 +24004 20599 +34158 20603 +34522 20605 +24032 20639 +24078 20655 +24086 20663 +24090 20667 +24092 20669 +24102 20687 +24106 20695 +24330 20699 +24108 20701 +24114 20711 +34552 20715 +34744 20717 +25494 20723 +24326 20725 +34618 20729 +24116 20767 +24120 20783 +24134 20791 +24140 20795 +24146 20797 +24148 20815 +10986 20823 +16034 20827 +21876 20829 +23960 20839 +24162 20843 +24164 20845 +25498 20851 +24168 20853 +34262 20857 +25500 20879 +24176 20887 +24198 20891 +24202 20893 +24204 20903 +24210 20907 +24226 20909 +24332 20915 +24338 20917 +24340 20921 +24344 20935 +24354 20939 +24356 20941 +24360 20947 +24386 20949 +24450 20953 +25510 20963 +25514 20965 +34510 20969 +25516 20977 +25522 21023 +25524 21039 +25528 21047 +33766 21051 +25542 21053 +25546 21071 +25548 21079 +25554 21083 +25556 21085 +25560 21095 +25570 21099 +34038 21101 +34166 21107 +25572 21109 +34538 21113 +25576 21135 +25584 21143 +25662 21147 +25722 21149 +25724 21159 +25758 21163 +25774 21165 +25782 21171 +25786 21173 +25788 21177 +25806 21191 +25814 21195 +34268 21197 +25818 21203 +25820 21205 +25830 21209 +25834 21219 +25836 21221 +25842 21225 +25844 21233 +25848 21263 +25886 21271 +25902 21275 +25914 21277 +25916 21287 +34282 21291 +34284 21293 +25934 21299 +25942 21301 +37214 21305 +25946 21319 +34278 21323 +34292 21325 +29014 21331 +25948 21333 +34414 21337 +37302 21347 +34422 21349 +25958 21353 +41278 21361 +25962 21383 +25964 21387 +25970 21389 +25972 21395 +25976 21397 +25998 21401 +29030 21411 +26006 21413 +34398 21417 +41334 21425 +26010 21443 +26012 21445 +34548 21449 +26022 21457 +34524 21473 +24212 21535 +26026 21551 +26028 21559 +34534 21563 +34540 21565 +26034 21583 +11178 21591 +21972 21595 +24016 21597 +26036 21607 +26040 21611 +34606 21613 +34044 21619 +34614 21621 +34620 21625 +26054 21647 +26058 21655 +26060 21659 +26066 21661 +26068 21671 +34646 21675 +34650 21677 +26072 21683 +26082 21685 +34518 21689 +26084 21703 +34666 21707 +34680 21709 +26088 21715 +26096 21717 +34702 21721 +34710 21731 +34730 21733 +34738 21737 +34792 21745 +26142 21775 +11946 21783 +22356 21787 +26170 21789 +26172 21799 +26198 21803 +26202 21805 +28974 21811 +26204 21813 +35054 21817 +15018 21831 +23890 21835 +35062 21837 +26214 21843 +26218 21845 +38230 21849 +29018 21859 +34652 21861 +26220 21865 +50518 21873 +26232 21895 +26254 21899 +26262 21901 +26266 21907 +26268 21909 +26278 21913 +26282 21923 +26284 21925 +34674 21929 +29020 21937 +26290 21955 +29782 21957 +34800 21961 +53590 21969 +35182 21985 +35390 22031 +26292 22039 +26296 22043 +26310 22045 +26314 22055 +26316 22059 +34662 22061 +37470 22067 +26322 22069 +35190 22073 +26324 22087 +26328 22091 +34676 22093 +26344 22099 +33532 22101 +26352 22105 +26382 22115 +26390 22117 +35450 22121 +26394 22129 +26396 22151 +26406 22155 +26410 22157 +26412 22163 +26418 22165 +26420 22169 +26424 22179 +26438 22181 +34428 22185 +28782 22193 +35196 22211 +35292 22213 +26442 22217 +35302 22225 +26444 22241 +26450 22279 +34716 22283 +35422 22285 +29466 22291 +26452 22293 +36990 22297 +37238 22307 +37340 22309 +35306 22313 +41534 22321 +28846 22339 +29974 22341 +26456 22345 +54358 22353 +26472 22369 +26502 22403 +26506 22405 +35314 22409 +26508 22417 +35316 22433 +37086 22465 +26514 22559 +26516 22575 +26520 22583 +26530 22587 +26532 22589 +26536 22607 +26544 22615 +26562 22619 +26564 22621 +26568 22631 +34732 22635 +35438 22637 +26686 22643 +26718 22645 +35446 22649 +34668 22671 +26734 22679 +26742 22683 +26746 22685 +26748 22695 +26782 22699 +26798 22701 +26806 22707 +26810 22709 +26812 22713 +26830 22727 +26838 22731 +26842 22733 +26844 22739 +26854 22741 +26858 22745 +26860 22755 +26866 22757 +35534 22761 +26868 22769 +26872 22799 +26576 22807 +26910 22811 +26926 22813 +26934 22823 +26938 22827 +26940 22829 +29042 22835 +26958 22837 +26966 22841 +26970 22855 +26972 22859 +26982 22861 +26986 22867 +26988 22869 +26994 22873 +26996 22883 +27000 22885 +34726 22889 +29006 22897 +27022 22919 +27030 22923 +27034 22925 +27036 22931 +27046 22933 +27050 22937 +27052 22947 +27058 22949 +27064 22953 +27078 22961 +27082 22979 +27084 22981 +27090 22985 +27096 22993 +27106 23009 +27108 23055 +27112 23063 +27120 23067 +27166 23069 +27182 23079 +35452 23083 +35502 23085 +27194 23091 +27196 23093 +37230 23097 +27214 23111 +35510 23115 +35542 23117 +27222 23123 +27226 23125 +35546 23129 +34764 23139 +35548 23141 +35558 23145 +41150 23153 +27228 23175 +27238 23179 +27242 23181 +27244 23187 +27250 23189 +27252 23193 +27256 23203 +27278 23205 +35562 23209 +41206 23217 +27286 23235 +27290 23237 +35642 23241 +27292 23249 +41198 23265 +27302 23303 +27306 23307 +27308 23309 +27314 23315 +27316 23317 +27320 23321 +29468 23331 +27334 23333 +27338 23337 +41758 23345 +27340 23363 +27346 23365 +34776 23369 +29034 23377 +35564 23393 +27348 23427 +27352 23429 +27362 23433 +29084 23441 +41086 23457 +27364 23489 +27368 23567 +27376 23575 +27406 23579 +27414 23581 +27418 23591 +35674 23595 +35570 23597 +27420 23603 +28886 23605 +37110 23609 +27430 23623 +35902 23627 +37278 23629 +27434 23635 +27436 23637 +37334 23641 +37102 23651 +37982 23653 +35572 23657 +49502 23665 +27442 23687 +27444 23691 +27448 23693 +27462 23699 +27466 23701 +27468 23705 +27734 23715 +28902 23717 +37294 23721 +28796 23729 +28858 23747 +28860 23749 +37338 23753 +49526 23761 +49398 23777 +28878 23815 +28890 23819 +28892 23821 +29048 23827 +29082 23829 +28906 23833 +28908 23843 +29098 23845 +35630 23849 +29510 23857 +28914 23875 +30022 23877 +35638 23881 +54550 23889 +35662 23905 +29100 23939 +35308 23941 +28916 23945 +29274 23953 +29290 23969 +50270 24001 +29094 24071 +35754 24075 +37116 24077 +29106 24083 +29244 24085 +37326 24089 +35676 24099 +35934 24101 +35704 24105 +41310 24113 +37354 24131 +37356 24133 +37244 24137 +50462 24145 +29108 24161 +29270 24195 +29286 24197 +37368 24201 +29230 24209 +41182 24225 +49470 24257 +29338 24323 +29726 24325 +37350 24329 +29742 24337 +29786 24353 +37494 24385 +30250 24449 +27474 24639 +34740 24671 +34758 24687 +34786 24695 +24368 24699 +34772 24701 +24228 24735 +27476 24751 +35762 24759 +27480 24763 +27490 24765 +34762 24783 +35764 24791 +35686 24795 +35690 24797 +35692 24807 +34770 24811 +35700 24813 +34788 24819 +35750 24821 +35782 24825 +27492 24863 +27496 24879 +27504 24887 +24388 24891 +24400 24893 +27526 24911 +27530 24919 +27532 24923 +27538 24925 +27544 24935 +24464 24939 +27554 24941 +27556 24947 +27560 24949 +27568 24953 +24240 24975 +27586 24983 +27588 24987 +27592 24989 +26592 24999 +27600 25003 +27678 25005 +35786 25011 +35788 25013 +27694 25017 +27702 25031 +27706 25035 +27708 25037 +35794 25043 +35796 25045 +35810 25049 +35812 25059 +35816 25061 +27726 25065 +35824 25073 +27738 25119 +15916 25135 +27740 25143 +16024 25147 +20324 25149 +27750 25167 +27754 25175 +27756 25179 +27762 25181 +27768 25191 +27790 25195 +35950 25197 +27798 25203 +27802 25205 +27804 25209 +28920 25231 +24416 25239 +27814 25243 +27818 25245 +27820 25255 +27826 25259 +27828 25261 +27832 25267 +27850 25269 +27858 25273 +27860 25287 +27864 25291 +29036 25293 +27874 25299 +27888 25301 +27918 25305 +27926 25315 +27930 25317 +36014 25321 +27932 25329 +28050 25359 +29298 25367 +28038 25371 +29044 25373 +29070 25383 +16048 25387 +27942 25389 +26226 25395 +29078 25397 +29112 25401 +27946 25415 +29126 25419 +29130 25421 +29132 25427 +29138 25429 +29140 25433 +23892 25443 +27948 25445 +35958 25449 +27954 25457 +27764 25479 +29144 25483 +29154 25485 +26480 25491 +27880 25493 +29160 25497 +28044 25507 +29168 25509 +29262 25513 +27956 25521 +29276 25539 +29292 25541 +29300 25545 +27960 25553 +27974 25569 +29304 25631 +29326 25647 +29334 25655 +29340 25659 +29350 25661 +24138 25679 +29354 25687 +29356 25691 +24216 25693 +29362 25703 +35962 25707 +35964 25709 +27978 25715 +27986 25717 +36022 25721 +29364 25743 +27988 25751 +29368 25755 +29382 25757 +29386 25767 +29388 25771 +29394 25773 +29396 25779 +29400 25781 +29410 25785 +29416 25799 +29424 25803 +36026 25805 +29454 25811 +36028 25813 +29482 25817 +29484 25827 +36046 25829 +36054 25833 +28198 25841 +35670 25871 +29750 25879 +29490 25883 +29492 25885 +29514 25895 +29516 25899 +29522 25901 +29524 25907 +29528 25909 +29538 25913 +29540 25927 +29544 25931 +24272 25933 +29574 25939 +29578 25941 +29580 25945 +27992 25955 +28002 25957 +36058 25961 +28202 25969 +28008 25991 +29586 25995 +29588 25997 +28042 26003 +28056 26005 +29592 26009 +29602 26019 +29754 26021 +29756 26025 +29774 26033 +29788 26051 +29798 26053 +29802 26057 +29804 26065 +29810 26081 +35698 26127 +29812 26135 +29816 26139 +29838 26141 +29846 26151 +36060 26155 +36070 26157 +29850 26163 +29852 26165 +36074 26169 +29862 26183 +36076 26187 +36082 26189 +29866 26195 +29868 26197 +36084 26201 +36088 26211 +37690 26213 +36142 26217 +37362 26225 +29874 26247 +29876 26251 +36154 26253 +29880 26259 +29898 26261 +29900 26265 +27846 26275 +29906 26277 +36174 26281 +29912 26289 +29928 26307 +29636 26309 +36246 26313 +29936 26321 +36182 26337 +36150 26375 +29966 26379 +36186 26381 +29978 26387 +29980 26389 +29990 26393 +29908 26403 +29922 26405 +36188 26409 +29994 26417 +29996 26435 +30002 26437 +37486 26441 +30004 26449 +37498 26465 +30008 26499 +30026 26501 +36198 26505 +30028 26513 +30034 26529 +30036 26561 +28186 26655 +30050 26671 +28066 26679 +36202 26683 +36204 26685 +36210 26703 +28072 26711 +36212 26715 +36216 26717 +36238 26727 +30056 26731 +36746 26733 +36252 26739 +36262 26741 +36266 26745 +36268 26767 +28426 26775 +28080 26779 +37364 26781 +28174 26791 +36274 26795 +36276 26797 +36294 26803 +36298 26805 +36300 26809 +28312 26823 +36306 26827 +37788 26829 +36398 26835 +37500 26837 +36406 26841 +36308 26851 +36410 26853 +36412 26857 +36458 26865 +28204 26895 +30086 26903 +28188 26907 +30090 26909 +28182 26919 +29552 26923 +36322 26925 +29496 26931 +29608 26933 +36324 26937 +28216 26951 +30098 26955 +36466 26957 +30040 26963 +30092 26965 +36472 26969 +30064 26979 +36328 26981 +30234 26985 +36494 26993 +28434 27015 +28210 27019 +37774 27021 +28212 27027 +36502 27029 +28234 27033 +28248 27043 +28298 27045 +36336 27049 +36506 27057 +28440 27075 +30100 27077 +36518 27081 +37534 27089 +36522 27105 +36430 27151 +28422 27159 +36438 27163 +36442 27165 +36444 27175 +30104 27179 +30246 27181 +36454 27187 +36460 27189 +30114 27193 +37692 27207 +30258 27211 +30264 27213 +36468 27219 +36508 27221 +30474 27225 +30152 27235 +36524 27237 +36530 27241 +30230 27249 +30482 27271 +36532 27275 +36536 27277 +28428 27283 +36550 27285 +36554 27289 +36556 27299 +36562 27301 +36578 27305 +36592 27313 +36622 27331 +36636 27333 +36646 27337 +36650 27345 +36652 27361 +37550 27399 +30750 27403 +36660 27405 +36664 27411 +36678 27413 +36682 27417 +30236 27427 +36696 27429 +30774 27433 +30148 27441 +36706 27459 +36742 27461 +30778 27465 +30252 27473 +30840 27489 +37558 27523 +36784 27525 +36816 27529 +37562 27537 +37564 27553 +37582 27585 +37590 27663 +30862 27671 +37594 27675 +37596 27677 +37718 27687 +31122 27691 +37606 27693 +37610 27699 +37612 27701 +36312 27705 +37618 27719 +31128 27723 +37620 27725 +37624 27731 +37678 27733 +37710 27737 +30870 27747 +37722 27749 +37724 27753 +30874 27761 +37734 27783 +37738 27787 +39226 27789 +30886 27795 +37740 27797 +37746 27801 +37748 27811 +37752 27813 +37782 27817 +37798 27825 +37802 27843 +37804 27845 +37810 27849 +37812 27857 +37830 27873 +37834 27911 +37836 27915 +37842 27917 +37844 27923 +37848 27925 +37858 27929 +30952 27939 +37860 27941 +30998 27945 +37864 27953 +37872 27971 +37950 27973 +37998 27977 +38006 27985 +36658 28001 +38010 28035 +38012 28037 +38046 28041 +38062 28049 +38070 28065 +38074 28097 +38076 28167 +36720 28171 +38094 28173 +38102 28179 +38106 28181 +38108 28185 +36684 28195 +38118 28197 +38122 28201 +30990 28209 +38124 28227 +38130 28229 +38132 28233 +38136 28241 +38174 28257 +38190 28291 +38198 28293 +38202 28297 +38204 28305 +38222 28321 +38234 28353 +38236 28419 +38246 28421 +38250 28425 +38252 28433 +36770 28449 +38258 28481 +41210 28545 +30354 28703 +30222 28719 +41398 28727 +28236 28731 +30488 28733 +31110 28751 +49622 28759 +36564 28763 +36754 28765 +36690 28775 +38260 28779 +38264 28781 +29156 28787 +29412 28789 +38286 28793 +38294 28815 +30594 28823 +38298 28827 +38300 28829 +41326 28839 +38310 28843 +36692 28845 +41654 28851 +41390 28853 +38314 28857 +49518 28871 +38316 28875 +38322 28877 +49614 28883 +50390 28885 +41446 28889 +42406 28899 +49638 28901 +38324 28905 +50118 28913 +38328 28943 +29894 28951 +38342 28955 +38346 28957 +38348 28967 +30766 28971 +30806 28973 +26338 28979 +28264 28981 +30876 28985 +38354 28999 +30898 29003 +31026 29005 +30346 29011 +30504 29013 +36712 29017 +28294 29027 +30780 29029 +38356 29033 +29924 29041 +30512 29063 +38360 29067 +38370 29069 +30484 29075 +30498 29077 +38372 29081 +41788 29091 +38376 29093 +36708 29097 +41894 29105 +38430 29123 +50522 29125 +36772 29129 +50630 29137 +38446 29153 +31002 29199 +38384 29207 +28436 29211 +30810 29213 +41590 29223 +41774 29227 +41340 29229 +26466 29235 +30278 29237 +38454 29241 +36756 29255 +38458 29259 +38460 29261 +30282 29267 +30290 29269 +38478 29273 +41906 29283 +38486 29285 +38490 29289 +41908 29297 +38492 29319 +36760 29323 +36802 29325 +30292 29331 +31254 29333 +38502 29337 +41878 29347 +38506 29349 +41404 29353 +42294 29361 +38508 29379 +38514 29381 +38516 29385 +38520 29393 +41660 29409 +41814 29447 +31004 29451 +38542 29453 +28230 29459 +30284 29461 +38550 29465 +30052 29475 +30306 29477 +38554 29481 +45862 29489 +30260 29507 +30946 29509 +38556 29513 +38566 29521 +42550 29537 +38570 29571 +38572 29573 +38578 29577 +41842 29585 +45238 29601 +38584 29633 +38598 29711 +38602 29719 +38604 29723 +38610 29725 +38616 29735 +38626 29739 +38628 29741 +38632 29747 +38640 29749 +38670 29753 +50006 29767 +49530 29771 +50294 29773 +38678 29779 +38682 29781 +38684 29785 +38694 29795 +50642 29797 +38698 29801 +50644 29809 +38700 29831 +38706 29835 +38708 29837 +38712 29843 +38726 29845 +38730 29849 +38732 29859 +38738 29861 +38740 29865 +38744 29873 +38754 29891 +50486 29893 +49626 29897 +50582 29905 +50394 29921 +50510 29959 +38756 29963 +38760 29965 +38768 29971 +38790 29973 +38794 29977 +30470 29987 +38796 29989 +38802 29993 +38808 30001 +38818 30019 +38820 30021 +38824 30025 +54598 30033 +50774 30049 +38832 30083 +38850 30085 +38852 30089 +50546 30097 +38856 30113 +53462 30145 +38974 30215 +39006 30219 +39034 30221 +30312 30227 +39022 30229 +39030 30233 +45342 30243 +39036 30245 +39070 30249 +45118 30257 +39086 30275 +53534 30277 +39094 30281 +53342 30289 +39510 30305 +39098 30339 +39100 30341 +39118 30345 +39126 30353 +41374 30369 +49566 30401 +30500 30467 +31494 30469 +39142 30473 +30530 30481 +45174 30497 +53366 30529 +39146 30593 +39154 30735 +32514 30743 +39130 30747 +39214 30749 +39132 30759 +39148 30763 +39156 30765 +41830 30771 +39160 30773 +39198 30777 +39222 30791 +39228 30795 +39258 30797 +39270 30803 +50534 30805 +39274 30809 +39334 30819 +39590 30821 +39338 30825 +39340 30833 +39346 30855 +39246 30859 +39348 30861 +39254 30867 +39352 30869 +39260 30873 +41402 30883 +39276 30885 +39282 30889 +42286 30897 +39454 30915 +49628 30917 +39470 30921 +49998 30929 +39478 30945 +41422 30983 +39288 30987 +39482 30989 +45372 30995 +45398 30997 +39310 31001 +41844 31011 +41566 31013 +39484 31017 +43318 31025 +50238 31043 +50548 31045 +41338 31049 +51542 31057 +39502 31073 +41430 31107 +41582 31109 +39318 31113 +49590 31121 +41630 31137 +50286 31169 +41594 31239 +39990 31243 +39324 31245 +45358 31251 +45150 31253 +39366 31257 +43574 31267 +39370 31269 +41596 31273 +45370 31281 +39372 31299 +40134 31301 +39378 31305 +40710 31313 +45166 31329 +41686 31363 +39380 31365 +39384 31369 +45214 31377 +41646 31393 +39394 31425 +45402 31491 +45178 31493 +41806 31497 +45414 31505 +45598 31521 +49642 31553 +45270 31617 +49758 31751 +39514 31755 +42582 31757 +50298 31763 +53582 31765 +39516 31769 +41452 31779 +40714 31781 +39526 31785 +46110 31793 +39530 31811 +52310 31813 +50300 31817 +53558 31825 +53310 31841 +41434 31875 +50358 31877 +39532 31881 +53358 31889 +39538 31905 +49950 31937 +53370 32003 +53594 32005 +50012 32009 +53596 32017 +50742 32033 +54302 32065 +53406 32129 +43606 32259 +52278 32261 +41436 32265 +53790 32273 +45180 32289 +53372 32321 +39540 32385 +61470 32513 +8160 32895 +4068 32959 +4072 32991 +12256 33007 +13272 33015 +20448 33019 +35068 33021 +27092 33087 +27060 33119 +14280 33135 +39544 33143 +22440 33147 +28560 33149 +24452 33183 +13288 33199 +27616 33207 +28112 33211 +38864 33213 +21944 33231 +28016 33239 +38880 33243 +30360 33245 +39566 33255 +21992 33259 +30900 33261 +27540 33267 +36832 33269 +28306 33273 +28052 33343 +28322 33375 +39400 33391 +28068 33399 +39408 33403 +39574 33405 +30296 33439 +30918 33455 +36568 33463 +28450 33467 +39284 33469 +15304 33487 +39578 33495 +23976 33499 +28272 33501 +28098 33511 +39580 33515 +39594 33517 +28328 33523 +28482 33525 +39596 33529 +30932 33567 +30370 33583 +39602 33591 +28452 33595 +28546 33597 +28456 33615 +39604 33623 +29604 33627 +29640 33629 +28104 33639 +39608 33643 +39622 33645 +29634 33651 +30116 33653 +39626 33657 +39628 33679 +28464 33687 +39634 33691 +39636 33693 +39640 33703 +28336 33707 +30834 33709 +39396 33715 +39650 33717 +30342 33721 +39652 33735 +29616 33739 +30146 33741 +39656 33747 +39664 33749 +30812 33753 +28496 33763 +30120 33765 +39694 33769 +30348 33777 +30356 33855 +39702 33887 +39706 33903 +28300 33911 +39708 33915 +39718 33917 +39722 33951 +39724 33967 +39730 33975 +39732 33979 +39736 33981 +39750 33999 +39754 34007 +39756 34011 +39762 34013 +28324 34023 +39764 34027 +39768 34029 +28512 34035 +28552 34037 +39778 34041 +31114 34079 +31014 34095 +39780 34103 +30826 34107 +30890 34109 +39784 34127 +39792 34135 +39814 34139 +39818 34141 +28128 34151 +39820 34155 +39826 34157 +30892 34163 +30372 34165 +39828 34169 +39832 34191 +30600 34199 +39842 34203 +39844 34205 +39848 34215 +30930 34219 +30160 34221 +39856 34227 +39874 34229 +31018 34233 +39876 34247 +39880 34251 +39888 34253 +39966 34259 +39982 34261 +39994 34265 +30476 34275 +31028 34277 +39996 34281 +31020 34289 +31074 34335 +40014 34351 +30532 34359 +40022 34363 +40026 34365 +40028 34383 +31080 34391 +40038 34395 +40042 34397 +40044 34407 +31124 34411 +40050 34413 +40052 34419 +40056 34421 +40078 34425 +39904 34447 +40086 34455 +28488 34459 +40090 34461 +28360 34471 +40092 34475 +40102 34477 +30536 34483 +30798 34485 +40106 34489 +28384 34503 +40108 34507 +40114 34509 +31138 34515 +31140 34517 +40116 34521 +40120 34531 +40138 34533 +40140 34537 +40146 34545 +15480 34575 +38580 34583 +23160 34587 +31144 34589 +30822 34599 +40148 34603 +40152 34605 +30828 34611 +30836 34613 +40162 34617 +30904 34631 +40164 34635 +40168 34637 +31032 34643 +31246 34645 +40176 34649 +40206 34659 +40214 34661 +40218 34665 +40220 34673 +40230 34695 +30924 34699 +40234 34701 +40236 34707 +40242 34709 +30922 34713 +30936 34723 +31046 34725 +40244 34729 +31050 34737 +31258 34755 +31260 34757 +40248 34761 +31088 34769 +40262 34879 +40462 34911 +40470 34927 +40474 34935 +31052 34939 +40486 34941 +31058 34999 +36580 35003 +40266 35005 +31200 35031 +40490 35035 +36584 35037 +40492 35047 +40268 35051 +41450 35053 +40274 35059 +40498 35061 +40276 35065 +31060 35103 +31064 35119 +31076 35127 +40280 35131 +40290 35133 +40500 35151 +31274 35159 +40504 35163 +40552 35165 +40560 35175 +40292 35179 +40582 35181 +40296 35187 +40586 35189 +31116 35193 +40304 35215 +40326 35223 +24260 35227 +40330 35229 +30596 35239 +40332 35243 +40338 35245 +31176 35251 +30544 35253 +40340 35257 +31284 35271 +40610 35275 +40616 35277 +30608 35283 +31366 35285 +40624 35289 +40354 35299 +40716 35301 +40356 35305 +40360 35313 +40368 35359 +31370 35375 +40386 35383 +31170 35387 +40392 35389 +40400 35407 +40416 35415 +31508 35419 +40476 35421 +40518 35431 +40522 35435 +40524 35437 +31172 35443 +31270 35445 +40530 35449 +31282 35479 +40532 35483 +40536 35485 +40546 35495 +40588 35499 +40594 35501 +40600 35507 +40612 35509 +40648 35513 +40656 35527 +40722 35531 +40724 35533 +40728 35539 +40738 35541 +40740 35545 +31302 35555 +31306 35557 +40744 35561 +31308 35569 +15544 35599 +31288 35607 +31314 35611 +40752 35613 +36748 35623 +38612 35627 +40770 35629 +40784 35635 +40800 35637 +40834 35641 +40840 35655 +31372 35659 +31400 35661 +41212 35667 +41458 35669 +41460 35673 +31378 35683 +31384 35685 +41464 35689 +31394 35697 +31316 35719 +41658 35723 +41678 35725 +31336 35731 +31396 35733 +41690 35737 +41692 35747 +41702 35749 +41706 35753 +41708 35761 +41714 35779 +41716 35781 +41720 35785 +41786 35809 +41818 35871 +41820 35895 +41834 35899 +41836 35901 +41848 35919 +41870 35927 +41882 35931 +41884 35933 +41898 35943 +41900 35947 +41912 35949 +41926 35955 +41930 35957 +41932 35961 +31498 35991 +41938 35995 +41940 35997 +41944 36007 +41954 36011 +41956 36013 +41960 36019 +41968 36021 +42046 36025 +42078 36039 +42094 36043 +42102 36045 +42106 36051 +42108 36053 +42142 36057 +42158 36067 +42166 36069 +42170 36073 +31432 36081 +23256 36111 +31276 36119 +42172 36123 +31456 36125 +42190 36135 +38804 36139 +42198 36141 +42202 36147 +42204 36149 +42214 36153 +42218 36167 +42220 36171 +42226 36173 +42228 36179 +42232 36181 +42270 36185 +42298 36195 +42300 36197 +42318 36201 +42326 36209 +31500 36231 +42330 36235 +42332 36237 +31506 36243 +31554 36245 +42342 36249 +42346 36259 +42348 36261 +42354 36265 +42356 36291 +42360 36293 +42382 36297 +42390 36305 +42394 36321 +15672 36367 +42396 36375 +23384 36379 +31560 36381 +31512 36391 +42410 36395 +42412 36397 +31522 36403 +31524 36405 +42418 36409 +31528 36423 +42420 36427 +42424 36429 +31536 36435 +31584 36437 +42438 36441 +42442 36451 +42444 36453 +42450 36457 +42452 36487 +42456 36491 +42466 36493 +42468 36499 +42472 36501 +31766 36505 +31618 36515 +31620 36517 +42480 36521 +31624 36529 +42526 36547 +42542 36549 +42554 36553 +31648 36561 +42556 36577 +15928 36615 +24152 36619 +40596 36621 +31320 36627 +42574 36629 +42586 36633 +31770 36643 +32010 36645 +42588 36649 +31800 36657 +42598 36675 +42602 36677 +42604 36681 +42610 36689 +42612 36705 +42616 36739 +42638 36741 +42646 36745 +42650 36753 +42652 36769 +42662 36801 +42666 36927 +42668 36959 +42674 36975 +42676 36983 +42680 36987 +42694 36989 +42698 37023 +42700 37039 +42706 37047 +42708 37051 +42712 37053 +42722 37071 +42724 37079 +42728 37083 +42736 37085 +49822 37095 +42766 37099 +42774 37101 +49870 37107 +49878 37109 +49650 37113 +42778 37151 +42780 37167 +42790 37175 +27980 37179 +28004 37181 +42794 37199 +42796 37207 +28242 37211 +28258 37213 +42802 37223 +42804 37227 +42808 37229 +42822 37235 +42826 37237 +42828 37241 +42834 37263 +31772 37271 +42836 37275 +42840 37277 +42850 37287 +31758 37291 +31786 37293 +42852 37299 +42856 37301 +27852 37305 +42864 37319 +31788 37323 +31878 37325 +42886 37331 +42890 37333 +42892 37337 +42898 37347 +42900 37349 +42904 37353 +42914 37361 +42916 37407 +42920 37423 +40776 37431 +42928 37435 +42946 37437 +42948 37455 +31882 37463 +42952 37467 +42960 37469 +42976 37479 +31892 37483 +43070 37485 +43102 37491 +43118 37493 +43126 37497 +43130 37519 +43132 37527 +43166 37531 +43182 37533 +43190 37543 +43194 37547 +43196 37549 +43214 37555 +43222 37557 +43226 37561 +31884 37575 +43228 37579 +43238 37581 +43242 37587 +43244 37589 +43250 37593 +43252 37603 +43256 37605 +43294 37609 +43310 37617 +43322 37647 +43324 37655 +31330 37659 +31782 37661 +43342 37671 +43350 37675 +43354 37677 +26228 37683 +28244 37685 +43356 37689 +31912 37703 +43366 37707 +43370 37709 +30404 37715 +31332 37717 +43372 37721 +43378 37731 +43380 37733 +43384 37737 +45428 37745 +43406 37767 +31794 37771 +31796 37773 +43414 37779 +43418 37781 +31818 37785 +32006 37795 +43420 37797 +43430 37801 +43434 37809 +43436 37827 +31820 37829 +31828 37841 +43442 37857 +43444 37919 +43448 37935 +43462 37943 +43466 37947 +43468 37949 +43474 37967 +43476 37975 +43480 37979 +43490 37981 +43492 37991 +31832 37995 +43496 37997 +43504 38003 +43550 38005 +43566 38009 +43578 38031 +43580 38039 +43598 38043 +43610 38045 +43612 38055 +43622 38059 +43626 38061 +43628 38067 +43634 38069 +43636 38073 +43640 38087 +43662 38091 +43670 38093 +43674 38099 +43676 38101 +43686 38105 +43690 38115 +43692 38117 +43698 38121 +50132 38129 +43700 38159 +43718 38167 +31896 38171 +31944 38173 +32018 38183 +43722 38187 +43724 38189 +43730 38195 +43732 38197 +43736 38201 +43746 38215 +43760 38219 +43790 38221 +43798 38227 +43802 38229 +43804 38233 +43814 38243 +43818 38245 +43820 38249 +53606 38257 +43826 38279 +32020 38283 +31938 38285 +43828 38291 +43832 38293 +43846 38297 +43850 38307 +43852 38309 +31968 38321 +43858 38339 +43860 38341 +43864 38345 +50966 38353 +50334 38369 +43874 38415 +43876 38423 +43880 38427 +43888 38429 +43910 38439 +32034 38443 +43914 38445 +43916 38451 +43922 38453 +43924 38457 +43928 38471 +32040 38475 +43938 38477 +43970 38483 +43972 38485 +43976 38489 +32012 38499 +49782 38513 +43984 38535 +44062 38539 +44078 38541 +44086 38547 +44090 38553 +44092 38563 +44110 38565 +44118 38569 +44122 38577 +44124 38595 +44134 38597 +44138 38601 +50478 38609 +49402 38625 +44140 38663 +44146 38667 +44148 38669 +44152 38675 +44174 38677 +44182 38681 +44186 38691 +44188 38693 +44198 38697 +45852 38705 +44202 38723 +44204 38725 +44210 38729 +53618 38737 +50598 38753 +44212 38787 +44216 38789 +44230 38793 +44234 38801 +44236 38817 +49974 38849 +44242 38943 +44244 38959 +44248 38967 +44258 38971 +30948 38973 +44264 38991 +44272 38999 +30960 39003 +44302 39005 +44310 39015 +44314 39019 +44316 39021 +44326 39027 +44330 39029 +45390 39033 +44332 39055 +44338 39067 +44260 39069 +44340 39079 +32072 39083 +44344 39085 +44358 39091 +44362 39093 +27876 39097 +44364 39111 +44370 39115 +32096 39117 +44372 39123 +44376 39125 +44386 39129 +44388 39139 +44392 39141 +44400 39145 +44422 39153 +44426 39183 +32066 39191 +44428 39195 +44434 39197 +44436 39207 +44440 39211 +44450 39213 +44452 39219 +44456 39221 +44464 39225 +44482 39239 +44484 39243 +44496 39245 +44512 39251 +44558 39253 +44566 39257 +44570 39267 +44572 39273 +44582 39281 +44586 39307 +44588 39309 +31556 39315 +44594 39331 +44596 39333 +44614 39337 +44618 39345 +44620 39363 +44626 39365 +45404 39369 +44642 39377 +44656 39393 +44678 39439 +44682 39447 +44806 39451 +44810 39453 +44812 39463 +44628 39467 +44818 39469 +44820 39475 +44824 39477 +44834 39481 +44836 39495 +44848 39499 +44866 39501 +44868 39523 +44880 39525 +44944 39529 +45262 39537 +45230 39559 +45242 39563 +45244 39565 +45274 39571 +45276 39573 +45286 39577 +45290 39587 +45292 39589 +45298 39593 +45300 39601 +45304 39619 +45418 39621 +45420 39625 +45426 39633 +45432 39649 +45454 39687 +45462 39691 +45466 39693 +45468 39699 +45478 39701 +45482 39705 +45484 39715 +45490 39717 +45492 39721 +45496 39729 +45510 39747 +45514 39749 +45516 39753 +45522 39761 +45524 39777 +45528 39811 +45538 39813 +45626 39817 +45540 39825 +45544 39841 +45552 39873 +45614 39951 +45628 39959 +45646 39963 +45654 39965 +45658 39975 +45660 39979 +45670 39981 +45674 40007 +45676 40011 +50070 40013 +45682 40019 +45684 40021 +50382 40025 +45688 40035 +50490 40037 +45710 40041 +50492 40049 +45718 40071 +45722 40075 +45724 40077 +45734 40083 +45738 40085 +45740 40089 +45746 40099 +45748 40101 +45766 40105 +45770 40113 +45772 40131 +45778 40133 +45780 40137 +50538 40145 +49582 40161 +45784 40199 +45794 40203 +45808 40205 +45838 40211 +45850 40213 +45866 40217 +45868 40227 +45874 40229 +45876 40233 +45880 40241 +45894 40259 +45898 40261 +45900 40265 +53654 40273 +50574 40289 +45906 40323 +45908 40325 +45912 40329 +50130 40337 +45922 40353 +53466 40385 +50552 40455 +45924 40459 +45928 40461 +45936 40467 +45958 40469 +47134 40473 +45962 40483 +45964 40485 +45970 40489 +45972 40497 +45976 40515 +50586 40517 +45986 40521 +52314 40529 +49786 40545 +46018 40579 +46020 40581 +57658 40585 +46024 40593 +46126 40609 +49978 40641 +52254 40707 +52502 40709 +52758 40713 +46134 40721 +53422 40737 +53550 40769 +57406 40833 +46138 41023 +40848 41055 +46140 41071 +46158 41079 +49882 41083 +46166 41085 +28576 41119 +44600 41135 +46170 41149 +49594 41167 +50406 41175 +46172 41181 +46182 41197 +45796 41205 +49884 41209 +31940 41247 +46186 41263 +32024 41271 +40344 41275 +46188 41277 +46194 41295 +32036 41303 +46196 41307 +46200 41309 +46222 41323 +46230 41325 +46234 41331 +46236 41333 +46246 41337 +32130 41359 +32080 41371 +24480 41373 +30416 41383 +44000 41387 +46250 41389 +46252 41395 +46258 41397 +46260 41401 +32192 41415 +46264 41419 +46278 41421 +46282 41427 +46284 41429 +46290 41433 +46292 41443 +46296 41445 +46306 41449 +46308 41457 +46312 41503 +44644 41519 +46320 41527 +32132 41531 +43952 41533 +46350 41551 +46358 41559 +46362 41563 +46364 41565 +44648 41579 +44896 41581 +46374 41587 +46378 41589 +46380 41593 +44840 41615 +44684 41627 +46386 41629 +44690 41639 +43748 41643 +44692 41645 +46388 41653 +46392 41657 +46406 41671 +44930 41675 +46410 41677 +50602 41683 +46412 41685 +46418 41689 +46420 41701 +46424 41705 +46434 41713 +46436 41743 +32262 41751 +46440 41755 +46470 41757 +46474 41767 +46476 41771 +46482 41773 +45988 41779 +46484 41781 +46488 41785 +46498 41799 +46500 41803 +46504 41805 +46530 41811 +46532 41813 +46536 41817 +46560 41827 +46606 41829 +46614 41833 +46618 41841 +32136 41863 +44706 41867 +46620 41869 +32266 41875 +32268 41877 +46630 41881 +44720 41891 +46634 41893 +45752 41897 +46636 41905 +46642 41923 +46644 41929 +46648 41937 +46662 41953 +46666 42015 +46668 42031 +46674 42039 +46676 42043 +46690 42045 +46692 42063 +46696 42071 +46704 42075 +46726 42077 +46730 42091 +46732 42093 +46738 42099 +46740 42101 +46744 42105 +46754 42127 +46756 42139 +46760 42141 +46788 42151 +46816 42155 +46854 42157 +46858 42163 +46866 42165 +46868 42169 +46872 42183 +46882 42187 +46884 42189 +46888 42195 +46914 42197 +46916 42201 +46920 42211 +46944 42213 +46978 42217 +47150 42225 +47158 42255 +32274 42263 +47162 42267 +47164 42269 +47182 42279 +47190 42283 +47194 42285 +47196 42291 +47206 42293 +47210 42297 +47212 42311 +47218 42315 +47220 42317 +47224 42323 +47246 42325 +47254 42339 +47258 42345 +47260 42353 +31952 42375 +47270 42379 +47274 42381 +47276 42403 +47282 42417 +47284 42435 +47288 42437 +47302 42441 +47306 42449 +47308 42465 +47314 42511 +47316 42523 +47320 42525 +47330 42539 +47332 42541 +47336 42547 +47344 42549 +47374 42553 +47382 42571 +47386 42573 +47388 42579 +47398 42585 +47402 42595 +47404 42601 +47410 42609 +44740 42635 +47412 42637 +47416 42643 +47430 42649 +45800 42659 +47434 42665 +47436 42673 +47442 42691 +47444 42693 +47448 42697 +47458 42705 +47460 42721 +47464 42759 +51486 42763 +47494 42765 +47498 42771 +47500 42773 +47506 42777 +47508 42787 +47512 42789 +47522 42793 +47524 42801 +47528 42819 +47554 42821 +47556 42825 +47560 42833 +47568 42849 +47630 42883 +47638 42885 +47642 42889 +47644 42897 +47654 42913 +47658 42945 +32276 43039 +47660 43055 +32280 43063 +47666 43067 +47668 43069 +47750 43087 +32290 43095 +47878 43101 +47686 43115 +47882 43117 +47884 43123 +47890 43125 +47892 43129 +32296 43163 +44960 43165 +32386 43175 +43940 43179 +47690 43181 +47896 43189 +47906 43193 +47938 43207 +47692 43211 +47940 43213 +50028 43219 +48156 43221 +48204 43225 +48390 43237 +48450 43241 +48898 43249 +32388 43279 +49644 43293 +49652 43309 +32392 43315 +49656 43317 +49726 43321 +49774 43341 +49838 43377 +49846 43405 +49850 43441 +48150 43459 +49894 43461 +49898 43465 +49900 43473 +49906 43489 +47698 43535 +32400 43543 +47700 43547 +48900 43549 +47704 43559 +44708 43563 +47728 43565 +47754 43571 +49908 43573 +47912 43577 +49912 43591 +47944 43595 +49966 43597 +50010 43603 +48646 43619 +50022 43625 +50026 43633 +50034 43655 +47714 43659 +50062 43661 +47778 43683 +50074 43697 +48402 43715 +50076 43717 +47952 43721 +50086 43729 +51882 43745 +50090 43789 +50092 43795 +50098 43797 +50122 43801 +50124 43813 +50136 43817 +50146 43825 +50148 43843 +50152 43845 +50160 43849 +50350 43857 +50362 43873 +50364 43909 +50410 43913 +50418 43921 +50420 43937 +50424 43969 +50718 44047 +32416 44055 +50610 44059 +50612 44061 +50616 44071 +48706 44075 +50634 44077 +50636 44103 +50648 44107 +50658 44109 +50660 44115 +50664 44117 +50672 44121 +50734 44131 +50746 44133 +50748 44137 +50766 44145 +50778 44167 +50790 44171 +50794 44173 +50802 44179 +50804 44181 +50808 44185 +50830 44195 +50838 44197 +50842 44201 +50854 44209 +50858 44227 +50866 44229 +50868 44233 +50872 44241 +50886 44257 +52494 44295 +50890 44301 +50892 44307 +50898 44309 +50900 44313 +50904 44323 +50914 44325 +50916 44329 +50920 44337 +50928 44355 +50958 44357 +50970 44361 +50982 44369 +50986 44385 +50994 44419 +51014 44421 +51018 44425 +52506 44433 +51020 44449 +51026 44481 +51028 44557 +52508 44563 +51032 44565 +57438 44569 +51042 44581 +51044 44585 +51048 44593 +51056 44611 +51078 44613 +51082 44617 +51084 44625 +51090 44641 +51092 44677 +51096 44681 +51106 44689 +58026 44705 +51108 44737 +48658 44805 +57454 44809 +51112 44817 +51120 44833 +51138 44865 +51140 44929 +51144 45087 +51152 45103 +51168 45111 +51262 45117 +51294 45135 +51310 45143 +51318 45147 +51322 45159 +51324 45163 +51358 45171 +51374 45173 +51382 45177 +51386 45199 +32516 45207 +51388 45211 +51406 45223 +51414 45227 +51418 45237 +51430 45241 +51434 45255 +51442 45261 +51444 45267 +51448 45269 +51502 45273 +51510 45285 +51514 45289 +51516 45297 +31814 45335 +51534 45339 +51546 45351 +51558 45355 +26340 45363 +32068 45365 +47908 45369 +51562 45383 +51570 45387 +51572 45395 +51576 45397 +51598 45401 +51606 45411 +51610 45413 +51622 45417 +51626 45425 +32292 45447 +51634 45451 +32322 45459 +32328 45461 +51636 45465 +51640 45475 +51654 45477 +51658 45481 +51660 45489 +51666 45507 +51668 45509 +51672 45513 +51682 45521 +51684 45537 +51688 45591 +51696 45595 +51742 45607 +51758 45611 +26468 45619 +31844 45621 +51766 45625 +51770 45639 +51772 45643 +32324 45651 +32448 45653 +51790 45657 +51798 45667 +51802 45669 +51814 45673 +51818 45681 +53702 45703 +51826 45707 +51828 45715 +51832 45717 +51854 45721 +48002 45731 +51862 45733 +51866 45737 +51878 45745 +51890 45763 +51892 45765 +51896 45769 +51910 45777 +51914 45793 +51916 45831 +51922 45837 +28260 45843 +51924 45845 +51928 45849 +30308 45859 +51938 45861 +51940 45865 +51944 45873 +51952 45891 +51982 45893 +51990 45897 +51994 45905 +52006 45921 +52010 45955 +52018 45957 +52038 45961 +52042 45969 +53562 45985 +52044 46017 +52050 46103 +52052 46107 +52056 46119 +52066 46123 +52068 46131 +52072 46133 +52102 46137 +52106 46151 +52108 46155 +52114 46163 +52518 46165 +52116 46169 +52120 46179 +52132 46181 +52162 46185 +52164 46193 +52168 46215 +52176 46219 +52270 46227 +52282 46229 +52284 46233 +52302 46243 +52316 46245 +52326 46249 +52330 46257 +52332 46275 +52338 46277 +52340 46281 +52344 46289 +52366 46305 +52374 46343 +52378 46347 +52380 46355 +52390 46357 +52394 46361 +52396 46371 +52402 46373 +52404 46377 +53430 46385 +52408 46403 +52422 46405 +52464 46409 +54038 46417 +53658 46433 +52522 46467 +52524 46469 +52530 46473 +52532 46481 +52536 46497 +53564 46529 +52550 46599 +52554 46603 +57654 46611 +52562 46613 +52564 46617 +52568 46627 +52578 46629 +52580 46633 +52584 46641 +52592 46659 +53846 46661 +52614 46665 +57462 46673 +52618 46689 +52626 46723 +52628 46725 +52632 46729 +52642 46737 +52644 46753 +52656 46785 +61494 46851 +52704 46853 +52750 46857 +61718 46865 +61974 46881 +61526 46913 +53646 46977 +32520 47127 +52762 47131 +52764 47143 +52774 47147 +53814 47155 +52778 47157 +52780 47161 +52786 47175 +52788 47179 +52806 47187 +52818 47189 +52820 47193 +52834 47203 +52998 47205 +53002 47209 +53010 47217 +53012 47239 +53016 47243 +53026 47251 +53028 47253 +53040 47257 +53058 47267 +53060 47269 +53072 47273 +53088 47281 +53122 47299 +53136 47301 +53434 47305 +53436 47313 +53454 47329 +53714 47367 +53468 47371 +61734 47379 +53478 47381 +53482 47385 +53484 47397 +53490 47401 +53610 47409 +53612 47427 +53660 47429 +53670 47433 +53674 47441 +53676 47457 +61722 47493 +53682 47497 +53706 47505 +53708 47521 +53716 47553 +53720 47637 +53730 47641 +57686 47653 +53732 47665 +53736 47683 +53744 47685 +53806 47689 +53818 47697 +57630 47713 +61738 47749 +57902 47761 +59562 47777 +53820 47809 +53838 47877 +53850 47881 +53852 47889 +61746 47905 +53862 47937 +53866 48001 +53868 48135 +53874 48141 +54042 48147 +53902 48149 +53910 48153 +57466 48165 +57518 48169 +57468 48177 +53914 48195 +53916 48197 +53926 48201 +57530 48209 +57532 48225 +53930 48259 +53938 48261 +57646 48265 +57660 48273 +53958 48321 +57690 48387 +55326 48389 +57502 48393 +57692 48401 +57886 48417 +57678 48449 +57770 48513 +57910 48645 +57914 48649 +61486 48657 +57934 48673 +58414 48705 +59438 48769 +61500 48897 +40864 49215 +53962 49247 +53964 49263 +53970 49271 +52648 49359 +53972 49395 +44932 49439 +46860 49455 +47824 49463 +48708 49467 +48142 49469 +48004 49487 +47720 49501 +46984 49517 +48198 49523 +53976 49525 +53986 49529 +53988 49551 +48166 49565 +48322 49581 +53992 49587 +54000 49589 +54066 49593 +30384 49607 +54086 49611 +52688 49613 +54090 49619 +48180 49621 +54098 49625 +54114 49635 +54150 49637 +54154 49641 +54162 49649 +48202 49695 +54178 49711 +48216 49719 +54210 49723 +48396 49725 +48228 49743 +48212 49757 +48324 49773 +48336 49779 +54224 49781 +54240 49785 +54318 49807 +48404 49821 +48452 49837 +54326 49843 +54330 49845 +54350 49863 +54362 49867 +52824 49869 +54364 49875 +54374 49877 +57526 49881 +54378 49891 +54380 49905 +46896 49935 +46980 49943 +47920 49947 +48262 49949 +48408 49959 +54386 49963 +48456 49965 +48516 49971 +48328 49973 +46000 49991 +54388 49995 +47008 49997 +47756 50005 +48016 50009 +48394 50021 +48528 50025 +54392 50033 +31408 50055 +46512 50059 +48576 50061 +54414 50097 +47536 50117 +48154 50129 +48660 50207 +48664 50223 +48652 50231 +54422 50235 +48352 50237 +52810 50255 +52836 50269 +52840 50285 +54426 50291 +54428 50293 +54438 50297 +53064 50319 +52848 50333 +53124 50349 +54442 50355 +54444 50357 +54450 50375 +54452 50379 +52434 50381 +54456 50387 +54470 50403 +54476 50417 +48418 50461 +48420 50477 +47762 50485 +48268 50489 +54474 50509 +43704 50517 +47768 50521 +44696 50533 +48424 50537 +48170 50545 +54482 50573 +48008 50581 +48172 50585 +54498 50597 +54512 50601 +48720 50609 +52870 50629 +52882 50633 +54542 50641 +54554 50657 +48650 50717 +48676 50733 +48514 50741 +48736 50745 +54566 50765 +48674 50773 +54570 50777 +54578 50789 +54602 50793 +54626 50801 +54662 50829 +54666 50837 +54668 50841 +54674 50853 +54690 50857 +54798 50865 +54806 50885 +54810 50889 +54822 50897 +54834 50913 +54854 50951 +47764 50963 +54858 50965 +54866 50969 +54882 50979 +54918 50981 +54922 50985 +54930 50993 +54946 51011 +55050 51013 +55074 51017 +47780 51025 +48178 51041 +55106 51075 +55108 51077 +57558 51081 +48184 51089 +55112 51105 +55170 51137 +55176 51231 +32528 51255 +48912 51259 +53184 51279 +55342 51293 +55350 51309 +55354 51315 +61748 51317 +55374 51357 +55382 51373 +55386 51379 +55398 51399 +52426 51405 +55410 51411 +55416 51427 +55438 51441 +55446 51569 +55450 51633 +55462 51665 +55466 51681 +55474 51825 +57574 51921 +55476 51987 +55480 51989 +55494 51993 +57702 52003 +55498 52017 +57756 52035 +62226 52037 +55500 52049 +55506 52065 +57708 52099 +61556 52113 +55522 52239 +32544 52247 +55536 52251 +55590 52253 +55594 52263 +55626 52267 +55822 52269 +48520 52277 +56070 52295 +56074 52299 +52674 52301 +55046 52309 +56130 52313 +56132 52325 +56136 52329 +56194 52337 +56196 52359 +52884 52365 +56200 52421 +56256 52433 +57766 52449 +56358 52499 +56370 52501 +57550 52515 +56496 52529 +56586 52547 +55172 52561 +56594 52577 +57706 52611 +56596 52625 +57750 52673 +57562 52755 +57754 52771 +57958 52803 +57826 52817 +58572 52881 +56600 52995 +56838 53009 +56852 53025 +56850 53057 +57916 53121 +48712 53279 +56866 53295 +48832 53309 +56856 53327 +57772 53363 +55402 53365 +57090 53369 +57564 53391 +57998 53427 +57798 53429 +57946 53433 +56880 53453 +57742 53459 +57802 53475 +57804 53489 +48266 53533 +48544 53549 +48680 53557 +48928 53561 +55566 53581 +43752 53589 +48776 53593 +55058 53605 +55574 53609 +57828 53617 +56868 53645 +48770 53653 +48772 53657 +55698 53669 +56842 53673 +61752 53681 +55412 53701 +56610 53705 +55578 53713 +57832 53729 +48904 53789 +57840 53805 +58066 53813 +57942 53837 +55602 53845 +56616 53849 +56872 53861 +57104 53865 +61498 53873 +57962 53901 +57152 53909 +58068 53913 +59266 53925 +58072 53929 +61542 53937 +61554 53957 +58096 53969 +58398 53985 +48276 54085 +48280 54089 +61778 54097 +58608 54149 +58446 54209 +55622 54301 +58458 54317 +56582 54325 +58470 54329 +55232 54349 +43944 54357 +55634 54361 +55650 54373 +55686 54377 +56342 54385 +58476 54413 +55970 54421 +58510 54425 +58546 54437 +58548 54441 +58552 54449 +56612 54469 +59268 54473 +58454 54481 +59272 54497 +44712 54549 +56432 54553 +56624 54565 +59422 54569 +47784 54597 +57578 54601 +54610 54609 +61530 54625 +57580 54661 +57964 54665 +59506 54673 +61620 54805 +59542 54809 +59596 54821 +58460 54853 +59632 54917 +61724 55043 +61766 55045 +61518 55049 +62738 55057 +61740 55073 +62486 55105 +60226 55169 +61532 55325 +60232 55373 +61546 55381 +61548 55385 +61770 55397 +61710 55409 +60228 55449 +61560 55461 +61772 56067 +61780 56069 +61784 56073 +62228 56081 +61794 56097 +61978 56129 +62028 56193 +61624 56369 +60706 56579 +59470 56593 +60708 56609 +61842 56641 +61990 56705 +60946 56835 +61650 56849 +61834 57089 +32640 57375 +48960 57391 +57120 57423 +61796 57459 +61848 57461 +61800 57465 +60712 57487 +61858 57525 +61966 57529 +62022 57555 +61200 57585 +61980 59139 +62026 59141 +61830 59145 +61844 60165 +62276 60169 +61860 60675 +61582 61185 +32576 61463 +57216 61467 +49024 61469 +61216 61479 +61248 61483 +62214 61491 +62726 61493 +62220 61497 +61312 61517 +62218 61523 +62730 61525 +62478 61529 +62732 61539 +62740 61541 +61890 61553 +62982 61587 +62086 61617 +62490 61649 +62274 61703 +62280 61707 +62754 61709 +63234 61959 +63236 61963 +62232 62211 +62760 62213 +62996 62217 +64264 62477 +62986 62723 +62744 62725 +62994 62729 +62988 62979 +63000 62981 +63240 63233 +63010 63747 +64260 64257 +64770 64769 diff --git a/research/complex-small-m-lower-bounds/data/cert_m4_g2_M0.txt b/research/complex-small-m-lower-bounds/data/cert_m4_g2_M0.txt new file mode 100644 index 0000000000..c205e36cd1 --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m4_g2_M0.txt @@ -0,0 +1,3037 @@ +m 4 k 8 lab 3 alpha 0 p 2147483629 I 1518275076 size 3036 +510 503 +766 507 +1278 509 +894 887 +958 891 +990 893 +1662 983 +1726 987 +1758 989 +1014 1011 +1018 1013 +1782 1017 +1406 1399 +1470 1403 +1502 1405 +1774 1463 +2430 1467 +2494 1469 +1526 1523 +1530 1525 +1786 1529 +2686 1655 +1006 1659 +1518 1661 +3198 1719 +2750 1723 +3294 1725 +1020 1779 +1532 1781 +2554 1785 +1854 1847 +2878 1851 +1902 1853 +1886 1879 +1950 1883 +3422 1885 +1966 1895 +1998 1899 +2910 1901 +1910 1907 +1914 1909 +1974 1913 +3390 1943 +2926 1947 +3438 1949 +2974 1959 +2990 1963 +3502 1965 +2934 1971 +1916 1973 +1978 1977 +3486 1991 +3022 1995 +3534 1997 +2012 2003 +3446 2005 +2938 2009 +2940 2019 +3450 2021 +3036 2025 +2034 2033 +1788 2547 +2806 2803 +1980 2931 +2006 2933 +2022 2937 +2998 2995 +3030 2997 +3046 3001 +2028 3027 +3510 3029 +3002 3033 +3004 3043 +3514 3045 +3052 3049 +2036 3057 +3318 3317 +2010 3445 +2026 3449 +3034 3509 +3050 3513 +3542 3541 +3558 3545 +3546 3557 +3562 3561 +2040 3569 +3870 3863 +3886 3867 +3918 3869 +3894 3891 +3898 3893 +3942 3897 +3926 3923 +3930 3925 +3946 3929 +3900 3939 +3932 3941 +3994 3945 +3954 3953 +3948 3987 +4006 4003 +3956 4017 +4038 4037 +3960 4049 +4350 4343 +8446 4347 +16638 4349 +4478 4471 +4542 4475 +4574 4477 +4734 4535 +4798 4539 +4830 4541 +5246 4567 +5310 4571 +5342 4573 +6270 4583 +6334 4587 +6366 4589 +4598 4595 +4602 4597 +4854 4601 +8574 4727 +8638 4731 +4590 4733 +8830 4791 +8894 4795 +4846 4797 +9342 4823 +9406 4827 +5358 4829 +10366 4839 +10430 4843 +6382 4845 +8694 4851 +4604 4853 +4858 4857 +4926 4919 +9022 4923 +4974 4925 +4958 4951 +5022 4955 +5726 4957 +5038 4967 +5070 4971 +5694 4973 +4982 4979 +4986 4981 +5046 4985 +9054 5015 +9070 5019 +5742 5021 +9118 5031 +9134 5035 +5806 5037 +9078 5043 +4988 5045 +5050 5049 +5790 5063 +9166 5067 +5838 5069 +5084 5075 +5750 5077 +5754 5081 +9084 5091 +5756 5093 +5818 5097 +5106 5105 +16766 5239 +8670 5243 +16862 5245 +17022 5303 +8926 5307 +17118 5309 +17534 5335 +9438 5339 +17630 5341 +18558 5351 +10462 5355 +18654 5357 +5372 5363 +16886 5365 +8698 5369 +5438 5431 +6462 5435 +5486 5437 +5470 5463 +5534 5467 +17758 5469 +5550 5479 +5582 5483 +6494 5485 +5494 5491 +5498 5493 +5558 5497 +17726 5527 +6510 5531 +17774 5533 +6558 5543 +6574 5547 +17838 5549 +5820 5555 +5500 5557 +5562 5561 +17822 5575 +6606 5579 +17870 5581 +5596 5587 +17782 5589 +5850 5593 +6518 5603 +17786 5605 +5852 5609 +5618 5617 +6718 5687 +7230 5691 +6766 5693 +6750 5719 +6814 5723 +7262 5725 +6830 5735 +6862 5739 +9534 5741 +5078 5747 +5082 5749 +5094 5753 +7326 5783 +7278 5787 +9566 5789 +7342 5799 +9582 5803 +9646 5805 +5564 5811 +5098 5813 +6582 5817 +7374 5831 +9630 5835 +9678 5837 +5590 5843 +5606 5845 +9082 5849 +7292 5859 +6778 5861 +9594 5865 +5108 5873 +5918 5911 +5934 5915 +5966 5917 +6942 5927 +6958 5931 +6990 5933 +5942 5939 +5946 5941 +5990 5945 +7454 5959 +7470 5963 +7502 5965 +5974 5971 +5978 5973 +5994 5977 +5948 5987 +5980 5989 +6042 5993 +6002 6001 +7710 6023 +7726 6027 +7758 6029 +5996 6035 +6966 6037 +6998 6041 +6054 6051 +7002 6053 +7014 6057 +6004 6065 +7018 6083 +6086 6085 +7110 6089 +6008 6097 +7026 6113 +16830 6263 +8686 6267 +16878 6269 +17086 6327 +8942 6331 +17134 6333 +17598 6359 +9454 6363 +17646 6365 +18622 6375 +10478 6379 +18670 6381 +8700 6387 +16890 6389 +9468 6393 +17214 6455 +9790 6459 +17262 6461 +17246 6487 +9822 6491 +18014 6493 +17310 6503 +9838 6507 +17358 6509 +9174 6515 +17270 6517 +5612 6521 +17982 6551 +9886 6555 +18030 6557 +17326 6567 +9902 6571 +18094 6573 +9590 6579 +17274 6581 +5814 6585 +18078 6599 +9934 6603 +18126 6605 +9180 6611 +17846 6613 +9596 6617 +9692 6627 +17850 6629 +9846 6633 +5620 6641 +10558 6711 +10814 6715 +10606 6717 +10590 6743 +10654 6747 +19038 6749 +10670 6759 +10702 6763 +10846 6765 +9654 6771 +5866 6773 +9658 6777 +19006 6807 +10862 6811 +19054 6813 +10910 6823 +10926 6827 +19118 6829 +9852 6835 +6842 6837 +9660 6841 +19102 6855 +10958 6859 +19150 6861 +9708 6867 +18038 6869 +9850 6873 +9910 6883 +18042 6885 +9948 6889 +5874 6897 +10014 6935 +10030 6939 +6030 6941 +11038 6951 +11054 6955 +7054 6957 +10038 6963 +6038 6965 +6970 6969 +11550 6983 +11566 6987 +7566 6989 +10070 6995 +6044 6997 +6058 7001 +10044 7011 +6060 7013 +6090 7017 +6066 7025 +11806 7047 +11822 7051 +7822 7053 +10086 7059 +7062 7061 +7078 7065 +10150 7075 +7066 7077 +7082 7081 +6068 7089 +10092 7107 +6092 7109 +7114 7113 +6072 7121 +7090 7137 +18750 7223 +11326 7227 +18798 7229 +18782 7255 +11358 7259 +19550 7261 +18846 7271 +11374 7275 +18894 7277 +5868 7283 +17366 7285 +9178 7289 +19518 7319 +11422 7323 +19566 7325 +18862 7335 +11438 7339 +19630 7341 +9916 7347 +17370 7349 +9964 7353 +19614 7367 +11470 7371 +19662 7373 +7388 7379 +18102 7381 +9914 7385 +11388 7395 +18106 7397 +11484 7401 +5880 7409 +18206 7447 +10062 7451 +18254 7453 +19230 7463 +11086 7467 +19278 7469 +7484 7475 +18230 7477 +10042 7481 +19742 7495 +11598 7499 +19790 7501 +7516 7507 +18262 7509 +10074 7513 +7532 7523 +18266 7525 +10076 7529 +6098 7537 +19998 7559 +11854 7563 +20046 7565 +7580 7571 +18278 7573 +10090 7577 +7596 7587 +18282 7589 +10138 7593 +6100 7601 +7628 7619 +18374 7621 +10182 7625 +6104 7633 +7122 7649 +18222 7703 +10126 7707 +18318 7709 +19246 7719 +11150 7723 +19342 7725 +10134 7731 +18234 7733 +10186 7737 +19758 7751 +11662 7755 +19854 7757 +10140 7763 +18326 7765 +11612 7769 +10154 7779 +18330 7781 +10188 7785 +6114 7793 +20014 7815 +11918 7819 +20110 7821 +11580 7827 +18342 7829 +11628 7833 +10156 7843 +18346 7845 +11692 7849 +6116 7857 +11676 7875 +18378 7877 +11724 7881 +6120 7889 +7138 7905 +7950 7943 +12046 7947 +20238 7949 +7958 7955 +7962 7957 +7974 7961 +12054 7971 +7964 7973 +7978 7977 +7986 7985 +8012 8003 +20246 8005 +12058 8009 +8018 8017 +7988 8033 +12060 8067 +20250 8069 +12108 8073 +8020 8081 +8034 8097 +8040 8129 +4860 8691 +5366 8693 +6390 8697 +8950 8947 +9462 8949 +10486 8953 +5052 9075 +5846 9077 +5100 9081 +9142 9139 +9942 9141 +9190 9145 +6524 9171 +7286 9173 +6620 9177 +9148 9187 +11382 9189 +9196 9193 +5112 9201 +6396 9459 +17142 9461 +8954 9465 +6588 9587 +5862 9589 +6614 9593 +6774 9651 +6780 9653 +6838 9657 +6636 9683 +18134 9685 +9686 9689 +6876 9699 +18138 9701 +10614 9705 +5876 9713 +6844 9843 +6870 9845 +6630 9849 +7350 9907 +7382 9909 +6886 9913 +6892 9939 +9946 9941 +9146 9945 +7356 9955 +11478 9957 +9958 9961 +6644 9969 +6972 10035 +7478 10037 +7020 10041 +7004 10067 +7510 10069 +7526 10073 +7068 10083 +7574 10085 +7116 10089 +7028 10097 +7590 10131 +7734 10133 +7766 10137 +7084 10147 +7782 10149 +7846 10153 +7032 10161 +7740 10179 +7622 10181 +7788 10185 +7540 10193 +7796 10209 +8956 10483 +17146 10485 +10492 10489 +10620 10611 +17334 10613 +9702 10617 +10870 10675 +17338 10677 +10678 10681 +10716 10707 +19062 10709 +10874 10713 +10876 10723 +19066 10725 +10972 10729 +6898 10737 +10684 10867 +10710 10869 +10726 10873 +10934 10931 +10966 10933 +10982 10937 +10732 10963 +19126 10965 +10938 10969 +10940 10979 +19130 10981 +10988 10985 +6900 10993 +11062 11059 +11574 11061 +11110 11065 +11094 11091 +11606 11093 +11622 11097 +11068 11107 +11670 11109 +11116 11113 +7092 11121 +11686 11155 +11830 11157 +11862 11161 +11174 11171 +11878 11173 +11942 11177 +7096 11185 +11836 11203 +11718 11205 +11884 11209 +7604 11217 +7860 11233 +7398 11379 +17382 11381 +9194 11385 +11446 11443 +17386 11445 +11494 11449 +7404 11475 +18150 11477 +9962 11481 +11452 11491 +18154 11493 +11500 11497 +7412 11505 +7830 11571 +19254 11573 +11066 11577 +7772 11603 +19286 11605 +11098 11609 +7836 11619 +19290 11621 +11100 11625 +7124 11633 +7878 11667 +19302 11669 +11114 11673 +7852 11683 +19306 11685 +11162 11689 +7128 11697 +7884 11715 +19398 11717 +11206 11721 +7636 11729 +7892 11745 +11158 11827 +19258 11829 +11210 11833 +11164 11859 +19350 11861 +11868 11865 +11178 11875 +19354 11877 +11212 11881 +7140 11889 +11926 11923 +19366 11925 +11974 11929 +11180 11939 +19370 11941 +11948 11945 +7144 11953 +11932 11971 +19402 11973 +11980 11977 +7652 11985 +7908 12001 +7980 12051 +8006 12053 +8070 12057 +12070 12067 +12102 12069 +12166 12073 +7992 12081 +8076 12099 +20262 12101 +12074 12105 +8036 12113 +8084 12129 +12076 12163 +20266 12165 +12172 12169 +8098 12177 +8100 12193 +8132 12225 +12414 12407 +12478 12411 +12510 12413 +24702 12503 +24766 12507 +24798 12509 +12534 12531 +12538 12533 +24822 12537 +12606 12599 +12862 12603 +12654 12605 +12638 12631 +12702 12635 +13406 12637 +12718 12647 +12750 12651 +12894 12653 +12662 12659 +12666 12661 +12726 12665 +13374 12695 +12910 12699 +13422 12701 +12958 12711 +12974 12715 +13486 12717 +12918 12723 +12668 12725 +12730 12729 +13470 12743 +13006 12747 +13518 12749 +12764 12755 +13430 12757 +12922 12761 +12924 12771 +13434 12773 +13020 12777 +12786 12785 +12732 12915 +12758 12917 +12774 12921 +12982 12979 +13014 12981 +13030 12985 +12780 13011 +13494 13013 +12986 13017 +12988 13027 +13498 13029 +13036 13033 +12788 13041 +13086 13079 +13102 13083 +13134 13085 +13110 13107 +13114 13109 +13158 13113 +13854 13127 +13870 13131 +13902 13133 +13142 13139 +13146 13141 +13162 13145 +13116 13155 +13148 13157 +13210 13161 +13170 13169 +13164 13203 +13878 13205 +13910 13209 +13222 13219 +13926 13221 +13990 13225 +13172 13233 +13884 13251 +13254 13253 +13932 13257 +13176 13265 +13940 13281 +24894 13367 +25150 13371 +24942 13373 +24926 13399 +24990 13403 +25694 13405 +25006 13415 +25038 13419 +25182 13421 +24950 13427 +12762 13429 +12778 13433 +25662 13463 +25198 13467 +25710 13469 +25246 13479 +25262 13483 +25774 13485 +25206 13491 +13018 13493 +13034 13497 +25758 13511 +25294 13515 +25806 13517 +24956 13523 +13526 13525 +13542 13529 +25212 13539 +13530 13541 +13546 13545 +12792 13553 +13598 13591 +13614 13595 +13646 13597 +13966 13607 +14622 13611 +14638 13613 +13622 13619 +13626 13621 +13670 13625 +25886 13639 +25902 13643 +25934 13645 +13654 13651 +13658 13653 +13674 13657 +13628 13667 +13660 13669 +13722 13673 +13682 13681 +26142 13703 +26158 13707 +26190 13709 +13676 13715 +13882 13717 +13914 13721 +13734 13731 +13916 13733 +13930 13737 +13684 13745 +13978 13763 +13766 13765 +14022 13769 +13688 13777 +13938 13793 +14878 13847 +13198 13851 +13710 13853 +15390 13863 +14894 13867 +15438 13869 +13206 13875 +13718 13877 +13258 13881 +25374 13895 +25390 13899 +25422 13901 +13212 13907 +13724 13909 +13738 13913 +13226 13923 +13740 13925 +13260 13929 +13266 13937 +27166 13959 +27182 13963 +25998 13965 +13770 13971 +14650 13973 +14682 13977 +13228 13987 +14684 13989 +14698 13993 +13268 14001 +14652 14019 +13772 14021 +14746 14025 +13272 14033 +13752 14049 +14094 14087 +15118 14091 +15630 14093 +14102 14099 +14106 14101 +14118 14105 +15126 14115 +14108 14117 +14122 14121 +14130 14129 +14156 14147 +15638 14149 +15130 14153 +14162 14161 +14132 14177 +15132 14211 +15642 14213 +15180 14217 +14164 14225 +14178 14241 +14184 14273 +25014 14451 +25046 14453 +25062 14457 +25270 14515 +25302 14517 +25318 14521 +25020 14547 +25052 14549 +25068 14553 +25276 14563 +25308 14565 +25324 14569 +25076 14577 +13974 14643 +14026 14645 +25398 14649 +13980 14675 +13994 14677 +25430 14681 +13996 14691 +25404 14693 +25446 14697 +13746 14705 +14028 14739 +25910 14741 +25942 14745 +25510 14755 +25958 14757 +26022 14761 +13748 14769 +25916 14787 +25452 14789 +25964 14793 +25460 14801 +25972 14817 +14902 14899 +26166 14901 +14950 14905 +14934 14931 +26198 14933 +26214 14937 +14908 14947 +26172 14949 +14956 14953 +13944 14961 +26278 14995 +27190 14997 +27222 15001 +15014 15011 +27238 15013 +27302 15017 +14004 15025 +27196 15043 +26220 15045 +27244 15049 +26036 15057 +26228 15073 +14124 15123 +14150 15125 +14214 15129 +15142 15139 +15174 15141 +15238 15145 +14136 15153 +14220 15171 +15654 15173 +15146 15177 +14180 15185 +14228 15201 +15148 15235 +15658 15237 +15244 15241 +14242 15249 +14244 15265 +14276 15297 +26254 15383 +25486 15387 +26910 15389 +25494 15411 +15414 15413 +25542 15417 +27678 15431 +26926 15435 +27726 15437 +25436 15443 +15446 15445 +15462 15449 +25500 15459 +15450 15461 +15466 15465 +14002 15473 +25548 15507 +26204 15509 +26310 15513 +25516 15523 +26262 15525 +26284 15529 +25556 15537 +26268 15555 +15558 15557 +26316 15561 +14008 15569 +26292 15585 +26382 15623 +27406 15627 +27918 15629 +26390 15635 +14154 15637 +14218 15641 +27414 15651 +15178 15653 +15242 15657 +14226 15665 +26396 15683 +15686 15685 +15750 15689 +14168 15697 +14232 15713 +27420 15747 +15690 15749 +15754 15753 +14274 15761 +14248 15777 +14280 15809 +26406 15891 +26438 15893 +26502 15897 +27430 15907 +27462 15909 +27526 15913 +26420 15921 +26412 15939 +26444 15941 +26508 15945 +26452 15953 +26468 15969 +27436 16003 +27468 16005 +27532 16009 +26516 16017 +26532 16033 +26564 16065 +16134 16131 +16138 16133 +28422 16137 +16146 16145 +16148 16161 +16152 16193 +28436 16257 +5370 16885 +6394 16889 +9466 17141 +10490 17145 +6522 17269 +6586 17273 +10618 17333 +10682 17337 +7290 17365 +7354 17369 +11386 17381 +11450 17385 +6642 17393 +17654 17653 +18678 17657 +5594 17781 +5610 17785 +6618 17845 +6634 17849 +17878 17877 +17894 17881 +17882 17893 +17898 17897 +5624 17905 +6874 18037 +6890 18041 +7386 18101 +7402 18105 +9690 18133 +9706 18137 +11482 18149 +11498 18153 +6648 18161 +7482 18229 +7738 18233 +7514 18261 +7530 18265 +7578 18277 +7594 18281 +7538 18289 +7770 18325 +7786 18329 +7834 18341 +7850 18345 +7794 18353 +7626 18373 +7882 18377 +7544 18385 +7800 18401 +17658 18677 +18682 18681 +18806 18805 +18870 18809 +18810 18869 +18874 18873 +19574 18901 +19638 18905 +19578 18917 +19642 18921 +7410 18929 +10714 19061 +10730 19065 +10970 19125 +10986 19129 +19158 19157 +19174 19161 +19162 19173 +19178 19177 +6904 19185 +11578 19253 +11834 19257 +11610 19285 +11626 19289 +11674 19301 +11690 19305 +7602 19313 +11866 19349 +11882 19353 +11930 19365 +11946 19369 +7858 19377 +11722 19397 +11978 19401 +7608 19409 +7864 19425 +18902 19573 +18918 19577 +18906 19637 +18922 19641 +19670 19669 +19686 19673 +19674 19685 +19690 19689 +7416 19697 +19766 19765 +20022 19769 +19798 19797 +19814 19801 +19802 19813 +19818 19817 +7634 19825 +20054 19861 +20070 19865 +20058 19877 +20074 19881 +7890 19889 +19910 19909 +20166 19913 +7640 19921 +7896 19937 +19770 20021 +20026 20025 +19862 20053 +19878 20057 +19866 20069 +19882 20073 +7650 20081 +20118 20117 +20134 20121 +20122 20133 +20138 20137 +7906 20145 +19914 20165 +20170 20169 +7656 20177 +7912 20193 +8010 20245 +8074 20249 +12106 20261 +12170 20265 +8082 20273 +20294 20293 +20358 20297 +8024 20305 +8088 20321 +20298 20357 +20362 20361 +8130 20369 +8104 20385 +8136 20417 +20606 20599 +20670 20603 +20702 20605 +24814 20663 +36990 20667 +37054 20669 +20726 20723 +20730 20725 +24826 20729 +20798 20791 +21054 20795 +20846 20797 +20830 20823 +20894 20827 +21598 20829 +20910 20839 +20942 20843 +21086 20845 +20854 20851 +20858 20853 +20918 20857 +21566 20887 +21102 20891 +21614 20893 +21150 20903 +21166 20907 +21678 20909 +21110 20915 +20860 20917 +20922 20921 +21662 20935 +21198 20939 +21710 20941 +20956 20947 +21622 20949 +21114 20953 +21116 20963 +21626 20965 +21212 20969 +20978 20977 +26686 21047 +37182 21051 +37230 21053 +26718 21079 +37214 21083 +37278 21085 +26734 21095 +37294 21099 +37438 21101 +20924 21107 +20950 21109 +20966 21113 +26782 21143 +37326 21147 +37470 21149 +26798 21159 +37486 21163 +37550 21165 +21174 21171 +21206 21173 +21222 21177 +26830 21191 +37534 21195 +37582 21197 +20972 21203 +21686 21205 +21178 21209 +21180 21219 +21690 21221 +21228 21225 +20980 21233 +21278 21271 +21294 21275 +21326 21277 +26958 21287 +37662 21291 +37678 21293 +21302 21299 +21306 21301 +21350 21305 +22046 21319 +22062 21323 +22094 21325 +21334 21331 +21338 21333 +21354 21337 +21308 21347 +21340 21349 +21402 21353 +21362 21361 +27694 21383 +38430 21387 +38446 21389 +21356 21395 +22070 21397 +22102 21401 +21414 21411 +22118 21413 +22182 21417 +21364 21425 +22076 21443 +21446 21445 +22124 21449 +21368 21457 +22132 21473 +24954 21619 +20954 21621 +20970 21625 +25210 21683 +21210 21685 +21226 21689 +25718 21715 +21718 21717 +21734 21721 +25722 21731 +21722 21733 +21738 21737 +20984 21745 +21790 21783 +21806 21787 +21838 21789 +22158 21799 +22814 21803 +22830 21805 +21814 21811 +21818 21813 +21862 21817 +21846 21843 +21850 21845 +21866 21849 +21820 21859 +21852 21861 +21914 21865 +21874 21873 +21868 21907 +22074 21909 +22106 21913 +21926 21923 +22108 21925 +22122 21929 +21876 21937 +22170 21955 +21958 21957 +22214 21961 +21880 21969 +22130 21985 +23070 22039 +21390 22043 +21902 22045 +23582 22055 +23086 22059 +23630 22061 +21398 22067 +21910 22069 +21450 22073 +27214 22087 +37710 22091 +37774 22093 +21404 22099 +21916 22101 +21930 22105 +21418 22115 +21932 22117 +21452 22121 +21458 22129 +27790 22151 +38174 22155 +38190 22157 +21962 22163 +22842 22165 +22874 22169 +21420 22179 +22876 22181 +22890 22185 +21460 22193 +22844 22211 +21964 22213 +22938 22217 +21464 22225 +21944 22241 +22286 22279 +23310 22283 +23822 22285 +22294 22291 +22298 22293 +22310 22297 +23318 22307 +22300 22309 +22314 22313 +22322 22321 +22348 22339 +23830 22341 +23322 22345 +22354 22353 +22324 22369 +23324 22403 +23834 22405 +23372 22409 +22356 22417 +22370 22433 +22376 22465 +25018 22643 +25050 22645 +25066 22649 +25274 22707 +25306 22709 +25322 22713 +25782 22739 +25814 22741 +25830 22745 +25786 22755 +25818 22757 +25834 22761 +25074 22769 +22166 22835 +22218 22837 +25402 22841 +22172 22867 +22186 22869 +25434 22873 +22188 22883 +25498 22885 +25450 22889 +21938 22897 +22220 22931 +25914 22933 +25946 22937 +25514 22947 +25948 22949 +25962 22953 +21940 22961 +26010 22979 +25546 22981 +26054 22985 +25458 22993 +25970 23009 +27022 23063 +38222 23067 +38286 23069 +27278 23079 +39198 23083 +39214 23085 +23094 23091 +26006 23093 +23142 23097 +23126 23123 +26012 23125 +26026 23129 +23100 23139 +26028 23141 +23148 23145 +22136 23153 +26058 23187 +26170 23189 +26202 23193 +23206 23203 +26218 23205 +26282 23209 +22196 23217 +26266 23235 +26060 23237 +26314 23241 +26034 23249 +26226 23265 +28174 23303 +38670 23307 +39694 23309 +22316 23315 +22342 23317 +22406 23321 +23334 23331 +23366 23333 +23430 23337 +22328 23345 +22412 23363 +23846 23365 +23338 23369 +22372 23377 +22420 23393 +23340 23427 +23850 23429 +23436 23433 +22434 23441 +22436 23457 +22468 23489 +26938 23603 +23606 23605 +26986 23609 +26970 23635 +23638 23637 +23654 23641 +26940 23651 +23642 23653 +23658 23657 +22194 23665 +26972 23699 +27702 23701 +27734 23705 +27034 23715 +27738 23717 +27750 23721 +25554 23729 +27754 23747 +23750 23749 +27846 23753 +22200 23761 +26290 23777 +26394 23827 +22346 23829 +22410 23833 +27418 23843 +23370 23845 +23434 23849 +22418 23857 +27926 23875 +23878 23877 +23942 23881 +22360 23889 +22424 23905 +27930 23939 +23882 23941 +23946 23945 +22466 23953 +22440 23969 +22472 24001 +26410 24083 +26442 24085 +26506 24089 +27434 24099 +27466 24101 +27530 24105 +26418 24113 +27942 24131 +27974 24133 +28038 24137 +26450 24145 +26466 24161 +27946 24195 +27978 24197 +28042 24201 +26514 24209 +26530 24225 +26562 24257 +24326 24323 +24330 24325 +28426 24329 +24338 24337 +24340 24353 +24344 24385 +28434 24449 +41086 24695 +12526 24699 +20718 24701 +49278 24759 +41150 24763 +49374 24765 +12540 24819 +20732 24821 +37114 24825 +41278 24887 +14398 24891 +22590 24893 +41310 24919 +14430 24923 +22622 24925 +41326 24935 +14446 24939 +22638 24941 +13436 24947 +21628 24949 +13532 24953 +41374 24983 +14494 24987 +22686 24989 +41390 24999 +14510 25003 +22702 25005 +14454 25011 +22646 25013 +14550 25017 +41422 25031 +14542 25035 +22734 25037 +14458 25043 +22650 25045 +14554 25049 +14460 25059 +22652 25061 +14556 25065 +13554 25073 +49470 25143 +41534 25147 +49518 25149 +49502 25175 +41566 25179 +50270 25181 +49566 25191 +41582 25195 +49614 25197 +13500 25203 +21692 25205 +13548 25209 +50238 25239 +41630 25243 +50286 25245 +49582 25255 +41646 25259 +50350 25261 +14518 25267 +22710 25269 +14566 25273 +50334 25287 +41678 25291 +50382 25293 +14522 25299 +22714 25301 +14570 25305 +14524 25315 +22716 25317 +14572 25321 +13556 25329 +41758 25367 +14670 25371 +22862 25373 +49950 25383 +41774 25387 +49998 25389 +14646 25395 +22838 25397 +14694 25401 +42526 25415 +15406 25419 +23598 25421 +14678 25427 +22870 25429 +15452 25433 +14700 25443 +22886 25445 +14790 25449 +14034 25457 +50718 25479 +42542 25483 +50766 25485 +15418 25491 +22892 25493 +15468 25497 +14758 25507 +22950 25509 +15526 25513 +14036 25521 +15420 25539 +22982 25541 +15514 25545 +14040 25553 +15476 25569 +37242 25715 +21724 25717 +21740 25721 +37244 25779 +22742 25781 +22758 25785 +37498 25811 +22746 25813 +22762 25817 +37500 25827 +22748 25829 +22764 25833 +13560 25841 +42270 25879 +14734 25883 +22926 25885 +42574 25895 +14926 25899 +23118 25901 +14742 25907 +22934 25909 +14794 25913 +50462 25927 +42286 25931 +50510 25933 +14748 25939 +22940 25941 +22954 25945 +14762 25955 +22956 25957 +14796 25961 +13778 25969 +50734 25991 +42638 25995 +50830 25997 +22986 26003 +23098 26005 +23130 26009 +14764 26019 +23132 26021 +23146 26025 +13780 26033 +23194 26051 +22988 26053 +23238 26057 +13784 26065 +14050 26081 +41806 26135 +14990 26139 +23182 26141 +43550 26151 +15502 26155 +23694 26157 +14906 26163 +23190 26165 +14954 26169 +14938 26195 +23196 26197 +15510 26201 +14940 26211 +23210 26213 +15046 26217 +13794 26225 +15530 26259 +23242 26261 +15562 26265 +15002 26275 +23212 26277 +15532 26281 +13796 26289 +15516 26307 +23244 26309 +15564 26313 +13800 26321 +15480 26337 +42766 26375 +15886 26379 +24078 26381 +15644 26387 +23836 26389 +15692 26393 +15894 26403 +24086 26405 +15942 26409 +15666 26417 +15898 26435 +24090 26437 +15946 26441 +15698 26449 +15668 26465 +15900 26499 +24092 26501 +15948 26505 +15700 26513 +15714 26529 +15720 26561 +37306 26739 +37338 26741 +37354 26745 +37308 26803 +37340 26805 +37356 26809 +37562 26835 +37594 26837 +37610 26841 +37564 26851 +37596 26853 +37612 26857 +21240 26865 +50478 26903 +41870 26907 +50574 26909 +52254 26919 +43566 26923 +52302 26925 +23610 26931 +23660 26933 +37690 26937 +23644 26963 +23706 26965 +37722 26969 +23612 26979 +37692 26981 +37724 26985 +15474 26993 +23718 27027 +38202 27029 +38234 27033 +37738 27043 +38236 27045 +38250 27049 +15572 27057 +38204 27075 +37786 27077 +38298 27081 +21432 27089 +23160 27105 +14998 27187 +38252 27189 +15050 27193 +15004 27219 +38300 27221 +38314 27225 +15018 27235 +38316 27237 +15052 27241 +14052 27249 +38346 27283 +38458 27285 +38490 27289 +15020 27299 +38492 27301 +38506 27305 +14056 27313 +38460 27331 +38348 27333 +38554 27337 +22232 27345 +23224 27361 +50958 27399 +43790 27403 +52494 27405 +15660 27411 +23852 27413 +15756 27417 +15910 27427 +24102 27429 +16006 27433 +15672 27441 +15914 27459 +24106 27461 +16010 27465 +15716 27473 +15764 27489 +15916 27523 +24108 27525 +16012 27529 +15778 27537 +15780 27553 +15812 27585 +37740 27699 +23702 27701 +37834 27705 +37788 27731 +23708 27733 +23722 27737 +37802 27747 +23724 27749 +23754 27753 +15570 27761 +37836 27795 +39226 27797 +39258 27801 +37804 27811 +39260 27813 +39274 27817 +21480 27825 +39228 27843 +23756 27845 +39322 27849 +15576 27857 +22248 27873 +38682 27923 +23884 27925 +23948 27929 +38684 27939 +24134 27941 +24198 27945 +15762 27953 +39706 27971 +24138 27973 +24202 27977 +15704 27985 +15768 28001 +39708 28035 +24140 28037 +24204 28041 +15810 28049 +15784 28065 +15816 28097 +38698 28179 +38730 28181 +38794 28185 +38700 28195 +38732 28197 +38796 28201 +23352 28209 +39722 28227 +39754 28229 +39818 28233 +23384 28241 +23400 28257 +39724 28291 +39756 28293 +39820 28297 +23448 28305 +23464 28321 +23496 28353 +16140 28419 +24332 28421 +40714 28425 +16194 28433 +16196 28449 +16200 28481 +24360 28545 +28734 28727 +45118 28731 +28782 28733 +28766 28759 +28830 28763 +53342 28765 +28846 28775 +28878 28779 +45150 28781 +28790 28787 +28794 28789 +28854 28793 +53310 28823 +45166 28827 +53358 28829 +45214 28839 +45230 28843 +53422 28845 +45174 28851 +28796 28853 +28858 28857 +53406 28871 +45262 28875 +53454 28877 +28892 28883 +53366 28885 +45178 28889 +45180 28899 +53370 28901 +45276 28905 +28914 28913 +28958 28951 +28974 28955 +29006 28957 +29214 28967 +29230 28971 +29262 28973 +28982 28979 +28986 28981 +29030 28985 +29726 28999 +29742 29003 +29774 29005 +29014 29011 +29018 29013 +29034 29017 +28988 29027 +29020 29029 +29082 29033 +29042 29041 +30750 29063 +30766 29067 +30798 29069 +29036 29075 +29238 29077 +29270 29081 +29094 29091 +29274 29093 +29286 29097 +29044 29105 +29290 29123 +29126 29125 +29382 29129 +29048 29137 +29298 29153 +45342 29207 +45358 29211 +29070 29213 +45598 29223 +45614 29227 +29326 29229 +45366 29235 +29078 29237 +29242 29241 +46110 29255 +46126 29259 +29838 29261 +45398 29267 +29084 29269 +29098 29273 +45372 29283 +29100 29285 +29130 29289 +29106 29297 +47134 29319 +47150 29323 +30862 29325 +45414 29331 +29334 29333 +29350 29337 +45478 29347 +29338 29349 +29354 29353 +29108 29361 +45420 29379 +29132 29381 +29386 29385 +29112 29393 +29362 29409 +29454 29447 +45838 29451 +30222 29453 +29462 29459 +29466 29461 +29478 29465 +45846 29475 +29468 29477 +29482 29481 +29490 29489 +29516 29507 +30230 29509 +30234 29513 +29522 29521 +29492 29537 +45852 29571 +30236 29573 +30250 29577 +29524 29585 +29538 29601 +29544 29633 +53534 29719 +45390 29723 +53582 29725 +53790 29735 +45646 29739 +53838 29741 +29756 29747 +53558 29749 +45370 29753 +54302 29767 +46158 29771 +54350 29773 +29788 29779 +53590 29781 +45402 29785 +29804 29795 +53594 29797 +45404 29801 +29138 29809 +55326 29831 +47182 29835 +55374 29837 +29852 29843 +53606 29845 +45418 29849 +29868 29859 +53610 29861 +45466 29865 +29140 29873 +29900 29891 +53702 29893 +45510 29897 +29144 29905 +29394 29921 +29966 29959 +30990 29963 +54542 29965 +29974 29971 +29978 29973 +29990 29977 +30252 29987 +29980 29989 +29994 29993 +30002 30001 +30028 30019 +54550 30021 +30282 30025 +30034 30033 +30004 30049 +30998 30083 +54554 30085 +30284 30089 +30036 30097 +30050 30113 +30056 30145 +31246 30215 +31758 30219 +46350 30221 +29510 30227 +29514 30229 +29574 30233 +29996 30243 +29578 30245 +31014 30249 +29540 30257 +30022 30275 +30086 30277 +45850 30281 +29528 30289 +29586 30305 +31772 30339 +31258 30341 +46362 30345 +29634 30353 +29602 30369 +29636 30401 +30470 30467 +30474 30469 +31494 30473 +30482 30481 +30484 30497 +30488 30529 +31506 30593 +53550 30743 +45454 30747 +53646 30749 +53806 30759 +45710 30763 +53902 30765 +45462 30771 +53562 30773 +45514 30777 +54318 30791 +46222 30795 +54414 30797 +45468 30803 +53654 30805 +46172 30809 +45482 30819 +53658 30821 +45516 30825 +29154 30833 +55342 30855 +47246 30859 +55438 30861 +46140 30867 +53670 30869 +46188 30873 +45484 30883 +53674 30885 +46252 30889 +29156 30897 +46236 30915 +53706 30917 +46284 30921 +29160 30929 +29410 30945 +54030 30983 +46606 30987 +54798 30989 +45894 30995 +54038 30997 +30092 31001 +46358 31011 +54042 31013 +30246 31017 +30008 31025 +45900 31043 +54566 31045 +46364 31049 +30052 31057 +30100 31073 +46412 31107 +54570 31109 +46614 31113 +30114 31121 +30116 31137 +30148 31169 +47374 31239 +47630 31243 +55822 31245 +46374 31251 +30346 31253 +46378 31257 +46620 31267 +31274 31269 +46380 31273 +30258 31281 +46476 31299 +54806 31301 +46618 31305 +30290 31313 +30260 31329 +46630 31363 +54810 31365 +46668 31369 +30292 31377 +30306 31393 +30312 31425 +46854 31491 +30476 31493 +31498 31497 +30498 31505 +30500 31521 +30504 31553 +31522 31617 +55566 31751 +48142 31755 +56334 31757 +30348 31763 +54086 31765 +45898 31769 +46636 31779 +54090 31781 +46732 31785 +30264 31793 +31820 31811 +54822 31813 +46634 31817 +30296 31825 +30354 31841 +48156 31875 +54826 31877 +48204 31881 +30360 31889 +30376 31905 +30408 31937 +32012 32003 +55046 32005 +46858 32009 +30530 32017 +30532 32033 +30536 32065 +31554 32129 +46860 32259 +55050 32261 +48396 32265 +30594 32273 +30596 32289 +30600 32321 +31618 32385 +32514 32513 +24828 37107 +25724 37235 +25788 37237 +26742 37299 +26806 37301 +26746 37331 +26810 37333 +26748 37347 +26812 37349 +21234 37361 +25820 37491 +25836 37493 +26838 37555 +26854 37557 +26842 37587 +26858 37589 +26844 37603 +26860 37605 +21236 37617 +26934 37683 +26982 37685 +26966 37715 +26988 37717 +27046 37731 +27706 37733 +21426 37745 +27078 37779 +27740 37781 +27756 37795 +27814 37797 +21428 37809 +27708 37827 +27802 37829 +22226 37841 +22228 37857 +27030 38195 +27082 38197 +27036 38227 +27050 38229 +27052 38243 +27194 38245 +22242 38257 +27084 38291 +27226 38293 +27228 38307 +27242 38309 +22244 38321 +27290 38339 +27334 38341 +23154 38353 +23156 38369 +27286 38451 +27338 38453 +27292 38483 +27306 38485 +27308 38499 +21474 38513 +27340 38547 +21476 38577 +27932 38675 +27948 38677 +28182 38691 +28198 38693 +23346 38705 +28186 38723 +28202 38725 +23378 38737 +23348 38753 +28188 38787 +28204 38789 +23380 38801 +23394 38817 +23442 38849 +27798 39219 +27850 39221 +27804 39251 +27818 39253 +27820 39267 +23218 39281 +27852 39315 +23220 39345 +27980 39699 +28044 39701 +28230 39715 +28294 39717 +23396 39729 +28234 39747 +28298 39749 +23444 39761 +23458 39777 +28236 39811 +28300 39813 +23490 39825 +23460 39841 +23492 39873 +28428 40707 +24354 40721 +24356 40737 +41206 41203 +41334 41331 +41430 41337 +41590 41395 +41686 41401 +41340 41427 +41436 41433 +41596 41443 +41692 41449 +25080 41457 +41398 41587 +41446 41593 +41654 41651 +41702 41657 +41404 41683 +41452 41689 +41660 41699 +41708 41705 +25332 41713 +41782 41779 +41830 41785 +41814 41811 +42582 41817 +41788 41827 +41836 41833 +25464 41841 +42550 41875 +42598 41881 +41894 41891 +42662 41897 +25524 41905 +42556 41923 +42604 41929 +26232 41937 +26996 41953 +42294 42291 +42342 42297 +42326 42323 +42300 42339 +42348 42345 +25976 42353 +42406 42403 +26068 42417 +41878 42547 +41926 42553 +41820 42579 +42588 42585 +41884 42595 +41932 42601 +25560 42609 +42646 42643 +42694 42649 +41900 42659 +42668 42665 +25572 42673 +42652 42691 +42700 42697 +26040 42705 +26084 42721 +42774 42771 +42822 42777 +43798 42787 +43846 42793 +26424 42801 +42780 42819 +42828 42825 +26456 42833 +26472 42849 +43804 42883 +43852 42889 +26520 42897 +26536 42913 +26568 42945 +43574 43571 +43622 43577 +43606 43603 +43580 43619 +43628 43625 +26296 43633 +43686 43683 +27060 43697 +42790 43795 +42886 43801 +43814 43811 +43910 43817 +27444 43825 +42796 43843 +42892 43849 +27476 43857 +27492 43873 +43820 43907 +43916 43913 +27540 43921 +27556 43937 +27588 43969 +44806 44803 +28440 44817 +28452 44833 +28860 45171 +28886 45173 +28902 45177 +45238 45235 +45270 45237 +45286 45241 +28908 45267 +53430 45269 +45242 45273 +45244 45283 +53434 45285 +45292 45289 +28916 45297 +29244 45363 +29750 45365 +29292 45369 +29276 45395 +29782 45397 +29798 45401 +29340 45411 +29846 45413 +29388 45417 +29300 45425 +29862 45459 +30774 45461 +30806 45465 +29356 45475 +30822 45477 +30886 45481 +29304 45489 +30780 45507 +29894 45509 +30828 45513 +29812 45521 +30836 45537 +45622 45619 +46134 45621 +45670 45625 +45654 45651 +46166 45653 +46182 45657 +45628 45667 +46230 45669 +45676 45673 +29364 45681 +46246 45715 +47158 45717 +47190 45721 +45734 45731 +47206 45733 +47270 45737 +29368 45745 +47164 45763 +46278 45765 +47212 45769 +29876 45777 +30900 45793 +29484 45843 +30278 45845 +29580 45849 +45862 45859 +46662 45861 +45958 45865 +29496 45873 +31004 45891 +31766 45893 +31052 45897 +29588 45905 +29592 45921 +45868 45955 +48150 45957 +45964 45961 +29604 45969 +29608 45985 +29640 46017 +30870 46131 +53814 46133 +45626 46137 +30812 46163 +53846 46165 +45658 46169 +30876 46179 +53850 46181 +45660 46185 +29396 46193 +30918 46227 +53862 46229 +45674 46233 +30892 46243 +53866 46245 +45722 46249 +29400 46257 +30924 46275 +53958 46277 +45766 46281 +29908 46289 +30932 46305 +31020 46355 +30342 46357 +31046 46361 +31254 46371 +31260 46373 +31270 46377 +30308 46385 +31116 46403 +54854 46405 +46406 46409 +30356 46417 +30370 46433 +31308 46467 +54858 46469 +47382 46473 +30402 46481 +30372 46497 +30404 46529 +31276 46611 +31302 46613 +31110 46617 +31782 46627 +31814 46629 +31366 46633 +31028 46641 +31372 46659 +46666 46661 +45866 46665 +31060 46673 +31076 46689 +31788 46723 +48198 46725 +46726 46729 +31124 46737 +31140 46753 +31172 46785 +31500 46851 +32006 46853 +32262 46857 +31508 46865 +31512 46881 +32020 46913 +32276 46977 +45718 47155 +53818 47157 +45770 47161 +45724 47187 +53910 47189 +47196 47193 +45738 47203 +53914 47205 +45772 47209 +29412 47217 +47254 47251 +53926 47253 +47302 47257 +45740 47267 +53930 47269 +47276 47273 +29416 47281 +47260 47299 +53962 47301 +47308 47305 +29924 47313 +30948 47329 +47388 47379 +54054 47381 +46470 47385 +47638 47395 +54058 47397 +47398 47401 +31282 47409 +47436 47427 +55830 47429 +47642 47433 +31314 47441 +31284 47457 +47644 47491 +55834 47493 +47692 47497 +31316 47505 +31330 47521 +31336 47553 +47404 47635 +47430 47637 +47494 47641 +47654 47651 +47686 47653 +47750 47657 +31288 47665 +47500 47683 +55846 47685 +47658 47689 +31332 47697 +31380 47713 +47660 47747 +55850 47749 +47756 47753 +31394 47761 +31396 47777 +31428 47809 +47878 47875 +48390 47877 +48646 47881 +31524 47889 +31528 47905 +32036 47937 +32292 48001 +31878 48147 +54150 48149 +45962 48153 +48166 48163 +54154 48165 +48262 48169 +31796 48177 +31884 48195 +54918 48197 +46730 48201 +31828 48209 +31844 48225 +48172 48259 +54922 48261 +48268 48265 +31892 48273 +31908 48289 +31940 48321 +32268 48387 +56070 48389 +47882 48393 +31556 48401 +31560 48417 +32068 48449 +32324 48513 +47884 48643 +56074 48645 +48652 48649 +31620 48657 +31624 48673 +32132 48705 +32388 48769 +32516 48897 +49398 49397 +49526 49525 +49590 49529 +49530 49589 +49594 49593 +50294 49621 +50358 49625 +50298 49637 +50362 49641 +25330 49649 +49974 49973 +50006 50005 +50022 50009 +50010 50021 +50026 50025 +25522 50033 +50118 50117 +25528 50129 +49622 50293 +49638 50297 +49626 50357 +49642 50361 +50390 50389 +50406 50393 +50394 50405 +50410 50409 +25336 50417 +50486 50485 +50742 50489 +50518 50517 +50534 50521 +50522 50533 +50538 50537 +26066 50545 +50774 50581 +50790 50585 +50778 50597 +50794 50601 +26994 50609 +50630 50629 +50886 50633 +26072 50641 +27000 50657 +50490 50741 +50746 50745 +50582 50773 +50598 50777 +50586 50789 +50602 50793 +25570 50801 +50838 50837 +50854 50841 +50842 50853 +50858 50857 +26082 50865 +50634 50885 +50890 50889 +25576 50897 +26088 50913 +50966 50965 +50982 50969 +50970 50981 +50986 50985 +27442 50993 +52502 51013 +52518 51017 +27474 51025 +27448 51041 +52506 51077 +52522 51081 +27490 51089 +27554 51105 +27496 51137 +52278 52277 +52310 52309 +52326 52313 +52314 52325 +52330 52329 +27058 52337 +52422 52421 +27064 52433 +51014 52501 +51078 52505 +51018 52517 +51082 52521 +27538 52529 +52550 52549 +52614 52553 +27480 52561 +27544 52577 +52554 52613 +52618 52617 +27586 52625 +27560 52641 +27592 52673 +52998 52997 +28450 53009 +28456 53057 +28890 53365 +28906 53369 +45274 53429 +45290 53433 +53462 53461 +53478 53465 +53466 53477 +53482 53481 +28920 53489 +29754 53557 +30778 53561 +29786 53589 +29802 53593 +29850 53605 +29866 53609 +29810 53617 +30810 53653 +30826 53657 +30874 53669 +30890 53673 +30834 53681 +29898 53701 +30922 53705 +29816 53713 +30840 53729 +46138 53813 +47162 53817 +46170 53845 +46186 53849 +46234 53861 +46250 53865 +29874 53873 +47194 53909 +47210 53913 +47258 53925 +47274 53929 +30898 53937 +46282 53957 +47306 53961 +29880 53969 +30904 53985 +31002 54037 +31018 54041 +47386 54053 +47402 54057 +31026 54065 +31770 54085 +31786 54089 +31058 54097 +31032 54113 +48154 54149 +48170 54153 +31074 54161 +31138 54177 +31080 54209 +54326 54325 +55350 54329 +54358 54357 +54374 54361 +54362 54373 +54378 54377 +29906 54385 +55382 54421 +55398 54425 +55386 54437 +55402 54441 +30930 54449 +54470 54469 +55494 54473 +29912 54481 +30936 54497 +30026 54549 +30090 54553 +31050 54565 +31114 54569 +30098 54577 +54598 54597 +54662 54601 +30040 54609 +30104 54625 +54602 54661 +54666 54665 +30146 54673 +30120 54689 +30152 54721 +31306 54805 +31370 54809 +31818 54821 +31882 54825 +31122 54833 +46410 54853 +46474 54857 +31064 54865 +31128 54881 +48202 54917 +48266 54921 +31170 54929 +31144 54945 +31176 54977 +32010 55045 +32266 55049 +32018 55057 +32274 55073 +32024 55105 +32280 55169 +54330 55349 +55354 55353 +54422 55381 +54438 55385 +54426 55397 +54442 55401 +29922 55409 +55446 55445 +55462 55449 +55450 55461 +55466 55465 +30946 55473 +54474 55493 +55498 55497 +29928 55505 +30952 55521 +55574 55573 +55590 55577 +55578 55589 +55594 55593 +31794 55601 +56342 55621 +56358 55625 +31826 55633 +31800 55649 +56346 55685 +56362 55689 +31842 55697 +31906 55713 +31848 55745 +47434 55829 +47498 55833 +47690 55845 +47754 55849 +31378 55857 +55878 55877 +55942 55881 +31320 55889 +31384 55905 +55882 55941 +55946 55945 +31426 55953 +31400 55969 +31432 56001 +48394 56069 +48650 56073 +32034 56081 +32290 56097 +32040 56129 +32296 56193 +55622 56341 +55686 56345 +55626 56357 +55690 56361 +31890 56369 +56390 56389 +56454 56393 +31832 56401 +31896 56417 +56394 56453 +56458 56457 +31938 56465 +31912 56481 +31944 56513 +56582 56581 +56838 56585 +32066 56593 +32322 56609 +32072 56641 +32328 56705 +56586 56837 +56842 56841 +32130 56849 +32386 56865 +32136 56897 +32392 56961 +32520 57089 +61470 61463 +61486 61467 +61518 61469 +61494 61491 +61498 61493 +61542 61497 +61526 61523 +61530 61525 +61546 61529 +61500 61539 +61532 61541 +61594 61545 +61554 61553 +61548 61587 +61606 61603 +61556 61617 +61638 61637 +61560 61649 +61710 61703 +61966 61707 +62478 61709 +61718 61715 +61722 61717 +61734 61721 +61974 61731 +61724 61733 +61738 61737 +61746 61745 +61772 61763 +62486 61765 +61978 61769 +61778 61777 +61748 61793 +61980 61827 +62490 61829 +62028 61833 +61780 61841 +61794 61857 +61800 61889 +61740 61971 +61766 61973 +61830 61977 +61990 61987 +62022 61989 +62086 61993 +61752 62001 +61836 62019 +62502 62021 +61994 62025 +61796 62033 +61844 62049 +61996 62083 +62506 62085 +62092 62089 +61858 62097 +61860 62113 +61892 62145 +62214 62211 +62218 62213 +62982 62217 +62226 62225 +62228 62241 +62232 62273 +62996 62337 +61770 62485 +61834 62489 +62026 62501 +62090 62505 +61842 62513 +62534 62533 +62598 62537 +61784 62545 +61848 62561 +62538 62597 +62602 62601 +61890 62609 +61864 62625 +61896 62657 +62726 62723 +62730 62725 +62986 62729 +62738 62737 +62740 62753 +62744 62785 +62994 62849 +62220 62979 +62732 62981 +63754 62985 +62274 62993 +62276 63009 +62280 63041 +62760 63105 +63234 63233 +62988 63747 +62754 63761 +62756 63777 +64006 64003 +63000 64017 +63012 64033 +63236 64257 +64518 64517 +63010 64529 +63016 64577 +63240 64769 diff --git a/research/complex-small-m-lower-bounds/data/cert_m4_g3_M0.txt b/research/complex-small-m-lower-bounds/data/cert_m4_g3_M0.txt new file mode 100644 index 0000000000..85151a1fb2 --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/cert_m4_g3_M0.txt @@ -0,0 +1,4271 @@ +m 4 k 8 lab 7 alpha 0 p 2147483629 I 1518275076 size 4270 +510 383 +766 447 +1278 479 +2302 495 +4350 503 +8446 507 +16638 509 +894 831 +958 863 +990 879 +1006 887 +1014 891 +1018 893 +1662 927 +4734 951 +6270 957 +1758 975 +1726 983 +1782 987 +1774 989 +4830 999 +6366 1005 +4854 1011 +4858 1013 +6390 1017 +1406 1343 +1470 1375 +1502 1391 +1518 1399 +1526 1403 +1530 1405 +1786 1439 +2430 1455 +1788 1463 +2494 1467 +2542 1469 +5246 1495 +6334 1499 +5310 1511 +9342 1515 +5366 1523 +5370 1525 +6394 1529 +2526 1599 +2554 1631 +2750 1647 +2686 1655 +1020 1659 +1532 1661 +2782 1695 +3294 1711 +3198 1719 +2798 1723 +3310 1725 +4798 1751 +5342 1755 +10430 1767 +18654 1771 +4860 1779 +5372 1781 +6396 1785 +1854 1823 +2878 1839 +1886 1847 +2910 1851 +1902 1853 +3390 1871 +1950 1879 +1966 1883 +3422 1885 +1998 1895 +2034 1899 +2974 1901 +5694 1907 +5726 1909 +3486 1913 +3646 1935 +5790 1943 +2926 1947 +3438 1949 +3022 1959 +2990 1963 +3502 1965 +6718 1971 +5742 1973 +5806 1977 +3570 1991 +3058 1995 +3534 1997 +5838 2003 +7262 2005 +6750 2009 +3678 2019 +3742 2021 +3826 2025 +5874 2033 +3262 2367 +10366 2423 +18558 2427 +9466 2547 +2806 2623 +9438 2679 +10462 2683 +10486 2803 +1914 2847 +2938 2863 +1910 2871 +2934 2875 +1916 2877 +3450 2895 +2006 2903 +2012 2907 +3446 2909 +2036 2919 +3030 2923 +3036 2925 +5750 2931 +5754 2933 +3542 2937 +3694 2959 +5846 2967 +2940 2971 +3452 2973 +3706 2989 +6774 2995 +5756 2997 +6766 3001 +3572 3015 +3060 3019 +3548 3021 +5852 3027 +7278 3029 +6778 3033 +3702 3043 +3758 3045 +3828 3049 +5876 3057 +3318 3167 +9406 3191 +18622 3197 +18678 3317 +1974 3359 +2998 3375 +1980 3383 +3004 3387 +2010 3389 +3510 3407 +1978 3415 +3002 3419 +3514 3421 +2040 3431 +3034 3435 +3546 3437 +5814 3443 +5818 3445 +3516 3449 +3766 3471 +5820 3479 +3064 3483 +3576 3485 +3708 3495 +3772 3501 +6780 3507 +5850 3509 +6830 3513 +6842 3539 +7286 3541 +7290 3545 +3790 3555 +3770 3557 +3832 3561 +5880 3569 +3798 3639 +3802 3643 +3804 3671 +6814 3677 +6844 3691 +7230 3693 +6862 3699 +6870 3701 +7326 3705 +6874 3763 +7342 3765 +6876 3769 +7350 3797 +7354 3801 +3870 3855 +3886 3863 +3900 3867 +3918 3869 +3894 3879 +3926 3883 +3982 3885 +3930 3891 +3942 3893 +3990 3897 +3898 3911 +3932 3915 +3994 3917 +3946 3923 +3996 3925 +4006 3929 +3954 3939 +4010 3941 +4012 3945 +4038 3953 +3960 3975 +3948 3979 +4018 3981 +3956 3987 +7710 3989 +7738 3993 +4020 4003 +7734 4005 +7740 4009 +4042 4017 +7770 4035 +4024 4037 +7772 4041 +4050 4049 +7800 4065 +4478 4415 +4542 4447 +4574 4463 +4590 4471 +4598 4475 +4602 4477 +8574 4511 +8638 4527 +4846 4535 +8670 4539 +6382 4541 +9462 4559 +5358 4567 +8694 4571 +16766 4573 +16830 4583 +10490 4587 +17022 4589 +8698 4671 +8830 4703 +2550 4719 +8686 4727 +8894 4731 +4604 4733 +10492 4767 +8942 4783 +8926 4791 +12534 4795 +9454 4797 +3322 4815 +10478 4823 +12414 4827 +12538 4829 +16862 4839 +24822 4843 +16892 4845 +4926 4895 +9022 4911 +4958 4919 +9054 4923 +4974 4925 +6462 4943 +5022 4951 +5038 4955 +5862 4957 +5070 4967 +5106 4971 +5866 4973 +12606 4979 +12638 4981 +9118 4985 +9790 5007 +12702 5015 +9070 5019 +5868 5021 +9166 5031 +9134 5035 +6494 5037 +12862 5043 +12654 5045 +12718 5049 +6642 5063 +9202 5067 +6558 5069 +12750 5075 +13406 5077 +12894 5081 +9822 5091 +9886 5093 +9970 5097 +12786 5105 +17118 5183 +16886 5215 +2556 5231 +16878 5239 +8700 5243 +17630 5245 +17142 5279 +2810 5295 +17134 5303 +8950 5307 +18670 5309 +17646 5327 +17534 5335 +18682 5339 +20726 5341 +20730 5351 +24766 5355 +24826 5357 +5438 5407 +6582 5423 +5470 5431 +6510 5435 +5486 5437 +17726 5455 +5534 5463 +5550 5467 +17758 5469 +5582 5479 +5618 5483 +6574 5485 +20798 5491 +20830 5493 +17822 5497 +17982 5519 +20894 5527 +6588 5531 +17774 5533 +6606 5543 +6618 5547 +17838 5549 +21054 5555 +20846 5557 +20910 5561 +17906 5575 +6648 5579 +17870 5581 +20942 5587 +21598 5589 +21086 5593 +18014 5603 +18078 5605 +18162 5609 +20978 5617 +4986 5663 +5498 5679 +2022 5687 +3046 5691 +2028 5693 +6838 5711 +2026 5719 +3050 5723 +3558 5725 +3562 5735 +3814 5739 +3818 5741 +4982 5747 +5046 5749 +5050 5753 +9082 5775 +5108 5783 +3052 5787 +3564 5789 +4988 5799 +5500 5803 +3820 5805 +5494 5811 +5590 5813 +5620 5817 +5596 5831 +6620 5835 +9142 5837 +12666 5843 +6586 5845 +6890 5849 +6898 5859 +6904 5861 +6900 5865 +12788 5873 +5918 5903 +5934 5911 +5948 5915 +5966 5917 +5942 5927 +5974 5931 +6030 5933 +5978 5939 +5990 5941 +6038 5945 +5946 5959 +5980 5963 +6042 5965 +5994 5971 +6044 5973 +6054 5977 +6002 5987 +6058 5989 +6060 5993 +6086 6001 +6008 6023 +5996 6027 +6066 6029 +6004 6035 +6990 6037 +6942 6041 +6068 6051 +6998 6053 +7002 6057 +6090 6065 +7014 6083 +6072 6085 +7018 6089 +6098 6097 +7026 6113 +9468 6207 +16890 6239 +2812 6255 +17146 6263 +8954 6267 +17086 6269 +12478 6303 +3324 6319 +17598 6327 +12540 6331 +20606 6333 +17148 6351 +24828 6359 +17660 6363 +20732 6365 +33262 6375 +33518 6379 +34030 6381 +7292 6431 +9534 6447 +6886 6455 +7356 6459 +6892 6461 +17214 6479 +7374 6487 +7382 6491 +7386 6493 +7388 6503 +9078 6507 +9146 6509 +12662 6515 +12726 6517 +7410 6521 +11326 6543 +12730 6551 +7398 6555 +9084 6557 +9204 6567 +9582 6571 +9646 6573 +12910 6579 +12668 6581 +12918 6585 +9566 6599 +9630 6603 +11358 6605 +13374 6611 +13430 6613 +13434 6617 +9678 6627 +13422 6629 +9714 6633 +13554 6641 +9594 6687 +9902 6703 +9590 6711 +9838 6715 +9596 6717 +7402 6735 +7404 6743 +9686 6747 +11382 6749 +9716 6759 +9934 6763 +7412 6765 +13436 6771 +7416 6773 +9692 6777 +11374 6799 +9910 6807 +9916 6811 +9914 6813 +9946 6823 +10926 6827 +11386 6829 +14454 6835 +13498 6837 +9948 6841 +11388 6855 +9976 6859 +11450 6861 +13486 6867 +11478 6869 +10670 6873 +11438 6883 +11482 6885 +11508 6889 +13556 6897 +10014 6927 +10030 6935 +10044 6939 +6114 6941 +10038 6951 +10070 6955 +6958 6957 +10062 6963 +6092 6965 +7054 6969 +10042 6983 +10076 6987 +6966 6989 +10074 6995 +6100 6997 +6104 7001 +10086 7011 +6116 7013 +6120 7017 +6970 7025 +10090 7047 +10092 7051 +7062 7053 +10098 7059 +7066 7061 +7078 7065 +10100 7075 +7110 7077 +7082 7081 +7114 7089 +10104 7107 +6128 7109 +7090 7113 +7122 7121 +7138 7137 +17246 7199 +11422 7215 +11446 7223 +10606 7227 +11452 7229 +17786 7247 +17270 7255 +13470 7259 +17782 7261 +17334 7271 +11470 7275 +17878 7277 +13494 7283 +21110 7285 +13526 7289 +18094 7311 +17274 7319 +11484 7323 +17788 7325 +11494 7335 +10862 7339 +11506 7341 +11512 7347 +17394 7349 +13500 7353 +17884 7367 +11500 7371 +19662 7373 +14522 7379 +21614 7381 +17338 7385 +12982 7395 +17908 7397 +13006 7401 +13560 7409 +18206 7439 +18222 7447 +10126 7451 +18254 7453 +18230 7463 +10140 7467 +18236 7469 +7454 7475 +18262 7477 +10134 7481 +18234 7495 +10138 7499 +18266 7501 +7502 7507 +18268 7509 +10150 7513 +7516 7523 +18278 7525 +10154 7529 +7470 7537 +18282 7559 +10164 7563 +18284 7565 +7566 7571 +18290 7573 +10156 7577 +7580 7587 +18292 7589 +10162 7593 +7532 7601 +7628 7619 +18296 7621 +10168 7625 +7596 7633 +7726 7649 +4066 7695 +7766 7703 +7758 7707 +7822 7709 +4044 7719 +11054 7723 +4056 7725 +7782 7731 +7788 7733 +7794 7737 +4052 7751 +4072 7755 +19254 7757 +7796 7763 +7786 7765 +7830 7769 +7834 7779 +7836 7781 +4080 7785 +7484 7793 +7850 7815 +4068 7819 +10182 7821 +7846 7827 +7858 7829 +7860 7833 +10196 7843 +7884 7845 +7890 7849 +10224 7857 +7892 7875 +18354 7877 +10186 7881 +11598 7889 +11662 7905 +7950 7943 +12046 7947 +20238 7949 +7958 7955 +7962 7957 +7974 7961 +12054 7971 +7964 7973 +7978 7977 +15638 7985 +7986 8003 +20246 8005 +12058 8009 +15642 8017 +15630 8033 +12060 8067 +20250 8069 +12082 8073 +15654 8081 +12070 8097 +15666 8129 +12510 8511 +24702 8543 +33214 8559 +33502 8655 +8956 8767 +17654 8799 +33406 8815 +33982 8911 +5052 8991 +9148 9007 +5078 9015 +9174 9019 +5082 9021 +6522 9039 +5084 9047 +6518 9051 +6524 9053 +5112 9063 +9178 9067 +6614 9069 +12732 9075 +12758 9077 +9180 9081 +9850 9103 +12762 9111 +9208 9115 +9846 9117 +9852 9133 +12922 9139 +12764 9141 +12924 9145 +6644 9159 +9942 9163 +10702 9165 +12974 9171 +14430 9173 +12986 9177 +9972 9187 +13532 9189 +10958 9193 +12792 9201 +18684 9279 +24798 9311 +33246 9327 +37114 9423 +10558 9503 +10814 9519 +10590 9527 +10846 9531 +10654 9533 +18030 9551 +10738 9559 +10910 9563 +18038 9565 +13530 9575 +10994 9579 +17358 9581 +20854 9587 +20858 9589 +18042 9593 +19006 9615 +20950 9623 +11498 9627 +18044 9629 +18102 9645 +21114 9651 +20860 9653 +21102 9657 +18106 9671 +14398 9675 +18126 9677 +20956 9683 +22622 9685 +21116 9689 +18108 9699 +18164 9701 +18168 9705 +20980 9713 +17310 9759 +14446 9775 +14460 9783 +12988 9787 +17276 9789 +18782 9807 +14458 9815 +14494 9819 +14510 9821 +17366 9831 +13020 9835 +17340 9837 +12958 9843 +14524 9845 +17262 9849 +19038 9871 +17370 9879 +14550 9883 +18134 9885 +14556 9901 +13014 9907 +17372 9909 +17396 9913 +17400 9927 +18138 9931 +18140 9933 +21150 9939 +18806 9941 +18798 9945 +14580 9955 +18932 9957 +18812 9961 +21234 9969 +6972 9999 +7004 10007 +7032 10011 +7510 10013 +7020 10023 +7084 10027 +7068 10029 +7116 10035 +7478 10037 +7128 10041 +7028 10055 +7092 10059 +7622 10061 +7124 10067 +7526 10069 +7540 10073 +7140 10083 +7574 10085 +7590 10089 +10210 10097 +7152 10119 +7096 10123 +7636 10125 +7604 10131 +7864 10133 +10188 10137 +7144 10147 +7878 10149 +7852 10153 +10194 10161 +11038 10179 +7652 10181 +10200 10185 +10216 10193 +7896 10209 +34942 10303 +35038 10335 +41086 10351 +41206 10447 +19550 10527 +26718 10543 +18894 10551 +25150 10555 +18902 10557 +33630 10575 +18908 10583 +19054 10587 +19062 10589 +19066 10599 +19068 10603 +19102 10605 +25206 10611 +21166 10613 +19118 10617 +35390 10639 +21174 10647 +19150 10651 +19158 10653 +19164 10669 +41534 10675 +21198 10677 +21566 10681 +19186 10695 +19188 10699 +19574 10701 +21206 10707 +22638 10709 +22590 10713 +35422 10723 +21662 10725 +21678 10729 +21236 10737 +10618 10783 +10874 10799 +10614 10807 +10870 10811 +10620 10813 +33694 10831 +10710 10839 +10716 10843 +19566 10845 +10740 10855 +10966 10859 +10972 10861 +33654 10867 +21622 10869 +19580 10873 +35438 10895 +21212 10903 +10876 10907 +21718 10909 +35450 10925 +41590 10931 +25198 10933 +41582 10937 +24926 10951 +10996 10955 +19676 10957 +25182 10963 +22646 10965 +22650 10969 +35446 10979 +24950 10981 +35570 10985 +25076 10993 +11066 11023 +11062 11031 +11068 11035 +7908 11037 +11086 11047 +11094 11051 +10212 11053 +11098 11059 +11110 11061 +11116 11065 +11100 11079 +11162 11083 +11114 11085 +11122 11091 +11150 11093 +11158 11097 +11164 11107 +11566 11109 +11124 11113 +11174 11121 +11128 11143 +11178 11147 +11180 11149 +11206 11155 +11574 11157 +11580 11161 +11188 11171 +11822 11173 +11830 11177 +11210 11185 +11836 11203 +11622 11205 +11878 11209 +11628 11217 +11884 11233 +25212 11295 +35166 11311 +19670 11319 +19700 11323 +21178 11325 +22652 11343 +22702 11351 +22742 11355 +21180 11357 +24956 11367 +33660 11371 +22748 11373 +25046 11379 +21210 11381 +25052 11385 +35934 11407 +25332 11415 +25262 11419 +22772 11421 +22714 11437 +25302 11443 +25694 11445 +25718 11449 +25308 11463 +33724 11467 +25724 11469 +28766 11475 +25814 11477 +26844 11481 +33742 11491 +33722 11493 +33784 11497 +28916 11505 +19230 11535 +18318 11543 +11550 11547 +18326 11549 +18332 11559 +11612 11563 +19246 11565 +11186 11571 +18342 11573 +11192 11577 +18330 11591 +11636 11595 +19790 11597 +11218 11603 +18346 11605 +11670 11609 +11220 11619 +18348 11621 +11234 11625 +7906 11633 +18356 11655 +11806 11659 +19258 11661 +11676 11667 +18360 11669 +11692 11673 +11606 11683 +18386 11685 +11732 11689 +7920 11697 +11748 11715 +19314 11717 +11724 11721 +11718 11729 +11892 11745 +35614 11791 +19278 11799 +11686 11803 +19290 11805 +19260 11815 +11862 11819 +19798 11821 +11212 11827 +19286 11829 +11224 11833 +19292 11847 +11854 11851 +19804 11853 +11240 11859 +19302 11861 +11918 11865 +11236 11875 +19306 11877 +11248 11881 +11868 11889 +19308 11911 +11926 11915 +20046 11917 +11932 11923 +19316 11925 +11942 11929 +11700 11939 +19320 11941 +11988 11945 +11956 11953 +11974 11971 +19378 11973 +11980 11977 +11948 11985 +12004 12001 +7980 12039 +12074 12043 +20266 12045 +8006 12051 +8012 12053 +8018 12057 +12076 12067 +8020 12069 +8040 12073 +15658 12081 +8048 12099 +20252 12101 +12108 12105 +15644 12113 +15660 12129 +12102 12163 +20268 12165 +12116 12169 +15686 12177 +12144 12193 +15692 12225 +12526 12407 +24814 12413 +13518 12575 +13018 12591 +5094 12599 +9190 12603 +5100 12605 +19518 12623 +5098 12631 +6630 12635 +6634 12637 +9194 12647 +9958 12651 +9962 12653 +12774 12659 +12778 12661 +13030 12665 +14518 12687 +18750 12695 +9196 12699 +6636 12701 +13044 12711 +9964 12717 +13034 12723 +12780 12725 +13036 12729 +18846 12743 +13048 12747 +19614 12749 +13542 12757 +13546 12761 +21240 12773 +14554 12777 +25820 12831 +34398 12847 +26742 12879 +14542 12887 +22686 12893 +26868 12907 +22710 12909 +13042 12917 +13548 12921 +28790 12943 +26838 12957 +35190 12973 +14566 13013 +14570 13017 +13086 13071 +13102 13079 +13116 13083 +13134 13085 +13110 13095 +13142 13099 +13198 13101 +13146 13107 +13158 13109 +13206 13113 +13114 13127 +13148 13131 +13210 13133 +13162 13139 +13212 13141 +13222 13145 +13170 13155 +13226 13157 +13228 13161 +13254 13169 +13176 13191 +13164 13195 +13234 13197 +13172 13203 +13870 13205 +13854 13209 +13236 13219 +13878 13221 +13884 13225 +13258 13233 +13926 13251 +13240 13253 +13932 13257 +13266 13265 +13940 13281 +22716 13343 +14578 13359 +17382 13367 +14572 13371 +17388 13373 +22734 13391 +17326 13399 +18150 13403 +18154 13405 +24894 13415 +14584 13419 +22770 13421 +21222 13427 +21226 13429 +22758 13433 +25074 13455 +25210 13463 +25844 13467 +18156 13469 +33710 13479 +33718 13483 +24954 13485 +33766 13491 +21228 13493 +26748 13497 +26798 13511 +28796 13515 +28914 13523 +22746 13525 +22762 13529 +33772 13539 +13654 13583 +21278 13591 +21294 13595 +21326 13597 +13682 13607 +13658 13611 +13684 13613 +21302 13619 +21334 13621 +21308 13625 +18374 13639 +18378 13643 +18402 13645 +21306 13651 +21338 13653 +21340 13657 +18380 13667 +18388 13669 +18404 13673 +21362 13681 +13778 13703 +13688 13707 +13780 13709 +21350 13715 +21354 13717 +21356 13721 +13784 13731 +13808 13733 +13910 13737 +21364 13745 +18392 13763 +19354 13765 +18416 13769 +21368 13777 +19342 13793 +13660 13839 +13882 13847 +13282 13851 +13902 13853 +13914 13863 +14004 13867 +13916 13869 +13260 13875 +13930 13877 +13272 13881 +13938 13895 +13944 13899 +15558 13901 +13268 13907 +13966 13909 +13974 13913 +13284 13923 +15570 13925 +13288 13929 +25374 13937 +13978 13959 +13990 13963 +14022 13965 +13994 13971 +13996 13973 +14034 13977 +13296 13987 +14036 13989 +14040 13993 +14028 14001 +14064 14019 +15572 14021 +14706 14025 +21390 14033 +15450 14049 +14094 14087 +15118 14091 +15690 14093 +14102 14099 +14106 14101 +14118 14105 +15126 14115 +14108 14117 +14122 14121 +29462 14129 +14130 14147 +15698 14149 +15130 14153 +29466 14161 +15750 14177 +15132 14211 +15754 14213 +15154 14217 +29478 14225 +15142 14241 +15700 14273 +33646 14367 +33778 14383 +28886 14391 +41334 14395 +34166 14415 +34170 14423 +33750 14429 +33754 14445 +25330 14453 +28892 14457 +45174 14479 +34206 14491 +34110 14549 +34172 14553 +14678 14607 +21398 14615 +21402 14619 +21404 14621 +14052 14631 +14682 14635 +14708 14637 +25398 14643 +21414 14645 +25390 14649 +18408 14663 +19350 14667 +19356 14669 +21426 14675 +21418 14677 +21420 14681 +19366 14691 +19398 14693 +19402 14697 +29042 14705 +14712 14727 +14802 14731 +14804 14733 +21428 14739 +21432 14741 +21446 14745 +14808 14755 +14832 14757 +19370 14761 +25402 14769 +19404 14787 +19758 14789 +19410 14793 +25422 14801 +21452 14817 +14964 14863 +25430 14871 +25404 14875 +25434 14877 +14962 14887 +14934 14891 +15058 14893 +41782 14899 +25446 14901 +29014 14905 +19742 14919 +19766 14923 +19814 14925 +25458 14931 +25436 14933 +25450 14937 +22102 14947 +21460 14949 +21474 14953 +29044 14961 +15088 14983 +14968 14987 +15060 14989 +25460 14995 +25464 14997 +25452 15001 +15064 15011 +19372 15013 +21476 15017 +29298 15025 +35662 15043 +19772 15045 +19828 15049 +25486 15057 +22870 15073 +14124 15111 +15146 15115 +15704 15117 +14150 15123 +14156 15125 +14162 15129 +15148 15139 +14164 15141 +14184 15145 +29482 15153 +14192 15171 +15714 15173 +15180 15177 +29468 15185 +15810 15201 +15174 15235 +15812 15237 +15188 15241 +29484 15249 +15216 15265 +15728 15297 +15390 15375 +14026 15383 +13980 15387 +14002 15389 +15414 15399 +15438 15403 +15446 15405 +15452 15411 +14008 15413 +15462 15417 +15406 15431 +15466 15435 +15502 15437 +15468 15443 +15474 15445 +15510 15449 +15476 15459 +15514 15461 +15516 15465 +19380 15473 +15480 15495 +19384 15499 +15562 15501 +15526 15507 +15418 15509 +19412 15513 +19416 15523 +19426 15525 +19428 15529 +19440 15537 +20022 15555 +15530 15557 +23126 15561 +19998 15569 +20060 15585 +7988 15623 +12084 15627 +14132 15629 +8034 15635 +8070 15637 +8076 15641 +12114 15651 +8098 15653 +8100 15657 +14154 15665 +8112 15683 +14218 15685 +12166 15689 +20306 15697 +20262 15713 +12130 15747 +14226 15749 +12172 15753 +14220 15761 +12208 15777 +20322 15809 +7992 15879 +12088 15883 +14136 15885 +8036 15891 +8084 15893 +8132 15897 +12132 15907 +12136 15909 +12180 15913 +14168 15921 +12228 15939 +14228 15941 +14232 15945 +20308 15953 +20294 15969 +14288 16003 +15178 16005 +15186 16009 +20324 16017 +15192 16033 +23324 16065 +16134 16131 +16138 16133 +16146 16137 +16162 16145 +16194 16161 +16258 16193 +28422 16257 +20670 16735 +37054 16751 +20702 16991 +49278 17007 +25246 17183 +25662 17199 +24990 17207 +34290 17211 +22764 17231 +17386 17239 +25294 17243 +25710 17245 +25758 17255 +33756 17259 +33658 17261 +25722 17267 +25774 17269 +34268 17273 +26686 17295 +28734 17303 +26734 17307 +33770 17319 +26782 17331 +26830 17365 +28794 17369 +34222 17381 +34414 17385 +17658 17503 +33918 17519 +5558 17695 +9654 17711 +5564 17719 +9660 17723 +5594 17725 +17846 17743 +5562 17751 +9658 17755 +17850 17757 +5624 17767 +9690 17771 +17882 17773 +20918 17779 +20922 17781 +17852 17785 +18810 17807 +20924 17815 +9720 17819 +17912 17821 +18870 17831 +18876 17837 +22776 17843 +20954 17845 +21628 17849 +21626 17875 +21690 17877 +21692 17881 +25050 17891 +18862 17893 +18930 17897 +20984 17905 +10678 17951 +10934 17967 +10684 17975 +10940 17979 +10714 17981 +19126 17999 +10682 18007 +10938 18011 +19130 18013 +10744 18023 +10970 18027 +19162 18029 +25806 18035 +21686 18037 +19132 18041 +25782 18063 +25014 18071 +11000 18075 +19192 18077 +25788 18087 +25818 18093 +26746 18099 +26866 18101 +33780 18105 +34158 18131 +21710 18133 +21724 18137 +34254 18147 +21722 18149 +25842 18153 +25080 18161 +7514 18191 +7482 18199 +11578 18203 +7544 18205 +7538 18215 +11634 18219 +7578 18221 +13622 18227 +7602 18229 +11698 18233 +7530 18247 +7634 18251 +7626 18253 +13626 18259 +7594 18261 +7608 18265 +13628 18275 +7650 18277 +11730 18281 +13746 18289 +7664 18311 +11626 18315 +7640 18317 +13718 18323 +11640 18325 +11610 18329 +14650 18339 +11690 18341 +11746 18345 +13748 18353 +11674 18371 +7656 18373 +7882 18377 +13752 18385 +13724 18401 +35006 18527 +49398 18543 +19578 18719 +26806 18735 +19638 18743 +26812 18747 +19644 18749 +34230 18767 +19630 18775 +25020 18779 +25786 18781 +19698 18791 +26810 18795 +28830 18797 +34236 18803 +34234 18805 +34262 18809 +35902 18831 +34266 18839 +26842 18843 +34292 18845 +34296 18855 +35964 18861 +34422 18867 +26872 18869 +34426 18873 +34366 18899 +50270 18901 +34428 18905 +34478 18915 +35950 18917 +34486 18921 +34490 18929 +25270 18975 +28854 18991 +25276 18999 +28860 19003 +25306 19005 +35134 19023 +25018 19031 +25274 19035 +34492 19037 +25336 19047 +28890 19051 +34510 19053 +34518 19059 +34522 19061 +34524 19065 +35486 19087 +34534 19095 +28920 19099 +34548 19101 +35194 19111 +35196 19117 +34540 19123 +35230 19125 +35246 19129 +35278 19155 +35286 19157 +37182 19161 +35510 19171 +35314 19173 +35316 19177 +37214 19185 +11704 19215 +11834 19223 +13598 19227 +11760 19229 +11890 19239 +15532 19243 +11866 19245 +14646 19251 +11954 19253 +14652 19257 +11882 19271 +11896 19275 +7912 19277 +14684 19283 +11930 19285 +11946 19289 +14742 19299 +11986 19301 +13722 19305 +14770 19313 +12002 19335 +15538 19339 +11736 19341 +14748 19347 +15540 19349 +15420 19353 +14938 19363 +15586 19365 +19432 19369 +14772 19377 +15576 19395 +11722 19397 +11978 19401 +14776 19409 +15544 19425 +18906 19487 +35254 19503 +18936 19517 +19674 19535 +18874 19543 +34538 19547 +19642 19549 +25848 19559 +35258 19563 +35260 19565 +35292 19573 +35514 19577 +35998 19599 +35320 19611 +19704 19613 +35958 19623 +36022 19629 +35962 19637 +37294 19641 +37306 19667 +50294 19669 +50286 19673 +36084 19683 +19802 19727 +19770 19735 +11752 19739 +19820 19741 +19826 19751 +11960 19755 +19832 19757 +14902 19763 +19854 19765 +19862 19769 +19818 19783 +14746 19787 +19866 19789 +14906 19795 +19868 19797 +19878 19801 +15026 19811 +19882 19813 +19890 19817 +19910 19825 +19884 19847 +12008 19851 +19892 19853 +15028 19859 +19914 19861 +20054 19865 +14998 19875 +20070 19877 +20058 19881 +19916 19889 +20026 19907 +19896 19909 +20110 19913 +19922 19921 +20074 19937 +36126 19983 +20014 19991 +11992 19995 +20076 19997 +20028 20007 +20082 20011 +20122 20013 +15588 20019 +19938 20021 +15592 20025 +20088 20039 +20084 20043 +20124 20045 +19940 20051 +19924 20053 +19928 20057 +20134 20067 +19952 20069 +20118 20073 +20138 20081 +20140 20103 +20146 20107 +20148 20109 +20152 20115 +20166 20117 +20170 20121 +20172 20131 +20178 20133 +20180 20137 +15600 20145 +22876 20163 +19944 20165 +20184 20169 +20194 20177 +20200 20193 +8010 20231 +12106 20235 +20274 20237 +8082 20243 +8074 20245 +8088 20249 +12178 20259 +8130 20261 +8136 20265 +15668 20273 +8144 20291 +20298 20293 +12170 20297 +15716 20305 +15756 20321 +12226 20355 +20276 20357 +12232 20361 +15762 20369 +12240 20385 +15768 20417 +20718 20599 +36990 20603 +28858 20767 +35290 20783 +5606 20791 +9702 20795 +5612 20797 +35452 20815 +5610 20823 +9706 20827 +17894 20829 +17898 20839 +18918 20843 +18922 20845 +20966 20851 +20970 20853 +21734 20857 +9708 20891 +17900 20893 +35534 20903 +18924 20909 +24942 20915 +20972 20917 +25038 20921 +21746 20935 +21752 20939 +21738 20949 +21740 20953 +35572 21023 +35516 21039 +10726 21047 +10982 21051 +10732 21053 +10730 21079 +10986 21083 +21748 21085 +34278 21095 +34546 21099 +35306 21101 +25318 21107 +25006 21109 +25322 21113 +35576 21135 +10988 21147 +34284 21149 +36014 21159 +35308 21165 +25830 21171 +25324 21173 +25836 21177 +34552 21191 +36026 21195 +34282 21205 +35302 21209 +14622 21263 +13614 21271 +13646 21275 +13710 21277 +14638 21287 +14670 21291 +14734 21293 +13670 21299 +13676 21301 +13734 21305 +14940 21319 +21450 21323 +21458 21325 +13674 21331 +13738 21333 +13740 21337 +13766 21347 +13770 21349 +14790 21353 +13794 21361 +15002 21383 +15032 21387 +21464 21389 +13772 21395 +14698 21397 +14700 21401 +14762 21411 +14694 21413 +14794 21417 +13796 21425 +14758 21443 +21480 21445 +22124 21449 +13800 21457 +14050 21473 +36082 21535 +36088 21559 +35546 21583 +37308 21613 +25834 21619 +37230 21625 +35548 21647 +37278 21659 +37326 21677 +37242 21683 +37244 21689 +21790 21775 +21806 21783 +21820 21787 +21838 21789 +21814 21799 +21846 21803 +21902 21805 +21850 21811 +21862 21813 +21910 21817 +21818 21831 +21852 21835 +21914 21837 +21866 21843 +21916 21845 +21926 21849 +21874 21859 +21930 21861 +21932 21865 +21958 21873 +21880 21895 +21868 21899 +21938 21901 +21876 21907 +22094 21909 +22046 21913 +21940 21923 +22106 21925 +22108 21929 +21962 21937 +22118 21955 +21944 21957 +22122 21961 +21970 21969 +22130 21985 +22062 22031 +22070 22039 +21488 22043 +21986 22045 +22074 22055 +14878 22059 +22076 22061 +22132 22067 +21964 22069 +22136 22073 +22158 22087 +22166 22091 +22170 22093 +22172 22099 +21972 22101 +21976 22105 +22182 22115 +21988 22117 +21992 22121 +25886 22129 +22186 22151 +22188 22155 +22194 22157 +22196 22163 +22200 22165 +22214 22169 +22218 22179 +22220 22181 +22226 22185 +22228 22193 +22232 22211 +22000 22213 +22242 22217 +22244 22225 +22256 22241 +22286 22279 +23310 22283 +23822 22285 +22294 22291 +22298 22293 +22310 22297 +23318 22307 +22300 22309 +22314 22313 +29974 22321 +22322 22339 +23830 22341 +23322 22345 +29978 22353 +23834 22369 +23334 22403 +23836 22405 +23346 22409 +29990 22417 +23340 22433 +23846 22465 +37534 22575 +37470 22583 +37562 22607 +37564 22615 +49526 22621 +37338 22643 +37354 22649 +53366 22671 +37594 22685 +37498 22707 +37356 22713 +22814 22799 +22830 22807 +22838 22811 +22842 22813 +22844 22823 +15004 22827 +22862 22829 +22874 22835 +22886 22837 +22890 22841 +22892 22855 +22898 22859 +22900 22861 +22904 22867 +25942 22869 +25934 22873 +22926 22883 +22934 22885 +22938 22889 +29048 22897 +22940 22919 +20196 22923 +22950 22925 +22956 22931 +22962 22933 +22964 22937 +22968 22947 +22982 22949 +22988 22953 +25902 22961 +22994 22979 +22996 22981 +23000 22985 +25946 22993 +23024 23009 +23094 23055 +25494 23063 +25498 23067 +25510 23069 +15564 23079 +23098 23083 +23100 23085 +25500 23091 +25546 23093 +25514 23097 +23130 23111 +23132 23115 +23154 23117 +25522 23123 +25516 23125 +25528 23129 +23156 23139 +23160 23141 +23190 23145 +29300 23153 +23194 23175 +23196 23179 +23218 23181 +25524 23187 +25914 23189 +25948 23193 +23220 23203 +23224 23205 +23250 23209 +29362 23217 +23252 23235 +23256 23237 +23280 23241 +25998 23249 +25548 23265 +15764 23303 +15156 23307 +20358 23309 +15778 23315 +15780 23317 +15792 23321 +15244 23331 +15816 23333 +15824 23337 +29490 23345 +14256 23363 +23366 23365 +15242 23369 +29510 23377 +15886 23393 +15208 23427 +20300 23429 +15250 23433 +29492 23441 +15280 23457 +15942 23489 +23606 23567 +25910 23575 +25916 23579 +25958 23581 +23610 23591 +23612 23595 +23638 23597 +25962 23603 +25964 23605 +25970 23609 +23666 23623 +23668 23627 +23672 23629 +25976 23635 +50518 23637 +28982 23641 +23706 23651 +23708 23653 +26254 23657 +29106 23665 +23730 23687 +23732 23691 +23762 23693 +25972 23699 +26170 23701 +26172 23705 +25554 23715 +36142 23717 +23764 23721 +29368 23729 +23792 23747 +23736 23749 +25570 23753 +29810 23761 +26010 23777 +22324 23815 +23348 23819 +23850 23821 +22342 23827 +22348 23829 +22346 23833 +23370 23843 +22356 23845 +22376 23849 +29980 23857 +22384 23875 +23878 23877 +23372 23881 +30022 23889 +23858 23905 +23378 23939 +23882 23941 +23380 23945 +30002 23953 +23408 23969 +23920 24001 +8024 24071 +12120 24075 +20312 24077 +15720 24083 +8104 24085 +12184 24089 +15922 24099 +20328 24101 +15924 24105 +20336 24113 +20362 24131 +20364 24133 +20370 24137 +22354 24145 +20432 24161 +15894 24195 +20372 24197 +15954 24201 +22316 24209 +15956 24225 +22328 24257 +24326 24323 +24330 24325 +24338 24329 +24354 24337 +24386 24353 +24450 24385 +28426 24449 +41150 24695 +49374 24699 +37596 24863 +35542 24879 +26854 24887 +28782 24891 +26860 24893 +41310 24911 +26858 24919 +28846 24923 +37438 24925 +37340 24935 +37486 24939 +37500 24941 +37550 24947 +41326 24949 +41340 24953 +28878 24987 +41374 24989 +37610 24999 +37582 25005 +45118 25011 +41404 25013 +45180 25017 +45150 25031 +41422 25035 +53342 25045 +53370 25049 +37612 25119 +36028 25135 +19174 25143 +19686 25147 +19180 25149 +19178 25175 +19690 25179 +35562 25181 +35558 25191 +36054 25195 +36058 25197 +41278 25203 +41430 25205 +41566 25209 +36060 25231 +19692 25243 +35564 25245 +41596 25255 +36076 25261 +41654 25267 +41630 25269 +41646 25273 +49470 25287 +41436 25291 +45166 25301 +49502 25305 +23070 25359 +14894 25367 +14926 25371 +14990 25373 +23086 25383 +23118 25387 +23182 25389 +14764 25395 +14796 25397 +14950 25401 +25542 25415 +25556 25419 +23768 25421 +14954 25427 +15014 25429 +15018 25433 +14956 25443 +15046 25445 +23146 25449 +14056 25457 +25560 25479 +23644 25483 +25572 25485 +15050 25491 +23210 25493 +23212 25497 +23148 25507 +23206 25509 +23242 25513 +14820 25521 +23244 25539 +25576 25541 +25584 25545 +14818 25553 +15074 25569 +49518 25631 +41678 25659 +36070 25679 +41702 25687 +49590 25709 +50334 25715 +49530 25717 +36074 25743 +41686 25773 +50390 25779 +50382 25781 +26006 25871 +23582 25879 +23598 25883 +23630 25885 +23694 25895 +26012 25899 +26022 25901 +23142 25907 +23660 25909 +23718 25913 +26026 25927 +26028 25931 +26034 25933 +22986 25939 +22954 25941 +23238 25945 +23724 25955 +23658 25957 +26036 25961 +22248 25969 +26040 25991 +26054 25995 +26058 25997 +23756 26003 +26060 26005 +26066 26009 +26068 26019 +26072 26021 +26082 26025 +23012 26033 +26084 26051 +26088 26053 +26096 26057 +23010 26065 +23266 26081 +23702 26127 +26142 26135 +26158 26139 +26166 26141 +26190 26151 +26198 26155 +26202 26157 +23654 26163 +23750 26165 +26204 26169 +26214 26183 +26218 26187 +26220 26189 +26226 26195 +26228 26197 +26232 26201 +26262 26211 +26266 26213 +26268 26217 +26278 26225 +26282 26247 +26284 26251 +26290 26253 +26292 26259 +26296 26261 +26310 26265 +26314 26275 +26316 26277 +26322 26281 +26324 26289 +26328 26307 +26338 26309 +26340 26313 +26344 26321 +26352 26337 +22410 26375 +15900 26379 +24078 26381 +22360 26387 +22418 26389 +22412 26393 +15898 26403 +22420 26405 +15910 26409 +30230 26417 +22424 26435 +24086 26437 +22448 26441 +30234 26449 +24090 26465 +15946 26499 +24092 26501 +15948 26505 +30246 26513 +15960 26529 +24102 26561 +45214 26671 +45178 26683 +50298 26703 +49566 26717 +50406 26739 +49582 26741 +45242 26767 +45244 26779 +53406 26781 +45230 26803 +53358 26805 +26910 26895 +26926 26903 +26934 26907 +26938 26909 +26940 26919 +26958 26923 +26966 26925 +26970 26931 +26972 26933 +26982 26937 +26986 26951 +26988 26955 +26994 26957 +26996 26963 +27000 26965 +27022 26969 +27030 26979 +27034 26981 +27036 26985 +29108 26993 +27046 27015 +27050 27019 +27052 27021 +27058 27027 +27060 27029 +27064 27033 +27078 27043 +27082 27045 +27084 27049 +27090 27057 +27092 27075 +27096 27077 +27106 27081 +27108 27089 +27120 27105 +27166 27151 +27182 27159 +27190 27163 +27194 27165 +27196 27175 +27214 27179 +27222 27181 +27226 27187 +27228 27189 +27238 27193 +27242 27207 +27244 27211 +27250 27213 +27252 27219 +27256 27221 +27278 27225 +27286 27235 +27290 27237 +27292 27241 +29112 27249 +27302 27271 +35754 27275 +27306 27277 +27314 27283 +27316 27285 +27334 27289 +38260 27299 +27338 27301 +38356 27305 +29140 27313 +27340 27331 +27346 27333 +27348 27337 +27362 27345 +27376 27361 +20280 27399 +15160 27403 +24106 27405 +26390 27411 +26394 27413 +26406 27417 +15784 27427 +20400 27429 +15970 27433 +29496 27441 +15312 27459 +23338 27461 +15916 27465 +29514 27473 +24114 27489 +16006 27523 +24134 27525 +16010 27529 +29528 27537 +15984 27553 +24176 27585 +27678 27663 +27694 27671 +27702 27675 +27706 27677 +27708 27687 +27726 27691 +27734 27693 +27738 27699 +27740 27701 +27754 27705 +27756 27719 +27762 27723 +27768 27725 +27790 27731 +27802 27733 +27804 27737 +27814 27747 +27818 27749 +35726 27753 +29144 27761 +27826 27783 +35686 27787 +36300 27789 +27828 27795 +29338 27797 +37690 27801 +27888 27811 +34606 27813 +37810 27817 +29364 27825 +37734 27843 +37746 27845 +39334 27849 +29400 27857 +34638 27873 +22480 27911 +15972 27915 +23852 27917 +26396 27923 +26410 27925 +26412 27929 +16012 27939 +23352 27941 +16018 27945 +29994 27953 +23400 27971 +23860 27973 +23434 27977 +30004 27985 +23946 28001 +20376 28035 +23884 28037 +23436 28041 +29996 28049 +23442 28065 +23984 28097 +26382 28167 +15914 28171 +24116 28173 +16020 28179 +23444 28181 +23912 28185 +16048 28195 +26420 28197 +16066 28201 +30236 28209 +26418 28227 +24108 28229 +24202 28233 +30250 28241 +26438 28257 +23448 28291 +24138 28293 +39722 28297 +30252 28305 +24240 28321 +26444 28353 +16140 28419 +24332 28421 +16148 28425 +16164 28433 +16196 28449 +16260 28481 +24340 28545 +25062 28727 +41398 28731 +25068 28733 +25066 28759 +41390 28763 +49622 28765 +45262 28775 +41446 28779 +45276 28781 +28902 28787 +28906 28789 +45270 28793 +41452 28827 +49594 28829 +45300 28839 +49626 28845 +45238 28851 +28908 28853 +45292 28857 +53490 28871 +45304 28875 +53462 28885 +53466 28889 +28958 28943 +28974 28951 +28986 28955 +29006 28957 +14824 28967 +15020 28971 +27112 28973 +28988 28979 +29030 28981 +29018 28985 +23016 28999 +27364 29003 +23754 29005 +29034 29011 +29020 29013 +29070 29017 +29036 29027 +29078 29029 +29082 29033 +29138 29041 +29094 29063 +27352 29067 +27850 29069 +29084 29075 +29098 29077 +29100 29081 +15080 29091 +29126 29093 +29130 29097 +29154 29105 +29132 29123 +23784 29125 +29156 29129 +29160 29137 +29394 29153 +29214 29199 +29230 29207 +29238 29211 +29168 29213 +15076 29223 +23268 29227 +27858 29229 +45366 29235 +29242 29237 +29350 29241 +23272 29255 +27846 29259 +23780 29261 +29244 29267 +29262 29269 +29270 29273 +27764 29283 +29274 29285 +29276 29289 +29396 29297 +29286 29319 +29290 29323 +29292 29325 +29304 29331 +29326 29333 +29334 29337 +29340 29347 +29354 29349 +29356 29353 +29410 29361 +29382 29379 +29386 29381 +29412 29385 +29416 29393 +29424 29409 +14214 29447 +15238 29451 +15840 29453 +14178 29459 +14242 29461 +14244 29465 +15202 29475 +14274 29477 +14276 29481 +29522 29489 +14304 29507 +23394 29509 +15252 29513 +29538 29521 +23430 29537 +15298 29571 +23458 29573 +15300 29577 +29586 29585 +15328 29601 +23460 29633 +29726 29711 +29742 29719 +29750 29723 +29774 29725 +29754 29735 +29756 29739 +29782 29741 +29786 29747 +29788 29749 +29802 29753 +23778 29767 +29804 29771 +29812 29773 +29816 29779 +53590 29781 +29894 29785 +29838 29795 +29846 29797 +29850 29801 +29906 29809 +29852 29831 +29862 29835 +29868 29837 +29874 29843 +29876 29845 +45370 29849 +29880 29859 +29898 29861 +29900 29865 +29908 29873 +29912 29891 +29922 29893 +29924 29897 +29928 29905 +29936 29921 +22406 29959 +23504 29963 +23896 29965 +22370 29971 +22434 29973 +22436 29977 +23490 29987 +22466 29989 +22468 29993 +30034 30001 +22496 30019 +23890 30021 +23464 30025 +30040 30033 +23942 30049 +23520 30083 +23906 30085 +23492 30089 +30026 30097 +23864 30113 +24016 30145 +23948 30215 +16024 30219 +23954 30221 +14180 30227 +14248 30229 +15204 30233 +15266 30243 +22372 30245 +23396 30249 +29524 30257 +22472 30275 +23496 30277 +23970 30281 +29540 30289 +26480 30305 +16034 30339 +23972 30341 +24032 30345 +29588 30353 +16080 30369 +24272 30401 +30470 30467 +30474 30469 +30482 30473 +30498 30481 +30530 30497 +30594 30529 +31494 30593 +30750 30735 +30774 30743 +30778 30747 +30946 30749 +30822 30759 +34614 30763 +34618 30765 +30806 30771 +30826 30773 +34620 30777 +30828 30791 +34646 30795 +34650 30797 +34652 30803 +34666 30805 +34674 30809 +34662 30819 +34702 30821 +34710 30825 +34714 30833 +34726 30855 +34668 30859 +34730 30861 +34716 30867 +35638 30869 +35642 30873 +37662 30883 +37718 30885 +37782 30889 +39604 30897 +37738 30915 +38294 30917 +39652 30921 +40146 30929 +40162 30945 +23472 30983 +24120 30987 +24140 30989 +23892 30995 +23908 30997 +26424 31001 +16068 31011 +24146 31013 +24148 31017 +30036 31025 +24198 31043 +24204 31045 +24210 31049 +30050 31057 +24212 31073 +24216 31107 +26450 31109 +24226 31113 +30098 31121 +26442 31137 +26544 31169 +16096 31239 +26452 31243 +24228 31245 +26456 31251 +26466 31253 +26472 31257 +16072 31267 +24162 31269 +26502 31273 +30278 31281 +26506 31299 +26508 31301 +26514 31305 +30282 31313 +26516 31329 +26520 31363 +26530 31365 +38684 31369 +30354 31377 +42794 31393 +26576 31425 +16152 31491 +16208 31493 +16176 31497 +30484 31505 +16272 31521 +24356 31553 +28436 31617 +24288 31751 +26532 31755 +27434 31757 +26562 31763 +26536 31765 +26564 31769 +26592 31779 +27406 31781 +29602 31785 +30356 31793 +27414 31811 +24232 31813 +27418 31817 +30360 31825 +29544 31841 +38682 31875 +29636 31877 +38694 31881 +30370 31889 +39724 31905 +51020 31937 +24368 32003 +24344 32005 +24400 32009 +30488 32017 +28434 32033 +24464 32065 +28440 32129 +16200 32259 +24360 32261 +16224 32265 +30500 32273 +16320 32289 +24416 32321 +40714 32385 +32514 32513 +41692 33629 +50238 33645 +50350 33653 +50358 33657 +45274 34107 +53422 34155 +49614 34163 +49638 34169 +53310 34359 +45286 34391 +53430 34483 +53434 34485 +30780 34575 +30812 34583 +30810 34587 +34680 34589 +34676 34599 +35644 34603 +34786 34605 +34732 34611 +27874 34613 +27832 34617 +34738 34631 +35670 34635 +36150 34637 +30834 34643 +34740 34645 +30874 34649 +30862 34659 +30886 34661 +30766 34665 +30840 34673 +35674 34695 +35692 34699 +36154 34701 +30870 34707 +34758 34709 +34762 34713 +30798 34723 +30890 34725 +34764 34729 +30930 34737 +30876 34755 +30900 34757 +34770 34761 +30918 34769 +49642 35127 +41460 35159 +49650 35187 +50362 35189 +37368 35387 +41660 35435 +41708 35507 +41716 35513 +12016 35599 +27798 35607 +14908 35611 +35676 35613 +34744 35623 +35690 35627 +34788 35629 +35698 35635 +30892 35637 +30898 35641 +34772 35655 +35700 35659 +36156 35661 +34800 35667 +27308 35669 +35704 35673 +35734 35683 +35738 35685 +35740 35689 +35750 35697 +35756 35719 +35762 35723 +36182 35725 +35764 35731 +35768 35733 +27820 35737 +35782 35747 +35786 35749 +35788 35753 +35794 35761 +35796 35779 +35810 35781 +35812 35785 +35824 35809 +37624 35933 +50394 35949 +50410 36053 +50418 36057 +20208 36111 +36186 36119 +36188 36123 +23642 36125 +36198 36135 +36202 36139 +34792 36141 +27852 36147 +36204 36149 +36210 36153 +34776 36167 +35800 36171 +36212 36173 +36216 36179 +36238 36181 +36246 36185 +36250 36195 +36252 36197 +36262 36201 +36266 36209 +36268 36231 +35816 36235 +36274 36237 +36276 36243 +36280 36245 +36294 36249 +36298 36259 +36306 36261 +36308 36265 +36312 36291 +36322 36293 +36324 36297 +36328 36305 +36336 36321 +36382 36367 +36406 36375 +36410 36379 +36412 36381 +36438 36391 +36442 36395 +36444 36397 +36454 36403 +36458 36405 +36460 36409 +36466 36423 +36502 36427 +36506 36429 +36508 36435 +36518 36437 +36522 36441 +36530 36451 +36550 36453 +36472 36457 +39454 36487 +36524 36491 +36554 36493 +39484 36499 +39966 36501 +36562 36505 +39514 36515 +39996 36517 +44062 36521 +39544 36529 +44092 36547 +40026 36549 +44122 36553 +40056 36561 +44152 36577 +8160 36615 +12194 36619 +20386 36621 +15672 36627 +23384 36629 +27420 36633 +15928 36643 +20392 36645 +27430 36649 +27444 36657 +12256 36675 +23956 36677 +27448 36681 +27474 36689 +27526 36705 +20448 36739 +24152 36741 +27436 36745 +27918 36753 +27932 36769 +30998 36801 +37678 37647 +37692 37655 +37710 37659 +30922 37661 +37722 37671 +41758 37675 +37724 37677 +27750 37683 +37740 37685 +37748 37689 +37752 37703 +30924 37707 +27864 37709 +37774 37715 +37786 37717 +30932 37721 +41774 37731 +37788 37733 +30836 37737 +45342 37745 +37798 37767 +37802 37771 +27880 37773 +37812 37779 +37816 37781 +27860 37785 +41830 37795 +37830 37797 +37834 37801 +45358 37809 +37836 37827 +37842 37829 +37858 37841 +37872 37857 +38174 38159 +38190 38167 +38198 38171 +38202 38173 +38204 38183 +27320 38187 +38222 38189 +38234 38195 +38236 38197 +38246 38201 +38250 38215 +38252 38219 +50462 38221 +38258 38227 +38264 38229 +38286 38233 +38298 38243 +50510 38245 +30952 38249 +53534 38257 +38300 38279 +27368 38283 +38310 38285 +38314 38291 +38316 38293 +38324 38297 +38342 38307 +38348 38309 +38354 38321 +38360 38339 +50534 38341 +38372 38345 +53582 38353 +38384 38369 +38430 38415 +38446 38423 +38454 38427 +38458 38429 +38460 38439 +38478 38443 +38486 38445 +38490 38451 +38492 38453 +38502 38471 +38506 38475 +38508 38477 +38514 38483 +38520 38485 +38554 38499 +38566 38513 +38572 38535 +38516 38539 +38584 38541 +38598 38547 +38602 38577 +26568 38663 +27442 38667 +27462 38669 +27466 38675 +27468 38677 +27476 38681 +27480 38691 +27490 38693 +27492 38697 +30008 38705 +27496 38723 +27504 38725 +27530 38729 +30100 38737 +27532 38753 +27538 38787 +27586 38789 +27540 38793 +30052 38801 +27568 38817 +28016 38849 +39198 39183 +39222 39191 +27876 39195 +39226 39197 +39214 39207 +39228 39211 +39254 39213 +39258 39219 +39260 39221 +39274 39239 +39288 39243 +39310 39245 +39318 39251 +39322 39253 +39338 39267 +39340 39273 +41814 39281 +39324 39307 +39366 39309 +39346 39315 +39370 39345 +36430 39439 +39478 39447 +30936 39451 +39482 39453 +39510 39463 +39516 39467 +36532 39469 +41788 39475 +39526 39477 +41806 39481 +39530 39495 +30948 39499 +39532 39501 +39538 39523 +39540 39525 +36468 39529 +39574 39559 +39578 39563 +39580 39565 +39602 39571 +39608 39573 +39622 39577 +39634 39587 +36564 39589 +39636 39593 +41836 39601 +39640 39619 +41818 39621 +39650 39625 +39664 39649 +27544 39687 +27554 39691 +27926 39693 +15976 39699 +27556 39701 +24004 39705 +27600 39715 +27616 39717 +27930 39721 +30258 39729 +27942 39747 +27946 39749 +27948 39753 +30290 39761 +28080 39777 +27954 39811 +27956 39813 +24260 39817 +30260 39825 +27960 39841 +28112 39873 +36398 39951 +39990 39959 +39994 39963 +30904 39965 +40022 39975 +40028 39979 +30960 39981 +40038 40007 +36568 40011 +40050 40013 +40052 40019 +50522 40021 +50478 40025 +40086 40035 +40092 40037 +36556 40041 +40114 40071 +40116 40075 +40120 40077 +40148 40083 +41834 40085 +41926 40089 +41820 40099 +40152 40101 +40164 40105 +36536 40131 +41842 40133 +42326 40137 +50538 40145 +40176 40161 +27974 40199 +27978 40203 +28174 40205 +27980 40211 +24168 40213 +27986 40217 +27992 40227 +28008 40229 +28038 40233 +30264 40241 +28042 40259 +28044 40261 +28050 40265 +30296 40273 +29516 40289 +28052 40323 +28056 40325 +28068 40329 +30306 40337 +28128 40353 +28182 40385 +28186 40455 +28188 40459 +31002 40461 +28198 40467 +28202 40469 +28204 40473 +28210 40483 +28212 40485 +28216 40489 +28230 40497 +28248 40515 +28298 40517 +29454 40521 +28336 40529 +29580 40545 +28272 40579 +29552 40581 +28368 40585 +30028 40593 +29574 40609 +38700 40641 +28428 40707 +28450 40709 +24452 40713 +24388 40721 +28452 40737 +31506 40769 +32018 40833 +42526 41743 +39656 41751 +37804 41755 +39352 41757 +40090 41767 +41848 41771 +42550 41773 +15052 41779 +41844 41781 +37848 41785 +41870 41799 +39502 41803 +40042 41805 +37844 41811 +40168 41813 +41878 41817 +41882 41827 +41884 41829 +40044 41833 +45372 41841 +41932 41863 +41894 41867 +42598 41869 +39626 41875 +41898 41877 +39628 41881 +41900 41891 +41908 41893 +41912 41897 +45398 41905 +41930 41923 +41938 41929 +41940 41937 +41944 41953 +42270 42255 +42286 42263 +42294 42267 +42298 42269 +40102 42279 +42300 42283 +42342 42285 +42346 42291 +42348 42297 +42356 42311 +42382 42315 +42390 42317 +42394 42323 +42396 42325 +42406 42339 +42410 42345 +42412 42353 +42418 42375 +42420 42381 +42438 42403 +42442 42417 +41954 42523 +42542 42539 +41906 42547 +41968 42553 +42556 42571 +42574 42579 +42582 42585 +42588 42595 +42604 42601 +42612 42609 +42638 42635 +42646 42643 +42652 42649 +42668 42659 +42694 42665 +45390 42673 +42700 42691 +42708 42697 +45402 42705 +45404 42721 +31004 42759 +43790 42763 +31254 42765 +28234 42771 +28236 42773 +28264 42777 +43798 42787 +28294 42789 +29578 42793 +31014 42801 +29966 42819 +28306 42821 +30056 42825 +31018 42833 +30064 42849 +43802 42883 +30086 42885 +30090 42889 +31026 42897 +30092 42913 +30114 42945 +43550 43535 +43566 43543 +43580 43547 +43606 43549 +43574 43559 +43626 43563 +43598 43565 +43610 43571 +43622 43577 +43578 43591 +43612 43595 +43674 43597 +43634 43603 +43686 43619 +43628 43625 +43718 43633 +43640 43655 +43636 43659 +43676 43661 +43700 43683 +43722 43697 +36630 43783 +43804 43787 +28300 43789 +30160 43795 +27560 43797 +30222 43801 +43814 43811 +30284 43813 +30346 43817 +31028 43825 +30348 43843 +28308 43845 +28384 43849 +31020 43857 +30372 43873 +43846 43907 +30376 43909 +30990 43913 +31046 43921 +31032 43937 +31050 43969 +36578 44047 +44124 44055 +44086 44059 +44090 44061 +44118 44071 +44134 44075 +36580 44077 +44138 44103 +36584 44107 +44146 44109 +45414 44115 +50774 44117 +50718 44121 +44148 44131 +44182 44133 +36592 44137 +44186 44167 +44140 44171 +44188 44173 +44198 44179 +44210 44181 +44212 44185 +44216 44195 +44242 44197 +44244 44201 +44248 44227 +44258 44229 +44260 44233 +50790 44241 +44272 44257 +36636 44295 +43826 44299 +31772 44301 +31052 44307 +31058 44309 +31060 44313 +43820 44323 +31064 44325 +31074 44329 +31076 44337 +31088 44355 +31114 44357 +31116 44361 +31122 44369 +31124 44385 +43828 44419 +31246 44421 +31258 44425 +31260 44433 +31270 44449 +31274 44481 +36650 44551 +43832 44555 +31282 44557 +36660 44563 +31284 44565 +31288 44569 +43852 44579 +31302 44581 +43916 44585 +31306 44593 +36708 44611 +36634 44613 +36664 44617 +31314 44625 +38726 44641 +43864 44675 +36646 44677 +43922 44681 +43914 44689 +43952 44705 +44586 44737 +44806 44803 +28456 44805 +28464 44809 +28482 44817 +28546 44833 +32020 44865 +32274 44929 +45290 45173 +53454 45177 +53478 45269 +53482 45273 +45418 45335 +45420 45339 +45428 45351 +45432 45355 +29388 45363 +29798 45365 +37864 45369 +45454 45383 +45462 45387 +37860 45395 +42662 45397 +42724 45401 +41956 45411 +45466 45413 +44264 45417 +45468 45425 +45478 45447 +45482 45451 +45484 45459 +45492 45461 +45496 45465 +41960 45475 +45510 45477 +42676 45481 +45514 45489 +45516 45507 +45524 45509 +45528 45513 +45540 45521 +45544 45537 +46110 45591 +45598 45595 +46166 45607 +45654 45611 +45622 45619 +46134 45621 +45628 45625 +45658 45639 +45660 45643 +45614 45651 +45670 45653 +45674 45657 +45676 45667 +46182 45669 +45684 45673 +45734 45681 +47134 45703 +47190 45707 +46196 45715 +46140 45717 +47158 45721 +45688 45731 +47164 45733 +47220 45737 +45748 45745 +47206 45763 +46188 45765 +47212 45769 +46260 45777 +47284 45793 +31308 45831 +39702 45835 +31370 45837 +14280 45843 +24164 45845 +26468 45849 +15256 45859 +27592 45861 +29592 45865 +29608 45873 +15304 45891 +27588 45893 +27988 45897 +30292 45905 +30148 45921 +28002 45955 +28004 45957 +28258 45961 +29640 45969 +30408 45985 +31172 46017 +46126 46103 +45646 46107 +46158 46119 +45722 46123 +45626 46131 +46172 46133 +45752 46137 +50574 46151 +49998 46155 +46246 46163 +53594 46165 +47150 46169 +45718 46179 +53550 46181 +45724 46185 +46170 46193 +50598 46215 +47194 46219 +49974 46227 +50006 46229 +46236 46233 +45766 46243 +53610 46245 +46278 46249 +45780 46257 +46282 46275 +53646 46277 +50010 46281 +49950 46289 +46292 46305 +31372 46343 +31832 46347 +31276 46355 +28242 46357 +28244 46361 +28312 46371 +30308 46373 +30404 46377 +31110 46385 +30342 46403 +28066 46405 +31128 46409 +31176 46417 +31138 46433 +28260 46467 +30416 46469 +31080 46473 +31316 46481 +31320 46497 +31758 46529 +31766 46599 +39708 46603 +38708 46611 +31366 46613 +28322 46617 +31380 46627 +31330 46629 +31332 46633 +31384 46641 +31394 46659 +31378 46661 +31428 46665 +31396 46673 +31796 46689 +31814 46723 +36678 46725 +38698 46729 +36690 46737 +38706 46753 +38738 46785 +31498 46851 +30476 46853 +30504 46857 +31508 46865 +30532 46881 +30596 46913 +32006 46977 +50602 47127 +45710 47131 +46296 47143 +45738 47147 +45740 47155 +47182 47157 +45770 47161 +50766 47175 +47196 47179 +46186 47187 +53846 47189 +47246 47193 +45772 47203 +53790 47205 +45796 47209 +47270 47217 +50778 47239 +47254 47243 +47260 47251 +53674 47253 +47276 47257 +45784 47267 +53850 47269 +47316 47273 +45800 47281 +47302 47299 +53838 47301 +47308 47305 +47306 47313 +47332 47329 +40470 47367 +43910 47371 +38732 47379 +31820 47381 +31826 47385 +43850 47395 +31844 47397 +36652 47401 +51014 47409 +36696 47427 +28324 47429 +28328 47433 +36706 47441 +38712 47457 +43874 47491 +38730 47493 +38744 47497 +38754 47505 +38756 47521 +38794 47553 +44566 47623 +44572 47627 +39732 47635 +38796 47637 +38804 47641 +43858 47651 +43928 47653 +44596 47657 +38808 47665 +39780 47683 +39750 47685 +39756 47689 +38852 47697 +43924 47713 +43876 47747 +43976 47749 +44644 47753 +44000 47761 +44626 47777 +47638 47809 +47878 47875 +31512 47877 +31522 47881 +31554 47889 +31618 47905 +32068 47937 +32262 48001 +39762 48135 +40476 48139 +52502 48141 +40500 48147 +31400 48149 +31432 48153 +42774 48163 +39792 48165 +39828 48169 +61718 48177 +39876 48195 +38670 48197 +39736 48201 +36682 48209 +39768 48225 +40548 48259 +38864 48261 +40244 48265 +40292 48273 +40530 48289 +51084 48321 +28496 48387 +28512 48389 +24480 48393 +31528 48401 +30536 48417 +32066 48449 +32322 48513 +44818 48643 +28560 48645 +31524 48649 +31556 48657 +30544 48673 +40722 48705 +44848 48769 +32516 48897 +46230 49935 +46222 49943 +46308 49947 +50012 49949 +46284 49959 +50022 49963 +50026 49965 +50076 49971 +50062 49973 +46252 49991 +50118 49995 +50034 49997 +50074 50005 +50070 50009 +50086 50021 +50090 50025 +50092 50033 +50028 50055 +50098 50059 +50122 50117 +50734 50129 +38322 50461 +39982 50477 +38328 50485 +46234 50489 +50486 50509 +23722 50517 +38346 50521 +50546 50533 +46312 50537 +53558 50545 +50742 50573 +40106 50581 +40108 50585 +50794 50597 +47320 50601 +53814 50609 +50582 50629 +50802 50633 +53606 50641 +53862 50657 +44078 50717 +50130 50733 +47258 50741 +50746 50745 +50490 50765 +44202 50773 +44204 50777 +50586 50789 +47336 50793 +50830 50801 +50838 50829 +50854 50837 +50842 50841 +50858 50853 +50886 50857 +53562 50865 +50610 50885 +50866 50889 +53658 50897 +53818 50913 +39694 50951 +40230 50955 +52494 50957 +31782 50963 +31794 50965 +38802 50969 +39706 50979 +38832 50981 +42780 50985 +31828 50993 +29616 51011 +52506 51013 +39842 51017 +31770 51025 +31786 51041 +31408 51075 +52522 51077 +42790 51081 +31788 51089 +31878 51105 +30384 51137 +42796 51975 +42822 51979 +52532 51981 +31892 51987 +42804 51989 +42828 51993 +42834 52003 +42850 52005 +42840 52009 +31940 52017 +42852 52035 +52508 52037 +52524 52041 +31952 52049 +39730 52065 +42890 52099 +61724 52101 +42960 52105 +44310 52113 +45852 52129 +52254 52239 +52270 52247 +52278 52251 +52302 52253 +52282 52263 +52310 52267 +52284 52269 +52326 52277 +52314 52295 +52330 52299 +52378 52301 +52316 52309 +52338 52313 +52390 52325 +52332 52329 +52422 52337 +52344 52359 +52340 52363 +52380 52365 +52396 52421 +52434 52433 +39754 52487 +39764 52491 +52518 52493 +28104 52499 +39778 52501 +39814 52505 +28360 52515 +39818 52517 +39820 52521 +31800 52529 +31818 52547 +52550 52549 +40214 52553 +31882 52561 +31938 52577 +39826 52611 +52536 52613 +40236 52617 +31884 52625 +40220 52641 +40504 52673 +40474 52743 +39904 52747 +52554 52749 +45846 52755 +40490 52757 +42808 52761 +45876 52771 +51026 52773 +45866 52777 +42864 52803 +52568 52805 +52618 52809 +45850 52817 +45894 52833 +44316 52867 +52688 52869 +52628 52873 +45906 52881 +45912 52897 +52758 52929 +28488 52995 +52998 52997 +40728 53001 +28552 53009 +31536 53025 +31500 53057 +32280 53121 +53618 53533 +53866 53549 +38370 53557 +46138 53561 +53654 53581 +29866 53589 +38376 53593 +50630 53605 +46200 53609 +53702 53617 +53874 53645 +46250 53653 +46264 53657 +50890 53669 +47210 53673 +53958 53681 +50642 53701 +50898 53705 +53714 53713 +53970 53729 +53670 53789 +53806 53805 +47162 53813 +53902 53817 +53682 53837 +47224 53845 +47274 53849 +50634 53861 +47288 53865 +53706 53873 +53938 53901 +53910 53909 +53914 53913 +53926 53925 +53930 53929 +53962 53937 +50658 53957 +50914 53961 +53730 53969 +53986 53985 +40218 54029 +40492 54037 +42766 54041 +44340 54053 +47382 54057 +61734 54065 +31890 54085 +31906 54089 +61722 54097 +61740 54113 +40248 54149 +44370 54153 +61738 54161 +61748 54177 +31842 54209 +54302 54301 +55326 54317 +54350 54325 +55374 54329 +54326 54349 +54358 54357 +54362 54361 +54374 54373 +54378 54377 +54470 54385 +55350 54413 +55382 54421 +55386 54425 +55398 54437 +55402 54441 +55494 54449 +54386 54469 +55410 54473 +54482 54481 +55506 54497 +44314 54541 +22440 54549 +28072 54553 +23960 54565 +30104 54569 +42802 54577 +23976 54597 +31144 54601 +30120 54609 +31896 54625 +30152 54661 +31944 54665 +38818 54673 +42826 54689 +42892 54721 +44326 54797 +40274 54805 +40536 54809 +40290 54821 +40546 54825 +45862 54833 +31912 54853 +42898 54857 +42900 54865 +43938 54881 +44344 54917 +44386 54921 +44570 54929 +45924 54945 +44588 54977 +30512 55043 +32010 55045 +31560 55049 +32034 55057 +32266 55073 +30600 55105 +31620 55169 +54318 55325 +55342 55341 +54414 55349 +55438 55353 +54330 55373 +54422 55381 +54426 55385 +54438 55397 +54442 55401 +54474 55409 +55354 55437 +55446 55445 +55450 55449 +55462 55461 +55466 55465 +55498 55473 +54450 55493 +55474 55497 +54498 55505 +55522 55521 +52614 55565 +44376 55573 +44388 55577 +44600 55589 +45868 55593 +47642 55601 +52562 55621 +52564 55625 +44632 55633 +45880 55649 +52578 55685 +52580 55689 +45898 55697 +47430 55713 +47434 55745 +44642 55821 +45922 55829 +47690 55833 +47686 55845 +48150 55849 +61746 55857 +50966 55877 +50958 55881 +61766 55889 +61752 55905 +50970 55941 +50986 55945 +61770 55953 +61784 55969 +50982 56001 +32386 56067 +32012 56069 +32024 56073 +32036 56081 +32290 56097 +30608 56129 +32292 56193 +52762 56333 +40280 56341 +48154 56345 +47386 56357 +48198 56361 +50994 56369 +52632 56389 +52818 56393 +51018 56401 +51082 56417 +52648 56453 +52834 56457 +51090 56465 +51032 56481 +52704 56513 +32072 56579 +56582 56581 +47882 56585 +32040 56593 +32276 56609 +32130 56641 +32392 56705 +28576 56835 +53012 56837 +40752 56841 +32132 56849 +46854 56865 +44820 56897 +46882 56961 +32520 57089 +32268 59139 +32296 59141 +32388 59145 +47884 60163 +32328 60165 +32080 60169 +32400 60675 +56586 60677 +47890 60681 +48646 60931 +56838 60933 +48394 60937 +32528 61185 +61470 61463 +61486 61467 +61518 61469 +61494 61479 +61526 61483 +61498 61491 +61542 61493 +61500 61497 +61594 61517 +61546 61523 +61530 61525 +61532 61529 +61554 61539 +61606 61541 +61560 61545 +61638 61553 +61548 61587 +61556 61603 +61620 61617 +61624 61637 +61650 61649 +31200 61703 +31456 61707 +31968 61709 +46614 61715 +46358 61717 +46362 61721 +42836 61731 +38790 61733 +42886 61737 +61778 61745 +46410 61763 +51028 61765 +44332 61769 +61794 61777 +51078 61793 +42914 61827 +46666 61829 +48204 61833 +61842 61841 +48202 61857 +51042 61889 +48210 61959 +48266 61963 +46618 61971 +46662 61973 +48216 61977 +42952 61987 +51044 61989 +48262 61993 +61780 62001 +48276 62019 +51092 62021 +52038 62025 +61796 62033 +61844 62049 +48268 62083 +51056 62085 +51106 62089 +61892 62097 +61858 62113 +61974 62145 +31584 62211 +31624 62213 +32324 62217 +62226 62225 +46858 62241 +53010 62273 +48390 62337 +48274 62477 +46406 62485 +48226 62489 +51120 62501 +48290 62505 +61978 62513 +51112 62533 +52042 62537 +61848 62545 +62022 62561 +52050 62597 +52066 62601 +61864 62609 +62026 62625 +61896 62657 +32096 62723 +32136 62725 +32416 62729 +62738 62737 +48396 62753 +55046 62785 +56070 62849 +31648 62979 +32192 62981 +48514 62985 +62228 62993 +46860 63009 +53072 63041 +48650 63105 +32544 63233 +32448 63747 +62740 63761 +55050 63777 +48652 64003 +62994 64017 +48706 64033 +32576 64257 +56842 64517 +63000 64529 +56074 64577 +32640 64769 diff --git a/research/complex-small-m-lower-bounds/data/neg_m3_29.txt b/research/complex-small-m-lower-bounds/data/neg_m3_29.txt new file mode 100644 index 0000000000..fc5c183f52 --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/neg_m3_29.txt @@ -0,0 +1,30 @@ +m 3 k 4 alpha 0 p 2147483629 I 1518275076 size 29 +30 15 +46 23 +60 27 +78 29 +54 39 +86 43 +142 45 +90 51 +102 53 +150 57 +58 71 +92 75 +154 77 +106 83 +156 85 +166 89 +114 99 +170 101 +172 105 +198 113 +120 135 +108 139 +178 141 +116 147 +180 163 +202 177 +184 197 +210 209 +204 149 diff --git a/research/complex-small-m-lower-bounds/data/neg_m3_comp.txt b/research/complex-small-m-lower-bounds/data/neg_m3_comp.txt new file mode 100644 index 0000000000..742b35a6db --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/neg_m3_comp.txt @@ -0,0 +1,29 @@ +m 3 k 4 alpha 0 p 2147483627 I 1518275076 size 28 +30 15 +46 23 +60 27 +78 29 +54 39 +86 43 +142 45 +90 51 +102 53 +150 57 +58 71 +92 75 +154 77 +106 83 +156 85 +166 89 +114 99 +170 101 +172 105 +198 113 +120 135 +108 139 +178 141 +116 147 +180 163 +202 177 +184 197 +210 209 diff --git a/research/complex-small-m-lower-bounds/data/neg_m3_dup.txt b/research/complex-small-m-lower-bounds/data/neg_m3_dup.txt new file mode 100644 index 0000000000..7bc7ff614a --- /dev/null +++ b/research/complex-small-m-lower-bounds/data/neg_m3_dup.txt @@ -0,0 +1,29 @@ +m 3 k 4 alpha 0 p 2147483629 I 1518275076 size 28 +30 15 +30 23 +60 27 +78 29 +54 39 +86 43 +142 45 +90 51 +102 53 +150 57 +58 71 +92 75 +154 77 +106 83 +156 85 +166 89 +114 99 +170 101 +172 105 +198 113 +120 135 +108 139 +178 141 +116 147 +180 163 +202 177 +184 197 +210 209 diff --git a/research/complex-small-m-lower-bounds/verify.py b/research/complex-small-m-lower-bounds/verify.py new file mode 100644 index 0000000000..aeffb59a42 --- /dev/null +++ b/research/complex-small-m-lower-bounds/verify.py @@ -0,0 +1,1075 @@ +#!/usr/bin/env python3 +"""Registered check for research/complex-small-m-lower-bounds. Standard library only. + + python3 -B verify.py --part main PASS_COMPLEX_SMALL_M_LOWER_BOUNDS_MAIN + python3 -B verify.py --part controls PASS_COMPLEX_SMALL_M_LOWER_BOUNDS_CONTROLS + python3 -B verify.py both + +Words. Block size m, n = 2^m addresses, W arrays, s paid calls. A call is +dir(z) = a I + b X_z on one array (a = (1+i)/2, b = (1-i)/2, X_z the shift by z). +At f digit columns every letter acts on (C^n)^(x)f, the same in every column. + +The hook at block m and width f = j + 2 lives in V (x) Lambda^(j+1) V (V = C^n): +N = span{e_x (x) e_T : x in T}. For a letter g, raise(g) = dim(N + gN) - dim N += rank of g_W[S^c, S]. Free letters (shifts, address maps, phases) keep N (proved +in Lean). The kept-subspace bound then gives W * demand <= cap * s. + +Parts of --part main: + pins sha256 of every data file (equal, byte for byte, to files of + jacobalansussman/wht-power-saving-lean at commits 86e575e, ce3c261 and f08d308; + SOURCES.json) + block2 m = 2, f = 3: cap <= 4 in all 3 directions (exact Z[i] vectors), attained + (rank mod p), demand >= 8 (rank mod p of the whole block): s >= 2W + block3 m = 3, f = 5: cap <= 80 in all 7 directions (exact Z[i] vectors) and attained + in all 7 (rank mod p); demand >= 224 (a 224 x 224 minor nonzero mod p, and the + rank mod p of the whole 280 x 280 block); two calls in a row raise the hook by <= 144 (136 exact vectors); + the character block M_0 has rank >= 28 (two formats, two routines): s >= 14W/5 + leandata the eight 28 x 28 blocks of Dem3Data.lean (the data Lean's kernel checked): + certificate x formula = identity mod 65537, re-done here; 8 x 28 = 224 + face3 Theorem C3's certificate: Lambda^3(C^8), N = the 24 face triples; shifts and + diagonal phases keep N; cap 8 in all 7 directions; demand 24 in all 28 bases + (exact ranks over Q(i)): s >= 3W + block4 cap formula (16/2) C(14,7) = 27,456; 16 x 5,412 = 86,592; ratio 41/13; the + format of the 5,412 x 5,412 demand certificate (its determinant is author + evidence: author-evidence/check_m0.c, about an hour) + depth the inputs of section 7: two and three moves in independent directions raise the + block-4 hook by a_2 >= 48,576 and a_3 >= 68,320 (the hook split over the untouched + address bits into ranks of at most 280 x 280, mod p; one move gives the cap 27,456 + and block 3 gives 80 and 144 the same way); the exact block-5 and block-6 bounds + 834241/278850 and 1188222/399685 from that profile; the format of the two minor + certificates for a_2 and a_3 (their determinants on all 16 characters are author + evidence: author-evidence/check_mj.c, 42 minutes) + width with one zero scratch array, C^(x)3 costs zero calls at width f = 1, and the + same program is wrong at f = 2; every entry of C^(x)3 is nonzero + table every saving, exclusion and open shape printed in README.md and PROOF.md + +--part controls: corrupted certificates and false claims; each must be rejected. +No assert statements are used; every check is explicit and reported. +""" +import argparse +import hashlib +import itertools +import json +import math +import os +import sys +import time +from fractions import Fraction + +HERE = os.path.dirname(os.path.abspath(__file__)) +DATA = os.path.join(HERE, "data") + +PINS = { + "data/Dem3Data.lean": "0982f9cf408a7d2f930b4e65d1e2b1bd6a22b3c0601c372886fa7d9bf4c0cc52", + "data/cert_m2_M0.txt": "884bc29dbaf3714cb23426f56e28039e1dafb9b13f63a6b595b8dc15423f3cf0", + "data/cert_m3_B2.json": "078eb2a6a481f5a176b2fce2331fb285dbe8e20b034c5bb4558abc2455a27cf6", + "data/cert_m3_M0.json": "325f47b568ce2fee4d1b8848f19b0e27772340de5b4a04702d8799b3b1763748", + "data/cert_m3_M0_c.txt": "82169f3e70bc11ebdabc9b573f82f50f92e0a8073c5e747deb64714a84c0e6bc", + "data/cert_m3_dem.json": "99235c4fbfb37a2205a888b18292edbfa3be07970dd0550c47f79bbe66e802c3", + "data/cert_m4_M0.txt": "72530af84ea9a702b9e48b1dd8d5e69e9b0552840096f38b5caac9667c4236e2", + "data/neg_m3_29.txt": "1d89519b59d32f23ca4dd5355b45ed03a226bec430bc90aeafaac0d001bbfa36", + "data/neg_m3_comp.txt": "4ebc926017f670b43345af6d984039b4b93327ddb387e6d95d8f861133f65a8c", + "data/neg_m3_dup.txt": "f6fe0a5d3025396dcfe168214a33e4730e20c46187b5b68a5aeaf86cabbfa928", + "author-evidence/check_m0.c": "8242342188fe73eb8ab0db9e48727d086ec78c38032bdfb76b38a3af40ceef6e", + "data/cert_m4_g2_M0.txt": "1961d7482576245953e4b0368603ecf6295b02a8543334816e5c0139d64601c3", + "data/cert_m4_g3_M0.txt": "b04afdc7cb060c96605aeff19ee8a1ceb0968785208f6e66a938ebec7c3125ca", + "author-evidence/check_mj.c": "ca59130c3153da31eac93282126c797afd555d9a0934f60ecb38e304f46e82e0", + "author-evidence/out_check_m4_g2.txt": "7c4291efee95581d491be507e3f024d8ad36095d58440efd37c2ce9a1e5ea3c1", + "author-evidence/out_check_m4_g3.txt": "f82df0cd636ac90734699b2d4cf269354b59e4332687732a027f6bffe254f97a", + "author-evidence/induction-across-block-sizes.md": "0c2f6f5a07f1deccfa2b838c6d29bc6d86567069569890c37c820b03f7d888ef", +} + +RESULTS = [] + + +def report(name, ok, msg): + RESULTS.append((name, bool(ok))) + print(f"[{'PASS' if ok else 'FAIL'}] {name}: {msg}", flush=True) + return bool(ok) + + +def control(name, rejected, msg): + """A control passes when the corrupted input or false claim is rejected.""" + RESULTS.append((name, bool(rejected))) + print(f"[{'PASS' if rejected else 'FAIL'}] control {name}: " + f"{'rejected as it must be' if rejected else 'NOT rejected'}: {msg}", flush=True) + return bool(rejected) + + +# ---------------------------------------------------------------- arithmetic + +def is_prime(q): + if q < 2: + return False + if q % 2 == 0: + return q == 2 + d = 3 + while d * d <= q: + if q % d == 0: + return False + d += 2 + return True + + +def sqrt_minus_one(p): + for g in range(2, 10000): + c = pow(g, (p - 1) // 4, p) + if c * c % p == p - 1: + return c + return None + + +def popc(x): + return bin(x).count("1") + + +# Gaussian integers as pairs (re, im) +ZERO, ONE = (0, 0), (1, 0) + + +def gmul(x, y): + return (x[0] * y[0] - x[1] * y[1], x[0] * y[1] + x[1] * y[0]) + + +def gadd(x, y): + return (x[0] + y[0], x[1] + y[1]) + + +def gneg(x): + return (-x[0], -x[1]) + + +def gdet(A): + """Exact determinant over Z[i] by expansion along the first row.""" + if len(A) == 1: + return A[0][0] + tot = ZERO + for j, e in enumerate(A[0]): + if e == ZERO: + continue + minor = [row[:j] + row[j + 1:] for row in A[1:]] + t = gmul(e, gdet(minor)) + tot = gadd(tot, t if j % 2 == 0 else gneg(t)) + return tot + + +def det_modp(A, p): + A = [[x % p for x in r] for r in A] + N = len(A) + det = 1 + for c in range(N): + pr = next((r for r in range(c, N) if A[r][c]), None) + if pr is None: + return 0 + if pr != c: + A[c], A[pr] = A[pr], A[c] + det = -det + det = det * A[c][c] % p + iv = pow(A[c][c], p - 2, p) + rc = A[c] + for r in range(c + 1, N): + if A[r][c]: + f = A[r][c] * iv % p + A[r] = [(x - f * y) % p for x, y in zip(A[r], rc)] + return det % p + + +def rank_modp(A, p): + A = [[x % p for x in r] for r in A] + R = len(A) + C = len(A[0]) if R else 0 + rk = 0 + for c in range(C): + pr = next((r for r in range(rk, R) if A[r][c]), None) + if pr is None: + continue + A[rk], A[pr] = A[pr], A[rk] + iv = pow(A[rk][c], p - 2, p) + top = A[rk] + for r in range(rk + 1, R): + if A[r][c]: + f = A[r][c] * iv % p + A[r] = [(x - f * y) % p for x, y in zip(A[r], top)] + rk += 1 + return rk + + +def rank_exact_gauss(rows): + """Exact rank over Q(i) of a matrix with Z[i] entries: realify, Fraction elimination.""" + R = [] + for r in rows: + R.append([Fraction(e[0]) for e in r] + [Fraction(-e[1]) for e in r]) + R.append([Fraction(e[1]) for e in r] + [Fraction(e[0]) for e in r]) + rk = 0 + ncol = len(R[0]) if R else 0 + for c in range(ncol): + piv = next((r for r in range(rk, len(R)) if R[r][c] != 0), None) + if piv is None: + continue + R[rk], R[piv] = R[piv], R[rk] + for r in range(len(R)): + if r != rk and R[r][c] != 0: + f = R[r][c] / R[rk][c] + R[r] = [x - f * y for x, y in zip(R[r], R[rk])] + rk += 1 + return rk // 2, rk % 2 == 0 + + +# ------------------------------------------------------------- the hook family + +class Hook: + """The hook N = span{e_x (x) e_T : x in T} inside V (x) Lambda^k V, V = C^n, n = 2^m.""" + + def __init__(self, m, k): + self.m, self.k, self.n = m, k, 1 << m + self.subs = list(itertools.combinations(range(self.n), k)) + self.S = [(x, T) for x in range(self.n) for T in self.subs if x in T] + self.Sc = [(y, U) for y in range(self.n) for U in self.subs if y not in U] + + # exact Z[i] matrices of 2 dir(z) and of shifts + def two_dir(self, z): + n = self.n + M = [[ZERO] * n for _ in range(n)] + for x in range(n): + M[x][x] = gadd(M[x][x], (1, 1)) + M[x ^ z][x] = gadd(M[x ^ z][x], (1, -1)) + return M + + def matmul(self, A, B): + n = self.n + out = [[ZERO] * n for _ in range(n)] + for r in range(n): + for c in range(n): + acc = ZERO + for t in range(n): + if A[r][t] != ZERO and B[t][c] != ZERO: + acc = gadd(acc, gmul(A[r][t], B[t][c])) + out[r][c] = acc + return out + + def wedge_col(self, g, T): + """(Lambda^k g) e_T = sum_U det g[U, T] e_U, exact.""" + col = {} + for U in self.subs: + d = gdet([[g[u][t] for t in T] for u in U]) + if d != ZERO: + col[U] = d + return col + + def apply_W(self, g, vec, cache): + out = {} + for (x, T), c in vec.items(): + if c == ZERO: + continue + if T not in cache: + cache[T] = self.wedge_col(g, T) + col = cache[T] + for y in range(self.n): + if g[y][x] == ZERO: + continue + gy = gmul(g[y][x], c) + for U, d in col.items(): + key = (y, U) + out[key] = gadd(out.get(key, ZERO), gmul(gy, d)) + return {kk: v for kk, v in out.items() if v != ZERO} + + @staticmethod + def wedge_sign_sorted(seq): + if len(set(seq)) < len(seq): + return 0, None + inv = sum(1 for i in range(len(seq)) for j in range(i + 1, len(seq)) if seq[i] > seq[j]) + return (-1 if inv % 2 else 1), tuple(sorted(seq)) + + def cap_vectors(self, z): + """Exact vectors u in N with (2 dir z)_W u in N, pairwise disjoint supports. + Their number t gives raise(dir z) <= |S| - t.""" + g = self.two_dir(z) + vecs = [] + for a in range(self.n): + b = a ^ z + if a > b: + continue + for w in itertools.combinations(range(self.n), self.k - 1): + u = {} + for x, sg in ((a, 1), (b, -1)): + s, srt = self.wedge_sign_sorted((x,) + w) + if s: + u[(x, srt)] = (sg * s, 0) + if u: + vecs.append(u) + cache = {} + bad = sum(1 for u in vecs if any(y not in U for (y, U) in self.apply_W(g, u, cache))) + keys = [key for u in vecs for key in u] + disjoint = len(keys) == len(set(keys)) and all(x in T for (x, T) in keys) + return len(vecs), bad, disjoint + + def raise_modp(self, g_modp, p): + """rank mod p of g_W[S^c, S] (a lower bound for raise(g) over Q(i)).""" + n = self.n + wc = {} + for T in self.subs: + col = {} + for U in self.subs: + d = det_modp([[g_modp[u][t] for t in T] for u in U], p) + if d: + col[U] = d + wc[T] = col + A = [[g_modp[y][x] * wc[T].get(U, 0) % p for (x, T) in self.S] for (y, U) in self.Sc] + return rank_modp(A, p) + + +def dir_modp(n, z, p, I): + h = pow(2, p - 2, p) + M = [[0] * n for _ in range(n)] + for x in range(n): + M[x][x] = (M[x][x] + (1 + I) * h) % p + M[x ^ z][x] = (M[x ^ z][x] + (1 - I) * h) % p + return M + + +def mm_modp(A, B, p): + n = len(A) + return [[sum(A[r][t] * B[t][c] for t in range(n)) % p for c in range(n)] for r in range(n)] + + +def kernel_modp(m, p, I): + n = 1 << m + K = None + for j in range(m): + D = dir_modp(n, 1 << j, p, I) + K = D if K is None else mm_modp(K, D, p) + return K + + +# ------------------------------------------------------------------- the parts + +def part_pins(): + ok = True + for rel, want in sorted(PINS.items()): + path = os.path.join(HERE, rel) + try: + got = hashlib.sha256(open(path, "rb").read()).hexdigest() + except OSError as exc: + got = f"unreadable ({exc})" + ok &= report(f"pin {rel}", got == want, got[:16] + "...") + return ok + + +P1 = 1000000009 # a prime = 1 mod 4 for the rank checks + + +def part_block2(): + H = Hook(2, 2) # j = 1, f = j + 2 = 3, k = j + 1 = 2 + ok = report("block2 hook size", len(H.S) == 12 and len(H.Sc) == 12, f"|S| = {len(H.S)}, |S^c| = {len(H.Sc)}") + I = sqrt_minus_one(P1) + caps = {} + for z in range(1, 4): + t, bad, disjoint = H.cap_vectors(z) + attained = H.raise_modp(dir_modp(4, z, P1, I), P1) + caps[z] = (len(H.S) - t, attained) + ok &= report(f"block2 cap dir {z}", bad == 0 and disjoint and len(H.S) - t == 4 and attained == 4, + f"{t} exact vectors kept (images outside N: {bad}, disjoint: {disjoint}) -> raise <= {len(H.S) - t}; rank mod p = {attained}") + dem = H.raise_modp(kernel_modp(2, P1, I), P1) + ok &= report("block2 demand", dem >= 8, f"rank mod {P1} of K_W[S^c,S] = {dem} -> demand >= {dem}") + ok &= report("block2 bound", Fraction(dem, 4) == 2, f"demand/cap = {dem}/4 = {Fraction(dem, 4)} calls per array: s >= 2W") + return ok + + +def part_block3(full_attained=True): + H = Hook(3, 4) # j = 3, f = 5, k = 4 + ok = report("block3 hook size", len(H.S) == 280 and len(H.Sc) == 280, f"|S| = {len(H.S)}") + I = sqrt_minus_one(P1) + for z in range(1, 8): + t, bad, disjoint = H.cap_vectors(z) + msg = f"{t} exact vectors (outside N: {bad}, disjoint: {disjoint}) -> raise <= {280 - t}" + good = bad == 0 and disjoint and t == 200 + if full_attained or z == 1: + att = H.raise_modp(dir_modp(8, z, P1, I), P1) + msg += f"; rank mod p = {att} (attained)" + good = good and att == 80 + ok &= report(f"block3 cap dir {z}", good, msg) + # demand certificate + C = json.load(open(os.path.join(DATA, "cert_m3_dem.json"))) + dem, msg = check_dem3_cert(C, H) + ok &= report("block3 demand certificate", dem == 224, msg) + full = H.raise_modp(kernel_modp(3, P1, I), P1) + ok &= report("block3 demand, whole block", full >= 224, f"rank mod {P1} of the whole 280 x 280 block K_W[S^c,S] = {full}") + # two calls in a row + C2 = json.load(open(os.path.join(DATA, "cert_m3_B2.json"))) + f2, msg = check_b2_cert(C2, H) + ok &= report("block3 two calls in a row", f2 == 144, msg) + # character block M_0, two formats + C3 = json.load(open(os.path.join(DATA, "cert_m3_M0.json"))) + r0, msg = check_m0_json(C3) + ok &= report("block3 M_0 block (json format)", r0 == 28, msg) + r0c, msg = check_m0_text(open(os.path.join(DATA, "cert_m3_M0_c.txt")).read()) + ok &= report("block3 M_0 block (text format, second routine)", r0c == 28, msg) + r2, msg = check_m0_text(open(os.path.join(DATA, "cert_m2_M0.txt")).read()) + ok &= report("block2 M_0 block (text format)", r2 == 2, msg + "; 4 characters x 2 = 8") + ok &= report("block3 bound", Fraction(224, 80) == Fraction(14, 5) and 8 * 28 == 224, + "demand/cap = 224/80 = 14/5 calls per array: 5 s >= 14 W; 8 characters x 28 = 224") + return ok + + +def check_dem3_cert(C, H): + p, I = C.get("p"), C.get("I") + rows = [(r[0], tuple(r[1])) for r in C.get("rows", [])] + cols = [(c[0], tuple(c[1])) for c in C.get("cols", [])] + k = 4 + okfmt = (isinstance(p, int) and is_prime(p) and isinstance(I, int) and (I * I + 1) % p == 0 + and len(rows) == len(cols) == len(set(rows)) == len(set(cols)) + and all(len(U) == k and list(U) == sorted(set(U)) and y not in U and 0 <= y < 8 for y, U in rows) + and all(len(T) == k and list(T) == sorted(set(T)) and x in T and 0 <= x < 8 for x, T in cols)) + if not okfmt: + return 0, "format rejected (prime, square root of -1, distinct rows in S^c and columns in S)" + K = kernel_modp(3, p, I) + dets = {} + + def lam(U, T): + if (U, T) not in dets: + dets[(U, T)] = det_modp([[K[u][t] for t in T] for u in U], p) + return dets[(U, T)] + M = [[K[y][x] * lam(U, T) % p for (x, T) in cols] for (y, U) in rows] + d = det_modp(M, p) + return (len(rows) if d else 0), f"minor of K_W[S^c,S] of size {len(rows)}, det mod {p} = {d}" + + +def check_b2_cert(C2, H): + basis = [(b[0], tuple(b[1])) for b in C2.get("basis_S", [])] + okb = len(basis) == len(set(basis)) == len(H.S) and all(x in T for x, T in basis) + if not okb: + return None, "basis rejected" + g2 = H.matmul(H.two_dir(1), H.two_dir(2)) + vecs = [{basis[int(key)]: (c[0], c[1]) for key, c in v.items()} for v in C2.get("vectors", [])] + cache = {} + bad = sum(1 for v in vecs if any(y not in U for (y, U) in H.apply_W(g2, v, cache))) + pB = 1000000007 + 2 + while not (is_prime(pB) and pB % 4 == 1): + pB += 1 + IB = sqrt_minus_one(pB) + bidx = {b: i for i, b in enumerate(basis)} + Vm = [[0] * len(H.S) for _ in vecs] + for r, v in enumerate(vecs): + for key, c in v.items(): + Vm[r][bidx[key]] = (c[0] + c[1] * IB) % pB + rk = rank_modp(Vm, pB) + if bad or rk != len(vecs): + return None, f"{len(vecs)} vectors, images outside N {bad}, rank {rk}: rejected" + return len(H.S) - rk, (f"{len(vecs)} exact vectors v in N with (dir 1 dir 2)_W v in N, independent " + f"(rank mod {pB} = {rk}) -> raise <= {len(H.S) - rk}") + + +def check_m0_json(C3): + p3, I3 = C3.get("p"), C3.get("I") + r3 = [tuple(U) for U in C3.get("rows", [])] + c3 = [tuple(T) for T in C3.get("cols", [])] + k = 4 + okf = (is_prime(p3) and (I3 * I3 + 1) % p3 == 0 and len(r3) == len(c3) == len(set(r3)) == len(set(c3)) + and all(0 not in U and len(U) == k and list(U) == sorted(set(U)) for U in r3) + and all(0 in T and len(T) == k and list(T) == sorted(set(T)) for T in c3)) + if not okf: + return 0, "format rejected" + K3 = kernel_modp(3, p3, I3) + + def M0(U, T): + return sum(K3[0][s] * det_modp([[K3[u][t ^ s] for t in T] for u in U], p3) for s in range(8)) % p3 + d = det_modp([[M0(U, T) for T in c3] for U in r3], p3) + return (len(r3) if d else 0), f"minor of size {len(r3)}, det mod {p3} = {d}" + + +def check_m0_text(text): + """Port of check_m0.c: M_alpha[U][T] = sum_s (-1)^(alpha.s) Q[0][s] det(Q[u_a][t_b xor s]), + Q[u][v] = (-i)^popcount(u xor v); rows: k-subsets of {1..n-1}; columns: k-subsets containing 0.""" + tok = text.split() + try: + hdr = dict(zip(tok[0:12:2], tok[1:12:2])) + m, k, alpha = int(hdr["m"]), int(hdr["k"]), int(hdr["alpha"]) + p, I, size = int(hdr["p"]), int(hdr["I"]), int(hdr["size"]) + pairs = [(int(tok[12 + 2 * i]), int(tok[13 + 2 * i])) for i in range(size)] + except (KeyError, ValueError, IndexError): + return 0, "header or body rejected" + n = 1 << m + prime = 2 < p < (1 << 31) and is_prime(p) + okI = I * I % p == p - 1 + seenR, seenC, okS = set(), set(), True + for R, C in pairs: + if R >> n or C >> n or popc(R) != k or popc(C) != k or (R & 1) or not (C & 1) or R in seenR or C in seenC: + okS = False + seenR.add(R) + seenC.add(C) + if not (prime and okI and okS): + return 0, f"format rejected (p prime: {prime}, I^2 = -1: {okI}, rows/cols well formed and distinct: {okS})" + mi = [1, p - I, p - 1, I] + A = [] + for R, _ in pairs: + u = [x for x in range(n) if R >> x & 1] + row = [] + for _, Cm in pairs: + t = [x for x in range(n) if Cm >> x & 1] + acc = 0 + for s in range(n): + B = [[mi[popc(ua ^ tb ^ s) & 3] for tb in t] for ua in u] + term = mi[popc(s) & 3] * det_modp(B, p) % p + if popc(alpha & s) & 1: + term = (p - term) % p + acc = (acc + term) % p + row.append(acc) + A.append(row) + d = det_modp(A, p) + return (size if d else 0), f"m = {m}, {size} x {size} minor of M_{alpha}, det mod {p} = {d}" + + +# ---------------------------------------------------------- Lean data (Dem3Data) + +def load_dem3data(path): + text = open(path, encoding="utf-8").read() + out = {} + for name in ("rowsD", "colsD", "invD"): + key = "def " + name + " : List (List (List ℕ)) := " + i = text.find(key) + if i < 0: + return None + j = text.find("\n", i) + out[name] = json.loads(text[i + len(key):j]) + return out + + +PWZ = [1, -256, -256, 65536, -256, 65536, 65536, -16777216] # (-256)^popcount(z), as in Dem3Defs.lean + + +def chiZ(s, u): + return [1, -1, -1, 1, -1, 1, 1, -1][s & u] + + +def det4(mx): + """The Laplace expansion on rows 0, 1 written in Dem3Defs.lean.""" + m = mx + return ((m[0][0] * m[1][1] - m[0][1] * m[1][0]) * (m[2][2] * m[3][3] - m[2][3] * m[3][2]) + - (m[0][0] * m[1][2] - m[0][2] * m[1][0]) * (m[2][1] * m[3][3] - m[2][3] * m[3][1]) + + (m[0][0] * m[1][3] - m[0][3] * m[1][0]) * (m[2][1] * m[3][2] - m[2][2] * m[3][1]) + + (m[0][1] * m[1][2] - m[0][2] * m[1][1]) * (m[2][0] * m[3][3] - m[2][3] * m[3][0]) + - (m[0][1] * m[1][3] - m[0][3] * m[1][1]) * (m[2][0] * m[3][2] - m[2][2] * m[3][0]) + + (m[0][2] * m[1][3] - m[0][3] * m[1][2]) * (m[2][0] * m[3][1] - m[2][1] * m[3][0])) + + +def genZ(s, us, ts): + tz = [0] + list(ts) + return sum(chiZ(s, u) * PWZ[u] * det4([[PWZ[us[b] ^ u ^ tz[a]] for a in range(4)] for b in range(4)]) + for u in range(8)) + + +def block_check(D, s, bad_entry=False): + rows, cols, inv = D["rowsD"][s], D["colsD"][s], D["invD"][s] + if not (len(rows) == len(cols) == len(inv) == 28 and all(len(r) == 28 for r in inv)): + return False, "shape rejected" + okset = (len(set(map(tuple, rows))) == 28 and len(set(map(tuple, cols))) == 28 + and all(len(u) == 4 and list(u) == sorted(set(u)) and all(1 <= x <= 7 for x in u) for u in rows) + and all(len(t) == 3 and list(t) == sorted(set(t)) and all(1 <= x <= 7 for x in t) for t in cols)) + if not okset: + return False, "row or column representatives rejected" + G = [[genZ(s, rows[k], cols[j]) for j in range(28)] for k in range(28)] + B = [r[:] for r in inv] + if bad_entry: + B[0][0] = B[0][0] + 1 + for i in range(28): + for j in range(28): + v = sum(B[i][k] * G[k][j] for k in range(28)) - (1 if i == j else 0) + if v % 65537 != 0: + return False, f"entry ({i},{j}) of certificate x formula - identity is {v % 65537} mod 65537" + return True, "certificate x formula = identity mod 65537 on all 784 entries" + + +def part_leandata(): + D = load_dem3data(os.path.join(DATA, "Dem3Data.lean")) + if D is None: + return report("leandata parse", False, "Dem3Data.lean not parsed") + ok = report("leandata parse", all(len(D[k]) == 8 for k in D), "rowsD, colsD, invD: 8 blocks each") + tot = 0 + for s in range(8): + good, msg = block_check(D, s) + ok &= report(f"leandata block {s}", good, msg) + tot += 28 if good else 0 + ok &= report("leandata total", tot == 224, f"8 blocks of rank 28 mod 65537: {tot}") + return ok + + +# ------------------------------------------------------------------- face3 (C3) + +def face3_setup(): + n, m = 8, 3 + triples = list(itertools.combinations(range(n), 3)) + face = lambda T: any(len({(x >> j) & 1 for x in T}) == 1 for j in range(m)) + F = [T for T in triples if face(T)] + NF = [T for T in triples if not face(T)] + return F, NF + + +def det3g(A, S, T): + return gdet([[A[s][t] for t in T] for s in S]) + + +def leak3(A, F, NF): + r, even = rank_exact_gauss([[det3g(A, S, T) for T in F] for S in NF]) + return r if even else None + + +def part_face3(): + n = 8 + H = Hook(3, 1) # for two_dir / matmul only + F, NF = face3_setup() + ok = report("face3 face triples", len(F) == 24 and len(NF) == 32, f"{len(F)} face triples of {len(F) + len(NF)}") + + def shift(a): + M = [[ZERO] * n for _ in range(n)] + for x in range(n): + M[x ^ a][x] = ONE + return M + leaks = [leak3(shift(a), F, NF) for a in range(n)] + ok &= report("face3 shifts keep N", all(v == 0 for v in leaks), f"leaks {leaks}") + ipow = [(1, 0), (0, 1), (-1, 0), (0, -1)] + diag_ok = True + for z, c, q in [(1, 0, 0), (3, 1, 0), (7, 2, 0), (5, 3, 1)]: + D = [[ZERO] * n for _ in range(n)] + for x in range(n): + e = (popc(z & x) + c + 2 * q * ((x & 1) * ((x >> 1) & 1))) % 4 # i^(z.x + c) times a CZ-type sign + D[x][x] = ipow[e] + diag_ok &= leak3(D, F, NF) == 0 + ok &= report("face3 diagonal phases keep N", diag_ok, "four phase patterns, leak 0") + caps = {w: leak3(H.two_dir(w), F, NF) for w in range(1, n)} + ok &= report("face3 cap", all(v == 8 for v in caps.values()), f"caps per direction {caps}") + vecs = list(range(1, n)) + bases = [b for b in itertools.combinations(vecs, 3) if b[2] not in {0, b[0], b[1], b[0] ^ b[1]}] + dems = {} + for b in bases: + K = H.matmul(H.matmul(H.two_dir(b[0]), H.two_dir(b[1])), H.two_dir(b[2])) + dems[b] = leak3(K, F, NF) + hist = {v: list(dems.values()).count(v) for v in set(dems.values())} + ok &= report("face3 demand", len(bases) == 28 and hist == {24: 28}, f"{len(bases)} bases, demand histogram {hist}") + ok &= report("face3 bound", Fraction(24, 8) == 3, "demand/cap = 24/8 = 3 calls per array: s >= 3W (with the kept-subspace bound and the transfer of PROOF.md)") + return ok + + +# ------------------------------------------------------------------------ block 4 + +def part_block4(): + cap = (16 // 2) * math.comb(14, 7) + ok = report("block4 cap formula", cap == 27456, f"(2^4/2) C(2^4 - 2, 7) = {cap} (hook_cap, proved in Lean for every block)") + ok &= report("block4 demand split", 16 * 5412 == 86592, "16 character blocks x 5,412 = 86,592 (split argued by hand)") + ok &= report("block4 ratio", Fraction(86592, 27456) == Fraction(41, 13), f"86,592/27,456 = {Fraction(86592, 27456)}") + text = open(os.path.join(DATA, "cert_m4_M0.txt")).read() + good, msg = m4_format(text) + ok &= report("block4 certificate format", good, msg) + return ok + + +def m4_format(text): + tok = text.split() + try: + hdr = dict(zip(tok[0:12:2], tok[1:12:2])) + m, k, alpha = int(hdr["m"]), int(hdr["k"]), int(hdr["alpha"]) + p, I, size = int(hdr["p"]), int(hdr["I"]), int(hdr["size"]) + pairs = [(int(tok[12 + 2 * i]), int(tok[13 + 2 * i])) for i in range(size)] + except (KeyError, ValueError, IndexError): + return False, "header or body rejected" + n = 1 << m + rows = [r for r, _ in pairs] + cols = [c for _, c in pairs] + good = (m == 4 and k == 8 and alpha == 0 and size == 5412 and is_prime(p) and I * I % p == p - 1 + and len(set(rows)) == size and len(set(cols)) == size + and all(r >> n == 0 and popc(r) == k and not (r & 1) for r in rows) + and all(c >> n == 0 and popc(c) == k and (c & 1) for c in cols) + and len(tok) == 12 + 2 * size) + return good, (f"m = {m}, k = {k}, p = {p} (prime: {is_prime(p)}), I^2 = -1: {I * I % p == p - 1}, " + f"{size} distinct rows (8-subsets without 0) and columns (8-subsets with 0); " + "its determinant 1797789153 mod p is author evidence (check_m0.c), not re-run here") + + +# ------------------------------------------------------------------ depth (block 4) +# The inputs a_2 = f(dir e1 dir e2) and a_3 = f(dir e1 dir e2 dir e3) of PROOF.md section 7. A product g of +# moves on the low j bits acts as G (x) I on V = C^(2^j) (x) C^(2^(4-j)): V = (+)_c W_c over the 2^(4-j) values c +# of the untouched bits, W_c = C^d (d = 2^j), and g = G on every W_c. So Lambda^k V = (+) over (k_c) of +# (x)_c Lambda^(k_c) W_c, and the hook splits the same way: N = (+) over (c0, (k_c)) of +# N1(W_c0, k_c0) (x) (x)_(c != c0) Lambda^(k_c) W_c, with N1(W, s) = span{e_x (x) e_S : x in S} in W (x) Lambda^s W. +# g keeps every summand and is invertible on the full factors, so +# f(g) = sum over (k_c) with sum k_c = k, and over c0, of phi_d(k_c0) * prod_(c != c0) C(d, k_c), +# phi_d(s) = rank of G (x) Lambda^s G from N1(W, s) to its complement (at most 280 x 280 here). G is +# ((1+i)/2)^j times Q_j[u][v] = (-i)^popcount(u xor v), entries in Z[i]; a rank mod p (p = 1 mod 4, i -> sqrt(-1)) +# is at most the rank over Q(i), so every value below is a lower bound. (The split is the route of an AI +# reviewer of my repository, skeptic-checks/fcheck.py there.) + +DEPTH_CERTS = {2: ("cert_m4_g2_M0.txt", 3, 3036, 48576), 3: ("cert_m4_g3_M0.txt", 7, 4270, 68320)} + + +def local_rank(G, s, p): + d = len(G) + subs = list(itertools.combinations(range(d), s)) + minor = {(S, T): (det_modp([[G[x][y] for y in T] for x in S], p) if s else 1) for S in subs for T in subs} + rows = [(y, S) for S in subs for y in range(d) if y not in S] + cols = [(x, T) for T in subs for x in T] + if not rows or not cols: + return 0 + return rank_modp([[G[y][x] * minor[(S, T)] % p for (x, T) in cols] for (y, S) in rows], p) + + +def q_moves(j, p, I): + mi = [1, p - I, p - 1, I] # (-i)^0..3 mod p + d = 1 << j + return [[mi[popc(u ^ v) & 3] for v in range(d)] for u in range(d)] + + +def split_demand(m, k, j, phi): + d, nb = 1 << j, 1 << (m - j) + tot = 0 + for comp in itertools.product(range(d + 1), repeat=nb): + if sum(comp) != k: + continue + for c0 in range(nb): + prod = 1 + for c in range(nb): + if c != c0: + prod *= math.comb(d, comp[c]) + tot += phi[comp[c0]] * prod + return tot + + +def demand_of_moves(m, k, j, p, G=None): + I = sqrt_minus_one(p) + G = q_moves(j, p, I) if G is None else G + phi = {s: local_rank(G, s, p) for s in range((1 << j) + 1)} + return split_demand(m, k, j, phi) + + +def n_counts(k, r): + """Projection counts of PROOF.md section 7 (the closed form of the induction note, its Lemma 2), block k.""" + return {r: (2 ** (k - r) - 1) + (4 ** k - 2 ** (k + r)), + r - 1: 2 * (2 ** k - 2 ** (k - r)) + (2 ** r - 1) * 2 ** (r - 1) * 2 ** (k - r), + r - 2: (2 ** r - 1) * (2 ** (r - 1) - 1) * 2 ** (k - r)} + + +def projected_bounds(profile, upto): + prof, out = dict(profile), {} + for k in range(5, upto + 1): + prof = {r: sum(c * prof.get(s, 0) for s, c in n_counts(k, r).items() if s >= 0) for r in range(1, k + 1)} + out[k] = Fraction(prof[k], prof[1]) + return out + + +def depth_format(text, lab, size): + tok = text.split() + try: + hdr = dict(zip(tok[0:14:2], tok[1:14:2])) + m, k, lb, alpha = int(hdr["m"]), int(hdr["k"]), int(hdr["lab"]), int(hdr["alpha"]) + p, I, sz = int(hdr["p"]), int(hdr["I"]), int(hdr["size"]) + pairs = [(int(tok[14 + 2 * i]), int(tok[15 + 2 * i])) for i in range(sz)] + except (KeyError, ValueError, IndexError): + return False, "header or body rejected" + n = 1 << m + rows = [r for r, _ in pairs] + cols = [c for _, c in pairs] + good = (m == 4 and k == 8 and lb == lab and alpha == 0 and sz == size and is_prime(p) and I * I % p == p - 1 + and len(set(rows)) == sz and len(set(cols)) == sz + and all(r >> n == 0 and popc(r) == k and not (r & 1) for r in rows) + and all(c >> n == 0 and popc(c) == k and (c & 1) for c in cols) + and len(tok) == 14 + 2 * sz) + return good, (f"lab = {lb} (wanted {lab}), p = {p} (prime: {is_prime(p)}), size {sz}: {len(set(rows))} distinct " + f"rows and {len(set(cols))} distinct columns; its determinants on all 16 characters are author " + "evidence (check_mj.c), not re-run here") + + +def part_depth(): + ok = True + got = {j: demand_of_moves(4, 8, j, P1) for j in (1, 2, 3)} + ok &= report("block4 one move", got[1] == 27456, f"split ranks mod p give {got[1]} = the cap 27,456") + for j in (2, 3): + name, lab, size, want = DEPTH_CERTS[j] + ok &= report(f"block4 {j} moves in independent directions", got[j] >= want, + f"split ranks mod p give a_{j} >= {got[j]} (section 7 uses {want:,})") + b3 = (demand_of_moves(3, 4, 1, P1), demand_of_moves(3, 4, 2, P1)) + ok &= report("same split at block 3", b3 == (80, 144), f"one move {b3[0]}, two moves {b3[1]} (part block3: 80 and 144)") + T = projected_bounds({0: 0, 1: 27456, 2: got[2], 3: got[3], 4: 86592}, 6) + ok &= report("block 5 and 6 bounds from this profile", T[5] == BOUNDS[5] and T[6] == BOUNDS[6], + f"T_5 = {T[5]}, T_6 = {T[6]} (each grows with a_2, a_3, a_4; the denominator uses only the exact a_1)") + for j in (2, 3): + name, lab, size, want = DEPTH_CERTS[j] + good, msg = depth_format(open(os.path.join(DATA, name)).read(), lab, size) + ok &= report(f"block4 {j}-move certificate format ({size} x 16 = {16 * size:,})", + good and 16 * size == want, msg) + return ok + + +# ------------------------------------------------------------------------- width + +A_ = (Fraction(1, 2), Fraction(1, 2)) # (1+i)/2 +B_ = (Fraction(1, 2), Fraction(-1, 2)) # (1-i)/2 + + +def qmul(x, y): + return (x[0] * y[0] - x[1] * y[1], x[0] * y[1] + x[1] * y[0]) + + +def qadd(x, y): + return (x[0] + y[0], x[1] + y[1]) + + +QZ = (Fraction(0), Fraction(0)) + + +def shift_f(vec, v, f): + """X_v in every one of f digit columns of 3 bits each.""" + mask = 0 + for c in range(f): + mask |= v << (3 * c) + return [vec[x ^ mask] for x in range(len(vec))] + + +def call_f(vec, v, f): + """C_v^(x)f: in each column apply a I + b X_v.""" + out = vec + for c in range(f): + sh = [out[x ^ (v << (3 * c))] for x in range(len(out))] + out = [qadd(qmul(A_, out[x]), qmul(B_, sh[x])) for x in range(len(out))] + return out + + +def kernel_f(vec, f): + for j in range(3): + vec = call_f(vec, 1 << j, f) + return vec + + +def zero_call_program(vec, f): + """One array r and one zero scratch s; per direction: copy, shift (free), mix, clear. No call.""" + r = list(vec) + for j in range(3): + s = list(r) # copy (mixing) + s = shift_f(s, 1 << j, f) # free shift in every column + r = [qadd(qmul(A_, r[x]), qmul(B_, s[x])) for x in range(len(r))] # mix a r + b s + return r + + +def width_diff(f): + N = 1 << (3 * f) + diff = 0 + for x0 in range(N): + e = [QZ] * N + e[x0] = (Fraction(1), Fraction(0)) + diff += sum(1 for u, w in zip(zero_call_program(e, f), kernel_f(e, f)) if u != w) + return diff + + +def part_width(): + d1 = width_diff(1) + ok = report("width f = 1", d1 == 0, f"the zero-call program equals C^(x)3 at width 1 ({d1} entries differ)") + d2 = width_diff(2) + ok &= report("width f = 2", d2 > 0, f"the same program is wrong at width 2 ({d2} of 4096 entries differ)") + e = [QZ] * 8 + nz = True + for x0 in range(8): + e = [QZ] * 8 + e[x0] = (Fraction(1), Fraction(0)) + nz &= all(v != QZ for v in kernel_f(e, 1)) + ok &= report("support", nz, "every entry of C^(x)3 is nonzero, while one call sends a basis vector to at most 2 addresses: without scratch, one array needs 3 calls (the argument of PROOF.md section 4)") + return ok + + +# ------------------------------------------------------------------------- table + +def saving(m, W, s): + return math.log(m * W / s) / math.log(m) + + +def fig(x): + """The 7.47e-4 style: three significant digits.""" + a = f"{x:.2e}" + mant, ex = a.split("e") + return mant + "e" + str(int(ex)) + + +BOUNDS = { # calls per array, exact, as published + 2: Fraction(2), 3: Fraction(14, 5), 4: Fraction(41, 13), + 5: Fraction(834241, 278850), 6: Fraction(1188222, 399685), +} + + +def excluded(m, W, s, game="engine"): + """True if a W-in-s unit at block m is excluded by the bounds this note quotes.""" + if s >= m * W: + return True # not a saving at all + lower = [BOUNDS[m] * W] if game == "engine" else [] + if W == 1: + lower.append(Fraction(m)) # one array needs m calls + else: + lower.append(Fraction(max(W + m, 2 * W))) + return any(s < b for b in lower) + + +PRINTED = [ # (m, W, s, figure as printed) + (3, 4, 11, "7.92e-2"), (3, 5, 14, "6.28e-2"), (3, 6, 17, "5.20e-2"), (3, 7, 20, "4.44e-2"), + (3, 8, 23, "3.87e-2"), (3, 3, 8, "1.07e-1"), (3, 2, 5, "1.66e-1"), (3, 3, 6, "3.69e-1"), + (4, 2, 7, "9.63e-2"), (4, 3, 10, "1.32e-1"), (4, 4, 13, "1.50e-1"), (4, 5, 16, "1.61e-1"), + (4, 6, 19, "1.69e-1"), (4, 3, 11, "6.28e-2"), (4, 4, 15, "4.66e-2"), + (5, 2, 7, "2.22e-1"), (5, 3, 9, "3.17e-1"), + (6, 2, 8, "2.26e-1"), (6, 3, 9, "3.87e-1"), +] + +CAPS_PRINTED = {3: "6.28e-2", 4: "1.71e-1", 5: "3.19e-1", 6: "3.92e-1"} + + +def smallest_open(m, Ws, game="engine"): + out = [] + for W in Ws: + s = next((s for s in range(1, m * W) if not excluded(m, W, s, game)), None) + if s is not None: + out.append((W, s)) + return out + + +def part_table(): + ok = True + for m, W, s, want in PRINTED: + got = fig(saving(m, W, s)) + ok &= report(f"saving {W} in {s} at block {m}", got == want, f"ln({m}*{W}/{s})/ln {m} = {saving(m, W, s):.6f} -> {got}") + for m, want in CAPS_PRINTED.items(): + got = fig(1 - math.log(float(BOUNDS[m])) / math.log(m)) + ok &= report(f"largest saving left open at block {m}", got == want, f"1 - ln({float(BOUNDS[m]):.5f})/ln {m} -> {got}") + # exclusions quoted in the text + ok &= report("block 3 excluded", all(excluded(3, W, s) for W, s in [(2, 5), (3, 7), (3, 8), (4, 11), (5, 13), (6, 16)]) + and all(excluded(3, W, s) for W in range(1, 5) for s in range(1, 3 * W)), + "2 in 5, 3 in 7, 3 in 8, 4 in 11, 5 in 13, 6 in 16 and every unit with 4 or fewer arrays") + ok &= report("Harvey's shape", 14 * 4 == 56 and 5 * 11 == 55 and 56 > 55 and excluded(3, 4, 11), + "4 arrays at block 3: 14 x 4 = 56 > 55 = 5 x 11, so at least 12 calls = 4 x 3 (plain)") + ok &= report("5 in 14 exactly tight", 14 * 80 == 5 * 224 == 1120 and not excluded(3, 5, 14), + "14 x 80 = 5 x 224 = 1,120; not excluded") + ok &= report("block 4 excluded", all(excluded(4, W, s) for W, s in [(2, 6), (3, 9), (4, 12)]), + "2 in 6, 3 in 9, 4 in 12") + want = {3: [(5, 14), (6, 17), (7, 20), (8, 23)], 4: [(2, 7), (3, 10), (4, 13), (5, 16), (6, 19)], + 5: [(2, 7), (3, 9)], 6: [(2, 8), (3, 9)]} + got = {3: smallest_open(3, range(5, 9)), 4: smallest_open(4, range(2, 7)), + 5: smallest_open(5, range(2, 4)), 6: smallest_open(6, range(2, 4))} + ok &= report("smallest shapes not excluded (engine game)", got == want, str(got)) + got_ef = smallest_open(3, range(2, 4), game="everything-free") + ok &= report("block 3, games with bounded free steps (max(W + 3, 2W) only)", got_ef == [(2, 5), (3, 6)], str(got_ef)) + ok &= report("block 5 and 6: 3 in 9", (not excluded(5, 3, 9)) and (not excluded(6, 3, 9)) + and 3 * BOUNDS[5] < 9 and 3 * BOUNDS[6] < 9, + f"3 x {float(BOUNDS[5]):.5f} = {float(3 * BOUNDS[5]):.4f} < 9, 3 x {float(BOUNDS[6]):.5f} = {float(3 * BOUNDS[6]):.4f} < 9, W + m <= 9") + ok &= report("block 4 near miss", 5 * 27456 == 137280 and 2 * 68320 == 136640 and 137280 - 136640 == 640, + "5 x 27,456 = 137,280 against 2 x 68,320 = 136,640: room 640") + return ok + + +# ---------------------------------------------------------------------- controls + +def part_controls(): + ok = True + H3 = Hook(3, 4) + C = json.load(open(os.path.join(DATA, "cert_m3_dem.json"))) + bad = json.loads(json.dumps(C)) + bad["rows"][1] = bad["rows"][0] + dem, msg = check_dem3_cert(bad, H3) + ok &= control("demand certificate with a repeated row", dem != 224, msg) + bad = json.loads(json.dumps(C)) + bad["p"] = C["p"] + 2 if not is_prime(C["p"] + 2) else C["p"] + 4 + dem, msg = check_dem3_cert(bad, H3) + ok &= control("demand certificate with a composite modulus", dem != 224, msg) + bad = json.loads(json.dumps(C)) + used_r = {(r[0], tuple(r[1])) for r in bad["rows"]} + used_c = {(c[0], tuple(c[1])) for c in bad["cols"]} + extra_r = next(r for r in H3.Sc if r not in used_r) + extra_c = next(c for c in H3.S if c not in used_c) + bad["rows"].append([extra_r[0], list(extra_r[1])]) + bad["cols"].append([extra_c[0], list(extra_c[1])]) + dem, msg = check_dem3_cert(bad, H3) + ok &= control("claim 'demand >= 225' by a minor with one row and column added", dem == 0, msg) + bad = json.loads(json.dumps(C)) + y, U = bad["rows"][0] + bad["rows"][0] = [U[0], U] + dem, msg = check_dem3_cert(bad, H3) + ok &= control("demand certificate with a row inside the hook", dem == 0, msg) + C2 = json.load(open(os.path.join(DATA, "cert_m3_B2.json"))) + bad2 = json.loads(json.dumps(C2)) + basis = [(b[0], tuple(b[1])) for b in C2["basis_S"]] + g2 = H3.matmul(H3.two_dir(1), H3.two_dir(2)) + leaving = next(i for i, b in enumerate(basis) + if any(y not in U for (y, U) in H3.apply_W(g2, {b: ONE}, {}))) + v0 = bad2["vectors"][0] + old = v0.get(str(leaving), [0, 0]) + v0[str(leaving)] = [old[0] + 1, old[1]] + f2, msg = check_b2_cert(bad2, H3) + ok &= control("two-call certificate with one entry changed (a basis vector not kept by dir 1 dir 2 added)", + f2 is None, msg) + bad2 = json.loads(json.dumps(C2)) + bad2["vectors"][1] = bad2["vectors"][0] + f2, msg = check_b2_cert(bad2, H3) + ok &= control("two-call certificate with a repeated vector", f2 is None, msg) + I = sqrt_minus_one(P1) + att = H3.raise_modp(dir_modp(8, 1, P1, I), P1) + ok &= control("claim 'cap <= 79 at block 3'", att > 79, f"rank mod p of (dir 1)_W[S^c,S] = {att}") + for name in ("neg_m3_29.txt", "neg_m3_comp.txt", "neg_m3_dup.txt"): + r, msg = check_m0_text(open(os.path.join(DATA, name)).read()) + ok &= control(f"M_0 certificate {name}", r == 0, msg) + D = load_dem3data(os.path.join(DATA, "Dem3Data.lean")) + good, msg = block_check(D, 0, bad_entry=True) + ok &= control("Lean data with one inverse entry + 1 (as NegControl.lean)", not good, msg) + F, NF = face3_setup() + H = Hook(3, 1) + cap1 = leak3(H.two_dir(1), F, NF) + ok &= control("claim 'face cap <= 7'", cap1 is not None and cap1 > 7, f"raise of dir 1 on the face span = {cap1}") + cnot = [[ZERO] * 8 for _ in range(8)] + for x in range(8): + y = x ^ (((x >> 1) & 1) << 0) # flip bit 0 when bit 1 is set + cnot[y][x] = ONE + lk = leak3(cnot, F, NF) + ok &= control("claim 'every address map keeps the face span'", lk is not None and lk > 0, f"a CNOT address map raises it by {lk}") + d2 = width_diff(2) + ok &= control("claim 'the zero-call program is right at every width'", d2 > 0, f"{d2} entries differ at width 2") + ok &= control("claim '4 in 11 at block 3 is allowed'", excluded(3, 4, 11), "5 x 11 = 55 < 56 = 14 x 4") + ok &= control("claim '5 in 14 at block 3 is excluded'", not excluded(3, 5, 14), "5 x 14 = 70 = 14 x 5: on the bound, not below it") + ok &= control("claim '2 in 7 at block 4 is excluded'", not excluded(4, 2, 7), "13 x 7 = 91 >= 82 = 41 x 2") + text = open(os.path.join(DATA, "cert_m4_g2_M0.txt")).read() + lines = text.split("\n") + dup = "\n".join(lines[:2] + [lines[1]] + lines[3:]) + good, msg = depth_format(dup, 3, 3036) + ok &= control("two-move certificate with a repeated row and column pair", not good, msg) + good, msg = depth_format(text.replace("lab 3", "lab 1", 1), 3, 3036) + ok &= control("two-move certificate relabelled as a one-move certificate", not good, msg) + X = [[0, 1], [1, 0]] # dir(e1)^2 = X_e1 up to a scalar: a free shift + same = demand_of_moves(4, 8, 1, P1, G=X) + ok &= control("claim 'two moves in the same direction raise the hook by 48,576'", same < 48576, + f"(dir e1)^2 is the shift X_e1 (times a scalar); the split gives {same}") + return ok + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--part", choices=["main", "controls", "all"], default="all") + args = ap.parse_args() + t0 = time.time() + ok = True + if args.part in ("main", "all"): + for name, fn in [("pins", part_pins), ("block2", part_block2), ("block3", part_block3), + ("leandata", part_leandata), ("face3", part_face3), ("block4", part_block4), + ("depth", part_depth), ("width", part_width), ("table", part_table)]: + t = time.time() + print(f"--- {name}", flush=True) + ok &= fn() + print(f"--- {name}: {time.time() - t:.1f} s", flush=True) + if args.part == "main": + print(f"{'PASS' if ok else 'FAIL'}_COMPLEX_SMALL_M_LOWER_BOUNDS_MAIN ({time.time() - t0:.1f} s)") + if args.part in ("controls", "all"): + t = time.time() + print("--- controls", flush=True) + okc = part_controls() + print(f"--- controls: {time.time() - t:.1f} s", flush=True) + if args.part == "controls": + print(f"{'PASS' if okc else 'FAIL'}_COMPLEX_SMALL_M_LOWER_BOUNDS_CONTROLS ({time.time() - t0:.1f} s)") + ok &= okc + if args.part == "all": + print(f"{'PASS' if ok else 'FAIL'}_COMPLEX_SMALL_M_LOWER_BOUNDS_ALL ({time.time() - t0:.1f} s)") + fails = [n for n, good in RESULTS if not good] + if fails: + print("failed: " + "; ".join(fails)) + return 0 if ok else 1 + + +if __name__ == "__main__": + sys.exit(main())