模块化运算:原理、实现与特殊模值处理
1. 模块化约简基础
模块化约简在很多领域都有重要应用,尤其是在密码学中。我们先来看几个模块化约简的例子:
- 例 1:设 (x = 101110011000_2 = 2968),(m = 10001_2 = 17)。将 (x) 按每 4 位分组,(j = 3) 时,(x_2 = 1011_2 = 11),(x_1 = 1001_2 = 9),(x_0 = 1000_2 = 8)。则 (2968\bmod{17}=(11 - 9 + 8)\bmod{17}=10)。
- 例 2:设 (x = 1101101110011000_2 = 56216),(m = 10001_2 = 17)。(j = 4) 时,(x_3 = 1100_2 = 13),(x_2 = 1011_2 = 11),(x_1 = 1001_2 = 9),(x_0 = 1000_2 = 8)。则 (56216\bmod{17}=(-13 + 11 - 9 + 8)\bmod{17}=-3\bmod{17}=14)。
2. 特殊模值 (2^n - 1) 的实现
在模块化运算中,模值为 (2^n - 1) 的情况比较常见。在 (n) 位操作数的模 ((2^n - 1)) 加法中,判断中间结果与模值的大小关系相对容易:
- 若中间结果小于模值,加法无进位输出,结果就是模 (2^n - 1) 的正确结果。
- 若中间结果大于模值,有进位输出,丢弃进位并加 1 就得到模 (2^n - 1) 的正确结果。
- 若中间结果等于模值(二进制为 (11\cdots1)),情况稍复杂,需单独检测,然后加 1 并丢弃进位得到正确结果。
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



