费尔马小定理素数java_利用费马小定理判断素数

费尔马小定理素数java_利用费马小定理判断素数今天听了 ljss 神犇的数论课 顿时感觉 我真的是太弱啦 我只能稍微写一下我能听懂的部分 orz 那么这就是今天我为数不多能听懂一点的之一 QAQ 首先先介绍今天的主角 费马小定理 转自维基百科没看懂的话我稍微解释一下 就是假如 p 是质数 且 GCD a p 1 那么 a p 1 1 modp 假如 p 是质数 且 a p 互质 那么 a 的 p 1 次方除以 p 的余数恒等于 1 因此我们

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

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

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

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

4a1baefff049dabba227ef4c4301d496.png————转自维基百科

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

假如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

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}}}

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

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

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

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

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

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

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

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

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

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

5b71e80b05f598bfd9ac9618c87a94323e41e688

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226994.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:11
下一篇 2026年3月16日 下午10:12


相关推荐

  • github中创建的仓库中有Readme和MIT协议push失败问题

    github中创建的仓库中有Readme和MIT协议push失败问题最近想把一个项目上传到github中去,但是遇到一系列问题,本来以为很快就解决了,但并非想象那样,反而耽误了我好长时间,于是记录下来。———————————————————————————————————————————–…

    2022年6月13日
    35
  • python计算最大公约数和最小公倍数_python求最大公约数和最小公倍数的方法介绍…

    python计算最大公约数和最小公倍数_python求最大公约数和最小公倍数的方法介绍…python求最大公约数和最小公倍数的方法介绍发布时间:2020-04-2810:42:38来源:亿速云阅读:114作者:小新今天小编给大家分享的是python求最大公约数和最小公倍数的方法介绍,相信很多人都不太了解,为了让大家更加了解python求最大公约数和最小公倍数的方法,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。python怎么求最大公约数和最小公倍数一、求最大公约数用…

    2022年5月16日
    44
  • 教你如何制作网页木马

    教你如何制作网页木马大家对木马都不陌生了 它可能要算是计算机病毒史上最厉害的了 相信会使木马的人千千万万 但是有很多人苦于怎么把木马发给对方 现在随着计算机的普及 在网络上我相信很少有人会再轻易的接收对方的文件了 所以网页木马诞生了 1 它应该算是 html 带动同路径下的一个 exe 的文件的主页了 也就是当浏览器浏览这个页面的时候 一个 exe 的文件就在后台自动下载并执行了 可以做一个 test html 的文件在桌面 内容

    2026年3月17日
    2
  • 数据库关系代数除法意义_关系代数运算除法

    数据库关系代数除法意义_关系代数运算除法除法运算的定义:这个概念的描述的非常抽象,刚开始学习的同学完全不知所云。这里通过一个实例来说明除法运算的求解过程设有关系R、S如图所示,求R÷S的结果求解步骤过程:第一步:找出关系R和关系S中相同的属性,即Y属性。在关系S中对Y做投影(即将Y列取出);所得结果如下第二步:被除关系…

    2025年8月1日
    4
  • SpringBoot与SpringCloud的版本对应详细版[通俗易懂]

    SpringBoot与SpringCloud的版本对应详细版[通俗易懂]缘起初学springcloud的朋友可能不知道,其实SpringBoot与SpringCloud需要版本对应,否则可能会造成很多意料之外的错误,比如eureka注册了结果找不到服务类啊,比如某些jar导入不进来啊,等等这些错误。下面列出来springBoot和springcloud的版本对应关系,需要配套使用,才不会出现各种奇怪的错误。关于maven仓库的版本列表spring-cloud…

    2022年4月29日
    244
  • pipenv 配置pytorch cuda 环境和pycharm解释器

    pipenv 配置pytorch cuda 环境和pycharm解释器文章目录下载 whl 文件下载 torch 的 whl 文件下载 torchvision 等的 whl 文件创建 pipenv 环境安装加入到 Pycharm 中根据自己的 cuda 情况 下载和配置好对应的 cudatoolkit 和 cudnn 这个教程已经有很多 下面介绍使用 pipenv 配置 pytorch 环境的过程下载 whl 文件打开 pytorch 官网 选择你对应的 cuda 这里我得到如下命令 pip3installt 1 10 1 cu113torchvi 0 11 2 cu113torchau

    2026年3月26日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号