我理解的素数——约数求法

拿到一个数,判断其是否为素数,从素数的定义来求,那就是找有没有除 1 及其本身之外的约数,没有则为素数,我且称之为 约数法

那找约数的简单粗暴的方法就是除法,所以一般就是 约数除法。
我们假定现在拿到的这个数是 n
(首先明确两点:一个数的约数是小于等于其本身的;讨论素数只在大于 0 自然数中讨论)

理解 1

  拿 n 除以 2 ~ n-1 之间的数,如果找到能整除 n 的数,那这个数就是 n 的约数,也即是说 n 不是素数,而是合数,否则 n 就是素数。
  这个是按定义来的,不解释。

理解 2

  拿 n 除以 2 ~ sqrt(n) (注:sqrt(n) 即对 n 求开方)之间的数,如果找到能整除 n 的数,那这个数就是 n 的约数,也即是说 n 不是素数,而是合数,否则 n 就是素数。
  为什么能只检查到 sqrt(n) 就可以下定论了呢?
(1)我们先要明白一点,假如 m1 * m2 = m,那么 m1 和 m2 必然有一个小于等于 sqrt(m),另外一个大于等于 sqrt(m)。为什么?因为如果 m1 > sqrt(m) 且 m2 > sqrt(m),那么 m1 * m2 > sqrt(m) * sqrt(m) = m 即 m1 * m2 > m,这结果是矛盾的;或者 m1 < sqrt(m) 且 m2 < sqrt(m),那么 m1 * m2 < sqrt(m) * sqrt(m) = m 即 m1 * m2 < m,这结果也是矛盾的。所以 m1 和 m2 必然有一个小于等于 sqrt(m),另一个大于等于 sqrt(m)。
(2)假如我们从 2 ~ sqrt(n) 都没找到 n 的约数,那意味着什么呢?意味着从 2 ~ n-1 我们都没有找到 n 的约数。why ? 证明如下:
  假如我们从 2 ~ sqrt(n) 都没找到 n 的约数,而在 sqrt(n)+1 ~ n-1 之间找到了一个 n 的约数,就假设这个约数是 n1,n1 的另一位合作伙伴为 n2。那么根据(1)可知 n1 * n2 = n 时,n1 和 n2 必有一个小于等于 sqrt(n),一个大于等于 sqrt(n)。因为 n1 是在 sqrt(n)+1 ~ n-1 中找到的,那么 n2 就必然小于 sqrt(n)。
  那么问题来了,n2 是位于 2 ~ sqrt(n) 区间的一个数,那为什么我们要找到 sqrt(n)+1 ~ n-1 时才找到 n1 这个约数,而不是在此之前的 2 ~ sqrt(n) 之间就找到 n2 呢?所以我们可以下一个结论:如果在 sqrt(n)+1 ~ n-1 之间能找到 n 的一个约数 n1 ,那么在此之前的 2 ~ sqrt(n) 之间我们必然就能找到 n 的另一个约数 n2。换句话说,在前面能找到的约数对应在后面也能找到另一个约数与其合作。也就是说,前面和后面的约数是成对出现的。所以,在前面没找到约数,在后面也就不可能找到约数。
  所以我们可以只检查至 sqrt(n)。

理解 3

  拿 n 除以 2 ~ sqrt(n) 之间的数,如果找到能整除 n 的数,那这个数就是 n 的约数,也即是说 n 不是素数,而是合数,否则 n 就是素数。
(注意:这里的除数指的都是 奇数
  这个其实是有一个前提的,那就是拿到一个 n ,我们先作就判断,如果是偶数,那不用想,肯定不是素数,直接出结果;如果是奇数,那就有可能是素数,我们就得接下来用约数除法判断一下。所以现在这里的 n 就只剩下奇数了。
  了解了上面的前提我们再来想想为什么除数只用奇数就可以判断是不是素数了。因为既然 n 是奇数,那么 n 的约数里头一定没有偶数(偶数乘以任何数结果都是偶数)。那既然 n 的约数里头压根就没有偶数,那么还需要除以 2 ~ sqrt(n) 之间的偶数干嘛?结果不是在除之前我们就知道了吗?凡是偶数均不是 n 的约数。那剩下需要判断的不就是 2 ~ sqrt(n) 之间的奇数了吗?

理解 4

  拿 n 除以 2 ~ sqrt(n) 之间的 3、5 以及 大于 5 的数中处于 6 的倍数前后的两个数,如果找到能整除 n 的数,那这个数就是 n 的约数,也即是说 n 不是素数,而是合数,否则 n 就是素数。
  即除数是 3 以及当 x>=1 时的 6x-1 和 6x+1。
  先来看下 6x 到 6x+5 之间是怎么分布的:
  …… 6x-1 6x 6x+1 6x+2 6x+3 6x+4 6x+5 6(x+1) 6(x+1)+1 ……
  去掉偶数不看:
  …… 6x-1 6x+1 6x+3 6x+5 6(x+1)+1 ……
  稍微变换一下:
  …… 6x-1 6x+1 6x+3 6(x+1)-1 6(x+1)+1 ……
  如果 6x+3 这个的结果是明确的话(即是不是 n 的约数不用算也知道),那么剩下的那些数就是我们要进一步判断的,也是上面的除数要求所在的范围。那,6x+3 能不能提前就知道结果呢?是可以的。
  如我在上面说的偶数前提一般,这里把 6x+3 当成一个可以提前检测的前提。因为 6x+3 = 3(2x+1) 是个确定的合数,3 的奇数倍,即我们可以在拿到一个数 n 后,先筛选掉偶数,然后筛选掉 3 的倍数,(即 n 为偶数或者 3 的倍数就直接得出 “是合数” 这个结果),因为 3 的奇数倍是合数,不是素数,这个不用约数除法也能直接得出结果。
  所以能走到约数除法这一步的 n 既不是偶数也不是 3 的奇数倍。
  既然 n 不是 3 的奇数倍,那么 n 的约数里头就不可能有 6x+3 这种 3 的奇数倍的数。因为如果 n 的约数里头有 6x+3 ,那设 6x+3=n1,那必然有 n1 * n2 = n。因为 n 为奇数,n1 也为奇数,可知 n2 也必为奇数。即 n1 * n2 = 3 * 奇数1 * 奇数2 = n,很明显,n 也是 3 的奇数倍,这就跟上面加粗部分的结论相矛盾了。所以 n 的约数里头是不可能有 6x+3 这种 3 的奇数倍的数。证毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值