Skip to content

Releases

v0.2.6

Choose a tag to compare

@jake1104 jake1104 released this 13 Nov 11:41

GrayNFS v0.2.6

0.x carries no compatibility promise.

Highlights

  • WASM clock restoration (correctness fix): the wasm Instant backend moved from the Date wall clock to monotonic performance.now(), and elapsed() now diffs against a fresh now() 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; the is_probable_prime hot 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/--resume plus Python support, collector-state serialization with checksum and version, corrupt and version-mismatched files refused.
  • SNFS as a GNFS special-form path (method stays gnfs): 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 ResourceLimit failure path is no longer pinned by CI; the native suite still covers ResourceLimit extensively.

What's changed

  • Clock: monotonic performance.now() backend via js-sys Reflect with Date.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 > 0 and wall-clock bounds plus per-stage ranges (the elapsedMs == 0 hole is closed); new wasm-build-smoke CI job (wasm check + wasm-pack build + Node smoke); version/api-surface scripts extended to the wasm crate and JS signatures.
  • SNFS: snfs.rs eligibility gate and x^k +/- a^{k-1}, m = a*b construction with the scaled identity f(m) == a^{k-1} * N; gnfs_divisor_with_polynomial engine reuse with scoped abs-norm handling; 61-97-bit corpus (8 entries, degrees 3/4/5, both signs); same-budget A/B evidence in bench/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 False clarified 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@v2 does not exist); needless_range_loop iterator 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 clean ResourceLimit under load (either-outcome gate, 3 consecutive exit-0 runs covering both paths).
  • Full gates on the tagged tree: fmt clean, clippy -D warnings clean, cargo test --workspace all green, pytest 67 passed on the attached wheel, check_version 9/9, check_api_surface 16/16, check_invariants 32/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

Choose a tag to compare

@jake1104 jake1104 released this 10 Nov 14:12

GrayNFS v0.2.5

0.x carries no compatibility promise.

Highlights

  • WebAssembly target: crates/graynfs-wasm builds the engine for wasm32-unknown-unknown with wasm-bindgen and exposes factorize(decimal, budgetMs) and version() to JavaScript. Every call returns JSON (ok/input/factors/factorConfidence/method/degree/polynomial/root/relations/rank/elapsedMs/stages, or ok/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.rs routes every production Instant through a js_sys::Date backend on wasm and re-exports std::time::Instant on native targets; crates/graynfs-core/src/par.rs reports one worker on wasm, and all nine production thread::scope sites 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-wasm member, a root .cargo/config.toml carrying the getrandom_backend="wasm_js" cfg for wasm32-unknown-unknown, and crates/graynfs-wasm/pkg/ is git-ignored build output.

What's changed

  • Clock seam: time.rs with a native re-export and a wasm Instant (now, elapsed, duration_since, saturating_duration_since, checked_add, checked_sub, total order, Add/Sub); eleven core modules plus prime.rs's for_each_prime now use crate::time::Instant.
  • Single-thread parity: par.rs available_workers(); five worker-count sites routed through it; sequential wasm branches at cascade.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) and siqs.rs (two polynomial rounds).
  • wasm surface: factorize/version, a console_error_panic_hook start hook, serde_json-only payload building, the budget clamp, and scripts/wasm-smoke.mjs (Node ESM, raw-byte init) covering 10403, 600851475143 and a 105-bit budget-limited input.
  • Docs: README ## WebAssembly section 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; 10403 to 101, 103, 600851475143 to 71, 839, 1471, 6857, and the 105-bit corpus input at a 1000 ms budget ends in resource limit exceeded.
  • Full gates on the tagged tree: fmt clean, clippy -D warnings clean, cargo test --workspace 383 passed / 0 failed, pytest 52 passed on the attached wheel, check_version 8/8, check_api_surface 14/14, check_invariants 32/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

Choose a tag to compare

@jake1104 jake1104 released this 01 Nov 06:39

GrayNFS v0.2.4

0.x carries no compatibility promise.

