Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А почему вы Галуа называете Гаула ?
Ёлки, я даже полез в Гугл гуглить, неужели всю жизнь я называл тов. Галуа неправильно. Оказалось, правильно. Поставьте плюс те, кто сделал так же. :)
Гаул, наверное, его незаконнорожденный брат. Великий Гаул положил поле в баул.
uint16_t gfpow2[65536];
uint16_t gflog2[65536];
// генерируем таблицы
void gentables()
{
gfpow2[0]=1;
gfpow2[1]=2;
gflog2[1]=0;
gflog2[2]=1;
for(int i=2; i<0xFFFFu; i++)
{
gfpow2[i] = mul2(gfpow2[i-1]);
gflog2[gfpow2[i]]=i;
}
gfpow2[0xFFFFu]=1;
}
static inline const uint16_t log2(uint16_t a)
{
assert(a != 0);
return gflog2[a];
}
// умножение
static inline const uint16_t gfmul(const uint16_t a, const uint16_t b)
{
if(a == 0 || b == 0)
return 0;
register int64_t tmp = gflog2[a] + gflog2[b];
return gfpow2[ uint16_t((tmp > 0xFFFFu) ? tmp - 0xFFFFu : tmp) ];
}
// деление
static inline const uint16_t gfdiv(const uint16_t a, const uint16_t b)
{
assert( b != 0 );
if( a == 0 ) return 0;
register int64_t tmp = gflog2[a] - gflog2[b];
return gfpow2[ (tmp < 0 ) ? 0xFFFFu+tmp : tmp ];
}
// получаем q-значение
static inline const uint16_t QParity(uint16_t* stream, uint16_t n /* max words in stream <64k*/)
{
assert( n <= 65534 && n > 0);
uint16_t Qx=gfmul(gfpow2[0],stream[0]);
for(size_t k=1; k<n; k++)
{
if(stream[k] != 0)
{
Qx^=gfmul(gfpow2[k],stream[k]);
}
else
{
Qx^=0;
}
}
return Qx;
}
// восстановление по q-значению
static inline const uint16_t recoverDxByQ(uint16_t* stream, uint16_t dx /* индекс битого слова*/, uint16_t Q, uint16_t Qx)
{
return gfmul(stream[Q]^Qx,gfpow2[0xFFFFu-dx]);
}
uint16_t gfpow2[0xFF];
uint16_t gflog2[0xFF];
// генерируем таблицы
void gentables()
{
gfpow2[0]=1;
gfpow2[1]=2;
gflog2[1]=0;
gflog2[2]=1;
for(int i=2; i<0xFF; i++)
{
gfpow2[i] = mul2(gfpow2[i-1]);
gflog2[gfpow2[i]]=i;
}
gfpow2[0xFFu]=1;
}Просто захотелось иметь в коллекции самописных C++ библиотек собственную реализацию кодирования Рида-Соломона. Интересно разобраться.
И вот тут вопрос — выдаст ли приемник вам посылку, если контрольная сумма будет неверная? Если нет — у вас нет возможности осуществлять шумоподавление в принципе.Приёмопередатчик LT8920. В случае битых данных, он выдаёт посылку, и выставляет бит CRC err. Так что не придётся «закатывать вручную». А про скремблирование — сам думаю. Дополнить Рида-Соломона скремблером. Так, вроде, в CD дисках сделано. Их можно царапать широкими царапинами.
АПЧ можно не отключать, если данные передаются кодом «Манчестер», но вы за это заплатите удвоением времени передачи.
Причём делим мы не на что попало, а на определённый, так называемый «порождающий» полином. Откуда он берётся? Почему делится только сам на себя?Так мы его выбираем такой, чтобы делился только сам на себя. В поле вычетов по модулю 2 есть только два полинома первой степени: x и x+1. Перемножая их, можем получить x*x = x², x*(x+1) = x²+x, (x+1)*(x+1)=x²+1 — вот так, по модулю 2. А полином x²+x+1 получить умножением полиномов первой степени невозможно. Это и есть единственный неприводимый полином второй степени по модулю 2, который можно использовать, как порождающий для GF[4]. Аналогично, если перемножить все возможные полиномы второй степени на x и x+1, мы получим не все кубические полиномы. Не получится как раз тех самых полиномов, которые и можно использовать как порождающие.
Было бы интересно еще почитать такое же простое объяснение, почему при таком построении деление получается операцией, обратной умножению.
2+2=4 в этом поле так же, как и в поле привычных нам, действительных чисел… (вообще сложение и вычитание для конкретно этого поля это просто побитовый XOR).
Что-то у вас не сходится. 2 xor 2 равно 0, а не 4.
Алгоритм не то, чтобы совсем новый, его ещё в первых CD применяли, но при этом, насколько мне известно, не потерявший своей актуальности и на данный момент.
Вообще, количество элементов поля это число не произвольное. Оно называется «характеристикой поля» и может быть либо простым числом, либо степенью простого числа (её называют «порядком поля», основание этой степени называют «основанием поля»).
Программная реализация умножения в полях Галуа