![]() |
数字ないし決まった文字数の数字列の置かれた位置を
一つの桁を N 種の数字列の組み合わせで表す位取り記数法を
位取り記数法は古代中国に由来する。中国では紀元前14世紀の商時代にすでに十進法が用いられており、紀元前4世紀にはゼロを空位として記述する位取り記数法を用いていた。対してヨーロッパにおける最古の十進法が記述された文書は976年のスペインの手稿本である[3]。
本項では N が 2 以上の整数の場合を扱う。それ以外の場合については広義の記数法の記事を参照のこと。また後述するp 進数の概念とは(関連があるものの)別概念であるので注意が必要である。
記法
2 以上の整数 N を底(基数)とする位取り記数法(N 進法)において、それぞれの位の値は 0 から N − 1 までの N 個の非負の整数に対応した数字で表される(例:1234567890、一二三四五六七八九〇)[4][5]。 非負の数は位取り記数法によって、以下のように表される[5]:
ここで dk ∈ {0, ... , N − 1} は位の値[6]を表し、添字 k はここでは Nk[注 4]の位の冪指数を表す。添字 k が 0 以上の位の値の並びは整数を表し整数部(英: integer part)と呼ばれる。添字 k が −1 以下の位の値の並びは小数部(英: fractional part)と呼ばれる。整数部と小数部は小数点[注 5](英: radix point)によって区切られる(例:123.456)。もし位取り記数法で表される数が整数ならば、小数点は書かなくともよい(例:123)。m は整数部の桁数を表す。小数部について、k = −1, −2 , ... の位はそれぞれ順に小数第一位、第二位、……と呼ばれる[7]。
また負の数は負符号(−)を数字列の前方につけて表す[8][9](例:−123.456、−123):
位取り記数法による数の表示は、底の冪 Nk とその位の値 dk の積の和の略記と見なせる:
ここで右辺の和の記号は以下を表す:
例えば、十進法における 123.45 は、
と展開できる。
小数部の位の値は有限個の場合もあれば、そうでない場合もある。N 進法で循環小数となるような有理数や、無理数は有限の桁数では表せないため、末尾に省略記号(…)を付けて有限桁でないことを示す(例:円周率 π の十進展開 π = 3.14159...)。
循環小数について、以下のように、循環節(英: repetend)を上線などによって示す記法も用いられる(以下では上線を用いる)[10]:
ここで λ は循環節の長さを表し、r は循環節が始まる位を示す。例えば十進法において 1/14 は 0.0714285 と表される。
底の明示
慣習的に、特に断りのない限り、位取り記数法で示された数は十進数と解釈される。異なる底を用いていることを示すため、以下のように底を併記することがある:
または底を括弧で囲わず、
あるいは数を括弧書きして、
上記の記法において、底の数自体は十進法で表記される。例えば、10(2) は二進数であり、十進数 2 に等しい数を表す。また 100(16) 十六進数であり、十進数 256 に等しい数を表す。
その他の記法として、コンピュータ・プログラミングにおいて、プログラミング言語によっては、定まった数を表す構文(リテラル)が用意されている。例えばC言語やC++において、123
は十進法、0x012abc
および 0X345DEF
は十六進法、0b0101
および 0B1010
は二進法、0123
は八進法の定数をそれぞれ表し、底の区別は先頭の記号によってなされる(0
以外の数字で始まるなら十進数、0x
または 0X
で始まるなら十六進数、0b
または 0B
で始まるなら二進数、それ以外は八進数と解釈される[注 6])[11][12]。JavaScriptなどでは八進数についてより厳格に、0o
または 0O
で始まる文法を採用している[13]。より柔軟な記法として、2から36までの底について[注 7]、Smalltalkでは base "r" value
(例:16rFFEF
)[14]、Erlangでは base "#" value
(例:16#ffef
)[15]という構文を採用している。base
は底を表す十進整数であり、value
はその進数法での数値を表す英数字の列である。
適用例
十進法
- 数列
十進法は最も身近な位取り記数法である。十進法では、十個の数字を用い、一桁にひとつの数字を容れて必要な桁数分を並べて数値を表す。
アラビア数字なら
0、1、2、3、4、5、6、7、8、9
の十個であり、 漢数字なら
〇、一、二、三、四、五、六、七、八、九
の十個である。以下、アラビア数字を例に説明するが、漢数字の場合も同様である。
十進法ではこれらの数字を列べる事で数を表現する。 例えば、312.02は、
を表す。
Nが十未満
例えば五進法をアラビア数字で表した場合、使う数字は
0、1、2、3、4
の五種類の記号であり、五進法における431.02は、
を表し、これは十進法の116.08にあたる。
注意すべき点は、同じ「431.02」でも五進法のものと十進法のものでは値が異なる。このため、位取り記数法の話をするときには、常に何進法の話であるのかを明示する必要がある。(後述)
Nが十を超過
十二進法、十六進法、二十進法のように、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は
を表し、これは十進法の755.652344にあたる。
可除性
有理数を小数で表す際、有限小数になる場合と循環小数になる場合がある。本節では底 N の位取り記数法で有理数が有限小数として表される(分子が分母で「割り切れる」)条件について述べる。
一般に、既約分数 x/y が底 N の位取り記数法において有限小数として表されるには、分母 y が底 N が持つ素因数 の積 (ただし k は 0 以上の整数)になっていなければならない(さもなくば N の冪を掛けて整数にならない)[16][17]。この条件は分子によらないため、有限小数で表せるかは単位分数で表される有理数に限って調べればよい。
例えば十進法では 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 を、記号を数字として用いた N 進表記
で表すには、以下のアルゴリズムを用いればよい。
なお、このアルゴリズムは、 M ≠ NによりM 進表記されている T を N 進表記に書き換えるときに使われる事が多いので、このアルゴリズムを底の変換アルゴリズムと呼ぶ。
- 入力T を受け取る。
- T=0 なら を出力して停止。
- iを0に初期化
- while(T≠0){
- T を N で割った商を T' 、余りを k とし、 とする。
- T ←T'、i←i+1
- }
- r←i-1
- を出力
なお、T >0に対しては等式
が知られている(なお、添え字を0から始めているので、T の桁数はr +1) 。ここでは床関数である。
底の変換例
- 十進法→五進法への変換
十進法の 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 が成り立っているので、対数を取ると
となり、
が分かる。
- 十進法以外→十進法以外への変換
十進法以外の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
- 二十四:tetravicenary, 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でもそれぞれ「二進数」、「二進法」を表す名詞となる。他の底も同様。
p進数
N 進表記と関連が深い概念として、素数 p 毎に定まる p 進数というものもある。 名称は本稿で解説しているN 進表記の別名であるN 進数と同一であるものの、別概念ではある。ただし両者は非常に関連があり、整数の p進表記を(可算)無限桁の自然数の範囲に拡張したものが p進整数で、さらにそこに有限桁の小数部分を許したものが p進数である。ただし「無限桁の整数」(の一部は有理数として再解釈できるもののほとんど)は本稿で扱う普通の数(実数)とは異なる。
注釈
- より正確には続く数字列が十進数、十六進数、二進数、八進数として正しくなければならない。十進数には 0 から 9 までの数字、十六進数には加えて A (a) から F (f) までの6つの数字が使用できるが、二進数には 0 と 1 のみ、八進数には 0 から 7 までの数字のみが使用できる。