素数を求める

たまたまとあるところで見つけた素数出力のJavaプログラム。

public class prime {
        public static void main(String[] args) {
                int p[] = new int[200];
                int cnt = 0;
                p[cnt++] = 2;
                System.out.println(p[0]);
                for(int i = 3; i <= 1000; i += 2){
                        boolean flg = true;
                        for(int j = 0; p[j] * p[j] <= i; j++){
                                if(i % p[j] == 0){
                                        flg = false;
                                        break;
                                }
                        }
                        if(flg){
                                System.out.println(i);
                                p[cnt++] = i;
                        }
                }
        }
}

これが「完璧」と書かれていて、少しもやっとした。



少し甘いところ

いや、ぱっと思いつく甘いところがあるんですよ。
割切れるか確認するj。0から始めてるでしょ。1で良いんです。
p[0]は2。iは必ず奇数なので、2では割切れないから。


あとさ、pの上限が200固定なのが嫌。
ま、いいんだけどさ。


とりあえず上記コードをなるべく忠実にUWSCスクリプトにしてみる。

DIM p[200]
cnt = 1
p[0] = 2
PRINT p[0]
FOR i = 3 TO 1000 STEP 2
        flg = TRUE
        j = 0
        WHILE p[j] * p[j] <= i
                IF i MOD p[j] = 0 THEN
                        flg = FALSE
                        BREAK
                ENDIF
                j = j + 1
        WEND
        IF flg THEN
                PRINT i
                p[cnt] = i
                cnt = cnt + 1
        ENDIF
NEXT

UWSCのFORは終了条件を式にはできないので、WHILEで代用した。

UWSC流に修正してみる

HASHTBL p
cnt = 1
p[0] = 2
PRINT p[0]
flg = 1
FOR i = 3 TO 1000 STEP 2
        FOR j = 1 TO LENGTH(p) - 1
                flg = i MOD p[j]
                IF p[j] * p[j] > i OR !flg THEN BREAK
        NEXT
        IF !flg THEN CONTINUE
        PRINT i
        p[cnt] = i
        cnt = cnt + 1
NEXT

可変配列といえば、HASHTBL。
1000まで固定なら168個しかないけどさっ!
割切れるかの判定ループを短くした。
FOR文の方が早いのでWHILEから書き換えた。
元の方が代入が少ないけど、行数が短くなる方をとってみた。


さて、ここからさらに計算量を少なくする方法や、行数を減らす方法はあるかしらん。