Casio関数電卓で素因数分解 - 様々なアプローチ

 Casio関数電卓で素因数分解 - 様々なアプローチ

初版 2020/12/31


当ブログ開設直後の 2013年10月に、fx-5800P の Casio Basic で走る素因数分解プログラムを紹介し、電卓プログラミングで素因数分解を紹介してきました。その後、Casio Basic プログラムだけでなく、Pythonモードで走る Casio Python スクリプトや アドイン版Casio Basoc - C.Basic で走るプログラムをグラフ関数電卓の異なるモデル向けに作成して紹介してきています。

そこで、これまでに作成した素因数分解プログラムを以下に整理します。

なお、スタンダード関数電卓には、素因数分解機能を備えたモデルがあります。これらの素因数分解機能とこれまで作成した素因数分解プログラムとの比較を本記事に追加する予定です。


純正Casio Basic の素因数分解プログラム
 10桁以下の整数の素因数分解に対応しています。

 2と奇数で愚直にエラストテレスの篩いで計算
   fx-5800P 素因数分解 - バグ修正と表示変更

   ダウンロード:
    fx-5800P用 - PRIME DECOMPの pdf ファイル 
    fx-5800P用 - PRIME DECOMP の ccl ファイル
      cclファイルは、CcLinker を使ってプログラムを fx-5800P に転送可能
    fx-9860G / GII / GIII、fx-9750GIII 用 - PRIME.g1m プログラムファイル
    fx-7400GIII 用 - PRIME.g1m プログラムファイル
    fx-CG20 / CG50 用 - PRIME.g3m プログラムファイル


  効率化したエラストテレスの篩いで計算
  ⇒ fx-5800P 素因数分解 - 高速化 - 上記の約4倍の高速化を達成

   ダウンロード:メインプログラムとサブプログラムの2つ
    Casio Basic 搭載の全てのモデルに対応しました!
    fx-5800P 用 - FACTOR-F1 の ccl ファイル
    fx-9860G / GII / GIII、fx-9750GIII 用 - FactorG.g1m プログラムファイル
    fx-CG20 / CG50 用 - FactorG.g3m プログラムファイル
    fx-7400GIII 用 - FactorGL.g1m プログラムファイル
    CFX-9850Gシリーズ用 - FactorG.cat プログラムファイル


  効率化したエラストテレスの篩いをさらに高速化したもの
  ⇒ fx-5800P 祖進数分解 - さらなる高速化 - 4倍高速化がさらに 9% 高速化

   ダウンロード:メインプログラムとサブプログラムの2つ
    fx-5800P 用 - FACTOR-F2 の ccl ファイル
    fx-9860G/GII/GIII、fx-9750GIII、fx-CG20/CG50 用 - FACTORG1 プログラムファイル
    fx-7400GIII 用 - FACTOGL1.g1m プログラムファイル


Python モードでの素因数分解スクリプト
 桁数を拡張して15桁以下の整数の素因数分解に対応、
 fx-CG20 / CG50 用 FactorG を Casio Python に移植したものです。

  効率化したエラストテレスの篩いで計算
  ⇒ シェル画面入力の工夫: 高速素因数分解(1)
  ⇒ Pythonらしい反復処理:高速素因数分解(2)
  ⇒ 大きな数の計算:高速素因数分解(3)
  ⇒ 関数呼出オーバーヘッド:高速素因数分解(4)
  ⇒ 要素数の多いリスト:高速素因数分解(5)
  ⇒ 10進数演算の出力と精度:高速素因数分解(7)
  ⇒ CGモデルとFXモデルのPythonモードの違い

  ダウンロード: fx-CG50 OS3.4以降、fx-9750GIII、fx-9860GIII OS3.4以降で動作
   15桁対応高速素因数分解 Ver 7.1 - FactorG7.py



