← back to the board
[[252,20,10]] d ≤
n
252
k
20
d
10
kd²/n
7.937
w
6
X/Z
1

Share this result

Distance

X/Z asymmetry 1 · d_X ≤ 10, d_Z ≤ 10 · w_X = 6, w_Z = 6 (max(d_X,d_Z)/min(d_X,d_Z); each side carries its own earned tier: = certified exact, ≤ witness upper bound)
d_X 10 · witness weight 10 (claimed upper_bound)
witness operator (support, 10 qubits)
[8, 12, 40, 66, 76, 80, 84, 94, 102, 116]
d_Z 10 · witness weight 10 (claimed upper_bound)
witness operator (support, 10 qubits)
[126, 136, 140, 144, 154, 180, 208, 212, 230, 244]
certificate none yet · distance stands as a self-certified upper bound (d ≤)

Diagnostics

computed by the verifier from the parity checks, the layout, and the stored witnesses; shown as evidence, not used for ranking
girth H_X 6 · H_Z 6 (shortest cycle of each side’s Tanner graph; longer is friendlier to belief propagation)
check weights H_X 6 · H_Z 6
qubit degrees H_X 3 · H_Z 3
trapping sets H_X (1,3)×252 (2,4)×1890 (3,3)×126 (smallest syndrome weight at each size, connected sets of up to 3 qubits)
full (size, syndrome weight): count census for H_X
(1,3): 252 (2,4): 1890 (3,3): 126 (3,5): 18522 (3,7): 2520
trapping sets H_Z (1,3)×252 (2,4)×1890 (3,3)×126 (smallest syndrome weight at each size, connected sets of up to 3 qubits)
full (size, syndrome weight): count census for H_Z
(1,3): 252 (2,4): 1890 (3,3): 126 (3,5): 18522 (3,7): 2520

Construction & provenance

authors @FarLab
provenance submitted through the challenge
novelty novelty not audited
construction two-block group algebra code on ZSZ(21,6,8) (kit group_algebra Cayley-table indices): a = [0, 48, 123], b = [0, 68, 118]; H_X = [L(a) | R(b)], H_Z = [R(b)^T | L(a)^T]
model Claude Claude Fable 5.1 (claimed, not verified)
date 2026-10-17
family generalized bicycle (a tag, not a ranking)
locality unrestricted (computed from the layout)
weight class weight ≤ 6 (computed)

How this code was found

the research note submitted with this code · raw markdown · all notes

[[252,20,10]] — two-block group-algebra code over C21 ⋊ C6 (= C21 x S3)

Direction & hypothesis

Cell weight-6 x unrestricted, CSS board, n between 221 and 300. The weight-6 frontier there ran 224-18-12, 224-12-16, 234-26-7, 240-16-14, 254-14-16, 270-30-7, 288-16-16, 288-12-18, 294-10-20: at n <= 300 every weight-6 entry with k >= 20 had d <= 7, and every one with d >= 10 had k <= 18. The hypothesis was that two-block group-algebra (2BGA) codes on non-abelian groups of order 111 to 150 could put a k = 20, d = 10 point into that corner at check weight 6. [[252,20,10]] does: no board entry has n <= 252, k >= 20, d >= 10 and check weight <= 6.

What was searched

Random-support 2BGA codes H_X = [L(a) | R(b)], H_Z = [R(b)^T | L(a)^T] with a, b three group elements each, both containing the identity (no loss of generality: multiplying a or b by a group element permutes qubits and checks). The group menu was every non-abelian group of order 111 to 200 the kit builds from Cayley-table constructors: dihedral D_n, metacyclic C_n ⋊_r C_k (up to two actions r per (n, k)), C_m x D_k, C_m x A4, C_m x S4, C_m x A5, D_a x D_b, C_m x (C_n ⋊ C_k) for eight small metacyclic factors, S5, and the split metacyclic presentations ZSZ(l1, l2, q) of research/kit/nonabelian_lp.py.

