一个关于大整数乘法的问题:位数不相等

rinservent 2014-10-28 01:55:45
传统大整数乘法 给定a,b(位数相等 设为N)

考虑到奇偶的情况

切分为
a1 (N-N/2 位),
a0(N/2位),
b1 (N-N/2 位),
b0(N/2位),

然后

c1 = a1*b1<<n;

c3 = a0*b0;

c2 = (a1*b0+a0*b1)<<N/2 = ((a1+a0)*(b1+b0)-a1*b1-a0*b0)<<N/2;

那么问题来了

对于子问题(a1+a0)*(b1+b0) 必须保证a1+a0的二进制位数等于b1+b0

反例如下:

a = 23,b = 19
二进制:
a = 10111;
b = 10011;

切分后
a1 = 101;
a0 = 11;

b1 = 100;
b0 = 11;

相加后
a1+a0 = 1000(16);
b1+b0 = 111(15);

两者位数不相同

((a1+a0)*(b1+b0)-a1*b1-a0*b0)<<N/2 不再适用 因为N变成了2个

那么该怎么解决呢?
...全文
139 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
rinservent 2014-10-28
  • 打赏
  • 举报
回复
看来没问题了 事实证明一位的相差可以忽略 不过在处理的时候需要取位数低的作为N int sub_bits = caculate_bits(a1+a0)<caculate_bits(b1+b0)?caculate_bits(a1+a0):caculate_bits(b1+b0); int c3 = mutiplation((a1+a0),(b1+b0),sub_bits)-c1-c2;//<<bis_a/2; 另外纠正上面的一个错误 c1 = a1*b1<<n/2*2 而不是 c1 = a1*b1<<n;(考虑奇数情况)

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