erdos-problems 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/package.json +1 -1
  2. package/packs/number-theory/problems/848/ANCHOR_MINIMALITY_LEDGER.md +55 -0
  3. package/packs/number-theory/problems/848/ANCHOR_OBSTRUCTION_7_32_57_82.json +293 -0
  4. package/packs/number-theory/problems/848/ANCHOR_OBSTRUCTION_RECON.md +82 -0
  5. package/packs/number-theory/problems/848/ANCHOR_SUBSET_SEARCH_PREFIX10_K3_K4.json +737 -0
  6. package/packs/number-theory/problems/848/BOUNDED_VERIFICATION_PLAN.md +3 -2
  7. package/packs/number-theory/problems/848/{EXACT_SMALL_N_1_3000_CERTIFICATE.md → EXACT_SMALL_N_1_10000_CERTIFICATE.md} +17 -14
  8. package/packs/number-theory/problems/848/EXACT_SMALL_N_1_10000_RESULTS.json +100018 -0
  9. package/packs/number-theory/problems/848/FOUR_ANCHOR_LEMMA_CANDIDATE.md +101 -0
  10. package/packs/number-theory/problems/848/FRONTIER_NOTE.md +12 -7
  11. package/packs/number-theory/problems/848/INTERVAL_WORK_QUEUE.yaml +5 -5
  12. package/packs/number-theory/problems/848/OPS_DETAILS.yaml +25 -8
  13. package/packs/number-theory/problems/848/ROUTE_HISTORY.md +4 -2
  14. package/packs/number-theory/problems/848/VERIFICATION_CERTIFICATE_SPEC.md +3 -0
  15. package/packs/number-theory/problems/848/VERIFICATION_REGIMES.md +4 -4
  16. package/packs/number-theory/problems/848/compute/problem848_anchor_obstruction_scan.mjs +120 -0
  17. package/packs/number-theory/problems/848/compute/problem848_anchor_subset_search.mjs +134 -0
  18. package/packs/number-theory/problems/848/compute/problem848_small_n_exact_scan.mjs +62 -45
  19. package/packs/number-theory/problems/848/context.yaml +13 -6
  20. package/problems/848/EVIDENCE.md +13 -5
  21. package/problems/848/ROUTES.md +4 -4
  22. package/problems/848/SHARE_READY_SUMMARY.md +2 -1
  23. package/packs/number-theory/problems/848/EXACT_SMALL_N_1_3000_RESULTS.json +0 -213791
@@ -26,52 +26,34 @@ function parseArgs(argv) {
26
26
  return args;
27
27
  }
28
28
 
29
+ const squarefreeCache = new Map();
30
+
29
31
  function isSquarefree(n) {
32
+ if (squarefreeCache.has(n)) return squarefreeCache.get(n);
30
33
  let x = n;
31
34
  for (let p = 2; p * p <= x; p += 1) {
32
35
  if (x % p !== 0) continue;
33
36
  x /= p;
34
- if (x % p === 0) return false;
37
+ if (x % p === 0) {
38
+ squarefreeCache.set(n, false);
39
+ return false;
40
+ }
35
41
  while (x % p === 0) x /= p;
36
42
  }
43
+ squarefreeCache.set(n, true);
37
44
  return true;
38
45
  }
39
46
 
