`
周凡杨
  • 浏览: 234556 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 求素数运算

阅读更多

网络上对求素数之解数不胜数,我在此总结归纳一下,同时对一些编码,加以改进,效率有成倍热提高。


第一种:

 

原理: 6N(+-)1法
 
      任何一个自然数,总可以表示成为如下的形式之一: 6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)
      显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。所以,  除了2和3之外, 所有的素数都可以表示成6N±1的形式(N为自然数)。 根据上述分析,我们可以构造另一面筛子,  只对形如6N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。
      
      在程序上,我们可以用一个二重循环实现这一点,外循环i按3的倍数递增,内循环j为0-1的循环,则2(i+j)-1恰好就是形如6N±1的自然数。

 

 

源码:

 private static void method3(int num) {  
        long start = System.currentTimeMillis();  
        label1: for (int n = 1;; n++) {  
            label2: for (int m = 0; m <= 1; m++) {  
		                int tmp = (3 * n + m)<< 1 - 1;    //这里用位移"<<1"代替"*2" ,效率会有明显提高
		                if (tmp > num)  
		                    break label1;  
		                for (int k = 2; k * k <= tmp; k++)  
		                    if (tmp % k == 0)  
		                        if (m == 0)  
		                            continue label2;  
		                        else  
		                            continue label1;  
		                System.out.print(tmp + " ");  
            }  
        }  
        System.out.println("耗时:"+(System.currentTimeMillis()-start));  
    }  

 

   测试结果: num = 50 0000;运行100次取平均值:

 

耗时:223

 

 

第二种:

public long method4(int num) {  
	long bTime = System.currentTimeMillis();
		
	ArrayList<Integer> al = new ArrayList<Integer>(num>>1); //申请预计空间,避免扩容  
       
        for (int i = 2; i <= num; i++) {  
            boolean ok = true;  
            for (int t : al) {            // 用已有质数集作判断,减少比较次数  
                if (i % t == 0) {  
                    ok = false;  
                    break;  
                }  
                if (t * t > i) {        // 这句很关键,用小于其平方根的数整除  
                    break;  
                }  
            }  
            if (ok) {  
                al.add(i);  
            }  
        }  
	    
	    return System.currentTimeMillis()-bTime;
	}
 

测试结果: num= 50 0000;  运行100次取平均值:

 

耗时:376

 

 

 

0
2
分享到:
评论

相关推荐

    Java求质数的几种常用算法分析

    "Java求质数的几种常用算法分析" 本文主要介绍了Java中求质数的几种常用算法,并结合实例形式分析了三种比较常见的求质数算法原理及相关实现技巧。 一、根据质数的定义求质数 质数的定义是:只能被1或者自身整除...

    java求解素数环问题

    在编程领域,素数环问题是一个有趣的数学与算法结合的问题,尤其在Java中解决这个问题能够展示出编程者对算法的理解和应用能力。素数环,顾名思义,是将素数通过特定的方式连接成一个环状结构。在这个问题中,我们...

    JAVA基础经典数值运算代码75个

    这个"JAVA基础经典数值运算代码75个"集合,显然涵盖了多种基础和经典的数值运算示例,包括但不限于兔子数列(Fibonacci序列)、完数判断、素数检测以及数组中的最大和次大数等。下面我们将详细探讨这些知识点。 ...

    java语言实现求素数的原根

    原根是模一个素数p的所有非零元素的指数运算后能覆盖所有非零模p剩余类的最小正整数。简单来说,如果g是p的原根,那么对于每个1 ,存在一个k使得g^k ≡ a (mod p)。 Java编程语言可以用来实现求解素数的原根。首先...

    java使用筛选法求n以内的素数示例(java求素数)

    总之,Java中的筛选法求素数是一种实用的算法,它结合了数学原理和编程技巧,能够有效地找出一定范围内的所有素数。通过理解并实践这段代码,开发者可以深入理解素数筛选法的实现细节,并将其应用到更广泛的编程场景...

    Java学习~素数判断

    在编程领域,素数是指一个大于1的自然数,它除了1和它自身之外没有其他正因数。...在文件"**sushu**"中,可能包含了更多关于这个主题的练习或者示例代码,读者可以通过查看这些内容进一步深化对Java素数判断的理解。

    java 小程序,求素数和判断闰年

    这两个小程序可以作为学习和教学Java基础知识的实例,尤其是对于初学者来说,它们涵盖了基本的条件语句、循环结构和数学运算。同时,这些小程序也展示了如何在实际问题中应用编程思维,通过编写代码解决问题。通过...

    Java:打印出100以内的质数

    总的来说,理解并编写这样的程序可以帮助初学者掌握基本的循环、条件判断和数学运算等Java编程基础,以及培养解决问题的能力。通过这种方式,你可以逐步提升自己的编程技能,为后续更复杂的编程挑战做好准备。

    JAVA基础 第一篇:素数、合数、质数分解、最大公约数、最小公倍数.docx

    总之,理解并熟练掌握素数、合数、质数分解、最大公约数和最小公倍数的概念及计算方法,对Java程序员来说是至关重要的。这些基础知识不仅应用于初学者的练习,还常常出现在高级算法和数据结构中,是编程能力提升的...

    java打印100以内的素数

    Java打印100以内的素数是一个常见的编程练习,它涉及到基础的算法设计和Java编程技巧。素数是大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。在Java中,我们可以通过一系列步骤来实现这个功能。 首先...

    基于Java BigInteger类的大整数运算应用.pdf

    基于Java BigInteger类的大整数运算应用 大整数运算是计算机科学和数学中一个重要的研究方向,许多应用场景都需要高精度的计算,例如精确到100位的小数的黄金分割系数计算、大素数问题、梅森素数问题等。Java提供的...

    java求小于m的10个素数.docx

    这段代码展示了如何使用Java的控制流结构、数学运算和数据结构(ArrayList)来解决实际问题。此外,它还演示了如何编写可复用的函数,`isPrime()`和`findPrimeNumbers()`都可以在其他程序中单独使用,处理不同的素数...

    Java求素数和最大公约数的简单代码示例

    总结来说,这段Java代码展示了如何利用基本算法和数据结构实现求素数和分数运算的功能。在实际编程中,这些技能对于处理数学问题和优化性能至关重要。通过学习和理解这些示例,开发者可以更好地掌握Java编程,尤其是...

    大数运算器 可做逆运算

    在IT领域,大数运算器是一种专门用于处理大整数计算的工具,它能够...此外,还需要熟悉相关的编程库和语言特性,比如Python的`decimal`模块,Java的`BigInteger`类,或者C++的`gmp`库,它们提供了对大数运算的支持。

    java 判断是否为质数

    判断是否为质数,最优化的运行效率,减少性能损耗。测试计算机的运算速度。java学习的入门基础,最优化计算时间

    java 输出指定范围的素数

    在Java编程中,理解并掌握如何判断和输出素数是基本技能之一,这涉及到对整数运算、循环控制结构、条件判断以及输入输出的理解。同时,优化算法如只检查到数的平方根也是提高程序效率的重要手段。通过这个实践,...

    java课程设计-设计一个图形界面的计算器-完成简单的算术运算.doc

    【Java课程设计】本次课程设计的目标是开发一个基于图形用户界面(GUI)的计算器应用程序,能够执行基本的算术运算,包括加法、减法、乘法、除法和取余运算,同时具备小数点、正负号切换、求倒数、退格和清零功能。...

    Java开发技术大全(500个源代码).

    GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 ...

    sushu.rar_素数的判断Java

    初学者可以通过此程序了解如何在Java中进行基本的数学运算和逻辑判断,以及如何编写和运行Java程序。 【标签】"素数的判断java" 明确了该程序的核心功能,即编写Java代码来实现素数的判断逻辑。Java是一种广泛使用...

    Java大数字运算之BigInteger <font color=red>原创</font>

    在处理复杂的大整数运算时,如求最大公约数、最小公倍数,判断素数等,BigInteger类也提供了相应的方法。 总的来说,Java的BigInteger类是处理大整数计算的核心工具,它提供了完整的数学和位运算功能,确保了在进行...

Global site tag (gtag.js) - Google Analytics