【基础数论】---质数判断

1. 质数定义

  • 质数一个大于 1 的正整数,只能被 1 和它本身整除(即没有其他正因数)。
    • 示例:2, 3, 5, 7, 11 是质数。
    • 1 不是质数,4(可被 2 整除)不是质数。

2. 判断质数的方法

2.1 基础方法:逐个检查

从 2 到 n-1 检查是否有因数,如果有则不是质数。

代码示例
public boolean isPrime(int n) {
    // 小于等于 1 不是质数
    if (n <= 1) return false;
    // 从 2 到 n-1 检查是否有因数
    for (int i = 2; i < n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}
复杂度
  • 时间复杂度O(n)
    • 循环从 2 到 n-1
  • 空间复杂度O(1)
    • 仅用常数空间。
问题
  • 效率低:对于大数 n,循环次数过多。
2.2 优化方法 1:检查到平方根
  • 原理:如果 n 不是质数,它一定有一个小于等于 √n 的因数(因为因数成对出现)。
  • 只需检查从 2 到 √n 是否有因数即可。
代码示例
public boolean isPrime(int n) {
    if (n <= 1) return false;
    // 检查到平方根
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (n % i == 0) return false;
    }
    return true;
}
复杂度
  • 时间复杂度O(√n)
    • 循环次数减少到 √n
  • 空间复杂度O(1)
优点
  • 效率提升:对于大数(如 n = 10^9),√n ≈ 3.16 * 10^4,远小于 n
2.3 优化方法 2:排除偶数
  • 原理
    • 如果 n > 2 且是偶数,直接返回 false(因为 2 是唯一偶数质数)。
    • 之后只检查奇数因数,减少循环次数。
代码示例
public boolean isPrime(int n) {
    if (n <= 1) return false;
    if (n == 2) return true; // 2 是质数
    if (n % 2 == 0) return false; // 其他偶数不是质数
    // 只检查奇数,直到平方根
    for (int i = 3; i <= Math.sqrt(n); i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}
复杂度
  • 时间复杂度O(√n)
    • 比方法 2 快一倍(只检查奇数)。
  • 空间复杂度O(1)

你可能感兴趣的:(数据结构与算法,算法)