ошибка составных полиномов

#java

#java

Вопрос:

У меня есть вопрос, который нужно решить, используя Java-полиномы. Я настроил весь свой код, и, похоже, все в порядке, но с помощью моего составного метода я получаю результат, отличный от ожидаемого.

 class Polyonmial
{ 
    final static private int mantissa=52;
    final static private double epsilon=Math.pow(2.0,-mantissa);
    private double coefficient=0.0;
    private int power=0;
    private Polynomial successor=null;
    public Polynomial(double coefficient, int power)
    { 
        if (Double.isNaN(coefficient)) return;
        if (Math.abs(coefficient)<epsilon) return;
        if (power<0) return;
        this.coefficient=coefficient;
        this.power=power;
    }

final public double coefficient(int power)
{ 
    if (power<0) return 0.0;
    Polynomial traverser=this;
    do
    { 
        if (traverser.power<power) return 0.0;
        if (traverser.power==power) return traverser.coefficient;
        traverser=traverser.successor;
    }
    while (traverser!=null);
    return 0.0;
}

final public Polynomial composite(Polynomial that)
{
     if (that==null) return null;
     Polynomial thisClone = this.clone();
     Polynomial thatClone = that.clone();
     Polynomial temp = new Polynomial(0.0,0);
     Polynomial result = new Polynomial(0.0,0);

     while(thisClone != null)
     {
         if (thisClone.power == 0) 
         {
             temp.coefficient = 1.0;
             temp.power = 0;
         }
         else
         {
             if (thisClone.power == 1) 
             temp = thatClone;
         }
         //System.out.println("temp:" temp);

         while(temp != null)
         {
            temp.coefficient = thisClone.coefficient*temp.coefficient;
            result = result.plus(temp);
            temp = temp.successor;
         }
         temp = new Polynomial(0.0,0);
         thisClone=thisClone.successor;
     }
     return resu<
}

final public Polynomial[] dividedBy(Polynomial that) 
{ 
    if (that==null) return null;
    if (that.coefficient==0.0) return null;
    Polynomial quotient=new Polynomial(0.0,0);
    Polynomial remainder=this.clone();

    Polynomial traverser = this.clone();
    Polynomial resultoftemp = new Polynomial(0.0, 0);
    Polynomial temp = new Polynomial(0.0, 0);

    double thiscoffe = this.coefficient(this.degree());
    double thatcoffe = that.coefficient(that.degree());

    if(that.coefficient !=0 amp;amp; that.power !=0)
    {
        quotient.coefficient = thatcoffe / thiscoffe;
        quotient.power = that.power - this.power; 
    }

    while(traverser !=null)
    {
        temp.power = quotient.power   traverser.power;
        temp.coefficient = quotient.coefficient * traverser.coefficient;
        traverser=traverser.successor;

        resultoftemp = resultoftemp.plus(temp);

        remainder = that.minus(resultoftemp);
    }

    Polynomial[] result=new Polynomial[2];
    result[0]=quotient;
    result[1]=remainder;
    return resu<
}

final public Polynomial integrate()
{ 
    if (this.coefficient==0.0) return new Polynomial(0.0,0);
    Polynomial result=this.clone();

    Polynomial temp = new Polynomial(0.0, 0);
    Polynomial rstemp = new Polynomial(0.0, 0);

    while(result!=null)
    {
        rstemp.power = result.power   1;
        rstemp.coefficient = result.coefficient / (result.power  1);
        result = result.successor;
        temp = temp.plus(rstemp);
    }
    return resu<
}

final public Polynomial minus(Polynomial that)
{ 
    if (that==null) return null;
    if (this.equals(that)) return new Polynomial(0.0,0);
    Polynomial result=this.clone();
    if (that.coefficient==0.0) return resu<
    Polynomial traverser=that;
    do
    { 
        add(result,-traverser.coefficient,traverser.power);
        traverser=traverser.successor;
    }
    while (traverser!=null);
    return resu<
}

final public int powerMax()
{ 
    int max=Integer.MIN_VALUE;
    Polynomial traverser=this;
    do
    {
        if (max<traverser.power) max=traverser.power;
        traverser=traverser.successor;
    }
    while (traverser!=null);
    return max;
}

final public int powerMin()
{ 
    int min=Integer.MAX_VALUE;
    Polynomial traverser=this;
    do
    {
        if (min>traverser.power) min=traverser.power;
        traverser=traverser.successor;
    }
    while (traverser!=null);
    return min;
}

}
  

В моем ожидаемом выходном файле я должен получить это:

 (-1.0*X^1 1.0).composite(-1.0*X^1 1.0)=
1.0*X^1
  

