标签:一个 ref prim 分解质因子 定义 font www 公约数 知识
总目录 > 6 数学 > 6.4 数论 > 6.4.1 素数与最大公约数
前言
数论开始。这一块知识点还挺凌乱的,又多又杂。
子目录列表
6.4.1 素数与最大公约数
1、素数
对于正整数 a, d,如果存在正整数 k,使得 a = kd,则称 d 整除 a,记作 d | a。这时,a 是 d 的倍数,而 d 是 a 的约数(因数,因子)。
显然,对于任意大于 1 的整数 a,它都能被 1 和 a 整除,而如果它能且仅能被这两个数整除,则称 a 为素数(质数);否则,则称 a 为合数。举例子:
5 的约数为 1 和 5,则 5 为素数;
12 的约数为 1, 2, 3, 4, 6, 12,则 12 为合数。
1 既不是素数也不是合数。
顺带一提素数计数函数:小于等于 x 的素数的个数,用 π(x) 表示。当 x 趋近于无穷大时,π(x) 趋近于 x / lnx。
2、素数判定
判定 a 是否为素数,最暴力的做法是从 2 到 a - 1 逐一判断看是否能整除,时间复杂度为 O(n),但其实是没必要的,很容易发现,如果 d 是 a 的约数,则 a / d 也是 a 的约数,就如上述 12 的 6 个约数,可以组成 1 * 12, 2 * 6, 3 * 4 三组,而我们只需要对这些组较小的那个数进行判断即可,显然,这些较小数是恒小于等于 a 的平方根的。这样,我们的时间复杂度骤降至 O(sqrt(n))。代码如下:
bool isPrime(int a) { for (int i = 2; i * i <= a; i++) if (a % i == 0) return 0; return 1; }
同样地,这个算法可以延伸为求任意数的约数个数,此处略。
还有许多高大上的素数判定方法,诸如 Miller-Rabin 素性测试,Fermat 素性测试,卡迈克尔数等等概念,此处暂略。
3、反素数
① 概念
对于正整数 n,如果任何小于它的正整数的因子个数都小于它的因子个数,则称 n 为反素数,比如 1, 2, 4, 6, 12, ...
为什么这样定义呢?因为素数可以认为是因子最少的数,反素数则是对于一个特定集合的因子最多的数,而这个特定集合就是 1 到这个数本身。
② 求解
如何求解反素数?要求一个数的因子个数,首先需要分解质因子,即把 n 分解成 n = p1 ^ k1 + p2 ^ k2 + ... + pn ^ kn 的形式,其中 p 为素数,k 为对应 p 的指数,这样 n 的因子个数为 (k1 + 1) * (k2 + 1) * ... * (kn + 1)。并且,容易得到以下两个推论:
> 假设 p1 < p2 < ... < pn,那么 p1, p2, ..., pn 肯定是从 2 开始的连续素数数列;
> 假设 p1 < p2 < ... < pn,那么肯定满足 k1 >= k2 >= ... >= kn。
两个推论均可通过反证法证明。
根据这两个推论进行枚举就行啦。
代码:
本文参考了:
https://zhuanlan.zhihu.com/p/41759808
标签:一个 ref prim 分解质因子 定义 font www 公约数 知识
原文地址:https://www.cnblogs.com/jinkun113/p/13387901.html