2025年1月1日水曜日

С Новым Годом 2025 !

あけましておめでとうございます。

今年は巳年。「古き衣を脱ぎ捨て、蛇は新たに生まれ変わるべし」となるのでしょうか。

 

電卓の敗退と逆襲


過日、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スマートフォンの様に概算で良ければ、それなりの値を得る方法はあります。こんなコードはどうでしょうか。
```
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! の計算をやってみた結果を示しておきます。

  1. 数式計算

    こんな具合です。
    ```
    Σ(log I, I, 1, 20000) →R 
    77337.25988
    ```
    ほぼ、30秒くらい掛かりました。20000までの対数の和を求めるとなると、これくらいは掛かりそうです。

  2. BASIC
    色々と技巧を凝らす余地がありそうですから、ここではBASICのコードを提示する事は止めておきますが、
    当方が試した所、およそ50秒程度の時間が掛かりました。プログラムループですから、時間が掛かるのはやむを得ない所です。その分、プログラムの内容を変更できるという自由度がある訳です。

  3. upython
    上記のコードがそのまま動きます。
    fx-CG50 upython では、圧倒的な速さで、なんと 6秒くらいでした。

まあ、16000! なんて値、日常で使う機会はなさそうなので、今回も「ネタ」という事で御了承戴き度。

  こうしてみると、upython の可能性は目を見張るものがありますが、これだけに突っ込んでしまうと、関数電卓の部分が疎かになったりしないのか、という不安もあります。
それよりは、様々な計算の手段を充実して、社会に貢献して欲しいと、切に願うものではあります。

そんな具合ですが、今年もポツポツとやって行きたく、よろしくお願い申し上げ候。