Jaki jest możliwy przypadek użycia .isProbablePrime () BigIntegera?


84

MetodaBigInteger.isProbablePrime() jest dość dziwna; na podstawie dokumentacji pokaże, czy liczba jest liczbą pierwszą z prawdopodobieństwem 1 - 1 / 2^arg, gdzie argjest argumentem całkowitym.

W JDK jest obecny od dość dawna, więc oznacza to, że musi mieć zastosowania. Moja ograniczona wiedza z zakresu informatyki i algorytmów (i matematyki) mówi mi, że nie ma sensu wiedzieć, czy liczba jest „prawdopodobnie” liczbą pierwszą, ale nie dokładnie.

Jaki jest więc możliwy scenariusz, w którym chciałoby się użyć tej metody? Kryptografia?



6
Również test pierwszości Millera-Rabina . Główną zaletą jest szybkość . Np. Jeśli chcesz sprawdzić czynniki, możesz zrobić taki test, aby przyspieszyć proces faktoringu. Część „prawdopodobnie” można utrzymywać dość nisko i jest to przydatne w praktyce. Ale zgadzam się, że jest trochę chwiejny i dziwny, jak pływaki.
keyser

2
@ maxx777 to jest dane - proszę o rzeczywisty przypadek użycia
fge

4
Naprawdę chciałbym, aby ci, którzy przegrywali, wyjaśnili powody negatywnych głosów, proszę
fge

17
„Jest obecny w JDK od dłuższego czasu, więc oznacza to, że musi mieć zastosowania”. - lub został dodany z bezużytecznego powodu, a następnie nie został usunięty, ponieważ nic nie jest usuwane.
user253751

Odpowiedzi:


67

Tak, ta metoda może być używana w kryptografii. Szyfrowanie RSA polega na znajdowaniu ogromnych liczb pierwszych, czasami rzędu 1024 bitów (około 300 cyfr). Bezpieczeństwo RSA zależy od tego, że faktoryzacja liczby składającej się z 2 takich liczb pierwszych pomnożonych razem jest niezwykle trudna i czasochłonna. Ale żeby zadziałało, muszą być pierwsi.

Okazuje się, że udowodnienie tych liczb pierwszych jest również trudne. Ale test pierwszości Millera-Rabina , jeden z testów pierwszości stosowanych przez isProbablePrime, albo wykrywa, że ​​liczba jest złożona, albo nie daje żadnych wniosków. Przeprowadzenie tego testu npozwala stwierdzić, że istnieje prawdopodobieństwo 1 do 2 n, że ta liczba jest naprawdę złożona. Liczenie 100czasów daje akceptowalne ryzyko 1 na 2 100, że ta liczba jest złożona.


3
@ Mr 777 Widziałem Rabina-Millera raz lub dwa, ale Millera-Rabina dziesiątki razy. Nie jestem jednak pewien, czy istnieje oficjalna nazwa.
keyser

3
@ Mr.777 Strona Wikipedii, do której odsyłam powyżej, podaje najpierw „Miller-Rabin”, ale uznaje obie nazwy: „Test pierwszości Millera – Rabina lub Test pierwszości Rabina – Millera”.
rgettman,

5
Implementacja isProbablyPrimejest (o ile wiem) w pełni deterministyczna. W jaki sposób przeprowadzanie testów npoprawiłoby szanse uzyskania prawidłowego wyniku? (Nawet gdyby był to element losowości, losowość wielu wywołań musiałaby być niezależna, aby wpływać na ryzyko w sposób, w jaki opisujesz.)
Ted Hopp,

11
@TedHopp Implementacja wykorzystuje generator losowy, a każda runda z nowymi liczbami losowymi daje 3/4 szansy na wykrycie złożonego. Domyślnym generatorem jest SecureRandom, z silnymi gwarancjami losowości.
ten inny facet

4
Może to być trudne, jednak pamiętaj, że PRIMES jest w P. Test AKS może być wolniejszy niż Miller-Rabin, ale nie ma między nimi wykładniczej różnicy ani wielomianu. Możesz użyć Millera-Rabina, aby znaleźć kilka prawdopodobnych liczb pierwszych i użyć AKS, aby zdecydowanie udowodnić, że są one liczbami pierwszymi.
Bakuriu,

20

Jeśli test powie ci, że liczba całkowita nie jest liczbą pierwszą , możesz z pewnością uwierzyć, że 100%.

To tylko druga strona pytania, jeśli test mówi ci, że liczba całkowita jest „prawdopodobną liczbą pierwszą”, możesz mieć wątpliwości. Powtórzenie testu z różnymi „zasadami” pozwala na zmniejszenie prawdopodobieństwa błędnego „imitowania” liczby pierwszej (będącej silną pseudopierwszą w odniesieniu do wielu zasad).

Przydatność testu polega na jego szybkości i prostocie. Niekoniecznie zadowalałby się status „prawdopodobnej liczby pierwszej” jako ostatecznej odpowiedzi, ale zdecydowanie można by uniknąć marnowania czasu na prawie wszystkie liczby złożone, stosując tę ​​procedurę przed wprowadzeniem wielkich dział testowania pierwszości .

