MCD de un par de productos

8

Tengo dos números, que son el producto de una gran cantidad de números más pequeños que conozco. Quiero encontrar el MCD (Máximo común divisor) de estos dos números. ¿Hay alguna forma de utilizar la factorización parcial que tengo para acelerar el proceso?

En particular, cada número mayor es el producto de números más pequeños, cada uno del orden de . No sé nada sobre la factorización de los números más pequeños.21524000

Editar: Si bien los números de entrada son de aproximadamente 120,000,000 bits, el GCD es de aproximadamente 500,000 bits. Los factores de los números están en particular en secuencia. Todos son enteros en un rango consecutivo.

Todos los algoritmos GCD que he visto hacen uso de los números directamente, no en una forma factorizada ni nada. ¿Hay algún algoritmo que pueda incorporar esta información para acelerar las cosas?

isaacg
fuente
Entonces, para ser claros, ¿sus productos tienen algo así como 130,000,000 bits? Tengo curiosidad por saber por qué quieres encontrar MCD de números de esa magnitud.
David Richerby
@DavidRicherby Eso es correcto. Estoy probando formas de resolver el problema aproximado de GCD, que es un problema criptográfico sobre el cual la gente ha creado sistemas criptográficos. Resolver problemas GCD realmente enormes es una forma de resolver problemas GCD aproximados de tamaño razonable.
isaacg
1
Posiblemente relacionado: cs.stackexchange.com/q/75387/755 , cs.stackexchange.com/q/28044/755 , factorable.net/weakkeys12.extended.pdf , cr.yp.to/factorization/smoothparts-20040510.pdf , cr.yp.to/smallfactors.html , cr.yp.to/lineartime/dcba-20040404.pdf . Asintóticamente, puede calcular los mcd en tiempo casi lineal, por lo que no hay mucho espacio para acelerar si nos preocupamos solo por los asintóticos, aunque puede haber en la práctica, ya que los asintóticos pueden ser engañosos debido a las constantes involucradas.
DW
@DW Actualmente estoy usando el algoritmo GCD casi lineal de GMP.
isaacg 01 de

Respuestas:

1

Puede calcular los GCD por pares de los factores. Debe dividir los MCD de los factores para evitar encontrar el mismo factor MCD dos veces:

a[1...m] = [given factors of A]
b[1...n] = [given factors of B]
g = 1
for i from 1 to m do
    c = a[i]
    for j from 1 to n do
        d = gcd(c, b[j])
        g = g * d
        c = a[i] / d
        b[j] = b[j] / d
return g

Desafortunadamente, no creo que esto no sea notablemente más rápido que el cálculo del MCD de los dos números A y B.

clemens
fuente
0

Hubo un problema similar que se resolvió de manera razonablemente eficiente: suponga que está utilizando RSA, que se basa en productos de dos primos grandes, donde los productos no se pueden factorizar en un tiempo razonable. Pero si tiene dos productos, pq y p'q 'y p = p' o q = q ', puede calcular su mcd y obtener p = p' o q = q 'y el otro factor es trivial. Por supuesto, si p = p 'y también q = q', entonces esto no es de ayuda.

No imagine que alguien genera mil millones de esos productos y es un poco descuidado. Un hacker descubre que bastantes números son idénticos, por lo que p = p 'y q = q', por lo que es una buena suposición de que bastantes pares tienen un mcd ≠ 1. Y eso ha sucedido en la vida real con enrutadores cuyo cifrado podría ser agrietado como resultado.

Lo siento, no tengo ninguna referencia y la historia es un poco antigua, pero deberías poder encontrarla. Fue hace unos años, tal vez seis más o menos.

gnasher729
fuente
Desafortunadamente, ninguno de los factores de los dos números es igual, por lo que no puedo eliminarlos de esa manera.
isaacg