제목 종류는 모두입니다. 두 다항식의 GCD를 계산하려고합니다. 이것이 Prolog에서 수행 될 수있는 방법이 있습니까? 그렇다면 좋은 출발점은 무엇입니까? 특히, 프롤로그를 사용하여 다항식 나누기를 구현하는 방법에 문제가 있습니다.프롤로그를 사용하여 다항식의 GCD를 계산하십시오
편집 예를 들어, 입력 및 출력을 포함합니다 :
예 입력 :
?- GCD(x^2 + 7x + 6, x2 − 5x − 6, X).
예 출력 : 오프 기회에
X = x + 1.
솔루션
이 다른 사람 이 작업을 수행해야합니다. 여기에 내 fi가 있습니다. 솔루션 :
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).
예, 모든 지수를 처리 할 수 있어야합니다.전적으로 프롤로그에서 가능하지 않다는 것이 전적으로 가능합니다. 프롤로그를 실제로 잘 알고있는 사람이 저에게 말하기를 원했습니다. – bendl
Prolog는 범용 프로그래밍 언어입니다. 당신이 컴퓨터로 할 수 있다면, 당신은 프롤로그와 함께 할 수 있어야합니다. 먼저, 문제가 이미 해결되지 않았는지 검색하고 찾으십시오. 그런 다음, 필요하지 않은 알고리즘을 찾아 Prolog에서 구현하십시오. 문제가 발생하면 스스로 해결할 수없고, 코드를 보여주고, 문제를 설명하고, 스스로 해결할 수없는 것이 무엇인지 설명하십시오. 나는이 질문을 투표 마감에 대해 투표하지는 않을 것이지만, 그 질문은 매우 잘 익는다. –
제 문제는 제가 어떻게 시작 해야할지 모르겠다는 것입니다. 정수에 대한 GCD를 계산하는 버전이 있지만 다항식 분할로 어디서 시작해야할지 모르겠습니다. 이것은 처음이 아니며, 묻기 전에 검색하는 것을 알고 있습니다. 온라인에서이 주제에 관해서는 제가 말할 수있는 한 실제로 아무것도 없습니다. – bendl