2011-12-17 25 views
8

A menudo he visto que el logaritmo discreto es un problema difícil. Sin embargo, no veo muy bien cómo podría ser esto. Me parece que una búsqueda binaria regular sería suficiente para cumplir este propósito. Por ejemplo,Algoritmo del logaritmo discreto

binary_search(base, left, right, target) { 
    if (pow(base, left) == target) 
     return left; 
    if (pow(base, right) == target) 
     return right; 
    if (pow(base, (left + right)/2) < target) 
     return binary_search(base, (left + right)/2, right, target); 
    else 
     return binary_search(base, left, (left + right)/2, target); 
} 

log(base, number) { 
    left = 1; 
    right = 2; 
    while(pow(base, p) < number) { 
     left = right; 
     right *= 2; 
    } 
    return binary_search(base, left, right, number); 
} 

Si la aplicación ingenua de simplemente incrementar p hasta pow(base, p) es O (n), entonces seguramente esta búsqueda binaria es O (log (n)^2).

¿O no entiendo cómo se mide este algoritmo?

Editar: Por lo general, no escribo búsquedas binarias, por lo que si hay algún error de implementación trivial, amablemente solo ignórelo o edítelo en una solución.

+0

¿Cuál es la complejidad de 'pow'? –

+0

@JoshLee: logarítmico en el poder, a lo sumo. – Puppy

+0

Prueba este http://en.wikipedia.org/wiki/Baby-step_giant-step – kilotaras

Respuesta

10

Su algoritmo supone que un < b implica pow (base, a) < pow (base, b).

Esto es cierto para números naturales, pero no funcionará en un grupo cíclico finito (cuando 'pow' se calcula modulo algún número).

+0

Eso explica muy bien la discrepancia entre mi intuición y la verdad, no lo había considerado así. – Puppy