24/04/20 21:45:57.23 K224KWOY.net
>>349
2からnまでのリストを作り、そこから、合成数を取り除くという発想は面白い。だけど雑すぎる。
行列は、「○行△列目で値は□」等という情報を持つが、位置情報は必要無いし、値も一度計算してしまえば、忘れて言い。
つまり、行列を保存しておく必要は全くない。これを取り入れれば次になる。
n=2500;a=Range[2,n];Do[a=DeleteCases[a,i*j],{i,2,n},{j,2,n}];a
合成数の発生範囲を調節すると、次になる。
n=2500;a=Range[2,n];Do[a=DeleteCases[a,i*j],{i,2,Sqrt[n]},{j,i,n/i}];a
この方法では、iは、4,6,8,9,10,12,...など、無駄な値も走る。
この無駄をなくしたのがエラトステネスのふるいに相当。