如何利用移位运算符进行平方和求余运算?请高手帮忙啊!非常感谢!高分求解!

finalfantasy0915 2009-02-23 01:23:53

uint64_t a=0x1234567890ABCDEF;
uint64_t n=0x01FFFFFFFFFFFFFF;
我要进行c=m^2 mod n
但是速度太慢,如何有效地进行运算,尽量避免除法和不必要的乘法,以移位为主,但是同时变量最大只能保存64位的无整形
如何进行有效地平方运算,缩短运算时间,提高运算速度。请高手支招!!
...全文
934 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongpy 2009-02-24
  • 打赏
  • 举报
回复
例如,m = 10,
m*m = 10<<3 + 10<<1 = 0x64

这个算法的关键是(以最少的运算量)找到ai不为0的一组i的值。
dongpy 2009-02-24
  • 打赏
  • 举报
回复
如果一定要用移位法计算平方,提个思路:
将m拆成2的幂指数的和,然后相乘。
即令m = a0*1<<0+...+ai*1<<i+... i = 0,1,2.... (ai为0或1)

这样,乘法就可以用移位和加法完成.
即m*m = m*(a0*1<<0+...+ai*1<<i+... ) = a0*m<<0 + ... + ai*m<<i + ...
finalfantasy0915 2009-02-23
  • 打赏
  • 举报
回复
我导师给我的建议是m=a^b^c,m^2=a^2+b^2+c^2,中间项全部变为0了,不知道这种方法如何?
finalfantasy0915 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Crazii 的回复:]
平方...貌似不能用位移解决..至少说位移不能解决通用的平方计算..
m mod n 运算只有当n = 2的X次幂的时候,m mod n = m&(n-1)...很遗憾的是这种优化通常编译器自己会帮你做..
[/Quote]

我假设M=m^2
然后用你的方法,运算时间提高了5毫秒,确实不错,还有没有更好的办法?我需要在提速一点
finalfantasy0915 2009-02-23
  • 打赏
  • 举报
回复
如果将m拆分成8个8bits的数 然后进行平方是不是会好一点 然后补零
疯哥哥 2009-02-23
  • 打赏
  • 举报
回复
平方...貌似不能用位移解决..至少说位移不能解决通用的平方计算..
m mod n 运算只有当n = 2的X次幂的时候,m mod n = m&(n-1)...很遗憾的是这种优化通常编译器自己会帮你做..
xiaopoy 2009-02-23
  • 打赏
  • 举报
回复
mod用&代替。
平方用乘法代替。
waizqfor 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 finalfantasy0915 的帖子:]

uint64_t a=0x1234567890ABCDEF;
uint64_t n=0x01FFFFFFFFFFFFFF;
我要进行c=m^2 mod n
但是速度太慢,如何有效地进行运算,尽量避免除法和不必要的乘法,以移位为主,但是同时变量最大只能保存64位的无整形
如何进行有效地平方运算,缩短运算时间,提高运算速度。请高手支招!!
[/Quote]
计算a^n mod k

int powmod(int a, int n, int k)
{
if(n==0) return 1;
int c=powmod(a,n/2,k);
if(b&1) return ((c*c)%k*a)%k;
else return (c*c)%k;
}


69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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