コンピュータ内部、具体的にはCPUでは、足し算だけで四則演算の他の計算も行っています。つまり、2×3だろうが9÷3だろうが5-1だろうが、全ては二進数の加算として表現され、そして計算処理されているということです。
a - bはbの補数を足す、a × bはaがb個あり、その総和だし、a ÷ bはaからbが何回引き算できるか、なので、つまり負の数の足し算を複数回行うということになります。
というわけで、確かに足し算だけで、四則演算の全てを行うことが可能だと分かります。CPUが延々と足し算を行い続けている、と想像すると少し不思議な気持ちになりますね。
プログラミングをする上で、CPU上では足し算で他の四則演算が実行されていることを考える必要もないし、意識することもありません。
とは言え、実際に掛け算を足し算だけで行うプログラムはどのように書くか、あるいはべき乗算はどのように足し算だけで行えるか、ということに興味が湧いたので、Pythonでコードを書いてみました。
まずは乗算から
ある数にその数自身を掛けることをべき乗といい、xのn乗という形で表されます。プログラミング上では、powというような関数が用意されており、ゲームプログラムでもよく使われる計算です。
今回、まずは足し算だけで掛け算、つまり乗算を行うコードから考えていきます。掛け算については九九で暗記する形で覚えているものですが、改めて考えると次のようになります。
Aがn個あり、その全ての合計が積
A×n = A1 + A2 + ... + An
例えば、サザンが9というのは3が3個あるということで、3+3+3=9と表すことができ、確かに足し算で掛け算が表現できています。
n回足す、ということでfor文を使えば、乗算を足し算だけで行うことが出来そうです。
負の数を掛ける場合を考えてabs( )で絶対値を取り出す処理をしてますが、今回は自然数の計算についてのみ考えたコードなので、特に気にしないでください。
とても単純なコードで、sumという変数を用意して初期化し、そこにaをb回足していく、というものです。これでa×bを足し算だけで処理することが出来るようになりました。ということで、応用編として自乗算へと赴きます。
自分自身を掛ける
3乗以上の自乗は積に対して、さらに自身を掛けていくということを複数回行うため、積とオリジナルの数とを分けておく必要があります。
つまり直接的にmulti_by_add(x, x)とやると、xに掛けるxそれ自体がどんどん変化してしまうということです。
なので、sumという変数にあらかじめ、xを代入しておきます。(変数名があえてsumなのは実際には足し算を行うため)
(3 * 3) * 3 * 3 = (9 * 3) * 3 = (27 * 3) = 81
こうすることで、計算結果を累積させていきます。
掛け算の場合と同じく、for文を使って複数回計算を行うという手法を取ります。つまり、xのn乗はx * xをn-1回行う、ということになります。
3の3乗、3 * 3 * 3は、3に3を2回(3-1)掛けている。
ちなみに0乗は1となる、という場合は考えていますが、マイナス乗のケースについては今回考えないものとしてますので、ここではとりあえず-1を返す、ということにしてますが、意味のないものとして無視してください。
まとめ
というわけで、コンピュータの本質に迫る、加算だけを使った四則演算の内、掛け算及びべき乗算をVisual Studio 2019を使って、Pythonでコーディングしてみました。
やはり、ちょっとしたコードを書きたい時にPythonはすごい便利ですね。Pythonの本格的な勉強もしてみたいなぁ、と思う今日この頃なのでした。