Skip to main content

Logaritme binari Contingut Aplicacions Fent servir calculadores Algorisme Codi d'exemple Referències Vegeu també Menú de navegació

Logaritmes


matemàtiqueslogaritmefunció inversapotències de 2informàticateoria de la informaciósistema de numeració binariISO(bits)part enterainformacióentropia d'informacióanàlisi d'algorismesestructuresde dadesalgorismescerca binàriaarbre de recerca binarinotació d'O granlinearithmicscalculadoreslogaritme naturallogaritme decimalcanvi de base de logaritmedominisrecorregutsarrodonintllenguatge Cdecalatge a la dreta'nombre realrecursivamentsèrie infinitaconvergeixcriteri de d'AlembertPythonrecurrència de cuaiteracióPerl












Logaritme binari




De Viquipèdia






Salta a la navegació
Salta a la cerca




Gràfica del log2n


En matemàtiques, el logaritme binari (log2 n) és el logaritme en base 2. És la funció inversa de n  ↦ 2n . El logaritme binari de n és la potència a la qual cal elevar el nombre 2 per obtenir el valor n. Això fa útil el logaritme binari per a tot el que impliqui potències de 2. Per exemple, el logaritme binari d'1 és 0, el logaritme binari de 2 és 1, el logaritme binari de 4 és 2, el logaritme binari de 8 és 3, el logaritme binari de 16 és 4 i el logaritme binari de 32 és 5.




Contingut





  • 1 Aplicacions

    • 1.1 Teoria de la Informació


    • 1.2 Complexitat computacional



  • 2 Fent servir calculadores


  • 3 Algorisme

    • 3.1 Enter


    • 3.2 Nombre real



  • 4 Codi d'exemple


  • 5 Referències


  • 6 Vegeu també




Aplicacions



Teoria de la Informació


El logaritme binari s'utilitza sovint en informàtica i teoria de la informació perquè està molt relacionat amb el sistema de numeració binari. Segons l'especificació ISO s'escriu lb (n). El nombre de dígits (bits) en la representació binària d'un enter positiu n és la part entera de 1 + lb n, és a dir:


⌊lbn⌋+1.displaystyle lfloor operatorname lb ,nrfloor +1.,

En teoria de la informació, la definició de la quantitat d'informació i entropia d'informació fa servir el logaritme binari; això és necessari perquè la unitat d'informació, el bit, es refereix a informació que resulta el coneixement d'un fet que pot tenir dues alternatives igualment probables.



Complexitat computacional


El logaritme binari també apareix sovint en l'anàlisi d'algorismes. Si un nombre n més gran que 1 es divideix entre 2 repetidament, el nombre d'iteracions necessitades per aconseguir un valor com a màxim 1 és una altra vegada la part entera de lb n. Aquesta idea s'utilitza en l'anàlisi de diveres estructuresde dades i d'algorismes. Per exemple, en la cerca binària, la mida del problema a resoldre es redueix a la meitat a cada iteració, i per això calen aproximadament n iteracions per obtenir un problema de mida 1, que es resol fàcilment en temps constant. De forma similar, un arbre de recerca binari perfectament equilibrat que conté n elements té alçada lb n + 1.


Tanmateix, el temps d'execució d'un algorisme s'expressa normalment en notació d'O gran, ignorant factors constants. Com que log2n = (1/logk  2)logk n, on k pot ser qualsevol nombre més gran que 1, els algorismes que s'executen en temps O (log2 n ) també es pot dir que s'executen, per exemple en temps O (log13 n). Per això la base del logaritme en expressions com O (log n) o O (n log  n) no és important.


