title: 素数、约数、反素数
date: 2019-07-23 23:56:59
tags: 数论
一、素数
- 0和1既不是素数也不是合数,最小的素数是2
(一)素数的判定:
试除法:如果自然数n不能被[2,√n] 内的所有素数整除,那么n是素数。
bool isPrime(int num)
{
if(num<=3)
return num>1;
//排除掉非 6x-1和6x+1的数
if(num%6!=1&&num%6!=5)
return false;
int cnt=(int)sqrt(num);
for(int i=5;i<=cnt;i+=6)
{
if(num%i==0||num%(i+2)==0)//这里%i和%(i+2) 类似于表示5 和7 这样的倍数
//由上知素数必然是6x-1或6x+1形式,然后再试除,排除有其他因子的
return false;
}
return true;
}
加速技巧:大于4的素数总是等于6x+1 或6x-1
如何证明?约数一定是成对出现的,d 和 n/d
min(d,n/d)<=√n
素数的几个性质
-
素数的个数无限多(不存在最大的素数)
-
存在任意长的一段连续数,其中的所有数都是合数(相邻素数之间的间隔任意大)
-
所有大于2的素数都可以唯一地表示成两个平方数之差。
-
当n为大于2的整数时,2n+1 和2n-1两个数中,如果其中一个数是素数,那么另一个数一定是合数。
-
如果p是素数,a是小于p的正整数,那么 a p − 1 % p = 1 a^{p-1} \% p = 1 ap−1%p=1。
参考链接:http://www.matrix67.com/blog/archives/234
- Miller-Rabin算法:
是一种概率算法,存在误判的可能性,但是出错的概率非常小
算法详解:https://blog.csdn.net/ECNU_LZJ/article/details/72675595
费马小定理:
若p是素数,且a与p互质,则 ( a p ≡ a ( m o d p ) ) (a^p≡a(mod\;p)) (ap≡a(modp))
变形:(1) ( a p − 1 ≡ a ( m o d p ) ) (a^{p-1}≡a(mod\;p)) (ap−1≡a(modp)) (2) ( a p − 1 − 1 ≡ 0 ( m o d p ) ) (a^{p-1}-1≡0 (mod\;p)) (ap−1−1≡0(modp))
费马小定理参考链接:http://www.360doc.com/content/17/1206/04/9482_710338732.shtml
比较容易理解的“无字证明”: (转自知乎)
- 事实上,根据同余的性质,只要证明\(a^p≡a(mod p)\)对0<=a<=p-1成立,就可以得到上述定理。
考虑一根有 p 颗珠子的项链,其每颗珠子有 a 种染色选择,所以总共$ (a^p) $种选择去给项链染色,结果中会有 a 根项链其所有的珠子颜色相同,而在剩下的项链中,总有 p 根其上色方式经过旋转是相同的(*)。- 所以 ( a p − a ) (a^p-a) (ap−a)会被 p 整除。
p 必须是质数的原因,实际上隐藏在被标记(*)的句子中
假设 p 不是质数,a=2 , p=4 。此时 p 与 a 有一个公因子 2 ,虚线左侧的项链理应有另外 3 个与它旋转等价的项链,然而事实上由于重复,只有 1 个,所以我们上面的论证对这种情形不成立。
把红色记为 A ,蓝色记为 B ,上例中的第一根项链可以记为 ABAB ,是由两个重复的 AB 组成;类似地,第二根可以记为 BABA 。事实上,把每根项链都记为一个字母序列 S ,如果 S 是由几个重复的字母序列 T 组成,且 T 不能拆分成更短的重复序列,那么所有关于 S 旋转等价的项链总数等于 T 的长度。易知T 的长度整除 S的长度,如果 T 的长度是素数 p ,那么 S 的长度也是素数 p ;因此关于 S 旋转等价的项链会有 p 根.
(二)素数筛选:
(1)素数埃式筛法(可能会重复筛)
算法思想:
-
初始数列 :{2 、3,4,5,6,7,8,9,10 ,11 ,12 ,13 ,… ,n}
-
输出 最小的素数 {2} ,筛掉 2的倍数,剩下 {3 ,5,7,9,11 ,13 ,…}
-
输出 素数 {2,3} ,筛掉 3的倍数,剩下 {5 ,7,11 ,13 ,…}
-
输出 素数 {2,3,5} {2,3,5} ,筛掉 5的倍数,剩下 {7 ,11 、13 ,…}
-
继续以上步骤, 直到 n。
时间复杂度:O(nlog log n)
筛选次数:n/2+n/3+…+n/n
调和级数: Σ i = 1 n 1 i = ln n + γ + ε n \varSigma _{i=1}^{n}\frac{1}{i}=\ln\text{ }n+\gamma +\varepsilon _n Σi=1ni1=ln n+γ+εn
素数分布: π ( x ) = x ln x \pi \left( x \right) =\frac{x}{\ln x} π(x)=lnxx
(2)素数线性筛法(欧拉筛法)
每个合数仅被它最小的质因数筛去,时间复杂度为O(n)
const int maxn=1e7+5;
int primes[maxn];
int cnt;
bool st[maxn];//标记有没有被筛过
void getPrimes(int n)
{
fill(st,st+maxn,false);
cnt=0;
for(int i=2;i<=n;i++)
{
if(!st[i])//没有被筛过
primes[cnt++]=i;
for(int j=0;j<cnt&&i*primes[j]<=n;j++)
{
st[i*primes[j]]=true;
if(i%primes[j]==0)//i是某个质数的倍数,就break掉,保证只被最小的质数筛一次
break;
}
}
}
二、约数
若整数 n除以整数 d的余数为 0,即 d能整除 n,则称 d是n的约数 ,n是d的倍数,记为 d|n 。
唯一分解定理(算数基本定理): 任一大于 1的 自然数 𝑁,都可以唯一分解为有限个素数之积:
N = P 1 c 1 P 2 c 2 . . . P r c r N=P_{1}^{c_1}P_{2}^{c_2}...P_{r}^{c_r} N=P1c1P2c2...Prcr
N的正约数集合可写作: { p 1 b 1 p 2 b 2 . . . p m b m } \left\{p_{1}^{b_1}p_{2}^{b_2}...p_{m}^{b_m}\right\} {p1b1p2b2...pmbm},其中 0 ⩽ b i ⩽ c i 0\leqslant b_i\leqslant c_i 0⩽bi⩽ci
N的正约数个数为 ( c 1 + 1 ) ∗ ( c 2 + 1 ) ∗ . . . ∗ ( c m + 1 ) = Π i = 1 m ( c i + 1 ) \left( c_1+1 \right) *\left( c_2+1 \right)*...*\left( c_m+1 \right) =\varPi_{i=1}^{m}\left( c_i+1 \right) (c1+1)∗(c2+1)∗...∗(cm+1)=Πi=1m(ci+1)
N的所有正约数之和为:
( 1 + p 1 + p 1 2 + . . . + p 1 c 1 ) ∗ ( 1 + p 2 + p 2 2 + . . . + p 2 c 2 ) ∗ . . . ∗ ( 1 + p m + p m 2 + . . . + p m c m ) = Π m i = 1 ( Σ j = 0 c i ( p i ) j ) \left( 1+p_1+p_{1}^{2}+...+p_{1}^{c_1} \right) *\left( 1+p_2+p_{2}^{2}+...+p_{2}^{c_2} \right) *...*\left( 1+p_m+p_{m}^{2}+...+p_{m}^{c_m} \right) =\underset{i=1}{\overset{m}{\varPi}}\left( \varSigma _{j=0}^{c_i}\left( p_i \right) ^j \right) (1+p1+p12+...+p1c1)∗(1+p2+p22+...+p2c2)∗...∗(1+pm+pm2+...+pmcm)=i=1Πm(Σj=0ci(pi)j)
三、反素数
-
对于正整数x,其约数个数记作g(x),eg. g(1)=1,g(6)=4(1、2、3、6)
-
如果某个正整数x满足:对任意正整数 i (0<i<x) 都有 g(x)>g(i),则称x为反素数(因子数最多)
-
考虑x是小于n的最大反素数的情况:
-
x一定是小于n的 约数最多的数
-
当约数个数相同时,x一定是最小的数
(因为x时反素数,就要满足g(x)>g(i)始终成立,如果x不是最小的数,如,当约数一样时,8,x,… 就会出现g(i)=g(x)的情况,那么x就不能被成为反素数了)
-
-
反素数 x = p 1 e 1 p 2 e 2 . . . p r e r x=p_{1}^{e_1}p_{2}^{e_2}...p_{r}^{e_r} x=p1e1p2e2...prer的两个性质
-
质因子 p 1 , p 2 , . . . , p r , p_{1},p_{2},...,p_{r}, p1,p2,...,pr,时从2开始连续的素数
(eg. 504 = 2 3 3 2 7 1 504=2^33^27^1 504=233271,那么504一定不是反素数,因为在它前面一定能找到 360 = 2 3 3 2 5 1 360=2^33^25^1 360=233251是反素数)
-
质因子的指数递减 e 1 ≥ e 2 ≥ e 3 . . . ≥ e r e_{1}≥e_{2}≥e_{3}...≥e_{r} e1≥e2≥e3...≥er
(eg. 3240 = 2 3 3 4 5 1 3240=2^33^45^1 3240=233451一定不是反素数,在它前面一定可以找到 2160 = 2 4 3 3 5 1 2160=2^43^35^1 2160=243351是反素数)
-
四、习题
素数距离 POJ2689
Aladdin and the Flying Carpet LightOJ1341
反素数 BZOJ1053
Summation of Four Primes UVA-10168 (素数)
阶乘分解 CH-3101 (分解质因子)
Deciphering Password HDU-2421 (约数个数+分解质因子)
未知剩余系 HDU-4542 (反素数)