Java 求模数

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到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) 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;
}