Trường hợp sử dụng khả thi của .isProbablePrime () của BigInteger là gì?


84

Phương phápBigInteger.isProbablePrime() khá lạ; từ các tài liệu, điều này sẽ biết được một số là số nguyên tố với một xác suất 1 - 1 / 2^arg, mà arglà đối số số nguyên.

Nó đã có mặt trong JDK khá lâu, vì vậy nó có nghĩa là nó phải có những công dụng. Kiến thức hạn chế của tôi về khoa học máy tính và thuật toán (và toán học) cho tôi biết rằng không thực sự có ý nghĩa khi biết liệu một số "có thể" là số nguyên tố nhưng không chính xác là số nguyên tố.

Vì vậy, một tình huống có thể xảy ra mà một người muốn sử dụng phương pháp này là gì? Mật mã học?



6
Ngoài ra, thử nghiệm tính nguyên thủy Miller-Rabin . Ưu điểm chính là tốc độ . Ví dụ: khi bạn muốn kiểm tra các yếu tố, bạn có thể thực hiện kiểm tra như vậy để tăng tốc quá trình bao thanh toán. Bạn có thể giữ phần "có thể" của nó khá thấp, và nó hữu ích trong thực tế. Nhưng tôi đồng ý rằng nó hơi run và kỳ lạ, giống như những chiếc phao.
keyer

2
@ maxx777 đó là một trường hợp sử dụng nhất định - tôi yêu cầu một trường hợp sử dụng thực tế
fge

4
Tôi thực sự muốn các downvoters để giải thích lý do đằng sau downvotes, xin vui lòng
FGE

17
"Nó đã có mặt trong JDK khá lâu, vì vậy nó có nghĩa là nó phải có những công dụng." - hoặc nó đã được thêm vào vì một lý do vô ích, sau đó không bị xóa vì không có gì được xóa.
user253751 12/1214

Câu trả lời:


67

Có, phương pháp này có thể được sử dụng trong mật mã. Mã hóa RSA liên quan đến việc tìm kiếm các số nguyên tố khổng lồ, đôi khi theo thứ tự 1024 bit (khoảng 300 chữ số). Tính bảo mật của RSA phụ thuộc vào thực tế là tính toán một số bao gồm 2 trong số các số nguyên tố này nhân với nhau là cực kỳ khó khăn và tốn thời gian. Nhưng để nó hoạt động, chúng phải là nguyên tố.

Nó chỉ ra rằng việc chứng minh những số nguyên tố cũng khó. Nhưng thử nghiệm tính sơ khai Miller-Rabin , một trong những thử nghiệm tính sơ khai được sử dụng isProbablePrime, phát hiện rằng một số là tổng hợp hoặc không đưa ra kết luận. Chạy thử nghiệm nlần này cho phép bạn kết luận rằng có 1 trong 2 n tỷ lệ cược rằng con số này thực sự là tổng hợp. Chạy nó 100nhiều lần sẽ mang lại rủi ro chấp nhận được là 1 trên 2 100 rằng con số này là tổng hợp.


3
@ Mr.777 Tôi đã thấy Rabin-Miller một hoặc hai lần nhưng Miller-Rabin hàng chục lần. Tôi không chắc liệu có tên chính thức hay không.
keyer

3
@ Mr.777 Trang Wikipedia mà tôi liên kết ở trên ghi "Miller-Rabin" trước, nhưng thừa nhận cả hai tên: "Thử nghiệm tính nguyên thủy Miller – Rabin hoặc Thử nghiệm tính nguyên thủy Rabin – Miller".
rgettman

5
Việc thực hiện isProbablyPrime(theo như tôi có thể nói) là hoàn toàn xác định. Làm thế nào để chạy các nthời gian thử nghiệm sẽ cải thiện tỷ lệ cược của một kết quả đúng? (Thậm chí nếu nó là một yếu tố ngẫu nhiên, người ta sẽ cần phải có tính ngẫu nhiên của nhiều cuộc gọi được độc lập ảnh hưởng đến nguy cơ theo cách bạn mô tả.)
Ted Hopp

11
@TedHopp Việc triển khai sử dụng một bộ tạo ngẫu nhiên và mỗi vòng với một số ngẫu nhiên mới sẽ cho 3/4 cơ hội phát hiện một tổng hợp. Trình tạo mặc định là SecureRandom, với đảm bảo tính ngẫu nhiên mạnh mẽ.
anh chàng kia

