我一直在努力與幾個prolog代碼幾天,我找不到出路。我想寫的擴展歐幾里德算法,並找到值p
和s
:序言擴展歐幾里德算法
a*p + b*s = gcd(a,b)
方程,這裏是我曾嘗試:`
common(X,X,X,_,_,_,_,_,_).
common(0,Y,Y,_,_,_,_,_,_).
common(X,0,X,_,_,_,_,_,_).
common(X,Y,_,1,0,L1,L2,SF,TF):-
append(L1,1,[H]),
append(L2,0,[A]),
SF is H ,
TF is A,
common(X,Y,_,0,1,[H],[A],SF,TF).
common(X,Y,_,0,1,L1,L2,SF,TF):-
append(L1,0,[_,S2]),
append(L2,1,[_,T2]),
Q is truncate(X/Y),
S is 1-Q*0,T is 0-Q*1 ,
common(X,Y,_,S,T,[S2,S],
[T2,T],SF,TF).
common(X,Y,N,S,T,[S1,S2],[T1,T2],SF,TF):-
Q is truncate(X/Y),
K is X-(Y*Q),
si_finder(S1,S2,Q,SF),
ti_finder(T1,T2,Q,TF),
common(Y,K,N,S,T,[S2,S],[T2,T],SF,TF).
si_finder(PP,P,Q,C):- C is PP - Q*P.
ti_finder(P2,P1,QA,C2):- C2 is P2 - QA*P1.
後有點搜索,我發現S和p係數從1和0開始,第二個值分別爲0和1.然後它繼續一個模式,這是我在si_finder和ti_finder謂詞中完成的。常用謂詞是我試圖遞歸控制模式的地方。然而,通用謂詞在每次調用中都會返回false。任何人都可以幫助我在Prolog中實現這個算法。
在此先感謝。
您可能會發現[視頻解釋算法(https://www.youtube.com/watch?v = hB34-GSDT3k)有幫助。我認爲你的謂詞比你真正需要的參數多得多。 – lurker
謝謝,我在搜索過程中觀看過這段視頻,但這需要返回替換,因爲我正在查找卡住的係數。我以這種方式 – adropintheocean
你可以使用約束開始根據執行我的代碼[鏈接](https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm),找到係數。查看庫clpfd的手冊。 –