Редактировать: Я надеюсь, что это не звучит невероятно снисходительно, как ответ. Я просто хотел проиллюстрировать это с точки зрения компьютера, вы должны проверить все возможные числа, которые могут быть факторами X, чтобы убедиться, что это просто. Компьютеры не знают, что это композит, просто глядя на него, поэтому вам нужно итерации
Пример: Является ли X простым числом?
Для случая, когда X = 67:
Как вы это проверить?
I divide it by 2... it has a remainder of 1 (this also tells us that 67 is an odd number)
I divide it by 3... it has a remainder of 1
I divide it by 4... it has a remainder of 3
I divide it by 5... it has a remainder of 2
I divide it by 6... it has a remainder of 1
Фактически, вы получите только остаток от 0, если число не является простым.
Вам нужно проверить каждое число меньше X, чтобы убедиться, что оно простое? Неа. Не больше, благодаря математике (!)
Давайте посмотрим на меньшем количестве, как 16
16 не является простым.
Почему? потому что
2*8 = 16
4*4 = 16
Таким образом, 16 равномерно делится более чем на 1 и на себя. (Хотя «1» технически не является простым числом, но это технические детали, и я отвлекся)
Таким образом, мы разделим 16 на 1 ... конечно это работает, это работает для каждого номера
Divide 16 by 2... we get a remainder of 0 (8*2)
Divide 16 by 3... we get a remainder of 1
Divide 16 by 4... we get a remainder of 0 (4*4)
Divide 16 by 5... we get a remainder of 1
Divide 16 by 6... we get a remainder of 4
Divide 16 by 7... we get a remainder of 2
Divide 16 by 8... we get a remainder of 0 (8*2)
Нам действительно нужен только один остаток от 0, чтобы сказать, что он композитный (противоположность «prime» является «составным»).
Проверяется 16 делится на 2 это то же самое, как проверка, если он делится на 8, потому что 2 и 8 умножить, чтобы дать вам 16.
Нам нужно только проверить часть спектра (от 2 до квадратного корня X), потому что наибольшее число, которое мы можем умножить, это sqrt (X), иначе мы используем меньшие числа, чтобы получить избыточные ответы.
Есть 17 премьер?
17 % 2 = 1
17 % 3 = 2
17 % 4 = 1 <--| approximately the square root of 17 [4.123...]
17 % 5 = 2 <--|
17 % 6 = 5
17 % 7 = 3
Результаты после SQRT (X), как 17 % 7
и так далее, являются избыточными, поскольку они обязательно должны умножаться с чем-то меньшим, чем SQRT (X) с получением X.
То есть,
а * в = Х
если а и в оба больше, чем SQRT (X), а затем
A * B даст число, которое больше, чем X.
Таким образом, один из A или B должен быть меньше, чем sqrt (X), и избыточно проверять оба этих значения, поскольку вам нужно только знать, разделяет ли один из них X равномерно (четное деление дает вам другое значение в качестве ответа)
Я надеюсь, что это поможет.
Редактирование: Есть более сложные методы проверки примитивности, и Java имеет встроенное «это число, вероятно, простое» или «это число, безусловно, сложный» метод в BigInteger class, как я недавно узнал через другой ответ SO:]
Какие ошибки вы получаете? и в каких строках вы получаете ошибки? – 2010-11-25 02:56:35
Ваш Prime метод всегда возвращает true, потому что `n% n == 0 && n% 1 == 0` для всех` n`. То есть все числа делятся сами по себе и 1. Вам не хватает «единственной» части определения. – 2010-11-25 02:59:37
К сожалению, вы даже не близко. Ваш алгоритм примитивности не работает, потому что все числа делятся сами по себе и нуль - это просто, что простые числа не делятся ничем другим, и вам нужно выполнить проверку для этого. Решетке Erasthones требуется 600 ГБ оперативной памяти для работы до значения в диапазоне 600B, поэтому рекурсивная простая факторизация является единственной практической стратегией и с большим проблемным пространством потребуются часы или дни. Это основа всего современного шифрования: простая факторизация выше размера ОЗУ очень медленная. – 2010-11-25 03:02:20