Найменш поширений нероздільник може бути таким же великим, як N log C, але якщо N чисел розподілено випадковим чином, то найменший звичайний нероздільник, ймовірно, набагато менший, можливо, набагато менше, ніж N. Я буду будувати таблиці, з яких прайми - це дільники, числа яких.
На кожне просте число p у нас є індекс який означає, що всі числа до цього індексу були перевірені на подільність на p, і у нас є список усіх тих чисел, на які ділилися.kp
Тоді для d = 2, 3, 4, ... ми намагаємось знайти число, що ділиться на d, або показуємо, що його немає. Беремо найбільший простий коефіцієнт p d. Потім перевіряємо всі числа, які були ділими на p, чи вони також діляться на d. Якщо жодного не знайдено, ми перевіряємо подальші числа з індексами> на подільність на p, оновлення та список чисел, що ділиться на p, і перевіряємо, чи кожне число ділиться на d.kpkp
Щоб перевірити, чи є число, розділене на p, ми перевіряємо середні p числа. Пізніше, якщо ми перевіримо, чи є число, яке ділиться на 2p, є 50% шансів, що нам потрібно перевірити лише одне число (те, яке ділиться на p), і 50% шанс перевірити в середньому на 2p більше чисел. Знайти число, що ділиться на 3p, цілком ймовірно, швидко і так далі, і ми ніколи не перевіряємо більше, ніж N чисел на подільність на p, оскільки є лише N числа.
Я би сподівався, що це вийде з приблизно перевірок на роздільність.N2/logN
PS. Наскільки великим був би результат для випадкових чисел?
Припустимо, у мене є N випадкових чисел. Ймовірність того, що одне з N чисел ділиться на d, дорівнює 1 - (1 - 1 / d) ^ N. Я припускаю, що ймовірність того, що кожне з чисел 1 ≤ d ≤ k є коефіцієнтом одного з випадкових чисел, обчислюється шляхом множення цих ймовірностей (Ок, це трохи хиткий характер, оскільки ці ймовірності, ймовірно, не зовсім незалежні).
З таким припущенням, що при N = 1000 є 50% шансів, що одне з чисел 1..244 не розділить жодне число, а одне на мільярд, що кожне число до 507 ділить одне з чисел. З N = 10000 є 50% шансів, що одне з чисел 1..1726 не розділить жодне число, і одне на мільярд, що кожне число до 2979 ділить одне з чисел.
Я б запропонував, що для N випадкових входів розмір результату трохи більший, ніж N / ln N; можливо щось на кшталт N / ln N * (ln ln N) ^ 2. Ось чому:
Імовірність того, що щонайменше один з N випадкових чисел діляться на випадковий д становить . Якщо d - навколо N, то - приблизно 1 - exp (-1) ≈ 0,6321. Це для одного дільника; ймовірність того, що кожне з декількох чисел d ≈ N є дільником принаймні одного з N чисел, досить тонкі, тому максимальне d буде значно меншим за N.1−(1−1/d)N1−(1−1/d)N
Якщо d << N, то .1−(1−1/d)N≈1−exp(−N/d)
Якщо d ≈ N / N , то пер .1−exp(−N/d)≈1−exp(−lnN)=1−1/N
Ми б додали ці ймовірності приблизно для N / ln N значень d, але для більшості d результат буде значно більшим, тому найбільший d буде якось більшим, ніж N / ln N, але значно менший за N.
PS. Пошук числа, що ділиться на d:
Вибираємо найбільший простий коефіцієнт p d, а потім спочатку вивчаємо числа, які, як відомо, ділилися на p. Скажіть d = kp. Тоді ми в середньому перевіряємо лише k числа, які поділяються на p, перевіряючи цей конкретний d, і перевіряємо не більше всіх N значень на подільність на p загалом, для всіх d ділимо на p. Власне, ми, швидше за все, перевіряємо менше N значень для більшості простих ліній p, оскільки після перевірки всіх N значень алгоритм, швидше за все, закінчується. Отже, якщо результат R, то я очікую, що менше N значень ділиться на кожне просте менше, ніж R. Якщо припустимо, R ≤ N, це приблизно N ^ 2 / log N перевірок.
PS. Запуск деяких тестів
Я кілька разів запускав цей алгоритм з N = 1 000 000 випадкових чисел> 0. Найменше поширений нероздільник був між 68 000 і 128 000, при цьому переважна більшість пробігів становить від 100 000 до 120 000. Кількість підрозділів становила від 520 до 1800 мільйонів, що набагато менше (N / ln N) ^ 2; більшість випадків використовували між 1000 і 1500 мільйонами підрозділів.