P4718 【模板】Pollard-Rho算法

题目描述

MillerRabin算法是一种高效的质数判断方法。虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接受的。PollardRho是一个非常玄学的方式,用于在O(n1/4)的期望时间复杂度内计算合数n的某个非平凡因子。事实上算法导论给出的是O(p),p是n的某个最小因子,满足pp与n/pn/p互质。但是这些都是期望,未必符合实际。但事实上PollardRho算法在实际环境中运行的相当不错。这里我们要写一个程序,对于每个数字检验是否是质数,是质数就输出Prime;如果不是质数,输出它最大的质因子是哪个Miller Rabin 算法是一种高效的质数判断方法。\\虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接受的。\\
Pollard Rho是一个非常玄学的方式,用于在O(n^{1/4})的期望时间复杂度内计算合数n的某个非平凡因子。\\事实上算法导论给出的是O(\sqrt p),p是n的某个最小因子,满足pp与n/pn/p互质。但是这些都是期望,未必符合实际。\\但事实上Pollard Rho算法在实际环境中运行的相当不错。\\
这里我们要写一个程序,对于每个数字检验是否是质数,是质数就输出Prime;如果不是质数,输出它最大的质因子是哪个MillerRabin算法是一种高效的质数判断方法。虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接受的。PollardRho是一个非常玄学的方式,用于在O(n1/4)的期望时间复杂度内计算合数n的某个非平凡因子。事实上算法导论给出的是O(p​),p是n的某个最小因子,满足pp与n/pn/p互质。但是这些都是期望,未必符合实际。但事实上PollardRho算法在实际环境中运行的相当不错。这里我们要写一个程序,对于每个数字检验是否是质数,是质数就输出Prime;如果不是质数,输出它最大的质因子是哪个

输入格式

第一行,TT代表数据组数(不大于350350)

以下TT行,每行一个整数nn,保证1\le n\le 10^{18}1≤n≤10

18

输出格式

输出TT行。

对于每组测试数据输出结果。

输入输出样例

输入 #1复制

6

2

13

134

8897

1234567654321

1000000000000

输出 #1复制

Prime

Prime

67

41

4649

5

这个题目之考察了计算,没考察分解,我博客里有带输出元素的代码。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll pr;
  5. ll pmod(ll a, ll b, ll p) { return (a * b - (ll)((long double)a / p * b) * p + p) % p; } //普通的快速乘会T
  6. ll gmod(ll a, ll b, ll p)
  7. {
  8. ll res = 1;
  9. while (b)
  10. {
  11. if (b & 1) res = pmod(res, a, p);
  12. a = pmod(a, a, p);
  13. b >>= 1;
  14. }
  15. return res;
  16. }
  17. inline ll gcd(ll a, ll b)
  18. { //听说二进制算法特快
  19. if (!a) return b;
  20. if (!b)return a;
  21. int t = __builtin_ctzll(a | b);
  22. a >>= __builtin_ctzll(a);
  23. do
  24. {
  25. b >>= __builtin_ctzll(b);
  26. if (a > b)
  27. {
  28. ll t = b;
  29. b = a, a = t;
  30. }
  31. b -= a;
  32. } while (b);
  33. return a << t;
  34. }
  35. bool Miller_Rabin(ll n)
  36. {
  37. if (n == 46856248255981ll || n < 2)
  38. return false; //强伪素数
  39. if (n == 2 || n == 3 || n == 7 || n == 61 || n == 24251)
  40. return true;
  41. if (!(n & 1) || !(n % 3) || !(n % 61) || !(n % 24251))
  42. return false;
  43. ll m = n - 1, k = 0;
  44. while (!(m & 1))
  45. k++, m >>= 1;
  46. for (int i = 1; i <= 20; ++i) // 20为Miller-Rabin测试的迭代次数
  47. {
  48. ll a = rand() % (n - 1) + 1, x = gmod(a, m, n), y;
  49. for (int j = 1; j <= k; ++j)
  50. {
  51. y = pmod(x, x, n);
  52. if (y == 1 && x != 1 && x != n - 1)
  53. return 0;
  54. x = y;
  55. }
  56. if (y != 1)
  57. return 0;
  58. }
  59. return 1;
  60. }
  61. ll Pollard_Rho(ll x)
  62. {
  63. ll n = 0, m = 0, t = 1, q = 1, c = rand() % (x - 1) + 1;
  64. for (ll k = 2;; k <<= 1, m = n, q = 1)
  65. {
  66. for (ll i = 1; i <= k; ++i)
  67. {
  68. n = (pmod(n, n, x) + c) % x;
  69. q = pmod(q, abs(m - n), x);
  70. }
  71. t = gcd(x, q);
  72. if (t > 1)
  73. return t;
  74. }
  75. }
  76. void fid(ll n)
  77. {
  78. if (n == 1)
  79. return;
  80. if (Miller_Rabin(n))
  81. {
  82. pr = max(pr, n);
  83. return;
  84. }
  85. ll p = n;
  86. while (p >= n)
  87. p = Pollard_Rho(p);
  88. fid(p);
  89. fid(n / p);
  90. }
  91. int main()
  92. {
  93. int T;
  94. ll n;
  95. scanf("%d", &T);
  96. while (T--)
  97. {
  98. scanf("%lld", &n);
  99. pr = 0;
  100. fid(n);
  101. if (pr == n)
  102. puts("Prime");
  103. else
  104. printf("%lld\n", pr);
  105. }
  106. return 0;
  107. }

