@ceccec/millennium-solutions 0.1.1 → 9.0.6
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/.zenodo.json +33 -9
- package/ACCOUNTING.md +7 -7
- package/AXIOMS.md +559 -0
- package/CHALLENGES.md +2181 -2479
- package/CITATION.cff +1 -1
- package/DEPLOY.md +2 -2
- package/DEVELOP.md +1 -1
- package/LICENSE +6 -5
- package/PRIOR-ART.md +149 -0
- package/README.md +221 -123
- package/SIGNATURE.md +2 -2
- package/TRIAL.md +69 -0
- package/WHITEPAPER.md +5 -5
- package/captain.md +2 -2
- package/compare.md +4 -4
- package/compute.md +9 -0
- package/dashboard.md +1 -1
- package/examples.md +5 -5
- package/forensic.md +67 -0
- package/guide.md +5 -5
- package/index.md +209 -139
- package/package.json +88 -9
- package/paper.md +7183 -0
- package/quantum.md +42 -0
- package/rights.md +39 -0
- package/solutions.md +7 -7
- package/speedup.md +4 -4
- package/src/0/index.ts +12 -2
- package/src/1/index.ts +1 -1
- package/src/2/frequency-scales.ts +13 -1
- package/src/2/index.ts +1 -1
- package/src/3/index.ts +1 -1
- package/src/4/index.ts +1 -1
- package/src/5/index.ts +1 -1
- package/src/6/index.ts +1 -1
- package/src/7/index.ts +1 -1
- package/src/9/funding.ts +2 -2
- package/src/api/gates.ts +117 -0
- package/src/api/index.ts +488 -0
- package/src/api/lanes.ts +81 -0
- package/src/demand/queries.json +1764 -0
- package/src/face/index.ts +100 -0
- package/src/html/index.ts +10 -0
- package/src/latex/index.ts +474 -0
- package/src/millennium/index.ts +53 -0
- package/src/proof/README.md +1 -1
- package/src/proof/address.lean +117 -0
- package/src/proof/coin.lean +148 -0
- package/src/proof/covered.json +9 -0
- package/src/proof/demand.lean +112 -0
- package/src/proof/demand2.lean +171 -0
- package/src/proof/demand3.lean +117 -0
- package/src/proof/discovered.json +10965 -1864
- package/src/proof/elementary.lean +393 -0
- package/src/proof/energy.lean +215 -0
- package/src/proof/families.lean +435 -0
- package/src/proof/fixtures/axiom-control.lean +39 -0
- package/src/proof/fnv.lean +99 -0
- package/src/proof/generated-theorems.json +207 -0
- package/src/proof/generated.lean +101 -0
- package/src/proof/imagined.lean +492 -0
- package/src/proof/index.lean +98 -18
- package/src/proof/index.ts +2 -2
- package/src/proof/involution.lean +90 -0
- package/src/proof/ledgerclaims.lean +84 -0
- package/src/proof/light.lean +135 -0
- package/src/proof/mechanical.lean +421 -0
- package/src/proof/merkaba.lean +89 -0
- package/src/proof/merkle.lean +132 -0
- package/src/proof/nim.lean +105 -0
- package/src/proof/phenomena.lean +90 -0
- package/src/proof/priorart.lean +189 -0
- package/src/proof/quantum.lean +161 -0
- package/src/proof/reach.lean +84 -0
- package/src/proof/recovered.lean +56 -0
- package/src/proof/reversal.lean +73 -0
- package/src/proof/rights.lean +157 -0
- package/src/proof/sequences.lean +105 -0
- package/src/proof/speed.lean +129 -0
- package/src/proof/split.lean +180 -0
- package/src/proof/theorems.lean +48 -1
- package/src/proof/trial-all.json +15260 -0
- package/src/proof/z9.lean +92 -0
- package/src/proof/z9plus.lean +208 -0
- package/src/proofs.lisp +3 -3
- package/src/prove/emit.ts +115 -0
- package/src/prove/index.ts +143 -0
- package/src/prove/translate.ts +638 -0
- package/src/publication/index.ts +363 -0
- package/src/quantum/field.ts +73 -0
- package/src/quantum/tree.ts +79 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import Ledgerclaims
|
|
2
|
+
set_option maxRecDepth 8000000
|
|
3
|
+
set_option maxHeartbeats 4000000
|
|
4
|
+
-- title: Why verification is fast, and what it is not
|
|
5
|
+
-- wing: the floor
|
|
6
|
+
-- prior_art: named
|
|
7
|
+
-- prior_art_domain: hash trees and membership proofs
|
|
8
|
+
-- prior_art_note: the structural claim is Merkle's and is credited here as merkle.lean already credits it:
|
|
9
|
+
-- a hash tree over n leaves has an O(log n) membership proof, so the inclusion path at each power of two
|
|
10
|
+
-- is exactly the exponent. Ralph Merkle, 1979 (thesis); CRYPTO 1987. `the_verify_path_is_the_exponent`,
|
|
11
|
+
-- `membership_is_logarithmic_not_linear` and `the_gap_widens_with_every_doubling` RESTATE that property.
|
|
12
|
+
-- This file was classified `unbounded` — "the subject is this deposit's own verification cost" — which was
|
|
13
|
+
-- wrong: the cost is logarithmic BECAUSE of a known result, and the repository was already crediting that
|
|
14
|
+
-- result three files away.
|
|
15
|
+
-- Bounded: what is not prior art is the MEASURED constants on this machine (recompute 21,582,900 µs against
|
|
16
|
+
-- a 38 µs walk) and the arithmetic over them. A measurement is not a discovery either, and the file says so.
|
|
17
|
+
-- prior_art_search: literature search performed 2026-09-05, terms "Merkle tree membership proof logarithmic
|
|
18
|
+
-- verification path length"; prior art found and credited.
|
|
19
|
+
-- prior_art_pool: unbounded
|
|
20
|
+
-- the subject is this deposit's own verification cost.
|
|
21
|
+
-- BOUNDED means a search is well posed and simply has not been run — the row is unclassified because
|
|
22
|
+
-- nobody looked. UNBOUNDED means the subject is this artifact, so there is no pool to search and the
|
|
23
|
+
-- row will stay unclassified however much work is done. They look identical in a count and need
|
|
24
|
+
-- opposite responses, which is the distinction uuidna-49 asked for and nobody had drawn.
|
|
25
|
+
-- prior_art_own: this deposit's own verification cost
|
|
26
|
+
--
|
|
27
|
+
-- The deposit's speed claim, accounted — and the reading it does not support.
|
|
28
|
+
--
|
|
29
|
+
-- WHAT IS TRUE. Proving a set costs O(N): every leaf is touched. Verifying membership afterwards costs
|
|
30
|
+
-- O(log N): the inclusion path is one sibling per level. The gap is N/log N, which GROWS with scale, so the
|
|
31
|
+
-- advantage is not a constant that could be tuned away. Measured on one machine at 2^20 leaves: recompute
|
|
32
|
+
-- 21.6 seconds, verify 38.5 microseconds, a ratio of 561206. Those two timings are DECLARED INPUTS below,
|
|
33
|
+
-- not results — they are what this hardware did on one afternoon, and another machine will give other
|
|
34
|
+
-- numbers. What the kernel checks is the counting, which is machine-independent.
|
|
35
|
+
--
|
|
36
|
+
-- WHAT IS NOT TRUE, and is stated here because it is the thing people hear. Nothing runs in less than a
|
|
37
|
+
-- nanosecond. The measured verify is about 38000 nanoseconds; a single hash is roughly 1900. One nanosecond
|
|
38
|
+
-- is about one clock cycle at a gigahertz, and light crosses thirty centimetres in it — twenty sequential
|
|
39
|
+
-- hash evaluations do not fit inside one. The impression of instantaneity comes from doing twenty units of
|
|
40
|
+
-- work instead of a million, which is a smaller exponent and not a faster clock. No quantum hardware is
|
|
41
|
+
-- involved and none is claimed; the packaged tool that reports these magnitudes says the same in its own
|
|
42
|
+
-- output, that they are integrity verification and not hardware supremacy.
|
|
43
|
+
--
|
|
44
|
+
-- Author: Tsvetan Rouschev · License: CC BY-NC-ND 4.0 · No axioms, no Mathlib, no sorry.
|
|
45
|
+
|
|
46
|
+
namespace Speed
|
|
47
|
+
|
|
48
|
+
open LedgerClaims
|
|
49
|
+
|
|
50
|
+
-- ── declared inputs: what this machine did, in microseconds ──
|
|
51
|
+
def recomputeUs : Nat := 21582900 -- folding 2^20 leaves
|
|
52
|
+
def verifyUs : Nat := 38 -- walking the 20-node inclusion path
|
|
53
|
+
def nsPerVerify : Nat := 38000 -- the same verify, in nanoseconds
|
|
54
|
+
|
|
55
|
+
-- ── 1 · THE PATH IS LOGARITHMIC. At each power of two the inclusion path is exactly the exponent — one
|
|
56
|
+
-- sibling per level, and no more. This is the whole mechanism. ──
|
|
57
|
+
theorem the_verify_path_is_the_exponent :
|
|
58
|
+
rounds 40 1024 = 10 ∧ rounds 40 16384 = 14 ∧ rounds 40 262144 = 18 ∧ rounds 40 1048576 = 20 := by decide
|
|
59
|
+
|
|
60
|
+
-- ── 2 · AND THE GAP GROWS. N/log N is larger at every step up, so this is not a fixed advantage that a
|
|
61
|
+
-- faster recompute could close — the exponent is the thing that differs. ──
|
|
62
|
+
theorem the_gap_widens_with_every_doubling :
|
|
63
|
+
1024 / 10 < 16384 / 14 ∧ 16384 / 14 < 262144 / 18 ∧ 262144 / 18 < 1048576 / 20 := by decide
|
|
64
|
+
|
|
65
|
+
-- ── 3 · NO CONSTANT FACTOR EXPLAINS IT. If verification were merely a constant times cheaper, some c would
|
|
66
|
+
-- satisfy c · log₂N ≥ N across the range. Ten thousand does not, at a million leaves. ──
|
|
67
|
+
theorem no_constant_factor_accounts_for_the_gap :
|
|
68
|
+
¬ (10000 * 20 ≥ 1048576) ∧ 100 * 10 ≥ 1024 - 24 := by decide
|
|
69
|
+
|
|
70
|
+
-- ── 4 · THE MEASURED RATIO, from the declared inputs, in the same unit on both sides — the mistake that
|
|
71
|
+
-- made an earlier theorem in this deposit compare seal-bits against a leaf count. ──
|
|
72
|
+
theorem the_measured_ratio_at_a_million_leaves :
|
|
73
|
+
recomputeUs / verifyUs = 567971 ∧ recomputeUs > verifyUs * 500000 := by decide
|
|
74
|
+
|
|
75
|
+
-- ── 5 · VERIFY IS NOT FREE, and calling it O(1) would be the easy overclaim. It grows — slowly, and without
|
|
76
|
+
-- bound — so a large enough set costs a longer path. Logarithmic is not constant. ──
|
|
77
|
+
theorem verification_grows_it_is_not_constant :
|
|
78
|
+
rounds 40 1024 < rounds 40 1048576 ∧
|
|
79
|
+
((List.range' 1 10).all (fun k => rounds 40 (2 ^ k) == k)) := by decide
|
|
80
|
+
|
|
81
|
+
-- ── 6 · NOTHING HERE IS SUB-NANOSECOND. The measured verify is 38000 nanoseconds. The claim that it is under
|
|
82
|
+
-- one is off by four and a half orders of magnitude, and this theorem exists so that number sits in
|
|
83
|
+
-- the ledger next to the impressive one rather than only the impressive one being quotable. ──
|
|
84
|
+
theorem the_verify_is_thirty_eight_thousand_nanoseconds_not_one :
|
|
85
|
+
nsPerVerify = 38000 ∧ nsPerVerify > 1 ∧ nsPerVerify > 10000 := by decide
|
|
86
|
+
|
|
87
|
+
-- ── 7 · THE WORK PER NODE IS THE SAME on both paths. Recompute and verify run the identical hash; only the
|
|
88
|
+
-- COUNT differs. That is what makes this arithmetic rather than a claim about hardware. ──
|
|
89
|
+
theorem the_advantage_is_the_count_not_the_operation :
|
|
90
|
+
1048576 - 20 = 1048556 ∧ 1048576 / 20 = 52428 := by decide
|
|
91
|
+
|
|
92
|
+
-- ── 8 · PROVE ONCE, VERIFY FOREVER — stated as the break-even it actually is. One proof at O(N) pays for
|
|
93
|
+
-- itself after N/log N verifications, which at a million leaves is 52428 of them. Before that many,
|
|
94
|
+
-- recomputing each time is cheaper, and the deposit should not pretend otherwise. ──
|
|
95
|
+
theorem the_break_even_is_the_ratio_of_verifications :
|
|
96
|
+
1048576 / 20 = 52428 ∧ 52428 * 20 ≤ 1048576 ∧ 1048576 < 52429 * 20 + 20 := by decide
|
|
97
|
+
|
|
98
|
+
-- ── 9 · HEXBITS: WHAT THEY UNLOCK, MEASURED, AND WHAT THEY DO NOT ──────────────────────────────────────
|
|
99
|
+
-- A 6-bit encoding over the 64-hexagram lattice was benchmarked against the 8-bit hex table this
|
|
100
|
+
-- deposit ships (scripts/bench-hexbit.ts, 200,000 encodings × 5 repetitions, medians). Both round-trip
|
|
101
|
+
-- the whole lattice and 2,000 random 16-byte vectors, and 4-bit and 8-bit agree on all of them, so
|
|
102
|
+
-- this compares three correct encodings rather than an encoding against a bug.
|
|
103
|
+
--
|
|
104
|
+
-- The result is a real gain in ONE dimension and a real loss in the other, and both are stated.
|
|
105
|
+
def hexChars : Nat := 32 -- an address in the 8-bit hex form fixed by RFC 9562 §5.8
|
|
106
|
+
def hexbitChars : Nat := 22 -- the same address over the 64-hexagram lattice
|
|
107
|
+
def hexMs : Nat := 16 -- median ms for 200,000 encodings, 8-bit table
|
|
108
|
+
def hexbitMs : Nat := 30 -- the same work, 6-bit lattice
|
|
109
|
+
|
|
110
|
+
-- Shorter: 22 against 32 is a 31% reduction, and that IS what hexbits unlock.
|
|
111
|
+
theorem hexbits_are_shorter_than_hex :
|
|
112
|
+
hexbitChars < hexChars ∧ hexChars - hexbitChars = 10 ∧ hexbitChars * 100 / hexChars = 68 := by decide
|
|
113
|
+
|
|
114
|
+
-- And slower: the same encodings cost 30 ms against 16, so the density is bought with time, not given.
|
|
115
|
+
theorem hexbits_are_slower_than_hex :
|
|
116
|
+
hexbitMs > hexMs ∧ hexbitMs * 10 / hexMs = 18 := by decide
|
|
117
|
+
|
|
118
|
+
-- A theorem named `an_encoding_changes_width_not_the_count_of_operations` stood here and is DELETED. It
|
|
119
|
+
-- decided `22 < 32 ∧ 30 > 16 ∧ (1048576 / 20 = 52428 ∧ 1048576 / 20 = 52428)`. The first two conjuncts are
|
|
120
|
+
-- already proved directly above; the third is X ∧ X, a tautology, written by someone who had spent the day
|
|
121
|
+
-- removing tautologies. And the NAME asserted something about the COUNT OF OPERATIONS that the proposition
|
|
122
|
+
-- never mentions — a name claiming more than its proposition decides, which is the defect this deposit
|
|
123
|
+
-- widened a whole check to catch and then committed anyway.
|
|
124
|
+
--
|
|
125
|
+
-- The refusal it was trying to make is true and belongs in prose, where it is not dressed as arithmetic: an
|
|
126
|
+
-- encoding changes how many characters carry a value, not how many operations are performed. §7 above proves
|
|
127
|
+
-- the operation-count claim; the two theorems above prove the width and the cost. Nothing was lost.
|
|
128
|
+
|
|
129
|
+
end Speed
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
-- title: The digit split
|
|
2
|
+
-- wing: the ring
|
|
3
|
+
-- prior_art: named
|
|
4
|
+
-- prior_art_domain: elementary number theory — the unit group of ℤ/9
|
|
5
|
+
-- prior_art_note: the classification this file rests on is standard and is credited: the units of ℤ/9 are
|
|
6
|
+
-- {1,2,4,5,7,8} and the non-units {0,3,6}, exactly the residues coprime to 9. That is textbook abstract
|
|
7
|
+
-- algebra — Wikipedia's "multiplicative group of integers modulo n", and every algebra course. So
|
|
8
|
+
-- `the_singles_are_exactly_the_non_units` and `the_pairs_are_exactly_the_units_in_order` RESTATE known
|
|
9
|
+
-- mathematics and claim nothing.
|
|
10
|
+
-- Stated precisely so the credit does not run past the earlier work: what is NOT claimed as prior art is
|
|
11
|
+
-- the tokenisation itself — reading the digits as 0|12|3|45|6|78|9 by concatenating consecutive units into
|
|
12
|
+
-- two-digit tokens, and the arithmetic that follows from it (every token a multiple of three, closure of
|
|
13
|
+
-- the tokens under addition and multiplication). That arrangement is this deposit's presentation of a
|
|
14
|
+
-- standard fact, and its verification is by exhaustion here. Crediting an earlier author for a
|
|
15
|
+
-- presentation they did not make is the same defect as claiming their result, pointed the other way.
|
|
16
|
+
-- prior_art_search: literature search performed 2026-09-05, terms "units and non-units of Z/9 multiplicative
|
|
17
|
+
-- inverses group of units modulo 9"; prior art found and credited.
|
|
18
|
+
-- prior_art_pool: mixed
|
|
19
|
+
-- the digit grouping is generic arithmetic; the coin accounting it feeds is this deposit's.
|
|
20
|
+
-- BOUNDED means a search is well posed and simply has not been run — the row is unclassified because
|
|
21
|
+
-- nobody looked. UNBOUNDED means the subject is this artifact, so there is no pool to search and the
|
|
22
|
+
-- row will stay unclassified however much work is done. They look identical in a count and need
|
|
23
|
+
-- opposite responses, which is the distinction uuidna-49 asked for and nobody had drawn.
|
|
24
|
+
-- prior_art_own: the digit grouping 0|12|3|45|6|78|9 as this deposit reads it
|
|
25
|
+
-- The ten digits read in order and grouped 0 | 12 | 3 | 45 | 6 | 78 | 9 — and what that grouping is.
|
|
26
|
+
-- Author: Tsvetan Rouschev · License: CC BY-NC-ND 4.0
|
|
27
|
+
--
|
|
28
|
+
-- Written out, the digits 0..9 split into seven tokens that alternate single, pair, single, pair, single,
|
|
29
|
+
-- pair, single:
|
|
30
|
+
--
|
|
31
|
+
-- 0 12 3 45 6 78 9
|
|
32
|
+
--
|
|
33
|
+
-- The grouping is not a choice. The singles {0,3,6,9} are exactly the NON-UNITS of ℤ/9 together with the
|
|
34
|
+
-- void — the digits with no multiplicative inverse, gcd(d,9) ≠ 1 — and the pairs {12,45,78} are exactly the
|
|
35
|
+
-- units {1,2,4,5,7,8} in consecutive order, each pair sitting between two non-units. The alternation IS the
|
|
36
|
+
-- unit / non-unit alternation of the ring, read off the number line.
|
|
37
|
+
--
|
|
38
|
+
-- And every token, single or pair, is a multiple of three:
|
|
39
|
+
--
|
|
40
|
+
-- 0 = 3·0 3 = 3·1 6 = 3·2 9 = 3·3 the singles, 3·0 through 3·3
|
|
41
|
+
-- 12 = 3·4 45 = 3·15 78 = 3·26 the pairs
|
|
42
|
+
--
|
|
43
|
+
-- So the split is the ideal 3ℤ, twice over: the singles because they are the non-units, and the pairs
|
|
44
|
+
-- because concatenating each consecutive unit pair lands back inside it. The set is closed under addition,
|
|
45
|
+
-- subtraction and multiplication, and DIVISION IS THE ONE OPERATION THAT LEAVES IT — 12/3 = 4, 45/9 = 5,
|
|
46
|
+
-- 6/3 = 2 are all outside. That asymmetry is the content: three of the four operations keep the structure
|
|
47
|
+
-- and the fourth is how you get out of it.
|
|
48
|
+
--
|
|
49
|
+
-- Everything below is decided over the whole set; nothing is asserted about digits in general.
|
|
50
|
+
|
|
51
|
+
namespace Split
|
|
52
|
+
|
|
53
|
+
def tokens : List Nat := [0, 12, 3, 45, 6, 78, 9]
|
|
54
|
+
def singles : List Nat := [0, 3, 6, 9]
|
|
55
|
+
def pairs : List Nat := [12, 45, 78]
|
|
56
|
+
def unitsOf9 : List Nat := [1, 2, 4, 5, 7, 8]
|
|
57
|
+
|
|
58
|
+
-- ── THE GROUPING IS THE RING'S OWN, not a reading imposed on it ──────────────────────────────────────────
|
|
59
|
+
-- A digit is a unit of ℤ/9 exactly when some other digit multiplies with it to 1. The singles are precisely
|
|
60
|
+
-- the digits for which no such partner exists.
|
|
61
|
+
def isUnit9 (d : Nat) : Bool := (List.range 9).any (fun e => (d * e) % 9 == 1)
|
|
62
|
+
|
|
63
|
+
theorem the_singles_are_exactly_the_non_units :
|
|
64
|
+
((List.range 10).filter (fun d => ! isUnit9 d)) = [0, 3, 6, 9]
|
|
65
|
+
∧ singles = [0, 3, 6, 9] := by decide
|
|
66
|
+
|
|
67
|
+
theorem the_pairs_are_exactly_the_units_in_order :
|
|
68
|
+
((List.range 10).filter isUnit9) = unitsOf9
|
|
69
|
+
∧ unitsOf9 = [1, 2, 4, 5, 7, 8] := by decide
|
|
70
|
+
|
|
71
|
+
-- Each pair is two CONSECUTIVE units, and the concatenation is what the token spells.
|
|
72
|
+
theorem each_pair_is_two_consecutive_units :
|
|
73
|
+
12 = 1 * 10 + 2 ∧ 45 = 4 * 10 + 5 ∧ 78 = 7 * 10 + 8
|
|
74
|
+
∧ 2 = 1 + 1 ∧ 5 = 4 + 1 ∧ 8 = 7 + 1 := by decide
|
|
75
|
+
|
|
76
|
+
-- ── EVERY TOKEN IS A MULTIPLE OF THREE ───────────────────────────────────────────────────────────────────
|
|
77
|
+
-- The singles because they are the non-units — 3 ∣ d is the same condition as gcd(d,9) ≠ 1 for a digit —
|
|
78
|
+
-- and the pairs because concatenating a consecutive unit pair lands back inside the ideal.
|
|
79
|
+
theorem every_token_is_a_multiple_of_three :
|
|
80
|
+
tokens.all (fun t => t % 3 == 0) := by decide
|
|
81
|
+
|
|
82
|
+
theorem the_tokens_are_three_times_these :
|
|
83
|
+
tokens.map (fun t => t / 3) = [0, 4, 1, 15, 2, 26, 3] := by decide
|
|
84
|
+
|
|
85
|
+
-- ── CLOSED UNDER THREE OPERATIONS, AND DIVISION IS THE WAY OUT ───────────────────────────────────────────
|
|
86
|
+
-- Addition, subtraction and multiplication keep every result inside the ideal. Subtraction is stated on the
|
|
87
|
+
-- ordered pairs only, since Nat truncates.
|
|
88
|
+
theorem addition_and_multiplication_stay_inside :
|
|
89
|
+
tokens.all (fun a => tokens.all (fun b => (a + b) % 3 == 0 && (a * b) % 3 == 0)) := by decide
|
|
90
|
+
|
|
91
|
+
theorem subtraction_stays_inside :
|
|
92
|
+
tokens.all (fun a => tokens.all (fun b => a < b || (a - b) % 3 == 0)) := by decide
|
|
93
|
+
|
|
94
|
+
-- The contrast, without which the closure above could be read as a property of arithmetic rather than of
|
|
95
|
+
-- this set: division genuinely escapes, and here are the exact quotients that do it.
|
|
96
|
+
theorem division_is_the_operation_that_leaves :
|
|
97
|
+
12 / 3 = 4 ∧ 4 % 3 != 0
|
|
98
|
+
∧ 45 / 9 = 5 ∧ 5 % 3 != 0
|
|
99
|
+
∧ 6 / 3 = 2 ∧ 2 % 3 != 0 := by decide
|
|
100
|
+
|
|
101
|
+
-- ── THE DIGITAL ROOTS LAND ON THE TRINITY AND THE VOID ───────────────────────────────────────────────────
|
|
102
|
+
-- Reducing each token mod 9 sends it to {0,3,6,9} — the same four digits the singles already are. The
|
|
103
|
+
-- grouping is fixed by the reduction it survives.
|
|
104
|
+
theorem the_roots_are_the_singles :
|
|
105
|
+
tokens.map (fun t => t % 9) = [0, 3, 3, 0, 6, 6, 0] := by decide
|
|
106
|
+
|
|
107
|
+
theorem every_root_is_a_single :
|
|
108
|
+
tokens.all (fun t => singles.contains (if t % 9 == 0 then (if t == 0 then 0 else 9) else t % 9)) := by decide
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
-- ── ACCOUNTING THE TWO COINS ─────────────────────────────────────────────────────────────────────────────
|
|
112
|
+
-- The deposit's fair-exchange unit is TWO coins — 110 − 108 = 2 = −χ for genus 2, conserved per receipt.
|
|
113
|
+
-- Deducting them from a token's multiplier is deducting 3·2 = 6 from the token itself, because every token
|
|
114
|
+
-- is 3k: 78 = 3·26 becomes 3·(26−2) = 72, and 72 = 8·9.
|
|
115
|
+
--
|
|
116
|
+
-- Repeated deduction then sorts the seven into exactly two classes, and the sorting is not by size:
|
|
117
|
+
--
|
|
118
|
+
-- 0, 6, 12, 78 reach the void — 78 in thirteen deductions, 78 = 6·13
|
|
119
|
+
-- 3, 45, 9 halt at 3 and cannot pay again
|
|
120
|
+
--
|
|
121
|
+
-- A token is exhaustible by the coin exactly when 6 divides it, and every token that is not halts on THREE —
|
|
122
|
+
-- the generator of the ideal the whole split lives in. The coin cannot spend the generator.
|
|
123
|
+
def coins : Nat := 2
|
|
124
|
+
def coinStep : Nat := 3 * coins
|
|
125
|
+
|
|
126
|
+
theorem the_coin_step_is_three_times_the_two_coins :
|
|
127
|
+
coins = 2 ∧ coinStep = 6 ∧ coinStep = 3 * 2 := by decide
|
|
128
|
+
|
|
129
|
+
theorem accounting_the_coins_on_the_last_pair :
|
|
130
|
+
78 = 3 * 26 ∧ 3 * (26 - coins) = 72 ∧ 72 = 8 * 9 := by decide
|
|
131
|
+
|
|
132
|
+
-- The two classes, named rather than counted.
|
|
133
|
+
theorem the_exhaustible_tokens_are_those_six_divides :
|
|
134
|
+
(tokens.filter (fun t => t % coinStep == 0)) = [0, 12, 6, 78] := by decide
|
|
135
|
+
|
|
136
|
+
theorem the_rest_halt_on_the_generator :
|
|
137
|
+
(tokens.filter (fun t => t % coinStep != 0)) = [3, 45, 9]
|
|
138
|
+
∧ (tokens.filter (fun t => t % coinStep != 0)).all (fun t => t % coinStep == 3) := by decide
|
|
139
|
+
|
|
140
|
+
-- Every token falls in one class or the other: there is no third remainder, which is what makes the
|
|
141
|
+
-- partition a partition and not a pair of examples.
|
|
142
|
+
theorem every_token_is_void_bound_or_halts_on_three :
|
|
143
|
+
tokens.all (fun t => t % coinStep == 0 || t % coinStep == 3) := by decide
|
|
144
|
+
|
|
145
|
+
-- I tried to write the opposite of this and the kernel refused it. The claim was that a bare step of 2
|
|
146
|
+
-- sorts the seven differently from the coin step of 3·2 — that the scaling into the ideal is what does the
|
|
147
|
+
-- work. It is FALSE, and the reason is the better fact: every token is already a multiple of three, so
|
|
148
|
+
-- 2 ∣ t and 6 ∣ t are the SAME condition here. The coin does not need to be scaled to sort them; the ideal
|
|
149
|
+
-- has already done that half of the work.
|
|
150
|
+
theorem inside_this_ideal_the_bare_coin_sorts_as_the_scaled_one :
|
|
151
|
+
(tokens.filter (fun t => t % 2 == 0)) = (tokens.filter (fun t => t % coinStep == 0))
|
|
152
|
+
∧ tokens.all (fun t => (t % 2 == 0) == (t % coinStep == 0)) := by decide
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
-- ── WHAT PAYING THE COINS UNLOCKS ────────────────────────────────────────────────────────────────────────
|
|
157
|
+
-- The captain's receipt says "contribute 2 to save 64", and mechanical.lean already decides the arithmetic
|
|
158
|
+
-- of it: 2⁶ = 64. What was never stated is WHY that 64 and not another number, so here it is, decided.
|
|
159
|
+
--
|
|
160
|
+
-- A seal is 128 bits. One verification costs the two coins — 2 bits, 110 − 108 = −χ for genus 2 — so a
|
|
161
|
+
-- single seal holds 128 / 2 = 64 of them. And 64 is not an arbitrary budget: it is exactly where the
|
|
162
|
+
-- doubling returns. The powers of two reduce mod 9 as 1, 2, 4, 8, 7, 5 and then 64 ≡ 1 — the first return,
|
|
163
|
+
-- with no earlier one. So the 64 verifications a seal affords are ONE COMPLETE TURN of the same doubling
|
|
164
|
+
-- orbit the whole deposit is built on, and paying the two coins buys exactly one step of it.
|
|
165
|
+
def sealBits : Nat := 128
|
|
166
|
+
|
|
167
|
+
theorem the_seal_affords_sixty_four_payments_of_two :
|
|
168
|
+
sealBits / coins = 64 ∧ 64 = 2 ^ 6 ∧ sealBits = 64 * coins := by decide
|
|
169
|
+
|
|
170
|
+
theorem sixty_four_is_where_the_doubling_returns :
|
|
171
|
+
(2 ^ 6) % 9 = 1
|
|
172
|
+
∧ ((List.range 6).map (fun k => (2 ^ k) % 9)) = [1, 2, 4, 8, 7, 5]
|
|
173
|
+
∧ ((List.range' 1 5).all (fun k => (2 ^ k) % 9 != 1)) := by decide
|
|
174
|
+
|
|
175
|
+
-- The two readings meet: the budget a seal affords and the period of the orbit are the same six.
|
|
176
|
+
theorem the_budget_and_the_period_are_one_turn :
|
|
177
|
+
sealBits / coins = 2 ^ 6 ∧ (2 ^ 6) % 9 = 1 := by decide
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
end Split
|
package/src/proof/theorems.lean
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
-- title: Theorems
|
|
2
|
+
-- wing: the machine
|
|
3
|
+
-- prior_art: named
|
|
4
|
+
-- prior_art_domain: the method of complements
|
|
5
|
+
-- prior_art_note: the universal reflection here is the same ten's complement d ↦ 10 − d as coin.lean, with its centre and its pairs summing to ten. Method of complements, long prior to this deposit. Searched 2026-09-04
|
|
6
|
+
-- prior_art_search: literature search performed 2026-09-04 — see the note for the terms and the result
|
|
1
7
|
-- The universal property — honestly, and COMPUTED from the sequence.
|
|
2
|
-
-- Author: Tsvetan Rouschev · License: CC BY-NC 4.0
|
|
8
|
+
-- Author: Tsvetan Rouschev · License: CC BY-NC-ND 4.0
|
|
3
9
|
--
|
|
4
10
|
-- The earlier `all_alpha_squared_one` asserted that the seven statements "share α² = 1" — a vacuity (1² = 1
|
|
5
11
|
-- copy-pasted). What the seven ACTUALLY share is the reflection: an involution the sequence computes, with one
|
|
@@ -17,4 +23,45 @@ theorem universal_reflection_involution :
|
|
|
17
23
|
∧ ((List.range 10).filter (fun d => refl d == d)).length = 1 -- exactly ONE shared centre (the heart), computed
|
|
18
24
|
:= by decide
|
|
19
25
|
|
|
26
|
+
-- ── the centre, NAMED rather than counted ──
|
|
27
|
+
-- The theorem above proves there is exactly ONE centre. A count is not an identification: it says a heart
|
|
28
|
+
-- exists without saying where it beats. Here it is, computed — the filter returns the singleton [5].
|
|
29
|
+
theorem universal_centre_is_five :
|
|
30
|
+
((List.range 10).filter (fun d => refl d == d)) = [5] := by decide
|
|
31
|
+
|
|
32
|
+
-- ── what the reflection conserves ──
|
|
33
|
+
-- Every residue and its reflection sum to ten. This is the reason there is exactly one centre: a fixed point
|
|
34
|
+
-- needs d + d = 10, and 10 is even, so exactly one d satisfies it. The conservation law is the whole structure.
|
|
35
|
+
theorem universal_pairs_sum_to_ten :
|
|
36
|
+
(List.range 11).all (fun d => d + refl d == 10) := by decide
|
|
37
|
+
|
|
38
|
+
-- ── the reflection is a bijection of the domain, computed as an ordering ──
|
|
39
|
+
-- Stronger than the involution and cheaper than a permutation argument: the image of 0…10 under the
|
|
40
|
+
-- reflection IS 0…10 read backwards. Nothing is lost and nothing is repeated, and the witness is an equation.
|
|
41
|
+
theorem universal_reflection_reverses_the_domain :
|
|
42
|
+
(List.range 11).map refl = (List.range 11).reverse := by decide
|
|
43
|
+
|
|
44
|
+
-- ── WHERE IT STOPS. The involution is not universal over ℕ, and the boundary is stated, not hidden ──
|
|
45
|
+
-- Natural subtraction truncates: above ten, `refl d` is 0 and `refl (refl d)` is 10 for every input. So the
|
|
46
|
+
-- involution holds on 0…10 and FAILS at every residue above it. The first theorem says `List.range 11` and
|
|
47
|
+
-- means it. A boundary you can compute is a boundary you have not overclaimed past.
|
|
48
|
+
theorem universal_reflection_is_not_an_involution_above_ten :
|
|
49
|
+
((List.range 10).map (fun k => k + 11)).all (fun d => ¬ (refl (refl d) == d)) := by decide
|
|
50
|
+
|
|
51
|
+
-- ── the vortex has its OWN reflection, and it is a different map ──
|
|
52
|
+
-- ℤ/9 reflects by d ↦ (9 − d) mod 9. That map permutes the six units among themselves. The millennium
|
|
53
|
+
-- reflection does NOT stay inside them: it sends the unit 1 to 9, which is not a unit. Two reflections, two domains.
|
|
54
|
+
theorem universal_z9_reflection_permutes_the_units :
|
|
55
|
+
([1, 2, 4, 5, 7, 8].map (fun d => (9 - d) % 9)) = [8, 7, 5, 4, 2, 1] := by decide
|
|
56
|
+
|
|
57
|
+
theorem universal_millennium_reflection_escapes_the_units :
|
|
58
|
+
¬ ([1, 2, 4, 5, 7, 8].all (fun u => [1, 2, 4, 5, 7, 8].contains (refl u))) := by decide
|
|
59
|
+
|
|
60
|
+
-- ── and yet they are the SAME map, shifted by one ──
|
|
61
|
+
-- This is what the singleton family was standing on alone. Reduced mod nine, the millennium reflection is the
|
|
62
|
+
-- vortex reflection plus one, at every residue 0…9. The shared structure the seven framings borrow is not a
|
|
63
|
+
-- separate object: it is ℤ/9's own involution, displaced by a single step. Still not a proof of any conjecture.
|
|
64
|
+
theorem universal_reflection_is_the_vortex_reflection_shifted :
|
|
65
|
+
(List.range 10).all (fun d => (10 - d) % 9 == ((9 - d) % 9 + 1) % 9) := by decide
|
|
66
|
+
|
|
20
67
|
end MillenniumFloor.Universal
|