LG的数学计划----分解质因数(Pollard-Rho算法)

使用Pollard_rho算法分解质因数 Pollard_rho算法是找到一个数的最大质因数,我参考此算法进行修改,实现了将一个数分解为质因数相乘形式的程序。 阅读详情

1.对于我们朴素的求解质因数, 暴枚真是个好算法

好吧一样的就不给出代码了,

2.对于另一种神奇的算法Pollard-Rho算法

随机化算法, 与Miller robin有着密切联系, 可以先看一看两种算法都不难, 只是很神奇。。
这个算法也是一步步分解, 再递归求解, 但是它实现分解的过程非常奇妙, 我们如果在p中rand()分解, 这无疑是很愚蠢的。。。但是p又一定可以分解, 所以我们要while(1),
接下来是一个神奇的结论,
上面说过一个个试还不如暴枚, 那么我们就要优化,
取两个数, x1, x2, 看gcd(x2-x1, p)是否大于1, 是的话递归求解,
那么现在随中的几率更高了, 但是对于大数还是很慢, 所以我们要再优化,
那么对于x1, x2的求法就要讲究一下, 我们可以发现
采用这个求法

x2 = (x1*x1+c) % p;
这样是不是快了很多, 因为x2-x1的差重复的几率减小了
但是还是可能出现很背的情况, 你不换个c这破电脑不给你出来, 那我们就要想办法解决这组种子找不出解跳出来的情况,
我们发现 ,这样算会求出一个%p的循环节, 正是我们所需要的,它会走出一个神奇的圈!
就像这样

我们的目的是找到这个重复显然一个个存下来很麻烦, 我们用一种倍增的方法来解决这个问题(正确性我不会证感觉这样就好了), 每次*2当一次倍增完成后, 覆盖一次x1, x2
代码

#include <ctime>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define rep(i, s, t) for(int i = s; i <= t; ++i)
typedef long long ll;

ll H;
ll pls(ll a, ll b, ll p) {
    ll res = 0;
    for(; b; b >>= 1, a = (a+a)%p)
        if(b & 1) res = (res+a)%p;
    return res%p;
}

ll pow(ll a, ll b, ll p) {
    ll res = 1;
    for(; b; b >>= 1, a = pls(a, a, p))
        if(b & 1) res = pls(res, a, p)%p;
    return res % p;
}

bool M(ll p) {
    ll x[60] = {0}, s = 20;
    ll rest = p-1, t = 0;
    while(!(rest%2)) {
        t ++;
        rest >>= 1;
    }

    while(s--) {
        ll a = rand()%(p-1)+1;
        x[0] = pow(a, rest, p);
        rep(i, 1, t) {
            x[i] = pow(x[i-1], 2, p)%p;
            if(x[i] == 1) 
                if((x[i-1] != 1) && (x[i-1] != p-1)) return false;
        }
        if(x[t] ^ 1) return false;
    }
    return true;
}

ll gcd(ll a, ll b) {
    while(b) {
        ll t = a%b;
        a = b;
        b = t;
    }
    return a;
}

ll P(ll p) {
    ll c = rand()%(p-1)+1, x1 = rand()%(p-1)+1, x2 = x1;
    for(ll i = 2, k = 2; true; ++i) {
        x1 = (pls(x1, x1, p) + c)%p;
        ll G = gcd(p, (x2-x1+p)%p);
        if(G > 1 && G < p) return G;
        if(x2 == x1) return p;
        if(i == k) x2 = x1, k <<= 1;
    }
}

void solve(long long n) {
    if(n == 1) return;
    if(M(n)) {
        H = min(H , n);
        return;
    }
    long long p = n;
    while(p == n) p = P(p);
    solve(p);
    solve(n/p);
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
    freopen("res.out", "w", stdout);
#endif
    int _;
    scanf("%d", &_);
    while(_--) {
        ll p;
        H = 1LL << 54;
        scanf("%lld", &p);
        solve(p);
        if(H ^ p)
            printf("%lld\n", H);
        else puts("Prime");
    }
    return 0;
}

其实这是一个裸题代码poj1811, 会写一篇code解释

大数因数分解Pollard_rho 算法详解 大数因数分解 ,Pollard_rho,ACM,素数 适用范围:给你一个大数n,将它分解它的质因子的乘积的形式。 阅读详情

相关推荐

Python实现Pollard-Rho算法——快速分解大数

Pollard-Rho算法是一种基于随机漫步的算法,其基本思想是利用Floyd判圈算法检测循环,并在循环中发现因子。在数论中,质因数分解是一种重要的数学问题,也是很多加密和安全算法的核心。pollard_rho()函数是主要的分解函数,它首先处理特殊情况(1和偶数),然后随机选取初始值,进行迭代计算找到因子。当然,在使用它分解更复杂的数时,算法的效率也会变得更低,因此在实际应用中还需要其他优化方式来提高速度。在测试这个算法时,我们可以使用一个非常大的质数,比如Mersenne素数,以验证分解结果的正确性。

m0_47037246的博客 1426

算法中的数学:算术基本定理