Porównanie z trudnością faktoringu liczb całkowitych jest czymś w rodzaju czerwonego śledzia. Wiadomo, że prymat liczby całkowitej można określić w czasie wielomianowym i rzeczywiście istnieje dowód na to, że rozszerzenie testu Millera-Rabina na wystarczającą liczbę zasad jest ostateczne (w wykrywaniu liczb pierwszych, w przeciwieństwie do prawdopodobnych liczb pierwszych), ale to zakłada uogólnioną hipotezę Riemanna, więc nie jest tak pewna, jak (droższy) test pierwszości AKS .


4
Warto zauważyć, że AKS odkryto dopiero w sierpniu 2002 r., Podczas gdy ta metoda jest w JDK od lutego 2002 r.
James_pic

3
Nie, czekaj, to jest w JDK od lutego 1997 roku (patrzyłem na probablePrimemetodę, a nie isProbablePrimemetodę)
James_pic

1
Rzeczywiście, tytuł artykułu Agrawala, Kayala i Saxeny z 2002 r. „PRIMES jest w P” sygnalizuje pierwszy bezwarunkowy dowód złożoności wielomianu (w bitach o długości n ) dla deterministycznych (ogólnych liczb całkowitych) testów pierwszości. Miller (1975) wykazał, że zakładając GRH , prymat liczby całkowitej można testować deterministycznie w krokach proporcjonalnych do czwartej potęgi długości bitu, co jest znacznie lepszym wykładnikiem niż jest to obecnie znane dla AKS lub jego wariantów.
hardmath

Chociaż AKS jest asymptotycznie szybszy, metody takie jak ECPP byłyby znacznie bardziej wydajne w przypadku liczb pierwszych „kryptograficznych” lub „przemysłowych”.
Brett Hale

2
AKS jest niesamowicie powolny i nie będzie szybszy niż APR-CL dla dowolnej liczby obliczalnej w czasie skali geologicznej, znacznie mniej w skali ludzkiej. APR-CL i ECPP istniały już w 1997 roku. Jak wspomina Brett, ECPP to dobry wybór, jeśli chcemy dowodu. Wszystkie z nich są powolne w porównaniu z prawdopodobnymi metodami podstawowymi (np. MR, BPSW, Frobenius).
DanaJ

19

Standardowy przypadek użycia BigInteger.isProbablePrime(int)to kryptografia. W szczególności niektóre algorytmy kryptograficzne, takie jak RSA , wymagają losowo wybranych dużych liczb pierwszych. Jednak co ważne, te algorytmy nie wymagają, aby te liczby były gwarantowane jako pierwsze - po prostu muszą być liczbami pierwszymi z bardzo dużym prawdopodobieństwem.

Jak wysoko jest bardzo wysoko? Cóż, w aplikacji kryptograficznej zwykle dzwoniłoby się .isProbablePrime()z argumentem między 128 a 256. Zatem prawdopodobieństwo, że liczba inna niż pierwsza przejdzie taki test jest mniejsze niż jeden na 2 128 lub 2 256 .

Spójrzmy na to z perspektywy: gdybyś miał 10 miliardów komputerów, z których każdy generował 10 miliardów prawdopodobnych liczb pierwszych na sekundę (co oznaczałoby mniej niż jeden cykl zegara na liczbę na dowolnym nowoczesnym procesorze), a pierwotność tych liczb została przetestowana .isProbablePrime(128)na spodziewałby się, że jedna liczba inna niż pierwsza pojawi się raz na 100 miliardów lat .

To znaczy, że tak by było, gdyby te 10 miliardów komputerów mogło w jakiś sposób działać przez setki miliardów lat bez żadnych awarii sprzętu. W praktyce jednak, jest to dużo bardziej prawdopodobne w przypadku losowego promieniowania kosmicznego uderzyć komputer w odpowiednim czasie i miejscu, aby odwrócić wartości zwracanej z .isProbablePrime(128)z false na true, nie powodując żadnych innych efektów wykrywalne, niż jest to dla nie -liczba pierwsza, która faktycznie przejdzie probabilistyczny test pierwszości na tym poziomie pewności.

Oczywiście to samo ryzyko przypadkowych promieni kosmicznych i innych usterek sprzętowych dotyczy również deterministycznych testów pierwszości, takich jak AKS . Dlatego w praktyce nawet te testy mają (bardzo mały) podstawowy wskaźnik fałszywie pozytywnych wyników z powodu przypadkowych awarii sprzętu (nie wspominając o wszystkich innych możliwych źródłach błędów, takich jak błędy implementacji).

Ponieważ łatwo jest przesunąć wewnętrzny odsetek fałszywie dodatnich wyników testu pierwszości Millera – Rabina, stosowanego .isProbablePrime()znacznie poniżej tego wskaźnika podstawowego, po prostu powtarzając test dostatecznie wiele razy, a ponieważ, nawet powtarzany tak wiele razy, test Millera – Rabina jest nadal znacznie szybszy w praktyce niż najbardziej znane deterministyczne testy pierwszości, takie jak AKS, pozostaje standardowym testem pierwszości dla aplikacji kryptograficznych.

