Casio Basic入門2

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します.
最終:2021/06/24


3. fx-5800P CasioBasicの コマンド一覧

fx-5800P Casio Basic の主なコマンド

(1) 入力
 ・入力命令:?
 ・Getkey

(2) 出力
 ・出力命令:
 ・文字列出力: "   "
 ・Cls
 ・Locate

(3) 代入
 ・代入:

(4) ジャンプ
 ・Goto / Lbl 
 ・Dsz / Isz 
 ・ 

(5) 条件分岐
 ・If 文: If ~ Then ~ Else ~ IfEnd 

(6) ループ(繰返し)
 ・Goto / Lbl
 ・Do 文: Do ~ LpWhile 
 ・While 文: While ~ WhileEnd 
 ・For 文: For ~ To (~ Step) ~ Next 

(7) 関係演算
 ・= / / > / / < /

(8) 論理演算
 ・And / Or / Not

(9) 配列変数
 ・Z[ ]

(10) リスト
 ・List

(11) 行列
 ・MAT
 ・det( )
 ・Trn( )
 ・MAT A-1
 など

(12) 実行制御コマンド
 ・Prog
 ・Break
 ・Return
 ・Stop

(13) 各種関数
 ・Int( ) / Frac( )
 ・log( )
 など

(14) 出力設定コマンド
 ・EngOn / EngOff
 ・Norm / Fix / Sci
 など


※ CasioBasic 特有のものは、入力:?出力:代入:ジャンプ命令:Dsz / Isz / ⇒ です。これらの中で、特にジャンプ命令は、非常に利用価値の高いものです。


さて、多くのプログラミング言語と比較すると、カシオのプログラム電卓の CasioBasic は、覚えるべき項目が少ないのが利点です。一般的にパソコンでプログラミングを覚えるには、WindowsなどのOSの動作に関する知識、APIやMFC、様々な機能の多層構造などを知らなくてはなりません。プログラミングの本質を覚える前にギブアップとなりやすいと思います。

Casio Basic は敷居の低いプログラミング言語です。

[2021/06/24 追記修正]
いくつかのグラフ関数電卓を入手し、これらの Casio Basic についても調べています。機種が異なっても、ハードウェアの違いに伴うコマンドの違いは僅かです。グラフィックスに関しては、モノクロ液晶搭載グラフ関数電卓について詳しく調べて Casio Baisc入門 G01~G14 で紹介しています。そして、カラー高精細液晶搭載の fx-CG50  までを含めて Casio Basic の互換性について調べました。

Casio Basic - 機種別の互換性

これを見て改めて思うことは、機種間の互換性がかなりのレベルで保たれていることです。Casio Basic 入門には 価格面で入手し易い fx-5800P や fx-9750GIII が適していると思います。携帯性と関数電卓としての使いやすさの fx-5800P か 機能と処理速度の fx-9750GIII (マニュアルは英文のみ、但し fx-9860GII の日本語マニュアルがほぼそのまま使える) かで選択してください。

グラフィックスまでまで含めたプログラミングを楽しむのならば、現状では実質購入総額で 1万円を切っている fx-9750GIII も入門機として良いかも知れません。但し高精細カラー液晶を搭載し1万円程度で入手可能な fx-CG50 はお勧めです。

Casio プログラム電卓の価格動向


「CasioBasic入門」では、実際にプログラムを作りながら、多くのコマンド類を解説しています。作って面白く、ある程度実用的なプログラムを題材に取り上げていると思います。基本は fx-5800P 向けの内容ですが、グラフ関数電卓への移植についても触れています。


Casio Basic 入門と並行して、コマンドリファレンスも作っています。

⇒ CasioBasicコマンドリファレンス: 目次 (随時拡充中)

当初 fx-5800P 向けに書いていますが、グラフ関数卓電卓への適用についても、順次付記してゆきます。




4. CasioBasicを使ってみる

実際に手を動かしてプログラムを作ってみることが、プログラミングのスタートです。そして、正しく動作する簡単なプログラムを改良することが、プログラミング習得の最短の道だと思います。

そこで、実際にプログラムを一緒に作りながら、ゆっくりと確実に進めてゆきます。



Chapter 0
プログラム作成・実行の操作ポイント

多くの場合、電源を入れると以下のCOMPモードの画面になります。

Compモード 

fx-5800P は電源を切った時の状態が保存され、次に電源を入れた時に保存された状態で画面表示されます。従って電源を入れた時、上記のCOMPモードでない可能性もあります。

fx-5800P では、左上にある [MODE] キーが操作の起点となります。どのような状態であっても、[MODE] キーを押すと必ず以下に示すモード選択画面になります。

ch1-ModeSelect 

このモード選択画面では、メニュー番号を入力する以外に、この画面からの遷移はできません。

通常の電卓の画面にするには、[1] (1:COMP)、プログラムモードにするには、[5] (5:PROG) とします。

[5] (5:PROG) を選ぶと、以下の Program Menu 画面になります。

TC7-ProgMenu 

この Program Menu 画面から抜けるには、[MODE] キーを押してモード選択を行います。

プログラムの作成、実行、編修は、全てこの Program Menu 画面を起点に操作します。
プログラムの作成、実行、編修中に、[EXIT] キーを何回か押せば、必ず Program Menu に戻ります。


プログラムの作成、実行、編修でポイントとなる画面は、以下の4つです;

1) Program Menu 画面: [EXIT] キーを何回か押せばここに戻る

TC7-ProgMenu 


2) Prog Edit 画面: Program Menu から [3] (3:EDIT) で編修するプログラムを選択

TC7-ProgEdit 


3) Prog List 画面: Program Menu から [2] (2:RUN) で実行するプログラムを選択

TC7-ProgList 


4) プログラム編修画面: プログラムの作成、編修を行う

TC3-5 


先ずは fx-5800P の取り扱い説明書 の88ページ以降の説明を読みながら、実際に操作をしてみてください。また、ハードカバーの裏側に説明のあるステッカーが貼ってありますので、それも少しは参考になります。

1. 最も多用するキー
プログラムの編集画面が表示されている時は、

[FUNCTION] キー

[EXIT] キー

[MODE] キー


を押すと、必要なメニューが出てきます。これら3つのキーから始まる操作で、プログラム作成作業の殆どを行えます。


1.1 [FUNCTION] キー
これを押すと出てくるメニューのうち、最も多用するのが、「3:PROG」メニューと、「1:MATH」です。ここから Casio Basic のコマンドを選んで、編集画面でコマンドを書き込みます。

1.1.1 [1] (1:MATH) メニュー
様々な関数を選択して、プログラム編集画面に書き込めます。さらに、ミリ(m)、マイクロ(μ)、キロ(k)、メガ(M)といった、3桁区切りの接尾記号も、その本来の意味で使えます。例えば1000と書く代わりに1kと書けます。
また、"  " で括られた中には、数字やアルファベット以外にも、表示すべき文字列を書き込めますが、「1:MATH」メニューから文字として書き込むこともできます。

1.1.2 [3] (3:PROG) メニュー
ほぼ全てのコマンドを、このメニューから選んで書き込めます。
また、"  " で括られる中には、数字やアルファベット以外にも、表示すべき文字列を書き込めますが、「3:PROG」メニューから文字として書き込むこともできます。例えば、"<EXE>" などという表示は、「3:PROG」 メニューから、大小関係を判定する <> を選んで文字として使えます。


1.2 「EXIT] キー
1つ前の表示に戻るために使います。分からなくなったら、[EXIT] キーを何度か押せば Program Menu へ戻ります。


1.3 [MODE] キー
Program Manu から抜けて、関数電卓の画面へ戻る時には、[1] (1:COMP) を選びます。
もし、うっかり [MODE] を押してしまうことがありますが、そこで出てくるメニューから [5] (5:PROG) を選べば、プログラム編集画面へ戻れます。この場合でも、作業中の内容はj保存されています。



2. プログラム実行の手順

作成したプログラムを実行するには、2つの方法があります。

Program Menu 画面からのプログラム実行
COMPモードからのプログラム実行: [FILE] キー


2.1 Program Menu 画面からのプログラム実行
Program Menu 画面で、[2] (2:RUN) を選び、ここで表示される Prog List からプログラムを選べば、実行できます。

2.2 COMPモードからのプログラム実行: [FILE]キー
[MODE] [1] (1:COMP) で遷移する、通常の電卓画面(COMP モード)で、プログラムを実行したい時に [FILE] キーを押します。そこで現れるプログラムリストから、プログラムを選んで実行します。


2014/01/21追記: 上記いずれの方法においても、プログラムリストが表示されている時、目的のプログラム名の頭のアルファベットを入力すると(例えば "P")、そのアルファベット("P")で名前が始まるプログラム名にジャンプします。もし "P" で始まるプログラムが無い場合は、アルファベット順で "P" よりも後ろの文字で始まるプログラム名までジャンプします。
プログラムリストが表示されている時はアルファベット入力モードになっているので、例えば "P" で始まるプログラムへジャンプさせるには、[ALPHA] キーを押さずに、いきなり [6] キー(このキーの右上にピンク色で "P" と印刷されています)を押すだけのワン・アクションなので、便利です。


3. アルファベットや数字の入力

[ALPHA] キー と [SHIFT] キーを使って、通常入力モード、ALPHAモード、SHIFTモードを切り替えて入力します。

[ALPHA] を押すと、画面左上に A が表示され、ALPHA入力モードになっていることを示し、キーの右上にピンク色で印刷されているアルファベットや記号を入力できます。但し、キーを1つ入力する前に必ず [ALPHA] を押す必要があります。[ALPHA] をもう一度押すと、画面左上の A  が消え、キーに白で印刷されている数字や関数などを入力できます(通常入力モード)。

[SHIFT] を押すと、画面左上に S  が表示され、SHIFT入力モードになっていることを示し、キーの左上にオレンジ色で印刷されている記号や関数を入力できます。もう一度 [SHIFT] を押すと、画面左上の S  が消え、キーに白で印刷されている数字や関数などを入力できます(通常入力モード)。

[SHIFT] を押してから [ALPHA] を押すと、画面左上に A のみが表示され、ALPHA入力モードであることを示し、ALPHAモードで入力できるアルファベットや記号を、連続して入力できます。いちいちキー一つごとに [ALPHA] を押す必要がありません。


これで、プログラムを作成する準備ができました。


つづく...

Casio Basic (超)入門 /  Casio Basic入門3 / 目次



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


 


keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

関連記事

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

アドイン Casio Basic - トップページ

C:Basic - アドイン Casio Basic
<Top Page>

内容の更新や修正を随時行います.

初版 2015/12/18
更新 2020/05/31
更新 2021/06/13



C.Basic for FX 最新版: Ver 2.45 beta build 20 [2020/05/21]
C.Basic for CG 最新版: Ver 1.45 beta build 20 [2020/05/23]


目 次
  C:Basicとは?
  最新バージョンのダウンロード
  C.Basic のインストール
  C.Basic の使い方とコマンドリファレンスなど
  チューンアップツール・アドイン
  C.BasicC:Basic の潜在能力 - サンプルプログラム
  C.Basic 英語版Webマニュアル 
[作成中]
  最近のアップデート履歴
  サポートページ
  
 C.Basic for FX はこのページでサポートします
  
 C.Basic for CG は以下のページでサポートします
   ・C.Basic for CG ベータ版公開 - Part 1

    ・
C.Basic for CG アルファ版公開 - Part 3 (旧版)
   ・
C.Basic for CG アルファ版公開 - Part 2 (旧版)
   ・
C.Basic for CG アルファ版公開 (旧版)



最近のアップデート履歴

  C.Basic for CG
  [2020/05/23] C.Basic for CG Ver 1.45 beta build 20 が差替えアップデート 
   - さらに使いやすく色々と変更していってみる版

    ⇒ 詳しくは C.Basic for CG サポートページへ

  C.Basic for FX 
  [2020/05/21] C.Basic for FX が Ver 2.45 beta build 20 にアップデート
  - さらに使いやすく色々と変更していってみる版


(build 20)
  • If [Flase] ~ ElseIf 間の飛越キャッシュの不具合を修正しました。
  • Syetem()コマンドでOSのマイナーバージョンが取得できるようになりました。
    (書式)System(-22)
  • やす(Krtyski)様作成のSystem()コマンドサンプルプログラム(Graph90+E対応版)をアップデートしました。(System_sampleフォルダ)
