16 ビット CPU で有限素体の多項式を解く必要があります。GF((2^16)+1), GF((2^16)-15)
フィールド、およびを使用している人々を見てきましたGF((2^32)-5)
。これらの選択は、いくつかの最適化があるという事実から生じていると思います。ただし、「mod」の使用を除けば、それ以上の最適化はわかりません。誰かが私に良いリソースを教えてくれたり、コード スニペットをくれたり、人々がなぜこれらの奇妙な素数をGF((2^16)-1)
.
編集: GF((2^16)+1) の % フリー モジュロ:
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) の % フリー モジュロ:
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 倍高速です。下位バージョンは、単純に % :/ を使用するのと同じくらい高速です。下位バージョンを高速化するためのその他の提案はありますか?
乾杯コンラッド