Чтобы проверить, является ли число простым или нет, почему мы должны проверять, делится ли оно только до квадратного корня из этого числа?
algorithm
primes
primality-test
Сковорода
источник
источник
n = a*b
иa <= b
тогдаa*a <= a*b = n
.floor(sqrt(n))
.Ответы:
Если число
n
не является простым, он может быть разложен на два фактораa
иb
:Теперь
a
иb
не может быть больше, чем квадратный корень изn
, так как тогда продуктa * b
будет больше, чемsqrt(n) * sqrt(n) = n
. Таким образом, в любой факторизацииn
, по крайней мере, один из факторов должен быть меньше квадратного корня изn
, и если мы не можем найти какие-либо факторы, меньшие или равные квадратному корню,n
должны быть простые числа.источник
sqrt(n)
должно быть достаточно точно, чтобы это свойство сохранялось, учитывая, что мы используем числа с плавающей запятой.i * i <= n
вместо тогоi <= sqrt(n)
, чтобы избежать сложностей с числами с плавающей запятой.Скажем
m = sqrt(n)
тогдаm × m = n
. Теперь, еслиn
не простое число, тоn
можно записать какn = a × b
, такm × m = a × b
. Обратите внимание , чтоm
действительное число аn
,a
иb
натуральные числа.Сейчас может быть 3 случая:
Во всех 3 случаях
min(a, b) ≤ m
. Следовательно, если мы будем искать доm
, мы обязательно найдем хотя бы один факторn
, которого достаточно, чтобы показать, чтоn
он не прост.источник
n is not a prime
и докажем это, иначе это простое число.Потому что, если коэффициент больше, чем квадратный корень из n, другой фактор, который будет умножаться на него, равный n, обязательно меньше, чем квадратный корень из n.
источник
Более интуитивное объяснение будет:
Квадратный корень из 100 равен 10. Скажем, axb = 100, для различных пар a и b.
Если a == b, то они равны и являются квадратным корнем из 100, точно. Который 10.
Если один из них меньше 10, другой должен быть больше. Например, 5 x 20 == 100. Один больше 10, другой меньше 10.
Думая об оси, если один из них падает, другой должен увеличиться, чтобы компенсировать, поэтому продукт остается на уровне 100. Они вращаются вокруг квадратного корня.
Квадратный корень из 101 составляет около 10,049875621. Поэтому, если вы проверяете число 101 на простоту, вам нужно пробовать целые числа до 10, включая 10. Но сами по себе 8, 9 и 10 не являются простыми, поэтому вам нужно проверить только до 7, что премьер.
Потому что, если есть пара факторов с одним из чисел больше 10, другой из пары должен быть меньше 10. Если меньший не существует, не найден соответствующий больший фактор 101.
Если вы тестируете 121, квадратный корень равен 11. Вы должны проверить простые целые числа от 1 до 11 (включительно), чтобы убедиться, что они входят равномерно. 11 идет в 11 раз, поэтому 121 не простое число. Если бы вы остановились на 10 и не протестировали 11, вы бы пропустили 11.
Вы должны проверить каждое простое число больше 2, но меньше или равно квадратному корню, предполагая, что вы проверяете только нечетные числа.
`
источник
Предположим, что
n
это не простое число (больше 1). Так что есть цифрыa
иb
такие, чтоУмножив отношение
a<=b
наa
иb
получим:Поэтому: (обратите внимание, что
n=ab
)Отсюда: (обратите внимание, что
a
иb
положительны)Поэтому, если число (больше 1) не является простым, и мы проверяем делимость до квадратного корня из числа, мы найдем один из факторов.
источник
Давайте предположим, что данное целое число
N
не является простым,Тогда N можно разложить на два фактора
a
иb
,2 <= a, b < N
таких, чтоN = a*b
. Понятно, что они оба не могут быть больше, чемsqrt(N)
одновременно.Предположим без ограничения общности, что
a
меньше.Теперь, если вы не смогли найти какой-либо делитель
N
принадлежности в диапазоне[2, sqrt(N)]
, что это значит?Это означает, что
N
в[2, a]
качествеa <= sqrt(N)
.Следовательно,
a = 1
и,b = n
следовательно, по определениюN
является простым ....
Дальнейшее чтение, если вы не удовлетворены:
Многие различные комбинации
(a, b)
могут быть возможны. Допустим, они являются:(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ....., (a k , b k ). Не ограничивая общности, предположим, что I <Ь I ,
1<= i <=k
.Теперь, чтобы показать, что
N
это не простое число, достаточно показать, что ни одно из i не может быть разложено дальше. И мы также знаем, что а я <=sqrt(N)
и, следовательно, вам нужно проверить, доsqrt(N)
которого будет охватывать все я . И, следовательно, вы сможете сделать вывод, действительно лиN
является оно простым....
источник
Это все на самом деле просто базовое использование факторизации и квадратных корней.
Это может показаться абстрактным, но на самом деле это просто связано с тем фактом, что максимально возможный факториал не простого числа должен быть его квадратным корнем, потому что:
sqrroot(n) * sqrroot(n) = n
,Учитывая, что если любое целое число выше
1
и ниже или доsqrroot(n)
делится поровну наn
, тоn
не может быть простым числом.Пример псевдокода:
источник
guard
оператор в Swift в сочетании с этим удобным stackoverflow.com/a/25555762/4475605, чтобы сделать скорейший выход из расчета, а не тратить вычислительную мощность. Спасибо за публикацию.++i
, стало бы число 1, которое всегда возвращало бы ложь (потому что 1 делится на все). Я исправил ответ выше.Итак, чтобы проверить, является ли число N простым или нет. Нам нужно только проверить, делится ли N на числа <= SQROOT (N). Это потому, что если мы разложим N на любые 2 множителя, скажем, X и Y, т.е. N = X Y. Каждое из X и Y не может быть меньше SQROOT (N), потому что тогда X Y <N Каждое из X и Y не может быть больше, чем SQROOT (N), потому что тогда X * Y> N
Поэтому один фактор должен быть меньше или равен SQROOT (N) (в то время как другой фактор больше или равен SQROOT (N)). Поэтому, чтобы проверить, является ли N простым, нам нужно проверить только эти числа <= SQROOT (N).
источник
Допустим, у нас есть число «а», которое не является простым [не простое / составное число означает - число, которое может быть равномерно разделено на числа, отличные от 1 или самого себя. Например, 6 можно разделить равномерно на 2 или на 3, а также на 1 или 6].
6 = 1 × 6 или 6 = 2 × 3
Так что теперь, если «a» не является простым, то его можно разделить на два других числа, и скажем, что эти числа - «b» и «c». Что значит
а = Ь * с.
Теперь, если «b» или «c», любой из них больше квадратного корня из «a», чем умножение «b» и «c» будет больше, чем «a».
Таким образом, «b» или «c» всегда <= квадратный корень из «a», чтобы доказать уравнение «a = b * c».
По вышеуказанной причине, когда мы проверяем, является ли число простым или нет, мы проверяем только до получения квадратного корня из этого числа.
источник
Учитывая любое число
n
, один из способов найти его факторы - получить квадратный кореньp
:Конечно, если мы умножим
p
на себя, мы вернемсяn
:Это может быть переписано как:
Где
p = a = b
. Еслиa
увеличивается, тоb
уменьшается, чтобы сохранитьa*b = n
. Следовательно,p
это верхний предел.Обновление: сегодня я перечитываю этот ответ снова, и он мне стал понятнее. Значение
p
не обязательно означает целое число, потому что если оно есть, тоn
оно не будет простым. Таким образом,p
может быть действительным числом (т. Е. С дробями). И вместо того, чтобы пройти весь диапазонn
, теперь нам нужно пройти только весь диапазонp
. Другойp
является зеркальной копией, поэтому в действительности мы делим диапазон пополам. И затем, теперь я вижу, что мы можем фактически продолжать заново делатьsquare root
и делать это,p
чтобы увеличить половину диапазона.источник
Пусть n не простое число. Следовательно, он имеет по крайней мере два целых числа больше 1. Пусть f наименьший из n таких факторов. Предположим, что f> sqrt n. Тогда n / f является целым числом LTE sqrt n, таким образом, меньше, чем f. Следовательно, f не может быть наименьшим фактором n. Reductio ad absurdum; Наименьший коэффициент n должен быть LTE sqrt n.
источник
Любое составное число является произведением простых чисел.
Скажем
n = p1 * p2
, гдеp2 > p1
и они простые числа.Если
n % p1 === 0
тогда n является составным числом.Если
n % p2 === 0
тогда угадайте, чтоn % p1 === 0
же!Так что нет, если,
n % p2 === 0
ноn % p1 !== 0
в то же время. Другими словами, если составное число n может быть разделено равномерно на p2, p3 ... pi (его больший коэффициент), оно также должно быть разделено на его самый низкий коэффициент p1 . Оказывается, самый низкий факторp1 <= Math.square(n)
всегда верен.источник
Чтобы проверить простоту числа n , можно было бы ожидать цикл, такой как следующий:
Вышеприведенный цикл делает следующее: для данного 1 <i <n он проверяет, является ли n / i целым числом (оставляет остаток 0). Если существует i, для которого n / i является целым числом, то мы можем быть уверены, что n не является простым числом, и в этот момент цикл завершается. Если для нет i, n / i является целым числом, то n является простым.
Как и в случае с каждым алгоритмом, мы спрашиваем: можем ли мы добиться большего успеха?
Давайте посмотрим, что происходит в вышеуказанном цикле.
Последовательность i идет: i = 2, 3, 4, ..., n-1
И последовательность целочисленных проверок идет: j = n / i, то есть n / 2, n / 3, n / 4, ..., n / (n-1)
Если для некоторого i = a n / a является целым числом, то n / a = k (целое число)
или n = ak, очевидно, n> k> 1 (если k = 1, то a = n, но я никогда не достигну n; а если k = n, то a = 1, но я начинаю с формы 2)
Кроме того, n / k = a, и, как указано выше, a является значением i, поэтому n> a> 1.
Таким образом, a и k оба являются целыми числами от 1 до n (исключая). Так как я достигает каждого целого числа в этом диапазоне, на некоторой итерации i = a, а на другой итерации i = k. Если проверка простоты n не выполняется в течение min (a, k), она также не выполняется для max (a, k). Таким образом, нам нужно проверить только один из этих двух случаев, если только min (a, k) = max (a, k) (где две проверки сводятся к одному), т. Е. A = k, в этот момент a * a = n, что подразумевает a = sqrt (n).
Другими словами, если бы тест на простоту n был неудачным для некоторого i> = sqrt (n) (т. Е. Max (a, k)), то он также не прошел бы для некоторого i <= n (то есть min (a) , к)). Таким образом, будет достаточно, если мы запустим тест для i = 2 до sqrt (n).
источник