素数

昨日作った約数のリストを生成するやつをつかって素数であるかの判定するメソッド。

Number.prototype.sosu = function() {
    var c = false;
    var tmp = this.yakusu();
    if((tmp[0] == 1) && (tmp[1] == this))
        c = true
    return c;
}

実行例

js> a=1
1
js> a.sosu()
false
js> b=7
7
js> b.sosu()
true
js> c=33
33
js> c.sosu()
false
js> d=53
53
js> d.sosu()
true

でかい数だとかなり時間かかるんだろうなぁ。私のPCで7桁の数字になると待たされるようになった。メモリ馬鹿食いだし…。ダメだ…。

あまりつかえないArrayメソッドを作ってみた2

Array.prototype.exist = function(st) {
    var c = -1;
    for(var i=0;i<this.length;i++) {
        if(this[i] == st) {
            c = i;
            break;
        }
    }
    return c;
}

Array.prototype.uniq = function() {
    var tmp = this.clone();
    var tmp2 = tmp.clone();
    var result = new Array();
    for(var i=0,len=tmp.length;i<len;i++) {
        tmp2.shift();
        if(tmp2.exist(tmp[i])<0)
            result.push(tmp[i]);
    }
    return result;
}

再びclone()メソッドを使う。
exist()は最初に一致した要素のインデックスが帰ってくる。一致する要素が複数ある場合が問題だなぁ。
uniq()の順番が気持ち悪くなる…。

実行例

js> a=[1,2,3,4,5]
1,2,3,4,5
js> a.exist(4)
3
js> a.exist(6)
-1
js> b=[1,1,2,3,3,4,4,5]
1,1,2,3,3,4,4,5
js> b.uniq()
1,2,3,4,5
js> c=[2,1,3,1,2,4,1,5]
2,1,3,1,2,4,1,5
js> c.uniq()
3,2,4,1,5

追記(手直し) 9/8 10:46

Array.prototype.exist = function(st) {
    var c = false;
    for(var i=0;i<this.length;i++) {
        if(this[i] == st) {
            c = true;
            break;
        }
    }
    return c;
}

Array.prototype.uniq = function() {
    var tmp = this.clone();
    var tmp2 = tmp.clone();
    var result = new Array();
    for(var i=0,len=tmp.length;i<len;i++) {
        tmp2.shift();
        if(!tmp2.exist(tmp[i]))
            result.push(tmp[i]);
    }
    return result;
}

exist()をbool値を返すように変更。インデクッスを返すのは,”Array.indexOf/lastIndexOf”ってのが実装されるようですし。(Firefox1.5だと使えた。)。