BigInteger의 .isProbablePrime ()의 가능한 사용 사례는 무엇입니까?


84

방법BigInteger.isProbablePrime() 은 아주 이상합니다. 문서에서 이것은 숫자가 확률로 소수인지 여부를 알려줍니다 . 1 - 1 / 2^arg여기서는 arg정수 인수입니다.

JDK에 꽤 오랫동안 존재 해 왔기 때문에 반드시 사용해야합니다. 컴퓨터 과학과 알고리즘 (및 수학)에 대한 나의 제한된 지식은 숫자가 "아마도"소수인지 정확히 소수인지 아닌지를 아는 것이 실제로 의미가 없다는 것을 말해줍니다.

그렇다면이 방법을 사용하려는 가능한 시나리오는 무엇입니까? 암호화?



6
또한 Miller-Rabin 소수성 검정 . 가장 큰 장점은 속도 입니다. 예를 들어 요인을 확인하려는 경우 이러한 테스트를 수행하여 팩토링 프로세스의 속도를 높일 수 있습니다. "아마도"부분을 상당히 낮게 유지할 수 있으며 실제로 유용합니다. 그러나 나는 그것이 수레처럼 약간 흔들리고 이상하다는 것에 동의합니다.
keyser 2014

2
@ maxx777 그게 주어진다-나는 실제 사용 사례를 요청한다
fge dec

4
나는 downvotes 뒤에 이유를 설명하기 위해 downvoters처럼 정말하시기 바랍니다 거라고
FGE

17
"이것은 JDK에 꽤 오랫동안 존재 해 왔기 때문에 사용이 있어야 함을 의미합니다." -또는 쓸모없는 이유로 추가 된 후 제거되지 않았기 때문에 제거되지 않았습니다.
user253751 2014

답변:


67

예,이 방법은 암호화에 사용할 수 있습니다. RSA 암호화 는 때때로 1024 비트 (약 300 자리) 정도의 거대한 소수를 찾는 것을 포함합니다. RSA의 보안은 이러한 소수 중 2 개를 곱한 숫자를 인수 분해하는 것이 매우 어렵고 시간이 많이 소요된다는 사실에 달려 있습니다. 그러나 그것이 작동하기 위해서는 그들이 프라임이어야합니다.

이 숫자가 소수임을 증명하는 것도 어렵다는 것이 밝혀졌습니다. 그러나에서 사용하는 소수 검정 중 하나 인 Miller-Rabin 소수 검정isProbablePrime 은 숫자가 복합인지 또는 결론을 제공하지 않음을 감지합니다. 이 테스트 n시간을 실행하면 이 숫자가 실제로 합성 될 확률이 2n 분 의 1이라는 결론을 내릴 수 있습니다 . 이를 실행 100시간은 2 (1)의 허용 가능한 위험을 산출한다 (100) 이 복합 수 있음을.


3
@ Mr.777 나는 Rabin-Miller를 한두 번 보았지만 Miller-Rabin을 수십 번 보았다. 하지만 공식적인 이름이 있는지 잘 모르겠습니다.
keyser

3
@ Mr.777 위에서 링크 한 Wikipedia 페이지에는 먼저 "Miller-Rabin"이 나와 있지만 "Miller-Rabin 소수성 테스트 또는 Rabin-Miller 소수성 테스트"라는 두 이름을 모두 인정합니다.
rgettman 2014

5
의 구현 isProbablyPrime은 (내가 말할 수있는 한) 완전히 결정적입니다. 테스트 n시간을 실행하면 올바른 결과의 확률이 어떻게 향상됩니까? (이 임의성의 요소하더라도, 하나는 여러 번 호출의 임의성 당신이 설명하는 방식으로 위험에 영향을 미치는 독립이 필요합니다.)
테드 Hopp에게

11
@TedHopp 구현은 랜덤 생성기를 사용하며, 새로운 난수가있는 각 라운드는 합성물을 감지 할 수있는 3/4의 기회를 제공합니다. 기본 생성기는 강력한 임의성을 보장하는 SecureRandom입니다.
그 다른 사람

4
어려울 수 있지만 PRIMES가 P에 있음을 기억하십시오. AKS 테스트는 Miller-Rabin보다 느릴 수 있지만 지수 차이 또는 다항식이 없습니다. Miller-Rabin을 사용하여 여러 개의 가능한 소수를 찾고 AKS를 사용하여 이들이 소수임을 확실히 증명할 수 있습니다.
Bakuriu

20

테스트 결과 정수가 소수아니라고 표시 되면 100 %라고 확신 할 수 있습니다.

