Existe-t-il des algorithmes efficaces pour vérifier si une liste d'entiers est coprime par paire, ou un algorithme plus général serait-il la meilleure option disponible?
Existe-t-il des algorithmes efficaces pour vérifier si une liste d'entiers est coprime par paire, ou un algorithme plus général serait-il la meilleure option disponible?
Réponses:
Tout d'abord, deux faits sur les entiers premiers:
Il en résulte qu'un ensemble d'entiers distincts est un coprime par paire si son produit est égal à son multiple le moins commun.
Vous pouvez calculer le multiple le moins commun en utilisant l'identité suivante:
En supposant que vous ayez numéros avec chiffres chacun, et multiplier / diviser / modifier deux nombres est (qui peut ou non être une bonne hypothèse selon votre modèle), alors:
Ainsi, la complexité temporelle de l'ensemble de l'algorithme est .
Oui. L'approche naïve de la vérification de chaque paire de nombres prend du temps quadratique, mais il existe des algorithmes plus efficaces. Il existe un algorithme de temps presque linéaire, décrit dans l'article suivant:
Daniel J. Bernstein. Factorisation des coprimes en temps essentiellement linéaire . Journal of Algorithms 54 (2005), 1--30.
Voir également https://cstheory.stackexchange.com/q/3393/5038 . C'est presque aussi efficace que vous pourriez l'espérer.
Pour clarifier comment cela aide à votre situation, une fois que vous avez trouvé une base de coprime et factorisé chaque élément sur la base, il est trivial de vérifier s'ils sont coprime par paire: s'ils ne sont pas coprime par paire, alors une paire aura un commun facteur, et ce sera un facteur qui est dans la base du coprime et qui est présent dans la factorisation des deux. S'il n'y a aucun facteur commun à présenter dans la factorisation de deux nombres ou plus, alors vous savez que les nombres sont des nombres premiers par paire. Une fois que vous avez les factorisations, il est facile de vérifier en temps linéaire s'il y a des nombres dans plus d'une factorisation.
Factoring over a coprime base
rapporte à checking if a list of integers is pairwise coprime
.
Trouvez les facteurs premiers de chaque nombre. Les nombres sont tous des nombres premiers par paire si et seulement si chaque nombre premier de la collection entière est distinct. Cette vérification peut être effectuée en temps O (n) à l'aide d'une table de hachage.
Edit: la réponse de Draconis est meilleure, car elle ne nécessite aucune factorisation. Le calcul GCD est plus rapide si vos nombres sont grands et / ou premiers.