zoj 月赛B题(快速判断一个大数是否为素数)
给出一个64位的大数,如何快速判断其是否为素数
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- using namespace std;
- typedef long long LL;
- LL n,m;
- //****************************************************************
- // Miller_Rabin 算法进行素数测试
- //速度快,而且可以判断 <2^63的数
- //****************************************************************
- const int S=20;//随机算法判定次数,S越大,判错概率越小
- LL mult_mod(LL a,LL b,LL mod) //(a*b)%c a,b,c<2^63
- {
- a%=mod;
- b%=mod;
- LL ans=0;
- while(b)
- {
- if(b&1)
- {
- ans=ans+a;
- if(ans>=mod)
- ans=ans-mod;
- }
- a=a<<1;
- if(a>=mod) a=a-mod;
- b=b>>1;
- }
- return ans;
- }
- LL pow_mod(LL a,LL b,LL mod) // a^b%mod
- {
- LL ans=1;
- a=a%mod;
- while(b)
- {
- if(b&1)
- {
- ans=mult_mod(ans,a,mod);
- }
- a=mult_mod(a,a,mod);
- b=b>>1;
- }
- return ans;
- }
- //以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;
- else return false;
- }
- // Miller_Rabin()算法素数判定
- //是素数返回true.(可能是伪素数,但概率极小)
- //合数返回false;
- bool Miller_Rabin(long long 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;
- }
- int main()
- {
- // n,m;
- while(scanf("%lld%lld",&n,&m)>0)
- {
- LL sum=0;
- for(LL i=0; i<m; i++)
- {
- sum+=(LL)(pow((double)(n),i)+0.5);
- }
- //printf("%lld\n",sum);
- if(Miller_Rabin(sum))
- printf("YES\n");
- else
- printf("NO\n");
- }
- return 0;
- }
zoj 月赛B题(快速判断一个大数是否为素数)的更多相关文章
- Java源码中的发现:快速判断一个int值是几位数
判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...
- 如何快速判断一个key是否存在在亿级数据中(bloomFilters)
面试题 现在有一个非常庞大的数据(亿级),假设全是 int 类型.现在我给你一个数,你需要告诉我它是否存在其中(尽量高效) 分析 采用bloomFilters进行实现(时间&空间尽可能的有效) ...
- 数学--数论--Miller_Rabin判断一个大数是不是素数(随机算法)
前提知识 1,费马定理:ap−1=1(mod p)a^{p-1}=1(mod\ p)ap−1=1(mod p)
- C和Java判断一个数字是否为素数
C: /* 素数: 素数又称质数.所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除. */ # include <stdio. ...
- JAVA 写一个方法,判断一个整数是否为素数
1 import java.util.Scanner; 2 3 public class Question3 { 4 public static void main(String[] args) { ...
- C++笔记(0)——判定一个数字是否是素数
博主之前使用的编程语言是Python,但是这门语言的效率比较低(通常,不优化的情况下,但是即便如此我还是偏爱Python),而且博主打算参加PAT考试(真正的原因),及博主打算顺便深入学习下机器学习框 ...
- 20 亿的 URL 集合,如何快速判断其中一个?
假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M ...
- ZOJ Problem Set - 1331 Perfect Cubes 判断一个double是否为整数
zju对时间要求比较高,这就要求我们不能简单地暴力求解(三个循环搞定),就要换个思路:因为在循环时,已知a,确定b,c,d,在外重两层循环中已经给定了b和c,我们就不用遍历d,我们可以利用d^3=a^ ...
- 学习练习 java练习小题题目:判断一个整数能被几个9整除
题目:判断一个整数能被几个9整除 package com.hanqi.lianxi; import java.io.*; public class Test1 { //判断能否被9整除 static ...
随机推荐
- Vue.js 添加组件
<!DOCTYPE HTML> <html> <head> <title>vue.js hello world</title> <sc ...
- JAVA Socket编程和C++ Socket编程有什么不同
原文链接: http://zhidao.baidu.com/link?url=16TEzhom2Nr8x1_2uTRp-e2pgZRgS5nW5ywtRX2XLHbtLOG8btif5DTyP85jf ...
- Oracle 客户端连接时报ORA-01019错误总结
在.net+oracle开发中,发布web程序的时候,有是会遇到该错误 ora-01019 ORA-01019 unable to allocate memory in the user sideCa ...
- 第二篇:呈现内容_第二节:WebControl呈现
一.WebControl的呈现过程 WebControl派生自Control类,所以WebControl的呈现功能基于Control的呈现逻辑之上,但有了比较大的扩展. 首先,WebControl重写 ...
- 使用C#和Thrift来访问Hbase实例
今天试着用C#和Thrift来访问Hbase,主要参考了博客园上的这篇文章.查了Thrift,Hbase的资料,结合博客园的这篇文章,终于搞好了.期间经历了不少弯路,下面我尽量详细的记录下来,免得大家 ...
- mongodb 远程访问配置
1.首先修改mongodb的配置文件 让其监听所有外网ip 编辑文件:/etc/mongodb.conf 修改后的内容如下: bind_ip = 0.0.0.0 port = 27017 auth=t ...
- nginx增加ssl支持 - 编译时参数详情列表
./configure \ --with-http_ssl_module \ make && make install nginx编译参数说明如下: --prefix=&l ...
- 在vultr中安装coreos
1.coreos必须使用key文件. 2.生成ssh key -C "your_email@mail.com" 3.拷贝ssh公钥文件内容.默认为id_rsa.pub 4.编辑vu ...
- Unity投影器细节整理
抽了个空整理下投影器 一般投影器需要两张贴图,一张Cookie,一张FallOff. Unity提供Light和Multiple两种自带shader,和粒子类似. Cookie需要非alpha贴图,F ...
- webapi中取文件的物理路径(server.mappath)
在Webapi中是用不了server.mappath方法的,上网搜索了一下,发现是用如下代码取得文件绝对路径: string logpath = System.Web.Hosting.HostingE ...