Skip to content

Commit 67ea033

Browse files
committed
Various improvements
1 parent b4c754e commit 67ea033

43 files changed

Lines changed: 1623 additions & 9901 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

essays/NAM/README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,17 @@ answer.
537537
## On Equality, Identity, and the Limits of the Substrate
538538
539539
A foundational caveat, presented honestly because the architecture's value depends on its users understanding it.
540+
There is a Futurama line that captures the situation with uncomfortable precision. Professor Farnsworth, having
541+
"translated" an alien message, announces: _"Of course we can translate it — but only into Betacrypt-3… a language so
542+
complex, there is even less chance of understanding it."_ The joke lands because the translation technically succeeds —
543+
it just maps the problem into a representation where the operations people actually cared about have become harder, not
544+
easier. This is, structurally, exactly the move Numbers as Machines makes. We "translate" every number into a
545+
generator-VM that emits an infinite digit stream, gaining uniformity, composability, and exactness. The bill for that
546+
translation comes due precisely here: the very act of representing a number as a non-halting machine is what makes "is
547+
this equal?" and "which is bigger?" non-primitive, partial, or outright undecidable. We did not make the substrate too
548+
complex out of carelessness — the translation preserves computability by discarding cheap equality. Betacrypt-3, but the
549+
trade is honest and the dialect is at least the same one everywhere.
550+
540551
541552
The natural equivalence relation on generator VMs is extensional: two VMs are equal iff they produce identical digit
542553
streams on every query. This relation is **not computably decidable** — it is the canonical example of an undecidable
@@ -653,4 +664,4 @@ with the codec/base separation and the first-class skip primitive, this is a rea
653664
iRRAM, mpmath) even where it builds on their mathematical foundations.
654665

655666
Alpha to omega: from mathematical definitions to compiled digit streams, with the approximations made explicit, the
656-
costs made honest, and the limits made visible.
667+
costs made honest, and the limits made visible.

essays/NAM/index.html

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3532,7 +3532,23 @@ <h2 class="section-title" id="heading-equality-limits">
35323532
</div>
35333533
<div class="section-body">
35343534
<p class="section-intro">
3535-
The natural equivalence relation on generator VMs is extensional: two VMs are equal
3535+
There is a Futurama line that captures the situation with uncomfortable precision.
3536+
Professor Farnsworth, having "translated" an alien message, announces:
3537+
<em>"Of course we can translate it — but only into Betacrypt-3… a language so
3538+
complex, there is even less chance of understanding it."</em> The joke lands because
3539+
the translation technically succeeds — it just maps the problem into a representation
3540+
where the operations people actually cared about have become harder, not easier. This
3541+
is, structurally, exactly the move Numbers as Machines makes. We "translate" every
3542+
number into a generator-VM that emits an infinite digit stream, gaining uniformity,
3543+
composability, and exactness. The bill for that translation comes due precisely here:
3544+
the very act of representing a number as a non-halting machine is what makes "is this
3545+
equal?" and "which is bigger?" non-primitive, partial, or outright undecidable. We did
3546+
not make the substrate too complex out of carelessness — the translation preserves
3547+
computability by discarding cheap equality. Betacrypt-3, but the trade is honest and
3548+
the dialect is at least the same one everywhere.
3549+
</p>
3550+
<p>
3551+
The natural equivalence relation on generator VMs is extensional: two VMs are equal
35363552
iff they produce identical digit streams on every query. This relation is
35373553
<strong class="key-concept">not computably decidable</strong> — it is the canonical
35383554
example of an undecidable semantic property of programs (Rice's theorem).
@@ -4750,4 +4766,4 @@ <h3 class="footer-col-title">Key Concepts</h3>
47504766
})();
47514767
</script>
47524768
</body>
4753-
</html>
4769+
</html>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.md
2+
marked.min.js
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// affine.js
2+
// Precomputed reference of affine transformation sets in algebraic form,
3+
// one entry per polygon type. Each "move" is an edge-crossing generator
4+
// normalized to a canonical compass order (North, then clockwise).
5+
//
6+
// The algebraic representation reuses field.js for n=5 (pentagon) where
7+
// exact Q(sqrt5, S) arithmetic is available. For other n we store the
8+
// float rotation angle and a symbolic label; the algebraic layer can be
9+
// expanded later per polygon.
10+
//
11+
// Each affine generator g maps a tile frame (centroid c, orient o, sigma s)
12+
// to a neighbor frame. We expose:
13+
// - rotationSteps: how many edge rotations relative to canonical North
14+
// - sheetDelta: canonical sheet shift for THIS compass direction
15+
//
16+
// The key normalization rule: a "move" is indexed by its compass slot,
17+
// not by the raw edge index. Edge index depends on orientation; compass
18+
// slot does not. We compute compass slot = (edge - orient) mod n with the
19+
// North edge at slot 0, then increasing clockwise.
20+
21+
import { K } from './field.js';
22+
23+
// Canonical compass labels for small n (purely informational).
24+
const COMPASS = {
25+
3: ['N', 'SE', 'SW'],
26+
4: ['N', 'E', 'S', 'W'],
27+
5: ['N', 'NE', 'SE', 'SW', 'NW'],
28+
6: ['N', 'NE', 'SE', 'S', 'SW', 'NW'],
29+
};
30+
31+
// Normalize a raw edge index to a compass slot given the tile orientation.
32+
// North-then-clockwise: slot 0 is the edge that, in the tile's own frame,
33+
// points most nearly "up" (+y). Because orient rotates the vertex frame by
34+
// orient*(2pi/n), the canonical North edge of an oriented tile is edge
35+
// index `orient` (mod n) for the +y-up convention used in ngon.js.
36+
export function edgeToCompass(edge, orient, n) {
37+
return ((edge - orient) % n + n) % n;
38+
}
39+
40+
// Inverse: compass slot back to raw edge index for a given orientation.
41+
export function compassToEdge(slot, orient, n) {
42+
return ((slot + orient) % n + n) % n;
43+
}
44+
45+
// Canonical sheet delta for a compass slot. This is the holonomy generator
46+
// assignment: it depends ONLY on the absolute compass direction, so that
47+
// walking the same world-direction always accrues the same sheet shift.
48+
// Default: slot index itself (mod groupOrder). Override per-n as needed.
49+
export function compassSheetDelta(slot, groupOrder) {
50+
return ((slot % groupOrder) + groupOrder) % groupOrder;
51+
}
52+
53+
// Algebraic generator table. For pentagon we store exact field constants;
54+
// others are extensible placeholders.
55+
export const AFFINE_TABLE = {
56+
5: {
57+
field: 'Q(sqrt5, S)',
58+
// exact circumradius and rotation handled in geometry.js; here we just
59+
// tag that an exact representation exists.
60+
exact: true,
61+
compass: COMPASS[5],
62+
},
63+
};
64+
65+
export function affineInfo(n) {
66+
return (
67+
AFFINE_TABLE[n] || {
68+
field: `Q(cos 2pi/${n})`,
69+
exact: n === 3 || n === 4 || n === 6,
70+
compass: COMPASS[n] || null,
71+
}
72+
);
73+
}

0 commit comments

Comments
 (0)