费马小定理及其应用_WYW1996的博客-程序员秘密

费马小定理:若一个数p是素数,a为整数,且gcd(a,p) == 1,则 

简单点说就是:假设a为整数,p为素数,且gcd(a,p)==1,那么a的(p-1)次方除以p的余数一定是 1 

注意:费马小定理只是素数判定的一个必要条件,素数一定满足费马小定理,满足费马小定理的数,却不一定是素数,例如Carmichael数(Carmichael数都是符合费马小定理的,但是他们都是合数)。

Euler定理:

  我们记φ(m)为小于等于m的整数中与m互素的数的个数(这是欧拉函数的定义)。就有:

   

 

  证明也很简单:这实际上就是费马小定理的一个推广,我们知道当m为素数时,φ(m) = m-1,这是欧拉函数的结论。将φ(m)带入就可以得到费马小定理的结论。

  关于欧拉函数可以看这篇blog:https://www.cnblogs.com/DynastySun/p/9364673.html

 

逆元:

  这个定理十分有用,我们可以证明一下费马小定理求逆元的做法,我们知道若一个数 M 是素数,则任意整数 A(要求gcd(A, M) == 1) 关于 M 的逆元就是 pow(A, M-2),我们可以证明一下:

  求A关于M的逆元,就需要找出满足 A * X ≡ 1 (mod M) 这个式子的 X ,因为 M 为素数,所以 A^(M-1) ≡ 1 (mod M),我们一对比就可找到 X 的一个解 A^(M-2)。

    关于逆元可以看这篇blog:https://www.cnblogs.com/DynastySun/p/9362505.html

 

Miller_rabin算法:

  我们可以用费马小定理来判断一个很大的数是否是素数,我们知道若一个数p是素数,则必定有 那么我们就可随机枚举出大概10个左右的数,判断这个数的p-1次方对p取模是否为1,但是这样不严谨,因为Carmichael数的存在,虽然Carmichael数的数量很少,但是这也会对算法造成影响。所以在介绍这个算法之前我们再来了解一个定理:二次探测定理,这个定理可以对算法进行改进以免将Carmichael数当做素数。

  二次探测定理:如果p是素数,x是小于p的正整数,且, 则 x = 1 或 x = p-1。

  有了二次探测定理我们就可以在使用费马小定理计算a^(p-1) ≡ 1(mod p)时,增加对p的二次探测,一旦发现违背二次探测条件,就可以得出p不是素数的结论。我们通过一个例子来利用这个结论,341是一个合数(341=11*31),但是341可以通过a为2时的费马小定理2^340 ≡ 1(mod 341),我们现在可以假设341为素数:因为(2^170)^2 ≡ 1(mod 341),所以2^170 mod 341只能为1或者是340,我们发现确实有2^170 ≡ 1(mod 341),我们继续往下算2^85 ≡ 32(mod 341),这样一来就可以看出341不是素数了。

  这就是Miller_rabin素性测试方法,不断地提取p-1中的因子2,这样我们为了方便可以把p-1表示为d*2^r(d为奇数),这样一来我们就需要不断计算a^(d*2^r)对p取余的结果,这样我们可以强化费马小定理为下面的形式:

  尽可能的提取p-1中的因子2,把p-1表示为d*2^r,若p为素数,则a^d mod p = 1,或者存在一个i使得a^(d*2^i) % mod p = p-1 (0 <= i < r)。

  需要说明的是,Miller_rabin素性测试也是不确定算法。我们把可以通过以a为底的Miller-Rabin测试的合数称作以a为底的强伪素数。

  对于大数的素性判断,目前Miller-Rabin算法应用最广泛。一般底数仍然是随机选取,但当待测数不太大时,选择测试底数就有一些技巧了。比如,如果被测数小于4 759 123 141,那么只需要测试三个底数2, 7和61就足够了。当然,你测试的越多,正确的范围肯定也越大。如果你每次都用前7个素数(2, 3, 5, 7, 11, 13和17)进行测试,所有不超过341 550 071 728 320的数都是正确的。如果选用2, 3, 7, 61和24251作为底数,那么10^16内唯一的强伪素数为46 856 248 255 981。这样的一些结论使得Miller-Rabin算法在比赛中非常实用。通常认为,Miller-Rabin素性测试的正确率可以令人接受,随机选取k个底数进行测试算法的失误率大概为4^(-k)。

  以上部分引用自:Matrix67的blog: http://www.matrix67.com/blog/archives/234

  现在我们可以给出板子:

 

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cmath>
 5 using namespace std;
 6 
 7 typedef long long LL;
 8 typedef unsigned long long ULL;
 9 
10 inline LL mut_mod(LL a, LL b, LL m){
11     if(b < 0) {
12         a = -a;
13         b = -b;
14     }
15 
16     LL ans = 0;
17     a %= m;
18     while(b){
19         if(b&1) ans = (ans+a)%m;
20         b >>= 1;
21         a = (a+a)%m;
22     }
23     return ans;
24 }
25 
26 inline LL pow_mod(LL a, LL b, LL m){
27     LL ans = 1;
28     a %= m;
29     while(b){
30         if(b&1) ans = mut_mod(ans, a, m);
31         b >>= 1;
32         a = mut_mod(a, a, m);
33     }
34     return ans;
35 }
36 
37 LL primes[] = { 2, 3, 7, 61, 24251};
38 
39 bool isprimes(LL n){
40     int r = 0, t;
41     LL x, y, tmp, d = n-1;
42     while((d&1) == 0) d>>=1, r++;
43 
44     for(int i = 0; i < 5; i++){
45         tmp = primes[i];
46         if(tmp == n) return true;
47         y = x = pow_mod(tmp, d, n);
48         t = r;
49         while(t--){
50             y = mut_mod(x, x, n);
51             if(y == 1 && x != 1 && x != n-1)
52                 return false;
53             x = y;
54         }
55         if(y != 1) return false;
56     }
57     return true;
58 }
59 
60 int main(){
61     LL n;
62     while(scanf("%lld", &n) != EOF){
63         if(n > 1 && isprimes(n)) printf("YES\n");
64         else printf("NO\n");
65     }
66     return 0;
67 }
View Code

 

 

 

