Как вывести переменные из вложенных циклов, используя BigIntegers

Я получаю сумасшедшие ошибки, когда пытаюсь реализовать эту программу, написанную мной, чтобы решить гипотезу Леонарда Эйлера. Ошибка, кажется, в println, Ты знаешь, что я делаю не так? (Перед запуском программы ошибок нет, появляются сообщения об ошибках). То, что я реализую, довольно просто, поэтому я не совсем уверен, почему он не взаимодействует.

PS Я читал на другом сайте, чтобы назначить исходящее сообщение как объект String и напечатать этот объект String, но это просто добавляет еще одно сообщение об ошибке в список.

    public static void main(String[] args) {

    BigInteger max = new BigInteger("Integer.MAX_VALUE");

    // for(int a=0; a<max; a++)
    for(BigInteger a=BigInteger.ZERO; a.compareTo(max)<=0; a=a.add(BigInteger.ONE)){

        for(BigInteger b=BigInteger.ZERO; b.compareTo(max)<=0; b=b.add(BigInteger.ONE)){

            for(BigInteger c=BigInteger.ZERO; c.compareTo(max)<=0; c=c.add(BigInteger.ONE)){

                for(BigInteger d=BigInteger.ZERO; d.compareTo(max)<=0; d=d.add(BigInteger.ONE)){

                    // a^4
                    a=a.pow(4);
                    // b^4
                    b=b.pow(4);
                    // c^4
                    c=c.pow(4);
                    // d^4
                    d=d.pow(4);

                    // a+b+c
                    BigInteger sum = new BigInteger("a.add(b).add(c)");

                    // if( sum == d^4 )
                    int euler = sum.compareTo(d);
                    if( euler ==0)
                    {
                        System.out.println(a+"^4+"+b+"^4+"+c+"^4="+d+"^4");
                    }  
                }
            }
        }
    }   
}

3 ответа

Две вещи, которые я могу сразу определить, как "вероятно, неправильные".

BigInteger max = new BigInteger("Integer.MAX_VALUE");

Что вы, вероятно, хотите, это:

BigInteger max = BigInteger.valueOf((long)Integer.MAX_VALUE);

А также:

BigInteger sum = new BigInteger("a.add(b).add(c)");

Попробуйте вместо этого:

BigInteger sum = a.add(b).add(c)

@CommuSoft идентифицировал ваши ошибки (поэтому примите его ответ), но я хотел отметить, что вы немного сходите с ума от BigIntegerи что вы выполняете много избыточных вычислений. Безумно много. Это было бы намного эффективнее:

public static void main(String[] args) {
    for (int a = -1; a++ < Integer.MAX_VALUE; ) {
        BigInteger a4 = BigInteger.valueOf(a).pow(4);

        for (int b = a - 1; b++ < Integer.MAX_VALUE; ) {
            BigInteger b4 = BigInteger.valueOf(b).pow(4);
            BigInteger partialSum = a4.add(b4);

            for(int c = b - 1; c++ < Integer.MAX_VALUE; ) {
                BigInteger c4 = BigInteger.valueOf(c).pow(4);
                BigInteger sum = partialSum.add(c4);

                for(int d = c - 1; d++ < Integer.MAX_VALUE; ) {
                    BigInteger d4 = BigInteger.valueOf(d).pow(4);

                    int euler = sum.compareTo(d4);
                    if( euler == 0)
                    {
                        System.out.println(a4+"^4+"+b4+"^4+"+c4+"^4="+d4+"^4");
                    } else if (euler < 0) {
                        // d4 is larger than the sum, and will only get bigger
                        break;
                    }
                }
            }
        }
    }   
}

Однако даже с этими изменениями я не вижу, чтобы этот код работал до конца в течение вашей жизни. На самом деле, это, вероятно, не завершится в течение всей жизни вселенной.

Я думаю, что проблема больше со строительством sum:

BigInteger sum = new BigInteger("a.add(b).add(c)");

Java в целом не является интерпретируемым языком: он теряет название переменных.

Также, если вы делаете:

d=d.pow(4);

d сохранит его значение навсегда (не беру старый после цикла).

Вы также используете:

new BigInteger("Integer.MAX_VALUE");

Что снова не может быть решено, попробуйте:

BigInteger.valueOf(Integer.MAX_VALUE);

Ошибки, вероятно, устраняются с помощью:

BigInteger max = BigInteger.valueOf(Integer.MAX_VALUE);

// for(int a=0; a<max; a++)
for(BigInteger a=BigInteger.ZERO; a.compareTo(max)<=0; a=a.add(BigInteger.ONE)){

    for(BigInteger b=BigInteger.ZERO; b.compareTo(max)<=0; b=b.add(BigInteger.ONE)){

        for(BigInteger c=BigInteger.ZERO; c.compareTo(max)<=0; c=c.add(BigInteger.ONE)){

            for(BigInteger d=BigInteger.ZERO; d.compareTo(max)<=0; d=d.add(BigInteger.ONE)){

                // a^4
                BigInteger a4=a.pow(4);
                // b^4
                BigInteger b4=b.pow(4);
                // c^4
                BigInteger c4=c.pow(4);
                // d^4
                BigInteger d4=d.pow(4);

                // a+b+c
                BigInteger sum = a4.add(b4).add(c4);

                // if( sum == d^4 )
                int euler = sum.compareTo(d4);
                if( euler ==0)
                {
                    System.out.println(a+"^4+"+b+"^4+"+c+"^4="+d+"^4");
                }  
            }
        }
    }
}

Если мы ограничиваем max в 4, он генерирует:

0^4+0^4+0^4=0^4
0^4+0^4+1^4=1^4
0^4+0^4+2^4=2^4
0^4+0^4+3^4=3^4
0^4+0^4+4^4=4^4
0^4+1^4+0^4=1^4
0^4+2^4+0^4=2^4
0^4+3^4+0^4=3^4
0^4+4^4+0^4=4^4
1^4+0^4+0^4=1^4
2^4+0^4+0^4=2^4
3^4+0^4+0^4=3^4
4^4+0^4+0^4=4^4

Кроме того, алгоритм, который вы разрабатываете, не очень эффективен. Лучший способ сделать это - установить верхний предел (max), итерируйте с переменными до этой верхней границы, а затем увеличивайте границу. В противном случае это займет примерно 2^62 до a установлен в 1 совсем.

Другие вопросы по тегам