private static MultiplyMontyNIsOne ( uint x, uint y, uint m, ulong mQuote ) : uint | ||
x | uint | |
y | uint | |
m | uint | |
mQuote | ulong | |
return | uint |
private static uint MultiplyMontyNIsOne(
uint x,
uint y,
uint m,
ulong mQuote)
{
ulong um = m;
ulong prod1 = (ulong)x * (ulong)y;
ulong u = (prod1 * mQuote) & UIMASK;
ulong prod2 = u * um;
ulong tmp = (prod1 & UIMASK) + (prod2 & UIMASK);
ulong carry = (prod1 >> 32) + (prod2 >> 32) + (tmp >> 32);
if (carry > um)
{
carry -= um;
}
return (uint)(carry & UIMASK);
}