Java中的计算不等于预期结果

use*_*736 1 java math

我试图在Java中实现RSA算法.

当你看一下这个页面:http://en.wikipedia.org/wiki/RSA_(algorithm)#A_working_example你可以看到这个计算:

c = 65 ^ 17 mod 3233 = 2790
Run Code Online (Sandbox Code Playgroud)

当我使用这个Java代码时:

double valc = Math.pow(65, 17) % 3233;
System.out.println("Expected = 2790, computed = " + valc);
Run Code Online (Sandbox Code Playgroud)

结果是:

Expected = 2790, computed = 887.0
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Flo*_*ris 5

您假设浮点计算精确到一个疯狂的数字位数,它们不是.pow不是正确的计算方法65^17.你真的想做

65 * 65 * 65 ...
Run Code Online (Sandbox Code Playgroud)

所以

result = 1;
for(ii = 0; ii < 17; ii++) result *= 65;
Run Code Online (Sandbox Code Playgroud)

这将导致精度损失(它具有比内置类型可以表示的更多的数字).

看一下模数计算可以显着简化这些计算的方式.例如,参见https://math.stackexchange.com/questions/36318/modulo-arithmetic-with-big-numbers

它表明您可以执行以下操作:

result = 1;
for(ii = 0; ii < 17; ii++) {
  result *= 65;
  result = result % 3233;
}
Run Code Online (Sandbox Code Playgroud)

有比这更有效的方法 - 但这会给你正确的结果.见http://jdoodle.com/a/2l