BigInteger'ın .isProbablePrime () olası kullanım durumu nedir?


84

YöntemBigInteger.isProbablePrime() oldukça tuhaf; Bu, dokümantasyondan, bir sayının asal olup olmadığını, olasılıkla , tamsayı argümanının 1 - 1 / 2^argnerede argolduğunu söyleyecektir .

JDK'da oldukça uzun bir süredir mevcut, bu yüzden kullanımları olması gerektiği anlamına geliyor. Bilgisayar bilimi ve algoritmalarındaki (ve matematik) sınırlı bilgim, bir sayının "muhtemelen" asal olup olmadığını, ancak tam olarak asal olmadığını bilmenin gerçekten mantıklı olmadığını söylüyor.

Öyleyse, bu yöntemi kullanmak isteyebileceğiniz olası bir senaryo nedir? Kriptografi mi?



6
Ayrıca Miller-Rabin asallık testi . Ana avantaj hızdır . Örneğin faktörleri kontrol etmek istediğinizde, faktoring sürecini hızlandırmak için böyle bir test yapabilirsiniz. Bunun "muhtemelen" kısmını oldukça düşük tutabilirsiniz ve pratikte kullanışlıdır. Ama şamandıralar gibi biraz titrek ve garip olduğuna katılıyorum.
keyer

2
@ maxx777 bu bir verilmiş - gerçek bir kullanım örneği istiyorum
fge

4
Olumsuz oy kullananların olumsuz oyların arkasındaki nedenleri açıklamalarını gerçekten çok isterim, lütfen
fge

17
"JDK'da oldukça uzun bir süredir mevcut, bu yüzden kullanımları olması gerektiği anlamına geliyor." - ya da işe yaramaz bir nedenle eklendi, sonra hiçbir şey kaldırılmadığı için kaldırılmadı.
user253751

Yanıtlar:


67

Evet, bu yöntem kriptografide kullanılabilir. RSA şifrelemesi , bazen 1024 bit (yaklaşık 300 hane) düzeyinde büyük asal sayıların bulunmasını içerir. RSA'nın güvenliği, bu asal sayılardan ikisinin çarpımından oluşan bir sayıyı çarpanlarına ayırmanın son derece zor ve zaman alıcı olduğu gerçeğine bağlıdır. Ama işe yaraması için asal olmalılar.

Bu sayıların asalını kanıtlamanın da zor olduğu ortaya çıktı. Ancak, asallık testlerinden biri olan Miller-Rabin asallık testi , isProbablePrimebir sayının bileşik olduğunu algılar veya hiçbir sonuç vermez. Bu test Koşu nkez bir 1 2 olduğu sonucunu sağlayan n bu sayı gerçekten kompozit olduğunu oran. Bunu 100kez çalıştırmak , bu sayının bileşik olduğu 2 100'de 1 kabul edilebilir risk oluşturur .


3
@ Bay.777 Rabin-Miller'ı bir veya iki kez gördüm ama Miller-Rabin'i onlarca kez gördüm. Yine de resmi bir isim var mı emin değilim.
Keyser

3
@ Mr.777 Yukarıda bağladığım Wikipedia sayfasında önce "Miller-Rabin" yazıyor, ancak her iki adı da kabul ediyor: "Miller – Rabin asallık testi veya Rabin – Miller asallık testi".
rgettman

5
Uygulaması isProbablyPrime(söyleyebildiğim kadarıyla) tamamen deterministiktir. Test nsürelerini çalıştırmak doğru sonucun olasılığını nasıl artırır? (Bu bir rastgelelik unsuru olsa bile, riski tanımladığınız şekilde etkilemek için birden fazla aramanın rastlantısallığının bağımsız olması gerekir.)
Ted Hopp

11
@TedHopp Uygulama rastgele bir oluşturucu kullanır ve yeni bir rastgele sayı içeren her tur, bir kompoziti tespit etmek için 3/4 şans verir. Varsayılan oluşturucu, güçlü rastgelelik garantilerine sahip SecureRandom'dur.
diğer adam

4
Bu zor olabilir, ancak PRIMES'in P'de olduğunu unutmayın. AKS testi Miller-Rabin'den daha yavaş olabilir ancak aralarında üssel bir fark veya polinom yoktur. Miller-Rabin'i olası asal sayıları bulmak için kullanabilir ve bunların asal olduklarını kesinlikle kanıtlamak için AKS'yi kullanabilirsiniz.
Bakuriu

20

Test size bir tamsayının asal olmadığını söylerse, buna kesinlikle% 100 inanabilirsiniz.

Eğer test size bir tamsayının "olası bir asal sayı" olduğunu söylerse, sorunun yalnızca diğer tarafıdır, şüphe uyandırabilirsiniz. Testin değişken "bazlarla" tekrarlanması, bir asal "taklit etme" (çoklu bazlara göre güçlü bir sözde-prime olma) konusunda yanlış bir şekilde başarılı olma olasılığının istenildiği kadar küçük yapılmasına izin verir.

