Imports
/- Copyright (c) 2026 Google LLC. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. -/ module public import Cryptids.Semantics.Riemann.Gadgets public import Cryptids.Semantics.Riemann.Dispatcher public import Cryptids.Semantics.Riemann.RegisterMachine public import Cryptids.Semantics.Riemann.Analytic

Semantics of the 744-State Riemann Hypothesis Turing Machine (riemann_744)

This file formalizes the semantics of the 744-state baseline Turing machine Machines.riemann744 (riemann_744), connecting its halting problem on the blank tape to the negation of Mathlib's RiemannHypothesis.

Provenance and Attribution

    744-state Riemann Hypothesis Turing machine (riemann_744, 2016): Designed by Yuri Matiyasevich, Scott Aaronson, and Stefan O'Rear in sorear/metamath-turing-machines (machines/2016-riemann-matiyasevich-aaronson-744/riemann.nql), encoding an elementary counterexample search for the Riemann Hypothesis via harmonic numbers and $\operatorname{lcm}(1, \dots, x)$ building on Schoenfeld's (1976) explicit bound for $|\psi(x) - x|$ and Lagarias's (2002) elementary reformulation.

    This formalization (Cryptids.Semantics.Riemann & submodules): Formalized in Lean 4 by Maxence Faldor and Moritz Firsching (using Gemini Argon).

Architecture

The equivalence is factored through the elementary integer predicate MatiyasevichRiemannCounterexample (x : ℕ) : Prop directly computed by riemann.nql:

    Part I (halts_riemann744_iff_exists_counterexample, 0 sorrys): ConjectureMachines.Halts Machines.riemann744 ↔ ∃ x : ℕ, MatiyasevichRiemannCounterexample x

      Layer 1 (Cryptids.Semantics.Riemann.Gadgets): Canonical tape layout (entryCfg, postPcCfg), return scan loops, 11-bit ripple-carry PC adder, and primitive unary register operations (reg_init_eval, reg_incr_eval, reg_decr_eval).

      Layer 2 (Cryptids.Semantics.Riemann.Dispatcher): Bounded-window symbolic evaluator (WinState), complete 2,048-entry BDD instruction decoder (program : ℕ → Instr), reachable invariant (RegInv), and halting simulation (halts_reference_iff_regHalts).

      Layer 3 (Cryptids.Semantics.Riemann.RegisterMachine): Complete verification of the 16-register NQL counter machine (regHalts_iff_exists_counterexample).

    Part II (Cryptids.Semantics.Riemann.Analytic): (∃ x : ℕ, MatiyasevichRiemannCounterexample x) ↔ ¬ RiemannHypothesis Proves the identity $\psi(x) = \log \operatorname{lcm}(1, \dots, x)$, the Euler–Mascheroni harmonic bounds, and the reduction to Schoenfeld's (1976) explicit bound and Schmidt's (1903) oscillation theorem.

@[expose] public sectionnamespace ConjectureMachines.Semantics.Riemannopen Turing StateTransition

Unconditional halting equivalence between the 744-state Turing machine Machines.riemann744 and the 16-register NQL counter machine RegHalts, combining Layer 1 and Layer 2.

