Java中的模数结果不正确

时间:2014-03-09 17:36:24

标签: 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;
}

第一次迭代的输出:

  

2.0x P:8.0,-57.0 Sigma:55.0

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

2 个答案:

答案 0 :(得分:7)

  

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

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

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

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

或者,在您的情况下:

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

...当然也适当调整%的其余用途。

另外,正如Stijn de Witt所说,看起来你的内循环状态有一个错字。

答案 1 :(得分:3)

在我看来,你在内循环中有一个拼写错误:

for (int j = 0 ; i<60 ; j++)

在循环中反复说明 i &lt; 60 ...

我会尝试修复它。

关于原始问题......你能减少你的测试用例吗?如果你认为模数对于某些数字不能正常工作那么为什么不制作一个单独的语句来对这些数字进行模数并打印结果呢?