Aby sprawdzić, czy liczba jest liczbą pierwszą, czy nie, dlaczego musimy sprawdzać, czy można ją podzielić tylko do pierwiastka kwadratowego z tej liczby?
floor(sqrt(n))
.
Aby sprawdzić, czy liczba jest liczbą pierwszą, czy nie, dlaczego musimy sprawdzać, czy można ją podzielić tylko do pierwiastka kwadratowego z tej liczby?
floor(sqrt(n))
.
Odpowiedzi:
Jeśli liczba n
nie jest liczbą pierwszą, można ją podzielić na dwa czynniki a
i b
:
n = a * b
Teraz a
i b
nie może być większa niż pierwiastek kwadratowy n
, ponieważ wtedy produkt a * b
byłby większy niż sqrt(n) * sqrt(n) = n
. Tak więc w każdej faktoryzacji n
co najmniej jeden z czynników musi być mniejszy niż pierwiastek kwadratowy n
, a jeśli nie możemy znaleźć czynników mniejszych lub równych pierwiastkowi kwadratowemu, n
musi być liczbą pierwszą.
sqrt(n)
musi być wystarczająco precyzyjna, aby ta właściwość mogła się utrzymać, biorąc pod uwagę, że używamy zmiennoprzecinkowych.
i * i <= n
zamiast, i <= sqrt(n)
jeśli chcesz uniknąć zawiłości liczb zmiennoprzecinkowych.
Powiedzmy m = sqrt(n)
więc m × m = n
. Teraz, jeśli n
nie jest liczbą pierwszą, n
można ją zapisać jako n = a × b
tak m × m = a × b
. Zauważ, że m
jest to liczba rzeczywista n
, a
a b
są liczbami naturalnymi.
Teraz mogą być 3 przypadki:
We wszystkich 3 przypadkach min(a, b) ≤ m
. Dlatego jeśli szukamy do m
, jesteśmy zmuszeni znaleźć co najmniej jeden czynnik n
, który wystarczy, aby pokazać, że n
nie jest liczbą pierwszą.
n is not a prime
i udowodnij, w przeciwnym razie jest to liczba pierwsza.
Bardziej intuicyjnym wyjaśnieniem byłoby:
Pierwiastek kwadratowy ze 100 wynosi 10. Powiedzmy, że axb = 100, dla różnych par a i b.
Jeśli a == b, to są one równe i są pierwiastkiem kwadratowym równym 100. Które wynosi 10.
Jeśli jeden z nich ma mniej niż 10, drugi musi być większy. Na przykład 5 x 20 == 100. Jeden jest większy niż 10, drugi jest mniejszy niż 10.
Myśląc o axb, jeśli jeden z nich spadnie, drugi musi stać się większy, aby zrekompensować, więc produkt pozostaje na 100. Obracają się wokół pierwiastka kwadratowego.
Pierwiastek kwadratowy z 101 wynosi około 10.049875621. Więc jeśli testujesz liczbę 101 pod kątem pierwszeństwa, musisz wypróbować liczby całkowite do 10, w tym 10. Ale same 8, 9 i 10 nie są liczbami pierwszymi, więc musisz przetestować tylko do 7, czyli główny.
Ponieważ jeśli istnieje para czynników z jedną z liczb większą niż 10, druga z pary musi być mniejsza niż 10. Jeśli mniejszy nie istnieje, nie ma pasującego większego współczynnika 101.
Jeśli testujesz 121, pierwiastek kwadratowy wynosi 11. Musisz przetestować pierwsze liczby całkowite od 1 do 11 (włącznie), aby sprawdzić, czy przejdzie ono równomiernie. 11 razy idzie 11 razy, więc 121 nie jest liczbą pierwszą. Jeśli zatrzymałeś się na 10, a nie testowałeś 11, straciłbyś 11.
Musisz przetestować każdą liczbę całkowitą większą niż 2, ale mniejszą lub równą pierwiastkowi kwadratowemu, zakładając, że testujesz tylko liczby nieparzyste.
`
Załóżmy, że n
nie jest liczbą pierwszą (większą niż 1). Są więc liczby a
i b
takie
n = ab (1 < a <= b < n)
Przez pomnożenie relacji a<=b
przez a
i b
otrzymujemy:
a^2 <= ab
ab <= b^2
Dlatego: (zauważ, że n=ab
)
a^2 <= n <= b^2
Stąd: (Zauważ, że a
i b
są pozytywne)
a <= sqrt(n) <= b
Więc jeśli liczba (większa niż 1) nie jest liczbą pierwszą i testujemy podzielność aż do pierwiastka kwadratowego z liczby, znajdziemy jeden z czynników.
Załóżmy, że podana liczba całkowita N
nie jest liczbą pierwszą,
Następnie N można factorized na dwa czynniki a
i b
, 2 <= a, b < N
tak, że N = a*b
. Oczywiście oba z nich nie mogą być większe niż sqrt(N)
jednocześnie.
Załóżmy bez utraty ogólności, która a
jest mniejsza.
Jeśli nie możesz znaleźć dzielnika N
przynależności w tym zakresie [2, sqrt(N)]
, co to oznacza?
Oznacza to, że N
nie ma dzielnika w [2, a]
as a <= sqrt(N)
.
W związku z tym, a = 1
i b = n
, a więc z definicji N
jest pierwszorzędna .
...
Dalsza lektura, jeśli nie jesteś zadowolony:
(a, b)
Możliwe jest wiele różnych kombinacji . Powiedzmy, że są:
(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ....., (a k , b k ). Bez straty ogólności zakładamy I <b I , 1<= i <=k
.
Teraz, aby móc pokazać, że N
nie jest liczbą pierwszą, wystarczy pokazać, że żadnego z i nie można dalej rozkładać na czynniki. Wiemy również, że i <= sqrt(N)
i dlatego musisz sprawdzić, do sqrt(N)
którego pokrycia będzie wszystkie i . Odtąd będziesz mógł stwierdzić, czy N
jest liczbą pierwszą.
...
To naprawdę tylko podstawowe zastosowania faktoryzacji i pierwiastków kwadratowych.
Może się to wydawać abstrakcyjne, ale w rzeczywistości polega po prostu na tym, że maksymalnym możliwym silnikiem liczby niepierwszej musiałby być pierwiastek kwadratowy, ponieważ:
sqrroot(n) * sqrroot(n) = n
.
Biorąc pod uwagę, że jeśli dowolna liczba całkowita powyżej 1
i poniżej lub w górę sqrroot(n)
równomiernie dzieli się na n
, to n
nie może być liczbą pierwszą.
Przykład pseudokodu:
i = 2;
is_prime = true;
while loop (i <= sqrroot(n))
{
if (n % i == 0)
{
is_prime = false;
exit while;
}
++i;
}
guard
instrukcji w Swift w połączeniu z tym przydatnym stackoverflow.com/a/25555762/4475605 w celu wczesnego wyjścia z obliczeń zamiast marnowania mocy obliczeniowej. Dziękujemy za wysłanie.
++i
stać się liczbą 1, która zawsze zwróciłaby wartość false (ponieważ 1 dzieli się na wszystko). Poprawiłem powyższą odpowiedź.
Aby sprawdzić, czy liczba N jest liczbą Prime, czy nie. Musimy tylko sprawdzić, czy N można podzielić przez liczby <= SQROOT (N). Wynika to z faktu, że jeśli weźmiemy N na dowolne 2 czynniki, powiedzmy X i Y, tj. N = X Y. Każdy z X i Y nie może być mniejszy niż SQROOT (N), ponieważ wtedy X Y <N Każdy z X i Y nie może być większy niż SQROOT (N), ponieważ wtedy X * Y> N
Dlatego jeden czynnik musi być mniejszy lub równy SQROOT (N) (podczas gdy drugi czynnik jest większy lub równy SQROOT (N)). Aby więc sprawdzić, czy N jest liczbą pierwszą, musimy tylko sprawdzić te liczby <= SQROOT (N).
Powiedzmy, że mamy liczbę „a”, która nie jest liczbą pierwszą [nie liczba pierwsza / liczba zespolona oznacza - liczbę, którą można podzielić równomiernie przez liczby inne niż 1 lub sama. Na przykład 6 można podzielić równomiernie przez 2 lub 3, a także przez 1 lub 6].
6 = 1 × 6 lub 6 = 2 × 3
Jeśli więc „a” nie jest liczbą pierwszą, można ją podzielić przez dwie inne liczby i powiedzmy, że te liczby to „b” i „c”. Co znaczy
a = b * c.
Teraz, jeśli „b” lub „c”, którykolwiek z nich jest większy niż pierwiastek kwadratowy z „a”, to mnożenie „b” i „c” będzie większe niż „a”.
Zatem „b” lub „c” jest zawsze <= pierwiastek kwadratowy z „a”, aby udowodnić równanie „a = b * c”.
Z powyższego powodu, gdy testujemy, czy liczba jest liczbą pierwszą, czy nie, sprawdzamy tylko do pierwiastka kwadratowego z tej liczby.
Biorąc pod uwagę dowolną liczbę n
, jednym ze sposobów na znalezienie jej czynników jest uzyskanie pierwiastka kwadratowego p
:
sqrt(n) = p
Oczywiście, jeśli pomnożymy p
przez siebie, wówczas otrzymamy n
:
p*p = n
Można go ponownie zapisać jako:
a*b = n
Gdzie p = a = b
. Jeśli a
wzrasta, b
zmniejsza się, aby utrzymać a*b = n
. Dlatego p
jest górną granicą.
Aktualizacja: Dzisiaj ponownie czytam tę odpowiedź i stała się dla mnie bardziej zrozumiała. Wartość p
niekoniecznie oznacza liczbę całkowitą, ponieważ jeśli tak, to n
nie byłaby liczbą pierwszą. Tak, p
może być prawdziwy numer (tj z frakcji). I zamiast przejść przez cały zakres n
, teraz musimy tylko przejść przez cały zakres p
. Drugi p
to kopia lustrzana, więc w efekcie zmniejszamy zasięg o połowę. A potem, teraz widzę, że faktycznie możemy kontynuować przerabianie square root
i robienie tego, p
aby zwiększyć połowę zakresu.
Niech n nie będzie liczbą pierwszą. Dlatego ma co najmniej dwa czynniki całkowite większe niż 1. Niech f będzie najmniejszym z tych czynników n. Załóżmy, że f> sqrt n. Zatem n / f jest liczbą całkowitą LTE sqrt n, a więc mniejszą niż f. Dlatego f nie może być najmniejszym czynnikiem n. Reductio ad absurdum; najmniejszym czynnikiem n musi być LTE sqrt n.
Każda liczba złożona jest iloczynem liczb pierwszych.
Powiedzmy n = p1 * p2
, gdzie p2 > p1
i gdzie są liczbami pierwszymi.
Jeśli n % p1 === 0
wtedy n jest liczbą złożoną.
Jeśli n % p2 === 0
tak, zgadnij co n % p1 === 0
!
Nie ma więc mowy, że jeśli, n % p2 === 0
ale n % p1 !== 0
w tym samym czasie. Innymi słowy, jeśli liczbę zespoloną n można podzielić równomiernie przez
p2, p3 ... pi (jej większy współczynnik), należy ją również podzielić przez jej najniższy współczynnik p1 . Okazuje się, że najniższy czynnik p1 <= Math.square(n)
jest zawsze prawdziwy.
Aby przetestować pierwotność liczby, n , należy oczekiwać pętli, takiej jak:
bool isPrime = true;
for(int i = 2; i < n; i++){
if(n%i == 0){
isPrime = false;
break;
}
}
Powyższa pętla robi to: dla danego 1 <i <n sprawdza, czy n / i jest liczbą całkowitą (pozostawia resztę 0). Jeśli istnieje znak i, dla którego n / i jest liczbą całkowitą, możemy być pewni, że n nie jest liczbą pierwszą, w którym to momencie pętla się kończy. Jeśli dla nie i, n / i jest liczbą całkowitą, to n jest liczbą pierwszą.
Jak w przypadku każdego algorytmu, pytamy: czy możemy zrobić lepiej?
Zobaczmy, co się dzieje w powyższej pętli.
Sekwencja i idzie: i = 2, 3, 4, ..., n-1
Kolejność sprawdzania liczb całkowitych jest następująca: j = n / i, czyli n / 2, n / 3, n / 4, ..., n / (n-1)
Jeśli dla niektórych i = a, n / a jest liczbą całkowitą, to n / a = k (liczba całkowita)
lub n = ak, wyraźnie n> k> 1 (jeśli k = 1, to a = n, ale nigdy nie osiąga n; a jeśli k = n, to a = 1, ale i zaczyna formę 2)
Ponadto, n / k = a, i jak stwierdzono powyżej, a jest wartością i więc n> a> 1.
Zatem a i k są liczbami całkowitymi od 1 do n (wyłączne). Ponieważ osiągam każdą liczbę całkowitą w tym zakresie, przy pewnej iteracji i = a, a przy innej iteracji i = k. Jeśli test pierwotności n nie powiedzie się dla min (a, k), to również nie powiedzie się dla max (a, k). Musimy więc sprawdzić tylko jeden z tych dwóch przypadków, chyba że min (a, k) = max (a, k) (gdzie dwa sprawdzenia zmniejszają się do jednego) tj. A = k, w którym punkcie a * a = n, które implikuje a = sqrt (n).
Innymi słowy, gdyby test pierwszeństwa n nie powiódł się dla niektórych i> = sqrt (n) (tj. Max (a, k)), to również nie powiedzie się dla niektórych i <= n (tj. Min (a , k)). Wystarczyłoby uruchomić test dla i = 2 do sqrt (n).
n = a*b
ia <= b
wtedya*a <= a*b = n
.