Il non divisore meno comune può essere grande quanto N log C, ma se i numeri N vengono distribuiti casualmente, il non divisore meno comune è probabilmente molto più piccolo, probabilmente molto meno di N. Costruirò tabelle di cui i numeri primi sono divisori di cui numeri.
Per ogni numero primo p abbiamo un indice che significa che tutti i numeri fino a quell'indice sono stati esaminati per divisibilità per p, e abbiamo un elenco di tutti quei numeri che erano divisibili per.kp
Quindi per d = 2, 3, 4, ... proviamo a trovare un numero divisibile per d, o mostriamo che non ce n'è nessuno. Prendiamo il più grande fattore primo p di d. Quindi controlliamo tutti i numeri che erano divisibili per p se sono anche divisibili per d. Se non ne viene trovato nessuno, controlliamo ulteriori numeri con indici> per divisibilità per p, aggiornando k p e l'elenco dei numeri divisibili per p, e verificando se ogni numero è divisibile per d.kpkp
Per verificare se esiste un numero divisibile per p, controlliamo la media dei numeri p. Successivamente, se controlliamo se esiste un numero divisibile per 2p, c'è una probabilità del 50% che dobbiamo controllare solo un numero (quello che è divisibile per p) e una probabilità del 50% per controllare in media 2p più numeri. Trovare un numero divisibile per 3p è molto probabilmente veloce e così via, e non controlliamo mai più di N numeri per divisibilità per p, perché ci sono solo N numeri.
Mi auguro che questo funziona con circa controlli divisibilità.N2/logN
PS. Quanto sarebbe grande il risultato per i numeri casuali?
Supponiamo che io abbia N numeri casuali. La probabilità che uno dei numeri N sia divisibile per d è 1 - (1 - 1 / d) ^ N. Suppongo che la probabilità che ciascuno dei numeri 1 ≤ d ≤ k sia un fattore di uno dei numeri casuali viene calcolato moltiplicando queste probabilità (Ok, è un po 'complicato, perché queste probabilità probabilmente non sono del tutto indipendenti).
Con questa ipotesi, con N = 1000, c'è una probabilità del 50% che uno dei numeri 1..244 non divida alcun numero e uno su un miliardo che ogni numero fino a 507 divide uno dei numeri. Con N = 10.000 c'è una probabilità del 50% che uno dei numeri 1..1726 non divida alcun numero e uno su un miliardo che ogni numero fino a 2979 divide uno dei numeri.
Suggerirei che per N input casuali, la dimensione del risultato è un po 'più grande di N / ln N; forse qualcosa come N / ln N * (ln ln N) ^ 2. Ecco perché:
La probabilità che almeno uno degli N numeri casuali è divisibile per un d casuale è . Se d è intorno a N, allora 1 - ( 1 - 1 / d ) N è circa 1 - exp (-1) ≈ 0.6321. Questo è per un singolo divisore; è probabile che ciascuno dei diversi numeri d ≈ N sia un divisore di almeno uno dei numeri N che è piuttosto sottile, quindi il massimo d sarà significativamente più piccolo di N.1−(1−1/d)N1−(1−1/d)N
Se d << N, quindi .1−(1−1/d)N≈1−exp(−N/d)
Se d ≈ N / ln N poi .1−exp(−N/d)≈1−exp(−lnN)=1−1/N
Aggiungeremo queste probabilità per circa N / ln N valori d, ma per la maggior parte d il risultato sarà significativamente più grande, quindi la più grande d sarà in qualche modo più grande di N / ln N ma significativamente più piccola di N.
PS. Trovare un numero divisibile per d:
Selezioniamo il più grande fattore primo p di d, quindi esaminiamo prima i numeri che erano già noti per essere divisibili per p. Dì d = kp. Quindi in media controlliamo solo k numeri che sono divisibili per p mentre controlliamo questo particolare d, e controlliamo al massimo tutti i valori N per la divisibilità per p complessivo, per tutti i d divisibili per p. In realtà, molto probabilmente controlliamo meno di N valori per la maggior parte dei numeri primi p, perché dopo aver controllato tutti i valori N l'algoritmo probabilmente finisce. Quindi, se il risultato è R, allora mi aspetto che meno di N valori vengano divisi per ciascun numero primo minore di R. Supponendo R ≤ N, si tratta di N ^ 2 / log N checks.
PS. Esecuzione di alcuni test
Ho eseguito questo algoritmo alcune volte con N = 1.000.000 di numeri casuali> 0. Il non divisore meno comune era tra 68.000 e 128.000 con la stragrande maggioranza delle corse tra 100.000 e 120.000. Il numero di divisioni era compreso tra 520 milioni e 1800 milioni, che è molto inferiore a (N / ln N) ^ 2; la maggior parte dei casi utilizzava tra 1000 e 1500 milioni di divisioni.