Skip to content

Conversation

@SamFrengley
Copy link

Implement in ff_derive the "merged" version of sqrt_ratio using the Tonelli--Shanks algorithm as described in Scott's Tricks of the trade article.

In broad terms if p - 1 = 2^s * t with t large-ish the bulk of the Tonelli--Shanks algorithm is bundled in a single exponentiation in $\mathbb{F}_p$, and the same is true for inversions in $\mathbb{F}_p$. The current implementation sqrt_ratio_generic requires 1 inversion and 2 square-roots (hence 3 exponentiations). Writing x = num^3 * div one can bundle all of these into a single "projenitor" calculation. This leads to a speed-up (e.g., ~2.5x for $2^{255} - 19$) when p-1 is "not-too-2-adically-small" (with respect to p). When t is small (e.g., the fields used by JubJub, Bls381, Pallas, Vesta) performance is more-or-less comparable (or maybe very slightly worse) since most of the time is soaked up in the "loop" part of Tonelli--Shanks (which, in both cases, is called twice).

Some (naive) comparisons can be found at this link.

New implementation of sqrt_ratio using the modified version of the
Tonelli--Shanks algorithm from https://eprint.iacr.org/2020/1497.pdf
the gain is made mostly when (p - 1) is 2-adically large (3 mod 4, 5
mod 8, etc). In these cases the 1 inversion, 2 sqrts (= 3
exponentiations) of the previous implementation is replaced with 1
merged sqrt-ratio (= 1 exponentiation). Performance should become
similar between the old and new implementations when p - 1 = 2^s * t
with t small.

Main changes:
- Refactor `sqrt_impl` to separate out the Tonelli--Shanks loop logic
- Write new `sqrt_ratio_impl` to generate an implementation for each
prime.
- Write new test to check `sqrt_ratio` behaviour.

Note: Old function `sqrt_ratio_generic` no longer plays a role if
derive is used.
@SamFrengley SamFrengley marked this pull request as draft September 17, 2025 09:49
@SamFrengley SamFrengley marked this pull request as ready for review September 24, 2025 08:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant