[急いで打ったので文がぐちゃぐちゃですし強調等もないです。すみません。]
[定期的に記事の一番下にこっそりと僕のコメントを追加しています。一応ご確認ください]


このような記事を発見しました。

スパコンで約2時間36分かかったという、5×5の魔方陣の全解列挙を、パソコンで試す(C++)

魔方陣の総数を求める、ということを、僕はスーパーコンピュータT2K-Tsukubaで約2時間30分で計算しましたが、この記事では一般的なコンピュータで10分で計算した、というものです。挑発的ですね。

僕のプログラムを1コア上で実行すると約200時間かかりました。(2012年ごろのAMD Opteron)
(TODO:スパコンでの実行時間から1コア上での実行時間を割り出すと、200時間からかけ離れてるけどなんでだろう?)
そして、この記事での実行環境は12コアなので、1コア換算すると実行時間は10分*12コア=120分=2時間になります。
これらから、この記事のプログラムは僕のプログラムより何倍速いか計算すると、
200/2=100倍
CPUの性能等を考えると、その記事のプログラムは僕のプログラムより数十倍高速であると言えます。

また、プログラムとアルゴリズムが公開されているので解析してみました。
高速化した理由として考えられるのは以下の3点です。

・数字が既に使用されているか否かの判定にビット演算を用いている
・1列中の数字を埋める際、残り1マスのときだけでなく残り2マスのときにも、入れる数字が列の合計と比べて正しいか判定する
・マスに入れる数のレンジを、列の合計から狭くする

以上をまとめると、
「ビット演算を用いたり、マスに入れる数字の範囲を狭めたり早めにバックトラッキングすることで、僕のプログラムと比較して数十倍高速化することができる」
と言えます。


#あー、怖かった。とんでもないアルゴリズムが考案されたのかと思った。
#"6次に対しては"そこまでつよい高速化ではないと思います。なぜなら、これを6次に適用しても、やはり全解を求めるのは非現実的だと予想できるので。
#※解の総数を求めるためには今のところ全ての解を求める方法しかないので、今のところ「総数を求める=全解をもとめる」になります。(表記が混同していますがよろしくお願いいたします)
#ビット演算による最適化などは当たり前に行っておくべきとの意見を頂きました。その通りです。スパコンを利用する前に、並列処理だけでなくプログラムの基本的な最適化手法なども学んでおくべきだったと反省しております。
#それと、個人的にはコードがとても短くて驚きました。
#Intel Core i7-4930K ってコア数が6でスレッド数が12なんですね。これも考察に入れないと Intel core i7-4930K

#もしこの記事があなたにとって印象悪く映ってしまったなら、ごめんなさい。悪気はないです。急いで書いたので尖ってしまったのかもしれません。僕の文章の書き方が下手なのかもしれません。