Aby sprawdzić, czy liczba jest liczbą pierwszą, czy nie, dlaczego musimy sprawdzać, czy można ją podzielić tylko do pierwiastka kwadratowego z tej liczby?
algorithm
primes
primality-test
Patelnia
źródło
źródło
n = a*b
ia <= b
wtedya*a <= a*b = n
.floor(sqrt(n))
.Odpowiedzi:
Jeśli liczba
n
nie jest liczbą pierwszą, można ją podzielić na dwa czynnikia
ib
:Teraz
a
ib
nie może być większa niż pierwiastek kwadratowyn
, ponieważ wtedy produkta * b
byłby większy niżsqrt(n) * sqrt(n) = n
. Tak więc w każdej faktoryzacjin
co najmniej jeden z czynników musi być mniejszy niż pierwiastek kwadratowyn
, a jeśli nie możemy znaleźć czynników mniejszych lub równych pierwiastkowi kwadratowemu,n
musi być liczbą pierwszą.źródło
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ęcm × m = n
. Teraz, jeślin
nie jest liczbą pierwszą,n
można ją zapisać jakon = a × b
takm × m = a × b
. Zauważ, żem
jest to liczba rzeczywistan
,a
ab
są liczbami naturalnymi.Teraz mogą być 3 przypadki:
We wszystkich 3 przypadkach
min(a, b) ≤ m
. Dlatego jeśli szukamy dom
, jesteśmy zmuszeni znaleźć co najmniej jeden czynnikn
, który wystarczy, aby pokazać, żen
nie jest liczbą pierwszą.źródło
n is not a prime
i udowodnij, w przeciwnym razie jest to liczba pierwsza.Ponieważ jeśli współczynnik jest większy niż pierwiastek kwadratowy z n, drugi czynnik, który pomnożyłby z nim wartość równą n, jest koniecznie mniejszy niż pierwiastek kwadratowy z.
źródło
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.
`
źródło
Załóżmy, że
n
nie jest liczbą pierwszą (większą niż 1). Są więc liczbya
ib
takiePrzez pomnożenie relacji
a<=b
przeza
ib
otrzymujemy:Dlatego: (zauważ, że
n=ab
)Stąd: (Zauważ, że
a
ib
są pozytywne)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.
źródło
Załóżmy, że podana liczba całkowita
N
nie jest liczbą pierwszą,Następnie N można factorized na dwa czynniki
a
ib
,2 <= a, b < N
tak, żeN = 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]
asa <= sqrt(N)
.W związku z tym,
a = 1
ib = n
, a więc z definicjiN
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ć, dosqrt(N)
którego pokrycia będzie wszystkie i . Odtąd będziesz mógł stwierdzić, czyN
jest liczbą pierwszą....
źródło
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ę nan
, ton
nie może być liczbą pierwszą.Przykład pseudokodu:
źródło
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).
źródło
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.
źródło
Biorąc pod uwagę dowolną liczbę
n
, jednym ze sposobów na znalezienie jej czynników jest uzyskanie pierwiastka kwadratowegop
:Oczywiście, jeśli pomnożymy
p
przez siebie, wówczas otrzymamyn
:Można go ponownie zapisać jako:
Gdzie
p = a = b
. Jeślia
wzrasta,b
zmniejsza się, aby utrzymaća*b = n
. Dlategop
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, ton
nie byłaby liczbą pierwszą. Tak,p
może być prawdziwy numer (tj z frakcji). I zamiast przejść przez cały zakresn
, teraz musimy tylko przejść przez cały zakresp
. Drugip
to kopia lustrzana, więc w efekcie zmniejszamy zasięg o połowę. A potem, teraz widzę, że faktycznie możemy kontynuować przerabianiesquare root
i robienie tego,p
aby zwiększyć połowę zakresu.źródło
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.
źródło
Każda liczba złożona jest iloczynem liczb pierwszych.
Powiedzmy
n = p1 * p2
, gdziep2 > 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 con % p1 === 0
!Nie ma więc mowy, że jeśli,
n % p2 === 0
alen % 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 czynnikp1 <= Math.square(n)
jest zawsze prawdziwy.źródło
Aby przetestować pierwotność liczby, n , należy oczekiwać pętli, takiej jak:
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).
źródło