Чому ми перевіряємо до квадратного кореня простого числа, щоб визначити, чи є простим він?


392

Щоб перевірити, чи є число простим чи ні, чому ми повинні перевірити, чи воно ділиться лише до квадратного кореня цього числа?


33
бо якщо n = a*bі a <= bтоді a*a <= a*b = n.
Буде Несс

7
Щоб уточнити, це означає, що ми повинні протестувати лише до floor(sqrt(n)).
Acumenus

Відповіді:


659

Якщо число nне є простим, він може бути розкладений на два фактора aі b:

n = a * b

Тепер aі bне може бути і більшим, ніж квадратний корінь n, оскільки тоді продукт a * bбуде більшим за sqrt(n) * sqrt(n) = n. Отже, при будь-якій факторизації n, принаймні один із факторів повинен бути меншим, ніж квадратний корінь n, і якщо ми не можемо знайти жодних факторів, менших або рівних квадратному кореню, nповинні бути простими.


Як sqrt(n)має бути достатньо точним, щоб ця властивість містила, враховуючи, що ми використовуємо плаваючі точки.
Беноот

@ Benoît Ви завжди можете використовувати чек i * i <= nзамість, i <= sqrt(n)якщо хочете уникнути тонкощів чисел з плаваючою комою.
Свен Марнах

348

Скажімо m = sqrt(n)тоді m × m = n. Тепер, якщо nце не просто, тоді nможна записати як n = a × b, так m × m = a × b. Зверніть увагу , що mдійсне число а n, aі bнатуральні числа.

Зараз може бути 3 випадки:

  1. a> m ⇒ b <m
  2. a = m ⇒ b = m
  3. a <m ⇒ b> m

У всіх 3 випадках min(a, b) ≤ m. Отже, якщо ми будемо шукати до m, ми обов'язково знайдемо хоча б один фактор n, якого достатньо, щоб показати, що nвін не є простим.


4
n = 12 m = sqrt (12) = 3,46, a = 2, b = 6. n = m m, тобто 12 = 3,46 * 3,46 і n = a b, тобто 12 = 2 * 6. Тепер умова 3. a <m <b, тобто 2 <3,46 <6. Отже, для перевірки простих нам потрібно лише перевірити число менше 3,46, що є 2, щоб дізнатися, що число не є простим. Отже, перевірте подільність на числа, менші або рівні (якщо n = 4, m = a = b = 2) квадратного кореня з n.
anukalp

2
Я думаю, що слід спершу висвітлити припущення. Припустимо n is not a prime, і доведіть це, інакше це прем'єр.
Huei Tan

Власне, я не переконаний, що це краща відповідь. Це правильна відповідь, але насправді не відповідає на питання. Він просто описує деяку іншу динаміку навколо прайменів та sqrt. @ Відповіді Свена є одночасно стислими, і не створює більше запитань у процесі.
Джон М

1
Я відкотився до останньої гарної версії. ви пропустили це, коли хтось без потреби видалив слово («отже»), яке потрібно для потоку.
Буде Несс

55

Тому що якщо коефіцієнт більший, ніж квадратний корінь n, інший фактор, який би помножився з ним на рівний n, обов'язково менший, ніж квадратний корінь n.


37

Більш інтуїтивним поясненням було б: -

Квадратний корінь 100 дорівнює 10. Скажімо, axb = 100, для різних пар a і b.

Якщо a == b, то вони рівні, і є квадратним коренем 100, рівно. Що 10.

Якщо один з них менше 10, інший повинен бути більшим. Наприклад, 5 x 20 == 100. Один більший за 10, інший - менше 10.

Думаючи про axb, якщо одна з них опускається вниз, інша повинна отримати більше, щоб компенсувати, тому виріб залишається на 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, але менше або рівне квадратному кореню, припускаючи, що ви тестуєте лише непарні числа.

