【学习笔记】数学知识-质数

前置知识

  • 质数的个数是无限的。
  • n 为正整数,有 n! 的所有质因子不超过 n
    • 证明:对于所有的 dP,d|n! ,一定有 i=1n[d|i]>0 ,易证 dn
  • 一个合数 n 一定包含一个不超过 n 的质因子。
  • 试除法:若一个正整数 n 为合数,则存在一个能整除 n 的数 d ,其中 2dn,dP
    • 时间复杂度为 O(n)

    • 代码实现

      点击查看代码
      bool isprime(int n)
      {
          if (n < 2)
              return false;
          for (int i = 2; i <= sqrt(n); i++)
              if (n % i == 0)
                  return false;
          return true;
      }
      

筛法

  • Eratosthenes 筛法(埃式筛法)
    • 时间复杂度为 O(n×loglogn)

    • luogu P3912 素数个数

      点击查看代码
      bool m[100000010];
      int main()
      {
          int n,i,j,ans=0;
          cin>>n;
          m[1]=1;
          for(i=2;i<=sqrt(n);i++)
          {
              if(m[i]==0)
              {
                  for(j=2;i*j<=n;j++)
                  {
                      m[i*j]=1;
                  }
              }
          }
          for(i=2;i<=n;i++)
          {
              if(m[i]==0)
              {
                  ans++;
              }
          }
          cout<<ans;
          return 0;
      }
      
  • 线性筛法(欧拉筛法)
    • 时间复杂度为 O(n)

    • luogu P3383 【模板】线性筛素数

      点击查看代码
      int prime[100000001],len=0;
      bool vis[100000001];
      void isprime(int n)
      {
          int i,j;
          memset(vis,false,sizeof(vis));
          for(i=2;i<=n;i++)
          {
              if(vis[i]==false)
              {
                  len++;
                  prime[len]=i;
              }
              for(j=1;j<=len&&i*prime[j]<=n;j++)
              {
                  vis[i*prime[j]]=true;
                  if(i%prime[j]==0)
                  {
                      break;
                  }
              }
          }
      }
      int main()
      {
          int n,q,i,k;
          cin>>n>>q;
          isprime(n);
          for(i=1;i<=q;i++)
          {
              cin>>k;
              cout<<prime[k]<<endl;
          }
          return 0;
      }
      
  • 例题
    • luogu P1835 素数密度
      • 直接对 1r 进行线性筛显然不可做。

      • 筛法求出 2r 之间的质数,对于每个质数 p ,把 [l,r] 中能被 p 整除的数标记,即标记 i×p(max(2,lp)irp) 为合数。

        点击查看代码
        ll prime[70000],len=0;
        bool vis[70000];
        bitset<2000001>dis;//bitset大法好
        void isprime(ll n)
        {
            memset(vis,false,sizeof(vis));
            for(ll i=2;i<=n;i++)
            {
                if(vis[i]==false)
                {
                    len++;
                    prime[len]=i;
                }
                for(ll j=1;j<=len&&i*prime[j]<=n;j++)
                {
                    vis[i*prime[j]]=true;
                    if(i%prime[j]==0)
                    {
                        break;
                    }
                }
            }
        }
        int main()
        {
            ll l,r,i,j,ans=0;
            cin>>l>>r;
            isprime(70000);
            if(l==1)
            {
                l=2;
            }
            for(i=1;i<=len;i++)
            {
                for(j=max(2ll,(ll)ceil(1.0*l/prime[i]));j<=(ll)ceil(1.0*r/prime[i]);j++)
                {
                    dis[j*prime[i]-l]=1;
                }
            }
            for(i=l;i<=r;i++)
            {
                if(dis[i-l]==0)
                {
                    ans++;
                }
            }
            cout<<ans<<endl;
            return 0;
        }
        
    • UVA10140 Prime Distance
    • luogu P10495 阶乘分解

