首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求给定多项式根的多项式系数

求给定多项式根的多项式系数
EN

Stack Overflow用户
提问于 2015-11-08 13:16:37
回答 2查看 4.8K关注 0票数 4

考虑到a(0),..., a(n-1)的值,我试图编写一种算法来查找n, x_1, ..., x_n, a(n),这样:

代码语言:javascript
运行
复制
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_1)(P_2)相乘后,我考虑用Viete公式来求系数。

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

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

以下是公式:

首先,我要强调的是,我只需要一个伪码,我不关心为根和系数定义数组。这就是为什么我只写一个(N),xn。哦,我希望如果我开始用i=1而不是i=0索引,以便与数学表示法同步的话,你就不会很烦恼了。为了从i=0开始,我必须重新计算根并引入更多的括号。

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

代码语言:javascript
运行
复制
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)之间的空白。

我可以请您帮个忙吗?

这就是我根据Nico Schertler的回答得出的结论:

代码语言:javascript
运行
复制
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);
}
}

如果我们写的是一样的

代码语言:javascript
运行
复制
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);
}
}

(例如,通过将ai的值保留在变量t中,我们就可以交换数组的两个元素)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-08 13:54:32

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

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

为了添加一个根,您必须将当前多项式乘以x - x_i。这是:

代码语言:javascript
运行
复制
p * (x - x_i) = p * x - p * x_i

因此,您需要支持三个操作:

1.乘x

这很简单。只需将所有系数向左移动一。也就是说。

代码语言:javascript
运行
复制
a(i    ) := a(i - 1)
a(i - 1) := a(i - 2)
...
a(1    ) := a(0)
a(0    ) := 0

2.标量乘法

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

代码语言:javascript
运行
复制
a(i    ) *= s
a(i - 1) *= s
...

3.减法

只需减去相应的系数:

代码语言:javascript
运行
复制
c(i    ) = a(i    ) - b(i    )
c(i - 1) = a(i - 1) - b(i - 1)
...

一根一根地加根。首先,克隆当前的多项式。然后,执行上述操作:

代码语言:javascript
运行
复制
p := 1
for each root r
    p' = clone(p)
    multiply p with x
    multiply p' with r
    p := p - p'
next
票数 7
EN

Stack Overflow用户

发布于 2017-02-03 20:19:20

用于此目的的c#中的静态函数。x^4-11x^3+44x^2-76x+48的根为{2,2,3,4},并给出了参数

代码语言:javascript
运行
复制
 roots = new Complex[4] {2, 2, 3, 4}

此函数返回48,-76,44,-11,1

代码语言:javascript
运行
复制
public static double[] FromRoots(Complex[] roots)
{
   int N = roots.Length;
   Complex[] coefs = new Complex[N + 1];
   coefs[0] = -roots[0];
   coefs[1] = 1.0;

   for (int k = 2; k <= N; k++)
   {
       coefs[k] = 1.0;
       for (int i = k - 2; i >= 0; i--)
       {
           coefs[i + 1] = coefs[i] - roots[k - 1] * coefs[i + 1];
       }
       coefs[0] *= -roots[k - 1];

       if (Math.IEEERemainder(k, 2) == 1)
           coefs[k] = -coefs[k];
    }

        double[] realCoefs = new double[N + 1];
        for (int i = 0; i < N + 1; i++)
            realCoefs[i] = coefs[i].Real; // Not sure about this part!

        return realCoefs;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33594384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档