算法之我见 [数论之旅] Pollard Rho因数分解

算法代码:

#include "stdio.h"
#include "conio.h"
main()
{
  int n,i;
  printf("\nplease input a number:\n");
  scanf("%d",&n);
  printf("%d=",n);
  for(i=2;i<=n;i++)
    while(n!=i)
    {
      if(n%i==0)
      {
        printf("%d*",i);
        n=n/i;
      }
      else
        break;
    }
  printf("%d",n);
}

算法的正确性:

尽管我们测试的i没有保证是质数,但输出的i一定是质数。这是因为任何一个数的质因数比它本身小,测试完较小的数之后,比如假设n%i(i==4)==0进入了输出环节,但实际上i=2的循环已经做完了,此时n%4不可能等于0.多试几次你就理解了。

时间: 2024-08-25 14:21:24

算法之我见 [数论之旅] Pollard Rho因数分解的相关文章

Pollard Rho算法浅谈

Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机算法固有的循环 Pollard Rho算法在其他因数分解算法[3]中不算太出众,但其空间复杂度Θ(1)的优势和好打的代码使得OIer更倾向于使用Pollard Rho算法 毕竟试除法太慢了,谁没事打Pollard Rho不打试除法 Pollard Rho原理 生日悖论 如果一年只有365天(不计算闰

51_1037最长循环节 (miller rabin算法 pollard rho算法 原根)

1037 最长的循环节 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 10^18) Output 输出<=n的数中倒数循环节长度最长的

Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][Status][Discuss] Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如果不是质数,输出它最大的质因子是哪个. O

ACM数论之旅4---扩展欧几里德算法(欧几里德(???)?是谁?)

为什么老是碰上 扩展欧几里德算法 ( •?∀•? )最讨厌数论了 看来是时候学一学了 度娘百科说: 首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •?∀•? )她说根据数论中的相关定理可以证明,反正我信了) 所以 ax+by = gcd(a, b) * k 也肯定有解 (废话,把x和y乘k倍就好了) 那么已知 a,b 求 一组解 x,y 满足 ax+by = gcd(a, b) 这个公式 1 #include<cstdio> 2 typedef long long LL;

HDU 3864 D_num Miller Rabin 质数判断+Pollard Rho大整数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给出一个数N(1<=N<10^18),如果N只有四个约数,就输出除1外的三个约数. 思路:大数的质因数分解只能用随机算法Miller Rabin和Pollard_rho,在测试多的情况下正确率是由保证的. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <c

Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要把询问范围加到 \(10^{18}\) ,再多组询问呢? Miller 和 Rabin 建立了Miller-Rabin 质数测试算法. \(\\\) Fermat 测试 首先我们知道费马小定理: \[ a^{p-1}\equiv 1\pmod p \] 当且仅当 \(p\) 为素数时成立. 逆命题是

GCD &amp; LCM Inverse POJ 2429(Pollard Rho质因数分解)

原题 题目链接 题目分析 这道题用Pollard Rho算法不能交G++,会RE!!!先说一下整体思路,gcd指gcd(a,b),lcm指lcm(a,b).a=x*gcd,b=y*gcd,则x,y互质且有x*y=lcm/gcd,要使a+b最小,也就是x+y最小.这里可以看出我们要做的就是分解lcm/gcd的质因子,然后枚举找出最小的x+y,最后输出a*x,a*y.这里还需要注意一下,题目是要求先输出小的再输出大的.至于Pollard Rho算法这里不讲. 代码 1 #include <cstdi

算法竞赛中数论理论浅析

一.基本概念 带余除法(division algorithm,除法定理):a∈Z,d∈Z*,有唯一的整数 q 和 r,并且0≤r<d0,满足 a= d q+r.q 称为商,r  称为余数.通俗说法:整数除以正整数得到唯一的商(quotient)和余数(residue).  整除(divide exactly):称 a 整除 b ,当整数 a 除以非零整数 b ,商为整数,且余数为零, 我们就说a能被b整除(或说b能整除a),记作 b|a.b 称为 a 的约数(因数,common divisor)

大整数分解质因数(Pollard rho算法)

#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <math.h> #include <stdlib.h> #include<time.h> #define ll long long #define INF 0x3f3f3f3f #define ma