今天听了ljss神犇的数论课,顿时感觉————我真的是太弱啦!

我只能稍微写一下我能听懂的部分orz

那么这就是今天我为数不多能听懂一点的之一......QAQ

首先先介绍今天的主角:费马小定理

————转自维基百科

没看懂的话我稍微解释一下,就是

假如p是质数,且GCD(a,p)=1,那么 a^(p-1) ≡1(mod p)(假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1)

因此我们就似乎有了基于费马小定理的判断素数方式:随机枚举使gcd(a,p)=1的a。判断该表达式是否成立--------记为命题q

但是仔细想一想,会发现命题q实际是费马小定理的逆命题

根据我们在高中数学选修2-1学习的内容,真命题的逆命题不一定是真命题....

似乎出现了一些问题呢x

所幸的是,这种思路大部分时间是正确的,因为根据某个奇怪的性质,费马小定理只有对于少数数才会出现逆命题不成立的情况,而这类数就被称为卡迈克尔数(Carmichael number)

卡迈克尔数在正整数中很少,并且随着数的增大会变的越来越少,在1e8范围内只有255个,1e17范围内也才只有不到6e5个,因此可以直接多次应用上述的算法来提高准确性

不过作为有追求的oier,我们怎么能这么没有梦想呢?

我们引入新工具:

二次探测定理 如果p是一个素数,且0

下面给出简单的证明:

x^2≡1(mod p)

→x^2-1≡0(mod p)

→(x-1)(x+1)≡0(mod p)

那么我们将二次探测定理转换成

(a(p-1)/2)2≡1(mod p)

应用上面这两个定理可以使失误率达到最劣2-t,而实际远远达不到这个数,因此一般3~5次即可保证正确性

该算法就是Miller_Rabin算法,期望复杂度O(tlog3n)

代码:(还有些许唐突的地方,待补全)题目为洛谷线性筛模板

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define N 10000001

typedef long long ll;

const int inf=0x3fffffff;

const int maxn=2017;

using namespace std;

inline int read()

