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

首先基础是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. andorid EditView

    <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android=" ...

  2. 多进程copy文件

    from multiprocessing import Pool,Manager import os,time def copyFileTask(fileName,oldFolderName,newF ...

  3. 差异表达分析之FDR

    差异表达分析之FDR 随着测序成本的不断降低,转录组测序分析已逐渐成为一种很常用的分析手段.但对于转录组分析当中的一些概念,很多人还不是很清楚.今天,小编就来谈谈在转录组分析中,经常会遇到的一个概念F ...

  4. Java界面编程—布局管理

    布局是指容器中组件的排列方式 常用的布局管理器 布局管理器名称 所属类包 说明 FlowLayout(流式布局) java.awt 组件按照加入的先后顺序.按照设置的对齐方式从左向右排列,一行排满后到 ...

  5. nginx设置代理配置

    server {                 listen  8086;                 resolver 8.8.8.8;                 location /{ ...

  6. Oracal 学习之用户角色创建分配表空间 给角色分配权限

    //创建角色inspur 密码为inspur,默认的表空间为USERS create user inspur identified by inspur default tablespace USERS ...

  7. @Transactional注解使用心得

    配置基于注解的声明式事务: ...配置tx,aop的命名空间 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:a ...

  8. tensorflow下识别手写数字基于MLP网络

    # coding: utf-8 # In[1]: import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_da ...

  9. sql number类型和varchar2类型

    查询时,发现org_id 为number类型,zone_id为varchar2类型,需要转化 转换 to_char(),或者to_number select a.id,b.col,a.col from ...

  10. PHP 正则表达式--转(川山甲)

    思维导图    点击下图,可以看具体内容!     介绍          正则表达式,大家在开发中应该是经常用到,现在很多开发语言都有正则表达式的应用,比如javascript,java,.net, ...