我需要在 16 位 CPU 上求解有限素数域中的多项式。我见过人们使用这些字段GF((2^16)+1), GF((2^16)-15)
,并且GF((2^32)-5)
. 我猜这些选择源于有几个优化的事实。但是,除了使用“mod”之外,我不知道任何进一步的优化。如果有人向我指出一个好的资源,给我代码片段,或者解释为什么人们使用那些奇怪的素数而不是 say ,我将非常感激GF((2^16)-1)
。
编辑:GF((2 ^ 16)+ 1)中的%-free模:
uint32_t mod_0x10001(uint32_t divident)
{
uint16_t least;
uint16_t most;
least = divident & 0xFFFF;
most = divident >> 16;
if (least >= most) {
return least - most;
} else {
return 0x10001 + least - most;
}
}
编辑: GF(2^16-15) 中的 %-free 模数:
uint32_t mod_0xFFF1(uint32_t divident)
{
uint16_t least;
uint16_t most;
uint32_t remainder;
least = divident & 0xFFFF;
most = divident >> 16;
/**
* divident mod 2^16-15
* = (most * 2^N + least) mod 2^16-15
* = [(most * 2^N mod 2^16-15) + (least mod 2^16-15)] mod 2^16-15
* = [ 15 * most + least ] mod 2^16-15
*/
remainder = 15 * most + least;
while (remainder >= 0xFFF1) {
remainder -= 0xFFF1;
}
return remainder;
}
更新:我在 MSP430 上测量了一次性能:高版本比低版本快 4 倍。较低的版本与使用 % :/ 一样快。有什么进一步的建议可以加快较低版本的速度吗?
干杯康拉德