码迷,mamicode.com
首页 > 其他好文 > 详细

[知识点] 6.4.1 素数与最大公约数

时间:2020-07-28 00:18:17      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:一个   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

[知识点] 6.4.1 素数与最大公约数

标签:一个   ref   prim   分解质因子   定义   font   www   公约数   知识   

原文地址:https://www.cnblogs.com/jinkun113/p/13387901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!