【学习笔记】质数、约数、同余等基础性质和一些板子

质数:
反素数,见上篇。
素数筛:(给N,求1~N之间的所有质数)
埃氏筛:O(nloglogn)

vector<int> prime;//存储2~N的所有素数 
int v[maxn];//合数标记 
void find_primes(int n)
{
 memset(v,0,sizeof(v));
 for(int i=2;i<=n;i++){
  if(v[i]) continue;
  prime.push_back(i);
  //优化:从x^2开始,(x+1)*x...到N/x*x结束,标记为合数即可 
  for(int j=i;j<=n/i;j++) v[i*j]=1; 
 }
}

线性筛:O(n)

const int maxn=10005;
int v[maxn];//v[i]:第i个数的最小质因子 
int prime[maxn];//记录找到的素数 
int m;//找到素数的个数 
void find_primes(int n)
{
 memset(v,0,sizeof(v));
 m=0;
 for(int i=2;i<=n;i++){
  if(v[i]==0){
   v[i]=i;
   prime[++m]=i;
  }
  for(int j=1;j<=m;j++){
   if(prime[j]>v[i]||prime[j]>n/i) break;
   v[i*prime[j]]=prime[j];
  }
 }
}

质因数分解:N=p1c1p2c2…pmcm
结合试除和埃氏筛:O(sqrt(n))

const int maxn=10005;
int p[maxn];
int c[maxn];
int m;
void divide(int n)
{
 m=0;
 for(int i=2;i<=sqrt(n);i++){
  if(n%i==0){
   p[++m]=i,c[m]=0;
   while(n%i==0) n/=i,c[m]++;
  }
 }
 if(n>1) p[++m]=n,c[m]=1;
 for(int i=1;i<=m;i++){
  cout<<p[i]<<"^"<<c[i]<<endl;
 }
}

最大公约数,最小公倍数的性质:
gcd(a,b)lcm(a,b)=ab;
gcd(a,b)=gcd(b,a-b)=gcd(a,a-b); (a>=b) 更相减损
gcd(2a,2b)=2gcd(a,b);
gcd(a,b)=gcd(b,a mod b) (b!=0) 欧几里得

算术基本定理的推论:
N的正约数集合为{p1b1…pmbm}其中0<=bi<=ci
N的正约数个数为(c1+1)(c2+1)…(cm+1)
N的所有正约数的和为(1+p1+p12+…+p1c1)…(1+pm+pm2+…+pmcm)

互质与欧拉函数:
互质:
a与b互质:gcd(a,b)=1
a,b,c互质:gcd(a,b,c)=1
a,b,c两两互质:gcd(a,b)=gcd(b,c)=gcd(a,c)=1
欧拉函数:
对于N=p1c1p2c2…pmcm,N的欧拉函数为1-N中与N互质的数的个数
φ(N)=N*(1-1/p1)(1-1/p2)…(1-1/pm)

//欧拉函数
int phi(int n)
{
 int ans=n;
 for(int 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;
} 

欧拉函数性质:
1.对于n>1,1~n中与n互质的数的和为n*φ(n)/2
2.若a,b互质,则φ(ab)=φ(a)φ(b)
3.设p为质数,若p|n 且p2|n,则φ(n)=φ(n/p)*p
4.设p为质数,若p|n且p2不能被n整除,则φ(n)=φ(n/p)·(p-1)
5.对于d|n,∑φ(d)=n
6.当n为奇数,φ(2n)=φ(n)
7.当n>2,所有φ(n)都是偶数
8.当n>6,所有φ(n)都是合数

积性函数:如果a,b互质时,有f(ab)=f(a)f(b),则称f为积性函数
性质:
1.若f为积性函数,n=∏pici,则f(n)=∏f(pici)
2.积数函数的乘积也是积数函数
2.任何积性函数都能应用线性筛,在O(n)时间内求出1~n项

同余:
费马小定理:若p为素数,对于任意整数a,有ap和a模p同余
欧拉定理:对于互质的正整数a和n,有aφ(n)与1 mod n同余
欧拉定理推论:
对于互质的正整数a和n,则对于任意正整数b,有ab与abmodφ(n) mod n同余
当a,n不一定互质且b>φ(n)时,有ab与abmodφ(n)+φ(n)mod n同余
扩展欧几里得:ax+by=gcd(a,b)

//扩展欧几里得
//输入a,b,任意x,y 
//返回ax+by=gcd(a,b)的一组特解x0,y0 
int exgcd(int a,int b,int &x,int &y)
{
 if(b==0){
  x=1,y=0;
  return a;
 }
 int d=exgcd(b,a%b,x,y); 
 int z=x;x=y;y=z-y*(a/b);
 return d;
}

乘法逆元:
定义:若整数b,m互质,并且b|a,则存在一个整数x,st. a/b=a*x (mod m)
称x为b的mod m的乘法逆元,记为b-1(mod m)
b·b-1=1 (mod m)
当模数p为质数时,bp-2即为b的乘法逆元(费马小定理)
在保证b,m互质的情况下,可以通过求解b·x=1(mod m)同余方程

线性同余方程:a·x=b(mod m),求x
等价于:m|ax-b,不妨设倍数为-y,则有:ax+my=b
可以知道当且仅当gcd(a,m)|b时有解
有解时,可以用扩欧解出一组特解x0,y0,满足ax0+my0=gcd(a,m)
则x=x0·b/gcd(a,m)为线性同余方程的一个解
通解为所有mod (m/gcd(a,m))与x同余的整数

中国剩余定理CRT
m1~mn两两互质,m=∏mi,Mi=m/mi,ti是Mi·ti=1(mod mi)的一个解,
对于任意n个整数a1~an,方程组:
x=a1(mod m1)
.
.
.
x=an(mod mn)
有整数解,解为:x=∑ai·Mi·ti
中国剩余定理给出了线性同余方程组的一个特解x,通解为x+km
当题目要求求最小的非负整数解时,只需把x对m取模

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值