※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Problem 39 「整数の直角三角形」 †

辺の長さが {a,b,c} と整数の3つ組である直角三角形を考え, その周囲の長さを p とする. p = 120のときには3つの解が存在する:

{20,48,52}, {24,45,51}, {30,40,50}

p ≤ 1000 のとき解の数が最大になる p はいくつか?


解法
周長1000以下の原始ピタゴラス数とその定数倍のリストを得て出現回数をカウントするだけです。


gcd(0, B, B).
gcd(A, B, G) :- A > 0, R is B mod A, gcd(R, A, G).

calc_ok(M,N):-
	((M-N) mod 2)=:=1,
	gcd(M,N,G),
	G=:=1
	.
calc(M,N,Result):-
	Result is M^2+N^2+2*M*N+M^2-N^2.

loopN(M,N,_):-
	M=<N,
	!,
	fail.

loopN(M,N,_):-
	calc(M,N,Len),
	Len>1000,
	!,
	fail.
loopN(M,N,Result):-
 	calc_ok(M,N),
	calc(M,N,Len),
 	between(1,1000,Bai),
	Result is Len*Bai,
	(Result>1000 -> !,fail;true).

loopM(Result):-
	between(1,31,M),
	loopN(M,1,Result).
count([],C,[C]):-!.
count([X|Xs],[C,X],Result):-
	!,
	C1 is C+1,
 	count(Xs,[C1,X],Result).
count([X|Xs],C,[C|Result]):-
	!,
	count(Xs,[1,X],Result).

main39:-
	findall(Len,loopM(Len),Lens),
	msort(Lens,Lens1),
 	[Top|Lens2]=Lens1,
	count(Lens2,[1,Top],AnsList),
	msort(AnsList,AnsList1),
	write(AnsList1).