51nod 1186 대수 소수 판단 (java) +. isProbablePrime (int certainty) 알 아 보기
Input
N(2 <= N <= 10^30)
Output
N , "Yes", "No"。
입력 예제
17
출력 예제
Yes
import java.math.BigInteger;
import java.util.Scanner;
public class Bigshu {
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
BigInteger x;
x = cin.nextBigInteger();
if(x.isProbablePrime(1))
System.out.println("Yes");
else
System.out.println("No");
}
}
. isProbable Prime (int certainty): 이 BigInteger 가 소수 일 수 있다 면 true 로 돌아 갑 니 다.만약 그것 이 하나의 합 수 라 는 것 이 명확 하 다 면, false 로 돌아 갑 니 다.매개 변수 certainty 는 호출 자가 참 고 싶 어 하 는 불확실 성 측정 입 니 다. 이 수가 소수 일 확률 이 1 - 1 / 2 * certainty 방법 을 초과 하면 이 방법 은 true 로 돌아 갑 니 다.실행 시간 은 매개 변수의 확정 값 에 정비례 한다.
자바 의 isProbable Prime 함 수 는 BigInteger 류 에 대한 소수 판단 함수 입 니 다. 그 실현 원 리 는 복잡 하지 않 습 니 다. 단지 여러 상황 으로 나 누 어 토론 해 야 합 니 다. Miller - Rabin 소수 테스트 와 Lucas - Lehmer 테스트 를 사용 해 야 합 니 다. 이것 은 확률 알고리즘 입 니 다. 돌아 온 결과: 한 수 는 소수 가 아니 거나 한 수 는 소수 일 수 있 습 니 다.다음은 jdk 1.6 src 의 주요 소스 코드 입 니 다.
public boolean isProbablePrime(int certainty) {
if (certainty <= 0)
return true;
BigInteger w = this.abs();
if (w.equals(TWO))
return true;
if (!w.testBit(0) || w.equals(ONE))
return false;
return w.primeToCertainty(certainty, null);
}
public boolean testBit(int n) {
if (n < 0)
throw new ArithmeticException("Negative bit address");
return (getInt(n >>> 5) & (1 << (n & 31))) != 0;
}
private int getInt(int n) {
if (n < 0)
return 0;
if (n >= mag.length)
return signInt();
int magInt = mag[mag.length-n-1];
return (signum >= 0 ? magInt :
(n <= firstNonzeroIntNum() ? -magInt : ~magInt));
}
boolean primeToCertainty(int certainty, Random random) {
int rounds = 0;
int n = (Math.min(certainty, Integer.MAX_VALUE-1)+1)/2;
// The relationship between the certainty and the number of rounds
// we perform is given in the draft standard ANSI X9.80, "PRIME
// NUMBER GENERATION, PRIMALITY TESTING, AND PRIMALITY CERTIFICATES".
int sizeInBits = this.bitLength();
if (sizeInBits < 100) {
rounds = 50;
rounds = n < rounds ? n : rounds;
return passesMillerRabin(rounds, random);
}
if (sizeInBits < 256) {
rounds = 27;
} else if (sizeInBits < 512) {
rounds = 15;
} else if (sizeInBits < 768) {
rounds = 8;
} else if (sizeInBits < 1024) {
rounds = 4;
} else {
rounds = 2;
}
rounds = n < rounds ? n : rounds;
return passesMillerRabin(rounds, random) && passesLucasLehmer();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.