theorem halts_reference_iff_regHalts_unconditional : ConjectureMachines.Halts Machines.riemann744 ↔ RegHalts := ⊢ ConjectureMachines.Halts Machines.riemann744 ↔ RegHalts ⊢ ∀ (pc : ℕ) (regs : List ℕ), pc + 1 < 2048 → ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg 32 pc regs) = some (entryCfg (pc + 1) (regs ++ [0]))⊢ ∀ (k : Fin 16) (pc : ℕ) (regs : List ℕ), ↑k < regs.length → pc + 1 < 2048 → ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regIncrState ↑k) pc regs) = some (entryCfg (pc + 1) (regs.set (↑k) (regs.getD (↑k) 0 + 1)))⊢ ∀ (k : Fin 16) (pc : ℕ) (regs : List ℕ), ↑k < regs.length → pc + 2 < 2048 → ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regDecrState ↑k) pc regs) = some (if (regs.getD (↑k) 0 == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs.getD (↑k) 0 - 1))) ⊢ ∀ (pc : ℕ) (regs : List ℕ), pc + 1 < 2048 → ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg 32 pc regs) = some (entryCfg (pc + 1) (regs ++ [0])) pc:ℕregs:List ℕa✝:pc + 1 < 2048⊢ ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg 32 pc regs) = some (entryCfg (pc + 1) (regs ++ [0])) All goals completed! 🐙 ⊢ ∀ (k : Fin 16) (pc : ℕ) (regs : List ℕ), ↑k < regs.length → pc + 1 < 2048 → ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regIncrState ↑k) pc regs) = some (entryCfg (pc + 1) (regs.set (↑k) (regs.getD (↑k) 0 + 1))) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 1 < 2048⊢ ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regIncrState ↑k) pc regs) = some (entryCfg (pc + 1) (regs.set (↑k) (regs.getD (↑k) 0 + 1))) All goals completed! 🐙 ⊢ ∀ (k : Fin 16) (pc : ℕ) (regs : List ℕ), ↑k < regs.length → pc + 2 < 2048 → ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regDecrState ↑k) pc regs) = some (if (regs.getD (↑k) 0 == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs.getD (↑k) 0 - 1))) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048⊢ ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regDecrState ↑k) pc regs) = some (if (regs.getD (↑k) 0 == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs.getD (↑k) 0 - 1))) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))⊢ ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regDecrState ↑k) pc regs) = some (if (regs.getD (↑k) 0 == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs.getD (↑k) 0 - 1))) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))⊢ ∃ s, 1 ≤ s ∧ nSteps refM s (postPcCfg (regDecrState ↑k) pc regs) = some (if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))⊢ nSteps refM s (postPcCfg (regDecrState ↑k) pc regs) = some (if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))⊢ some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) = some (if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))⊢ (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) = if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))hz:regs[↑k] = 0⊢ (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) = if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))hz:¬regs[↑k] = 0⊢ (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) = if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))hz:regs[↑k] = 0⊢ (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) = if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)) All goals completed! 🐙 k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))hz:¬regs[↑k] = 0⊢ (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) = if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)) k:Fin 16pc:ℕregs:List ℕhk:↑k < regs.lengtha✝:pc + 2 < 2048s:ℕhs:1 ≤ sheval:nSteps Layer1.reference s (postPcCfg (regDecrState ↑k) pc regs) = some (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)))hz:¬regs[↑k] = 0hbeq:(regs[↑k] == 0) = false⊢ (if regs[↑k] = 0 then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1))) = if (regs[↑k] == 0) = true then entryCfg (pc + 1) regs else entryCfg (pc + 2) (regs.set (↑k) (regs[↑k] - 1)) All goals completed! 🐙

2. Two-Part Decomposition of the Main Equivalence

Part I (Turing Machine ↔ Elementary Counterexample): The 744-state baseline machine riemann_744 (Machines.riemann744) halts on the blank tape if and only if there exists an integer x satisfying MatiyasevichRiemannCounterexample x.

theorem halts_riemann744_iff_exists_counterexample : ConjectureMachines.Halts Machines.riemann744 ↔ ∃ x : ℕ, MatiyasevichRiemannCounterexample x := halts_reference_iff_regHalts_unconditional.trans regHalts_iff_exists_counterexample

The 744-state baseline machine riemann_744 (Machines.riemann744) halts on the blank tape if and only if the Riemann Hypothesis is false.

theorem halts_riemann744_iff_not_riemannHypothesis : ConjectureMachines.Halts Machines.riemann744 ↔ ¬ RiemannHypothesis := halts_riemann744_iff_exists_counterexample.trans exists_counterexample_iff_not_riemannHypothesisend ConjectureMachines.Semantics.Riemann