EarOwlの日記: Re: 10^2+11^2+12^2=13^2+14^2=365 1
#include <stdio.h>
/*
* 参照 : http://srad.jp/~MZ80.%2Buser/journal/522427
*
* (a-1)^2 + a^2 + (a+1)^2 = (b-1/2)^2 + (b+1/2)^2 となる a, b を探す.
* 但し (a-1)・a・(a+1)・(b-1/2)・(b+1/2) はいずれも整数, a・b は共に 0 以上とする.
*
* a^2 -2a + 1 + a^2 + a^2 + 2a + 1 = b^2 - b + 1/4 + b^2 + b + 1/4
* 3a^2 + 2 = 2b^2 + 1/2
* 6a^2 + 4 = 4b^2 + 1
*
* ここで b = B/2 とする. ((b-1/2), (b+1/2) が整数であることから B は正の奇数)
*
* 6a^2 + 4 = B^2 + 1
* 6a^2 + 3 = B^2
* 3 * (2a^2 + 1) = B^2
*
* B は正の奇数であることから, 2a^2 + 1 = 3k^2 と表せる. (k は正の奇数)
*
* 2a^2 + 1 = 3k^2
* a^2 = (3k^2 - 1) / 2
*
* B^2 = (3k)^2
* B = 3k
* b = 3k / 2
*
* ここで k = 2n - 1 とする. (n は自然数)
*
* a^2 = (3(2n - 1)^2 - 1) / 2
* = (3(4n^2 -4n + 1) - 1) / 2
* = (12n^2 -12n + 3 - 1) / 2
* = (12n^2 -12n + 2) / 2
* = 6n^2 -6n + 1
*
* 以下, a が整数となるような自然数 n を探すプログラム.
*/
int main(void)
{
#if __STDC_VERSION__ >= 199901L
unsigned long long a, n, t, k;
const unsigned long long n_max = 1753413056; /* n >= 1753413057 で t の計算でオーバーフロー */
#else
unsigned long a, n, t, k;
const unsigned long n_max = 26755; /* n >= 26756 で t の計算でオーバーフロー */
#endif
a = 0;
for (n = 1 ; n = 199901L
printf("n = %llu, a = %llu, b = %llu/2 -> %llu^2 + %llu^2 + %llu^2 = %llu^2 + %llu^2\n",
n, a, 3 * k, a - 1, a, a + 1, (3 * k - 1) / 2, (3 * k + 1) / 2);
#else
printf("n = %lu, a = %lu, b = %lu/2 -> %lu^2 + %lu^2 + %lu^2 = %lu^2 + %lu^2\n",
n, a, 3 * k, a - 1, a, a + 1, (3 * k - 1) / 2, (3 * k + 1) / 2);
#endif
}
}
return 0;
}
/*
* 実行結果は以下の通り.
*
* n = 1, a = 1, b = 3/2 -> 0^2 + 1^2 + 2^2 = 1^2 + 2^2
* n = 5, a = 11, b = 27/2 -> 10^2 + 11^2 + 12^2 = 13^2 + 14^2
* n = 45, a = 109, b = 267/2 -> 108^2 + 109^2 + 110^2 = 133^2 + 134^2
* n = 441, a = 1079, b = 2643/2 -> 1078^2 + 1079^2 + 1080^2 = 1321^2 + 1322^2
* n = 4361, a = 10681, b = 26163/2 -> 10680^2 + 10681^2 + 10682^2 = 13081^2 + 13082^2
* n = 43165, a = 105731, b = 258987/2 -> 105730^2 + 105731^2 + 105732^2 = 129493^2 + 129494^2
* n = 427285, a = 1046629, b = 2563707/2 -> 1046628^2 + 1046629^2 + 1046630^2 = 1281853^2 + 1281854^2
* n = 4229681, a = 10360559, b = 25378083/2 -> 10360558^2 + 10360559^2 + 10360560^2 = 12689041^2 + 12689042^2
* n = 41869521, a = 102558961, b = 251217123/2 -> 102558960^2 + 102558961^2 + 102558962^2 = 125608561^2 + 125608562^2
* n = 414465525, a = 1015229051, b = 2486793147/2 -> 1015229050^2 + 1015229051^2 + 1015229052^2 = 1243396573^2 + 1243396574^2
*
* とりあえず MZ80.+user さんの日記で計算済の範囲までは確認できた.
* 全て整数で計算しているので誤差は発生しないが, 2乗の計算があるため, オーバーフローせずに
* 計算できる範囲は限られてしまう.
*/
/*
* 追記 : 実行結果を眺めると, 1 の位が以下の組み合わせの繰り返しとなっているように推測される.
*
* ・(0, 1, 2), (1, 2)
* ・(0, 1, 2), (3, 4)
* ・(8, 9, 0), (3, 4)
* ・(8, 9, 0), (1, 2)
*
* (a-1)^2 + a^2 + (a+1)^2 = (b-1/2)^2 + (b+1/2)^2 の右辺が奇数になることから左辺の中央の値が
* 奇数になることはすぐに分かるが, 両辺について各組み合わせでの 1 の位の値を細かく調べると
* 以下の通りとなり, (*) 印の組み合わせのみに限られることが分かる.
*
* 右辺 :
* (0, 1) -> 1
* (1, 2) -> 5 (*)
* (2, 3) -> 3
* (3, 4) -> 5 (*)
* (4, 5) -> 1
* (5, 6) -> 1
* (6, 7) -> 5 (*)
* (7, 8) -> 3
* (8, 9) -> 5 (*)
* (9, 0) -> 1
*
* 左辺 :
* (0, 1, 2) -> 5 (*)
* (2, 3, 4) -> 9
* (4, 5, 6) -> 7
* (6, 7, 8) -> 9
* (8, 9, 0) -> 5 (*)
*
* 但し, 推測のとおり規則正しく繰り返されるのかどうか, また右辺について (6, 7) 及び (8, 9) の
* 組み合わせが現れないのかは未確認.
*/
/*
* 追追記 : (a0, a1, a2), (b0, b1) の組み合わせについて求めた結果を並べると以下のようになる.
*
* i | a0 a1 a2 b0 b1
* ---+-------------------------------------------------------
* 0 | 0 1 2 1 2
* 1 | 10 11 12 13 14
* 2 | 108 109 110 133 134
* 3 | 1078 1079 1080 1321 1322
* 4 | 10680 10681 10682 13081 13082
* 5 | 105730 105731 105732 129493 129494
* 6 | 1046628 1046629 1046630 1281853 1281854
* 7 | 10360558 10360559 10360560 12689041 12689042
* 8 | 102558960 102558961 102558962 125608561 125608562
* 9 | 1015229050 1015229051 1015229052 1243396573 1243396574
*
* 上記の範囲では, a0[i], a1[i], a2[i], b0[i], b1[i] は初項の相違のみで, いずれも
* 以下の漸化式で求められるように推測される. (未証明)
*
* x[i+3] = 11 * (x[i+2] - x[i+1]) + x[i]
*
* i = 10 について MZ80.+user さんの次の日記で求められた値と一致することは確認済.
* http://srad.jp/~MZ80.%2Buser/journal/522474
*/
なんかできたみたいだし… (スコア:1)
もうリンク貼ってもだいじょうぶだよね。
http://srad.jp/~okky/journal/522485 [srad.jp]
整数nを使っていきなり解を出す方法があります。ただし「n番目に大きい解」というわけじゃありません。
えぇ、WolframAlpha先生にききました。
# ちなみにこれが双曲線だという所までは自力で出したけど
# 双曲線上の整数解の一般式は思い出せなかったので。
fjの教祖様