素数的判定与筛法

判定:很简单嘛!暴力大法参上!

#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 素数 五行_【数论】素数的判定与筛法相关推荐

  1. python找素数程序_求素数python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 质数(prime number),又称素数,指在大于1的自然数中,除了1和该数自 ...

  2. java梅森素数计算程序_梅森素数计算器(prime95)

    梅森素数计算器(prime95) 用来帮助用户寻找梅森素数的计算工具 原文介绍: Prime95 is a small and easy to use application that allows ...

  3. java超级素数算法_计算机二级VB基础之素数算法

    众所周知计算机二级VB考试除了考察累加.最值.约数因子以及进制转化之外还会考察素数的算法.那么到底二级VB中的素数算法是怎么样的呢?为此在本文中课课家笔者就为大家简单介绍其含义和具体的算法,并给出相应 ...

  4. 用java求1000之内的素数_java求1000以内的素数

    .out.println("周长为:"+ bianChang*4); System.out.println("面积为:"+ bianChang*bianChan ...

  5. python输出超级素数_超级素数(sprime)

    超级素数(sprime) 题目描述 超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数为质数,例如: 373->37->3 这是一个长为3的超级素数. 输入 输入一个整数n (10 ...

  6. java判断一个整数是不是素数(质数)

    java判断一个整数是不是素数(质数) /*** 判断一个数是不是素数(质数)* 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.*/import java.util.Scann ...

  7. Java判断一个数是不是素数

    [java] view plaincopy import java.util.Scanner; //质数又称素数,是指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数 publi ...

  8. matlab 判断整除函数_判断素数函数

    描述 写一个函数isPrime(n)用于判断一个数字n是不是素数,用户输入一个正整数,在一行内输出不大于该数的所有素数,各数后面用一个空格分隔. 输入格式 输入一个正整数 输出格式 不大于该数的所有素 ...

  9. 自然数 素数 质数_俄罗斯娃娃素数

    自然数 素数 质数 As a child, weren't you in wonder of Russian Dolls, and where you learnt how the dolls fit ...

最新文章

  1. java兩個矩陣相乘_Day12 練習java-矩陣乘法
  2. 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程(权重,盒子模型)
  3. 台湾大学林轩田机器学习基石课程学习笔记1 -- The Learning Problem
  4. rpm部署mysql_使用rpm快速安装部署MySQL5.6以及主从设置
  5. 如何杀掉可恶的Notkelvir病毒
  6. 【PL/SQL】 控制结构
  7. matlab 命令集结(1)
  8. redis、mysql、和php原生array数组效率对比
  9. AQS框架之南风北巷
  10. 蓦然回首,会员制CRM就在下里巴人处
  11. 软件工程师——计算机组成原理
  12. 草图大师卡死后找到自动保存备份文件的3种解决方法
  13. Word如何拆分单元格
  14. 一篇文章讲清什么是零知识证明
  15. 【小程序源码合集】云开发前后端完整代码,大学生校园社团体管理活动预约微信小程序源码
  16. 小傻蛋的妹妹跟随小甲鱼学习Python的第四节004
  17. rj45插座尺寸图_RJ45、RJ11 插座系列产品技术参数(中英文)
  18. 【技术分享】 ​IE浏览器漏洞利用技术的演变 ( 二 )
  19. java castor_Castor简单介绍
  20. 盲源分离matlab程序,分享一些盲源分离的代码及相关网址

热门文章

  1. mysql查询每个机构下的账号总数_MySQL高可用方案:实践篇
  2. pandas fillna_6个提升效率的pandas小技巧
  3. 数组排序c语言函数_C语言如何写出返回数组最大最小值之差的函数(C primer plus 10-5)...
  4. 安装包镜像_创建 macOS Catalina cdr格式镜像安装包
  5. python编程定义圆_Python语言编程系列014——PyQt中自定义圆形指示灯
  6. python把桢写入txt_Java 字节码与字节码分析
  7. python程序中断时,输出打印日志
  8. lstm解决梯度消失
  9. HTML中的5种空格表示,HTML中的5种空格各表示的意义
  10. 计算机程序输入x是3求输出七年级的题,如图所示是计算机程序计算,若开始输入,则最后输出的结果是  ▲  .  ——青夏教育精英家教网——...