p進数の足し算と掛け算

Last-modified: Wed, 15 Mar 2017 23:22:34 JST (1724d)
Top > p進数の足し算と掛け算

\( p \)進数を定義する方法は色々ありますが、ひとまずここでは「左に無限桁の小数で表示される数」という\( p \)進数の性質そのものを\( p \)進数の定義だと思って下さい。ただし、各桁に現れる数は、\( 0,1, \ldots, p-1 \)のいずれかとします。つまり\( p=2 \)の場合は\( 0{} \)\( 1 \)のみ、\( p=3 \)の場合は\( 0{} \)\( 1 \)\( 2 \)のみが各桁に現れます。通常はこのような定義の仕方をしませんが、最初から通常の\( p \)進数の定義を採用するとその説明に環論や位相空間論と呼ばれる一般論を必要としてしまい、なかなか\( p \)進数を扱うことができません。なのではじめにの間だけはこの\( p \)進数の定義を採用し、後に\( p \)進数の概念を定義し直して、ここでの定義と等価であることを確認します。実数で例えると、実数という概念を定義する代わりに、「右に無限桁の小数で表示される数」という性質を実数の定義の代わりに使うという感じです。実数\( a \)と、\( a \)を位取り記法で右に無限桁の小数として表したものを同一視していることになるので、「数」と「数を表記したもの」を混同することになりやや厳密でない言い回しになってしまいますがご了承下さい。

ただし実数においては\( 0.9999999999 \cdots \)\( 1.0000000000 \cdots \)が同じ数を表すので1つの数に高々2通りの表記があることになり、このような同一視は少し危険です。しかし\( p \)進数ではそのようなことが起きず、左に無限桁の小数として表示する方法はただ1通りになりますので、あまり注意する必要がありません。ただし、1通りと言っても\( \cdots 00000000001 \)\( \cdots 00000000001.0 \)は同じ表記とみなしています。これは実数において、\( 00110.0000000000 \cdots \)の「一番左の桁であって小数点の左隣でないところに現れる\( 0{} \)」や「小数点の右側にある桁の連続した並びにずっと現れ続ける\( 0{} \)」は省略して\( 110.0000000000 \cdots \)\( 110 \)と書くことと同じです。\( p \)進数でも同様に、\( \cdots 0000000000110.00_{(p)} \)の「一番右の桁であって小数点の左隣でないところに現れる\( 0{} \)」や「小数点の左側にある桁の連続した並びにずっと現れ続ける\( 0{} \)」は省略して(可能ならば小数点も省略して)\( \cdots 000000000110_{(p)} \)\( 110_{(p)} \)のように書きます。これは単にあってもなくても意味のない\( 0{} \)を省いても良いというだけで、\( 1.0000000000 \cdots \)\( 0.9999999999 \cdots \)を同一視しなければならないこととは全く別の事情です。

以上を踏まえると、自然数は\( p \)進法表記することで\( p \)進数とみなすことができます。つまり、

