Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Prolog计算多项式的GCD_Prolog_Polynomial Math_Greatest Common Divisor - Fatal编程技术网

用Prolog计算多项式的GCD

用Prolog计算多项式的GCD,prolog,polynomial-math,greatest-common-divisor,Prolog,Polynomial Math,Greatest Common Divisor,标题似乎说明了一切。我想计算两个多项式的GCD。有什么方法可以在Prolog中实现吗?如果是的话,什么是好的起点?具体来说,我在如何使用Prolog实现多项式除法方面遇到了困难 编辑以包含示例输入和输出: 输入示例: ?- GCD(x^2 + 7x + 6, x2 − 5x − 6, X). 示例输出: X = x + 1. 解决方案 万一有人需要这样做,我的最终解决方案是: tail([_|Tail], Tail). head([Head | _], Head). norm(Old,

标题似乎说明了一切。我想计算两个多项式的GCD。有什么方法可以在Prolog中实现吗?如果是的话,什么是好的起点?具体来说,我在如何使用Prolog实现多项式除法方面遇到了困难

编辑以包含示例输入和输出:

输入示例:

?-  GCD(x^2 + 7x + 6, x2 − 5x − 6, X).
示例输出:

X = x + 1.
解决方案

万一有人需要这样做,我的最终解决方案是:

tail([_|Tail], Tail).
head([Head | _], Head).

norm(Old, N, New) :- 
    length(Tail, N),
    append(New, Tail, Old).
norm(Old, N, []) :-
    length(Old, L),
    N > L.

mult_GCD(List, GCD) :- length(List, L),
    L > 2, tail(List, Tail),
    mult_GCD(Tail, GCD).
mult_GCD([H | T], GCD) :-
    length(T, L),
    L == 1, head(T, N),
    gcd(H, N, GCD).

lead(List, List) :-
    length(List, L),
    L == 1.
lead([0 | Tail], Out) :- 
    !, lead(Tail, Out).
lead([Head | Tail], [Head | Tail]) :- Head =\= 0.

poly_deg([], 0).
poly_deg(F, D) :-
    lead(F, O),
    length(O, N),
    D is N - 1.

poly_red([0], [0]).
poly_red(Poly, Out) :-
    mult_GCD(Poly, GCD),
    scal_div(Poly, GCD, Out).

poly_sub(Poly,[],Poly) :- Poly = [_|_].
poly_sub([],Poly,Poly).
poly_sub([P1_head|P1_rest], [P2_head|P2_rest], [PSub_head|PSub_rest]) :-
    PSub_head is P1_head-P2_head,
    poly_sub(P1_rest, P2_rest, PSub_rest).

scal_prod([],_Sc,[]).
scal_prod([Poly_head|Poly_rest], Sc, [Prod_head|Prod_rest]) :-
    Prod_head is Poly_head*Sc,
    scal_prod(Poly_rest, Sc, Prod_rest).

scal_div([],_,[]).
scal_div([Poly_head|Poly_rest], Sc, [Prod_head|Prod_rest]) :-
    Prod_head is Poly_head / Sc,
    scal_div(Poly_rest, Sc, Prod_rest).

poly_div(Num, Den, OutBuild, Out) :-
    poly_deg(Num, X),
    poly_deg(Den, Y),
    X < Y,
    Out = OutBuild.
poly_div(INum, IDen, OutBuild, Out) :-
    lead(INum, [NumHead | NumTail]), lead(IDen, [DenHead | DenTail]),
    Q is NumHead / DenHead,
    append(OutBuild, [Q], Out1),
    append([DenHead], DenTail, DenNorm), append([NumHead], NumTail, Num),
    scal_prod(DenNorm, Q, DenXQ),
    poly_sub(Num, DenXQ, N),
    poly_div(N, IDen, Out1, Out).

poly_mod(Num, Den, Out) :-
    poly_deg(Num, X), poly_deg(Den, Y),
    X < Y,
    lead(Num, Out1),
    poly_red(Out1, Out2),
    lead(Out2, Out).
poly_mod(INum, IDen, Out) :-
    lead(INum, [NumHead | NumTail]), lead(IDen, [DenHead | DenTail]),
    Q is NumHead / DenHead,
    append([DenHead], DenTail, DenNorm), append([NumHead], NumTail, Num),
    scal_prod(DenNorm, Q, DenXQ),
    poly_sub(Num, DenXQ, N),
    poly_mod(N, IDen, Out).

poly_gcd(X, Y, X):- poly_deg(Y, O), O == 0, !.
poly_gcd(Y, X, X):- poly_deg(Y, O), O == 0, !.
poly_gcd(X, Y, D):- poly_deg(X, Xd), poly_deg(Y, Yd), Xd > Yd, !, poly_mod(X, Y, Z), poly_gcd(Y, Z, D).
poly_gcd(X, Y, D):- poly_mod(Y, X, Z), poly_gcd(X, Z, D).

gcd(X, Y, Z) :-
    X < 0, X > Y, !,
    X1 is X - Y,
    gcd(-X, Y, Z).
gcd(X, Y, Z) :-
    Y < 0, Y >= X, !,
    Y1 is Y - X,
    gcd(X, -Y, Z).
gcd(X, 0, X).
gcd(0, Y, Y).
gcd(X, Y, Z) :-
    X > Y, Y > 0,
    X1 is X - Y,
    gcd(Y, X1, Z).
gcd(X, Y, Z) :-
    X =< Y, X > 0,
    Y1 is Y - X,
    gcd(X, Y1, Z).
gcd(X, Y, Z) :-
    X > Y, Y < 0,
    X1 is X + Y,
    gcd(Y, X1, Z).
gcd(X, Y, Z) :-
    X =< Y, X < 0,
    Y1 is Y + X,
    gcd(X, Y1, Z).
tail([| tail],tail)。
头([头],头)。
标准(旧、N、新):-
长度(尾部,N),
追加(新、尾、旧)。
norm(旧,N,[]):-
长度(旧,L),
N>L。
mult_GCD(列表,GCD):-长度(列表,L),
L>2,尾部(列表,尾部),
mult_GCD(尾部,GCD)。
多重GCD([H | T],GCD):-
长度(T,L),
L==1,水头(T,N),
gcd(H,N,gcd)。
领导(名单,名单):-
长度(列表,L),
L==1。
铅([0 |尾],向外):-
!, 引导(尾部,向外)。
铅([Head | Tail],[Head | Tail]):-Head=\=0。
聚度([],0)。
聚二甘醇(F,D):-
铅(F,O),
长度(O,N),
D是N-1。
聚红([0],[0])。
聚合红色(聚合,输出):-
mult_GCD(保利,GCD),
缩放分区(多边形、GCD、Out)。
poly_-sub(poly,[],poly):-poly=[124; 124;]。
poly_sub([],poly,poly)。
聚铀接头([P1|头| P1|座]、[P2|头| P2|座]、[PSub|头| PSub|座]):-
PSub_头是P1_头-P2_头,
poly_-sub(P1_-rest、P2_-rest、PSub_-rest)。
scal_prod([],_Sc,[])。
scal_prod([Poly_head | Poly_rest],Sc[prod_head | prod_rest]):-
产品头是Poly_head*Sc,
scal_-prod(Poly_-rest、Sc、prod_-rest)。
scal_div([],[],[])。
比例分区([Poly|u head | Poly|rest],Sc[Prod|u head | Prod|rest]):-
生产头为聚头/Sc,
缩放分区(多边形支架、Sc、产品支架)。
多边形分区(数量、巢穴、外屋、外屋):-
聚度(Num,X),
聚乙烯(Den,Y),
XYd!,poly_mod(X,Y,Z),poly_gcd(Y,Z,D)。
poly_-gcd(X,Y,D):-poly_-mod(Y,X,Z),poly_-gcd(X,Z,D)。
gcd(X,Y,Z):-
X<0,X>Y!,
X1是X-Y,
gcd(-X,Y,Z)。
gcd(X,Y,Z):-
Y<0,Y>=X!,
Y1是Y-X,
gcd(X,-Y,Z)。
gcd(X,0,X)。
gcd(0,Y,Y)。
gcd(X,Y,Z):-
X>Y,Y>0,
X1是X-Y,
gcd(Y,X1,Z)。
gcd(X,Y,Z):-
X=0,
Y1是Y-X,
gcd(X,Y1,Z)。
gcd(X,Y,Z):-
X>Y,Y<0,
X1是X+Y,
gcd(Y,X1,Z)。
gcd(X,Y,Z):-
X=
这个答案意味着向正确的方向推进

首先,暂时忘记您需要解析一个表达式,如
x^2+7x+6
;这在Prolog中甚至还不是一个合适的术语。如果试图在顶层写入,则会出现错误:

?- Expr = x^2 + 7x + 6.
ERROR: Syntax error: Operator expected
ERROR: Expr = x^2 + 
ERROR: ** here **
ERROR: 7x + 6 . 
Prolog不知道如何处理您的
7x
。解析表达式本身就是一个问题,如果您假设已经解析了表达式并得到了如下表示形式,则可能会更容易:

[6, 7, 1]
类似地,
x^2− 5倍− 6
变成:

[-6, -5, 1]
要表示0,请使用空列表:

[]
现在,让我们看一看。它使用
deg
表示度,
lc
表示前导系数。使用上面的列表表示法,可以将其定义为:

度比包含系数的列表长度小一个

前导系数是列表的最后一个元素

你还需要能够用多项式做简单的算术运算。使用上的定义,我们可以看到,例如,添加
[]
[1]
应该得到
[1]
,将
[-2,2]
乘以
[1,-3,1]
应该得到
[-2,8,2]
。他给了我一本书。使用此处定义的谓词:

?- poly_prod([-2,2], [1, -3, 1], P).
P = [-2.0, 8.0, -8.0, 2] .

?- poly_sum([], [1], S).
S = [1].

从这里开始,您应该可以尝试实现多项式除法,正如我在上面链接的Wiki文章中所概述的那样。如果你遇到更多的麻烦,你应该编辑你的问题或问一个新问题。

这个答案意味着向正确的方向推进

首先,暂时忘记您需要解析一个表达式,如
x^2+7x+6
;这在Prolog中甚至还不是一个合适的术语。如果试图在顶层写入,则会出现错误:

?- Expr = x^2 + 7x + 6.
ERROR: Syntax error: Operator expected
ERROR: Expr = x^2 + 
ERROR: ** here **
ERROR: 7x + 6 . 
Prolog不知道如何处理您的
7x
。解析表达式本身就是一个问题,如果您假设已经解析了表达式并得到了如下表示形式,则可能会更容易:

[6, 7, 1]
类似地,
x^2− 5倍− 6
变成:

[-6, -5, 1]
要表示0,请使用空列表:

[]
现在,让我们看一看。它使用
deg
表示度,
lc
表示前导系数。使用上面的列表表示法,可以将其定义为:

度比包含系数的列表长度小一个

前导系数是列表的最后一个元素

你还需要能够用多项式做简单的算术运算。使用上的定义,我们可以看到