Метод с использованием больших целых чисел ничего не возвращает - PullRequest
0 голосов
/ 05 января 2019

Я создал тест примитивности Ферма, используя большие целые числа Java. Однако, хотя ошибки не отображаются и все выглядит нормально, они не возвращают ни истину, ни ложь ни для какого ввода (кроме BigInteger.valueOf (3)).

public static boolean isPrime (BigInteger n){
    BigInteger counter=BigInteger.ZERO;
    boolean isPrime=false;
    if(n.equals(BigInteger.valueOf(2)))isPrime=true;
    if(n.compareTo(BigInteger.valueOf(2))>0 && n.compareTo(BigInteger.valueOf(40))<0) {
        for (BigInteger a=BigInteger.valueOf(2);a.compareTo(n.subtract(BigInteger.ONE))<0;a.add(BigInteger.ONE)) {
            if (a.modPow(n.subtract(BigInteger.ONE),n).equals(BigInteger.ONE)) counter.add(BigInteger.ONE);
        }

        if (counter.equals(n.subtract(BigInteger.valueOf(3)))) isPrime = true;
    }
        else {

        for (BigInteger a=BigInteger.valueOf(2);a.compareTo(BigInteger.valueOf(40))<=0;a.add(BigInteger.ONE)) {
            if (a.modPow(n.subtract(BigInteger.ONE),n).equals(BigInteger.ONE)) counter.add(BigInteger.ONE);

        }
        if (counter.equals(BigInteger.valueOf(39))) isPrime = true;
    }
    return isPrime;
}

        }

Эта проблема возникает из-за больших целых чисел?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Проблема не возникает из-за BigInteger. Функция никогда не возвращается, потому что вы создали бесконечные циклы в ваших for циклах:

for (BigInteger a=BigInteger.valueOf(2);a.compareTo(BigInteger.valueOf(40))<=0;a.add(BigInteger.ONE)

Оператор приращения в вашем цикле не изменяет счетчик вашего цикла.

a.add(BigInteger.ONE)

Этот оператор возвращает BigInteger, он не изменяет вызывающий объект.

0 голосов
/ 05 января 2019

Ваш a.add(BigInteger.ONE) должен быть a = a.add(BigInteger.ONE). В противном случае ваш a всегда имеет одно и то же значение, а ваш цикл бесконечен.

См. BigInteger # add (значение) :

Возвращает BigInteger, значение которого (this + val)

...