150 likes | 363 Views
Diseño y análisis de algoritmos. Algoritmos probabilistas. Temario. Algoritmos probabilistas II Test de primalidad Algoritmos tipo Las Vegas. Algoritmos probabilistas Test de primalidad.
E N D
Diseño y análisis de algoritmos Algoritmos probabilistas
Temario • Algoritmos probabilistas II • Test de primalidad • Algoritmos tipo Las Vegas
Algoritmos probabilistas Test de primalidad • Algoritmo de tipo Monte Carlo más conocido. Problema: verificar si un número impar es primo o no (compuesto). • Si un número tiene cientos de cifras, ningun algoritmo determinista conocido puede responder en un tiempo “razonable”. • Tiene aplicaciones en criptografía, tema que se verá en las próximas sesiones. • La base para el algoritmo es el pequeño teorema de Fermat (1640): • sea primo , entonces se cumple para cualquier a tal que 1<a<=n-1 • Ejemplo n=7, a=5 • en efecto • El contrarecíproco de este teorema es el siguiente: • Si a y n son enteros tales que 1<a<=n-1 y si entonces n no es primo
Algoritmos probabilistas Test de primalidad • Implementación • Si el algoritmo indica que n no es primo , entonces la respuesta es correcta. • Si el algoritmo indica verdadero, entonces puede ser cierto o no. • Casos triviales en que falla, n impar >3 , ejemplo 9 es impar y satisface el teorema de fermat con a=8 1864135*9+1=16777216= • A 8 se le llama falso testigo de primalidad, si a=4 y n=9 • 7281*9+1=65530<> 65536= que en este caso n=4 es un testigo correcto e indica que 9 no es primo. funcion fermat(n:entero):booleano variables a:entero inicio a:=uniforme(2,n-1); si exp(a,n-1) mod n = 1 entonces devuelve verdadero sino devuelve falso finsi fin
Algoritmos probabilistas Test de primalidad • Formalmente dado un entero n que no sea primo, un entero a tal que 2<a<=n-2 se llama falso testigo de primalidad si satisface el pequeño teorema de fermat. • La primera mejora coniste en eliminar los casos triviales eligiendo a entre 2 y n-2. • El algoritmo falla sólo para falsos testigos de primalidad. • La pregunta es si existen muchos testigos falsos • Depende, para el caso de números no primos impares, sólo 5 de los primeros 332 primos menores que 1000 no tienen testigos falsos, pero • Más de la mitad tienen sólo dos falsos testigos de primalidad • Menos del 16% tienen más de 15 • En total , hay sólo 4490 falsos testigos de primalidad para los primeros 332 impares no primos menores que 1000. La cantidad total de testigos para los 332 es de 172878 • En estos casos el error medio del algoritmo sería mero al 0.03 • El problema es que no se puede generalizar, hay números no primos que admiten muchos falsos testigos de primalidad.
Algoritmos probabilistas Test de primalidad • Por ejemplo , el 561 no es primo y pasa el teorema de fermat en 318 veces, por lo que tiene un 57% error. Hay casos mucho peores incluso con más del 99.9% de falsos testigos de primalidad. (651693055693681) • Puede demostrarse que el algoritmo fermat no es p-correcto para ningún p>0 • La probabilidad de error no puede disminuirse mediante repeticiones del algoritmo • Existe un teorema que, extendiendo el teorema de Fermat, proporciona una mejor manera de testear la primalidad. • Sea n un entero impar, n>=4. Existen s> 0, t impar tal que .Un número a, 2<=a<=n-2 se dice pertenece a B(n) si y solo si cumple una de las siguientes propiedaes: • Existe i , 0<=i<s tal que
Algoritmos probabilistas Test de primalidad • Implementación funcion B(n,a:entero):booleano variables s,t,i,x:entero inicio i:=i+1;t:=n-1; repita s:=s+1; t:=t div 2 hasta t mod 2 =1 {determina los valores de s y t} x:= exp(a,t) mod n si x=1 or x= n-1 entonces retornar verdadero sino para i:= 1 hasta s-1 hacer x:=(x*x) mod n si x= n-1 entnces retornar verdadero fin si fin para retornar falso fin
Algoritmos probabilistas Test de primalidad • Este algoritmo también entrega valor de verdad cuando n no es primo, es decir testigos falsos ahora llamados testigos falsos fuertes de primalidad. • Por ejemplo el número 289 no es primo, es divisible por 17, pero si se usa a=158 resulta • Primero se encuentran t=9 y s=5 ya que • Luego se encuentra x=exp(158,5) mod 289 =131, que no es ni 1 ni 288 se ejecuta el ciclo con i (a lo mas 4 veces): • A pesar de estos posibles errores, se puede demostrar que los testigos falsos fuertes de primalidad para todo número n no primos son menors del 25% entre 2 y n-2. Por lo que se pude definir un nuevo algoritmo
Algoritmos probabilistas Test de primalidad • Implementación • Sólo tiene una probabilidad de error del 25% • Es más, como el algoritmo es 0.75-correcto y cada vez que retorna falso la respuesta es correcta, se trata de un algoritmo sesgado, al igual que el de verificación de la multiplicación de matrices. • Esto permite iterar para reducir el margen de error. • Si se itera k veces el algoritmo será • Ejemplo si k= 10, el error esperado es menos de una millonésima sobre 100 funcion MillerRabin(n:entero):booleano {n>4} variables a:entero inicio a:=uniforme(2,n-2); devuelve b(n,a); fin
Algoritmos probabilistas Test de primalidad • Implementación con error controlado funcion repe_MillerRabin(n,k:entero):booleano variables i:entero inicio para i:=1 hasta k hacer si not MillerRabin(n) entonces devuelve falso fin-si fin-para devuelve verdad fin
Algoritmos probabilistas Algoritmos tipo Las Vegas • Un algoritmo tipo Las Vegas nunca da una solución falsa. • Toma desiciones al azar para encontrar soluciones antes que un algoritmo determinista. • Si no encuentra la solución lo admite • Hay dos tipos de algoritmos tipo Las Vegas, en relación a la posibilidad de no encontrar una solución: • Los que siempre encuentran una solución correcta, aunque las desiciones al azar no sean afortunadas y la eficiencia disminuya. • Aquellos que pueden reconocer que se han equivocado. El algoritmo toma desiciones que eventualmente pueden ocacionar que no encuentre ninguna respuesta.
Algoritmos probabilistas Algoritmos tipo Las Vegas • Tipo a, se les conoce como algoritmos sherwood • Existe una solución determinista que es mucho más rápida en media que en el peor caso. • Ejemplos: búsqueda binaria, costo promedio • quikcsort: costo peor costo promedio • Sin embargo la complejidad en tiempo promedio se basa en la equiprobabilidad de la entrada • En la realidad los datos pueden estar sesgados y causar una baja de la performance. • Al usar este tipo de algoritmo probabiístico se puede reducir la diferencia de eficiencia producto de los datos de entrada • Uniformizacioón de los tiempos de ejecucuón para todas las entradas de igual tamaño • En promedio (tomando todas las instancias de igual tamaño) no se mejora el costo • Con alta probabilidad ejemplares muy costosos(algoritmo determinista) se resuelven más rápidamente • Al contrario,ejemplares resueltos rápidamente se demoran más
Algoritmos probabilistas Algoritmos tipo Las Vegas • Tipo a, se les conoce como algoritmos sherwood • Implementación de la búsqueda binaria aleatoria • Function BBinaria(L,R:index;x:item):index; • Var k:index; • IF L>=R then • IF a[R]=x then • RETURN i • ELSE RETURN -1 • ELSE • BEGIN • k:=uniforme_entero(L,R) • IF x<=a[k] then • return BBinaria(L,k) • ELSE • return BBinaria(k+1,R) • END • END
Algoritmos probabilistas Algoritmos tipo Las Vegas • Tipo b, algoritmos que a veces no dan respuesta • Son aceptables si fallan con probabilidad baja • Si fallan se vuelven a ejecutar con la misma entrada • Resuelven problemas para los que no existen algoritmos deterministas eficientes (ejemplo:factorización de números grandes) • Sea LV un algoritmo las vegas genérico y p(x) la probabilidad de éxito para una entrada x • Si repetimos el algoritmo: la probabilidad de encontrar la solución después de k iteraciones es funcion LV(x:tpx, sal s:tsolucion):booleano Inicio ........ devuelve verdad si alcanza solución devuelve falso si no alcanza solución fin
Algoritmos probabilistas Algoritmos tipo Las Vegas • Las Vegas iterativo • Los algoritmos greedy se pueden convertir en algoritmos las vegas seleccionando aleatoriamente de la lista de candidatos. Por ejemplo seleccionar un % de los mejores la lista de candidatos. • Se puede por ejemplo dejar al azar la solución del problema de las 8 reinas, puede fallar, pero se da cuenta. Ejercicios, hacer algoritmo probabilista para el problema de las 8 reinas. funcion repe_LV(x:tpx):tpsolucion variables s: tpsolucion;éxito:boolean inicio repetir éxito:=LV(x,s) gasta exito devuelve s fin