我正在尝试编写一个算法,可以找出给定 n, x_1, ..., x_n, a(n)
值时的 a(0),..., a(n-1)
。具体要求如下:
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)
对于所有实数p。
在乘以a(n)(p-x_1)(p-x_2)之后,我想使用维达公式来找到系数。
但是写代码并不像我预期的那样显而易见。
我只想在我的代码中使用基础知识 - 即循环、if语句、加法和乘法 - 不使用现成/复杂的函数。
首先,我想强调一下,我只需要伪代码,我不关心为根和系数定义数组。这就是为什么我只会写a(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);
正如您所看到的,这看起来并不好。
我想将所有这些循环链接到一个循环中,因为如果没有它,我无法编写完整的代码,无法填补固定j下 a(0) 和 a(n-j)之间的空缺。
你能帮我吗?
以下是我基于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);
}
}
如果我们改为写成下面这样,结果会一样吗?
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);
}
}
(这是我们如何交换数组中两个元素的示例,通过将a [i]的值保留在某个变量t中。)