找到给定其根的多项式的系数

Don*_*Don 3 algorithm loops for-loop polynomial-math polynomials

我正在尝试编写一个算法a(0),..., a(n-1),在给定值的情况下n, x_1, ..., x_n, a(n),它将找到:

a(n)*p^n + a(n-1)*p^(n-1) + ... + a(1)*p + a(0) = a(n)(p-x_1)(p-x_2)...(p-x_n)
Run Code Online (Sandbox Code Playgroud)

对于所有真正的p.

在乘以(n)(p-x_1)(p-x_2)后,我想到使用Viete的公式来找到系数.

但事实证明,编写代码并不像我预期的那么明显.

我想只使用代码中的基础知识 - 即循环,if-s加法和乘法 - 没有现成/复杂函数.

以下是公式: 在此输入图像描述

首先,我想强调一下,我只需要一个伪代码,而不关心为根和系数定义数组.这就是为什么我会写一个(n),xn.哦,如果我从i = 1开始索引而不是i = 0以便与数学符号同步,我希望它不会打扰你.为了从i = 0开始,我必须重新编写根并引入更多括号.

这就是我到目前为止所提出的:

a(n-1)=0;
for(i=1; i <= n; i++){
    a(n-1) = a(n-1) + x_i;
}

a(n-1) = -a(n)*a(n-1);
a(n-2)=0;

for(i=1; i <= n; i++){ 
    for(j=i; j <= n; j++){
        a(n-2) = a(n-2)+ x_i * x_j;
    }
}

a(n-2) = -a(n)*a(n-2);
a(n-3)=0;

for(i=1; i <= n; i++){
    for(j=i; j <= n; j++){
        for(k=j; k <= n; k++){
            a(n-3) = a(n-3)+ x_i * x_j * x_k;
        }
    }
}

a(n-3) = a(n)*a(n-3);

...

a(0)=1;
for(i=1; i<=n; i++){
    a(0) = a(0) * x_i;
}
if(n%2 == 0) a(0) = a(n) * a(0);
else a(0) = -a(n) * a(0);
Run Code Online (Sandbox Code Playgroud)

如你所见,它看起来不太好.

我想将所有这些循环链接到一个循环中,因为如果没有我无法编写完整的代码,我就无法填补固定j的(0)和(nj)之间的差距.

你能救我吗?

根据Nico Schertler的回答,这就是我所拥有的:

for(i=1; i<=n; i++)
{a(i)=1; 
for(j=1; j <= n; j++)
{b(i)= clone( a(i) );
a(i) = a(i-1);
b(i) = x_j * b(i);
c(i) = a(i) - b(i);
}
}
Run Code Online (Sandbox Code Playgroud)

如果我们改写的话会不一样

for(i=1; i<=n; i++)
{a(i)=1; b(i)=1;
for(j=1; j <= n; j++)
{t = a(i) ;
a(i) = a(i-1);
b(i) = x_j * t;
c(i) = a(i) - b(i);
}
}
Run Code Online (Sandbox Code Playgroud)

(这就是我们如何通过将a [i]的值保持在某个变量t中来交换数组的两个元素).

Nic*_*ler 6

您可以递增地创建多项式.

从开始p = 1.即a(0) = 1.

要添加根,必须将当前多项式乘以x - x_i.这是:

p * (x - x_i) = p * x - p * x_i
Run Code Online (Sandbox Code Playgroud)

所以你需要支持三个操作:

1.乘以x

这很简单.只需将所有系数向左移动一个.即

a(i    ) := a(i - 1)
a(i - 1) := a(i - 2)
...
a(1    ) := a(0)
a(0    ) := 0
Run Code Online (Sandbox Code Playgroud)

2.用标量乘法

这同样简单.乘以每个系数:

a(i    ) *= s
a(i - 1) *= s
...
Run Code Online (Sandbox Code Playgroud)

3.减法

只需减去相应的系数:

c(i    ) = a(i    ) - b(i    )
c(i - 1) = a(i - 1) - b(i - 1)
...
Run Code Online (Sandbox Code Playgroud)

按root添加root.首先,克隆当前的多项式.然后,执行上述操作:

p := 1
for each root r
    p' = clone(p)
    multiply p with x
    multiply p' with r
    p := p - p'
next
Run Code Online (Sandbox Code Playgroud)