En az ortak bölen olmayan N log C kadar büyük olabilir, ancak N sayıları rastgele dağıtılırsa, en az bölen olmayan bölen muhtemelen çok daha küçüktür, muhtemelen N'den çok daha azdır. asal sayılar hangi bölenlerdir.
Her asal sayı p için, bir endekse olan tüm sayıların p ile bölünebilirlik açısından incelendiği anlamına gelen bir indeksine sahibiz ve tarafından bölünebilen tüm sayıların bir listesine sahibiz.kp
Sonra d = 2, 3, 4, ... için d ile bölünebilir bir sayı bulmaya çalışırız veya hiç yok. D'nin en büyük asal çarpanını p alıyoruz. Sonra, p ile bölünebilen tüm sayıları d ile bölünüp bölünmediğini kontrol ederiz. Hiçbiri bulunamazsa, p ile bölünebilirlik, ve p ile bölünebilen sayıların listesi ve her sayının d ile bölünebilir olup olmadığını kontrol eden indeksler> olan diğer sayıları kontrol ederiz .kpkp
P ile bölünebilir bir sayı olup olmadığını kontrol etmek için ortalama p sayılarını kontrol ederiz. Daha sonra 2p ile bölünebilir bir sayı olup olmadığını kontrol edersek, sadece bir sayıyı (p ile bölünebilir olan) kontrol etme ihtiyacımız% 50 ve ortalama 2p daha fazla sayıyı kontrol etme şansımız% 50'dir. 3p ile bölünebilir bir sayı bulmak oldukça hızlıdır ve bu şekilde devam eder ve asla p ile bölünebilirlik için N'den fazla sayı kontrol etmeyiz, çünkü sadece N sayıları vardır.
Bu bölünebilirlik kontrolleri ile çalışır umuyoruz .N2/logN
PS. Rasgele sayılar için sonuç ne kadar büyük olurdu?
N rasgele sayım olduğunu varsayalım. N numaralarından birinin d ile bölünebilme olasılığı 1 - (1 - 1 / d) ^ N'dir. 1 ≤ d ≤ k sayılarının her birinin rastgele sayılardan birinin bir faktörü olması olasılığını varsayıyorum (bu olasılıkların oldukça bağımsız olmadığı için tamam, bu biraz tehlikeli değil).
Bu varsayımla, N = 1000 ile, 1..244 rakamlarından birinin herhangi bir rakamı bölmeme şansı% 50 ve 507'ye kadar olan her rakamın rakamlardan birini bölme milyarda bir şans vardır. N = 10.000 ile 1..1726 rakamlarından birinin herhangi bir rakamı bölmemesi ve 2979'a kadar olan her sayının rakamlardan birini bölmesi milyarda bir şans% 50'dir.
N rasgele girişler için, sonucun boyutunun N / ln N'den biraz daha büyük olmasını öneriyorum; belki N / ln N * (ln ln N) ^ 2 gibi bir şey olabilir. İşte nedeni:
N rasgele sayıdan en az birinin rasgele d ile bölünebilme olasılığı . D N civarındaysa, o zaman yaklaşık 1 - exp (-1) ≈ 0.6321'dir. Bu tek bir bölen için; d-N sayısının her birinin N sayısından en az birinin bölücü olması ihtimali oldukça incedir, bu nedenle maksimum d N'den önemli ölçüde küçük olacaktır.1−(1−1/d)N1−(1−1/d)N
D << N ise, .1−(1−1/d)N≈1−exp(−N/d)
D ≈ N / N ln sonra ise .1−exp(−N/d)≈1−exp(−lnN)=1−1/N
Bu olasılıkları yaklaşık N / ln N değerleri d için ekleriz, ancak çoğu d için sonuç önemli ölçüde daha büyük olacaktır, bu nedenle en büyük d, bir şekilde N / ln N'den daha büyük, ancak N'den önemli ölçüde daha küçük olacaktır.
PS. D ile bölünebilir bir sayı bulma:
D'nin en büyük asal faktörünü seçiyoruz ve sonra önce p ile bölünebilir olduğu bilinen sayıları inceliyoruz. D = kp deyin. Daha sonra ortalama olarak sadece bu belirli d'yi kontrol ederken p ile bölünebilen k sayılarını kontrol ederiz ve en fazla tüm N değerlerini p ile bölünebilirlik açısından, p ile bölünebilen tüm d için kontrol ederiz. Aslında, çoğu prim p için N değerinden daha azını kontrol ediyoruz, çünkü tüm N değerlerini kontrol ettikten sonra algoritma büyük olasılıkla sona erer. Sonuç R ise, o zaman N değerinin daha azının her bir asal değerin R'den daha az bölünmesini beklerim. R ≤ N varsayıldığında, bu N ^ 2 / log N kontrolleri ile ilgilidir.
PS. Bazı testleri çalıştırma
Bu algoritmayı birkaç kez N = 1.000.000 rasgele sayılar> 0 ile çalıştırdım. En az ortak bölen olmayan 68.000 ile 128.000 arasındaydı ve büyük çoğunluğu 100.000 ile 120.000 arasındaydı. Bölüm sayısı 520 milyon ile 1800 milyon arasındaydı ve bu da (N / ln N) ^ 2'den çok daha azdı; davaların çoğunluğu 1000 ile 1500 milyon arasında bölünmüştü.