7

任意の基数での整数の表現の長さがあります。長さが 15 で、基数が 36 だとします。次に、この整数の表現が別の任意の基数でどのくらいの長さになるかを計算したいと思います。つまり、基数 2 に変換すると、長さが 68 になる場合があります。

私はそれが以下の線に沿っていることを知っていますが、床と天井に必要なものについて頭を悩ませることはできません.

length * log(fromBase) / log(toBase)
4

3 に答える 3

8

Mathematica に似た構文に従って、

Log[b,n]

n の b を底とする対数を表します。の自然対数Log[n]を表すとしnます。

次に、比率

Log[b1,n]/Log[b2,n]

一定で、等しい

Log[b2]/Log[b1]

この比率は、基数の桁b1数から基数の桁数を計算するための乗数ですb2(または、そのように考える場合はその逆)。質問の例では、15 桁の base-36 番号が必要になります

15*Log[36]/Log[2] == 77.5489

基数 2 の数字。もちろん、これはまさにあなたの質問にあるものです。最終的な答えを次の整数に丸めるだけです。

もちろん、なぜあなたが得た結果がかなりずれているように見えるのか、私にはわかりません。

于 2013-01-23T05:59:48.983 に答える
4

残念ながら、高精度で計算しないと正確な解はありません。たとえば、(自分で作成した高精度作業用のツールを含め、作業には MATLAB を使用します) 2^200 とは何ですか? 基数 10 では、次のようになります。

vpij(2)^200
ans =
    1606938044258990275541962092341162602522202993782792835301376

その数値は、201 の基数 2 桁を使用して 2 進数で表されます。ただし、2^200-1 を表すには 200 基数の 2 桁しか必要ありません。

vpij(2)^200 - 1
ans =
    1606938044258990275541962092341162602522202993782792835301375

これで、最上位桁のみを取得することで、これらの数値の対数を double として計算できます。数値を表すために必要な基数 2 の桁数を知るには、数値の基数 2 の対数に 1 を追加する必要があります。

format long g
1 + log2(vpij(2)^200)
ans =
   201

1 + log2(vpij(2)^200 - 1)
ans =
   201

ここで log2 はまさにそれを行い、そのログを計算するために上位の 10 進数を取ります。2 番目の数値を 2 進数形式で格納するには、実際には 1 桁少なくする必要があるとは言えません。

vpij2bin(vpij(2)^200)
ans =
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

vpij2bin(vpij(2)^200 - 1)
ans =
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

これらの数値の高精度ログを取得することで、何が起こるかを確認できます。したがって、小数点以下 100 桁までの精度で、

log2(hpf(2,100)^200)
ans =
200

log2(hpf(2,100)^200 - 1)
ans =
199.9999999999999999999999999999999999999999999999999999999999991022086719253476184905817230522465495

これら 2 つの数値の差は非常に小さいです。

log10(hpf(2,100)^200) - log10(hpf(2,100)^200 - 1)
ans =
2.702621195974725251000559400026211938865e-61

そのため、高精度のログ自体が取得されない限り、ログを使用する計算はここで失敗する必要があります。せいぜい、1桁以内に収まる程度ですが、それ以上にはなりません。そのため、目的が数字に十分なスペースを割り当てることだけである場合は、明らかに必要な数字よりも 1 つ多い数字を常に割り当ててください。本当に巨大な力で作業を開始するまでは、これで十分です。

(VPIJ は MATLAB の新しい可変精度整数形式で、私の古い VPI ツールを直接置き換えるものです。HPF はファイル交換で既に利用できます。)

于 2013-01-23T15:58:44.497 に答える
4

対数を使わなくても正確な答えを得ることができます。数値が内部に収まるまで、任意の底の基数を上に移動します。

Python の例:

def count_digits(number, base):
    radix = 1
    while number >= base ** radix:
        radix += 1
    return radix
于 2014-02-04T12:01:17.523 に答える