寻找大素数算法

寻找大素数算法packageprimeNumber;importjava.util.Arrays;importjava.util.Scanner;/***本文系作者高中时候与同学讨论的结果生成结果是依据素数定理推倒而来依据此公式可以求出无限大的素数但非公理次计算结果虽然可以求无限大的素数但仍需验证**@author王伟2020-3-18**/publi…

大家好,又见面了,我是你们的朋友全栈君。

package primeNumber;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 本文系作者高中时候与同学讨论的结果生成 结果是依据素数定理推倒而来 依据此公式可以求出无限大的素数 但非公理 次计算结果虽然可以求无限大的素数 但仍需验证
 * 
 */
public class primeNumber {

    public static void main(String[] args) {

        // 调用方法输入阶乘范围(long 类型仅支持70以内的阶乘)
        Scanner scan = new Scanner(System.in);
        int num = Integer.parseInt(scan.next());
        int[] primeArray = primes(num);
        // long 类型仅能支持70以内的阶乘
        long p = 1;
        // 阶乘范围内的所有素数
        // i从1开始 因为后面还需加减2的
        for (int i = 1; i < primeArray.length; i++) {

            p *= primeArray[i];
        }
        /*
         * 根据素数定理 间隔log e (mun)一定会出现一个素数 且当num的值越大概率随之增大(详询百度百科)
         * 所以p±2^n有非常大概率是素数(n正整数) 并且num数值越大存在的素数越多
         */
        for (int i = 0; i < 20; i++) {

            System.out.println(i);
            System.out.println(Math.round(p + Math.pow(2, i)));
            // 分解验证
            getPrimer(Math.round(p + Math.pow(2, i)));

        }
    }

    // 寻找小范围内所有素数
    public static int[] primes(int n) {

        if (n < 0) {

            throw new IllegalArgumentException(
                    “N must be a non negative integer.”);
        }
        if (n <= 1) {

            return new int[0];
        }
        int len = ((n & 1) == 1) ? (n >> 1) + 1 : n >> 1;
        boolean[] p = new boolean[len + 1];
        for (int k = 3, limit = (int) Math.sqrt(n); k <= limit; k += 2) {

            if (!p[(k + 1) >> 1]) {

                for (int j = (k * k + 1) >> 1; j <= len; j += k) {

                    p[j] = true;
                }
            }
        }
        int primeNums = 0;
        /* 获取精确的素数数量,以免开辟过大的数组造成空间不足的情况。 */
        for (int i = 1; i <= len; i++) {

            if (!p[i]) {

                primeNums++;
            }
        }
        int[] primeArray = new int[primeNums];
        primeArray[0] = 2;
        int count = 1;
        for (int i = 2; i <= len; i++) {

            if (!p[i]) {

                primeArray[count++] = i * 2 – 1;
            }
        }
        return Arrays.copyOf(primeArray, count);
    }

    // 分解大数的质数因子 验证
    public static void getPrimer(long num) {

        for (int i = 2; i <= num; i++) {

            if (num % i == 0) {

                System.out.print(i + ” “);
                getPrimer(num / i);
                break;
            }
            if (i == num) {

                System.out.print(i + “”);
            }
        }
    }
}
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150327.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • py 2021.5.2激活码【在线注册码/序列号/破解码】[通俗易懂]

    py 2021.5.2激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    167
  • lrzsz 安装

    lrzsz 安装本文是记录lrzsz的安装过程1、从下面的网站下载lrzsz-1.12.20.tar.gzhttp://www.filewatcher.com/m/lrzsz-0.12.20.tar.gz.280938.0.0.html2、查看里面的INSTALL文档了解安装参数说明和细节3、解压文件tarzxvflrzsz-1.12.20.tar.gz4、进入目录cdlrzs

    2022年6月23日
    26
  • onedrive免费扩容15g_onedrive怎样免费扩容

    onedrive免费扩容15g_onedrive怎样免费扩容免费扩容onedrive最高可以免费获得10G,每邀请一个新用户就可以双方共同获得0.5G内存扩容链接:https://onedrive.live.com?invref=2ef0e90fd6f1bed7&invscr=90

    2022年9月10日
    0
  • 激光雷达和超声波雷达区别_雷达是超声波还是电磁波

    激光雷达和超声波雷达区别_雷达是超声波还是电磁波转自:http://www.sohu.com/a/201826967_524185不知何时,自动驾驶技术从电影中跳出来,直接被拉到人们视野中。不过,去年特斯拉却因为几起自动驾驶事故,官网不得不把自动驾驶字眼改为辅助驾驶。本期《汽车总动员》讨论的不是自动驾驶,而是被称为自动驾驶汽车“眼睛”的雷达。目前主流的“眼睛”有四类——毫米波雷达、激光雷达、超声波雷达、摄像头。他们各自都有自己的特点,比如摄像头…

    2022年9月12日
    0
  • Spring整合mybatis完整示例

    Spring整合mybatis完整示例Spring整合mybatis完整示例  实现功能:根据id查找用户信息。 1、首先创建一个与表中数据相对应的实体类,User.javapackagebean;publicclassUser{intid;Stringname;intage;Stringsex;Stringschool;pu…

    2022年4月29日
    27
  • Java 最常见的 200+ 面试题:面试必备「建议收藏」

    这份面试清单是从我2015年做了TeamLeader之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在Java技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从2009年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢?说回面试的事,这份面试…

    2022年4月1日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号