【解説】QuizKnock「未知の言語」の記数法

河村さんの見事すぎる仕事をトコトン味わい尽くしたい人のために.
\(\displaystyle M(x) = \sum\limits_{n}^\mathrm{desc} K(n) = \sum\limits_{n}^\mathrm{desc} \Bigl( T(n) + R(n) + A(n) \Bigr)\)
「未知の言語」とは?
「未知の言語」は2020年3月16日に QuizKnock が出した動画に登場した架空の言語.この言語には公式の名前は付けられてないんだけど,動画内でそう呼ばれているので,便宜上「未知の言語」がそのままこの言語の名前だということにしましょう.この「未知の言語」は7進法で数を数える.動画内に登場する数字は下記の6個で,これらの数の記数法を解説しちゃおうと思います!
10進表記 \(x\) | 未知の言語 \(M(x)\) | 7進表記 |
---|---|---|
12 | raf-a-rafskdhea | 15(7) |
17 | rafdhea-a-ija | 23(7) |
35 | raf-rafskdhea | 50(7) |
50 | bxogg-a-xzea | 101(7) |
36 | raf-rafskdhea-a-xzea | 51(7) |
88 | bxogg-a-raf-rafskdhea-a-rafskija | 154(7) |
0. 構造
さて,改めてこの記事の目的を説明すると,任意の数 \(x\) に対し,未知の言語における数 \(x\) の表記 \(M(x)\) を求めることです.そしてそれは冒頭に書いたように,最終的には \(\displaystyle M(x) = \sum\limits_{n}^\mathrm{desc} K(n)\) のような形で書けます.
未知の言語は7進数に基づいた記数法を採用している.最初から全部を未知の言語の言葉で書くと,xzea
とか raf
とかの独自の数字が登場して読みづらい.まずは見慣れた算用数字で,未知の言語の記数法の概略を見ていこう.算用数字で書くと,未知の言語の数字はこんな感じに書ける.
10進数 \(x\) | 7進数 \(x\) | 未知の言語風の書き方 | \(M(x)\) |
---|---|---|---|
1 | 1(7) | 1 | zxea |
13 | 16(7) | 71 + 6 | raf-a-rafskzxea |
14 | 20(7) | 71 * 2 | raf-dhea |
34 | 46(7) | 71 * 4 + 6 | raf-rafskija-a-rafskzxea |
35 | 50(7) | 71 * 5 | raf-rafskdhea |
36 | 51(7) | 71 * 5 + 1 | raf-rafskdhea-a-zxea |
掛け算がハイフン -
で書かれ,足し算が -a-
という記号で書かれてることが読み取れたかな?もしかすると上の表は端的じゃないかもしれないので,より一般的に書き直すとこうなる.
\(\displaystyle M(x) = \sum\limits_{n}^\mathrm{desc} K(n) = \sum\limits_{n}^\mathrm{desc} \Bigl( T(n) + R(n) + A(n) \Bigr)\)
上記の読み方は:
- \(M(x)\) は,数 \(x\) を未知の言語の表記法で書いた文字列
- \(K(n)\) などはこれから定義する
- \(\displaystyle \sum\limits_{n}^\mathrm{desc}\) は,降順の総和
- 和は,文字列を結合する操作.
- 文字列の結合なので,足し算っぽく書いてるけど非可換
1. 桁字 \(K(n)\)
未知の言語において,数 \(M(x)\) は「桁字 (けたじ)」の羅列 \(\displaystyle \sum\limits_{n}^\mathrm{desc} K(n)\) で書かれる.桁字 \(K(n)\) とは,ある数を7進法で表記したときの \(7^n\) の桁にあたる文字.
具体例を挙げていこう.下に書いたものは,36 と 88 を「未知の言語での表記 \(M\)」「桁字」の順に書いたも.注意深く観察すると分かりますが,どちらの例も,桁字は未知の言語の文字列を分解しただけ.なので反対に,桁字を並べて書けば,未知の言語の記数法と一致するということだね.
未知の言語 \(M\) | \(K(2)\) | \(K(1)\) | \(K(0)\) |
---|---|---|---|
raf-rafskdhea-a-xzea | raf-rafskdhea | -a-xzea | |
bxogg-a-raf-rafskdhea-a-rafskija | bxogg | -a-raf-rafskdhea | -a-rafskija |

