找到模数

时间:2017-10-25 17:34:26

标签: java math numbers

我有一个问题。我需要解决这个问题: 3 ^ 54 mod 17 =?(3到54度模17 - 它将等于?)。请写出最大的解释。你怎么找到这个巨大的数字 3 ^ 54 ,如何获得模块。非常感谢你提前!!!

2 个答案:

答案 0 :(得分:1)

看看这两个等价的等式:

  

c mod m =(a·b)mod m

     

c mod m = [(a mod 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 =
 ...

知道我们可以非常快速地计算模数。但是我们怎样才能快速划分?

这可以通过“通过平方的指数化”的概念来处理。

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

答案 1 :(得分:0)

我们知道3和17是互质的(事实上,两者都是素数,但不是必需的)。因此,我们知道3是生成w.r.t.乘以模数为17的整数组。也就是说,对于1到16之间的任何值b,包括a3^a = b (mod 17)3^a。唯一可能的方法是,如果3^16 = 1 (mod 17)给出连续至少16次模数为17的唯一值(对于3 ^ 0,3 ^ 1,...,3 ^ 15)。因此,只要a^(b-1) = 1 (mod b)a是互质的,就会发现b2^103 = ? (mod 10)。{/ p>

这个观察结果会让你的指数小于你的模数减一。同样,它要求基数和模数是互质的,但在你的问题中就是这种情况,通常情况下这是一个感兴趣的案例。

更一般地说,你总是可以尝试将基数乘以不多于模数的次数,你必然会找到一个循环。确定循环中的循环长度和偏移量(如果有的话),你可以像我们上面做的那样计算出一些东西。例如,如果我们有2, 2*2 = 4, 2*2*2 = 8, 2*2*2*2 = 16 = 6 (mod 10), 2*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^5)^4 * 2^3 = 2^4 * 2^ = 2^7 = 2^5 * 2^2 = 2 * 2^2 = 2^3 (mod 10)重写为0,因此为8。

最后,如果您在执行上述操作时找到了2^102938210 = ??? (mod 8),请停止;答案将永远为零。例如,0的答案为2^1 = 2, 2^2 = 4, 2^3 = 8 = 0 (mod 8),因为我们得到了proc sql; select Sql_expression