輪郭をなぞるだけのブログ

浅学菲才のためにおそらく嘘も多い

任意の底の対数を計算

競技プログラミングというか、ほとんど高校数学の話ではあるが…
解いた問題のことを書きたいが、気力がないので、簡単な話でお茶を濁しておく。

任意の底の対数を計算したいが、C++ ではそのような関数は用意されておらず、底の変換公式に従って計算する必要がある。
例えば、\log_{A} {B} を計算したい時、
\log_{A} {B} = \frac{\log{B}}{\log{A}}
という等式を用いて計算する。(自然対数の底 e は省略)
数学はほとんど忘却の彼方なので、こんなんあったなあという感じである。
え、公式は覚えるものではないって?
それはそうなんだけど、頭の中で導出できるほどの頭は持ち合わせていないし、紙に書いて導出する気力もない。

あと、注意することとしては、A = 1 のときは実行できない点である。
log {A} = 0 となってしまい、ゼロ除算をしてしまうになるのでいけない。
そもそも底の条件に 1 ではないというのあったわ。
この操作が必要な問題を解いてるときに、少し詰まってしまった。
ゼロ除算を許すな。

// A != 1
double calc_log(double A, double B){
    return log(B) / log(A);
}

【雑記】
最近 Union-Find を連想配列で実装したりしていたが、なんか使いどころなさそうなんだよなあ…
これを使って解いた問題の解説見たら、DancingLinks とか書いてあって知らんって感じだった。
分不相応な問題解いてばかりいる気がするが、力ついてるんかなあ…