問題
x=a4+b4+c4+d4, a≤b≤c≤d, a,b,c,d∈N
を満たし、解の組数をnとします。
nに対して最小となるxとn組の解を示せ。
例
n=1, x=4
(1,1,1,1)
n=2, x=259
(1,1,1,4)
(2,3,3,3)
n=3, x=16578
(1,2,9,10)
(2,5,6,11)
(3,7,8,10)
これをプログラミングで探しだしていくとする。
xを大外のループで小さいほうから順次探していたが、
n=4, x=236674
(1,2,7,22)
(3,6,18,19)
(7,14,16,19)
(8,16,17,17)
n=5, x=2147874
(2,14,31,33)
(4,23,27,34)
(7,21,28,34)
(12,17,29,34)
(14,18,19,37)
n=6, x=3847554
(2,13,29,42)
(2,21,22,43)
(6,11,17,44)
(6,31,32,37)
(9,29,32,38)
(13,26,32,39)
n=7, x=6576339
(1,24,41,43)
(3,7,41,44)
(4,23,27,49)
(6,31,41,41)
(7,11,36,47)
(7,21,28,49)
(12,17,29,49)
n=8, x=13155858
(1,16,19,60)
(3,6,21,60)
(10,18,31,59)
(12,27,45,54)
(15,44,46,47)
(18,25,41,56)
(29,30,44,53)
(35,36,38,53)
このくらいまでは待っていられたんだが、かなり無駄なことをしていると感じた。
for (a=1; a<z; a++)
for (b=a; b<z; b++)
for (c=b; c<z; c++)
for (d=c; d<z; d++) {
/* 処理 */
}
というネストだとして、xの取りうる範囲を32ビット正整数に限定して、
x=232-1=4294967295
として、
x=a4+b4+c4+d4
a≤b≤c≤d
より、zを求めると、
[[x/4]1/4]=181
z=182
となる。
z=182;
for (a=1; a<z; a++)
for (b=a; b<z; b++)
for (c=b; c<z; c++)
for (d=c; d<z; d++) {
/* 処理 */
}
として、処理で32ビット正整数のxをデータを作る。
184870504バイトのデータが完成した。
これは秒殺で作成されるのだが、これが答えではない。
このデータをもとに、集計をする。
1データ4バイトのバイナリデータなので、
184870504÷4=46217626個のデータとなって、
集計するのに時間が掛かっているのが現状。
集計のデータも、xを4バイト、nを1バイトでバイナリデータファイルとしています。
元データを1個ずつ読み出し、集計データからxがあれば、nの値をインクリメントして上書き、なければ追加でという形で、集計データを構築している。
集計データが完成したら、今度はnの値でリストするプログラムを組めば、最小のxを探し出せるという流れでやってはいるが、これがぜんぜん終わる気配すらないw。
本当は、集計データをソートするとか考えてもいたが、それよりも元データをソートするだけでも良いという方法もありだなと考えている。
という現状報告でした。
さて、ソートプログラムでも組むかなぁ。
ではでは
PS:
実はね、プログラムを動かしたまま、寝てるわけですが、寝てる間にWindows 10の累積更新プログラムなどがあって、勝手に再起動してやがったんですよ。
途中で止まることを想定してプログラムを組んでないんで、泣くに泣けないですね。
Windows 10 Proなら累積更新プログラムが来てもシャットダウンしないように設定できるらしいんだけどね。
ソートプログラムなら、書き込み最中にシャットダウンされたらアウトだろうけど、ソートの途中データでも残してあればどうにかなるんだよなぁ。
↧
x=a⁴+b⁴+c⁴+d⁴の解の個数のその後
↧