すべての約数を求める

整数の約数とはある整数Xを割り切ることのできる整数のことです。これを求めるためには、1から順番に実際に割ってみて割り切ることができる数を集めればよいということになります。

ただ、あまり効率のよい方法とはいえません。

まず約数を調べたい数の半分よりあとは調べるのは時間の無駄です。絶対に割り切ることはできません。また1以外の最小の約数で約数を調べたい数を割れば、その数以外の最大の約数を得ることができます。

1以外の最小の約数を得ることができれば割る数の最大値を特定することができるのです。

これは1から10,000までの約数を出力するメソッドです。

完全数を求める

ところで自分自身を除いた約数すべての和が自分と等しい数を完全数と言います。6の6以外の約数は1と2と3です。全部足すと6になります。

これは完全数を求めるメソッドです。引数の min と max は調べたい範囲の最小値と最大値です。

実際に10,000くらいの値を入力すると

6
28
496
8128

と出力されます。

次の完全数はどうなっているのでしょうか? GetPerfectNumberメソッドの引数を大きな値にすると時間がかかります。

メルセンヌ素数から完全数を求める

2のp乗から1を引いた形をした自然数をメルセンヌ数といいます。メルセンヌ数のなかには素数があり、メルセンヌ素数といいます。

メルセンヌ素数(2^p-1)に2のp-1乗(2^(p-1))を乗じると完全数になるという法則があります。これを使えばメルセンヌ素数から完全数を発見することができます。

下のコードを実行してみると2の31乗はメルセンヌ素数であることがわかります。次のメルセンヌ素数はlong型には収まらないようです(p=61にするとさんざん待たされた上に負数が表示される)。

IsPrimeメソッドは

C#でエマープと回文素数を取得する


を参照してください。

出力結果

6
28
496
8,128
33,550,336
8,589,869,056
137,438,691,328
2,305,843,008,139,952,128