`


3
"Думаючи про axb, якщо одна з них опуститься, інша повинна отримати більше, щоб компенсувати, тому виріб залишається на рівні 100. Вони крутяться навколо квадратного кореня." Моя ага мить! Дякую!
Брайан Віггінтон

Це найкраща відповідь.
JeanieJ

19

Припустимо, nце не просте число (більше 1). Так що є числа aі bтакі, що

n = ab      (1 < a <= b < n)

Помноживши відношення a<=bна aі bотримаємо:

a^2 <= ab
 ab <= b^2

Тому: (зауважте, що n=ab)

a^2 <= n <= b^2

Отже: (Зверніть увагу , що aі bпозитивні)

a <= sqrt(n) <= b

Отже, якщо число (більше 1) не є простим, і ми перевіримо подільність до квадратного кореня числа, ми знайдемо один із факторів.


8

Припустимо, що задане ціле число 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 ). Без обмеження спільності, припустимо, що II , 1<= i <=k.

Тепер, щоб показати, що Nце не є простим, достатньо показати, що жодне з я не може бути піддано чинності далі. І ми також знаємо, що a i <= sqrt(N)і, таким чином, вам потрібно перевірити, до sqrt(N)чого буде охоплено все a i . А значить, ви зможете зробити висновок про те, чи Nє першочерговим чи ні .

...


7

Це дійсно просто основні напрямки використання факторизації та квадратних коренів.

Це може здатися абстрактним, але насправді він просто полягає в тому, що максимально можливий факторіал не простого числа повинен бути його квадратним коренем, оскільки:

sqrroot(n) * sqrroot(n) = n.

Враховуючи це, якщо будь-яке ціле число вище 1 і нижче або вгору sqrroot(n)ділиться рівномірно n, то nне може бути простим числом.

Приклад псевдокоду:

i = 2;

is_prime = true;

while loop (i <= sqrroot(n))
{
  if (n % i == 0)
  {
    is_prime = false;
    exit while;
  }
  ++i;
}

Блискуче спостереження. Використовуючи це спостереження для створення guardоператора в Swift спільно з цим зручним stackoverflow.com/a/25555762/4475605, щоб зробити ранній вихід з обчислення, а не витрачати обчислювальні потужності. Дякую за публікацію
Адріан

@ Адріан Я мушу зізнатися, що повернувшись до цієї відповіді, я виявив помилку під час вашої публікації. Ви не можете виконати ділення на 0, а теоретично, якщо ви могли ++iб стати числом 1, яке завжди поверне помилкове значення (оскільки 1 ділиться на все). Відповідь я виправив вище.
Супер Кіт

Так ... я вирішив це в своєму коді ... ваше квадратне спостереження за коренем - це чудовий спосіб викинути непросте значення рано, перш ніж почати виконувати обчислення. Мене вбивали на великій кількості, що виявилося великою марною тратою часу. Я також дізнався, що цей алгоритм також може значно скоротити обробку часу на великі числа. en.wikipedia.org/wiki/Miller –Rabin_primality_test
Адріан

6

Отже, щоб перевірити, чи число 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).


3

Скажімо, у нас є число "a", яке не є простим [не простим / складеним числом означає - число, яке можна розділити рівномірно на числа, відмінні від 1, або себе. Наприклад, 6 можна розділити рівномірно на 2, або на 3, а також на 1 або 6].

6 = 1 × 6 або 6 = 2 × 3

Отже, якщо "a" не є простим, то його можна розділити на два інші числа, і скажімо, що ці числа "b" і "c". Що означає

a = b * c.

Тепер, якщо "b" або "c", будь-який з них більший за квадратний корінь "a", ніж множення "b" & "c" буде більше, ніж "a".

Отже, "b" або "c" завжди <= квадратний корінь "a", щоб довести рівняння "a = b * c".

Через вищезгадану причину, коли ми перевіряємо, чи є число простим чи ні, ми перевіряємо лише квадратний корінь цього числа.


1
b & c <= Math.sqrt (n) ?; Це має бути скоріше b || c (b або c), оскільки якщо n = 6, b = 3, c = 2, то Math.sqrt (n)> c.
daGo

Дякую приятелю за виправлення. роблячи корекцію. :)
Abu Naser Md Shoaib

2

З огляду на будь-яке число n, то один із способів знайти його фактори - отримати квадратний корінь p:

sqrt(n) = p

Звичайно, якщо ми помножимо pна себе, то повернемось n:

p*p = n

Його можна переписати так:

a*b = n

Де p = a = b. Якщо aзбільшується, то bзменшується до підтримки a*b = n. Тому pє верхньою межею.

Оновлення: сьогодні я повторно читаю цю відповідь, і мені стало зрозуміліше більше. Значення pне обов'язково означає ціле число, тому що якщо воно є, то воно nне було б простим. Отже, pможе бути реальна кількість (тобто з дробами). І замість того, щоб пройти весь спектр Росії n, зараз нам потрібно лише пройти весь спектр p. Інша p- дзеркальна копія, тому ми фактично вдвічі зменшуємо діапазон. І тоді, зараз я бачу, що ми можемо продовжувати повторно робити це square rootі робити це, pщоб продовжити половину діапазону.


1

Нехай n не є простим. Отже, він має щонайменше два цілих коефіцієнта, більших за 1. Нехай f - найменший з n таких факторів. Припустимо, f> sqrt n. Тоді n / f - ціле число LTE sqrt n, таким чином, менше f. Тому f не може бути найменшим фактором n. Reductio ad absurdum; Найменший коефіцієнт n повинен бути LTE sqrt n.


1

Будь-яке складене число - це добуток прайметів.

Скажімо n = p1 * p2, деp2 > p1 і вони - праймери.

Якщо n % p1 === 0тоді н - складене число.

Якщо n % p2 === 0тоді вгадайте, щоn % p1 === 0 ще!

Тож немає можливості, якщо, n % p2 === 0але n % p1 !== 0в той же час. Іншими словами, якщо складене число n можна розділити рівномірно на p2, p3 ... pi (його більший коефіцієнт), його також слід розділити на найнижчий коефіцієнт p1 . Виявляється, найнижчий фактор p1 <= Math.square(n)завжди правдивий.


Якщо вам цікаво, чому це правда @LoMaPh пояснив факт у своїй відповіді чудово. Я додав свою відповідь, тому що мені справді важко було уявити та зрозуміти інші надані відповіді. Це просто не натиснуло.
daGo

0

Щоб перевірити первинність числа, n , спочатку слід очікувати циклу, такого як:

bool isPrime = true;
for(int i = 2; i < n; i++){
    if(n%i == 0){
        isPrime = false;
        break;
    }
}

Що робить вищевказаний цикл, це так: для заданого 1 <i <n він перевіряє, чи n / i є цілим числом (залишає залишок 0). Якщо існує i, для якого n / i є цілим числом, то ми можемо бути впевнені, що n не є простим числом, в який момент цикл закінчується. Якщо для no 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 so 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).


Є набагато коротші, і IMHO набагато простіше зрозуміти, і більше пояснень на теми в коментарях та відповіді на 6 років ...
Тьєррі Латуй
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.