Testin faydası, hızı ve basitliğinde yatmaktadır. Nihai cevap olarak "olası asal" statüsünden memnun olunmayabilir, ancak asıllık testinin büyük silahlarını getirmeden önce bu rutini kullanarak neredeyse tüm bileşik sayılarda zaman kaybetmekten kesinlikle kaçınılacaktır .

Tam sayıları çarpanlara ayırmanın zorluğuyla karşılaştırmak kırmızı ringa balığı gibidir. Bir tamsayının asallığının polinom zamanında belirlenebileceği bilinmektedir ve gerçekten de Miller-Rabin testinin yeterince çok sayıda temele uzatılmasının kesin olduğuna dair bir kanıt vardır (olası asal sayıların aksine asal sayıların saptanmasında), ancak bu Genelleştirilmiş Riemann Hipotezini varsayar, bu nedenle (daha pahalı) AKS asallık testi kadar kesin değildir .


4
AKS'nin yalnızca Ağustos 2002'de keşfedildiğini, bu yöntemin Şubat 2002'den beri
JDK'da bulunduğunu belirtmek gerekir

3
Hayır, bekle, bu Şubat 1997'den beri probablePrimeisProbablePrime
JDK'da (

1
Gerçekten, Agrawal, Kayal ve Saxena'nın 2002 tarihli makalesi "PRIMES is in P" deterministik (genel tamsayı) primality testi için polinom ( n bit uzunluğunda ) karmaşıklığının ilk koşulsuz kanıtını işaret ediyor . Miller (1975), GRH varsayımıyla , bir tamsayının asallığının bit uzunluğunun dördüncü kuvvetiyle orantılı adımlarla deterministik olarak test edilebileceğini, AKS veya varyantları için şu anda bilinenden çok daha iyi bir üs olduğunu göstermişti.
hardmath

AKS asimptotik olarak daha hızlı olsa da, ECPP gibi yöntemler 'kriptografik' veya 'endüstriyel' astarlar için çok daha verimli olacaktır.
Brett Hale

2
AKS delice yavaştır ve jeolojik ölçek süresinde hesaplanabilen herhangi bir sayı için APR-CL'den daha hızlı olmayacaktır, çok daha az insan ölçeği. APR-CL ve ECPP 1997'de zaten buradaydı. Brett'in bahsettiği gibi, bir kanıt istiyorsak ECPP iyi bir seçimdir. Bunların tümü, olası birincil yöntemlere (örn. MR, BPSW, Frobenius) kıyasla yavaştır.
DanaJ

19

Standart kullanım durumu BigInteger.isProbablePrime(int)kriptografidir. Spesifik olarak, RSA gibi belirli şifreleme algoritmaları, rastgele seçilmiş büyük asal sayıları gerektirir. Daha da önemlisi, bu algoritmalar bu sayıların asal olmalarının garanti edilmesini gerçekten gerektirmez - sadece çok yüksek bir olasılıkla asal olmaları gerekir .

Ne kadar yüksek çok yüksek? Bir kripto uygulamasında, tipik olarak .isProbablePrime()128 ile 256 arasında bir yerde bir argümanla çağrılır. Dolayısıyla, asal olmayan bir sayının böyle bir testi geçme olasılığı 2 128 veya 2 256'da birden azdır .

Eğer 10 milyar bilgisayarları, (herhangi bir modern CPU üzerindeki sayısı başına daha az bir saat döngüsü anlamına geleceğini) Her üreten saniyede 10 milyar muhtemel asal sayılar ve bu sayıların asallık olsaydı ile test edilmiştir: perspektifle o edelim koymak .isProbablePrime(128)sizin, ortalama olarak, asal olmayan bir sayının her 100 milyar yılda bir düşmesini bekler .

Yani, eğer bu 10 milyar bilgisayar, herhangi bir donanım arızası yaşamadan yüz milyarlarca yıl boyunca bir şekilde çalışabilseydi, durum bu olurdu . Uygulamada, olsa da, bu çok doğru zamanda ve dönüş değeri çevirmek için yerde bilgisayarınızı grev rastgele kozmik ışın için daha muhtemel ait .isProbablePrime(128)bir olmayan için olandan başka saptanabilir etkilere neden olmadan, yanlıştan true -Asal sayı, olasılıksal asallık testini o kesinlik düzeyinde gerçekten geçmek için.

Tabii ki, rastgele kozmik ışınlar ve diğer donanım hataları için aynı risk, AKS gibi deterministik asallık testleri için de geçerlidir . Bu nedenle, pratikte, bu testler bile rastgele donanım arızalarından kaynaklanan (çok küçük) bir temel yanlış pozitif oranına sahiptir (uygulama hataları gibi diğer tüm olası hata kaynaklarından bahsetmiyorum bile).

Kullanılan Miller-Rabin asallık testinin içsel yanlış pozitif oranını, .isProbablePrime()bu temel oranın çok altına itmek kolay olduğundan , sadece testi yeterince tekrarlayarak ve birçok kez tekrarlanmasına rağmen Miller-Rabin testi hala AKS gibi en iyi bilinen deterministik asallık testlerinden çok daha hızlı pratikte, kriptografik uygulamalar için standart asallık testi olmaya devam ediyor.