我们可以看成2*3*4*5,分别对这四个数分解质因数,然后将分解出来的次数累加即可,比如对于2有一个质因数2,对于4有两个质因数2,所以总共质数2出现的次数就是3.

2301_79954395的博客 519

stata 代码实现熵值法计算 含常见问题解答

2.标准化①正向指标②负向指标。

m0_74825360的博客 1217

分解质因数

传送门 #include <iostream> #include <algorithm> #include <cstring> using namespace std; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=2;i<=n/i;i++)//从小到大枚举所有数,由于n的两个质因子的乘积一定.

pioneer1 269

无人机WIFI集群组网技术详解及成本分析

无人机WIFI集群组网技术是指利用无人机作为移动平台,通过集成高性能的WIFI模块,实现多架无人机之间以及无人机与地面控制站之间的无线通信组网。在协议层面,无人机WIFI集群组网需要遵循标准的无线通信协议,如IEEE 802.11系列(即WIFI标准),同时可能还需定制或优化路由协议、媒体访问控制(MAC)协议等,以确保高效、可靠的数据传输。数据安全与隐私保护:无人机集群组网中传输的数据可能涉及敏感信息,需采取加密、认证等安全措施,确保数据传输的安全性和用户隐私的保护。根据性能不同,价格差异较大。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1584

Protobuf NDK以及QNX交叉编译

Protobuf 用处很广,尤其是通讯数据序列化,反序列化。TODO。

静虚待令,有物混成 1560

【数论】质因数分解+唯一分解定理

任何一个大于1的正整数都能唯一分解为有限个质数的乘积。 试除法 可以扫描2-sqrt(n)的每个数d,若d能整除N,则从N中除掉所有的因子d,同时累计除去d的个数。 //质因数分解试除法 void divide(int n) { m=0; for(int i=2;i&amp;amp;amp;lt;=sqrt(n);i++) { if(n%i==0) { ...

Bryce1010's Blog 3342

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5569

Codeforces 490D. Chocolate(分解质因数求解)

D. Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Polycarpus likes giving presents to Paraskevi.

peteryuanpan的专栏 941

Ships Dataset:解锁海洋探索的数字宝库

在海上交通管理中,通过对船舶的持续跟踪,可以及时发现船舶的异常行为,如偏离航线、超速等,保障海上航行的安全。例如,通过分析船舶的航行数据和位置信息,合理安排船舶的停靠时间和装卸货物顺序,避免港口拥堵,提高船舶的周转率。同时,还精确标注了船舶在图像中的位置坐标,通过这些坐标,我们可以准确地定位船舶在图像中的具体位置,为后续的分析和处理提供了精确的依据。从繁忙运输货物的货船,到承载着能源使命的油轮,再到穿梭于海洋寻找鱼群的渔船 ,每一种船舶都有着独特的外形和功能,在数据集中留下了它们的身影。

qq_38220914的博客 1267

FreeRTOS的学习(十四)——PendSV异常

本文将从任务切换的角度出发,学习PendSV异常的相关概念。

LEOD的博客 1730

[Vijos 1137] 组合数 · 数学

题目上的标签说的是容斥原理,但是窝怎么伪暴力就秒A了。。。 把分子分母分别质因数分解,然后约掉重复的部分,最后统计。 这题本来不准备写blog的,太水了,但学了一个log级别的分解质因数,顿时感觉太弱了。 在欧拉筛法中,每个数只会被它最大的质因数筛去,所以我们用check[i]来表示i的最大的质因数,如果i是个质数那么check[i]=i,所以我们对于一个数t要分解质因数的时候,只要不停做t

山外小楼夜听雨 695

架构师成长之路(1)--什么是架构师

前言: 哲学家常思考的问题:" 我是谁?"" 我从哪里来?"" 要到哪里去?不只是哲学家,我想每个人都有自己对这三个问题的认知。 如果我们要成为架构师,我们自己要面临的三大问题: 找准自己定位:我是谁?在哪里? 怎样做好架构师:我要做什么? 如何搭建架构师知识体系:我该怎么做? 这里面就是做事方法论:目标(我要做什么),方法(计划)(我该怎么做), 执行/行动找准自己定位:我是谁?在哪里...

黄规速博客:学如逆水行舟,不进则退 6万+

数论 --- 质因数

质因数 1.定义 指能整除给定正整数的质数 简而言之就是一个数既要是 nnn 的因子,有要是一个质数,这样的数被称为 nnn 的一个质因数,或者被称为 nnn 的一个质因子。 2.求一个数的所有质因数(分解质因数) 2.1 唯一分解定理(算术基本定理) 任何一个大于1的自然数 N{N}N ,如果N{N}N不为质数,都可以唯一分解成有限个质数的乘积 N=P1a1∗P2a2∗⋯∗PnanN = {P_1}^{a_1}*{P_2}^{a_2}* \cdots *{P_n}^{a_n}N=P1​a1​∗P2

salt___fish的博客 2334

通过Langchain实现大模型完成测试用例生成的代码(可集成到各种测试平台)

代码中使用的是讯飞spark3.0版本,其中版本在的控制已经封装到了langchain对应的讯飞的iflytek的类中,可以在调用的时候显示控制,默认是spark2.0版本。

