Щоб перевірити, чи є число простим чи ні, чому ми повинні перевірити, чи воно ділиться лише до квадратного кореня цього числа?
floor(sqrt(n))
.
Щоб перевірити, чи є число простим чи ні, чому ми повинні перевірити, чи воно ділиться лише до квадратного кореня цього числа?
floor(sqrt(n))
.
Відповіді:
Якщо число n
не є простим, він може бути розкладений на два фактора a
і b
:
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
, і доведіть це, інакше це прем'єр.
Більш інтуїтивним поясненням було б: -
Квадратний корінь 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, але менше або рівне квадратному кореню, припускаючи, що ви тестуєте лише непарні числа.
`
Припустимо, 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) не є простим, і ми перевіримо подільність до квадратного кореня числа, ми знайдемо один із факторів.
Припустимо, що задане ціле число 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
це не є простим, достатньо показати, що жодне з я не може бути піддано чинності далі. І ми також знаємо, що a i <= sqrt(N)
і, таким чином, вам потрібно перевірити, до sqrt(N)
чого буде охоплено все a i . А значить, ви зможете зробити висновок про те, чи N
є першочерговим чи ні .
...
Це дійсно просто основні напрямки використання факторизації та квадратних коренів.
Це може здатися абстрактним, але насправді він просто полягає в тому, що максимально можливий факторіал не простого числа повинен бути його квадратним коренем, оскільки:
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, щоб зробити ранній вихід з обчислення, а не витрачати обчислювальні потужності. Дякую за публікацію
++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).
Скажімо, у нас є число "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".
Через вищезгадану причину, коли ми перевіряємо, чи є число простим чи ні, ми перевіряємо лише квадратний корінь цього числа.
З огляду на будь-яке число 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
щоб продовжити половину діапазону.
Нехай 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 % p2 === 0
тоді вгадайте, щоn % p1 === 0
ще!
Тож немає можливості, якщо, n % p2 === 0
але n % p1 !== 0
в той же час. Іншими словами, якщо складене число n можна розділити рівномірно на
p2, p3 ... pi (його більший коефіцієнт), його також слід розділити на найнижчий коефіцієнт p1 . Виявляється, найнижчий фактор p1 <= Math.square(n)
завжди правдивий.
Щоб перевірити первинність числа, 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).
n = a*b
іa <= b
тодіa*a <= a*b = n
.