Repository navigation
Releases
Releases · jake1104/GrayNFS
v0.2.6
GrayNFS v0.2.6
0.x carries no compatibility promise.
Highlights
- WASM clock restoration (correctness fix): the wasm
Instantbackend moved from theDatewall clock to monotonicperformance.now(), andelapsed()now diffs against a freshnow()instead of itself (it returned zero by construction). The ECM second tranche and the pilot cost model are correct on wasm again. - ECPP primality proofs live:
is_prime_proof(method="ecpp")produces and verifies certificates at 64-128 bits (12/12 primes certified, 9/9 composites declined, zero disagreements vs BPSW/Frobenius; release 128-bit prove ~3.5 s, ms-scale verify). The 64-bit AKS cap is kept; theis_probable_primehot path is untouched. - Batch throughput: streaming input reads (300k-line RSS 28.6 to 6.8 MB),
--jobs/factor_batch(max_workers=)bounded parallelism preserving input order with memory-budget queuing. - GNFS checkpoint/resume:
--checkpoint/--resumeplus Python support, collector-state serialization with checksum and version, corrupt and version-mismatched files refused. - SNFS as a GNFS special-form path (
methodstaysgnfs): engine reuse with scoped unit handling, honest negative result — the large-form showdown (48 runs) went 0 SNFS / 1 generic / 7 voided on usable-relation starvation, so the scope is narrowed to small special forms in docs. - Browser Web Worker demo with cancel-by-terminate, diagnostics and wall-clock display.
- Version-marking release 0.2.5 to 0.2.6; benchmark cells unchanged.
Breaking changes
- None for the native Rust, Python or CLI surface behavior: every addition is additive-only (
--jobs,--checkpoint/--resume,--no-snfs,use_snfs,max_workers,method="ecpp"), all with defaults preserving existing behavior. - WASM smoke expectation: the hostile105-budget case now accepts a product-verified ECM win inside the 1000 ms budget (single-thread wasm solves it in ~520-600 ms since the clock fix). The wasm
ResourceLimitfailure path is no longer pinned by CI; the native suite still coversResourceLimitextensively.
What's changed
- Clock: monotonic
performance.now()backend via js-sys Reflect withDate.now()fallback; wasm regression pins (nonzero-elapsed, monotonic tick, add/sub round-trip); ECM-tranche and pilot-cost pins proving the control flow. - Smoke + CI:
elapsedMs > 0and wall-clock bounds plus per-stage ranges (theelapsedMs == 0hole is closed); newwasm-build-smokeCI job (wasm check + wasm-pack build + Node smoke); version/api-surface scripts extended to the wasm crate and JS signatures. - SNFS:
snfs.rseligibility gate andx^k +/- a^{k-1},m = a*bconstruction with the scaled identityf(m) == a^{k-1} * N;gnfs_divisor_with_polynomialengine reuse with scoped abs-norm handling; 61-97-bit corpus (8 entries, degrees 3/4/5, both signs); same-budget A/B evidence inbench/snfs/. - Batch: streaming reader keeping the 6-key JSONL schema; order-preserving bounded workers with per-job CPU assignment and memory-budget queuing.
- Checkpoint:
PartialBank, pending maps, union-find, coordinates, position, polynomial and factor-base persisted with checksum and version; tamper/version/n-mismatch refusal; batch rejects checkpoint flags. - Primality: over-64-bit AKS
Falseclarified as unproven-not-composite; ECPP certificate design (verifier-first), reduced prover, integration, release timings. - Docs: README first line is an integer-factorization engine with SIQS (degree 2) and GNFS (degrees 3-5); 512 MiB documented as a soft estimate-based guard; Worker demo linked.
- CI/toolchain fixes: wasm-pack installed via
taiki-e/install-action(jetli/wasm-pack-action@v2does not exist);needless_range_loopiterator forms for the new stable (behavior-neutral).
Benchmarks
- Native CI smoke gate (release, 16 threads, medians of 5, binary
1aef3eab, 2026-11-12): OVERALL PASS 4/4, all product-verified - bit100-deg2 siqs 1878/945 med 192.0 (limit 322.5), bit100-default ecm med 98.0 (limit 197.5), hostile105-deg2 siqs 1177/926 med 618.0 (limit 4290.0), deg3skip-deg2 siqs 240/145 med 18.0 (limit 45.0). - SNFS showdown (release, 1 thread, 120 s budget, 3 reps per arm, 48 runs): 0 SNFS cells / 1 generic (E1, generic 3/3 ~44 s) / 7 voided (systematic relation-deadline or memory walls both arms); every completed run product-verified.
- ECPP (release): 12/12 primes certified and verified, 9/9 composites declined, zero cross-verification disagreements; 128-bit prove ~3.5 s, verify milliseconds.
- WASM smoke on the tagged tree: 3/3 PASS,
version: 0.2.6; hostile105 either a product-verified ECM win (~520-600 ms) or a cleanResourceLimitunder load (either-outcome gate, 3 consecutive exit-0 runs covering both paths). - Full gates on the tagged tree: fmt clean, clippy
-D warningsclean,cargo test --workspaceall green, pytest 67 passed on the attached wheel,check_version9/9,check_api_surface16/16,check_invariants32/32. - Standing pins held exact: 1878/945, 1177/926, 240/145, 3023/2160 standing (3677/2419 historical), b70-deg3 5062/3698 observed-only.
Full Changelog: v0.2.5...v0.2.6
v0.2.5
GrayNFS v0.2.5
0.x carries no compatibility promise.
Highlights
- WebAssembly target:
crates/graynfs-wasmbuilds the engine forwasm32-unknown-unknownwith wasm-bindgen and exposesfactorize(decimal, budgetMs)andversion()to JavaScript. Every call returns JSON (ok/input/factors/factorConfidence/method/degree/polynomial/root/relations/rank/elapsedMs/stages, orok/input/error) and never throws; the wasm build runs single-threaded with a 1000-10000 ms budget, a 512 MiB memory budget and a fixed seed. - Portability seams in the core:
crates/graynfs-core/src/time.rsroutes every productionInstantthrough ajs_sys::Datebackend on wasm and re-exportsstd::time::Instanton native targets;crates/graynfs-core/src/par.rsreports one worker on wasm, and all nine productionthread::scopesites gained a sequential wasm branch with the native block byte-identical. - Version-marking release 0.2.4 to 0.2.5; no factorization-logic change on native targets.
Breaking changes
- None for the native Rust, Python or CLI surface:
FactorReport, CLI JSON and the Python dicts are untouched, and every native parallel path is unchanged. - Additive: the workspace gains the
crates/graynfs-wasmmember, a root.cargo/config.tomlcarrying thegetrandom_backend="wasm_js"cfg forwasm32-unknown-unknown, andcrates/graynfs-wasm/pkg/is git-ignored build output.
What's changed
- Clock seam:
time.rswith a native re-export and a wasmInstant(now,elapsed,duration_since,saturating_duration_since,checked_add,checked_sub, total order,Add/Sub); eleven core modules plusprime.rs'sfor_each_primenow usecrate::time::Instant. - Single-thread parity:
par.rsavailable_workers(); five worker-count sites routed through it; sequential wasm branches atcascade.rs(ECM then SIQS),ecm.rs(two curve batches),general.rs(dependency scan and b-scan),linear_algebra.rs(candidate chunks),relations.rs(range collection with the same CPU/memory/progress accounting) andsiqs.rs(two polynomial rounds). - wasm surface:
factorize/version, aconsole_error_panic_hookstart hook,serde_json-only payload building, the budget clamp, andscripts/wasm-smoke.mjs(Node ESM, raw-byte init) covering10403,600851475143and a 105-bit budget-limited input. - Docs: README
## WebAssemblysection with the build command, the JSON contract and the single-thread limits. - Known limitation, disclosed: the wasm joint stage runs ECM before SIQS, so ECM may consume the deadline that the native race would have shared.
Benchmarks
- Native CI smoke gate (release, 16 threads, medians of 5, binary
35C614D2, 2026-11-10): OVERALL PASS 4/4, all 5/5 product-verified - bit100-deg2 siqs 1878/945 med 173.0 (limit 322.5), bit100-default ecm med 95.0 (limit 197.5), hostile105-deg2 siqs 1177/926 med 621.0 (limit 4290.0), deg3skip-deg2 siqs 240/145 med 14.0 (limit 45.0). - WASM smoke: 3/3 PASS, artifact 888,130 bytes;
10403to101, 103,600851475143to71, 839, 1471, 6857, and the 105-bit corpus input at a 1000 ms budget ends inresource limit exceeded. - Full gates on the tagged tree: fmt clean, clippy
-D warningsclean,cargo test --workspace383 passed / 0 failed, pytest 52 passed on the attached wheel,check_version8/8,check_api_surface14/14,check_invariants32/32. - Standing pins held exact: 1878/945, 1177/926, 240/145. One pre-existing wall-clock test (
ecm_burn_bound_reports_numeric_cap) is load-sensitive; a HEAD control tree reproduces the same intermittent failure and no wasm hunk touches its path.
Full Changelog: v0.2.4...v0.2.5
v0.2.4
GrayNFS v0.2.4
0.x carries no compatibility promise.
Highlights
- Operation cancellation that actually works:
factor_with_progresscallback returningFalsecancels (previously ignored) surfacingGrayNFSError(category=cancelled); new public RustCancellationTokenwithfactor_with_cancellation/factor_with_timings_cancelled; CLI Ctrl+C interrupts long GNFS runs instead of hanging them. - CLI batch mode:
graynfs batch --input numbers.txt [--jsonl] [--continue-on-error]streams one integer per line with per-input JSON Lines records (input/factors/status/method/elapsed_ms/error); a bad line no longer aborts the run under the continue flag. - Per-factor primality confidence:
factor_reportand CLI JSON now carryfactor_confidence(proven_prime | probable_prime | composite) per factor; CLI JSON also emits the previously missingpolynomial/root. Proven means deterministic-u64-Miller-Rabin (rigorous below 2^64), never AKS on the hot path. - GNFS relation product-merge filter + excess/target retune 1.5x+16 to 1.33x+16: deg3skip-deg3 wall down 21% (2015.9 to 1590.0 ms), b70-deg3 wall down 36% (13456.0 to 8566.0 ms), RSS down ~28 MiB each, identical factors throughout (A/B 5/5 product-verified).
- SIQS static-buffer buckets: hostile-105
sieve_markworker-sum down 25.65% at identical call counts (interleaved arms, fully non-overlapping); bit100 guard +2.60% (limit +5%). - ECM cheap-tier per-tier calibration: collection fill up 8.0x/4.1x on ECM wins (measured 0.53/1.03 ms per curve vs the old unmeasured 64).
Breaking changes
- Progress-callback contract: a falsy callback return now requests cancellation (was ignored); truthy/
Nonecontinue as before. Any existing callback returningFalsewill now cancel runs. - Ctrl+C now interrupts the CLI run with a clean
Cancelled/cancelledterminal instead of the default handler. FactorReport, Pythonfactor_reportdicts, and CLI JSON gain additive-only keys (factor_confidence, pluspolynomial/rootin CLI JSON); parsers matching exact key sets should allow the new keys.- Standing pins moved by the measured retune (same factors, fewer relations): deg3skip-deg3 3677/2419 to 3023/2160, observed b70-deg3 5981/3966 to 5062/3698 (both predecessors kept as historical).
What's changed
- Cancellation plumbing:
CancellationToken(Arc<AtomicBool>, clone-shares-state) threaded throughfactor_collected; progress closures check the token at every event; join-fallback precedent kept (no new panics). - Batch CLI: subcommand with streaming reader, additive-only 6-key JSONL schema with golden + abort + parse tests; cancelled/error lines exit non-zero (Ctrl+C mid-batch exits FAILURE).
- Confidence: deterministic-u64-MR-first classifier (AKS off the hot path after it hung a 30-bit factor past 180 s); M11 base set untouched;
aks_calls()==0tripwire on the factor path. - Cost model split: collect-only pilot rate with select added exactly once (
T_GNFS = T_select+T_base+T_collect+T_LA+T_sqrt); GNFS rates kept out of SIQS projections; winning pilots now emit rated need; skip/escalation select asymmetry replayed NO-FLIP (standing adjudicator kept). - Pin system:
bench/pins.jsonis the single spec (standing/observed/historical split); perf_smoke extended to 4 cells with deg3skip-deg2 240/145 (5/5, med 10.0 ms vs 45.0 limit); hostile105-deg2 1177/926 enforced (med 657.0 vs 4290.0 limit); README historical/current split, filtering row corrected for the landed merge. - Front-end instrumentation: additive-only trial/rho/siqs_multiplier timing rows (envelope schema additive-only verified).
- Correctness fixes: drain path no longer drops just-appended filter squares (hoisted post-drain, unit-pinned); batch Ctrl+C exit code; stale
stage_timingsempty-list test pin updated for the new trial row. - CI clippy denies fixed (test-only
retain/[T; N]/iterator forms + one same-branch mapping collapse, behavior-neutral). - KILL ledger (no production change, exact reverts with grep-zero proofs): P-1 stage-2 BSGS (broke the bit100-default standing gate: pm1 745/633 ms vs ecm 144 ms — re-proposable with B2 cap + cost gate), duplicate/freerel removal (dup=0/free=0 on corpus).
- CLOSE ledger (measurement-only, standing adjudicators kept): usable-decay projector (K<=2 pilots cannot separate decaying/saturating cells), select-symmetry replay (12/12 NO-FLIP), component/clique analysis (single components, zero duplicate masks on recorded matrices), 25-digit deg3 finality (double-LP inflates singles bank 9.7x and trips the memory gate at 10.1 s — 18/19/21 stay sealed, no auto-reopen).
Benchmarks
- CI smoke gate (release, 16 threads, medians of 5, binary
e8fb3e42, 2026-11-01 + full-gate rebuild191928ce): OVERALL PASS 4/4, all 5/5 product-verified — bit100-deg2 siqs 1878/945 med 189.0 (limit 322.5), bit100-default ecm med 89.0 (limit 197.5, method pin restored post-KILL), hostile105-deg2 siqs 1177/926 med 657.0 (limit 4290.0), deg3skip-deg2 siqs 240/145 med 10.0 (limit 45.0). - Retuned GNFS cells (A/B -n 5, STOP/load-gated, release pair): deg3skip-deg3 3023/2160 (was 3677/2419) wall 2015.9 to 1590.0 ms, RSS -28.30 MiB; b70-deg3 5062/3698 (was 5981/3966) wall 13456.0 to 8566.0 ms, RSS -28.26 MiB; factors byte-identical both arms.
- Full gates on the tagged tree: fmt clean, clippy -D warnings clean,
cargo test --workspace383 passed / 0 failed, pytest 52 passed on the attached wheel. - Standing pins held exact: 1878/945, 240/145; hostile105 1177/926 with identical factors to the historical 3269/907.
Full Changelog: v0.2.3...v0.2.4
v0.2.3
GrayNFS v0.2.3
0.x carries no compatibility promise.
Highlights
- Knuth-multiplier kept: k=61 picked on hostile-105 degree-2, wall 2204 to 757 ms (2.9x) with factors byte-identical (relations 3269 to 1177); k=1 cells bit-identical; standing pin updated to 1177/926 (3269/907 historical).
- Worker-thread
join().expectreplaced with aFactorErrorfallback, so a panicking worker can no longer take down the run; downstream empty-candidates path panic-free. - Code diet with zero behavior change: staged-but-never-wired siqs tailfit API removed (-247 lines), dead lattice/poly/linear-algebra fns and builders removed,
hashbrown/smallvec/core-serde_jsondeps dropped, fulluse_squfofchain removed.
Breaking changes
use_squfof/--no-squfofchain removed (dead surface;CascadeStage::Squfofvariant and name arm deleted).is_prime_proofdefault staysaks(carried from v0.2.1): over-64-bit inputs return cleanFalse(unproven, not composite).
What's changed
- Algebraic y=0-branch bug fixed in both directions (TDD red then fixed, multiply-back invariant); unreachable-in-production verified via caller-less
with_linear. - Error display and docs:
UnsupportedDegreemessage fixed to 2-5,is_prime_proofraw default aligned toaks, 13-point docs batch,check_invariants.pypins M1/M2 plus M3/M8/M11 (31 checks green with tamper-reds verified). - SIQS cleanup: stale
--no-squfofREADME row deleted (api-surface back to 14/14); cascade stage-2 width memo and per-block LP switch killed with exact reverts. - Dead-code diet: lattice_sieve cluster, poly helpers, unused linear-algebra fns and builders, and the full
use_squfof/--no-squfofchain removed (92/92 green); rust-version 1.85 plus license metadata applied. - KILL ledger (no production change, exact reverts): 16.1, 17.1, 26.1, 27.1, 32.1, 37.2, 38.1 (+38.2 STOP), 39.1, 40.2; 18.x/19.x gated-closed, 7.2/9.2 declined, 20.1 aborted by user order.
Benchmarks
- All benchmark cells unchanged (version-marking release; no factorization-logic change in the bump itself).
- Standing pin updated to 1177/926 (3269/907 kept as historical); k=1 cells bit-identical.
Full Changelog: v0.2.2...v0.2.3
v0.2.2
GrayNFS v0.2.2
0.x carries no compatibility promise.
Highlights
- Measurement foundation: frozen fixed corpus with per-case deadlines, route-separated envelopes (default / forced SIQS / forced GNFS), and a baseline re-run with noise verdicts - all successes product-verified.
- One kept SIQS gain: autotuned trial-division cutoff and 3-pass ladder offsets cut
pass_evaluated271548 to 227895 (-16.08%) with per-pass relations exact and 1878/945 exact 5/5. - Opt-in controls landed:
--max-cpu-secondsbudget guard (additive, defaults unchanged) and estimation pre-check skipping doomed pilot slices at ~0 ms with default-route identities bit-identical.
Breaking changes
- None - version-marking release (0.2.1 to 0.2.2 version-bump propagation, no factorization-logic change in the bump itself).
What's changed
- Corpus and envelopes: frozen cells (100-bit 1878/945, 82-bit 301/251, deg3-skip 3682/2422, hostile-105 3269/907, demo267 ECM, b70) across three routes with timeout/threads/seeds fixed; 132-observation waste meter reads 0 ms waste with a no-change recommendation.
- Dispatch and estimation: projected-total-cost pilot pick on live signals only; record-only estimator shadow rows at 13 guard sites; hard-window extension to 179 bits (ECM wins all three defaults, no GNFS signal at or below 179 bits); STOP/CONTINUE verdict parks GNFS with re-entry conditions recorded.
- SIQS micro-opts: tf-cutoff autotune KEPT; per-block LP switch, bucket-sieve marking, and Gray-code flip KILLED or gated-closed with exact reverts (dominant cost is per-hit Vec traffic, not stride residency or bypass shape).
- REDC and linear algebra: mid-loop BigInt-to-u64 demotion with Barrett finish SURVIVED; n=3/4 unroll arms SURVIVED; u64
a_modresidues, stage-2 width memo, char-columns, mask-dump/output, and product-tree rational all KILLED or gated-closed with exact reverts. - Correctness gates: 10/10 gates green with 4-way taxonomy pinned; proof-vs-probable split documented; YAFU head-to-head refreshed (100-bit 195 vs 213 tie, demo267 506 vs 1194 gray leads) with identities verified.
- Surface and docs:
factor_batchwrapper plus--seedflag, signature-drift coverage in the version guard, perf-smoke script with CI wiring, README winner table and Why-not exclusion rows; escalation-gate change declined, escreen probe aborted by user order with no code applied.
Benchmarks
- Benchmark medians unchanged from v0.2.1.
- Pins held exact: 100-bit 1878/945, hostile-105 3269/907, deg3-skip 3682/2422 throughout the campaign A/B runs.
Full Changelog: v0.2.1...v0.2.2
v0.2.1
GrayNFS v0.2.1
0.x carries no compatibility promise.
Highlights
- Version-bump release: no factorization-logic change in the bump; all benchmark cells unchanged. Payload is the v0.2.0.1-v0.2.0.5 campaign batch below.
- Primality guarantee wording: BPSW is probable, not a proof, with deterministic Miller-Rabin underneath for u64; only the opt-in AKS path proves primality, capped at 64 bits and never on the hot factoring path.
- Race observability plus measured pilot pruning:
race_pilot/race_escalationrecords stay visible on every run, and zero-yield or SIQS-dominated degree-3+ pilots skip on measured signal only.
Breaking changes
is_prime_proofdefaultmethodchanged from"bpsw"to"aks".- Over-64-bit
is_prime_proofinputs refuse cleanly withFalse(false negative by cap, not a wrong proof).
What's changed
- Release-truth repair: the shipped payload cut its own dated release heading with IDs preserved; manifests already carried the release version.
- Limits honesty: default-path wins stay attributed to the cascade stages while forced degree-3+ routes stay research-only; GNFS stays the nominal primary.
- Scheduler parity evidence: joint ECM+SIQS driver vs ECM-alone fallback agrees on identical verified factor sets; envelope agreement is machinery validation with no speedup claims.
- Minor wording: the
first_limitedescalation path logsrate=noneinstead of a fabricated zero; pick priority untouched.
Benchmarks
- All benchmark cells unchanged (version bump 0.2.0 to 0.2.1 with no factorization-logic change in the bump commit).
Full Changelog: v0.2.0...v0.2.1
v0.2.0
GrayNFS v0.2.0
0.x carries no compatibility promise.
Highlights
- Parallel combination scheduler: ECM and SIQS run as a measured parallel combination under a joint driver with checkpoint resume and controller-decided reclaim, with ECM-alone fallback at parity.
- Primality suite: unified deterministic Miller-Rabin core with BPSW as the default gate, auxiliary tests as fast-path filters only, Frobenius opt-in, AKS isolated as proof-only, and rounds/proof APIs split.
- Correctness envelope: 22-composite plus 20-prime corpus with product verification on every factored output, failing closed with
verification_failedinstead ofok.
Breaking changes
- Observed
method/timingsstage names may show new scheduler stage names under the truthful-winner vocabulary; no binding change (Python signatures untouched).
What's changed
- Scheduler: device profiler on live signals only (no constants), cost model projecting ECM vs SIQS from measured rates, slice governor re-projecting after every stage, parallel ECM+SIQS with checkpoint resume and first-verified-factor wins, controller-decided reclaim order, and a record-only four-member parity envelope as the acceptance gate.
- Primality: duplicated u64 Miller-Rabin paths unified; BPSW (base-2 MR plus strong Lucas) as default gate; Fermat and Euler-Solovay as fail-fast filters only; Frobenius opt-in defaulting off; AKS proof-only with 64-bit cap off the hot path; probabilistic rounds split from proof requests.
- Review minors: proof-path GIL detach, total-ordering median comparator, and cost-share rename - all behavior-identical with factoring verdicts unchanged.
Benchmarks
- All benchmark cells unchanged (version bump 0.1.5 to 0.2.0 with no factorization-logic change in the bump commit).
Full Changelog: v0.1.5...v0.2.0
v0.1.5
GrayNFS v0.1.5
0.x carries no compatibility promise.
Highlights
- Behavior-preserving release: factorization logic unchanged; all benchmark cells unchanged.
- Release-stability record: quarantine numeric gates defined with release-green accumulation; blocking flip declined with non-blocking quarantine maintained.
- Docs hygiene: preservation/limits wording, quintic 27-bit scope, and envelope hardening with corrupted-input rejection proven.
Breaking changes
- None - behavior-preserving release, no logic or API change.
What's changed
- Repeat envelopes stayed inside previously recorded ranges with provenance verified; no new speed claims.
- Lift-tail attribution confirmed as SET plus ORDER with bound and scan order unchanged; top-k round 2 parked behind a numeric triple gate.
- Quarantine flow: debug completion record, numeric gates, release-green accumulation, and a ready-to-transition verdict with the flip not executed; blocking flip declined, filters unchanged throughout.
- Envelope robustness: explicit key access, probe import hygiene, and index hardening with success output unchanged.
- Record-keeping: verdict-count sync, evidence notes, citation standard, scope-line correction, and ignore-string cleanup; report wording only, no verdict changes.
Benchmarks
- All benchmark cells unchanged from v0.1.4 (behavior-preserving release, no factorization-logic change).
Full Changelog: v0.1.4...v0.1.5
v0.1.4
GrayNFS v0.1.4
0.x carries no compatibility promise.
Highlights
- Usability batch:
--progressstderr streaming, single-callfactor_report()dict API,GrayNFSError(ValueError)with.category, full CLI help text, and pyi stub sync. - Reliability batch: lift-tail attribution, scoped live memory estimator, forced degree-5 GNFS path, and commit-SHA bench provenance.
- Quarantine policy decided: non-blocking maintained with owner and review recorded; blocking conversion declined for lack of numeric grounds.
Breaking changes
- None - factorization logic unchanged; note the memory-guard thresholds changed, so early
ResourceLimitis possible where runs previously continued.
What's changed
- CLI and Python surface:
--progressstreams stage updates to stderr (--jsonstdout stays pure); hidden reserved--no-squfof; timings-row dedup;skip-preprocessinghelp clarified;GrayNFSErrormessages byte-identical with pass-through for unknown shapes. - Observability: append-only sqrt-scan keys (tried counts, winner order); estimate comparison table across degrees with no coefficient change; guard-table deg4 label row.
- Verification: lift-tail decomposition confirms a difficult path with the square-root bound unchanged; bench-repeat envelopes compared with provenance passing and no new speed claims.
- Release mechanics: version-bump propagation to 0.1.4 with leading release notes, full CI green, wheel
graynfs-0.1.4-cp38-abi3-win_amd64.whlattached.
Full Changelog: v0.1.3...v0.1.4
v0.1.3
GrayNFS v0.1.3
0.x carries no compatibility promise.
Highlights
- Critical hang fix:
integer_rootreplaced with a bracketed binary search in bounded steps, so large perfect-power inputs complete instead of stalling. - Collection-memory guard: live estimates with mid-collection checkpoints in the GNFS collect loop plus SIQS live checks, failing cleanly with
ResourceLimit. - Bench integrity: per-run unique
run_idandverification_failed(instead ofok) when the product check fails.
Breaking changes
FactorReport.methodgainsprime,perfect_square, andperfect_powervalues on the early-exit paths.- Bench
run_idformat is now{task-id}-{nanos}-{pid}-{seq}with a per-process monotonic sequence. - Bench observations report
verification_failedinstead ofokwhen the product check fails. - Perfect-power detection now terminates on large inputs (previously hung above ~80 bits), so large-input runs complete instead of stalling.
What's changed
- Exit-path taxonomy records method names on prime/square/power exits under the conditional-prime rule.
- Sieve-worker cancellation at batch boundaries preserves
ResourceLimitwithout contaminating the retry loop; one duplicate live-budget check removed with no behavior change. - Tail-bound recalibration raises
lift_budget_keeps_soundnesswalls (debug 120 s to 360 s, release 32.5 s to 300 s) after the exactinteger_rootmoved selection from m=1048573 to m=1049290 at equal yield. - Release-gate wiring: CI gates on the version-drift guard plus a separate
gnfs-degreesrelease job with agate.ps1fallback. - Sync batch: disclosure notes, version-bump propagation 0.1.2 to 0.1.3, README release-notes section, and a stale-assertion fix so
wide_gnfs_regressionexpects the truthfulsiqsmethod.
Full Changelog: v0.1.2...v0.1.3