个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Exact classifier for small sign-driven integer dynamical systems, in dependency-free Rust, with a live landing page
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
An exact classifier for small discrete dynamical systems, written in dependency-free Rust.
Every universe in this project follows one rule,
an integer state that moves by a velocity chosen only by the signs of its coordinates.
The engine decides where each universe ends up: it stops, loops, escapes in a straight
line, escapes while repeating, or spirals outward. For three elements it settles all
387,420,489 universes exactly, in about 6.5 seconds on 8 cores.
Each universe starts from the zero state, fires every channel once, and is then followed
until its fate is proven.查看完整 README ↗An exact classifier for small discrete dynamical systems, written in dependency-free Rust.
Every universe in this project follows one rule,
v(t+1) = v(t) + d(sign v(t))
an integer state that moves by a velocity chosen only by the signs of its coordinates. The engine decides where each universe ends up: it stops, loops, escapes in a straight line, escapes while repeating, or spirals outward. For three elements it settles all 387,420,489 universes exactly, in under 10 seconds on 8 cores, and proves the fate of all but 192 of them.
Live site · Theory notes · Results
Each universe starts from the zero state, fires every channel once, and is then followed until its fate is proven.
| Elements | Universes | Fixed | Cycle | Ray | Helix | Spiral | Undecided |
|---|---|---|---|---|---|---|---|
| N = 2 | all 6,561 | 22.634 % | 1.341 % | 76.025 % | 0 | 0 | 0 |
| N = 3 | all 387,420,489 | 7.176 % | 0.952 % | 90.504 % | 1.297 % | 0.072 % | 0 |
| N = 4 | 2·10⁹ sampled | 1.740 % | 0.318 % | 95.061 % | 2.748 % | 0.130 % | 63,961 |
The N = 4 rows are estimates from a uniform sample of the 1.85·10¹⁵ universes, with 95 % confidence half-widths below 0.001 percentage points. 85 % of the sampled N = 4 spirals are proven; the undecided ones ran out of the 10,000-event budget.
Other findings:
dynamics-engine stable 2-613); the rest have a start that escapes. At
N = 3, 97.54 % are proven unstable and 2.46 % have no escaping start found. A cycle from the
all-fire start often hides instability: 37 % of those universes escape from another start,
and two-element universes can spiral (dynamics-engine stable 2-2800).d = ±(sgn v₁, −sgn v₀), which spirals out by 1 per axis crossing.Full tables, proofs and open questions are in docs/theory.md.
The engine is a single command-line program, dynamics-engine.
Releases has archives for five platforms, each holding the binary, this README and the license:
| Platform | Archive |
|---|---|
| Linux x86_64 (static) | dynamics-engine-x86_64-unknown-linux-musl.tar.gz |
| Linux ARM64 (static) | dynamics-engine-aarch64-unknown-linux-musl.tar.gz |
| macOS Apple silicon | dynamics-engine-aarch64-apple-darwin.tar.gz |
| macOS Intel | dynamics-engine-x86_64-apple-darwin.tar.gz |
| Windows x86_64 | dynamics-engine-x86_64-pc-windows-msvc.zip |
On Linux, for example:
curl -L https://github.com/mukos/dynamics-engine/releases/latest/download/dynamics-engine-x86_64-unknown-linux-musl.tar.gz | tar xz
./dynamics-engine show 2-613
The binaries are not code-signed. If macOS refuses to open one downloaded in a browser, run
xattr -d com.apple.quarantine dynamics-engine; on Windows, choose More info → Run anyway.
SHA256SUMS in each release lists the checksums.
With a stable Rust toolchain (rustup.rs); there are no crate dependencies:
cargo install --git https://github.com/mukos/dynamics-engine
Look at one universe:
dynamics-engine show 2-613
reduced universe 613 (multiplicity 8, canonical: true):
element 0: pos = [ -1 -1 ] neg = [ 0 1 ]
element 1: pos = [ 1 0 ] neg = [ -1 0 ]
events:
step 1 v = [ -1 0 ] drift = [ 0 1 ]
step 2 v = [ -1 1 ] drift = [ 1 1 ]
...
step 16 v = [ 1 0 ] drift = [ -1 -1 ]
fate: cycle of period 10, repeating from step 6
watch it: https://mukos.github.io/dynamics-engine/#u=2-613
A universe id is N-index, the same id the website uses in its #u= links, so any universe
from the site can be replayed in the terminal and the other way round. Then classify every
three-element universe:
dynamics-engine exact --size 3
git clone https://github.com/mukos/dynamics-engine.git
cd dynamics-engine
cargo run --release -- show 3-27411247
cargo test --release
Pushing a version tag (git tag v2.1.0 && git push origin v2.1.0) runs
.github/workflows/release.yml, which tests, builds the five
archives and publishes them as a release.
A universe has N elements. Element e has a positive channel and a negative channel, and a
2N × 2N matrix of zeros and ones says which channels feed which. At every step each active
channel pushes its row, each element collapses to its net value, and the sign of that value
decides which of its channels fires next. On the first step every channel fires.
Reduction. Only the difference between the two bits a row sends to an element matters. Each
pair collapses to a value in {−1, 0, +1}, so the 2^(4N²) bit matrices reduce to 3^(2N²)
universes, 177× fewer at N = 3. What remains is two N × N drift tables d⁺ and d⁻, and the
rule above, where
d(s) = Σ_{s_f = +} d⁺_f + Σ_{s_f = −} d⁻_f
Inside a quadrant the signs do not change, so the velocity is constant and the orbit is a straight line. Orbits are therefore chains of straight segments that bend only on the axes.
The five fates.
| Fate | What happens | Proof |
|---|---|---|
| Fixed | the velocity reaches zero | d(sign v) = 0 |
| Cycle | the state returns to itself | a repeated state |
| Ray | it escapes in a straight line | every coordinate moves away from zero |
| Helix | it escapes while repeating | a segment replays shifted by D with no sign change |
| Spiral | it winds outward | one lap run symbolically: returns lie on a line or plane and the lap map pushes them outward |
dynamics-engine show 4-1337051325212753) is settled within the 10,000-event budget.p + x·q (or a plane). The engine runs one lap with x unknown, splitting x into residue
classes so every jump length stays affine, and gets a map such as x ↦ 2x + 12. If every
branch pushes x outward beyond the current return, the spiral grows forever
(src/spiral.rs, dynamics-engine show 3-27411247).2^N N!) and Burnside
counts of the orbits.malloc. One reusable
workspace per thread and an index odometer took the N = 3 census from 527 s to under 10 s.--offset and --stride and merge with scripts/merge-results.py.Run dynamics-engine with no arguments for the full help.
| Command | What it does |
|---|---|
show <N-index> | one universe's drift rows, event trajectory and fate |
exact --size N | exact fate of every universe of one size; --samples for N ≥ 4 |
basins --size N | fates over every start state in a box, per universe |
basinmap --size N --index I | which attractor each start in a box reaches |
basinscan --size N | basin maps and pattern features of every canonical universe |
stable <N-index> | is every start bounded? an escaping start, or a proof (N ≤ 2) |
stable --size N | the same for every universe of one size (N ≤ 3) |
variants --size N | create/destroy rules with and without clamping at zero, compared |
orbits --size N | symmetry orbit counts (Burnside) |
run --size N | the original 10-step signature histogram (legacy) |
Add --json for machine-readable output and --model clamped for the create/destroy variant
with positivity. dynamics-engine --help lists every option.
run reproduces the project's first TypeScript version. After a fixed number of steps it gives
each channel a symbol and tallies the joined symbols as a signature:
| Symbol | Meaning |
|---|---|
| | the run ended before the step limit |
0 | the final value appeared earlier (bounded or periodic) |
1 | the positive channel never repeated a value |
-1 | the negative channel never repeated a value |
The comparison skips the step immediately before the last one, exactly as the original did, so
old and new histograms can be diffed. Pass --fixed-cycle to compare against every earlier step.
The heuristic misclassifies about 0.2 % of matrices at N = 3, which is why exact exists.
| N | Matrices | Exhaustive on 8 cores |
|---|---|---|
| 2 | 65,536 | instant |
| 3 | 2³⁶ ≈ 6.9·10¹⁰ | about 30 minutes |
| 4 | 2⁶⁴ ≈ 1.8·10¹⁹ | about 16,000 years, so use --samples |
docs/ is the project's landing page, served by GitHub Pages. It animates real
universes in the browser and includes a JavaScript port of the analyser, so visitors can type
any universe index and see its fate.
python3 scripts/build-dynamics.py # results/*.json + scripts/dynamics.template.html → docs/index.html
python3 scripts/serve-docs.py # http://127.0.0.1:8766, caching disabled
src/exact.rs reduced model, event-driven analysis, proofs, symmetry group
src/spiral.rs spiral proofs: one lap run symbolically on a line or plane of returns
src/global.rs stability from every start: escape witnesses, far-field proof for N ≤ 2
src/experiments.rs censuses, basins, basin scans, the clamped variant
src/multiverse.rs exhaustive and sampled runs of the original model
src/universe.rs one universe of the original model and its 10-step classification
src/matrix.rs index ↔ matrix decoding, random matrices
src/parallel.rs fork-join helpers
src/rng.rs SplitMix64
src/main.rs command-line interface
tests/ proof, decoding and regression tests
results/ computed censuses, basin scans and orbit counts
docs/ landing page and theory notes
scripts/ site builders, local server, shard merging