蒙哥马利约减(学习笔记)

蒙哥马利约减_montgomery约简-CSDN博客

这篇博客中的N'是质数N在模R上的逆,即:

        N * N' ≡ 1 mod R

例子:

N=3457R=2^16

R^-1 = 2775 mod N

代码中,N_INV 即 N' == 12929,计算过程如下:

12929*3457 ≡1 mod 2^16

此函数的形参a,已经在蒙哥马利域里了,(乘过3310 = R mod N)

int16_t montgomery_reduce(int32_t a)
{
  int32_t t;
  int16_t u;

  u = a * N_INV;
  t = (int32_t)u * N;
  t = a - t;
  t >>= 16;
  return t;
}

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蒙哥马利模约算法(Montgomery Reduction)是一种在大数运算中广泛使用的高效算法,特别是在进行模数计算时。这个算法主要应用于对大整数进行快速的除法和乘法运算,特别是当模数非常大时,传统的算术方法效率低下。 算法的核心思想是利用数论中的性质,将两个大数的乘法转换为较小数的加法和位移操作,从而大大少了所需的位运算次数。具体步骤如下: 1. **模转换**(Modular Transformation):将一个数 `a` 转换到模 `n` 的 Montgomery 域,这通常涉及将 `a` 和 `n` 的商乘以 `n` 的模平方 `n^2` 加上 `n`(即 `a * n^2 + n`)。 2. **快速乘法**(Fast Multiplication):在 Montgomery 域内,两个数 `a` 和 `b` 的乘积可以通过分治法(如Karatsuba算法)高效地计算,避免了直接对大数的逐位相乘。 3. **还原**(Reconstruction):计算结果在 Montgomery 域内的乘积后,需要将其还原回原来的模 `n`。这通常是通过对结果去 `n` 的适当倍数来完成的。 4. **取模**(Modulo Operation):最后,得到的结果可能大于 `n`,需要对结果取模,以确保其在 `[0, n)` 范围内。 举例来说,假设我们要计算 `(123456789 * 987654321) % 1000000007`,使用蒙哥马利模约算法,首先将每个数转换到模 `1000000007` 的 Montgomery 域,然后执行快速乘法,最后再还原并取模,整个过程大大少了运算的复杂度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值