java 素数 五行_【数论】素数的判定与筛法
素数的判定与筛法
判定:很简单嘛!暴力大法参上!
#include
#include
unsigned long int n,i,j,a,b;
using namespace std;
int main()
{
cin>>n;
j=(int)sqrt(n);
for(i=2;i<=j;i++)
if(n%i==0) break;
if(i>j&&n!=0&&n!=1) cout<
else cout<
}
(不相信从来不刷水的我竟然做了这样的题……)
这就是传说中的O(根号N)大暴力……
那么还有个算法叫Miller-rabin……
那么我们来介绍一下这是个什么东西:
首先让我们了解这几个概念:
费马小定理:对于素数p和任意整数a,有ap ≡ a(mod p)(同余)。反过来,满足ap ≡ a(mod p),p也几乎一定是素数。
伪素数:如果n是一个正整数,如果存在和n互素的正整数a满足 an-1 ≡ 1(mod n),我们说n是基于a的伪素数。如果一个数是伪素数,那么它几乎肯定是素数。
Miller-Rabin测试:不断选取不超过n-1的基b(s次),计算是否每次都有bn-1 ≡ 1(mod n),若每次都成立则n是素数,否则为合数。
设待测数为n,取一个比n小的正整数a,设n-1=d*2^r。若n是素数,则要么a^d mod n = 1,要么存在一个i,满足0≤i<r且a^(d*2^i )mod n = -1
经过独立的t轮Miller-Rabin算法将一个合数误判为素数的可能性不大于 (1/4)t,(正确实现的算法不会误判素数为合 数),这个误判概率在基于Fermat定理的算法中是最好的。一轮Miller-Rabin算法的最坏情况时间复杂度为 (1+O(1))log2(n)( 以模n乘法为基本操作)。如果以单精度乘法操作作为时间复杂度的衡量,则一轮优化的Miller-Rabin算法的最 坏情况时间复杂度为O(log32 (n) 。从时间复杂度来看Miller- Rabin算法的性能是很好的。在实际应用中,Miller-Rabin 算 法的实际执行速度也很快。
大家可以多次调用该函数,使得错误率降低。
#include
#include
#include
bool witness(__int64 a,__int64 n)
{
__int64 t,d,x;
d=1;
int i=ceil(log(n-1.0)/log(2.0)) - 1;
for(;i>=0;i--)
{
x=d; d=(d*d)%n;
if(d==1 && x!=1 && x!=n-1) return true;
if( ((n-1) & (1< 0)
d=(d*a)%n;
}
return d==1? false : true;
}
bool miller_rabin(__int64 n)
{
if(n==2) return true;
if(n==1 || ((n&1)==0)) return false;
for(int i=0;i<50;i++){
__int64 a=rand()*(n-2)/RAND_MAX +1;
if(witness(a, n)) return false;
}
return true;
}
int main()
{
int n,cnt;
__int64 a;
while(scanf("%d",&n)!=EOF)
{
cnt=0;
while(n--)
{
scanf("%I64d",&a);
if(miller_rabin(a))
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
筛法:筛法有3种时间复杂度,详细说应该有四种,最后一种貌似是打表……
1.O(N*根号N)
2.O(NlogN)
3.O(N)
第一种方法:很明显的暴力啊……循环+判断
第二种方法:这是比较常用的一种筛法:埃氏筛(俗称垃圾筛),根本思想很简单:我们从1往N搜,假如我们遇到了一个没有被标记为不是素数的数,那么我们把它的倍数(>1)都标记为非素数……
for(int i=2;i<=1000000;i++)
if(!FP[i])
{
PL[++e]=i;
for(long long j=(long long)i*i;j<=1000000;j+=i) FP[j]=1;
}
第三种方法:线性筛,这个还是根据代码来解释吧……
第一行:应该没必要解释吧
第二行:从1到N枚举
第三行:同埃氏筛
第四行:枚举素数
第五行:如果乘上i大于n了,那么后面也肯定大于n,so break……
第六行:把prime[j]的i倍标记为不是素数
第七行:这个是代码的核心句,如果没有这句,那么它的时间复杂度与埃氏筛一样,但是我们来看一看12,它是在什么时候被枚举到的?第6次循环,也就是说,我们这次如果不加这条语句,那么有写情况是算重复了,那么这条鱼句就可以保证它不会重复。
1. 任何一个合数都可以表示成一个质数和一个数的乘积
2. 假设A是一个合数,且A = x * y,这里x也是一个合数,那么有:一个合数(x)与一个质数(y)的乘积可以表示成一个更大的合数(Z)与一个更小的质数(a)的乘积
例如: 如果i = 8; 那么由于i%2 == 0; 因此对于i=8就只需要检查primes[1]=2即可,因为对于大于primes[1]的质数,像3,有:8*3 = 2*4*3 = 12*2
也就是说24(8*3=24)并不需要在8时检查,在12时才检查
java 素数 五行_【数论】素数的判定与筛法相关推荐
- python找素数程序_求素数python
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 质数(prime number),又称素数,指在大于1的自然数中,除了1和该数自 ...
- java梅森素数计算程序_梅森素数计算器(prime95)
梅森素数计算器(prime95) 用来帮助用户寻找梅森素数的计算工具 原文介绍: Prime95 is a small and easy to use application that allows ...
- java超级素数算法_计算机二级VB基础之素数算法
众所周知计算机二级VB考试除了考察累加.最值.约数因子以及进制转化之外还会考察素数的算法.那么到底二级VB中的素数算法是怎么样的呢?为此在本文中课课家笔者就为大家简单介绍其含义和具体的算法,并给出相应 ...
- 用java求1000之内的素数_java求1000以内的素数
.out.println("周长为:"+ bianChang*4); System.out.println("面积为:"+ bianChang*bianChan ...
- python输出超级素数_超级素数(sprime)
超级素数(sprime) 题目描述 超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数为质数,例如: 373->37->3 这是一个长为3的超级素数. 输入 输入一个整数n (10 ...
- java判断一个整数是不是素数(质数)
java判断一个整数是不是素数(质数) /*** 判断一个数是不是素数(质数)* 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.*/import java.util.Scann ...
- Java判断一个数是不是素数
[java] view plaincopy import java.util.Scanner; //质数又称素数,是指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数 publi ...
- matlab 判断整除函数_判断素数函数
描述 写一个函数isPrime(n)用于判断一个数字n是不是素数,用户输入一个正整数,在一行内输出不大于该数的所有素数,各数后面用一个空格分隔. 输入格式 输入一个正整数 输出格式 不大于该数的所有素 ...
- 自然数 素数 质数_俄罗斯娃娃素数
自然数 素数 质数 As a child, weren't you in wonder of Russian Dolls, and where you learnt how the dolls fit ...
最新文章
- java兩個矩陣相乘_Day12 練習java-矩陣乘法
- 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程(权重,盒子模型)
- 台湾大学林轩田机器学习基石课程学习笔记1 -- The Learning Problem
- rpm部署mysql_使用rpm快速安装部署MySQL5.6以及主从设置
- 如何杀掉可恶的Notkelvir病毒
- 【PL/SQL】 控制结构
- matlab 命令集结(1)
- redis、mysql、和php原生array数组效率对比
- AQS框架之南风北巷
- 蓦然回首,会员制CRM就在下里巴人处
- 软件工程师——计算机组成原理
- 草图大师卡死后找到自动保存备份文件的3种解决方法
- Word如何拆分单元格
- 一篇文章讲清什么是零知识证明
- 【小程序源码合集】云开发前后端完整代码,大学生校园社团体管理活动预约微信小程序源码
- 小傻蛋的妹妹跟随小甲鱼学习Python的第四节004
- rj45插座尺寸图_RJ45、RJ11 插座系列产品技术参数(中英文)
- 【技术分享】 ​IE浏览器漏洞利用技术的演变 ( 二 )
- java castor_Castor简单介绍
- 盲源分离matlab程序,分享一些盲源分离的代码及相关网址
热门文章
- mysql查询每个机构下的账号总数_MySQL高可用方案:实践篇
- pandas fillna_6个提升效率的pandas小技巧
- 数组排序c语言函数_C语言如何写出返回数组最大最小值之差的函数(C primer plus 10-5)...
- 安装包镜像_创建 macOS Catalina cdr格式镜像安装包
- python编程定义圆_Python语言编程系列014——PyQt中自定义圆形指示灯
- python把桢写入txt_Java 字节码与字节码分析
- python程序中断时,输出打印日志
- lstm解决梯度消失
- HTML中的5种空格表示,HTML中的5种空格各表示的意义
- 计算机程序输入x是3求输出七年级的题,如图所示是计算机程序计算,若开始输入,则最后输出的结果是 ▲ . ——青夏教育精英家教网——...