质数算法

质数算法

数论

class PrimeNumber {
  // O(sqrt(N)) 质数判断
  public static boolean isPrime(int n) {
   	if (n < 2) return false;
    
    for (int i = 2; i <= n / i; i++) {
      if (n % i == 0) return false;
    }
    
    return true;
  }
  
  // O(sqrt(N)) 质因数分解
  private static void divide(int n) {
    for (int i = 2; i <= n / i; i++) {
      if (n % i == 0) {
      	int s = 0;
        while (n % i == 0) {
          n /= i; s++;
        }
        System.out.println(i + " " + s);
      }
    }
    if (n ! = 1) System.out.println(n + " " + 1);
  }
  
  // [2, N] 中包含多少个质数
  // O(NloglogN) 埃氏筛法
  final static int N = 1000010;
  static int idx = 0;
  final static int[] q = int[N];
  final static boolean[] st = new boolean[N];

  private static void getPrimeIndex(int n) {
    for (int i = 2; i <= n; i++) {
      if (st[i]) continue;
      q[idx++] = i;
      for (int j = i + i; j <= n; j++) st[j] = true;
    }
  }
  
  // O(N) 线性筛法
  private static void getPrimeIndex(int n) {
    for (int i = 2; i <= n; i++) {
      if (!st[N]) q[idx++] = i;
      for (int j = 0; q[j] <= n / i; j++) {
        st[q[j] * i] = true;
        if (i % q[j] == 0) break;
      }
    }
  }
}