Considere el siguiente problema:
Sea un subconjunto finito de los números naturales.
Deje | donde es el máximo común divisor de eg c d ( s i , s j ) s i , s j ∈ S , s i ≠ s j } g c d ( x , y ) x y
Encontrar el elemento máximo de .
Este problema se puede resolver tomando el divisor común más grande de cada par usando el algoritmo de Euclides y haciendo un seguimiento del más grande.
¿Hay una manera más eficiente de resolver esto?
3
Es posible que desee consultar la Sección 3.3 de Minería de Ps y Q: detección de claves débiles generalizadas en dispositivos de red (Heninger et al, Usenix Security 2012). Describen un algoritmo para calcular los gcd de pares en gcd de , en una determinada configuración, utilizando árboles de productos y árboles restantes. Sin embargo, no sé si se extiende a su problema.
—
DW
¿Has probado algo con factorizaciones primas?
—
Ryan
Supongamos que todos los números son relativamente primos pero difíciles de factorizar (por ejemplo, cada es igual a p i q i para primos distintos grandes p i , q i ). Entonces parece difícil evitar verificar todos los GCD por pares. (Digamos que te digo que después de verificar todos los pares pero ( s n - 1 , s n ) que todos los GCD por pares son 1. ¿Cómo puedes adivinar g c d ( s n - 1 , s n ) sin calcularlo?)
—
usul
El enlace de @usul DW es exactamente ese problema. Un gran número, digamos mil millones, de claves de cifrado deberían ser productos de dos primos distintos. Pero sospechamos que algunas claves de cifrado tienen un factor primo en común (que sería el mcd de ambas claves, lo que facilita su factorización). Ese algoritmo le permite encontrar las claves con factor común sin calcular n (n-1) / 2 mcd para n = 1 billón.
—
gnasher729