miércoles, 29 de marzo de 2017

Algoritmos

algoritmos de factorización por enteros

 método de factorización con fracciones continuas (CFRAC del inglés Continued Fraction Factorization Method ) es un algoritmo de factorización de enteros. Es un algoritmo de propósito general, lo que significa que es apropiado para factorizar cualquier entero n, no dependiente de una forma espacial o de propiedades. Fue descrito por D. H. Lehmer y R. E. Powers en 1931,1 y desarrollado como un algoritmo de computadora por Michael A. Morrison y John Brillhart en 1975.2
El método de fracciones continuas está basado sobre el método de factorización de Dixon. Este usa convergentes en las expansiones de fracciones continuas regulares de
.
Puesto que es un irracional cuadrático, la fracción continua debe de ser periódica (a no ser que n sea un cuadrado, en cuyo caso la factorización es obvia).
Este tiene un tiempo de complejidad , en las notaciones O y L repectivamente.









factorización de curva elíptica de Lenstra o método de factorización de curva elíptica ( del inglés elliptic curve factorization methodECM) es un rápido algoritmo de tiempo de ejecución sub-exponencial para la factorización de enteros que emplea curvas elípticas. Para una factorización de propósito general, ECM es el tercer método más rápido conocido de factorización. El segundo más rápido es la criba cuadrática de múltiples polinomios y el más rápido es la criba general del cuerpo de números. La factorización de curva elíptica de Lenstra es llamada así en honor a Hendrik Lenstra.
En la práctica, ECM es considerado un algoritmo de factorización de propósito especial así como el más adecuado para encontrar factores pequeños. A fecha de 2012, es todavía el mejor algoritmo para divisores que no superen los 20 a 25 dígitos decimales (64 a 83 bits respectivamente), así como su tiempo de ejecución está dominado por el tamaño del factor más pequeño p en lugar de por el tamaño del número n a ser factorizado. Frecuentemente, ECM se usa para eliminar factores pequeños de un entero muy grande con muchos factores; si el entero resultante todavía es compuesto, entonces solo tiene factores grandes y es factorizado mediante el uso de técnicas de propósito general. El factor más grande encontrado usando ECM cuenta con 75 dígitos y fue descubierto el 2 de agosto de 2012 por Samuel Wagstaff.1 Incrementando el número de curvas probadas se mejoran las posibilidades de encontrar un factor, pero no son lineales con el incremento en el número de dígitos.










 factorización de formas cuadradas de Shanks es un método para factorizar enteros inventado por Daniel Shanks como una mejora del método de factorización de Fermat.
El éxito del método depende de encontrar números enteros  e  tales que , donde  es el entero a ser factorizado. Una mejora (indicada por Kraitchik) es buscar enteros  e  tales que . Encontrando un par adecuado  no se garantiza una factorización de , pero esto implica que  es un factor de , y hay una buena posibilidad de que los divisores primos de  estén distribuidos entre esos dos factores, así que el cálculo del máximo común divisor de  y  dará un factor no trivial de .
Un algoritmo práctico para encontrar pares  que satisfagan  fue desarrollado por Shanks, que lo llamó Factorización de formas cuadradas (en inglés Square Forms Factorization o SQUFOF). El algoritmo puede ser expresado en términos de fracciones continuas, o en términos de formas cuadráticas. A pesar de que ahora existen métodos de factorización más eficientes disponibles, SQUFOF tiene la ventaja de que es lo suficientemente pequeño para ser implementado en una calculadora programable.










método de factorización de Dixon (conocido también como método de los cuadrados aleatorios de Dixon1 o algoritmo de Dixon) es un algoritmo general de factorización de enteros; es el método prototípico de base de factores, y el único método de este tipo para el cual los límites de ejecución no se basan en conjeturas sobre las propiedades de suavidad de los valores de un polinomio conocido.

Historia del algoritmo

Las ideas de este algoritmo provienen de Maurice Kraitchik, quien en la década de 1920 generalizó un famoso método debido a Pierre de Fermat2 (que funciona bien cuando los factores son cercanos). D. H. Lehmer y R. E. Powers sugirieron una idea parecida en un artículo publicado en 1931,3 utilizando fracciones continuas.
John Brillhart y Michael Morrison en 19754 muestran cómo mejorar el algoritmo utilizando el álgebra lineal sobre  (el cuerpo con dos elementos). John D. Dixon muestra la eficiencia del algoritmo en un artículo publicado en 1981.5
El algoritmo de criba cuadrática, debido a Carl Pomerance,6 utiliza ideas similares a las de este método.