Criss@陈磊 2362

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Pollard Rho质因数分解的编程实现

Pollard Rho因数分解 (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,  重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 这个问题循环执行了上边的三个步骤,因此可以把上面三个步骤抽象成一个函数,重复调用 递归思路:先分解出n中最小的质因子k 能整除:输出因子k,继续分解n/k中的因子k 不能整除:分解n中的下一个因子k+1 当n==k时

优快云729180099的博客 471

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【模板】Pollard-Rho算法

一、题目 电磁看题 二、解法 作者讲的解法只是一个缩略版,要想获得更好的理解请参照大佬的博客。 0x01 生日悖论 如果你不是很了解,点此观看 生日悖论告诉了我们一个道理,也就是我们用组合计算的方式会比单个确切值更有概率得到答案。什么意思呢?举个例子,我们要找到xxx,用r−lr-lr−l的方式比直接randrandrand概率有更大概率得到xxx,这里作者就不给详细证明了,感性理解。 所以与其直...

C202044zxy的博客 874

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Pollard Rho算法

假设一年有n天,房间中有k人,每个人的生日在这n天中,服从均匀分布,两个人的生日相互独立问至少要有多少人,才能使其中两个人生日相同的概率达到p解:考虑k≤n设k个人生日互不相同为事件A,则PAnn​nn−1​⋯nn−k1​由题意PA≤1−p,由1x≤exPA≤e−n1​e−n2​⋯enk−1​e−2nkk−1​≤1−p解得k≥211−2nln。

思维缜密的博客 1638

【快速因数分解】Pollard's Rho 算法

Pollard-Rho 是一个很神奇的算法,用于在 $O(n^{\frac{1}4}) $的期望时间复杂度内计算合数 n 的某个非平凡因子(除了1和它本身以外能整除它的数)。事书上给出的复杂度是 \(O(\sqrt{p})\) , p 是 n 的某个最小因子,满足 p 与 n/p 互质。虽然是随机的,但 Pollard Rho 算法在实际环境中运行的相当不错,不会被卡。 简单来说:Pollar...

橘嘉禾 757

Pollard Rho 质因数分解

暴力算法 这是一个暴力递归分解质因数的伪代码 void rp(int n) { if (n 是 质数) n 是 rp 的一个质因子, return; 枚举找到 n 的一个非 1 因子 p; rp(p), rp (n / p); } 其中判断质数可以用 Miller Rabin。该暴力复杂度的瓶颈是找因子,如果给定的 nnn 是一个大质数如 109+710^9+7109+7,那么枚举的复杂度就一飞冲天了。 生日悖论 假设 n=109+7n=10^9+7n=109+7,只有一个非 11

ylxmf2005's Blog 692

Pollard_Rho 大数求因子

求合数 n 的某个非平凡因子(除 1 和它本身以外能够整除它的数)。即 快速找到 n 的一个非1非本身的因子。

mqnu0的博客 535

分解质因数的技巧

背景: 有时分解一个很大的合数,因为可能质因子很大,导致分解时复杂度不是严格O(log2n),需要用一点技巧使其复杂度得到保证。 做法: 在筛法求质数时,不用把质数存储成一张表,而用一个数组big[i]保存每个数(不管是质数还是合数)的最大质因数,接着在分解一个数x时,令y=x,之后不断地y/=big[y],并且把每次的big[y]作为x的一个质因数,这样就可以了。 201611...

anheku1562的博客 992

Pollard rho算法总结

Pollard rho算法总结 前置知识 快速幂 快速乘 Miller Rrabin判断素数O(klog3n)O(klog^3n)O(klog3n) 快速幂 太简单了,不讲 ll ksm(ll a,ll n,ll p){ ll s=1; while(n){ if(n&1) s=qmul(s,a,p); a=qmul(a,a,p); n>>=1; } return s; } 快速乘 比较简单,就转化为long double 在转换为longlong 自然溢出 差

Harris-H的博客 1191

【NOIP入门数论】分解质因数

自创题目详解数据包【数据资源】链接:http://pan.baidu.com/s/1eRHCMwq 密码:9laz题面【题目名称】分解质因数 【时间限制】1000ms 【空间限制】128M 【题目描述】 记Pi表示正整数i的质因数集合.记P_i表示正整数i的质因数集合. 已知正整数n,求满足下列条件的有序正整数对(a,b)的数目:已知正整数n,求满足下列条件的有序正整数对(a,b)的数目:

lym01803的博客 3311

Codeforces 1247D. Power Products (logn质因数分解)

前言废话:最近一直调参…鸽了好久训练… 这个题也是神奇,以前我都不知道质因数分解能logn,以为要sqrt(n)… 大致题意 给一个长度为 n 的序列 (1 <=ai <=100000,2<=n<=100000) ,给定一个整数 m (2<=m<=100) ,要求 i< j,且 ai * aj = x^m 的对数,其中 x 是正整数。 思路 预处理每个数的...

lalalafloat的博客 1189
上一篇: LG的数学计划之素数测试(Miller Rabin算法)
下一篇: LG的数学计划----EXGCD
__Galaxy
博客等级 码龄10年 8粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值