fx-5800P 素因数分解 - バグ修正と表示変更

2014/11/15: 掲載プログラムの転記ミスを修正しました。


素因数分解再び の記事で紹介したプログラムについて、すけっぴぃさんから、バグの報告 (「素因数分解再び」のコメント) を頂きました。

素因数分解した結果に、素数の2乗が含まれる時、その素数の2乗が素数に分解されず、そのまま残って、素数でないのに素数として結果表示されると言う問題です。

例えば、45 ( = 32 × 5) の素因数分解の結果が 9 × 5 となってしまうが、135 ( = 33 × 5) は、正しく結果表示されると言う問題です。


かなり前に頂いたご指摘なのに、すぐに対処できないまま時間が経ってしまい申し訳ありません。最近時間に余裕が少しできたので、調べたところ、原因が分かりました。


本文にあるコードの赤文字の部分の1行目(あるいは以下のプログラムの10行目)にある

Y≦D



Y<D

に変更することで、バグの解消ができました。


これまでのプログラムは、素因数を見つけるたびに表示するようにしていましたが、実はこの仕様にしっくりきていませんでした。
そこで、素因数分解の計算を終了後、まとめて結果を表示するように変更してみました。


プログラムを起動した時の画面:

素因数分解Startup


数を入力する:

素因数分解Input 


素因数分解を最後まで計算したあとで、結果を表示:

素因数分解DisplayResult 

1行表示されたら [EXE] キーを押して次の行を表示させます。
これを繰り返して、上のように <EXE> が表示されたらそれが最後の素因数です。
ここで、 [EXE] キーを押せば最初の入力画面に戻ります。

4行を超える結果になる場合は、再び1行目から上書きします。


プログラムは以下のようにしました。かなりヒドイ転記ミスがありましたので、修正したものを再掲載します [2014/11/15]

 素因数分解_改造版ソース 
 
LpWhile Y≧1 の下に、表示のための処理を追加してみました。
 
また、17行目、Do ループの中に表示のために必要な配列変数への代入処理を入れています。

配列変数は、通常の変数よりもアクセスにかなり時間がかかることが分かっていますので、今回の改造で、全体の計算速度が低下する筈です。

そこで、計算速度を、前回のプログラムと比較してみました。

入力した自然数結果前回プログラムでの計算時間今回プログラムでの計算時間
123453 x 5 x 8232.5秒2.2秒
12345626 x 3 x 6433秒2.6秒
1234567127 x 972176.5秒
123456782 x 32 x 47 x 145938秒6.6秒
12345678932 x 3607 x 38033分2分43秒
98765432132 x 172 x 37972133秒28秒
9876543223 x 37 x 33366743秒27秒
98765433 x 227 x 1450312秒11秒
9876542 x 3 x 97 x 16976.5秒5秒
987655 x 197538秒7秒
987622 x 3 x 8233秒2秒

それほど大きな違いは出ていません。結果として、Doループを何度も回る時間に比べて配列変数アクセスによる速度低下が無視できる程度だと思います。

fx-5800P は同じ計算でも計算時間に結構なバラツキがあることが、最近分かってきました。これについては、クロック回路に起因する可能性が考えられるとの情報があり、その場合はクロック精度が数%バラツクのも説明できそうで、温度の影響もありそうです。

このあたりは、こちら (fx-5800Pの速度差) (fx-5800P プログラムのバックアップ のコメント) が 情報源です。

従って、今回の測定から、処理速度はほぼ同じ、と言うべきでしょう。但し、1234567 の素因数分解だけは、どうもよく分からない結果ですね。

手元で測り直したら7秒程度でした。本エントリーはボロボロでした(-_-;)

ご指摘頂いた santaro様、ありがとうございます。



応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ



カシオプログラム関数電卓 FX-5800P-N カシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る



keywords: fx-5800P素因数分解、プログラム関数電卓

リンク集 | ブログ内マップ


関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

1234567の計算時間

管理人様、こんにちは!

前回のプログラムがうちのfx-5800Pにそのままあったので1234567の計算時間を計ってみたら7秒ほどだったので、何かの計測違いだったのではないでしょうか。

今回の結果まとめて表示はなかなかよいです。
10行目と11行目にちょこっとプログラムの書き写し間違い?発見(笑)…ですが、CasioBasic入門としては間違い探し&バグ潰しは一番のスキルアップになりますね。