Ideas matemáticas sobre las que se basa

Si  es primo y , entonces la ecuación  tiene dos soluciones distintas: .
Sin embargo, si  es compuesto y no es la potencia de un primo, la ecuación  tiene más soluciones; estas soluciones vienen de la factorización de  como producto de dos enteros coprimos entre sí. Si  con  coprimos entonces tomando  tal que  y  (esto se puede hacer gracias al Teorema chino del resto) encontramos una solución a  que es distinta de  y .
Recíprocamente, si  verifica  y , entonces  no es coprimo con  ni múltiplo de él.
La idea básica del algoritmo es intentar encontrar dos enteros  tales que  y , con lo que  será un divisor de  no trivial. Buscar al azar estos enteros lleva mucho tiempo y no hace eficaz el método. Lo que se hace para tener más probabilidad de "colisión" es tomar enteros cuyos cuadrados tengan factores primos pequeños.
Más concretamente: tomamos una "base de factores"  formada por enteros pequeños y buscamos  tales que , . . . , . Luego escogemos  de forma que , con cada uno de los  par.
Dadas las k-uplas , . . . , , encontrar  tales que  sea un producto de elementos de  al cuadrado no es otra cosa que obtener una combinación lineal de las k-uplas que sea la nula módulo 2. O sea que es un problema de álgebra lineal en , que puede resolverse en forma rápida.

El método

Sea  el entero compuesto que deseamos factorizar.
Tomamos  una cota, llamemos  al conjunto de los primos menores o iguales que  unión el -1.
Inicialmente, buscamos enteros  tales que  se pueda escribir como producto de elementos de .
Supongamos que hemos encontrado suficientes de estos números (suficientes en general significa poco más que el cardinal de ): . Utilizamos el álgebra lineal (como se describe en la sección anterior) para encontrar un producto  que módulo n es el cuadrado de un producto de elementos de .
O sea, hemos obtenido , o, escribiéndolo de otra manera: . Por lo tanto, el máximo común divisor entre  y  será distinto de 1 y  siempre que .
En caso que  se busca otra combinación lineal que nos dé un producto de cuadrados de elementos de .

Ejemplo

Sea . Tomamos , por lo que .
Encontramos varios enteros cuyos cuadrados son factorizados (módulo ) sobre :
.
Tenemos las 4-uplas: (0,2,1,1), (1,0,1,0), (1,0,1,1), (0,0,1,0) y (1,0,2,1); estos son los exponentes de la factorización de los cuadrados como productos de elementos de . Al tener 5 4-uplas, debe haber una que sea combinación de las otras (módulo 2); o lo que es lo mismo, una suma de estas 4-uplas tendrá todas sus entradas pares.
De hecho, la suma de las primeras cuatro da (2,2,4,2). Esto quiere decir que al multiplicar los primeros cuatro números, su cuadrado será  (módulo n). O sea que .
Reducimos: . Esta combinación hallada no nos da ningún factor, ya que .
Buscamos otra suma que nos dé con entradas pares: las tres últimas. Obtenemos de allí que , o lo que es lo mismo: . De aquí sí sacamos un factor no trivial de .

Tiempo de ejecución

Si en el algoritmo escogemos un  pequeño entonces es fácil saber si un entero se factoriza sobre , pero es difícil encontrar naturales cuyo cuadrado sea producto de elementos de . A la inversa, si  es grande será sencillo encontrar naturales cuyo cuadrado sea producto de elementos de  pero complicado saber si un entero se factoriza sobre .
La clave para optimizar este método es escoger el valor adecuado de . Puede probarse que si  tiene  dígitos es bueno tomar  con aproximadamente  dígitos. Esto hace que el tiempo de ejecución del algoritmo tenga un orden  para cierta constante .7 Dixon mostró que podía tomar , pero Schnorr y Knuth lograron mejorar la prueba, asegurando que 

No hay comentarios:

Publicar un comentario