En altres contexts, tanmateix, cal especificar la base del logaritme. Per exemple O(2lb n ) no és igual que O(2ln n) perquè el primer és igual a O(n) i el segon a O(n0.6931....


Els algorismes amb temps d'execució n lb n de vegades s'anomenen linearithmics. Alguns exemples d'algorismes amb temps d'execució O (lb n) o O (n lb n) són:


  • quicksort de temps mitjà

  • arbres de cerca binaris


Fent servir calculadores


Una manera fàcil de calcular el log2(n) en calculadores que no tenen la funció log2 és fer servir el logaritme natural "ln" o el logaritme decimal "log", que es troben en la majoria de "les calculadores científiques". La fórmula de canvi de base de logaritme és:


log2(n) = ln(n)/ln(2) = log(n)/log(2)

així


log2(n) = loge(n)×1.442695... = log10(n)×3.321928...


Algorisme



Enter


Per a dominis i recorreguts enters, el logaritme binari es pot calcular arrodonint amunt o avall. Aquestes dues formes de logaritme binari enter es relacionen per aquesta fórmula:



⌊log2⁡(n)⌋=⌈log2⁡(n+1)⌉−1, if n≥1.displaystyle lfloor log _2(n)rfloor =lceil log _2(n+1)rceil -1,text if ngeq 1.[1]

La definició es pot estendre definint ⌊log2⁡(0)⌋=−1displaystyle lfloor log _2(0)rfloor =-1. Aquesta funció està relacionada amb el nombre de zeros de la representació binària amb 32 bits sense signe de x, nlz(x).



⌊log2⁡(n)⌋=31−nlz⁡(x).displaystyle lfloor log _2(n)rfloor =31-operatorname nlz (x).[1]

El codi exemple següent, una mica canviat, en llenguatge C calcula el logaritme binari (arrodonint cap avall) d'un enter.[1] L'operador '>>' representa 'decalatge a la dreta' sense signe. L'arrodoniment cap avall del logaritme binari és idèntic a calcular la posició del bit més significatiu.


/**
* Retorna el logaritme binari enter arrodonit cap avall per a un enter de 32 bits.
* es retorna −1 si ''n'' és 0.
*/
int floorLog2(unsigned int n)
if (n == 0)
return -1;

int pos = 0;
if (n >= 1<<16) n >>= 16; pos += 16;
if (n >= 1<< 8) n >>= 8; pos += 8;
if (n >= 1<< 4) n >>= 4; pos += 4;
if (n >= 1<< 2) n >>= 2; pos += 2;
if (n >= 1<< 1) pos += 1;
return pos;



Nombre real


Per a un nombre real positiu general, el logaritme binari es pot calcular en dues parts:


  1. Calcular la part entera, ⌊lb⁡(x)⌋displaystyle lfloor operatorname lb (x)rfloor

  2. Calcular la part fraccionària

Calcular la part entera és directe. Per a qualsevol x > 0, existeix un enter únic n tal que 2n  ≤ x < 2n +1, o equivalentment 1 ≤ 2n x < 2. Ara la part entera del logaritme és simplement n, i la part fraccionària és lb(2nx). En altres paraules:


lb⁡(x)=n+lb⁡(y)on y=2−nx i y∈[1,2)displaystyle operatorname lb (x)=n+operatorname lb (y)quad texton y=2^-nxtext i yin [1,2)

La part fraccionària del resultat és lb⁡ydisplaystyle operatorname lb y, i es pot calcular recursivament, fent servir només operacions elementals de multiplicació i divisió. Per calcular la part fraccionària:


  1. Es comença amb un nombre real y∈[1,2)displaystyle yin [1,2). Si y=1displaystyle y=1, llavors s'ha acabat i la part fraccionària és zero.

  2. Altrament, ydisplaystyle y s'eleva al quadrat repetidament fins que el resultat és z∈[2,4)displaystyle zin [2,4). Sia mdisplaystyle m el nombre de vegades que ha calgut elevar al quadrat. És a dir, z=y2↑mdisplaystyle z=y^2uparrow m amb mdisplaystyle m escollit tal que z∈[2,4)displaystyle zin [2,4).

  3. Calculant el logaritme als dos costats i fent una mica d'àlgebra:
    lbz=2mlbylby=lb⁡z2m=1+lb⁡(z/2)2m=2−m+2−mlb⁡(z/2)displaystyle beginalignedoperatorname lb ,z&=2^moperatorname lb ,y\operatorname lb ,y&=frac operatorname lb z2^m\&=frac 1+operatorname lb (z/2)2^m\&=2^-m+2^-moperatorname lb (z/2)endaligned

  4. Observeu que z/2displaystyle z/2 és altra vegada un nombre real en l'interval [1,2)displaystyle [1,2).

  5. Tornar al pas 1, i calcular el logaritme binari de z/2displaystyle z/2 fent servir el mateix mètode recursivament.

El resultat d'això s'expressa per les fórmules següents, en les quals midisplaystyle m_i el nombre de vegades que cal elevar al quadrat en la i-èsima recursió de l'algorisme:


lbx=n+2−m1(1+2−m2(1+2−m3(1+⋯)))=n+2−m1+2−m1−m2+2−m1−m2−m3+⋯displaystyle beginalignedoperatorname lb ,x&=n+2^-m_1left(1+2^-m_2left(1+2^-m_3left(1+cdots right)right)right)\&=n+2^-m_1+2^-m_1-m_2+2^-m_1-m_2-m_3+cdots endaligned

En el cas especial on la part fraccionària al pas 1 resulta ser zero, això és una successió finita que acaba a algun punt. Altrament, és una sèrie infinita que convergeix segons el criteri de d'Alembert, ja que cada terme és estrictament menor que el previ (ja que tots els mi>0displaystyle m_i>0). A la pràctica, aquesta sèrie infinita s'ha de truncar per arribar a un resultat aproximat. Si la sèrie es trunca després del i-èsim terme, llavors l'error en el resultat és menor que 2−(m1+m2+⋯+mi)displaystyle 2^-(m_1+m_2+cdots +m_i).



Codi d'exemple


El programa en Python següent calcula el logaritme binari fent servir el mètode recursiu que s'ha explicat a dalt, mostrant els passos pel camí:[2]


def lg(x):
ip = 0
rem = x

# Part entera
while rem<1:
ip -= 1
rem *= 2
while rem>=2:
ip += 1
rem /= 2
print "lg(%g) = %d + lg(%g)" % (x, ip, rem)

# Part Fraccionària
res = ip + frac_lg(rem)

return res


def frac_lg(x, fp=1.0, tol=1e-10):
assert 1<=x<2

# Acabar la recussió si s'està prou a prop
if fp<tol:
return 0



# square until >= 2
rem = x
m = 0
while rem < 2:
m += 1
fp /= 2
rem *= rem

# ara:
# rem = x**2**m, fp = 2**-m
# => lg(rem) = lg(x)*2**m = lg(x)/fp
# => lg(x) = fp * ( lg(rem/2) + 1 )
# = fp + fp*lg(rem/2)
# hora de fer recussió!

print "lg(x=%g) t= 2**%d * ( 1 + lg(%g) )" % (x, -m, rem/2)
return fp + frac_lg(rem/2, fp)


if __name__ == '__main__':
value = 4.5
print " X =", value
result = lg(value)
print "lg(X) =", result

# Exemple de resultat
#
# $ python log2.py
# X = 4.5
# lg(4.5) = 2 + lg(1.125)
# lg(x=1.125) = 2**-3 * ( 1 + lg(1.28289) )
# lg(x=1.28289) = 2**-2 * ( 1 + lg(1.35435) )
# lg(x=1.35435) = 2**-2 * ( 1 + lg(1.68226) )
# lg(x=1.68226) = 2**-1 * ( 1 + lg(1.415) )
# lg(x=1.415) = 2**-1 * ( 1 + lg(1.00111) )
# lg(x=1.00111) = 2**-10 * ( 1 + lg(1.55742) )
# lg(x=1.55742) = 2**-1 * ( 1 + lg(1.21278) )
# lg(x=1.21278) = 2**-2 * ( 1 + lg(1.08166) )
# lg(x=1.08166) = 2**-4 * ( 1 + lg(1.75563) )
# lg(x=1.75563) = 2**-1 * ( 1 + lg(1.54113) )
# lg(x=1.54113) = 2**-1 * ( 1 + lg(1.18753) )
# lg(x=1.18753) = 2**-3 * ( 1 + lg(1.97759) )
# lg(x=1.97759) = 2**-1 * ( 1 + lg(1.95543) )
# lg(x=1.95543) = 2**-1 * ( 1 + lg(1.91185) )
# lg(x=1.91185) = 2**-1 * ( 1 + lg(1.82758) )
# lg(X) = 2.16992500139
#

Donat que Python no optimitza la recurrència de cua, això es pot implementar més eficaçment amb iteració. Aquí hi ha una versió iterativa del mateix algorisme en Perl:


sub lg 

printf "x = %gnlg(x) = %gn", 4.5, lg(4.5);


Referències




  1. 1,01,11,2 Warren Jr., Henry S. Hacker's Delight. Addison Wesley, 2002, pp. 215. ISBN 978-0201914658. 


  2. adaptat de [% de http://en.literateprograms.org/Logarithm_Function_%28Python 29 Funció de Logaritme (Pitó)]




Vegeu també



  • Logaritme natural (base e)

  • Logaritme




Obtingut de «https://ca.wikipedia.org/w/index.php?title=Logaritme_binari&oldid=20861232»










Menú de navegació



























(RLQ=window.RLQ||[]).push(function()mw.config.set("wgPageParseReport":"limitreport":"cputime":"0.104","walltime":"0.179","ppvisitednodes":"value":507,"limit":1000000,"ppgeneratednodes":"value":0,"limit":1500000,"postexpandincludesize":"value":1654,"limit":2097152,"templateargumentsize":"value":349,"limit":2097152,"expansiondepth":"value":10,"limit":40,"expensivefunctioncount":"value":0,"limit":500,"unstrip-depth":"value":0,"limit":20,"unstrip-size":"value":15437,"limit":5000000,"entityaccesscount":"value":0,"limit":400,"timingprofile":["100.00% 20.576 1 Plantilla:Referències","100.00% 20.576 1 -total"," 60.77% 12.505 1 Plantilla:Ref_llibre"],"cachereport":"origin":"mw1307","timestamp":"20190603215548","ttl":2592000,"transientcontent":false););"@context":"https://schema.org","@type":"Article","name":"Logaritme binari","url":"https://ca.wikipedia.org/wiki/Logaritme_binari","sameAs":"http://www.wikidata.org/entity/Q581168","mainEntity":"http://www.wikidata.org/entity/Q581168","author":"@type":"Organization","name":"Contributors to Wikimedia projects","publisher":"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":"@type":"ImageObject","url":"https://www.wikimedia.org/static/images/wmf-hor-googpub.png","datePublished":"2010-12-11T11:09:27Z","dateModified":"2019-03-02T19:14:34Z","image":"https://upload.wikimedia.org/wikipedia/commons/5/56/Binary_logarithm_plot.png"(RLQ=window.RLQ||[]).push(function()mw.config.set("wgBackendResponseTime":127,"wgHostname":"mw1271"););

Popular posts from this blog

Kamusi Yaliyomo Aina za kamusi | Muundo wa kamusi | Faida za kamusi | Dhima ya picha katika kamusi | Marejeo | Tazama pia | Viungo vya nje | UrambazajiKuhusu kamusiGo-SwahiliWiki-KamusiKamusi ya Kiswahili na Kiingerezakuihariri na kuongeza habari

Swift 4 - func physicsWorld not invoked on collision? The Next CEO of Stack OverflowHow to call Objective-C code from Swift#ifdef replacement in the Swift language@selector() in Swift?#pragma mark in Swift?Swift for loop: for index, element in array?dispatch_after - GCD in Swift?Swift Beta performance: sorting arraysSplit a String into an array in Swift?The use of Swift 3 @objc inference in Swift 4 mode is deprecated?How to optimize UITableViewCell, because my UITableView lags

Access current req object everywhere in Node.js ExpressWhy are global variables considered bad practice? (node.js)Using req & res across functionsHow do I get the path to the current script with Node.js?What is Node.js' Connect, Express and “middleware”?Node.js w/ express error handling in callbackHow to access the GET parameters after “?” in Express?Modify Node.js req object parametersAccess “app” variable inside of ExpressJS/ConnectJS middleware?Node.js Express app - request objectAngular Http Module considered middleware?Session variables in ExpressJSAdd properties to the req object in expressjs with Typescript