昨日の記事で予告した通り、指数計算の計算順序について、書いてみようかと思う。


前回書いた通り、
235
という指数計算があったとして、皆さんどう計算しますか?
という話し。

例えば、四則演算の演算子で言うと、
×と÷、+と-、これらは左から順番に計算していく決まりがある。
但し、括弧や×や÷といったランクの高い演算は先に計算します。
というルールがありますね。

ということは、指数においても、
23=8
を先に計算して、
85=32768
だと思っている人は結構多いかと思いますが、数学的には間違っています。

正しくは、
35=243
を先に計算して、
2243=14134776518227074636666380005943348126619871175004951664972849610340958208
という計算順序となります。

なぜ?と思うかもしれませんので、簡単に説明すると、可換であるかが鍵となります。
A+B=B+A
A×B=B×A
のように、可換な演算と、
A-B≠B-A
A÷B≠B÷A
のように、可換ではない演算というものに分けられ、
指数計算は、
AB≠BA
と可換ではないことが解ります。
これは、2項だけではなく、3項でも4項でも引き継がれるものでなければなりません。
A+B+C=A+C+B=B+A+C=B+C+A=C+A+B=C+B+A
A×B×C=A×C×B=B×A×C=B×C×A=C×A×B=C×B×A
というように、可換は可換であり続けます。
逆に、可換ではないものも、
A-B-C=A-C-B
A÷B÷C=A÷C÷B
のように、最初を除けば可換なところもあることはありますが、Aの場所は変えることは出来ません。
確かに、
(AB)C=AB✕C=(AC)B
のように、括弧を使えば、BとCは可換ですが、やはりAの位置は固定されています。
このような計算をすることは、実際問題としてしばしばありますが、それは括弧がついている場合に限られ、括弧がない場合はやってはいけません。

例えば、「父の父の父」であれば、
(父の父)の父=父の(父の父)
と、どちらであっても同一人物を指しています。
(1313)13=13(1313)
は成り立ちますね。

「先生の妻の兄」と「先生の兄の妻」を比べた場合、
先生の妻の兄≠先生の兄の妻
であることが解るかと思います。
先生の(妻の兄)≠先生の(兄の妻)
と括弧の中を交換しては意味が変わってきてしまいます。
2(35)≠2(53)
ということですので、
235と書いてあった場合、3と5は交換してはいけないものなので、先に計算するということです。


さて、このように、右肩に小さい文字で積み上げていく指数の表記方法では、この通りであることは、数学屋の私の言葉を信じて貰うしかありません。

さてさて、私のもう一つの顔であるコンピュータのエンジニア、プログラマ、スクリプタとしての見解に移ります。

コンピュータのテキストベースの環境において、指数演算子として ^ の記号が一般的に使用され、
2^3^5
のように記述したりします。
この場合においても、数学的な見地からであれば、3^5が先に計算されますが、プログラミング言語では仕様による。としか言えません。

まぁ、一般的なプログラミング言語において、^記号は指数の演算子として定義されていることは稀で、^記号は排他的ビット和、XORとして利用されることが多いように思われます。

私が使ってきたプログラミング言語において、指数演算子が用意されていた言語は、FORTRANやJavascriptくらいしか思い浮かびませんが、他にもまだまだあると思います。

FORTRANにおいて、指数演算子は**とアスタリスクを2個連続させたものとなります。
X=A**B**C
という計算を行うと、FOTRANの中ではかなり珍しい例外として、A**(B**C)のように計算されます。
X=2**3**5
では、Xには1.4134776518227075e+73といった値が代入されています。

Javascriptにおいても、
x = 2**3**5;
を計算したあと、xを表示すると、
1.4134776518227075e+73
という値が格納されます。

プログラミング言語では、すべての演算子について優先順位が決まっていますので、その通りに動くことになります。

さて、他のプログラミング言語、
例えばC言語であれば、
x = pow(a, pow(b, c));

