¿Existen algoritmos eficientes para verificar si una lista de enteros es coprime por pares, o sería un algoritmo más general la mejor opción disponible?
algorithms
primes
usuario2782067
fuente
fuente
Respuestas:
Primero, dos hechos sobre enteros coprimos:
De esto se deduce que un conjunto de enteros distintos es coprimo en pares si su producto es igual a su mínimo común múltiplo.{a,b,⋯z}
Puede calcular el mínimo común múltiplo utilizando la siguiente identidad:
Suponiendo que tiene números con dígitos cada uno, y multiplicando / dividiendo / modificando dos números es (que puede ser o no una buena suposición dependiendo de su modelo), entonces:n k O(1)
Por lo tanto, la complejidad temporal de todo el algoritmo es .O(nk)
fuente
Si. El enfoque ingenuo de verificar cada par de números lleva tiempo cuadrático, pero hay algoritmos más eficientes. Existe un algoritmo de tiempo casi lineal, descrito en el siguiente documento:
Daniel J. Bernstein. Factorizando en coprimos en un tiempo esencialmente lineal . Journal of Algorithms 54 (2005), 1--30.
Consulte también https://cstheory.stackexchange.com/q/3393/5038 . Eso es casi tan eficiente como podrías esperar.
Para aclarar cómo esto ayuda con su situación, una vez que haya encontrado una base coprime y haya factorizado cada elemento sobre la base, es trivial verificar si son coprime por pares: si no son coprime por pares, algún par tendrá un común factor, y ese será un factor que está en la base coprime y que está presente en la factorización de ambos. Si no hay un factor común en la factorización de dos o más números, entonces sabrá que los números son coprimos por pares. Una vez que tenga las factorizaciones, es fácil verificar en tiempo lineal si hay números en más de una factorización.
fuente
Factoring over a coprime base
relaciona conchecking if a list of integers is pairwise coprime
(todavía).Encuentra los factores primos de cada número. Todos los números son primos pares por pares si y solo si cada primo en toda la colección es distinto. Esta verificación se puede hacer en tiempo O (n) usando una tabla hash.
Editar: la respuesta de Draconis es mejor, porque no requiere ninguna factorización. El cálculo de GCD es más rápido si sus números son grandes y / o primos.
fuente