Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

uint256_mod_inv standard function with a hint #144

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

dragan2234
Copy link

@dragan2234 dragan2234 commented Jan 26, 2023

It would be awesome if we could get this method included in the standard library and whitelisted for usage in starknet since it uses a hint and immediately checks it with this part of the code:

    let (quotient_low, quotient_high, remainder) = uint256_mul_div_mod(a,res,div);
    assert Uint256(low=1,high=0) = (remainder);

Modular inversion is one of the essential elliptic curve computations. And here we have a nice trick to calculate it in the hint and check if after the hint.

For comparison to the EVM: EVM has a precompiled expmod link but implementing expmod in cairo and starknet is another story because of the current state of sequencers on starknet(expmod is computationally heavy computation(~500k steps in cairo for an exponent of 256-bit). And if it is computed in the hint, I currently can't think of any way to check if it is correctly computed in the hint since that would require something like assert quotient*modulus + remainder = base^exponent which is also very expensive for cairo and starknet.

But at least having uint256_mod_inv makes sense


This change is Reviewable

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