4
Tuy nhiên, có thể khó, tuy nhiên hãy nhớ rằng PRIMES nằm trong P. Kiểm tra AKS có thể chậm hơn Miller-Rabin nhưng không có sự khác biệt theo cấp số nhân hoặc đa thức giữa chúng. Bạn có thể sử dụng Miller-Rabin để tìm một loạt các số nguyên tố có thể xảy ra và sử dụng AKS để chắc chắn rằng chúng là số nguyên tố.
Bakuriu

20

Nếu bài kiểm tra cho bạn biết một số nguyên không phải là số nguyên tố , bạn chắc chắn có thể tin điều đó 100%.

Đó chỉ là mặt khác của câu hỏi, nếu bài kiểm tra cho bạn biết một số nguyên là "một số nguyên tố có thể xảy ra", bạn có thể nghi ngờ. Việc lặp lại phép thử với các "cơ số" khác nhau cho phép xác suất thành công sai khi "bắt chước" một số nguyên tố (là một giả nguyên tố mạnh đối với nhiều cơ số) nhỏ như mong muốn.

Tính hữu ích của bài kiểm tra nằm ở tốc độ và sự đơn giản của nó. Người ta sẽ không nhất thiết phải hài lòng với trạng thái "số nguyên tố có thể xảy ra" như một câu trả lời cuối cùng, nhưng người ta chắc chắn sẽ tránh lãng phí thời gian cho hầu hết tất cả các số tổng hợp bằng cách sử dụng quy trình này trước khi mang vào thử nghiệm độ nguyên thủy lớn .

Sự so sánh với độ khó của việc tính toán các số nguyên là một cái gì đó của một con cá trích đỏ. Người ta biết rằng tính nguyên thủy của một số nguyên có thể được xác định theo thời gian đa thức, và thực sự có bằng chứng cho thấy việc mở rộng thử nghiệm Miller-Rabin cho đủ nhiều cơ số là xác định (trong việc phát hiện số nguyên tố, trái ngược với số nguyên tố có thể xảy ra), nhưng điều này giả định Giả thuyết Riemann Tổng quát, vì vậy nó không hoàn toàn chắc chắn như thử nghiệm tính nguyên thủy AKS (đắt hơn) .


4
Điều đáng chú ý là AKS chỉ được phát hiện vào tháng 8 năm 2002, trong khi phương pháp này đã có trong JDK từ tháng 2 năm 2002
James_pic 12/1214

3
Không, chờ đã, điều này đã có trong JDK từ tháng 2 năm 1997 (tôi đang xem xét probablePrimephương pháp, không phải isProbablePrimephương pháp)
James_pic

1
Thật vậy, tiêu đề của bài báo năm 2002 của Agrawal, Kayal và Saxena "PRIMES is in P" báo hiệu bằng chứng vô điều kiện đầu tiên về độ phức tạp của đa thức (theo độ dài bit là n ) cho phép thử tính nguyên sơ xác định (số nguyên tổng quát). Miller (1975) đã chỉ ra rằng, giả sử GRH , tính nguyên thủy của một số nguyên có thể được kiểm tra một cách xác định theo các bước tỷ lệ với lũy thừa thứ tư của độ dài bit, một số mũ tốt hơn nhiều so với hiện tại được biết đối với AKS hoặc các biến thể của nó.
hardmath 12/1214

Trong khi AKS nhanh hơn về mặt tiệm cận, các phương pháp như ECPP sẽ hiệu quả hơn nhiều đối với các số nguyên tố 'mật mã' hoặc 'công nghiệp'.
Brett Hale

2
AKS cực kỳ chậm và sẽ không nhanh hơn APR-CL đối với bất kỳ số nào có thể tính toán được theo thời gian quy mô địa chất, quy mô con người ít hơn nhiều. APR-CL và ECPP đã ra đời vào năm 1997. Như Brett đã đề cập, ECPP là một lựa chọn tốt nếu chúng ta muốn có bằng chứng. Tất cả những điều này đều chậm so với các phương pháp nguyên tố có thể xảy ra (ví dụ: MR, BPSW, Frobenius).
DanaJ

