Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Implement in ff_derive the "merged" version of
sqrt_ratiousing the Tonelli--Shanks algorithm as described in Scott's Tricks of the trade article.In broad terms if$\mathbb{F}_p$ , and the same is true for inversions in $\mathbb{F}_p$ . The current implementation $2^{255} - 19$ ) when
p - 1 = 2^s * twithtlarge-ish the bulk of the Tonelli--Shanks algorithm is bundled in a single exponentiation insqrt_ratio_genericrequires 1 inversion and 2 square-roots (hence 3 exponentiations). Writingx = num^3 * divone can bundle all of these into a single "projenitor" calculation. This leads to a speed-up (e.g., ~2.5x forp-1is "not-too-2-adically-small" (with respect top). Whentis 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.