Math 在Prolog中求多项式根(零)的系数

Math 在Prolog中求多项式根(零)的系数,math,prolog,logic,polynomial-math,Math,Prolog,Logic,Polynomial Math,若我知道多项式的根,我如何在Prolog程序中实现寻找多项式的系数 例如: input data (2;-1) output (1;-1;2) 对不起,误读了这个问题 a^2x+bx+c=0 取根x1+x2之和,等于-b/a 取根x1*x2的乘积,这等于c/a 现在解线性方程组,找到a,b和c 编辑: 如果设置参数a=1,则上述解决方案有效。当给定根时,你将得到两个方程和三个未知数,因此你必须在其中一个参数上设置一个固定值,上面的解决方案将a=1 所以给定两个根,你就不能得到一个特定的多项式,

若我知道多项式的根,我如何在Prolog程序中实现寻找多项式的系数

例如:

input data (2;-1)
output (1;-1;2)

对不起,误读了这个问题

a^2x+bx+c=0

取根x1+x2之和,等于-b/a

取根x1*x2的乘积,这等于c/a

现在解线性方程组,找到a,b和c

编辑:

如果设置参数a=1,则上述解决方案有效。当给定根时,你将得到两个方程和三个未知数,因此你必须在其中一个参数上设置一个固定值,上面的解决方案将a=1


所以给定两个根,你就不能得到一个特定的多项式,因为没有唯一的答案,有一个无限多的答案

a^2x+bx+c=0

取根x1+x2之和,等于-b/a

取根x1*x2的乘积,这等于c/a

现在解线性方程组,找到a,b和c

编辑:

如果设置参数a=1,则上述解决方案有效。当给定根时,你将得到两个方程和三个未知数,因此你必须在其中一个参数上设置一个固定值,上面的解决方案将a=1


所以给定两个根,你就不能得到一个特定的多项式,因为没有唯一的答案,有一个无限多的答案

a^2x+bx+c=0

取根x1+x2之和,等于-b/a

取根x1*x2的乘积,这等于c/a

现在解线性方程组,找到a,b和c

编辑:

如果设置参数a=1,则上述解决方案有效。当给定根时,你将得到两个方程和三个未知数,因此你必须在其中一个参数上设置一个固定值,上面的解决方案将a=1


所以给定两个根,你就不能得到一个特定的多项式,因为没有唯一的答案,有一个无限多的答案

a^2x+bx+c=0

取根x1+x2之和,等于-b/a

取根x1*x2的乘积,这等于c/a

现在解线性方程组,找到a,b和c

编辑:

如果设置参数a=1,则上述解决方案有效。当给定根时,你将得到两个方程和三个未知数,因此你必须在其中一个参数上设置一个固定值,上面的解决方案将a=1


因此,给定2个根,你无法得到一个特定的多项式,因为没有唯一的答案,有一个无穷多的答案,将给定根的一次因子相乘,将形成一个扩展多项式。这与Prolog中的“累加器”设计模式是自然匹配的

也就是说,我们将引入一个辅助参数来记住“到目前为止”处理的因子的乘积。一旦指定根的列表被清空,我们将得到所需的多项式展开式:

/* polynomialFromListofRoots(ListofRoots,[1],Polynomial) */
polynomialFromListofRoots([ ],Poly,Poly).
polynomialFromListofRoots([R|Roots],Pnow,Poly) :-
    polyMultiplyRootFactor(R,Pnow,Pnew),
    polynomialFromListofRoots(Roots,Pnew,Poly).

/* polyMultiplyRootFactor(R,Poly,ProductXminusR) */
polyMultiplyRootFactor(R,Poly,Prod) :-
    polyMultiplyRootFactorAux(R,0,Poly,Prod).

/* polyMultiplyRootFactorAux(R,Aux,Poly,Product) */
polyMultiplyRootFactorAux(R,A,[ ],[B]) :-
    B is -R*A.
polyMultiplyRootFactorAux(R,A,[P|Ps],[RP|RPs]) :-
    RP is P - R*A,
    polyMultiplyRootFactorAux(R,P,Ps,RPs).
使用问题中的示例:

?- polynomialFromListofRoots([2,-1],[1],Poly).

Poly = [1, -1, -2]
yes

请注意,这更正了问题中声称的
输出。

将给定根的一次因子相乘将形成扩展多项式。这与Prolog中的“累加器”设计模式是自然匹配的

也就是说,我们将引入一个辅助参数来记住“到目前为止”处理的因子的乘积。一旦指定根的列表被清空,我们将得到所需的多项式展开式:

/* polynomialFromListofRoots(ListofRoots,[1],Polynomial) */
polynomialFromListofRoots([ ],Poly,Poly).
polynomialFromListofRoots([R|Roots],Pnow,Poly) :-
    polyMultiplyRootFactor(R,Pnow,Pnew),
    polynomialFromListofRoots(Roots,Pnew,Poly).

