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と大きい数字になってしまいました。そのあともどんどん増えていってしまうようなので、なにか上限は決めた方がよさそうです。