Но вместо этого я получаю:

 (-1.0*X^1 1.0).composite(-1.0*X^1 1.0)=
1.0*X^1 1.0
  

Мы высоко ценим любые советы или помощь.

Комментарии:

1. Вы пробовали запускать свой первый пример ((-1.0 * X ^ 1 1.0).composite(-1.0 * X ^ 1 1.0)) через отладчик? Этот пример кажется довольно простым, и его стоит рассмотреть. Кажется довольно странным, что -1.0 1.0 не происходит.

2. @ccoakley Я предполагаю, что это проблема с составным методом

3. @Bill: Хорошо, именно туда я впервые заглянул и обнаружил единственную очевидную ошибку. Если я что-то неправильно истолковал, пожалуйста, дайте мне знать.

4. @Билл, пожалуйста, не стирайте свой вопрос, когда найдете ответ. Этот сайт работает не так.

5. lol, «исправлено (пожалуйста, удалите)»? Вы понимали, что один из пунктов сайта вопросов и ответов заключается в том, что в большинстве случаев ваш вопрос уже был задан кем-то другим, поэтому вы можете выполнить поиск по нему в базе данных? Вопросы и ответы принадлежат сообществу, вам не следует удалять его, если вы решили СВОЮ проблему.

Ответ №1:

Я немного изменил ваш составной метод таким образом (логически эквивалентно, перемещения фигурных скобок и добавления println):

 final public Polynomial composite(Polynomial that) {
    if (that==null) return null;
    Polynomial thisClone = this.clone();
    Polynomial thatClone = that.clone();
    Polynomial temp = new Polynomial(0.0,0);
    Polynomial result = new Polynomial(0.0,0);

    while(thisClone != null) {
        System.out.println("composite with term degree: "   thisClone.power);
        if (thisClone.power == 0) {
            temp.coefficient = 1.0;
            temp.power = 0;
        } else if (thisClone.power == 1) {
            temp = thatClone;
        } else {
            for(int i=2; i<=thisClone.power; i  ) {
                temp = temp.plus(thatClone.times(thatClone));
            }
        }
        System.out.println("temp heading in: "   temp);

        while(temp != null) {
            temp.coefficient = thisClone.coefficient*temp.coefficient;
            result = result.plus(temp);
            temp = temp.successor;
        }
        System.out.println("result so far: "   result);
        temp = new Polynomial(0.0,0);
        thisClone=thisClone.successor;
    }
    return resu<
}
  

и для примера (-1.0*X^1 1.0).composite(-1.0*X^1 1.0) , это вывод:

составной со степенью термина: 1
ввод временного значения: -1.0 * X ^ 1 1.0
результат на данный момент: 1.0 * X ^ 1
составной со степенью термина: 0
ввод временного значения: 1.0
результат на данный момент: 1.0 * X ^ 1 1.0

Правильно ли я полагаю, что первый «результат на данный момент» должен быть «-1.0 * X ^ 1-1.0»?

Если это так, давайте рассмотрим цикл:

         while(temp != null) {
            temp.coefficient = thisClone.coefficient*temp.coefficient;
            result = result.plus(temp);
            temp = temp.successor;
        }
  

Я думаю, что это ваша проблема: result = result.plus(temp) добавляет не только «текущий термин» к temp, но и термин-преемник. Но затем вы зацикливаетесь на temp, устанавливая его равным его преемнику, и делаете это снова!

Я думаю, что решение примерно такое (сначала вычислите все временные термины, затем обновите результат):

     Polynomial looptemp = temp;
    while(looptemp != null) {
        looptemp.coefficient = thisClone.coefficient*looptemp.coefficient;
        looptemp = looptemp.successor;
    }
    result = result.plus(temp);
  

По крайней мере, это работает для единственного примера, который я пробовал.

Комментарии:

1. @Bill: Выполняется ли сбой для любого примера со степенью меньше 2? Мне также показалось, что ваш temp = temp.plus(thatClone.times(thatClone)); выглядел немного подозрительно, но я не пробовал пример, в котором использовался этот код. К сожалению, мне пора спать. Удачи!

2. @Bill: Просто предложение по отладке: еще больше упростите свой тестовый пример. Попробуйте использовать только два термина (для выполнения преемника) и один термин (на случай, если нет проблемы с преемником). Нет веских причин (пока) для тестирования с тремя терминами. Я ожидаю, что если ошибка существует, ее можно использовать с двумя терминами, и, надеюсь, не только с одним. Отрицательные коэффициенты хороши, но сделайте их другими (игнорируя знак, у вас есть 3 коэффициента 1.0 в вашем тестовом примере). Прокомментируйте еще раз, и я проверю, когда вернусь домой с работы. Еще раз, удачи!