Diary

Diary

日々学んだことをアウトプットする場として初めてみました

terminal で素数について調べてみた

やったこと

  • ある数以下の全素数を生成する
  • 1万刻みで素数の現れる数をカウントし、プロット
  • 素数の下1桁や2桁は何が多いのかチェック

ある数以下の全素数を生成する

素数判定

mac なら gfactor、linux なら factor を利用する

gfactor 14
> 14: 2 7
gfactor 17
> 17: 17

素数の時のみ2列で終わっているので、awk を用いて2列の時のみ表示させる

gfactor 17 | awk 'NF==2{print $2}'

繰り返す

seq を使うと良い

seq 3
> 1
> 2
> 3

1000 以下 の素数を調べたければ

seq 1000 | gfactor | awk 'NF==2{print $2}'

とする

1万刻みで素数の表れる数

0-10000 までの数の中に現れる素数の数と、10000-20000の中に現れる素数の数がどれくらい違うか調べてみた

0-10000 について

wc を使う

seq 10000 | gfactor | awk 'NF==2{print $2}' | wc -w

繰り返す

for i in {0..99}; do seq $((10000*$i)) $((10000*($i+1))) | gfactor | awk 'NF==2{print $2}' | wc -w; done

上の例より多く試したい人へ

mac の場合、1000000 より大きい数を seq で流すとデフォルトでは丸め込まれちゃうのでオプション指定してあげる

seq 1000000 1000001
> 1e+06
> 1e+06
seq -f %f 1000000 1000001
> 1000000.000000
> 1000001.000000
seq -f %f 1000000 1000001 | sed 's@\..*@@'

ファイルに出力してプロット

for i in {0..99}; do seq $((10000*$i)) $((10000*($i+1))) | gfactor | awk 'NF==2{print $2}' | wc -w >> hoge; done

f:id:kokoichi206:20210518073329p:plain

素数の下2桁の性質についてチェック

素数の下2桁のみ取り出す

awk を使う(substr, length)

gfactor 101 | awk 'NF==2{print substr($2, length($2)-1, length($2))}'
> 01
seq 1000 | gfactor | awk 'NF==2{print substr($2, length($2)-1, length($2))}'
> 2
> 3
> ...
> 97

出現回数を調べる

sort してから、uniq -c でその回数を調べる

seq 1000 | gfactor | awk 'NF==2{print substr($2, length($2)-1, length($2))}' | sort | uniq -c

これだと元々1桁のもの(2,3,5,7)が、03 などと区別されてしまっていることが気になったので、少し改善

seq 1000 | gfactor | awk 'NF==2{a=0$2;print substr(a, length(a)-1, length(a))}' | sort | uniq -c 

ファイルに出力してプロット

100万 以下の数について、下2桁の出現回数を調べた

カウントと出現回数を入れ替えてある

seq 1000 | gfactor | awk 'NF==2{a=0$2;print substr(a, length(a)-1, length(a))}' | \
 sort | uniq -c | awk '{print $2,$1}' > RESULT

f:id:kokoichi206:20210518082100p:plain

ほぼ均等!