今日のテーマ   日々改造 (^_^;)         
[記事リスト(ツリー表示)]  [ 返信 ]   [新着記事] [最新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 に貼り付けて

1320 *START
1330 TM$=TIME$
1340 I=2:GOSUB *PRINT1
1350 FOR I=3 TO N
1360     IF INT(I/2)*2 = I THEN *EXIT2
1370         J=3
1375         s=I:gosub 3050:s=xx                '★
1380         WHILE (J<s) AND (INT(I/J)*J<>I)    '★
1390             J=J+1                          '★★
1400         WEND
1410         IF J>s THEN GOSUB *PRINT1          '★
1420     *EXIT2
1430 NEXT I
1440 I=I-1

この結果は
Number.10000	  0: 0:14   Prime Number = 1229 

おお、素数が合ってるし、時間が半分になりました。
SQR()関数を2回実行していたのをサブルーチン1回にしたのが効いたみたいです。

さらに、★★ のところを
1390             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 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   暗証キー
    [ページトップへ] [管理用]