【发布时间】:2014-02-28 03:19:11
【问题描述】:
我正在尝试在 C 中将两个 128 位整数相乘。
这是我的算法:
将两个 128 位序列拆分为 S1 和 S2。
然后将 S1 拆分为 S11(前/上半部分)和 S12(后/下半部分),并将 S2 拆分为 S21(前/上半部分)和 S22(后/下半部分)。
将 S12 乘以 S22... = S1222。
将 S11 乘以 S21... = S1121,然后将其乘以 2^128 进行位移
将 S1222 和 S1121 组合为新阵列的前半部分和后半部分。我们称它为“Array1”。新数组的长度是 S1 的两倍。
然后我们必须将 S12 乘以 S21 和 S11 乘以 S22。我将这两者相乘,分别得到 S1221 和 S1122(并相应地对它们进行了位移)。现在我必须将它们添加到 Array1。这是我寻求帮助的部分。我不确定如何将这些一一添加到 Array1。请记住,当您从 Array1 的 3/4 到 Array1 的 1/4 时,可能会有进位 1,因为这是需要添加 S1221 和 S1122 的跨度。
我的问题是:如何将 dstM1 和 dstM2 添加到已经填充的数组 d 中?
【问题讨论】:
-
...你的问题是?
-
如何将dstM1和dstM2添加到已经填充的数组d中。
-
为什么要努力使用
uint32_t和uint64_t,然后使用具有0xffffffffu等值的unsigned数组[4]。unsigned仅保证范围为 0 到 65535。如果您想使用unsigned,1) 准备好变体大小,2) 假设最小 C 规范范围或 3) 只需使用uint32_t。跨度> -
将 a[0..n] 解释为 a[0]*2^32n + a[1]*2^32(n-1) + a[2 不是更容易吗? ]*2^32(n-2) + .. + a[n-1]*2^32 + a[n]*2^0 这就是我们对待小数位的方式。
-
请注意,您可以使用Karatsuba trick 将每个子问题的递归乘法数从 4 降低到 3
标签: c integer-arithmetic