19

Trường hợp sử dụng tiêu chuẩn cho BigInteger.isProbablePrime(int)là trong mật mã. Cụ thể, các thuật toán mật mã nhất định, chẳng hạn như RSA , yêu cầu các số nguyên tố lớn được chọn ngẫu nhiên. Tuy nhiên, điều quan trọng là các thuật toán này không thực sự yêu cầu những con số này phải được đảm bảo là số nguyên tố - chúng chỉ cần là số nguyên tố với xác suất rất cao.

Cao như thế nào là rất cao? Chà, trong một ứng dụng tiền điện tử, người ta thường gọi .isProbablePrime()với một đối số nằm trong khoảng từ 128 đến 256. Do đó, xác suất của một số không phải số nguyên tố vượt qua bài kiểm tra như vậy nhỏ hơn một trong 2 128 hoặc 2 256 .

Hãy đặt điều đó trong viễn cảnh: nếu bạn có 10 tỷ máy tính, mỗi máy tính tạo ra 10 tỷ số nguyên tố có thể xảy ra mỗi giây (có nghĩa là ít hơn một chu kỳ xung nhịp cho mỗi số trên bất kỳ CPU hiện đại nào) và tính nguyên thủy của những con số đó đã được kiểm tra .isProbablePrime(128), bạn trung bình, sẽ mong đợi một số không phải nguyên tố trượt một lần trong mỗi 100 tỷ năm .

Đó là trường hợp, nếu 10 tỷ máy tính đó bằng cách nào đó có thể chạy hàng trăm tỷ năm mà không gặp bất kỳ lỗi phần cứng nào . Tuy nhiên, trong thực tế, rất nhiều khả năng một tia vũ trụ ngẫu nhiên tấn công máy tính của bạn vào đúng thời điểm và địa điểm để lật giá trị trả về .isProbablePrime(128)từ false thành true, mà không gây ra bất kỳ hiệu ứng có thể phát hiện nào khác so với trường hợp không - số chuẩn để thực sự vượt qua bài kiểm tra tính nguyên sơ xác suất ở mức độ chắc chắn đó.

Tất nhiên, rủi ro tương tự đối với các tia vũ trụ ngẫu nhiên và các lỗi phần cứng khác cũng áp dụng cho các bài kiểm tra tính nguyên sơ xác định như AKS . Do đó, trên thực tế, ngay cả những thử nghiệm này cũng có tỷ lệ dương tính giả (rất nhỏ) do lỗi phần cứng ngẫu nhiên (chưa kể đến tất cả các nguồn lỗi có thể khác, chẳng hạn như lỗi triển khai).

Vì thật dễ dàng để đẩy tỷ lệ dương tính giả nội tại của xét nghiệm tính nguyên thủy Miller – Rabin được sử dụng .isProbablePrime()xuống thấp hơn nhiều so với tỷ lệ cơ bản này, chỉ cần lặp lại xét nghiệm đủ nhiều lần và kể cả khi lặp lại nhiều lần, xét nghiệm Miller – Rabin vẫn Trong thực tế nhanh hơn nhiều so với các bài kiểm tra tính nguyên sơ xác định được biết đến nhiều nhất như AKS, nó vẫn là bài kiểm tra tính nguyên sơ tiêu chuẩn cho các ứng dụng mật mã.

(Bên cạnh đó, ngay cả khi bạn vô tình chọn một giả mạo mạnh làm một trong những yếu tố của mô-đun RSA của bạn, nó thường sẽ không dẫn đến thất bại thảm hại. Thông thường, những giả như vậy sẽ là sản phẩm của hai (hoặc hiếm hơn) số nguyên tố xấp xỉ một nửa chiều dài, có nghĩa là bạn sẽ kết thúc với một khóa RSA nhiều nguyên tố . Miễn là không có yếu tố nào quá nhỏ (và nếu có, kiểm tra tính nguyên tố phải bắt được chúng), thuật toán RSA sẽ vẫn hoạt động tốt và khóa, mặc dù hơi yếu hơn khi chống lại một số kiểu tấn công nhất định so với các khóa RSA bình thường có cùng độ dài, nhưng vẫn phải an toàn hợp lý nếu bạn không cần thiết phải tiết kiệm độ dài khóa.)


