质数的一些问题

质数

质数的定义

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

质数的实际的物理的意义

    素数也叫质数,大家在小学时就学过,就是只能被1和它本身整除的数,例如2,3,5,7,11,13,17,19,23等。这原本是一个非常简单的概念,但许多数学家却对素数情有独钟,废寝忘食地研究这些素数之间的规律和最大素数。

目前已知最大的素数是(2的82589933次)-1,这个数字的位数将近2500万位,在2018年由帕特里克·拉罗什发现;日本的一家出版社为了纪念此前,2017年时发现的最大素数,还出版了一本书,名字就叫最大的素数,全书的内容就是一串数字,4天时间卖到脱销;美国也曾有科研机构悬赏10万美元,寻求更大的素数。

很多读者有疑惑:纯粹研究这些数字既不能让百姓吃饱饭,对我们生活也没影响,并且欧几里得在他的《几何原本》中也证明,素数是无限多的,那研究素数有什么意义呢?

素数与信息安全

素数最主要的应用在密码学-RSA加密,它在网络安全领域中相当重要,利用素数对信息进行加密可以保护国家情报和战时的军事机密,使安全性大大提高。

举个例子,数字60我们可以将它分解成2×30,而30又可以分解成2×3×5,也就是说数字60可以由2,3,5这几个素数构成,这几个数字是不能继续分解的,整个过程被称为60的质因数分解。根据这个道理,如果将几个极大的素数a,b,c相乘,得到数字A。对于一个不知道任何信息的外部人员来说,想要对A质因数分解是相当困难的,重点是数学界也没有找到对极大数的快速质因数分解的算法。所以在战争时期,重要信息加入大量素数进行加密,哪怕被敌方截获也无法破解获得真实情报。

对于素数的获取,数学家考虑从毫无规律的圆周率中寻找,生成拼接素数,产生真正完全的随机数字。这比电脑产生的随机数字都安全,毕竟电脑也是由程序设计出来的,产生的随机数其实并非真正的随机数。

看似与我们生活毫不相关的素数,其实时刻都在保护国家安全。

素数与机械工业

素数之间的分布规律也有其它用处,例如机械齿轮的齿数,一大一小两个齿轮之间的设计和素数有很大关系。大小齿轮的齿数都是素数,可以增加两齿轮内两个相同的齿相遇次数的最小公倍数,说的简单一些就是能使磨损更均匀一些,可以增加耐用度减少机械故障,汽车齿轮的齿数就是按照这个规律设计的,这和人类生活紧密相关。

素数与生物

从实践中发现,农药的使用周期以素数次数的使用最为合理。这考虑了害虫体内产生的抗药性、害虫的繁殖周期、喷洒农药后害虫对农作物的损害情况等综合考虑的结果。

科学家还发现许多物种的生命周期和素数有一定关系,如果某地需要引进新物种,就必须降低此物种和天敌相遇的几率,就需要提前通过生命周期和素数的关系进行演算。
上面是我摘取一个博士的文章。

java实现求质数个数效率高的一个测试程序

public static void test4(int n){
       long start = System.currentTimeMillis();    //取开始时间
       //素数总和
       int sum = 0;
       int num[] = new int[n];
       num[0] = 1;          //由于1规定不是素数,所以要提前用1标值
       //根据埃氏筛法的结论,要得到自然数  N 以内的全部素数,必须把不大于" 二次根号  N "的所有素数的倍数剔除,剩下的就是素数
       /**这是基本的规定!*/
       double prescription = Math.sqrt(n);/**因数都是成对的存在的,还需要去去除 n^2的数去除,其他的就是对质数了.*/
       for (int i = 2; i <= prescription; i++) {
           //开始把所有素数的倍数剔除,剩下的就是素数
           if(isPrime(i)) {
               for (int j = i*i; j <= n; j+=i) {//表示的是i的倍数的实现,去除所有的倍数的东西
                   num[j-1] = 1;   //把素数的倍数剔除,也就是赋值为1,不是素数就是合数
               }

           }
       }

       for (int i = 0; i < num.length; i++) {
           if(num[i]==0)
               sum++;//对于是0数字标记为是素数的意思了。
       }
       System.out.println(n+"以内的素数有"+sum+"个");
       long end = System.currentTimeMillis();
       System.out.println("The time cost is " + (end - start));
   }

   public static boolean isPrime(int n) {
       for (int i = 2; i < n; i++)
           if (n % i == 0)
               // 有其他整除因子
               return false;
       return true;
   }
   

一起进步吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值