https://casterian.net/algo/miller-rabin.html
The Casterian
Home
casterian.net
평범한 소수 판별은 n^(1/2)인 반면
n^(1/4)까지 줄일 수 있다.
import java.util.*;
import java.io.*;
public class millar_rabin {
static FastScanner fs = new FastScanner();
static PrintWriter pw = new PrintWriter(System.out);
static int[] primes = new int[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 27};
public static void main(String[] args) {
int t = fs.nextInt();
while (t-- > 0){
solve(fs.nextInt());
}
pw.close();
}
static void solve(int n){
boolean flag = true;
if (n < 1000){
flag = isPrime(n);
}
else{
for (int i : primes){
if (!mr(n, i)){
flag = false;
break;
}
}
}
if (flag) pw.println(n);
}
static boolean isPrime(int n){
if (n == 1) return false;
for (int i=2;i*i<=n;i++){
if (n % i == 0) return false;
}
return true;
}
static int powmod(int x, int y, int m){
x %= m;
int r = 1;
while (y > 0){
if ((y & 1) == 1){
r = (r * x) % m;
}
x = (x * x) % m;
y /= 2;
}
return r;
}
static boolean mr(int n, int a){
int d = n - 1;
while ((d & 1) == 0){
if (powmod(a, d, n) == n - 1){
return true;
}
d /= 2;
}
int temp = powmod(a, d, n);
return (temp == 1 || temp == n - 1);
}
// ----------input function----------
static void sort(int[] a) {
ArrayList<Integer> L = new ArrayList<>();
for (int i : a)
L.add(i);
Collections.sort(L);
for (int i = 0; i < a.length; i++)
a[i] = L.get(i);
}
static class FastScanner {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer("");
String next() {
while (!st.hasMoreTokens()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
int[] readArray(int n) {
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = nextInt();
return a;
}
long nextLong() {
return Long.parseLong(next());
}
}
}
'PS > Algorithms' 카테고리의 다른 글
[Java] Pollard-Rho Algorithm (0) | 2022.05.20 |
---|---|
[Java] Euclidean-Algorithm (0) | 2022.05.19 |
[Java] LCA (Lowest Common Ancestor) (0) | 2022.05.17 |
[Java] Index Tree / Segment Tree Lazy Propagation (0) | 2022.03.15 |
[Java] Segment Tree (0) | 2022.03.14 |