Vấn đề lỗi là một lý do tại sao AKS thực sự không được sử dụng (tốc độ chậm đáng kinh ngạc là khác), và ECPP là phổ biến hơn. Như bạn lưu ý, lỗi triển khai trong các thuật toán là hoàn toàn có thể xảy ra, vì vậy việc xác minh chứng chỉ bằng mã độc lập là rất hữu ích.
DanaJ

8

Một trường hợp sử dụng khả thi là kiểm tra tính nguyên thủy của một số nhất định (trong thử nghiệm, bản thân nó có nhiều cách sử dụng). Các isProbablePrimethuật toán sẽ chạy nhanh hơn rất nhiều so với một thuật toán chính xác, vì vậy nếu số lượng thất bại isProbablePrime, sau đó một nhu cầu không đi đến các chi phí của chạy thuật toán đắt tiền hơn.


Vì vậy, đó là cho mục đích thực tế sau đó? Và do thực tế là thừa số nguyên tố là một bài toán NP?
fge

@fge - Có, trường hợp sử dụng mà tôi đề xuất là dành cho thực tế. Tôi không biết rằng điều này giúp ích cho việc phân tích số nguyên tố, đây là một vấn đề khó hơn đáng kể so với việc kiểm tra tính nguyên thủy. Đối với loại thứ hai, có một thuật toán thời gian đa thức: kiểm tra tính nguyên thủy AKS .
Ted Hopp

5
@fge: Thực sự thừa số hóa trong NP, nhưng tôi nghi ngờ ý bạn là "NP-đầy đủ", không rõ là thừa số hóa . Ngược lại, nó bị nghi ngờ không phải là NP-cứng.
hmakholm còn lại Monica

6

Tìm số nguyên tố có thể xảy ra là một vấn đề quan trọng trong mật mã. Nó chỉ ra rằng một chiến lược hợp lý để tìm một số nguyên tố k-bit có thể xảy ra là chọn nhiều lần một số k-bit ngẫu nhiên và kiểm tra nó về tính nguyên thủy có thể xảy ra bằng một phương pháp như isProbablePrime().

Để thảo luận thêm, hãy xem phần 4.4.1 của Sổ tay Mật mã Ứng dụng .

Cũng thấy Về việc tạo số nguyên tố có thể xảy ra bằng cách tìm kiếm gia tăng bởi Brandt và Damgård.


5

Các thuật toán như tạo khóa RSA dựa vào việc có thể xác định xem một số có phải là số nguyên tố hay không.

Tuy nhiên, tại thời điểm isProbablePrimephương pháp này được thêm vào JDK (tháng 2 năm 1997), không có cách nào được chứng minh để quyết định một cách rõ ràng liệu một số có phải là số nguyên tố trong một khoảng thời gian hợp lý hay không. Cách tiếp cận được biết đến nhiều nhất tại thời điểm đó là thuật toán Miller-Rabin - một thuật toán xác suất đôi khi cho kết quả dương tính giả (tức là sẽ báo cáo các số nguyên tố không phải là số nguyên tố), nhưng có thể được điều chỉnh để giảm khả năng dương tính giả, với chi phí tăng khiêm tốn trong thời gian chạy.

Kể từ đó, các thuật toán đã được phát hiện có thể quyết định một cách xác định xem một số có phải là số nguyên tố một cách nhanh chóng hay không, chẳng hạn như thuật toán AKS được phát hiện vào tháng 8 năm 2002. Tuy nhiên, cần lưu ý rằng các thuật toán này vẫn không nhanh bằng Miller-Rabin.

Có lẽ một câu hỏi hay hơn là tại sao không có isPrimephương pháp nào được thêm vào JDK kể từ năm 2002.


Cảm ơn về quan điểm lịch sử! Có vẻ như @immibis đã đi đúng hướng với nhận xét của anh ấy về việc "trong JDK nhưng không bao giờ bị xóa", sau đó? :)
fge

1
Tôi biết Java nổi tiếng không bao giờ xóa nội dung khỏi thư viện chuẩn, nhưng tôi không chắc họ sẽ xóa nó ngay cả khi có thể. Đối với một số ứng dụng, chắc chắn 99,999999999% một thứ gì đó chính là đủ tốt và nhanh hơn nhiều so với chắc chắn 100%.
James_pic
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.