寻找大素数算法_我找到素数规律了

(3) 2024-06-01 19:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说寻找大素数算法_我找到素数规律了,希望能够帮助你!!!。

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 + "");
            }
        }
    }
}
 

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复