[リストへもどる] [返信 ]  [新着記事] [最新50] [ワード検索] [過去ログ]

記事閲覧・返信

タイトル SQRの計算式
投稿日: 2024/03/30(土) 15:58
投稿者konno
 番 号 11179    11178 番 としき さんへのコメント    コメント数 1

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秒遅くなりましたね。これが関数とサブルーチンの速度差と思われます。
思ったよりも差が無いなぁ、というのが感想です。(^^;

素数のネタはこの辺でしまいにしたいところですね。

   - No.11179 一括表示へ   -   コメント元:11178 一括表示へ  - pre


- 関連一覧ツリー (先頭の番号をクリックするとツリー全体を一括表示します)
11135.TurboBasicで素数を表示カウントする PRIME2.EXE - konno konno 24/03/05-00:40
 ┣11137.Re: TurboBasicで素数を表示カウントする PRIME2.EXE - としき 24/03/05-13:22
 ┃┗11140.Re^2: TurboBasicで素数を表示カウントする PRIME2.EXE - konno 24/03/05-15:56
 ┃ ┗11147.Re^3: TurboBasicで素数を表示カウントする PRIME2.EXE - としき 24/03/07-02:18
 ┃  ┗11149.Re^4: TurboBasicで素数を表示カウントする PRIME2.EXE - konno 24/03/07-22:28
 ┃   ┗11160.Re^5: TurboBasicで素数を表示カウントする PRIME2.EXE - としき 24/03/12-12:32
 ┃    ┣11162.Re^6: TurboBasicで素数を表示カウントする PRIME2.EXE - konno 24/03/12-23:45
 ┃    ┗11164.Re^6: TurboBasicで素数を表示カウントする PRIME2.EXE - としき 24/03/17-17:26
 ┃     ┗11170.Re^7: TurboBasicで素数を表示カウントする PRIME2.EXE - としき 24/03/22-23:15
 ┃      ┗11172.Re^8: N88-BASICで素数を表示カウントする PRIME88.BAS - としき 24/03/24-15:59
 ┃       ┣11173.Re^9: N88-BASICで素数を表示カウントする PRIME88.BAS - konno 24/03/25-02:00
 ┃       ┃┣11174.Re^10: N88-BASICで素数を表示カウントする PRIME88.B.. - としき 24/03/25-23:13
 ┃       ┃┃┗11175.PRIME88.BAS で 「169=素数?」問題 - konno 24/03/26-20:11
 ┃       ┃┃ ┣11177.Re: PRIME88.BAS で 「169=素数?」問題解決か - konno 24/03/27-22:56
 ┃       ┃┃ ┗11192.Re: PRIME88.BAS で 「169=素数?」問題 - としき 24/04/05-02:07
 ┃       ┃┃  ┗11195.Re^2: PRIME88.BAS で 「169=素数?」問題 - konno 24/04/06-02:05
 ┃       ┃┃   ┣11198.Re^3: PRIME88.BAS で 「169=素数?」問題 - としき 24/04/06-11:27
 ┃       ┃┃   ┗11199.Re^3: PRIME88.BAS で 「169=素数?」問題 - としき 24/04/06-14:51
 ┃       ┃┃    ┗11200.Re^4: PRIME88.BAS で 「169=素数?」問題 - としき 24/04/06-23:09
 ┃       ┃┃     ┗11202.Re^5: PRIME88.BAS で 「169=素数?」問題 - としき 24/04/07-01:17
 ┃       ┃┃      ┗11203.Re^6: PRIME88.BAS で 「169=素数?」問題 - konno 24/04/07-20:41
 ┃       ┃┃       ┗11204.Re^7: PRIME88.BAS で 「169=素数?」問題 - konno 24/04/08-01:46
 ┃       ┃┃        ┗11205.Re^8: PRIME88.BAS で 「169=素数?」問題 - としき 24/04/08-12:28
 ┃       ┃┃         ┗11206.SQRの単精度と倍精度の表示検証ソース - konno 24/04/08-23:33
 ┃       ┃┃          ┗11207.Re: SQRの単精度と倍精度の表示検証ソース - としき 24/04/09-15:06
 ┃       ┃┃           ┗11208.Re^2: SQRの単精度と倍精度の表示検証ソ.. - konno 24/04/09-22:44
 ┃       ┃┃            ┗11209.Re^3: SQRの単精度と倍精度の表示検証ソ.. - としき 24/04/10-17:44
 ┃       ┃┃             ┣11210.Re^4: SQRの単精度と倍精度の表示検証.. - konno 24/04/10-21:56
 ┃       ┃┃             ┃┗11211.Re^5: SQRの単精度と倍精度の表示検証.. - としき 24/04/10-23:25
 ┃       ┃┃             ┃ ┗11213.Re^6: SQRの単精度と倍精度の表示検.. - konno 24/04/11-20:13
 ┃       ┃┃             ┗11215.Re^4: SQRの単精度と倍精度の表示検証.. - としき 24/04/13-01:13
 ┃       ┃┃              ┗11216.Re^5: SQRの単精度と倍精度の表示検証.. - konno 24/04/13-22:03
 ┃       ┃┃               ┗11218.Re^6: SQRの単精度と倍精度の表示検.. - としき 24/04/14-12:14
 ┃       ┃┃                ┗11219.Re^7: SQRの単精度と倍精度の表示検.. - konno 24/04/15-01:15
 ┃       ┃┃                 ┗11220.Re^8: SQRの単精度と倍精度の表示.. - としき 24/04/15-13:56
 ┃       ┃┃                  ┗11221.Re^9: SQRの単精度と倍精度の表示.. - konno 24/04/16-00:04
 ┃       ┃┃                   ┗11222.Re^10: SQRの単精度と倍精度の表.. - としき 24/04/16-12:22
 ┃       ┃┃                    ┗11223.Re^11: SQRの単精度と倍精度の.. - konno 24/04/16-23:58
 ┃       ┃┃                     ┗11224.Re^12: SQRの単精度と倍精度の.. - としき 24/04/17-02:14
 ┃       ┃┃                      ┗11225.Re^13: SQRの単精度と倍精度.. - konno 24/04/17-23:21
 ┃       ┃┣11176.Re^10: N88-BASICで素数を表示カウントする PRIME88.B.. - konno 24/03/27-00:26
 ┃       ┃┃┣11178.Re^11: N88-BASICで素数を表示カウントする PRIME88... - としき 24/03/28-00:43
 ┃       ┃┃┃┗11179.SQRの計算式 - konno 24/03/30-15:58
 ┃       ┃┃┃ ┗11180.Re: SQRの計算式 - としき 24/03/30-23:41
 ┃       ┃┃┃  ┗11184.Re^2: SQRの計算式 - konno 24/03/31-22:26
 ┃       ┃┃┗11182.Re^11: N88-BASICで素数を表示カウントする PRIME88... - としき 24/03/31-15:48
 ┃       ┃┗11181.Re^10: N88-BASICで素数を表示カウントする PRIME88.B.. - としき 24/03/31-14:09
 ┃       ┗11183.Re^9: N88-BASICで素数を表示カウントする PRIME88.BAS - としき 24/03/31-16:08
 ┃        ┗11185.Re^10: N88-BASICで素数を表示カウントする PRIME88.B.. - konno 24/04/01-00:27
 ┃         ┣11186.T98-NEXT でN88BASIC検証 - konno 24/04/02-00:16
 ┃         ┗11187.Re^11: N88-BASICで素数を表示カウントする PRIME88... - としき 24/04/03-16:20
 ┃          ┗11189.Re^12: N88-BASICで素数を表示カウントする PRIME88.. - konno 24/04/04-01:01
 ┃           ┗11191.Re^13: N88-BASICで素数を表示カウントする PRIME8.. - としき 24/04/04-12:15
 ┃            ┗11194.Re^14: N88-BASICで素数表示の問題 - konno 24/04/06-01:40
 ┃             ┗11197.Re^15: N88-BASICで素数表示の問題 - としき 24/04/06-11:26
 ┗11150.オリジナルの prime.bas のソース - konno 24/03/07-22:43
  ┗11156.Re: オリジナルの prime.bas のソース - としき 24/03/10-18:50
   ┣11158.Re^2: オリジナルの prime.bas のソース - konno 24/03/11-00:45
   ┃┗11159.Re^3: オリジナルの prime.bas のソース - としき 24/03/12-02:16
   ┃ ┗11161.MOD と ¥ の有効範囲 - konno 24/03/12-22:45
   ┃  ┗11165.Re: MOD と ¥ の有効範囲 - konno 24/03/18-00:36
   ┃   ┗11166.Re^2: MOD と ¥ の有効範囲 - としき 24/03/20-01:44
   ┃    ┗11167.Re^3: MOD と ¥ の有効範囲 - konno 24/03/21-00:00
   ┃     ┗11168.Re^4: MOD と ¥ の有効範囲 - としき 24/03/21-11:14
   ┃      ┗11171.Re^5: MOD と ¥ の有効範囲 - konno 24/03/24-00:08
   ┗11163.Re^2: オリジナルの prime.bas のソース - としき 24/03/17-17:09
    ┗11169.Re^3: オリジナルの prime.bas のソース - としき 24/03/22-23:02

- - 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)[引用無し]
おなまえ 
Eメール 
タイトル 
メッセージ auto soft pre(図表 ※折り返しません)
 参照先 
 暗証キー (英数字で8文字以内)
 プレビュー          

- 以下のフォームから自分の投稿記事を修正・削除することができます -
   処理   記事No   暗証キー
    [ページトップへ] [管理用]