【发布时间】:2017-08-06 19:10:54
【问题描述】:
我正在计算 ((A^B)/C)%M,但是当 A、B、C、M 的数量很大时,我的代码不起作用。此代码在 A、B、C、D 较小时给出正确答案int。
这里有什么问题?
这里 C 和 M 互质
示例输入 2 3 4 5 示例输出 2
这些输入的代码失败 969109092 60139073 122541116 75884463
C 程序
#include <stdio.h>
int d,x,y;
模指数 (A^B)%M
int power(int A, int B, int M)
{
long long int result=1;
while(B>0)
{
if(B % 2 ==1)
{
result=(result * A)%M;
}
A=(A*A)%M;
B=B/2;
}
return result;
}
模乘逆
void extendedEuclid(int A, int B)
{
if(B == 0)
{
d = A;
x = 1;
y = 0;
}
else
{
extendedEuclid(B,A%B);
int temp = x;
x = y;
y = temp - (A/B)*y;
}
}
int modInv(int A, int M)
{
extendedEuclid(A,M);
return (x%M+M)%M;
}
main()
int main()
{
int A,B,C,M;
scanf("%d %d %d %d",&A,&B,&C,&M);
int inv = modInv(C,M)%M;
printf("%d\n",inv);
long long int p = (power(A,B,M))%M;
printf("%d\n",p);
long long int ans = (p * inv)%M;
//printf("%d",((modInv(C,M)*(power(A,B,M))))%M);
printf("%lld",ans);
return 0;
}
【问题讨论】:
-
您可能超出了整数所能容纳的范围。请改用 long 或 long long。
-
我更改了这些值 long long int result=1; long long int p = (power(A,B,M))%M; long long int ans = (p * inv)%M;但仍然无法正常工作
-
我不确定逆函数的实现。尝试使用类似 wiki extended Euclid algorithm 的东西。像 (t, newt) = ... 这样具有双重赋值的代码需要替换为使用临时变量的代码。
-
我没有遵循代码但是如果你想要一个涉及常数除数
D的表达式的模数% M,那么你应该在计算过程中使用模数% (M * D),最后使用% M取适当的模数。 -
数字大是什么意思?举个例子! (在问题中)当算法失败时你会尝试哪些数字?
标签: c number-theory