(Poza tym, nawet jeśli przypadkowo wybrałeś silną liczbę pseudopierwszą jako jeden z czynników twojego modułu RSA, generalnie nie doprowadziłoby to do katastrofalnej awarii. Zazwyczaj takie liczby pseudopierwsze byłyby iloczynami dwóch (lub rzadko więcej) liczb pierwszych w przybliżeniu połowę długości, co oznacza, że ​​otrzymasz klucz RSA o wielu liczbach pierwszych . Dopóki żaden z tych czynników nie będzie zbyt mały (a jeśli tak, to test pierwszości powinien je wychwycić), algorytm RSA będzie nadal działa dobrze, a klucz, chociaż nieco słabszy w przypadku niektórych typów ataków niż zwykłe klucze RSA o tej samej długości, powinien być wystarczająco bezpieczny, jeśli nie będziesz niepotrzebnie skąpić na długości klucza.)


Problem z usterką jest jednym z powodów, dla których AKS nie jest w rzeczywistości używany (drugą jest zadziwiająco niska prędkość), a ECPP jest bardziej powszechne. Jak zauważyłeś, błędy implementacji algorytmów są całkiem możliwe, więc posiadanie certyfikatu weryfikowanego niezależnym kodem jest pomocne.
DanaJ

8

Możliwym przypadkiem użycia jest testowanie pierwszości podanej liczby (w teście, który sam w sobie ma wiele zastosowań). isProbablePrimeAlgorytm będzie działał znacznie szybciej niż dokładnego algorytmu, więc jeżeli liczba awarii isProbablePrime, a następnie jeden nie musi iść na koszt prowadzenia droższej algorytmu.


Więc czy to ze względów praktycznych? A ze względu na fakt, że faktoryzacja podstawowa jest problemem NP?
fge

@fge - Tak, zaproponowany przeze mnie przypadek użycia dotyczy praktyczności. Nie wiem, czy to pomaga w rozkładaniu na czynniki pierwsze, co jest znacznie trudniejszym problemem niż testowanie pierwotności. W przypadku tego drugiego istnieje algorytm wielomianowy: test pierwszości AKS .
Ted Hopp,

5
@fge: Faktoryzacja jest rzeczywiście w NP, ale podejrzewam, że miałeś na myśli „NP-zupełny”, co nie jest znane. Wręcz przeciwnie, podejrzewa się, że nie jest to NP-trudne.
hmakholm zostawił Monikę w

6

Znalezienie prawdopodobnych liczb pierwszych jest ważnym problemem w kryptografii. Okazuje się, że rozsądną strategią znajdowania prawdopodobnej k-bitowej liczby pierwszej jest wielokrotne wybieranie losowej liczby k-bitowej i testowanie jej pod kątem prawdopodobnej pierwszości przy użyciu metody takiej jak isProbablePrime().

Dalsza dyskusja znajduje się w sekcji 4.4.1 podręcznika Handbook of Applied Cryptography .

Zobacz także O generowaniu prawdopodobnych liczb pierwszych przez wyszukiwanie przyrostowe Brandta i Damgårda.


5

Algorytmy, takie jak generowanie kluczy RSA, polegają na możliwości określenia, czy liczba jest liczbą pierwszą, czy nie.

Jednak w czasie, gdy isProbablePrimemetoda została dodana do JDK (luty 1997 r.), Nie było udowodnionego sposobu, aby w sposób deterministyczny zdecydować, czy liczba jest liczbą pierwszą w rozsądnym czasie. Najbardziej znanym podejściem w tamtym czasie był algorytm Millera-Rabina - algorytm probabilistyczny, który czasami dawał fałszywe alarmy (tj. Zgłaszał liczby niebędące liczbami pierwszymi jako liczby pierwsze), ale można go było dostroić w celu zmniejszenia prawdopodobieństwa fałszywych trafień kosztem niewielkich wzrostów czasu działania.

Od tego czasu odkryto algorytmy, które mogą deterministycznie decydować o tym, czy liczba jest odpowiednio szybko pierwsza, na przykład algorytm AKS, który został odkryty w sierpniu 2002 roku. Należy jednak zauważyć, że algorytmy te nadal nie są tak szybkie jak Miller-Rabin.

Być może lepszym pytaniem jest, dlaczego żadna isPrimemetoda nie została dodana do JDK od 2002 roku.


Dzięki za historyczną perspektywę! Wygląda na to, że @immibis był na dobrej drodze ze swoim komentarzem na temat „w JDK, ale nigdy nie został usunięty”? :)
fge

1
Wiem, że Java nigdy nie usuwa rzeczy ze standardowej biblioteki, ale nie jestem pewien, czy usunęliby je, nawet gdyby mogli. W przypadku niektórych aplikacji posiadanie 99,999999999% pewności, że coś jest pierwsze, jest wystarczająco dobre i znacznie szybsze niż uzyskanie 100% pewności.
James_pic
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.