Tại sao chúng ta kiểm tra căn bậc hai của một số nguyên tố để xác định xem nó có phải là số nguyên tố không?


392

Để kiểm tra xem một số có phải là số nguyên tố hay không, tại sao chúng ta phải kiểm tra xem nó có chia hết cho đến căn bậc hai của số đó không?


33
bởi vì nếu n = a*ba <= bsau đó a*a <= a*b = n.
Will Ness

7
Để làm rõ, điều này có nghĩa là chúng tôi phải kiểm tra chỉ cho đến khi floor(sqrt(n)).
Acumenus

Câu trả lời:


659

Nếu một số nkhông phải là số nguyên tố, nó có thể được phân thành hai yếu tố ab:

n = a * b

Bây giờ abkhông thể lớn hơn căn bậc hai của n, kể từ đó sản phẩm a * bsẽ lớn hơn sqrt(n) * sqrt(n) = n. Vì vậy, trong bất kỳ yếu tố nào n, ít nhất một trong các yếu tố phải nhỏ hơn căn bậc hai nvà nếu chúng ta không thể tìm thấy bất kỳ yếu tố nào nhỏ hơn hoặc bằng căn bậc hai, nphải là số nguyên tố.


Làm thế nào sqrt(n)phải đủ chính xác để tài sản này giữ được rằng chúng ta đang sử dụng các điểm nổi.
Benoît

@ Benoît Bạn luôn có thể sử dụng séc i * i <= nthay vì i <= sqrt(n)nếu bạn muốn tránh sự phức tạp của các số có dấu phẩy động.
Sven Marnach

348

Hãy nói m = sqrt(n)sau đó m × m = n. Bây giờ nếu nkhông phải là một số nguyên tố thì ncó thể được viết là n = a × b, vì vậy m × m = a × b. Lưu ý rằng đó mlà một số thực trong khi đó n, ablà số tự nhiên.

Bây giờ có thể có 3 trường hợp:

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

Trong cả 3 trường hợp , min(a, b) ≤ m. Do đó, nếu chúng tôi tìm kiếm cho đến khi m, chúng tôi buộc phải tìm ít nhất một yếu tố n, đủ để cho thấy đó nkhông phải là số nguyên tố.


4
n = 12 m = sqrt (12) = 3,46, a = 2, b = 6. n = m m tức là 12 = 3,46 * 3,46 và n = a b tức là 12 = 2 * 6. Bây giờ điều kiện 3. a <m <b tức là 2 <3.46 <6. Vì vậy, để kiểm tra số nguyên tố chúng ta chỉ cần kiểm tra số nhỏ hơn 3,46 là 2 để tìm ra số đó không phải là số nguyên tố. Do đó, kiểm tra tính chia hết cho các số nhỏ hơn hoặc bằng (nếu n = 4, m = a = b = 2) căn bậc hai của n.
anukalp

2
Tôi nghĩ rằng chúng ta nên làm nổi bật giả định đầu tiên. Giả sử n is not a prime, và chứng minh điều đó, nếu không nó là một nguyên tố.
Huei Tan

Trên thực tế, tôi không tin đó là một câu trả lời tốt hơn. Đó là một câu trả lời đúng, nhưng nó không thực sự trả lời câu hỏi. Nó chỉ mô tả một số động lực khác xung quanh các số nguyên tố và sqrt. Câu trả lời của @ Sven vừa ngắn gọn, vừa không tạo ra nhiều câu hỏi trong quá trình này.
Jon M

1
Tôi quay trở lại phiên bản tốt cuối cùng. bạn đã bỏ lỡ nó khi ai đó không cần phải xóa một từ ('do đó'), cần thiết cho luồng.
Will Ness

55

Bởi vì nếu một yếu tố lớn hơn căn bậc hai của n, thì yếu tố khác sẽ nhân với nó bằng n nhất thiết phải nhỏ hơn căn bậc hai của n.


37

Một lời giải thích trực quan hơn sẽ là: -

Căn bậc hai của 100 là 10. Giả sử axb = 100, cho các cặp a và b khác nhau.

Nếu a == b, thì chúng bằng nhau và là căn bậc hai của 100, chính xác. Đó là 10.

Nếu một trong số chúng nhỏ hơn 10, thì cái còn lại phải lớn hơn. Ví dụ: 5 x 20 == 100. Một cái lớn hơn 10, cái kia nhỏ hơn 10.

Suy nghĩ về axb, nếu một trong số chúng đi xuống, cái còn lại phải lớn hơn để bù lại, vì vậy sản phẩm vẫn ở mức 100. Chúng xoay quanh căn bậc hai.

