使用Pollard_rho算法分解质因数

分解质因数的朴素算法

最简单的算法即为从 [2, sqrt(N)] 进行遍历。

vector<int> breakdown(int N) {vector<int> result;for (int i = 2; i * i <= N; i++) {if (N % i == 0) {  // 如果 i 能够整除 N,说明 i 为 N 的一个质因子。while (N % i == 0) N /= i;result.push_back(i);}}if (N != 1) {  // 说明再经过操作之后 N 留下了一个素数result.push_back(N);}return result;
}

这个算法当 n 是质数时拥有最差时间复杂度 O(n) ,不过可以先用米勒-拉宾特判一下 n 是不是质数,这样的话最差时间复杂度就是当 n 是质数的平方时的 O(sqrt (n)) 了

Pollard_rho将一个数分解为质因数相乘的形式

如:200 = 22255
Pollard_rho算法是找到一个数的最大质因数,我参考此算法进行修改,实现了将一个数分解为质因数相乘形式的程序。

#include <iostream>
#include <stdlib.h>
#include <vector>int t;
long long max_factor, n;
std::vector<long long> factor; // 存储质因数long long gcd(long long a, long long b) {if (b == 0) return a;return gcd(b, a % b);
}long long quick_pow(long long x, long long p, long long mod) {  // 快速幂long long ans = 1;while (p) {if (p & 1) ans = (__int128)ans * x % mod;x = (__int128)x * x % mod;p >>= 1;}return ans;
}bool Miller_Rabin(long long p) {  // 判断素数if (p < 2) return 0;if (p == 2) return 1;if (p == 3) return 1;long long d = p - 1, r = 0;while (!(d & 1)) ++r, d >>= 1;  // 将d处理为奇数std::vector<long long> ud = {2, 325, 9375, 28178, 450775, 9780504, 1795265022};for (long long a:ud) {long long x = quick_pow(a, d, p);if (x == 1 || x == p - 1) continue;for (int i = 0; i < r - 1; ++i) {x = (__int128)x * x % p;if (x == p - 1) break;}if (x != p - 1) return 0;}return 1;
}long long Pollard_Rho(long long x) {long long s = 0, t = 0;long long c = (long long)rand() % (x - 1) + 1;int step = 0, goal = 1;long long val = 1;for (goal = 1;; goal *= 2, s = t, val = 1) {  // 倍增优化for (step = 1; step <= goal; ++step) {t = ((__int128)t * t + c) % x;val = (__int128)val * abs(t - s) % x;if ((step % 127) == 0) {long long d = gcd(val, x);if (d > 1) return d;}}long long d = gcd(val, x);if (d > 1) return d;}
}void fac(long long x) {if (x <= max_factor || x < 2) return;if (Miller_Rabin(x)) {              // 如果x为质数max_factor = std::max(max_factor, x);  // 更新答案return;}long long p = x;while (p >= x) p = Pollard_Rho(x);  // 使用该算法while ((x % p) == 0) x /= p;fac(x), fac(p);  // 继续向下分解x和p
}void decompose(long long n) { // 将n分解为质因数相乘的形式srand((unsigned)time(NULL));max_factor = 0;fac(n);if(max_factor == n) { // 最大的质因数是自己factor.push_back(max_factor);}else {factor.push_back(max_factor);n /= max_factor;decompose(n);}
}int main() {std::cout << "----start decompose n: [exit please input number 0 !]----" << std::endl;while(1) {std::cout << "input number: ";std::cin >> n;if(n == 0) {std::cout << "stop and exit program!" << std::endl;break;}decompose(n);std::cout << n << " = ";for(std::vector<long long>::iterator it = factor.begin(); it != factor.end()-1; ++it) {std::cout << *it << "*";}std::cout << *(factor.end()-1) << std::endl;std::vector<long long>().swap(factor);}return 0;
}

程序功能展示
在这里插入图片描述

参考文章

[1] https://oi-wiki.org/math/number-theory/pollard-rho/
[2] https://zhuanlan.zhihu.com/p/267884783
[3] Miller Rabin素数判定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294766.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS苹果签名共享签名是什么以及如何获取?

哈喽&#xff0c;大家好呀&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;最近有很多朋友都来向我咨询共享签名iOS苹果IPA共享签名是什么&#xff0c;针对这个问题&#xff0c;淼淼来解答一下大家的疑惑并告诉大家iOS苹果ipa共享签名需要如何获取。 现在苹果签名在市场上的…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件&#xff0c;广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级&#xff0c;新增了对Apple芯片的支持&#xff0c;建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面&#xff0c;Maya 2025…

CVPR 2024 | 从6篇论文看扩散模型diffusion的改进方向

1、Accelerating Diffusion Sampling with Optimized Time Steps 扩散概率模型&#xff08;DPMs&#xff09;在高分辨率图像生成方面显示出显著性能&#xff0c;但由于通常需要大量采样步骤&#xff0c;其采样效率仍有待提高。高阶ODE求解在DPMs中的应用的最新进展使得能够以更…

从PDF到高清图片:一步步学习如何转换PDF文件为高清图片

引言 PDF文件是一种便携式文档格式&#xff08;Portable Document Format&#xff09;&#xff0c;最初由Adobe Systems开发&#xff0c;用于在不同操作系统和软件之间保持文档格式的一致性。PDF文件通常包含文本、图片、图形等多种元素&#xff0c;并且可以以高度压缩的方式存…

Redis配置与优化

目录 引言 一、关系型数据库与非关系型数据库 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库的区别 1.数据存储方式不同 2.扩展方式不同 3.对事物性的支持不同 4、非关系型数据库产生背景 二、Redis简介 1、Redis优点 2、Redis为什么这麽快&…

hcip实验4:gre mgre ppp综合实验

实验拓扑: 实验目的&#xff1a; 1.R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址 2.R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b;R2与R5之间使用ppp的CHAP认证&#xff0c;R5为主认证方;R3与R5之间使用HDLC封装; 3.R1、R…

vue+elementUI搭建动态表头的表格

前提&#xff1a;以下代码是vue2项目结合elementUi完成的 数据结构 后端传来的数据是两个list&#xff0c;一个表头的list&#xff0c;一个表格内容的list // 表头 headTableAtts: [{ columnLabel: 姓名, columnName: name },{ columnLabel: 年龄, columnName: age },{ colu…

计算机网络面试问题(一)

1.在浏览器中输⼊URL并按下回⻋之后会发⽣什么 2.TCP三次握⼿的过程,为什么三次握手 TCP&#xff08;传输控制协议&#xff09;的三次握⼿是建⽴⽹络连接的过程&#xff0c;确保通信双⽅能够正确地进⾏数据传输。 第⼀次握⼿&#xff08;SYN&#xff09;&#xff1a; 客户端&am…

[羊城杯 2020]EasySer

[羊城杯 2020]EasySer 进入页面&#xff0c;发现是ubuntuapache2&#xff0c;但是好像没啥用 尝试访问/robots.txt&#xff0c;得到 访问/star1.php/&#xff0c;查看源码&#xff0c;得到提示 一看就知道是ssrf&#xff0c;使用http://127.0.0.1/ser.php&#xff0c;得到…

Spring日志框架

前言 本文我们简单说说关于Spring中的日志框架,以及对应的注解 我们知道,公司服务器在运行的时候,一定会打印日志,有很多优点,比如预防报警,或者是某重大事故尝试修复等等都需要查看日志 应该说日志对我们来说并不陌生,我们在之前刷题或者是程序遇到bug的时候也经常会将程序的状…

windows 系统图标 桌面刷新 位置变化解决办法

Windows操作系统下&#xff0c;系统图标由于是内置图标&#xff0c;即使桌面关闭了图标自动排列&#xff0c;在桌面右键刷新或系统重启后&#xff0c;依然会位置自动改变&#xff0c;有时候确实需要管理图标&#xff0c;这种自动变化就特别烦&#xff0c;怎么办呢&#xff1f; …

uniapp微信小程序消息订阅详解

一、微信公众平台申请订阅模板 注意&#xff1a;订阅信息 这个事件 是 当用户 点击的时候触发 或者 是 支付成功后触发&#xff0c; 用户勾选 “总是保持以上选择&#xff0c;不再询问” 之后或长期订阅&#xff0c;下次订阅调用 wx.requestSubscribeMessage 不会弹窗&#xf…

如何选择家用洗地机?四大性能出色产品,新手必看

在现代生活中&#xff0c;随着人们对健康和卫生意识的提高&#xff0c;家庭清洁变得越来越重要。然而&#xff0c;传统的清洁方式往往效率低下&#xff0c;难以满足需求。幸运的是&#xff0c;现代科技的发展为我们带来了许多智能清洁设备&#xff0c;其中洗地机就是一种非常实…

Qt 富文本处理 (字体颜色大小加粗等)

Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口&#xff1a;setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 &#xff0c;主要使用QTextCharFormat类进行文本样式设置。 示例&#xff1a; QTextCharFormat fmt; //粗体 fmt.setFontWeight…

数据结构:归并排序

归并排序 时间复杂度O(N*logN) 如果两个序列有序,通过归并,可以让两个序列合并后也有序,变成一个有序的新数组 对于一个数组,如果他的左右区间都有序,就可以进行归并了 归并的方法 将数组的左右两个有序区间比较,每次都取出一个最小的,然后放入临时数组(不能在原数组上修改…

《自动机理论、语言和计算导论》阅读笔记:p68-p114

《自动机理论、语言和计算导论》学习第4天&#xff0c;p68-p114总结&#xff0c;总计47页。 一、技术总结 1.inverted indexes 明白单词的意思是“反转的索引”&#xff0c;但是不明白其在书中具体指什么&#xff0c;去查询资料的话需要花很不多时间&#xff0c;先继续往下看…

使用Leaflet.rotatedMaker进行航班飞行航向模拟的实践

目录 前言 一、Leaflet的不足 1、方向插件 2、方向控制脚本说明 二、实时航向可视化实现 1、创建主体框架 2、飞机展示 3、位置和方位模拟 三、成果及分析 1、成果展示 2、方向绑定解读 总结 前言 众所周知&#xff0c;物体在空间中的运动&#xff08;比如飞行、跑步…

SSM框架学习——MyBatis关联映射

MyBatis关联映射 为什么要关联映射 实际开发中&#xff0c;对数据库操作常常会涉及多张表&#xff0c;所以在OOP中就涉及对象与对象的关联关系。针对多表操作&#xff0c;MyBatis提供关联映射。 关联关系概述 一对一&#xff1a;A类中定义B类的属性b&#xff0c;B类中定义A…

spring-boot之shiro安全框架配置使用

shiro架构&#xff08;外部&#xff09; shiro架构(内部) 具体API操作 获取当前的用户对象 Subject currentUser SecurityUtils.getSubject();通过当前用户拿到session Session session currentUser.getSession(); session.setAttribute("someKey", "aValu…

如何在Linux系统运行RStudio Server并实现无公网IP远程访问【内网穿透】

文章目录 推荐 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…