Posted at

「素数」という響きへのあこがれ(JavaScript)


はじめに


  • 私はバリバリの文系出身者ですが、「素数」という響きにものすごいあこがれと凄まじい数学の世界を感じます。

  • 「最大の素数を発見・・・」、「エラトステネスの篩(ふるい)にて・・・」、「スーパーコンピュータにて、これくらいまでの素数を出すと、〇〇秒・・・」などと聞くと、あこがれとともに、関係ないな・・、と思っていました。

※余談:次のような数学を題材にした映画が、数学がわからないながら地味に好きです。

・イミテーション・ゲーム/エニグマと天才数学者の秘密

・奇蹟がくれた数式

・博士が愛した数式


  • 素数を求めることに対する「処理速度」や「方法」の探求を抜きにすれば、プログラミング初学者にとっては、「if文」と「ループ」の勉強になると思います。そこで、JavaScriptの基礎を学んだあとに、素数を求める、というプログラムを書こうと思いました。


注意点

ということで、いかに早く素数を求めるか、とか、きれいなロジックで、といったことを追求しているわけではなく、「素数もしくは数学に対するあこがれ」からくる「プログラミング練習」となります。


やったこと

①与えた秒数で、どれくらいの数まで素数か否かの確認でき、その中にどのくらいの素数を含まれているかを求めてみる

②与えた数字までに、いくつの素数が含まれているか、それを求めるまでどのくらいの秒数がかかるかを求めてみる


実際のもの・コード


①与えられた時間で素数カウント

1pg.png

<!DOCTYPE html>

<html lang="ja">

<head>
<meta charset="utf-8">
<title>素数カウント</title>
</head>

<body>
<h1>与えられた時間で素数カウント</h1>
<span>時間(秒):</span>
<input type="number" id="time" min="1" max="30" value="">
<p><button id="calcBtn">カウント</button></p>

<p id="msg"></p>
<p>確認できた数:<span id="number"></span></p>
<p>素数の数:<span id="outputNum"></span></p>
<p>素数:<span id="output"></span></p>

<script>
// 計算ボタンが押下されたとき
var calcBtn = document.getElementById('calcBtn');
calcBtn.addEventListener('click', function(){

// 初期処理
document.getElementById('msg').innerHTML = '';
document.getElementById("number").innerHTML = '';
document.getElementById("outputNum").innerHTML = '';
document.getElementById("output").innerHTML = '';

// 入力値チェック
var setTime = document.getElementById('time').value;
if(setTime > 30){
document.getElementById('msg').innerHTML = "30秒以内にしてください。息切れします";
return;
}

var i = 3;
var nowTime = 0;
var outputNum = 1;
var output = '2, ';
var noPrime;

// 開始時間セット
var startTime = new Date();

while(nowTime < setTime) {

// 2で割り切れなければ(奇数ならば)、確認ロジックにはいる
if((i % 2) != 0) {

noPrime = '';

for(var j = 2; j < i; j++){
//割り切れた時点で素数ではない
if((i % j) == 0){
noPrime = 'on';
break;
}
}

if(noPrime == ''){
outputNum++; // 素数の数をカウントアップ
output += i + ', '; // 素数を格納
}
}

i++; // 確認数字のカウントアップ

var stopTime = new Date(); // 終了時間
var ms = stopTime.getTime() - startTime.getTime(); // 経過時間をミリ秒で取得
var nowTime = ms / 1000;

}

document.getElementById("number").innerHTML = i;
document.getElementById("outputNum").innerHTML = outputNum;
document.getElementById("output").innerHTML = output;

});
</script>
</body>
</html>


②与えられた数字で素数カウント

2pg.png

<!DOCTYPE html>

<html lang="ja">

<head>
<meta charset="utf-8">
<title>素数カウント</title>
</head>

<body>
<h1>与えられた数字で素数カウント</h1>
<span>数字:</span>
<input type="number" id="num" min="3" max="999999" value="">
<p><button id="calcBtn">カウント</button></p>

<p id="msg"></p>
<p>処理にかかった時間:<span id="procTime"></span></p>
<p>素数の数:<span id="outputNum"></span></p>
<p>素数:<span id="output"></span></p>

<script>
// 計算ボタンが押下されたとき
var calcBtn = document.getElementById('calcBtn');
calcBtn.addEventListener('click', function(){

// 初期処理
document.getElementById('msg').innerHTML = '';
document.getElementById("outputNum").innerHTML = '';
document.getElementById("output").innerHTML = '';

// 入力値チェック
var setNum = document.getElementById('num').value;
if(setNum > 999999){
document.getElementById('msg').innerHTML = "数は999999以下にしてください";
return;
}

var outputNum = 1;
var output = '2, ';
var noPrime;

// 開始時間セット
var startTime = new Date();

// 数字をループして調査
for(var i = 3; i <= setNum; i++) {

// 2で割り切れなければ(奇数ならば)、確認ロジックにはいる
if((i % 2) != 0) {

noPrime = '';

for(var j = 2; j < i; j++){
// 割り切れた時点で素数ではない
if((i % j) == 0){
noPrime = 'on';
break;
}
}

if(noPrime == ''){
outputNum++; // 素数の数をカウントアップ
output += i + ', '; // 素数を格納
}
}
}

// 終了時間をセット
var stopTime = new Date();

// 経過時間をミリ秒で取得
var ms = stopTime.getTime() - startTime.getTime();
var s = ms / 1000

document.getElementById("procTime").innerHTML = s;
document.getElementById("outputNum").innerHTML = outputNum;
document.getElementById("output").innerHTML = output;

});
</script>
</body>
</html>


まとめ

・言語の基礎を学んだ後は、もしくは、学んでいる最中には、素数を出してみるプログラムをやってみると意外と勉強になると思いますので、「数学」・「素数」という言葉の響きにあこがれている方でもそうでない方も実践してみるとよいかもしれません。そして、おもしろいと思ったら探求と開始すればよいかなと思います。