В статье Циклическая избыточность в Википедии говорится, что полином равен x ^ 4 + x + 1. Существует также довольно хорошее описание того, как вычисляется контрольная сумма.
Вот алгоритм для CRC16. Я знаю, что это не то, что вы просили, но адаптировать его для 4 битов должно быть относительно просто.
public ushort calculate(byte[] bytes)
{
int crc = 0xFFFF; // initial value
// loop, calculating CRC for each byte of the string
for (int byteIndex = 0; byteIndex < bytes.Length; byteIndex++)
{
ushort bit = 0x80; // initialize bit currently being tested
for (int bitIndex = 0; bitIndex < 8; bitIndex++)
{
bool xorFlag = ((crc & 0x8000) == 0x8000);
crc <<= 1;
if (((bytes[byteIndex] & bit) ^ (ushort)0xff) != (ushort)0xff)
{
crc = crc + 1;
}
if (xorFlag)
{
crc = crc ^ 0x1021;
}
bit >>= 1;
}
}
return (ushort)crc;
}
http://www.experts -exchange.com / Программирование / Языки / C_Sharp / Q_24775723.html
Также есть руководство по вычислению контрольных сумм:
http://www.ross.net/crc/download/crc_v3.txt
"Все, что вы хотели знать об алгоритмах CRC, но боялись
просить страха, что ошибки в вашем понимании могут быть обнаружены. "