版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
简单数论及算法选讲金靖华东师大二附中何为数论数论,是专门研究整数的纯数学的分支,而整数的基本元素是素数(也称质数),所以数论的本质是对素数性质的研究。数论被高斯誉为“数学中的皇冠”。按研究方法来看,数论大致可分为初等数论和高等数论。初等数论是用初等方法研究的数论,它的研究方法本质上说,就是利用整数环的整除性质,主要包括整除理论、同余理论、连分数理论。基本概念基本概念
素数与合数
素数判定
1
boolisPrime(intn){2
if
(n==1)
return
false;3
else{4
for(inti=2;i*i<=n;i++)5
if
(n%i==
0)
return
false;6
return
true;7
}8
}例题:素因数分解
1
for(inti=2;i*i<=n;i++)
2
if(n%i==
0)
{3 cout<<n/i<<endl;4
break;5
}例题:[CF776B]Sherlockandhisgirlfriend
最大公约数和最小公倍数最大公约数和最小公倍数
1vector<int>factor(intx)
{2 vector<int>ret;3
for
(inti=
2;i*i<=x;
++i)4
while
(x%i==
0)
{5 ret.push_back(i);6 x/=i;7
}8
if
(x>
1)ret.push_back(x);9
returnret;10
}
1intpose(inta,intb){2 for(intx=2;x*x<=min(a,b);x++){3 while(a%x==0&&b%x==0){a/=x;b/=x;ans*=x;}4 while(a%x==0)a/=x;5 while(b%x==0)b/=x;6 }7if(a%b==0)ans*=b;8 elseif(b%a==0)ans*=a;9 returnans;10}
1
intEuclid(inta,intb){2
if
(b==0)
returna;3
else
returnEuclid(b,a%b);4
}1
intEuclid(inta,intb){2
return
(b==0)
?a:Euclid(b,a%b);3
}
例题:[BZOJ1876]SuperGCD
1
intgcd(intm,intn){2
if
(m==n)
returnm;3
if
(m<n)
returngcd(n,m);4
if
(m&
1
==
0)
5
return
(n&
1
==
0)?
2*gcd(m>>1,n>>1):gcd(m>>1,n);6
return
(n&
1
==
0)?gcd(m,n>>1):gcd(n,m-n);7
}
1 ans=1;2
for(inti=1;i<=n;i++){3 scanf("%d",&a[i]);4 ans=ans*a[i]/gcd(ans,a[i]);5
}6 printf("%d",ans);
两数互素(互质)
模运算基本概念
剩余系
模运算
模运算
1
intmul_mod(inta,intb,intm){2 a%=m;b%=m;3
return
(int)((long
long)a*b%m);4
}幂取模
快速幂1
intpow_mod(inta,intn,intm){2
if(n==
0)
return
1;3
intx=pow_mod(a,n/2,m);4
long
longans=
(long
long)x*x%m;5
if(n%
2
==
1)ans=ans*a%m;6
returnans;7
}例题:NOIP2013D1T1
扩展欧几里得算法裴蜀定理
例题:[BZOJ1441]
扩展欧几里得算法
扩展欧几里得算法
扩展欧几里得算法1
intextend_gcd(inta,
intb,
int
&x,
int
&y)
{2
if
(b==
0)
{3 x=
1;y=
0;4
returna;5
}
6
else
{7
intret=extend_gcd(b,a%b,y,x);8 y-=x*
(a/b);9
returnret;10
}11
}扩展欧几里得算法
扩展欧几里得算法
例题:线性组合
例题:线性组合
例题:线性组合1
intmain(){
2 scanf("%d",&n);3 gcd[0]=0;4
for(inti=1;i<=n;i++)
{5 scanf("%d",&a[i]);6 gcd[i]=Euclid(gcd[i-1],a[i]);7
}8 scanf("%d",&c);9
if
(c%gcd[n]==0){
10 y[n]=c/gcd[n];11
for
(inti=n;i>1;i--)12 Extended_Euclid(gcd[i-1],a[i],gcd[i]*y[i],y[i-1],x[i]);
13 x[1]=y[1];14
for(inti=1;i<=n;i++)printf("%d",x[i]);15
}16
return
0;17
}逆元模
𝑛
意义下乘法的逆
逆元
1
intinverse(inta,
intb)
{2
intx,y;3 exgcd(a,b,x,y);4
returnx;5
}
线性求逆元:递推法
1
for
(inverse[1]
=
1,i=
2;i<=n;
++i)2 inverse[i]
=inverse[p%i]*(p-p/i)
%p;线性求逆元:倒推法
例题:组合数取模
容斥原理
各集合的交集容斥原理容斥原理容斥原理
错排问题
错排问题
欧拉函数欧拉函数
容斥原理求欧拉函数
容斥原理求欧拉函数
基于素因数分解求欧拉函数的算法1
inteuler_phi(intn){2
intres=n;3
for(inti=
2;i*i<=n;i++)
{4
if(n%i==
0)
{5 res=res/i*
(i-
1);
6
for
(;n%i==
0;n/=i);7
}8
}9
if
(n!=
1)res=res/n*
(n-
1);10
returnres;11
}
素数筛法埃拉托斯特尼筛法埃式筛法
埃式筛法1 #definemaxn10000002
boolisPrime[maxn+1];/*isPrime[i]true表示i为素数*/3
voideratos(intn){4
inti,j;5 isPrime[0]
=isPrime[1]
=
false;6
for(i=
2;i<=n;
++i)
7 isPrime[i]
=
true;
8
for(i=
2;i*i<=n;
++i)
9
if(isPrime[i]){
10
for(j=i*i;j<=n;j+=i)
11 isPrime[j]
=
false;12
}13
}筛法优化素因数分解-1利用埃氏筛法可以快速实现素因数分解,只要在判定质数时记录下每个数值的最小素因数即可。算法实现如下:1 #definemaxn10000002
boolisPrime[maxn+1];3
int
minFactor[maxn+1];
//记录每个数的最小素因数的数组5
voideratos(intn){6
inti,j;7 isPrime[0]
=isPrime[1]
=
false;8 minFactor[0]
=minFactor[1]
=
-1;9
for(i=
2;i<=n;
++i)
{10 isPrime[i]
=
true;11 minFactor[i]
=i;
//初始化,表示还未找到最小的素因数12
}筛法优化素因数分解-213
for(i=
2;i*i<=n;
++i)
{
14
if(isPrime[i]){15
for(j=i*i;j<=n;j+=i){16 isPrime[j]
=
false;17
if(minFactor[j]==j)
//如果此前尚未找到j的素因数,18
//那么将其设为i19 minFactor[j]
=i;
20
}21
}22
}23}筛法优化素因数分解-324 vector<int>factor(intx)
{25 vector<int>ret;26
while(x>
1){27 ret.push_back(minFactor[n]);28 n/=minFactor[x];29
}30
returnret;31
}利用埃氏筛法,生成欧拉函数值的表1
inteuler[MAX_N];2
voideuler_phi2(){3
for
(inti=
0;i<MAX_N;i++)euler[i]
=i;4
for
(inti=
2;i<MAX_N;i++)
{5
if
(euler[i]
==i)
{6
for
(intj=i;j<MAX_N;j+=i)
7 euler[j]
=euler[j]
/i*
(i-
1);8
}9
}10
}
欧拉筛法(线性筛)
i=素数表筛除的数i=素数表筛除的数2{2}{4}13{2,3,5,7,11,13}{26,39}3{2,3}{6,9}14{2,3,5,7,11,13}{28}4{2,3}{8}15{2,3,5,7,11,13}{30,45}5{2,3,5}{10,15,25}16{2,3,5,7,11,13}{32}6{2,3,5}{12}17{2,3,5,7,11,13,17}{34}7{2,3,5,7}{14,21,35,49}18{2,3,5,7,11,13,17}{36}8{2,3,5,7}{16}19{2,3,5,7,11,13,17,19}{38}9{2,3,5,7}{18,27}20{2,3,5,7,11,13,17,19}{20}10{2,3,5,7}{20}21{2,3,5,7,11,13,17,19}{42}11{2,3,5,7,11}{22,33}22{2,3,5,7,11,13,17,19}{44}12{2,3,5,7,11}{24}.........欧拉筛法(线性筛)1
voidEuler_sieve(intn){2 memset(isprime,true,sizeof(isprime));3 prime[0]=0;4
for(inti=2;i<=n;i++){5
if
(isprime[i])prime[++prime[0]]=i;//把素数保存到素数表prime中6
for(intj=1;j<=prime[0]
&&i*prime[j]<=n;j++){7 isprime[i*prime[j]]=false;//筛除i*prime[j]8
if
(i%prime[j]==0)
break;9
//当i中含有素因子prime[j]时中断循环,确保每个数只被它的最小素因子筛除10
}11
}12
}素数相关定理费马小定理
费马小定理
使用费马小定理来判定素数
欧拉定理
使用欧拉定理求逆元
1
intpowermod(inta,
intb,
intn){2
intret=
1;3
while
(b)
{4
if
(b&
1)ret=
(long
long)ret*a%n;5 a=
(long
long)a*a%n;6 b>>=
1;7
}8
returnret;9
}威尔逊定理
线性同余方程线性同余方程
线性同余方程组
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 班主任的个人工作计划范文
- 中学老师新学期教学工作计划
- 2024工程技术咨询协议3篇
- 2024年大连出口吸污车产品责任保险合同3篇
- 实习报告总结合集15篇
- 实习申请书(15篇)
- 建筑行业实习总结例文
- 某大学数字化校园建设项目建议书
- 六年级上第四单元比集体备课思维导图
- 《电器火灾的防范》课件
- 2024年统编版七年级语文上册期末测试卷(附答案)
- CMA质量记录表格
- 国开(河北)2024年秋《现代产权法律制度专题》形考作业1-4答案
- 2024浙江桐庐县文化旅游投资集团限公司招聘笔试及高频难、易错点500题模拟试题附带答案详解
- 代词课件完整版本
- 2024年江苏南京大学事业编制岗位招聘16人历年高频难、易错点500题模拟试题附带答案详解
- 外研版(2024新版)七年级上册英语期末(Units 1~6)学业质量测试卷(含答案)
- 苏教版四年级上册科学实验全
- 四川省成都市2023-2024学年七年级上学期期末数学试题(含答案)
- 3.14 丝绸之路的开通与经营西域 课件 2024-2025学年部编版
- 小学英语词汇表(沪牛津版)
评论
0/150
提交评论