ベン図的に素数
- 1からNまでの整数のうち、ある整数pで割り切れるものの割合はNが十分に大きければ
- 素数集合の要素について言えば、その片方で割り切れる割合はであり、その公倍数で割り切れる割合はである。素数同士は「独立」なので、このような積の関係を使える
- さて、ここでは2つの素数でやった。また、ド・モルガンみたいなことをやったわけだけれど、山ほどの素数があっても、成り立って、結局っていうのが、どの素数でも割り切れない整数の割合(の近似値)になるだろう
- これを使って素数の個数を(いい加減に)計算すると、本当の素数の数とそれほど違わない…
- ただし、これがこの記事の本題ではなくて、このという式の形が本題
- これって、オイラー積、に似ている
- どう似ているかと言えば、としたうえで逆数を取っている
- ちなみにのオイラー積に対応するのは、ゼータ関数のの場合であって、これは、よく知られているように、無限大に発散している
- それは、全整数に占める素数の割合が0に収束することに対応しているわけである
- 全整数に占める素数の割合は0に収束するわけだが、それに無限大に飛ばした「全整数」の総数をかけてやると、それは「素数の総数」であって、こちらは無限大になる
- これはのときのゼータ関数の値は無限大だけれど、それを全整数の総数で割った値は0に収束することに対応する(らしい)から、s=1のゼータ関数の値の大きさは、その程度の発散程度、という話、らしい
library(numbers) Ns <- 1:10000 ret <- rep(0,length(Ns)) ret2 <- ret ret3 <- ret for(i in 1:length(Ns)){ pr <- primes(Ns[i]) bs <- 1/pr # Nが素数に比べて、まずます大きくないといけないと言う制約をつける ss <- which(bs*Ns[i]>pr) as <- 1-1/pr[ss] tmp <- log(Ns[i]) + sum(log(as)) ret[i] <- exp(tmp) ret2[i] <- length(pr) ret3[i] <- exp(sum(log(as))) } plot(Ns,ret) matplot(Ns,cbind(ret,ret2),type="l")