(Ayrıca, RSA modülünüzün faktörlerinden biri olarak yanlışlıkla güçlü bir sahte suç seçmiş olsanız bile, bu genellikle yıkıcı bir başarısızlığa yol açmaz. Tipik olarak, bu tür sahte suçlar, yaklaşık olarak iki (veya nadiren daha fazla) asalın ürünleri olacaktır. uzunluğun yarısı, yani birden çok üssü RSA anahtarına sahip olacağınız anlamına gelir . Faktörlerden hiçbiri çok küçük olmadığı sürece (ve eğer öyleyse, asallık testi onları yakalamalıydı), RSA algoritması yine de gayet iyi çalışıyor ve anahtar, belirli saldırı türlerine karşı aynı uzunluktaki normal RSA anahtarlarından biraz daha zayıf olsa da, anahtar uzunluğunda gereksiz yere eksik kalmadıysanız, yine de makul derecede güvenli olmalıdır.)


Arıza sorunu, AKS'nin gerçekte kullanılmamasının bir nedenidir (şaşırtıcı derecede yavaş hız diğeridir) ve ECPP daha yaygındır. Dikkat edeceğiniz gibi, algoritmalardaki uygulama hataları oldukça olasıdır, bu nedenle bağımsız kodla doğrulanmış bir sertifikaya sahip olmak yararlıdır.
DanaJ

8

Olası bir kullanım durumu, belirli bir sayının asallığını test etmektir (kendi içinde birçok kullanımı olan testte). isProbablePrimeAlgoritma numarası başarısız eğer öyleyse, çok daha hızlı kesin algoritma daha çalışacak isProbablePrime, sonra bir ihtiyaç daha pahalı algoritma çalışan pahasına gitmez.


Öyleyse, bu pratiklik açısından mı? Ve asal çarpanlara ayırmanın bir NP problemi olması nedeniyle mi?
2014,

@fge - Evet, önerdiğim kullanım senaryosu pratiklik içindir. Bunun, asallığı test etmekten çok daha zor bir problem olan asal çarpanlara ayırmaya yardımcı olduğunu bilmiyorum. İkincisi için, bir polinom-zaman algoritması vardır: AKS asallık testi .
Ted Hopp

5
@fge: çarpanlara gerçekten NP, ama sen hangi çarpanlara, "NP-tam" anlamına şüpheli değil olduğu da bilinir. Aksine, NP-sert olmadığından kuvvetle şüpheleniliyor .
hmakholm,

6

Olası asal sayıları bulmak , kriptografide önemli bir sorundur. Olası bir k-bit asalını bulmak için makul bir stratejinin, rasgele bir k-bit sayısını tekrar tekrar seçmek ve benzeri bir yöntem kullanarak olası asallık için test etmek olduğu ortaya çıktı isProbablePrime().

Daha fazla tartışma için Uygulamalı Kriptografi El Kitabı'nın 4.4.1 bölümüne bakın .

Ayrıca Brandt ve Damgård tarafından yapılan artımlı aramayla olası asalların üretilmesi üzerine bakın .


5

RSA anahtarı oluşturma gibi algoritmalar, bir sayının asal olup olmadığını belirleyebilmeye dayanır.

Ancak, isProbablePrimeyöntemin JDK'ya eklendiği sırada (Şubat 1997), makul bir süre içinde bir sayının asal olup olmadığına belirleyici olarak karar vermenin kanıtlanmış bir yolu yoktu. O zaman en iyi bilinen yaklaşım Miller-Rabin algoritmasıydı - bazen yanlış pozitifler veren (yani, asal olmayanları asal olarak bildiren), ancak pahasına yanlış pozitif olasılığını azaltmak için ayarlanabilen bir olasılık algoritması çalışma süresinde mütevazı artışlar.

O zamandan beri, Ağustos 2002'de keşfedilen AKS algoritması gibi, bir sayının makul derecede hızlı olup olmadığına belirleyici olarak karar verebilecek algoritmalar keşfedildi. Ancak, bu algoritmaların hala Miller-Rabin kadar hızlı olmadığı unutulmamalıdır.

Belki de daha iyi bir soru, isPrime2002'den beri JDK'ya neden hiçbir yöntemin eklenmediğidir.


Tarihsel bakış açısı için teşekkürler! Görünüşe göre @immibis "JDK'da ama hiç kaldırılmamış" hakkındaki yorumuyla doğru yoldaydı, peki? :)
fge

1
Java'nın standart kitaplıktan hiçbir şey çıkarmadığını biliyorum, ancak yapabilseler bile kaldıracaklarından emin değilim. Bazı uygulamalar için% 99,999999999, bir şeyin en iyi değerinin yeterince iyi olduğundan emin olmak ve% 100 emin olmaktan çok daha hızlıdır.
James_pic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.