[アルゴリズム x 数学] 問題2.4.4 の N log N が難しかった

Algorithm

問題解決のための「アルゴリズム x 数学」が基礎からしっかり身につく本の問題2.4.4、「N がどの程度の大きさであればおおよそ何回の計算を行うか」のところなのですが、N log N のところが全然分かりませんでした。

N^2、2^N の場合はどっちも明快で、例えば計算回数を 10^6 以内としたとき、

N^2 <= 10^6
N <= √10^6
N <= 10^3
N <= 1000

2^N <= 10^6
N log 2 <= log 10^6 (底は 10)
N log 2 <= 6 log 10
N <= 6 / log 2
N <= 19.931 <= 20

という感じになります。

一方、N log N はこんな単純に解けません。
小一時間数式をこねくり回していましたがダメでした・・・。
そうしたら下記のリンクのように、世の中には同じようなことをしている人がいるもので。

How to solve $x\log(x) = 10^6$
I am trying to solve $$x\log(x) = 10^6$$ but can't find an elegant solution. Any ideas ?

そのなかの回答の一つが「ニュートン法でも使ったら?」でした。

方程式の解法をPythonを使って解いてみる【ニュートン法】

ありましたね、ニュートン法・・・。
(遠い学生時代の記憶)


流れとしては以下です。
まず漸化式
x_(n+1) = x_n – f(x_n) / f'(x_n)

上記は x = 0 のときの値を求めるものだから、
xlog(x) = 10^6 を xlog(x) – 10^6 = 0 にしておく。

その上で f(x) = xlog(x) – 10^6 の微分 f'(x) は (f(x)g(x))’ = f'(x)g(x) + f(x)g'(x) より、
f'(x_n) = (x log(x))’ = x’ log(x) + x (log(x))’ = 1*log(x) + x*(1/x) = log(x) + 1

以上より

x_(n+1) = x_n – f(x_n) / f'(x_n)
x_(n+1) = x_n – (xlog(x) – 10^6) / (log(x) + 1)

これを Python のプログラムに落とし込み、コミットしておきました。

演習問題 2.4.4 の N log N の際の N を求めるプログラム
https://github.com/men100/math-algorithm-book/commit/c9ef876617579ab5b8025b3e592264d9df1a67ff

上記のプログラムによって、計算した答えが以下。

10^6 のとき、 N <= 62746
10^7 のとき、 N <= 526172
10^8 のとき、 N <= 4523071
10^9 のとき、 N <= 39620077

解答の PDF を見るに、近い結果が出ているのでそれなりに計算できていそうです。


しかし、解説のあっさりさ加減を見ると、もっと簡単に求められたんじゃないかなあ・・・?とは思いますね。

でもまあ、結果的に解けたので良しとしておきます。

コメント

タイトルとURLをコピーしました