Để 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?
floor(sqrt(n))
.
Để 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?
floor(sqrt(n))
.
Câu trả lời:
Nếu một số n
không phải là số nguyên tố, nó có thể được phân thành hai yếu tố a
và b
:
n = a * b
Bây giờ a
và b
không thể lớn hơn căn bậc hai của n
, kể từ đó sản phẩm a * b
sẽ 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 n
và 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, n
phải là số nguyên tố.
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.
i * i <= n
thay 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.
Hãy nói m = sqrt(n)
sau đó m × m = n
. Bây giờ nếu n
không phải là một số nguyên tố thì n
có thể được viết là n = a × b
, vì vậy m × m = a × b
. Lưu ý rằng đó m
là một số thực trong khi đó n
, a
và b
là số tự nhiên.
Bây giờ có thể có 3 trường hợp:
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 đó n
không phải là số nguyên tố.
n is not a prime
, và chứng minh điều đó, nếu không nó là một nguyên tố.
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ẻ.
`
Giả sử n
không phải là số nguyên tố (lớn hơn 1). Vì vậy, có những con số a
và b
như vậy
n = ab (1 < a <= b < n)
Bằng cách nhân mối quan hệ a<=b
với a
và b
chú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 a
và b
là 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ố.
Giả sử rằng số nguyên đã cho N
không phải là số nguyên tố,
Sau đó N có thể được nhân tố thành hai yếu tố a
và b
, 2 <= a, b < N
như 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 a
nhỏ hơn.
Bây giờ, nếu bạn không thể tìm thấy bất kỳ ước số nào N
thuộc về phạm vi [2, sqrt(N)]
, điều đó có nghĩa là gì?
Điều này có nghĩa rằng N
không có bất kỳ ước trong [2, a]
như a <= sqrt(N)
.
Do đó, a = 1
và b = n
do đó theo định nghĩa, N
là 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 đó N
khô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 N
là số nguyên tố hay không .
...
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 1
và dưới hoặc lên để sqrroot(n)
chia đều cho n
thì n
khô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;
}
guard
tuyê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.
++i
trở 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.
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).
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ố đó.
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 a
tăng thì b
giảm để duy trì a*b = n
. Do đó, p
là 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ị p
không nhất thiết có nghĩa là một số nguyên bởi vì nếu có, thì đó n
không phải là số nguyên tố. Vì vậy, p
có 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 p
là 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 root
và thực hiện nó để p
đi xa hơn một nửa phạm vi.
Đặ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.
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 > p1
và họ là số nguyên tố.
Nếu n % p1 === 0
sau đó n là một số tổng hợp.
Nếu n % p2 === 0
sau đó đoán những gì n % p1 === 0
là tốt!
Vì vậy, không có cách nào mà nếu n % p2 === 0
nhưng n % p1 !== 0
cù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.
Để 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).
n = a*b
vàa <= b
sau đóa*a <= a*b = n
.