「prolog勉強プロジェクトオイラー101~110」の編集履歴(バックアップ)一覧に戻る
prolog勉強プロジェクトオイラー101~110」を以下のとおり復元します。
プロジェクトオイラーの問題を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).

復元してよろしいですか?