\begin{eqnarray*} 0 & = & 0_{(p)} = \cdots 0000000000_{(p)} \\ \\ 1 & = & 1_{(p)} = \cdots 0000000001_{(p)} \\ \\ 2 & = & \left\{ \begin{array}{rcll} 10_{(2)} & = & \cdots 0000000010_{(2)} & {\rm (} p = 2 {\rm の場合)} \\ \\ 2_{(p)} & = & \cdots 0000000002_{(p)} & {\rm (} p > 2 {\rm の場合)} \end{array} \right. \end{eqnarray*}

のように自然数を\( p \)進数に対応させます。話の都合上、自然数\( n \)に対応する\( p \)進数をあえて区別して表記したい時には\( n^{(p)} \)と書くことにしましょう。つまり上の例をそのまま書くと、

\begin{eqnarray*} 0^{(p)} & = & \cdots 0000000000_{(p)} \\ \\ 1^{(p)} & = & \cdots 0000000001_{(p)} \\ \\ 2^{(p)} & = & \left\{ \begin{array}{ll} \cdots 0000000010_{(2)} & (p = 2 {\rm の場合}) \\ \\ \cdots 0000000002_{(p)} & (p > 2 {\rm の場合}) \end{array} \right. \end{eqnarray*}

ということです。要するに自然数\( n \)\( p \)進数\( n^{(p)} \)は同じ数を表すので右上の\( (p) \)は無視して下さって構いません。無視して良いものをわざわざ書く理由は、今後有理数が\( p \)進数とみなせることを説明するために、「有理数\( n \)に対応する\( p \)進数\( n^{(p)} \)を以下のように定義する」というような文章を書きたいからです。

自然数には足し算と掛け算という演算が定義されていましたが、\( p \)進数にも演算が定義されます。しかもただ定義されるだけでなく、自然数の演算を拡張するように\( p \)進数の演算が与えられます。即ち、いかなる自然数\( n \)\( m \)に対しても、等式

\begin{eqnarray*} \begin{array}{rcll} n^{(p)} + m^{(p)} & = & (n+m)^{(p)} & {\rm (} p {\rm 進数と思って足した値と、自然数と思って足した値が、同じ} p {\rm 進数になる)} \\ n^{(p)} \times m^{(p)} & = & (n \times m)^{(p)} & {\rm (} p {\rm 進数と思って掛けた値と、自然数と思って掛けた値が、同じ} p {\rm 進数になる)} \end{array} \end{eqnarray*}

が成立するように\( p \)進数の演算を定義することが出来ます。ではその具体的な方法を説明する前に、自然数の足し算の「計算の仕方」を思い出しましょう。

私達が自然数の足し算を計算する上では、\( (2 \times 5) \)進法にしろ\( p \)進法にしろ、「筆算」という方法が有効でした。筆算の良いところは、右の桁から順に計算することで、いくら左の桁に繰り上がりが生じても一度計算した右の桁は確定したままであるということです。最初の桁の足し算が終わったら、繰り上がりを考慮して次の桁の足し算を行い、更に繰り上がりを考慮して次の桁の足し算を繰り返していけば良く、計算の方向は左にのみ進みます。

下図は\( 3 \)進法における\( 121_{(3)} + 22_{(3)} \)の筆算*1です。

\begin{eqnarray*} \begin{array}{cccc} & 1 & 2 & \textcolor{blue}{1}_{(3)} \\ + & & 2 & \textcolor{blue}{2}_{(3)} \\ \hline & & {}^{\textcolor{blue}{1}} & \textcolor{blue}{0}_{(3)} \end{array} \hspace{0.1in} \to \hspace{0.1in} \begin{array}{cccc} & 1 & \textcolor{blue}{2} & 1_{(3)} \\ + & & \textcolor{blue}{2} & 2_{(3)} \\ \hline & {}^{\textcolor{blue}{1}} & \textcolor{blue}{2} & 0_{(3)} \end{array} \hspace{0.1in} \to \hspace{0.1in} \begin{array}{cccc} & \textcolor{blue}{1} & 2 & 1_{(3)} \\ + & & 2 & 2_{(3)} \\ \hline & \textcolor{blue}{2} & 2 & 0_{(3)} \end{array} \end{eqnarray*}

確かに、右の桁から順に計算され、一度計算された桁は確定して変更されないことが分かると思います。

この筆算を用いて\( p \)進数の足し算を定義します。つまり\( p \)進数の足し算とは、一番右の桁から順に足し合わせ、繰り上がりを考慮しながら左の桁に進んでいくことを繰り返して計算される演算とします。

下図は\( 5 \)進数における\( (\cdots 1111111111.11_{(5)}) + (\cdots 4242424242.42_{(5)}) \)の筆算*2です。

\begin{eqnarray*} & & \begin{array}{cccc} & \cdots & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1. & 1 & \textcolor{blue}{1}_{(5)} \\ + & \cdots & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2. & 4 & \textcolor{blue}{2}_{(5)} \\ \hline & & & & & & & & & & & & & \textcolor{blue}{3}_{(5)} \end{array} \hspace{0.1in} \to \hspace{0.1in} \begin{array}{cccc} & \cdots & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1. & \textcolor{blue}{1} & 1_{(5)} \\ + & \cdots & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2. & \textcolor{blue}{4} & 2_{(5)} \\ \hline & & & & & & & & & & & {}^{\textcolor{blue}{1}}& \textcolor{blue}{0} & 3_{(5)} \end{array} \\ \\ & \to & \begin{array}{cccc} & \cdots & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & \textcolor{blue}{1}. & 1 & 1_{(5)} \\ + & \cdots & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2 & 4 & \textcolor{blue}{2}. & 4 & 2_{(5)} \\ \hline & & & & & & & & & & & \textcolor{blue}{4}. & 0 & 3_{(5)} \end{array} \hspace{0.1in} \to \hspace{0.1in} \begin{array}{cccc} & \cdots & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1. & \textcolor{blue}{1} & 1_{(5)} \\ + & \cdots & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2 & \textcolor{blue}{4} & 2. & 4 & 2_{(5)} \\ \hline & & & & & & & & & {}^{\textcolor{blue}{1}}& \textcolor{blue}{0} & 4. & 0 & 3_{(5)} \end{array} \\ \\ & \to & \begin{array}{cccc} & \cdots & 1 & 1 & 1 & 1 & 1 & 1 & 1 & \textcolor{blue}{1} & 1 & 1. & 1 & 1_{(5)} \\ + & \cdots & 4 & 2 & 4 & 2 & 4 & 2 & 4 & \textcolor{blue}{2} & 4 & 2. & 4 & 2_{(5)} \\ \hline & & & & & & & & & \textcolor{blue}{4} & 0 & 4. & 0 & 3_{(5)} \end{array} \hspace{0.1in} \to \hspace{0.1in} \begin{array}{cccc} & \cdots & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1. & \textcolor{blue}{1} & 1_{(5)} \\ + & \cdots & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2 & \textcolor{blue}{4} & 2. & 4 & 2_{(5)} \\ \hline & & & & & & & {}^{\textcolor{blue}{1}}& \textcolor{blue}{0} & 4 & 0 & 4. & 0 & 3_{(5)} \end{array} \\ & \vdots & \\ \\ & \to & \begin{array}{cccc} & \cdots & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1. & 1 & 1_{(5)} \\ + & \cdots & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2 & 4 & 2. & 4 & 2_{(5)} \\ \hline & \cdots & 0 & 4 & 0 & 4 & 0 & 4 & 0 & 4 & 0 & 4. & 0 & 3_{(5)} \end{array} \end{eqnarray*}

右の桁から確定していくおかげで、このように無限桁でも筆算が意味を持ち、足し算が定義されます。すると、定義の仕方から自動的に、\( p \)進数の足し算は自然数の足し算の拡張になっていることが分かります。

自然数の掛け算も同様に筆算で計算でき、右の桁から順に確定していくので、\( p \)進数の掛け算もまた筆算で定義することが出来ます。やはり定義の仕方から自動的に、\( p \)進数の掛け算は自然数の掛け算の拡張になっていることが分かります。

このような「筆算を直接用いた演算の拡張」が可能である背景には、\( p \)進数が「左に無限桁の小数で表示される数」であることが重要になります。それに対して「右に無限桁の小数で表示される数」である実数には、このような筆算による演算の計算が難しいということが分かります。何故なら筆算は「右から左に計算していく方法」ですので、右に無限桁まで伸びてしまっている実数の足し算や掛け算をそのまま筆算で計算することが出来ないからです。例えば小数部分を途中までで切って近似計算をしてから極限を取ったりなど一工夫をすることは出来ますが、そのような方法では一度計算された各桁の値が更新され続け、なかなか確定しないという困難が生じてしまいます。

以上で\( p \)進数の足し算と掛け算の導入を終わります。次に、有理数と\( p \)進数の関係について考えてみましょう。




*1 &mathjax{(2×5)};進法に翻訳すると&mathjax{16 + 8 = 24};という計算を行っています。
*2 実はこれは有理数の足し算になっています。これらがどのような有理数に対応するかについては、[[章末問題0/演習12>章末問題0#twelve]]で扱います。