Repository navigation
feat(WordRAM/PPSZ): the PPSZ algorithm on the randomized word RAM - #1990
Conversation
…RAM (#894 M2) One trial of Schöning's k-SAT algorithm as a randomized word-RAM program whose final assignment has exactly the law of `Schoening.trial` (#908), with an explicit instruction bound and `4 n` rand calls; the amplified algorithm with failure probability exactly `(1 - p) ^ R` and at most `e ^ (-c)` for `schoeningTrials k n c` trials on satisfiable k-CNFs; and the generic `ExecRandLaw` rules for exact laws of structured randomized programs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
…tion on R (#894 M2) The amplified Schöning program now computes the trial count `schoeningTrials k n c` itself, on the input `k :: c :: encode φ`, in a multiword counter in memory (one binary digit per word), and the amplified theorems need only `L + 6n + 4k + 2c + counterLen k n c + 2 < 2^w`, a logarithmic word size, instead of `R < 2^w`. - `Counter.lean`: multiply-add, floor division and decrement on a memory digit array, specified against functions on digit lists; amortized decrement cost (`decSteps_add_count_le`). - `TrialCount.lean`: the digits computed by the setup have value `schoeningTrials k n c`, with at most `counterLen k n c` digits. - `Trial.lean`: `Frame` records that a trial never writes after the assignment, where the counter lives. - `Amplify.lean`: setup, counted loops, trial loop with the counter, and `ampProgram_spec` / `ampProgram_failure_le_exp` without `R < 2^w`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
…rithm `ampTime_le`: `ampTime k n c L ≤ 900 (n + k + L + 1)^3 (2(k-1)/k)^n (c + 1)`, from `schoeningTrials_le` (the trial count is at most `(9n + 4)(2(k-1)/k)^n c`, using `(k/(k-1))^(k-3) ≤ 3`) and `counterLen_le`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
…ter the assignment Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
The input length L does not bound n or k: a formula without clauses has L = 3 for every n. State the word size as O(log(n + k + L + c)), and O(log(L + c)) only for fixed k and n = O(L). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
#894 M2) Two building blocks for one PPZ round on the randomized word RAM. FineGrained/PPZ/LazyOrder: roundOn O g τ processes g 0, ..., g (m - 1) in a uniformly random order. roundOn_succ gives its Fisher-Yates form: choose p uniformly, process g p, then recurse on g with positions 0 and p swapped, from position 1 on (Equiv.Perm.decomposeFin). roundWith_eq_roundOn identifies PPZ and PPSZ rounds with roundOn on all variables, so a RAM round can sample its order lazily. Algorithms/WordRAM/PPZ/Forced: forcedCode stores the word of PPZ.forced φ τ x, with τ stored as words 0/1/2, by at most two clause scans (polarity true, then false), within 28 E + 15 instructions and without changing memory (forcedCode_spec). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
…exact law (#894 M2) The round keeps the unprocessed variables in an array and, at step i, swaps a uniformly drawn P[j], j in [i, n), into position i, then sets that variable to its forced value (forcedCode) or a uniform bit. Each iteration matches roundOn_succ, so the loop has the law of roundOn and the whole round the law of PPZ.round. The final satisfaction check reuses Schoening's scan, renamed into the 32-register file. roundProgram_spec: halting within n (28 L + 40) + 12 L + 19 instructions, at most 2 n rand calls, a correct satisfaction output, and the exact law PPZ.round phi of the partial assignment left in memory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
…M2) On the input k :: c :: encode phi, ampProgram computes R = 2^ceil((k-1)n/k) * c in a multiword counter (zero digits, a one, then Schoening's mulAdd by c, renamed into the PPZ register file) and runs up to R rounds of #1954's roundCore, stopping at the first satisfying assignment. ampProgram_spec: halting within ampTime, at most 2 n R rand calls, no false positives, and the exact output law repeatRound phi R. ampProgram_failure_le_exp: failure at most e^(-c) on satisfiable k-CNFs, from the merged round_success_of_satisfiable. ampTime_le: time at most 200 (n + L + 1)^2 2^((1 - 1/k) n) (c + 1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
PPSZ's oracle `PPSZ.implied` as a word-RAM program with an exact contract. - `PPSZ.wImplied_iff_test`: w-implication is a finite search over sections: `τ x = some b`, or some choice of `w` clauses has no compatible choice of one literal per clause under `τ[x ↦ !b]`. - `nextSection_sections`: the odometer step enumerates `List.sections`. - `impliedCode_spec`: on the stored clauses and partial assignment, the program stores `optCode (implied φ s τ x)`, leaves memory unchanged (its 2 s scratch words are cleared), within `impliedTime s E ≤ 140 (s + 1)^2 (E + 1)^(2 s)` instructions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
…s exact law (#894 M2) Make the PPZ round loop generic in its oracle code (`IsOracleCode`, `roundBodyWith`/`roundLoopWith`/`roundCoreWith` and their laws), keeping the PPZ names and statements as instances at `forcedCode`. Use it with `impliedCode` for one PPSZ round on the input `s :: encode φ`, whose output law is exactly `PPSZ.round φ s` (`PPSZ.roundProgram_spec`). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
… M2)
Generalize PPZ's amplified loop and counter setup over the round body
(`IsRoundCore`, `ampLoopWith`, `repeatRoundWith`, `countSetup_spec`), keeping
PPZ's statements. Run up to `2^⌈a n / b⌉ c` rounds of PPSZ on the input
`s :: a :: b :: c :: encode φ`, with the exact law of repeated rounds, no false
positives, failure at most `e^{-c}` when `1 - qbar k h ≤ a / b`, and time
`O((s+1)^2 (n+L)^(2s+1) 2^((a/b) n) (c+1))`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
|
|
M2) Factor the amplification step (`le_ppszRounds_mul`, `ampProgram_failure_le_exp_of_le`) and add `ampProgram_failure_le_exp_limit` from `round_success_limit`: for k ≥ 3 and ε > 0 there is a bound `s` with failure at most `e^{-c}` for every `a / b ≥ 1 - μ_k / (k - 1) + ε`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
|
|
edemaine
left a comment
There was a problem hiding this comment.
reviewer-codex-edemaine (independent non-author agent): APPROVE at 9b9d41b. No blocking findings in the complete five-file layer over #1986; unchanged oracle/round coverage is reused.
IsRoundCore preserves the counter registers and restores memory outside the assignment/order arrays. The generalized loop keeps the parameter words S before the counter, resets each round, and has the exact independent repeatRoundWith law. PPZ specializes to forced φ and S=[] with unchanged program meaning and bounds; its existing theorem signatures are unchanged except ampLoop_law's explicit [] specialization. PPSZ places s and zero scratch before the counter and computes 2^⌈an/b⌉c on the machine. The word-fit bound covers setup arithmetic, scratch and multiword carries; c=0 and n=0 are included, and denominator positivity is required only by the quantitative rational bounds. Verification prevents false positives.
The finite-depth and ε failure theorems correctly compose the existing General.round_success results with the event probability, reverse the exponent comparison appropriately, and amplify to e^(−c). The checked 3-CNF instance discharges s=3 and 1−qbar=39/70. ampTime_le includes counter setup, verification and rounding, with a polynomial oracle factor only for fixed s. ROADMAP keeps the uniform o(n) form and abstract work open; existing curated abstracts/rendering are unaffected.
Supplemental source-interpreted checks passed 249 inputs / 1,153 complete paths against independently computed eager PPSZ repeated probabilities, including no false positives, memory/scratch preservation, minimum word fit and instruction/random bounds; 224 generic counter setups also passed with arbitrary initial memory/registers. These finite checks are not Lean elaboration. diff --check passed. Author reports all six gates before the final theorem addition and focused checks afterward; no reviewer Lean build. At the single CI inspection, Lean 41183081802 was running; Guide and title passed. Live head/history rechecked. Agent review, not human approval.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG
|
|
|
Carry-forward record (
|
worker-claude-e6cf7b0d-ppsz-round(Claude Code, Opus), undercoordinator-claude-e6cf7b0d. Part of #894 (M2). Stacked on #1986 (claude/ppsz-round-894), which is stacked on #1980 → #1960 → #1954. Review the diff against #1986's branch. I'll mergemaininto this branch as the parents land.Change
This PR adds the PPSZ algorithm with amplification on the randomized word RAM. With it, the PPSZ part of #894 M2 is done except for an abstract.
PPSZ.ampProgram_speccovers the inputs :: a :: b :: c :: encode φof lengthL, at any word size withL + 2n + 2s + an + b + 2c + ppszCounterLen a b n c + 3 < 2^w. The program:R = ppszRounds a b n c = 2^⌈an/b⌉ · con the machine;Rrounds of PPSZ with the bounds(feat(WordRAM/PPSZ): one PPSZ round on the randomized word RAM with its exact law #1986);ampTime s a b c n Linstructions, with at most2nRrandcalls;1only with a satisfying assignment in memory, so it has no false positives;1with exactly the lawrepeatRoundWith (implied φ s) φ R.The failure and time bounds:
ampProgram_failure_le_expbounds the failure probability bye^{−c}under these hypotheses:φis satisfiable, its clauses have at mostk ≥ 3literals,s ≥ ∑_{i<h} (k−1)^i,0 < band1 − qbar k h ≤ a/b.ampProgram_failure_le_exp_threeis the case(s, a, b) = (3, 39, 70)on 3-CNF, viaqbar_three_two. It runs2^⌈39n/70⌉ crounds, about1.471^n c.ampProgram_failure_le_exp_limitis the ε-form, fromround_success_limit. Fork ≥ 3andε > 0there is anssuch that the failure probability is at moste^{−c}for everya/b ≥ 1 − μ_k/(k−1) + ε.ampTime_le: the time is at most600 (s+1)² (n+L+1)^(2s+1) 2^((a/b) n) (c+1).ampProgram_failure_le_exp_of_le: a per-round bound2^{−(a/b) n}gives failure at moste^{−c}.Round count, as posted on #894. The merged success bound for one round is
2^{−(1 − qbar k h) n}(#1605).qbar k his an integral, and the program does not compute it. Instead, the input supplies a rational bounda/bon the exponent. The setup computes⌈an/b⌉with one multiply, add, subtract and divide, then reuses PPZ's counter setup; PPZ is the case(a, b) = (k−1, k). Only thee^{−c}theorem uses1 − qbar k h ≤ a/b. The exact law and the absence of false positives hold for every input.#1960's loop, generalized in place (
PPZ/Amplify.lean). PPZ's definitions and theorem statements are unchanged.repeatRoundWith OandroundSuccessProbWith OgeneralizerepeatRoundandroundSuccessProb, which are now their instances atforced φ.repeatRoundWith_false_toRealis generalized the same way.repeatRoundWith_false_le_expandsum_le_roundSuccessProbWithare new. The second converts the sum form of the PPSZ bounds into the event form.IsRoundCore w φ C Tb S O core Tcis the contract of a round body forO, whose frame memory holds the wordsSafter the order array.ampLoopWith coreandampLoopWith_lawtake any such body.AmpStategains the wordsS(fieldparams), and the counter sits after them. PPZ usesS = [].countSetup_specis the counter setup for any2^e c, and PPZ'scountSetup_execnow follows from it.countDigits e cnames the digit list.PPSZ/Amplify.leancontains:roundCore_isRoundCore, withS = s :: replicate (2s) 0;stoTb + 2nand puts the counter atTb + 2n + 1 + 2s;ampProgram_spec, the failure bounds and the time bound.Existing notions considered
IsRoundCoreis new. It names the round-body contract that feat(WordRAM/PPZ): the PPZ algorithm on the randomized word RAM #1960's loop used inline throughroundCore_law, so that PPZ and PPSZ each discharge it once.repeatRoundWith,roundSuccessProbWithandcountDigitsgeneralize or name existing PPZ definitions instead of adding PPSZ copies.ppszExp,ppszRounds,ppszDigitsandppszCounterLenmirror PPZ'sppz*definitions for the bounda/b.Source
The algorithm is PPSZ with w-implication, after [PaturiPudlakSaksZane2005] and [Hertli2011]. The success bound comes from the library's
round_success_of_satisfiable(#1605), and no locators are cited here.Limits
a/bis an input, and thee^{−c}theorem takes1 − qbar k h ≤ a/bas a hypothesis.(L+1)^{2s}, which is polynomial only for fixeds.Abstract impact: none.
Validation
71d08ed06,scripts/check.sh --quick --base origin/claude/ppsz-round-894fell back to all six gates (ROADMAP.mdchanged), and all passed.9b9d41b5f) adds the ε-form and factors the shared step. After it I reran:lake build Complexity.Algorithms.WordRAM.PPSZ.Amplify --wfail;lake lint,lake exe lint-style,lake exe mk_all --checkandscripts/check_hygiene.py.ComplexityTests/WordRAMPPSZ.lean(x₀ ∧ (¬x₀ ∨ x₁)):decide, includingppszExp 2 3 5 = ppzExp 3 5;decide:slands atTb + 2n, and the counter20 = 0b10100lands after the six scratch words;ampProgram_specinstantiated atw = 8;e^{−5}fromampProgram_failure_le_exp_three.ampProgram_spec,ampProgram_failure_le_exp, the counter run) pass unchanged.AI assistance
Written by Claude Code (Opus). Not yet independently reviewed.
🤖 Generated with Claude Code
https://claude.ai/code/session_015DLg8kwPs8yi7ePPdtoNvG