ということで、
手持ちのCasioBasic機でちょいと時間計ってみました。
一番時間のかかる123456789の場合のみですが、

fx-5800P     2分49秒
CFX-9850GC+ 1分35秒
fx-9860G(SH3版 v1.05)  10秒
fx-9860G(SH3版 v2.04)  18秒
fx-9860G(SH4A版v2.04)  33秒
fx-CG10 (SH4A版v2.00)   23秒

fx-5800P以外は3pinケーブルで相互に通信可なので一つ入力すれば使い回しができるので楽です。
fx-5800Pとも通信できるともっと利便性あがるんですけどね。

fx-9860系の実行速度はバージョンが上がるにつれて順調に?遅くなっています(^^;

この中でCFX-9850GC+はちょっとだけ世代が古いCasioBasicでfx-5800P以降とは命令体系は同じでも動作が若干違います。
fx-5800Pはfx-9860G(SH3版 v1.05)と仕様的には同世代になりますね。

ご指摘感謝です

santaro様

ご指摘、ありがとうございます。

慌てて、プログラムソースの転記ミスを修正して、再掲載しました(^^;)

確かに、バグ探しはスキルアップには良いですが、さすがにご指摘以外の部分もメタメタでマズイと思った次第。

他のエントリーにも転記ミスやらがあって、気がついた時に直しているのですが、きっとまだ有るのでしょう。スキルアップは、そちらで御願いするとして...


>今回の結果まとめて表示はなかなかよいです。

ありがとうございます。私もこれでちょっとスッキリしました。で余計な処理を加えてもさほど時間の差がなったので、さらにスッキリです。


> fx-5800P     2分49秒
> CFX-9850GC+ 1分35秒
> fx-9860G(SH3版 v1.05)  10秒
> fx-9860G(SH3版 v2.04)  18秒
> fx-9860G(SH4A版v2.04)  33秒
> fx-CG10 (SH4A版v2.00)   23秒

さすがに、fx-9860シリーズやfx-CG10 はダントツに速いですね。
初期の fx-9860に比べて、バージョンアップするにつれ確実な速度低下するとは、さっさと買っておけば良かったと悔やまれます。

MPUは交換できないにしても、Casio Basicのバージョンはダウングレード可能なのでしょうか?

もし、C で書けば、おそらく驚異的なスピードアップが可能かも知れませんね。

> fx-5800Pはfx-9860G(SH3版 v1.05)と仕様的には同世代になりますね。

なるほど、いつもながら貴重な情報をありがとうございます。

No title

管理人様、こんにちは!

>MPUは交換できないにしても、Casio Basicのバージョンはダウングレード可能なのでしょうか?

初期のバックライトの無い9860Gだと初期の1.05から最新の2.04まで全部アップダウン可能です。
バックライトの付いた9860GIIからは最初から2.0なので1.0には戻せないみたいです。(ハードが微妙に変わったのでしょう)
SH4A版も同じく2.0だけですね。
現在のCasio Basicでは文字列を扱えるのが標準なのでスピードには目をつぶって2.0が基本というところなのでしょう。

そしてこのシリーズはオーバークロック可能なのですが、
fx-9860G(SH3版)は実測で2.5倍速が限度なのに対してSH4A版は5倍速以上に上げられますから一気に逆転します。
fx-CG10はプログラム実行時に現在実行中のプログラム名(メイン&サブルーチン)を常に表示し続けたり実行中アニメーションで砂時計ぽい風車回してるせいかちょっと重たくて最大3倍速くらいまでですね。
fx-CG10はCasio Basicのソースがテキストファイルで直接やりとりできたりなので微妙にポイント高いんですけどね。
プログラムの書き写しが要らなくなるので利便性アップで転記ミス皆無になるかも?!です(笑)


>もし、C で書けば、おそらく驚異的なスピードアップが可能かも知れませんね。
はい!
実数だとFPU無いのでさほどでもないですけど整数のみ演算だとそれはもう驚異的です。
素数演算とかだとCasio Basicに比べて10000倍とかのオーダーで速くなります(笑)

オーバークロック

santaro様

fx-9860GIIには、PC上でプログラムを書いたり編集を行うユーティリティが付属していると思っていて、テキストベースのコードを取り込んだり、コードをテキストで読み出したりできるものと思っていました。こめんとを拝見する限り、こういうことは出来なさそうですね。バイナリーでの保存やコピーができるだけなのでしょうか?

ところで、オーバークロックを前提にすれば、SH4搭載機がよさそうですね。

来週のドイツ出張が益々ヤバくなりそうです(^^;)

No title

管理人様、こんにちは!

>バイナリーでの保存やコピーができるだけなのでしょうか?

はい。
付属の転送ソフトでは中間コードのバイナリ形式として扱えるだけです。
一応転送ソフト内での編集作業は出来ますが、外部にコピーしても一部の特殊記号などが文字化けするので、その変換作業が必要になるです。

テキスト変換を電卓内部でできるようになったのはfx-CG10/20以降の機種ですが、
すべてをアスキーコードで表現するので若干冗長になる部分もありですけど、そのまま簡単に扱えるのは便利ですね。


>ところで、オーバークロックを前提にすれば、SH4搭載機がよさそうですね。

はい、速さの面では間違いなくSH4A版の潜在能力が上です。
CasioBasicに関しては何も問題はないので、あとはアドインソフトの従来互換をどこまで重視するかというところでしょうか。

この際、どっちも揃えられるのであればそれが一番といえば一番かと思います(笑)


>来週のドイツ出張が益々ヤバくなりそうです(^^;)

管理人様のCasioBasic機の増殖を楽しみにしてます!(^^)

ありがとうございます。

簡単なミスだったようですね。直って何よりです。
表示に関しては積極的にLocateを使って結果を一覧で表示させるUIにする事が作業速度向上に繋がると思います。EXEを何度も押すのは手間ですから。

そうですね

すっけぴぃさん

ご丁寧にコメントをありがとうございます。

おっしゃるように、結果表示を一気に4行分表示させると素因数分解プログラムの完成度があがりそうですね。

今回、計算を全部行ってから、後で表示を行うように変更した最大の理由は、肝心の計算部分の時間を、少しは精度良く計りたいからでした。

それが達成されたので、私自身はさらに改造するつもりはありません。

但し、もしそのような改造を行うなら、素因数が全部求まった段階、つまり

LpWhile Y≧1

の直後のKの値から、表示に必要な行数が分かるので、それを利用すれば、結果表示を1画面単位で行うように改造する方法がある思います。

お久しぶりです。

早速ですが、11行目の
Then X→D : X÷D→Y
という部分、これは
Then 1→Y
と同義ではありませんか。

理由: X→DをするとX=Dになります。また同じ数同士のわり算の商は必ず1になるのでX÷Dの商は常に1になる。

間違いでしたらすいません。よろしくお願いします。

あと、高速化の提案ですが22行目と23行目の間に、
If Frac(D÷3)=0
Then Isz D : Isz D
If End
これを入れると「エラトステネスの篩」より3以外の3の倍数は素数ではないという前提から、素因数候補の数が減ります。場合によりますが素因数が大きい場合は高速になりました。同様に5、7、11...の倍数も取り入れても良いのですが、多すぎると逆に速度低下を招くので難しいですね。

よろしくお願いします。

確かに

すけっぴぃさん

> 早速ですが、11行目の
> Then X→D : X÷D→Y
> という部分、これは
> Then 1→Y
> と同義ではありませんか。

確かにおっしゃる通りです。1→Y で良いですね。


> あと、高速化の提案ですが22行目と23行目の間に、
> If Frac(D÷3)=0
> Then Isz D : Isz D
> If End
> これを入れると「エラトステネスの篩」より3以外の3の倍数は素数ではないという前提から、素因数候補の数が減ります。場合によりますが素因数が大きい場合は高速になりました。同様に5、7、11...の倍数も取り入れても良いのですが、多すぎると逆に速度低下を招くので難しいですね。

このあたりは、実際にプログラムを作って、処理時間を測定して良さそうなところを見つけるしかなさそうですね。但し、どのような自然数に対しても絶対に速くなる処理は無さそうです。

If文でも結構な処理時間がかかってしまう fx-5800P を使う場合は、余計なことをしない方が良いといった経験も結構ありますので、実際にやってみるしかなさそうです。



最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム関数電卓は、プログラムを作り・使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR