Existem algoritmos eficientes para verificar se uma lista de números inteiros é coprime em pares, ou um algoritmo mais geral seria a melhor opção disponível?
Existem algoritmos eficientes para verificar se uma lista de números inteiros é coprime em pares, ou um algoritmo mais geral seria a melhor opção disponível?
Respostas:
Primeiro, dois fatos sobre números inteiros de coprime:
Daqui resulta que um conjunto de números inteiros distintos é coprime em pares se seu produto for igual ao seu múltiplo menos comum.
Você pode calcular o múltiplo menos comum usando a seguinte identidade:
Supondo que você tenha números com dígitos cada e multiplicando / dividindo / modificando dois números seja (que pode ou não ser uma boa suposição, dependendo do seu modelo), então:
Assim, a complexidade do tempo de todo o algoritmo é .
Sim. A abordagem ingênua de verificar cada par de números leva tempo quadrático, mas existem algoritmos mais eficientes. Existe um algoritmo de tempo quase linear, descrito no artigo a seguir:
Daniel J. Bernstein. Factoring em coprimes em tempo essencialmente linear . Jornal de Algoritmos 54 (2005), 1--30.
Consulte também https://cstheory.stackexchange.com/q/3393/5038 . Isso é quase tão eficiente quanto você poderia esperar.
Para esclarecer como isso ajuda na sua situação, uma vez que você encontrou uma base de coprime e fatorou cada elemento sobre a base, é trivial verificar se eles são coprimes em pares: se eles não são coprimes em pares, alguns pares terão um fator, e esse será um fator que está na base do coprime e que está presente na fatoração de ambos. Se não houver um fator comum na fatoração de dois ou mais números, você sabe que os números são coprime em pares. Depois de ter as fatorações, é fácil verificar em tempo linear se existem números em mais de uma fatoração.
Factoring over a coprime base
se relaciona com checking if a list of integers is pairwise coprime
(ainda).
Encontre os fatores primos de cada número. Os números são coprime em pares, se e somente se todos os primos de toda a coleção forem distintos. Essa verificação pode ser feita em O (n) tempo usando uma tabela de hash.
Edit: A resposta de Draconis é melhor, porque não exige nenhuma fatoração. O cálculo do GCD é mais rápido se seus números forem grandes e / ou primos.