테스트에서 정수가 "가능한 소수"라고 말하면 의심을 품을 수 있습니다. 다양한 "베이스"로 테스트를 반복하면 소수 (다중 염기에 대해 강력한 의사 프라임이 됨)를 "모방"하는 데 잘못된 성공 확률을 원하는만큼 작게 만들 수 있습니다.

테스트의 유용성은 속도와 단순성에 있습니다. 최종 답변으로 "가능한 소수"의 상태에 반드시 만족할 필요는 없지만 소수성 테스트의 큰 총을 가져 오기 전에이 루틴사용하여 거의 모든 합성 숫자에 시간을 낭비하는 것을 피할 수 있습니다.

정수 인수 분해의 어려움에 대한 비교는 붉은 청어와 같습니다. 정수의 소수성은 다항식 시간에 결정될 수 있으며 실제로 Miller-Rabin 테스트를 충분히 많은 염기로 확장하는 것이 결정적이라는 증거가 있습니다 (가능한 소수와 반대로 소수를 감지). Generalized Riemann Hypothesis를 가정하므로 (더 비싼) AKS 소수성 검정 만큼 확실하지 않습니다 .


4
AKS는 2002 년 8 월에만 발견되었지만이 방법은 2002 년 2 월 이후 JDK에서 발견되었습니다
James_pic

3
아니요, 잠깐, 이것은 1997 년 2 월 이후 JDK에있었습니다. (나는 probablePrime방법이 아니라 방법 을보고있었습니다 isProbablePrime)
James_pic

1
실제로 Agrawal, Kayal 및 Saxena의 2002 년 논문 "PRIMES is in P"의 제목은 결정 론적 (일반 정수) 소수성 테스트를위한 다항식 ( n 비트 길이 ) 복잡성 의 첫 번째 무조건 증명을 나타 냅니다. Miller (1975)는 GRH를 가정 하면 정수의 소수성은 현재 AKS 또는 그 변형에 대해 알려진 것보다 훨씬 나은 지수 인 비트 길이의 4 승에 비례하는 단계에서 결정 론적으로 테스트 할 수 있음을 보여주었습니다 .
hardmath

AKS는 점근 적으로 더 빠르지 만 ECPP와 같은 방법은 '암호화'또는 '산업용'소수에 훨씬 더 효율적입니다.
Brett Hale 2014

2
AKS는 엄청나게 느리고 지질 규모 시간에서 계산할 수있는 숫자에 대해 APR-CL보다 빠르지 않습니다. APR-CL과 ECPP는 1997 년에 이미 사용되었습니다. Brett이 언급했듯이 증거를 원할 경우 ECPP가 좋은 선택입니다. 이들 모두는 가능한 프라임 방법 (예 : MR, BPSW, Frobenius)에 비해 느립니다.
DanaJ 2014

19

의 표준 사용 사례 BigInteger.isProbablePrime(int)는 암호화입니다. 특히 RSA 와 같은 특정 암호화 알고리즘 에는 무작위로 선택된 큰 소수가 필요합니다. 그러나 중요하게도 이러한 알고리즘은이 숫자 가 소수 가되도록 보장 할 필요가 없습니다 . 매우 높은 확률 로 소수 여야 합니다.

얼마나 높습니까? 음, 암호화 응용 프로그램에서 일반적으로 .isProbablePrime()128에서 256 사이의 인수를 사용하여 호출합니다. 따라서 비 프라임 번호가 이러한 테스트를 통과 할 확률은 2 128 또는 2 256 중 1 미만 입니다.

이를 관점에서 살펴 보겠습니다. 컴퓨터가 100 억 대이고 각 컴퓨터가 초당 100 억 개의 가능한 소수 (최신 CPU에서 숫자 당 1 클럭주기 미만을 의미 함)를 생성하고 해당 숫자의 소수를으로 테스트 한 .isProbablePrime(128)경우 평균적으로 1 천억 년한 번씩 소수가 아닌 숫자가 한 번씩 빠져 나갈 것으로 예상 합니다.

즉, 즉, 사건이 될 것입니다 경우 그 100 억 컴퓨터 수 어떻게 든 경험이없는 수십억 년의 수백에 대한 모든 실행 어떤 하드웨어 오류를. 그러나 실제로 는 임의의 우주선이 적절한 시간과 장소에 컴퓨터를 공격하여.isProbablePrime(128) 다른 감지 가능한 효과를 유발하지 않고 반환 값 을 거짓에서 참 으로 뒤집을 가능성이 훨씬 더 높습니다. 그 확실성 수준에서 확률 적 소수성 테스트를 실제로 통과하는 소수.

물론 무작위 우주선 및 기타 하드웨어 결함의 동일한 위험이 AKS 와 같은 결정 론적 소수성 테스트에도 적용됩니다 . 따라서 실제로 이러한 테스트조차도 임의의 하드웨어 오류로 인해 (매우 작은) 기준 오 탐률이 있습니다 (구현 버그와 같은 다른 모든 가능한 오류 원인은 말할 것도 없음).

