見出し画像

数の神秘 vol.3自然数をマス目で考えて約数の個数を計算してみた。(約数の個数の計算式)。

2のm乗から1を引いた数が素数の場合にメルセンヌ素数というそうです。
完全数を構成する式の(2^(m-1))(2^m-1)で、(2^m-1)の部分になるのですが、実は現在分かっている51個の完全数において、すべて(2^m-1)の部分だけでなくmも素数でした。

n=2m-1で真の約数の個数(約数の個数-1)なので約数に関して注目してみた。
そして、マス目で面積を出したらどうかなと思いつきました。
自然数の一つ一つの数値を2次平方面での1×1のマス目として認識した時、面積を求めることで、自然数の数値の分布を計算できるのではないかと思いました。

今回思いついたのは、1..bまでの約数の数です。応用ではa..bまでに絞ることで特定の範囲における約数の数を計算でき、あわよくば素数の分布も確認できるのではないかと思いました。

例えば、f(x)=xの箇所ですが、x=bのときのマス目の面積を求めてみます。
1×1の正方形の対角線は「√2」になるので、幅√2の長さ(b-1)*√2の長方形(平行四辺形)に最初と最後の両端に正方形の角がくっついている六角形ようになります。
長方形(平行四辺形)の面積:√2*(b-1)*√2
角の面積:1/2+1/2=1

マス目で考えると、ギザギザになっていますね。
そこから、マス目でない部分を引いていきます。
マス目でない部分の面積:√2*(b-1)*√2/2

マス目の面積=長方形(平行四辺形)の面積+角の面積(両端で1×1正方形)ーマス目でない部分の面積
=(√2*(b-1)*√2)+1-(√2*(b-1)*√2/2)
=2(b-1)+1-(b-1)=b

他のf(x)については、
直線:f(x)=(1/n)x
直線上のマス目の数:floor(b/n)
直線上の平行四辺形の長辺の長さ:(b/n)*√(1^2+n^2)
直線上の平行四辺形の短辺の長さ:?

長方形のマス目以外の面積:floor(b/n)
角の六角形の面積:2floor(b/n)?

面積はいったん置いておいて、マス目の個数で考えると以下の数式が見えました。

以下で1~bまでのマス目の総計が求められます。
g(x)=[1,b]Σfloor(b/x)

keisan:sum_f(1,b,rounddown(b/x,0))

1~bまでのマス目の総計は、言い換えると、1~bまでの約数の総計となります。

なので、bの約数の個数は、

h(x)=[1,b]Σfloor(b/x)-[1,b-1floor((b-1)/x)

keisan:sum_f(a,b,rounddown(b/x,0))-sum_f(a,b-1,rounddown((b-1)/x,0))

で求めることができます。
そして、この値が2、つまり約数が2個の場合に素数となります。


で、平面図で表すことができるということは複素平面でも表せるかも。

おまけ:素数を探すプログラム(適当言語) 繰り返しと割り算が効率悪そう。

Dim n as SuperExtremelyNumber;  // 確認対象の自然数n 極小から極大まで表現できる型で定義
Dim reciprocal_n as SuperExtremelyNumber;  // 確認対象nの逆数の和 極小から極大まで表現できる型で定義
Dim pre_reciprocal_n as SuperExtremelyNumber;  // 一回前の逆数の和の保存用 極小から極大まで表現できる型で定義
Dim n_divisor as SuperExtremelyNumber; // 約数の個数

pre_reciprocal_n = 0;
n = 0;

while(1) {
    reciprocal_n = 0;
    for(i=1; i<=n; i++;){
        reciprocal_n += rounddown( n/i, 0 );
    }
    n_divisor = reciprocal_n - pre_reciprocal_n;
    pre_reciprocal_n = reciprocal_n; //逆数の和を一時保管
    if n_divisor === 2 {
       print n . "\t"; // 素数を出力
    }
    n++;
}


素数の出し方が分かったので、完全数を求める数式も一応

完全数を満たす数式:keisanバージョン
完全数:(2^(n-1))(2^n-1)
となるnの探すための数式
{
2 === sum_f(1,(2^n-1),rounddown((2^n-1)/x, 0))-sum_f(1,(2^n-2),rounddown((2^n-2)/x, 0))
 and 
2 === sum_f(1,n,rounddown(n/x, 0)) - sum_f(1,n-1,rounddown((n-1)/x, 0))
}

[n≠1]
0 === sum_f(1,(2^n-1),rounddown((2^n-1)/x, 0))
- sum_f(1,(2^n-2),rounddown((2^n-2)/x, 0))
- sum_f(1,n,rounddown(n/x, 0))
+ sum_f(1,n-1,rounddown((n-1)/x, 0))

この公式でnを求める式を出せたら、それが完全数の公式です。


よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!