e-Gadget - プログラム関数電卓 fx-CG50

Casio fx-CG50 の概要

 
初版: 2017/07/23
追記 2018/08/09
追記 2018/12/26
日本語化に関する追記 2019/05/09
追記 2019/09/18
周期関数の積分について追記修正 2020/05/23
OS3.40へのアップデート 2020/06/06
Casio Ptyhon新連載に伴う追記 2020/06/09
OS3.50へのアップデート 2020/10/17
OS3.60へのアップデート 2021/12/19
OS3.70へのアップデート 2022/12/25
OS3.80へのアップデート 2023/09/03

Casio fx-CG50

fx-CG50 noce photofx-CG50 が欧米で発売されたので、国内発売前に入手して調べてみました。本気で欲しいと思える製品です。

fx-JP900 のデザインを踏襲しています。角に丸みのある四角い形状と高級感のあるフロントパネル、黒・白・シルバーを基調とした色使い。カシオの新しい形。所有する喜びを感じるデザインではないでしょうか?

fx-CG50 は、fx-CG10 PRIZM (北米モデル) や fx-CG20 の後継機で、欧米で 2017年3月末に発売されました。ほぼ7年ぶりの後継機種投入です。

fx-CG50 紹介 (英語のサイト)

日本での発売前に、eBay USA で購入しました。この記事を書いている時点では、eBay USA での実売価格は、新品で100ドルを下回る程度です。国際輸送費を考えてもアメリカからの入手は現実的だと思います。但し配送に時間がかかります(最低でも2週間程度)。

[2023/09/03 追記] OS3.80 0010 にアップデート
日本時間で 2023/04/23 に 国内外同時に OS3.80 へのアップデートファイルが公開された。
OS3.80 へのアップデートファイルのダウンロード
日本語マニュアルのダウンロード
一旦 2023/04/05 に OS3.80 へのアップデートファイルが公開されたが、その後システム改善のため 4/23 に再度アップデートファイルが公開された。但し、Casio Basic も Pythonモードも変更がみられない。

[2022/12/25 追記] OS3.70 にアップデート
2022/12/21 に OS3.70 へのアップデートファイルが日本と欧米で公開された。
OS3.70 へのアップデートファイルのダウンロード (国内カシオサイト)
DOWNLOADS (海外ダウンロートサイト)
日本語マニュアルのダウンロード

カシオのダウンロードページではアップデート内容として「フランス語対応」とある。
OS Updateが実行される際、Add-In の Geometry (01.05)、Picture Plot (01.03)、Physium (01.06) もインストールされた。
ハードウェア取扱説明書は従来通り更新なし。ソフトウェア取扱説明書は OS3.60 のままで OS3.70 用に更新されていない。 

変更点として先ず気づくのが、電源OFF時に表示される "CASIO" のロゴの下に "Boost Your Curiosity" (あなたの好奇心を後押し) が追加された。但し、Casio Basic や Python モードの変更は見られない。

機能上の更新点が見当たらないが、システムメッセージの全ての対応言語が ver 03.70 にアップデートされた。フランス語対応だけでなく各国語のメッセージが変更されている可能性がある。英語版を見る限り目立った変更は見られない。

[2021/12/19 追記] OS3.60 にアップデート
2021/12/06 に OS3.60 へのアップデートファイルが日本で公開された。欧米では 2021/09/08 に公開されていた。
このアップデートでは確率分布アプリが追加され、具体的には MENU画面で Distribution モードが追加された。
なお、Python  モードや Casio Basic には変更がない。

[2020/10/17 追記] OS3.50 にアップデート
2020/10/15 に OS3.50 へのアップデートファイルが欧米と日本同時に公開された。
Pythonアプリ描画機能改善、NL試験モードとTexas(US)試験モードの搭載がアップデートの内容。Pythonについては改善点がスグには判らないので、いずれ調べようと思っている。
OS3.50へのアップデートファイルのダウンロード
日本語マニュアルのダウンロード

[2020/06/09 追記] Casio Pythonの新連載開始
Casio Python が爆速 (純正Casio Basicに比べて) なので、Casio Python 使いこなしの新連載を始めた。

[2020/06/06 追記] OS3.40 にアップデート
欧米では 2020/04/07 に、日本国内では 2020/06/01 にアップデートモジュール配布開始
内蔵の Micro Python に casioplot モジュールが追加され、点を打てるようになった。
OSアップデートファイル
 ・WEWからのダウンロードはこちら
 ・国内サイトからのダウンロードはこちら
日本語マニュアルはこちら

[2019/09/18 追記] OS3.30 にアップデート
主に Pythonの改善と試験モードの使用追加
・WEWからのダウンロードはこちら
・国内サイトからのダウンロードはこちら

[2019/05/09 追記] ユーザーによる日本語化計画
fx-CG50 には、簡体字コード GB2123 を少し変更したグリフ (文字) が搭載されており、それを読み出す方法が見つかった(当ブログ読者の Colon様による)。簡体字は日本語の文字と異なるものが少なくないが、それでも英語よりはましだ。ひらがなも含まれている。Colon様により日本語化ファイルが提供されており、これを fx-CG50 にコピーするだけで、日本語風表記で使えるようになる。
fx-CG20 / CG50 日本語化計画
さらに、fx-CG50で使えるアドインプログラム - C.Basic for CG が当ブログの読者である sentaro様を中心にして現在も開発が進んでいる。C.Basic for CG は純正Casio Basicの上位互換の BASIC開発環境だ。これを使えば作成するプログラムで日本語風の表記が可能になる。
プログラムライブラリ - 日本語版 西暦-和暦 換算プログラム
 
[2018/12/26 追記] ついに Python搭載!
OSが 3.20 にアップデートされ、プログラミング言語 Python が追加され、選択言語にイタリア語が追加された。
Worldwide Education Website (WEW: 海外のカシオサイト)では2018年8月には公開されていたが、日本のサイトでは 2018年12月に公開された。
- WEWからのダウンロードはこちら
- 国内サイトのダウンロードはこちら

[2017/10/20 追記] ついに 2017年10月20日に fx-CG50 が国内発売!
カラーグラフ関数電卓 fx-CG50 
fx-CG50

既にカシオの国内サイトでは fx-CG50 (OS 3.10) の日本語マニュアルが公開されていることから、国内販売は現行の Ver 3.00 でなくて、Ver 3.10 になると思われる。
 
[2017/09/23 追記] fx-CG50 日本語マニュアル
fx-CG50 の日本語マニュアルがカシオ日本語サイトの 取扱説明書ダウンロードサイト からダウンロードできるようになった。ハードウェアマニュアルとソフトウェアマニュアルの両方の日本語アニュアルだ。ソフトウェアマニュアルが OS Ver 3.10 用になっている。国内販売前のバーションは 3.00 だ。現時点では OS アップデートファイルはまだ公開さないが、国内おカシオサイトや Casio World Education Website で近々ダウンロード可能になると思われる。恐らく同時に fx-CG20 を OS 3.10 にアップデートできるようになるようだ (OS 3.10 ソフトウェアマニュアルは fx-CCG20 OS 3.10 と共用のため)。
[2018/08/09 追記]
ソフトウェアマニュアル日本語版が Ver 3.11 にアップデートされていて、カシオの日本語サイトからダウンロードできる。アメリカ市場において2018年3月以降製造のfx-CG50には OS 3.11 がインストールされており、国内販売品もいずれ OS 3.11 がインストールされるようになるかも知れない。

[2018/08/09 追記・修正] OS 3.11 へのアップデートファイル公開
Casio World Education Website のサポートページ ([Accept] をクリックして先に進む) から OS3.11 へのアップデート用アプリとアップデート方法の説明書 (PDF) をダウンロードし、説明書に従って作業を進める。アップデートアプリの指示があるまで電卓とPCを接続してはダメと書かれているので要注意。

[2018/08/09 追記・修正] OS 3.11 へのアップデート
ダウンロードしたアップデート用アプリ (fx-CG50 Sries OS Ver.3.11 Update.exe) をPCで実行すると、私の場合は 日本語 Windows 10 Home だが、自動的に日本語表示でアプリが起動。注意深く表示に従って作業を行うと、アドイン 3D-Grph もアップデートするように聞いてくるので一緒にアップデート。 [MENU] - System - [F4] (Version) で確認すると OS は 3.11.0202 に、3D Graph は 01.02 になる。


なお、fx-CG50 は言語を選択できますが、OSアップデートしても日本語は選べません。言語の選択肢に中文も含まれているので日本語対応も容易だと思います。スタンダード関数電卓 fx-JP900 は表示が日本語化されているので、このデザインコンセプトを引き継いだ fx-CG50 もいずれ日本語表示に対応することを期待します。

 
はじめに

Casio Basic の機能に着目すると、以下に列挙した機種が同じカテゴリに含まれるプログラム電卓です。

 - 2006年発売 fx-5800P 
 - 2007年発売 fx-9860G (OS Ver 2 以降)、生産中止
 - 2009年発売 fx-9860GII
 - 2011年発売 fx-CG10 PRIZM (北米のみ)、fx-CG20とほぼ同じ
 - 2012年発売 fx-CG20 (fx-CG10 PRIZM の約1年後)
 - 2013年発売 fx-FD10 Pro
 - 2017年発売 fx-CG50 (欧米先行、2017/10/20国内発売)

fx-CG50 は fx-CG10 PRIZM / fx-CG20 の後継機種です。1つ前に発売されている fx-FD10 Pro は、fx-9860GII のハードウェアを利用しながらアドインが使えず Casio Basic 専用機である点で異質な存在です。
 
 
fx-CG50 の位置づけ [2017/08/07 更新]
Casio Basic に着目すると、fx-CG50 の位置づけが明確に見えてきます。
  • fx-9860GII:モノクロ液晶搭載の最上位機。
  • fx-CG10 PRIZM / fx-CG20:fx-9860GII のディスプレイを高精細&カラー化したもの。しかし Casio Basic では テキスト、グラフィックずれも画面出力処理が極めて遅く、fx-9860GII の方が遙かに速い。カラーだが出力が遅い fx-CG10 / CG20 が良いのか、モノクロだが出力が速い fx-9860GII が良いのか、2機種の甲乙を付けられない状況だった。言い換えれば、fx-CG10 / 20 は必ずしも fx-9860GII の後継機種とは言えないのだ。
  • fx-CG50:高精細カラー液晶へ出力が大幅に高速化したのが最大の改善点で、fx-9860GII と同レベルになった。
fx-CG50 の Casio Basic は、カラーと高精細に関係するコマンドを除けば fx-9860GII と互換です。fx-9860GII で作った Casio Basic は、fx-CG50 でほぼ同じ出力速度で動作します。