Random supports almost never give usable k (a generic weight-3 element is invertible on the higher-dimensional irreducible blocks of F_2[G]), so the sweep ran a parallel k prefilter: 200,000 draws at 222 <= n <= 400 (seed 51), of which 198,731 had k < 14 and 888 were direct sums; the k histogram of the 381 kept was 14:90, 16:159, 18:49, 20:38, 24:37, 28:3, 32:3, 44:2. Those 381 went through research/kit/search.screen with the gf2_fast backend at 400 trials; 6 advanced the board frontier at screen depth and were confirmed at 20,000 / 200,000 / 2,000,000 fast trials (research/kit/surrogate.distance_rand_witness, pair depth 8). A second sweep of 400,000 draws restricted to 222 <= n <= 300 with k >= 16 (seed 61) found the same (n, k, d) point on two further presentations of the same order-126 group, which is what one expects when the code is a property of the group rather than of the draw.

Evidence trail

Witness-backed upper bound d <= 10, not an exact distance. The bound was 10 at 400 trials and never moved; both sides have a weight-10 logical.

| stage | trials per candidate | lightest logical | |---|---|---| | screen (gf2_fast, seed from fingerprint) | 400 | 10 | | confirm | 20,000 | 10 | | confirm | 200,000 | 10 | | confirm | 2,000,000 | 10 | | numpy lightest_logical, both sides, seeds 51 / 52 | 1,500 | X 10, Z 10 | | deep ladder, 3 fresh seeds (47789, 55708, 63627), gf2_fast | 10,000,000 each | 10, 10, 10 (X side) |

