Стандартним варіантом використання BigInteger.isProbablePrime(int)
є криптографія. Зокрема, певні криптографічні алгоритми, такі як RSA , вимагають випадково вибраних великих простих чисел. Однак важливо, що ці алгоритми насправді не вимагають, щоб ці числа були гарантованими як прості - вони просто повинні бути простими з дуже високою ймовірністю.
Наскільки висока дуже висока? Ну, у криптопрограмі, як правило, можна було б зателефонувати .isProbablePrime()
з аргументом десь між 128 і 256. Таким чином, ймовірність того, що непросте число пройде такий тест, менше, ніж одиниця в 2 128 або 2 256 .
Давайте покладемо , що в перспективі: якщо ви мали 10 мільярдів комп'ютерів, кожен з яких генерує 10 млрд ймовірними простих чисел в секунду (що означало б менше , ніж один тактовий цикл кожного номера на будь-який сучасний CPU) і простоти цих чисел була протестована .isProbablePrime(128)
, ви в середньому очікував би, що одне непросте число підскочить раз на 100 мільярдів років .
Тобто це було б так, якби ці 10 мільярдів комп’ютерів могли якимось чином працювати сотні мільярдів років, не зазнаючи жодних апаратних збоїв. На практиці, однак, це набагато більш імовірно , для випадкового космічних променів , щоб вдарити ваш комп'ютер в потрібний час і місце , щоб перевертати повертається значення з .isProbablePrime(128)
від помилкового до істини, не викликаючи жодних інших виявляються ефектів, ніж для НЕ -просте число, щоб насправді пройти імовірнісний тест на первинність на цьому рівні визначеності.
Звичайно, той самий ризик випадкових космічних променів та інших апаратних несправностей стосується і детермінованих тестів на первинність, таких як AKS . Таким чином, на практиці навіть ці тести мають (дуже малий) вихідний показник хибнопозитивних результатів через випадкові збої обладнання (не кажучи вже про всі інші можливі джерела помилок, такі як помилки реалізації).
Оскільки неважко відхилити власний хибнопозитивний показник тесту на первинність Міллера – Рабіна, що використовується .isProbablePrime()
набагато нижче цього базового рівня, просто повторивши тест досить багато разів, і оскільки, навіть повторений стільки разів, тест Міллера – Рабіна все ще залишається набагато швидше на практиці, ніж найвідоміші детерміновані тести на первинність, такі як AKS, він залишається стандартним тестом на первинність для криптографічних додатків.
(Крім того, навіть якщо ви випадково вибрали сильний псевдозлочинність як один із факторів вашого модуля RSA, це, як правило, не призведе до катастрофічного зриву. Як правило, такі псевдозалежності будуть продуктом двох (або рідко більше) простих чисел приблизно половина довжини, а це означає, що у вас вийшов би мультипростий ключ RSA . Поки жоден з факторів не був занадто малим (а якщо і був, тест на первинність мав би їх схопити), алгоритм RSA буде як і раніше працюють нормально, і ключ, хоч і дещо слабший проти певних типів атак, ніж звичайні ключі RSA тієї ж довжини, все одно повинен бути достатньо захищеним, якщо ви не витрачали без потреби на довжину ключа.)