Esistono algoritmi efficienti per verificare se un elenco di numeri interi è coprime a coppie o un algoritmo più generale sarebbe l'opzione migliore disponibile?
Esistono algoritmi efficienti per verificare se un elenco di numeri interi è coprime a coppie o un algoritmo più generale sarebbe l'opzione migliore disponibile?
Risposte:
Innanzitutto, due fatti sugli interi coprimi:
Ne consegue che un insieme di interi distinti è coprime a coppie se il suo prodotto è uguale al suo minimo comune multiplo.
È possibile calcolare il minimo comune multiplo utilizzando la seguente identità:
Supponendo che tu abbia numeri con cifre ciascuna e moltiplicare / dividere / modificare due numeri è (che può essere o meno un buon presupposto a seconda del modello), quindi:
Pertanto, la complessità temporale dell'intero algoritmo è .
Sì. L'approccio ingenuo di controllare ogni coppia di numeri richiede un tempo quadratico, ma esistono algoritmi più efficienti. Esiste un algoritmo temporale quasi lineare, descritto nel seguente documento:
Daniel J. Bernstein. Factoring in coprimes in un tempo essenzialmente lineare . Journal of Algorithms 54 (2005), 1--30.
Vedi anche https://cstheory.stackexchange.com/q/3393/5038 . È quasi efficiente come si potrebbe sperare.
Per chiarire come questo aiuta con la tua situazione, una volta trovata una base coprime e fattorizzato ogni elemento sulla base, è banale verificare se sono coprime a coppie: se non sono coprime a coppie, allora alcune coppie avranno un comune fattore, e questo sarà un fattore che è nella base coprime e che è presente nella fattorizzazione di entrambi. Se non è presente alcun fattore comune nella fattorizzazione di due o più numeri, allora i numeri sono coprimi a coppie. Una volta che hai le fattorizzazioni, è facile controllare in tempo lineare se ci sono numeri in più di una fattorizzazione.
Factoring over a coprime base
relaziona checking if a list of integers is pairwise coprime
(ancora).
Trova i fattori primi di ciascun numero. I numeri sono tutti coprimi a coppie se e solo se ogni numero primo nell'intera raccolta è distinto. Questo controllo può essere eseguito in O (n) tempo usando una tabella hash.
Modifica: la risposta di Draconis è comunque migliore, perché non richiede alcuna fattorizzazione. Il calcolo GCD è più veloce se i tuoi numeri sono grandi e / o primi.