ピタゴラスの定理

あるWeb企業の試験にでたピタゴラスの定理が時間内に解けなかったので、調べた内容など振り返りとして記載

 


 

ピタゴラスの定理とは

三平方の定理であれば、中学3年生ぐらいのときに勉強したと思います。

三平方の定理とは、直角三角形の3つの辺の関係を表すことができる公式を指します。
以下サイトにも記載されていますが、 a² + b² = c² の条件を満たすものは直角三角形となるということ指します。

 mathtrain.jp

 

試験問題

うろ覚えですが、以下の通りだったと思います。

ピタゴラスの定理という公式があり、 a² + b² = c²条件を満たすものを直角三角形とする。
・上記条件を満たすうち、 直角三角形のc²が6000cm以下となる直角三角形が何個存在するか求める。
・引数としてa, bの値が渡されるがそれぞれの条件は以下のとおりとする。

1 ≦ a ≦ N
2 ≦ b ≦ N
  

問題解決のポイント

今回のピタゴラスの定理は、ピタゴラス数を求めるアルゴリズムの問題です。
恐らく競技プログラミングをやられている方などは馴染みがあるのではないでしょうか。(私は分かりませんでした。。。)

ピタゴラス数を全て求める公式として以下の値が用意されています。

■公式
a = m² - n² または n² - m²

b = 2mn

c = m² + n²

上記条件を満たす値(a, b, c) がピタゴラス数となる。


例として、m = 5, n = 3の場合

・a = m² - n²を求める。
5² - 3²
= 25 - 9
= 16なので、
a = 16

・b = 2mnを求める
2×5×3
=30なので

b = 30

・c = m² + n²を求める
5² + 3²
= 25 + 9
= 34なので、

c = 30

答えとしては、(16 + 30 + 34)がピタゴラス数の一つになります。
一応検算します。
a² + b² = c²なので、
16 × 16 = 256
30 × 30 = 900
34 × 34 = 1156

256 + 900 = 1156となるので、正しいですね。




ソースコード

今回のピタゴラス数を求める方法をJavaソースコードに直すと以下の通りとなりました。
なお今回は c² が6000cm以下という条件があるので、有限値としてa および n に100を入れました。

public class test5 {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ

		double a;
		double b;
		double c;
		int cnt = 0;
		for(int i = 1; i < 100; i = i + 2) {
			for (int j =2; j < 100; j = j + 2) {
				//a = m2 - n2
				double m = Math.pow(i,2);
				double n = Math.pow(j, 2);
				if (m < n) {
					a = n - m;
				} else {
					a = m - n;
				}
				//b = 2mn
				b = 2 * i * j;
				//c = m2 + n2
				c = m + n;

				if(Math.pow(c, 2) <= 6000) {
					cnt++;
				}
				System.out.println("a = " + a + ", b = " + b + ", c = " + c);
			}
		}
		System.out.println("c²が6000以下のピタゴラスの定理は[" + cnt + "]件ありました");
	}

}

■結果 
c*c=6000cm以下のピタゴラスの定理は[13]件ありました。

あっているかな…?と思います。今後も数学をプログラムコードに落とし込んでいきたいですね。

/平本