fx-5800Pで素因数分解

2013/11/01:追記
2015/01/25:追記


 CASIO の最新関数電卓:fx-995ESでは、幾つかの新しい機能が追加されている。

fx-995ES fx-5800P 
写真左:CASIO カシオ 関数電卓 572関数・機能数 数学自然表示 fx-995ES-N シルバー

写真右:カシオプログラム関数電卓 FX-5800P-N


今回 fx-995ES に新たに追加された機能のうち、あったら便利だと思うのは総積と計算結果の初期表示を小数点にする機能くらい。
他の新機能、例えば

・原子量を得る機能
・PreAns機能
・素因数分解

などは、敢えて必要とも思えない。

実用性とは別に、興味を惹いたのが素因数分解だ。
そこで、fx-5800P (上写真)にも素因数分解を実装しようと思ったわけだ。


素因数分解

全ての自然数は、素数の積で現され、その組み合わせは1通りしかない。

と言う素数の性質があるので、任意の自然数Nの素因数を探す時の順序は関係ないわけだ。

そこで、与えられた自然数Nに対して、2から順に1つづつ大きな数で割り算をして割り切れるかどうかを繰り返す、絨毯爆撃を行えば、全ての素因数を割り出せる。

そもそも素数は奇数なので、3以上は奇数だけで調べれば良い。


fx-5800P専用
素因数分解プログラム
======================
Lbl 0
Cls
"FACTORIZING"
"INPUT INTEGER"?→A
C→0:2→D:A→X
Do
X÷D→Y
If Frac(Y)=0
Then Y→X:Isz C
Else
If C≠0
Then
D◢
"TO THE":C◢
0→C
IfEnd
If D=2
Then Isz D
Else Isz D:Isz D
IfEnd
IfEnd
LpWhile Y≧1
Cls
"COMPLETED"
""
"<->:TRY OTHERS"
"<AC>:QUIT"
While Getkey≠67
WhileEnd
Goto 0
======================



実行すると、最初にプログラムの説明を表示する。


-----------------
FATORIZING
INPUT INTEGER?
-----------------


ここで、12345 を入力して[EXE]キーを押すと、

-----------------
                3
TO THE
                1
-----------------

と表示される。3の1乗と言う意味の英語にしてある。


さらに[EXE]キーを押すと、
-----------------
               5
TO THE
               1
-----------------

と表示。5の1乗と言うことだ。


さらに[EXE]キーを押すと、少し時間がかかるが
-----------------
               823
TO THE
                1
-----------------

823の1乗と表示される。
割と大きな素数が出てきた。


さらに[EXE]キーを押すと、
-----------------
COMPLETED

<->:TRY OTHERS
<AC>:QUIT
-----------------

と表示され、続けるか終わるかを聞いてくる。



上記の 12345 の素因数分解では、素数 823 が出てくるのに23秒かかった。比較のために、fx-995ESで12345の素因数分解を行うと、2秒程度で答えが出てくる。組み込み機能は10倍速い。

一方で、fx-955ESに組込まれている素因数分解機能は、素因数が3桁まででないと計算しない仕様になっている。

方や、fx-5800Pのプログラムでは、時間をかければ、もっと大きな素因数でも答えを出してくれる。

例えば、987654321 = 3 x 17 x 379721 と、6桁の素因数が得られた。
但し、この計算には3時間もかかるので、これ以上は試していない。


いずれにせよ、電卓でプログラムを組むと遅い。

EXCELのVBAで同じロジックのプログラムを作って動作させてみると、上記の 987654321の素因数分解でも一瞬で答えが出る。

参照: VBAで素因数分解 【2013/11/1 追記】



電卓の遅い処理時間の実感を掴むために、処理速度を調べてみた。

そして、色々な自然数で素因数分解をしてみた結果から、
Do~LpWhileループが回る時間が、45m秒程度かかることが分かった。

全くの推測だが、太陽電池で動作させる程度の省電力が要求されるため、かなりクロックを落としているものと思われる。
その上、各コマンドの実行には、エラー検知やある程度余計な内部処理が含まれることも、処理速度に影響しているのだろう。

最初から機能として組み込まれている fx-955ES の処理速度が10倍程度速いことからも、プログラム実行にはかなり余分な処理を伴っていることがよく分かる。


[2015/01.25 追記]
fx-5800P を使った因数分解については、続編として以下のエントリーがある。
 ⇒ fx-5800P で素因数分解再び
 ⇒ fx-5800P 素因数分解 - バグ修正と表示変更

fx-9860GII への移植
 ⇒ fx-9860GII への移植 - 素因数分解








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

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800P素因数分解fx-995ESプログラミングプログラム関数電卓

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

関連記事

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

コメントの投稿

非公開コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

素因数分解

Ken様

コメントありがとうございます。

具体的なご提案を頂いて、とても嬉しく思います。

確かに基数の平方根までとすれば計算負荷は半分程度になりますね。面白いので、新たな記事として投稿しようと思います。その前に私もチョット遊んでみようと思います。


元々fx-5800Pの処理速度に興味があったので、各ルーチンの処理速度がバカみたいに遅いことが分かって、それで満足してしまっています。


しかし、確かにおっしゃるような改善をすれば、素因数分解そのものは劇的に高速化するのでしょう。このままでは片手落ちですから、頂いたアイディアを反映させてみたいと思います。


私は現在、急な用件のため海外出張中ですので、記事の投稿には少々時間がかかると思いますので、気長にお待ちください。

KENさんのコンセプトの記事

KENさん

こんばんは、KENさんから頂いたコンセプトで、プログラムを改善し、その記事を公開しました。

驚くべき高速化が実現できました。

とても楽しませて頂きました。

ありがとうございます。

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

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR