徒然

思いついたら書きます

scipy.optimize.bisectを使った二分法を競プロで使う

はじめに

今日のyukicoder contest 246で関数の二分法に関する問題が出ました。

競プロPython勢ではAtCoderD - 高橋君ボール1号ニュートン法(scipy.optimize.newton)で解く方法が有名かとは思いますが、二分法でもscipyのモジュールで解けるようなので使ってみました。

問題

yukicoder.me

要約するとP, Qが与えられるので、f(x)=x^{2} - Q x log_{2} x - Pf(N) = 0となるNがどこに収束するのかを求めよという問題です。

二分探索で求めれば良さそうです。scipy.optimize.bisectを使ってみましょう。

コードを書く

N \geq 1が保証されているので、下限は1として、上限は余裕を持って10^{15}としたコードがこちらです。

from scipy.optimize import bisect
import numpy as np
def f(x):
    return x ** 2 - q * x * np.log2(x) - p
p, q = map(int, input().split())
print(bisect(f, 1, 10 ** 15))

結果

input >8 1
output>4.000000000001498

input >7654321 1234567
output>30706182.56174902

たった6行のコードですが解けてしまいました。

おわりに

scipy最高!!!!

ついでに上記の高橋君ボール1号もこの二分法で解けるので解いてみてください。