@ceccec/millennium-solutions 9.3.3 → 9.3.5
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/README.md +29 -15
- package/dist/mod.core.d.ts +9 -0
- package/dist/mod.core.js +9 -0
- package/dist/src/0/index.d.ts +47 -0
- package/dist/src/0/index.js +189 -0
- package/dist/src/0/ledger.d.ts +1 -0
- package/dist/src/0/ledger.js +25 -0
- package/dist/src/0/trinity-matrix.d.ts +1 -0
- package/dist/src/0/trinity-matrix.js +16 -0
- package/dist/src/5/aspects.d.ts +1 -0
- package/dist/src/5/aspects.js +22 -0
- package/dist/src/5/reflection.d.ts +1 -0
- package/dist/src/5/reflection.js +25 -0
- package/dist/src/7/rosetta.d.ts +1 -0
- package/dist/src/7/rosetta.js +24 -0
- package/dist/src/9/enumeration.d.ts +1 -0
- package/dist/src/9/enumeration.js +14 -0
- package/dist/src/honesty/index.d.ts +16 -0
- package/dist/src/honesty/index.js +69 -0
- package/package.json +27 -10
- package/.zenodo.json +0 -51
- package/ABSTRACT.md +0 -155
- package/ACCOUNTING.md +0 -27
- package/AXIOMS.md +0 -574
- package/CHALLENGES.md +0 -2595
- package/DEPLOY.md +0 -39
- package/DEVELOP.md +0 -34
- package/HEART.md +0 -112
- package/PHYSICS-SCALES.md +0 -80
- package/PRIOR-ART.md +0 -151
- package/PROOF-OF-CONCEPT.md +0 -81
- package/REALISATIONS.md +0 -87
- package/RESEARCH.md +0 -188
- package/RULES.md +0 -57
- package/SEQUENCE-DECODE.md +0 -196
- package/SIGNATURE.md +0 -34
- package/THEOREMS.md +0 -97
- package/WHITEPAPER.md +0 -40
- package/WORKFLOWS.md +0 -47
- package/boundaries.md +0 -23
- package/captain.md +0 -85
- package/compare.md +0 -42
- package/compute.md +0 -543
- package/cryptography.md +0 -55
- package/dashboard.md +0 -50
- package/examples.md +0 -47
- package/folds.md +0 -65
- package/forensic.md +0 -67
- package/guide.md +0 -126
- package/harness.md +0 -20
- package/index.md +0 -217
- package/mod.core.ts +0 -10
- package/nature.md +0 -58
- package/organism.md +0 -30
- package/paper.md +0 -8789
- package/proofs.md +0 -26
- package/quantum.md +0 -40
- package/rights.md +0 -39
- package/solutions.md +0 -28
- package/speedup.md +0 -41
- package/src/0/chacha.ts +0 -3
- package/src/0/crypt.ts +0 -4
- package/src/0/csp.ts +0 -10
- package/src/0/entanglement.ts +0 -31
- package/src/0/fusion.ts +0 -28
- package/src/0/holographic.ts +0 -57
- package/src/0/impossible.ts +0 -30
- package/src/0/imprint.ts +0 -160
- package/src/0/index.ts +0 -263
- package/src/0/ledger.ts +0 -25
- package/src/0/legible.ts +0 -29
- package/src/0/limit.ts +0 -29
- package/src/0/merkle-proof.ts +0 -3
- package/src/0/null-token.ts +0 -24
- package/src/0/sha256.ts +0 -3
- package/src/0/singularity.ts +0 -20
- package/src/0/stream.ts +0 -47
- package/src/0/trinities.ts +0 -37
- package/src/0/trinity-matrix.ts +0 -20
- package/src/0/version-matrix.ts +0 -70
- package/src/1/acceptance.ts +0 -26
- package/src/1/index.ts +0 -80
- package/src/1/paradox.ts +0 -28
- package/src/1/vortex.lean +0 -6
- package/src/2/frequency-scales.ts +0 -28
- package/src/2/iching.ts +0 -34
- package/src/2/index.ts +0 -78
- package/src/2/primes-vortex.ts +0 -12
- package/src/2/quantum.ts +0 -48
- package/src/2/string-scale.ts +0 -14
- package/src/2/vortex.lean +0 -10
- package/src/3/index.ts +0 -63
- package/src/3/pi-bbp.ts +0 -13
- package/src/3/trinity.ts +0 -39
- package/src/3/vortex.lean +0 -7
- package/src/4/git.ts +0 -30
- package/src/4/index.ts +0 -63
- package/src/4/vortex.lean +0 -6
- package/src/5/aspects.ts +0 -27
- package/src/5/center.ts +0 -35
- package/src/5/development.ts +0 -45
- package/src/5/diamond.ts +0 -35
- package/src/5/folds.ts +0 -12
- package/src/5/index.ts +0 -63
- package/src/5/reflection.lean +0 -14
- package/src/5/reflection.ts +0 -14
- package/src/5/vortex.lean +0 -10
- package/src/6/dna.ts +0 -27
- package/src/6/index.ts +0 -63
- package/src/6/vortex.lean +0 -7
- package/src/7/cross.ts +0 -31
- package/src/7/glagolitic.ts +0 -51
- package/src/7/index.ts +0 -67
- package/src/7/language-lens.ts +0 -41
- package/src/7/lens.ts +0 -41
- package/src/7/locale.ts +0 -105
- package/src/7/rbac.ts +0 -31
- package/src/7/rosetta-clay.ts +0 -15
- package/src/7/rosetta.lean +0 -11
- package/src/7/rosetta.ts +0 -11
- package/src/7/string-dimensions.ts +0 -14
- package/src/7/vortex.lean +0 -6
- package/src/8/infinite.ts +0 -26
- package/src/8/merkaba/field.ts +0 -27
- package/src/8/merkaba/geometry.ts +0 -16
- package/src/8/merkaba/touch.ts +0 -26
- package/src/8/nucleus/magic.lean +0 -15
- package/src/8/nucleus/proton-mass-fit.ts +0 -9
- package/src/8/nucleus/proton-mass.lean +0 -10
- package/src/8/nucleus/shell-model-magic.ts +0 -10
- package/src/8/vortex.lean +0 -7
- package/src/9/access.ts +0 -34
- package/src/9/aura-funding.ts +0 -25
- package/src/9/coins.ts +0 -25
- package/src/9/enumeration.ts +0 -13
- package/src/9/funding.ts +0 -85
- package/src/9/security.ts +0 -36
- package/src/9/society.ts +0 -32
- package/src/9/vortex.lean +0 -11
- package/src/api/gates.ts +0 -122
- package/src/api/index.ts +0 -447
- package/src/api/lanes.ts +0 -81
- package/src/claims/index.ts +0 -81
- package/src/demand/queries.json +0 -1764
- package/src/face/index.ts +0 -100
- package/src/from/the/heart/index.ts +0 -11
- package/src/honesty/boundaries.ts +0 -29
- package/src/honesty/index.ts +0 -63
- package/src/html/index.ts +0 -10
- package/src/latex/index.ts +0 -474
- package/src/millennium/index.ts +0 -53
- package/src/play/the/game/index.ts +0 -12
- package/src/proof/README.md +0 -118
- package/src/proof/address.lean +0 -168
- package/src/proof/coin.lean +0 -152
- package/src/proof/covered.json +0 -9
- package/src/proof/demand.lean +0 -160
- package/src/proof/demand2.lean +0 -219
- package/src/proof/demand3.lean +0 -209
- package/src/proof/discovered.json +0 -19530
- package/src/proof/elementary.lean +0 -495
- package/src/proof/energy.lean +0 -329
- package/src/proof/families.lean +0 -740
- package/src/proof/fixtures/axiom-control.lean +0 -39
- package/src/proof/flow.lean +0 -78
- package/src/proof/fnv.lean +0 -127
- package/src/proof/generated-theorems.json +0 -207
- package/src/proof/generated.lean +0 -101
- package/src/proof/imagined.lean +0 -492
- package/src/proof/index.lean +0 -156
- package/src/proof/index.ts +0 -916
- package/src/proof/involution.lean +0 -90
- package/src/proof/ledgerclaims.lean +0 -84
- package/src/proof/light.lean +0 -168
- package/src/proof/mechanical.lean +0 -563
- package/src/proof/merkaba.lean +0 -89
- package/src/proof/merkle.lean +0 -132
- package/src/proof/nim.lean +0 -332
- package/src/proof/novelty.json +0 -751
- package/src/proof/phenomena.lean +0 -90
- package/src/proof/priorart.lean +0 -190
- package/src/proof/quantum.lean +0 -159
- package/src/proof/reach.lean +0 -121
- package/src/proof/recovered.lean +0 -56
- package/src/proof/reversal.lean +0 -402
- package/src/proof/revoked.json +0 -317
- package/src/proof/rights.lean +0 -155
- package/src/proof/sequences.lean +0 -284
- package/src/proof/speed.lean +0 -158
- package/src/proof/split.lean +0 -209
- package/src/proof/theorems.lean +0 -67
- package/src/proof/trial-all.json +0 -16532
- package/src/proof/z9.lean +0 -126
- package/src/proof/z9plus.lean +0 -345
- package/src/proofs.lisp +0 -170
- package/src/prove/emit.ts +0 -115
- package/src/prove/index.ts +0 -143
- package/src/prove/translate.ts +0 -638
- package/src/publication/index.ts +0 -362
- package/src/quantum/field.ts +0 -73
- package/src/quantum/tree.ts +0 -79
- package/src/receipts/1431b4c4-7950-8d7b-88d1-b633219692f8.json +0 -7
- package/src/receipts/171e09c0-4cfd-8ce0-a6ed-cd33d5553da3.json +0 -7
- package/src/receipts/1a1f16c9-3491-8050-b221-e2a362439be4.json +0 -12
- package/src/receipts/1da15f83-83a6-8d04-b1ac-334c2dd6abb3.json +0 -7
- package/src/receipts/375a57ed-ef99-855e-8f34-b77d08010f3c.json +0 -6
- package/src/receipts/3dcbbf9e-0e49-8ba7-921e-17e478dbafaf.json +0 -6
- package/src/receipts/43a24136-5ad9-81ef-97c9-17be1c05bb5f.json +0 -11
- package/src/receipts/4991be51-74ba-8f66-9534-e6dba52fb569.json +0 -10
- package/src/receipts/52375d8f-232b-8c01-9d82-a824ffa7b2b7.json +0 -6
- package/src/receipts/593b546a-36b4-8553-941a-0e03b7053a64.json +0 -7
- package/src/receipts/7f75c989-96c9-8a24-8d0d-7e690861ccb4.json +0 -6
- package/src/receipts/80f80b59-81d8-866d-9a14-f469729d3dc8.json +0 -6
- package/src/receipts/85ac8585-9dc1-8964-9848-ae0f49cc82fb.json +0 -7
- package/src/receipts/85db092e-f2c0-88e5-bf75-61c4a65d84e7.json +0 -7
- package/src/receipts/95bacad3-9e56-8741-b0f8-def2c6ecb050.json +0 -7
- package/src/receipts/a1d33966-7bbd-84ca-902b-49e315af60e0.json +0 -6
- package/src/receipts/b20ced61-24ad-8123-adee-56031ab734dd.json +0 -11
- package/src/receipts/ba0447cd-f489-841a-a70f-a39b18ec2946.json +0 -11
- package/src/receipts/bcddbe66-06cf-8f31-a261-98b836938947.json +0 -7
- package/src/receipts/c1bac0d8-d906-8196-a4f0-3d8270b2e944.json +0 -6
- package/src/receipts/ce851ea3-3cf8-8646-a5d6-c0c6281210fe.json +0 -10
- package/src/receipts/cf43a122-c880-8d86-9e25-6f22f92d6b0a.json +0 -7
- package/src/receipts/daad8cd4-d4db-8dca-9c97-9a838cbce528.json +0 -7
- package/src/receipts/dc8bdb82-599f-8020-9eb2-cb016b408ec1.json +0 -6
- package/src/receipts/df77c265-d1a8-8354-8a9e-769fa5c676e2.json +0 -6
- package/src/receipts/e96686da-a411-8838-a5c8-ee7472bce048.json +0 -10
- package/src/receipts/f073c46f-7b67-83d0-aca5-db11fac4b5ec.json +0 -7
- package/src/receipts/f946d99d-a1c2-89f7-9426-a367c5b04191.json +0 -6
- package/src/receipts/fc069e45-115d-8983-ad25-fb9f735da84b.json +0 -6
- package/src/the/abstract/index.ts +0 -21
- package/src/the/abundance/index.ts +0 -20
- package/src/the/apple/earth/index.ts +0 -23
- package/src/the/apple/earth/navigation/index.ts +0 -28
- package/src/the/apple/earth/truth/index.ts +0 -19
- package/src/the/apple/index.ts +0 -27
- package/src/the/cancer/index.ts +0 -26
- package/src/the/clown/index.ts +0 -25
- package/src/the/creation/index.ts +0 -16
- package/src/the/crystal/index.ts +0 -23
- package/src/the/domain/index.ts +0 -16
- package/src/the/game/index.ts +0 -11
- package/src/the/gold/compass/index.ts +0 -26
- package/src/the/gold/index.ts +0 -35
- package/src/the/heart/index.ts +0 -15
- package/src/the/index.ts +0 -23
- package/src/the/law/index.ts +0 -20
- package/src/the/path/index.ts +0 -19
- package/src/the/rosetta/index.ts +0 -33
- package/src/the/sequence/index.ts +0 -12
- package/src/the/solids/index.ts +0 -25
- package/src/the/state/index.ts +0 -20
- package/src/the/superposition/state/index.ts +0 -22
- package/src/the/surface/index.ts +0 -26
- package/src/the/theorem/index.ts +0 -14
- package/src/the/torus/index.ts +0 -23
- package/src/the/waves/index.ts +0 -23
- package/the.md +0 -20
- package/verify.md +0 -67
package/src/proof/reversal.lean
DELETED
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
-- title: Digit reversal
|
|
2
|
-
-- wing: the machine
|
|
3
|
-
-- prior_art: named
|
|
4
|
-
-- prior_art_domain: elementary arithmetic
|
|
5
|
-
-- prior_art_note: digit reversal and digit sums; casting out nines, in use by the 12th century
|
|
6
|
-
-- Digit reversal — arithmetic, not string handling.
|
|
7
|
-
set_option maxRecDepth 200000
|
|
8
|
-
-- Author: Tsvetan Rouschev · License: CC BY-NC-ND 4.0
|
|
9
|
-
--
|
|
10
|
-
-- An earlier pass called this family "not generatable: needs string manipulation, no small decidable form".
|
|
11
|
-
-- That was wrong. A digit is arithmetic — n % 10 and n / 10 — so reversal is a structural fold with no strings
|
|
12
|
-
-- anywhere. The mathematics is real too: the digital root is a function of the digit SUM, and reversal is a
|
|
13
|
-
-- permutation of the digits, so invariance under reversal is a THEOREM rather than a coincidence. That is
|
|
14
|
-
-- exactly what makes emirps — primes whose reversal is also prime — a meaningful class rather than a curio.
|
|
15
|
-
-- No axioms, no Mathlib, no sorry.
|
|
16
|
-
|
|
17
|
-
namespace Reversal
|
|
18
|
-
|
|
19
|
-
/-- Digits, least significant first. Fuel-bounded so the recursion is structural: Nat.div is well-founded and
|
|
20
|
-
would drag `propext` into every theorem below (that hazard cost two theorems in an earlier batch). -/
|
|
21
|
-
def digitsF : Nat → Nat → List Nat
|
|
22
|
-
| 0, _ => []
|
|
23
|
-
| _, 0 => []
|
|
24
|
-
| Nat.succ f, n => (n % 10) :: digitsF f (n / 10)
|
|
25
|
-
|
|
26
|
-
def digits (n : Nat) : List Nat := if n == 0 then [0] else digitsF (n + 1) n
|
|
27
|
-
def reverseNum (n : Nat) : Nat := (digits n).foldl (fun a d => a * 10 + d) 0
|
|
28
|
-
def digitSum (n : Nat) : Nat := (digits n).foldl (· + ·) 0
|
|
29
|
-
|
|
30
|
-
-- ── reversal is a permutation of the digits, so it preserves their sum ──
|
|
31
|
-
theorem reversal_preserves_digit_sum :
|
|
32
|
-
(List.range' 1 300).all (fun n => digitSum (reverseNum n) == digitSum n) := by decide
|
|
33
|
-
|
|
34
|
-
-- ── and therefore preserves the residue mod 9 — the digital root is invariant under reversal ──
|
|
35
|
-
theorem digital_root_is_invariant_under_reversal :
|
|
36
|
-
(List.range' 1 300).all (fun n => (reverseNum n) % 9 == n % 9) := by decide
|
|
37
|
-
|
|
38
|
-
-- ── the ledger's own cases, now stated rather than asserted ──
|
|
39
|
-
theorem the_ledger_reversal_cases :
|
|
40
|
-
(reverseNum 12) % 9 == 12 % 9 ∧ (reverseNum 45) % 9 == 45 % 9
|
|
41
|
-
∧ (reverseNum 123) % 9 == 123 % 9 ∧ (reverseNum 1234) % 9 == 1234 % 9
|
|
42
|
-
∧ (reverseNum 4321) % 9 == 4321 % 9 ∧ (reverseNum 9080) % 9 == 9080 % 9 := by decide
|
|
43
|
-
|
|
44
|
-
-- ── NON-VACUITY: reversal genuinely moves the number, so the invariance is not about a fixed point ──
|
|
45
|
-
theorem reversal_is_not_the_identity :
|
|
46
|
-
¬ ((List.range' 10 90).all (fun n => reverseNum n == n)) := by decide
|
|
47
|
-
|
|
48
|
-
-- ── palindromes are exactly the fixed points, and there are nine of them below 100 ──
|
|
49
|
-
theorem palindromes_are_the_fixed_points :
|
|
50
|
-
((List.range' 10 90).filter (fun n => reverseNum n == n)).length = 9 := by decide
|
|
51
|
-
|
|
52
|
-
-- ── EMIRPS: primes whose reversal is also prime — where reversal meets the primes ──
|
|
53
|
-
def isPrime (n : Nat) : Bool := n > 1 && (List.range n).all (fun d => d < 2 || n % d != 0)
|
|
54
|
-
|
|
55
|
-
theorem emirps_exist_below_one_hundred :
|
|
56
|
-
((List.range' 10 90).filter (fun n => isPrime n && isPrime (reverseNum n) && reverseNum n != n)).length > 0 := by decide
|
|
57
|
-
|
|
58
|
-
-- ── and reversal does NOT preserve primality in general: the boundary that makes emirps a real class ──
|
|
59
|
-
theorem reversal_does_not_preserve_primality :
|
|
60
|
-
¬ ((List.range' 10 90).all (fun n => isPrime n == isPrime (reverseNum n))) := by decide
|
|
61
|
-
|
|
62
|
-
-- ── WHERE REVERSAL STOPS BEING AN INVOLUTION. Reversing twice usually returns the number — but not always:
|
|
63
|
-
-- a trailing zero is destroyed by the first reversal and cannot be restored by the second (120 → 021 = 21
|
|
64
|
-
-- → 12). So reversal is self-inverse EXACTLY on the numbers with no trailing zero, and the iff is decided
|
|
65
|
-
-- in both directions across the range, not asserted for the convenient half. The exception is the whole
|
|
66
|
-
-- content of the theorem: an involution that quietly fails on a tenth of its domain is not an involution.
|
|
67
|
-
theorem reversal_is_involutive_exactly_off_the_trailing_zeros :
|
|
68
|
-
(List.range' 1 300).all (fun n => (reverseNum (reverseNum n) == n) == (n % 10 != 0)) := by decide
|
|
69
|
-
|
|
70
|
-
def settledHere : Nat := 8
|
|
71
|
-
theorem reversal_settles_its_range : settledHere = 8 := rfl
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
-- ── the capped rows above, proved for every value by induction — no bound ────────────────────────────────────
|
|
75
|
-
-- casting out nines, in general: a number, its digit sum and its reversal share their residue mod 9.
|
|
76
|
-
theorem foldl_add_start : ∀ (l : List Nat) (a : Nat), l.foldl (· + ·) a = a + l.foldl (· + ·) 0 := by
|
|
77
|
-
intro l
|
|
78
|
-
induction l with
|
|
79
|
-
| nil => intro a; simp
|
|
80
|
-
| cons x xs ih =>
|
|
81
|
-
intro a
|
|
82
|
-
simp only [List.foldl]
|
|
83
|
-
rw [ih (a + x), ih (0 + x)]
|
|
84
|
-
omega
|
|
85
|
-
|
|
86
|
-
theorem the_digits_sum_to_the_number_mod_nine_when_the_fuel_covers_them :
|
|
87
|
-
∀ f n : Nat, n < 10 ^ f → (digitsF f n).foldl (· + ·) 0 % 9 = n % 9 := by
|
|
88
|
-
intro f
|
|
89
|
-
induction f with
|
|
90
|
-
| zero =>
|
|
91
|
-
intro n h
|
|
92
|
-
have : n = 0 := by simp at h; omega
|
|
93
|
-
subst this
|
|
94
|
-
simp [digitsF]
|
|
95
|
-
| succ f ih =>
|
|
96
|
-
intro n h
|
|
97
|
-
cases n with
|
|
98
|
-
| zero => simp [digitsF]
|
|
99
|
-
| succ m =>
|
|
100
|
-
simp only [digitsF, List.foldl]
|
|
101
|
-
rw [foldl_add_start]
|
|
102
|
-
have hlt : (m + 1) / 10 < 10 ^ f := by
|
|
103
|
-
rw [Nat.pow_succ] at h
|
|
104
|
-
omega
|
|
105
|
-
have := ih ((m + 1) / 10) hlt
|
|
106
|
-
omega
|
|
107
|
-
|
|
108
|
-
theorem a_number_is_below_ten_to_its_own_successor : ∀ n : Nat, n < 10 ^ (n + 1) := by
|
|
109
|
-
intro n
|
|
110
|
-
induction n with
|
|
111
|
-
| zero => decide
|
|
112
|
-
| succ n ih =>
|
|
113
|
-
rw [Nat.pow_succ]
|
|
114
|
-
omega
|
|
115
|
-
|
|
116
|
-
theorem the_digit_sum_has_the_residue_of_the_number_mod_nine_for_every_n :
|
|
117
|
-
∀ n : Nat, digitSum n % 9 = n % 9 := by
|
|
118
|
-
intro n
|
|
119
|
-
unfold digitSum digits
|
|
120
|
-
split
|
|
121
|
-
· rename_i h
|
|
122
|
-
have : n = 0 := by simpa using h
|
|
123
|
-
subst this
|
|
124
|
-
rfl
|
|
125
|
-
· exact the_digits_sum_to_the_number_mod_nine_when_the_fuel_covers_them (n + 1) n (a_number_is_below_ten_to_its_own_successor n)
|
|
126
|
-
|
|
127
|
-
theorem folding_by_ten_keeps_the_residue_of_the_digit_sum :
|
|
128
|
-
∀ (l : List Nat) (a : Nat), (l.foldl (fun a d => a * 10 + d) a) % 9 = (a + l.foldl (· + ·) 0) % 9 := by
|
|
129
|
-
intro l
|
|
130
|
-
induction l with
|
|
131
|
-
| nil => intro a; simp
|
|
132
|
-
| cons x xs ih =>
|
|
133
|
-
intro a
|
|
134
|
-
simp only [List.foldl]
|
|
135
|
-
rw [ih (a * 10 + x), foldl_add_start xs (0 + x)]
|
|
136
|
-
omega
|
|
137
|
-
|
|
138
|
-
-- digital_root_is_invariant_under_reversal checked 1 ≤ n ≤ 300; this proves it for every n.
|
|
139
|
-
theorem reversal_keeps_the_residue_mod_nine_for_every_n :
|
|
140
|
-
∀ n : Nat, reverseNum n % 9 = n % 9 := by
|
|
141
|
-
intro n
|
|
142
|
-
have h1 : reverseNum n % 9 = digitSum n % 9 := by
|
|
143
|
-
unfold reverseNum digitSum
|
|
144
|
-
rw [folding_by_ten_keeps_the_residue_of_the_digit_sum]
|
|
145
|
-
simp
|
|
146
|
-
rw [h1, the_digit_sum_has_the_residue_of_the_number_mod_nine_for_every_n]
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
-- ── reflections, from the rev batch: each law beside its inverse (the 2×7 ↔ 1+6 wave) ──
|
|
150
|
-
-- ═══ REFLECTIONS ═══════════════════════════════════════════════════════════════════════════════════════
|
|
151
|
-
theorem digitsF_zero : ∀ f : Nat, digitsF f 0 = [] := by
|
|
152
|
-
intro f; cases f <;> rfl
|
|
153
|
-
|
|
154
|
-
theorem every_digit_is_below_ten : ∀ f n : Nat, ∀ d ∈ digitsF f n, d < 10 := by
|
|
155
|
-
intro f
|
|
156
|
-
induction f with
|
|
157
|
-
| zero => intro n d h; simp [digitsF] at h
|
|
158
|
-
| succ f ih =>
|
|
159
|
-
intro n d h
|
|
160
|
-
cases n with
|
|
161
|
-
| zero => simp [digitsF] at h
|
|
162
|
-
| succ m =>
|
|
163
|
-
simp only [digitsF, List.mem_cons] at h
|
|
164
|
-
rcases h with h | h
|
|
165
|
-
· omega
|
|
166
|
-
· exact ih _ _ h
|
|
167
|
-
|
|
168
|
-
-- the number rebuilt from its digits (reflection of the digit-sum law)
|
|
169
|
-
theorem the_digits_rebuild_the_number_when_the_fuel_covers_them :
|
|
170
|
-
∀ f n : Nat, n < 10 ^ f → (digitsF f n).foldr (fun d a => a * 10 + d) 0 = n := by
|
|
171
|
-
intro f
|
|
172
|
-
induction f with
|
|
173
|
-
| zero =>
|
|
174
|
-
intro n h
|
|
175
|
-
have : n = 0 := by simp at h; omega
|
|
176
|
-
subst this
|
|
177
|
-
simp [digitsF]
|
|
178
|
-
| succ f ih =>
|
|
179
|
-
intro n h
|
|
180
|
-
cases n with
|
|
181
|
-
| zero => simp [digitsF]
|
|
182
|
-
| succ m =>
|
|
183
|
-
simp only [digitsF, List.foldr]
|
|
184
|
-
have hlt : (m + 1) / 10 < 10 ^ f := by
|
|
185
|
-
rw [Nat.pow_succ] at h
|
|
186
|
-
omega
|
|
187
|
-
rw [ih _ hlt]
|
|
188
|
-
omega
|
|
189
|
-
|
|
190
|
-
theorem the_number_is_rebuilt_from_its_digits_for_every_n :
|
|
191
|
-
∀ n : Nat, (digits n).foldr (fun d a => a * 10 + d) 0 = n := by
|
|
192
|
-
intro n
|
|
193
|
-
unfold digits
|
|
194
|
-
split
|
|
195
|
-
· rename_i h
|
|
196
|
-
have : n = 0 := by simpa using h
|
|
197
|
-
subst this
|
|
198
|
-
rfl
|
|
199
|
-
· exact the_digits_rebuild_the_number_when_the_fuel_covers_them (n + 1) n (a_number_is_below_ten_to_its_own_successor n)
|
|
200
|
-
|
|
201
|
-
-- the sum does not see the order (reflection of foldl_add_start)
|
|
202
|
-
theorem a_sum_is_the_same_read_backwards : ∀ (l : List Nat), l.reverse.foldl (· + ·) 0 = l.foldl (· + ·) 0 := by
|
|
203
|
-
intro l
|
|
204
|
-
induction l with
|
|
205
|
-
| nil => rfl
|
|
206
|
-
| cons x xs ih =>
|
|
207
|
-
rw [List.reverse_cons, List.foldl_append, ih]
|
|
208
|
-
simp only [List.foldl]
|
|
209
|
-
rw [foldl_add_start xs (0 + x)]
|
|
210
|
-
omega
|
|
211
|
-
|
|
212
|
-
theorem the_top_digit_is_nonzero :
|
|
213
|
-
∀ f n : Nat, 0 < n → n < 10 ^ f → ∃ L b, digitsF f n = L ++ [b] ∧ 0 < b ∧ b < 10 := by
|
|
214
|
-
intro f
|
|
215
|
-
induction f with
|
|
216
|
-
| zero => intro n h0 h; exfalso; simp at h; omega
|
|
217
|
-
| succ f ih =>
|
|
218
|
-
intro n h0 h
|
|
219
|
-
obtain ⟨m, rfl⟩ : ∃ m, n = m + 1 := ⟨n - 1, by omega⟩
|
|
220
|
-
simp only [digitsF]
|
|
221
|
-
by_cases hq : (m + 1) / 10 = 0
|
|
222
|
-
· refine ⟨[], (m + 1) % 10, ?_, by omega, by omega⟩
|
|
223
|
-
rw [hq, digitsF_zero]
|
|
224
|
-
rfl
|
|
225
|
-
· have hlt : (m + 1) / 10 < 10 ^ f := by
|
|
226
|
-
rw [Nat.pow_succ] at h
|
|
227
|
-
omega
|
|
228
|
-
obtain ⟨L, b, e, hb, hb10⟩ := ih ((m + 1) / 10) (by omega) hlt
|
|
229
|
-
exact ⟨(m + 1) % 10 :: L, b, by rw [e]; rfl, hb, hb10⟩
|
|
230
|
-
|
|
231
|
-
theorem reversal_leaves_no_trailing_zero : ∀ n : Nat, 0 < n → 0 < reverseNum n ∧ reverseNum n % 10 ≠ 0 := by
|
|
232
|
-
intro n hn
|
|
233
|
-
obtain ⟨L, b, e, hb, hb10⟩ := the_top_digit_is_nonzero (n + 1) n hn (a_number_is_below_ten_to_its_own_successor n)
|
|
234
|
-
have hd : digits n = L ++ [b] := by
|
|
235
|
-
unfold digits
|
|
236
|
-
rw [if_neg (by simp; omega)]
|
|
237
|
-
exact e
|
|
238
|
-
unfold reverseNum
|
|
239
|
-
rw [hd, List.foldl_append]
|
|
240
|
-
show 0 < (L.foldl (fun a d => a * 10 + d) 0) * 10 + b ∧ ((L.foldl (fun a d => a * 10 + d) 0) * 10 + b) % 10 ≠ 0
|
|
241
|
-
exact ⟨by omega, by omega⟩
|
|
242
|
-
|
|
243
|
-
theorem reading_a_list_back_from_the_top :
|
|
244
|
-
∀ r : List Nat, r ≠ [] → (∀ d ∈ r, d < 10) → r.reverse.head? ≠ some 0 →
|
|
245
|
-
0 < r.reverse.foldl (fun a d => a * 10 + d) 0 ∧ r.length ≤ r.reverse.foldl (fun a d => a * 10 + d) 0 ∧
|
|
246
|
-
∀ f, r.length ≤ f → digitsF f (r.reverse.foldl (fun a d => a * 10 + d) 0) = r := by
|
|
247
|
-
intro r
|
|
248
|
-
induction r with
|
|
249
|
-
| nil => intro h; exact absurd rfl h
|
|
250
|
-
| cons b r' ih =>
|
|
251
|
-
intro _ hlt hhead
|
|
252
|
-
have hb : b < 10 := hlt b (List.mem_cons_self b r')
|
|
253
|
-
cases r' with
|
|
254
|
-
| nil =>
|
|
255
|
-
have hb0 : b ≠ 0 := by
|
|
256
|
-
intro e; apply hhead; simp [e]
|
|
257
|
-
simp only [List.reverse_cons, List.reverse_nil, List.nil_append, List.foldl, List.length_cons,
|
|
258
|
-
List.length_nil, Nat.zero_mul, Nat.zero_add]
|
|
259
|
-
refine ⟨by omega, by omega, ?_⟩
|
|
260
|
-
intro f hf
|
|
261
|
-
obtain ⟨f', rfl⟩ : ∃ f', f = f' + 1 := ⟨f - 1, by omega⟩
|
|
262
|
-
obtain ⟨b', rfl⟩ : ∃ b', b = b' + 1 := ⟨b - 1, by omega⟩
|
|
263
|
-
simp only [digitsF]
|
|
264
|
-
rw [show (b' + 1) / 10 = 0 by omega, show (b' + 1) % 10 = b' + 1 by omega, digitsF_zero]
|
|
265
|
-
| cons x xs =>
|
|
266
|
-
have hne : (x :: xs) ≠ [] := List.cons_ne_nil x xs
|
|
267
|
-
have hlt' : ∀ d ∈ (x :: xs), d < 10 := fun d hd => hlt d (List.mem_cons_of_mem b hd)
|
|
268
|
-
have hhead' : (x :: xs).reverse.head? ≠ some 0 := by
|
|
269
|
-
have hrev : (b :: x :: xs).reverse = (x :: xs).reverse ++ [b] := List.reverse_cons b (x :: xs)
|
|
270
|
-
rw [hrev] at hhead
|
|
271
|
-
cases h : (x :: xs).reverse with
|
|
272
|
-
| nil => simp at h
|
|
273
|
-
| cons y ys => rw [h] at hhead; exact hhead
|
|
274
|
-
obtain ⟨hpos, hlen, hdig⟩ := ih hne hlt' hhead'
|
|
275
|
-
rw [List.reverse_cons b (x :: xs), List.foldl_append]
|
|
276
|
-
simp only [List.foldl, List.length_cons] at hlen hdig ⊢
|
|
277
|
-
generalize (x :: xs).reverse.foldl (fun a d => a * 10 + d) 0 = v at hpos hlen hdig ⊢
|
|
278
|
-
refine ⟨by omega, by omega, ?_⟩
|
|
279
|
-
intro f hf
|
|
280
|
-
obtain ⟨f', rfl⟩ : ∃ f', f = f' + 1 := ⟨f - 1, by omega⟩
|
|
281
|
-
obtain ⟨w, hw⟩ : ∃ w, v * 10 + b = w + 1 := ⟨v * 10 + b - 1, by omega⟩
|
|
282
|
-
rw [hw]
|
|
283
|
-
simp only [digitsF]
|
|
284
|
-
rw [← hw, show (v * 10 + b) % 10 = b by omega, show (v * 10 + b) / 10 = v by omega, hdig f' (by omega)]
|
|
285
|
-
|
|
286
|
-
theorem the_digits_of_the_reversal_are_the_reversed_digits :
|
|
287
|
-
∀ n : Nat, n % 10 ≠ 0 → digits (reverseNum n) = (digitsF (n + 1) n).reverse ∧ digits n = digitsF (n + 1) n := by
|
|
288
|
-
intro n h10
|
|
289
|
-
have hds : digits n = digitsF (n + 1) n := by
|
|
290
|
-
unfold digits
|
|
291
|
-
rw [if_neg (by simp; omega)]
|
|
292
|
-
have hne : digitsF (n + 1) n ≠ [] := by
|
|
293
|
-
obtain ⟨m, rfl⟩ : ∃ m, n = m + 1 := ⟨n - 1, by omega⟩
|
|
294
|
-
simp [digitsF]
|
|
295
|
-
have hhead : (digitsF (n + 1) n).head? = some (n % 10) := by
|
|
296
|
-
obtain ⟨m, rfl⟩ : ∃ m, n = m + 1 := ⟨n - 1, by omega⟩
|
|
297
|
-
simp [digitsF]
|
|
298
|
-
have hlt : ∀ d ∈ (digitsF (n + 1) n).reverse, d < 10 :=
|
|
299
|
-
fun d hd => every_digit_is_below_ten _ _ d (List.mem_reverse.mp hd)
|
|
300
|
-
have key := reading_a_list_back_from_the_top (digitsF (n + 1) n).reverse
|
|
301
|
-
(by simpa using hne) hlt
|
|
302
|
-
(by rw [List.reverse_reverse, hhead]; intro e; apply h10; exact Option.some.inj e)
|
|
303
|
-
rw [List.reverse_reverse] at key
|
|
304
|
-
obtain ⟨hpos, hlen, hdig⟩ := key
|
|
305
|
-
have hrn : reverseNum n = (digitsF (n + 1) n).foldl (fun a d => a * 10 + d) 0 := by
|
|
306
|
-
unfold reverseNum; rw [hds]
|
|
307
|
-
refine ⟨?_, hds⟩
|
|
308
|
-
unfold digits
|
|
309
|
-
rw [hrn, if_neg (by simp; omega)]
|
|
310
|
-
exact hdig _ (Nat.le_succ_of_le hlen)
|
|
311
|
-
|
|
312
|
-
-- reflection of reversal_keeps_the_residue_mod_nine_for_every_n: reversal undoes itself off the trailing zeros
|
|
313
|
-
theorem reversal_is_involutive_off_the_trailing_zeros_for_every_n :
|
|
314
|
-
∀ n : Nat, n % 10 ≠ 0 → reverseNum (reverseNum n) = n := by
|
|
315
|
-
intro n h10
|
|
316
|
-
obtain ⟨hdrn, _⟩ := the_digits_of_the_reversal_are_the_reversed_digits n h10
|
|
317
|
-
show (digits (reverseNum n)).foldl (fun a d => a * 10 + d) 0 = n
|
|
318
|
-
rw [hdrn, List.foldl_reverse]
|
|
319
|
-
exact the_digits_rebuild_the_number_when_the_fuel_covers_them (n + 1) n (a_number_is_below_ten_to_its_own_successor n)
|
|
320
|
-
|
|
321
|
-
theorem reversal_is_involutive_exactly_off_the_trailing_zeros_for_every_n :
|
|
322
|
-
∀ n : Nat, 0 < n → (reverseNum (reverseNum n) = n ↔ n % 10 ≠ 0) := by
|
|
323
|
-
intro n hn
|
|
324
|
-
constructor
|
|
325
|
-
· intro e h0
|
|
326
|
-
obtain ⟨hp, _⟩ := reversal_leaves_no_trailing_zero n hn
|
|
327
|
-
obtain ⟨_, hz⟩ := reversal_leaves_no_trailing_zero (reverseNum n) hp
|
|
328
|
-
rw [e] at hz
|
|
329
|
-
exact hz h0
|
|
330
|
-
· exact reversal_is_involutive_off_the_trailing_zeros_for_every_n n
|
|
331
|
-
|
|
332
|
-
-- more fuel changes nothing once it covers the number
|
|
333
|
-
theorem more_fuel_changes_no_digit : ∀ f n k : Nat, n < 10 ^ f → digitsF (f + k) n = digitsF f n := by
|
|
334
|
-
intro f
|
|
335
|
-
induction f with
|
|
336
|
-
| zero =>
|
|
337
|
-
intro n k h
|
|
338
|
-
have : n = 0 := by simp at h; omega
|
|
339
|
-
subst this
|
|
340
|
-
rw [digitsF_zero, digitsF_zero]
|
|
341
|
-
| succ f ih =>
|
|
342
|
-
intro n k h
|
|
343
|
-
cases n with
|
|
344
|
-
| zero => rw [digitsF_zero, digitsF_zero]
|
|
345
|
-
| succ m =>
|
|
346
|
-
rw [show f + 1 + k = (f + k) + 1 by omega]
|
|
347
|
-
simp only [digitsF]
|
|
348
|
-
have hlt : (m + 1) / 10 < 10 ^ f := by
|
|
349
|
-
rw [Nat.pow_succ] at h
|
|
350
|
-
omega
|
|
351
|
-
rw [ih _ k hlt]
|
|
352
|
-
|
|
353
|
-
theorem a_trailing_zero_is_a_leading_zero_of_the_digits :
|
|
354
|
-
∀ m : Nat, 0 < m → digits (10 * m) = 0 :: digits m := by
|
|
355
|
-
intro m hm
|
|
356
|
-
unfold digits
|
|
357
|
-
rw [if_neg (by simp; omega), if_neg (by simp; omega)]
|
|
358
|
-
obtain ⟨p, hp⟩ : ∃ p, 10 * m = p + 1 := ⟨10 * m - 1, by omega⟩
|
|
359
|
-
rw [show 10 * m + 1 = (10 * m) + 1 from rfl, hp]
|
|
360
|
-
simp only [digitsF]
|
|
361
|
-
rw [← hp, show 10 * m % 10 = 0 by omega, show 10 * m / 10 = m by omega,
|
|
362
|
-
show 10 * m = (m + 1) + (9 * m - 1) by omega,
|
|
363
|
-
more_fuel_changes_no_digit (m + 1) m (9 * m - 1) (a_number_is_below_ten_to_its_own_successor m)]
|
|
364
|
-
|
|
365
|
-
-- reversal_preserves_digit_sum was decided for 1 ≤ n < 300; for every n:
|
|
366
|
-
theorem reversal_preserves_the_digit_sum_for_every_n : ∀ n : Nat, digitSum (reverseNum n) = digitSum n := by
|
|
367
|
-
intro n
|
|
368
|
-
induction n using Nat.strongRecOn with
|
|
369
|
-
| _ n ih =>
|
|
370
|
-
by_cases h0 : n = 0
|
|
371
|
-
· subst h0; rfl
|
|
372
|
-
by_cases h10 : n % 10 = 0
|
|
373
|
-
· obtain ⟨m, rfl⟩ : ∃ m, n = 10 * m := ⟨n / 10, by omega⟩
|
|
374
|
-
have hm : 0 < m := by omega
|
|
375
|
-
have hd := a_trailing_zero_is_a_leading_zero_of_the_digits m hm
|
|
376
|
-
have hr : reverseNum (10 * m) = reverseNum m := by
|
|
377
|
-
unfold reverseNum; rw [hd]; rfl
|
|
378
|
-
have hs : digitSum (10 * m) = digitSum m := by
|
|
379
|
-
unfold digitSum; rw [hd]; rfl
|
|
380
|
-
rw [hr, hs]
|
|
381
|
-
exact ih m (by omega)
|
|
382
|
-
· obtain ⟨hdrn, hds⟩ := the_digits_of_the_reversal_are_the_reversed_digits n h10
|
|
383
|
-
unfold digitSum
|
|
384
|
-
rw [hdrn, hds, a_sum_is_the_same_read_backwards]
|
|
385
|
-
|
|
386
|
-
-- palindromes_are_the_fixed_points counted them below 100; for every n without a trailing zero:
|
|
387
|
-
-- the fixed points of the reversal are exactly the numbers whose digits read the same both ways
|
|
388
|
-
theorem the_fixed_points_of_reversal_are_the_palindromes_for_every_n :
|
|
389
|
-
∀ n : Nat, n % 10 ≠ 0 → (reverseNum n = n ↔ (digits n).reverse = digits n) := by
|
|
390
|
-
intro n h10
|
|
391
|
-
obtain ⟨hdrn, hds⟩ := the_digits_of_the_reversal_are_the_reversed_digits n h10
|
|
392
|
-
constructor
|
|
393
|
-
· intro e
|
|
394
|
-
have := congrArg digits e
|
|
395
|
-
rw [hdrn, ← hds] at this
|
|
396
|
-
exact this
|
|
397
|
-
· intro p
|
|
398
|
-
have hd : digits (reverseNum n) = digits n := by rw [hdrn, ← hds, p]
|
|
399
|
-
rw [← the_number_is_rebuilt_from_its_digits_for_every_n (reverseNum n), hd,
|
|
400
|
-
the_number_is_rebuilt_from_its_digits_for_every_n]
|
|
401
|
-
|
|
402
|
-
end Reversal
|