{

int f=1,x=0;char ch=getchar();

while(ch>'9'|ch

{

if(ch=='-')

f=-1;

ch=getchar();

}

while(ch<='9'&&ch>='0')

{

x=(x<<3)+(x<<1)+ch-'0';

ch=getchar();

}

return f*x;

}

ll qmulti(ll a,ll b,ll c)

{

ll tem=a,sum=0;

while(b)

{

if(b&1)sum=(sum+tem)%c;

tem=(tem+tem)%c;

b>>=1;

}

return sum;

} //防止乘的时候过大爆掉

ll qpow(ll a,ll b,ll c)

{

ll k=1;

while(b>0)

{

if(b&1)k=(k*a)%c;

a=(a*a)%c;

b>>=1;

}

return k;

}

bool witness(int a,int x,int k,int q)

{

ll v=qpow(a,q,x);

if(v==1||v==x-1)return 0;

while(k--)

{

v=v*v%x;

if(v==x-1)return 0;

}

return 1;

}

bool miller(ll n)

{

int time=5;//随机time次

if(n==2)return 1;//特判2

if(n<2||n%2==0)return 0;

ll a=0,t=0,b=n-1;

while(!(b&1))

{

t++;

b>>=1;

}

for(int i=0;i

{

a=rand()%(n-1)+1;

if(witness(a,n,t,b))return 0;

}

return 1;

}

int main()

{

srand(time(0));

ll n=read(),m=read();

for(ll i=1;i<=m;i++)

{

ll a=read();

printf(miller(a)?"Yes\n":"No\n");

}

}

a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

[a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

[a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

[a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

[a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

[a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

a p − 1 ≡ 1 ( mod p ) {\displaystyle a^{p-1}\equiv 1{\pmod {p}}}

来源:https://www.cnblogs.com/tsunderehome/p/7517658.html

费尔马小定理素数java_利用费马小定理判断素数相关推荐

  1. python求最大素数_Python实现求最大公约数及判断素数的方法

    本文实例讲述了Python实现求最大公约数及判断素数的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python def showMaxFactor(num): cou ...

  2. 素数 c语言 时间少,C语言判断素数怎么优化时间,1000000以内,不用代码,指点一下就好...

    匿名用户 1级 2016-09-04 回答 基本思想 用筛法求素数的基本思想是:把从1开始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中选择最小的数是素数,然后去掉它的 ...

  3. 判断素数(费马小定理)

    1)Sieve of Eratosthenes筛法 由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了.例如要查找100以内的质数,首先 ...

  4. miller——rabin判断素数

    我们首先看这样一个很简单的问题:判定正整数\(n\)是否为素数 最简单的做法就是枚举\(2\)到\(n\)的所有数,看是否有数是\(n\)的因数,时间复杂度\(O(n)\) 稍微优化一下发现只要枚举\ ...

  5. C语言判断素数方法之试除法

    素数又称质数,指的是一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数,如2,3,5,7,11,13,17-.接下来让我们以打印区间[a,b]内所有素数为目标来探究一种判断素数 ...

  6. php判断质数,php如何判断是否为素数?判断素数的三种方法(代码示例)

    本篇文章给大家带来的内容是介绍php如何判断是否为素数?判断素数的三种方法(代码示例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 什么是素数? 质数又称素数.一个大于1的自然数 ...

  7. 判断素数及其算法优化

    首先,我们要清楚什么是素数? 素数:又称质数,一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数. 根据素数的定义,我们可以写 ...

  8. 费尔马小定理素数java_费马小定理,我的理解

    原标题:费马小定理,我的理解 触碰标题下面一行的"邵勇老师"查看所有文章:触碰"数学教学研究", 关注本微信公众号(sx100sy). 本公众号内容均由邵勇本人 ...

  9. 关于素数常用结论--威尔逊定理、欧拉定理、费马小定理、米勒罗宾算法

    再需要判定的数比较大时,用枚举法肯定不行的,但目前数学界也没有任何一种又快又准确的判定素数的方法,并且也证明了素数不存在任何一种通项表达式.但作为初等数论中最大的一部分内容,数学家们对素数性质进行了大 ...

最新文章

  1. Shell编程:Bash引号的那点事
  2. python自动视频摘要_专栏丨深度学习之视频摘要简述
  3. Dropbox推荐使用
  4. 【读书】如何阅读一本书
  5. adlicensegen怎么生成许可_国家排污许可证申请系统常见问题及解决办法
  6. elasticsearch使用中文分词器和拼音分词器,自定义分词器
  7. matlab中plotyy设置曲线颜色,matlab plotyy 颜色
  8. 搜狗拼音输入法2015 v7.5 官方版​
  9. 我的Python心路历程 第十期 (10.5 股票实战之数据可视化曲线)
  10. c# SharpPcap 截包,抓包 - 资料收集贴 --转
  11. Poodle Centos
  12. 代码随想录第十一天 LeetCode 20、1047、150(栈)
  13. 提高网络营销的转化只需掌握这四步
  14. 神经网络与深度学习(二) pytorch入门——张量
  15. 利用python计算复合材料ABD矩阵以及压缩载荷的代码
  16. RK 机械键盘左端WIN键与ALT键互换了,已解决
  17. Python我的世界小游戏源代码
  18. win10设置虚拟内存_硬件基础:虚拟内存相关知识介绍?
  19. 常见NoSQL的对比及使用场景(Redis,memcached,mongodb)
  20. 他99年出生,本科身份摘FOCS 2021最佳学生论文奖,曾4刷NOI金牌

热门文章

  1. SQLite内置表SQLITE_MASTER
  2. php怎样传数据到html代码,传递数据到PHP文件与HTML模板
  3. oracle连续周数,详细讲解Oracle数据库的“周数计算”
  4. html中属性的作用,html的标签中 unselectable=on 属性的作用
  5. 线性代数第九版pdf英文_斯坦福CS229机器学习课程的数学基础(线性代数)翻译完成...
  6. 计算机应用技术环境评估,计算机应用教程(第7版)(Windows 7与Office 2007环境)习题解答与上机练习...
  7. java jcsh执行linux命令,java jcsh执行linux命令
  8. 补丁程序正在运行_针对微软4月14日更新补丁会导致蓝屏问题的检测及解决方法...
  9. apollo源码分析 感知_Kitty中的动态线程池支持Nacos,Apollo多配置中心了
  10. pytorch 矩阵相乘_深度学习 — — PyTorch入门(三)