Самые быстрые алгоритмы - это ситовые алгоритмы, основанные на тайных областях дискретной математики (по крайней мере, над моей головой), сложные для реализации и тестирования.
Простейшим алгоритмом факторинга, вероятно, (как уже говорили другие) является сито Эратосфена. Что нужно помнить, чтобы использовать это для вычисления числа N
:
- общая идея: вы проверяете возрастающую последовательность возможных целочисленных факторов
x
, чтобы посмотреть, делят ли они равномерно ваш номер кандидата N
(в C / Java / Javascript проверяют, N % x == 0
), в этом случае N равно не простое.
- вам просто нужно подняться до
sqrt(N)
, но на самом деле не рассчитывайте sqrt(N)
: цикл, пока ваш тестовый коэффициент x пройдет тест x*x<N
- если у вас есть память для сохранения нескольких предыдущих простых чисел, используйте только те из них, как тестовые коэффициенты (и не сохраняйте их, если простое P не пройдет тест
P*P > N_max
, поскольку вы никогда не будете использовать их снова
- Даже если вы не сохраняете предыдущие простые числа, для возможных факторов
x
просто отметьте 2 и все нечетные числа. Да, это займет больше времени, но не намного дольше для разумных размеров. функция подсчета простых чисел и ее приближения могут сказать, какая часть чисел проста; эта доля уменьшается очень медленно. Даже для 2 64 = приблизительно 1,8x10 19 примерно одно из каждых 43 чисел является простым (= одно из каждых 21,5 нечетных чисел является простым). Для факторов чисел меньше 2 64 эти факторы x
меньше 2 32 , где примерно один из каждых 20 чисел простое число = одно из каждых 10 нечетных чисел премьер. Так что вам придется тестировать в 10 раз больше чисел, но цикл должен быть немного быстрее, и вам не придется возиться с запоминанием всех этих простых чисел.
Существуют также некоторые более старые и более простые алгоритмы просеивания, которые немного более сложны, но все еще довольно понятны. См. Алгоритмы Диксона , Шенкса и Ферма . Однажды я прочитал статью об одном из них, не могу вспомнить, какой именно, но все они довольно просты и используют алгебраические свойства разностей квадратов.
Если вы просто проверяете, является ли число N
простым, и на самом деле вас не волнуют сами факторы, используйте вероятностный критерий простоты . Миллер-Рабин самый стандартный, я думаю.