能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不错的工作,继续
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
用强拟素数判别法做不就结了,这年头,有安全性的素数都要一百多位,谁去穷举啊……
|
能力值:
( LV13,RANK:410 )
|
-
-
4 楼
你的算法太土了。。。。
|
能力值:
( LV9,RANK:250 )
|
-
-
5 楼
GetTickCount表面是能精确到1ms,实际情况上,大部分是15ms。
程序执行效率的提高,首先是在算法的优化上,其次是代码结构之类的优化,最后才是机器指令的优化。
另外有两种更精确的方法:
double ClockRecorder()
{
static LARGE_INTEGER liTmp;
static double dFrequency, dStrt = 0.0, dEnd = 0.0, dLast = 0.0;
static bool bStart = true;
::QueryPerformanceCounter(&liTmp);
if(bStart)
{
dStrt = double(liTmp.QuadPart);
dLast = 0.0;
bStart = false;
}
else
{
dEnd = double(liTmp.QuadPart);
::QueryPerformanceFrequency(&liTmp);
dFrequency = double(liTmp.QuadPart);
dLast = (dEnd - dStrt) / dFrequency;
bStart = true;
}
return dLast * 1000;
}
inline unsigned __int64 GetCycleCount()
{
unsigned __int64 retvl = 0;
__asm _emit 0x0F
__asm _emit 0x31
__asm mov dword ptr retvl, eax
return retvl;
}
unsigned __int64 CircleRecorder()
{
static unsigned __int64 dLast = 0;
static bool bStrt = true;
unsigned __int64 temp = bStrt ? GetCycleCount() : dLast;
dLast = GetCycleCount();
bStrt = !bStrt;
return dLast - temp;
}
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
切记:算法是最重要的.
下面是我的精确计算1000万以内的素数的算法,看看速度如何.
#include <stdio.h>
int searchprime(int num,int *out)
{
int pn=0;
bool *mask=new bool[num+1];
for(int i=2;i<=num;i++)
if(!mask[i])
{
out[pn++]=i;
if(i<32767)
for(int j=i*i;j<=num;j+=i)
mask[j]=true;
}
delete []mask;
return pn;
}
void main()
{
int *out=new int[664579];
printf("搜索1 ~ 10000000......");
int num=searchprime(10000000,out);
printf("找到%d个素数,最后一个素数是%d.\n",num,out[num-1]);
delete []out;
}
P4 2.5GHz: 100万以内0.1s,1000万以内1.25s.
|
能力值:
( LV12,RANK:210 )
|
-
-
7 楼
int pn=0;
bool *mask=new bool[num+1];
memset(mask, 0, sizeof(bool) * (num+1));
|
能力值:
( LV9,RANK:1250 )
|
-
-
8 楼
嗯,不错。
Rabin-Miller测试对大素数比较有用。
我看到文章说是印度数学家已经找到直接判定某一数是否是素数的方法,对大素数的判定十分有用,不过,程序源代码还尚未找到。
|
能力值:
( LV13,RANK:410 )
|
-
-
9 楼
那印度人不是快打败RSA了。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
最初由 默数悲伤 发布 GetTickCount表面是能精确到1ms,实际情况上,大部分是15ms。 程序执行效率的提高,首先是在算法的优化上,其次是代码结构之类的优化,最后才是机器指令的优化。 另外有两种更精确的方法: [code] double ClockRecorder() ........
是呀..用GetTickCount是不够精确...这个在WINDOWS核心编程一书中都提到并有相关代码.....学习..中...
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
最初由 jjnet 发布 int pn=0; bool *mask=new bool[num+1]; memset(mask, 0, sizeof(bool) * (num+1));
嗯,严格地说应该清0.
我贴的那个程序原来是我用来和java语言比较速度的,因为java是肯定在new时清0的,所以C++版本为了和java代码保持一致就没有清0,但实际运行得到的空间总是清过0的,原因不明.转过来的时候忘了这个问题了.
BTW,java2(1.42)运行的时间仅比C++版的慢1/4左右,看来java在小范围密集运算这方面还是有点优势的.
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
最初由 happytown 发布 嗯,不错。 Rabin-Miller测试对大素数比较有用。 我看到文章说是印度数学家已经找到直接判定某一数是否是素数的方法,对大素数的判定十分有用,不过,程序源代码还尚未找到。
实际上不能这么说
这个算法叫AKS
原来的论文叫《Primes is in P》
意思是找到了一个可以在多项式时间内判定素数的方法
程序在这
http://islab.oregonstate.edu/koc/ece575/04Project2/Halim-Chanleudfa/
|
能力值:
( LV12,RANK:210 )
|
-
-
13 楼
最初由 dwing 发布 嗯,严格地说应该清0. 我贴的那个程序原来是我用来和java语言比较速度的,因为java是肯定在new时清0的,所以C++版本为了和java代码保持一致就没有清0,但实际运行得到的空间总是清过0的,原因不明.转过来的时候忘了这个问题了. BTW,java2(1.42)运行的时间仅比C++版的慢1/4左右,看来java在小范围密集运算这方面还是有点优势的.
c++并没有规定一定清0, 跟heap的管理有关.
比如在vc的debug模式下, 一般都填CD.
所以还是加上好.
|
能力值:
(RANK:1010 )
|
-
-
14 楼
计算索数一般用“线性删法”,顾名思义O(n)
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
谢谢楼主,学习,学习...
|
能力值:
( LV9,RANK:1250 )
|
-
-
16 楼
最初由 Isaiah 发布 那印度人不是快打败RSA了。
应该是加强了RSA,而不是打败了RSA吧?
|
能力值:
( LV13,RANK:410 )
|
-
-
17 楼
哦,就是。。。是判定不是分解。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
说到算法问题,谁不知道:
大于2的偶数肯定不是素数
不能被比自己小的素数整除的数一定是素数。
上面提到的算法需要改进的。
|
|
|