ベン図的に素数

  • 1からNまでの整数のうち、ある整数pで割り切れるものの割合はNが十分に大きければ\frac{1}{p}
  • 素数集合の要素p_i,p_jについて言えば、その片方で割り切れる割合は\frac{1}{p_i},\frac{1}{p_j}であり、その公倍数で割り切れる割合は\frac{1}{p_i\times p_j}である。素数同士は「独立」なので、このような積の関係を使える
  • さて、ここでは2つの素数でやった。また、ド・モルガンみたいなことをやったわけだけれど、山ほどの素数があっても、成り立って、結局\prod_{p} (1-\frac{1}{p_i})っていうのが、どの素数でも割り切れない整数の割合(の近似値)になるだろう
  • これを使って素数の個数を(いい加減に)計算すると、本当の素数の数とそれほど違わない…

  • ただし、これがこの記事の本題ではなくて、この\prod_{p}(1-\frac{1}{p_i})という式の形が本題
  • これって、オイラー積\sum_{i=1}^{\infty} \frac{a(i)}{n^s}=\prod_p \frac{1}{1-\frac{a(p)}{p^s}}に似ている
  • どう似ているかと言えば、s=1,a(p)=1としたうえで逆数を取っている
  • ちなみにs=1,a(p)=1オイラー積に対応するのは、ゼータ関数\zeta(s)=\sum_{i=1}^{\infty}\frac{1}{i^s}s=1の場合であって、これは、よく知られているように、無限大に発散している
  • それは、全整数に占める素数の割合が0に収束することに対応しているわけである
  • 全整数に占める素数の割合\prod_{p}(1-\frac{1}{p_i})は0に収束するわけだが、それに無限大に飛ばした「全整数」の総数をかけてやると、それは「素数の総数」であって、こちらは無限大になる
  • これはs=1のときのゼータ関数の値は無限大だけれど、それを全整数の総数で割った値は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")