作者:mobiledu2502916313 | 来源:互联网 | 2023-03-19 05:58
不明白。为什么,望指教
/**
n>=3 and n is odd.
*/
int isPrime(int n)
{
int k, upperBound=n/2;
for(k=3; k<=upperBound; k+=2)
{
upperBound=n/k;
if(n%k==0)
return 0;
}
return 1;
}
46 个解决方案
假设n=A*B 则只需要测试不大于min(A,B)的数就能找到n的一个因子,每次加2而不会漏掉因子二是因为假设
n=2*A(则经过有限次后k会到达A),能找到n的一个因子A,同样不会误判n为素数
upperBound 应该是N^1/2(根号N)取整才比较节约时间吧?
换言之,一个数N,你为了判断它是否为质数,就开始试除3、5、7...但是,如果当除以(N^1/2取整,记为m)这个数的时候还没有能够除尽,那么就没有继续下去的必要了。因为假设N存在一个比m大的因数k,那么N/k是小于m的,这跟上述条件(N除以3、5、7...m都不能除尽)产生了矛盾
素数测试,
如果只保证一个很高概率成立的话
有更快的办法。
实际上 upperbound就固定成sqrt(n)就成了
这样就好理解了吧,这是判断素数最简单的办法了
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。素数在数论中有着很重要的地位。
最小的素数是2, 他也是唯一的偶素数。 最前面的素数依次排列为:2,3,5,7,11,13,17,...... 不是质数且大于1的正整数称为合数。 质数表上的质数请见素数表。 依据定义得公式: 设A=n2+b=(n-x)(n+y),除n-x=1以外无正整数。故有: y=(b+nx)/(n-x) (x
算术基本定理
算术基本定理: 任何大于1的正整数n可以唯一表示成有限个素数的乘积: n=p_1p_2...p_s, 这里p_1≦p_2 ≦...≦p_s是素数。 这一表达式也称为n的标准分解式。 算术基本定理是初等数论中最基本的定理。由此定理, 我们可以重新定义两个整数的最大公因子和最小公倍数等等概念。 1不能称作素数,是因为要确保算术基本定理所要求的唯一性成立。这一解释可参看华罗庚《数论导引》
[编辑本段]素数分布问题
素数分布问题,就是指素数在正整数集或其特殊子集中的分布情况,比如素数个数问题等等。这方面的结果如下; (1)欧几里得以反证法证明了素数个数无限;欧拉利用解析方法也证明了此结论。 (2)高斯提出著名的素数定理(当时是猜想,后被证明): 设π(x)是不超过x的素数个数, 那么极限(x趋向于无穷) lim π(x)/(x/Ln x)=1 更好的逼近公式有高斯提出的li(x)函数, 即lim π(x)/lix=1。 其中 (3) 狄利克雷 证明了任何等差数列: a, a+d,a+2d,...a+nd,... (这里a,d互质)中都包含无限个素数。 (4) 兰伯特猜想(已被证明): 在n和2n之间必定存在一个素数, 这里n是大于1的正整数。
呵呵,谭浩强的c语言里好像提到判断到根号n就可以了
说快的话,LZ给的方法不算太快,当n很大的时候,效率比较低。
一般常用的是米勒-罗宾,log(n)^2应该可以搞定,前几年,印度的科学家给出了一种测试方法,
是确定的并且时间复杂度为常数,不过常数比较大,大概10^8左右,在实际应用当中,一般比不上米勒-罗宾。
讨论是否是多项式算法是依照输入数据的
长度来算的。这里如果n是数值的话那log(n)才是长度。在log(n)上可以12次方做出来所以PRIMES is in P了咯
试了一下:
isPrime(8)
返回1
有问题吧?
貌似偶数都没排除。。
应该是楼主少添加了一个判断if(n&1)
如果是素性检验的话,miler那个只是以很高概率的保证是素数。信安数基没怎么好好看,老师讲解RSA的也没怎么听。
http://www.cnblogs.com/skyivben/archive/2010/07/10/1775001.html
判断素数的最快算法……我也不知道,只知道两种比较快的,
一种是在根号N内的所有素数一一试除
还有一种是概率算法,用费马小定理的逆定理(当然不成立,所以只是概率算法)
满足a^(n-1) mod n=1 的合数是非常少的,听说用取a=2,3,5,7,11,13测试在maxlongint(pascal语言中最大长整形数)只有1个是合数
算法可以参见百度百科“费马小定理”,时间复杂度也是很理想的,常数级。
唔。引用错数字了。刚才那个是测试到17的时候的最小反例。只测试到13的话最小反例是3,474,749,660,383。比maxint32要大多了,比maxint64要小多了。
你那是只测试一个数字,注意我指的是这几个数字都要测试……
其实这个问题很复杂
AR素性检查,比上面提到的方法都快,都缺点是不能给出其因子,若判断一个数是素数,该方法所能给出的全部信息就是:此数不是素数,仅此而已
判断一个数是质数最快的方法?
for (k = 3; k <= upperBound; k += 2)
{
upperBound = n / k;
if (n % k == 0) return 0;
}
换成 if(n%k!=0)
这样应该也行吧
如果要计算合数的个数是必须要判断到根号n,直接到n就错了。像6,除了个2算1个,除了个3也算1个。
见到了很多个算法的名字……但是都没见到具体的算法步骤……