Căn bậc hai của 101 là khoảng 10.049875621. Vì vậy, nếu bạn đang kiểm tra số 101 cho tính nguyên thủy, bạn chỉ cần thử các số nguyên cho đến 10, bao gồm 10. Nhưng 8, 9 và 10 không phải là số nguyên tố, vì vậy bạn chỉ phải kiểm tra đến 7, đó là nguyên tố.

Bởi vì nếu có một cặp nhân tố có một trong các số lớn hơn 10, thì cặp kia phải nhỏ hơn 10. Nếu yếu tố nhỏ hơn không tồn tại, không có yếu tố nào lớn hơn 101.

Nếu bạn đang kiểm tra 121, căn bậc hai là 11. Bạn phải kiểm tra các số nguyên tố 1 đến 11 (đã bao gồm) để xem liệu nó có đồng đều không. 11 đi trong 11 lần, vì vậy 121 không phải là số nguyên tố. Nếu bạn đã dừng ở mức 10 và không được kiểm tra 11, bạn sẽ bỏ lỡ 11.

Bạn phải kiểm tra mọi số nguyên tố lớn hơn 2, nhưng nhỏ hơn hoặc bằng căn bậc hai, giả sử bạn chỉ kiểm tra các số lẻ.

`


3
"Suy nghĩ về axb, nếu một trong số chúng đi xuống, cái còn lại phải lớn hơn để bù lại, vì vậy sản phẩm vẫn ở mức 100. Chúng xoay quanh căn bậc hai." Khoảnh khắc aha của tôi! Cảm ơn bạn!
Brian Wigginton

Đây là câu trả lời tốt nhất.
JeanieJ

19

Giả sử nkhông phải là số nguyên tố (lớn hơn 1). Vì vậy, có những con số abnhư vậy

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

Bằng cách nhân mối quan hệ a<=bvới abchúng tôi nhận được:

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

Do đó: (lưu ý rằng n=ab)

a^2 <= n <= b^2

Do đó: (Lưu ý rằng ablà tích cực)

a <= sqrt(n) <= b

Vì vậy, nếu một số (lớn hơn 1) không phải là số nguyên tố và chúng tôi kiểm tra tính chia hết cho căn bậc hai của số đó, chúng tôi sẽ tìm thấy một trong các yếu tố.


8

Giả sử rằng số nguyên đã cho Nkhông phải là số nguyên tố,

Sau đó N có thể được nhân tố thành hai yếu tố ab, 2 <= a, b < Nnhư vậy N = a*b. Rõ ràng, cả hai không thể lớn hơn sqrt(N)đồng thời.

Chúng ta hãy giả định mà không mất tính tổng quát anhỏ hơn.

Bây giờ, nếu bạn không thể tìm thấy bất kỳ ước số nào Nthuộc về phạm vi [2, sqrt(N)], điều đó có nghĩa là gì?

Điều này có nghĩa rằng Nkhông có bất kỳ ước trong [2, a]như a <= sqrt(N).

Do đó, a = 1b = ndo đó theo định nghĩa, Nlà số nguyên tố .

...

Đọc thêm nếu bạn không hài lòng:

Nhiều kết hợp khác nhau (a, b)có thể có thể. Hãy nói rằng họ là:

(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ....., (a k , b k ). Không mất tính tổng quát, giả sử một i <b i , 1<= i <=k.

Bây giờ, để có thể chỉ ra rằng đó Nkhông phải là số nguyên tố, điều đó là đủ để cho thấy rằng không ai trong số tôi có thể được nhân tố thêm. Và chúng tôi cũng biết rằng một i <= sqrt(N)và do đó bạn cần kiểm tra cho đến khi sqrt(N)nó sẽ bao gồm tất cả một i . Và do đó bạn sẽ có thể kết luận liệu có phải Nlà số nguyên tố hay không .

...


7

Tất cả thực sự chỉ là những ứng dụng cơ bản của Factorization và Square Roots.

Nó có vẻ trừu tượng, nhưng trong thực tế, nó chỉ đơn giản nằm ở thực tế là giai thừa tối đa có thể của một số nguyên tố sẽ phải là căn bậc hai của nó bởi vì:

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

Cho rằng, nếu bất kỳ số nguyên nào ở trên 1và dưới hoặc lên để sqrroot(n)chia đều cho nthì nkhông thể là số nguyên tố.

Ví dụ mã giả:

i = 2;

is_prime = true;

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

Quan sát rực rỡ. Sử dụng quan sát này để tạo một guardtuyên bố trong Swift kết hợp với stackoverflow tiện dụng này.com / a / 25055762/4485605 để thực hiện thoát sớm khỏi một phép tính thay vì lãng phí sức mạnh tính toán. Cảm ơn đã đăng bài viết.
Adrian

@Adrian Tôi phải thú nhận rằng sau khi quay lại câu trả lời này, tôi đã tìm thấy một lỗi tại thời điểm đăng bài của bạn. Bạn không thể thực hiện phép chia trên 0 và theo lý thuyết nếu bạn có thể ++itrở thành số 1, số này sẽ luôn trả về sai (vì 1 chia cho mọi thứ). Tôi đã sửa câu trả lời ở trên.
Super Cat

Đúng ... Tôi đã giải quyết rằng trong mã của tôi ... quan sát căn bậc hai của bạn là một cách tuyệt vời để sớm loại bỏ một giá trị không chính trước khi bạn bắt đầu chạy các phép tính. Tôi đã bị giết trên một số lượng lớn hóa ra là một sự lãng phí lớn thời gian. Tôi cũng đã học được thuật toán này có thể giảm đáng kể thời gian xử lý trên các số lớn. vi.wikipedia.org/wiki/Miller mậtRabin_primality_test
Adrian

6

Vì vậy, để kiểm tra xem một số N có phải là Prime hay không. Chúng ta chỉ cần kiểm tra xem N có chia hết cho các số <= SQROOT (N) không. Điều này là do, nếu chúng ta yếu tố N thành bất kỳ 2 yếu tố nào nói X và Y, tức là. N = X Y. Mỗi X và Y không thể nhỏ hơn SQROOT (N) vì khi đó, X Y <N Mỗi X và Y không thể lớn hơn SQROOT (N) vì khi đó, X * Y> N

Do đó, một yếu tố phải nhỏ hơn hoặc bằng SQROOT (N) (trong khi yếu tố kia lớn hơn hoặc bằng SQROOT (N)). Vì vậy, để kiểm tra xem N có phải là Prime hay không, chúng ta chỉ cần kiểm tra các số đó <= SQROOT (N).


3

Giả sử chúng ta có một số "a", không phải là số nguyên tố [không phải số nguyên tố / số tổng hợp có nghĩa - một số có thể được chia đều cho các số khác 1 hoặc chính nó. Ví dụ: 6 có thể được chia đều cho 2 hoặc 3, cũng như 1 hoặc 6].

6 = 1 × 6 hoặc 6 = 2 × 3

Vì vậy, bây giờ nếu "a" không phải là số nguyên tố thì nó có thể được chia cho hai số khác và giả sử các số đó là "b" và "c". Nghĩa là

a = b * c.

Bây giờ nếu "b" hoặc "c", bất kỳ số nào trong số chúng lớn hơn căn bậc hai của "a" so với phép nhân của "b" & "c" sẽ lớn hơn "a".

Vì vậy, "b" hoặc "c" luôn luôn <= căn bậc hai của "a" để chứng minh phương trình "a = b * c".

Vì lý do trên, khi chúng tôi kiểm tra xem một số có phải là số nguyên tố hay không, chúng tôi chỉ kiểm tra cho đến khi căn bậc hai của số đó.


1
b & c <= Math.sqrt (n)?; Nó nên là b | | c (b hoặc c) vì nếu n = 6, b = 3, c = 2 thì Math.sqrt (n)> c.
daGo 17/12/18

Cảm ơn bạn đã sửa chữa. thực hiện chỉnh sửa. :)
Abu Naser Md Shoaib

2

Cho bất kỳ số nào n, sau đó một cách để tìm các yếu tố của nó là lấy căn bậc hai của nó p:

sqrt(n) = p

Tất nhiên, nếu chúng ta tự nhân lên p, thì chúng ta sẽ quay lại n:

p*p = n

Nó có thể được viết lại thành:

a*b = n

Ở đâu p = a = b. Nếu atăng thì bgiảm để duy trì a*b = n. Do đó, plà giới hạn trên.

Cập nhật: Tôi đang đọc lại câu trả lời này ngày hôm nay và nó trở nên rõ ràng hơn với tôi nhiều hơn. Giá trị pkhông nhất thiết có nghĩa là một số nguyên bởi vì nếu có, thì đó nkhông phải là số nguyên tố. Vì vậy, pcó thể là một số thực (nghĩa là có phân số). Và thay vì đi qua toàn bộ phạm vi n, bây giờ chúng ta chỉ cần đi qua toàn bộ phạm vi p. Cái kia plà một bản sao nhân bản để có hiệu lực, chúng tôi giảm một nửa phạm vi. Và sau đó, bây giờ tôi đang thấy rằng chúng ta thực sự có thể tiếp tục làm lại square rootvà thực hiện nó để pđi xa hơn một nửa phạm vi.


1

Đặt n là số nguyên tố. Do đó, nó có ít nhất hai thừa số nguyên lớn hơn 1. Gọi f là nhỏ nhất trong số các yếu tố đó. Giả sử f> sqrt n. Thì n / f là một số nguyên LTE sqrt n, do đó nhỏ hơn f. Do đó, f không thể là yếu tố nhỏ nhất của n. Reductio quảng cáo vô lý; yếu tố nhỏ nhất của n phải là LTE sqrt n.


1

Bất kỳ số tổng hợp là một sản phẩm của số nguyên tố.

Hãy nói n = p1 * p2, nơi p2 > p1và họ là số nguyên tố.

Nếu n % p1 === 0sau đó n là một số tổng hợp.

Nếu n % p2 === 0sau đó đoán những gì n % p1 === 0là tốt!

Vì vậy, không có cách nào mà nếu n % p2 === 0nhưng n % p1 !== 0cùng một lúc. Nói cách khác, nếu một số hỗn hợp n có thể được chia đều cho p2, p3 ... pi (hệ số lớn hơn của nó) thì nó cũng phải được chia cho hệ số thấp nhất p1 . Nó chỉ ra rằng yếu tố thấp nhất p1 <= Math.square(n)luôn luôn đúng.


Nếu bạn tò mò tại sao nó lại đúng @LoMaPh đã giải thích thực tế trong câu trả lời của nó rất nhiều. Tôi đã thêm câu trả lời của mình vì tôi đã rất khó khăn để hình dung và hiểu các câu trả lời được cung cấp khác. Nó chỉ không nhấp.
daGo

0

Để kiểm tra tính nguyên thủy của một số, n , người ta sẽ mong đợi một vòng lặp như sau ở vị trí đầu tiên:

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

Vòng lặp trên thực hiện điều này là gì: với 1 <i <n đã cho , nó sẽ kiểm tra xem n / i có phải là số nguyên hay không (còn lại 0). Nếu tồn tại một i mà n / i là một số nguyên, thì chúng ta có thể chắc chắn rằng n không phải là số nguyên tố, tại đó vòng lặp kết thúc. Nếu không có i, n / i là số nguyên thì n là số nguyên tố.

Như mọi thuật toán, chúng tôi hỏi: chúng ta có thể làm tốt hơn không?

Hãy cho chúng tôi xem những gì đang xảy ra trong vòng lặp trên.

Trình tự của tôi đi: i = 2, 3, 4, ..., n-1

Và chuỗi kiểm tra số nguyên đi: j = n / i, đó là n / 2, n / 3, n / 4, ..., n / (n-1)

Nếu với một số i = a, n / a là một số nguyên, thì n / a = k (số nguyên)

hoặc n = ak, rõ ràng n> k> 1 (nếu k = 1, thì a = n, nhưng tôi không bao giờ đạt đến n; và nếu k = n, thì a = 1, nhưng tôi bắt đầu mẫu 2)

Ngoài ra, n / k = a, và như đã nêu ở trên, a là giá trị của i nên n> a> 1.

Vì vậy, a và k đều là các số nguyên nằm giữa 1 và n (loại trừ). Vì, tôi đạt đến mọi số nguyên trong phạm vi đó, tại một số lần lặp i = a và tại một số lần lặp khác i = k. Nếu kiểm tra tính nguyên thủy của n thất bại trong min (a, k), thì nó cũng sẽ thất bại cho max (a, k). Vì vậy, chúng ta chỉ cần kiểm tra một trong hai trường hợp này, trừ khi min (a, k) = max (a, k) (trong đó hai kiểm tra giảm xuống còn một), tức là a = k, tại đó điểm a * a = n, trong đó ngụ ý a = sqrt (n).

Nói cách khác, nếu thử nghiệm nguyên thủy của n không thành công đối với một số i> = sqrt (n) (tức là max (a, k)), thì nó cũng sẽ thất bại đối với một số i <= n (tức là min (a , k)). Vì vậy, nó sẽ đủ nếu chúng ta chạy thử nghiệm cho i = 2 đến sqrt (n).


Có nhiều đoạn ngắn hơn và IMHO dễ hiểu hơn nhiều và giải thích nhiều chủ đề hơn trong các bình luận và câu trả lời 6 năm tuổi ...
Thierry Lathuille
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.