1. 素数的判定
方法1:1到蛮力测试
//素数的判定
//2 到sqrt(x) 整除x,只要有一个能除尽,说明x 不是素数
BOOL isPrime1(UINT32 x)
{
switch(x)
{
case 0:
return FALSE;
case 1:
return FALSE;
case 2:
return TRUE;
case 3:
return TRUE;
default:
break;
}
//以上是处理边界情况1 2 3
for(UINT32 i = 2; i <= static_cast<UINT32>(sqrt(static_cast<float>(x)));
++i)
{
if(0U == x % i)
{
return FALSE;
}
}
return TRUE;
}
方法2:用素数表测试
//素数的判定
//如果x 不是太大,素数表的最大素数是不小于sqrt(x)的最大素数,用素数表的每个素数
//去整除x,只要有一个能整除,说明x是合数,返回FALSE;
//只有小于sqrt(x)内的所有素数都不能整除x,说明x是素数,返回TRUE
UINT32 list[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,
83,89,97,101};//sqrt(10000)内的素数表
BOOL isPrime2(UINT32 x)
{
switch(x)
{
case 0:
return FALSE;
case 1:
return FALSE;
case 2:
return TRUE;
case 3:
return TRUE;
default:
break;
}
//以上是处理边界情况1 2 3
UINT32 i = 0;
while(list[i] * list[i] <= x)
{
if(0 == x % list[i])
{
return FALSE;
}
++i;
}
return TRUE;
}
方法3:米勒-拉宾测试
令大奇数n=m+1,其中l是非负整数,m是正奇数,若1()或-1(),,则称n通过b为基的米勒-拉宾测试。
定理 如果n是奇合数,0<b<n,则使n通过Miller-Rabin测试的b的个数不超过(n-1)(即n通过b的Miller-Rabin测试的概率最高是)。
例如随机选取n,通过依次随机取的Miller-Rabin测试,n是合数的概率不超过==0.00000095,至少以0.999999的概率判定n是素数。
定理简单明了,但证明却需要许多准备。
//米勒-拉宾测试
//n=2^m*l+1
BOOL passMillerRabinTest(UINT32 n)
{
UINT<chmetcnv unitname="l" sourcevalue="32" hasspace="True" negative="False" numbertype="1" tcsc="0">32 l</chmetcnv> = 0U;
UINT<chmetcnv unitname="m" sourcevalue="32" hasspace="True" negative="False" numbertype="1" tcsc="0">32 m</chmetcnv> = n - 1;
while(0U == m % 2U)
{
l += 1;
m /= 2U;
}
UINT32 b = rand() % (n - 1U) + 1;
if(1U == modExp(b, m, n))
{
return TRUE;
}
UINT32 j = m;
for(UINT32 i = 0U; i < l; ++i)
{
if(modExp(b, j, n) == n - 1)
{
return TRUE;
}
j *= 2;
}
return FALSE;
}
2. 产生一个素数
在实际应用中,经常需要大素数,产生大素数的过程如下:
(1)产生一个n位随机数p(n位二进制);
(2)将最高位和最低为置为1(最高位置1保证了产生的素数足够大,而最低位为1保证为奇数);
(3)检查p是否能被小素数整除:3,5,7,11等。许多实际应用中都用小于256的所有素数去除p;
(4)对于随机数a,进行Miller-Rabin测试,如果p通过了,则产生另一个随机数a再进行测试。选择值小一些的额a可以令计算更快。做5次测试,只要p没有通过其中的一次,转(1)重新开始;
另一种方法不是每次产生一个随机数,而是从一个起始数开始逐次递增,直到找到素数。
步骤(3)是可选的,但很有用。测试一个随机奇数p是否能被3,5,7整除,可以在第(4)步测试前去掉54%的基数,用100以内的素数测试可以去掉76%的奇数,而用256以内的素数测试可以去掉80%的奇数。一般地,奇数中不为任何小于n的素数的倍数的数的比例占1.12/lnn。
查看原文
分享到:
相关推荐
**质数**(或称为素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。质数是数论中的基本概念之一,在密码学、计算机科学以及其他数学领域都有着广泛的应用。 #### 二、1亿以内质数的数量 根据...
标题 "50000000(五千万)以内质数(素数)3001134(约三百万)个.zip" 暗示了这个压缩包包含了一个文本文件,列出了从1到50,000,000之间所有约300万个质数。描述中的 "普通pc演算(i7处理器)" 表明这些质数是通过一台搭载...
这里我们关注的是一个名为“求解第N个质数(第N个素数)vs2010项目”的项目,该项目使用了Visual Studio 2010作为开发环境。这个项目的目标是高效地找到序列中的第N个质数,这里的N可能是任意正整数。项目中采用的...
在IT领域,尤其是在移动应用开发中,开发一个用于显示质数和素数的数学工具的手机APP是一项常见的任务。这个Android项目源码提供了一个这样的工具,帮助用户理解和探索这两个重要的数学概念。以下是对这个项目的详细...
在编程领域,素数或质数是指大于1且仅能被1和其本身整除的自然数。在Java中实现打印素数的程序是一项基础但重要的任务,这有助于理解和掌握循环、条件判断以及数学逻辑在编程中的应用。下面将详细解释如何通过Java...
素数(Prime Number),又称质数,是只能被1和自身整除的大于1的自然数。例如,2、3、5、7等。 #### 判断方法 在代码中,`isPrimer` 函数用于判断一个给定的整数 `n` 是否为素数。具体步骤如下: - 遍历从1到`n/2`...
素数环,又称为“质数环”,是指一组正整数排列成环状,其中任意相邻两个数之和都是一个质数。这个问题源于数论中的组合构造问题,它要求找到这样的一个环,使得环上的每个元素都是正整数,并且满足特定的条件。在给...
素数,又称质数,是大于1且只有两个正因子(1和自身)的自然数。在数学领域,素数的研究具有重要的理论价值,因为它们是构建所有正整数的基础,就如同基本的积木一样。在给定的标题“14988613以内的素数(质数)表”...
//【程序2】 //题目:判断101-200之间有多少个素数,并输出所有素数。 //程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数), //如果能被整除, 则表明此数不是素数,反之是素数。
### 两百万的素数(质数) #### 知识点概述 在数学领域中,素数(或称质数)是指只能被1和自身整除的大于1的自然数。素数是数论研究中的核心概念之一,在密码学、算法设计及多种科学计算中具有极其重要的作用。...
总之,理解并熟练掌握素数、合数、质数分解、最大公约数和最小公倍数的概念及计算方法,对Java程序员来说是至关重要的。这些基础知识不仅应用于初学者的练习,还常常出现在高级算法和数据结构中,是编程能力提升的...
质数(素数)是数学领域的一个重要概念,指大于1且仅能被1和它自身整除的正整数。在计算机科学中,尤其是在密码学、算法设计和数论等领域,质数计算扮演着至关重要的角色。这篇讨论将聚焦于如何在Delphi编程环境中...
回文质数是一种特殊的素数,它同时具备回文数的特性,即无论从左向右读还是从右向左读都是一样的数字。例如,11、121、1331等都是回文质数。在编程领域,求解一定范围内的回文质数是一项常见的算法挑战,这个挑战...
判断质数 素数的多种方法 在计算机科学中,判断一个数是否为质数是非常重要的一步骤。质数是大于1的自然数,且仅能被1和本身整除。判断质数的方法有多种,本文将对常见的判断质数的方法进行总结和分析。 1. Trial ...
在Android开发领域,创建一个专门显示质数和素数的数学工具是一项技术性强且具有挑战性的任务。这个项目源码的出现,为开发者提供了一个学习和研究的好平台,特别是对于那些对算法和移动应用开发有兴趣的人。下面...
在编程领域,尤其是在数学和算法相关的任务中,我们经常需要处理一些基础的数学问题,比如素数(质数)的判断和操作。本主题聚焦于一个著名的未解决数学猜想——哥德巴赫猜想。这个猜想是由18世纪的普鲁士数学家...
### 100万以内的素数表 #### 知识点概述 本文将详细介绍“100万以内的素数表”的相关知识点,包括素数的基本概念、素数的重要性以及如何生成和应用素数表等内容。 #### 素数的基本概念 **素数**(Prime Number)指...
在编程领域,质数(素数)是计算机科学中的一个重要概念,特别是在算法设计和数论中。质数是指大于1且只有1和其本身两个正因数的自然数。本主题将围绕“cpp”(C++编程语言)来讨论如何高效地判断一个数是否为质数,...
自定义函数求素数(质数).py
素数(prime number)又称质数,有无限个。除了1和它本身外,不能被其他自然数整除。换句话说就是该数除了1和它本身以外不再有其他的因数的数。 注意:最小的素数是2。 话不多说,上代码! prime=[] #用一个列表来存储...