C.Basic での素因数分解プログラム
 桁数を拡張して15桁以下の整数の素因数分解に対応しました。

 効率化したエラストテレスの篩いで計算
  ⇒ グラフ関数電卓 - 高速素因数分解、15桁対応

  ダウンロード: fx-CG20 / CG50、fx-9860G / GII / GIII, fx-9750GIII の C.Basic で動作
   15桁対応・高速素因数分解 - FactorG2.g3m for C.Basic
   ※ アドイン版 Casio Basic - C.Basic for FX / C.Basic for CG のインストールが必要 







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


 



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

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







関連記事

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

Casio 関数電卓の素因数分解

  追記 2020/12/25

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

 ・ fx-5800P で素因数分解
 ・ fx-5800P で素因数分解再び
 ・ fx-5800P 素因数分解 - バグ修正と表示変更
 ・ fx-9860GII への移植 - 素因数分解
 ・ VBAで素因数分解
 ・ fx-5800P 素因数分解 - 高速化 [2020/01/07 追記]
 ・ fx-5800P 素因数分解 - さらなる高速化 [2020/12/25 追記]

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

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

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

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

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


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

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

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

fx-5800Pで素因数分解

2013/11/01:追記
2015/01/25:追記
2019/07/10:追記
2020/05/25:追記
2020/12/24:追記


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

fx-995ES fx-5800P_1  
      fx-995ES         fx-5800P


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

他の新機能、例えば

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

などのうち、素因数分解を日常的に使う人は居ないだろう。

実用性とは別に、興味を惹いたのが素因数分解だ。
そこで、fx-5800P に素因数分解を実装してみようと思った。


素因数分解

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

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

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

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


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



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

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


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

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

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


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

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


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

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


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

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

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


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

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

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

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


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

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

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



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

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

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

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


==========

その後、素因数分解プログラムの高速化や多くの機種への移植を行ってきたので、その歴史を以下にまとめる。

[2020/12/24 追記]
C.Basic を使って fx-CG50 で素因数分解する数を15桁まで拡張しました。
 ⇒ グラフ関数電卓 - 高速素因数分解、15桁対応

[2020/10/22 追記]
Pythonモードを使って fx-CG50 で15桁の高速素因数分解スクリプトの作成;
fx-CG50 Casio Basic プログラムを Casio Python に移植しました。
 ⇒ Casio Python - シェル画面入力の工夫:高速素因数分解(1) 
 ⇒ Casio Python - Pythonらしい反復処理:高速素因数分解(2)
 ⇒ Casio Python - 大きな数の計算:高速素因数分解(3)
 ⇒ Casio Python - 関数呼出オーバーヘッド:高速素因数分解(4)
 ⇒ Casio Python - 要素数の多いリスト:高速素因数分解(5)
 ⇒ Casio Python - 10進数除算の出力と精度:高速素因数分解(7)

[2020/12/05 追記]
fx-5800P で最速の素因数分解プログラムをさらに高速化できました。
 ⇒ fx-5800P 素因数分解 - さらなる高速化

[2019/07/10 追記]
fx-5800P で4敗に高速化した素因数分解プログラムを紹介しています。
fx-CG50など主なグラフ関数電卓へ移植したプログラムもダウンロードできます。
 ⇒ fx-5800P 素因数分解 - 高速化

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

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




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


 


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

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

関連記事

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

Casio Python - Shell 画面とグラフィック画面の活用:コラッツ問題

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - Shell 画面とグラフィック画面の活用:コラッツ問題 
目次


初版:2020/12/12


前の記事 - 16. circle() 関数のFXモデルへの拡張 |  次の記事 -


17. Shell 画面とグラフィック画面の活用:コラッツ問題

<fx-CG50 OS3.40以降にに対応>

Casio Python は、入出力に極めて大きな制限があります。そこで今回は、Casio Python で shell 画面とグラフィック画面 (描画画面) をうまく活用して、出力方法を工夫してみます。そのための題材として、コラッツ問題を取り上げます。


17.1 コラッツ問題 (Collatz Problem) とは?

数学の未解決問題の1つにコラッツ問題 (コラッツ予想) があります。

コラッツ問題
任意の正の整数 n に対して、関数 f(n) を以下のように定義する。
  f(n) = 3n+1  (n が奇数のとき)  
      n/2    (n が偶数のとき)
