pollard rho

2023-12-24 18:38
文章标签 pollard rho

本文主要是介绍pollard rho,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



http://wenku.baidu.com/link?url=O5zUelUS26sjkR6Uu9Ty3-91tXYH7HEuS2fepWq7PMuH9jjrXa_NLEMNvopHgPdB9uDptolWDlJzpSuwUsDV6pKeJUYEzARbI8Qu4xPdXfK

好文章

poj2429,快速乘,不用TL。。。

#include<iostream>
#include<ctime>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
long long p,f[1000],ans;
long long f2[1000],q;
long long mod2(long long a,long long b,long long n)
{long long  exp = a%n, res = 0;while(b){if(b&1){res += exp;if(res>n) res -= n;}exp <<= 1;if(exp>n)  exp -= n;b>>=1;}return res;
}long long pow_mod(long long a,long long b,long long m)
{long long exp=a%m, res=1;while(b>=1){if(b&1)res=mod2(res,exp,m);exp = mod2(exp,exp,m);b>>=1;}return res;
}
bool miller(long long k,long long d,long long n,long long a)
{if(n==2||n==a) return true;if(!(n&1)) return false;long long i,t=pow_mod(a,d,n);if(t==1) return true;for(i=0;i<k;i++){if(t==n-1) return true;t=(t*t)%n;}return false;
}
bool judge(long long n)
{if(n<2) return false;long long k=0,d=n-1;while(!(d&1)){k++;d>>=1;}if(n<1373653){if(miller(k,d,n,2)&&miller(k,d,n,3)) return true;return false;}if(n<9080191){if(miller(k,d,n,31)&&miller(k,d,n,73)) return true;return false;}if(n<4759123141){if(miller(k,d,n,2)&&miller(k,d,n,3)&&miller(k,d,n,5)&&miller(k,d,n,11)) return true;return false;}if(n<2152302898747){if(miller(k,d,n,2)&&miller(k,d,n,3)&&miller(k,d,n,5)&&miller(k,d,n,7)&&miller(k,d,n,11)) return true;return false;}else{if(miller(k,d,n,2)&&miller(k,d,n,3)&&miller(k,d,n,5)&&miller(k,d,n,7)&&miller(k,d,n,11)&&miller(k,d,n,31)&&miller(k,d,n,61)&&miller(k,d,n,73)) return true;return false;}
}
long long gcd(long long a,long long b){long long c;while(b){c=b; b=a%b; a=c;}return a;
}
long long pollard_rho(long long n,long long k){srand(time(0));long long x=rand()%(n-1)+1;long long i=1,t=2,y=x,d;while(1){i++;x=(mod2(x,x,n)+k)%n;d=gcd(y-x,n);if(d>1 && d<n) return d;if(x==y) return n;if(t==i) y=x,t<<=1;}
}
void get_factor(long long n,long long k){if(judge(n)){f[p++]=n;return ;}long long h=n;while(h>=n)h=pollard_rho(h,k--);get_factor(h,k);get_factor(n/h,k);
}
void dfs(long long i,long long x,long long k){if(i>q) return ;if(x>ans && x<=k) ans=x;dfs(i+1,x,k);x*=f2[i];if(x>ans && x<=k) ans=x;dfs(i+1,x,k);
}
int main(int argc, char** argv) {long long m,n,k;while(scanf("%lld%lld",&m,&n)!=-1){if(m==n){printf("%lld %lld\n",m,n); continue;}k=n/m; p=0; q=0; ans=1;get_factor(k,180);sort(f,f+p);f2[0]=f[0];for(int i=0;i<p-1;i++)if(f[i]==f[i+1]) f2[q]*=f[i+1];else{q++; f2[q]=f[i+1];}long long tmp=(long long)sqrt(k*1.0);dfs(0,1,tmp);printf("%lld %lld\n",m*ans,k/ans*m);}return 0;
}


这篇关于pollard rho的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532751

相关文章

Pollard‘s rho因子分解法——C语言实现

Pollard's rho的核心思想其实就是求p和q的倍数,而这样的倍数有无穷多个,当N值很小的时候,成功率还是很高的,当N值很大时,该算法就不灵了。 #include <stdio.h>#include <stdlib.h>int gcd(int x,int y){int z;while(y){z=x,x=y,y=z%y;}return x;}int f(int x,int c,i

Pollard‘s p-1因子分解法——C语言实现

前置知识 smooth与powersmooth 光滑数(smooth number),或译脆数,是一个可以因数分解为小质数乘积的正整数 如果一个整数的所有素因子都不大于B,我们称这个整数是B-Smooth数 如果一个整数的所有素因子的对应指数次幂不大于B,我们称这个整数是B-powersmooth数 720(24∗32∗51)720(24∗32∗51) 是一个5-smooth数,6-smoot

【极速前进】20240422:预训练RHO-1、合成数据CodecLM、网页到HTML数据集、MLLM消融实验MM1、Branch-Train-Mix

一、RHO-1:不是所有的token都是必须的 论文地址:https://arxiv.org/pdf/2404.07965.pdf 1. 不是所有token均相等:token损失值的训练动态。 ​ 使用来自OpenWebMath的15B token来持续预训练Tinyllama-1B,每1B token保存一个checkpoint。对于每个checkpoint都评估token级别的loss

POJ 1811 *** Prime Test(详解Miiler_Rabin算法与Pollard_Rho算法)

题意:对于一个给定的数n,判断n是否为质数,n如果为质数,输出“Prime”,如果为合数,则输出其最小的素因子。 分析:其实这道题就是对于Miller_Rabin算法和Pollard_Rho算法的应用,具体的详解如下(刚买的椰子味身体乳香香的,感觉自己变成了一颗大椰子哈哈) Miller_Rabin随机性素数测试方法: 先给出费马定理的定义: 如果p是素数,则a^(p-1)==1

Hdu 4344 Mark the Rope —— 大数分解,Pollard-Rho模板

This way 题意: 问你一个大数有多少个质因子,并且求唯一分解之后每个质因子的最高次的和 题解: Pollard-Rho模板,用到了Miller_Rabin判素数。 #include<bits/stdc++.h>using namespace std;#define ll long long ll add(ll a,ll b,ll mod){if(a+b>=mod)ret

使用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

洛谷10月月赛R1T1-SAC E#1 - 一道中档题 Factorial(pollard-rho质因数分解)

传送门 小数据做法(改了之后):http://blog.csdn.net/stone41123/article/details/78172763 大数据做法(没改之前的数据范围): 我们沿用之前的做法,只是质因数分解如果再用 O(n√) O(\sqrt n)的,那么就会TLE 我们可以使用pollard-rho质因数分解,听说时间是 O(n14) O(n^{\frac 1 4})的,我自己

E.Multiply Pollard_rho质因数分解

2019 icpc xuzhou 思路很简单, 但是这个Pollard_rho的模板要选好, 不然不是wa 就是 tle ,我太难了 #include <cstdio>#include <cstdlib>#include <ctime>#include <cstring>#include <algorithm>#include <iostream>const int S=20;us

短的Pollard Rho算法模板

有必要为它开启一个尊贵的独立页面(找来找去好麻烦   - _ -|| )   #include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<cstdio>#include<stdlib.h>#include<time.h>#define times 20using namespace

Pollard_rho算法+Miller_rabin算法 大整数的分解

原理证明这个博客写得能看懂: https://www.cnblogs.com/fzl194/p/9047710.html 简单例题:POJ 1811 Prime Test 这里贴代码很详细的解释,方便套用 #include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#include<iostream>#