/*传说中的随机算法。效率极高。可以对一个2^63的素数进行判断。可以分解比较大的数的因子。
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAX = 1000;
const ll MAXN = 1000;
#define INF 0x3f3f3f3f
#define forn(i, n) for (ll i = 0; i < n; i++)
#define form(i, n) for (ll i = 1; i <= n; i++)
#define mem(a, b) memset(a, b, sizeof(a))
#define FIN freopen("in.txt", "r", stdin);
#define FOUT freopen("out.txt", "w", stdout);//****************************************************************
// Miller_Rabin 算法进行素数测试
//速度快,而且可以判断 <2^63的数
//****************************************************************
const int S = 20; //随机算法判定次数,S越大,判错概率越小//计算 (a*b)%c.   a,b都是long long的数,直接相乘可能溢出的
//  a,b,c <2^63
long long mult_mod(long long a, long long b, long long c)
{a %= c;b %= c;long long ret = 0;while (b){if (b & 1){ret += a;ret %= c;}a <<= 1;if (a >= c)a %= c;b >>= 1;}return ret;
}//计算  x^n %c
long long pow_mod(long long x, long long n, long long mod) //x^n%c
{if (n == 1)return x % mod;x %= mod;long long tmp = x;long long ret = 1;while (n){if (n & 1)ret = mult_mod(ret, tmp, mod);tmp = mult_mod(tmp, tmp, mod);n >>= 1;}return ret;
}//以a为基,n-1=x*2^t      a^(n-1)=1(mod n)  验证n是不是合数
//一定是合数返回true,不一定返回false
bool check(long long a, long long n, long long x, long long t)
{long long ret = pow_mod(a, x, n);long long last = ret;for (int i = 1; i <= t; i++){ret = mult_mod(ret, ret, n);if (ret == 1 && last != 1 && last != n - 1)return true; //合数last = ret;}if (ret != 1)return true;return false;
}// Miller_Rabin()算法素数判定
//是素数返回true.(可能是伪素数,但概率极小)
//合数返回false;bool Miller_Rabin(long long n)
{if (n < 2)return false;if (n == 2)return true;if ((n & 1) == 0)return false; //偶数long long x = n - 1;long long t = 0;while ((x & 1) == 0){x >>= 1;t++;}for (int i = 0; i < S; i++){long long a = rand() % (n - 1) + 1; //rand()需要stdlib.h头文件if (check(a, n, x, t))return false; //合数}return true;
}//************************************************
//pollard_rho 算法进行质因数分解
//************************************************
long long factor[100]; //质因数分解结果(刚返回时是无序的)
int tol;               //质因数的个数。数组小标从0开始long long gcd(long long a, long long b)
{if (a == 0)return 1; //???????if (a < 0)return gcd(-a, b);while (b){long long t = a % b;a = b;b = t;}return a;
}long long Pollard_rho(long long x, long long c)
{long long i = 1, k = 2;long long x0 = rand() % x;long long y = x0;while (1){i++;x0 = (mult_mod(x0, x0, x) + c) % x;long long d = gcd(y - x0, x);if (d != 1 && d != x)return d;if (y == x0)return x;if (i == k){y = x0;k += k;}}
}
//对n进行素因子分解
void findfac(long long n)
{if (Miller_Rabin(n)) //素数{factor[tol++] = n;return;}long long p = n;while (p >= n)p = Pollard_rho(p, rand() % (n - 1) + 1);findfac(p);findfac(n / p);
}int main()
{//srand(time(NULL));//需要time.h头文件//POJ上G++不能加这句话long long n;while (cin >> n){tol = 0;findfac(n);for (int i = 0; i < tol; i++)cout << factor[i] << " ";cout << endl;if (Miller_Rabin(n))cout << "Yes" << endl;elsecout << "No" << endl;}return 0;
}

米勒拉宾算法求超大质数及其因数相关推荐

  1. C++米勒拉宾算法模板

    //我也忘了从哪找来的板子,不过对于2^63级的数据请考虑使用java内置的米勒拉宾算法. 1 #include <iostream> 2 #include <string> ...

  2. 你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法

    米勒拉宾算法的基本概念如下: 首先判断这个数n的奇偶性 若为偶数仅有2是质数 奇数则进入测试 测试方法: 首先确定几个基底a,范围在[2,n-1] 因为n是奇数,所以n-1必定为偶数 则n-1可以表示 ...

  3. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验

    普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...

  4. 米勒-拉宾(MillerRabbin)素性测试算法

    原创滴博客~https://www.cnblogs.com/precious-ZPF/p/9481599.html 小编赶紧摘过来的,多看几遍向银家多学习学习QAQ 首先,在了解米勒-拉宾素性测试之前 ...

  5. C++实现伪大素数生成算法(费马小定理判别法、米勒拉宾素数判定法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.伪大素数生成原理 方法一 方法二 数学基础 二.费马小定理判别法 1.算法 2.代码实现 3.运行结果 二.米勒拉宾素数 ...

  6. 米勒-拉宾素性检测算法

    米勒-拉宾素性检测就是目前应用比较广的一种随机化素性检测算法. 它是基于下面两个定理: (费马小定理)如果 p 为素数,且 a 无法被 p 整除,则对于所有大于0小于 p 的整数 a,有 ap−1≡1 ...

  7. 费马素性测试和米勒—拉宾素性测试

    chapter 1 Fermat's little theorem 费马小定理 费马小定理说的是:如果p是一个素数,那么对于任意一个整数a,a p − a 能被p整除,也可以用模运算表示如下: (p是 ...

  8. 【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表

    @TOC 素性测试是检验一个给定的整数是否为素数的测试. 最简单的就是用 n\sqrt{n}n​ 以内的数去试除.这是确定性的算法,即能准确知道 nnn 是否为质数. 但今天学习的是一种随机算法. F ...

  9. 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)

    2018宁夏网络赛 B Goldbach (米勒拉宾素数测试) 题目链接 题目大意: 给你一个偶数n (2<n<=1e18) 让你把n分解成两个素数的和.(如果有多个输出任意一个) 解题思 ...

  10. 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))

    这篇博客讲的很好: https://www.cnblogs.com/ZERO-/p/9302169.html 题目描述 木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的 ...

最新文章

  1. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — SKB
  2. Product生命周期
  3. 深入解析Windows窗口创建和消息分发
  4. 网络登录_发布猫系统登录免费网络推广-绥芬河推广资讯
  5. kali中安转python3_Kali环境下安装Python3.7
  6. mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大
  7. 六年打磨!阿里开源混沌工程工具 ChaosBlade
  8. 接口文档下的渗透测试(Swagger)
  9. react-native构建基本页面5---调用拍照摄像头
  10. map/reduce之间的shuffle,partition,combiner过程的详解
  11. NYOJ15括号匹配
  12. 【relations】MMD镜头+动作打包下载.zip
  13. 分析docker启动MySQL挂载目录提示权限不足Permission denied原因
  14. 明翰英语教学系列之形容词与副词篇V0.1(持续更新)
  15. linux commen cmd
  16. GDOI 2016 总结
  17. HTML5 代码实例
  18. 嵌入式开发微处理器选型需要考虑的因素
  19. 解决通过微信小程序获取的定位坐标在百度地图渲染误差过大问题
  20. 2021年全球与中国机车(机车车辆)行业市场规模及发展前景分析

热门文章

  1. ActiveMQ集群安装与配置
  2. 北大中文核心期刊目录(2004年版)工业技术类
  3. 解决无法删除文件夹的情况:文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开...
  4. jike2012年5月实习题
  5. FP6296升压QC和PD协议充电器
  6. linux aria2 离线,使用aria2做离线下载
  7. nginx中的timeout超时设置,请求超时、响应等待超时等
  8. 微信公众账号分为哪几类?区别是什么
  9. java replaceLast
  10. 量化投资03---小市值轮动因子---准备工作01