테스트를 충분히 여러 번 반복하여 사용 된 Miller-Rabin 소수성 테스트 의 본질적인 위양성 비율을 .isProbablePrime()이 기준 비율보다 훨씬 아래로 내리는 것이 쉽기 때문에, 여러 번 반복해도 Miller-Rabin 테스트는 여전히 AKS와 같이 가장 잘 알려진 결정 론적 소수성 테스트보다 실제로 훨씬 빠르며 암호화 응용 프로그램의 표준 소수성 테스트로 남아 있습니다.

(게다가 실수로 RSA 계수의 요소 중 하나로 강력한 유사 프라임을 우연히 선택한 경우에도 일반적으로 치명적인 오류가 발생하지는 않습니다. 일반적으로 이러한 유사 프라임은 약 길이의 절반, 즉 멀티 프라임 RSA 키로 끝날 것임을 의미합니다 . 인자가 너무 작지 않은 한 ( 프라임 테스트가이를 포착 했어야 함) RSA 알고리즘은 여전히 잘 작동하며, 같은 길이의 일반 RSA 키보다 특정 유형의 공격에 대해 다소 약하지만 키 길이를 불필요하게 줄이지 않으면 키는 여전히 상당히 안전해야합니다.)


오류 문제는 AKS가 실제로 사용되지 않는 이유 중 하나이며 (놀랍도록 느린 속도가 다른 하나) ECPP가 더 일반적입니다. 아시다시피 알고리즘에서 구현 오류가 발생할 수 있으므로 독립 코드로 인증서를 확인하는 것이 도움이됩니다.
DanaJ

8

가능한 사용 사례는 주어진 숫자의 소수성을 테스트하는 것입니다 (그 자체로 많은 용도가있는 테스트에서). isProbablePrime알고리즘은 숫자가 실패 그렇다면, 훨씬 더 빨리 정확한 알고리즘에 비해 실행 isProbablePrime한 후 하나 개의 필요가 더 비싼 알고리즘을 실행하는 비용에 가지.


그렇다면 실용성을위한 것입니까? 그리고 소인수 분해가 NP 문제라는 사실 때문에?
fge 18:57에

@fge-예, 제가 제안한 사용 사례는 실용성을위한 것입니다. 이것이 소인수를 테스트하는 것보다 훨씬 더 어려운 문제인 소인수 분해에 도움이되는지 모르겠습니다. 후자의 경우 다항식 시간 알고리즘 인 AKS 소수성 테스트가 있습니다.
Ted Hopp 2014

5
@fge : Factorization은 실제로 NP에 있지만, Factorization이 알려지지 않은 "NP-complete"를 의미한다고 생각합니다 . 반대로 NP-hard가 아닌 것으로 강력하게 의심 됩니다.
hmakholm은 Monica에게


5

RSA 키 생성과 같은 알고리즘은 숫자가 소수인지 아닌지를 결정할 수있는 능력에 의존합니다.

그러나이 isProbablePrime방법이 JDK에 추가 된 시점 (1997 년 2 월)에는 숫자가 합리적인 시간 내에 소수인지 여부를 결정적으로 결정할 수있는 입증 된 방법이 없었습니다. 당시 가장 잘 알려진 접근 방식은 Miller-Rabin 알고리즘 이었습니다. 확률 론적 알고리즘은 때때로 오탐 (즉, 프라임이 아닌 것을 소수로보고)을 제공하지만 비용을 들여 오탐 가능성을 줄 이도록 조정할 수 있습니다. 런타임이 약간 증가합니다.

그 이후로 2002 년 8 월에 발견 된 AKS 알고리즘 과 같이 숫자가 합리적으로 신속하게 소수인지 여부를 결정 론적으로 결정할 수있는 알고리즘 이 발견되었습니다. 그러나 이러한 알고리즘은 여전히 ​​Miller-Rabin만큼 빠르지 않습니다.

더 좋은 질문은 isPrime2002 년 이후 JDK에 메소드가 추가 되지 않은 이유 일 것 입니다.


역사적 관점에 감사드립니다! @immibis가 "JDK에 있지만 제거되지 않음"에 대한 그의 의견과 함께 올바른 길을 가고있는 것 같습니다. :)
fge

1
Java가 표준 라이브러리에서 항목을 제거하지 않는 것으로 유명하지만 가능하더라도 제거 할 수 있을지 모르겠습니다. 일부 응용 프로그램의 경우 99.999999999 % 확실한 무언가가 소수라고 확신하는 것이 100 % 확신하는 것보다 훨씬 빠릅니다.
James_pic dec.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.