おそらく、次の2つの問題点のせいだと思われます。
①,疑似無限ループにwaitが入っていない
②,素数の求め方に無駄がある
★①
まず、①ですが
#defcfunc IsPrimeAB int A,int B
f=0
po=4
repeat B-A+1,A
if IsPrimeC(cnt)=1:f=1:break
if po=cnt:wait 1:po=po+4
loop
return f
この部分のループにwaitが入っていません。確かに有限個のループなのですが、約16兆も
繰り返すわけですからwaitを入れないとCPUパワーを食ってしまいます。
肝心の解決法ですが、さすがに毎ループ毎にwaitを取ると時間を食い過ぎますので
k+ : if k=128 : k=0 : wait 1
のようなスクリプトをループ中に入れてやれば解決すると思われます。
★②
②ですが、sさんはある数nが素数であるかを調べる為に、√n以下の自然数全ての余りを
求めています。しかし、これは少し無駄が多いです。
ある数nが素数である条件は、
『√n以下の素数全てで割り切れない』
事です。
例えば、nが36で割り切れれば、確かに非素数である事が分かります。けれども、36で割り
切れる数なら、その因数である18でも、あるいは12でも割り切れるはずです。更に言えば9や
4でも、最終的には36の素因数である2や3のいずれかで割り切れた時点で、36が非素数であるか
否かが分かります。
これを利用すれば、計算量が大幅に減ります。一例を挙げれば、100~10000までの間に存在
する素数を調べる場合、sさんの計算では自然数一つ当たり10~100回余りを求める必要があり
ます。しかし、予(アラカジ)め100以下の素数を調べておいて、素数の余りのみで素数であるか
否かを求める計算方法ならば、自然数一つ当たり4~26回余りを求めてやるだけで済みます。
両者の差は調べる数の桁が大きくなればなるほど拡大します。大数の素数チェックをする
なら、こちらの方が良いと思います。
で、肝心のソースですが、木村は論理演算子関連の処理能力が皆無なのでsさんのソースに
適合したスクリプトは書けませんでした。が、一応全くの別物としては作れたので以下に貼り
ます。
notesel p : noteload "素数(1~1000000).txt";ノートパット形式で素数が入っている
n=1000000 : s=n : e=int(sqrt(n)+1)*int(sqrt(n)+1) : a=""
repeat e-s
c=cnt+s+1 : r=1
repeat notemax
k+ : if k=256 : k=0 : wait 1
noteget n,cnt : n=int(n)
if c\n=0 : r=0 : break
if c<n*n : r=1 : break
loop
if r=1 : noteadd str(c) : notesel a : noteadd str(c) : notesel p
loop
notesel a : notesave "素数("+s+"~"+e+").txt" : end
★最後に
sさんは単位自然数当たりの素数判別時間[s/order]を一定にしたいようですが、これは無理
だと思われます。何故なら、一つの自然数が素数であるか否かを調べる為に要する計算量は
自然数の大きさに応じて変動するからです。以下にn近傍の自然数が素数であるか否かを調べる
為に必要な計算回数を書いておきます。
>>n(自然数) 1百 1万 1億 1兆
>>c(計算回数) 4 26 1229 78498
単純に言っても、1万~1万1千までの計算量と、1億~1億1千までの計算量では、どちらも
同じオーダー(1千)でありながら6倍近い差が生まれてしまいます。これは直接素数判別時間の
差になります。
単位ループ数当たりの消費時間[s/loop]であれば、恒常的に一定に保つ事は可能でしょうが
単位自然数当たりの消費時間[s/order]を一定に保つ事は不可能なはずです。
以上、長文でしたが、sさんの参考になれば幸いです。