這樣的勾股數存在嗎?

補充提問:有沒有a_2b_1
e a_1b_2的答案?(評論里已經有人想到這個問題了)


假設(a_1,b_1,c_1),,(a_2,b_2,c_2)是任意兩組勾股數,那麼

egin{eqnarray*}
(a_2a_1)^2 + (a_2b_1)^2 =  (a_2c_1)^2 \
+,,quadquadquad+quad quad+\
(b_2a_1)^2 + (b_2b_1)^2 =  (b_2c_1)^2 \
||,,,,quadquadquad||quad ,quad||\
(c_2a_1)^2 + (c_2b_1)^2 =  (c_2c_1)^2
end{eqnarray*}

舉個例子令(a_1,b_1,c_1) = (a_2,b_2,c_2) = (3,4,5)

於是可以得到一組滿足條件的數
9 12 15
12 16 20
15 20 25


全是整數的話…
全部取0…(:з」∠)_


a_2b_1=a_1b_2的大家都找到了很多很多。
這樣吧,大家猜一猜,有沒有a_2b_1
e a_1b_2的答案?


10.3更新:
題目更新:有沒有a_2b_1
e a_1b_2的答案?
答案:當然有,我的程序就能很輕易得到,加一個判斷條件(a2*b1 != a1*b2)並將c3的最大值(limit)設置成500的時候:

設置成1000的時候:

之前的程序寫錯了,當時只想了優化,而沒去想可能求出來的解壓根就是錯的!現已修改,還有錯吞糞。(這題如果是一道編程題,那麼唯一的考點就是優化,如果簡簡單單寫一個9層循環,這個世界應該沒有電腦跑的起來。)

貼這次c3&<=200的結果集:

這次的運行時間:

@勢求遇運提到:看程序是按照兩組勾股數組合構造出來的。現在比較感興趣的是,符合等式要求的9個數是不是都可以由兩組勾股數構造出來,如果能窮舉出一個反例的話,就直接可以否定了。
我想了一下,確實覺得之前完全按照兩組勾股數去構造很不嚴謹,萬一存在這樣9個數不是兩組勾股數構造出來的呢?所以我想了一下,還是用了枚舉的方法,極儘可能的優化,得到了上述的結果集。在limit等於200的時候,就已經出現了一組數並非兩組勾股數構造出來的了!即圖中紅框所框。
我設定a2小於b1,但是a邊和b邊不能設定大小關係,不然會有一些解得不出來。當9個數的順序互換,但是還是那9個數,我默認它們是一組。

代碼如下

public List& getResoults(int limit) {
// 設定勾股數組直角邊為a和b,最長為c
int a, b, c;
List& list1 = new ArrayList&();
// 尋找出所有符合條件的勾股數
for (c = 5; c &<= limit; c++) {
for (b = 3; b &< c; b++) {
for (a = 3; a &< c; a++) {
if (a * a + b * b == c * c) {
list1.add(new int[] { a, b, c });
}
}
}
}

/*
* 遍歷list拿到key,a1為key的時候,橫豎兩個勾股數組的a相同(bc可不同)
* 然後以a3和c1為key去拿勾股數組,如果其相對應的c3相等,則可認為這9個數已經符合條件
* 然後b2通過遍歷去拿,我試過通過開方,會拿到小數
*/
int a1, b1, c1, a2, b2, c2, a3, b3, c3;
List& list2 = new ArrayList&();
for (int[] is1 : list1) {
a1 = is1[0];
b1 = is1[1];
c1 = is1[2];
A: for (int[] is2 : list1) {
if (is2[0] == a1 is2[1] &<= b1) {
a2 = is2[1];
a3 = is2[2];
} else {
continue A;
}
B: for (int[] is3 : list1) {
if (is3[0] == a3) {
b3 = is3[1];
c3 = is3[2];
} else {
continue B;
}
C: for (int[] is4 : list1) {
if (is4[0] == c1 is4[2] == c3) {
c2 = is4[1];
} else {
continue C;
}
for (int[] is5 : list1) {
if (is5[0] == a2 is5[2] == c2) {
b2 = is5[1];
if(list2.size() == 0){
list2.add(new int[] { a1, b1, c1, a2, b2, c2, a3, b3, c3 });
System.out.println(a1 + " " + b1 + " " + c1);
System.out.println(a2 + " " + b2 + " " + c2);
System.out.println(a3 + " " + b3 + " " + c3);
System.out.println();
}else {
for (int[] is6 : list2) {
if (is6[8] == c3) {
/*
* 此處的判斷相當於濾重,當數字還是同樣的9個數,但是位置發生變化,
* 依然滿足題目要求的時候,我把它們算作一組(這是我想的最久的一個地方)
*/
if (((is6[2] == c1 || is6[2] == c2) (is6[6] == a3 || is6[6] == b3))
|| ((is6[2] == a3 || is6[2] == b3) (is6[6] == c1 || is6[6] == c2))) {
continue C;
}
}
}
list2.add(new int[] { a1, b1, c1, a2, b2, c2, a3, b3, c3 });
System.out.println(a1 + " " + b1 + " " + c1);
System.out.println(a2 + " " + b2 + " " + c2);
System.out.println(a3 + " " + b3 + " " + c3);
System.out.println();
}
}
}
}
}
}
}
return list2;
}


