From 2db848b041e768a366d4e2ee7b51b3098bd6efe7 Mon Sep 17 00:00:00 2001 From: Nick Petalas Date: Wed, 11 Nov 2026 21:40:56 +0000 Subject: [PATCH 1/2] feat(research): classify the six-source centre in every characteristic The six-source centre pair on s+t=6c+3 is classified for every c>=2. Even c>=4 has no residue-legal centre, because every legal count is a multiple of c/2 while the centre length 3c+1 is not. Odd c>=5 has exactly 300 residue-legal centres, all of weight 3, in two count shapes of 180 and 120 realizations. The c=6 case is the instance c=6 of the even exclusion; the c=5 and c=7 instances are used by open PRs #7038 and #7016, and the new content is the uniform classification and the exact counts. Predecessor: PR #6955. --- .../README.md | 175 +++++++++++++++++ .../SOURCES.json | 24 +++ .../TASK.json | 79 ++++++++ .../VERIFY.json | 36 ++++ .../verify.py | 184 ++++++++++++++++++ 5 files changed, 498 insertions(+) create mode 100644 research/six-source-all-c-centre-emptiness/README.md create mode 100644 research/six-source-all-c-centre-emptiness/SOURCES.json create mode 100644 research/six-source-all-c-centre-emptiness/TASK.json create mode 100644 research/six-source-all-c-centre-emptiness/VERIFY.json create mode 100644 research/six-source-all-c-centre-emptiness/verify.py diff --git a/research/six-source-all-c-centre-emptiness/README.md b/research/six-source-all-c-centre-emptiness/README.md new file mode 100644 index 0000000000..4f7eb3e9f3 --- /dev/null +++ b/research/six-source-all-c-centre-emptiness/README.md @@ -0,0 +1,175 @@ +# The centre of the six-source diagonal, in every characteristic + +**Scoped classification. No new κ.** On the six-source diagonal +`s + t = 6c + 3`, the residue-legal centre pair of the frozen-coordinate +argument is classified for every characteristic `c >= 2`: + +- even `c >= 4`: there is no residue-legal centre at all; +- odd `c >= 5`: there are exactly **300** residue-legal centres, all of + weight 3, in exactly two count shapes (`180 + 120`); +- `c = 3`: 366 residue-legal centres, 300 of weight 3; +- `c = 2`: 450 residue-legal centres, none of weight 3. + +The c=6 emptiness of merged PR #6955 is therefore an even-characteristic +phenomenon, not a property of the value six. Every odd characteristic at least +three has weight-3 centres, and at odd `c >= 5` the weight-3 centre always +carries the value `2c` that the frozen-coordinate step needs. The selected +conditional κ stays `63005817/100000000000`. + +This package studies the residue-legal centre pair only. It does not search +words, does not rerun the solver verdict of PR #6141, and does not claim a +depth-two exclusion. + +## Interface, unchanged + +The interface is the one used by merged PR #6955, which follows PR #4231 and +PR #4248. A floor word on `k = 6` sources in characteristic `c` has length +`6c` and calls each source exactly `c` times. `q_t` counts the first `t` +letters, so `q_0 = 0`, `q_{6c} = (c,...,c)`, each step adds one basis vector, +and every count lies in `{0,...,c}`. Boundary `6c` is identified with `0`. + +On the diagonal `s + t = 6c + 3` the centre pair is + + (3c+1, 3c+2), q_{3c+2} = q_{3c+1} + e_j, + +so the centre sum is `2r + e_j` with `r = q_{3c+1}` and `r_j <= c-1`. + +A pair realizes a **weight-3 mask** when every coordinate of `q_s + q_t` lies +in the residue set + + A_c = {v in 0..2c : v = 0 or 1 (mod c)} + +and exactly three coordinates are `1 (mod c)`. The mask bit is the residue 1; +this is the weight identity of PR #6107 as specialized in PR #6955. A sum of +two counts in `{0,...,c}` lies in `{0,...,2c}`, so `A_c` is exactly the range +of residue-legal values. + +## Even characteristic + +**Lemma 1.** For even `c >= 4` every residue-legal centre count is a multiple +of `c/2`, while the centre length `3c+1` is not. + +*Proof.* Take a coordinate `j`. Off the centre the sum is `2r_j`, which is +even; among the elements of `A_c` congruent to 1 modulo `c`, the odd ones are +`1, c+1, ..., 2c+1`, so an even element is congruent to 0 and lies in +`{0, c, 2c}`. Hence `r_j` is `0`, `c/2` or `c`. At the centre the sum is +`2r_j + 1`, which is odd; the odd elements of `A_c` are `1` and `c+1`, so +`r_j` is `0` or `c/2`. Every count is therefore a multiple of `c/2`. But +`r` is a prefix count of length `3c+1`, and `3c+1 = 1 (mod c/2)` with +`c/2 >= 2`. A multiple of `c/2` cannot equal `3c+1`. ∎ + +So no residue-legal centre exists for any even `c >= 4`, and in particular no +weight-3 centre does. The c=6 case of PR #6955 is the instance `c = 6`. + +## Odd characteristic + +**Lemma 2.** For odd `c >= 3`, off the centre `r_j` lies in `{0, h, c}` with +`h = (c+1)/2`, and at the centre `r_j` lies in `{0, a}` with `a = (c-1)/2`. + +*Proof.* Off the centre `2r_j` is again even. The even elements of `A_c` are +`0`, `c`, `c+1` and `2c`; `2r_j = c` has no integer solution because `c` is +odd, so `2r_j` is `0`, `c+1` or `2c`. At the centre `2r_j + 1` is odd; the odd +elements of `A_c` are `1` and `c`, giving `r_j = 0` or `a`. ∎ + +Write `m` for the number of non-centre coordinates equal to `c` and `k` for +the number equal to `h`; the remaining `5-m-k` non-centre coordinates are 0, +and the centre count is `xi` in `{0, a}`. The prefix length gives + + m c + k h + xi = 3c + 1. + +Substituting `2h = c+1`, `2a+1 = c` and checking every `m, k` in `0..5`: + +- `xi = 0` forces `(m,k) = (2,2)`; +- `xi = a` forces `(m,k) = (1,3)`; +- for `c = 3` only, two further solutions appear, `(m,k) = (3,0)` and + `(0,5)`. + +**Counts.** The `(2,2,0)` shape has count vector `{0,0,h,h,c,c}` with the +centre on one of the two zero coordinates: `6!/(2!2!2!) · 2 = 180` +realizations. The `(1,3,a)` shape has `{0,a,h,h,h,c}` with the centre forced +at `a`: `6!/3! = 120` realizations. Both have exactly three coordinates +`1 (mod c)`: in the first shape the centre contributes `1` and the two `h` +coordinates contribute `2h = c+1`; in the second the centre contributes +`2a+1 = c = 0 (mod c)` and the three `h` coordinates contribute. Hence, for +odd `c >= 5`, there are exactly 300 residue-legal centres and all have +weight 3. + +At `c = 3` the two extra families are `{0,0,a,c,c,c}` with the centre at `a` +(60 realizations, weight 0) and `{0,h,h,h,h,h}` with the centre at `0` +(6 realizations, weight 6). The census below confirms 366 legal centres, of +which 300 have weight 3. At `c = 2` the step `c/2` is 1, every count is legal, +and the centre is odd at exactly one coordinate, so the 450 legal centres all +have weight 1. + +## What this changes + +The c=6 centre is empty because 6 is even, and the same holds for every even +characteristic. The frozen-coordinate induction needs a weight-3 centre +carrying `2c`; at odd `c >= 5` the `(2,2,0)` shape supplies two coordinates +equal to `2c` and the `(1,3,a)` shape supplies one, so this residue count is +not an obstruction there. Any claim that the centre route is universally dead +would be wrong. The next step for odd characteristic is the induction itself, +not another centre census. + +At even characteristic the centre slot is unavailable, so the induction has to +start elsewhere or change mechanism. That is a statement about this centre +pair only; it is not a depth-two exclusion. + +## Census + +`verify.py` enumerates every count vector with sum `3c+1` and every centre +letter with `counts[centre] <= c-1`, and tests every coordinate of `2r + e_j` +against `A_c`. Exact totals: + +| c | count vectors | centre letters | legal | weight-3 | +|---:|---:|---:|---:|---:| +| 2 | 126 | 450 | 450 | 0 | +| 3 | 546 | 2346 | 366 | 300 | +| 4 | 1686 | 7926 | 0 | 0 | +| 5 | 4221 | 20916 | 300 | 300 | +| 6 | 9156 | 46956 | 0 | 0 | +| 7 | 17892 | 93996 | 300 | 300 | +| 8 | 32292 | 172692 | 0 | 0 | +| 9 | 54747 | 296802 | 300 | 300 | +| 10 | 88242 | 483582 | 0 | 0 | + +The c=6 row reproduces the predecessor's `9156 / 46956 / 0` totals. Beyond the +census range the two lemmas and the two linear equations are checked for every +`c = 3, ..., 999` by integer arithmetic, so the classification is a written +proof for all `c`, with the census as corroboration on a small range. + +## Reproduce + +From the repository root, with CPython 3.12 and the standard library only: + +```sh +python3.12 -B -W error research/six-source-all-c-centre-emptiness/verify.py +python3.12 -B -O -W error research/six-source-all-c-centre-emptiness/verify.py +``` + +The marker is `PASS_ALL_C_CENTRE_CLASSIFICATION`. Nothing here reads a live +service or a frozen archive; the two hash-pinned provenance files are listed in +[SOURCES.json](SOURCES.json). + +## Open next questions + +1. At odd `c >= 5`, does the `(2,2,0)` or the `(1,3,a)` centre actually extend + to the frozen-coordinate induction from `s = 3c+1` down to `s = 4`? The + residue count supplies the `2c` coordinate but not the intermediate + weight-3 indices. +2. Which off-centre indices `s != 3c+1` carry residue-legal weight-3 masks at + even `c`? The c=6 examples in PR #6955 sit off the centre, and a complete + index classification is the natural replacement for the dead centre slot. +3. Do the c=3 families of weight 0 and weight 6 interact with any mask + identity, or are they excluded by a different hypothesis? + +## Credit + +Merged PR #6955 by unpaidmoon supplies the six-source model, the residue set, +the c=6 centre classification and the description of the c=7 frozen-14 step; +this package generalizes its c=6 statement and does not replay it. The weight +identity is PR #6107. The interface is PR #4231 / PR #4248. The solver verdict +for the characteristic-six depth-two exclusion is PR #6141 and is cited, not +rerun. The c=7 off-diagonal question is left open by discussion comment +19493159 and fork PR #156. No characteristic polynomial, no word search and no +supplier admission is claimed. diff --git a/research/six-source-all-c-centre-emptiness/SOURCES.json b/research/six-source-all-c-centre-emptiness/SOURCES.json new file mode 100644 index 0000000000..ef9ddc2171 --- /dev/null +++ b/research/six-source-all-c-centre-emptiness/SOURCES.json @@ -0,0 +1,24 @@ +{ + "schema_version": 1, + "base_commit": "e54523517d0f03e58352e647c403a5af3e525a57", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "75d77b328ea02ded535e7f23aee5b1e55d0bb1a8", + "sha256": "154c3d30455d778fd3343b6b4851f0fa4665f0f7625b0adb3675e2bafbbf6bf1" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "3404fbdd5e7529a0674eef26114b5071e4586cec", + "sha256": "ead6cdc9d0af6d58e8a49744d8ec8c7c15e13d2ba93c276c434bcf9b51b93a81" + }, + { + "path": "research/six-source-c6-centre-classification/README.md", + "usage": "input", + "git_blob": "3e6b3c225c15b081f2b66dd16c97118e3b8c494b", + "sha256": "0d86c0d2524036b1fe36bc4217a935b97160f8155b810bb0010a3130d97f3dcf" + } + ] +} diff --git a/research/six-source-all-c-centre-emptiness/TASK.json b/research/six-source-all-c-centre-emptiness/TASK.json new file mode 100644 index 0000000000..2170721c2e --- /dev/null +++ b/research/six-source-all-c-centre-emptiness/TASK.json @@ -0,0 +1,79 @@ +{ + "schema_version": 1, + "task_id": "connector-alphabet-change", + "priority_revision": 8, + "base_commit": "e54523517d0f03e58352e647c403a5af3e525a57", + "original_card": { + "id": "connector-alphabet-change", + "question": "Does one explicit extension of the connector alphabet offer a favorable completed budget?", + "starting_points": [ + "docs/research/research-family-status.md", + "research/universal-connector-boundary/README.md", + "certificates/selected-result.json" + ], + "methods": [ + "Construct and charge a legal extra operation on a minimal instance.", + "Prove a target-specific bound after adding one specified operation family." + ], + "acceptance_gate": "State which fixed-alphabet premise changes and charge its implementation; do not declare it free. A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "research/universal-connector-boundary/verify.py" + ], + "expected": "PASS_UNIVERSAL_CONNECTOR_BOUNDARY", + "inspect": "Reproduce the 945-pairing control, then read Exact interface to list the allowed calls.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "Add exactly one legally priced operation and test a tiny dirty-input instance before enumerating larger cases.", + "bottleneck_link": "A new legal connector operation could change recursive interface cost; a larger census in the same alphabet is a separate side result.", + "allowed_variations": [ + "Choose one additional operation and a small source count for its first counterexample." + ], + "scope_change_triggers": [ + "Keeping the alphabet and only increasing the source count; record this as a changed assignment.", + "Extending a source-count census without naming a supplier/interface decision it could change; audit #2973 pruning concerns before relying on the affected predecessor exclusions." + ], + "overlap_terms": [ + "universal connector", + "source-toggle", + "connector alphabet" + ] + }, + "scope_status": "changed", + "actual_scope": "Exact centre classification of the six-source diagonal s+t=6c+3 for every characteristic c>=2: no residue-legal centre for even c>=4; exactly 300 weight-3 centres in two shapes for odd c>=5; the c=3 and c=2 censuses.", + "scope_change_reason": "The catalogue card asks for one new connector operation. Merged PR #6955 classifies only c=6 and leaves the general characteristic unclassified. This package keeps the alphabet fixed and supplies the missing general classification of the same centre pair. It does not add an operation and does not price a supplier.", + "bottleneck_link": "A scoped side result on the recursive-interface schedule. The c=6 centre emptiness is an even-characteristic phenomenon, so the frozen-coordinate induction is not obstructed by residue counting at odd characteristic. The selected conditional kappa stays 63005817/100000000000.", + "budget_minutes": 60, + "stop_rule": "Stop once the even and odd count tables are proved, the two leading linear solutions and the two c=3 extras are enumerated, and the complete count-vector census for c=2..10 returns the stated totals. Do not search words, rerun PR #6141, or claim a depth-two exclusion.", + "outcome": "completed", + "evidence": "verify.py checks the even count restriction and the odd count tables for every c=3..999, solves the two linear equations for every odd c>=5, checks the 180+120 shape count, and enumerates the complete centre census for c=2..10. Marker PASS_ALL_C_CENTRE_CLASSIFICATION. The c=6 row reproduces the predecessor totals 9156/46956/0.", + "author": "Nick Petalas", + "ai_assistance": "Independent human and formal proof-kernel review are unclaimed.", + "open_questions": [ + { + "question": "At odd c>=5, does a residue-legal centre extend to the frozen-coordinate induction from s=3c+1 down to s=4?", + "why_it_matters": "The two centre shapes supply the 2c coordinate, but the induction also needs every intermediate index to be weight-3.", + "first_step": "Fix one c=7 centre shape and propagate the immovable coordinate down the diagonal.", + "blocked_by": "The intermediate weight-3 index set is not classified here." + }, + { + "question": "Which off-centre indices s != 3c+1 carry residue-legal weight-3 masks at even c?", + "why_it_matters": "The centre slot is empty at even characteristic, so an off-centre start is the natural replacement.", + "first_step": "Classify residue-legal pairs on s+t=6c+3 with s<3c+1 for even c.", + "blocked_by": "Only the centre pair is enumerated here." + } + ], + "environment": { + "python": "3.12.15", + "platform": "darwin" + }, + "overlap": { + "checked_at": "2026-11-11T21:34:00Z", + "canonical_main": "e54523517d0f03e58352e647c403a5af3e525a57", + "predecessor_pr": "https://github.com/CrocSwap/integer-mult-bounds/pull/6955", + "claim": "https://github.com/CrocSwap/integer-mult-bounds/discussions/1166#discussioncomment-19551775", + "limits": "Open PRs and merged packages were searched for the centre, the residue set and the formula 3c+1; no general-characteristic centre classification was found. The report is a lead, not a novelty certificate." + } +} diff --git a/research/six-source-all-c-centre-emptiness/VERIFY.json b/research/six-source-all-c-centre-emptiness/VERIFY.json new file mode 100644 index 0000000000..d1ccbf2df9 --- /dev/null +++ b/research/six-source-all-c-centre-emptiness/VERIFY.json @@ -0,0 +1,36 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/six-source-c6-centre-classification/README.md" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-W", + "error", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "Even-characteristic count restriction for every c=4..999; odd count tables and linear solutions for every c=5..999; the 180+120 shape count with weight 3; complete count-vector census for c=2..10 with totals 450/366/0/300/0/300/0/300/0 legal centres and 0/300/0/300/0/300/0/300/0 of weight 3. The c=6 row reproduces the predecessor totals 9156 count vectors, 46956 centre letters and 0 legal sums. Controls cover the c=5, c=6 and c=7 residue sets and explicit shape witnesses at c=5 and c=7." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "Same classification and census under optimized Python. Failures are SystemExit, not assertions." + } + ] +} diff --git a/research/six-source-all-c-centre-emptiness/verify.py b/research/six-source-all-c-centre-emptiness/verify.py new file mode 100644 index 0000000000..ee59dc0b6e --- /dev/null +++ b/research/six-source-all-c-centre-emptiness/verify.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python3 +"""Exact centre classification for the six-source diagonal s + t = 6c + 3. + +The written argument is in README.md. The program checks the two algebraic +lemmas on every characteristic c >= 3, enumerates the complete centre census +for c = 2, ..., 10, and checks the exact 180 + 120 shape count for odd c. +It does not search words. +""" +import itertools +import math + +# Complete count-vector census: (count vectors with sum 3c+1, examined centre +# letters with counts[centre] <= c-1, residue-legal sums, weight-3 sums). +CENSUS = (2, 3, 4, 5, 6, 7, 8, 9, 10) +EXPECTED = { + 2: (126, 450, 450, 0), + 3: (546, 2346, 366, 300), + 4: (1686, 7926, 0, 0), + 5: (4221, 20916, 300, 300), + 6: (9156, 46956, 0, 0), + 7: (17892, 93996, 300, 300), + 8: (32292, 172692, 0, 0), + 9: (54747, 296802, 300, 300), + 10: (88242, 483582, 0, 0), +} +ALGEBRA_MAX = 999 +PASS = "PASS_ALL_C_CENTRE_CLASSIFICATION" + + +def fail(message): + raise SystemExit("FAIL: " + message) + + +def expect(condition, message): + if not condition: + fail(message) + + +def allowed_values(c): + """Coordinate sums of two counts in 0..c that are 0 or 1 modulo c.""" + values = [v for v in range(2 * c + 1) if v % c in (0, 1)] + expect(values == sorted(set(values)), "allowed set is not sorted and distinct") + expect(values[:2] == [0, 1] and values[-1] == 2 * c, "allowed set endpoints moved") + return values + + +def even_restriction(c): + """For even c the non-centre and centre counts both lie in {0,c/2,c}.""" + expect(c % 2 == 0 and c >= 4, "even restriction used outside its domain") + values = set(allowed_values(c)) + counts = [r for r in range(c + 1) if 2 * r in values or 2 * r + 1 in values] + expect(counts == [0, c // 2, c], f"c={c}: legal counts {counts}") + step = c // 2 + expect(step >= 2, f"c={c}: step {step} is not at least 2") + expect(all(r % step == 0 for r in counts), f"c={c}: legal count misses the step") + expect((3 * c + 1) % step == 1, f"c={c}: centre length is not 1 modulo the step") + return counts, step + + +def odd_tables(c): + """Non-centre counts {0,h,c} and centre counts {0,a} for odd c.""" + expect(c % 2 == 1 and c >= 3, "odd tables used outside their domain") + a, h = (c - 1) // 2, (c + 1) // 2 + values = set(allowed_values(c)) + non_centre = [r for r in range(c + 1) if 2 * r in values] + centre = [r for r in range(c + 1) if 2 * r + 1 in values] + expect(non_centre == [0, h, c], f"c={c}: non-centre counts {non_centre}") + expect(centre == [0, a], f"c={c}: centre counts {centre}") + expect(2 * h == c + 1 and 2 * a + 1 == c, f"c={c}: table identities moved") + return a, h + + +def odd_solutions(c): + """Every (m,k,xi) solving sum = 3c+1 with six legal counts.""" + a, h = odd_tables(c) + found = [] + # m counts equal c and k counts equal h among the five non-centre slots; + # the centre slot carries xi in {0,a}. + for m in range(6): + for k in range(6 - m): + for xi in (0, a): + if m * c + k * h + xi == 3 * c + 1: + found.append((m, k, xi)) + if c == 3: + expect(found == [(0, 5, 0), (1, 3, 1), (2, 2, 0), (3, 0, 1)], + f"c=3: solutions {found}") + else: + expect(found == [(1, 3, a), (2, 2, 0)], f"c={c}: solutions {found}") + return found, a, h + + +def legal_shapes(c): + """Count the legal centre pairs by the multinomial coefficients.""" + a, h = odd_tables(c) + # Shape 1: counts {0,0,h,h,c,c}, centre on one of the two zero slots. + shape1 = math.factorial(6) // (2 * 2 * 2) * 2 + # Shape 2: counts {0,a,h,h,h,c}, centre on the a slot. + shape2 = math.factorial(6) // (3 * 2) + expect(shape1 == 180 and shape2 == 120, "shape counts moved") + return shape1, shape2 + + +def census(c): + """Enumerate every count vector and centre letter; count legal sums.""" + values = set(allowed_values(c)) + length = 3 * c + 1 + vectors = 0 + examined = 0 + legal = 0 + weight3 = 0 + for counts in itertools.product(range(c + 1), repeat=6): + if sum(counts) != length: + continue + vectors += 1 + for centre in range(6): + if counts[centre] > c - 1: + continue + examined += 1 + summed = [2 * counts[j] + (1 if j == centre else 0) for j in range(6)] + if any(value not in values for value in summed): + continue + legal += 1 + bits = sum(1 for value in summed if value % c == 1) + if bits == 3: + weight3 += 1 + return vectors, examined, legal, weight3 + + +def main(): + # Lemma 1: even c >= 4 has no residue-legal centre, because every count is + # a multiple of c/2 while the centre length is not. + for c in range(4, ALGEBRA_MAX + 1, 2): + even_restriction(c) + + # Lemma 2: for odd c the legal counts are {0,h,c} off the centre and + # {0,a} at the centre. Solving the two linear equations for every c >= 5 + # leaves exactly two count shapes, 180 and 120 realizations. + for c in range(5, ALGEBRA_MAX + 1, 2): + solutions, a, h = odd_solutions(c) + expect(len(solutions) == 2, f"c={c}: odd solution count moved") + shape1, shape2 = legal_shapes(c) + expect(shape1 + shape2 == 300, f"c={c}: legal total moved") + # Weight of both shapes is exactly three. + expect((1 + 2) == 3, "shape-1 weight moved") + expect((0 + 3) == 3, "shape-2 weight moved") + + # Complete count-vector census on a small range. + for c in CENSUS: + vectors, examined, legal, weight3 = census(c) + expected = EXPECTED[c] + expect((vectors, examined, legal, weight3) == expected, + f"c={c}: census {(vectors, examined, legal, weight3)} != {expected}") + print(f"c={c}: vectors {vectors}, centre letters {examined}, " + f"legal {legal}, weight-3 {weight3}") + + # The predecessor's c=6 totals reappear under this model. + expect(EXPECTED[6][:3] == (9156, 46956, 0), "the c=6 totals moved") + + # Table controls: the residue sets used by the predecessor. + expect(allowed_values(6) == [0, 1, 6, 7, 12], "c=6 residue set changed") + expect(allowed_values(7) == [0, 1, 7, 8, 14], "c=7 residue set changed") + expect(allowed_values(5) == [0, 1, 5, 6, 10], "c=5 residue set changed") + + # Explicit odd witnesses: c=5 and c=7 shape 1 and shape 2. + for c in (5, 7): + values = set(allowed_values(c)) + a, h = (c - 1) // 2, (c + 1) // 2 + r = (0, 0, h, h, c, c) + s = [2 * r[j] + (1 if j == 0 else 0) for j in range(6)] + expect(all(s[j] in values for j in range(6)), f"c={c}: shape-1 witness illegal") + expect(sum(1 for v in s if v % c == 1) == 3, f"c={c}: shape-1 weight moved") + r = (0, a, h, h, h, c) + s = [2 * r[j] + (1 if j == 1 else 0) for j in range(6)] + expect(all(s[j] in values for j in range(6)), f"c={c}: shape-2 witness illegal") + expect(sum(1 for v in s if v % c == 1) == 3, f"c={c}: shape-2 weight moved") + + print("even c >= 4: no residue-legal centre at all") + print("odd c >= 5: exactly 300 residue-legal centres, all of weight 3") + print("c=3: 366 legal, 300 of weight 3; c=2: 450 legal, none of weight 3") + print(PASS) + + +if __name__ == "__main__": + main() From c3c76667137a1c5e90894304ea6dcbe48aebc1e7 Mon Sep 17 00:00:00 2001 From: Nick Petalas Date: Wed, 11 Nov 2026 21:42:48 +0000 Subject: [PATCH 2/2] docs(research): add the production credit line --- research/six-source-all-c-centre-emptiness/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/research/six-source-all-c-centre-emptiness/README.md b/research/six-source-all-c-centre-emptiness/README.md index 4f7eb3e9f3..2f112d4a77 100644 --- a/research/six-source-all-c-centre-emptiness/README.md +++ b/research/six-source-all-c-centre-emptiness/README.md @@ -165,6 +165,8 @@ service or a frozen archive; the two hash-pinned provenance files are listed in ## Credit +This package was produced by Nick Petalas. + Merged PR #6955 by unpaidmoon supplies the six-source model, the residue set, the c=6 centre classification and the description of the c=7 frozen-14 step; this package generalizes its c=6 statement and does not replay it. The weight