@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.
Files changed (259) hide show
  1. package/README.md +29 -15
  2. package/dist/mod.core.d.ts +9 -0
  3. package/dist/mod.core.js +9 -0
  4. package/dist/src/0/index.d.ts +47 -0
  5. package/dist/src/0/index.js +189 -0
  6. package/dist/src/0/ledger.d.ts +1 -0
  7. package/dist/src/0/ledger.js +25 -0
  8. package/dist/src/0/trinity-matrix.d.ts +1 -0
  9. package/dist/src/0/trinity-matrix.js +16 -0
  10. package/dist/src/5/aspects.d.ts +1 -0
  11. package/dist/src/5/aspects.js +22 -0
  12. package/dist/src/5/reflection.d.ts +1 -0
  13. package/dist/src/5/reflection.js +25 -0
  14. package/dist/src/7/rosetta.d.ts +1 -0
  15. package/dist/src/7/rosetta.js +24 -0
  16. package/dist/src/9/enumeration.d.ts +1 -0
  17. package/dist/src/9/enumeration.js +14 -0
  18. package/dist/src/honesty/index.d.ts +16 -0
  19. package/dist/src/honesty/index.js +69 -0
  20. package/package.json +27 -10
  21. package/.zenodo.json +0 -51
  22. package/ABSTRACT.md +0 -155
  23. package/ACCOUNTING.md +0 -27
  24. package/AXIOMS.md +0 -574
  25. package/CHALLENGES.md +0 -2595
  26. package/DEPLOY.md +0 -39
  27. package/DEVELOP.md +0 -34
  28. package/HEART.md +0 -112
  29. package/PHYSICS-SCALES.md +0 -80
  30. package/PRIOR-ART.md +0 -151
  31. package/PROOF-OF-CONCEPT.md +0 -81
  32. package/REALISATIONS.md +0 -87
  33. package/RESEARCH.md +0 -188
  34. package/RULES.md +0 -57
  35. package/SEQUENCE-DECODE.md +0 -196
  36. package/SIGNATURE.md +0 -34
  37. package/THEOREMS.md +0 -97
  38. package/WHITEPAPER.md +0 -40
  39. package/WORKFLOWS.md +0 -47
  40. package/boundaries.md +0 -23
  41. package/captain.md +0 -85
  42. package/compare.md +0 -42
  43. package/compute.md +0 -543
  44. package/cryptography.md +0 -55
  45. package/dashboard.md +0 -50
  46. package/examples.md +0 -47
  47. package/folds.md +0 -65
  48. package/forensic.md +0 -67
  49. package/guide.md +0 -126
  50. package/harness.md +0 -20
  51. package/index.md +0 -217
  52. package/mod.core.ts +0 -10
  53. package/nature.md +0 -58
  54. package/organism.md +0 -30
  55. package/paper.md +0 -8789
  56. package/proofs.md +0 -26
  57. package/quantum.md +0 -40
  58. package/rights.md +0 -39
  59. package/solutions.md +0 -28
  60. package/speedup.md +0 -41
  61. package/src/0/chacha.ts +0 -3
  62. package/src/0/crypt.ts +0 -4
  63. package/src/0/csp.ts +0 -10
  64. package/src/0/entanglement.ts +0 -31
  65. package/src/0/fusion.ts +0 -28
  66. package/src/0/holographic.ts +0 -57
  67. package/src/0/impossible.ts +0 -30
  68. package/src/0/imprint.ts +0 -160
  69. package/src/0/index.ts +0 -263
  70. package/src/0/ledger.ts +0 -25
  71. package/src/0/legible.ts +0 -29
  72. package/src/0/limit.ts +0 -29
  73. package/src/0/merkle-proof.ts +0 -3
  74. package/src/0/null-token.ts +0 -24
  75. package/src/0/sha256.ts +0 -3
  76. package/src/0/singularity.ts +0 -20
  77. package/src/0/stream.ts +0 -47
  78. package/src/0/trinities.ts +0 -37
  79. package/src/0/trinity-matrix.ts +0 -20
  80. package/src/0/version-matrix.ts +0 -70
  81. package/src/1/acceptance.ts +0 -26
  82. package/src/1/index.ts +0 -80
  83. package/src/1/paradox.ts +0 -28
  84. package/src/1/vortex.lean +0 -6
  85. package/src/2/frequency-scales.ts +0 -28
  86. package/src/2/iching.ts +0 -34
  87. package/src/2/index.ts +0 -78
  88. package/src/2/primes-vortex.ts +0 -12
  89. package/src/2/quantum.ts +0 -48
  90. package/src/2/string-scale.ts +0 -14
  91. package/src/2/vortex.lean +0 -10
  92. package/src/3/index.ts +0 -63
  93. package/src/3/pi-bbp.ts +0 -13
  94. package/src/3/trinity.ts +0 -39
  95. package/src/3/vortex.lean +0 -7
  96. package/src/4/git.ts +0 -30
  97. package/src/4/index.ts +0 -63
  98. package/src/4/vortex.lean +0 -6
  99. package/src/5/aspects.ts +0 -27
  100. package/src/5/center.ts +0 -35
  101. package/src/5/development.ts +0 -45
  102. package/src/5/diamond.ts +0 -35
  103. package/src/5/folds.ts +0 -12
  104. package/src/5/index.ts +0 -63
  105. package/src/5/reflection.lean +0 -14
  106. package/src/5/reflection.ts +0 -14
  107. package/src/5/vortex.lean +0 -10
  108. package/src/6/dna.ts +0 -27
  109. package/src/6/index.ts +0 -63
  110. package/src/6/vortex.lean +0 -7
  111. package/src/7/cross.ts +0 -31
  112. package/src/7/glagolitic.ts +0 -51
  113. package/src/7/index.ts +0 -67
  114. package/src/7/language-lens.ts +0 -41
  115. package/src/7/lens.ts +0 -41
  116. package/src/7/locale.ts +0 -105
  117. package/src/7/rbac.ts +0 -31
  118. package/src/7/rosetta-clay.ts +0 -15
  119. package/src/7/rosetta.lean +0 -11
  120. package/src/7/rosetta.ts +0 -11
  121. package/src/7/string-dimensions.ts +0 -14
  122. package/src/7/vortex.lean +0 -6
  123. package/src/8/infinite.ts +0 -26
  124. package/src/8/merkaba/field.ts +0 -27
  125. package/src/8/merkaba/geometry.ts +0 -16
  126. package/src/8/merkaba/touch.ts +0 -26
  127. package/src/8/nucleus/magic.lean +0 -15
  128. package/src/8/nucleus/proton-mass-fit.ts +0 -9
  129. package/src/8/nucleus/proton-mass.lean +0 -10
  130. package/src/8/nucleus/shell-model-magic.ts +0 -10
  131. package/src/8/vortex.lean +0 -7
  132. package/src/9/access.ts +0 -34
  133. package/src/9/aura-funding.ts +0 -25
  134. package/src/9/coins.ts +0 -25
  135. package/src/9/enumeration.ts +0 -13
  136. package/src/9/funding.ts +0 -85
  137. package/src/9/security.ts +0 -36
  138. package/src/9/society.ts +0 -32
  139. package/src/9/vortex.lean +0 -11
  140. package/src/api/gates.ts +0 -122
  141. package/src/api/index.ts +0 -447
  142. package/src/api/lanes.ts +0 -81
  143. package/src/claims/index.ts +0 -81
  144. package/src/demand/queries.json +0 -1764
  145. package/src/face/index.ts +0 -100
  146. package/src/from/the/heart/index.ts +0 -11
  147. package/src/honesty/boundaries.ts +0 -29
  148. package/src/honesty/index.ts +0 -63
  149. package/src/html/index.ts +0 -10
  150. package/src/latex/index.ts +0 -474
  151. package/src/millennium/index.ts +0 -53
  152. package/src/play/the/game/index.ts +0 -12
  153. package/src/proof/README.md +0 -118
  154. package/src/proof/address.lean +0 -168
  155. package/src/proof/coin.lean +0 -152
  156. package/src/proof/covered.json +0 -9
  157. package/src/proof/demand.lean +0 -160
  158. package/src/proof/demand2.lean +0 -219
  159. package/src/proof/demand3.lean +0 -209
  160. package/src/proof/discovered.json +0 -19530
  161. package/src/proof/elementary.lean +0 -495
  162. package/src/proof/energy.lean +0 -329
  163. package/src/proof/families.lean +0 -740
  164. package/src/proof/fixtures/axiom-control.lean +0 -39
  165. package/src/proof/flow.lean +0 -78
  166. package/src/proof/fnv.lean +0 -127
  167. package/src/proof/generated-theorems.json +0 -207
  168. package/src/proof/generated.lean +0 -101
  169. package/src/proof/imagined.lean +0 -492
  170. package/src/proof/index.lean +0 -156
  171. package/src/proof/index.ts +0 -916
  172. package/src/proof/involution.lean +0 -90
  173. package/src/proof/ledgerclaims.lean +0 -84
  174. package/src/proof/light.lean +0 -168
  175. package/src/proof/mechanical.lean +0 -563
  176. package/src/proof/merkaba.lean +0 -89
  177. package/src/proof/merkle.lean +0 -132
  178. package/src/proof/nim.lean +0 -332
  179. package/src/proof/novelty.json +0 -751
  180. package/src/proof/phenomena.lean +0 -90
  181. package/src/proof/priorart.lean +0 -190
  182. package/src/proof/quantum.lean +0 -159
  183. package/src/proof/reach.lean +0 -121
  184. package/src/proof/recovered.lean +0 -56
  185. package/src/proof/reversal.lean +0 -402
  186. package/src/proof/revoked.json +0 -317
  187. package/src/proof/rights.lean +0 -155
  188. package/src/proof/sequences.lean +0 -284
  189. package/src/proof/speed.lean +0 -158
  190. package/src/proof/split.lean +0 -209
  191. package/src/proof/theorems.lean +0 -67
  192. package/src/proof/trial-all.json +0 -16532
  193. package/src/proof/z9.lean +0 -126
  194. package/src/proof/z9plus.lean +0 -345
  195. package/src/proofs.lisp +0 -170
  196. package/src/prove/emit.ts +0 -115
  197. package/src/prove/index.ts +0 -143
  198. package/src/prove/translate.ts +0 -638
  199. package/src/publication/index.ts +0 -362
  200. package/src/quantum/field.ts +0 -73
  201. package/src/quantum/tree.ts +0 -79
  202. package/src/receipts/1431b4c4-7950-8d7b-88d1-b633219692f8.json +0 -7
  203. package/src/receipts/171e09c0-4cfd-8ce0-a6ed-cd33d5553da3.json +0 -7
  204. package/src/receipts/1a1f16c9-3491-8050-b221-e2a362439be4.json +0 -12
  205. package/src/receipts/1da15f83-83a6-8d04-b1ac-334c2dd6abb3.json +0 -7
  206. package/src/receipts/375a57ed-ef99-855e-8f34-b77d08010f3c.json +0 -6
  207. package/src/receipts/3dcbbf9e-0e49-8ba7-921e-17e478dbafaf.json +0 -6
  208. package/src/receipts/43a24136-5ad9-81ef-97c9-17be1c05bb5f.json +0 -11
  209. package/src/receipts/4991be51-74ba-8f66-9534-e6dba52fb569.json +0 -10
  210. package/src/receipts/52375d8f-232b-8c01-9d82-a824ffa7b2b7.json +0 -6
  211. package/src/receipts/593b546a-36b4-8553-941a-0e03b7053a64.json +0 -7
  212. package/src/receipts/7f75c989-96c9-8a24-8d0d-7e690861ccb4.json +0 -6
  213. package/src/receipts/80f80b59-81d8-866d-9a14-f469729d3dc8.json +0 -6
  214. package/src/receipts/85ac8585-9dc1-8964-9848-ae0f49cc82fb.json +0 -7
  215. package/src/receipts/85db092e-f2c0-88e5-bf75-61c4a65d84e7.json +0 -7
  216. package/src/receipts/95bacad3-9e56-8741-b0f8-def2c6ecb050.json +0 -7
  217. package/src/receipts/a1d33966-7bbd-84ca-902b-49e315af60e0.json +0 -6
  218. package/src/receipts/b20ced61-24ad-8123-adee-56031ab734dd.json +0 -11
  219. package/src/receipts/ba0447cd-f489-841a-a70f-a39b18ec2946.json +0 -11
  220. package/src/receipts/bcddbe66-06cf-8f31-a261-98b836938947.json +0 -7
  221. package/src/receipts/c1bac0d8-d906-8196-a4f0-3d8270b2e944.json +0 -6
  222. package/src/receipts/ce851ea3-3cf8-8646-a5d6-c0c6281210fe.json +0 -10
  223. package/src/receipts/cf43a122-c880-8d86-9e25-6f22f92d6b0a.json +0 -7
  224. package/src/receipts/daad8cd4-d4db-8dca-9c97-9a838cbce528.json +0 -7
  225. package/src/receipts/dc8bdb82-599f-8020-9eb2-cb016b408ec1.json +0 -6
  226. package/src/receipts/df77c265-d1a8-8354-8a9e-769fa5c676e2.json +0 -6
  227. package/src/receipts/e96686da-a411-8838-a5c8-ee7472bce048.json +0 -10
  228. package/src/receipts/f073c46f-7b67-83d0-aca5-db11fac4b5ec.json +0 -7
  229. package/src/receipts/f946d99d-a1c2-89f7-9426-a367c5b04191.json +0 -6
  230. package/src/receipts/fc069e45-115d-8983-ad25-fb9f735da84b.json +0 -6
  231. package/src/the/abstract/index.ts +0 -21
  232. package/src/the/abundance/index.ts +0 -20
  233. package/src/the/apple/earth/index.ts +0 -23
  234. package/src/the/apple/earth/navigation/index.ts +0 -28
  235. package/src/the/apple/earth/truth/index.ts +0 -19
  236. package/src/the/apple/index.ts +0 -27
  237. package/src/the/cancer/index.ts +0 -26
  238. package/src/the/clown/index.ts +0 -25
  239. package/src/the/creation/index.ts +0 -16
  240. package/src/the/crystal/index.ts +0 -23
  241. package/src/the/domain/index.ts +0 -16
  242. package/src/the/game/index.ts +0 -11
  243. package/src/the/gold/compass/index.ts +0 -26
  244. package/src/the/gold/index.ts +0 -35
  245. package/src/the/heart/index.ts +0 -15
  246. package/src/the/index.ts +0 -23
  247. package/src/the/law/index.ts +0 -20
  248. package/src/the/path/index.ts +0 -19
  249. package/src/the/rosetta/index.ts +0 -33
  250. package/src/the/sequence/index.ts +0 -12
  251. package/src/the/solids/index.ts +0 -25
  252. package/src/the/state/index.ts +0 -20
  253. package/src/the/superposition/state/index.ts +0 -22
  254. package/src/the/surface/index.ts +0 -26
  255. package/src/the/theorem/index.ts +0 -14
  256. package/src/the/torus/index.ts +0 -23
  257. package/src/the/waves/index.ts +0 -23
  258. package/the.md +0 -20
  259. package/verify.md +0 -67
@@ -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