プロジェクトオイラー問87

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2087
Problem 87 「3つの素数のべき乗」 †
素数の2乗+素数の三乗+素数の4乗で表せる5000万未満の数は幾らあるか?
何も考えず全探索で片が付きます。

not_prime(N):-N<2.
not_prime(N):-
	between(2,N,D), 
	(D*D>N->!,fail;true),
	N mod D=:=0,
	!.
is_prime(N):-not(not_prime(N)).

oks(Ps,R,E2):-
	member(E,Ps),
	E2 is E^R,
	E2<5000*10000.


cross(Ps,Ans,E3):-
 	member(E1,Ps),
	member(E2,Ans),
	E3 is E1+E2,
	E3<5000*10000.

calc([],Ans):-
	length(Ans,Ans1),
	write(Ans1).
calc([Ps|Rest],Ans):-
	findall(E2,cross(Ps,Ans,E2),Ans2),
 	sort(Ans2,Ans3),
	calc(Rest,Ans3).


main:-
	findall(E,(between(2,8000,E),is_prime(E)),Ps),
 	findall(E2,oks(Ps,2,E2),Ps2),
	findall(E3,oks(Ps,3,E3),Ps3),
	findall(E4,oks(Ps,4,E4),Ps4),
	calc([Ps2,Ps3,Ps4],[0]).
最終更新:2014年12月19日 08:22