教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> 小学教育> 学科竞赛> 初等数论c++

初等数论c++

上传者:李文贤
|
上传时间:2017-06-03
|
次下载

初等数论c++

  备注:纯手写代码,注释。

  数论

  1、素数

  (1)暴力求解法

  根据素数的概念,没有1和其本身没有其他正因数的数。 所以只需枚举比这个数小的数,看能整除即可; C++代码:

  #includeiostream

  #includecstdio

  #includecmath

  using namespace std;

  bool determine(int number)

  {

  if(n=2)return false;

  if(!n%2)return false;

  for(int i=3;i=ceil(sqrt(number));i+=2)

  //去掉了偶数的判断,效率提高一倍

  /*如果number整除以i,那么会得到两个的因数,

  而较小的那个因数不会超过number的二分之一次方;

  所以只需判断到number的平方根向上取整即可; */

  if(number%i);

  else return false;

  return true;

  }

  int main()

  {

  int sum;

  cin

  if(determine(sum))

  coutYES!

  else coutNO!

  return 0;

  }

  时间复杂度:o(sqrt(n)/2);

  空间复杂度:几乎没有;

  (2)一般线性筛法:

  因为任何一个合数都能分解成几个素数相乘的形式;

  所以可以做一个表,首先把2设为质数,然后将2的倍数设为合数,剩下的数就是新得到的质数,然后重复这个过程,直到筛到合适的范围即可;

  但是这个算法有缺陷:

  1、 同一个数可能被筛多次,这就产生了多余的步骤。

  2、 占用空间很大,如果使用bool数组的话,只能筛到1e9;

  3、 从1-n筛,不能从m-n开始筛;

  C++代码:

  #includecstring

  #includecmath

  #includeiostream

  using namespace std;

  bool s[1000000000];

  int m,n;

  int main()

  {

  cinm

  memset(s,true,n);

  s[0]=s[1]=0;

  //输出M—N之间所有素数;

  for(int i=2;i=ceil(sqrt(n));++i)

  if(s[i])

  {

  for(int j=i;j++j)

  if(s[i*j])

  s[i*j]=false;

  }

  for(int i=m;i++i)

  if(s[i])

  couti

  return 0;

  }

  时间复杂度:o(n*loglogn);

  空间复杂度:很大!注意数据大的话可能会爆空间;

  (3)线性筛法求素数

  这个占空间就更大了,需要使用一个bool数组和int数组 而亲身试验得到int数组最多开到1e8……

  很无语,快确实是快了,但是测试数据一大,爆空间就更容易了; #includeiostream

  #includecstdio

  #includecmath

  using namespace std;

  int m,n,sum;

  bool inp[1000000000];

  int s[100000000]={0,0};

  int main()

  {

  cinm

  for(int i=2;i++i)

  {

  if(!inp[i])

  s[sum++]=i;

  for(int j=0;ji*s[j]++j) {

  inp[i*s[j]]=true;

  if(!(i*s[j]))

  break;

  }

  }

  for(int i=m;i++i)

  if(!inp[i])

  couti

  return 0;

  }

  2、唯一分解定理

  任何数都可以被唯一的分解成多个素数之积 例如:456=2*2*2*3*19;

  C++代码:

  #includecstring

  #includecmath

  #includeiostream

  #includealgorithm

  #includecstdlib

  using namespace std;

  bool s[1000000];

  int m,n,sum=0,num;

  int Prime[1212121];

  int zhi[1500];

  void Primes()

  {

  for(int i=1;i++i) s[i]=true;

  s[0]=s[1]=0;

  for(int i=2;i++i) if(s[i])

  {

  Prime[++sum]=i;

  for(int j=i;j++j) if(s[i*j])

  s[i*j]=false; }

  }

  int main()

  {

  int flag=0;

  cin

  int number=num;

  Primes();

  if(s[num])

  {

  coutnum'=' return 0;

  }

  coutnum=str.chu(); while(num1)

  for(int i=1;num=sum;++i) if(!(num%Prime[i])) {

  zhi[++flag]=Prime[i]; num/=Prime[i]; }

  sort(zhi+1,zhi+flag+1);

  coutzhi[1];

  for(int i=2;i++i)

  cout*

  return 0;

  }

  首先做一个质数表,并把质数存到数组里,然后用数模每个素数,如果为0则记录素数,最后排个序输出;

  4、 欧拉函数

  欧拉函数φ(n)为不大于n的与n互素的数的个数;

  A与B互素,表示a与b的最大公约数为1,即(a,b)=1; 欧拉函数的符号φ读作fhi,在搜狗的特殊符号里可以找到;

  初等数论c++1

  ,其中pi为x的质因数,其中

  φ(1)=1(唯一与1互质的数是1本身) 设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值

  φ:N→N,n→φ(n)称为欧拉函数。

  几个性质(来自百度百科)

  初等数论c++2

  1、若n是质数p的k

  初等数论c++3

  次幂,

  的倍数外,其他数都跟n互质。

  2、欧拉函数是积性函数——若m,n互质,

  3、特殊性质:当n为奇数时,

  4、若n为质数则 ,因为除了p , 证明与上述类似。

  5、设p是素数,a

  初等数论c++4

  是一个正整数,那么 C++实现:

  #includecstring

  #includecmath

  #includeiostream

  #includealgorithm

  #includecstdlib

  using namespace std;

  bool s[1000000];

  int m,n,sum=0,num;

  int Prime[1212121];

  int zhi[1500];

  bool asd[1500];

  int phi(int n)

  {

  int i,rea=n;

  for(i=2;i*ii++)

  {

  if(n%i==0)

  {

  rea=rea-rea/i;

  while(n%i==0) n/=i;

  }

  }

  if(n1)

  rea=rea-rea/n; return rea;

  }

  void Primes()

  {

  for(int i=1;i++i) s[i]=true;

  s[0]=s[1]=0;

  for(int i=2;i++i) if(s[i])

  {

  Prime[++sum]=i;

  for(int j=i;j++j) if(s[i*j])

  s[i*j]=false; }

  }

  int main()

  {

  int flag=0;

  cin

  int number=num;

  Primes();

  if(num==1||!num)

  {

  coutfhinumber)= cout

  return 0;

  }

  if(s[num])

  {

  coutfhinumber)=number-1; return 0;

  }

  while(num1)

  for(int i=1;num=sum;++i)

  if(!(num%Prime[i]))

  {

  zhi[++flag]=Prime[i];

  num/=Prime[i];

  }

  int fenzi=1,fenmu=1;

  sort(zhi+1,zhi+flag+1);

  for(int i=1;i++i)

  if(!asd[zhi[i]])

  {

  asd[zhi[i]]=true;

  fenzi*=zhi[i]-1;

  fenmu*=zhi[i];

  }

  coutfhi(number)=number/fenmu*fenzi; //coutfhi(number)=fhi(number); /*这是另一种求欧拉函数值的方法*/

  return 0;

  }

  5、欧几里得算法

  辗转相除法,根据公式(a,b)=(b,r)

  其中r为a%b,即a/b;

  C++代码:

  (1)递归

  #includeiostream

  #includecstdio

  using namespace std;

  int GCD(int a,int b) {

  if(a%b)

  return GCD(b,a%b); else return b; }

  int main()

  {

  int a,b;

  cina

  coutGCD(a,b); return 0;

  }

  (2)递推

  #includeiostream using namespace std; int main()

  {

  int a,b,r;

  cina

  r=m%n;

  while(r!=0)

  {

  a=b;

  b=r;

  r=m%n;

  }

  cout

  return 0;

  }

  6、扩展欧几里得 扩展欧几里得又称斐蜀定理,对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by;

  求同余方程

  #includecstdio

  void exgcb(int a,int b,int x,int y)

  {

  if(!b)

  {

  x=1;y=0;

  return;

  }

  int q=a/b;

  int r=a%b; exgcb(b,r,y,x);

  y-=q*x;

  }

  int main()

  {

  int x,y;

  int a,b;

  scanf(%d %da,

  exgcb(a,b,x,y);

  while(x0)

  x+=b;

  printf(%d

  return 0;

  }

  求乘法逆元

  #includecstdio

  void exgcb(int a,int b,int x,int y) {

  if(!b)

  {

  x=1;y=0;

  return;

  }

  int q=a/b;

  int r=a%b;

  exgcb(b,r,y,x);

  y-=q*x;

  }

  int Multiplicative inverse(int a,int b) {

  int x,y;

  int gcb=GCD(a,b,x,y);

  if(1%gcb)return -1;

  x*=1%gcb;

  b=abs(b);

  int answer=x%b;

  while(answer=0)

  answer+=b;

  return answer;

  }

  int main()

  {

  int x,y;

  int a,b;

  scanf(%d %da,

  exgcb(a,b,x,y);

  while(x0)

  x+=b;

  printf(%dn

  coutMultiplicative inverse(a,b); return 0;

  }

  求线性方程ax+by=c

  这个方程等同于ax≡c(mod b) 所以

版权声明:此文档由查字典文档网用户提供,如用于商业用途请与作者联系,查字典文档网保持最终解释权!

下载文档

热门试卷

2016年四川省内江市中考化学试卷
广西钦州市高新区2017届高三11月月考政治试卷
浙江省湖州市2016-2017学年高一上学期期中考试政治试卷
浙江省湖州市2016-2017学年高二上学期期中考试政治试卷
辽宁省铁岭市协作体2017届高三上学期第三次联考政治试卷
广西钦州市钦州港区2016-2017学年高二11月月考政治试卷
广西钦州市钦州港区2017届高三11月月考政治试卷
广西钦州市钦州港区2016-2017学年高一11月月考政治试卷
广西钦州市高新区2016-2017学年高二11月月考政治试卷
广西钦州市高新区2016-2017学年高一11月月考政治试卷
山东省滨州市三校2017届第一学期阶段测试初三英语试题
四川省成都七中2017届高三一诊模拟考试文科综合试卷
2017届普通高等学校招生全国统一考试模拟试题(附答案)
重庆市永川中学高2017级上期12月月考语文试题
江西宜春三中2017届高三第一学期第二次月考文科综合试题
内蒙古赤峰二中2017届高三上学期第三次月考英语试题
2017年六年级(上)数学期末考试卷
2017人教版小学英语三年级上期末笔试题
江苏省常州西藏民族中学2016-2017学年九年级思想品德第一学期第二次阶段测试试卷
重庆市九龙坡区七校2016-2017学年上期八年级素质测查(二)语文学科试题卷
江苏省无锡市钱桥中学2016年12月八年级语文阶段性测试卷
江苏省无锡市钱桥中学2016-2017学年七年级英语12月阶段检测试卷
山东省邹城市第八中学2016-2017学年八年级12月物理第4章试题(无答案)
【人教版】河北省2015-2016学年度九年级上期末语文试题卷(附答案)
四川省简阳市阳安中学2016年12月高二月考英语试卷
四川省成都龙泉中学高三上学期2016年12月月考试题文科综合能力测试
安徽省滁州中学2016—2017学年度第一学期12月月考​高三英语试卷
山东省武城县第二中学2016.12高一年级上学期第二次月考历史试题(必修一第四、五单元)
福建省四地六校联考2016-2017学年上学期第三次月考高三化学试卷
甘肃省武威第二十三中学2016—2017学年度八年级第一学期12月月考生物试卷

网友关注视频

飞翔英语—冀教版(三起)英语三年级下册Lesson 2 Cats and Dogs
北师大版八年级物理下册 第六章 常见的光学仪器(二)探究凸透镜成像的规律
冀教版小学数学二年级下册第二周第2课时《我们的测量》宝丰街小学庞志荣.mp4
沪教版牛津小学英语(深圳用) 五年级下册 Unit 10
冀教版小学数学二年级下册第二单元《有余数除法的整理与复习》
【部编】人教版语文七年级下册《泊秦淮》优质课教学视频+PPT课件+教案,辽宁省
沪教版牛津小学英语(深圳用) 四年级下册 Unit 8
沪教版牛津小学英语(深圳用) 四年级下册 Unit 12
沪教版牛津小学英语(深圳用) 六年级下册 Unit 7
河南省名校课堂七年级下册英语第一课(2020年2月10日)
化学九年级下册全册同步 人教版 第25集 生活中常见的盐(二)
第19课 我喜欢的鸟_第一课时(二等奖)(人美杨永善版二年级下册)_T644386
苏科版数学八年级下册9.2《中心对称和中心对称图形》
七年级英语下册 上海牛津版 Unit9
沪教版牛津小学英语(深圳用) 四年级下册 Unit 4
冀教版小学英语五年级下册lesson2教学视频(2)
冀教版小学英语四年级下册Lesson2授课视频
【部编】人教版语文七年级下册《老山界》优质课教学视频+PPT课件+教案,安徽省
北师大版数学四年级下册3.4包装
第4章 幂函数、指数函数和对数函数(下)_六 指数方程和对数方程_4.7 简单的指数方程_第一课时(沪教版高一下册)_T1566237
第五单元 民族艺术的瑰宝_15. 多姿多彩的民族服饰_第二课时(市一等奖)(岭南版六年级上册)_T129830
沪教版八年级下册数学练习册20.4(2)一次函数的应用2P8
【部编】人教版语文七年级下册《过松源晨炊漆公店(其五)》优质课教学视频+PPT课件+教案,江苏省
青岛版教材五年级下册第四单元(走进军营——方向与位置)用数对确定位置(一等奖)
外研版英语三起6年级下册(14版)Module3 Unit1
苏科版八年级数学下册7.2《统计图的选用》
苏教版二年级下册数学《认识东、南、西、北》
沪教版八年级下册数学练习册一次函数复习题B组(P11)
【部编】人教版语文七年级下册《泊秦淮》优质课教学视频+PPT课件+教案,天津市
【部编】人教版语文七年级下册《老山界》优质课教学视频+PPT课件+教案,安徽省