- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 43421
- 在线时间
- 小时
|
发表于 2009-10-8 15:33:06
|
显示全部楼层
贴一段使用了HugeCalc的代码(其实就是为了求素数和数论倒数的代码)-
- #define BUF_LEN (1<<27)
- #define MAX_PRIME 655360
- int mask[BUF_LEN];
- unsigned plist[MAX_PRIME];
- int pc;
- #define GETWORD(x) ((x)>>5)
- #define GETOFF(x) ((x)&31)
- #define OFFBIT(x) (1<<GETOFF(x))
- #define SET_BIT(x) (mask[GETWORD(x)]|=OFFBIT(x))
- #define TEST_BIT(x) ((mask[GETWORD(x)]&OFFBIT(x))!=0)
- void unmask(int prime)
- {
- int inv=HugeCalc::InvertMod(100,prime);
- int u=prime-11;
- while(u<0)u+=prime;
- u*=inv;
- u%=prime;
- if(u*100+11!=prime){
- SET_BIT(u);
- }
- unsigned v=u+prime;
- for(;v>prime;v+=prime){
- SET_BIT(v);
- }
- }
-
- void check_list()
- {
- int cur_len=0;
- int max_len=0;
- unsigned v=0;
- do{
- if(TEST_BIT(v)){
- cur_len++;
- if(cur_len>max_len){
- printf("f[%d]=%u\n",cur_len,v-cur_len+1);
- max_len=cur_len;
- }
- }else{
- cur_len=0;
- }
- }while(++v!=0);
- }
-
- int main()
- {
- HugeCalc::EnableTimer();
- pc=HugeCalc::GetPrimeList(plist,MAX_PRIME,7,MAX_PRIME);
- unmask(3);
- unsigned timer=HugeCalc::GetTimer();
- int i;
- printf("Total num prime %d, %dus\n",pc,timer);
- for(i=0;i<pc;i++){
- unmask(plist[i]);
- if(i%100==99){
- timer=HugeCalc::GetTimer();
- }
- }
- timer=HugeCalc::GetTimer();
- printf("Total prime masked,%dus\n",timer);
- check_list();
- timer=HugeCalc::GetTimer();
- printf("Total cost %dus\n",timer);
- }
复制代码 可以计算到f(131) |
|