poj 1811 Prime Test(数论:大素数判定-分解)

2024-06-14 03:18

本文主要是介绍poj 1811 Prime Test(数论:大素数判定-分解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

直接套用Miller Rabin算法模板

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;//****************************************************************
// Miller_Rabin 算法进行素数测试
//速度快,而且可以判断 <2^63的数
//****************************************************************
const int S=20;//随机算法判定次数,S越大,判错概率越小//计算 (a*b)%c.   a,b都是long long的数,直接相乘可能溢出的
//  a,b,c <2^63
LL mult_mod(LL a, LL b, LL c) {a %= c;b %= c;LL 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
LL pow_mod(LL x, LL n, LL mod) {//x^n%cif(n==1)return x % mod;x %= mod;LL tmp=x;LL 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(LL a, LL n, LL x, LL t){LL ret = pow_mod(a,x,n);LL 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(LL n){if(n < 2)return false;if(n == 2)return true;if((n&1) == 0) return false;//偶数LL x = n-1;LL t = 0;while((x&1) == 0) {x >>= 1;t++;}for(int i=0; i<S; i++){LL a = rand()%(n-1)+1;//rand()需要stdlib.h头文件if(check(a, n, x, t))return false;//合数}return true;
}//************************************************
//pollard_rho 算法进行质因数分解
//************************************************
LL factor[100];//质因数分解结果(刚返回时是无序的)
int tol;//质因数的个数。数组小标从0开始LL gcd(LL a,LL 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(LL x, LL c) {LL i = 1,k = 2;LL x0 = rand() % x;LL y = x0;while(true){i++;x0 = (mult_mod(x0, x0, x) + c) % x;LL 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(LL n)
{if(Miller_Rabin(n)) {//素数factor[tol++] = n;return;}LL 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++不能加这句话LL n, x, ans;scanf("%lld", &n);for(int i=0; i<n; ++i) {scanf("%lld", &x);tol = 0;findfac(x);if(Miller_Rabin(x))puts("Prime");else {ans = factor[0];for(int j=1; j<tol; ++j) {ans = min(ans, factor[j]);}printf("%lld\n", ans);}}return 0;
}


这篇关于poj 1811 Prime Test(数论:大素数判定-分解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

Python分解多重列表对象,isinstance实现

“”“待打印的字符串列表:['ft','bt',['ad',['bm','dz','rc'],'mzd']]分析可知,该列表内既有字符对象,又有列表对象(Python允许列表对象不一致)现将所有字符依次打印并组成新的列表”“”a=['ft','bt',['ad',['bm','dz','rc'],'mzd']]x=[]def func(y):for i in y:if isinst

C++20中的Feature Test Mocros

C++20定义了一组预处理器宏,用于测试各种语言和库的feature。       Feature Test Mocros(特性测试宏)是C++20中引入的一种强大机制,用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现,它使你能够在编译过程中仔细检查特定语言或库功能(particular language

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

poj 2391 Ombrophobic Bovines (网络流)

这是一道很经典的网络流的题目。首先我们考虑假如我们的时间为无穷大。我们吧每个点拆成2个点 i和i' .。虚拟源点s和汇点t。对于每个点建边(s,i, a[i])  (i‘,t,ib[i]) 。 其中a[i]为给点有多少牛,b[i]为容量。i和j连通 建边 (i,j',inf);如果最大流==所有牛的个数,就可能装下所有的牛。那么现在我们考虑时间。假设最大时间为T.那么如果i到j的的最短时间>T

poj 1330 LCA 最近公共祖先

水题目。直接上代码了。 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<map>#include<vector>#

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 置换检验是一种非参数统计方法,它不依赖于数据的分布形态,因此特别适用于小样本数据集,尤其是当样本总体分布未知或不符合传统参数检验的假设条件时。置换检验的基本思想是通过随机置换样本来评估观察到的统计量是否显著不同于随机情况下的预期值。最初真正认识置换检

【chatgpt】train_split_test的random_state

在使用train_test_split函数划分数据集时,random_state参数用于控制随机数生成器的种子,以确保划分结果的可重复性。这样,无论你运行多少次代码,只要使用相同的random_state值,得到的训练集和测试集划分就会是一样的。 使用 train_test_split 示例 以下是一个示例,展示如何使用train_test_split函数进行数据集划分,并设置random_s