转载于:https://www.cnblogs.com/DynastySun/p/9438167.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WYW1996/article/details/102046924

智能推荐

Redis客户端管理神器RedisInsight 推荐_redis客户端工具_7small7的博客-程序员秘密

专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!文章整理在GitHub,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&amp;CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。Redis作为一个高性能、内存性的nosql数据库,已经成为日常开发必不可少的技术。对于一个开发人员来讲,不仅仅会使用Redis那么简单,也要学会如何管理、监控Redis服务。对于Redis的管理,我们可以使用使用命令.

python进阶_aoaoGofei的博客-程序员秘密

python进阶collection.namedtuple()collection.namedtuple()定义tuple子类https://blog.csdn.net/june_young_fan/article/details/91359194https://blog.csdn.net/m0_37586991/article/details/103713691

基于C语言的学生信息管理系统_qq_44388476的博客-程序员秘密

基于C语言的学生信息管理系统一、系统需求与功能分析1.1 系统需求分析(1) 能完成学生信息的录入,插入、修改、删除、输出、查询等功能;(2)采用单链表存储结构实现;(3) 所有数据以外部文件方式保存。1.2系统功能分析(1)要设计一个学生信息管理系统,其功能包括:①录入函数Add():将学生信息按尾插法插入到链表中;②插入函数Insert():根据所给学号作为插入位置,在其后插...

【Unity5.x Shaders】使用Shader制作河流效果_shader河流_TreePulse的博客-程序员秘密

感觉终于开始做一些有意思的Shader了。这次来学习如何通过更改UV值来滚动纹理以达到河流,瀑布等动画效果。这是相关Shader代码Shader "Custom/ScrollingShader" { Properties { _MainTint("Diffuse Tint",Color)=(1,1,1,1) _MainTex ("Base (RGB)", 2D

2021年资料员-岗位技能(资料员)模拟考试题库及资料员-岗位技能(资料员)实操考试视频_施工前期资料是哪个规范要求报送的_zbf123123的博客-程序员秘密

题库来源:安全生产模拟考试一点通公众号小程序资料员-岗位技能(资料员)模拟考试题库根据新资料员-岗位技能(资料员)考试大纲要求,安全生产模拟考试一点通将资料员-岗位技能(资料员)模拟考试试题进行汇编,组成一套资料员-岗位技能(资料员)全真模拟考试试题,学员可通过资料员-岗位技能(资料员)实操考试视频全真模拟,进行资料员-岗位技能(资料员)自测。1、【多选题】凡施工图结构、工艺、平面布置等有( )的应当重新绘制竣工图。( BE )A、特别重大改变B、重大改变C、建设单位有特殊要求的D、变更部分

随便推点

Oracle 基于用户管理的不完全恢复_Leshami的博客-程序员秘密

Oracle 数据恢复从恢复类型来说,抛开具体的文件,总共可分为两大类型的恢复,一是完全恢复,一个是不完全恢复。其实,熟悉了Oracle体系结构之后,对于Oracle恢复就会有一个总体的概念。因为Oracle组成的外围部分,主要由不同的文件来组成,每种不同类型的文件有不同的作用,因此只要了解了其作用,更利于了解与掌握Oralce数据库的备份与恢复。言归正传,完全恢复即是把数据库恢复到最新的SCN,

老板最不能拒绝的请假理由,它排第一_数据分析v的博客-程序员秘密

周五下午,不少打工人的心思已经飞到了周末。摸鱼,才是周五的“正确打开”方式。但不管是带薪拉屎还是切屏追剧,不说被抓包的风险,等下班的过程也很煎熬。这时候,则恨不得自己已经请假了——连休三天,想想都美。请假作为更加彻底的摸鱼手段,不仅可以摆脱公司、学校的场所限制,还能尽情放飞自我。不过,想要找到一个合适且成功率高的请假理由,还是不太容易。从上学到上班,大家为了请假,和老师、...

Android NDK: Your APP_BUILD_SCRIPT points to an unknown file_F-Fan的博客-程序员秘密

ndk报错:Android NDK: Your APP_BUILD_SCRIPT points to an unknown file或者add-application.mk:88: *** Android NDK: Aborting导致原因:项目路径带有 空格、中文或其他非法字符导致!特此记录!...

Python学习之路第一篇-Python简介和基础入门_老九君的博客-程序员秘密

1、Python简介1.1 Python是什么Python是近年来编程界最火的热点,没有之一。从性质讲它与我们熟悉的C/C++、Java、PHP等没有什么本质的区别,也是一种开发语言,而且已经进入主流的二十种开发语言中的Top5。1.2 Python的由来和发展趋势1989年,吉多·范罗苏姆(Guido vanRossum)在阿姆斯特丹为了打发无聊的圣诞节,决心开发一个新的脚本解释程序...

sublimetext插件安装_weixin_34295316的博客-程序员秘密

sublimetext一、下载地址:https://www.sublimetext.com/二、安装Package Control  方式一:     Ctrl + Shift + P , 输入install,在下拉框中中选择 Install Package Control     等待弹出一个提示成功的框  方式二:     点击Tools --&gt; insta...

推荐文章

热门文章

相关标签