Miller_raibin算法随机化检测素数 & Pollar_rho 算法分解大数
这几天一直再学习这些内容,也没有发一些博客,现在我觉得差不多了
首先基础是Miller_raibin随机化检测素数,顾名思义,随机化也就是有几率不对,但是很低,适用于大数快速检测,因为大数已经超出了我们打表的范围了
对于这个算法基础是费马小定理 和二次探测定理
1. Fermat定理:若n是奇素数,a是任意正整数(1≤ a≤ n−1),则 a^(n-1) ≡ 1 mod n。2. 推演自Fermat定理(具体过程我没看懂,Orz), 如果n是一个奇素数,将n−1表示成2^s*r的形式,r是奇数,a与n是互素的任何随机整数,那么a^r ≡ 1 mod n或者对某个j (0 ≤ j≤ s−1, j∈Z) 等式a^(2jr) ≡ −1 mod n 成立。
他们的命题前提条件都是如果n是素数……,但是反过来却不一定对,但有可能对,我们只要把这个可能无限的放大,就好了
https://blog.csdn.net/semiwaker/article/details/60142102
首先快速乘法,快速幂
typedef long long ll;
ll retmin;
ll q_mul(ll a,ll b,ll c)
{
ll res = 0;
a %= c;
while(b)
{
if(b & 1) res = (res + a) % c;
b >>= 1;
a = (a + a) % c;
}
return res;
}
ll q_pow(ll a,ll b,ll c)
{
ll res = 1;
a %= c;
while(b)
{
if(b & 1)res = q_mul(res,a,c);
b >>= 1;
a = q_mul(a,a,c);
}
return res;
}
然后就是随机化验证,对于随机数我用的是网上的经验取值,2,7,61这样基本上达到100%
bool miller_rabin(ll n)
{
if(n == 2 || n == 7 || n ==61)return true; if(n < 2 || !(n & 1))return false; if(witness(2,n) && witness(7,n) && witness(61,n))
return true;
return false;
}
如何验证呢?
对于费马小定理,我们直接去看a的n-1次方有点太暴力,最优的就是把以上两个定理的逆定理合起来一起验证!
我们考虑把费马小定理中的n - 1分解为 2^t*u
ll u = n - 1;
int t = 0; while(!(u & 1))
{
u >>= 1;
t++;
}
把2分解出来才能取构造平方~~去验证二次探测定理
if(u == 1 || u == n - 1)return true; while(t--)
{
u = q_mul(u,u,n);
if(u == n - 1)
return true;
}
return false;
如果一旦出现n-1的值那么代表提供了二次探测,一开始值若为1代表提供了费马小,所以对于这次测试,它能够通过
接下来我们进行大数分解算法,其实主要目的就是去找它的因子
void Find(ll n)
{
if(n == 1)return; if(miller_rabin(n))
{
retmin = min(retmin,n);
return;
} ll p = n; while( p >= n)
p = pollard_rho(n,rand() % (n - 1) + 1);
Find(p);
Find(n / p);
}
如代码,我们尝试去找n的因子,前面特判一些,如果n不是素数,那就有因子,我们用pollard算法去寻找
一开始我们找因子就是一个一个去试,效率非常低,但是我们如果能够利用组合,我提供一堆数,两两组合求差,用差去尝试,那样效率会大大提升,你可能觉得没什么区别,但是你可以去查一下生日悖论
他很好的说明了这个算法的高效性
再优化一点呢,就是随机数我们有自己的生成机制和步长限制(循环),所以,
ll pollard_rho(ll n,ll c)
{
ll x,y,d,i = 1,k = 2; x = rand() % ( n - 1) + 1;
y = x;
while(1)
{
x = (q_mul(x,x,n) + c) % n;
d = gcd((x - y + n) % n,n); if(d > 1 && d < n)return d; if(x == y)return n; if(++i == k)
{
k <<= 1;
y = x;
}
}
}
如果x == y代表我们随机选择的参数c不好,达到了循环,所以重新进行寻找
Miller_raibin算法随机化检测素数 & Pollar_rho 算法分解大数的更多相关文章
- 【BZOJ-3667】Rabin_Miller算法 随机化判素数
3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 983 Solved: 302[Submit][Status ...
- Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解
Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法.它利用了费马小定理,即:如果p是质数,且a,p互质,那么a^(p-1) mod p恒等于1.也就是对于所有小于p的正整数a来说 ...
- Miller-Rabin素数测试算法(POJ1811Prime Test)
题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3. 1.失焦检测. 衡量画面模糊的主要方 ...
- algorithm@ Sieve of Eratosthenes (素数筛选算法) & Related Problem (Return two prime numbers )
Sieve of Eratosthenes (素数筛选算法) Given a number n, print all primes smaller than or equal to n. It is ...
- 记一次使用快速幂与Miller-Rabin的大素数生成算法
大家都知道RSA的加密的安全性就是能够找到一个合适的大素数,而现在判断大素数的办法有许多,比如Fermat素性测试或者Miller-Rabin素性测试,而这里我用了Miller-Rabin素性测试的算 ...
- Miller-Rabin素数测试算法
\(Miller-Rabin\)素数测试 用途 判断整数\(n\)是否是质数,在\(n\)较小的情况下,可以使用试除法,时间复杂度为\(O(\sqrt n)\).但当\(n\)的值较大的时候,朴素的 ...
- 【58】目标检测之YOLO 算法
YOLO 算法(Putting it together: YOLO algorithm) 你们已经学到对象检测算法的大部分组件了,在这个笔记里,我们会把所有组件组装在一起构成YOLO对象检测算法. ...
随机推荐
- find和find_if,value_type
find算法:返回 [first,end)中第一个值等于value元素的位置 线性复杂度:最多比较次数:元素的总个数 find函数的最后一个参数,必须是string,float,char,double ...
- PAT 1025 反转链表 (25)(STL-map+思路+测试点分析)
1025 反转链表 (25)(25 分) 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4, ...
- NOIP需要掌握的内容(大致
1.排序算法(快排.选择.冒泡.堆排序.二叉排序树.桶排序)2.DFS/BFS 剪枝 哈希表3.树 ①遍历 ②二叉树 ③二叉排序树(查找.生成.删除) ④堆(二叉堆.左偏树.堆排序) ...
- wcf 使用sqlMembership证书认证
.接口 namespace Aretch.WcfService.Services.Interface { [ServiceContract] public interface ICalculator ...
- 为什么要用jvm .
挚享科技 2018.4.8 运行java程序字节码,实现跨平台.. Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成 在Java虚拟机上运行的目标代码(字节码 ...
- 浅谈Spring中的Quartz配置
浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...
- linux系统,在centos7环境下安装jdk步骤
记录一下安装jdk1.8版本的出错过程: 按照这个博客内容安装的,以及修改文件权限博客 [Linux]CentOS7下安装JDK详细过程 [Linux]目录文件权限的查看和修改[转] 1.安装的jdk ...
- mybatis学习 十四 resultMap标签 一对一(联合查询)
1.使用 resultMap 实现关联单个对象(联合查询方式) <resultMap type="Student" id="stuMap1"> &l ...
- C语言基础第四次作业
题目7-2,九九乘法表 1.实验代码: #include<stdio.h> int main() { int N, i, j, q; scanf("%d",&N ...
- Django框架之models和不依赖Qquery的ajax请求
一.models表字段 1)class表字段的创建 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) ...