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);
}