この関数を使って、繰り返し演算を続けて、以下のように数列 ai を作る。
 ・a0 = n
 ・ai = f(ai-1)
どのような 正の整数 n のときでも、数列は 1 に到達する。


要素が1になるまでの数列 ai (i≧0) をコラッツ数列と言います。小学生レベルの四則演算で計算できる一見単純そうな問題です。コンピュータを使って実際に計算して要素が1に到達しない例がまだ見つかっていません。5x260 まで計算されているそうです。しかし、数学的にまだ証明されていません。

数学的に証明されていない限り、もっと大きな整数でコラッツ予想が成り立たなくなる例が見つかるかも知れません。

実際に計算してみます。

(1) n=6 のときのコラッツ数列 (i≧0)
ai = 6, 3, 10, 5, 16, 8, 4, 2, 1
 最初に ai=1 になるとき i = 8 

(2) n=25 のときのコラッツ数列 (i≧0)
ai = 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1
 最初に ai=1 になるとき i = 23

(3) n=27 のときのコラッツ数列 (i≧0)
ai = 27, 82, 41, 124, 62, 31. 94, 47, 142, 71, 214, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 991, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1
 最初に ai=1 になるとき i = 111 

n1 から 26 までは、手計算でも順調にできますが、n=27 になると途端に大変になり、9232 まで大きくなってしまうと、本当に 1 になるのか不安になりますが、結果として 1 に到達できました。

より詳しくは "コラッツ問題" や "コラッツ予想" で検索すれば、色々な情報が得られます。 

管理人としては、Casio Python で、
 ・計算しながら、数列の要素をグラフ表示させ、
 ・最後は、コラッツ数列の全ての要素を出力させる
そのようなスクリプトを作りたくなりました。

計算中は、数列の i の値と ai の値 (数列の要素の値) がどんどん変化している様子をリアルタイムで表示させながら、ai の値の推移をグラフ表示させ、計算が終われば ai の最大値も表示させます。最後に算出した全ての ai (数列の全ての要素) を出力させます。

今回は、以下のような動作をする Casio Python スクリプト - Collatz.py を作ります。




 Collatz.py  ダウンロード

"""Sample script

 Collatz Problem Simulation ver1.0;
 - Graphical and numerical output of
  Collatz sequence a0, a1, a2 ... an

 Collatz.py
  for fx-CG50 OS3.40 or later
   by Krtyski/e-Gadget
"""


from u import *

#Input integer >1
print('\n\n\n== Collatz Problem ==\n\n')
n=int(input('Input number:'))

#Initialize variables
offset=150
scale=50
a=[0]; a[0]=ni=0

#Draw initial screen
locate(0, 0, 'a :', size='l')
locate(3, 1, '0', size='s')
locate(3, 0, a[0], color='blue', size='l')
locate(0, 1, 'i :', size='l')
locate(0, 2, 'a :', size='l')
locate(3, 5, 'i', size='s')
locate(03, 'a :', size='l')
locate(2, 7, 'max', size='s')
line(offset, 191, 383, 191)