(build 19)
  • System(-1)での機種判定にfx-9750GIIIを追加しました。
    0:fx-9860G
    1:fx-9860G Slim
    2:fx-9860GII(SH3)
    3:fx-9860GII(SH4A)
    4:Graph35+EII(SH4A)
    5:fx-9860GIII(SH4A)
    6:fx-9750GIII(SH4A)
  • やす(Krtyski)様作成のSystem()コマンドサンプルプログラム(fx-9750GIII対応版)をアップデートしました。(System_sampleフォルダ)
  • Try~TryEndコマンドからBreakで脱出した場合、それ以後、[AC]中断もAcBreakも効かなくなる不具合を修正しました。
  • ReadGraph/WriteGraph/DotGet/DotPutコマンドを現在のVRAMに作用するように仕様変更しました。
  • 描画対象VRAMを退避されているテキストVRAM領域とグラフィックスVRAM領域に変更するScreen.Vコマンドを追加しました。
    (書式)Screen.V
     デフォルトのVRAMに戻します。
    (書式)Screen.VT
     テキストVRAMの退避領域を描画対象にします。
    (書式)Screen.VG
     グラフィックスVRAMの退避領域を描画対象にします。
(build 18)
  • エディタのカーソル位置記憶がプログラム実行終了後にリセットされていいた不具合を修正しました。(build12でのエンバグです。)
  • 行列表示を修正しました。
  • セット・アップで隠しメモリのOn/Offは確認ポップアップを出すようにしました。
(build 17)
  • プログラム開始時に?入力でアルファモードになっていた不具合を修正しました。(build16エンバグ)
  • CPLXの行列表示が異常に遅かったのを修正し、3列から4列表示に変更しました。
  • 隠しメモリの初期化を修正しました。
(build 16)
  • System(-1)での機種判定にfx-9860GIIIを追加しました。
    0:fx-9860G
    1:fx-9860G Slim
    2:fx-9860GII(SH3)
    3:fx-9860GII(SH4A)
    4:Graph35+EII(SH4A)
    5:fx-9860GIII(SH4A)
  • やす(Krtyski)様作成のSystem()コマンドサンプルプログラム(fx-9860GIII対応版)をアップデートしました。(System_sampleフォルダ)
  • 自動インデント機能でのSwitch~Case~SwitchEndの自動整形を改善しました。
  • ElseIfコマンドの直後にコメントがある場合、次のコマンドがIfの場合に終了していた不具合を修正しました。
  • 行列の初期化後に文字列から文字列への代入で代入されない不具合を再修正しました。
    (コピーされない例)
         ClrMat
      "ABC"->Str 1
      Str 1->Str 3
  • Seqコマンドで刻み値が少数の場合に終値に到達しないことがある不具合を修正しました。
    (例)Seq(X, X, 0.1, 1, 0.05 )
  • CPLXモード以外で虚数を使うと無限ループになる不具合を修正しました。(build15でのエンバグです。)
  • 省略乗算の不具合を修正しました。(build15でのエンバグです。)
(build 15)
  • Colon様のサポートにより関数メモリの実装を開始しました。
  • デフォルトのインデックス開始値が0の場合にListの自動確保が出来なかった不具合を修正しました。
  • ファンクションメモリー(Fn)のStore/Recall/SEEのSEEをEditに変更しました。
(build 14)
  • ファンクションメモリー(Fn)のStore/Recall/SEEのSEEで[F5](Edit)を追加し編集可能になりました。
  • ファンクションメモリー(Fn)のStore/Recall/SEEの不具合を修正しました。
(build 13)
  • ファンクションメモリー(Fn)およびグラフメモリー(Y)をデフォルトで数式評価とし、
     文字列関数内および文字列に続く場合は文字列として評価するように変更しました。
     (数式評価)
      fn1->A
      fn1(123)->A
      Locate 1,1,fn1
      Text 1,1,fn1(123)
     (文字列評価)
      "123"+fn1->Str 1
      fn2->Str 2
      StrJoin(fn1,Str 1)
  • 文字列から文字列への代入で代入されない不具合を修正しました。
    (fn3にコピーされない例)
      ClrMat
      "123"->fn1
      "ABC"->Str 1
      Str 1->fn3
  • ファンクションメモリー(Fn)のStore/Recall/SEEを追加しました。
     (※エディタではクリップボードの内容がストア対象です。1行入力では1行全体がストア対象になります。)
  • F_Start/F_End/F_pitchを独立変数に変更しました。
  • ?コマンドで文字列が表示される場合にアスキーコードにデコードしないように修正しました。
(build 11)
  • Screen#、Screen%を連続実行するとエラーになる不具合を修正しました。
  • Screen#、Screen%からListAnsに転送した場合の不具合を修正しました。
    (例)Screen#0,0→List Ans
  • ファイルモードの検索機能を改善しました。
     アルファベットキーを押すと検索窓が開き検索モードになります。
     検索窓では左右移動等、通常の入力が可能です。
     検索窓を解除するには[EXIT]を押してください。
     カーソル上下、[EXE] [F1](EXE) [F2](EDIT) [F3](NEW)キーは検索窓を閉じること無く実行できます。
(build 10)
  • ファイルモードでアルファベットキーによるダイレクト選択時に[SHIFT]、[ALPHA]、小文字や数字が指定が出来るようになりました。
     [F4](A<>a): 大文字小文字切り替えです。
     [F5](CHAR)
     [F5](→Folder): フォルダサーチに切り替わります。
     [DEL]: 一文字戻ります。
     [AC]: 全部消します。
     [EXIT]: 元に戻ります。
     [X^2]: ~
     [^]: '
     [(-)]: @
     [・]: スペース
     [EXP]: "
(build 09)
  • ””コマンドの実行速度が遅かった不具合を修正しました。
  • ファイルモードでアルファベットキーによるダイレクト選択時に2文字以上の指定が出来るようになりました。
     [DEL]:一文字戻ります。
     [AC]:全部消します。
  • ファンクションメモリー(Fn)およびグラフメモリー(Y)に引数が無い場合は文字列として評価するようにしました。
  • インデントの必要なコマンド(If,Else..)の直前で改行した場合にインデントが余分に付加される不具合を修正しました。
(build 06)
  • エミュレータの判定方法をハードウェアID判定に変更しました。(0x8000FFD)
(build 03)
  • ラベルの検索時にコメントでの'#に続くオプションの設定が変更されてしまう不具合を修正しました。
(build 02)
  • VarPtr()コマンドで行列/List/Vctを指定した場合、その添字が常に実数評価されていた不具合を修正しました。
  • FKeyMenuコマンドにカラー引数があってもエラーにならないように修正しました。
