Skip to content

Start BigInt.sqrt from a close estimate - #10601

Merged
tim-smart merged 2 commits into
Effect-TS:mainfrom
filipfalcon:bigint-sqrt-start
Nov 13, 2026
Merged

tim-smart merged 2 commits into
Effect-TS:mainfrom
filipfalcon:bigint-sqrt-start

Conversation

@filipfalcon

@filipfalcon filipfalcon commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

TL;DR: BigInt.sqrtUnsafe, and with it BigInt.sqrt, now starts Newton's method from a close floating-point estimate, so large inputs take a few steps instead of a number that grows with their bit count.

Refs #10555

Changes

  • effect/BigInt: sqrtUnsafe started Newton's method at n / 2, which takes about one bigint division for every two bits of the input before the iterate nears the root. It now keeps its negative check and returns the private rootFloor at degree 2. That is the routine nthRoot has used since Add nthRoot and nthRootUnsafe to BigInt and Rational #10555: it starts from a 53-bit floating-point estimate and converges in a few steps. Results and the RangeError for negative inputs are unchanged, and sqrt speeds up through sqrtUnsafe. Patch changeset; no public API change.

Exploratory timings per call on Node.js 24.20.0, in ms:

Input size Before After
8 bits 0.00003 0.00024
32 bits 0.00012 0.00025
64 bits 0.0011 0.00028
1,024 bits 0.25 0.0030
8,192 bits 46 0.082
65,536 bits 7,440 1.9

Inputs below about 40 bits are about 0.2 µs slower per call.

Validation

The existing sqrtUnsafe test retains two new assertions: 2n ** 65536n and 2n ** 65536n - 1n. Together they cover a large exact square and integer-floor correction when the floating-point estimate rounds up immediately below it. No explicit timing assertions or benchmark infrastructure are added.

Takeover validation: the focused BigInt suite (30 tests), pnpm lint-fix, and pnpm check pass under nix develop.

Scope

No fast path for small inputs, and rootFloor is unchanged. No benchmark is added; the timings above come from a standalone script.

Closes EFF-3764

@changeset-bot

changeset-bot Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: bbb8983

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 35 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-amazon-bedrock Patch
@effect/ai-anthropic Patch
@effect/ai-cloudflare Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/ai-typesafe Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-cloudflare Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/graphql-generator Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 39.88 KB 39.88 KB 0.00 KB (0.00%)
basic.ts 7.31 KB 7.31 KB 0.00 KB (0.00%)
batching.ts 11.21 KB 11.21 KB 0.00 KB (0.00%)
brand.ts 7.00 KB 7.00 KB 0.00 KB (0.00%)
cache.ts 11.73 KB 11.73 KB 0.00 KB (0.00%)
config.ts 23.09 KB 23.09 KB 0.00 KB (0.00%)
differ.ts 22.20 KB 22.20 KB 0.00 KB (0.00%)
http-client.ts 27.44 KB 27.44 KB 0.00 KB (0.00%)
http-router.ts 37.35 KB 37.35 KB 0.00 KB (0.00%)
logger.ts 12.19 KB 12.19 KB 0.00 KB (0.00%)
metric.ts 9.65 KB 9.65 KB 0.00 KB (0.00%)
optic.ts 7.21 KB 7.21 KB 0.00 KB (0.00%)
pubsub.ts 16.21 KB 16.21 KB 0.00 KB (0.00%)
queue.ts 13.09 KB 13.09 KB 0.00 KB (0.00%)
schedule.ts 11.99 KB 11.99 KB 0.00 KB (0.00%)
schema-bigdecimal.ts 14.29 KB 14.29 KB 0.00 KB (0.00%)
schema-binary.ts 42.45 KB 42.45 KB 0.00 KB (0.00%)
schema-class.ts 21.96 KB 21.96 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 30.56 KB 30.56 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 28.26 KB 28.26 KB 0.00 KB (0.00%)
schema-string-transformation.ts 15.54 KB 15.54 KB 0.00 KB (0.00%)
schema-string.ts 12.50 KB 12.50 KB 0.00 KB (0.00%)
schema-template-literal.ts 16.43 KB 16.43 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 39.41 KB 39.41 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 26.39 KB 26.39 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 21.11 KB 21.11 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 21.28 KB 21.28 KB 0.00 KB (0.00%)
schema-toFormatter.ts 21.37 KB 21.37 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 26.42 KB 26.42 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 21.45 KB 21.45 KB 0.00 KB (0.00%)
schema.ts 21.05 KB 21.05 KB 0.00 KB (0.00%)
stm.ts 14.40 KB 14.40 KB 0.00 KB (0.00%)
stream.ts 10.56 KB 10.56 KB 0.00 KB (0.00%)

@filipfalcon
filipfalcon marked this pull request as ready for review November 13, 2026 10:53
@tim-smart
tim-smart merged commit 36e335a into Effect-TS:main Nov 13, 2026
15 of 16 checks passed

This branch is waiting to be deployed

1 waiting deployment
fork — bbb89834 Waiting Nov 13, 2026 by effect-bot via approval-gate #26145
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants