RNS 到 MRS 的转换算法详解
1. 基本概念
1.1 剩余数系统(Residue Number System, RNS)
RNS 是一种非位权数制。给定一组两两互素的模数集合 {m₀, m₁, ..., m_{k-1}},任意整数 X(在范围 [0, M) 内,其中 M = m₀ × m₁ × ... × m_{k-1})可以用一组余数来唯一表示:
X = (x_{k-1} | x_{k-2} | ... | x₀)_{RNS(m_{k-1} | m_{k-2} | ... | m₀)}其中 x_i = X mod m_i。
特点:RNS 各通道之间相互独立,加法和乘法可以并行完成,但比较大小和溢出检测非常困难。
1.2 混合基数系统(Mixed Radix System, MRS)
MRS 是一种位权数制。同一个整数 X 可以表示为:
X = (a_{k-1} | a_{k-2} | ... | a₀)_{MRS(m_{k-1} | m_{k-2} | ... | m₀)}其展开式为:
X = a₀
+ a₁ × m₀
+ a₂ × m₀ × m₁
+ a₃ × m₀ × m₁ × m₂
+ ...
+ a_{k-1} × m₀ × m₁ × ... × m_{k-2}其中每个系数满足 0 ≤ a_i < m_i。
特点:MRS 是位权表示,可以方便地进行大小比较,因此 RNS → MRS 的转换在实际应用中非常重要。
2. 转换算法
2.1 算法伪代码
Algorithm: Conversion from RNS to MRS
Input: X = (x_{k-1} | x_{k-2} | ... | x₀)_{RNS(m_{k-1} | m_{k-2} | ... | m₀)}
Output: X = (a_{k-1} | a_{k-2} | ... | a₀)_{MRS(m_{k-1} | m_{k-2} | ... | m₀)}
1: Y₀ := X
2: a₀ = Y₀ mod m₀
3: for i := 0 to k - 2 do
4: Y_{i+1} = (Y_i - a_i) · |1/m_i|
5: a_{i+1} = Y_{i+1} mod m_{i+1}
6: end for2.2 算法原理
算法的核心思想是逐步剥离 MRS 的各个系数,从最低位 a₀ 开始,依次求出 a₁, a₂, ..., a_{k-1}。
回顾 MRS 展开式:
X = a₀ + a₁·m₀ + a₂·m₀·m₁ + a₃·m₀·m₁·m₂ + ...第 1 步:求 a₀
对 X 取模 m₀:
X mod m₀ = a₀ (因为后面所有项都包含因子 m₀,模 m₀ 后为 0)第 2 步:消去 a₀ 并缩小问题
(X - a₀) = a₁·m₀ + a₂·m₀·m₁ + a₃·m₀·m₁·m₂ + ...两边除以 m₀(在模运算中等价于乘以 m₀ 的模逆元 |1/m₀|):
(X - a₀) / m₀ = a₁ + a₂·m₁ + a₃·m₁·m₂ + ...此时新的值 Y₁ 的结构与原始问题完全相同,只是少了一位。对 Y₁ 取模 m₁ 即可得到 a₁。
第 3 步及之后:重复上述过程,直到所有系数都被提取出来。
2.3 关键操作:模逆元(Modular Multiplicative Inverse)
算法第 4 步中的 |1/m_i| 是 m_i 在其余各模数下的乘法逆元。
定义:a 在模 n 下的乘法逆元 a⁻¹ 满足 a · a⁻¹ ≡ 1 (mod n)。
逆元存在的充要条件是 gcd(a, n) = 1,即 a 与 n 互素。
由于 RNS 要求所有模数两两互素,因此 m_i 在其他所有模数 m_j(j ≠ i)下的逆元一定存在。
在 RNS 中,乘以 |1/m_i| 表示在每个剩余通道中分别乘以 m_i 对该模数的逆元。
3. 完整示例
3.1 问题
将 X = (7|4|1|1)_{RNS(9|7|5|2)} 转换为 MRS 表示。
模数集合为 {m₀, m₁, m₂, m₃} = {2, 5, 7, 9}(从右到左对应)。
3.2 预计算:所需的模逆元
| 逆元 | 计算方式 | 结果 |
|---|---|---|
| 2⁻¹ mod 5 | 2 × 3 = 6 ≡ 1 (mod 5) | 3 |
| 2⁻¹ mod 7 | 2 × 4 = 8 ≡ 1 (mod 7) | 4 |
| 2⁻¹ mod 9 | 2 × 5 = 10 ≡ 1 (mod 9) | 5 |
| 5⁻¹ mod 7 | 5 × 3 = 15 ≡ 1 (mod 7) | 3 |
| 5⁻¹ mod 9 | 5 × 2 = 10 ≡ 1 (mod 9) | 2 |
| 7⁻¹ mod 9 | 7 × 4 = 28 ≡ 1 (mod 9) | 4 |
说明:|1/m₀| = |1/2| 在各模数下分别为 (5|4|3|-),其中 "-" 表示 m₀ 自身不参与。
3.3 逐步求解
初始状态:
Y₀ = X = (7|4|1|1)
↑
对应模数: (9|7|5|2)第 0 步:求 a₀
a₀ = Y₀ mod m₀ = 1 mod 2 = 1在 RNS 中,Y₀ 的最右位 x₀ = 1 就是 X mod m₀ = X mod 2 的值。
第 1 步:求 Y₁ 和 a₁
1. 计算 Y₀ - a₀(在各通道分别减去 a₀ = 1):
Y₀ - a₀ = (7|4|1|1) - (1|1|1|1)
= (7-1 mod 9 | 4-1 mod 7 | 1-1 mod 5 | 1-1 mod 2)
= (6|3|0|-)最右通道(mod 2)已用完,标记为 "-"。
2. 乘以 |1/m₀| = |1/2|(各通道分别乘以 2 的逆元):
Y₁ = (6|3|0|-) × (5|4|3|-)
= (6×5 mod 9 | 3×4 mod 7 | 0×3 mod 5 | -)
= (30 mod 9 | 12 mod 7 | 0 mod 5 | -)
= (3|5|0|-)3. 提取 a₁:
a₁ = Y₁ mod m₁ = 0 mod 5 = 0取 Y₁ 对应 m₁ = 5 的通道值,即第二位(从右数)= 0。
第 2 步:求 Y₂ 和 a₂
1. 计算 Y₁ - a₁(各通道减去 a₁ = 0):
Y₁ - a₁ = (3|5|0|-) - (0|0|0|-)
= (3|5|-|-)mod 5 的通道也已用完,标记为 "-"。
2. 乘以 |1/m₁| = |1/5|(各通道分别乘以 5 的逆元):
Y₂ = (3|5|-|-) × (2|3|-|-)
= (3×2 mod 9 | 5×3 mod 7 | - | -)
= (6 mod 9 | 15 mod 7 | - | -)
= (6|1|-|-)3. 提取 a₂:
a₂ = Y₂ mod m₂ = 1 mod 7 = 1第 3 步:求 Y₃ 和 a₃
1. 计算 Y₂ - a₂(各通道减去 a₂ = 1):
Y₂ - a₂ = (6|1|-|-) - (1|1|-|-)
= (5|-|-|-)2. 乘以 |1/m₂| = |1/7|(仅剩 mod 9 通道):
Y₃ = (5|-|-|-) × (4|-|-|-)
= (5×4 mod 9 | - | - | -)
= (20 mod 9 | - | - | -)
= (2|-|-|-)3. 提取 a₃:
a₃ = Y₃ mod m₃ = 2 mod 9 = 23.4 汇总结果
| 系数 | 值 |
|---|---|
| a₀ | 1 |
| a₁ | 0 |
| a₂ | 1 |
| a₃ | 2 |
最终转换结果:
X = (7|4|1|1)_{RNS(9|7|5|2)} = (2|1|0|1)_{MRS(9|7|5|2)}3.5 验证
用 MRS 展开式还原十进制值:
X = a₀ + a₁·m₀ + a₂·m₀·m₁ + a₃·m₀·m₁·m₂
= 1 + 0×2 + 1×(2×5) + 2×(2×5×7)
= 1 + 0 + 10 + 140
= 151用 RNS 验证:
151 mod 2 = 1 ✓
151 mod 5 = 1 ✓
151 mod 7 = 4 ✓
151 mod 9 = 7 ✓两种表示一致,转换正确。
4. 算法复杂度与特点
| 方面 | 说明 |
|---|---|
| 时间复杂度 | O(k²),共 k-1 次迭代,每次迭代对剩余通道做减法和乘法 |
| 所需预计算 | 所有 m_i 在 m_j (j > i) 下的模逆元,共 k(k-1)/2 个 |
| 优势 | 转换后可直接比较大小、检测溢出 |
| 局限 | 过程是串行的——必须先求出 a_i 才能求 a_{i+1} |
5. 总结
RNS → MRS 转换的本质是一个逐步剥离的过程:
- 对最小模数取模,得到最低位系数
- 减去该系数,使结果能被当前模数整除
- 在模运算下"除以"当前模数(乘以模逆元)
- 丢弃已用完的通道,对下一个模数重复上述过程
这一过程将 RNS 的非位权表示转化为 MRS 的位权表示,从而解决了 RNS 中难以直接完成的大小比较等问题。