SQRの計算を自前で出来ないか検索してみました。
「本の虫」のサイトの「平方根のアルゴリズム 」
https://cpplover.blogspot.com/2010/11/blog-post_20.html
ここがわかりやすかったのでここから引用します。
-----------------------------------------------------------
ここで使うのは、バビロニア人の方法(Babylonian method)と呼ばれている、歴史あるアルゴリズムである。
この方法は、手動でも、プログラミングでも、非常に簡単に計算できる、大変便利で汎用的なアルゴリズムである。
しかも、速度もそれほど遅くない。
double sqrt( double s )
{
double x = s / 2.0 ; // Is there any better way to determine initial value?
double last_x = 0.0 ; // the value one before the last step
while ( x != last_x ) // until the difference is not significant
{ // apply Babylonian method step
last_x = x ;
x = (x + s / x) / 2.0 ;
}
return x ;
}
-----------------------------------------------------------
これを TurboBasic に置き換えたテストが
3000 ' SQR1.BAS
3010 'defdbl a-z
3020 screen 0
3030 cls
3040 input s
3050 x = s / 2.0 '; // Is there any better way to determine initial value?
3060 lastx = 0.0 '; // the value one before the last step
3070 ' while ( x != lastx ) '// until the difference is not significant
3080 'loop1:
3090 lastx = x
3100 x = (x + s / x) / 2.0
3110 if x <> lastx then 3080 'loop1
3120 print "SQR(";s;")=";x,lastx
3130 input a
3140 end
3020行をコメントにすれば N88BASIC でも動作します。
これをサブルーチンにして PRIME88.BAS に貼り付けて
320 *START
330 TM$=TIME$
340 I=2:GOSUB *PRINT1
350 FOR I=3 TO N
360 IF INT(I/2)*2 = I THEN *EXIT2
370 J=3
375 s=I:gosub 3050:s=xx '★
380 WHILE (J<s) AND (INT(I/J)*J<>I) '★
390 J=J+1 '★★
400 WEND
410 IF J>s THEN GOSUB *PRINT1 '★
420 *EXIT2
430 NEXT I
440 I=I-1
この結果は
Number.10000 0: 0:14 Prime Number = 1229
おお、素数が合ってるし、時間が半分になりました。
SQR()関数を2回実行していたのをサブルーチン1回にしたのが効いたみたいです。
さらに、★★ のところを
390 J=J+2 '★★
このように +2 に変更した結果
Number.10000 0: 0: 9 Prime Number = 1229
おお、時間がさらに短縮して、FOR文のループとほぼ同じになりました。
ちなみに FOR文のソースにこのサブルーチンを組み込んだら
Number.10000 0: 0:11 Prime Number = 1229
2〜3秒遅くなりましたね。これが関数とサブルーチンの速度差と思われます。
思ったよりも差が無いなぁ、というのが感想です。(^^;
素数のネタはこの辺でしまいにしたいところですね。