mathe
发表于 2009-10-8 15:33:06
贴一段使用了HugeCalc的代码(其实就是为了求素数和数论倒数的代码)
#define BUF_LEN (1<<27)
#define MAX_PRIME 655360
int mask;
unsigned plist;
int pc;
#define GETWORD(x)((x)>>5)
#define GETOFF(x) ((x)&31)
#define OFFBIT(x) (1<<GETOFF(x))
#define SET_BIT(x)(mask|=OFFBIT(x))
#define TEST_BIT(x) ((mask&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);
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)
mathe
发表于 2009-10-8 15:36:23
f=1
f=4
f=4
f=4
f=4
f=43
f=43
f=145
f=145
f=145
f=145
f=145
f=145
f=145
f=145
f=145
f=652
f=652
f=652
f=652
f=4347
f=4902
f=4902
f=5248
f=5248
f=5248
f=8083
f=8083
f=8083
f=8083
f=8083
f=8083
f=8083
f=8083
f=8083
f=8083
f=8083
f=38335
f=44875
f=44875
f=44875
f=44875
f=44875
f=46711
f=51481
f=51481
f=80101
f=80101
f=80101
f=223312
f=223312
f=223312
f=223312
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=1239046
f=1239046
f=1239046
f=1239046
f=1239046
f=1239046
f=1767661
f=3848451
f=4157752
f=4157752
f=4543498
f=4543498
f=4543498
f=4543498
f=4543498
f=4543498
f=4543498
f=4543498
f=4543498
f=4543498
f=4543498
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=5346948
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
Total cost 168583741us
mathe
发表于 2009-10-8 15:38:09
同9#结果不匹配,看来有BUG,谁来调试一下?我有事要出去了
mathe
发表于 2009-10-8 18:42:45
找到一个bug,函数unmask中乘法可能会溢出,需要修改void unmask(int prime)
{
int inv=HugeCalc::InvertMod(100,prime);
int u=prime-11;
while(u<0)u+=prime;
u=((long long)u*inv)%prime;
if(u*100+11!=prime){
SET_BIT(u);
}
unsigned v=u+prime;
for(;v>prime;v+=prime){
SET_BIT(v);
}
}
mathe
发表于 2009-10-8 18:46:19
修正以后的结果:
f=1
f=4
f=4
f=4
f=10
f=43
f=43
f=145
f=145
f=145
f=361
f=361
f=361
f=361
f=448
f=448
f=652
f=652
f=652
f=652
f=4347
f=5605
f=6217
f=6217
f=6217
f=6217
f=8083
f=8083
f=8083
f=8083
f=8083
f=8452
f=8452
f=8452
f=23284
f=23284
f=23284
f=23284
f=23284
f=23284
f=23284
f=44875
f=44875
f=46711
f=80101
f=80101
f=80101
f=80101
f=80101
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=417643
f=1239046
f=1239046
f=1239046
f=1239046
f=1239046
f=1239046
f=5585445
f=5585445
f=5585445
f=5585445
f=5585445
f=12264717
f=12264717
f=12264717
f=13991758
f=13991758
f=16775473
f=16775473
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=17946187
f=30804307
f=30804307
f=30804307
f=30804307
f=30804307
f=30804307
f=75839734
f=75839734
f=75839734
f=75839734
f=75839734
f=75839734
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=78072010
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=177901414
f=554979631
f=554979631
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=648847533
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
f=3539248351
Total cost 213745877us
056254628
发表于 2009-10-8 22:22:31
本帖最后由 056254628 于 2009-10-8 22:24 编辑
mathe的程序是不是还有Bug?
m<=49的结果和我的一样。但是我算出的:
f(51)=175623 f(54)=220659
---------------------------------------
比mathe的小很多。
mathe
发表于 2009-10-9 13:30:08
的确,如下修改:>改为>=void unmask(int prime)
{
int inv=HugeCalc::InvertMod(100,prime);
int u=prime-11;
while(u<0)u+=prime;
u=((long long)u*inv)%prime;
if(u*100+11!=prime){
SET_BIT(u);
}
unsigned v=u+prime;
for(;v>=prime;v+=prime){
SET_BIT(v);
}
}
mathe
发表于 2009-10-9 13:33:18
Total num prime 53225,
Total prime masked,1691
f=1
f=4
f=4
f=4
f=10
f=43
f=43
f=145
f=145
f=145
f=361
f=361
f=361
f=361
f=448
f=448
f=652
f=652
f=652
f=652
f=4347
f=5605
f=6217
f=6217
f=6217
f=6217
f=8083
f=8083
f=8083
f=8083
f=8083
f=8452
f=8452
f=8452
f=23284
f=23284
f=23284
f=23284
f=23284
f=23284
f=23284
f=44875
f=44875
f=46711
f=80101
f=80101
f=80101
f=80101
f=80101
f=175623
f=175623
f=220659
f=220659
f=220659
f=357075
f=357075
f=357075
f=357075
f=357075
f=357075
f=357075
f=357075
f=357075
f=357075
f=357075
f=1239046
f=1239046
f=1239046
f=1239046
f=1239046
f=4225245
f=4225245
f=4225245
f=4225245
f=4225245
f=4225245
f=4225245
f=4225245
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=4242612
f=7135851
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=23717773
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=167369311
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=339898777
f=1307096556
f=1307096556
f=1307096556
f=1307096556
f=1307096556
f=1307096556
f=1307096556
f=1307096556
f=1550482953
f=1550482953
f=1550482953
f=1550482953
f=1550482953
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
f=3539248312
Total cost 183552557us
〇〇
发表于 2009-10-9 14:44:38
=30804307?
gxqcn
发表于 2009-10-9 14:53:01
mathe 的结果是对的。=23717773