LoginSignup
3
1

More than 5 years have passed since last update.

素数を求める

Last updated at Posted at 2018-07-19

素数のテーブルを作る

javascript で素数を求めるプログラムを書いてみました。特にテクニカルなことはやっていません。小さい数からその倍数を消していくという総当り方式です。

getsosu.js

// mSosuは得られた素数のテーブルのポインターです。
    var mSosu=null;
// nn より小さい数で素数となるものを探します。
    function fSosu(nn){
        var i,j,k,m;
        var cnt=0;
        var temp =Array(nn);
        for(i=0; i<nn; i++) temp[i]=0;
        m = Math.floor(Math.sqrt(nn)); // ルートnnまでチェックします。

        for(i=2; i<=m; i++){
            if(temp[i]==1) continue;
            k=Math.floor(nn/i); // i*k までチェックします。
            for(j=2; j<=k; j++){
                temp[i*j]=1; // i*j は素数ではありません。
            }
        }

        for(i=2; i<nn; i++) if(temp[i]==0) cnt++; //素数の数
        mSosu = new Int32Array(cnt); //テーブルのメモリー確保

        for(i=2,j=0; i<nn; i++){
            if(temp[i]==0){ //テーブルに素数を格納
                mSosu[j]=i; j++;
            }
        }

        return cnt;
    }

どこまで大きなテーブルを作れるか?

nn にどこまで大きな数字を入れることができるか、計算時間とともにチェックしました。

check.js
    var nn=2;
    for(var i=0; i<25; i++){
        nn*=2;
        var start_ms = new Date().getTime();
        if (!fSosu(nn) ) break;
        var elapsed_ms = new Date().getTime() - start_ms;
        console.log(nn + ' : ' + mSosu.length + ' : ' + elapsed_ms);
    }

私の環境
- Windows 7 32bit
- Intel Core i5 M450 @2.4GHz
- Chrome 67

で計算したところ、nn = 67108864 は10秒前後で計算が終了ます。
しかし、nn=134217728はエラーでChromeが落ちます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1