Bash
ProjectEuler
数学

Project Euler Q44 【五角数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。

問題

五角数は $P_n = \frac{1}{2}n(3n-1)$ で生成される. 最初の$10$項は
$1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...$

である.

$P_4 + P_7 = 22 + 70 = 92 = P8$ である. しかし差 $70 - 22 = 48$ は五角数ではない.

五角数のペア $P_j$ と $P_k$ について, 差と和が五角数になるものを考える. 差を $D = |P_k - P_j|$ と書く. 差 $D$ の最小値を求めよ.

アプローチ

$P_n = \frac{1}{2}n(3n-1)$を$n$について解くと、$n=\frac{1±\sqrt{1+24P_n}}{6}$となる。
$P_k±P_j$を計算した結果を上記に代入して整数になればよい。

解答

seq 9999 |
awk '{print $1*(3*$1-1)/2}' |
awk '{for(i=NR-1;1<=i;i--){v=i*(3*i-1)/2;p=$1+v;m=$1-v;if((1+sqrt(1+24*p))%6==0&&(1+sqrt(1+24*m))%6==0){print m;break}}}' |
sort -k1,1n |
head -1
5482660

seq 999から始められればフィルタコマンド(といっても結局awk)のつなぎ合わせで求められるが、seq 9999からでないと求められないのでawkで長ったらしく書いた。
awkforbreak大切!と思ったが、今回の場合はifではじかれているだけだった様子。

答え合わせ

こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/044.html