#Calculate and draw element of sequence
while a[i]!=1:
 #Increment index
 i+=1

 #Erase previous numbers
 locate(3, 1, i-1, color=0, size='l')
 locate(3, 2, a[i-1], color=0, size='l')

 #Calculate next element of sequence
 if a[i-1]%2:
  a.append(3*a[i-1]+1)
 else:
  a.append(a[i-1]//2)

 #Draw updated numbers
 locate(3, 1, i, size='l')
 locate(3, 2, a[i], size='l')

 #Draw (update) graph of sequence
 if a[i]//scale<192:
  line(offset+i-1, 191-a[i-1]//scale, offset+i, 191-a[i]//scale, (2550, 0))

#Draw finally maximum element
locate(3, 3, max(a), size='l')

#Output all elements of sequence
locate(0, 7, '[EXIT]', size='l')
for i in range(i+1):
 print('a' + str(i) + '=' + str(a[i]))


このスクリプトを見て、何をやっているのかスグに判る場合は、Collatz.py を実行して遊んでみて下さい。

これ以降は、Cllatz.py の解説を行い、少し遊んでみた結果を紹介します。



17.2 コラッツ数列の計算


今回は、コラッツ数列をリストで表現することにします。

つまり、
 数列:ai = a0, a1, a2, ... ,ai-1, ai

 リスト:a = [a0, a1, a2, ... ,ai-1, ai]

とすると、i 番目の要素は a[i] で得られます。

スクリプトの冒頭で、リスト a の定義 (a=[0]) を行います。この定義では、要素が 数値 0 が 1個しかないリストを定義しています。計算が終わらないと要素数が判らないので、次の要素を算出したときに、.append() 関数を使ってリストにその要素を追加し、i を1つづつ増やすようにします。

1つめの要素は、i=0 のときであり、その値は n なので、a[0]=n とします。
すると、リスト a[i] は以下のようにして求められます。

a=[0]; a[0]=ni=0

while a[i]!=1:
 #Increment index
 i+=1

 #Calculate next element of sequence
 if a[i-1]%2:
  a.append(3*a[i-1]+1)
 else:
  a.append(a[i-1]//2)


これを解説します;

a[i]
を求めるには、1つ前の a[i-1] を使って、

a[i-1] が奇数のとき、
 言い換えると、a[i-1] を 2で割ったときの余りが 0 でない時、
 つまり a[i-1]%2 が 0 でない時
  3 × a[i-1] +1 を リスト a の末尾に追加する、つまり
  a.append(3*a[i-1]+1)

・そうでない時、つまり a[i-1] が偶数のとき
  a[i-1] / 2 をリスト a の末尾に追加する、つまり
  a.append(a[i-1]//2)
  ※ ここで、リストの要素を整数にしたいので、// 演算子 (割り算の商 = 整数部を得る)を使う

この処理を a[i] が 1 でない限り繰り返せば良いので、上記の処理を whilr a[i] != 1: のループの中に記述しています。


17.3 出力の工夫ポイント

17.3.1 input() での出力
最初に1以上の整数を入力させるには、Casio Python に備わっている唯一の入力関数 input() を使います。
input() を使うと、キー入力した文字列や数値は、全て文字列として返ります。今回は、入力した数値を 数値変数 n に代入したいので、input() の戻り値を int() 関数で整数に変換します。

n=int(input())

入力時に表示する文字列は input()( ) 内に指定します。

n=int(input('Input number:'))

さて、今回は以下のような入力画面にしてみます。
Collatz_input 

チョット格好良いですね!
ちなみに、Collatz Problemコラッツ問題 のことです。

このような配置にするには、改行を利用します。文字列の中に \n を入れたら、そこで改行します。

そこで、入力画面は以下のようにします。

print('\n\n\n== Collatz Problem ==\n\n')
n=int(input('Input number:'
))



17.3.2 フォントサイズを変えて添え字の描画
コラッツ数列 ai は、添え字を使っているので、出力画面でも添え字が表現できると格好イイですよね!
そこで、以下のような表示にしてみました。

Collatz_27_1    

ここでは、a0aiamax を表示しています。

実は最初は以下のような表示にしましたが、添え字の 0i 、特に i が見づらいので却下。上のように見やすさを優先しました。

Collatz_27_2   


グラフィック画面では、大、中、小 の 3つのサイズのフォントが使えます。フォントピッチ (フォントの大きさ) を考えると、大フォントのピッタリ 1/2 が小フォントになっているので、大フォントの添え字に小フォントを使うとうまくいきそう。

ユーザー関数 locate() を作っているので、これを使います。スクリプトはチョット面倒に見えますが、コンセプトは簡単なので、地道に作ってゆきます。

 ユーザー関数 locate() の説明
 ※ locate() を使うには、ユーザーモジュール u.py をインポートします。
   from u import *


結果は、以下のようになります。

locate(0, 0, 'a :', size='l')
locate(3, 1, '0', size='s')
locate(3, 0, a[0], color='blue', size='l')
locate(0, 1, 'i :', size='l')
locate(0, 2, 'a :', size='l')
locate(3, 5, 'i', size='s')
locate(03, 'a :', size='l')
locate(2, 7, 'max', size='s')


ところで、コラッツ数列 ai を、今回のスクリプトでは リスト a で扱っていて、コラッツ数列の定義から、a0n なので、
 a[0] = n
となります。

上の locate() が並んだスクリプトの、上から3番目に a[0] で出てきていますが、これは n に置き換えても同じです。そして、このときだけ 青色で表示していることは、color='blue' がパラメータに入っていることで判ります (ユーザー関数 locate() の仕様)。


17.3.3 リアルタイムに変わる数値の表示
これを実現するには、グラフィック画面 (描画画面) に文字列を描画するしかありません。print() でshell 画面に出力するのでは、スクロールしてしまいます。

グラフィック画面で文字列を描画するには、casioplot モジュールに含まれる draw_string() 関数を使えば良いのですが、より使いやすくするために作ったユーザー関数 locate() を使います。

描画した文字列を新しい文字列で上書きするには、以下の手順が必要になります。
 (1) 色を指定して文字列を描画
 (2) 同じ位置に同じ文字列を白で再描画して、文字列を消去
 (3) 同じ位置に新たな文字列描画
手順 (2) が不可欠です。

locate() を使うには、ユーザーモジュール u.py をインポートします。
  from u import *


コラッツ数列を リスト a として得るための while ループの中に、i の値と a[i] の値をリアルタイムで描画するコードを追加すると、以下のようになります。

#Calculate and draw element of sequence
while a[i]!=1:
 #Increment index
 i+=1

 #Erase previous numbers ◀ この2行↓を追加
 locate(3, 1, i-1, color=0, size='l')
 locate(3, 2, a[i-1], color=0, size='l')

 #Calculate next element of sequence
 if a[i-1]%2:
  a.append(3*a[i-1]+1)
 else:
  a.append(a[i-1]//2)

 #Draw updated numbers ◀ この2行↓を追加
 locate(3, 1, i, size='l')
 locate(3, 2, a[i], size='l')



17.3.4 グラフの描画
横軸に i の値、縦軸に a[i] の値 をとって、ユーザー関数 line() を使ってグラフを描画します。

基本的には、点 (i-1, a[i-1]) と 点 (i, a[i]) を結んだ線分を描画することになりますが、画面全体の左上が原点になる座標系から、所定の長方形のエリアの中に収まるように変換して描画する必要があります。

今回は、点 (x, y) について以下のように変換します。

横座標 (x座標) は、
  左から 150 ドットの位置から右側を使うので、変数 offset = 150 として、
  offset だけ右にずらすので、xoffset+x に変換します。

縦座標 (y 座標) は、
  上下反転させ、変数 scale = 50 として 50分の1に圧縮して整数部を取得するので、
  y191-y//scale に変換します。 

ちなみに、// 演算は除算した時の商、つまり割り算結果の整数部を得るもので、これにより整数値が得られます。line() 関数に指定する座標パラメータは整数でなくてはならない(仕様です)ので、// 演算を用います。


以上から、
 点 (i-1, a[i-1]) は、点 (offset+i-1, 191-a[i-1]//scale)
 点 (i, a[i]) は、点 (offset+i, 191-a[i]//scale)
変換できます。

そして、今回はグラフを赤 (r, g,b) = (255, 0, 0) で描画することにしているので、line() 関数を使った線分描画は、以下のようになります。

 line(offset+i-1, 191-a[i-1]//scale, offset+i, 191-a[i]//scale, (255, 0, 0))


ところで、今回のグラフ描画エリアも画面に表示します。但し長方形のエリアではなく、エリアの下端のみを直線で示すことにします。そこで、line() 関数を使って、以下のようにします。
 line(offset, 191, 383, 191)


さて、今の line() 関数の仕様では、画面の外の座標を指定すると、エラーにならず見えない範囲に線分描画の動作を行うので、見えない線分描画に時間がかかってしまいます。そこで、今回指定したグラフ描画エリアの外の座標を設定する場合は描画をスキップするようにして、全体として高速化します。

具体的には、a[i]//scale の値が グラフ描画エリアの高さ(縦幅)に収まるときだけ、line() 関数で描画するようにしました。
 if a[i]//scale192:
  line(offset+i-1, 191-a[i-1]//scale, offset+1, 191-a[i]//scale, (255, 0, 0
))


Collatz_27_1  


ユーザー関数 line() の説明
  ※ line() を使うには、ユーザーモジュール u.py をインポートします。
    from u impot *  


offset=150            ◀ この行を追加
scale=50             ◀ この行を追加
a=[0]; a[0]=ni=0

line(offset, 191, 383, 191) ◀ この行を追加

#Calculate and draw element of sequence
while a[i]!=1:
 #Increment index
 i+=1

 #Erase previous numbers
 locate(3, 1, i-1, color=0, size='l')
 locate(3, 2, a[i-1], color=0, size='l')

 #Calculate next element of sequence
 if a[i-1]%2:
  a.append(3*a[i-1]+1)
 else:
  a.append(a[i-1]//2)

 #Draw updated numbers
 locate(3, 1, i, size='l')
 locate(3, 2, a[i], size='l')

 #Draw (update) graph of sequence ◀ この2行↓を追加
 if a[i]//scale<192:
  line(offset+i-1, 191-a[i-1]//scale, offset+i, 191-a[i]//scale, (2550, 0))



17.3.5 数列の値の最大値を求めて表示
冒頭で、整数 27 からコラッツ数列を求めたところ、最大 9232 とかなり大きな数になったのに、少し驚きました。そこで、求めた数列の最大の要素を表示したいと思いました。

そこで while ループ終了後に、a[i] の最大値を求めて表示します。
リスト a の要素から最大値を返す関数 max() を使えば、max(a) が最大値を返します。

ところで、max() 関数は、最大値が2つ以上有る時は、リストの中で一番左にあるものを返します。今回は最大値のみに感心があるので、max() 関数を使うだけで十分です。

この最大値を locate() 関数で、所定の位置に描画するには、以下のように記述します。
 locate(3, 3, max(a), size='l')

==========

#Initialize variables
offset=150
scale=50
a=[0]; a[0]=ni=0

#Calculate and draw element of sequence
while a[i]!=1:
 #Increment index
 i+=1

 #Erase previous numbers
 locate(3, 1, i-1, color=0, size='l')
 locate(3, 2, a[i-1], color=0, size='l')

 #Calculate next element of sequence
 if a[i-1]%2:
  a.append(3*a[i-1]+1)
 else:
  a.append(a[i-1]//2)

 #Draw updated numbers
 locate(3, 1, i, size='l')
 locate(3, 2, a[i], size='l')

 #Draw (update) graph of sequence
 if a[i]//scale<192:
  line(offset+i-1, 191-a[i-1]//scale, offset+i, 191-a[i]//scale, (2550, 0))

#Draw finally maximum element ◀ この1行を追加
locate(3, 3, max(a), size='l')



17.3.6 shell 画面でのスクロール出力
最後に、コラッツ数列の全要素を表示したいのですが、計算するまでは要素数が判らないので、グラフィック画面に出力するよりも、shell 画面でスクロールさせて出力するのが良いと思います。スクロールアップ/ダウンも自由にできるので、全要素を詳しく見るのに適しています。

冒頭の動画で判るように、グラフィック画面 と shell 画面を、適材適所でうまく使い分けると良いと思います。

shell 画面でリスト a の要素 a[0] から a[i] までを表示するには、

 for i in range(i+1):
  print(a[i])


とすればOKです。

ここでは、コラッツ数列の要素を表示するのが本来な目的なので、例えば i = 70 のときの ai を表示する場合は、

 a70=991

と表示しようと思います。そこで、スクリプトは以下のようになります。

 for i in range(i+1):
  print('a' + str(i) + '=' + str(a[i
]))



グラフィック画面 (描画画面) が表示されているとき、shell 画面に切り替える方法が2つあります。
[EXIT]キーを押す
input() を実行する

今回は、[EXIT] キーを押せば良いので、グラフィック画面のまま維持しておき、[EXIT] キーを押してもらってから、shell 画面に切り替わるようにします。そこで、操作ガイドの意味で、グラフィック画面の左下に [EXIT] と表示しようと思います。
 locate(0, 7, '[EXIT]', size='l')

これに続いて、上記の リスト a の要素表示のスクリプトを追加すれば、うまくゆきます。

最後に Casio Python の制限について、付記しておきます。fx-CG50 の Pythonモードでは、print() 関数の出力は最大 200行に制限されています。コラッツ数列 (= リスト a) の要素数が 200 個を超えると、全ての要素が表示されません。

色々と整数を変えて遊んでいる限りは、今のところ 200 行を超えるケースがないので、なんとかなりそうです。以下の動画では、整数が20000以下のときは、要素数 200 を超える場合が結構少ないことが判ります。





もし 200 行を超えるものが沢山でてくるならば、チョット面倒ですが工夫次第でなんとかできると思います。

==========

全要素表示の部分を最後に追加し、今回検討したスクリプト全体を以下に示します。

from u import *

#Input integer >1

print('\n\n\n== Collatz Problem ==\n\n')
n=int(input('Input number:'))

#Initialize variables
offset=150
scale=50
a=[0]; a[0]=ni=0

#Draw initial screen
locate(0, 0, 'a :', size='l')
locate(3, 1, '0', size='s')
locate(3, 0, a[0], color='blue', size='l')
locate(0, 1, 'i :', size='l')
locate(0, 2, 'a :', size='l')
locate(3, 5, 'i', size='s')
locate(03, 'a :', size='l')
locate(2, 7, 'max', size='s')
line(offset, 191, 383, 191)

#Calculate and draw element of sequence
while a[i]!=1:
 #Increment index
 i+=1

 #Erase previous numbers
 locate(3, 1, i-1, color=0, size='l')
 locate(3, 2, a[i-1], color=0, size='l')

 #Calculate next element of sequence
 if a[i-1]%2:
  a.append(3*a[i-1]+1)
 else:
  a.append(a[i-1]//2)

 #Draw updated numbers
 locate(3, 1, i, size='l')
 locate(3, 2, a[i], size='l')

 #Draw (update) graph of sequence
 if a[i]//scale<192:
  line(offset+i-1, 191-a[i-1]//scale, offset+i, 191-a[i]//scale, (2550, 0))

#Draw finally maximum element
locate(3, 3, max(a), size='l')

#Output all elements of sequence ◀ この3行↓を追加
locate(0, 7, '[EXIT]', size='l')
for i in range(i+1):
 print('a' + str(i) + '=' + str(a[i]))


17.4 コラッツ問題で遊んでみる

適当に入力する整数を選んで、コラッツ数列の要素数 i が大きい順に並べてみました。ここでは、170 ⇒ 160 ⇒ 151 を例に挙げています。当然これより大きな要素数になるケースは間違いなくあります。

Collatz_4321 Collatz_5433 Collatz_2345 

グラフの縦軸は、縮尺率 scale = 50 にしているから、191 x 50 = 9550 が表示できる amax の上限です。これを超える場合は表示されていません。上の3つの例では、いずれも amax は 9550 以上になっています。

これに続く要素数は、例えば以下のように 146 ⇒ 144 ⇒ 136 になりました。

Collatz_865 Collatz_654 Collatz_543 

要素数 i に関わらず要素の最大値 amax9232 になっています。最初に与える整数 a0 (=リストa[0]) が 27 の時も amax = 9232 で同じなので、数列要素の計算の終盤の計算パターンが同じになっているようですね。amax が 9550 以下なので、グラフは描画エリア内に収まっています。

さらに、これに続く要素数は、例えば以下のように 132 ⇒ 127 ⇒ 125 なりました。

Collatz_1234 Collatz_235 Collatz_345 

要素の最大値 amax9232 になる計算パターンは、a0 (=a[0]) が小さい時に多く見られるようです。

そして、amax9232 になるとき、a0 (=a[0]) の最小値は 27 なのは簡単に確認できます。その時の要素数 i111 です。

Collatz_27_3 

コラッツ問題 / コラッツ予想 で計算するコラッツ数列は、なんとも面白い動きをします。いずれ誰かが数学的に証明するのでしょう。その時が楽しみです。




目 次

前の記事 - 16. circle() 関数のFXモデルへの拡張

次の記事 -





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


 


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

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

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

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

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

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

初版:2020/12/09

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

文字(列)  や 数値を、桁と行で位置を指定してグラフィック画面に描画します。
併せて、描画の色とフォントサイズを指定することもできます。
さらに、画面に転送するか、VRAMのみに転送するかの選択も可能です。

書 式locate(column, row, obj, color=1, size='m', show=1)

引 数
- 第1引数 - column: 描画する文字(列) / 数値 の座標 (桁, 行) の 桁座標、0 以上の整数
- 第2引数 - row: 描画する文字(列) / 数値の座標 (桁, 行) の 行座標、0 以上の整数
- 第3引数 - obj: 描画する文字(列) / 数値
- 第4引数 - color: 色を指定するパラメータ引数で、省略可能でデフォルトは 1 です。
       具体的な設定は grp_color() のリファレンスを参照。
- 第5引数 - size: フォントサイズを指定するパラメータ引数で、'l', 'm', 's' のいずれか。
       これは省略可能で、書略時は 'm' になります。
       'l' - 大フォント、'm' - 中フォント、's' - 小フォント
- 第6引数 - show: 1 のときは液晶に出力し、0 のときはVRAMへ転送するだけです。
       これは
パラメータ引数で、省略時は 1 になります。

引数を5つ、値だけを指定するとエラーになります ⇒ 関数の引数は こちら を参照。
引数を5つだけ設定する場合は、パラメータと共に設定します。
  例) line(5, 50, 30, 60, color=4) / line(5, 50, 30, 60, show=0)
フォントサイズの詳細 (CGモデル)
   ・'l' (大): 桁は 0~21、行は 0~7  | フォントピッチは 横16 dot、縦24 dot
   ・'m' (中): 桁は 0~31、行は 0~11 | フォントピッチは 横12 dot、縦16 dot
   ・'s' (小): 桁は 0~47、行は 0~17 | フォントピッチは 横 8 dot、縦12 dot
 フォントサイズの詳細 (FXモデル)
   ・'l' (大): 桁は 0~20、行は 0~7 | フォントピッチは 横 6 dot、縦 8 dot
   ・'m' (中): 桁は 0~31、行は 0~9 | フォントピッチは 横 4 dot、縦 6 dot
   ・'s' (小): 'm' と同じ (↑)


関数定義:

from u import *

def locate(column, row, obj, color=1, size='m', show=1):
 #set fontsize & pitch
 #from 4th argument(size)
 if isCG(): #CG model
  dx={'s':8, 'm':12, 'l':16}
  dy={'s':12, 'm':16, 'l':24}
 else: #FX model
  dx={'s':4'm':4, 'l':6}
  dy={'s':6, 'm':6, 'l':8}
 sz={'s':'small', 'm':'medium', 'l':'large'}

 #data transfer to VRAM
 draw_string(column*dx[size], row*dy[size], str(obj), grp_color(color), sz[size])

 if show: #data transfer to screen
  show_screen
()



スクリプトの解説:
  テキスト出力関数の追加:locate() をユーザーモジュールの追加 ⇒ こちら
  CGモデルとFXモデルの判定方法について ⇒ こちら
 ▶ grp_color() ユーザー関数 ⇒ こちら



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


 


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

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

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

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

やす (Krtyski)

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


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

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

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR