定义:
一个数的因数只有1和本身,那么这个数是质数。
质数的判断:
一个数n如果不是质数那么在2—sqrt(n)sqrt(n)sqrt(n)一定有他的因子,于是:

bool isPrime (int n)
{for(int i=2;i*i<=n;i++){if(n%i==0) return false;}else return false;
}

但是在大量元素中,比如1—1e61—1e61—1e6中的质数,再用上面的朴素算法,就有些蹩脚了。
这里我们给出埃氏筛法:
原理:如果找到一个质数,那么这个质数的倍数都不是质数

int primes[N],cnt;
bool bprime[N];
void getPrime(int n){memset(bprime,false,sizeof(bprime));bprime[0]=true;bprime[1]=true;   for(int i=2;i<=n;i++){if(!bprime[i]){prime[cnt++]=i;for(LL j=i*2;j<=n;j+=i)bprime[j]=true;}}
}

但是埃氏筛法的缺点:例如6会被3整除,6会被2整除,会被筛两次,所以我们再给出欧氏线性筛法:

int primes[N],cnt;
bool bPrime[N];
void getPrimes(int n){memset(bPrime,false,sizeof(bPrime));for(int i=2;i<=n;i++){if(!bPrime[i])primes[cnt++]=i;for(int j=0;j<cnt&&i*primes[j]<n;j++){bPrime[i*primes[j]]=true;if(i%primes[j]==0)break;}}
}

1e8以内的素数筛法

#include<iostream>
#include<bitset>
using namespace std;
bitset<100000010>v;
int prime[6000001];
int m=0;
void primes(int n)
{for(int i=2; i*i<=n; i++){if(!v[i]){for(int j=i*i; j<=n; j+=i)v[j]=1;}}for(int i=2; i<=n; i++)if(!v[i])prime[m++]=i;for(int i=0; i<m; i++)cout<<prime[i]<<endl;
}
int main()
{primes(1e3+20);return 0;
}

奇技淫巧:
用6N±1法求素数
任何一个自然数,总可以表示成为如下的形式之一:6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)
显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。所以,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。

Miller-Rabin 算法
Miller-Rabin 算法是一个随机算法,随机生成几个 a 利用费马小定理与二次探测定理来检测素数。

只需要多次寻找不超过 n-1 基并检验是否有 , 如果一直有, 那么这个数大概率就是一个素数,否则可以立即判定这个数是个合数。

虽然看似没有问题,但却存在一些数,对于 a 的某些选择可以骗过该算法,这些数虽然不是素数,但却对所有与 p 互素的 0<a<p 满足 ,因此,还需要附加二次探测定理的测试来改进不出错的几率。

LL Mult_Mod(LL a,LL b,LL m)//res=(a*b)%m
{a%=m;b%=m;LL res=0;while(b){if(b&1)res=(res+a)%m;a=(a<<=1)%m;b>>=1;}return res%m;
}
LL Pow_Mod(LL a, LL b, LL m)//res=(a^b)%m
{LL res=1;LL k=a;while(b){if((b&1))res=Mult_Mod(res,k,m)%m;k=Mult_Mod(k,k,m)%m;b>>=1;}return res%m;
}
bool Witness(LL a,LL n,LL x,LL sum)
{LL judge=Pow_Mod(a,x,n);if(judge==n-1||judge==1)return 1;while(sum--){judge=Mult_Mod(judge,judge,n);if(judge==n-1)return 1;}return 0;
}
bool Miller_Rabin(LL n)
{if(n<2)return 0;if(n==2)return 1;if((n&1)==0)return 0;LL x=n-1;LL sum=0;while(x%2==0){x>>=1;sum++;}int times=20;for(LL i=1;i<=times;i++){LL a=rand()%(n-1)+1;//取与p互质的整数aif(!Witness(a,n,x,sum))//费马小定理的随机数检验return 0;}return 1;
}
int main()
{int p;cin>>p;if(Miller_Rabin(p))cout<<p<<"可能是素数"<<endl;elsecout<<p<<"是合数"<<endl;return 0;
}

数学--数论--质数处理相关推荐

  1. 信奥中的数学:质数与合数

    什么是质数 ? 什么是质数 ?_哔哩哔哩_bilibili 质数与合数知识导览 质数与合数知识导览_哔哩哔哩_bilibili 质数和合数. 质数和合数._哔哩哔哩_bilibili 质数与合数_哔哩 ...

  2. 数学/数论专题:莫比乌斯函数与欧拉函数

    数学/数论专题:莫比乌斯函数与欧拉函数(进阶) 0. 前言 1. 前置知识 2. 正文 3. 总结 4. 参考资料 0. 前言 本篇文章会从狄利克雷卷积的角度,讨论莫比乌斯函数与欧拉函数的相关性质. ...

  3. 洛谷---数学---数论

    洛谷---数学---数论 http://www.luogu.org 单看 数学 数论 的书,纯理论,看不进,决定还是从做题开始,不明白的地方再看书,以上机训练,促进看书,同样 从 简单--->难 ...

  4. 各种模板(数学数论字符串)

    文章目录 数学&数论 线性求逆元 exgcd excrt FFT NTT 矩阵乘法 线性筛素数 杜教筛 字符串 Trie KMP hash Manacher AC自动机 PAM SAM 广义S ...

  5. 数学/数论专题-学习笔记:狄利克雷卷积

    数学/数论专题-学习笔记:狄利克雷卷积 1. 前言 2. 一些基础函数 3. 积性函数 4. 狄利克雷卷积 5. 总结 6. 参考资料 1. 前言 狄利克雷卷积,是学习与继续探究 μ\muμ 函数和 ...

  6. 判断质数和合数python代码_小学五年级数学《质数和合数》测试题

    小学五年级数学<质数和合数>测试题 一.把下面各数分别填在适当的位置. 1538112097398192707141871200 质数:_________________________ ...

  7. 信奥中的数学 数论 第2讲 奇数和偶数

    28.891.数的奇偶 (课程6) 难度:1 登录 29.892.同奇偶 (课程6) 难度:1 登录 30.893.奇数个数 (课程6) 难度:1 登录 35.898.2位偶数 (课程7) 难度:1 ...

  8. 数学知识----质数

    质数 质数是针对于大于1的自然数定义的,小于等于1的数既不是质数也不是合数 质数: 在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数 试除法判定质数 朴素做法: package ...

  9. 算法刷题-数论-质数的判定、分解质因数、筛质数

    文章目录 数论 1. 质数 质数的判定---试除法 分解质因数---试除法 筛质数 朴素筛法 埃氏筛法 线性筛法 数论 1. 质数 质数:在大于1的整数中,如果只包含1和它本身这两个约数,那么这个数就 ...

最新文章

  1. 17岁少年买不到回国机票就攻击航司系统,获刑四年!自称因疫情严重和女朋友怀孕压力大...
  2. 云上人替代方案训练代码
  3. Redis学习-内存优化
  4. 3、使用Oracle Logminer同步Demo
  5. python爬虫scrapy框架爬取网页数据_Scrapy-Python
  6. 文献记录(part13)--Hypergraph based geometric biclustering algorithm
  7. C语言中quot;##quot;的独特用法
  8. jeecg下实现自动默认模糊查询
  9. python处理csv文件将id相同的行合并到同一行并用符号将其隔开_Python探索性数据分析,这样才容易掌握...
  10. python3中input输入浅谈_详解Python3中的 input() 函数
  11. 容器技术Docker K8s 47 服务网格(ASM)-阿里云服务网络概述
  12. python深拷贝和浅拷贝的区别_python 深拷贝与浅拷贝的区别
  13. 记录10本关于开关电源的书
  14. 续费Namecheap域名教程附如何便宜续费域名方法
  15. 申宝股票-三大指数震荡下行
  16. 第二章-用户需求分析
  17. 50个汉字对应到 varchar是多少
  18. MySQL数据库,创建表空间
  19. 基于J2ME的游戏开发总结和感想
  20. 清风:数学建模算法、编程和写作培训

热门文章

  1. Android开发之android4.4沉浸式状态栏后toolbar和状态栏重复(重叠,覆盖)的bug
  2. 鼠标在计算机上被关闭了怎么处理,鼠标驱动程序丢失导致系统自动关闭的解决方法...
  3. github中删除已建仓库(二)
  4. 基于hi-nginx的web开发(python篇)——cookie和会话管理
  5. 科普向--详解JavaScript中的数据类型
  6. 【初窥javascript奥秘之闭包】叶大侠病都好了,求不踩了:)
  7. 利用dbms_backup_restore函数来恢复数据文件
  8. 使用命令批量修改文件的后缀名称
  9. 学习笔记之Java程序设计实用教程
  10. Latent Semantic Analysis (LSA) Tutorial