5

私は Python を学んでおり、ログの結果を生成するスクリプトを実行する必要があります。

対数ベース x = 結果であることは知っています

次に、コードを作成しました。

def log(x, base):
log_b = 2
while x != int(round(base ** log_b)):
    log_b += 0.01
    print log_b
return int(round(log_b))

しかし、それは非常にゆっくりと動作します。他の方法を使用できますか?ありがとう!

4

6 に答える 6

19

考慮したいもう 1 つのことは、自然対数のテイラー級数を使用することです。

ここに画像の説明を入力 ここに画像の説明を入力

このシリーズのいくつかの項を使用して自然対数を概算したら、基数を簡単に変更できます。

ここに画像の説明を入力


編集:これは別の便利なアイデンティティです:

ここに画像の説明を入力

これを使用して、次の行に沿って何かを書くことができます

def ln(x):
    n = 1000.0
    return n * ((x ** (1/n)) - 1)

それをテストすると、次のようになります。

print ln(math.e), math.log(math.e)
print ln(0.5), math.log(0.5)
print ln(100.0), math.log(100.0)

出力:

1.00050016671 1.0
-0.692907009547 -0.69314718056
4.6157902784 4.60517018599

これは、(スペースで区切られた) 値と比較したmath.log値を示しており、ご覧のとおり、かなり正確です。ln(10000)サイズが非常に大きくなるにつれて (たとえば0.4、必要以上に大きくなるなど)精度が低下し始める可能性nがありますが、必要に応じていつでも精度を上げることができます。

于 2012-11-03T16:42:38.520 に答える
6

私は再帰を使用しました:

def myLog(x, b):
    if x < b:
        return 0  
    return 1 + myLog(x/b, b)
于 2012-11-06T07:54:40.210 に答える
2

そのために二分探索を使用できます。二分探索の詳細については、http://en.wikipedia.org/wiki/Binary_search_algorithmを参照してください。

基本的に、0 と x から始めて、アルゴリズムを適用します。すぐにコードを書きます。

def log(x, base, mn, mx):
    if (mn <= mx):
        med = (mn + mx) / 2.0
        if x == int(round(base ** med)):
            return int(round(log_b))
        if x > int(round(base ** med)):
            return log(x, base, med, mx)
        if x < int(round(base ** med)):
            return log(x, base, mn, med)
    return 0

そんな感じ。

于 2012-11-03T16:36:24.117 に答える