大数取模问题

dzh696 2008-03-14 08:33:39
大数取模如:2147483647 的 2147483647次方与28461取模,算法如何设计呢,初学啊,大家帮帮忙。
...全文
987 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuecyuyan 2010-07-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mathe 的回复:]

下面代码计算(m**n) %mod

C/C++ code

int f(int m,int n, int mod){
int mul=m%n;
int r=1;
while(n){
if(n&1){r*=mul;r%=mod;}
mul*=mul;mul%=mod;
n>>=1;
}
return r;
}
[/Quote]
请问mul是为什么呀 ~为什么要用这个?谢谢
lianjay 2009-07-28
  • 打赏
  • 举报
回复
楼上写汇编啊,厉害厉害,当初俺就是不想学汇编
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
不会,帮顶
无心人 2008-03-16
  • 打赏
  • 举报
回复
嘿嘿
汇编啊

写C/C++不如写汇编顺手
因为mathe写了C代码
俺凑个热闹
dzh696 2008-03-16
  • 打赏
  • 举报
回复
这是c++的代码吧。。。。。
无心人 2008-03-15
  • 打赏
  • 举报
回复
再优化下


mov eax, m
mov esi, n
mov edi, mod
xor edx, edx
div edi
mov eax, 1
// edx = m % mod
// eax = 1
// edi = mod
bsr ecx, esi
loop1:
bt esi, ecx
jnc loop2
mul edx
div edi
mov eax, edx
loop2:
move ebx,eax
mov eax, edx
mul edx
div edi
mov eax, ebx
sub ecx, 1
jnc loop1
无心人 2008-03-15
  • 打赏
  • 举报
回复
优化下

mov eax, m
mov esi, n
mov edi, mod
xor edx, edx
div edi
mov eax, 1
// edx = m % mod
// eax = 1
// edi = mod
bsr ecx, esi
loop1:
bt esi, ecx
jnc loop2
mul edx
div edi
mov eax, edx
loop2:
push eax
mov eax, edx
mul edx
div edi
pop eax
sub ecx, 1
jnc loop1
无心人 2008-03-15
  • 打赏
  • 举报
回复
还有点遗漏
:)手里没C编译器, 无法调试

mov eax, m
mov esi, n
mov edi, mod
xor edx, edx
div edi
mov ebx, edx
mov eax, 1
// ebx = m % mod
// eax = 1
// edi = mod
bsr ecx, esi
loop1:
bt esi, ecx
jnc loop2
mul ebx
div edi
mov eax, edx
loop2:
push eax
mov eax, ebx
mul ebx
div edi
mov ebx, edx
pop eax
sub ecx, 1
jnc loop1
无心人 2008-03-15
  • 打赏
  • 举报
回复
有点问题
修改下

mov eax, m
mov esi, n
mov edi, mod
xor edx, edx
div edi
mov ebx, edx
mov eax, 1
// ebx = m % mod
// eax = 1
// edi = mod
bsr ecx, esi
loop1:
bt esi, ecx
jnc loop2
mul ebx
div edi
loop2:
push eax
mov eax, ebx
mul ebx
div edi
mov ebx, edx
pop eax
sub ecx, 1
jnc loop1

无心人 2008-03-15
  • 打赏
  • 举报
回复
下面代码计算(m**n) % mod
返回的eax代表结果

mov eax, m
mov esi, n
mov edi, mod
xor edx, edx
div edi
mov ebx, edx
mov eax, 1
// ebx = m % mod
// eax = 1
// edi = mod
loop1:
bsr ecx, esi
bt esi, ecx
jnc loop2
mul ebx
div edi
loop2:
push eax
mov eax, ebx
mul ebx
div edi
mov ebx, edx
pop eax
loopnc loop1
dzh696 2008-03-15
  • 打赏
  • 举报
回复
恩,谢谢,我刚刚也做出来了
mathe 2008-03-15
  • 打赏
  • 举报
回复
下面代码计算(m**n) %mod


int f(int m,int n, int mod){
int mul=m%n;
int r=1;
while(n){
if(n&1){r*=mul;r%=mod;}
mul*=mul;mul%=mod;
n>>=1;
}
return r;
}

dzh696 2008-03-14
  • 打赏
  • 举报
回复
直接计算?有点不理解,人比较笨。。。。。。就是把指数分解存数组如a[N]里,然后按数组顺序依次与5的a[i]次方,所得结果取模在继续取模?
medie2005 2008-03-14
  • 打赏
  • 举报
回复
可以用递归,也可按指数的二进制形式直接计算。
dzh696 2008-03-14
  • 打赏
  • 举报
回复
对了,这样做是不是要用递归啊?
dzh696 2008-03-14
  • 打赏
  • 举报
回复
恩,谢谢啊,我刚刚想是不是能用二项式定理来做,我试试,是不是要连环往里带呢?要是我做不好就再请教了啊。
medie2005 2008-03-14
  • 打赏
  • 举报
回复
举个例子。
设要计算(5^100)%7 ('^'表示乘方运算)
因100=50*2,
故(5^100)%7=((5^50)^2)%7=(((5^50)%7)^2)%7。
现在,我们只要计算(5^50)%7的值,代入上式就可以得到(5^100)%7的值。
而(5^50)%7比(5^100)%7显然要好计算,因为指数已经减少了2倍。
现在,我们要计算(5^50)%7的值,我们仍可按照上面的方法来进行:
50=25*2
于是:(5^50)%7==((5^25)^2)%7。
再就是求(5^25)%7的值。
因25=12*2+1
故:(5^25)%7=(((5^12)^2)*5)%7。
再就是求(5^12)%7...

最后,我们注意到,我们将指数分解的是按照指数的二进制形式来进行的。
dzh696 2008-03-14
  • 打赏
  • 举报
回复
不知道
medie2005 2008-03-14
  • 打赏
  • 举报
回复
知道大数取模的二进制方法么?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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