Хорошо, прежде чем мы углубимся в это, давайте рассмотрим немного теории. То, как вы измеряете время, необходимое для выполнения определенного фрагмента кода, математически обозначается через нотацию O(n)
(нотация big-o), где n
- это размер ввода.
Ваша тестовая функция простого числа имеет нечто, называемое linear complexity
, что означает, что она станет линейно медленной, когда размер n
(в данном случае ввод вашего числа) станет большим.
Для числа 15
контекст выполнения выглядит следующим образом:
15 % 2 == 0 (FALSE)
15 % 3 == 0 (TRUE)
...
15 % 14 == 0 (FALSE)
Это означает, что для числа 100
будет 98 (2 - 99) шагов. И это будет расти со временем. Давайте учтем ваш номер: 600851475143
. Программа выполнит 600851475143
; for-loop
будет срабатывать 600,851,475,141
раз.
Теперь давайте рассмотрим тактовый цикл. Скажем, каждая инструкция занимает 1 clock cycle
, а тупая версия вашего цикла занимает 2, число 600851475143
будет выполнено 1,201,702,950,286
раз. Учтите, что каждый тактовый цикл занимает 0.0000000625
секунды (для 16-МГц платформы, такой как Arduino ), время, затрачиваемое только на этот код:
0.0000000625 * 1201702950286 = ~75,106 seconds
или около 20 hours
.
Вы видите, куда я иду с этим.
Лучше всего, чтобы эта программа работала быстрее - использовать вероятностный тест и подтвердить свои результаты, используя этот номер (или его вариант BigInteger).
Ваш подход является более линейным, в том смысле, что число итераций для for-loop
для проверки простоты увеличивается с увеличением числа. Вы можете отобразить время цикла процессора вместе с числом, и вы поймете, что это довольно неэффективный способ сделать это.
У меня есть дискретная математика в моем Uni, так что просто слово предупреждения - тесты на первичность и их варианты становятся действительно грязными, когда вы попадаете в утопию более быстрых и более быстрых тестов. Это путь, заполненный шипами математики, и вы должны иметь ремень безопасности при езде по джунглям! ;)
Если вам нужна дополнительная информация по этому вопросу, я был бы рад помочь! Я надеюсь, что это помогло! :)