verify/validate_candidate.py (through research/kit/coordination.py's gate wrapper) returned passed: true, board_advancing: true, `d_only_gain: false`, label "advances the weight-6 x unrestricted board". Literature novelty is unverified; board-relative novelty comes from verify/validate_candidate.py (fingerprint and Weisfeiler-Leman dedup against every board entry found nothing).

Two other draws on groups of the same order, MC(21,6,2) and C6 x (C7 ⋊ C3), reached the same [[252,20,10]] through 2,000,000 trials and were not filed separately (same parameters, same cell).

Dead ends

  • Cyclic generalized-bicycle codes with a designed divisor g | x^m - 1 at
  • check weight 6 (weight-3 a and b): at odd m from 111 to 200 and deg g >= 8 there are essentially no weight-3 multiples of g (the residue table x^i mod g gives none for almost every (m, g)); the few that exist are lifts from a subring Z_{m/s} and give direct sums. Weight-4 multiples exist in quantity only for deg g <= 22, and 4,000 of those at 300 <= n <= 400 (k 20 to 100) produced nothing that advanced the weight-8 frontier even at 400 trials.

  • Random-support 2BGA at check weight 8, 16,000 draws across 222 <= n <=
  • 400: 15,629 had k < 18; the 4 screen-depth survivors collapsed to d <= 17 by 20,000 trials (dominated by 252-20-21, 292-22-23, 336-24-24, 378-32-19).

  • Random-support bivariate bicycle codes at check weight 6 (8,000 draws at
  • 300 <= n <= 400) and 8 (5,000 draws): 7,971 and 4,981 had k < 12 / 16; nothing advanced.

  • Non-abelian lifted products with 1 x 2 bases: weight-(3,2) entries (check
  • weight 8), 5,000 draws on groups of order 45 to 80, nothing advancing; weight-(2,2) entries (check weight 6) give k = |G| + 6 at d = 6 (e.g. [[400,86,6]]), which the board's 258-88-6 already dominates.

  • 2BGA coset codes (Aydin-Tamo-Barg) with weight-3 supports on S5, A6,
  • S5 x C2, S6, A5 x C3, A5 x C2, S4 x C_m: 3,000 draws, 2,869 had k < 12, nothing advancing.

Tools

Model: Claude Fable 5.1 (Claude Code agent, contributor-driven workflow). Compute: one Brev n2d-highcpu-64 box; gf2_fast at 30 threads for the confirmation rungs and the ladder, 40 forked processes for the generate + rank prefilter. Kit modules: research/kit/nonabelian_lp.py (zsz), research/kit/group_algebra.py (metacyclic, build_2bga), research/kit/search.py (screen), research/kit/surrogate.py (distance_rand_witness, lightest_logical), research/kit/prescreen.py (direct-sum and board dedup), research/kit/submit.py, research/kit/coordination.py. About 0.3 CPU-hours on this code; about 8 CPU-hours on the sweeps above.

Reproduction

The group is research/kit/nonabelian_lp.py's zsz(21, 6, 8), i.e. research/kit/group_algebra.py's metacyclic(21, 6, 8): C_21 ⋊ C_6 with y x y^-1 = x^8, element x^i y^j at index 6 i + j, identity at 0. Since 8 = -1 mod 3 and 8 = 1 mod 7, the action inverts the 3-part of C_21 and fixes the 7-part, so the group is C_21 x S_3 (order 126). With x = (1, 0), y = (0, 1):

a = 1 + x^8 + x^20 y^3 (indices 0, 48, 123), b = 1 + x^11 y^2 + x^19 y^4 (indices 0, 68, 118).

import sys; sys.path[:0] = ["research/kit", "verify"]
from nonabelian_lp import zsz
from group_algebra import build_2bga
from css import compute_k
mul = zsz(21, 6, 8)
HX, HZ = build_2bga(mul, [0, 48, 123], [0, 68, 118])   # n = 252, k = 20
assert compute_k(HX, HZ) == 20

Check sets match codes/252-20-10.json row for row in this order. Witness search: `surrogate.distance_rand_witness(HX, HZ, trials=2_000_000, seed=51000003 + 2_000_000, backend="fast", pair_depth=8)` returns a weight-10 logical; the numpy lightest_logical at 1,500 trials with seeds 51 (X) and 52 (Z) gives the two witnesses in the JSON.

Parity checks

X-checks 126 (max weight 6) · Z-checks 126 (max weight 6)
H_X (126 checks, sparse supports)
[0, 51, 78, 126, 140, 190] [1, 52, 79, 127, 225, 233] [2, 53, 80, 128, 142, 186] [3, 48, 81, 129, 227, 229] [4, 49, 82, 130, 138, 188] [5, 50, 83, 131, 223, 231] [6, 84, 99, 132, 146, 196] [7, 85, 100, 133, 231, 239] [8, 86, 101, 134, 148, 192] [9, 87, 96, 135, 233, 235] [10, 88, 97, 136, 144, 194] [11, 89, 98, 137, 229, 237] [12, 21, 90, 138, 152, 202] [13, 22, 91, 139, 237, 245] [14, 23, 92, 140, 154, 198] [15, 18, 93, 141, 239, 241] [16, 19, 94, 142, 150, 200] [17, 20, 95, 143, 235, 243] [18, 69, 96, 144, 158, 208] [19, 70, 97, 145, 243, 251] [20, 71, 98, 146, 160, 204] [21, 66, 99, 147, 245, 247] [22, 67, 100, 148, 156, 206] [23, 68, 101, 149, 241, 249] [24, 102, 117, 150, 164, 214] [25, 103, 118, 131, 151, 249] [26, 104, 119, 152, 166, 210] [27, 105, 114, 127, 153, 251] [28, 106, 115, 154, 162, 212] [29, 107, 116, 129, 155, 247] [30, 39, 108, 156, 170, 220] [31, 40, 109, 129, 137, 157] [32, 41, 110, 158, 172, 216] [33, 36, 111, 131, 133, 159] [34, 37, 112, 160, 168, 218] [35, 38, 113, 127, 135, 161] [36, 87, 114, 162, 176, 226] [37, 88, 115, 135, 143, 163] [38, 89, 116, 164, 178, 222] [39, 84, 117, 137, 139, 165] [40, 85, 118, 166, 174, 224] [41, 86, 119, 133, 141, 167] [9, 42, 120, 168, 182, 232] [10, 43, 121, 141, 149, 169] [11, 44, 122, 170, 184, 228] [6, 45, 123, 143, 145, 171] [7, 46, 124, 172, 180, 230] [8, 47, 125, 139, 147, 173] [0, 48, 57, 174, 188, 238] [1, 49, 58, 147, 155, 175] [2, 50, 59, 176, 190, 234] [3, 51, 54, 149, 151, 177] [4, 52, 55, 178, 186, 236] [5, 53, 56, 145, 153, 179] [6, 54, 105, 180, 194, 244] [7, 55, 106, 153, 161, 181] [8, 56, 107, 182, 196, 240] [9, 57, 102, 155, 157, 183] [10, 58, 103, 184, 192, 242] [11, 59, 104, 151, 159, 185] [12, 27, 60, 186, 200, 250] [13, 28, 61, 159, 167, 187] [14, 29, 62, 188, 202, 246] [15, 24, 63, 161, 163, 189] [16, 25, 64, 190, 198, 248] [17, 26, 65, 157, 165, 191] [18, 66, 75, 130, 192, 206] [19, 67, 76, 165, 173, 193] [20, 68, 77, 126, 194, 208] [21, 69, 72, 167, 169, 195] [22, 70, 73, 128, 196, 204] [23, 71, 74, 163, 171, 197] [24, 72, 123, 136, 198, 212] [25, 73, 124, 171, 179, 199] [26, 74, 125, 132, 200, 214] [27, 75, 120, 173, 175, 201] [28, 76, 121, 134, 202, 210] [29, 77, 122, 169, 177, 203] [30, 45, 78, 142, 204, 218] [31, 46, 79, 177, 185, 205] [32, 47, 80, 138, 206, 220] [33, 42, 81, 179, 181, 207] [34, 43, 82, 140, 208, 216] [35, 44, 83, 175, 183, 209] [36, 84, 93, 148, 210, 224] [37, 85, 94, 183, 191, 211] [38, 86, 95, 144, 212, 226] [39, 87, 90, 185, 187, 213] [40, 88, 91, 146, 214, 222] [41, 89, 92, 181, 189, 215] [15, 42, 90, 154, 216, 230] [16, 43, 91, 189, 197, 217] [17, 44, 92, 150, 218, 232] [12, 45, 93, 191, 193, 219] [13, 46, 94, 152, 220, 228] [14, 47, 95, 187, 195, 221] [48, 63, 96, 160, 222, 236] [49, 64, 97, 195, 203, 223] [50, 65, 98, 156, 224, 238] [51, 60, 99, 197, 199, 225] [52, 61, 100, 158, 226, 234] [53, 62, 101, 193, 201, 227] [54, 102, 111, 166, 228, 242] [55, 103, 112, 201, 209, 229] [56, 104, 113, 162, 230, 244] [57, 105, 108, 203, 205, 231] [58, 106, 109, 164, 232, 240] [59, 107, 110, 199, 207, 233] [33, 60, 108, 172, 234, 248] [34, 61, 109, 207, 215, 235] [35, 62, 110, 168, 236, 250] [30, 63, 111, 209, 211, 237] [31, 64, 112, 170, 238, 246] [32, 65, 113, 205, 213, 239] [66, 81, 114, 128, 178, 240] [67, 82, 115, 213, 221, 241] [68, 83, 116, 130, 174, 242] [69, 78, 117, 215, 217, 243] [70, 79, 118, 126, 176, 244] [71, 80, 119, 211, 219, 245] [3, 72, 120, 134, 184, 246] [4, 73, 121, 219, 227, 247] [5, 74, 122, 136, 180, 248] [0, 75, 123, 221, 223, 249] [1, 76, 124, 132, 182, 250] [2, 77, 125, 217, 225, 251]
H_Z (126 checks, sparse supports)
[0, 68, 118, 126, 174, 249] [1, 27, 35, 127, 175, 250] [2, 70, 114, 128, 176, 251] [3, 29, 31, 129, 177, 246] [4, 66, 116, 130, 178, 247] [5, 25, 33, 131, 179, 248] [6, 74, 124, 132, 171, 180] [7, 33, 41, 133, 172, 181] [8, 76, 120, 134, 173, 182] [9, 35, 37, 135, 168, 183] [10, 72, 122, 136, 169, 184] [11, 31, 39, 137, 170, 185] [4, 12, 80, 138, 186, 219] [13, 39, 47, 139, 187, 220] [0, 14, 82, 140, 188, 221] [15, 41, 43, 141, 189, 216] [2, 16, 78, 142, 190, 217] [17, 37, 45, 143, 191, 218] [10, 18, 86, 141, 144, 192] [19, 45, 53, 142, 145, 193] [6, 20, 88, 143, 146, 194] [21, 47, 49, 138, 147, 195] [8, 22, 84, 139, 148, 196] [23, 43, 51, 140, 149, 197] [16, 24, 92, 150, 189, 198] [25, 51, 59, 151, 190, 199] [12, 26, 94, 152, 191, 200] [27, 53, 55, 153, 186, 201] [14, 28, 90, 154, 187, 202] [29, 49, 57, 155, 188, 203] [22, 30, 98, 156, 204, 237] [31, 57, 65, 157, 205, 238] [18, 32, 100, 158, 206, 239] [33, 59, 61, 159, 207, 234] [20, 34, 96, 160, 208, 235] [35, 55, 63, 161, 209, 236] [28, 36, 104, 159, 162, 210] [37, 63, 71, 160, 163, 211] [24, 38, 106, 161, 164, 212] [39, 65, 67, 156, 165, 213] [26, 40, 102, 157, 166, 214] [41, 61, 69, 158, 167, 215] [34, 42, 110, 168, 207, 216] [43, 69, 77, 169, 208, 217] [30, 44, 112, 170, 209, 218] [45, 71, 73, 171, 204, 219] [32, 46, 108, 172, 205, 220] [47, 67, 75, 173, 206, 221] [40, 48, 116, 129, 174, 222] [49, 75, 83, 130, 175, 223] [36, 50, 118, 131, 176, 224] [51, 77, 79, 126, 177, 225] [38, 52, 114, 127, 178, 226] [53, 73, 81, 128, 179, 227] [46, 54, 122, 177, 180, 228] [55, 81, 89, 178, 181, 229] [42, 56, 124, 179, 182, 230] [57, 83, 85, 174, 183, 231] [44, 58, 120, 175, 184, 232] [59, 79, 87, 176, 185, 233] [2, 52, 60, 186, 225, 234] [61, 87, 95, 187, 226, 235] [4, 48, 62, 188, 227, 236] [63, 89, 91, 189, 222, 237] [0, 50, 64, 190, 223, 238] [65, 85, 93, 191, 224, 239] [8, 58, 66, 147, 192, 240] [67, 93, 101, 148, 193, 241] [10, 54, 68, 149, 194, 242] [69, 95, 97, 144, 195, 243] [6, 56, 70, 145, 196, 244] [71, 91, 99, 146, 197, 245] [14, 64, 72, 195, 198, 246] [73, 99, 107, 196, 199, 247] [16, 60, 74, 197, 200, 248] [75, 101, 103, 192, 201, 249] [12, 62, 76, 193, 202, 250] [77, 97, 105, 194, 203, 251] [20, 70, 78, 126, 204, 243] [79, 105, 113, 127, 205, 244] [22, 66, 80, 128, 206, 245] [81, 107, 109, 129, 207, 240] [18, 68, 82, 130, 208, 241] [83, 103, 111, 131, 209, 242] [26, 76, 84, 132, 165, 210] [85, 111, 119, 133, 166, 211] [28, 72, 86, 134, 167, 212] [87, 113, 115, 135, 162, 213] [24, 74, 88, 136, 163, 214] [89, 109, 117, 137, 164, 215] [32, 82, 90, 138, 213, 216] [91, 117, 125, 139, 214, 217] [34, 78, 92, 140, 215, 218] [93, 119, 121, 141, 210, 219] [30, 80, 94, 142, 211, 220] [95, 115, 123, 143, 212, 221] [38, 88, 96, 135, 144, 222] [5, 97, 123, 136, 145, 223] [40, 84, 98, 137, 146, 224] [1, 99, 125, 132, 147, 225] [36, 86, 100, 133, 148, 226] [3, 101, 121, 134, 149, 227] [44, 94, 102, 150, 183, 228] [3, 11, 103, 151, 184, 229] [46, 90, 104, 152, 185, 230] [5, 7, 105, 153, 180, 231] [42, 92, 106, 154, 181, 232] [1, 9, 107, 155, 182, 233] [50, 100, 108, 156, 231, 234] [9, 17, 109, 157, 232, 235] [52, 96, 110, 158, 233, 236] [11, 13, 111, 159, 228, 237] [48, 98, 112, 160, 229, 238] [7, 15, 113, 161, 230, 239] [56, 106, 114, 153, 162, 240] [15, 23, 115, 154, 163, 241] [58, 102, 116, 155, 164, 242] [17, 19, 117, 150, 165, 243] [54, 104, 118, 151, 166, 244] [13, 21, 119, 152, 167, 245] [62, 112, 120, 168, 201, 246] [21, 29, 121, 169, 202, 247] [64, 108, 122, 170, 203, 248] [23, 25, 123, 171, 198, 249] [60, 110, 124, 172, 199, 250] [19, 27, 125, 173, 200, 251]
Code ID 252-20-10 · download JSON · raw on GitHub