錯誤代碼我就不刪了,也算是給我自己一個警醒,遇到問題先追求做對,而不是上來就想著優化優化,到最後來跑的時很快,但是出的凈是錯誤答案也是無益。

-------------原答案,包括錯誤的代碼-------------

這是c3&<=200的結果集

這是一個有趣的問題,如果單單想枚舉出一組, @勢求遇運 的答案的那一組應該是最容易找出來的。
然而在該答案底下, @張瀚予 提到:這種方式能否得到全部的滿足條件的九個數?
毫無疑問,因為整數是無窮大的,所以答案也會有無窮多組,所以這可以說是不可能的。
但是我由此想到,能不能寫個小程序去專門找出這些神奇的數組呢?
於是我動手開始,用java寫了一個9層for循環嵌套,寫出來我就笑了,哪怕定義9個數中最大值c3不超過100(下稱此數為limit),那運算量級也是100的9次方,估計世界最快的銀河計算機也未必算的出來。
所以我進行了一下優化,在找出limit以內的勾股數組之後進行枚舉,limit=100的情況下,我的電腦大概用了20秒找出來。。。顯然這個方式也是不太合適的,於是開動小學數學的頭腦,找了一下規律,寫出了一個小程序,拋磚引玉。

這是程序的運行時間:

/**
* limit是a1,a2....c3九個數最大不能超過的數
* @param limit
* @return
*/
public List& getResults(int limit) {
int a, b, c;
List& list = new ArrayList&();

// 拿到所有的勾股數
for (a = 1; a &<= limit / 5; a++) {
for (b = a + 1; b &<= limit / 5; b++) {
for (c = b + 1; c &<= limit / 5; c++) {
if (a * a + b * b == c * c) {
list.add(new int[] { a, b, c });
}
}
}
}

int a1, b1, c1, a2, b2, c2, a3, b3, c3;
List& list2 = new ArrayList&();
A:for (int i = 0; i &< list.size(); i++) {
int[] is1 = list.get(i);
for (int j = i; j &< list.size(); j++) {
int[] is2 = list.get(j);
a1 = is1[0] * is2[0];
b1 = is1[0] * is2[1];
c1 = is1[0] * is2[2];
a2 = is1[1] * is2[0];
b2 = is1[1] * is2[1];
c2 = is1[1] * is2[2];
a3 = is1[2] * is2[0];
b3 = is1[2] * is2[1];
c3 = is1[2] * is2[2];

if (a2 &> a1 b1 &>= a2 c3 &<= limit) {
for (int[] is3 : list2) {
if (a1 == is3[0] b1 == is3[1] a2 == is3[3]) {
continue A;
}
}
list2.add(new int[] { a1, b1, c1, a2, b2, c2, a3, b3, c3 });
System.out.println(a1 + " " + b1 + " " + c1);
System.out.println(a2 + " " + b2 + " " + c2);
System.out.println(a3 + " " + b3 + " " + c3);
System.out.println();
}
}
}
return list2;
}


(81+144=225)+(144+256=400)=(225+400=625)
(144+81=225)+(256+144=400)=(400+225=625)
(144+256=400)+(81+144=225)=(225+400=625)
(225+400=625)+(1296+2304=3600)=(1521+2704=4225)
(225+1296=1521)+(400+2304=2704)=(625+3600=4225)
(256+144=400)+(144+81=225)=(400+225=625)
(324+576=900)+(576+1024=1600)=(900+1600=2500)
(400+225=625)+(2304+1296=3600)=(2704+1521=4225)
(400+2304=2704)+(225+1296=1521)=(625+3600=4225)
(441+784=1225)+(5184+9216=14400)=(5625+10000=15625)
(441+5184=5625)+(784+9216=10000)=(1225+14400=15625)
(576+324=900)+(1024+576=1600)=(1600+900=2500)
(576+1024=1600)+(324+576=900)=(900+1600=2500)
(576+1024=1600)+(2025+3600=5625)=(2601+4624=7225)
(576+2025=2601)+(1024+3600=4624)=(1600+5625=7225)
(729+1296=2025)+(1296+2304=3600)=(2025+3600=5625)
(784+441=1225)+(9216+5184=14400)=(10000+5625=15625)
(784+9216=10000)+(441+5184=5625)=(1225+14400=15625)
(900+1600=2500)+(5184+9216=14400)=(6084+10816=16900)
(900+5184=6084)+(1600+9216=10816)=(2500+14400=16900)


其它答案說不存在的都是什麼鬼……

15 36 39
20 48 52
25 60 65


兩個矩形,b1=a2,我想是有整數解的,當然還有還有其他情況。不過這個足夠證明有解


推薦閱讀:

如何提高數學某一塊的成績?
為何從一元五次方程開始就沒有由有限次加、減、乘、除、開方運算構成的求根公式了?

TAG:數學 | 數論 | 勾股定理 | 趣味數學 |