算术基本定理(唯一分解定理)

  • 任何一个大于 1 的正整数都能唯一分解成有限个的质数的乘积,即若 n 为大于 1 的正整数,则有 n=i=1mpici ,其中对于每一个 i(1im) 均满足 ci 为正整数, piP ,且 p1<p2<<pm
  • 应用
    • n 为大于 1 的正整数,设 n=i=1mpici ,则有如下性质:
      • n2=i=1mpi2ci
      • n 的正约数集合可写作 {i=1mpibi} ,其中对于每一个 i(1im) 均有 0bici
      • d=1n[d|n]=i=1m(j=0ci1j)=(c1+1)(c2+1)(cm+1)=i=1m(ci+1)
      • d|n2d2(d|nd2)2
        • d|nd=(p10+p11++p1c1)(p20+p21++p2c2)(pm0+pm1++pmcm)=i=1m(j=0cipij)
        • d|nd2=i=1m(j=0ci(pij)2)=i=1m(j=0cipi2j)
          • d|n2d2=i=1m(j=02cipi2j)
        • (d|nd2)2=i=1m((j=0cipi2j)2)=i=1m(j=02ci(min(j,2cij)+1)×pi2j)
    • 例题
      • CF1444A Division
        • 简化题意
          • t 组数据,每组数据给定 P,Q ,求满足 x|P,Qx 的最大正整数解。
        • 解法
          • QP 时,有 x=P 是一组最大的解。
          • Q|P 时,设 Q=i=1mpici,ci 是满足 pici|P 的最大正整数, ci 是满足 pici|x 的最大正整数,由 Qx 有存在一个 i(1im) 满足 ci>ci ,构造一个 i 满足 ci=ci1 即可。故有 x=maxi=1m{Ppici×pici1} 是一组最大的解。

互质

  • a,bN,gcd(a,b)=1 ,则称 a,b 互质。
  • 对于三个数或更多个数的情况,将 gcd(a,b,c)=1 的情况称为 a,b,c 互质;将 gcd(a,b)=gcd(a,c)=gcd(b,c)=1 的情况称为 a,b,c 两两互质。