桁字は,さらに3つの部分から構成される.「接字 \(T(n)\)」「位字 \(R(n)\)」「値字 \(A(n)\)」の3つの部分.文字列の結合を +
で書くことにすれば,桁字は \(K(n) = T(n) + R(n) + A(n)\) という単純な構造だ.
2.1. 接字 \(T(n)\)
「接字 (つぎじ) \(T(n)\)」は,桁字と桁字を接続する部分.接字 \(T(n)\) の定義は次の通り.自分より上位の桁が存在すれば -a-
という文字列を,自分が最上位の桁のときは空文字列を出力する,という意味.
\(\displaystyle
T(n) =
\begin{cases}
\texttt{“-a-“} & \text{if $v(n) \neq 0$ かつ $x/7^{n+1} \geq 1$,}\\
\texttt{“”} & \text{if それ以外.}
\end{cases}
\)
値 \(v(n)\) は,ある数 \(x\) の \(7^n\) の位の数値を返す関数で,床関数 \(\lfloor y \rfloor\) と剰余演算 \(z \bmod w\) を使った定義は下記の通り.
\(v(n) = \lfloor x / 7^n\rfloor \bmod 7\)
例えば\(x = 241\) なら \(v(2) = \lfloor 241 / 7^2\rfloor \bmod 7 = 4 \bmod 7 = 4\) になる.241 を 7進法で書けば 463(7) だから,\(7^2\) の位の数「4」と \(v(2) = 4\) はちゃんと一致してるね!(計算して確かめてね)
2.2. 位字 \(R(n)\)
「位字 (くらいじ)」は,その桁が7の何乗の位かを表現する部分.位字 \(R(n)\) の定義は次の通り.上の行は \(r(n)\) という関数が返す文字列で,下の行は空文字列,という意味.
\(\displaystyle
R(n) =
\begin{cases}
r(n) & \text{if $v(n) > 0$,}\\
\texttt{“”} & \text{if $v(n) = 0$.}
\end{cases}
\)
\(r(n)\) は下の表で定義する文字列を返す関数.
\(n\) | \(r(n)\) | 意味 |
---|---|---|
0 | (なし) | 70 の位 (1の位) |
1 | raf | 71 の位 (7の位) |
2 | bxogg | 72 の位 (49の位) |
日本語でも10の位が2なら「に・じゅう」とか,100の位が5なら「ご・ひゃく」とか言うけど,1の位が3でも「さん・いち」とは言わないよね (単に「さん」と言うよね).それと同じで,未知の言語でも 70 の位 (つまり 1の位) を表す文字列 \(r(0)\)は存在しない (書かれない).ですが,形式的に「0個の文字列」とすると扱いやいやすいので,そう考えることにしましょうか.
2.3. 値字 \(A(n)\)
7進法で数を表現するためには,7つの基本の数字が用意されている必要がある.「値字 (あたいじ)」がそれに当たる.値字 \(A(n)\) はの定義は \(n = 0\) と \(n > 0\) で違うので,それぞれ書きましょう!
2.3.1. \(n=0\) のとき
これは単純で,7進法で書いたときのその桁の値 \(v(n)\) を,値を文字列に変換する関数 \(a(v)\) の引数に入れてやるだけ.
\(\displaystyle
A(n) =a(v(n))
\)
2.3.2. \(n\gt0\) のとき
この場合はさらに場合分けがあって,上の行は値 \(v(n)\) を文字列に変換する関数 \(a(v)\) の引数に入れた結果の先頭にハイフン -
を付けたもの (式中の +
記号は文字列結合) で,下の行は空文字列.
\(\displaystyle
A(n) =
\begin{cases}
\texttt{“-“} + a(v(n)) & \text{if $v(n) > 1$,}\\
\texttt{“”} & \text{if $v(n) \leq 1$.}
\end{cases}
\)
\(a(v)\) は未知の言語の数字の基本.10進数なら 0 から 9 までの10文字を使ってすべての数を表記するけど,未知の言語は7進数なので,\(a(0)\) から \(a(6)\) までの7文字を使ってすべての数を表記する.
\(v\) | \(a(v)\) | 備考 |
---|---|---|
0 | (なし) | ゼロは書かない |
1 | zxea | |
2 | dhea | |
3 | ija | |
4 | rafskija | 4 = 7 – 3 と考える.raf = 7,ija = 3,sk が引き算 |
5 | rafskdhea | 5 = 7 – 2 と考える.raf = 7,dhea = 2,sk が引き算 |
6 | rafskzxea | 6 = 7 – 1 と考える.raf = 7,zxea = 1,sk が引き算 |
日本語でも30を「さん・じゅう・ぜろ」とか,406を「よん・ひゃく・ぜろ・じゅう・ろく」とか言わないよね (値が0になっている位は読まない).それと同じで,未知の言語でも,ある位の値 \(v(n) = 0\)のときは何も書かずに済ますので,0を表現する文字列 \(a(0)\) はありません.しかし, \(r(0)\) のときと同様に,便宜的に「0個の文字列」として考えましょう.
3. 例外?
実は上の定義で,QuizKnock の動画に登場した6つの未知の言語の記数のうち,1つだけ説明が付かないものが存在する.その例外 (?) とは, 17 を表す rafdhea-a-ija
だ.
17以外の数では,位字と値字はハイフン -
を挟んで連結される.
raf-rafskdhea
= \(7^1\cdot 5\) = 35raf-rafskdhea-a-xzea
= \(7^1 \cdot 5 + 1\) = 36bxogg-a-raf-rafskdhea-a-rafskija
= \(7^2 + 7^1 \cdot 5 + 4\) = 88
この規則に従うなら,17は raf-dhea-a-ija
= \(7^1 \cdot 2 + 3\) と書くのが正しそうだ.しかし動画内に登場した形では raf
と dhea
の間に -
はなく,つなげて rafdhea
と書かれてる.これは謎だけど,尤もらしい仮説が2つ思い付く.
- 単に表記ミス.この記事の規則が正しく,本当は
raf-dhea-a-ija
と書かれるべきだった - 本当は \(r\) と \(a\) の間にハイフンは基本的には不要.\(a(v)\) が
raf
から始まる文字列のとき (具体的には \(v = 4,5,6\) のとき) だけ,特例的に-
が必要になる- 理由は
rafrafskdhea
だと読みにくいので,raf-rafskdhea
とする… みたいな
- 理由は
特に上記の2は,かなり僕の憶測の率が高い.最少の規則で記数法を定義するなら,上記の1が正しい可能性が高いと言っていいだろう.こういうときのオッカムの剃刀だ.たぶん動画の表記が間違ってるんだと思う.
4. 拡張
拡張のためには \(r(n)\) の \(n \geq 3\) を定義してやればいい.つまり 73 の位とか74 の位を意味する単語を作ってやればいい.それをするのはこの記事の範囲を超えるので書きません!
ここまでババーっと天下りに書き下したので,読者の理解が追いついてないかもしれない.じっくり読んで理解してもらえると嬉しいね.