【代码超详解】洛谷 P4718 【模板】Pollard-Rho算法(要求一并使用:快速幂取模、快速积取模、Miller-Rabin算法)

这篇博客详细介绍了洛谷P4718题目的解题思路,重点讲解了Pollard-Rho算法的实现,同时结合了快速幂取模、快速积取模以及Miller-Rabin素性检验。文中提到在特定情况下,使用__int128作为中间类型的快速幂比long double更快,而快速积取模时则反之。此外,文章还讨论了Pollard-Rho算法中关于j % 127 == 0时提前计算GCD的策略,并指出该算法只能找到非质数的一个非平凡因子,需要进一步检验和分解以满足题目要求。
摘要由CSDN通过智能技术生成

一、题目描述

在这里插入图片描述

输入输出样例

输入 #1

6
2
13
134
8897
1234567654321
1000000000000

输出 #1

Prime
Prime
67
41
4649
5

说明/提示

2018.8.14 新加数据两组,时限加大到2s,感谢 @whzzt

by @will7101

二、算法分析说明与代码编写指导

在这里插入图片描述在这里插入图片描述在这里插入图片描述

三、AC 代码:

1、这题采用__int128作为中间类型的快速幂取模配合Miller-Rabin算法比采用long double作为中间类型时要快,原因不明。
2、采用long double作为中间变量的快速积取模配合Pollard-Rho算法比采用__int128类型作为中间变量时要快,原因不明。
3、Pollard-Rho算法中当 j % 127 == 0 时提前计算GCD是为什么,我也不知道:

if (j % 127 == 0) {
    d = gcd((_Ty)M, n); if (d > 1)return d; }

4、Pollard-Rho算法只能返回一个数的一个非平凡因子。题目要求当数不是质数时,输出这个数的最大质因子。此时要对Pollard-Rho算法的返回值进行素性检验,如果不是素数,就要继续递归分解。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<ctime>
#pragma warning(disable:4996)
using namespace std;
long long x, MaxPrimeDivisor, prime[] = {
    2,3,5,7,11,13,17,19,23,29,31,37 }, * prime_end = prime + 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值