@ceccec/millennium-solutions 9.1.0 → 9.1.2

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.
package/src/api/gates.ts CHANGED
@@ -100,6 +100,7 @@ export const UNRUN_BY_DESIGN: Record<string, string> = {
100
100
  priorart: 'a generator; priorart-gen is the gate that holds its output',
101
101
  'stale-figures': 'REPORTS by design — a 75% false-positive rate is not something to gate a build on',
102
102
  'verify-theorems': 'covered by gates-fire, and its subject is re-verified by forensics on every commit',
103
+ probe: 'the control harness, not a gate: it takes a file, a theorem and a mutation as arguments, so no chain can run it bare; gates-fire holds its control — a mutation that never reaches the theorem must be refused',
103
104
  }
104
105
 
105
106
  /** Gates that REFUSE and that no routine chain runs. `seo` sat here with a real defect — paper.html
@@ -18586,5 +18586,35 @@
18586
18586
  "key": "lean_speed_hexbits_are_slower_and_the_ratio_multiplies_back",
18587
18587
  "name": "lean speed.lean: hexbits_are_slower_and_the_ratio_multiplies_back — (List.range' 1 20).all (fun b => (List.range 400).all (fun a => (a / b) * b ≤ a && a < (a / b + 1) * b)) ∧ hexbitMs > hexMs ∧ hexbitMs * 10 / hexMs = 18 — decided by the Lean kernel over its whole finite domain, axiom-free",
18588
18588
  "receipt": "91a92ea5-bedd-8b9a-80b7-29130fbe5a93"
18589
+ },
18590
+ {
18591
+ "key": "lean_elementary_the_wythoff_sequences_partition_the_integers",
18592
+ "name": "lean elementary.lean: the_wythoff_sequences_partition_the_integers — (List.range' 1 50).all (fun m => ((List.range' 1 40).map lowerWythoff).count m + ((List.range' 1 40).map upperWythoff).count m == 1) — decided by the Lean kernel over its whole finite domain, axiom-free",
18593
+ "receipt": "45729b78-1ded-8539-a2da-71459d8d4183"
18594
+ },
18595
+ {
18596
+ "key": "lean_energy_the_atoms_read_back_from_the_mass",
18597
+ "name": "lean energy.lean: the_atoms_read_back_from_the_mass — (List.range 10).all (fun h => (List.range 10).all (fun o => atomsOf (mass h o) == some (h, o))) ∧ atomsOf mgH2 = some (2, 0) ∧ atomsOf mgO2 = some (0, 2) ∧ atomsOf mgH2O = some (2, 1) — decided by the Lean kernel over its whole finite domain, axiom-free",
18598
+ "receipt": "e49b5ab6-4f44-8b3c-aec8-b5b0a5f4d681"
18599
+ },
18600
+ {
18601
+ "key": "lean_families_invOf_is_an_inverse_and_an_involution_on_the_units",
18602
+ "name": "lean families.lean: invOf_is_an_inverse_and_an_involution_on_the_units — (List.range 9).all (fun d => match invOf d with | some e => d * e % 9 == 1 && invOf e == some d | none => gcd' d 9 != 1) — decided by the Lean kernel over its whole finite domain, axiom-free",
18603
+ "receipt": "85ad9b47-1b45-8b65-9a6c-72779f4782b0"
18604
+ },
18605
+ {
18606
+ "key": "lean_families_choose_is_invariant_under_the_involution_k_to_n_minus_k",
18607
+ "name": "lean families.lean: choose_is_invariant_under_the_involution_k_to_n_minus_k — (List.range 13).all (fun n => (List.range (n + 1)).all (fun k => choose n k == choose n (n - k) && n - (n - k) == k)) — decided by the Lean kernel over its whole finite domain, axiom-free",
18608
+ "receipt": "0affa1b0-91a0-8f5d-aa01-7f37496f2c87"
18609
+ },
18610
+ {
18611
+ "key": "lean_light_the_second_returns_from_the_metre_and_the_period",
18612
+ "name": "lean light.lean: the_second_returns_from_the_metre_and_the_period — (List.range 100).all (fun s => travel s / c == s && periods s / dNuCs == s) — decided by the Lean kernel over its whole finite domain, axiom-free",
18613
+ "receipt": "04685db2-fda6-844b-8b36-5b7f858baaac"
18614
+ },
18615
+ {
18616
+ "key": "lean_z9_the_orbit_step_is_read_back_by_its_log",
18617
+ "name": "lean z9.lean: the_orbit_step_is_read_back_by_its_log — (List.range 6).all (fun k => logOrbit (orbit k) == some k) ∧ units.all (fun u => (logOrbit u).map orbit == some u) — decided by the Lean kernel over its whole finite domain, axiom-free",
18618
+ "receipt": "e29d831e-5bde-8104-95bd-fc374ac46155"
18589
18619
  }
18590
18620
  ]
@@ -344,6 +344,14 @@ theorem a_knight_has_exactly_eight_leaps_and_every_one_flips_the_colour :
344
344
  theorem the_golden_beatty_identity_holds_across_the_range :
345
345
  (List.range' 1 40).all (fun n => upperWythoff n - lowerWythoff n == n) := by decide
346
346
 
347
+ -- ── and the two sequences PARTITION the positive integers: every m up to fifty is hit by exactly one of the
348
+ -- lower and upper Wythoff sequences, never both, never neither (Beatty's theorem, 1926, at φ and φ²). The
349
+ -- identity above says how the two are paired; this says the pairing loses and duplicates nothing ──
350
+ set_option maxRecDepth 2000000 in
351
+ theorem the_wythoff_sequences_partition_the_integers :
352
+ (List.range' 1 50).all (fun m =>
353
+ ((List.range' 1 40).map lowerWythoff).count m + ((List.range' 1 40).map upperWythoff).count m == 1) := by decide
354
+
347
355
  -- ── the partition numbers count the partitions, and the Bell numbers count the set partitions ───────────
348
356
  -- Both are checked against an ENUMERATION of the objects rather than against another recurrence, which
349
357
  -- is the difference between confirming a formula and confirming what it counts.
@@ -387,7 +395,7 @@ theorem the_unit_graph_is_complete_bipartite_between_the_two_tetrahedra :
387
395
  (nbrs (unitsMod 9) d).all (fun y => x == y || !((nbrs (unitsMod 9) x).contains y)))) := by decide
388
396
 
389
397
  -- ── what these settle ──
390
- def settledHere : Nat := 31
391
- theorem elementary_settles_its_range : settledHere = 31 := rfl
398
+ def settledHere : Nat := 32
399
+ theorem elementary_settles_its_range : settledHere = 32 := rfl
392
400
 
393
401
  end Elementary
@@ -261,4 +261,15 @@ theorem the_residue_ratio_is_the_same_at_every_volume :
261
261
  (List.range' 1 200).all (fun l => residueMg l tdsSeawater == 700 * residueMg l tdsTapWater) ∧
262
262
  residueMg 100 tdsSeawater / 1000 = 3500 ∧ residueMg 100 tdsTapWater / 1000 = 5 := by decide
263
263
 
264
+ -- ── 19 · THE MASS READS BACK ITS ATOMS. `mass` takes a molecule's hydrogens and oxygens to its molar mass;
265
+ -- `atomsOf` goes the other way, finding the counts whose mass it is. At every molecule of up to nine
266
+ -- of each, reading the atoms back from the mass returns exactly those atoms — so on this range the
267
+ -- mass names the molecule, and no two formulas share one. H₂, O₂ and H₂O are three of the hundred. ──
268
+ def atomsOf (m : Nat) : Option (Nat × Nat) :=
269
+ ((List.range 10).flatMap (fun h => (List.range 10).map (fun o => (h, o)))).find? (fun p => mass p.1 p.2 == m)
270
+
271
+ theorem the_atoms_read_back_from_the_mass :
272
+ (List.range 10).all (fun h => (List.range 10).all (fun o => atomsOf (mass h o) == some (h, o))) ∧
273
+ atomsOf mgH2 = some (2, 0) ∧ atomsOf mgO2 = some (0, 2) ∧ atomsOf mgH2O = some (2, 1) := by decide
274
+
264
275
  end Energy
@@ -428,8 +428,23 @@ set_option maxRecDepth 100000 in
428
428
  theorem the_involutions_are_counted_by_the_telephone_numbers :
429
429
  (List.range 6).all (fun n => ((permsN (List.range n)).filter isInvolution).length == telephone n) := by decide
430
430
 
431
+ -- ── the unit inverse, stated AS an inverse. That invOf finds something at exactly the units was proved above;
432
+ -- this proves what it finds: the residue multiplies back to one, and inverting twice returns the unit — so
433
+ -- invOf is an involution on the six units, and the non-units, where it finds nothing, are exactly the
434
+ -- residues sharing a factor with nine ──
435
+ theorem invOf_is_an_inverse_and_an_involution_on_the_units :
436
+ (List.range 9).all (fun d => match invOf d with
437
+ | some e => d * e % 9 == 1 && invOf e == some d
438
+ | none => gcd' d 9 != 1) := by decide
439
+
440
+ -- ── the binomial coefficient does not see the involution k ↦ n − k: choosing k is choosing the n − k left
441
+ -- behind, and applying the involution twice returns k, at every n to twelve and every k ──
442
+ theorem choose_is_invariant_under_the_involution_k_to_n_minus_k :
443
+ (List.range 13).all (fun n => (List.range (n + 1)).all (fun k =>
444
+ choose n k == choose n (n - k) && n - (n - k) == k)) := by decide
445
+
431
446
  -- ── what these settle ──
432
- def settledHere : Nat := 40
433
- theorem families_settle_their_ranges : settledHere = 40 := rfl
447
+ def settledHere : Nat := 42
448
+ theorem families_settle_their_ranges : settledHere = 42 := rfl
434
449
 
435
450
  end Families
@@ -53,6 +53,12 @@ def periods (seconds : Nat) : Nat := dNuCs * seconds -- caesium periods elapsed
53
53
 
54
54
  theorem travel_at_one_returns_the_defined_constant : travel 1 = c := by decide
55
55
 
56
+ -- AND THE CHAIN RUNS BACK. Dividing the metres by c returns the seconds, and dividing the periods by ΔνCs
57
+ -- returns them too, at every whole second below a hundred: travel and periods are each undone by the
58
+ -- constant that defines them, so a length and a count of periods both read back the same duration.
59
+ theorem the_second_returns_from_the_metre_and_the_period :
60
+ (List.range 100).all (fun s => travel s / c == s && periods s / dNuCs == s) := by decide
61
+
56
62
  -- ONE INTERVAL, TWO UNITS: the same second is 299792458 metres of light and 9192631770 caesium periods.
57
63
  -- That is the SI's join between space and time, and it is an identity between two definitions rather than
58
64
  -- a discovery about either.
@@ -15400,5 +15400,41 @@
15400
15400
  "verdict": "UNVERIFIED",
15401
15401
  "ground": "no candidate in the current space — nothing to recompute",
15402
15402
  "receipt": "91a92ea5-bedd-8b9a-80b7-29130fbe5a93"
15403
+ },
15404
+ {
15405
+ "key": "lean_elementary_the_wythoff_sequences_partition_the_integers",
15406
+ "verdict": "UNVERIFIED",
15407
+ "ground": "no candidate in the current space — nothing to recompute",
15408
+ "receipt": "45729b78-1ded-8539-a2da-71459d8d4183"
15409
+ },
15410
+ {
15411
+ "key": "lean_energy_the_atoms_read_back_from_the_mass",
15412
+ "verdict": "UNVERIFIED",
15413
+ "ground": "no candidate in the current space — nothing to recompute",
15414
+ "receipt": "e49b5ab6-4f44-8b3c-aec8-b5b0a5f4d681"
15415
+ },
15416
+ {
15417
+ "key": "lean_families_invOf_is_an_inverse_and_an_involution_on_the_units",
15418
+ "verdict": "UNVERIFIED",
15419
+ "ground": "no candidate in the current space — nothing to recompute",
15420
+ "receipt": "85ad9b47-1b45-8b65-9a6c-72779f4782b0"
15421
+ },
15422
+ {
15423
+ "key": "lean_families_choose_is_invariant_under_the_involution_k_to_n_minus_k",
15424
+ "verdict": "UNVERIFIED",
15425
+ "ground": "no candidate in the current space — nothing to recompute",
15426
+ "receipt": "0affa1b0-91a0-8f5d-aa01-7f37496f2c87"
15427
+ },
15428
+ {
15429
+ "key": "lean_light_the_second_returns_from_the_metre_and_the_period",
15430
+ "verdict": "UNVERIFIED",
15431
+ "ground": "no candidate in the current space — nothing to recompute",
15432
+ "receipt": "04685db2-fda6-844b-8b36-5b7f858baaac"
15433
+ },
15434
+ {
15435
+ "key": "lean_z9_the_orbit_step_is_read_back_by_its_log",
15436
+ "verdict": "UNVERIFIED",
15437
+ "ground": "no candidate in the current space — nothing to recompute",
15438
+ "receipt": "e29d831e-5bde-8104-95bd-fc374ac46155"
15403
15439
  }
15404
15440
  ]
package/src/proof/z9.lean CHANGED
@@ -65,6 +65,15 @@ theorem orbit_closes : orbit 6 = orbit 0 := by decide
65
65
  theorem orbit_distinct : ((List.range 6).map orbit).eraseDups.length = 6 := by decide
66
66
  theorem orbit_covers_units : ((List.range 6).map orbit).eraseDups.length = units.length := by decide
67
67
 
68
+ -- ── the orbit read back: a discrete log along the doubling circuit. orbit takes a step to its residue;
69
+ -- logOrbit takes the residue back to its step. Every step below six returns itself, and every unit is
70
+ -- reached and re-reached — the circuit and its log are inverse, which is what "2 generates the units" means ──
71
+ def logOrbit (u : Nat) : Option Nat := (List.range 6).find? (fun k => orbit k == u)
72
+
73
+ theorem the_orbit_step_is_read_back_by_its_log :
74
+ (List.range 6).all (fun k => logOrbit (orbit k) == some k) ∧
75
+ units.all (fun u => (logOrbit u).map orbit == some u) := by decide
76
+
68
77
  -- ── the triad {3,6,9} is off the circuit: no power of 3 or 6 ever reaches one ──
69
78
  theorem triad_never_reaches_one :
70
79
  ¬ ((List.range 12).any (fun k => pow9 3 (k + 1) == 1 || pow9 6 (k + 1) == 1)) := by decide
@@ -86,7 +95,7 @@ theorem neg_involution : (List.range B).all (fun d => m9 (B - m9 (B - d)) == m9
86
95
  -- The count is of declarations closing by EXHAUSTION, which is this deposit's definition of a theorem, so
87
96
  -- the rfl declaration below is excluded from its own total. It read 21 until the count was recomputed
88
97
  -- against the tree: it had been counting itself. A tautology is not one of the things settled here.
89
- def settledHere : Nat := 20
90
- theorem z9_settles_its_domain_totally : settledHere = 20 := rfl
98
+ def settledHere : Nat := 21
99
+ theorem z9_settles_its_domain_totally : settledHere = 21 := rfl
91
100
 
92
101
  end Z9