这几天一直再学习这些内容,也没有发一些博客,现在我觉得差不多了

首先基础是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 算法分解大数的更多相关文章

  1. 【BZOJ-3667】Rabin_Miller算法 随机化判素数

    3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 983  Solved: 302[Submit][Status ...

  2. Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解

    Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法.它利用了费马小定理,即:如果p是质数,且a,p互质,那么a^(p-1) mod p恒等于1.也就是对于所有小于p的正整数a来说 ...

  3. Miller-Rabin素数测试算法(POJ1811Prime Test)

    题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...

  4. Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...

  5. Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理

    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3.  1.失焦检测. 衡量画面模糊的主要方 ...

  6. 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 ...

  7. 记一次使用快速幂与Miller-Rabin的大素数生成算法

    大家都知道RSA的加密的安全性就是能够找到一个合适的大素数,而现在判断大素数的办法有许多,比如Fermat素性测试或者Miller-Rabin素性测试,而这里我用了Miller-Rabin素性测试的算 ...

  8. Miller-Rabin​素数测试算法

    \(Miller-Rabin\)​素数测试 用途 判断整数\(n\)是否是质数,在\(n\)较小的情况下,可以使用试除法,时间复杂度为\(O(\sqrt n)\).但当\(n\)的值较大的时候,朴素的 ...

  9. 【58】目标检测之YOLO 算法

    YOLO 算法(Putting it together: YOLO algorithm) 你们已经学到对象检测算法的大部分组件了,在这个笔记里,我们会把所有组件组装在一起构成YOLO对象检测算法.   ...

随机推荐

  1. 三种简单排序算法(java实现)

    一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操                   作 ...

  2. MySQL优化(一) 优化关键技术

    MySql的优化是一个综合性的技术,主要包括有: (1)表的设计合理化(符合 3NF 三范式) (2)添加适当的索引(Index):索引分类:普通索引.主键索引.唯一索引.全文索引(文本).空间索引. ...

  3. Python.tornado.0

    Tornado https://github.com/facebook/tornado http://www.tornadoweb.org/en/stable/guide/intro.html  (A ...

  4. 如何修改隐藏Zblog/WordPress默认后台登录地址

    我相信很多博主站长都遇到过站点被暴力破解,虽然未被破解,但是经常收到那些尝试登录失败的邮件提醒也会心慌慌的.对于这种情况,最好的办法就是修改/隐藏我们的后台登录地址. 关于zblogASP后台登录地址 ...

  5. RPDU

    RPDU(Remote Power Distribution Unit) 又称网络电源控制系统.远程电源管理系统.智能PDU.智能电源分配系统,是由傲视恒安科技(北京)有限公司自主研发生产并在全国范围 ...

  6. MySQL中varchar与char区别

    MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字 ...

  7. IOS初级:UIView和UIButton

    AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDict ...

  8. codeforces C. Functions again

    题意:给定了一个公式,让你找到一对(l,r),求解出公式给定的F值. 当时没有想到,我把(-1)^(i-l)看成(-1)^i,然后思路就完全错了.其实这道题是个简单的dp+最长连续子序列. O(n)求 ...

  9. 36、NSTimer使用详解-开启、关闭、移除

    1.要是用一个定时器,首先要定义一个定时器: @property(strong,nonatomic)NSTimer *myTimer;//定时器 2.初始化,初始化有两种方式: 第一种: + (NST ...

  10. oracle in 多个字段

    oracle 使用in的时候使用多个字段 这个也是刚需啊. 最近有个需求,在一堆商品里面过滤出一些特定的商品类型.供应商的商品(同时满足). 需要的数量不多,但是可能会变化,所以做了两个配置表. 商品 ...