友愛数を求める

完全数と共に小説『 博士の愛した数式』に登場する「友愛数」を求めるプログラムです。

友愛数(Amicable Numbers)とは、2つの異なる自然数の組(ペア)になっていて、自分自身を除いた約数の和が、もう片方の数と等しくなるような数を言います。
「親和数」とも呼ばれているようです。

例えば、一番小さな友愛数の組は(220, 284)で、
220の自分自身を除いた約数の和は、1+2+4+5+10+11+20+22+44+55+110 = 284 で、
284の自分自身を除いた約数の和は、1+2+4+71+142 = 220 となります。

ちなみに、今までに見つかった友愛数の組は、すべて偶数同士または奇数同士の組だそうです。
ただ、すべてでそうなるのかは、未解決の問題のようです。

「完全数」のような何らかの式があって、それを使えば求められるというわけではないので、このプログラムでは、約数を求め、その和を求めることで、友愛数を求めています。

クラス AmicableNumbers が、友愛数を求めるクラスで、GetNumbers メソッドで、友愛数の組を順に取り出せるようにしています。「いくつまで」という制限は設けていないので、GetNumbers メソッドを呼び出す側で、Take(n) とかして、組を取りだす個数を指定します。
もちろん、取り出せるのは、longで表せる数の範囲です。

でも、あまり多くの組を見つけようとしても、効率の良いプログラムではないので、かなり時間がかかると思われます。
真の約数を求めるDivisorsメソッドの効率を図れば、もっと速くなると思います。

以下、C#+Silverlightのコードです。

■AmicableNumber.cs
  
■MainPage.xaml.cs
  
■MainPage.xaml