プロジェクトオイラーの問題をPrologで解く堀江伸一さんのページ。 *問い101「最適多項式」 † http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20101 ニュートン補間を題材にした練習問題。 計算法や原理は分かったものの、Prologでどう実装したらよいかわからなかったのでとりあえずわかりやすさ重視でコードを実装。 同じ計算を何度もやっているのでニュートン補間の利点が完璧に消えているのでそのうち書き直す予定。 行列演算が解けない場合に行う行の入れ替えはこの問題では必要がないので実装してない。 f(N,Re):-Re is 1-N+N^2-N^3+N^4-N^5+N^6-N^7+N^8-N^9+N^10. f2(N,Re):-Re is N^3. g(X,[X1],Result):-Result is X-X1,!. g(X,[X1|Xs],Result):- !, g(X,Xs,Re), Result is Re*(X-X1). newton_calc(_,_,[C],C):-!. newton_calc(X,[_|Xs],[C|Cs],Result):- newton_calc(X,Xs,Cs,ReY), g(X,Xs,MultX), Result is ReY+C*MultX. newton(_,[Y],[Y]):-!. newton([X|Xs],[Y|Ys],[C|Cs]):- !, newton(Xs,Ys,Cs), newton_calc(X,Xs,Cs,ReY), g(X,Xs,MultX), C is (Y-ReY)/MultX. y_ calc(_,[_],[C],C):-!. y_calc(X,[_|Xs],[C|Cs],ResultY):- y_calc(X,Xs,Cs,Re1), g(X,Xs,MultX), ResultY is Re1+MultX*C. calc(_,10,_,Sum):-write(Sum),!. calc(Ys,X,Xs,Sum):- X1 is X+1, f(X1,Y), Ys1=[Y|Ys], Xs1=[X1|Xs], X2 is X1+1, newton(Xs1,Ys1,Cs), y_calc(X2,Xs1,Cs,Add), Sum1 is Sum+Add, write(Sum1),nl, calc(Ys1,X1,Xs1,Sum1). main101:-calc([],0,[],0).