互換性の無いコマンド:
※ パラメータ見直しが必要なコマンド:PxlOn、PxlOff、PxlChg、PxlTest(
※ 転送時に自動的にパラメータが変更されるコマンド: Text

fx-CG50 は、fx-9860GII をカラー化した後継機種、現時点での最上位機と位置づけられます。
 
 
ハードウェア機能
fx-CG50 は、fx-CG20 から内部のハードウェアが変更されています。CPU は同じものを使いながら、処理速度を向上させ、一方で消費電力が抑えられ、バッテリー駆動時間が延びました。RAM (ストレージメモリ) は、fx-CG20 の SRAM から fx-CG50 では SDRAM に変更されています。

fx-CG50 の省電力化 (fx-CG20 との比較) ※2
動作モードfx-CG50fx-CG20省電力化の傾向 ※3
電源OFF 0.1 mA 以下 0.1 mA 以下---
電源ON
 RUN-MAT待機状態、輝度1※1 2.5 mA (10.0 mA) 3.0 mA (14.3 mA)16.7% (30.0%)
 RUN-MAT待機状態、輝度3 ※1 5.5 mA (13.0 mA) 8.3 mA (21.0 mA)33.7% (38.1%)
 RUN-MAT待機状態、輝度5 ※1 9.5 mA (18.0 mA) 16.4 mA (30.8 mA)42.1% (41.6%)
 Casio Basic実行、輝度1 ※1 21.1 mA (22.2 mA) 23 mA (30.3 mA)8.3% (26.7%)
 アドイン実行、輝度1 ※1 39.8 mA (40.4 mA) 38.0 mA (50.0 mA)-4.7% (19.2%)
※1: カッコ内は USB接続状態、※2: sentaro様ご提供の測定値 を使用
※3: 省電力化の傾向 (%) = ( CG20の値 - CG50の値 ) / G20の値 × 100

同じ CPU を使っているので、電流値の変化が消費電力の変化と見なします。
処理速度については、関数や Casio Basic の処理内容に応じた比較測定の結果を以下で紹介します。
 
 
ソフトウェア
 fx-CG50 のソフトウェアは、ハードウェアの違いを吸収する OS が Ver 3 にバージョンアップしています。表に出てくる関数機能や Casio Basic の機能面では違いが見られません。アドインについては、ROM や RAMに直接アクセスしたり、SRAM からSDRAM に変更された RAM の違いの影響が現れるようなコードが使われていない場合は、fx-CG20 と fx-CG50 では同じアドインプログラムが動作します。fx-CG50 になってもアドインの拡張子が g3a と変わっていないことも互換性の高さを裏付けています。

fx-9860G と fx-9860GII にはアドイン作成用のカシオ公式SDKが公開されていますが、fx-CG20 以降は公式なSDKがありません。従って、カシオ純正あるいは公認の アドイン (g3a) ファイルなら fx-CG20 と fx-CG50 での互換性は保たれると考えても良さそうですが、サードパーティや個人が作成したアドイン (g3a) ファイルは、使用に際して fx-CG50 での動作確認がされているかに注意が必要です。 

さて Casio Basic については、fx-CG20 とfx-CG50 は完全互換です。違いを探していますが、未だに見つかっていません。プログラムファイルの拡張子も同じで g3m のままです。
 
 
キー入力の問題
CG50 Ten Keys 

写真に写っている大きなキートップのテンキーなどは、キーの右側を軽く押すときに入力を受け付けないことがあります。キーの左側を押す時は問題ありません。他の所有者の fx-CG50 でも同じ問題があることが分かりました。

慣れれば問題ないかも知れません。しかしチャッチャッとキーを速く軽く叩く使い方は特殊でないでしょうし、そのような使い方では入力を受け付けないことが確実にあります。もぐら叩きゲームのようなテンキーの早押しが必要な場合は、慣れの問題ではなくて避けられない問題となるかも知れません。そこで特に必要性は無いけれど面白そうなので、もぐら叩きゲーム fx-5800P 版を移植して fx-CG50 版を作り 遊んでみました。急いでキーを叩く際、どうしてもキー入力の不備からゲーム進行が不利になります。

この不具合は、キーのバネ機構と接点パネルに関する設計や組み付け工程の問題、或いはこれらの複合的問題によると推察しています。この不具合をカシオが認識して、国内発売までに改善するのかどうかに興味があります。

fx-5800P のカバーヒンジの問題、fx-JP900 のハードカバーの問題 (問題は既に指摘、整形の問題のないロットの存在については今後記事にするかも...) に続いて、今回 fx-CG50 テンキー問題も出てきました。とても残念です。
 

 
目 次

1. 海外から直接購入


2. 到着したパッケージ

3. 外 観

4. 他機種との比較
 4.1 地味な改善 - バーコード & シリアルのラベル

5. ダウンロード
 5.1 OSアップデート
 5.2 取扱説明書
 5.3 アドインプログラム
 5.4 サポートソフトウェア

6. データ転送
 6.1 PCとのリンク
 6.2. 電卓同士のデータ転送

7. バックアップ

8. ハードウェア
 8.1 キー入力
 8.2 液晶表示

9. 関数電卓としての機能
 9.1 ユーザデータのバックアップ機能
 9.2 3桁区切り表示
 9.3 複素指数関数
 9.4 積分関数の処理速度
 9.5 周期関数の積分

10. Casio Basic の互換性

11. カタログ機能

12. Casio Bsic の処理速度
 12.1 計算主体
 12.2 動きのあるテキスト出力
 12.3 動きのあるグラフィック出力

13. さらなる高速化
 13.1 オーバークロック
 13.2 アドイン版Casio Basic (C.Basic)
 

 
海外から直接購入

[2017/07/28 追記]
Amazon USA で日本への輸出が可能な fx-CG50 の取り扱いが始まっています。sentaro様が ここから購入したところ、驚くほど短時間で入手したとの情報がありました。Amazon USA での購入が、推奨可能な候補として浮かび上がりました。注文から配達までの概要は以下の通り(この場合は僅か3日で配達!);
場所日付・現地時間状況
某所2017/07/27配達完了
大阪2017/07/26 20:20最終配達の手配

2017/07/26 11:10輸入通関

2017/07/26 10:19空港到着
アンカレッジ、アラスカ州2017/07/25 9:05空港出発

2017/07/25 7:03輸出通関

2017/07/25 5:55空港到着

2017/07/25 2:16空港出発
オンタリオ、カリフォルニア州2017/07/24 22:47空港到着
シアトル、ワシントン州2017/07/24 20:18空港出発
ケント、ワシントン州2017/07/24 15:19現地営業所スキャン
セラー (出荷)2017/07/24 18:31 (ET)UPSへの引き渡し

※ これはかなり理想的なケースだと思われ、Amazon USA で購入しても必ずこんなに速く配達されるわけでは無さそうです。というのも、Amazon USA でポチッとしたのが月曜(平日)で、即日セラーから出荷されたこと、東海岸のセラーから日本向け飛行機が飛ぶ西海岸までの輸送が陸送でなく航空便が使われたこと、さらにアメリカの東海岸から西海岸までの3時間の時差に助けられて見かけ上時間が短縮されていること、そして日本向け飛行機での配送が即日行われたこと(一旦貨物が集まるまで滞留させなかったこと)、日本到着時が平日で即日通関されたこと、など全ての良い要因が重なっているからです。
  • 概要: 国内のショッピングサイトでは fx-CG50 の並行輸入品の扱いが見つからなかったので、今回はアメリカの eBay で直接購入しました。海外品を買うには、セカイモンeBay などで購入して国際貨物で送って貰うことになります。このような個人輸入の場合、国際貨物の扱いや輸入手続きは業者が全てやってくれるので、個人輸入という実感はあまりありません。セカイモンは手数料を取って国際貨物や輸入通関まで全て面倒をみてくれ、さらに日本語で注文できるので、かなり楽です。eBay の場合は国際配送を引き受けるセラー(Seller、業者)が出品している場合は購入者は何もしなくて良いのですが、国際配送をやっていないセラーから買う場合は、国際配送業者を別途利用する必要があります。
  • eBay での商品選び: eBay の場合は、実績と評判のあるセラーから購入した方が良いと思います。Top-rated Seller (高評価のセラー) といった表示があるので、そのセラーのページで確認して自分なりに納得してから決められます。新品 (new in box) といった表示で新品が確認できない時は中古の可能性もあるので、確認しましょう。fx-CG50 の場合でも、安いものの中には注意深くみてゆかないと中古品だと気づかない紛らわしいケースがあります。新品が欲しい場合は要注意です。
私の場合は、fx-CG50 新品の本体価格が¥10,915、輸送費が ¥2,316 でした。輸送費用の傾向として、ヨーロッパの方が北米よりもかなり高いので、北米のセラーから購入する方がお得になることが多いです。
  • セカイモンと eBay のコストの違い: セカイモンは、 eBayと提携しているので eBay と同じセラーからの同じ商品が同じ本体価格で購入できます。違いは、ページでの提示期間と配送手数料です。セカイモンの方が早く締め切る傾向があり、購入する場合は即決に近い判断が必要なケースが多いようです。日本語で買える安心感、国際配送と通関手続きがお任せのセカイモンは、その分手数料が高いと思います。英語でも良いなら eBay の方が商品提示期間が長く多少でも余計な手数料を取られず、お得です。
  • セカイモンと eBay の配送期間の違い: いずれにしても配送時間は最低2週間と普通の国際便よりは時間を要します。今回 eBay USA を初めて使って、とにかく時間がかかることがよく分かりました。アメリカ国内のセラーから国際発送を行うセンターまで陸送で一旦貨物が集められ(カリフォルニアから日本とは逆方向のケンタッキー)、そこでスグ日本へ送ることはなく、1週間程度滞留させるので、ここで余計な時間がかかります。国際便のコストを下げるためにある程度貨物をまとめる必要があるのだと理解しています。ポチッとしてから手元に届くまでの時間については、セラーの場所と国際配送センターの場所に依存するようで、どちらが速いかについては、なんとも言えないと思います。アメリカと日本の祝祭日の影響もありますので、ポチッとした日にも依存します。国際配送センターで多くの日本向け貨物がまとまれば滞留日数が短くなる可能性もあるでしょう。
私の場合は、
- 7/2 (日): ポチッとし決済
- 7/3 - 7/4 (月~火): 7/4が独立記念日で 7/3 も休みで連休、セラーはお休み
- 7/5 (水):セラーが出荷、UPS サンフランシスコセンターが受け取る
- 7/6 (木):UPS コネチカットセンターを通過 (アメリカ国内はトラック輸送と思われる)
- 7/7 (金):ケンタッキー州アーランガーにある国際配送センターに到着
- 7/13 (木):国際配送の FedEx に引き渡し。センターに6日も滞留していた
      ※ eBayに問い合わせたら、通常センターに1週間は留め置くと回答あり
- 7/14 (金):一旦テネシー州のメンフィスに寄り道 (おそらくここまでは陸送と思われる)
- 7/15 (土):メンフィスで輸出通関
- 7/16 (日):成田到着
- 7/17 (月):輸入通関、FedEx横浜営業所に到着
- 7/18 (火):横浜営業所で、何故だか丸一日滞留
- 7/19 (水):配達完了

  • 決済について:セカイモンは eBay と提携しており、eBay と PayPal は同じ傘下の会社なので、セカイモンでも eBay でも PayPal での決済ができます。PayPal での決済は、事前登録が必要ですが、決済手続きは日本語で可能、決済の記録も日本語で確認できるのが利点です。私は eBay で商品を探して、そのまま PayPal で決済しました。
  • eBay USA のカスタマーサポート:7/2に決済が済んでいるのに 3日たってもトラッキングの状況に変化がないことの問い合わせ、それから国際配送センターからの配送が6日間も留め置かれている状況の問い合わせを行いました。eBayのページからフォームを使って質問を送ったところ、いずれも12時間以内に返信があり、考えられる次の問い合わせを行うための細かい案内もありました。。
 
<目次に戻る>
到着したパッケージ

fx-CG50 Package 1  fx-CG50 Package 2 

ブリスタパッケージは、分厚いプラスチックがガッチリと融着されているので、楽には開けられません。厚いプラスチックをナイフで切るのは危険だから、しっかりしたハサミで周囲をカット。

items inside package 

fx-CG50 本体、Quick Start Guide、単四アルカリ電池4本 (試供品)、PCリンク用のUSBケーブル、ダウンロードや登録(アメリカのみ) の説明、保証書が入っています。CD や 3Pinケーブルは同梱されていません
 
 
<目次に戻る>
外 観

CG50 & JP900 1  

fx-JP900 (右) とそっくりです。
四角いオーソドックスな形状は落ち着きを与え、長く使っても飽きが来ない感じで、好きなデザインです。

キーの上の印刷された文字ですが、老眼の始まった私には、fx-JP900 の印刷はとても見づらいのですが、fx-CG50 ではフォントが大きく色のコントラストも向上して、見やすくなっています。

CG50 & JP900 2 

fx-CG50 に fx-JP900 を重ねてみます。fx-CG50 の大きさを感じます。

CG50 & JP900 3  CG50 & JP900 4 

fx-CG50 と fx-JP900 をカバー付き (左) とカバー無し (右) で重ねてみたところ。厚みが3倍くらい違うことが分かります。

写真では分かりにくいですが、筐体やカバーの表面は、fx-JP900 はツルツルのテカテカですが、一方 fx-CG50 は細かい凹凸があります。使っているウチに表目に細かい擦り傷が付いても、あまり目立たないのではないかと思います。

液晶部が一段低くなっていますが、保護ウィンドウが傷つきにくい感じなのは良いです。
というのも、fx-CG20 の透明な上部パネルは、まともに表面処理をしておらず簡単に傷つきます。私の fx-CG20 は新品購入時に既に細かい傷が多く付いていましたが、不良とは認めて貰えず製造上に発生するもので、こういうものだとの説明でした。この点が改善されたと思います。

foot  rubber foot 
fx-JP900 は成形で作った出っ張りで4カ所の足にしています。一方、fx-CG50 はゴム足です。但し fx-9860GII や fx-CG20 の黒いゴム足ではなくて、半透明になっています。黒いゴム足は、使い込んでくるとテーブルやノートにくっついて、黒い跡が残ることがあるのですが、その問題が無くなりそうです。

所有したくなるデザインの電卓だと思います。
 
 
<目次に戻る>
他機種との比較

Graphing Calcs 
左から、fx-CG50、fx-CG20、fx-9860GII、fx-5800P

 fx-CG50fx-CG20fx-9860GIIfx-5800P
 電池 単四 x 4 単四 x 4 単四 x 4  単四 x 1
 電池寿命 (メーカー測定基準) 170 時間 140 時間 200 時間 1年
 サイズ (cm) 18.6x89.0x188.5 20.6x89.5x188.521.2x91.5x184 15x82x163
 重さ (g) 230 230 225 150
 液晶ディスプレイ解像度
 ・Casio Basic グラフィック
 ・Casio Basic テキスト
 216 x 384 pixel
・187 x 379 dot
・7 x 21 文字
 216 x 384 pixel
・187 x 379 dot
・7 x 21 文字
64 x 128 pixel
・63 x 127 dot
・7 x 21 文字
 96 x 31 pixel
・---
・4 x 16 文字
 仮数 + 指数 10桁 + 2桁 10桁 + 2桁 10桁 + 2桁 10桁 + 2桁
 内部演算桁数 15桁 15桁 15桁 15桁
 プログラムメモリ容量 最大 ~61 KB 最大 ~61 KB 最大 ~62 KB 最大 ~28.5 KB
 メインメモリ (利用可能) ~61 KB ROM ~61KB ROM ~64 KB ROM ~26.5 KB
 ストレージメモリ  ~1.6 MB SDRAM ~1.6 MB SRAM ~1.5 MB SRAM ---
 プログラムファイル名 最大8文字 最大 8文字 最大 8文字 最大 12文字
 CPU SH4A (SH7305) SH4A (SH7305) SH4A (SH7305)
  クロック ~118 MHz ~59 MHz ~29 MHz ? MHz
 - FLL:  14,75 MHz x900 14.75 MHz x900 14.75 MHz x900 ---
 - PLL:  FLLx16, 235.93MHz FLLx16, 235.93 MHz FLLx16, 235.93 MHz ---
 - IFC: CPUコアクロック 1/2 PLL, 117.96MHz 1/4 PLL, 58.98 MHz 1/8 PLL, 29.49 MHz ---
 - SFC: SuperHywayバスクロック 1/4 PLL, 58.98MHz 1/8 PLL, 29.49 MHz 1/8 PLL, 29.49 MHz ---
 - BFC: メモリバスクロック 1/4 PLL, 58.98 MHz 1/8 PLL, 29.49 MHz 1/18 PLL, 29.49 MHz
 - PFC: I/Oクロック 1/8, 29.49MHz 1/16, 14.75 MHz 1/16, 14.75 MHz ---
sentaro様作成の カシオグラフ関数電卓用チューンアップツールを使用した結果、マニュアル記載の内容によります。


地味な改善 - バーコード &  シリアル のラベル [2017/08/06 追記]
fx-9860GII や fx-CG20 は、電卓裏側に バーコードとシリアルのラベルが貼り付けられています。当然ながら長らく使っているとラベルの印刷が摺り切れて読めなくなります。fx-CG50 では電池ケースの内部にラベルを貼っているので、摺り切れることはありません。地味だが大切な改善だと思います。

fx-9860GII Barcode & Serial Label fx-CG50 Barcode & Serial Label 
左の fx-9860GII のラベルは印刷が見えなくなっている。右の fx-CG50 のラベルは電池ケースの中に貼ってある。
 
 
<目次に戻る>
ソフトウェア ダウンロード

PCリンクソフト、出荷時に無いアドインは、CASIO Worldwide Education Website (WEW) からダウンロードできます。このページから
  • 上のメニューで Support をクリック、
  • 言語として English を選び (日本語が無い)、
  • Graphic Model を選び、
  • SOFTWARE LICENSE AGREEMENT で Accept をクリックする
これで、fx-CG50 Series のリソースダウンロードのページに行けます。
 
 
OSアップデート [2017/09/26 更新]
fx-CG50 本体で、[MENU] - [System] - [F4] (Version) で確認すると、OSバージョンは 03.00.0202 となっていました。
fx-CG50 のOS が 3.10 にアップデートできます。Casio World Education Website の Download Resoureces のページからダウンロードアプリと作業説明(PDF) がダウンロードできます。
 
 
<目次に戻る>
取扱説明書 [2018/09/23 更新]
日本語取扱説明書は、カシオ取扱説明書ダウンロードのページ から入手できます。

英語等多国語版は、Casio World Education Website の Download Resources のページから、User's Guide for fx-CG Series Handheld をクリックすると、各国語のハードウェアマニュアルとソフトウェアマニュアルがあるので、そこから入手できます。日本語版取扱説明書がまだ無かった時は、English 版をダウンロードしました。
- [PDF File] User's Guide Version 3.0 -Hardware- (English)
- [PDF File] User's Guide Version 3.0 -Software- (English)
 
 
<目次に戻る>
アドインプログラム
fx-CG50 のリソースダウンロードのページで、Add-in Software をクリックし、各種アドインプログラムをダウンロードできます。ダウンロードできるアドインの中で、私の fx-CG50 に購入時にインストールされていなかったのは、Probability Simulation だけです。
アドインのインストールマニュアル - 日本語版
Add-in Software の下の User's Guide for fx-CG Sries Handheld のさらに下に  [PDF File] Installation Guide をダウンロードしてみると、各国語別のガイドがありますが、ナント日本語版が含まれていました。
 
 
<目次に戻る>
サポートソフトウェア
Screen Receiver - 電卓画面をPCで表示するソフト
fx-CG50 のリソースダウンロードのページで、Support Software をクリックし、Screen Receiver がダウンロードできます。バージョンは 3.02 で、fx-CG20 /10 用と同じバージョンで、共通して使えます。
 
  
<目次に戻る>
データ転送
 
PCとのリンク


標準添付の USBケーブルを使います。
USBケーブルで fx-CG50 と PC を繋ぐと、fx-CG50 の液晶での表示が接続モード (Connection Mode) になります。
ここで、[F1] (USB Flash :[F1]) を押すと、ポップアップウィンドウで Preparing USB と表示され、少し待つと接続完了です。

後は、エクスプローラで fx-CG50 がドライブとして表示されるので、PC上と同じ操作でファイルのやりとりができます。 

PCLink_PCDisp 
fx-CG50 内のフォルダ / ファイル はこのように表示されます。ここで、System Volume Information フォルダがありますが、fx-CG50 ドライブに名前を付けたことで作成されたものです (日付けを見れば後から作成されたことが分かりますね)。

fx-CG50 を接続した時のドライブには最初は名前が無いので、FX-CG50 と名前を付けました。ドライブを右クリックしてプロパティを選び、そこで名前を入力できます。

CG50 PCLink Drive Name 

さてPCと接続中の fx-CG50 の液晶画面には、fx-CG20 には無かった新しい === Caution === 画面 が Tips 画面 (fx-CG20と同じ) と交互に表示されます。ここでは、「ケーブルを抜く前にPCのUSB接続を終わらせてください」と書かれています。Windows PCの通知領域 (タスクトレイ) で「ハードウェアを安全に取り外してメディアを取り出す」で [CASIO MassStrage Device の取り出し] をクリックします。外付け USBハードディスクや USBメモリの取り出しと同じ操作です。
 
 
<目次に戻る>
電卓同士のデータ転送

3Pinコネクタの接続ケーブル (SB-62) を使って2つの電卓を繋ぎ、接続する両方の電卓で CABLE (ケーブルの選定) で [F2] (F2:3Pin cable) を設定後、一方で TRANSMIT (送信)、他方で RECV (受信) に設定すれば、データのやりとりができます。このケーブルは、fx-9860GII には標準添付されていましたが、fx-5800P、fx-CG20 そして fx-CG50 には標準添付されていません。以前 SB-62 のみを購入した時は ¥2,700 でした。

プログラムを含むデータのやりとりができるのは、fx-9860G、fx-9860GII、fx-CG20/10、fx-CG50 (および fx-9860G あたり以降のグラフ関数電卓) で、Menu に Link 項目があって、3Pin コネクタが付いている機種です。なお、fx-5800P 同士なら、このケーブルを使ってデータ転送可能ですが、fx-5800P と グラフ関数電卓とのデータ転送はできません。

詳しくは、Sofware Manual に書かれているので確認できますが、使ってみれば分かると思います。

[2017/07/28 追記]
fx-CG50 から fx-9860GII へ転送すると、ファイル形式は g3m から g1m へ自動変換され、カラーや細線設定など、fx-9860GII で未対応のコマンドは @ に自動的に置き換えられます。
 
 
<目次に戻る>
バックアップ

万一に備えて、電卓内部のデータをバックアップしておくことを勧めます。PCに保存フォルダを作り、PCとのリンク機能を使って電卓内のデータをPCの保存フォルダに丸ごとコピーしておきます。
PCLink_PCDisp 
購入時のバックアップ、そして適宜バックアップをすると良いと思います。特にオーバークロックを行う場合は、エラー発生時に電卓のリセットが必要になりプログラム、データやプログラムが失われることもあるので、バックアップしてあればこれらを簡単に戻せます。
 
 
<目次に戻る>
ハードウェア

CG50 & CG20 
主に fx-CG50 と fx--CG20 を比較します。
 
 
キー入力
キー配置や各キーに割り当てられている機能は、fx-CG20 と全く同じ。
 
 
<目次に戻る>
液晶表示
液晶のサイズや精細度も fx-CG20 と同じ。
手持ちの fx-CG20 と fx-CG50 を比べる限りでは、明るさや色合いが少し異なっています。

LCD CG50 & CG20 
左が fx-CG20、右が fx-CG50

同じ明るさ設定で比較して気がつくのは、右の fx-CG50 は黄色みがかって少し暗く見えます。fx-CG50 で明るさ設定を 3/5 から 4/5 に変えると明るさは同等になりますが、それでも黄色みがかっています。消費電力低減への寄与もありそうです。

[2017/07/23 追記]
このカラー液晶の輝度と色については、バラツキがあるようです。sentaro様所有の個体は逆の傾向だとコメントを頂きました。
 
 
<目次に戻る>
関数電卓としての機能

fx-CG50 のキーの種類と数、および配置は、fx-CG20 と同一です。fx-9860GII には [SHIFT] [5] (FORMAT) が有りませんが、それ以外は同じです。関数機能も同じです。計算の内部桁が15桁と同じで、各関数の精度範囲も同じなので、fx-CG50 の関数電卓としての使い勝手は fx-CG20 や fx-9860GII と同じです。
 
 
<目次に戻る>
ユーザーデータのバックアップ機能
カシオのスタンダード関数電卓は電源をオフにすると、作業内容やユーザーデータが消えますが、fx-CG50 は各モードでのユーザーデータは一旦電源を切ってもバックアップされます。他のプログラム電卓 fx-5800P、fx-9860GII、fx-CG20 もバックアップされます。

資格試験で使えると称しているスタンダード関数電卓は、数式などが保存できると都合が悪いからバックアップできない仕様になっていると思われます。バックアップ機能だけでも、プログラム電卓を関数電卓として使う価値があると思って、私は日常的にプログラム電卓を関数電卓として使っています。
 
 
<目次に戻る>
3桁区切り表示
カシオの最新のスタンダード関数電卓 fx-JP900 / 700 / 500 では、関数電卓として3桁区切りが登場しました。一般電卓には3桁区切りは普通に搭載されている使い勝手の良い機能なので、登場が遅すぎるようにも思います。

これまでのプログラム電卓には3桁区切り機能は無く、fx-CG50 に3桁区切り機能の登場を期待しましたが、残念ながら対応していません。fx-CG50 のソフトウェアが fx-CG20 から殆ど変わっていない結果とも言えます。デザインは fx-JP500/700/900 を踏襲したので、3桁区切りについても踏襲して欲しいわけで、OSアップデートによる追加対応という現実的な方法もあります。カシオには是非対応して頂きたいと思います。

[2017/11/08 追記]
Casio Basic での出力コマンドにも3桁区切り機能がありません。しかし、作ったプログラムに3桁区切り出力機能を付加することは出来ます。
Casio Basic入門59, Chapter 10-5:3桁区切りサブルーチン グラフ関数電卓版
 
 
<目次に戻る>
複素指数関数
複素数を表示するように設定して、計算させてみると、fx-5800P はエラー、fx-9860GII と fx-CG20 は正しく計算結果を表示します。fx-CG50 でも同様に複素指数関数を正しく計算します。

 CompCalc1 CompCalc2 
 
 
<目次に戻る>
積分関数の処理速度
 
積分計算速度の比較をしてみます (Rad モード)。
機種積分1積分2
fx-JP9005.5秒48.7秒
fx-5800P10.1秒56.7秒
fx-9860GII (SH4A)1.5秒8.4秒
fx-CG201.0秒5.8秒
fx-CG500.7秒3.2秒
積分の詳細はこちら



積分計算は fx-CG50 で高速化しています。三角関数の計算が特に高速化していることが分かります。
 
 
<目次に戻る>
周期関数の積分 [2020/05/23 修正]
積分計算にガウス・クロンロッド法が使われていることから、このアルゴリズムが苦手な多項式で表せない関数の代表選手として周期関数の積分を行って、タイムアウトする限界を比較してみます (Rad モード)。

積分3
機種計算できる nタイムアウトする n
fx-JP900n ≦8n > 9
fx-5800Pn ≦ 8n > 9
fx-9860GIIn ≦ 60, n = 64, 128, 256, 512n ≧ 61 (n ≠ 2m, 6≦m≦9)
fx-CG20n ≦ 60, n = 64, 128, 256, 512n ≧ 61 (n ≠ 2m, 6≦m≦9)
fx-CG50n ≦ 60, n = 64, 128, 256, 512n ≧ 61 (n ≠ 2m, 6≦m≦9)
 積分の詳細はこちら



fx-CG50 は、fx-CG20 や fx-9860GII と同じなので、積分計算の内部ロジックは変わっていないようです。
 
 
<目次に戻る>
Casio Basic の互換性

当ブログは Casio Basic がメインテーマなので、少し詳しく解説します。

fx-CG50 に搭載されている Casio Basic は、2006年に発売された fx-5800P とそれ以降に発売されたグラフ関数電卓が同じカテゴリに属します。これらに搭載された Casio Basic は、構造化プログラミング可能で意外に高機能です。当ブログでは、このカテゴリを新世代 Casio Basic と呼んでいます。

< 新世代Casio Basic搭載機 >
 - 2006年発売 fx-5800P
 - 2007年発売 fx-9860G (OS Ver 2 以降)、生産中止
 - 2009年発売 fx-9860GII
 - 2010年発売 PRIZM fx-CG10 (北米のみ)、fx-CG20と同じ
 - 2012年発売 fx-CG20
 - 2013年発売 fx-FD10 Pro
 - 2017年発売 fx-CG50

新世代 Casio Basic については、Casio Basic の勧め を参考にしてください。

fx-CG50 搭載の Casio Basic は、機能面で fx-CG20 と異なる点が見つかりません。現時点では完全互換と言って良いと思います。そこで、fx-CG20 について、fx-9860GII や fx-5800P との比較を行った記事がそのまま fx-CG50 に該当します。

 ⇒ fx-CG20 の概要
 ⇒ fx-9860GII への移植 - 厄介な旧来の命令

当ブログで公開している Casio Basic入門逆引きCasio BasicCasio Basicコマンドリファレンスプログラムライブラリ は、fx-CG20 に関するものは、そのまま fx-CG50 に適用できます。
 
 
<目次に戻る>
カタログ機能

fx-CG50 には fx-CG20 と同様に使えるコマンドの一覧を検索して入力できるカタログ機能が備わっています。コマンド入力ができるモードで [SHIFT] [4] (GATALOG) を押すと、カタログ画面が現れます。

Catalog 1 CG20 Catalog 1 

左が fx-CG50 で、右が fx-CG20 です。

左の画面には、HISTORY というメニューと 表記 "Catalog" の右に検索入力欄が増えています。過去に検索して入力したコマンドを再入力するためには HISTORY 機能は大変便利です。 検索入力に1文字入れると絞り込み検索が行われるので、コマンドがうろ覚えの時に便利です。

CATメニューを選ぶとジャンル別一覧が現れます。

atalog Graph 1 

例えば 4: Graph でジャンルを選ぶと以下の画面になりますが、ここで fx-CG50 と fx-CG20 で違いがあります。

Catalog Graph 2 CG20 Catalog Graph 2 

左が fx-CG50、右が fx-CG20 です。

右の fx-CG20 では、コマンドのリストが表示されます。
左の fx-CG50 で表示されるリストは、コマンドではなくて説明です。この下のレベルでさらに説明のリストが現れることもあります。かなり分かり易く改善されています。

なお、CAT メニューから 1:All を選ぶと、全てのコマンドがアルファベット順に表示されます。このリストを fx-CG50 と fx-CG20 で比較した結果、同一でした。Casio Basic 使えるコマンドの種類が全く同じだと分かります。 
 
 
<目次に戻る>
Casio Basic の処理速度

fx-CG20 向けの作成したプログラムが そのまま fx-CG50 で動作するのは、ユーザーとしては助かります。fx-CG50 では処理速度の向上が見らるので、具体的に調べてみます。

 計算主体

PRIME - 素因数分解

ダウンロード
- fx-5800P用 pdf ファイル
- fx-9860GII用 g1m ファイル
- fx-CG50 / fx-CG20用 g3m ファイル

※ 使い方やプログラムソースについては、fx-9860GII への移植 - 素因数分解 参照

プログラムを起動すると...

Prime1 
数値を入力して [EXE] で素因数分解を始め、[EXE] を押しながら結果を1行ずつ表示させる。

Prime2 Prime3 
表示が出たら、最後の行を示すので、これで素因数分解の全結果となります。

このプログラムの実行中は、ビジーマーカー以外に表示の更新が無いので、計算速度の比較に向いています。今回は、以下の10桁の数の素因数分解の計算時間を比較します。

計算する数値: 7,849,516,203 = 32 x 9811 x 88897

fx-CG50 の画面は以下のようになります。

   Prime4 Prime5 

機種別処理時間の比較
fx-CG50fx-CG20fx-9860GIIfx-5800P
46秒63秒89秒444秒
11.361.939.65
0.7312.677.05
0.520.7118.73

fx-CG50 の計算処理は、fx-CG20 より 30% 程度速くなっています。
  
<目次に戻る>
動きのあるテキスト出力

PYTHA - ピタゴラス数探索

ダウンロード

- fx-5800P用 pdf ファイル
- fx-9860GII用 g1m ファイル
- fx-CG50 / fx-CG20用 g3m ファイル

※ 使い方やプログラムソースについては、fx-9860GII への移植 - ピタゴラス数 を参照。

このプログラムを起動すると1つめのピタゴラス数を表示して一旦停止します (左の画面)。
2行目の EXE:Next (-):Stop に変化するまで [EXE] キーを長押しすると、連続的に次々とピタゴラス数が表示し続けます。
そして、右の画面のように500個のピタゴラス数を探索して表示するまでの時間を計って比較します。
    Pytha 1 Pytha 500

[EXE] キーを長押しすると連続モードになって、A、B、C 1組のピタゴラス数が、次々に変化します。つまり、このピタゴラス数探索プログラムは、テキスト表示が常に更新し続けます。
そこで、500個のピタゴラス数が見つかるまでの時間を、機種別に比較してみました。

機種別処理時間の比較
fx-CG50
fx-CG20
fx-9860GII
fx-5800P
87秒
185秒93秒
441秒
12.121.075.07
0.4710.502.38
0.941.9914.74
0.200.420.211

fx-CG50 は、fx-CG20 の2倍程度の処理速度、fx-9860GII とほぼ同等の処理時間。
fx-CG20 は、動きの有るテキスト表示が重すぎて、実用プログラムを走らせるには向かなかったが、その問題が解決されています。

液晶画面の右上にビジーマーカーが表示されますが、fx-CG20 では常に表示し続けているのに対して、fx-CG50 では表示されていない時間が長い点に気付きました。fx-CG50 では ディスプレイへの転送をコマンドごとでなくてある程度まとまって行っている可能性がありそうです。それに伴ってビジーマーカー表示が間欠的になっているのかも知れません。
 
<目次に戻る>
動きのあるグラフィック出力

MONTECAR - モンテカルロ法による円周率計算

ダウンロード
- fx-9860GII用 g1m ファイル
- fx-CG50 / fx-CG20用 g3m ファイル

※ 使い方やプログラムソースについては、fx-9860GII グラフィックス - モンテカルロ法 を参照。この記事では、実際の画面の変化を動画で見られます。

 Montecar_1 Montecar_2 

 Montecar_3 Montecar_4 

[EXE]
キーを押すと、ランダムに点を打ち始め、それが円内にある割合から円周率を求める、モンテカルロシミュレーションプログラムです。このプログラムは、動きのあるテキスト表示と動きのあるグラフィックス描画を同時に行います。

そこでランダムに500回点を打つまでの時間を、機種別に調べて比較してみました。
機種別処理時間の比較 
fx-CG50
fx-CG20
fx-9860GII
174秒
429秒
135秒
12.470.78
0.4110.31
1.23.181

fx-CG50 は、fx-CG20 の 2.5倍の処理速度を達成。しかし fx-9860GII の 80% 程度の処理速度しかありません。

グラフィック表示の処理時間は fx-CG50 でかなり改善されているとは言え、あまり得意な処理ではないことが分かります。
カシオのグラフ関数電卓は、数学教育目的でグラフを表示することが主眼で、速い動きで変化示す処理は重視していないんでしょう。
 
<目次に戻る>
さらなる高速化

fx-CG50 は、fx-CG20 の極めて遅い出力処理を改善していることが分かったのですが、それでもゲームなどのピクセル単位での描画が多いプログラムでは全く不十分です。Casio Basic をより高速化するには、現在のところ2つの可能性があります。1つはチューンアップ (オーバークロック) による高速化、もう一つはアドイン版 Casio Basic (C.Basic) の利用です。

チューンアップ
これまで、fx-9860G、fx-9860GII そして fx-CG10 PRIZM / fx-CG20 それぞれの専用オーバークロックツールが、sentaro様により提供されてきています。いずれも比較的安全性が確保されており、私も愛用しています。但しオーバークロックは、ROM 内容が異常になったり、いずれかのチップが損傷をうける可能性があり、これらの結果電卓が正常動作しなくなった場合でもメーカー保証を受けられないので、自己責任で利用しましょう。

Casio グラフ関数電卓を限界までチューンアップ

本ブログでは、作者の sentaro様へ直接質問できるように、以下のエントリーがあります。このエントリ-では、fx-CG20 用の Ptune2 の紹介もしており、サポートも受けられます。
 ⇒ fx-9860GII のオーバークロック - Ftune2 -

fx-CG50 用のオーバークロックツール Ptune3 の開発も始まっていますが、まだβ バージョン段階で、今後一定の安全性を確保しつつさらに高速化できる可能性があります。そこで安定版リリースまでは、以下のエントリ-で情報交換を行います。
 ⇒ fx-CG50 のチューンアップ

ちなみに、各機種をチューンアップして上で紹介した モンテカルロ法による円周率計算の処理時間を比較します。

チューンアップした機種別処理時間の比較 
fx-CG50 tuned by Ptun3
fx-CG20 tuned by Ptune2
fx-9860GII tuned by Ftune2
97秒 (174秒)
108秒 (429秒)
23秒 (135秒)
1.8倍高速化4倍高速化5.9倍高速化
11.110.24
0.9010.21
4.214.701
カッコ内は標準での処理時間

チューンアップは、CPUコアクロックだけでなく、メモリバスクロック、I/Oバスクロック、ウェイトなどを機種に応じて調整します。ここでは、チューンアップの潜在能力を示すだけなので、個別のチューンアップ設定は割愛します。

fx-9860GII の標準での処理時間が 135秒なので、fx-CG50 も fx-CG20 もそれ以上に高速化できています。fx-9860GII はチューンアップで桁違いに速くなっています (これが現時点での fx-9860GII の利点とも言えます)。fx-CG50 用の Ptune3 の今後の進展が楽しみです。
 
アドイン版 Casio Basic (C.Basic)
C.Basic は、現在のところ fx-9860GII 専用版のみの開発が続いています。開発者はチューンアップツールと同じ sentaro様です。

C.Basic は、純正Casio Basic のソースをほぼそのまま実行可能で、特にグラフィック描画の高速化は目を見張るものがあります。
どのくらい速いかは、ここ にある動画を見れば一目瞭然です。現在は、主に海外からの要望に応えつつ、バージョンアップが進んでいます。

現在では、fx-9860G シリーズ用の C.Basic for FX と fx-CGシリーズ用の C.Basic for CG が公開されています。
C.Basic のトップページ
C.Basic for CG のトップページ

[2017/11/01 追記]
なお、fx-CG50 向けの C.Basic for CG の開発が始まっています。C.Basic の処理速度はアドインに近いものになります。この記事では、同じロジックでアドインとCasio Basic のグラフィック描画速度の違いから C.Basic for CG のポテンシャルの高さを紹介しています。公開されるのが楽しみです。公開されています。

 




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ





keywords: CasioBasicプログラム電卓、fx-CG50

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

fx-CG50 - C.Basic パックマン風ゲーム, PM

2021/04/03


e-Gadget の壁 (掲示板) に ChangRing様から C.Basic for CG で作成したゲームプログラムの投稿がありました。

PM_Screen


昔懐かしいアーケードゲーム - パックマン風のゲームです。矢印キーで e を動かして、全ての  の上を通り過ぎればゲームクリア。βe に近づこうと動き、位置が重なると CRASH と表示されゲームオーバーとなります。

プログラムファイルが PM.g3m なので、プログラム名を PM と呼ぶことにします。
 PM のダウンロード

このプログラムは、C.Basic for CG で動作します (純正 Casio Basic では動作しません)。
C.Basic for CG のページ

PM を起動すると、以下のような画面が表示されます。
PM_Startup_Screen

最高得点が表示されています。ゲームをクリアして、それが最高得点の場合は、その得点が PM.bin に保存されます。PM 起動時に PM.bin にアクセスし最高得点を取得し、それが表示されるようになっています。

作者の ChangRing様のコメントを紹介します;
パッ〇マン風なゲームをC.Basicで作ってみました。
敵が追いかけてきたり来なかったりしますが、それも味わいということで。
衝突判定をワンテンポ遅らせているので、そこを利用するとクリアできます。
私は中学生の時にポケコンという世代ですが、久しぶりに楽しかったです。
C.Basicに関係している皆様に感謝です。

各面は自動生成されています。eβ の衝突判定に時差があるので、画面上 eβ が重なって見えていても e が逃げ続けられると CRASH にならずクリアできます。衝突判定をワンテンポ遅らせていることの効用です。
なお、最初に eβ が近くに配置されると、あっという間に CRASH していまいゲームオーバーです。管理人にとっては意外に難しいと感じます。

=====

以下のようなパターンだと、e を動かすと、β も同じ方向に移動し、クリアが難しそうです。
Dificult_Pattern

作者によれば、
横についてくるので、このパターンはクリアは難しいですね。
もっと画面が広いと縦についてくる敵をもう一匹用意するのですが、
なにぶん画面が狭いので、、、
各面は自動生成していますが、本当はあらかじめ1面から用意して
だんだん難しくしていくといいと思うのですが、そこは手抜きです(笑)
簡単に改造できると思うので好きにいじってください。
パブリックドメインソフトウェア扱いでお願いします。
とのことです。

そこで、難易度を変えて遊べるように改造してみました。

=====

PM.g3m の116行目に以下のような記述があります。

'----------
'%Wait 128


%Wait 128 は、作者がデバッグのために使い、最後はコメントアウトしています。

ここでウェイトを入れると難易度が低くなるようです。
そこで、116行目を %Wait w と変更し、プログラム開始冒頭で、w の値を 4, 2, 0 のいずれかを設定させるように改造してみます。

変更前
'#CBINT
ClrMat
{1,1}→Dim Mat B.L
If IsExist("PM")=0:Then
0→B[1,1]
Else
Load("PM")→Mat B
IfEnd
B[1,1]→U
ToStr(U)→Str 1
"HIGH:"+Str 1

=====

変更後
'#CBINT
ClrMat
{1,1}→Dim Mat B.L
If IsExist("PM")=0:Then
0→B[1,1]
Else
Load("PM")→Mat B
IfEnd
B[1,1]→U
ToStr(U)→Str 1
"HIGH:"+Str 1
""
" 1:easy"
" 2:normal"
" 3:hard(original)"
" ⇒Select mode:"?()→m
0→w
m=1⇒4→w
m=2⇒2→w
m=3⇒0→w

=====

"HIGH:"+Str 1 の末尾の を削除し、
赤文字部分を追加してみました。

このプログラムを PM2 としました。
PM2 のダウンロード

PM2 を起動すると以下の画面になります。
PM2_Startup_Screen

[1] を押すと w=4 の easyモード
[2] を押すと w=2 の normalモード
[3] を押すと w=0 の hardモード (これがオリジナルの PM と同じ) 
で実行されます。

これは改造の一例です。
皆様も改造して遊んでみてください。

最後に作者の ChangRing様のコメントです;
これを機会に
他の人も もっとゲームを作って公開してくれないかなあ、
と思います。





応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




keywords: プログラム関数電卓、fx-CG50、C.Basic、素因数分解、プログラミング、Casio Basic

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

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

fx-CG50 取れたゴム足 - クリーニングと補修

 
2021/01/19
追記 2021/01/20
追記 2021/02/06

Casio fx-CG50のゴム足

fx-CG50_case_s2017年7月に入手した fx-CG50 は、3年以上使い込んできました。白いプラスチックは、汚れが目立ちやすいので、定期的にアルコールやクリーナーで汚れを落としています。


さて、白いハードカバーと白い筐体の裏側には、それぞれ4つのゴム足が付いています。
New_Hard_Cover  rubber foot 

このゴム足は、白くて半透明のシリコンゴムで、デザイン上きれいです。しかし時間を経るに従い着色してきました。
Colored_Rubber 

全部で8個あるゴム足のうち、最も着色のひどいものは、こんな感じになっています。クリーナーで拭いても着色は取れません。

ところで、このゴム足は結構取れやすいのだと、当ブログの読者の皆様から聞いていました。私の場合は、幸運なことに購入後3年以上たって、ついに1個が取れました。

幸いなことに、取れたゴム足がスグに見つかり、そのまま元の位置に張り直しました。しかし一度剥がれたものは貼り直しても、やはりスグに取れてしまいます。

Colored_removed_Rubber 
このゴム足は、粘着剤シートで貼り付いていて、取れたときにシートの一部が折り返されていて、この写真のようにそのそのまま張り直しました。その時、粘着シートが着色していて、シリコンゴム自体はそれほど着色していないことに気づきました。

そこで、汚れた粘着シートは簡単に取り除けたので、シリコンゴムのゴム足と、ゴム足が張り付いていたところをアルコールで拭き取ってクリーニングしました。
Cleaned_Rubber 

シリコンゴム自体は、新品の時よりは多少は着色してしまっていますが、思ったよりも透明感が残っています。

これを接着して補修しました。

 
シリコンゴムの接着

ゴム足のシリコンゴムは、実は接着の難しい材料です。一方ハードカバーや筐体裏側は ABS樹脂で、多くの接着剤が適用できる材料です。余談ですが、シリコンゴムを強力に接着できるのは、シリコーンベースの接着剤か、プライマを併用したシアノアクリレート系接着剤 (瞬間接着剤) くらいだと思います。

今回は、Permabond Engineering Adhesive 製の Permabond 105 と ポリオレフィンプライマ (POP) を使いました。かなり以前から手元にあったものです。

[2021/01/21 追記] ネットで検索すると国産品でシリコンゴムを接着できるものが見つかります。試してはいませんが、それらでも補修できると思います。

シリコンゴムは上下があり、逆向きだと穴にうまく収まらないので注意が必要です。そしてシリコンゴムの接着する面に綿棒で POP を塗り、105をできるだけ少量だけプラスチックの穴の中に載せます。ピンセットでシリコンゴムを穴にピッタリ合わせてから、しっかりと10秒程度押しつけます。このとき、指に接着剤が付かないように注意します。
Repaired_Rubber 

きれいに接着できました。
ちなみに、着色したゴム足と今回接着したゴム足を比べると、シリコンゴム自体の経年による着色が僅かで、きれいに補修できたことがわかります。
Before_After_Rubber 

さて、今回使った接着剤は、たまに使う程度で、普段は冷蔵庫に保管しています。使用前には、室温に戻るまで室内で放置してからキャップを開けるようにしています。室温よりも冷たい状態でキャップを外すと、接着自身やボトルの内側に結露し、それにより接着剤に水分が含まれやすくなります。これを抑えることが長期保存にはとても重要です。おかげで数年間性能の劣化が殆どなく保管できています。

かなりお気に入りの接着剤なので、メーカーのデモビデオを紹介します (音楽が鳴ります)。強力に接着できることがわかります。



今後、他のゴム足が取れそうになったら、取れて無くしてしまう前に、今回の方法で補修しようと思います。



[2021/02/06 追記]
上でゴム足1つを接着した時に使ったのは、海外の工業用接着剤メーカー Permabond Engineering Adhesives の製品が、手元にあったのでそれを使ったわけですが、これは一般には入手しにくいかも知れません。そこで、シリコーンゴムの接着ができて国内で入手しやすいものを使ってみました。シアノアクリレート接着剤とプライマのセットになっており、プライマの臭いは Permabond のプライマとかなり似ているので、その成分は似たものだと思われます。




今回はハードカバーのゴム足、残り3個 の着色した粘着剤を取り除き、エタノールで汚れを拭き取り、シリコーンゴムの接着面をプライマ 処理し、接着しました。
Whole_Repaird

シリコーンゴム本来の白っぽい半透明の色合いに、ほぼ戻りました。満足!!




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: CasioBasicプログラム電卓、fx-CG50

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

グラフ関数電卓 - 高速素因数分解、15桁対応

2020/08/15
追記:2020/08/15
修正:2020/08/17
追記:2020/08/21
追記・修正:2020/10/11
Windowsアプリアップデート&追記修正:2020/12/06
バグフィックス:2021/01/02

以前、fx-5800P の素因数分解の高速化プログラムを紹介しています。
fx-5800P 素因数分解 - 高速化

さらに、これをグラフ関数電卓に移植しました。
 グラフ関数電卓用 FactorG のダウンロード [2021/01/02 バグフィックス]
  バグフィックス:終了時に行列を解放しない点を修正し、不要なWhileEndを削除しました。
このプログラムは、純正Casio Basic用であり、純正Casio Basic は計算精度が得られるのは最大 10桁に制限されているので、プログラムの入力値は最大10桁になっていて、10桁を超えるとエラーを出して終了するようにしています。

その後、この FactorG を fx-CG50 の Python モード(Casio Python) に移植し、さらに15桁対応しました。
Casio Python - 要素数の多いリスト:高速素因数分解(5)

そこで、Casio Basic プログラムも15桁入力対応しようと考えました。純正Casio Basicでは、10桁の精度しかありません。しかし、上位互換であるアドイン版Casio Basic - C.Basic では15桁まで計算精度が得られるので、今回は C.Basic で走らせることを前提にして、純正Casio Basicで作った FactorG プログラムを15桁対応に変更します。


15桁入力に拡張するための条件

15桁入力に拡張するには計算精度が15桁であることが条件で、それを満たすのは、グラフ関数電卓のなかで、Pythonモード (Casio Python) と アドイン版 Casio Basic (C.Basic) が走る下記のモデルが必要です。

Casio Python が走るグラフ関数電卓のモデル
  • fx-CG50 OS3.2 以降
  • fx-9750GIII / fx-9860GIII OS3.4 以降

C.Basic が走るグラフ関数電卓のモデル
  • fx-9860G / fx-9860G SD / fx-9860G Slim (C.Basic for FX)
  • fx-9860GII / fx-9860GII SD (C.Basic for FX)
  • fx-9750GIII / fx-9860GIII (C.Basic for FX)
  • fx-CG20 / fx-CG50 (C.Basic for CG)

15桁入力に拡張した Casio Python スクリプト

以下の記事で紹介しているので、そちらを参照してください。
Casio Python - 要素数の多いリスト:高速素因数分解(5)

スクリプトは下記からダウンロードできます。
FactorG5 - Python スクリプト FactorG5.py (Ver 5.0)

FactorG5_input15 FactorG5_result 


15桁入力に拡張した C.Basic プログラム

今回は、以下のような C.Basic プログラムを作成します。

FactorG2_input15 FactorG2_result2  

そこで、以前作った10桁対応の以下のメインルーチン FACTORG.g3m とサブルーチン WFSUB.g3m を修正する作戦で進めます。そのために、以前作成した 10桁対応の FACTORG をダウンロードしておきます。
10桁対応の FACTORG ファイルのダウンロード [2021/01/02 バグフィックス]
  バグフィックス:終了時に行列解放しない点を修正し、不要なWhileEndを削除しました。

ダウンロードしたファイル FactorG.zip には、FXシリーズ (fx-9860G, fx-9860GII, fx-9750GIII, fx-9860GIII)で使える g1m ファイル、CGシリーズ (fx-CG20, fx-CG50) で使える g3m ファイル、そしてテキストファイルを同梱しています。C.Basic は、テキストファイルを読み込んで実行したり、g3m ファイルや g1m ファイルに変換できます。そこでテキストファイルをメモ帳で編集して 15桁対応に変更し、それを読み込んでからプログラムファイルに変換します。

さらに、15桁精度に対応していない純正Casio Basic で走らせることは考えなくて良いので、純正 Casio Basic に未対応の C.Basic 独自の拡張コマンドを活用してゆきます。

C.Basic については、FXシリーズ用の C.Basic for FX、そして CGシリーズ用の C.Basic for CG があり、それぞれ対応したバージョンをインストールして使えます。fx-9860G 以降の全てのグラフ関数電卓に対応しています。C.Basic については、下記 から必要なダウンロード、必要な説明を参照できます。 
アドイン版 Casio Basic - トップページ

今回は、fx-CG50C.Basic for CG を使います。


15桁入力対応高速素因数分解プログラムへの修正箇所

FACTORG
{1,22}->Dim Mat Z  ◀修正対象
"NUMBER"?->F
If F<1 Or F>=1Exp10 ◀ 修正対象
Then "NUMBER MUST BE >=1 And <1Exp10" ◀修正対象
Stop
IfEnd
If F<>Int (F)
Then "NUMBER MUST BE AN INTEGER" ◀修正対象
Stop
IfEnd
For 1->E To 22  ◀修正対象
0->Mat Z[1,E]
Next
0->Mat Z[1,1]  ◀修正対象
0->Mat Z[1,12]  ◀修正対象
0->E
F->A
Int (Sqrt(A))->C
2->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
3->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
5->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
7->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
11->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
                             ◀追加
While 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
・・・
・・・  ◀このWhileループは全面差替え
・・・
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB":B>C=>Goto 1
WhileEnd

Lbl 1
If A>1
Then Isz E
A->Mat Z[1,E]
1->A
1->Mat Z[1,E+11] ◀修正対象
IfEnd
Int (E/6)->D
E-6*D>0=>Isz D
1->C

Lbl 2
ClrText
Locate 1,1,F    ◀修正対象
Locate 12,1,C  ◀修正対象
Locate 13,1,":" ◀修正対象
Locate 14,1,D  ◀修正対象
6*(C-1)+1->B
Locate 1,2,Mat Z[1,B]    ◀修正対象
Locate 11,2,"^("        ◀修正対象
Locate 13,2,Mat Z[1,B+11] ◀修正対象
Locate 16,2,")"         ◀修正対象
If B+1<=E
Then Locate 1,3,Mat Z[1,B+1] ◀修正対象
Locate 11,3,"^("         ◀修正対象
Locate 13,3,Mat Z[1,B+12]    ◀修正対象
Locate 16,3,")"          ◀修正対象
IfEnd
If B+2<=E
Then Locate 1,4,Mat Z[1,B+2] ◀修正対象
Locate 11,4,"^("         ◀修正対象
Locate 13,4,Mat Z[1,B+13]    ◀修正対象
Locate 16,4,")"          ◀修正対象
IfEnd
If B+3<=E
Then Locate 1,5,Mat Z[1,B+3] ◀修正対象
Locate 11,5,"^("         ◀修正対象
Locate 13,5,Mat Z[1,B+14]    ◀修正対象
Locate 16,5,")"          ◀修正対象
IfEnd
If B+4<=E
Then Locate 1,6,Mat Z[1,B+4] ◀修正対象
Locate 11,6,"^("         ◀修正対象
Locate 13,6,Mat Z[1,B+15]    ◀修正対象
Locate 16,6,")"          ◀修正対象
IfEnd
If B+5<=E
Then Locate 1,7,Mat Z[1,B+5] ◀修正対象
Locate 11,7,"^("         ◀修正対象
Locate 13,7,Mat Z[1,B+16]    ◀修正対象
Locate 16,7,")"          ◀修正対象
IfEnd

While Getkey:WhileEnd     ◀修正対象

Do
Getkey->K            ◀修正対象
LpWhile K=0
While Getkey            ◀修正対象 
WhileEnd             ◀修正対象
0->M
If K=47 Or K=44
Then 1->M
Else If K=27 Or K=37 Or K=31
Then 2->M
Else If K=28 Or K=38 Or K=41
Then 3->M
Else Goto 2
IfEnd:IfEnd
IfEnd

If M=1
Then ClrText
"DONE"
Else If M=2
Then Isz C
C>D=>1->C
Goto 2
Else If M=3
Then C-1->C
C<1=>D->C
Goto 2
IfEnd:IfEnd
IfEnd
ClrMat Z


WFSUB
E+1->E
B->Mat Z[1,E]
Do
D->A
Mat Z[1,E+11]+1->Mat Z[1,E+11] ◀修正対象
A/B->D
LpWhile Frac (D)=0
Int (SqrtA)->C
Return


上でダウンロードした FactorG.zip に同梱してあるテキストファイル FACTORG.txt を編集し、以下の具体的な変更を行います。完成した後、C.Basic 内蔵機能により g3m ファイルに変換して完成させます。


(1) 不要な初期化を削除
For 1->E To 22
0->Mat Z[1,E]
Next
0->Mat Z[1,1]
0->Mat Z[1,12]

0->E
F->A


変数の初期化のうち、For 文で行列 Z を全て 0 に初期化されているので、上記赤文字の初期化は不要です。従って削除します。


(2) 行列の確保領域の拡大に伴う変更
入力桁数を拡大するにともない、見つかる素因数の数も増えるので、素因数を格納する行列をほぼ倍に拡大します。
オレンジ色で示した部分は、以下のようにします。修正部分は赤文字にします。
行列確保の 2142 に変更、1121 に変更します。


FACTORG2
{1,42}->Dim Mat Z
・・・
For 1->E To 42
0->Mat Z[1,E]
Next

・・・
1->Mat Z[1,E+21]


WFSUB2
・・・
Mat Z[1,E+21]+1->Mat Z[1,E+21]
・・・


(3) 入力値の桁数制限を15桁にするための変更
入力値の制限とエラーメッセージを15桁対応にするため、修正を赤文字で示したようにします。

FACTORG2
If F<1 Or F>=1Exp15
Then "NUMBER MUST BE    >=1 And <1Exp15"
Stop
IfEnd
If F<>Int (F)
Then "NUMBER MUST BE    AN INTEGER"


エラーメッセージは、BE のあとのスペースを7個にしすることで、表示した時に改行したようにみせます。


(4) Lbl 2 以下を、入力値と素因数の桁数増加に合わせて変更

C.Basic は計算精度は15桁ですが、設定によっては数値を出力する際に10桁を超えると指数表示になります。C.Basic では Norm の機能が拡張されていて、プログラム冒頭で Norm15 と記述するだけで 15桁までは指数表示されないように設定できます。今回はもう一つの方法として、数値を文字列に変更して Locate で出力する方法で変更してみます。Norm15 の方がスマートでコードがスッキリするかも知れませんが、今回は文字列を使うベタなやり方にしてみます。

以下のサンプルプログラムを見て下さい。

?->F
ToStr(F)->Str 1
log F>=10=>ToStr(Int(F÷E10))+ToStr(F-Int(F÷E10)×E10 )->Str 1
Locate 1,1,Str 1


値を入力させ、それを文字列に変換してLocate で出力するサンプルです。このコードを使います。

画面1行目に入力値と出力ページを出力する部分は、以下のようになります。変更箇所は赤文字で示します。

Lbl 2
ClrText
ToStr(F)->Str 1
log F>=10=>ToStr(Int (F/Exp10))+ToStr(F-Int (F/Exp10)*Exp10)->Str 1

Locate 1,1,Str 1
Locate 18,1,C
Locate 19,1,":"
Locate 20,1,D


このコードの下に、求めた素因数を1ページ分出力するコードが続きます。以下のように修正します。変更箇所は赤文字で示します。

6*(C-1)+1->B
Mat Z[1,B]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,2,Str 1
Locate 16,2,"^("
Locate 18,2,Mat Z[1,B+21]
Locate 21,2,")"
If B+1<=E
Then
Mat Z[1,B+1]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,3,Str 1
Locate 16,3,"^("
Locate 18,3,Mat Z[1,B+22]
Locate 21,3,")"
IfEnd
If B+2<=E
Then
Mat Z[1,B+2]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1

Locate 1,4,Str 1
Locate 16,4,"^("
Locate 18,4,Mat Z[1,B+23]
Locate 21,4,")"
IfEnd
If B+3<=E
Then
Mat Z[1,B+3]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1

Locate 1,5,Str 1
Locate 16,5,"^("
Locate 18,5,Mat Z[1,B+24]
Locate 21,5,")"
IfEnd
If B+4<=E
Then
Mat Z[1,B+4]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,6,Str 1

Locate 16,6,"^("
Locate 18,6,Mat Z[1,B+25]
Locate 21,6,")"
IfEnd
If B+5<=E
Then
Mat Z[1,B+5]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1

Locate 1,7,Str 1
Locate 16,7,"^("
Locate 18,7,Mat Z[1,B+26]
Locate 21,7,")"
IfEnd


(5) 素因数探索コード自体の変更

最初に素数2,3,5,7、11 で割り算して素因数を探索する部分は、さらに素数 13 で割り算するように追加します(赤文字)。

Int (Sqrt(A))->C
2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
3->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
5->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
7->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
11->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
13->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1



さて、これに続くWhile ループでは、以下のように Bに増分 (4, 2, 4, 6, ...) を加えて探索数とし、それで割り算して探索数を得る処理を1行で記述している。
While 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1

・・・
・・・
・・・

以前作っているコードでは、2,3,5,7 のいずれの倍数でもない 13 ~ 222 までの 48 個の探索数を用いている。今回は探索数を増やすため、2, 3, 5, 7, 11 のいずれの倍数でもない 17~2325までの 480 個の探索数に拡張して、さらに高速化を試みます。

但し、探索数の増分の計算そして 480 行の記述をエディタで作成するのは非現実的なので、480個の増分の計算とWhlle ループの中の480行の記述を作成して出力するWindowsアプリを作って、カット&ペーストで一気に作成することにします。

 FactorG2 作成支援 Windowsアプリ - SearchNumCG11 のダウンロード

ダウンロードするファイル SearchNumCB11.zip には、実行ファイル SearchNumCB11.exe と C#のソースファイルを同梱しています。 Visual Studio 2019 Community で作成しました。

実際にタイプして作った肝心のコードは以下です。
(参考) C# では、以下の CalcNum() 関数の実装部分と CalcNum() 関数を呼び出す1行の記述(合計21行)以外は一切コーディングせず、プロパティの設定を行うだけでWindowsアプリを作れることを申し添えておきます。チョット慣れれば、この程度の簡易的なWindowsアプリが簡単かつ迅速に作れるので、大変お勧めです。C#入門講座 など、ご自分に合った入門講座を探してみて下さい。
#foreachループ内の Result.AppendText() は速度低下するけど、この程度なら許せるので許してください。Casio Basic作成支援やCasio Pyton作成支援で作った一連のSearchNumでは、この速度低下に対応したものもあります。詳しくはダウンロードしたソースを見てください。


private void CalcNum()
{
 int prev_num = 13;
 int m = 17;
 int n = 2*3*5*7*11;
 int line = 0;
 String str = "";
 foreach (int num in Enumerable.Range(m,n))
 {
  if ((num % 2) * (num % 3) * (num % 5) * (num % 7) * (num % 11) != 0)
  {
   str = "B+" + (num - prev_num).ToString() + "->B:A/B->D:Frac (D)=0=>Prog \"WFSUB2\":B>C=>Goto 1";
   prev_num = num;
   Result.AppendText(str + "\r\n");
   line++;
  }
 }
 Result.AppendText("\r\n" + line.ToString() + " lines");
 Calc.Enabled = false;
}

整数 num に 17~2326 までの整数を適用し、num が 2, 3, 5, 7, 11 のいずれかの倍数でもない時の num を探索数と識別し、1つ前の num との差 (num - prev_num) を [増分] とし、順次
B+[増分]->B:A/B->D:Frac (D)=0=>Prog "WFSUB2:B>C=>Goto 1
をテキストボックスに出力します。

さっそく SearchNumCB11.exe を起動します。
SearchCB11_input 

[Calculate] ボタンをクリックすると必要な記述が出力されます。
SearchCB11_result 

テキストボックス内は、自由に編集ができます。テキストボックスから必要な部分をカットコピーし、エディタで開いた FACTORG2.txt のなかで該当する While 1WhileEnd の間にペーストします。

例えば、テキストボックスで [Ctrl]+[A] で全てを選択し、[Shift]+[↑] を押してから [Ctrl]+[C] でコピーし、エディタで開いた FACTORG2.txt の 該当部分に [Ctrl]+[V]でペーストします。これで、480行のコードが一気に完成します。

一見回りくどいようですが、タイプミスの抑制と作業全体のタイプ量の大幅な節約、そしてなにより時間の節約になったと思います。


(6) 出力に色を付け、同じコードでモノクロ液晶機種用 g1m ファイルとの互換性を保つ

目標の出力を以下のようにします。
FactorG2_result2 

入力値を、乗数の ^( )で出力するには、red Locateblue Locateとします。
但し、色指定は カラー液晶を搭載した fx-CGシリーズのみで有効となり、モノクロ液晶の fx-9860Gシリーズや fx-9750GIII ではエラーになります。そこで、C.Basic の拡張コマンド System(-1) を使って機種判定を行い、CGシリーズの時は色指定をしたLocateコマンドを実行し、そうでない時は色指定なしの Locate コマンドを実行させれば良いわけです。
System(-1) は、CGシリーズでは 10 以上の整数を返し、それ以外では1桁の整数を返します。

そこで、プログラムの冒頭で機種判断を行うことにします。
0->G:System(-1)>=10=>1->G

このように、変数G を 0 で初期化しておき、CGシリーズの時は 1 になるようにしておきます。

CGシリーズで赤で出力する場合、モノクロ機種で色指定をしないために、
If G:Red Locate 1,1,Str 1
Else Locate 1,1,Str 1:IfEnd


CGシリーズで青で出力する場合、モノクロ機種で色指定をしないために、
If G:Blue Locate 16,2,"^("
Else Locate 16,2,"^(":IfEnd


If G:Blue Locate 21,2,")"
Else Locate 21,2,")":IfEnd


とします。

以上を適用すると Lbl 2 以降は、以下のようになります。修正した部分を赤文字で示します。

Lbl 2
ClrText
ToStr(F)->Str 1
log F>=10=>ToStr(Int (F/Exp10))+ToStr(F-Int (F/Exp10)*Exp10)->Str 1
If G:Red Locate 1,1,Str 1
Else
Locate 1,1,Str 1:IfEnd
Locate 18,1,C
Locate 19,1,":"
Locate 20,1,D
6*(C-1)+1->B
Mat Z[1,B]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,2,Str 1
If G:Blue Locate 16,2,"^("
Else
Locate 16,2,"^(":IfEnd
Locate 18,2,Mat Z[1,B+21]
If G:Blue Locate 21,2,")"
Else
Locate 21,2,")":IfEnd
If B+1<=E
Then
Mat Z[1,B+1]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,3,Str 1
If G:Blue Locate 16,3,"^("
Else
Locate 16,3,"^(":IfEnd
Locate 18,3,Mat Z[1,B+22]
If G:Blue Locate 21,3,")"
Else
Locate 21,3,")":IfEnd
IfEnd
If B+2<=E
Then
Mat Z[1,B+2]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,4,Str 1
If G:Blue Locate 16,4,"^("
Else
Locate 16,4,"^(":IfEnd
Locate 18,4,Mat Z[1,B+23]
If G:Blue Locate 21,4,")"
Else
Locate 21,4,")":IfEnd
IfEnd
If B+3<=E
Then
Mat Z[1,B+3]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,5,Str 1
If G:Blue Locate 16,5,"^("
Else
Locate 16,5,"^(":IfEnd
Locate 18,5,Mat Z[1,B+24]
If G:Blue Locate 21,5,")"
Else
Locate 21,5,")":IfEnd
IfEnd
If B+4<=E
Then
Mat Z[1,B+4]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,6,Str 1
If G:Blue Locate 16,6,"^("
Else
Locate 16,6,"^(":IfEnd
Locate 18,6,Mat Z[1,B+25]
If G:Blue Locate 21,6,")"
Else
Locate 21,6,")":IfEnd
IfEnd
If B+5<=E
Then
Mat Z[1,B+5]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,7,Str 1
If G:Blue Locate 16,7,"^("
Else
Locate 16,7,"^(":IfEnd
Locate 18,7,Mat Z[1,B+26]
If G:Blue Locate 21,7,")"
Else
Locate 21,7,")":IfEnd
IfEnd


以上のようにすると、CGシリーズでもそれ以外でも互換性を保って動作可能になります。


(7) Getkey を Getkey1 に変更する
今回は、C.Basic専用のプログラムに変更するので、純正 Casio BasicGetkey コマンドを C.Basic拡張コマンド Getkey1 に置き換えます。Getkey コマンドは キーが押されるその時に実行されると キーコードを取得する仕様なので、キー取得はループの中に Geteky を記述しなければなりません。キー入力で動作を分岐する動作が連続するとき、同じキーを少し長めに押すと連続して同じキーが押されたと誤判定されることがあり、その際は 
While Getkey:WhileEnd
を記述して、キーが離されないと先に進めない機能(関所の機能)を設ける必要があります。

一方で、C.Basicの拡張コマンド Getkey1 は、キーが押されるまで待つ機能が付加されます。するとキーが離されないと先に進めないようにするループが不要になります。

(6) で検討した結果を出力するコードに続く、結果表示のページを切り替えるためのキー入力コードは以下のようになっています。

While Getkey:WhileEnd

Do
Getkey->K
LpWhile K=0
While Getkey
WhileEnd


Getkey->KGetkey1->K に変更した上で、以下のように変更できます。

Do
Getkey1->K
LpWhile K=0


変更前の以下のコードに含まれる2箇所の While Getkey:WhileEnd を削除します。


(8) g1m ファイルと g3m ファイルに変換する

これまでは、テキストファイルで編集してきました。C.Basic では、テキストファイルから g3m ファイルや g1m ファイルに変換できます。

FACTORG2.txtfx-CG50 に転送します。

次に、C.Basic のファイルリスト画面で FACTORG2.txt を選択
Select_txt_file 

[F6] (▷) を押し、
Coverting_txt_file 

さらに、[F1] (CONVERT) を押し、
Coverte_txt_file 

[F2] (g1m) を押せば、g1m ファイルに変換され、
[F3] (g3m) を押せば、g3m ファイルに変換されます。



15桁対応、高速素因数分解 - FACTORG2.g3m の実行

 ダウンロード:15桁対応・高速素因数分解 FACTORG2 (for C.Basic) 
  [2021/01/02 バグフィックス] バグフィックス:終了時に行列解放しない点を修正しました。

参考のため、以前作った Pythonモード (Casio Python) の FactorG5.py の実行結果と比較します。

search_30445_f  CBResult2_1 

Search_39969_f  CBResult2_2 

seach_47824_f  CBResult2_3 
Case1_14digit  CBResult2_4 

search_90872_f  CBResult2_5 

search_189426_f.png  CBResult2_6 
search_263027_f.png  CBResult2_7 

search_343013_f.png  CBResult2_8 

search_2025804_f.png  CBResult2_9 
search_4349444_f.png  CBResult2_10 


表2- 15桁版高速素因数分解実行時間の違い - Casio Python と C.Basic の比較
    (fx-CG50 OS3.4 使用)
Casio Python
FactorG5.py
C.Basic
FACTORG2.g3m
 WFSUB2.g3m
高速化
入力値実行時間 [秒]実行時間 [秒]時間差 [%]
547,896,321,054,789 8.74.350.6
7,845,162,037,849 11.45.452.6
748,159,026,374,815 13.76.453.3
36,209,518,473,620 15.57.551.6
986,753,421,098,675 
26.011.854.6
96,835,724,130,261 52.724.952.8
748,159,026,396,835 73.134.353.1
96,835,724,136,209 95.344.653.2
748,159,026,336,209 585.0
(9分45秒)
255.8
 (4分15.8秒)
56.3
362,095,184,736,209 1,235.6
(20分35.6秒)
553.3
(9分13.3秒)
55.2

Casio Python よりも C.Basic が2倍程度高速だと分かりました。

現状の Casio Python では、動作中にリアルタイムでキー入力を受け付けることができません。一方、純正 Casio BasicC.Basic ではリアルタイムキー入力が可能なので、プログラミング言語としてはより実用的と言えます。


さらに高速化する [2020/08/15 追記]

さらに高速化するために今回拡張した While ループ内で実行する探索数をさらに増やしてみました。

素数での割り算を2~13に加えて17での割り算を追加し、それに続く Whileループでの素因数探索を 2, 3, 5, 7, 11, 13のいずれの倍数でない整数で割り算するように拡張してみました。すると、このループ内は 5760 行となります。上と同様に新たに専用Windowsアプリを作成し、カット&ペーストで追加し、FACTORG3.g3m を作成しました。

FACTORG3.g3m 作成支援アプリ - SearchNumCB13 ver2.0 のダウンロード 
 ※ [2020/12/06 ver2.0 にアップデート - 処理の大幅な高速化]

これを実行すると以下のように出力されます。
SearchCB13_result

5760行ものコードを追加すると、FACTORG3.g3m のファイルサイズは 210,028 バイト (210Kバイト) になり、上で作った FACTORG2.g3m の10倍程度の大きなファイルです。

幸い fx-CG50 では実行可能で、上で作成した FACTORG2.g3m よりも 7% 程度高速化しました。
15桁対応高速素因数分解プログラム - FACTORG3.zip のダウンロード

現在のところ、C.Basic for CG で動作する FACTORG3.g3m が最速です。
但し、ファイルサイズがあまりにも大きくメモリを無駄食いする割に、7%程度の高速化なので、管理人としては FACTORG2.g3m を推奨したいと思います。

なお、FACTORG3.zip に同梱している FACTORG3.g1m (モノクロ機種用) は、C.Basic for FX ではファイルサイズが大きすぎて実行できないので、上で作った FACTORG2.g1m がモノクロ液晶機種対応としては、最速になります。従って、g1m と g3m で互換性のある FACTORG2 (g1m/g3m互換) をやはり推奨したいと思います。


もう一段高速化を試みる

探索数をさらに拡張した FACTORG4.g3m について
同様に、FACTORG4 作成支援アプリ SearchNumCB17 [2020/12/06 Ver2.0 にアップデート、処理の高速化]  を作って実行させると、なんと 92160 行ものコードを生成します。

SearchCB17_result

この出力をカット&ペーストして、テキストファイル FACTORG4.txt を作成すると 4787 Kバイト (4.8Mバイト) となり、fx-CG50 のストレージメモリの最大容量である 1.6 Mバイトを超えてしまい、メモリ不足で fx-CG50 に転送できません。ここが限界のようです。

最速は、FACTORG3.g3m で、実用的には FACTORG2.g3m で十分だという結論にしておこうと思います。
===== [2020/08/15 追記] 終わり =====


モノクロ機種での FACTORG2.g1m の実行

fx-9750GIII で 15桁対応高速素因数分解 - FACTORG2.g1m を実行してみます。 

CBMResult 

CBMResult_11 CBMResult_12 CBMResult_13 

fx-9750GIIIfx-9860Gシリーズ (fx-9860GIIIfx-9860GII, fx-9860GII SDfx-9860G, fx-9860G SD, fx-9860G Slim) にインストールした C.Basic for FX でも自動機種判定がうまくいって、同様の出力が得られることが確認できました。


今回作成したコード (テキストファイルの表記)

 ダウンロード:15桁対応・高速素因数分解プログラム - FACTORG2 (for C.Basic)

今回紹介したような支援アプリを使わないと到底作成ができないことがよく分かります。


FACTORG2.txt
0->G:System((-)1)>=10=>1->G
{1,42}->Dim Mat Z
"NUMBER"?->F
If F<1 Or F>=1Exp15
Then "NUMBER MUST BE >=1 And <1Exp15"
Stop
IfEnd
If F<>Int (F)
Then "NUMBER MUST BE AN INTEGER"
Stop
IfEnd
For 1->E To 42
0->Mat Z[1,E]
Next
0->E
F->A
Int (Sqrt(A))->C
2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
3->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
5->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
7->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
11->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
13->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
While 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+14->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+10->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+14->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+8->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+6->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+4->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+2->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
B+12->B:A/B->D:Frac (D)=0=>Prog "WFSUB2":B>C=>Goto 1
WhileEnd

Lbl 1
If A>1
Then Isz E
A->Mat Z[1,E]
1->A
1->Mat Z[1,E+21]
IfEnd
Int (E/6)->D
E-6*D>0=>Isz D
1->C

Lbl 2
ClrText
ToStr(F)->Str 1
log F>=10=>ToStr(Int (F/Exp10))+ToStr(F-Int (F/Exp10)*Exp10)->Str 1
If G:Red Locate 1,1,Str 1
Else Locate 1,1,Str 1:IfEnd
Locate 18,1,C
Locate 19,1,":"
Locate 20,1,D
6*(C-1)+1->B
Mat Z[1,B]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,2,Str 1
If G:Blue Locate 16,2,"^("
Else Locate 16,2,"^(":IfEnd
Locate 18,2,Mat Z[1,B+21]
If G:Blue Locate 21,2,")"
Else Locate 21,2,")":IfEnd
If B+1<=E
Then
Mat Z[1,B+1]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,3,Str 1
If G:Blue Locate 16,3,"^("
Else Locate 16,3,"^(":IfEnd
Locate 18,3,Mat Z[1,B+22]
If G:Blue Locate 21,3,")"
Else Locate 21,3,")":IfEnd
IfEnd
If B+2<=E
Then
Mat Z[1,B+2]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,4,Str 1
If G:Blue Locate 16,4,"^("
Else Locate 16,4,"^(":IfEnd
Locate 18,4,Mat Z[1,B+23]
If G:Blue Locate 21,4,")"
Else Locate 21,4,")":IfEnd
IfEnd
If B+3<=E
Then
Mat Z[1,B+3]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,5,Str 1
If G:Blue Locate 16,5,"^("
Else Locate 16,5,"^(":IfEnd
Locate 18,5,Mat Z[1,B+24]
If G:Blue Locate 21,5,")"
Else Locate 21,5,")":IfEnd
IfEnd
If B+4<=E
Then
Mat Z[1,B+4]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,6,Str 1
If G:Blue Locate 16,6,"^("
Else Locate 16,6,"^(":IfEnd
Locate 18,6,Mat Z[1,B+25]
If G:Blue Locate 21,6,")"
Else Locate 21,6,")":IfEnd
IfEnd
If B+5<=E
Then
Mat Z[1,B+5]->z
ToStr(z)->Str 1
log z>=10=>ToStr(Int (z/Exp10))+ToStr(z-Int (z/Exp10)*Exp10)->Str 1
Locate 1,7,Str 1
If G:Blue Locate 16,7,"^("
Else Locate 16,7,"^(":IfEnd
Locate 18,7,Mat Z[1,B+26]
If G:Blue Locate 21,7,")"
Else Locate 21,7,")":IfEnd
IfEnd

Do
Getkey1->K
LpWhile K=0
0->M
If K=47 Or K=44
Then 1->M
Else If K=27 Or K=37 Or K=31
Then 2->M
Else If K=28 Or K=38 Or K=41
Then 3->M
Else Goto 2
IfEnd:IfEnd
IfEnd

If M=1
Then ClrText
"DONE"
Else If M=2
Then Isz C
C>D=>1->C
Goto 2
Else If M=3
Then C-1->C
C<1=>D->C
Goto 2
IfEnd:IfEnd
IfEnd
ClrMat Z


WFSUB.txt
E+1->E
B->Mat Z[1,E]
Do
D->A
Mat Z[1,E+21]+1->Mat Z[1,E+21]
A/B->D
LpWhile Frac (D)=0
Int (SqrtA)->C
Return







応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




keywords: プログラム関数電卓、fx-CG50、C.Basic、素因数分解、プログラミング、Casio Basic

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

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

グラフ関数電卓で観る感染症数理モデル

2020/05/06
ダウンロードリンク修正 2020/05/08
SIR2.g1m 差替えアップデート 2020/05/09
プログラムアップデート 2020/05/11

グラフ関数電卓で、感染症数理モデル - SIRモデル - をグラフ化

新型コロナウィルスのパンデミックに際して、底の浅い情報、信憑性が疑われる情報、噂が蔓延しています。これをインフォデミックと言うそうです。新型コロナウィルスについては、まだよく分かっておらず未知のウィルスと言うべき段階なので、自分の分かる範囲で情報の取捨選択をして納得できる理解をし、それを逐次修正して行動に反映したいと思っています。

地上波TVの情報はあてにならないと感じており、主にインターネットやYouTubeで情報を集めているなかで、感染対策の考え方に東大方式と京大方式があったり、大阪モデルのように自治体によって明確に異なるものがあったり、台湾方式やスウェーデン方式が対局にあるのですが国ごとに違いがあることを知りました。

様々な違いがある一方で、世界各国の対策全てに共通する感染症の数理モデルの基本が、およそ100年前のスペイン風邪流行期に提出された SIRモデルだと知りました。この数理モデルを少しでも理解すれば、実際にパンデミック対策の基本の考え方を知る良い機会になりそうです。そこで、先ずSIRモデルをグラフにして、次に重要なパラメータを変えたらグラフがどのように変化するかをビジュアル化しようと思います。

SIRモデルの微分方程式は難しいので、差分形式に変更して数値的にアプローチすれば、エクセルでグラフ化できると考え、その具体的な計算方法を調べました。そして、エクセルでの計算方法をグラフ関数電卓の Casio Basic に移植しました。

実際のグラフ描画のコードは Colon様の支援を頂きました。グラフ描画について経験が殆ど無い管理人には、とても良い勉強になりました。

SIR_CG_1s SIR_FX_1s 
fx-CGシリーズ                 fx-9860シリーズ / fx-9750GIII

高精細度カラー液晶のfx-CGシリーズのグラフの方が圧倒的に観やすいですね。

グラフを描く時に使ったパラメータは、以下の "パラメータ一覧・入力画面" で、変更してグラフ化できます。
SIR_CG_Param_1s 

これらパラメータの意味については、さらに読み進んでもらえば、お分かり頂けると思います。

ファイルのダウンロード
ダウンロードした SIR_Model2.zip を展開すると、純正Casio Basic用プログラムファイルは、g3mフォルダとg1mフォルダにあります。

fx-CGシリーズ:g3mフォルダにある下記4つのファイルを全て fx-CGシリーズの PROGRAMフォルダに転送し、純正Casio Basicで SIR2 を実行してください。
 ・SIR2.g3m
 ・INPI.g3m(入力ボックス 2.1G - 整数版)
 ・INP.g3m(入力ボックス 2.1G - 小数版)
 ・3DS.g3m(3桁区切り

fx-9860Gシリーズ  (fx-9860G OS2.00 以降のモデル):g1mフォルダにある下記4つのファイルを全て fx-9860GシリーズのPROGRAMフォルダに転送し、純正Casio Basicで SIR2 を実行してください。
 ・SIR2.g1m
 ・INPI.g1m(入力ボックス 2.1G - 整数版)
 ・INP.g1m(入力ボックス 2.1G - 分数版)
 ・3DS.g1m(3桁区切り
※ fx-9860G OS1.xx では MENUコマンドが実装されていないため、OS2.00 以降で実行可能
※ fx-9860G OS2.00 以降には、fx-9860GII、fx-9860GIII を含む
※ このプログラムは、現行の C.Baisc for CG Ver 1.45 や C.Basic for FX Ver 2.54 では、純正Casio Basicのグラフ描画プログラムの全てにまだ対応していないので、動作しません。


[2020/05/11: ver 2.1 に差替えアップデート]
  • グラフデータを格納したリストの最大値を求める関数を変更してスピードアップしました
  • グラフデータ準備に多少の時間がかかるので、その間 = Processing data = と表示するように変更しました


目 次
1.はじめに
2.SIRモデルと再生産数 - 接触機会の抑制 80% の謎
3.SIRモデルの可視化 - エクセルでグラフを描く
4.純正 Casio Basic への移植
5.おわりに




1. はじめに

新型コロナウィルス (COVID-19) の世界的な感染拡大で、私たちの生活が大きく変わってしまっています。ご自身やご家族の健康的被害、そして経済的被害に遭われている方々には心からお見舞い申し上げます。さらに、医療関係者、そして国民の生活に必須な生産や物流に携わっている方々に、深い敬意と感謝を捧げたいと思います。

日本は、感染症に対する医療的リソース (専門家と施設) が他の先進諸国に比べて圧倒的に不足している状況で、また強制力を伴った措置の法的立て付けが無いにも関わらず、死者数が欧米諸国に比べて1桁から2桁以上少ない、といったかなり特殊な状況にあります。

2020年5月6日の時点では全体的に感染者数拡大が鈍化する傾向があり、医療施設や介護施設、そして家庭内の感染が顕著になっている状況です。緊急自体宣言が5月31日まで延長されましたが、未知の新型コロナウィルスを "正しく恐れる" ことで、個人が自分の行動を工夫することで、早期に収束が迎えられるのではないか、是非そうなって欲しい、と思います。

施設内感染や家庭内感染の調査により、物に付着しているウィルスを人が触れて感染する傾向が高いことが分かってきています。このモノーヒト感染においては、ウィルスが自分の口や鼻、目に入らないことが重要で、ウィルスが付着しやすい手で顔を触らず頻繁に消毒することがかなり有効な感染対策とされています。

マスクは、自分から他人、そして他人から自分への飛沫感染を抑制するだけでなく、口と鼻を手で触らないためにも有効です。手で顔を触らない習慣は身につくものだそうです。さらに頻繁に石鹸での手洗いやアルコールでの消毒を行えば、モノーヒト感染はかなり効果的に抑えられます。

ヒトーヒト感染については、人と人の物理的接触によるウィルスの移動、そして飛沫感染を抑える効果を狙っていると考えられます。日本政府は "接触機会の抑制" を 80% にすることを要請しています。1人の外出を 55% 抑制すると、2人が出会う確率は 0.45 × 0.45 = 0.2025 ≒ 20% になり、3人以上ではさらに低い数値になります。外出を 55% 抑制すれば 80% の接触機会の抑制が達成されます。

新型コロナウィルスは、空中のウィルスがマスクをすり抜けて感染するような "空気感染" は殆どないらしいことも分かってきています。

従って、マスクをして、手で顔を触らず、手洗いや消毒を実施し、外出を 55% 抑制すれば、感染収束に向かう可能性が高いのではないでしょうか?

今は未知のウィルスを相手にしているのですから、ワクチンも治療薬も無く、万一発症すれば医療機関は命を救うためには、出来うる限りの対処療法を施すしかありません。そのための医療関係スタッフと医療機器、そして感染症用の施設、つまり感染症対策の医療リソースを、余裕を持って確保することが最重要課題となっています。

そのためには、感染防止対策を行いながら、感染者数の動向をリアルタイムで追いかけ、今後の動向予測が不可欠です。未知の新型コロナウィルスなので、統計的、疫学的に動向をシミュレーションして、医療リソースが不足しないように施策をうつことが最優先です。そこでは、感染症の数理モデルのシミュレーションが拠り所になるのでしょう。

インフルエンザでは患者数の動向を追いかけるのに、新型コロナウィルスでは何故感染者数で追いかけているのか、不思議に思っています。未知のウィルスだから数理モデルを用いて "感染者" で整理するのは判りますが、患者数、重傷者数、死者数の動向も重要なはずだと思っています。

感染症や医療のプロでなくとも、我々一般国民は論理的、科学的思考を常にアップデートしてゆきたいものです。そして未知の感染症に対して "正しく恐れる" 態度を持ちたいと思っています。

▲目次に戻る



2.SIRモデルと再生産数 - 接触機会の抑制 80% の謎

SIRモデルは、ほぼ100年前の1920~1930年の間にマルケックとマケンドリックにより提出された数理モデルです。このモデルの基本的な考え方は、今日に至るまで使われているので、それだけ信用に足るものと言えます。ネットで調べると、SIRモデルを基点として様々な発展型モデルが提案され、実際に利用されていることも分かります。

SIR_Equation 
これが、SIRモデルの常微分方程式です。

式を見ているだけでは、なんだかよく分からないのですが、このモデルから導き出される重要な指標の1つが、1人の感染者が何人に感染させるかの指標 -  "再生産数" です。再生産数には、R0ReRt があります。
  • R0:基本再生産数。何も対策をとらない時の病原体の素の感染力を示す。
  • Re:有効再生産数。R0に手洗い、マスク、行動制限などの対策後の感染力を示す。
  • Rt:実行再生産数。感染拡大防止対策に加えて集団免疫率を加味した時の感染力を示す。
基本再生産数 R0 は、英語では R nought (Rノート) や R Zero と呼ばれます。2011年公開の映画 "コンテイジョン" では R nought といっています(最近観なおしました)。R0 は数理モデルの分析から推定される値で、新型コロナウィルスではまだ確定的な値が分かっていません。現在のところWHOによれば、新型コロナウィルスの R0 は、1.4~2.5 程度の可能性が考えられているようです。

代表的感染症のR0:(国立感染症研究所の資料による
  • はしか:12-18(飛沫感染)
  • 風疹:5-7(飛沫感染)
  • おたふく風邪:4-7(飛沫感染)
  • ポリオ:5-7(経口感染)
  • 天然痘:6-7(飛沫、接触感染)
  • インフルエンザ(スペイン風邪):2-3(飛沫感染)
  • ジフテリア:6-7(飛沫感染)
  • 百日咳:12-17(空気感染)

実効再生産数 Rt は、感染拡大対策の要因に加えて集団免疫率を加味したものだと思われます。免疫を獲得する人は感染症が拡大するにつれ増えるので、実行再生産数 Rt は感染症の拡大と収束に伴って変化してくる値です。ドイツなどでは Rt を公表して、国民への指針の根拠としています。合理的ですね。日本でも最近になって 実行再生産数 Rt という言葉を使うようになっています。

さて、日本政府が使っている "接触機会の抑制" という言葉は、どうも不明瞭、不明確に感じています。
ここでは勝手に、
"接触機会の抑制率" = "ウィルスに接触する機会の抑制" = "接触抑制率"
と定義します。

ここで定義した "接触抑制率"を p としたとき、この指標だけで考える有効再生産数は、Re = R× (1 - p) となります。

Re は累乗で効いてくるので、Re = R× (1 - p) < 1 の時は、感染拡大の抑制効果が高くなります。但し、0でない限り感染拡大初期では感染が広がります。これはSIRモデルの式から分かります。

新型コロナウィルスの基本再生産数 R0 は、専門家でもまだよく分かっていないので、例えば大げさに大きな値として 2.5 ~ 4.8 までの値になる時、Re < 1 とするための接触抑制率は、この式から分かります。 

Re 
多分 R0 が 4.8 ということは無い (もっと小さい) でしょうが、あり得ないくらい悪い状況だとしても、接触機会を 0.8 つまり 80% 抑制すれば、Re が1未満になるわけです。

新型コロナウィルスの R0 は 1.4 ~ 2.5 程度だろうとWHO (国際保健機関) が言っているので、この範囲での最悪の値 2.5 の場合は、接触抑制率を 80% にすれば Re は 0.5 となり、拡大防止策に多少手抜かりがあっても余裕を持って感染を抑えられそうですね。おそらくこのあたりが、現在の指針である 80% 抑制の背景ではないかと思われます。

▲目次に戻る



3.SIRモデルの可視化 - エクセルでグラフを描く

常微分方程式を素直に解いて、式を導くのは難しいですが、グラフを描くのが目的なので、差分形式に変換すればなんとかなると考えました。そこで、下記のSIRモデルの常微分方程式から、
SIR_Equation_2 

と、少し工夫した上で、差分形式に変形してみました。

SIR_Equation_4

ここで、パラメータとして、
  • R0:基本再生産数
  • p:接触抑制率 (上述)
  • b:接触抑制を行った時の実際の再生産数 (有効再生産数、Re)
  • c:一旦感染した人が感染力を失う(免疫を獲得するか死亡する)割合
  • N:感染が始まる前 (t=0) の人口 = S(0) の値
  • I(Δt):感染が始まる最初 (t=Δt) の感染者数
  • Δt:差分の刻み
とすると、時刻 t+Δt における S(t+Δt)I(t+Δt)R(t+Δt) の値を S(t)I(t)R(t) を使った漸化式で計算できそうです。

そこで、エクセルには以下のように計算式を入れました(クリックすると拡大できます)。
Excel_Calc

計算式は150行もあれば十分でしょうか?

散布図を描いてみると、以下のようになります。
Excel_SIR_Graph
実際には、右端にある黒い背景のセル(5箇所)は、表で対応するセルへリンクしています。

ファイルのダウンロード
ダウンロードした SIR_Model2.zip にエクセルファイルを同梱していので、これをご覧ください。

パラメータを変えると、赤い感染者数のピークの高さや位置が変化する様子が分かります。
基本再生産数 Ro や、接触抑制率 p を変えて 有効再生産数 Re が大きく1を下回ると、感染者のピークが見えなくなるくらいに小さくなり、感染が拡大しないことがグラフで可視化できます。

最初の感染人口を多くすると、ピークの位置が左にシフトして感染拡大が早まることが分かりますが、感染者ピークの高さはさほど変わりません。これはチョット意外です。

現実に感染者が増え、医療機関のお世話になる人が増えすぎると、医療機関がパンクします。感染者数が医療機関の能力を超えないようにしたいので、有効再生産数 Re をどの程度コントロールすれば良いのかがポイントになります。

Re を小さくすると、感染者ピークの高さが小さくなり、ピークの幅が広がり、ピークの位置が右にずれます。これが対策の狙いだということが、グラフの変化からよく理解できます。

※ 微分液式から差分形式への変換は、100%の自信がありませんので、批判的にご覧頂き、間違いがあればご指摘下さい。

▲目次に戻る



4.純正Casio Basicへの移植

さて、上の差分方程式が正しいものとして、これをCasio Basicに移植します。

実際のグラフ描画の部分は、当ブログの強力サポータである Colon様の手によるものです。これが SIR (Ver 1) です。
管理人は、差分化形式での計算方法を Colon様に提供し、パラメータ一覧・入力部分の作成を行い、SIR2 (Ver 2) にしました。

管理人は、グラフ描画関係の関数をこれまでプログラムで使ったことが無かったので、Colon様のコードはとても勉強になります。きちんと動くプログラムのソースはをよく読むのは、最善の勉強方法ですね。SIR2 のグラフ描画部分は殆ど SIR と同じです。


プログラムの基本構成

tS(t)R(t)I(t) の値をエクセルでの計算式に基づいて、それぞれ List 1List 2List 3List 4 に格納し、このリストで 数式を定義し、最後に DrawFTG-Con 関数か DrawFTG-Plt 関数を用いて、定義した数式をグラフとして描画します。
なお、SIR2 では時間刻みΔt を 1 に固定しました。

fx-CG50 (OS 3.30) / fx-CG20 (OS 3.11) のソフトウェアマニュアル、8-31 ページに以下の記載があります;
Manual8_31

これだけでは簡潔すぎて分かりにくいと思いますので、プログラムの詳細については実際に SIR2 のソースを見て下さい。


プログラムを使ってみる

SIR2 を起動すると、パラメータ一覧・入力画面になります。以下のように初期値を決めました。
SIR_CG_Param_1s ・[0]キーでグラフ描画
 ・[1]キーで基本再生産数 R0 を変更
 ・[2]キーで接触抑制率 p を変更
 ・[3]キーで隔離率(回復率) c を変更
 ・[4]キーで最初の人口 N を変更
 ・[5]キーで時刻1での初期感染者数を変更
 ・[6]キーで横軸(時間軸)の最後を変更
 ・[EXIT]キーでプログラム終了
 ※ 有効再生産数 Re も表示しています

新型コロナウィルスに罹患してから回復するのに2週間程度かかることが分かってきましたので、1週間あたりの回復率=隔離率は 0.5 として良さそうです。これを初期値にしました。それに関連して、時間刻みを1週間としました。

パラメータ一覧・入力画面で、[0]キーを押すとメニューが現れます。
Select_Graph_s 

ここで、Connect タイプか Plot タイプを選択して [EXE] を押すとグラフが描画されます。

SIR_CG_1s SIR_CG_5s 
Connectタイプ                  Plotタイプ

感染者のピークは 28週に現れます。

さて、このグラフ描画で使った初期設定のパラメータでは、有効再生産数 Re = 1 となっています。これは1人が1人を感染させる状況ですので、感染は広がります。

この状態で [F1]を押すと、3つのグラフのどれかを [↑] / [↓] キーで選択できます。赤い色の式が表示されたら、赤い感染者数のグラフが選択されたことになり、分かりやすいです。そして、[←] / [→] キーでグラフに沿ってカーソルを移動でき、カーソルのある位置の座標値が表示されます。これで、ピークの位置にカーソルを移動すると、そこが28周目だと分かります。

これは、グラフ関数電卓内蔵のグラフ描画コマンドに内蔵されている機能です。

グラフが表示された状態で [EXE]を押すとメニューが表示されるので、そこで 3:Reset Parameters を選びます。
ResetParameter_s 
ここで、[EXE][3] を押すとパラメータ一覧・入力画面に戻るので、
接触抑制率 p0.7、つまり70%に変更してから、[0]を押してグラフを再び描画します。

SIR_CG_Param_2s  SIR_CG_2s 
有効再生産数 Re が 0.751 未満になり、赤い感染者ピークが半分以下になり、ピークの位置が47週まで遅れることが分かります。医療リソースに余裕が生まれ、必要な体制を整えるための時間が稼げます。


再びパラメータ一覧・入力画面に戻ります。ここで 接触抑制率 p  をさらに上げて 0.75 にして、グラフを描画します。

SIR_CG_Param_3s SIR_CG_3s 
有効再生産数 Re =0.62 とさらに低くなると、感染者ピークが60週まででは見えにくくなっています。

そこで、x軸(時間軸)を 90 週まで長くするように変更してみます。

SIR_CG_Param_4s SIR_CG_4s 
すると、感染者ピークが大幅に減り、 72週まで大幅に遅れることが分かります。
接触抑制率を上げるのは、確かに大きな効果があることがグラフで可視化できました。

有効再生産数 Re を下げる効果が確認できました。
実行再生産数 Rt は集団免疫率までも加味したものなので、Re よりは小さい値になると思います。

最も単純なSIRモデルに、接触抑制率 p だけを含めた今回の極めて単純なモデルでも、おおまかな傾向が分かりました。


メモリエラーへの対処
ところで、List に多くのデータを格納するので、残りメモリが少ないとメモリ不足によるエラーが発生することがあります。
MemoryERROR_s 

この場合は、メインのアイコンメニューで Memory を選び、メモリマネージャーでリストファイルを削除すれば問題は解決します。
Memory_s MemoryManager_s 
メモリマネージャで[F1]を押して、F1:Main Memory を選び、

LISTFILE_s DeleteLISTFILE_S 

LISTFILES フォルダを [F1]SELECT し、[F6]DELETE します。すると削除確認のポップアップが現れるので、Yes:[F1] を押します。

Deleted_s  

すると、リストファイルがフォルダごと削除されたことが確認できます。これでメモリの問題は解決です。

▲目次に戻る



5.おわりに

最初の1年は Re が小さくなるように行動制限をかけ、次の1年は行動制限を緩くして Re が大きくなったとき、感染者ピークのグラフがどのように変化するかを調べるシミュレーションにするなど、SIR2 プログラムには色々な改造案が考えられます。

今後の政府の方針を見ながら、現実に即したシミュレーションプログラムを作ってみては如何でしょうか?

皆様からのプログラムのご投稿やご提案を歓迎致します。

▲目次に戻る



管理人の独り言:

未知の感染症への対応は、疫学的な正当性と経済的な正当性のせめぎ合いだと思います。疫学的正当性を貫けば経済的死者数(自殺)が増え、経済的正当性を貫けば病死者数が増えます。このせめぎ合いのなかで、死者数を最小化するための着地点を見いださなければなりません。

現在の未知の新型コロナウィルスの蔓延は、過去に事例がありません。特に最近の日本では、幸いなことに感染症(SARS、MARS、鳥インフルエンザなど) の被害があまり大きくならずに済んでいて、諸外国に比べて感染症に関する日本国民全体の危機感が低かったと思います。すなわち国民の代表である政治家も危機感を持っていなかったと思います。

過去に例をみない事態を処理するのは、霞ヶ関の官僚や地方のお役人には苦手な分野です。平時には法律に則って緻密な行政を執り行うのが役人の本来業務です。法律を超えることは許されていません。前例に捕らわれず、新たな法律を作り、時には超法規的な措置を行うのは政治家の役割、政治家にしかできないことです。政治家と役人が緊密に連携し、現実を科学的に理解し、大胆な発想で国民の生命や財産を守って頂きたいと思います。

明治時代の先達は、西欧の Economics に "経済" という日本語を与えてくれました。この言葉は「世を治め、民を救う」という意味の "経世済民" が語源です。疫学的な解決だけでなく、バランスの良い疫学対策と経済対策を強力に進めて頂くよう切に願います。

我々国民は、政治家のパフォーマンスをしっかりチェックし、我々の権利である投票で正しく判断したいものです。


当ブログでは異例の意見表明ですが、今回だけは例外としてお許しください。





応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




keywords: プログラム関数電卓、コロナウィルス グラフ関数電卓

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

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

fx-CG20 / CG50 日本語化計画

 2018/08/15
追記・修正 2018/08/16



fx-CG20 / CG50 は多言語化対応していて、買ってきた時は英語表記になっているが、他の言語を選べる。ヨーロッパ言語だけでなく中文があるのに日本語がないのは、単にフォントが準備されていないだけだと分かり、チョット残念だ。
 
当ブログの読者 Colon様が、電卓のOSの内部調査を進めてゆくうちに、この問題への解決策を提示してくださった。

なお、Colon様によれば、現状は Ver 0.10 で、日本語化はまだ不完全とのこと。今後の進展が楽しみだ。

SystemManager  

このように、一部中文フォント混じりの日本語化ができる。


日本語化の手順

1.先ず、アドイン言語ファイルをダウンロード
   ダウンロード Ver 0.10JPN0010,zip
   ダウンロードファイルを解凍し、アドイン言語ファイル japanese.g3l を得る

2.ダウンロードファイルを電卓にインストール
   fx-CG20 / CG50 とPCをUSBケーブルで接続
   電卓画面に Select Connection Mode ポップアップが現れる
   そこで [F1] (USB Flash) 選択
   エクスプローラで 電卓のドライブ (USBドライブ)を開く
   電卓ドライブのルート (アドインの転送場所) に Japanese.g3l をコピーする
    CG_Root
ルートとは?
fx-CG50をPCに接続してUSBドライブとして認識した状態で、fx-CG50が仮に D: ドライブだったとします。
ファイルエクスプローラを開き、"PC" を表示します。
そして、D: ドライブを開きます。
ここをルートと呼びます。
ここに日本語化ファイルを入れてください。

3.電卓のシステムマネージャで設定変更
   [MENU] キーで MAIN MENU 表示
   System を選択
     SystemManager_Eng 
   [F3] (Language) 選択
     Lang_Eng 
   言語リストから Japanese 選択
     Select_Jpn_in_Eng 
   Japanese を選択すると、さっそく確認画面が日本語化されている
     Mes_in_Jpn 
   言語リストも日本語化されている
     Lang_Jpn 

日本語化された画面

MainMenu1.png MainMenu2 

SystemManager Light 

Power Version 

Battery 

漢字は、中文の簡体字なので、日本語とは少し異なる。


歴史的には、明治時代に欧米の文化、社会システム、科学技術を学び、良いところを貪欲に取り入れるために、新しい概念や基本的な考えに必要な言葉が日本語化され、日本語の教科書で教育が行われた。つまり、外国語を学ばずとも一般国民が欧米の新しいものを日本語で学び、考えることができたわけだ。"社会"、"会社"、"銀行"、"科学"、"理科"、"数学"、"電子"、"工学" など普通に使っている言葉の多くが、この時代に発明された日本語で、本質を捕らえた見事な造語だと私は思う。これは、国力を急激に発展させる "富国強兵、殖産興業" 政策に大きく寄与した。しばらくして、これらの新しい漢字の造語が中国に逆輸出され、同じ漢字文化圏なので共有されるようになった。

fx-CG20 / CG50 で中文を言語に選択して表示される漢字用語の殆どが、明治時代に日本で発明された用語なのが興味深い。但し現在使われている簡体字は、チョット分かりづらいのが残念だ。


作者 Colon様からのメッセージ

日本語アドインを作り始めたきっかけは、sentaro様によるアドイン、C.BasicがGBフォントに対応したことです。
GBは中国語の文字コード体系で、仮名文字が含まれています。このことから、以前より「GBを出せればある程度の日本語化ができる」と考えていました。

その後、GBフォントを表示する方法を発見し、C.Basicへの導入や日本語アドイン作成に至っています。

導入が長くなりましたが、伝えたいのはここからです。(^^;
• 日本語化は不完全なので、一部非対応です。
• 日本語化してほしいメッセージがありましたら、こちらのコメント欄でお寄せください。m(_ _)m
• 既に日本語化しているものについても、改善のアドバイス等ございましたらよろしくお願いいたします。

最終的には、CASIOの方で日本語対応してほしい、というのが私の考えですが、正式に日本語フォントが導入されれば、C.Basicへの導入や関西弁アドインなど考えられます。(笑)

ところで、この日本語アドインはC.Basicでのプログラミングにより作成しています。
C.Basicについても是非チェックしてみてください!!




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 

 
keywords: fx-CG20、fx-CG50グラフ関数電卓、日本語化

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

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

fx-CG50 でフラクタル - シダの葉

2017/10/31
修正 2017/11/01
追記 2017/11/21
追記 2017/11/23

fx-CG50 でフラクタル - シダの葉


akatuki様のブログ "高機能電卓の情報" で  fx-CG50 国内発売記念として「シダの葉グラフィックス」の記事に興味深いフラクタルねたが投稿されました。

これをベースに sentaro様が fx-CG50 のアドインを作成されました。

fx-CG50 Shida Addin Result Image 
fx-CG50 のカラーグラフィックスの表現力がよく分かる結果画像ですね。
3万ドットの描画ですが、6秒程度で描画が終わります。


一方、このアドインを sentaro様 と管理人とで Casio Basic に移植して SHIDACG.g3m を作りました。これを走らせたところ描画が終わるのに40分程度 [2017/11/01 修正] かかりました。

fx-CG50 Shida Casio Basic PxlOn Result Image 
移植したものなので、描画はほぼ同じなのは当然です。fx-CG50 の高精細カラーLCDに1ドット単位で描画するには、PxlOn コマンドを使うしかありませんが、とても処理の重いコマンドです。このようなグラフィックス描画は、fx-CG50 の 純正Casio Basic には荷が重いということが分かります。

[2017/11/21 追記]
ところで、アドイン版 Casio Basic - C.Basic for CG アルファ版 で実行すると、54秒と大幅に高速化しました。さらに  fx-CG50 用チューンアップツール - Ptune3 で [F5] でプリセットされた設定にして 210MHz にオーバークロックするとさらに高速化した20秒で描画完了しました。
 
[2017/11/23 追記]
アドイン版 Casio Basic - C.Basic for CG α版 で、Ptune3 ([F5] の設定) 併用で整数演算を宣言して実行すると7秒で描画。アドインに近い高速化が達成され、C.Basic for CG の高速化の実力が分かります。なお、SHIDACG.g3m を変更して整数演算に対応した SHIDACGI.g3m を使う必要があります。

 
ちなみに、ViewWindows で論理座標系を設定して、PlotOn コマンドを使って描画すると1ドットが 3x3 ピクセルとなり、グラフィックス描画は粗いものになります。

fx-CG50 Shida Casio Basic PlotOn Result Image 
この結果画像では、高精細カラーグラフィックスの良さがありません。fx-CG50 Casio Basic での論理座標系は、fx-9860GII との互換性を保つために、1ドットが 3x3 ピクセルになっています。仕方有りません。

ちなみに、SHIDACG.g3m のソースで、下から3~4行目は

PxlOn G,H
'PlotOn H,G


としてあり、PxlOn G,H をコメントアウトし、'PlotOn H,G のコメントアウトを外してから実行すると、上の結果が得られます。

さて、現在 sentaro様により C.Basic for CG の開発が進められています。fx-9860GII用 C.Basic は、本ブログで既に応援しておりますが、それの fx-CG20 / CG50 対応版です。C.Basic はアドインに近い速度で Casio Basic を実行できる開発&実行環境です。

冒頭のアドインによる高速描画は、C.Basic for CG のポテンシャルを示していると言えます。是非とも フラクタルを C.Basic for CG で走らせてみたいものです。登場が楽しみです。



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




keywords: CasioBasicプログラム電卓、fx-CG50、C.Basic
リンク集 | ブログ内マップ




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

Casio Basic で作る "お気に入りプログラムリスト"

2017/09/01
追記・修正 2017/09/02
追記 2017/09/28

[2017/09/02] プログラムアップデート、fx-9860GII 用プログラム追加.


fx-CG50 を入手し、今は fx-5800P と共に日常使いにしていますが、fx-5800P に比べて fx-CG50 の使いにくい点を工夫してみたので紹介します。

fx-5800P ではプログラムをお気に入り登録しておけます。そして [FILE] キーを押せばお気に入りプログラムリストが表示され、そこからプログラムを起動できます。この機能が 通常の電卓モード (COMPモード)で使えるところに大きなメリットがあります。
Keys-2  

fx-5800P の便利な [FILE] キーが、残念なことに fx-CG50 や fx-CG20 や fx-9860GII などのグラフ関数電卓にはなく、とても不便に感じます。そこで、お気に入りプログラムを素早く起動するためのメニュープログラムをCasio Basicで作り、プログラムリストのトップに来るようにする...という作戦でプログラムを 2種類 作ってみました。

今回は fx-CG50 で作りましたが、fx-CG20 でもそのまま使えます。


プログラム例1

Menu1

 MENU コマンドを使ってみました。プログラム例2に比べて記述量が少ないので入力は相対的に楽です。但しメニューを終了するには [AC] キーを押すか、メニューを終了させるためのメニュー項目を作る必要があります。1画面のメニュー項目は6個、7個以上はスクロールさせて選択できる機能が自動的に追加されます。7項目に メニュー名 "Exit" を追加し、ジャンプ先をプログラムの最後にすることで、プログラムを終了するようにしています。Return コマンドを実行させてプログラムを終了させても良いでしょう。いずれにせよプログラム終了のためには、矢印キーを押してスクロールする手間が必要になります (プログラム例2は、[EXIT] キーを押すだけでメニュー終了できる)。
お気に入りプログラムが7個以上ある場合は、MENUコマンド内蔵のスクロール機能が大いに役立ちます。
なお、この例で呼び出している Quotation 以外のプログラムは、プログラムライブラリに収録してます。

プログラム名を '~MENU としました。頭に ' を付けるとプログラムリストの1番上に来ます。
Menu1_ProgList 

プログラムリストが表示されている時、[EXIT] キーを押せば、リストの最初が表示されます。
fx-CG50 の電源を入れ、[MENU] [log] (B) [EXIT] [EXE] とキーをチャッチャと押せばメニューが表示されるので、かなり便利になります。

プログラムダウンロード: MENU_1.zip

プログラムソース: '~MENU.g3m
Menu_1_CG50_src  


プログラム例2

Menu2
 

MENUコマンドを使わず、テンキーでメニュー番号を押してメニュー選択します。項目が6個の場合は、メニュー終了に [EXIT] キーを割り当てられ、画面スクロール無しに1手間で終了できます。なお、Quotation 以外の呼び出すプログラムプログラムライブラリに収録しています。
お気に入りプログラムが7個以上ある場合は、このプログラム例2はそのまま使えず、プログラム例1を使う方が楽でしょう。

プログラム名を 'MENU としました。頭に ' を付けるとプログラムリストの1番上に来ます。
Menu2_ProgList 

プログラムリストが表示されている時 [EXIT] キーを押せばリストの最初が表示されます。
fx-CG50 の電源を入れ、[MENU] [log] (B) [EXIT] [EXE] とキーをチャッチャと押せばメニューが起動するので、かなり便利になります。

 プログラムダウンロード: MENU_2.zip [2017/09/02 修正]

プログラムソース: 'MENU.g3m [2017/09/02 修正]
Menu_2_CG50_src    


呼び出すプログラム

fx-9860GII シリーズへの移植

MENU コマンドを使ったプログラム例1は、そのまま fx-9860GII シリーズで動作します。プログラム例2は、カラー設定のコマンドを削除するだけで fx-9860GII シリーズで動作します。

fx-9860GIII へ移植するには、以下の方法があります;[2017/09/02 追記]
  • 3Pin ケーブル (SB-62) で fx-CG50/20 とfx-9860GII シリーズを接続しプログラムを転送する。ファイル形式が g3m から g1m へ自動的に変換される。カラー設定コマンドは自動的に @ に変換されるので、転送後に @ を削除すれば正常動作する。
  • 手入力する。カラー設定コードは使わない。
※ 最近は グラフ関数電卓に 3Pin ケーブル (SB-62) は付属していません (以前は付属していたので残念です)。私が購入した時は ¥2,700 でした。

fx-9860GII シリーズ用プログラムファイルのダウンロード [2017/09/02 追記]
プログラム例1 '~MENU.g1m (fx-9860GII 用): MENU_9860_1.zip
プログラム例2  'MENU.g1m (fx-9860GII 用):MENU_9860_2.zip

Menu_9860_1 Menu_9860_2 


私の運用例

使用頻度の高いプログラムは6個以下なので 'MENU (例2)から呼び出せるようにし、頻度は低いが必要な時にサッと起動したいものは '~MENU (例1)に登録し、両方を併用しています。Program List の一番上に 'MENU がその下に ’~MENU があるので便利に運用しています。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ





keywords: プログラム関数電卓、fx-CG50、クロックアップ、Ptune3

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

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

楽屋裏 - 最新プログラム電卓 fx-CG50 の記事

楽 屋 裏
e-Gadget


2017/07/04


fx-CG50  2017/01/09 に Casio Ameria が グラフ関数電卓の最新機種 fx-CG50 の発売をアナウンスしたことが分かり 記事 にしました。

アナウンス通りに 2017年4月から欧米で発売されました。国内では fx-CG20が生産終了となっているのでいずれ発売されるでしょうが、その時期は未発表です。

fx-CG20 が国内で発売されたのは、欧米で発売されてから1年後だったので、fx-CG50に国内発売もかなり先になるかも知れません。私も国内発売を待ちきれずに、eBay で購入し到着を待っているところです。入手したら Casio Basic 動作の観点から評価記事を書く予定。

既に海外から fx-CG50 を取り寄せて早速記事にしている方がいらっしゃるので、それを紹介します。Google で検索して、実際に入手したという日本語の記事を調べたところ、2017/07/04 時点で以下の2つのサイトがあります。


OptoEleMechの日記 - CASIOの最新関数電卓 (fx-260 SOLAR II、fx-CG50、fx-CG500)

古い機種を集めて紹介しているサイトはよく見ますが、最新機種を積極的に収集して紹介しているサイトは珍しいと思います。複数メーカーに渡って最新機種の様子がよく分かります。
ベンチマークの結果も公開されています。⇒ 総和のベンチマーク結果
このベンチマークは、関数電卓として内蔵されている総和関数 (Σ) を使ったもので、内蔵関数機能の評価を行っていることになります。


とね日記 - 最新のグラフ電卓 CASIO fx-CG50 (2017)

カシオ初のプログラム関数電卓 fx-201P の次の機種 fx-202P から 最新の fx-CG50 までの複数機種で同じ積分計算をさせてベンチマークの結果を公開されています。このベンチマークは、三角関数を含んだ積分計算をプログラミングしたもので、プログラム機能の評価を行ったことになります。





今後、随時追加してゆきます。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ





keywords: プログラム関数電卓、fx-CG50

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

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

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

やす (Krtyski)

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


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

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR