あけましておめでとうございます。
今年は巳年。「古き衣を脱ぎ捨て、蛇は新たに生まれ変わるべし」となるのでしょうか。
電卓の敗退と逆襲
過日、Androidスマートフォンの比較的新し目の機種をいじる機会があり、電卓を使ってみたのですが、いや、驚いちゃったねェ。標準でも、一部の関数機能の利用が出来ますが、中でも驚いたのが、階乗の計算能。普通の関数電卓でも、69!
までしか計算できませんが、Androidスマートフォンの階乗計算、19515! = 6.758099E75235
というキチガイじみた値まで計算しましたよ。マイッタ。
しかし、階乗の計算に限定すれば、upython でもある程度イケるのではないか、と。
```
def long_f(n) :```
r = 1
for i in range(n) :
r = r * (n+1)
return r
long_f(1000)
これで値を返すはずなのですが、fx-CG50 で行うと、メモリが足りないという返事。これはクルシイ。恐らく、整数の全桁を表示するためのメモリが足りない、という所なのではなかろうか。
この面だけみると、「関数電卓の敗北」という具合になりそうですが、Androidスマートフォンの様に概算で良ければ、それなりの値を得る方法はあります。こんなコードはどうでしょうか。
```
以下、パソコで実行した場合の出力を示しておきます。
```
やっている事と云うと、階乗の計算の対数を取ると解ります。log(n!) = Σ log(k) です。総和計算をしてから、10のべき乗にすれば、所望の値を得られるという寸法。
fx-CG50 では、複数の手段が利用できます。以下では、20000! の計算をやってみた結果を示しておきます。
この面だけみると、「関数電卓の敗北」という具合になりそうですが、Androidスマートフォンの様に概算で良ければ、それなりの値を得る方法はあります。こんなコードはどうでしょうか。
```
import math```
def large_f(n) :
r = 0
for i in range(n) :
r = r + math.log10(i+1)
print(pow(10, r-int(r)), 'e', int(r))
以下、パソコで実行した場合の出力を示しておきます。
```
>>> large_f(330)```
2.8240846225829777 e 689
>>> large_f(1000)
4.023872600748676 e 2567
>>> large_f(10000)
2.84625968062148 e 35659
>>> large_f(20000)
1.8192063204524245 e 77337
やっている事と云うと、階乗の計算の対数を取ると解ります。log(n!) = Σ log(k) です。総和計算をしてから、10のべき乗にすれば、所望の値を得られるという寸法。
fx-CG50 では、複数の手段が利用できます。以下では、20000! の計算をやってみた結果を示しておきます。
- 数式計算
こんな具合です。
```
Σ(log I, I, 1, 20000) →R
```
77337.25988
ほぼ、30秒くらい掛かりました。20000までの対数の和を求めるとなると、これくらいは掛かりそうです。 - BASIC
色々と技巧を凝らす余地がありそうですから、ここではBASICのコードを提示する事は止めておきますが、
当方が試した所、およそ50秒程度の時間が掛かりました。プログラムループですから、時間が掛かるのはやむを得ない所です。その分、プログラムの内容を変更できるという自由度がある訳です。 - upython
上記のコードがそのまま動きます。
fx-CG50 upython では、圧倒的な速さで、なんと 6秒くらいでした。
まあ、16000! なんて値、日常で使う機会はなさそうなので、今回も「ネタ」という事で御了承戴き度。
こうしてみると、upython の可能性は目を見張るものがありますが、これだけに突っ込んでしまうと、関数電卓の部分が疎かになったりしないのか、という不安もあります。
それよりは、様々な計算の手段を充実して、社会に貢献して欲しいと、切に願うものではあります。
そんな具合ですが、今年もポツポツとやって行きたく、よろしくお願い申し上げ候。