`
heisedeyueya
  • 浏览: 97737 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

求素数的几种算法

阅读更多
问题背景:最近在论坛上看见了关于素数的求解问题,所有收集了相关资料真理了几个常用的求素数的算法,希望对有兴趣的朋友提供方便

  • (优化后的)基本算法
  • 筛选法
  • 6N+-1发(其实也是一种筛选法,只是构造的筛子更细了,提高了效率)

一、基本方法
  • 方法描述:这种方法是通过n%i?=0,{i|2,3,...i*i=n}如果=0,那么n不是素数,结束本次循环
  • 性能测试:num=50000,时间:80ms
  • 总结:算法简单,但是效率其实还是挺搞的,因为在取模的时候,只要条件第一次不成立(n%m==0)那么就不再测试这个数,即跳出本次循环。算法的时间复杂度是很接近于O(n)的。

private static void prime(int num) {
		long start = System.currentTimeMillis();
		int m, n;
		label: for (n = 2; n <= num; n++) {
			for (m = 2; m * m <= n; m++) {
				if (n % m == 0) {
					continue label;
				}
			}
//太多了可能myeclipce中看不到打印结果,可以用num=100,测试
			System.out.print(n + " ");
		}
		System.out.println();
		System.out.print("时间:");
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}

二、筛选法
算法描述:算法的思想是打表,先初始化一个数组{2,3,4,...,n}

    我们以n=30为例
    一、初始化表:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
    二、把第一个数(2)取出来,去掉所有可以被2整除的数。
    2 3 5 7 9 11 13 15 17 19 21 23 25 27 29
    三、取第二个数(3),去掉所有可以被 3整除的数。
    2 3 5 7 11 13 17 19 23 25 29
    四、取第三个数(5),因为4已经被去除了,再去掉所有可以被5整除的数。
    2 3 5 7 11 13 17 19 23 29
    五、取第四个数(7)7*7>30所以停止。
  • 性能测试:num=50000,时间:24680ms
  • 总结:此算法在理论上的效率其实是挺高的,但是实际在实现时是不可取的。




private static void prime3(int n) {
		long start = System.currentTimeMillis();
		List<Integer> list = new LinkedList<Integer>();
		for (int i = 2; i <= n; i++) {
			list.add(i);
		}
		for (int j = 0; j < list.size() && list.get(j) * list.get(j) <= n; j++) {
			for (int k = 0; k < list.size(); k++) {
				if ((list.get(k) != list.get(j))
						&& list.get(k) % list.get(j) == 0) {
					list.remove(k);
				}
			}
		}
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + " ");
		}
		System.out.println();
		System.out.print("时间:");
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}

三、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为自然数)。 根据上述分析,我们可以构造另一面筛子,只对形如6
    N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。
    在程序上,我们可以用一个二重循环实现这一点,外循环i按3的倍数递增,内循环j为0-1的循环,则2(i+j)-1恰好就是形如6N±1的自然数。
  • 性能测试:num=50000,时间:50ms
  • 总结:此算法,其实也是一种筛选算法,只是筛子更细,能够将整数中大约2/3的数筛选出去。所以效率很高


private static void prime2(int num) {
		long start = System.currentTimeMillis();
		for (int n = 2; n <= 3; n++) {
			System.out.print(n + " ");
		}
		label1: for (int n = 1;; n++) {
			label2: for (int m = 0; m <= 1; m++) {
				int tmp = 2 * (3 * n + m) - 1;
				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.out.print("时间:");
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}
分享到:
评论
2 楼 heisedeyueya 2011-09-19  
SMCwwh 写道
方法2,可以有更好的实现。

这个是我个人的实现方法,其实这种方法本身是不可取的,因为链表的访问本身是比较耗费时间的,我是为了实现这个算法本身而写的实现,希望可以看到更好的实现,您有什么好的思路希望能分享一下
1 楼 SMCwwh 2011-09-19  
方法2,可以有更好的实现。

相关推荐

    ACM素数的几种判断方法和实现

    本文介绍了ACM竞赛中常用的几种素数判断方法,从最简单的尝试除法到基于概率的米勒-拉宾算法,每种方法都有其适用场景。对于小范围的素数检测,朴素方法和埃拉托斯特尼筛选法是非常有效的;而对于大范围或需要高精度...

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

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

    素数判定的几种算法范文

    本文将探讨几种常见的素数判定算法。 1. **简单筛选法(埃拉托斯特尼筛法)** 这是一种基于排除法的简单算法,从2开始,将所有2的倍数标记为非素数,然后选择下一个未标记的数(3),将其所有倍数标记,依次类推。...

    素数最优算法

    在探讨“素数最优算法”这一主题时,我们首先需要理解什么是素数,以及为何寻找素数的方法在计算机科学和数学领域中具有重要意义。素数,即只能被1和自身整除的大于1的自然数,是数论研究的基础元素之一,其特性在...

    python编程-100以内素数几种编程求解方法.docx

    Python 编程 -100 以内素数几种编程求解方法 Python 编程语言提供了多种方法来解决 100 以内的素数问题。下面我们将逐步讲解每种方法。 方法一:简单遍历 在第一个方法中,我们使用 for 循环来遍历从 2 到 100 的...

    素数判断的几种方法代码实现及其复杂度分析

    本文将探讨几种常见的素数判断方法的代码实现,并对其时间复杂度进行分析。 首先,最朴素的方法是直接遍历从2到n-1的所有整数,检查是否有数能够整除n。如果都找不到能整除n的数,则n为素数。这种方法的时间复杂度...

    简易素数算法导出的经典素数算法

    本篇文章将深入探讨几种经典的素数检测算法,这些算法适用于计算机编程,特别是对于参与ACM竞赛的学生来说,理解并掌握它们是十分有益的。 1. **基础判断法**: 最基础的素数检测方法是遍历从2到n-1的所有整数,...

    AKS素数检测算法(多项式时间内检测)

    AKS算法提供了一种新的高效方法,可以用来生成或验证大素数的有效性。 3. **复杂性理论**:该算法还推动了计算复杂性理论的发展,特别是关于NP类问题的研究,即那些能在多项式时间内验证解正确性的决策问题。 #### ...

    python编程-100以内素数几种编程求解方法.pdf

    Python 编程——100 以内素数几种编程求解方法 Python 编程中,求解 100 以内的素数有多种方法,本文将介绍四种不同的方法来解决这个问题。 方法一:简单遍历 在方法一中,我们使用了一个简单的遍历算法,遍历从 ...

    概率算法求素数(c语言)

    ### 概率算法求素数(C语言) #### 实验目的与背景 本实验旨在通过C语言实现一种基于概率的方法来查找一定范围内的素数。概率算法是一种在计算机科学和数学领域广泛应用的技术,特别是在处理复杂问题时,它可以...

    sushu.rar_java 素数_求素数

    求素数的方法有很多,其中一种常见的方法是埃拉托斯特尼筛法(Sieve of Eratosthenes)。 在Java中,求素数的基本步骤可能包括以下几个部分: 1. 创建一个布尔数组,大小为51,因为我们要找的是1到50的素数。数组...

    不同存储方式上求素数的

    本文将重点讨论在简单变量、数组、集合、文件和链表这几种存储方式上求解素数的具体算法。 ### 二、不同存储方式下的求素数算法 #### (一) 算法一:用循环变量存储数据 这种算法主要利用循环变量来存储和处理数据...

    算法-素数方阵(信息学奥赛一本通-T1446).rar

    《算法-素数方阵(信息学奥赛一本通-T1446)》这个压缩包文件中的核心主题是素数方阵,这是在信息学奥林匹克竞赛中常见的一种算法问题。素数,作为数学的基本元素,是所有正整数的基础,而素数方阵则是将素数排列成...

    python判断素数的几种方式

    本文将深入探讨几种不同的Python方法来实现这一功能。 1. **基础循环法** 最简单的方法是通过循环检查每个数字是否能整除输入的数。以下是一个基础示例: ```python def is_prime(n): if n return False for...

    利用JAVA,求素数和。

    - **埃拉托斯特尼筛法(Sieve of Eratosthenes)**:这是一种经典的寻找所有小于一定数目的素数的方法。虽然在本问题中不需要完整的筛法,但理解它是找出素数的重要基础。 - **直接判断**:对于较小的数字,可以...

    RSA算法中大素数的快速生成方法研究 (1).pdf

    本文将详细介绍几种大素数测试方法,并探讨如何通过计算机实现这些算法,从而快速有效地生成大素数。 #### 二、RSA算法与大素数的关系 RSA算法的安全基础在于两个大素数的乘积难以被分解。具体而言,RSA算法的操作...

    随机生成大素数

    在实际应用中,我们还会考虑优化,比如使用更强的素性测试算法,或者结合其他方法,如BLS素数生成算法,以提高效率和安全性。同时,为了防止小概率事件导致无限循环,通常会设置一个最大尝试次数。 总结来说,随机...

    求最大素数

    通过上述分析,我们不仅理解了如何在Java中实现求最大素数的算法,还学习了关于输入输出处理、算法优化以及基本语法和数据类型的知识点。这些知识对于初学者理解和掌握Java编程语言至关重要,同时也为更复杂问题的...

Global site tag (gtag.js) - Google Analytics