e進数
人力検索はてなのhttp://q.hatena.ne.jp/1137045651の質問に関して。
以下は2CHの書き込みです。
「1桁あたりの複雑度と、ある数値を表現するのに必要な桁数とを考えると、自然対数の底e=2.7進数が一番効率が良いことは数学的に証明されてる。 」
どのように証明されているか、わかりやすく説明しているHPがあれば教えてください
回答はe進数についてではなく、eそのものについてのようでした。
e進数の効率が高いことについては、その2chの書き込みの中ほどに書いてありました。以下に引用します。
661 :デフォルトの名無しさん :03/04/20 12:42
> 660 こんな証明だったと思うけど、
N 進数で 数値 x を表のに必要な桁数は以下の d のようになる。
d = logN(x)
ここで、N 進数における x の表現効率 y を、
y = N * d = N * LogN(X)
と定義する。y が小さいほど効率が良いとする。# y の妥当性の由来は N 進数 d 桁の計算回路の規模は y にほぼ比例すると考えてる
# ためだ。 もちろん、「少なくとも N レベルを瞬時に扱えるの非線形性を持つ素子を
# 使わない」というお約束はある。どうしても納得できなけりゃ回路を作って見る事だ。x に対し y を最小にする N を考える。N で微分するので底を変換する。
y = N * LogN(x)
= N * Loge(x) / Loge(N) = Loge(X) * N / Loge(N)
N で微分すると、
y' = Loge(X) * ((1 * Loge(N) - N * (1/N)) / ((Loge(N))^2))
= Loge(X) * (Loge(N) - 1)( / ))*1(^2)
微分係数 y'=0 になる N を見つける。N=e の時に y'=0 は成立する。e ≒ 2.7182。
以上の議論により e 進数において x の表現効率は y は最も小さくなる。現実的な
選択として、N=2 または N=3 を選ぶことになる。
これでいいのだと思いますが、もう少し直感的にわかりやすく説明してみようと思います。
まず、数を表すための物を考えます。例えば、おはじきや小石のように同じものが幾つもあれば、それを使って数を表せます。ここでは◆で表して、ユニットと呼びます。ユニットはその個数で数を表すことができます。◆なら1で、◆◆なら2のようにです。
しかし、この方法だと表す数だけユニットが必要になります。100を表すにはユニットが100個必要になります。
これを効率的にするのに、ユニットを分けて表すことを考えます。◆◆と◆◆◆で23を表すという具合です。
ただし、この方法を使うには0を表記する必要があります。そこで、◆を0、◆◆を1のようにユニットの個数と数の対応をずらします。各桁に10個のユニットを割り当てれば0から9までの数を表せます。
この方法だと20個のユニットで、0から99まで100通りの数が表せます。単にユニットの数で表す場合は、100通りの数を表すのに100個のユニットが必要なので、20個のユニットで100通りの数が表せるのはずいぶん効率のいい方法です。
◆ ◆ =0
◆ ◆◆ =1
◆ ◆◆◆ =2
◆◆ ◆ =10
◆◆◆ ◆ =20
◆◆◆◆◆ ◆◆◆◆◆◆◆◆◆ =48
◆◆◆◆◆◆◆ ◆◆◆◆◆◆◆◆ =67
◆◆◆◆◆◆◆◆◆◆ ◆◆◆◆◆◆◆◆◆◆ =99
ユニットを分ける場合に10個づつではなく、他の個数で分ける事もできます。例えば20個のユニットを1桁に2個づつ分けて10桁にした場合の数の表記を書いてみます。2個のユニットが2通りの数を表すわけで、2進数と考えられます。カッコの中の数字は2進数で表記した数です。
◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ =0 (0)
◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆◆ =2 (1)
◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆◆ ◆◆ =3 (11)
◆ ◆ ◆ ◆ ◆ ◆ ◆◆ ◆ ◆◆ ◆ =10 (1010)
◆ ◆ ◆ ◆ ◆ ◆◆ ◆ ◆◆ ◆ ◆ =20 (10100)
◆ ◆ ◆ ◆ ◆◆ ◆◆ ◆ ◆ ◆ ◆ =48 (110000)
◆ ◆ ◆ ◆◆ ◆ ◆ ◆ ◆ ◆◆ ◆◆ =67 (1000011)
◆ ◆ ◆ ◆◆ ◆◆ ◆ ◆ ◆ ◆◆ ◆◆ =99 (1100011)
もっと大きな数も表せます。
◆ ◆ ◆◆ ◆ ◆ ◆ ◆ ◆◆ ◆◆ ◆ =134 (10000110)
◆◆ ◆ ◆ ◆◆ ◆◆ ◆◆ ◆ ◆◆ ◆ ◆ =628 (1001110100)
◆◆ ◆◆ ◆◆ ◆◆ ◆◆ ◆ ◆◆ ◆ ◆ ◆ =1000 (1111101000)
各桁が2なので、2を桁数だけつまり10回かけた1024通りの数を表すことができます。各桁に10個を割り当てて2桁にした場合は100通りなので、それよりも効率の良い方法だと考えられます。
それではもっと効率の良い方法はあるでしょうか。
1桁にn個のユニットを使うn進数を使うと、桁数は(ユニットの数)÷nになります。表せる数はnを桁数回かけたものになります。n回かけるということはn乗するということなので、ユニットの数をとするとこうなります。
通り
ユニットが20個で計算すると
10進数だと
通り
2進数だと
通り
になります。
ユニットの数がnで割り切れないと無駄になってしまうのですが、ユニットの数が多い場合は無駄になる割合も減ります。また
なのでユニットの数xに関係なく、nだけで効率を考えることができます。nに2から10の数字を入れてを計算してみます。
3の場合がもっとも大きくなるのがわかります。その次が2と4で、同じ大きさです。ユニットの数を含めた場合も計算してみます。ユニットの数が割り切れない場合は除いています。
30個のユニットを使った場合
24個のユニットを使った場合
nが整数でない場合にも効率を求める式を計算することはできます。
自然対数の底eの場合に効率を求める式の計算結果が最大になることから、e進数が一番効率が高いというこもできます。
ただし、ユニットは自然数でしか分けることが出来ないので、自然数以外の進数にすることは出来ません。
また、自然数でなら自由に分けられるとも限らなくて、2つ1組でしか分けることの出来ないユニットの場合は奇数の進数を選択できません。無理に使おうとすれば、余計なユニットの為に効率が悪くなってしまいます。
*1:Loge(N