对数公式的换算,对于算法复杂度的推导非常重要。但是我总忘,这次特地总结一下常用的对数公式,以备后用。
名称公式和差 log α M N = log α M + l o g α N log_alpha MN=log_alpha M+log_alpha N logαMN=logαM+logαN换底公式 log α x = log β x log β α log_alpha x=frac{log_eta x}{log_etaalpha} logαx=logβαlogβx次方公式 log a n x m = m n log a x log_{a^n}x^m=frac{m}{n}log_ax loganxm=nmlogax互换 M log a N = N log a M M^{log_aN}=N^{log_aM} MlogaN=NlogaM倒数 log a b = ln b ln a = 1 log b a log_ab=frac{ln b}{ln a}=frac{1}{log_ba} logab=lnalnb=logba1链式 log γ β log β α = ln β ln γ ln α ln β = ln α ln γ = log γ α log_gamma etalog_etaalpha=frac{ln eta}{ln gamma}frac{ln alpha}{ln eta}=frac{ln alpha}{ln gamma}=log_gammaalpha logγβlogβα=lnγlnβlnβlnα=lnγlnα=logγα还原 α log α x = x = log α α x alpha^{log_alpha x}=x=log_alpha alpha^x αlogαx=x=logααx注:公式总结自维基百科:https://zh.wikipedia.org/wiki/%E5%AF%B9%E6%95%B0。
基底是 e e e还是2的问题在一些计算机相关的领域,书写 log log log函数时经常会省略基底(base),例如时间复杂度 O ( log N ) O(log N) O(logN),或者在机器学习领域用来做多分类的交叉熵损失函数: L c e ( x , y ) = − ∑ c = 1 M y o , c log ( p o , c ) L_{ce}(x,y)=-sum^M_{c=1}y_{o,c}log(p_{o,c}) Lce(x,y)=−∑c=1Myo,clog(po,c),这个时候我们会想知道这些 log log log函数的基底到底是数学常数 e e e还是2?
一般情况下,算法复杂度和信息论领域(例如交叉熵)的 log log log计算都是以2为底,但也有少部分以 e e e为底的情况。其实我们对 log log log的基底无需过分担心,因为以 e e e为底得出的结果与以2为底得出的结果比值是个常数,使用换底公式即可求得: log e N log 2 N = log k N log k e / log k N log k 2 = log k 2 log k e = log e 2. frac{log_eN}{log_2N}=frac{log_kN}{log_ke}/frac{log_kN}{log_k2}=frac{log_k2}{log_ke}=log_e2. log2NlogeN=logkelogkN/logk2logkN=logkelogk2=loge2. 因此,我们不应该过分关注 log log log函数的基底是 e e e还是2的问题,它们计算结果的比值总是一个常数,采用任何一个基底都不会对要解决的问题本身产生影响。