美文网首页
素数算法

素数算法

作者: KN郑某某 | 来源:发表于2021-02-26 08:41 被阅读0次

素数在计算机中经常被运用于计算机安全(密码相关的计算),所以研究一下素数的判断算法是相当有必要的。所以现在就来看一下两种比较常见的算法,试除法和Eratosthenes算法吧!

1、试除法

用需要验证的数 N 逐个除以从 2 开始至 N-1 中的所有数,若能被一个数整除,表示它有一个因数,说明数 N 不是素数;若一直到 N-1 都不能被整除,则说明 N 是素数。(当然我们对于因数的判断不必计算到 N-1,只需要到 \sqrt N 就可以了)

    public class Prime {

    public static boolean IsPrime(int num){
        for(int i=2;i*i<=num;++i){
            if(num % i==0){
                return false;
            }
        }
        return true;
    }

    public static void Usual(int size){
        int index = 0;
        for(int j=2;j<=size;++j){
            if(IsPrime(j)){
                index++;
                System.out.print(j + " ");
                if(index%10==0) System.out.print('\n');
            }
        }
    }

    public static void main(String[] args) {
        Usual(10000);
    }
    }

2、Eratosthenes算法

Eratosthenes算法的实现,其实就像是一个筛子,每次过滤掉合数,最后剩下的就是素数了,例如:如果要找出2~10000之间所有素数的算法,可以先过滤调用 2 的倍数,再过滤掉 3 的倍数,依次再5,7,11,13...97 就是\sqrt {10000}
以内的所有素数。剩下的就都是素数了。

    public class Prime {

    public static void Eratosthenes(int size){
        boolean[] nums = new boolean[size];
        // false 代表是素数,默认是素数,关键的实现方式如下
        for(int i=2;i*i<size;++i){
            if(!nums[i]){
                //利用j+=i来判断倍数,这里从j从i*i开始
                for(int j=i*i;j<size;j+=i){
                    nums[j]=true;
                }
            }
        }
        int index = 0;
        for(int i=2;i<size;++i){
            if(!nums[i]){
                index++;
                System.out.print(i + " ");
                if(index%10==0) System.out.print('\n');
            }
        }

    public static void main(String[] args) {
        Usual(10000);
    }
    }

两种方法测试1000000个数据中找素数,对比如下


    public class Prime {
    
        public static boolean IsPrime(int num){
            for(int i=2;i*i<=num;++i){
                if(num % i==0){
                    return false;
                }
            }
            return true;
        }
    
        public static void Usual(int size){
            int length=0;
            for(int j=2;j<=size;++j){
                if(IsPrime(j)){length++;}
            }
            System.out.println(length);
        }
    
    
        public static void Eratosthenes(int size){
            int length=0;
            boolean[] nums = new boolean[size];
            // false 代表是素数,默认是素数
            for(int i=2;i*2<size;++i){
                if(!nums[i]){
                    for(int j=i*2;j<size;j+=i){
                        nums[j]=true;
                    }
                }
            }
            for(int i=2;i<size;++i)if(!nums[i])length++;
            System.out.println(length);
        }
    
    
        public static void main(String[] args) {
            long last = System.currentTimeMillis();
            Usual(1000000);
            long now = System.currentTimeMillis();
            System.out.println("TotalTime:"+(now-last));
            last = now;
            Eratosthenes(1000000);
            now = System.currentTimeMillis();
            System.out.println("TotalTime:"+(now-last));
        }
    }

结果:

78498
TotalTime:798
78498
TotalTime:127

显然,Eratosthenes算法效率高得多了。

相关文章

  • Android 每日算法:猫扑素数、单词反转

    经典算法集锦,不定时更新 一、素数(质数)算法 定义: 质数(prime number)又称素数,有无限个。质数定...

  • 2019-03-24

    今天写下来,关于筛子算法,计算素数,针对大数的判断。简单写一下算法,假设计算40000以内的素数。 筛子算法, 百...

  • RSA加密解密算法—数论基础

    本章涉及知识点1、素数的定义2、寻找素数算法—短除法3、寻找素数算法—筛选法4、互质关系5、欧拉函数的证明6、欧拉...

  • 素数算法

    寻找素数的算法有很多,最著名应是筛选法,以下是笔者用JavaScript编写的一个找素数的函数,借鉴了各种找素数的...

  • 素数算法

    素数在计算机中经常被运用于计算机安全(密码相关的计算),所以研究一下素数的判断算法是相当有必要的。所以现在就来看一...

  • 产品经理要懂点数学(2)

    关键词:对称加密算法,RSA算法,素数(质数),素数分布,数论。 历史 1976年以前,所有的加密方法都是同一种模...

  • 素数

    素数 素数就是只能被1和其自身整除,且大于1的自然数RSA算法中用到大素数 判断n是否为素数,简单的方法是将n按顺...

  • 【算法】猫扑素数

    求自然数n内所有猫扑素数 猫扑数:指以2开头,后面跟任意个3的十进制数。如:2、23、233等。 素数(质数):在...

  • 求素数算法

    已知前两2为素素,则2×X(X为正整数且X!=0)都为合数。 以此为根据,新建一个Boolean类型的数组,素数则...

  • 求素数算法

    已知前两2为素素,则2×X(X为正整数且X!=0)都为合数。 以此为根据,新建一个Boolean类型的数组,素数则...

网友评论

      本文标题:素数算法

      本文链接:https://www.haomeiwen.com/subject/mhwhxltx.html