/* polyMultiplyRootFactor(R,Poly,ProductXminusR) */
polyMultiplyRootFactor(R,Poly,Prod) :-
    polyMultiplyRootFactorAux(R,0,Poly,Prod).

/* polyMultiplyRootFactorAux(R,Aux,Poly,Product) */
polyMultiplyRootFactorAux(R,A,[ ],[B]) :-
    B is -R*A.
polyMultiplyRootFactorAux(R,A,[P|Ps],[RP|RPs]) :-
    RP is P - R*A,
    polyMultiplyRootFactorAux(R,P,Ps,RPs).
使用问题中的示例:

?- polynomialFromListofRoots([2,-1],[1],Poly).

Poly = [1, -1, -2]
yes

请注意,这更正了问题中声称的
输出。

将给定根的一次因子相乘将形成扩展多项式。这与Prolog中的“累加器”设计模式是自然匹配的

也就是说,我们将引入一个辅助参数来记住“到目前为止”处理的因子的乘积。一旦指定根的列表被清空,我们将得到所需的多项式展开式:

/* polynomialFromListofRoots(ListofRoots,[1],Polynomial) */
polynomialFromListofRoots([ ],Poly,Poly).
polynomialFromListofRoots([R|Roots],Pnow,Poly) :-
    polyMultiplyRootFactor(R,Pnow,Pnew),
    polynomialFromListofRoots(Roots,Pnew,Poly).

/* polyMultiplyRootFactor(R,Poly,ProductXminusR) */
polyMultiplyRootFactor(R,Poly,Prod) :-
    polyMultiplyRootFactorAux(R,0,Poly,Prod).

/* polyMultiplyRootFactorAux(R,Aux,Poly,Product) */
polyMultiplyRootFactorAux(R,A,[ ],[B]) :-
    B is -R*A.
polyMultiplyRootFactorAux(R,A,[P|Ps],[RP|RPs]) :-
    RP is P - R*A,
    polyMultiplyRootFactorAux(R,P,Ps,RPs).
使用问题中的示例:

?- polynomialFromListofRoots([2,-1],[1],Poly).

Poly = [1, -1, -2]
yes

请注意,这更正了问题中声称的
输出。

将给定根的一次因子相乘将形成扩展多项式。这与Prolog中的“累加器”设计模式是自然匹配的

也就是说,我们将引入一个辅助参数来记住“到目前为止”处理的因子的乘积。一旦指定根的列表被清空,我们将得到所需的多项式展开式:

/* polynomialFromListofRoots(ListofRoots,[1],Polynomial) */
polynomialFromListofRoots([ ],Poly,Poly).
polynomialFromListofRoots([R|Roots],Pnow,Poly) :-
    polyMultiplyRootFactor(R,Pnow,Pnew),
    polynomialFromListofRoots(Roots,Pnew,Poly).

/* polyMultiplyRootFactor(R,Poly,ProductXminusR) */
polyMultiplyRootFactor(R,Poly,Prod) :-
    polyMultiplyRootFactorAux(R,0,Poly,Prod).

/* polyMultiplyRootFactorAux(R,Aux,Poly,Product) */
polyMultiplyRootFactorAux(R,A,[ ],[B]) :-
    B is -R*A.
polyMultiplyRootFactorAux(R,A,[P|Ps],[RP|RPs]) :-
    RP is P - R*A,
    polyMultiplyRootFactorAux(R,P,Ps,RPs).
使用问题中的示例:

?- polynomialFromListofRoots([2,-1],[1],Poly).

Poly = [1, -1, -2]
yes

请注意,这纠正了问题中声称的
输出。

(2;-1)=>f(x)=(x-2)*(x+1)=x^2-x-2=>(1;-1;-2)这取决于你是否只希望你的方程是x^2+bx+c的形式(即你乐意设置a=1),但我可以有两个以上的根我认为这不是很容易解决的,因为多项式f(x)有特定的根。但是根没有一个特定的多项式,所以如果你给定一个根的数目,就会有无穷多个满足这些根的多项式。因此,您的程序只能给出其中一个参数,并且很难决定将每个参数设置为什么。这是作为家庭作业给出的吗?它规定了程序必须做什么吗?假设你有所有的根,那么结果在乘法器中是唯一的。(2;-1)=>f(x)=(x-2)*(x+1)=x^2-x-2=>(1;-1;-2)这取决于你是否只希望你的方程是x^2+bx+c的形式(即你愿意设置a=1)但是我可以有两个以上的根,我不认为这很容易解决,因为多项式f(x)有特定的根。但是根并没有一个特定的多项式,所以如果你给了一个根的数目,就会有无限多个多项式满足