POJ1811 Prime Test (Pollard-Rho算法) Sunshine大神
来源:互联网 发布:佳能 cr2 编辑软件 编辑:程序博客网 时间:2024/05/22 13:22
版权声明:希望有人转(^_^)
目录(?)[-]
- 一类问题 判定一个整数nn1是否为素数
- 算法1
- 算法2
- Miller-Rabin算法
很久没有写博客了。。。最近军训加开学,感觉刷题速度有降低,要补一补。
回归正题,正式进入数论阶段,讨论一下关于素数判定的那些事。
一类问题: 判定一个整数n(n>1)是否为素数。
算法1:
直接根据素数的定义枚举n%i==0
时间复杂度:
<code class="language-cpp hljs has-numbering"><span class="hljs-keyword">bool</span> is_prime(<span class="hljs-keyword">int</span> n) { <span class="hljs-keyword">int</span> i; <span class="hljs-keyword">for</span>(i = <span class="hljs-number">2</span>; i < n; i++) <span class="hljs-keyword">if</span>(n % i == <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>; <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
算法2:
发现若存在n%i==0
,则必有n%(n/i)==0
。
所以只需枚举
时间复杂度:
<code class="language-cpp hljs has-numbering"><span class="hljs-keyword">bool</span> is_prime(<span class="hljs-keyword">int</span> n) { <span class="hljs-keyword">int</span> i; <span class="hljs-keyword">for</span>(i = <span class="hljs-number">2</span>; i * i <= n; i++) <span class="hljs-keyword">if</span>(n % i == <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>; <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
Miller-Rabin算法:
这是一种随机性素数判定算法,也就是说,答案可能出错,但是可能性极小。
先是讲两个定理:
费马小定理:
对于一个质数
二次探测定理:
对于
的解为:
因为费马小定理的逆命题不成立,而否逆命题成立,所以我们可以利用一下一点:
对于任意整数
所以我们可以不断在区间
但是这还不够精确,我们可以先把
注意以上操作中所有的形如
这就是Miller-Rabin算法的主要内容。
时间复杂度:考虑常数后为
代码如下:
<code class="hljs cpp has-numbering"><span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> MAXN = <span class="hljs-number">65</span>;<span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> n, x[MAXN];<span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> multi(<span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> a, <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> b, <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> p) { <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> ans = <span class="hljs-number">0</span>; <span class="hljs-keyword">while</span>(b) { <span class="hljs-keyword">if</span>(b&<span class="hljs-number">1L</span>L) ans = (ans+a)%p; a = (a+a)%p; b >>= <span class="hljs-number">1</span>; } <span class="hljs-keyword">return</span> ans;}<span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> qpow(<span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> a, <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> b, <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> p) { <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> ans = <span class="hljs-number">1</span>; <span class="hljs-keyword">while</span>(b) { <span class="hljs-keyword">if</span>(b&<span class="hljs-number">1L</span>L) ans = multi(ans, a, p); a = multi(a, a, p); b >>= <span class="hljs-number">1</span>; } <span class="hljs-keyword">return</span> ans;}<span class="hljs-keyword">bool</span> Miller_Rabin(<span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> n) { <span class="hljs-keyword">if</span>(n == <span class="hljs-number">2</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>; <span class="hljs-keyword">int</span> s = <span class="hljs-number">20</span>, i, t = <span class="hljs-number">0</span>; <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> u = n-<span class="hljs-number">1</span>; <span class="hljs-keyword">while</span>(!(u & <span class="hljs-number">1</span>)) { t++; u >>= <span class="hljs-number">1</span>; } <span class="hljs-keyword">while</span>(s--) { <span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> a = rand()%(n-<span class="hljs-number">2</span>)+<span class="hljs-number">2</span>; x[<span class="hljs-number">0</span>] = qpow(a, u, n); <span class="hljs-keyword">for</span>(i = <span class="hljs-number">1</span>; i <= t; i++) { x[i] = multi(x[i-<span class="hljs-number">1</span>], x[i-<span class="hljs-number">1</span>], n); <span class="hljs-keyword">if</span>(x[i] == <span class="hljs-number">1</span> && x[i-<span class="hljs-number">1</span>] != <span class="hljs-number">1</span> && x[i-<span class="hljs-number">1</span>] != n-<span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>; } <span class="hljs-keyword">if</span>(x[t] != <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>; } <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;}</code>
1 0
- POJ1811 Prime Test (Pollard-Rho算法) Sunshine大神
- POJ1811 Prime Test (Pollard-Rho算法)
- POJ1811-Prime Test-素数测试+Pollard rho因数分解
- POJ1811 (Prime Test Pollard rho整数分解,Miller-Rabin素数测试)
- 【POJ1811】Prime Test-Miller-Rabin素数测试+Pollard-rho大数分解
- [POJ 1811]Prime Test---Miller-Rabin算法&Pollard-rho算法
- POJ1811--miller rabin&pollard rho
- POJ 1811 Prime Test Miller-Rabin算法和Pollard rho算法
- POJ 1811 Prime Test(素数判定Miller-Rabin+素因子分解Pollard-rho)
- POJ1811 PrimeTest Miller-Robin+Pollard-Rho
- Pollard Rho算法思想
- poj1811(Miller-Rabin(素数测试)与Pollard rho(整数的因子分解))
- POJ1811 Prime Test
- POJ1811 Prime Test
- POJ1811 miller-rabin素数测试pollard-rho质因子分解
- Miller_Rabin算法&&Pollard-Rho算法
- POJ 1811 Prime Test(Pollard rho整数分解+miller_rabin素数测试)
- Poj 1811 Prime Test 素数测试 Miller-Rabin 与 整数的因子分解 Pollard rho
- poj 1584 A Round Peg in a Ground Hole
- [无源汇上下界最小费用可行流 差分费用流] BZOJ 1061 [Noi2008]志愿者招募
- Jquery中的bind(),on()绑定事件方式总结
- 【NOI OJ】18 Tomorrow never knows?(未知的明天)
- JS中Array方法中常用方法二:Array.prototype.concat()
- POJ1811 Prime Test (Pollard-Rho算法) Sunshine大神
- Could not get lock/var/lib/apt/lists错误的处理
- 顺序表应用4-2:元素位置互换之逆置算法(数据改进)
- PCB制作(单片机最小系统为例)
- linux下安装cmake
- 创建传统线程的方式
- LinkedList
- 基于AdaBoost算法的人脸检测--训练部分
- JAVA 学习模块十六: Object