我有一个问题。我需要解决这个问题: 3 ^ 54 mod 17 =?(3到54度模17 - 它将等于?)。请写出最大的解释。你怎么找到这个巨大的数字 3 ^ 54 ,如何获得模块。非常感谢你提前!!!
答案 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
,包括a
,3^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
是互质的,就会发现b
和2^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
。