位取り記数法

位取り記数法（くらいどりきすうほう、（英: positional notation）とは、いくつかの数字を並べて数を表す方法である（例：123、3.14、3;8,24）。 数字ないし決まった文字数の数字列の置かれた位置を位（くらい）または桁（けた）と呼び、数字の位を決めることを位取りという。 一つの桁を N 種の数字列の組み合わせで表す位取り記数法をN 進位取り記数法（エヌしんくらいどりきすうほう）あるいは単に N 進法（エヌしんほう）と呼ぶ。また、数 N を基数（きすう、（英: radix）ないし底（てい、（英: base）と呼ぶ。 例えば、一般的に用いられる 0 から 9 までのアラビア数字による記数法は十進法にあたる。十進法でない例として、時刻や角度を表す単位の分や秒は六十進法が使われている。またコンピュータの分野においては数値表現に二進法とその派生である八進法や十六進法がしばしば用いられる。 位取り記数法は古代中国に由来する。中国では紀元前14世紀の商時代にすでに十進法が用いられており、紀元前4世紀にはゼロを空位として記述する位取り記数法を用いていた。対してヨーロッパにおける最古の十進法が記述された文書は976年のスペインの手稿本である。 本項では N が 2 以上の整数の場合を扱う。それ以外の場合については広義の記数法の記事を参照のこと。また後述するp 進数の概念とは（関連があるものの）別概念であるので注意が必要である。 2 以上の整数 N を底（基数）とする位取り記数法（N 進法）において、それぞれの位の値は 0 から N − 1 までの N 個の非負の整数に対応した数字で表される（例：1234567890、一二三四五六七八九〇）。 非負の数は位取り記数法によって、以下のように表される： d m − 1 ⋯ d 1 d 0 ⏟ integer part . ⏟ radix point d − 1 d − 2 ⋯ ⏟ fractional part . {\displaystyle \underbrace {d_{m-1}\cdots d_{1}d_{0}} _{\text{integer part}}\underbrace {.} _{\text{radix point}}\underbrace {d_{-1}d_{-2}\cdots } _{\text{fractional part}}\,.} ここで dk ∈ {0, ... , N − 1} は位の値を表し、添字 k はここでは Nkの位の冪指数を表す。添字 k が 0 以上の位の値の並びは整数を表し整数部（英: integer part）と呼ばれる。添字 k が −1 以下の位の値の並びは小数部（英: fractional part）と呼ばれる。整数部と小数部は小数点（英: radix point）によって区切られる（例：123.456）。もし位取り記数法で表される数が整数ならば、小数点は書かなくともよい（例：123）。m は整数部の桁数を表す。小数部について、k = −1, −2 , ... の位はそれぞれ順に小数第一位、第二位、……と呼ばれる。 また負の数は負符号（−）を数字列の前方につけて表す（例：−123.456、−123）： − d m − 1 ⋯ d 1 d 0 . d − 1 d − 2 ⋯ . {\displaystyle -d_{m-1}\cdots d_{1}d_{0}.d_{-1}d_{-2}\cdots \,.} 位取り記数法による数の表示は、底の冪 Nk とその位の値 dk の積の和の略記と見なせる： d m − 1 ⋯ d 1 d 0 . d − 1 d − 2 ⋯ = ∑ k m − 1 d k N k . {\displaystyle d_{m-1}\cdots d_{1}d_{0}.d_{-1}d_{-2}\cdots =\sum _{k}^{m-1}d_{k}N^{k}\,.} ここで右辺の和の記号は以下を表す： ∑ k m − 1 d k N k = d m − 1 N m − 1 + ⋯ + d 1 N + d 0 + d − 1 N − 1 + ⋯ . {\displaystyle \sum _{k}^{m-1}d_{k}N^{k}=d_{m-1}N^{m-1}+\dotsm +d_{1}N+d_{0}+d_{-1}N^{-1}+\dotsm {}\,.} 例えば、十進法における 123.45 は、 123.45 = 1 ⋅ 10 2 + 2 ⋅ 10 1 + 3 ⋅ 10 0 + 4 ⋅ 10 − 1 + 5 ⋅ 10 − 2 = 100 + 20 + 3 + 4 10 + 5 100 {\displaystyle {\begin{aligned}123.45&=1\cdot {10}^{2}+2\cdot {10}^{1}+3\cdot {10}^{0}+4\cdot {10}^{-1}+5\cdot {10}^{-2}\\&=100+20+3+{\frac {4}{10}}+{\frac {5}{100}}\end{aligned}}} と展開できる。 小数部の位の値は有限個の場合もあれば、そうでない場合もある。N 進法で循環小数となるような有理数や、無理数は有限の桁数では表せないため、末尾に省略記号（…）を付けて有限桁でないことを示す（例：円周率 π の十進展開 π = 3.14159...）。 循環小数について、以下のように、循環節（英: repetend）を上線などによって示す記法も用いられる（以下では上線を用いる）： d m − 1 ⋯ d 1 d 0 . d − 1 d − 2 ⋯ d − r ⋯ d − ( r + λ − 1 ) ¯ ⏟ repetend {\displaystyle d_{m-1}\cdots d_{1}d_{0}.d_{-1}d_{-2}\cdots \underbrace {\overline {d_{-r}\cdots d_{-(r+\lambda -1)}}} _{\text{repetend}}} ここで λ は循環節の長さを表し、r は循環節が始まる位を示す。例えば十進法において 1/14 は 0.0714285 と表される。 慣習的に、特に断りのない限り、位取り記数法で示された数は十進数と解釈される。異なる底を用いていることを示すため、以下のように底を併記することがある： d m − 1 ⋯ d 1 d 0 . d − 1 d − 2 ⋯ d − ℓ ( N ) , {\displaystyle {d_{m-1}\cdots d_{1}d_{0}.d_{-1}d_{-2}\cdots d_{-\ell }\,}_{(N)}\,,} または底を括弧で囲わず、 d m − 1 ⋯ d 1 d 0 . d − 1 d − 2 ⋯ d − ℓ N , {\displaystyle {d_{m-1}\cdots d_{1}d_{0}.d_{-1}d_{-2}\cdots d_{-\ell }\,}_{N}\,,} あるいは数を括弧書きして、 ( d m − 1 ⋯ d 1 d 0 . d − 1 d − 2 ⋯ d − ℓ ) N . {\displaystyle \left(d_{m-1}\cdots d_{1}d_{0}.d_{-1}d_{-2}\cdots d_{-\ell }\right)_{N}\,.} 上記の記法において、底の数自体は十進法で表記される。例えば、10(2) は二進数であり、十進数 2 に等しい数を表す。また 100(16) 十六進数であり、十進数 256 に等しい数を表す。 その他の記法として、コンピュータ・プログラミングにおいて、プログラミング言語によっては、定まった数を表す構文（リテラル）が用意されている。例えばC言語やC++において、123 は十進法、0x012abc および 0X345DEF は十六進法、0b0101 および 0B1010 は二進法、0123 は八進法の定数をそれぞれ表し、底の区別は先頭の記号によってなされる（0 以外の数字で始まるなら十進数、0x または 0X で始まるなら十六進数、0b または 0B で始まるなら二進数、それ以外は八進数と解釈される）。JavaScriptなどでは八進数についてより厳格に、0o または 0O で始まる文法を採用している。より柔軟な記法として、2から36までの底について、Smalltalkでは base "r" value（例：16rFFEF）、Erlangでは base "#" value（例：16#ffef）という構文を採用している。base は底を表す十進整数であり、value はその進数法での数値を表す英数字の列である。 数列 十進法は最も身近な位取り記数法である。十進法では、十個の数字を用い、一桁にひとつの数字を容れて必要な桁数分を並べて数値を表す。 アラビア数字なら 0、1、2、3、4、5、6、7、8、9 の十個であり、 漢数字なら 〇、一、二、三、四、五、六、七、八、九 の十個である。以下、アラビア数字を例に説明するが、漢数字の場合も同様である。 十進法ではこれらの数字を列べる事で数を表現する。 例えば、312.02は、 3 × 10 2 + 1 × 10 1 + 2 × 10 0 + 0 × 1 10 1 + 2 × 1 10 2 {\displaystyle 3\times 10^{2}+1\times 10^{1}+2\times 10^{0}+0\times {\frac {1}{10^{1}}}+2\times {\frac {1}{10^{2}}}} を表す。 例えば五進法をアラビア数字で表した場合、使う数字は 0、1、2、3、4 の五種類の記号であり、五進法における431.02は、 4 × 5 2 + 3 × 5 1 + 1 × 5 0 + 0 × 1 5 1 + 2 × 1 5 2 {\displaystyle 4\times 5^{2}+3\times 5^{1}+1\times 5^{0}+0\times {\frac {1}{5^{1}}}+2\times {\frac {1}{5^{2}}}} を表し、これは十進法の116.08にあたる。 注意すべき点は、同じ「431.02」でも五進法のものと十進法のものでは値が異なる。このため、位取り記数法の話をするときには、常に何進法の話であるのかを明示する必要がある。（後述） 十二進法、十六進法、二十進法のように、N が十より大きい場合は用いる数字は、アラビア数字だけでは足りなくなる。そこで、十以上の数を表記する「数字」として、ラテン文字のアルファベットの大文字を用いる事が多い。 例えば十六進法であれば、「数字」として 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F を用い、A、B、C、D、E、Fはそれぞれ十進法の自然数10、11、12、13、14、15に対応する。 従って例えば2F3.A7は 2 × 16 2 + 15 × 16 1 + 3 + 10 × 1 16 1 + 7 × 1 16 2 {\displaystyle 2\times 16^{2}+15\times 16^{1}+3+10\times {\frac {1}{16^{1}}}+7\times {\frac {1}{16^{2}}}} を表し、これは十進法の755.652344にあたる。 有理数を小数で表す際、有限小数になる場合と循環小数になる場合がある。本節では底 N の位取り記数法で有理数が有限小数として表される（分子が分母で「割り切れる」）条件について述べる。 一般に、既約分数 x/y が底 N の位取り記数法において有限小数として表されるには、分母 y が底 N が持つ素因数 p 1 , … , p m {\displaystyle p_{1},\,\dots ,\,p_{m}} の積 y = p 1 k 1 ⋯ p m k m {\displaystyle y=p_{1}^{k_{1}}{}\dotsb {}p_{m}^{k_{m}}} （ただし k は 0 以上の整数）になっていなければならない（さもなくば N の冪を掛けて整数にならない）。この条件は分子によらないため、有限小数で表せるかは単位分数で表される有理数に限って調べればよい。 例えば十進法では N = 10 = 2⋅5 のため、ある有理数を既約分数で表した際、分母が 2 と 5 以外に素因数を持たない場合には有限小数となり、それ以外は循環小数となる。 N 進有限小数が M 進有限小数でもあるには、その有限小数を既約分数で現した際の分母が2つの底 N, M の冪のいずれの約数にもなる必要がある。特に、すべての N 進有限小数が M 進有限小数であるには M の素因数がすべて N の素因数に含まれていなければならない。 この節では特に断りがない限り十進数について述べるが、他の底についても同様である。 実数の N 進表記は一意ではない。 よく知られているように、 1=1.000…=0.999… である。また、以下のように、上位桁に不要な0を付け加えることもできる。 0013=13 通常は「0013」のような表記は許さないとする事が多いが、コンピューターなどでは、最大で4桁の整数値であることを示すため、あえて「0013」のような表記をする場合がある。 以上のような例を除くと0以外の実数は一意に表現できる。 しかし、0のみは 「+0」、「-0」 の二通りの表記が可能である(いわゆる負のゼロの問題)。これが原因で、コンピューター・プログラムでは0のみ例外処理を求められる場合がある。 また、一般には0は1桁の数とされているが、ルールを優先し1桁の数と認めない場合もある（覆面算#ルール）。 表計算ソフトの列名などで用いられている、A, B, ..., Z, AA, AB, ... のような形式は、位取り記数法の一種と考えることができ、かつ0より大きい整数を一意に表せる。(en:Bijective numeration) 与えられた非負整数 T を、記号 c 0 , … , c N − 1 {\displaystyle {\mathfrak {c}}_{0},\ldots ,{\mathfrak {c}}_{N-1}} を数字として用いた N 進表記 a r ⋯ a 0 {\displaystyle a_{r}\cdots a_{0}} で表すには、以下のアルゴリズムを用いればよい。 なお、このアルゴリズムは、 M ≠ NによりM 進表記されている T を N 進表記に書き換えるときに使われる事が多いので、このアルゴリズムを底の変換アルゴリズムと呼ぶ。 入力T を受け取る。 T=0 なら c 0 {\displaystyle {\mathfrak {c}}_{0}} を出力して停止。 iを0に初期化 while(T≠0){ T を N で割った商を T' 、余りを k とし、 a i ← c k {\displaystyle a_{i}\gets {\mathfrak {c}}_{k}} とする。 T ←T'、i←i+1 } r←i-1 a r ⋯ a 0 {\displaystyle a_{r}\cdots a_{0}} を出力 なお、T >0に対しては等式 r = ⌊ log N ⁡ T ⌋ {\displaystyle r=\left\lfloor \log _{N}T\right\rfloor } が知られている(なお、添え字を0から始めているので、T の桁数はr +1) 。ここで ⌊ x ⌋ {\displaystyle \left\lfloor x\right\rfloor } は床関数である。 十進法→五進法への変換 十進法の 5213 を五進法に置き換える場合、5で割っていき、商が5未満になった時点で止める。余り無しの場合は 0 を明記する。商が5未満になったら、最後の商を先頭にして、最初の余りを末尾にして列べる。 5213 ÷ 5 = 1042 余り 3 1042 ÷ 5 = 208 余り 2 208 ÷ 5 = 41 余り 3 41 ÷ 5 = 8 余り 1 8 ÷ 5 = 1 余り 3 1 ÷ 5 = 0 余り 1 から、5213 = 3 + 2 × 5 + 3 × 52 + 1 × 53 + 3 × 54 + 1 × 55 となるので、五進表記では 131323 と表すことができる。また、55 = 3125, 56 = 15625 であるから、55 ≤ 5213 < 56 が成り立っているので、対数を取ると 5 ≤ log 5 ⁡ 5213 < 6 {\displaystyle 5\leq \log _{5}5213<6} となり、 r = ⌊ log 5 ⁡ 5213 ⌋ = 5 {\displaystyle r=\left\lfloor \log _{5}5213\right\rfloor =5} が分かる。 十進法以外→十進法以外への変換 十進法以外のN進法も同様で、例えば38に当たる六進法の 50213 を十六進法に置き換える場合も、商が24(6) = 10(G) を下回るまで24で割っていく。 50213 ÷ 24 = 1522 余り 1 1522 ÷ 24 = 41 余り 14 42 ÷ 24 = 1 余り 13 以上より、1, 13, 14, 1の列になり、13(6) = 9(G)、14(6) = A(G) なので、十六進法では 19A1 となる。 同値の小数への変換 小数を別のN進法に変換する場合には、以下の経過を践む。 変換前と変換後の冪数を列挙する。 小数点以下の元の桁数に合わせて、冪数を掛ける。 端数処理をする。 整数と同じく、冪数を掛けた結果を、変換後のNで割っていく。 変換後のNで割った結果を最後の商→最初の余りの順に列挙する。この列が同値の小数となる。 （例）十進数0.531441 → 十二進数六桁 十進数 1000000 → 2985984（十の六乗→十二の六乗） 531441×2.985984 = 1586874.322944 1586874.322944 → 1586874 1586874÷12 = 132239 余り6 132239÷12 = 11019 余り11 11019÷12 = 918 余り3 918÷12 = 76 余り6 76÷12 = 6 余り4 11(A) = B(C) なので、6463B6(C) を列べる。 以上より、十進数0.531441 は、十二進数では約0.6463B6 となる。 （例）十進数0.124053 → 六進数九桁 十進数 1000000 → 10077696（十の六乗→六の九乗） 124053×10.077696 = 1250168.42189 変換前の小数が六桁なので、乗数も小数点以下を六桁にする。 1250168.42189 → 1250168 1250168÷6 = 208361 余り2 208361÷6 = 34726 余り5 34726÷6 = 5787 余り4 5787÷6 = 964 余り3 964÷6 = 160 余り4 160÷6 = 26 余り4 26÷6 = 4 余り2 42443452(6)を列べる。分母が 10077696(A) = 1000000000(6) なので、小数点以下は9桁になり、先頭に0が1つ加わる。 よって、十進数0.124053 は、六進数では約0.042443452 となる。 十進法では、機械的に十倍、百倍、千倍、一万倍…の順で増える。同じく、十二進法では、機械的に十二倍、百四十四倍、千七百二十八倍、二万七百三十六倍…の順で増える。 しかし、底を2つに分ける場合がある。十進法に対して、二・五進法（十が五進命数法で「二五」なので、区別するため二と五の間に点が必要）では二と五の2つの底があるので、桁が上がる度に五倍→二倍→五倍→二倍…と交互になり、「十の冪数」と「十の冪数の五倍」が交互に現れる。これはそろばんと同じく一桁が「一の位」4つと「五の位」1つで構成される方法だが、計算機にも応用されている。 時間： 秒、六十進法、分、六十進法、時、二十四進法、日、七進法、週 秒、六十進法、分、六十進法、時、二十四進法、日、三十進法、月、十二進法、年、十進法、十年紀、十進法、世紀、十進法、千年紀 バビロニアの六十進法もそろばんに似た方法で、一桁が「一の位」9つと「十の位」5つで構成されており、整数は十倍→六倍→十倍→六倍と交互になり、小数は六分の一→十分の一→六分の一→十分の一と交互になる。この方法では、整数第二位は「六十の位」と「六百の位」に分かれ、整数第三位は「三千六百の位」と「三万六千の位」に分かれ、小数第一位は「六分の一の位」と「六十分の一の位」に分かれ、小数第二位は「三百六十分の一の位」と「三千六百分の一の位」に分かれている。 階乗進法 これら二・五進法や六十進法のように複数の底が設定されている場合には、" : " などの区切り符号を付ける。例えば、六十進法で十進法を補助とする場合には、58 → 59 → 1:00 → 1:01 → 1:02 …の順に数列が進む。 日本の通貨（硬貨と紙幣）には、昇順で一円→五円→十円→五十円→百円→五百円→千円→五千円→一万円があるので、通貨を一つの単位と見れば、これは前述の二・五進法である。この配列を見ると、一（100）、十（101）、百（102）、千（103）、一万（104）が十の冪数であり、五、五十、五百、五千が「十の冪数の五倍」である。 「底 N 」を英語で、base N という。特定のNに関しては倍数接頭辞を基に名称がついているが、名称の付け方は不規則である。通常、接尾辞が -ary である語は、ラテン語の -arius (～の、～に関する) に由来して、「N 個一組」「N を単位とする」「N 個から成る」を意味する語である。一方、接尾辞が -imal である語は、ラテン語の -imus に由来して、「第 N」「N 分の一」を意味する語である。 以下は「底 N 」、もしくはより明解に「N 個一組」「N を単位とする」「N 個から成る」という意味の形容詞である。 二：binary 三：ternary 四：quaternary 五：quinary 六：senary 七：septenary 八：octonary, octal 九：nonary 十：denary, decimal 十二：duodenary, duodecimal 十五：quindenary, quindecimal, pentadecimal 十六：sedenary, sedecimal, hexadecimal 十八：octodenary, octodecimal 二十：vicenary, vigesimal 二十四：tetravicenray, tetravigesimal 三十：tricenary, trigesimal 三十二：duoreicenary, duoreigesimal 三十六：hexatrecenary, hexatrigesimal 六十：sexagenary, sexagesimal これらを使い、a base-two numberで「二進数」、the base-two numeral systemで「二進法」を表す名詞となる。 同様にa binary number、the binary numeral systemでもそれぞれ「二進数」、「二進法」を表す名詞となる。他の底も同様。 N 進表記と関連が深い概念として、素数 p 毎に定まる p 進数というものもある。 名称は本稿で解説しているN 進表記の別名であるN 進数と同一であるものの、別概念ではある。ただし両者は非常に関連があり、整数の p進表記を（可算）無限桁の自然数の範囲に拡張したものが p進整数で、さらにそこに有限桁の小数部分を許したものが p進数である。ただし「無限桁の整数」（の一部は有理数として再解釈できるもののほとんど）は本稿で扱う普通の数（実数）とは異なる。