数学--数论---P4718 Pollard-Rho算法 大数分解的更多相关文章

  1. Pollard Rho算法浅谈

    Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...

  2. 初学Pollard Rho算法

    前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...

  3. Pollard Rho 算法简介

    \(\text{update 2019.8.18}\) 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点 ...

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

    \(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...

  5. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  6. POJ 1811 Prime Test (Pollard rho 大整数分解)

    题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...

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

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  8. 整数(质因子)分解(Pollard rho大整数分解)

    整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...

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

    #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> ...

随机推荐

  1. 个人项目 wc.exe

    GitHub地址:https://github.com/oAiuo/wordCount 一.题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行单元测试. ...

  2. 9.2ArrayList 集合 案例,学生管理系统

    循环的使用 添加学生:while嵌套for,for设置变量,内嵌if更新变量.if语句判断变量值 修改学生:for循环内嵌if,获取循环中的某个值. package day9_ArrayList.AL ...

  3. "字体图标"组件:<icon> —— 快应用组件库H-UI

     <import name="icon" src="../Common/ui/h-ui/basic/c_icon"></import> ...

  4. ZooKeeper 如何保证数据一致性?

    在分布式场景中,ZooKeeper 的应用非常广泛,比如数据发布和订阅.命名服务.配置中心.注册中心.分布式锁等. 在分布式场景中,ZooKeeper 的应用非常广泛,比如数据发布和订阅.命名服务.配 ...

  5. AJ学IOS 之微博项目实战(3)微博主框架-UIImage防止iOS7之后自动渲染_定义分类

    AJ分享,必须精品 一:效果对比 当我们设置tabBarController的tabBarItem.image的时候,默认情况下会出现图片变成蓝色的效果,这是因为ios7之后会对图片自动渲染成蓝色 代 ...

  6. 微服务统计,分析,图表,监控, 分布式追踪一体化的 HttpReports 在 .Net Core 的应用

    前言介绍 HttpReports 是针对.Net Core 开发的轻量级APM系统,基于MIT开源协议, 使用HttpReports可以快速搭建.Net Core环境下统计,分析,图表,监控,分布式追 ...

  7. Jar包一键重启的Shell脚本及新服务器部署的一些经验

    原文首发于博客园,作者:后青春期的Keats:地址:https://www.cnblogs.com/keatsCoder/ 转载请注明,谢谢! 前言 最近公司为客户重新部署了一套新环境,由我来完成了基 ...

  8. api_DZFPKJ & api_DZFPCX

    AES加密算法的网站:http://www.ssleye.com/aes_cipher.html """ AES加密(加解密算法/工作模式/填充方式:AES/ECB/PK ...

  9. Navicat自动备份数据库

    @ 目录 Navicat自动备份数据库 备份与还原 修改备份位置 MySQL:5.7 Navicat:11 Windows10 重要数据库的定时备份是非常重要的,使用Navicat可以非常方便快捷地自 ...

  10. vue2.x学习笔记(四)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12563162.html. 模板语法 vue使用了基于html的模板语法,允许开发者声明式地将dom绑定到底层vue ...