Java中的模数结果不正确

Dig*_*ude 1 java modulo

我试图在java中运行一些椭圆曲线结果,但模运算符似乎没有输出正确的结果.

int a = 17;
double previousx = 4; 
double previousy = 14;
double xnew;
double ynew;
double sigma;
double convert;

for (int i = 1; i < 10; i++) {
    convert = 0;
    for (int j = 0; i<60; j++) {
        if (((2 * previousy * j) % 59) == 1) {
            convert = j;
            break;
        }
    }

    sigma = ((3 * Math.pow(previousx, 2) + a) * convert) % 59;
    xnew = ((sigma * sigma) - (2 * previousx)) % 59;
    ynew = (sigma * (previousx - xnew) - previousy) % 59;
    System.out.println((Math.pow(2, i)) + "x P: " + xnew + "," + ynew + " Sigma:" + sigma);
    previousx = xnew;
    previousy = ynew;
}
Run Code Online (Sandbox Code Playgroud)

第一次迭代的输出:

2.0x P:8.0,-57.0 Sigma:55.0

8和55是正确的,但-57 mod 59 = 2而不是-57.我该如何解决?

Jon*_*eet 7

8和55是正确的,但-57 mod 59 = 2而不是-57.我该如何解决?

%Java中的运算符不是模数 - 它是余数运算符.根据语言规范,它的行为完全正确.当你怀疑Java行为不端时,总是值得检查规范,看看它实际上是你的期望是不正确的.

如果你想要一个模数运算符,你只需要检查结果是否为负数,如果是,则再次添加除数:

int remainder = (2 * previousy * j) % 59;
int modulus = remainder < 0 ? remainder + 59 : remainder;
if (modulus == 1) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者,在您的情况下:

int remainder = (2 * previousy * j) % 59;
if (remainder == 1 || remainder == -58) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

...... %当然,也要适当调整其余用途.

此外,正如Stijn de Witt所提到的,看起来你的内循环条件中有一个拼写错误.

  • 我以为我可能会打败Jon一次,哈哈.当然不是机会:) (2认同)