欧拉函数

  • 1n 中与 n 互质的数的个数被称为欧拉函数,记作 φ(n)
  • φ(n)=i=1n[gcd(i,n)=1]={1n=1n×pP,p|n(11p)n1
    • 证明
      • n=1 时,显然。
      • n1 时,设 p,q(pq)n 的质因子, 1np 的倍数共有 np 个, q 的倍数共有 nq 个,依据容斥原理, 1n 中不与 n 含有共同质因子 pq 的个数为 nnpnq+np×q=n×(11p1q+1p×q)=n×(11p)×(11q) 。类似地,可在 n 的全部质因子上使用容斥原理,即可得到与 n 互质的数的个数。
  • 性质
    • p 为质数,则 φ(p)=p1,φ(pk)=pkpk1=(p1)×pk1

      • 证明:设 n=pk ,比 n 小的正整数有 pk1 个。其中共有 pk11 个数能被 p 整除,即这些数不与 pk 互质。故 φ(pk)=pk1(pk11)=pkpk1=(p1)×pk1
    • n 为正整数,则 i=1ni×[gcd(i,n)=1]={1n=1n×φ(n)2n1

      • 证明
        • n=1 时,显然。
        • n1 时,依据更相减损法,有 gcd(n,x)=gcd(n,nx) ,即与 n 互质的数 x,nx 成对出现,平均值为 n2
    • 2<n ,则 2|φ(n)

    • n 为偶数,有 φ(n)n2

    • n 为奇数,则 φ(2n)=φ(2)×φ(n)=φ(n)

    • a,b 互质,则 φ(ab)=φ(a)×φ(b)

      • 证明:依据算术基本定理,设 a=i=1npici,b=i=1mqici ,又因为 a,b 互质,所以不存在一组 i,j 满足 pi=qj ,故 φ(ab)=ab×i=1n(11pi)×i=1m(11qi) ,又有 φ(a)=a×i=1n(11pi),φ(b)=b×i=1m(11qi) ,故 φ(ab)=φ(a)×φ(b)
        • 由本条性质可知欧拉函数是积性函数。
    • a|b ,则 φ(ab)=a×φ(b),φ(a)|φ(b)

      • 证明:因为 abb 所有的质因子是相同的,只是部分质因子的指数发生变化,故 φ(ab)=a×φ(b)
    • p 为质数,且 p|n,p2|n ,则 φ(n)=φ(np)×p

      • 证明:因为 p|n,p2|n ,所以 n,np 有相同的质因子(其中 p 的指数不同),依据欧拉函数的计算公式,此时有 φ(n)φ(np)=p ,故 φ(n)=φ(np)×p
    • p 为质数,且 p|n,p2n ,则 φ(n)=φ(np)×(p1)

      • 证明:因为 p|n,p2n ,所以 p,np 互质,又因为 φ 是积性函数,故 φ(n)=φ(np)×φ(p)=φ(np)×(p1)
    • 欧拉反演:n=d|nφ(d)

      • 证明:设 k 满足 k<n,gcd(k,n)=d ,则 gcd(kd,nd)=1 ;设 f(x) 表示满足 gcd(k,n)=xk 的个数,则 n=i=1nf(i) 。又因为 kxnx 互质,有 f(x)=φ(nx) ,则 n=i|nφ(ni) 。易知 ini 是一一对应的,故 n=d|nφ(d)
    • 依据算术基本定理,有 n=i=1mpici ,又因为 φ 是积性函数,则 φ(n)=i=1mφ(pici)=i=1m(pi1)×pici1=i=1m(11pi)×pici=n×i=1m(11pi)=n×i=1mpi1pi

      • PS:本条性质用于已知 φ 是积性函数求 φ 的计算式,可作了解。
    • n,m 为正整数,且满足 1m<n ,有 i=0n1[gcd(m,n)=gcd(m+i,n)]=φ(ngcd(n,m))

      • CF1295D Same GCDs

      • 证明

        首先显然有 i=0n1((m+i)modn)=i=0n1(imodn)

        i=0n1[gcd(m,n)=gcd(m+i,n)]

        =i=0n1[gcd(m,n)=gcd((m+i)modn,n)]

        =i=0n1[gcd(m,n)=gcd(i,n)]

        =i=1n1[gcd(m,n)=gcd(i,n)]

        =i=1n[gcd(m,n)=gcd(i,n)]

        =i=1ngcd(n,m)[gcd(i,ngcd(n,m))=1]

        =φ(ngcd(n,m))

    • n 为正整数,则 i=1ngcd(i,n)=d|nd×φ(nd)=d|nφ(d)×nd

    • n 为正整数,则 i=1nlcm(i,n)=n(1+d|nd×φ(d))2

      • luogu P1891 疯狂 LCM | SP5971 LCMSUM - LCM Sum

      • 证明

        i=1nlcm(i,n)

        =i=1nn×igcd(i,n)

        =ni=1nigcd(i,n)

        =nd|ni=1nid×[gcd(i,n)=d]

        =nd|ni=1ndi×[gcd(i,nd)=1]

        =n(12+d|nnd×φ(nd)2)

        =n(12+d|nd×φ(d)2)

        =n(1+d|nd×φ(d))2

    • n 为正整数,则 i=1nj=1ngcd(i,j)=i=1nj=1i1gcd(i,j)+i=1nj=i+1ngcd(i,j)+i=1ngcd(i,i)

    • n 为正整数,则 i=1nj=1i1gcd(i,j)=i=1nj=i+1ngcd(i,j)=n(n+1)2+i=1nj=1ngcd(i,j)2

    • n 为正整数,则 i=1nj=1n[gcd(i,j)=1]=1+2i=2nφ(i)=1+2i=1nφ(i)

    • n 为正整数,则 i=1nj=1ngcd(i,j)=d=1nφ(d)nd2

      • luogu P2398 GCD SUM

      • 证明

        i=1nj=1ngcd(i,j)

        =i=1nj=1nd|gcd(i,j)φ(d)

        =i=1nj=1nd|i,d|jφ(d)

        =d=1nφ(d)i=1n[d|i]j=1n[d|j]

        =d=1nφ(d)ndnd

        =d=1nφ(d)nd2

      • 拓展:若 n,m 为正整数,则 i=1nj=1mgcd(i,j)=d=1min(n,m)φ(d)ndmd

        • luogu P1447 [NOI2010] 能量采集

        • 证明

          i=1nj=1mgcd(i,j)

          =i=1nj=1md|gcd(i,j)φ(d)

          =i=1nj=1md|i,d|jφ(d)

          =d=1min(n,m)φ(d)i=1n[d|i]j=1m[d|j]

          =d=1min(n,m)φ(d)ndmd

    • n 为正整数,则 i=1nj=1ngcd(i,j)=d=1nd(1+2i=1ndφ(i))

      • luogu P2398 GCD SUM

      • 证明

        i=1nj=1ngcd(i,j)

        =i=1nj=1nd=1nd[gcd(i,j)=d]

        =i=1nj=1nd=1nd[gcd(id,jd)=1]

        =d=1ndi=1ndj=1nd[gcd(i,j)=1]

        =d=1nd(1+2i=1ndφ(i))

      • 拓展:若 n,m 为正整数,则有 link(太长就放这里了)

    • n 为正整数,则 i=1nj=1ngcd(i,j)2=d=1nd2(1+2i=1ndφ(i))

      • luogu P8670 [蓝桥杯 2018 国 B] 矩阵求和

      • 证明

        i=1nj=1ngcd(i,j)2

        =i=1nj=1nd=1nd2[gcd(i,j)=d]

        =i=1nj=1nd=1nd2[gcd(id,jd)=1]

        =d=1nd2i=1ndj=1nd[gcd(i,j)=1]

        =d=1nd2(1+2i=1ndφ(i))

    • n 为正整数,则 i=1nj=1n[gcd(i,j)P]=dPn(1+2i=1ndφ(i))

      • luogu P2568 GCD

      • 证明

        i=1nj=1n[gcd(i,j)P]

        =i=1nj=1ndPn[gcd(i,j)=d]

        =i=1nj=1ndPn[gcd(id,jd)=1]

        =dPni=1ndj=1nd[gcd(i,j)=1]

        =dPn(1+2i=1ndφ(i))

    • n,m 均为正整数,且 mn ,有 i=1n![gcd(i,m!)=1]=n!×pPm(p1)pPmp

      • luogu P2155 [SDOI2008] 沙拉公主的困惑

      • 证明

        i=1n![gcd(i,m!)=1]

        =i=1n![gcd(imodm!,m!)=1]

        =n!m!×i=0m!1[gcd(i,m!)=1]

        =n!m!×i=1m![gcd(i,m!)=1]

        =n!m!×φ(m!)

        =n!m!×m!×pP,p|m!p1p

        =n!×pP,p|m!p1p

        =n!×pPmp1p

        =n!×pPm(p1)pPmp

    • n 为正整数,有 i=1nj=in[gcd(i,j)>1]=i=1nii=1nφ(i)=i=1n(iφ(i))

      • SP21615 NAJPWG - Playing with GCD

      • 证明

        i=1nj=in[gcd(i,j)>1]

        =j=1ni=1j[gcd(i,j)>1]

        =i=1nj=1i[gcd(i,j)>1]

        =i=1nj=1i[gcd(i,j)1]i=1nj=1i[gcd(i,j)=1]

        =i=1nii=1nφ(i)

        =i=1n(iφ(i))

    • luogu P5221 Product

  • 例题
    • SP4141 ETF - Euler Totient Function | UVA10179 Irreducable Basic Fractions | UVA10299 Relatives
      • 对原数进行 分解质因数 ,顺便求出欧拉函数。

        点击查看代码
        int phi(int n)
        {
        	int ans=n,i;
        	for(i=2;i<=sqrt(n);i++)
        	{
        		if(n%i==0)
        		{
        			ans=ans/i*(i-1);
        			while(n%i==0)
        			{
        				n/=i;
        			}
        		}
        	}
        	if(n>1)
        	{
        		ans=ans/n*(n-1);
        	}
        	return ans;
        }
        
    • UVA11327 Enumerating Rational Numbers
      • 线性筛欧拉函数板子

        • 线性筛欧拉函数的时间复杂度为 O(n)
        点击查看代码
        void euler(ll n)
        {
        	memset(vis,false,sizeof(vis));
        	phi[1]=1;
        	for(ll i=2;i<=n;i++)
        	{
        		if(vis[i]==false)
        		{
        			len++;
        			prime[len]=i;
        			phi[i]=i-1;//phi[i]表示i的欧拉函数
        		}
        		for(ll j=1;j<=len&&i*prime[j]<=n;j++)
        		{
        			vis[i*prime[j]]=true;
        			if(i%prime[j]==0)
        			{
        				phi[i*prime[j]]=phi[i]*prime[j];
        				break;
        			}
        			else
        			{
        				phi[i*prime[j]]=phi[i]*(prime[j]-1);
        			}
        		}
        	}
        }
        

积性函数

  • 若函数 f 满足 f(1)=1a,bN,gcd(a,b)=1 均有 f(ab)=f(a)×f(b) ,那么称函数 f 为积性函数。
  • 若函数 f 满足 f(1)=1a,bN 均有 f(ab)=f(a)×f(b) ,那么称函数 f 为完全积性函数。
  • 性质
    • 若函数 f 是积性函数,依据算术基本定理,有 n=i=1mpici ,则 f(n)=i=1mf(pici) ;若函数 f 是完全积性函数,依据算术基本定理,有 n=i=1mpici ,则 f(n)=i=1mf(pi)ci
    • f,g 均为积性函数,{h(n)=f(nk)h(n)=fk(n)h(n)=f(n)g(n)h(n)=d|nf(d)g(nd) 均是积性函数。
  • 常见的积性函数
    • 单位函数(完全积性): ε(n)=[n=1]
    • 恒等函数(完全积性): idk(n)=nkid1(n) 常简记作 id1(n)
    • 常数函数(完全积性): 1(n)=1
    • 除数函数: σk(n)=d|ndkσ0(n) 常简记作 d(n)τ(n)σ1(n) 常简记作 σ(n)
    • 欧拉函数: φ(n)=i=1n[gcd(i,n)=1]
    • 莫比乌斯函数: μ(n)={1n=10n (1)kk  n 
  • 线性筛任意积性函数
    • vp(i) 表示 i 的最小质因子 p 的最高次幂的次数,即 pvp(i)|i,pvp(i)+1i 。预处理 lowi 表示 i 的最小质因子 p 的最高次幂,即 lowi=pvp(i)
    • 在线性筛的过程中,需要对 f1 进行边界处理。当 i 是素数时,需要对 fi 进行预值处理。
      • gcd(i,primej)=1 时,因为 i 的所有质因子都大于 primej,所以 lowi×primej=primej,fi×primej=fi×fprimej

      • 否则,有 lowi×primej=lowi×primej

        • i=lowi ,即 i 仅有一个质因子时,此时 fi×primej 需要根据实际处理。
        • ilowi ,即 i 不仅有一个质因子时,因为 gcd(ilowi,lowi×primej)=1 ,所以 fi×primej=filowi×flowi×primej
        点击查看代码
        ll val(ll i ,ll prime)
        {
            if(i==prime)
            {
                return ...;
            }
            else
            {
                return ...;
            }
        }
        void euler(ll n,ll val0)
        {
            memset(vis,false,sizeof(vis));
            f[1]=val0;//边界处理
            for(ll i=2;i<=n;i++)
            {
                if(vis[i]==false)
                {
                    len++;
                    prime[len]=i;
                    f[i]=val(i,i);//当i是素数时,预值处理
                    low[i]=i;
                }
                for(ll j=1;j<=len&&i*prime[j]<=n;j++)
                {
                    vis[i*prime[j]]=true;
                    if(i%prime[j]==0)
                    {
                        low[i*prime[j]]=low[i]*prime[j];
                        if(i==low[i])
                        {
                            f[i*prime[j]]=val(i,prime[j]);//根据实际处理
                        }
                        else
                        {	
                            f[i*prime[j]]=f[i/low[i]]*f[low[i*prime[j]]];
                        }
                        break;
                    }
                    else
                    {
                        low[i*prime[j]]=prime[j];
                        f[i*prime[j]]=f[i]*f[prime[j]];
                    }
                }
            }
        }
        
    • 应用
      • 线性筛预处理 f(n)=d|nd×φ(d)

        点击查看代码
        void euler(ll n)
        {
        	memset(vis,false,sizeof(vis));
        	f[1]=1;
        	for(ll i=2;i<=n;i++)
        	{
        		if(vis[i]==false)
        		{
        			len++;
        			prime[len]=i;
        			f[i]=1+i*(i-1);
        			low[i]=i;
        		}
        		for(ll j=1;j<=len&&i*prime[j]<=n;j++)
        		{
        			vis[i*prime[j]]=true;
        			if(i%prime[j]==0)
        			{
        				low[i*prime[j]]=low[i]*prime[j];
        				if(i==low[i])
        				{
        					f[i*prime[j]]=f[i]+i*prime[j]*i*(prime[j]-1);
        				}
        				else
        				{	
        					f[i*prime[j]]=f[i/low[i]]*f[low[i*prime[j]]];
        				}
        				break;
        			}
        			else
        			{
        				low[i*prime[j]]=prime[j];
        				f[i*prime[j]]=f[i]*f[prime[j]];
        			}
        		}
        	}
        }
        

莫比乌斯函数

posted @   hzoi_Shadow  阅读(97)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
扩大
缩小
点击右上角即可分享
微信分享提示