(build 01)
  • SortA()/SortD()コマンドに文字配列のソートを追加しました。
    (例)SortA($Mat A)
     Mat Aの文字列が昇順にソートされます。
  • ReadMe、マニュアル更新しました。
  • 行列画面で53以降の拡張領域の一覧表示をサポートしました。
    [←]:26戻ります。
    [→]:26進みます。
  • FkeyMenu(コマンドを拡張しました。
    (書式)FKeyMenu( n[~m], "文字列"/アイコン番号 [,C/M/N/R/I/S/U/L [,アイコン色 [,アイコン背景色]]] )
     ※ "アイコン色" はデフォルトで黒い部分の色指定です。
     ※ "アイコン背景色" はデフォルトで白い部分の色指定です。
     ※ 3 番目以降の引数は省略可能です。引数を省略した場合でも”,"は必要です。
    (書式)FKeyMenu( n[~m], "文字列"/アイコン番号 [,C/M/N/R/I/S/U/L] )
     ※ 3番目以降の引数は省略可能です。引数を省略した場合でも”,"は必要です。
     3番目のオプションは順不同です。
     C:消去します。
     M:マスク処理します。
     m:枠だけマスク処理します。
     N:ノーマル白アイコン。(省略可)
     R:右下が欠けた黒アイコン
     I:四角い黒アイコン
     S:縁取りのある黒アイコン
     U:文字列を1ドット上側に表示。
     L:表示範囲を左右2ドット広げます。
    (例)FKeyMenu (1, "string")
    (例)FKeyMenu (2~3, "longstring",R)
    (例)FKeyMenu (4~5, "longstring",I)
  • やす(Krtyski)様 & CalcLoverHK様 & Colon様作成のFKeyMenu(コマンドのサンプルプログラムを同梱しました。(C.Basic_sample\FKeyMenu_sample)
  • エディタで[SHIFT]を押したときに編集可能空きエリアのサイズをステータスエリアに表示するようにしました。
  • System()コマンドにエミュレータ判定を追加しました。
    (書式)System(-7)
     実機では0、エミュレータでは1が返ります。
  • DBL#モードにおいて、一時停止と変数表示での虚数表示がされていたのを修正しました。
  • 変数表示をINT%,DBL#,CPLXで独立させました。




C:Basic とは?


C:Basic は Casio Basic で楽にコーデイングしたものを高速動作させようというコンセプトでスタートした Casio Basic 上位互換を目指したプログラミング環境で、アドインプログラムとして提供するものです。

fx-9860G 以降で Add-in 機能のある Casio グラフ関数電卓で動作し、純正 Casio Basic プログラムとの互換動作を目指し、さらに純正コマンドの機能を拡張したり、新規コマンドを追加しています。

[2020/05/31 追記]


以前は fx-9860G や fx-9860GII の Add-in プログラムを作成するための Casio純正 SDK が提供されていましたが、これらのモデルは国内では販売中止となっているので、C言語で作成して高速動作する Add-in プログラムは過去のものになっています。2015年に開発が始まった C.Basic は 現在では Add-in プログラム並の処理能力を提供できるレベルにまで進化しています。海外の Planet Casio ではプログラミングコンテストの開発環境の1つに C.Basic が選ばれています (CPC #26 - At the limit of pysics! 参照)。


C:BasicC.Basic
C:Basic は2つの要素を含み、インタープリタ動作するものを C.Basic (ドット1つ)、コンパイラ機能によりさらに高速化するものを C:Basic (ドット2つ) と呼びます。現在は C.Basic のみを提供中、その後 C:Basic を提供予定です。
C.Basic は当初 fx-9860G および fx-9860GII で動作するものから開発が始まりましたが、最近になって 高精細カラー液晶を搭載した fx-CG10 / CG20 および fx-CG50 で動作するものも提供しています。前者の fx-9860Gシリーズ専用版を C.Basic for FX、後者の fx-CFシリーズ専用版を C.Basic for CG と呼んでいます。

C.Basic for FX は国内外でユーザーに鍛えられてきて、Ver 2.00 以降からようやく正式版としてリリースされました。
一方、C.Basic for CG はアルファ版として提供してきましたが、Ver 1.00 以降からベータ版としてリリースされました。
純正Casio Basic と C.Basic / C:Basic について
純正Casio Basic は、言語機能がシンプルで電卓に直接入力して気楽に使えるのが最大の特徴です。限られたハードウェアリソースしか持たない電卓でのプログラミング環境として、最低必要限の機能を有しています。PC上の開発言語と同じことを Casio Basic に要求するのはそもそも考え違いでしょう。

とは言っても Casio Basic は "構造化プログラミング" の考え方でプログラミング可能なので、実用的なプログラムを効率的に作成可能です。ここでいう "構造化プログラミング" は、Donald Knuth, "Structured Programming with goto statement" ACM Comuting Surveys (CSUR) Volume 6 Issue 4, Dec. 1974  (リンク) で主張されている実用的な構造化プログラミングに近いものです。教条主義に陥いることなく、とにかくプログラムソースが分かり易く、バグが出にくく、改造や機能追加が楽なコーディングの方針としてCasio Basicに適用でき有用です。当ブログでは、構造化プログラミングの考え方で、Casio Basicの使いこなしを紹介しています。
Casio Basic は楽に記述できる反面、計算量の大きな処理を行ったり、ビットマップをグラフィックスで描かせると、とても時間がかかります。C.Basic (現行インタープリタ版)は、Casio Basic とほぼソースレベル互換でありながら10~20倍のスピードで実行できます。C:Basic (将来のコンパイラ版) は、予備実験の結果、さらに C.Basic (インタープリタ) の10倍の程度の処理速度になりそうです。
C:Basic プロジェクトは、sentaro様 (本アドインの作者、海外では sentaro21)、Colon様 (システムコールなどOSの深いところまで探索し本質的なところで開発に寄与頂いている), Krtyski (開発のコミュニケーションの場を提供する当ブログの管理人、海外でも Krtyski)、さらに国内外の有志のユーザーの皆様により推進しています。

  ⇒ C:Basic プロジェクト


▋ C.Basic 最新バージョンのダウンロード

 ▶ C.Basic for FX (fx-9860G / fx-9860GII / fx-9860GIII / fx-9750GIII 用)
  ⇒ C.Basic for FX Ver 2.45 beta build 20 (公式最新版)
  C.Basic for FX Ver 2.44 beta build 16 (1つ前の公式最新版)
   ・ C.Basic for FX の入手 (少し前のバージョンも入手できます)

 ▶
C.Basic for CG (fx-CG10 / fx-CG20 / fx-CG50 用)
  ⇒ C.Basic for CG Ver 1.45 beta build 20 (公式最新版)
  ⇒ C.Basic for CG Ver 1.44 beta build 16
 (1つ前の公式最新版)
   ・C.Basic for CG の入手 (少し前のバージョンも入手できます)

注意: 万一に備えて、電卓内のプログラムやデータをバックアップしておくことを勧めます。



C.Basicのインストール

  C.Basic for FX
ダウンロードしたZIPファイルに含まれている CBASIC.g1a を fx-9860G シリーズ、fx-9750GIII、Graph35+EII のストレージメモリに転送します。転送には PCリンクソフト FA-124を用い、電卓とPCをUSBケーブルで接続します。併せてFontフォルダと FontEditフォルダをストレージメモリに転送し、HELPフォルダにある ~~HELP1.g1m をストレージメモリに転送します。
  C.Basic for CG
ダウンロードしたZIPファイルに含まれている CBCGxxx.g3a (xxxはバージョンを示す) を fx-CGシリーズ、Graph90+E のストレージメモリに転送します。転送には、USBケーブルで接続し Windows標準のエクスプローラでファイルやフォルダを操作します。併せて@FontフォルダとFontEditフォルダをストレージメモリに転送し、HELPフォルダにある ~~HELP1.h1m と ~~HELP3.g3m をストレージメモリに転送します。

 詳しくは、C.Basicのインストール を参照。



C.Basicの使い方とコマンドリファレンスなど [最新バージョンに対応しています]

C.Basic for FX

C.Basic for CG
これらのドキュメントは、ダウンロードしたZIPファイルに含まれているものです。



 チューンアップツール - アドイン

電卓内部のクロックを調整して高速動作させるチューンアップツールを C.Basic と一緒に使うと、さらに高速化が可能です。
このプログラムの評判については、下記参照ください;
- @ Unversal Casio Forum
- @ CEMETECH
- @ TI-Planet

管理人は2年以上使っていますが、今のところ問題は起きていません。安全対策がよく考えられていて、おそらく電卓を壊すことは無いでしょう。但し、念のため電卓のデータバックアップは行って下さい。

機種毎に用意されています。

- fx-9860G、fx-9860GII USB POWER GRAPHIC(前期バージョン SH3採用品): Ftune
- fx-9860GII USB POWER GRAPHIC 2(後期初期 SH4採用品): Ftune2
- fx-9860GIII、fx-9750GIII、Graph35+EIIFtune3
- fx-CG10 / CG20: Ptune2
- fx-CG50、Graph90+E: Ptune3


※    違う機種のものを利用しないよう注意してください。

充電池 / 充電器 の紹介
チューンアップすると消費電力が大幅に増えて、1日で電池が空になることもあります。そこで充電池が経済的です。カシオのグラフ関数電卓は、単4アルカリ電池(1.5V) と 単4ニッケル水素充電池(1.2V) が使える。そこでニッケル水素充電池と充電器のお勧めをまとめました。⇒ こちら



C.Basic と C:Basic の潜在能力 - サンプルプログラム

サンプルプログラムを使って、C.BasicC:Basic の潜在能力を見てみましょう。.

ライフゲーム (Conway's Game of Life) - 高速グラフィック描画

C.Basic は純正 Casio Basic の上位互換であり、拡張コマンドや言語機能があります。

ビットマップを素早く更新するようなプログラムを純正Casio Basic で作ろうと考えるのは無謀なことです。しかし C.Basic を使えば、高速ビットマップ更新が可能で、例えばライフゲームを楽しめます。


fx-9750GIII での実行例 - 517世代までの実行時間: 59.4秒
  ダウンロード: ライフゲーム Ver 2.45
  Ftune3 で 235.9MHz にチューンアップ
  C.Basic for FX Ver 2.45 build 20 以降のバージョンを推奨

=====

コンパイラ版の C:Basic をシミュレートするため、ライフゲーム のパターンを1世代更新する処理部分を、ネイティブコードの関数 "DotLife()" に置き換えて実行したのが以下の動画です。 


fx-9750GIII での実行例 - 517世代までの実行時間: 7.8秒
  ダウンロード: ライフゲーム Ver 2.45F
  Ftune3 で 235.9MHz にチューンアップ
  C.Basic for FX Ver 2.45 build 20 以降のバージョンを推奨

517世代までの時間を見る限り 7.6倍高速化しています。将来のコンパイラ版 C:Basic では、これよりも速くなるはずです。

ライフゲームの詳しい説明


2D迷路

以下のような画面全体のグラフィックス描画は、純正Casio Basicではとても時間がかかります。これを C.Basic で走らせると極めて短時間で描画が完了します。

Maze1 

2D迷路プログラムの詳しい説明とダウンロード


3D迷路ゲーム

3D_Maze 

左側の迷路マップの描画は、C.Basic を使うことで極めて高速化できます。右側の3D表示はポリライン処理により純正Casio Basic でも3D描画が軽くなるよう工夫されています。このプログラムでは、C.Basic の独自拡張機能を使いながら 純正 Casio Basicでも動作可能なようになっているのが特徴です。

3D迷路ゲームの詳しい説明とダウンロード


アクションゲーム - DRAGON



これは、C.Basic 独自拡張機能を活用したサンプルプログラムで、高速で多彩なビットマップ処理機能をうまく活用しています。
ゲームとしても飽きないチューニングがされています。このプログラムのソースは、C.Basic 独自拡張機能の理解に役立ちます。

アクションゲーム - DRAGON の詳しい説明とダウンロード


シューティングゲーム - AlienCG

AlianCG1.png AlianCG3.png 

C.Basic の独自コマンドを使い、高精細カラー液晶を活かして、全画面表示、独自フォント、高速グラフィック描画が可能になる例です。
シューティングゲーム - AlienCG のダウンロード


疑似3Dゲーム - Triangle Fieled Ver 0.91 [2020/03/26 アップデート]

TriangleField-FirstScreen 
Planet Casio でのプログラムコンテスト CPC #26 において、アドイン作成用の C / C++ に加えて C.Basic も使用言語として認められた。そこで sentaro様が応募作品として発表したのが Triangle Field。fx-CGシリーズ用が本命だが、参考までに fx-9860Gシリーズ用にも作成された(液晶の応答性が低いのでゲームとしては難易度が高い)。
なお、類似のアドインゲーム CubeFiled があるが、アドインレベルのプログラムが C.Basic で提供できることを示している。
疑似3Dゲーム - Triangle Field のダウンロード


カラー表示確認ツール - RGB

RGB5a_CC2.png RGB5a_QH.png 

C.Basic の独自コマンドを使い、高精細カラー液晶を活かして、全画面表示、バッテリーモニタアイコン表示、16bit RGBカラー表示 (テキストとグラフィックス)、テキストのスクロール表示、QRコード表示が可能になる例です。但し、fx-CG50搭載のカラー液晶は見る角度で色合いが異なって見える廉価版液晶であり、さらに24bit(フル)カラーではなくて16bitカラー表示なので、設定したRGB値に対して実際の液晶上のカラー表示を確認するためのツールです。 
カラー表示確認ツール - RGB の詳しい説明とダウンロード


日本語表示プログラム - YearConv

YC_cb4f YC_cb9f 

fx-CGシリーズ内蔵の GBフォントを用いて日本語風表示を可能にする例です。エディタ画面ではミニフォントが使えてソースコードの視認性が向上し、ソースコードで漢字フォントを表示してプログラミングできる例でもあります。
日本語表示プログラム - Year Conv の説明とダウンロード







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


 


 


keywords: fx-9860GIICasioBasic、プログラミング入門グラフィックスプログラム関数電卓

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



関連記事

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

プログラムライブラリ - 高速素因数分解

プログラムライブラリ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2021/06/10


高速素因数分解
Casio 電卓で走る高速素因数分解プログラム - 出来るだけ多くの機種、多くの言語に対応
高速化検討については Casio 関数電卓の素因数分解 を参照.



著作権者

原著作者:Ben Tesch - slugrustle (fx-5800P Casio Basic)、但しCC0 1.0 を宣言 
改造・移植 著作権者:やす (Krtyski) [当ブログ管理人]



対応言語と対応機種

  プログラミング言語   機 種
初期版Casio Basic - CFX-9850G / CFX-9850GC PLUS

新世代Casio Basic - fx-9860G / fx-9860GII / fx-9860GIII / fx-9750GIII
             - fx-CG10 / fx-CG20 / fx-CG50
           - fx-5800P

C.Basic       - fx-9860G / fx-9860GII / fx-9860GIII / fx-9750GIII
             - fx-CG10 / fx-CG20 / fx-CG50

Casio Python   - fx-9860GIII / fx-9750GIII
           - fx-CG50



プログラムのダウンロード

新世代Casio Basic 用 - 10桁まで対応
 ▶ fx-5800P Casio Basic 専用
   詳細説明
   プログラム名:FACTOR-F1, WFSUB
   CcLinker で fx-5800P に転送可能なプログラムファイル(CCLファイル)のダウンロード
    - CcLinker についてはこちらを参照 
    - ダウンロードしたzipファイルに含まれるtxtファイルに従って、手入力できます. 

 ▶ fx-5800P Casio Basic 専用、さらに9%高速化
   詳細説明 保存するだけで21,603 バイト必要で、他のプログラムを全て削除する必要あり
   プログラム名:FACTOR-F2, WFSUB
   CcLinker で fx-5800Pに転送可能なプログラムファイル(CCLファイル)のダウンロード
    - ダウンロードしたzipファイルに含まれるtxtファイルに従って、手入力できます.

   Factor-F1_fx5800P

 ▶ fx-9750GIII, fx-9860Gシリーズ(G, GII, GIII) Casio Basic 用
   fx-CG10 / fx-CG20 / fxCG50 Casio Basic 用
   詳細説明
   プログラム名:FactorG, WFSUB
   プログラムファイルのダウンロード

   
FactorG_CG50_ufc FactorG1_9750GIII_ufc

 ▶ fx-7400GIII Casio Basic 専用
   詳細説明
   プログラム名:FactorGL, WFSUBL
   プログラムファイルのダウンロード
   プログラム転送方法

   
FactorGL_7400GIII



初期版Casio Basic用 - 10桁まで対応
  CFX-9850G / CFX-9850GC PLUS Casio Basic 用
   詳細説明
   プログラム名:FactorG, WFSUB
   プログラムファイルのダウンロード
   初期版Casio Basic の 新世代Casio Basic との違い

   
FactorG_9850GCPLUS


Casio Python 用 - 15桁まで対応
  fx-CG50 / fx-9750GIII / fx-9860GIII Pythonモード用
   詳細説明: (1), (2), (3), (4), (5), (6), (7)
   スクリプト名:factorG7, u
   スクリプトファイルのダウンロード

   
PyResult_ufc FactorG71_FX_s_ufc


C.Basic 専用 - 15桁まで対応
  fx-9860G / fx-9860GII / fx-9860GIII / fx-9750GIII C.Basic for FX 専用
  fx-CG10 / fx-CG20 / fx-CG50 C.Basic fo CG 専用
   詳細説明
   プログラム名:FactorG2, WFSUB2
   プログラムファイルのダウンロード
   アドインCasio Basic - C.Basic トップページ

   
CBResult_ufc CBMResult_ufc




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


 


keywords: CasioBasic、プログラムライブラリプログラム関数電卓、3桁区切り出力、汎用サブルーチン

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


関連記事

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

プログラムライブラリ - 3桁区切り出力 (汎用サブルーチン)

プログラムライブラリ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2017/11/17
追記修正 2021/06/10


3桁区切り出力 - 汎用サブルーチン: 3DS
Casio Basic プログラムで、数値を3桁区切り出力するための汎用サブルーチン

CcLinker で fx-5800P に転送できるプログラムファイルをダウンロード可能に [2018/10/29]


著作権者

基本ロジック:sentaro
 [当ブログ読者]
汎用版作成:やす (Krtyski) 
 [当ブログ管理人]



対応機種

fx-5800P
fx-9750GIII
fx-9860Gシリーズ(G, GII, GIII)
fx-CGシリーズ
fx-7400GIII
(fx-FD10 Pro
対応可と思われる)



汎用サブルーチン 3DS の使い方

2桁, 3行の位置から 数値 123456789 を出力させる場合、通常は以下のように記述する。

2→X:3→Y:123456789→Z
Locate X,Y,Z

この9桁の数値を3桁区切り出力にしたいときは 汎用サブルーチン 3DS を使って、

2→X:3→Y:123456789→Z
Prog "3DS"

と記述すれば、2桁3行の位置から

123,456,789

と出力される。

0→X (X0 を設定) すると、右寄せ出力になる。



サンプルプログラム

   "A×B×C"
   "A"?→A
   "B"?→B

   "C"?→C
   "A×B×C="
   7→X:4→Y:ABC→Z

   Prog "3DS"

A=123、B=456、C=789 を入力するとして、
スクロールする部分も含めて以下のように出力される;

   A×B×C
   A?

   123
   B?

   456
   C?

   789
   A×B×C=44,253,432




詳しい説明

Casio Basic入門55~59 Chapter10:3桁区切り出力 - 汎用サブルーチンの作成 を参照

※ サンプルプログラムの使い方 / ダウンロードも上記を参照のこと


プログラムソース

fx-5800P 用 - 最大12桁まで対応
▶ ソースリスト (PDFファイル) ダウンロード
CcLinker で fx-5800P に転送可能なプログラムファイル(CCLファイル)のダウンロード
※ デバッグ用プログラムも含む.

3DS_src_fx5800P.jpg 

 fx-9750GIII, fx-9860Gシリーズ(G, GII, GIII) 用 - 最大15桁まで対応
   fx-7400GIII 用 - 最大15桁まで対応
プログラムファイル 3DGT.g1m のダウンロード
 ※ デバッグ用プログラムもダウンロードできる.

3DS src for fx-9860GII 


fx-CGシリーズ用 - 最大15桁まで対応
プログラムファイル 3DGT.g3m のダウンロード

3DS src for fx-CG50 



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


 


keywords: CasioBasic、プログラムライブラリプログラム関数電卓、3桁区切り出力、汎用サブルーチン

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


関連記事

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

Casio Python - ユーザー関数 frac()

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - リファレンス 
目次
frac()

ユーザーモジュール u.py に含まれる関数 u.py ver 1.5 ダウンロード

初版:2021/06/09

[対応モデル] - fx-CG50 OS3.20 以降、fx-9750GIII / fx-9860GIII OS3.21 以降

浮動小数点型数値から整数部を引いた値に変換します。
なお、内蔵モジュール (builtinモジュール) には、浮動小数点から整数部のみを返す int() 関数はありますが、小数部を返す関数がありません。


書 式frac( )

引 数浮動小数点値

返り値:引数から整数部を減算した値
      frac(12.345)0.345 を返します。


関数定義:

def float(x):
 return x - int(x): 





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

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

fx-5800P 素因数分解 - 高速化

追記修正 2020/05/25
バグフィックス:2021/01/02
追記修正:2021/06/07


[2020/01/24] ソースコード表示を追加し、C.Basicでの実行例の説明を追加しました。
[2020/05/25] 動作可能モデルの記述を更新しました。
[2021/01/02] FACTOR-F1 の終了時に配列変数を解放しない問題を修正しました。
[2021/06/07] fx-7400GIII 用に行列をリストに書き換えて移植したプログラムを公開

今回は、fx-5800P の素因数分解プログラムの高速化の話題です。

素因数分解の一般的な方法は、"エラストテレスのふるい" と言われるものです。最初に入力した数 N を小さい順に素数で割り算を繰り返す方法です。最大の素因数は N の平方根以下の整数なので、平方根以下の整数を対象に2と3以上の奇数で割り算を行う方法で fx-5800P での素因数分解プログラムを作っています。
⇒ fx-5800P 素因数分解 - バグ修正と表示変更

さらに高速化する方法は無いものかと、色々と考えたり、試したりしていました。
  Casio 関数電卓の素因数分解



最速の素因数分解プログラム

最近、目からうろこの高速化を達成した記事を見つけました。
A fast prime factorizing program for Casio fx-5800P 
このトピックで、この作者は、2つのプログラムを公開されています。いずれもプログラム名は FACTOR です。
オリジナルは、上のサイトをご覧ください。

これらには、面白い工夫がなされています。その部分には手を付けず、表示やユーザーインターフェースの不具合(と私が思うだけですが...)を解消するために、チョット変更しました。


1本目のプログラムの変更版:
結果の表示を 3^2 と乗数を表示し、List にも乗数の結果が FREQ に反映するように変更しました。
FACTOR-M1 のダウンロード

FACTOR-M1_1 FACTOR-M1_2 
FACTOR-M1 の結果出力 - 左: 乗数表示、- 右: [MODE] [3] で現れる List表示


2本目のプログラムの変更版:
オリジナルプログラムでは、結果表示画面を、複数ページで切り替えて自由に見られるようになっています。[EXE] [▲] [▶] [+] で次のページを表示、[(ー)] [▼] [◀] で前のページを表示、[EXIT] [DEL] でプログラムを終了するようになっています。計算が高速化しているだけでなく、結果表示も良くなっています。

このキーの使い方がチョット馴染まないので、[▼] で次のページ、[▲] で前のページ、[+] は使えないようにし、指定以外のキーを押した時の誤動作を抑制するように修正しました。時間をかけて計算できた結果が、誤動作で見えなくなるのは嫌ですから...
さらに、オリジナルはキーを軽く押しても応答せず長押しが必要、つまり応答がとても悪いので、キー入力待ちを最小のループにして応答を十分高速にしました。軽くキーを1回押すだけで、チョット待ちますが必ず画面が変わります。
またオリジナルでは結果表示一覧で素因数として 1 が表示されますが、1 は素数ではないので、素因数として 1 が表示されないように修正しました。
FACTOR-F1 のダウンロード [2021/01/02 バグフィックス]
ソースコードはこのページの一番下に掲載

FACTOR-F1_1  FACTOR-F1_2 
FACTOR-F1 の結果表示 - 全結果を画面切り替えで確認、左: 2/1ページ、右: 2/2ページ


比較のための以前作った PRIME DECOMP:
PRIME DECOMP のダウンロード

Prime_Decomp_2 Prime_Decomp_3 


上記でダウンロードしたZIPファイルには、それぞれ CCL ファイルと TEXT ファイルが含まれています。CCL ファイルは CcLinker を使って fx-5800P に転送できます。或いは、下のリンクからテキストファイルを参考にしてください。



計算時間の比較

先ずは、fx-5800P でどのくらい高速化されたかの結果を示します。

PRIME DECOMP
ソースコード
FACTOR-M1
ソースコード
FACTOR-F1
ソース (メインルーチン)
ソース (サブルーチン)
123,456,789
= 32 x 3607 x 3803
170 秒60 秒
3 倍高速化
42 秒
4 倍高速化
6,666,666,667
= 19 x 1627 x 215659
77 秒27 秒
3 倍高速化
20 秒
4 倍高速化
7,849,516,203
= 32 x 9811 x 88897
458 秒165 秒
3 倍高速化
111 秒
4 倍高速化

1本目の FACTOR-M1 で3倍高速化、さらに2本目の FACTOR-F1 は4倍高速化されていることが分かります。

素因数分解は、与えられた数を小さい数から順に割ってゆく時、その操作の回数を減らせば、高速化に繋がります。
PRIME DECOMP では入力した数に、先ず平方根をとって一気に探査範囲を狭め、2と3以上の奇数で小さい方から順に割り算してゆく作戦です。

一方で、理想的なのは、小さい素数から素数だけで順に割り算してゆくことです。それには素数リストが必要ですが、それがあれば苦労しません。素数を算出する計算式などありません。

さて、この作者の工夫は、高い確率で素数を見つけるだけでなく、割り算する候補 (例えば、2 や 3 だけでなく、一旦割り算で使った素数の倍数) を効果的にふるい分ける手法にあります。そして、最初の FACTOR-M1 よりも 次の FACTOR-F1 の方が、素数を見つける確率が高くなっているので、さらに高速化されています。



最速プログラムでの工夫 [2019/07/31]

読者のまつ様から、高速プログラムの考え方をご説明頂きました。私はこれに大変納得しましたので、それを掲載致します。以前の記述は撤回させて頂きます。

素因数分解プログラムで通常行われている割り算では,「2,および,3以上の奇数」を割る数としています。
これですと,ご存知のように,例えば3で割り切った後に9でも割るという無駄が出てしまいます。
FACTOR-M1は,「2, 3, 3より大きい3の倍数を除く奇数」を割る数としており,3で割ったあと9や15で割ることはないようにしています。

3より大きい3の倍数を除く奇数について考えてみます。

まず,3より大きい3の倍数でない整数は次の(1),(2)のどちらかです。
 3m+1 (1)
 3m+2 (2)
 (m>=1)

次に(1),(2)が奇数となる式をそれぞれ求めます。

(1)は (2m+1)+m と変形できます。2m+1 は奇数ですから,(1)が奇数であるためには m が偶数である必要があります。そこで m=2n (n>=1) とおけば,(1)は 6n+1 となります。

(2)は 2(m+1)+m と変形できます。2(m+1) は偶数ですから,(2)が奇数であるためには m が奇数である必要があります。そこで m=2n+1 (n>=1) とおけば,(2)は 6n+5 となります。

5とこれらの式を並べ,さらに,隣り合う式の差も書き加えると次のようになります。(n=1とします)
式の並び隣り合う式の差
52
6n + 14
6n + 52
6(n+1) + 14
6(n+1) + 52
6(n+2) + 14
6(n+2) + 52
:
:
:
:
このような訳で,2, 4, 2, 4, ... と加算していると思われます。
この繰り返しは,6n+1 および 6n+5 の式からも分かるように,2と3の最小公倍数6を周期としています。

FACTOR-F1は,これを拡張して,割る数として
 奇数,かつ,3の倍数でない,かつ,5の倍数でない,かつ,7の倍数でない整数
を順番に求めていく方法をとっていると思われます。
2,3,5,7の最小公倍数は210ですから,隣り合う割る数の差(2,4,6,8など)の並びは210が1周期です。
FACTOR-F1の場合は,13+210n〜13+210(n+1)-1 [n>=0]の範囲で,2,3,5,7のいずれの倍数でもない整数を並べて,隣り合う整数の差をリストにしていると思われます。

ちなみに,13〜222の210個の整数のうち,
 奇数,かつ,3の倍数でない,かつ,5の倍数でない,かつ,7の倍数でない整数
の個数は,FACTOR-F1の「While 1」の下にある
 B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1
のパターンの行数と同じ48個です。

48個となる理由は次の通りです。

まず,2,3,5,7の倍数に関わるそれぞれの個数を求めます。

2の倍数の個数=210/2=105
3の倍数の個数=210/3= 70
5の倍数の個数=210/5= 42
7の倍数の個数=210/7= 30
 
2と3の公倍数の個数= 6の倍数の個数=210/ 6=35
2と5の公倍数の個数=10の倍数の個数=210/10=21
2と7の公倍数の個数=14の倍数の個数=210/14=15
3と5の公倍数の個数=15の倍数の個数=210/15=14
3と7の公倍数の個数=21の倍数の個数=210/21=10
5と7の公倍数の個数=35の倍数の個数=210/35= 6
 
2,3,5の公倍数の個数= 30の倍数の個数=210/ 30=7
2,3,7の公倍数の個数= 42の倍数の個数=210/ 42=5
2,5,7の公倍数の個数= 70の倍数の個数=210/ 70=3
3,5,7の公倍数の個数=105の倍数の個数=210/105=2
 
2,3,5,7の公倍数210の個数=210/210=1

重複を考慮すると,
2,3,5,7のいずれかの倍数の個数
=(105+70+42+30)-(35+21+15+14+10+6)+(7+5+3+2)-1
=162

従って,2,3,5,7のうちどの倍数でもない整数の個数は,
 210-162=48
で 48個となります。


素因数分解の正しい動作を検証

この作者は自分のプログラムを検証するテストプログラムまで作って、ソースコード (C++) を公開しています。fx-5800P 用なので、素因数分解する数は最大10桁と決まっています。この条件下でアルゴリズムの正しさを検証しています。

検証プログラムのソースコードが公開されています。そこで Visual Studio 2019 Community でビルドしました。


 FACTOR-F1 のテストプログラム Factor.exe のダウンロード [2019/08/28 リンクを修正]

コマンドプロンプトで、Factor.exe のあるデイレクトリに移動し、そこで

 Factor 1000 50000 4

と入力してエンターキーで実行すると、1000 から 50000まで 4 刻みで入力を変化させて FACTOR-F1 を実行した結果を一気に連続して自動実行してくれます。そして、結果が素数がどうか判定し、素数でないものが出てくるとエラーを出し、素数であれば実行を継続します。正常終了すれば、正しく素因数分解が実行されたことになります。

factor_1
正常終了しているので、1000 から 50000 までの素因数分解は問題ないことが検証されました。


fx-5800P 用のプログラムなので、入力値は 1 ~ 9,999,999,999 (10桁) の範囲なので、完璧にテストするには、

 Factor 1 9999999999 1

とすれば良いのですが、試しに私のPCだと、1晩で150億回分の検査が済みました。 10桁に相当する (1000億 - 1) 個全部のテストは、夜のみ終夜運転で計算させるとして1週間程度必要になりそうです。

factor_2
1 ~ 9,999,999,999 までのテスト中

テストが正常終了すれば、このアルゴリズムが正しいことが検証されます。但し、他のパラメータ設定でも正しい組み合わせは有りそうです。



グラフ関数電卓用に移植 [2020/05/25 更新]

FACTOR-F1 をグラフ関数電卓用に移植しました。素因数分解の計算部分は変更の余地がありませんが、結果表示は7行全部を使うように変更しました。

グラフ関数電卓用 FactorG のダウンロード [2021/01/02 バグフィックス]
  バグフィックス:終了時に行列解放しない点を修正しました。

FactorG 
FactorG の結果表示

ここで作成したプログラムを CFX-9860G 以降の全てのグラフ関数電卓モデルで動作するように、CFX-9850Gシリーズと fx-7400GIII 用には若干の手直しを行いました。これら以外のモデルでは、上記のダウンロードがそのまま適用できます。 

実際に動作確認したモデル (若干の手直し移植を含む)
 ・CFX-9850G / CFX-9850GC PLUS: 移植のために手直ししたプログラムのダウンロード
 ・fx-9860G / fx-9860G Slim / fx-9860GIIシリーズ : 上記ダウンロードをそのまま適用
 ・fx-CGシリーズ: 上記ダウンロードをそのまま適用
 ・fx-9750GIII / fx-9860GIII:  上記ダウンロードをそのまま適用
 ・fx-7400GIII: 移植のために手直ししたプログラムのダウンロード / 転送方法 [2021/06/07 追記]

なお、上の画面は、fx-CG50 にインストールした アドインCasio Basic  - C.Basic for CG で実行した画面です。C.Basic は純正Casio Basic のほぼ上位互換なので、グラフ関数電卓用 FactorG.g3m がそのまま実行できます。C.Basic は純正Casio Basic プログラムが動作し、なおかつ非常に高速に動作するので、上記の例だと一瞬で結果が表示されます。
アドインCasio Basic - トップページ



Factor-F1 (fx-5800P用) のソースコード

FACTOR-F1 – fx-5800P code
0→DimZ↵
22→DimZ↵
"NUMBER"?→F↵
If F<1 Or F≧1x₁₀10↵
Then "NUMBER□MUST□BE□□≧1□ And <1x₁₀10"↵
Stop↵
IfEnd↵
If F≠Int(F)↵
Then "NUMBER□MUST□BE□□AN□INTEGER"↵
Stop↵
IfEnd↵
For 1→E To 22↵
0→Z[E]↵
Next↵
0→Z[1]↵
0→Z[12]↵
0→E↵
F→A↵

Int(√(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↵
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↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→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↵
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↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→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↵
B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→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↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+8→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↵
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↵
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↵
B+8→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→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↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 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↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→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↵
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↵
B+6→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+6→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↵
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↵
B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+10→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1↵
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→Z[E]↵
1→A↵
1→Z[E+11]↵
IfEnd↵
Int(E÷3)→D↵
E-3xD>0⇒Isz D↵
1→C↵

Lbl 2↵
Cls↵
Locate 1,1,F↵
Locate 12,1,C↵
Locate 13,1,":"↵
Locate 14,1,D↵
3x(C-1)+1→B↵
Locate 1,2,Z[B]↵
Locate 11,2,"^("↵
Locate 13,2,Z[B+11]↵
Locate 16,2,")"↵
If B+1≦E↵
Then Locate 1,3,Z[B+1]↵
Locate 11,3,"^("↵
Locate 13,3,Z[B+12]↵
Locate 16,3,")"↵
IfEnd↵
If B+2≦E↵
Then Locate 1,4,Z[B+2]↵
Locate 11,4,"^("↵
Locate 13,4,Z[B+13]↵
Locate 16,4,")"↵
IfEnd↵

Do↵
Getkey→K↵
LpWhile K=0↵

0→M↵
If K=34 Or K=73↵
Then 1→M↵
Else If K=86 Or K=85 Or K=47↵
Then 2→M↵
Else If K=83 Or K=84 Or K=57↵
Then 3→M↵
Else Goto 2↵
IfEnd:IfEnd↵
IfEnd↵

If M=1↵
Then Cls↵
"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↵

0→DimZ↵



WFSUB – fx-5800P code

E+1→E↵
B→Z[E]↵
Do↵
D→A↵
Z[E+11]+1→Z[E+11]↵
A÷B→D↵
LpWhile Frac(D)=0↵
Int(√(A))→C↵
Return↵





今回は、Universal Casio Forum への投稿プログラムの解説記事になってしまいましたが、私としては十分楽しませてもらったので、記事にして残そうと思いました。



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


 



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

リンク集 | ブログ内マップ
関連記事

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

Casio 関数電卓の素因数分解

  全面改定 2021/06/05
追記修正 2021/06/06


当ブログでは、素因数分解に関する記事を多く書いています。

ある日購入した関数電卓 (fx-995ES) に、素因数分解機能が搭載されていました。入力する整数は10桁以内に制限されるし、算出する素因数が4桁を越えるとエラーになる、といった不十分なものでしたが、プログラム関数電卓 fx-5800P で素因数分解プログラムを作ってみようと思わせるには十分でした。

関数電卓内蔵の素因数分解機能は不十分とは言え、その演算速度はCasio Basic ブログラムよりも遥かに速いものでした。そこで、電卓で走る素因数分解プログラムの高速化を様々なアプローチで記事にしています。

本記事では、電卓での素因数分解プログラムの高速化の履歴を紹介してゆきます。
  以下で紹介するプログラムは プログラムライブラリ - 高速素因数分解 からダウンロードできます。



関数電卓内蔵の素因数分解機能
カシオの関数電卓で、初めて素因数分解機能が搭載されたのが、国内で2012年12月に発売された fx-995ES です。これに対応する北米モデルでは fx-115ES PLUS で、2019年に発売された不法コピー対策品の fx-115ES PLUS 2nd edition にも搭載されています。
 ⇒ fx-995ES のカタログ
 ⇒ 電卓総合カタログ 2013年8月版
  fx-115ES PLUS 2nd edition の概要

fx-995ES の後継機 fx-JP900 にも素因数分解機能が継承され、機能が向上し高速化しました。 
  fx-JP900 (その3)

素因数分解機能が本当に必要かどうかは別として、この機能が内蔵されているモデルを紹介しておきます;
fx-115ES PLUSfx-115ES PLUS 2nd edition は北米モデルです。
 
fx-995ES    FX-115ESPLUS_larg   fx-JP900_1    fx-115esplus2_large
   fx-995ES     fx-115ES PLUS    fx-JP900    fx-115ES PLUS
                                                                             
2nd edition



Casio Basic プログラムでの素因数分解 - 内蔵機能よりも遙かに遅い
最初に fx-5800P の Casio Basic で作った素因数分解プログラムやそのデバッグ版を以下で紹介しています;
  fx-5800P で素因数分解
  fx-5800P で素因数分解再び
  fx-5800P 素因数分解 - バグ修正と表示変更

いずれせよ作ったプログラムは、関数電卓内蔵の機能よりも遙かに遅いものでした。そこで、VBAで作ればどの程度速いのかを確かめたり、よりCPUが強力なグラフ関数電卓 fx-9860GII にプログラムを移植してみました。
  fx-9860GII への移植 - 素因数分解
  VBAで素因数分解


Casio Basic プログラムでの高速化素因数分解 - 高速化、しかしまだ遅い
電卓上のプログラムのロジックを改善することで、処理速度が4倍高速化することが判りました;
  fx-5800P 素因数分解 - 高速化

fx-995ES の内蔵機能では、算出できる素因数が4桁までしか対応していなかったのに対して、fx-JP900 では6桁まで拡張され、具体的には素因数が 1,018,081 未満の時は素因数分解可能になりました。但し10桁を超える入力は仕様外であり、エラーが表示されます。一方、このような制限は、Casio Basicプログラムにはありません。

しかし、Casio Basic プログラムは依然として関数電卓の内蔵機能には遠く及びません。


Casio Python での素因数分解 - fx-CG50、高速化、内蔵機能に追いつく
2020年に公開された fx-CG50 のOSアップデート (OS3.40) で Pythonモードが追加さ、その後公開された OSアップデートでも Python が使えるようになりました。そこで Casio Basic の高速化素因数プログラム (上記) の高速化ロジックを Casio Python に移植してみると、fx-JP900 の内蔵機能とほぼ同じ処理速度になることが判りました。
  Casio Python - シェル入力画面の工夫:高速素因数分解(1)
  Casio Python - Pythonらしい反復処理:高速素因数分解(2)

内蔵機能も Casio Basic プログラムも、それらの仕様 (10桁精度) により 10桁以下の素因数分解しかできませんが、Casio Python では15桁の精度があるので、素因数分解も 15桁に対応できるように改善できました;
  Casio Python - 大きな数の計算:高速素因数分解(3)
  Casio Python - 関数呼出オーバーヘッド:高速素因数分解(4)


Casio Python での素因数分解 - fx-CG50、高速化、内蔵機能を超える
高速化素因数分解の基本的なロジックはそのままに細かい改善を行うことで、さらに10%高速化できました;
  Casio Python - 要素数の多いリスト:高速素因数分解(5)
  Casio Python - 10進数除算の出力と精度:高速素因数分解(7)

この細かい改善検討では、高速化するためには使えるものは何でも使うようにし、具体的には Pythonモード で使う大きなリストの要素を PCプログラム(C#)で生成して、それをカット&ペーストしてスクリプトを完成させました。その結果 fx-JP900 よりも高速な素因数分解が実現しました。

ちなみに、ここで行った細かい改善とPCプログラムでコード生成する上の方法を再び Casio Basicプログラムに援用して fx-5800P の Casio Basic に移植したところ、元のプログラムよりも9%程度高速化しましたが、fx-JP900 内蔵機能には遠く及びません。fx-5800P の限界まで高速化した (電卓のメモリに格納可能な最大サイズのプログラムに達した) ので、これ以上は難しいと思われます。
  fx-5800P 素因数分解 - さらなる高速化


Casio Python での素因数分解 - fx-9750GIII、内蔵機能と同等の速さ
2020年10月に、fx-9750GIIIfx-9860GIII のOSアップデート (OS3.40) に伴い Python モードが追加されました。fx-CG50 の Casio Python よりも動作は遅いのですが、それでも十分な処理速度を有しています。

そこで、fx-CG50 の Casio Python スクリプトを fx-9750GIII / fx-9860GIII の Python スクリプトでも共通して動作するように修正したところ、fx-JP900 の内蔵機能とほぼ同じ処理速度になることが判りました。
  高速素因数分解 FactorG ver 7.1


C.Basic での素因数分解 - Casio Python から C.Basic への移植 - さらに高速化
15桁対応し fx-JP900 内蔵素因数分解機能と同等以上の高速化を実現した Casio Pyshon のスクリプトを C.Basic に移植したところ、さらに高速化できました。ここでも、何百行かのコードを C# プログラムで生成してカット&ペーストする手法を使いました。
  fx-CG50 / fx-9750GIII - C.Basic で素因数分解15桁対応&高速化



各アプローチと fx-995ES、fx-JP900 との素因数分解速度の比較 

fx-CG50
を "CG"fx-9750GIII / fx-9860GIII を "FX" と表記します。

78,495,162 の素因数分解 (2 × 3 × 31 × 503 × 839)
◀速い遅い▶
C.Basic (CG)Python (CG)C.Basic (FX)Python (FX)
fx-JP900
fx-995ESCasio Basic
この例のように関数電卓内蔵機能で正しく素因数分解できる場合は、C.Basic や Casio Python のプログラムは、内蔵機能の同等以上の演算速度を実現しています。

7,849,516,203 の素因数分解 (32 × 9811 × 88897)
◀速い遅い▶
C.Basic (CG)fx-JP900Python (CG)C.Basic (FX)Python (FX)fx-995ESCasio Basic

関数電卓 fx-900JP 内蔵機能は、この入力の計算結果を 3× (872168467) と表示。素因数分解に失敗する例です。
カッコ ( ) で示す数値は、仕様上それ以上素因数分解できなかった商です。つまり途中で演算を停止するのて、見かけ上演算が速く終了すると考えています。

9,999,999,997 の素因数分解 (13 × 769230769)
◀速い遅い▶
fx-JP900C.Basic (CG)Python (CG)
fx-995ES
C.Basic (FX)Python (FX)Casio Basic
関数電卓 fx-900JP 内蔵機能は、この入力の計算結果を 13 × (769230769) と表示。
カッコ ( ) で示す数値は、仕様上それ以上素因数分解できなかった商ですが、偶然にもそれが素因数だった事例です。仕様上素因数分解を途中で止めているので、見かけ上演算が速く終了していると考えています。

C.Basic や Casio Python で 関数電卓内蔵機能よりも高速な素因数分解を達成!


C.Basic を導入できるグラフ関数電卓
GraphingCalc_1


GraphingCalc_2


Casio Python (Pythonモード) を導入できるグラフ関数電卓
fx-CG50_small fx-9750GIII_l   fx9860GIII
     fx-CG50        fx-9750GIII       fx-9860GIII


  Casio プログラム電卓の価格動向


全面改定する前の記事はこちら:(旧) Casio 関数電卓の素因数分解





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


 



keywords: 高速素因数分解Casio Basic、Casio Python、C.Basic、プログラミングプログラム関数電卓

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

関連記事

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

(旧) Casio 関数電卓の素因数分解

  追記 2021/5/28

本ブログでは、素因数分解プログラムについて取り上げています。

 ・ fx-5800P で素因数分解
 ・ fx-5800P で素因数分解再び
 ・ fx-5800P 素因数分解 - バグ修正と表示変更
 ・ fx-9860GII への移植 - 素因数分解
 ・ VBAで素因数分解
 ・ fx-5800P 素因数分解 - 高速化 [2020/01/07 追記]
 ・ fx-5800P 素因数分解 - さらなる高速化 [2020/12/25 追記]
 ・高速素因数分解を Casio Basic から Casio Python へ移植 [2021/05/24 追記]
 ・fx-CG50 / fx-9750GIII - C.Basic で素因数分解15桁対応&高速化 [2021/05/28 追記]

これらの記事の発端は、カシオのスタンダード関数電卓 fx-995ES に因数分解機能が搭載されたことです。素因数分解機能が内蔵されたのなら、プログラム電卓で作ってみようと思ったわけです。但し、自作プログラムは、逆立ちしたって内蔵機能よりも速く計算できません。これは、チョット気になっていました。

そこで、今回は、素因数分解のアルゴリズムの話題です。

実は、すけっぴぃ様から、素因数分解アルゴリズムの効率化に関するコメント(ここ)を頂いており、すぐには役に立つ情報を返信できなかったのですが、心の隅に引っかかっていたこともあって、この話題を少し掘り下げてみます。

[2020/12/25 追記]
すけっぴぃ様からのコメントを実際に実現できたのが、上に挙げた 2020/01/07 追記 の記事に相当します。このアルゴリズムを利用して素因数検索効率をさらに向上させ、fx-5800P のメモリ容量ギリギリまで使うことでさらに高速化したのが、上で挙げた 2020/12/25 追記の記事になります。

以下は、fx-5800P 用高速素因数分解のアルゴリズム以前にアレコレと考えていた時の話です。


 
私の手持ちの電卓で素因数分解ができるのは、最初から機能が内蔵されている fx-995ES と fx-JP900、それに作ったプログラムが走る fx-5800P と fx-9860GII の4機種。
Int_fx-995ES Int_fx-JP900 Int_fx-5800P Int_fx-9860GII 
順に、fx-995ES、fx-JP900、fx-5800P、fx-9860GII

最近、fx-JP900 を入手し、素因数分解機能を試したところ、fx-995ES よりも大幅に計算が速くなっていて、さらに得られる素因数の桁数が増えています。

幾つかの素因数分解結果を、fx-995ES、fx-JP900、fx-5800P のプログラム、カシオの高精度計算サイトKe!san で行った結果の一覧表を再掲載します。← Casio fx-JP900 (その3) から抜粋

整数fx-955ESfx-JP900fx-5800PKeisan
1,234,567127x(9721)127x9,721127x9721127x9721
98,765,43223x37x(333667)
(1.7秒)
23x37x333,667
(0.4秒)
23x37x333667
(27秒)
23x37x333667
9,516,208,47332x172x(3,658,673)32x172x(3,658,673)32x172x365867332x172x3658673
123,456,78932x(13717421)32x(13,717,421)32x3607x380332x3607x3803

因数分解できない場合は ( ) 付きで表示される仕様で、そこは fx-955ES も fx-JP900 も同じ。
但し、fx-995ES は素因数が4桁以上で ( ) 付きになっていましたが、fx-JP900 では素因数の桁数制限が大幅に緩和され、上の例ですと6桁まではOK。

また、fx-JP900 の取扱説明書17ページを見ると、素因数が 1,018,081 以上の素因数を持つ時は計算エラーになると書かれていますが、上の1つめ、2つめ、3つめの例では、( ) 付きで結果が表示されています。これ以上計算できないが、たまたまそれが素因数だったと解釈すれば良さそうです。( ) 付きの場合は、それが正しいかどうかの保証が無いと言うことでしょう。

4つめの例では、( ) 付きの結果は、さらに因数分解できるが、これ以上計算できないことを示しています。

[2015/06/18 追記]
コメント欄での sentaro様とのやりとりから、求める素因数の桁数を制限すること、そしてCPUの演算速度の簡単な比較から、2と3以上の奇数で順次割り算する単純なロジックても、それぞれの実行時間をほぼ説明できそうだ、と今のところの結論です。(追記終わり)

[2020/01/24 追記]
上記のすけっぴぃさんのご提案にあるように、一旦3で割ればその後は3の倍数でない奇数で割り算すると効率があがります。これを拡張して、割る数として 奇数、かつ 3でない、かつ 5でない、 かつ 7でない整数を順次求めて行くアルゴリズムで3~4倍の高速化ができました。⇒ fx-5800P 素因数分解 - 高速化



素数は整数論の一分野で研究されていて、素数が無限個存在することは、紀元前300年頃に証明されています。しかし、未だに素数を求める公式が見つかっていないし、素数の密度を求める式も見つかっていません。ケースバーケースの近似的な式があるだけです。それだけ神秘的な数が素数と言えるのですが、だからこそ素数は暗号通信の要として、実用上極めて重要なものになっています。応用工学で重要な素数だからこそ、数学教育において素数は重要だと考え、カシオは素因数分解機能を内蔵したのかも知れません。

ところで、遅いCPUを搭載した fx-5800P で走らせた素因数分解プログラムは、処理が遅いので、あまり凝ったアルゴリズムを実装できません。それに比べて内蔵機能の計算が桁違いに速いことが、気になっていました。

そんなとき、fx-JP900 の評価をしていて、正しく計算する条件として求める素数の桁数に制限があることを改めて考えてみました。桁数の制限をかけるアルゴリズムがあって、それを使えば Casio Basic でも速いアルゴリズムを実装できるかもしれないと思いました。そこで、具体的なプログラムにするには、まだ不完全ですが、取りあえず書いてみます。


fx-995ES では3桁以内の素因数に分解して表示することができるのですが、正しい計算が保証できるときの素因数が3桁と言うのは、どういうことか? 例えば、何十個かの素数の表をメモリ内に持っていて、それを使って計算すれば、かなり計算量が節約できるかも知れません。3桁つまり1~999の範囲にある素数は168個で、最大の素数は 997 です。168個程度のデータならメモリに入れておくのは現実的です。与えられた自然数をこの168個の素数で次々と割り算してゆけば、2と奇数で順次割り算するよりも、遙かに計算量が少なそうです。

ある整数の素因数分解を行う時、素因数はその整数の平方根以下になることを使い、さらに2と奇数を順に割り算して素因数を求める計算を、fx-5800P や fx-9860GII 用に書いたプログラムで行っています。このとき、3桁の素数で最大は 997 なので、9972 = 994009 以下の素因数分解は、メモリに保存された168個の素数で順割り算すれば、かなり計算量は節約できます。fx-5800P や fx-9860GIi で作ったプログラムでは、2と奇数で割り算するので、499個の数で割り算しています。つまり、計算量は 168÷499 = 0.3367 つまり 約33%、1/3 にに抑えられます。
Casio Basic での変数参照や配列参照のアクセスに比べて、関数計算する際のテーブル参照は遙かに速いと考えられるので、これで内蔵機能が速いことが説明できそうです。この方法を Casio Basic のプログラムに反映する際は、算術演算に 1~1.5ms 程度かかり、配列変数や行列へのアクセスに20ms程度かかること、そしてこの差を考慮して、本当に速くなるのかどうかを検討する必要があります。


一方 fx-JP900 は、1,018,081 以上の素因数を持っている整数ではエラーになる仕様です。ちなみに 1,018,081 は素数でなくて、これを素因数分解すると 10092 です。fx-5800P のプログラムで計算してみると、1,018,081 未満で最大の素数は、1,018,057 だと分かります。1,000,000 (100万)までの素数は 78,498個あるので、8万個近くある素数の表を不揮発メモリに持っておくのは、関数電卓としてはあまり現実的ではないでしょう。1,018,081 以上でエラーになることから、ひょっとしてこれを実装していることも考えられますが、素因数分解だけのために原価を押し上げるメモリを使うのは疑わしいわけです。

そこで、メモリに保存された素数テーブルを使わず、完全ではないものの、素数を計算して、それで順次割り算してゆく方法は、うまくすると計算量を減らして、高速化できるのかも知れません。或いは、メモリ上の素数テーブル参照と計算の併用も現実的な折衷案かも知れません。

素数の計算については、以下の式が非常に効率よく素数を計算するものとして知られています。
オイラの素数の式 
これはオイラーが見つけた、素数 p を求める式です。全ての素数をもれなく見つけることはできません。
ただ、この式の面白いのは、x  が 0 から 39 の時に得られる数が全て素数だと言う点にあります。但し、x=39 の時得られる素数 1601 以下には、この式で得られない素数が沢山あります。1601 以下の全ての素数を算出できるわけではありません。

さらに、 が 0 から 60 の時は、x = 40, 41, 42, 44, 49, 50, 57 の7個の x 以外で、 p は素数になります。素数を算出する効率は、x が 0 から 60 で計算した61個の値のうち88.5% が素数になります。繰り返しますが、これで得られる3071 以下には、この式の結果以外に多くの素数があります。

xpxpxp
0411322326743
1431425127797
2471528128853
3531631329911
4611734730971
57118383311033
68319421321097
79720461331163
811321503341231
913122547351301
1015123593361373
1117324641371447
1219725691381523
391601
 ・・・・・・
603701
10081017113

ちなみに、x = 1009 の時 p = 1,019,131、x = 1008 の時 p = 1,017,113 となります。つまり、x = 1008 で得られる1,017,113 がこの式でエラーにならない最大素因数 1,018,057 に最も近いものだと分かります。この式では、100万までの素数の47.5% が求められることが調べられていて、効率は半分以下に落ちます。しかし、現在 fx-5800P や fx-9860GII に実装しているプログラムのロジック「2と奇数で約 50万回近く割り算する」よりも、1000回程度の割り算をする方が、計算量が 1/500程度になります。仮に3分かかっていた計算は1秒以下になりそうです。

与えられた整数に対して、先ず先に、このオイラーの式で得られる計算値から素数を選んで、それで順次割り算して、残った余りについて、2と奇数で順次割り算して計算すると言うアルゴリズムが考えられます。オイラーの計算値から少ない計算量で素数を見つけられれば、テーブルと計算の併用で、高速化の可能性があります。x をどの範囲まで使うのか、38 までとするか、60 とするか、1008 までとするか、その中間のどこかにするか、も実際の計算量とコマンドの処理速度から最適点を検討する必要があります。仮に、x = 1000 まで使うなら、1000の47.5% に相当する 475 個の素数で順次割り算するので、500 / 500,000,000 = 0.001% となり、他の計算量と計算時間を低く抑えられれば、大幅な高速化ができるかも知れません。

プログラムの実装は、そのうちやってみようと思います。もし先にプログラムを作られた方は、是非コメント欄で発表してください。お待ちしております。



ところで、余計な話になりますが、

The Asahi Shinbun Blobe - 数学という力 (残念ながら削除されたようです) というサイトでは、素数と円周率の関係、素数と宇宙の真理の関係について解説されていて、なかなか面白いです。素数は現代数学の花形の1なのですね。

Zeta_Functio  
これは、リーマンと言う数学者が名付けたゼータ関数というものです。一番右の項は、オイラー積という総積計算で、素数 p がしっかり出てきます。

この式で、s=2 の時は、
ゼータ関数(s=2) 
となって、素数 p のオイラー積 と円周率 π が結びつくことが発見された歴史的な式をゼータ関数で表したものです。素数と円周率の関係式をより一般化したゼータ関数で表現することで、より深く調べることができるというわけです。上の記事によれば、この式を巡った素数の熱い研究が進められているようですね。簡単に素因数分解できる公式が存在するのかどうか?まだよく分かっていません。そのうち見つかる筈と言う人もいれば、存在しないかも知れないと言う人もいます。あまり簡単に計算できると、インターネットなどで使われている暗号が簡単に破られることに繋がるので、大問題です。

脱線すると、このゼータ関数で s=-1 の時は、
ゼータ関数(s=-1) 
なんて、なってしまいます。自然数を無限に足すと、-1/12 になる、なんとも受け入れられない結果です。実は、ゼータ関数は複素数の世界のものなので、一見あり得ない結果に見えるわけです。

カシオの高精度計算サイト Ke!san のココでも取り上げられています。
ここでは、明確に書かれていませんが、s=-1 で、実数の世界を複素数の世界に拡張(解析接続)しています。実はゼータ関数といっても、色々な派生バージョンがあって、s>1 でしか成り立たないゼータ関数では s=-1 は定義域の外側、言い換えれば s=-1 としてはいけません。そこで、このゼータ関数を拡張して(解析接続して) s=1 以外で成り立つようにできます。この時のζ関数は、拡張前のゼータ関数とは別のものです。そして拡張した別のζ関数では、s=-1 としても良く、-1/12 に収束します。殆ど詐欺というか、紛らわしい話ですね。

1+2+3+4+・・・  は実数の世界と誰でも思うので、自然数の無限和が負の数である -1/12 に収束するなどと言うのは、実数の世界では間違いです。でも複素数の世界では収束するので、ゼータ関数は物理の計算で重宝されているわけです。

素数は大きくなると、まばらになるのか?その密度はどうなっているのか? これもはっきりと分からない問題でしたが、2014年には素数は極端な偏りがなく万遍なく分布することが発見されました。→ こちら


素数の性質の研究は、非常にホットな分野ですね。まぁそれだけ分からないからこそ、暗号に使われるわけです。
深淵な研究は数学者に任せるとして、取りあえずプログラム電卓で素因数分解の高速化が出来るかも知れないということで、一旦区切ることにします。




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


 



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

リンク集 | ブログ内マップ
関連記事

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

温故知新 - fx-CP400

プログラム電卓 温故知新
 - 搭載プログラミング言語に注目して、プログラム電卓の変遷を考える -
<目次>


 
2021/05/16
修正 2021/06/01


過去から現在に至る性能や仕様の変化を調べ、プログラミング言語を中心にカシオ製プログラム電卓の系譜を明らかにする企画。


10. CAS機能と構造化Basicの搭載 - 新言語の試み

今回は、CASグラフ関数電卓 fx-CP400 (ClassPad II) を取り上げる。fx-CG500 は fx-CP400の機能限定の北米モデルの位置づけになっている。

これらのモデルに搭載されている言語はカシオ仕様の構造化Basic で、本ブログで多く取り扱っている新世代 Casio Basic とは全く別の言語である。ここで 新世代Casio Basic とは、fx-9750GIII や fx-9860G シリーズのモノクロ液晶搭載グラフ関数電卓、fx-CG10/CG20/CG50シリーズの高精細カラー液晶搭載グラフ関数電卓、そして fx-5800P に搭載されている言語だ。本記事では主に登載されているカシオ仕様の構造化Basicについて調べた内容を紹介するが、最初に fx-CP400 の特徴あるハードウェアと機能について簡単に触れることにする。


ClassPadシリーズは、カシオのグラフ関数電卓の製品群の中で、数式を解析的に計算 (式の変形や微分/積分、展開など) ができる数式処理システム (Computer Algebra System) を備えている点に特徴がある。カシオ電卓で最初に CASが導入されたのは、1996年発売の CFX-9970G で、1999年発売の Algebra fx-2.0 にも搭載された。

その後、強化されたCAS機能を搭載した ClassPadシリーズ fx-CP300 が2003年に発売、fx-CP330 が2007年に発売され、fx-CP330 Plus が2012年ニ発売された。OSのアップデートによりCAS機能や各種プリインストール機能が強化され、ハードウェアも fx-CP330 Pus ではUSBケーブルでのPCリンク機能が搭載された。これらは全てモノクロ液晶であった。

2013年にカラー液晶搭載の CAS グラフ関数電卓 fx-CP400 が発売された。ClassPadシリーズは、残念ながら日本国内では販売されていない。

2017年には、fx-CG500 が北米で発売 (国内未発売)された。fx-CP400 はソフトウェアキーボードの配列を複数のタイプ (QWERTY, AZERTY, QWERTZ, ABC) から選択できるのに対して、fx-CG500 はソフトウェアキーボードがアルファベット順 (ABC) のみで、それ以外は fx-CP400 とほぼ同一のようだ。


Casio fx-CP400 (ClassPad II)

fx-CP400抵抗膜方式のタッチパネルにテンキーも備えた携帯端末であり、電卓と言うよりもタブレットに近い。

主なハードウェア仕様
- CPU:カスタム SH4 - SH7305
- 高精細カラー液晶:4.8インチ、320 x 580 ピクセル
- メインメモリ:2 MB
- e-Activity用メモリ:5.5 MB
- ストレージメモリ:24 MB
- 内部演算精度:15桁
- 保存数値桁数:10進数で661桁

ハードウェアキーは、四則演算に累乗計算が入力できる程度の少ないもので、キー1つの1つの機能のみが割り当てられている。[SHIFT]など他のキーと一緒に押して複数の機能が割り当てられる一般的な電卓とはかなり違っている。 温故知新:番外編 - 関数電卓としてに使い勝手 参照

関数計算や様々な機能を入力するには、[Keyboard]キーで呼び出すソフトウェアキーボードを使う。

付属品
白いプラスチックのスライドカバー、タッチペン、USBケーブル、3Pinケーブル、EU域の保証書、クイックマニュアルなどの紙片が付属している。

デザイン
fx-260 Solar II (第1世代関数電卓), fx-JP900 (第4世代関数電卓), fx-CG50 (カラーグラフ関数電卓) と共通した最近のカシオ電卓のデザインになっている。fx-CG50 との比較画像を見ると全く同じデザインだと分かると思う。
fx260_JP900_CG50_CP400_Top 
左から、fx-260 Solar IIfx-JP900fx-CG50fx-CP400

fx260_JP900_CG50_CP400_Back fx260_JP900_CG50_CP400_Case 
左の画像:筐体裏側、右の画像:ハードケース

Comon_Design 
fx-CP400 (左側)、fx-CG50 (右側) のキーボード周り - ほぼ同じデザインだと分かる

また、ClassPad のロゴがさりげなく入っている。
ClassPad_Logo 

OSアップデート / Screen Reciever
購入時のOSは Ver 2.01.4 であったが、Ver 2.01.6 にアップデートした。
その後、2021年1月13日に、Ver 2.01.7 にアップデートした。
アップデータは下記から入手できる。
Casio WORLDWIDE EDUCATION WEBSITE - Download Resources | Support | CAS Graphic Models

このページから 電卓画面をリアルタイムでPCに転送するScreen Receiver Ver 03.02 もダウンロードできる。このソフトウェアは fx-CG20 / CG50 でも使え、既に持っているならそのまま使える。


CAS電卓としての機能

fx-CP400 は、他のグラフ関数電卓にない計算精度と計算能力を持っている。大学の理科系以降で学ぶ数学を活用したり、高精度な計算を行う人向けと言って良いと思う。高い計算精度や計算能力を示す一例を以下で紹介する。

但し、"今さら高精度な計算をわざわざ電卓で行うくらいならパソコンで無償で入手できるCPythonを使った方が良い"、"チョットした計算やプログラムならCPythonで十分"、という風潮も出てきている昨今だ。するとfx-CP400fx-CG500 はCAS機能にその価値を見いだすことになろう。ClassPadは、学校教育向けに開発され最適化されてきた製品なので、一般的な技術者向けに最適化されていないのは、当然と言える。

なお、関数入力をソフトウェアキーボードから行うしかないので、関数電卓としては使い勝手が非常に悪い。
温故知新:番外編 - 関数電卓としての使い勝手


演算精度 (桁落ち)
123456789123456 - 123456789123411 = 45

となる筈だが、fx-5800Pfx-CG50 でこの減算を行うと、答えが 0  になる。 内部演算精度15桁ギリギリのところで最下位2桁の桁落ちが発生している。一方、fx-CP400 でこの計算を実行すると答えが 45 と正しく得られる。


演算桁数(指数部)
449! = 3851930518E+997

fx-CP400 は指数部が3桁、±999 だから、演算桁数が1000桁ある。他のグラフ関数電卓やプログラム関数電卓では、指数部は2桁なので 100桁以内の桁数となる。


複素指数関数
複素数を表示するように設定して、計算させてみると、fx-5800P はエラー、fx-9750GIII、fx-9860Gシリーズ ならびに fx-CGシリーズ は正しく計算結果を表示。fx-CP400 でも同様に複素指数関数を正しく計算する。
ComplexExponential 
 
 
積分の処理速度
 
積分計算速度の比較を試みる (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-CP4000.7秒2.0秒
積分の詳細はこちら

積分1については、最初に式が示される。次に近似値の1が表示される。[2021/07/03 修正]
Integral1_1  Integral1_2 

積分2については、0から1までの積分でもエラーにならず 1/2 が得られる。他の機種では数値積分区間を 0 から 1 にすると、0 において対数関数 In は無限小になり、数値計算では大きな誤差が発生するために結果が 0.4999 となる。そこで 0 の代わりに 1x10-10 を用いている。fx-CP400 では、積分区間 [0, 1] で計算できている。
Integral2 
 
 
周期関数の積分
積分計算にガウス・クロンロッド法が使われている可能性が考えられるので、このアルゴリズムが苦手な多項式で表せない関数の代表選手として周期関数の積分を行う。以下の計算で、n の値を大きくしてゆき、正しく計算できる限界を調べて見る (Rad モード)。

積分3
機種計算できる nタイムアウトエラーになる n
fx-JP900n ≦8n >9
fx-5800Pn ≦8n >9
fx-9860GIIn ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
fx-CG20n ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
fx-CG50n ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
fx-CP400n ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
(エラー表示せずに式を表示)
積分の詳細はこちら

fx-CP400 での結果は、計算可能な最大の n は 60 と、他のグラフ関数電卓と同じ結果になった。60π / -60π の代わりに nπ / -nπ とすると、解析的な解である 4n が得られずに、同じ式を表示することから、この積分では CAS 機能が働いていないと思われる。つまり、他のグラフ関数電卓と同様の数値積分のロジックが適用され、その数値積分の内部ロジック自体は大きく変わっていないようだ。但し、CAS電卓らしく、n が 61以上ではタイムアウトエラーにならずに、そのまま式を表示する。
Integral3_2  Integral3_1  Integral3_3 
 
 
時間のかかる積分

時間のかかる積分計算として、以下の計算を調べる。
Integral_! 
この積分は、radモードでも degモードでも同じ結果になるが、計算は rad モードで行う。
積分の詳細はこちら

モデル結果出力処理時間
 fx-115ES PLUS 2nd editionπ394.1
 fx-991ES Aπ395.1
 fx-991ES PLUS 2nd editionπ400.6
 fx-993ESπ411.8
 fx-995ESπ427.3
 fx-JP900π83.7
 fx-5800Pπ173.3
 fx-9750GIII (OS3.40)π14.5
 fx-CP400 (OS2.01.6)3.141592654733.7
 fx-CG50 (OS3.50)π9.2
※ 参考までに、Natural-VPAM 機能を搭載した fx-993ESfx-995ESfx-JP900、そしてプログラム関数電卓 fx-5800P、グラフ関数電卓 fx-9750GIIIfx-CG50 の結果も併記する。

fx-CP400 では、他の電卓に比べて処理速度が圧倒的に遅い。
[2021/06/01 修正]
さらに π と表示されずに 3.141592654 と表示される。答えとしてπ と表記されないことから、CAS機能による不定積分がうまく得られていない可能性が考えられる。


fx-CP400 搭載言語

新世代Casio Basic との代表的な違いについて調べた結果を以下に紹介する;
- 代入: (→ではない)
- 文字/文字列出力:Print (" "は使えない)
- プログラム最後に書かれた式/変数/文字列 が表示されない (表示には PrintMessage コマンドが必須)
- Locate の座標指定:テキストウィンドウでしか使えないのに、液晶のピクセル座標を使うので不便だ。
 文字表示の桁/行指定ができなくなった。これは明らかに改悪
- Text:グラフウィンドウでしか使えない。同じ位置に表示すると全て重なって表示される。い。問題なのはエスケープシーケンスが使えず、さらに色指定で白が使えないので、一度Text()で描画した文字列を消せない点にある
- GetkeyGetkey KKにキーコード取得 (戻り値を返さないので While Getkey / WhileEnd と書けない)
- 条件ジャンプ :無くなった。
 If 文を使う必要がある。さらに If / IfEnd 内からGotoで出るコードは禁止、エラーになることがある。
 この機能が使えるCasio Basicの柔軟性が否定された形。この点で Casio Basic との互換性がなくなる
 実態は Goto での if 文からの脱出を複数回使うとSyntaxエラーになるが、エラーが出なければ使えるレベル。
 仕様が中途半端でスタックエラーが発生しているかのように見える。
- Skip コマンド:新たに登場。Do, While, For でループ内冒頭にジャンプできる。これは明らかに改善
- カウントジャンプ Isz / Dsz:無くなった。
- テキストウィンドウとグラフ(グラフィックス)ウィンドウを同時に表示可能 (他の機種は画面切り替えが必要)
- ユーザー関数を自由に作れる
- サブルーチンは、引数を渡せて、戻り値を返せる

入力や出力は、基本的にウィンドウを使う。
全てのコマンド類を確認していないが、代表的(と思う)点について触れた。fx-5800P やグラフ関数電卓搭載のCasio Basicとの互換性は殆ど期待できず、全く別の言語として捉えるべきだ。仕様上はむしろ Casio Python (Pythonモード) に近い。但し、Casio Basic や Casio Pythonと比較すると、本プログラム言語は中途半端と言わざるを得ない。そこ理由は後述するが、最大の問題は処理速度の遅さにある。本言語は発展途上と言うべきだが、Casio Pythonが登場した現在では、CASモデルのBasicのアップデートにカシオがリソースを割くとも思われず、今後の改善はあまり期待できないと思われる。


プログラム出力画面

テキストウィンドウ
テキストウィンドウにテキストを出力するには、Print コマンドを使う。CAS機能無しの他のグラフ関数電卓や fx-5800P では " " で出力すると内部カーソルが改行される。Print コマンドを使うと同様に内部カーソルが改行され、改行により表示位置が 20ピクセル下に下がる。

テキストウィンドウにテキストを出力するには、Locate コマンドも用意されている。CAS機能無しの他のグラフ関数電卓や fx-5800P では、テキスト文字の表示桁と表示行の位置を指定するが、fx-CP400 での表示位置はフォントの左上の位置をピクセル位置で指定する。Locate はテキストウィンドウへの出力専用で、グラフ(グラフィック)ウィンドウには出力できないのにピクセル座標での位置指定を要求するのは、なんとも理解できない謎仕様だ。

Locate でテキストウィンドウに何桁、何行出力できるのかを、次のコードを書いて調べた。
TextDisp_src1 TextDisp_src2 
Pauseコマンドは1つしか書いていないので、Pause コマンドが左と右の繋ぎ目になっている。

実行すると、テキストウィンドウは28桁(横)、10行で丁度収まる。
TextDisp1 TextDisp1_2 
左の画面で [OK] をタップすると、右の画面になり、右下に [▶] アイコンが現れる。これは Pause コマンドで一時停止している時に表示される。ここで、7つ並んでいるショートカットアイコンの中央にある Resize をタップするとテキストウィンドウが縦長に変化する。
ShortCut 

縦長になってから右下の [▶] をタップすると、引き続きテキストが下に出力される。
TextDisp2
 TextDisp3 
そして最後にコードに書いたメッセージが出力される。
TextDisp4 
リサイズされた縦長のテキストウィンドウは、テキスト21行で丁度収まることが分かる。
テキストウィンドウのサイズ -  桁 x 行
 - テキストウィンドウ28桁 x 10行
 - テキストウィンドウ28行 x 21行

なおウィンドウへの出力なので、上記の桁や行を超えると、スクロールバーが現れる。つまり桁や行の制限は無いわけだ。
TextDisp_scroll1  TextDisp_scroll3TextDisp_scroll2 TextDisp_scroll4 

グラフウィンドウ (グラフィックウィンドウ)
グラフウィンドウに出力できるピクセル範囲を、ピクセルを1ドットづつ塗りつぶすコードを書いて調べた。
GrphDisp_src 
チョット脱線するが、fx-CP400 では作成したコードを実行する際に、パラメータを指定することができる。上のコードでは塗りつぶし開始ピクセルの位置を座標 (a, b) としていて、実行時にパラメータ ab を指定するようにしている。

2つのパラメータともに 1 を指定して、このコードを実行する。
GrphDisp_1 
横 309 ドット、縦 185ドットを塗りつぶすと、グラフウィンドウがちょうど塗りつぶされることが確認できた。塗りつぶした結果をよく見ると、上端と左端がともに1ドット塗りつぶされてない。PxlOn コマンドで指定する座標は、x座標は1以上、y座標も1以上を指定する仕様だ。一方 Plot コマンドで表示されるカーソル表示には、上端と左端のピクセルが使われる。このあたりは他のグラフ関数電卓と同じ仕様になっているのは興味深い。

さて、Pause コマンドを使っているので、右下に [▶] アイコンが表示されプログラムが一時停止されている。
ここで、ショートカットアイコンで Resize をタップすると、グラフウィンドウが縦長に広くなる。
ShortCut 
そして [▶] をタップすると、塗りつぶしが再開され、塗りつぶしが継続する。
GrphDisp_2 
縦 400ドットまで塗りつぶすと、縦長のグラフウィンドウにちょうど収まることが分かった。

グラフウィンドウのピクセル数 - (x, y)
 - グラフウィンドウ:ウィンドウサイズ(310, 186)、出力範囲(309, 185)
 - グラフウィンドウ:ウィンドウサイズ(310, 401)、出力範囲(309, 400)


グラフウィンドウへの出力は、範囲を超えてもスクロールバーが現れない点が、テキストウィンドウと異なる。


fx-CP400 のベンチマーク

以下、実際にプログラムを作成、実行した結果を紹介してゆく。

数値演算

先ずは、四則演算や関数計算を行うプログラムの処理速度を調べる。これまでに記事にした機種で共通して使えるコマンドを出来るだけ用いて、同じアルゴリズムで書いた「加算プログラム」と「数値積分プログラム」の実行速度比較を比較する。

加算プログラム
加算 

プログラムを起動し、N に 1000 を入力して実行時間を計る。

fx-CP400 のプログラム
AddTest_Goto_src AddTest_For_src 
GotoIf を使う例と For を使う例の2通りで処理速度を調べることにする。


数値積分プログラム
関数 

この通史積分は、とね日記 - 席初の手帳型プログラム関数電卓 CASIO FX-502P (1979), FX602P (1981) で取り上げられているものをそのまま使わせていただく。

プログラム起動し、分割数として 1000 を入力して、時効時間を計る。

fx-CP400 のプログラム
FuncTest_Goto_src FuncTest_For_src 
GotoIf を使う例と For を使う例の2通りで処理速度を調べることにする。

以前調べた結果と併せて、上記の計算速度のを比較結果を示す;
加算プログラム数値積分プログラム
機種実行時間比較実行時間 (秒)比較
FX-502P123.1 秒---1261.8 秒---
FX-602P111.2 秒1.1 倍716.5 秒1.8 倍
FX-603P37.8 秒3.3 倍166.2 秒7.6 倍
fx-4000P61.7 秒2.0 倍349.1秒3.6 倍
fx-4500P195.0 秒0.6 倍798.1 秒1.6 倍
fx-4800P
A=A+126.3 秒4.7 倍114.3 秒11.0 倍
Isz A21.2 秒5.8 倍109.4 秒11.5 秒
fx-7000GA=A+120.7 秒5.9 倍146.1 秒8.6 倍
Isz A19.3 秒6.4 倍143.2 秒 8.8 倍
fx-CP400Goto & If18.2 秒6.8 倍39.2 秒32.2 倍
For12.6 秒9.8 倍33.0 秒38.2 倍
fx-CG50
Goto3.9 秒31.6 倍8.2 秒153.9 倍
For2.3 秒53.5 倍6.3 秒200.3 倍

記念すべき FX-502P を基準に、処理速度が何倍になっているのかも示している。
fx-7000G から上の機種 (いずれも1980年台の製品) と比べると、四則演算は速く、関数処理はさらに速い結果になった。
但し、高精細カラー液晶を搭載した fx-CG50 に比べると、圧倒的に処理が遅い


グラフィック描画

グラフィックプログラム例

fx-7000G で実施したドット塗り潰しのコードは下記になる。
fx7000G_Dot  

同じ動作を fx-CP400 で書くと下記になる。fx-7000G には For 文が無いが、fx-CP400 では For 文を使うことにする。
DotTest_src_CP40

これを実行すると以下のようになる。
DotTest_result_CP400

描画には 327.5秒 (5分27.5秒) 要した。

fx-7000G 以降のグラフ関数電卓でも上記のアルゴリズムがそのまま走る。ところで2001年以降に発売されたグラフ関数電卓に搭載されている言語の中では fx-9860G が最もグラフィックス描画が速いのだが、それでも同じアルゴリズムの実行に 260秒程度かかる。ところが、1985年発売の世界初グラフ関数電卓 fx-7000G よりも遅い。fx-CP400 のグラフィック描画は、非常に遅いと言える。


テキスト描画

ピタゴラス数の計算プログラム。
プログラムの詳細はこちら
ピタゴラス数500個を計算して結果を出力するまでの時間を調べる。

Pytha_cp400_src1 Pytha_cp400_src2

これを実行すると、以下のような画面が得られる。
Pyha_cp400_1 Pytha_cp400_2


PYTHA
CFX-9850G165.6 秒---
CFX-9850GC PLUS267.7 秒0.62 倍
fx-9860G3.87 倍115.4 秒1.44 倍
OS 1.03115.8 秒1.43 倍
OS 1.04115.8 秒1.43 倍
OS 1.05115.9 秒1.43 倍
OS 2.01128.7 秒1.29 倍
fx-5800P---206.6 秒0.56 倍
fx-9750GIIIOS 3.4054.4 秒2.12 倍
fx-CG400OS 2.01.6512.0 秒0.23 倍
fx-CG50OS 3.5082.4 秒1.40 倍

いつくかのグラフ関数電卓での速度も合わせて示し、GetkeyLocate を最初に搭載した CFX-9860G を基準にして処理速度の比率も合わせて示した。fx-CP400 は恐ろしく遅いことが判る。


プログラム電卓の系譜

カシオグラフ関数電卓では、初めて高精細カラー液晶を搭載したカラーグラフ関数電卓 fx-CG10 Prizm が 北米で発売されたのが 2011年、同じものが北米以外で fx-CG20 と名前を変えて発売されたのが 2012年であった。これらのモデルには、新世代Casio Basicが搭載されていた。同時に発売されていたモノクロ液晶モデル fx-9860GII にも、ほぼ同じ仕様の 新世代Casio Basic が搭載されていた。そして、カラー液晶モデルは画面出力が極めて遅いという難点があった。 

翌年の 2013年に、カラーCASグラフ関数電卓 fx-CP400 が発売され、これには 新世代Casio Basic とは全く異なる Casio 仕様の構造化Basic が搭載された。このモデルに搭載されている構造化Basicは、構造制御のスタックが少なく使いづい上に、動作が異常に遅いといった、実用性に欠けるものだと言わざるを得ない

5年後の 2018年には、カラーグラフ関数電卓の新しいモデル fx-CG50 が発売され、新世代Casio Basicの動作速度、特に画面出力速度が大きく向上した。さらに、2020年には OSアップデートにより fx-CG50Pythonモードが追加された。

この Casio Python は画面出力を含めて、動作が劇的に速くなった (グラフィック出力は100倍以上向上)。Casio Python の仕様は、電卓への組込 microPythonに近いもので、PC向けの一般的な Python (CPython) の大幅なサブセット版になっており、実用プログラムを作るだけの機能はまだ搭載されておらず、まだ発展途上だと言える。

但し、プログラム電卓の搭載言語に Casio Python が加わったことは、大きな変化点と言える。一方で、fx-CP400fx-CG500 搭載の "発展途上" と言える構造化Basic は、主にその処理速度の遅さから、実用プログラムを作るには全く向いていない。そして Casio 仕様の構造化Basic のアップデートに今後カシオがリソースをつぎ込むとは考えにくい。これらのモデルはプログラミングを楽しむには全く向いていない。現在のところで言えば、構造化Basic を搭載することで搭載言語の進化を試みたが、その深化を試みる機会を失ったのが fx-CP400 (fx-CG500) の位置だと考えられる。




温故知新 - FX-502P / FX-602P / FX-603P
温故知新 - fx-4000P / fx-4500P / fx-4800P
温故知新 - fx-7000G 
温故知新 - CFX-9860G
温故知新 - CFX-9850GC PLUS
温故知新 - fx-9860G
温故知新 - fx-5800P
温故知新 - fx-9860GII
温故知新 - fx-CG10/ fx-CG20
温故知新 - fx-CP400
温故知新 - fx-CG50
温故知新 - fx-9750GIII
温故知新:番外編 - 関数電卓としての使い勝手
温故知新:番外編 - 電卓評価用の積分を解いてみる
温故知新:番外編 - 電卓評価用の複素数を解いてみた





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


 


keywords: プログラム関数電卓、プログラミング、Casio Basic、fx-CP400

リンク集 | ブログ内マップ
関連記事

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

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

やす (Krtyski)

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


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

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

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


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR