【发布时间】:2013-08-23 05:44:53
【问题描述】:
我当前用于计算 Legendre 符号的代码是
inline int legendre(int pa, int pm){
register unsigned int a = pa;
register unsigned int m = pm;
int t = 1;
int tmp=0;
while (a>1) {
tmp=__builtin_ctz(a);//a=x*2^tmp, where x is odd
a>>=tmp;
if(tmp&1 &&((m&7)==3 || (m&7)==5))//if it is an odd power and m=3,5 mod 8
t=-t;//invert result
if((a&3)==3 && (m&3)==3)//if m=3 mod 4 and a=3 mod 4
t=-t;//invert result
m %= a;
tmp=a;
a=m;
m=tmp;//exchange variables
}
if (m == 1) return t;
return 0;
}
这里可以进行任何优化吗?
【问题讨论】:
-
可能更适合 codereview.stackexchange ,也 - 你使用什么语言?您可能想提一下(ps
inline在 C 语言中毫无意义,register也是 - 编译器足够聪明,可以自己解决) -
我觉得你在炫耀 :D 代码看起来非常优化。即使假设可以更快地切换变量的符号,您也不会从中获得太多性能。
-
@BenjaminGruenbaum 虽然 inline 的影响可以忽略不计或没有影响,但 register 有。 (从 3100 毫秒到 2350 毫秒计算 legendre(1...10000000,982451653))
-
您想在 1950 年代的机器上运行它吗?如果不是,那么偏执优化的意义何在:)
-
这个问题似乎是题外话,因为它是关于代码审查的。它属于 codereview.stackexchange.com
标签: c number-theory