ProjectEuler21で友愛数が登場します。
友愛数は
ある数 a の約数の和から自分自身を引いた値 b を求めると、
bの約数の和から自分自身を引いた値が a になるという数字のペアを指しており、
一番小さい数字が220と、284です。
約数の和を求めるところは結構工夫する余地があって、10倍ぐらいは速くなったので、
20,000,000まで求めてみました。(それでも1分かかってしまった)
ほんとはもう一桁増やしたかったのですが、メモリが足りません。
sympyを使う方法も試してみたのですが、計算速度が出ません。
今回はこれを使って社交数を求めてみました。
友愛数と同じように計算して、a→b→c→aとなるような数字の組み合わせです。
最初に登場するのが、
12496→14288→15472→14536→14264→12496となる5個組でした。
その次に、「14316」から始まる28個組が登場します。
次は
1264460から始まる4個組
2115324から始まる4個組
2784580から始まる4個組
4938136から始まる4個組
7169104から始まる4個組
20,000,000だとここまでです。
終わり方としては
途中でN=20000000を超えてしまう(どうなるかわからないので、そこで終了)
最初の数に戻る素数にぶつかり1になってしまう。
完全数もしくは友愛数にぶつかってしまうとそこで循環する
の4通りでいいようです。
上限を決めずに探した時、発散してしまう数字があるみたいで、例えば276からスタートすると、30番目には11738916と大きい数字になってしまいました。そのあともどんどん増えていってしまうようなので、なにか上限は決めた方がよさそうです。