Sunday 27 November 2011

the Sieve of Eratosthenes #2

前回は数字10個毎に行を切り替えたのでプログラムが残念な感じに.
今回はその反省を生かして取り敢えず1行n列でやってしまう.
この場合は例えば
a=1:100;  
[1,2,3,....,100] を生成できるのですっきり書けそう.
1 は省いて, 2 から始まる行列を作り,順番に割っていくことにする.
剰余を与えるのは modulo(n,m).
ということでこんな感じで書いてみた.
m=input('maximam?')//どこまで篩にかけるかを設定
a=2:m;
for i=1:m-2,//割るのは最大数の一個手前まで.
    if a(1,i)~=0 then
        for j=i+1:m-1,//2から始まるから最大数のindex はm-1.
            if modulo(a(1,j),a(1,i))==0 then
                a(1,j)=0;
            end
        end
    end
end
a //表示.

index をどこまでたどるかで何回かエラー吐かれたけど
多分もうちゃんと動いてくれてる.
 invalid index
というエラーの時はとりあえずその辺りを疑ってみよう.
そのうち双子素数だけ取り出すような仕様をつけてみてもいい.

追記(@23:04 27/11/2011): 
一行或いは一列の行列に対しては,添字の片方は省略できる.例えば
a=1:2:10 
 とすると,実行結果は
a=1. 3. 5. 7. 9.
 となるけれども,ここで a(3) は 
ans = 5.
 として返される.だから冒頭のも a(1,i) とかせずに a(i) で良かったようだ.

No comments:

Post a Comment