Project Euler 9

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,


a^2 + b^2 = c^2

For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2.

There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.
ピタゴラスの三つ組(ピタゴラスの定理を満たす整数)とはa<b<cで
a^2 + b^2 = c^2
を満たす数の組である.

例えば, 3^2 + 4^2 = 9 + 16 = 25 = 5^2 である.

a + b + c = 1000となるピタゴラスの三つ組が一つだけ存在する. このa,b,cの積を計算しなさい.

Mathematica

a = 0;
b = 0;
c = 0;
p = 0;
For[a = 0, a <= 1000, a++,
 For[b = a, b <= 1000, b++,
  For[c = b, c <= 1000, c++,
   If[a + b + c == 1000 && a^2 + b^2 == c^2, Print[a, b, c], p++]
   ]
  ]
 ]
p

pは特に意味のない値。
計算に10分弱ぐらいかかってしまい、完全に失敗プログラムです。ちなみにC言語だと1秒とまたずに結果がでたのですが。


他の人の解答例

Reduce[{a^2+b^2==c^2,a+b+c==1000,0<a<b<c},{a,b,c},Integers]
 
Times @@ %[[All, 2]]

すぐ答えが出ました。
*1
最初はSolve*2を使おうかとも思ったのですが、不等式が条件にあるときはReduceがいいみたいですね。



C/C++

#include <iostream>
using namespace std;

int main(){
	int i,j,k,terml,termr;

	for(i=1 ; i<333 ; i++){
		for(j=i ; j<1000 ; j++){
			k=1000-i-j;
		
			terml = i*i + j*j;
			termr = k*k;

			if(terml==termr) break;
		}

		if(terml==termr) break;
	}

	cout << i << " " << j << " " << k  << " " << i*j*k << endl;
}

i,j,kをa,b,cに置き直すのも面倒だったので,i,j,kをそのまま出力しちゃいました。
i<333というのは、i

*1:Reduce[expr,vars]: varsについて方程式あるいは不等式を解き、量限定子を除去することで、命題expr を簡約する。

*2:Solve[eqns, vars]: 変数vars に関する方程式や、連立方程式の解を求める。