Highlights

  • Operation cancellation that actually works: factor_with_progress callback returning False cancels (previously ignored) surfacing GrayNFSError(category=cancelled); new public Rust CancellationToken with factor_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_report and CLI JSON now carry factor_confidence (proven_prime | probable_prime | composite) per factor; CLI JSON also emits the previously missing polynomial/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_mark worker-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/None continue as before. Any existing callback returning False will now cancel runs.
  • Ctrl+C now interrupts the CLI run with a clean Cancelled/cancelled terminal instead of the default handler.
  • FactorReport, Python factor_report dicts, and CLI JSON gain additive-only keys (factor_confidence, plus polynomial/root in 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 through factor_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()==0 tripwire 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.json is 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_timings empty-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 rebuild 191928ce): 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 --workspace 383 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

Choose a tag to compare

@jake1104 jake1104 released this 30 Oct 09:18

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().expect replaced with a FactorError fallback, 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_json deps dropped, full use_squfof chain removed.

Breaking changes

  • use_squfof / --no-squfof chain removed (dead surface; CascadeStage::Squfof variant and name arm deleted).
  • is_prime_proof default stays aks (carried from v0.2.1): over-64-bit inputs return clean False (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: UnsupportedDegree message fixed to 2-5, is_prime_proof raw default aligned to aks, 13-point docs batch, check_invariants.py pins M1/M2 plus M3/M8/M11 (31 checks green with tamper-reds verified).
  • SIQS cleanup: stale --no-squfof README 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-squfof chain 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

Choose a tag to compare

@jake1104 jake1104 released this 25 Oct 08:42

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_evaluated 271548 to 227895 (-16.08%) with per-pass relations exact and 1878/945 exact 5/5.
  • Opt-in controls landed: --max-cpu-seconds budget 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_mod residues, 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_batch wrapper plus --seed flag, 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

Choose a tag to compare

@jake1104 jake1104 released this 23 Oct 13:20

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_escalation records stay visible on every run, and zero-yield or SIQS-dominated degree-3+ pilots skip on measured signal only.

Breaking changes

  • is_prime_proof default method changed from "bpsw" to "aks".
  • Over-64-bit is_prime_proof inputs refuse cleanly with False (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_limited escalation path logs rate=none instead 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

Choose a tag to compare

@jake1104 jake1104 released this 23 Oct 08:06

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_failed instead of ok.

Breaking changes

  • Observed method/timings stage 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

Choose a tag to compare

@jake1104 jake1104 released this 20 Oct 13:11

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

Choose a tag to compare

@jake1104 jake1104 released this 19 Oct 11:00

GrayNFS v0.1.4

0.x carries no compatibility promise.

Highlights

  • Usability batch: --progress stderr streaming, single-call factor_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 ResourceLimit is possible where runs previously continued.

What's changed

  • CLI and Python surface: --progress streams stage updates to stderr (--json stdout stays pure); hidden reserved --no-squfof; timings-row dedup; skip-preprocessing help clarified; GrayNFSError messages 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.whl attached.

Full Changelog: v0.1.3...v0.1.4

v0.1.3

Choose a tag to compare

@jake1104 jake1104 released this 18 Oct 08:17

GrayNFS v0.1.3

0.x carries no compatibility promise.

Highlights

  • Critical hang fix: integer_root replaced 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_id and verification_failed (instead of ok) when the product check fails.

Breaking changes

  • FactorReport.method gains prime, perfect_square, and perfect_power values on the early-exit paths.
  • Bench run_id format is now {task-id}-{nanos}-{pid}-{seq} with a per-process monotonic sequence.
  • Bench observations report verification_failed instead of ok when 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 ResourceLimit without contaminating the retry loop; one duplicate live-budget check removed with no behavior change.
  • Tail-bound recalibration raises lift_budget_keeps_soundness walls (debug 120 s to 360 s, release 32.5 s to 300 s) after the exact integer_root moved selection from m=1048573 to m=1049290 at equal yield.
  • Release-gate wiring: CI gates on the version-drift guard plus a separate gnfs-degrees release job with a gate.ps1 fallback.
  • 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_regression expects the truthful siqs method.

Full Changelog: v0.1.2...v0.1.3