日頃は12cをいじくってばかりいるので、2007年の正月は33sを可愛がってやることにした。といってもある数の三乗根を求めたり、任意の数の自然対数を求めたりするばかりでは暗い。あまりに暗い。やはりHP電卓をいじくるといえばプログラムだろう。
凡例
[文字列]
33sのキーを表す。fキー、gキーは特に明記しない。
{値}
{値} → {値}
スタックの状態と変化(計算の結果)を表す。{}の中は右端がスタックトップ(X)。
最大公約数を求める
33sは12cに比べてプログラム空間も大きいし、ラベルが使えるから自由度も高い。ちょっとはプログラムらしいものを書こうと思い、最大公約数(Greatest Common Divisor, GCD)を求めるプログラムを書いてみた。「明示的に記述された最古のアルゴリズム」としても有名なユークリッドの互除法である。Rubyで書くとこうなる。
def gcd(a, b)
if b == 0 then
return a
elsif a % b == 0 then
return b
else
return gcd(b, a % b)
end
end
これを素直にプログラムしてみる。
プログラム
{a, b} → {GCD}
※レジスタBを破壊
左端は行番号(33sがつける番号形式とは異る)。
0001: [LBL] G ; {a, b}
0002: [STO] B
0003: [x?0] {=} ; x=0? Ruby[if b == 0 return a]
0004: [GTO] H
0005: [Rmdr]
0006: [x?0] {=} ; x=0? Ruby[if a%b == 0 return b]
0007: [GTO] I
0008: [RCL] B ; {a%b, b}
0009: [x><y] ; {b, a%b}
0010: [GTO] G ; プログラム先頭へ
0011: LBL H ; 0003、bが0だった時ここに分岐。aをスタックトップに置いて終了
0012: [x><y] ; {b, a}
0013: [RTN]
0014: [LBL] I ; 0006、aがbで割り切れた時にここに分岐。bをスタックに積んで終了
0015: [RCL] B
0016: [RTN]
これで何となく動いている風である。
レジスタを使わずにプログラムできる気もする。
33sはラベルが使えるのがいいけど、分岐が別のラベルになってしまうらしいのはちょっと不満(ラベルはアルファベット1文字)。このようにちょっとしたプログラム片でも別のラベルをつけないといけないのでは、色色なプログラムを沢山詰め込むことができないのでは? まあ、取扱説明書をきちんと読み込めば解決策があるかも知れない。
12cへは、ラベルの代わりに行番号を指定することと、剰余(Rmdr)の代わりに「除算結果の小数部が0.00かどうか判定する」とすることで移植できると思う。12cで走らせるとどれ位時間がかかるか見てみたいね。
EQNモード・指数関数
別のページにするべきか。
X = (1+R)^N
てな数式を登録しておくと、単純な複利計算が楽かも。
最終更新:2007年03月28日 09:44