最終:2015年3月11日
プログラムにバグがあったので修正しました [2014/12/03]
a2 + b2 = c2 となる自然数の組 (a, b, c) をピタゴラス数といいます。(3, 4, 5) がピタゴラス数と言うのは、直角三角形の3平方の定理で有名です。
そこで、ピタゴラス数を調べる Casio Basic プログラムを fx-5800P で作ってみました。
実際の計算には、以下のようなピタゴラス数の性質を利用しました。
例えば、
(3, 4, 5) と
(6, 8, 10) は、いずれもピタゴラス数ですが、1つめを2倍すると2つめになり、これらは同じと見なすことにするので、「
a, b,
c の最大公約数は
1」と言う条件を付けています。
(6, 8, 10) の最大公約数は、
2 なので、条件から外れます。最大公約数が 1 の (
a,
b,
c) を原始ピタゴラス数と言います。
m と
n の組み合わせに重複がなければ、全ての原始ピタゴラス数が重複なく得られると言うのが特長なので、この性質を利用して上の条件に合うような、
m と
n を探して、見つかった
m と
n からピタゴラス数 (
a,
b,
c) を計算する作戦です。
先に M を決めて、そこから条件に合う N を探索し、N が 1 になった時はNの探索を終えて、次の M を決めて条件に合う N を探索する....これを繰り返します。
1) 最初、
M を 3 とし、
N を 1 とする。
2) 現在の
M と
N からピタゴラス数を計算し、表示する
3)
N を
0 にならない範囲で
2 減らして、
M÷N が割り切れないとき(
M と
N が互いに素のとき)、その
N を採用。割り切れる時は 3) を繰り返す。割り切れるかどうかは、M÷N の小数部分が 0 かどうかで判定。但し N が0 になると M÷N でエラー(0 で割り算できない)ので、その1歩手前の N が 1 の時には、Nの探索を終了する。
4)
N が
0 以下になるとき、
M を 2 つ増やし、
M-2 を
N に代入して、
3) に戻り、正しい
M と
N が見つかるまで
3) を繰り返す。
5)
2) へ戻る。
文章よりも、2) ~ 4) のプログラムを見た方が分かりやすいでしょう。
Do
N-2→N
If N<0:Then
M+2→M:M-2→N
IfEnd
N=1⇒Break
LpWhile Frac(M÷N)=0ピタゴラス数プログラム3→M:1→N:1→D (初期化処理)
Locate 1,2,"A=" (初期画面表示)
Locate 1,3,"B="
Locate 1,4,"C="
Lbl 0
(M2-N2)÷2→A (ピタゴラス数の計算)
MN→B
(M2+N2)÷2→CLocate 1,1,D (見つかった回数の表示)
Locate 3,2," " (スペース14個)
Locate 3,2,A (ピタゴラス数の表示)
Locate 3,3," " (スペース14個)
Locate 3,3,B (ピタゴラス数の表示)
Locate 3,4," " (スペース14個)
Locate 3,4,C (ピタゴラス数の表示)
Locate 7,1,"EXE:Next"◢ (操作法表示&プログラム一時停止)
Do (次の M と N を探す)
N-2→N
If N<0:Then
M+2→M:M-2→N
IfEnd
N=1⇒Break
LpWhile Frac(M÷N)=0
Isz D (見つかった回数を1つ増やす)
Goto 0
このプログラムは、Lbl 0 / Goto 0 の無限ループが基本構成ですので、終了するには
[AC] キーを押します。
プログラムを起動すると、画面は以下のようになります。
最初の原始ピタゴラス数 (4, 3, 5) が表示されています。
※ 左上: 探したピタゴラス数の個数。起動時なので 1
※ 右上:
[EXE] キーを押すと次のピタゴラス数を探す
ここで、
[EXE] キーを押すと、以下のように2つめのピタゴラス数がわかります。
さらに、
[EXE] キーを押すと、3つめのピタゴラス数を探します。
※ 画像修正
今のプログラムだと、
[EXE] キーを叩き続けなければ、大きなピタゴラス数が分からず、ちょっと物足りない。
そこで、
[EXE] キーを長押しすると、ピタゴラス数の探索&表示を連続して行うように機能追加しました(連続モードの追加)。
※ 動画修正使い方:・起動すると、最初に作った「ステップモード」で、右上に
EXE:Next と表示。
・
[EXE] キーを押すと、次のピタゴラス数を計算して、表示します。
・
[EXE] キーを
長押しすると「連続モード」になり、右上に
(-): Stop と表示。
・連続モードでは、次々とピタゴラス数を計算して表示し続けます。
・
[(-)] キーを押すと「ステップモード」に戻り、右上の表示が
EXE:Next に戻ります。
右上に
EXE:Next と表示されていると、ステップモードだと分かります。
(-):Stop と表示されていると、連続モードだとわかります。
連続表示のまま、しばらく置いておくと、以下のようになります。
※ 動画更新ピタゴラス数が次々と表示されるのを見ていると、チョット面白いですね。
さて、キー長押しで機能選択する方法は、これまでも紹介していますが、今回のプログラムでも利用しています。この方法を知っていると、とても便利です。連続モードの機能追加には、
[(-)] キーの通常押しの検出、
[EXE] キーの長押しの検出を追加し、連続モードなら変数 E=0 、通常モードだと E=1 とし、表示を E の値に従って変更するようにしました。
これらのキー入力検知は以下のプログラムで処理します。
Getket=57⇒1→E
0→K
While Getkey=47
Isz K:K=7⇒Break
WhileEnd:K=7⇒0→E次の短いプログラムを入力して、実際に遊んでみてください。
ピタゴラスの綴りが
PYTHAGORAS なので、そのままファイル名としました。
(プログラム修正) ※ Locateコマンドの空白は16個
応援クリックをお願いします。励みになるので...
keywords:
プログラム関数電卓、fx-5800P、キー長押し、CasioBasic、 ピタゴラス数
リンク集 |
ブログ内マップ
- 関連記事
-
テーマ : プログラム関数電卓
ジャンル : コンピュータ
Sentaro様
今日は、届いた fx-9860GII を開梱して、とりあえず fx-5800P のCasio Basic の移植を試してみました。
その様子を、別記事でアップしました。
SDKもインストールしたところです。
キーコードが正しく取得できないとのことなので、そのあたりから触ってみようと思っています。
> ちょこっと検索すると日本語で初期導入から解説してくれているサイトが見つかります。
>
http://baticadila.dip.jp/
>
> 最初の"Hello World"のハードルはかなり低いというかデフォルトの雛形で"Hello World"になってますから、あとはキー操作、画面操作、ファイル操作が自由にできるようになればもう何でもありですね。
これは、助かるサイトですね。
ブックマークに入れておきました。
> あっという間にアドインが量産されそうなところがさすが管理人様です!(^^)
構想を実現する前に、先ずはボチボチ触ってみようと思っています。
Ftune2 は凄いですね。ハードが分からない私は、ただただ尊敬するのみです。
管理人様、こんんちは!
>sentaro様に出会っていなければ、ポチッとすることも無かったと思います。
いえいえ、こちらこそです。
管理人様のこの貴重なブログとの出会いがなければCasioBasicの素晴らしさを再認識することもなかったですし、SH4AなCASIO機が増殖することもなく300MHzな世界に突撃することもあり得なかったと思います(笑)
これも卵が先か鶏が先かみたいな感じですけど、CASIOの電卓はそれだけ奥が深く面白いってことなんですね。
>そう考えざるを得ません。上のWorldwide Education Site にしても、日本語を選べないなんて、どうかしていると思います。
ワールドワイドなCASIOサイトなのに日本語が選べないのはかなり残念な感じですよね。
>高校でプログラミングを教えるようになってますので、景気後退の日本にこそ、手軽なプログラミング環境である電卓は貴重だと思うのですが、カシオをそう考えないのは、不思議でなりません。
本当にそうですよね。
海外ではグラフ電卓は授業で必須みたいな状況に比べて日本での使用状況が全然違うので仕方ないのでしょうけど、本体売る気の無い価格体系はちょっといただけません(^^;
>なるほど、そういうことなのですね。電卓でポチポチとCでプログラミングできるものと思い込んでいました。
本体で動くCコンパイラもありますが、pコードインタプリタでサブセットなので普通に使うにはちょっと無理がある感じです。
SDKのはごく普通にフルCなのでばりばり使い倒せます(笑)
CG10/20には公式なSDKが存在しないので最初のSDKの段階から手作りでという感じになってますね。
>fx-5800P の Casio Basic を書いていても、ついついCのコードが浮かんでしまいます。
>とは言うものの、昔の MS-DOS での Cプログラミングに近いのだろうと想像しています。
そうですね。感覚的にはMS-DOSの感覚でばっちりです。
ちょこっと検索すると日本語で初期導入から解説してくれているサイトが見つかります。
http://baticadila.dip.jp/
最初の"Hello World"のハードルはかなり低いというかデフォルトの雛形で"Hello World"になってますから、あとはキー操作、画面操作、ファイル操作が自由にできるようになればもう何でもありですね。
>すでに、作ってみたいプログラムが幾つか思い浮かんでいます...
あっという間にアドインが量産されそうなところがさすが管理人様です!(^^)
sentaro様
sentaro様に出会っていなければ、ポチッとすることも無かったと思います。
ありがとうございます。
> 海外版からずっと倍くらい高いままなので日本でグラフ電卓を普及させる気は全然なかったということですよね。
そう考えざるを得ません。上のWorldwide Education Site にしても、日本語を選べないなんて、どうかしていると思います。
日本の市場性が無いのか、手を抜いているから市場が無いのか、鶏と卵ですね。
高校でプログラミングを教えるようになってますので、景気後退の日本にこそ、手軽なプログラミング環境である電卓は貴重だと思うのですが、カシオをそう考えないのは、不思議でなりません。
> 切り替えというか、Cのアプリは本体では作れないのでパソコンからですけど、段取りというか最初のハードルを越えたらもうあとはサクサクです(笑)
> コンパイルしてすぐに動作確認できるエミュレーターも完備なので環境としては良く出来てます。
なるほど、そういうことなのですね。電卓でポチポチとCでプログラミングできるものと思い込んでいました。
> で、SDKは製品には付属してこないのでこちらのサイトから(登録必須です)SDKをダウンロードする必要があります。
>
https://edu.casio.com/
Worldwide Education Site を教えて頂き、ありがとうございます。
これ、実際にfx-9860GII が手元にないと、登録できないのですね。
> はい!300メガHzで(笑)
> 最新Casio BasicとCの世界にようこそです!(^^)/
fx-5800P の Casio Basic を書いていても、ついついCのコードが浮かんでしまいます。
とは言うものの、昔の MS-DOS での Cプログラミングに近いのだろうと想像しています。
そうなると、Windows API や MFC に慣れた体になっているので、以前のMS-DOSで生Cの感じを取り戻すのに時間がかかりそうです。
ボチボチと触って、色々遊んでみますね。
すでに、作ってみたいプログラムが幾つか思い浮かんでいます...
管理人様、こんにちは!
>fx-9860GII は、マイナーチェンジを繰り返してきているし、ヨドバシでは、\17,800 ととんでもなく高いまま。
海外版からずっと倍くらい高いままなので日本でグラフ電卓を普及させる気は全然なかったということですよね。
>これは、注目していすが、ご本人がお忙しそうなので、仕方ないですね。
fx-9860GIIシリーズと繋がるようになるとすごい利便性アップなんですけどそうそう簡単なことではなかったのかもですね。
>それって、ピタゴラス数1000個が2秒ですか?
そうです。あっというまにカウント1000まで到達したので驚愕の高速性能です。
ま、ちょい前のスマホと同じようなハードなので当たり前といえば当たり前ですけど、ハード的に自由にいじれないのがいまいちですね。
>CとCasio Basicは、切り替え簡単ですか?
切り替えというか、Cのアプリは本体では作れないのでパソコンからですけど、段取りというか最初のハードルを越えたらもうあとはサクサクです(笑)
コンパイルしてすぐに動作確認できるエミュレーターも完備なので環境としては良く出来てます。
で、SDKは製品には付属してこないのでこちらのサイトから(登録必須です)SDKをダウンロードする必要があります。
https://edu.casio.com/
>あはは、300Hz じゃなくて 300MHzですからね...(^^;)
はい!300メガHzで(笑)
>ポチッ
>と、してしまいました(^^;)
ついに管理人様もfx-9860GIIオーナーですね!
最新Casio BasicとCの世界にようこそです!(^^)/
sentaro様
fx-9860GII と fx-CG20/10 は、B/W液晶かカラー液晶かのジャンルわけ、と思っていましたが、おっしゃるように、以下の製品比較表からは、fx-5800P はあるのに、fx-9860GII は外されていました
http://casio.jp/dentaku/products/scientific/#list
カシオにとって、積極的に売りたい製品ではなくなったと言うことは言えそうです。できれば fx-CG20を売りたいのでしょう。
fx-9860GII は、マイナーチェンジを繰り返してきているし、ヨドバシでは、\17,800 ととんでもなく高いまま。
> fx-5800Pのて通信プロトコル解析も進展がないようですし、ハード系な興味はやはりグラフ電卓以上の機種になってしまうのでしょうかね。
>
http://community.casiocalc.org/topic/5661-projectfx5800p-data-link/
これは、注目していすが、ご本人がお忙しそうなので、仕方ないですね。
> ってことで、ほかの電卓での表示速度も気になったので爆速のHP-Primeでもちょろっと実験してみたら1000個までカウントして若干2秒(^^;
それって、ピタゴラス数1000個が2秒ですか?
> この差はさすがにちょっと悔しいので、fx-9860GIIでCでアドインにしたら100倍速くなったのでHP-Primeをやっと上回りました(笑)
おお、やはりCですね。
CとCasio Basicは、切り替え簡単ですか?
> (すべてノーマルクロックでの結果なのでオーバークロックしたらさらに軽く数倍にはなります)
あはは、300Hz じゃなくて 300MHzですからね...(^^;)
> 新品の出品情報見ると9千円で出してるのが10店以上ずらっと出てくるんですが、これは、つりにつられて状態?!いよいよ投げ売りなのでしょうか(^^;
> こうなってくるともうひとつ予備実験用に買っておこうかなという気にもなってきます(笑)
Amazonの並行輸入品を見てますと、fx-9860GII が ¥9,000 ポッキリ
ポチッ
と、してしまいました(^^;)
あ~あ
> >ところで、特定のキーを同時押しをすると、キーコードが1桁になる現象ですが、グラフ関数電卓では発生するのでしょうか?
>
> んと、これは全く発生しない模様です。
> BASICでは複数キーの同時押しでは最初に押されたキーコードのみが出ます。
> アドインなら特定のキーの同時押しはそれぞれが判定できる模様です。
自分で試すことが出来るようになってしまいました。
管理人様、こんにちは!
>ただ、キーの同時押しネタ、かなり知らない人が多いはずですが、ほぼレスポンス無しなので、果たしてどの程度興味を引くか.... ですね
うぅむ…そういえばそうなんですよねぇ。
fx-5800Pのて通信プロトコル解析も進展がないようですし、ハード系な興味はやはりグラフ電卓以上の機種になってしまうのでしょうかね。
http://community.casiocalc.org/topic/5661-projectfx5800p-data-link/
速度問題はたとえBasicで遅くともCでアドインが簡単に作れるfx-9860GIIではほとんど問題にならないようなものですし、fx-CG10/20は画面の情報量増えた分重いですけど、それでもアドインが可能なので遅いのはなんとかなりますね。
ってことで、ほかの電卓での表示速度も気になったので爆速のHP-Primeでもちょろっと実験してみたら1000個までカウントして若干2秒(^^;
この差はさすがにちょっと悔しいので、fx-9860GIIでCでアドインにしたら100倍速くなったのでHP-Primeをやっと上回りました(笑)
(すべてノーマルクロックでの結果なのでオーバークロックしたらさらに軽く数倍にはなります)
>先々週に、すでに1万円を切ってましたが、残り1台と表示されてました。これは、つりかも知れませんね。
新品の出品情報見ると9千円で出してるのが10店以上ずらっと出てくるんですが、これは、つりにつられて状態?!いよいよ投げ売りなのでしょうか(^^;
こうなってくるともうひとつ予備実験用に買っておこうかなという気にもなってきます(笑)
>ところで、特定のキーを同時押しをすると、キーコードが1桁になる現象ですが、グラフ関数電卓では発生するのでしょうか?
んと、これは全く発生しない模様です。
BASICでは複数キーの同時押しでは最初に押されたキーコードのみが出ます。
アドインなら特定のキーの同時押しはそれぞれが判定できる模様です。
sentar様
ところで、特定のキーを同時押しをすると、キーコードが1桁になる現象ですが、グラフ関数電卓では発生するのでしょうか?
甘えついでにお願いさせて頂きます。
sentaro様
おお、とでもない凡ミス、ご指摘感謝感激です!
全くおっしゃる通りです。
早速、修正させて頂きます。
> グラフ電卓が意外にもfx-5800Pとあまり差がないというのは結構知らない方も結構いるかもしれませんね。
> 何かしらレスポンスあるとよいですよね(^^)
意外だと思う方が多ければ....
ただ、キーの同時押しネタ、かなり知らない人が多いはずですが、ほぼレスポンス無しなので、果たしてどの程度興味を引くか.... ですね
> そういえば、AMAZONの並行輸入fx-9860GIIがついに9千円!
> どこまで下がるんでしょうか(^^;
先々週に、すでに1万円を切ってましたが、残り1台と表示されてました。これは、つりかも知れませんね。
管理人様、こんにちは!
UCF見ました。
グラフ電卓が意外にもfx-5800Pとあまり差がないというのは結構知らない方も結構いるかもしれませんね。
何かしらレスポンスあるとよいですよね(^^)
そういえば、AMAZONの並行輸入fx-9860GIIがついに9千円!
どこまで下がるんでしょうか(^^;
ところで、プログラムの方なのですけど、
MとNが割り切れるかの判定は
IntではなくFracが正解ですよね。
そしてこの変更をするとNが1になった場合に判定ミスしてしまうので、
Nが1の場合には判定前でループを抜ける必要が出てきます。
ということで、そのブロックは
Do
N-2->N
If N<0:Then
M+2->M:M-2->N
IfEnd
N=1=>Break
LpWhile Frac (M/N)=0
こういう感じでいいのではないかと思います(^^)
あと、表示の問題なのですが、
3つ目の
A=12
B=55
C=13
は本当は
A=12
B=5
C=13
なのでひとつ前の表示が残ってしまってます。
右詰で表示できれば問題ないのですけど、左詰なのできちんと表示するには直前で消去するか、
もしくは毎回Clsで全部消して書き換えるか、ですね。
sentaro様
グラフ関数電卓の表示速度が意外に遅いというお話しがとても面白いので、Universal Casio Forumに投稿してみました。
http://community.casiocalc.org/topic/7390-pythagoras-numbers-fx-5800p/
ピタゴラス数探索プログラムを公開しました。
そこで、友人が fx-5800P のプログラムを移植したところ、fx-9860GIIで2倍程度、fx-cg10 では驚くことに fx-5800P と表示速度がさほど変わらないというネタも付け加えてみました。
何か反応があればいいな、と...
UCF では fx-5800P はマイナー機種ですが、最近 tritonio さんが fx-5800P のネタを連続投稿しているので、この人を少し意識しています。fx-5800P の表示が速いのか、fx-cg10 が遅いのか、どう考えるかは評価が分かれるところですが、おそらく fx-5800P は下位機種との認識があるでしょうから、その意外性も面白いところです。
santaro様
コメントありがとうございます。
電卓が計算している動きが見えるのは、面白いですよね。
上位機種との比較、誠に貴重な情報です。ありがとうございます。
表示速度が律速になっているとは、面白い結果です。電卓の性能を考える時、演算速度だけではない、と言うことが、よくわかります。fx-5800Pが健闘しているというのは、意外です。こうしてみると、fx-5800Pの良さを実感します。
さらに、fx-9860GII への興味が増してきました。
ひとつひとつの計算に時間がかかるのかと思いきや結構速くてサクサクなところがまたよいですね。
単純なようで表示の移り変わりが見てて面白いです。
動画は誰にでもfx-5800Pの性能が直感的に分かるのがポイント高いですね。
そういえばfx-5800Pは表示に関してはかなり速い方なのですよね。
同じプログラムをfx-9860GIIとfx-CG10で実行してみると、
(キーコードだけ互換無いのでそこを変えるだけでそのまま動きます)
意外?にもfx-5800Pと速度差が出ないです。
ノーマル状態のfx-9860GIIでは2倍ほどの速度差はありますけど、ノーマルのfx-CG10にいたってはほぼ同じ速度(^^;
本体でかい割には全然速くないってことでありがたみがほとんどありません(笑)
演算速度はそこそこ速い割に表示速度が遅いのでその差が結構大きいです。