40
- function residueClass(N, residue) {
41
- const result = [];
42
- for (let n = 1; n <= N; n += 1) {
43
- if (n % 25 === residue) result.push(n);
44
- }
45
- return result;
46
- }
47
-
48
- function sameSortedSet(left, right) {
49
- if (left.length !== right.length) return false;
50
- const a = [...left].sort((x, y) => x - y);
51
- const b = [...right].sort((x, y) => x - y);
52
- return a.every((value, index) => value === b[index]);
47
+ function residueClassSize(N, residue) {
48
+ if (N < residue) return 0;
49
+ return Math.floor((N - residue) / 25) + 1;
53
50
  }
54
51
 
55
- function buildGraph(N) {
56
- const vertices = [];
57
- for (let a = 1; a <= N; a += 1) {
58
- if (!isSquarefree(a * a + 1)) vertices.push(a);
59
- }
60
- const adjacency = Array.from({ length: vertices.length }, () => new Set());
61
- for (let i = 0; i < vertices.length; i += 1) {
62
- for (let j = i + 1; j < vertices.length; j += 1) {
63
- const a = vertices[i];
64
- const b = vertices[j];
65
- if (!isSquarefree(a * b + 1)) {
66
- adjacency[i].add(j);
67
- adjacency[j].add(i);
68
- }
69
- }
70
- }
71
- return { vertices, adjacency };
52
+ function isPureResidueClass(clique, N, residue) {
53
+ return clique.length === residueClassSize(N, residue) && clique.every((value) => value % 25 === residue);
72
54
  }
73
55
 
74
- function maximumClique(vertices, adjacency) {
56
+ function maximumCliqueIndices(adjacency, candidateIndices, lowerBound = 0) {
75
57
  let best = [];
76
58
 
77
59
  function bronKerbosch(R, P, X) {
@@ -79,7 +61,7 @@ function maximumClique(vertices, adjacency) {
79
61
  if (R.length > best.length) best = [...R];
80
62
  return;
81
63
  }
82
- if (R.length + P.length <= best.length) return;
64
+ if (R.length + P.length <= Math.max(best.length, lowerBound)) return;
83
65
 
84
66
  let pivot = null;
85
67
  let pivotNeighborsInP = -1;
@@ -109,29 +91,63 @@ function maximumClique(vertices, adjacency) {
109
91
  }
110
92
  }
111
93
 
112
- bronKerbosch([], vertices.map((_, index) => index), []);
113
- return best.map((index) => vertices[index]).sort((a, b) => a - b);
94
+ bronKerbosch([], [...candidateIndices], []);
95
+ return best.sort((a, b) => a - b);
114
96
  }
115
97
 
116
98
  function scanInterval(minN, maxN) {
117
99
  const rows = [];
118
- for (let N = minN; N <= maxN; N += 1) {
119
- const residue7 = residueClass(N, 7);
120
- const residue18 = residueClass(N, 18);
121
- const { vertices, adjacency } = buildGraph(N);
122
- const clique = maximumClique(vertices, adjacency);
100
+ const vertices = [];
101
+ const adjacency = [];
102
+ let bestCliqueIndices = [];
103
+
104
+ for (let N = 1; N <= maxN; N += 1) {
105
+ const residue7Size = residueClassSize(N, 7);
106
+ const residue18Size = residueClassSize(N, 18);
107
+
108
+ if (!isSquarefree(N * N + 1)) {
109
+ const newIndex = vertices.length;
110
+ const neighbors = [];
111
+ for (let i = 0; i < vertices.length; i += 1) {
112
+ if (!isSquarefree(vertices[i] * N + 1)) {
113
+ adjacency[i].add(newIndex);
114
+ neighbors.push(i);
115
+ }
116
+ }
117
+ adjacency.push(new Set(neighbors));
118
+ vertices.push(N);
119
+
120
+ if (neighbors.length + 1 > bestCliqueIndices.length) {
121
+ const neighborClique = maximumCliqueIndices(
122
+ adjacency,
123
+ neighbors,
124
+ Math.max(0, bestCliqueIndices.length - 1),
125
+ );
126
+ if (neighborClique.length + 1 > bestCliqueIndices.length) {
127
+ bestCliqueIndices = [...neighborClique, newIndex].sort((a, b) => a - b);
128
+ }
129
+ }
130
+ }
131
+
132
+ const clique = bestCliqueIndices.map((index) => vertices[index]);
123
133
  const maxSize = clique.length;
124
- const residue7Size = residue7.length;
125
- const residue18Size = residue18.length;
134
+ if (N < minN) continue;
135
+ const exampleResidueClass = isPureResidueClass(clique, N, 7)
136
+ ? 7
137
+ : isPureResidueClass(clique, N, 18)
138
+ ? 18
139
+ : null;
140
+
126
141
  rows.push({
127
142
  N,
128
143
  maxCliqueSize: maxSize,
129
144
  residue7Size,
130
145
  residue18Size,
131
146
  candidateAchievesMaximum: residue7Size === maxSize,
132
- exampleMaximumClique: clique,
133
- exampleMatchesResidue7: sameSortedSet(clique, residue7),
134
- exampleMatchesResidue18: sameSortedSet(clique, residue18),
147
+ exampleResidueClass,
148
+ exampleMaximumClique: exampleResidueClass === null ? clique : undefined,
149
+ exampleMatchesResidue7: exampleResidueClass === 7,
150
+ exampleMatchesResidue18: exampleResidueClass === 18,
135
151
  });
136
152
  }
137
153
  return rows;
@@ -153,6 +169,7 @@ const rows = scanInterval(args.min, args.max);
153
169
  const payload = {
154
170
  generatedAt: new Date().toISOString(),
155
171
  method: 'exact_maximum_clique_scan',
172
+ resultEncoding: 'residue_class_when_possible',
156
173
  problemId: '848',
157
174
  parameters: {
158
175
  min: args.min,
@@ -3,11 +3,11 @@ family_role: finite_check_number_theory_workspace
3
3
  harness_profile: decidable_gap_workspace
4
4
  default_active_route: finite_check_gap_closure
5
5
  bootstrap_focus: Treat Problem 848 as a finite-gap closure problem and freeze the certificate surface before claiming bounded verification progress.
6
- route_story: Problem 848 is already asymptotically resolved in public, but not yet closed here for all N. The honest job is to shrink the finite remainder with audited threshold tracking and reproducible bounded verification, beginning from the verified base interval `1..3000`.
6
+ route_story: Problem 848 is already asymptotically resolved in public, but not yet closed here for all N. The honest job is to shrink the finite remainder with audited threshold tracking and reproducible bounded verification, and then turn the exact packet into a short structural theorem.
7
7
  frontier_label: finite_check_gap_closure
8
- frontier_detail: The repo now has a verified exact interval `1..3000`; an attempted jump to `5000` did not clear quickly enough to count as cheap progress, so the next question is whether to extend exact coverage in smaller steps or change method class.
8
+ frontier_detail: The repo now has a verified exact interval `1..10000`, a four-anchor obstruction candidate with no failures in `30..10000`, and evidence that this is the first serious theorem route. The next question is how to prove that obstruction and convert it into a breakpoint law.
9
9
  checkpoint_focus: Preserve the distinction between existential N0, explicit N0, sample finite checks, and full closure.
10
- next_honest_move: Decide whether to extend the exact clique scan beyond `3000` in smaller certified steps or pivot to a different bounded-verification method.
10
+ next_honest_move: Promote the four-anchor obstruction from recon to a proof-shaped lemma candidate with explicit proof obligations.
11
11
  related_core_problems:
12
12
  - "844"
13
13
  literature_focus:
@@ -27,22 +27,29 @@ artifact_focus:
27
27
  - VERIFICATION_CERTIFICATE_SPEC.md
28
28
  - EXTERNAL_VERIFICATION_LEDGER.md
29
29
  - INTERVAL_WORK_QUEUE.yaml
30
- - EXACT_SMALL_N_1_3000_CERTIFICATE.md
30
+ - EXACT_SMALL_N_1_10000_CERTIFICATE.md
31
+ - ANCHOR_OBSTRUCTION_RECON.md
32
+ - ANCHOR_MINIMALITY_LEDGER.md
33
+ - FOUR_ANCHOR_LEMMA_CANDIDATE.md
31
34
  question_ledger:
32
35
  open_questions:
33
36
  - Which imported threshold value is trusted enough to size the finite remainder operationally?
34
37
  - What certificate format is strong enough to prevent repeat low-trust verification claims?
35
- - How far can the exact clique scan be pushed before a different method class is needed?
38
+ - Can the four-anchor obstruction be proved for all `n >= 30`?
39
+ - Can the four-anchor obstruction be converted into a breakpoint law for clique growth?
36
40
  - Which public verification attempts are worth auditing rather than rebuilding from scratch?
37
41
  active_route_notes:
38
42
  - Keep the asymptotic theorem separate from the unresolved finite closure.
39
43
  - Keep imported threshold claims separate from repo-owned audited claims.
40
44
  - Prefer interval certificates to raw "checked up to X" claims.
41
45
  - Use past public verification criticism as a design constraint, not just background chatter.
46
+ - Treat the exact verifier as a structure miner, not just a brute-force machine.
42
47
  route_breakthroughs:
43
48
  - Public asymptotic resolution by Sawhney is already in hand.
44
49
  - The threshold ledger separating existential and explicit claims is now frozen.
45
50
  - The repo now has an audited explicit candidate package distinct from the imported public threshold timeline.
46
51
  - The repo has now chosen bounded finite verification as the next closure lane.
47
- - The repo now has an exact verified base interval `1..3000`.
52
+ - The repo now has an exact verified base interval `1..10000`.
53
+ - The exact verifier now uses an incremental update rule rather than rebuilding every instance from scratch.
54
+ - The repo now has a four-anchor obstruction candidate with no failures in `30..10000`.
48
55
  problem_solved: []
@@ -74,9 +74,16 @@ Current public evidence captured locally:
74
74
  values to size the finite remainder without being silently promoted to canonical theorem
75
75
  truth.
76
76
  - A reproducible exact maximum-clique scan now verifies the expected extremal size for every
77
- `N` in `1..3000`, giving the bounded-verification lane a larger trusted covered interval.
78
- - An exploratory jump to `1..5000` no longer looks cheap enough to treat blind brute-force
79
- extension as the default next move.
77
+ `N` in `1..10000`, giving the bounded-verification lane a much larger trusted covered interval.
78
+ - The exact verifier has been rebuilt incrementally, so the old post-`3000` cost wall is now
79
+ understood to have been mostly a tooling artifact rather than a serious mathematical barrier.
80
+ - The exact packet now exposes a structural clue: every maximum witness through `10000` is the
81
+ pure `7 mod 25` class, the clique size only jumps when `N equiv 7 (mod 25)`, and the fixed
82
+ anchor set `{7, 32, 57, 82}` obstructs every outsider `n >= 30` found so far.
83
+ - A small-anchor search over the first ten `7 mod 25` values suggests that the four-anchor set
84
+ `{7, 32, 57, 82}` is unusually strong: no tested three-anchor set gets a comparable startup
85
+ threshold, while this four-anchor set already covers everything from `30` onward in the
86
+ current scan window.
80
87
 
81
88
  Claim-safe local posture:
82
89
  - Exact: the public status is `decidable`, not `open` and not fully `solved`.
@@ -116,5 +123,6 @@ Next maintainer step:
116
123
  - preserve the current claim-safe package as a clean review unit
117
124
  - treat imported threshold improvements as external progress markers unless they are
118
125
  re-audited inside the repo
119
- - decide whether exact verified coverage should be extended beyond `3000` in smaller steps
120
- or whether the next gain now needs a different method class
126
+ - turn the four-anchor obstruction into a proof-shaped lemma candidate with explicit proof
127
+ obligations
128
+ - use that lemma candidate to attack the breakpoint law suggested by the exact packet
@@ -74,9 +74,9 @@
74
74
  - a regime split for the finite remainder
75
75
  - a certificate format for bounded interval claims
76
76
  - an audit ledger for imported verification work
77
- - an exact verified base interval `1..3000`
78
- - The next concrete task is to decide whether the exact clique scan should be extended
79
- directly beyond `3000` in smaller steps or whether the next gain now needs a different
80
- method class.
77
+ - an exact verified base interval `1..10000`
78
+ - an incremental verifier that makes larger exact tranches practical
79
+ - The next concrete task is to turn the four-anchor obstruction clue into a proof-shaped
80
+ lemma candidate and then use it to attack the breakpoint law.
81
81
  - The right optimization target remains the size of the remaining finite gap, not the
82
82
  threshold race in isolation.
@@ -23,7 +23,8 @@ What is ready now:
23
23
  - supporting explicit ledgers for the branch bounds and numerical witness
24
24
  - a bounded finite-verification lane with regimes, certificate requirements, and external
25
25
  audit notes
26
- - an exact verified base interval `1..3000`
26
+ - an exact verified base interval `1..10000`
27
+ - a four-anchor obstruction candidate and minimality ledger for the first theorem-style route
27
28
 
28
29
  What is not being claimed:
29
30
  - not full all-`N` closure in the repo