inohilog

/var/log/inohiro

完全数(PerfectNumber)。

なぜかいきなり完全数を求めるコードを書いてみた。
Wikipediaを読むと、最初の4つはすぐ出てくるんだけど、その後はかなり大きな数にならないと出てこないと言うことに驚いた。

完全数は、小さい順に
6, 28, 496, 8128, 33550336, 8589869056, …(オンライン整数列大辞典の数列 A000396)
である。知られている完全数の一覧についてはメルセンヌ数を参照のこと。
完全数 - Wikipedia

[6,28,496,8128,33550336,8589869056,137438691328,
2305843008139952128,
2658455991569831744654692615953842176,
191561942608236107294793378084303638130997321548169216]
A000396 formatted as a simple table:

コード。

なんか味気ないですね。もっと速く計算できそうでならない。

static void Main( string[] args )
{
	long root = 0;
	long sum = 0;
	List<int> table = new List<int>();

	for ( long i = 1; i < 1000000000; i++ )
	{
		root = i;

		for ( int j = 1; j < i; j++ )
		{
			if ( i % j == 0 )
			{
                                // 約数をListに追加
				table.Add( j );
			}
		}

		for ( int r = 0; r < table.Count; r++ )
		{
            // 約数をすべて足す
			sum += table[ r ];
		}

        // 元の数と総和が等しければ出力
		if ( sum == root )
		{
			Console.WriteLine( "PerfectNumber: {0}", root );
		}

		Console.Title = i.ToString();

		table.Clear();
		sum = 0;
	}
	Console.ReadKey();
}


ここまではすぐに出てくる。

PerfectNumber: 6
PerfectNumber: 28
PerfectNumber: 496
PerfectNumber: 8128