例えば、Javascriptであれば、
x = Math.pow(a, Math.pow(b, c));

といったように指数関数が用意されていたりします。


まぁ、すべてのプログラミング言語に対して、調べるなんてことは出来ないですし、しないですが、プログラミング言語は仕様によって厳密に定義されているということだけは間違いようのない事実です。


さて、このブログの読者すべてが数学徒だったり、プログラマだったりするとは思えませんので、使う側の人間、つまりアプリについて調べてみます。


Windows標準の電卓を、関数電卓モードにして、



2^3^5=
32,768
つまり、(2^3)^5と計算していることが解ります。


友達のMacBookでは、



こちらは、キーボードから
2^3^5
と入力した結果、
32768
と返って来ていますので、
(2^3)^5
の順で計算していることが解ります。


また友達のiPhoneでは、画面の回転のロックを解除した状態で横向きにすることで、関数電卓となります。、



こちらはキー入力は出来ないので、ボタン操作で、
  2     xy     3     xy     5   の順でタップした結果、32768でした。


続いて、私のAndroidスマホの標準電卓を使うと、



計算式には括弧は付加されず、
結果は、
1.4134776E73
と、数学と同じ計算順でした。


メジャーOSの標準プリインストールのアプリでは、このような結果となりました。


検証出来るものは、とことん検証してみましょう。


まずは、私が一番長く利用しているであろうMicrosof Excelです。



=2^3^5
の結果が、
32768
です。
POWER関数が2項演算子として存在していますが、
=POWER(2,POWER(3,5))
と書くか、
=POWER(POWER(2,3),5)
と書くかの違いで、どちらの計算順にすることが出来ます。


続いて、「OK Google」で計算させてみましょう。

「2の3乗の5乗は?」



ご丁寧に
(2の3乗)の5乗 =
と書いた上で、
32768でした。

ならば、苦手だが英語で、
「2 to the power of 3 to the power of 5?」



2^(3^5) = 
1.4134777e+73
と数学と同じ計算順です。

念のため、検索窓に、
「2^3^5」
と手入力して[Enter]してみると、



2^(3^5) = 
1.4134777e+73
と数学と同じ計算順です。

日本語だけが上手く行かなかったのは悔しいところではありますが、ちょっと笑ってしまいました。


複雑な数学の計算が出来る WolframAlpha で試してみましょう。



2^3^5とテキストで入力したものを、
235
だと認識して、
14134776518227074636666380005943348126619871175004951664972849610340958208
という結果を出力しています。


続いて、GeoGebraでも試しみましょう。



科学計算電卓を使って、
2^3^5
を入力したら、
2(35) のように括弧を付加して、優先順位を明確にした上で、
= 14134776518227075000000000000000000000000000000000000000000000000000000000
と返しています。
末尾に続く0はGeoGebra内部での有効桁数によるものですので、この値に丸められたということでしょう。


最後は、スマホで愛用している手書き電卓のMyScript Calculatorで試してみましょう。



手書きで書いたものが、清書されて、答えを出してくれます。
235=1.413477...✕1073
ちゃんとしていますね。


このように、アプリによって、指数の計算順がバラバラだったりするので、結果に大きく及んでしまうということを知っておいて欲しい。

数学系アプリでは、やはり数学に準拠していることが解るかと思います。
電卓系アプリは、電卓の仕様に依存するということでしょうかね。

指数計算をする機会がありましたら、この2^3^5といった計算をさせてみて、結果を確認しておくというのも重要な検証作業になるかと思います。
つまり、アプリの仕様を事前にチェックしておくということです。

私としては、Googleがちゃんとしていてくれて良かったなと思うが、他は他でその結果を出力しなければならない何らかの柵(しがらみ)があったのではなかろうかと思ってしまうのでした。

アメリカ大手5社のGAFAMのうちの3社で、統一性がないというのもおかしく、いずれ数学の方へ正していくのかどうか、今後が見ものかもしれません。


ではでは