Java 求模数
我有个问题。我需要解决这个问题:3^54 mod 17=?(3到54度模17-这将等于?)。请尽可能多地解释。你是如何发现这个巨大的数字的?如何获得模块。提前非常感谢 看看这两个等价的方程式: c mod m=(a⋅ b) mod m c模m=[(a模m)⋅ (b mod m)]mod m 知道了这一点,您可以非常高效地计算3^54 mod 17:Java 求模数,java,math,numbers,Java,Math,Numbers,我有个问题。我需要解决这个问题:3^54 mod 17=?(3到54度模17-这将等于?)。请尽可能多地解释。你是如何发现这个巨大的数字的?如何获得模块。提前非常感谢 看看这两个等价的方程式: c mod m=(a⋅ b) mod m c模m=[(a模m)⋅ (b mod m)]mod m 知道了这一点,您可以非常高效地计算3^54 mod 17: 3 ^ 54 mod 17 = 3 ^ 27 * 3 ^ 27 mod 17 = (3 ^ 27 mod 17 * 3 ^ 27 mod 17
3 ^ 54 mod 17 =
3 ^ 27 * 3 ^ 27 mod 17 =
(3 ^ 27 mod 17 * 3 ^ 27 mod 17) mod 17 =
...
我们知道我们可以很快计算模。但是我们怎样才能快速地划分c呢
这可以通过“平方求幂”的思想来处理
使用这种技术的算法称为“快速模幂运算”
我们知道3和17是互质(实际上,两者都是素数,但这不是必需的)。因此,我们知道3是模17的整数组的生成w.r.t.乘法。也就是说,对于介于1和16之间的任何值
b
,存在一些a
,使得3^a=b(mod 17)
。唯一可行的方法是,如果3^a
在一行中至少给出16次模为17的唯一值(对于3^0,3^1,…,3^15)。因此,当a
和b
是互质时,3^16=1(mod 17)
和a^(b-1)=1(mod b)
这一观察结果将使你得到一个指数小于模数负1的东西。同样,它要求基和模是互质的,但这是你问题中的情况,通常来说是一个有趣的情况
更一般地说,你可以试着将基底乘以不大于模数的倍数,你一定会找到一个循环。确定循环长度和循环中的偏移量(如果有的话),你可以计算出类似于我们上面所做的事情。例如,如果我们有2^103=?(mod 10)
,我们能做什么?我们看到了2,2*2=4,2*2*2=8,2*2*2*2=16=6(mod 10),2*2*2*2=32=2(mod 10);我们已经进入了一个循环,所以我们知道这会永远重复。既然2^5=2^1(mod 10)
,我们可以将2^103
重写为(2^5)^20*2^3=2^20*2^3=2^2^3=2^2*2=2^2^2=2^2^2=2^2^2^2=2^2^3=(mod 10^2^2^3)
,因此是8
最后,如果您在执行上述操作时发现一个0
,请停下来;此后答案将永远为零。例如,2^102938210=???(mod 8)
具有答案0
,因为我们得到2^1=2,2^2=4,2^3=8=0(mod 8)
:p更重要的是,您应该仔细研究。请注意,还有一个内置方法,请参阅
x^n = x(x^2)^((n-1)/2) if n is odd
x^n = (x^2)^(n/2) if n is even
int power(int x, int y, int p){
int res = 1;
x = x % p;
while (y > 0){
if (y % 2 == 0)
res = (res*x) % p;
y /= 2;
x = (x*x) % p;
}
return res;
}