素数

定义

一个大于1的自然数,除了1 和它自身外,不能整除其他自然数的数

性质

  • 素数有无穷多个
  • 存在任意长的连续数,其中所有数都是合数(相邻素数之间的间隔任意大)
  • 随着nn的增大素数越来越稀疏

哥德巴赫猜想

任意大于2的正偶数都可以写成两个素数的和 一个充分大偶数必定可以写成一个素数加上最多由2个质因子所组合的合成数,简称为(1+2)

贝特朗假设

对任意 n1n\geq1 , nn2n2n 之间(不包括n)至少存在一个质数。

 n1, pP, n<p2n\small \forall \ n \geq1,\exist \ p \in \mathbb{P},\ n<p\leq2n

推论:2n2^n 之内至少存在n个质数

素数定理

n2n\geq2,以 π(x)\pi(x) 表示不超过 xx 的素数的个数,当 nn \to \infty 时,

π(n)2n1lnxdx\small \pi(n)\sim\int_2^n\frac{1}{\rm lnx}\rm dx

推论:从不大于 nn 的自然数随机选一个,它是素数的概率大约是 1lnn\frac{1} {\rm ln n}

算术基本定理

任何一个大于1的正整数都能唯一分解为有限个质数的乘积,可写作:

N=p1c1p2c2pmcm\small N=p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m}

其中 cic_i 都是正整数,pip_i都是质数,且满足p1<p2<<pmp_1<p_2<\cdots< p_m。 推论:NN的正约束的集合可写作:

{p1c1p2c2pmcm},0bici\small \lbrace p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m} \rbrace,其中0\leq b_i\leq c_i

NN 的正约数个数为

(c1+1)(c2+1)(c+1)=i=1m(ci+1)\small (c_1+1)*(c_2+1)*\cdots*(c+1)=\prod_{i=1}^m (c_i+1)

NN 的正约数的和为:

(1+p1+p12++p1c1)(1+pm+pm2++pmcm)=i=1m(j=0ci(pi)j)\small (1+p_1+p_1^2+\cdots+p_1^{c_1})*\cdots*(1+p_m+p_m^2+\cdots+p_m^{c_m})=\prod_{i=1}^m\left( \sum_{j=0}^{c_i}(p_i)^j\right)

勒让德定理

N!N!中质因子 pp 的个数为:

Np+Np2++NppN=pkNNpk\lfloor\frac{N}{p}\rfloor+\lfloor \frac{N}{p^2}\rfloor+\cdots+\lfloor\frac{N}{p^{\lfloor \log_p N\rfloor}}\rfloor=\sum_{p^k\leq N}\lfloor\frac{N}{p^k}\rfloor

欧拉函数

1~N\small N 中与 NN 互质的数的个数被称为欧拉函数,记为 φ(N)\varphi(N)

在算术基本定理中, N=p1c1p2c2pmcm\small N=p_1^{c_1}p_2^{c_2}\cdots p_m^{c_m}, 则:

φ(N)=Np11p1p21p2pm1pm=Ni=1m(11pi)\small \varphi(N)=N*\frac{p_1-1}{p_1}*\frac{p_2-1}{p_2}*\cdots*\frac{p_m-1}{p_m}=N*\prod_{i=1}^m\left(1-\frac{1}{p_i}\right)

原理:由容斥原理可得,设 p,qp,qNN 的质因子,1~N\small N 中共有 Np\frac{N}{p}pp 的倍数,Nq\frac{N}{q}qq 的倍数,同时有Npq\frac{N}{pq}pqpq 的倍数,因此剩下数的个数有:

NNpNq+Npq=N(11p1q+1pq)=N(11p)(11q)\small N-\frac{N}{p}-\frac{N}{q}+\frac{N}{pq}=N*\left(1-\frac{1}{p}-\frac{1}{q}+\frac{1}{pq}\right)=N*\left(1-\frac{1}{p}\right)\left(1-\frac{1}{q}\right)

性质

  1. pp 为素数 ,则 φ(p)=p1,φ(pk)=(p1)pk1\varphi(p)=p-1, \varphi(p^k)=(p-1)p^{k-1}
  2. n>1,1\forall n>1,1~nn 中与 nn 互素的数的和为 nφ(n)2\Large\frac{n*\varphi(n)}{2}
  3. a,ba,b 互素,则 φ(ab)=φ(a)φ(b)\varphi (ab)=\varphi (a)\varphi (b)
  4. pp 为素数,若 pnp\mid np2np^2\mid n, 则 φ(n)=φ(np)p\varphi(n)=\varphi(\frac{n}{p})*p
  5. pp 为素数,若 pnp\mid np2np^2\nmid n, 则 φ(n)=φ(np)(p1)\varphi(n)=\varphi(\frac{n}{p})*(p-1)
  6. dnφ(d)=n\sum_{d\mid n}\varphi(d)=n

积性函数

如果当 a,ba,b 互素时,有 f(ab)=f(a)f(b)f(ab)=f(a)*f(b),那么称函数 ff 为积性函数。

性质

若是 ff 积性函数,且在算术基本定理中 n=i=1mpicin=\prod_{i=1}^m p_i^{c_i} ,则 f(n)=i=1mf(pici)f(n)=\prod_{i=1}^m f(p_i^{c_i})

筛法

埃拉托斯特尼筛法 O(nloglogn)O(nloglogn)

点击查看代码
void primes(ll n){
    for(int i=2;i<=n;i++){
        if(v[i])continue;//如果被筛过
        cout<<i<<endl;//剩下的为素数
        for(int j=i;j*i<=n;j++){//筛掉其倍数
            v[i*j]=1;
        }
    }
}

欧拉筛/线性筛 O(n)O(n)

确保每个合数只会被其最小质因子筛过

点击查看代码
void primes(ll n){
    for(int i=2;i<=n;i++){
        if(v[i]==0){v[i]=i;prime[++cnt]=i;}
        for(int j=1;j<=cnt;j++){
            //prime[j]应为比i筛过的最小质因子小
            if(prime[j]>v[i]||i*prime[j]>n)break;
            v[i*prime[j]]=prime[j];
        }
    }
}

素性测试

二次探测定理

pp 为素数, a21(modp)a^2\equiv1\pmod p ,那么 a±1(modp)a\equiv \pm1\pmod p

米勒-拉宾算法

利用费马小定理对数进行素性测试,并通过二次探测定理检验,具有极高正确概率的算法。判断一个数 pp 是否为素数,将其 p1p-1 分解成 t×2kt\times 2^k, 先对 at(modp)a^t\pmod p 进行费马检验,再进行最多 tt 次平方操作,每次根据二次探测定理检验

点击查看代码
bool miller_rabin(ll p) {
    if(p<3||p%2==0) return p==2;
    int Test[]={2,3,5,7,11,13,17,19};
    int t = p - 1, k = 0;
    while(!(t & 1)) k++, t >>= 1;
    for(int i = 0; i < 8; i++) {
        if(p == Test[i]) return 1;
        ll a = quick_power(Test[i], t, p), nxt = a;
        //ll x=rand()%(p-2)+2,a=quick_power(x,t,p);
        for(int j = 1; j <= k; j++) {
            nxt = (a * a) % p;
            if(nxt == 1 && a != 1 && a != p - 1) return 0;
            a = nxt;
        }
        if(a != 1) return 0;
    }
    return 1;
}