| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2063 人关注过本帖
标题:[讨论]寻找求一数是否为 [素数]的最优算法
只看楼主 加入收藏
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 
确实优

英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-04-28 20:53
linuxbabya
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-19
收藏
得分:0 
以下是引用PcrazyC在2007-4-28 20:49:48的发言:

输出1亿内的素数个数只需要5秒左右

事实上i+=2;还是有缺陷的。因为每加几个就会出现其他素数的倍数。可以看一下,密码学相关的AKS算法。

就像产生素数一样,有关文献上有采用随机增量的。

2007-04-28 21:28
iwfy
Rank: 1
等 级:新手上路
威 望:2
帖 子:888
专家分:0
注 册:2007-2-23
收藏
得分:0 
i从3开始,i+=2是跳过偶数,怎么能有缺陷

英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!
2007-04-28 21:34
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
12可能没看懂程序是如何运行的,I+=2只是将偶数跳过,不可能有漏的

如果你能举出一个例子,我就服了你

雁无留踪之意,水无取影之心
2007-04-28 21:39
洛川
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-4-28
收藏
得分:0 
#include <stdio.h>
#include <math.h>
int f(int a)
{
int b;
for(b=2;b<=sqrt(a);b==2?b++:(b+=2))
if(a%b==0)
return 0;
return 1;
}
void main()
{
int n,i,j,c=0;
scanf("%d",&n);
printf("\n");
for(i=2;i<n;i==2?i++:(i+=2))
if(f(i))
{
printf("%3d",i);
c++;
if(c%10==0)
printf("\n");
}
}

2007-04-28 21:49
linuxbabya
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-19
收藏
得分:0 
回复:(PcrazyC)12可能没看懂程序是如何运行的,I+=2...
晕,我说的缺陷不是说这个方法有错,是谈的效率问题。比如说3+2+2+2=9
每加3次就会出现一个3的倍数。看看有关数论和密码学的资料就知道了。
2007-04-28 21:49
cca33
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-2-27
收藏
得分:0 
看看我的呢

int isPrime(int num)
{
int i;
for(i=2;i<(num+2)/2;i++)
{
if(num%i==0)
return 0; //不是素数
}
return 1; //素数
}
2007-04-29 16:23
acmilann
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2007-5-13
收藏
得分:0 
埃拉托色尼筛网法求质数
#include<stdio.h>
#include<stdlib.h>
#define MAXINT 100000
int main(void)
{ long long int i,j;
long long int str[MAXINT];
for(i=2;i<MAXINT;i++)
str[i]=i;
for(i=2;i<MAXINT;i++)
{if(str[i]!=1){ printf("%10d",str[i]);
for(j=i+1;j<MAXINT;j++)
if(str[j]%str[i]==0)str[j]=1;
}
}
free(str);
return 0;

}
典型以空间换取时间!

学习编程的秘诀是:编程,编程,再编程
2007-05-16 08:16
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 

费马小定理结合二次探测的蒙特卡罗概率算法

程序代码:

#include <iostream>
#include <time.h>
#include <assert.h>
const unsigned long MAXSHORT=65536L;
const unsigned long MULTIPLIER=1194211693L;
const unsigned long ADDER=12345L;

class RandomNumber{
private:
unsigned long randSeed;
public:
RandomNumber(unsigned long s=0);
unsigned short Random(unsigned long n);
double fRandom();
};

//产生随机种子
RandomNumber::RandomNumber(unsigned long s)
{
if(s==0)
randSeed=time(NULL);
else
randSeed=s;
}

//产生0:n-1之间的随机整数
unsigned short RandomNumber::Random(unsigned long n)
{
randSeed=MULTIPLIER*randSeed+ADDER;
assert(n!=0);
return (unsigned short)((randSeed >> 16) % n);
}

//产生[0,1)之间的随机双精度符点小数
double RandomNumber::fRandom()
{
return Random(MAXSHORT)/double(MAXSHORT);
}


typedef unsigned int uint;

void power(uint a,uint p,uint n,uint &result,bool &composite)
{
uint x;
if(p==0)
result=1;
else{
power(a,p/2,n,x,composite);
result=(x*x)%n;
if((result==1)&&(x!=1)&&(x!=n-1))
composite=1;
if(p%2)
result=(result*a)%n;
}
}

bool PrimeMC(uint n,uint k=10)
{
RandomNumber rnd;
uint a,result;
bool composite=0;
//对0,1,2,3的特殊处理
if(n==0 || n==1)return 0;
if(n==2 || n==3)return 1;

for(int i=1;i<=k;i++){
a=rnd.Random(n-3)+2;
power(a,n-1,n,result,composite);
if(composite||(result!=1))
return 0;
}
return 1;
}


int main()
{
using namespace std;
uint n;
while(cin>>n){
cout<<PrimeMC(n)<<endl;
}
return 0;
}

2007-05-16 13:23
luckydjc
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-5-8
收藏
得分:0 
用筛选法输出素数就行了,同意9楼的
2007-05-21 13:02
快速回复:[讨论]寻找求一数是否为 [素数]的最优算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024237 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved