Я ищу способ равномерного выбора значений в GF (2 ^ M) между двумя границами.
GF (2 ^ M) - поле Галуа - см. GF (4), как определено на этой странице - http://www.math.umbc.edu/~campbell/Math413Spr09/Notes/12-13_Finite_Fields.html
С технической, нематематической точки зрения это больше всего похоже на операции CRC.
Например:
ulong gf2step( ulong x, int bits, ulong p )
{
x = x << 1; // "multiply" by x
if ( x >= (1 << bits)) x = x ^ p;
return x;
}
Расширяя пример снизу:
12 is '1100
'1100 shifted left by 1 becomes `11000. Since bit 4 is set, xor with `10011 (p).
Next is `1011 or 11.
Аналогично,
9 is '1001
'1001 shifted left by 1 becomes `10010. Since bit 4 is set, xor with `10011 (p).
Next is `0001.
Мой очевидный метод - начать с целочисленных показателей, соответствующих границам, выбрать случайный показатель между ними и сгенерировать из этого значение.
Однако у этого есть две проблемы -
1. Учитывая произвольные границы, я не могу найти соответствующий целочисленный показатель ..
2. Это будет повторяться много, много раз, поэтому я обеспокоен скоростью возведения в степень.
Пример:
int gf2random( ulong low, ulong high, ulong p);
gf2random( 12, 13, 19) should return evenly from the set {12, 11,5,10,7,14,15, 13}
gf2random( 9, 1, 19) should return either 9 or 1
Я могу довольно легко изменить значения в GF (2 ^ M), но я не уверен, как избежать превышения верхней границы.
<ч />
Упрощает ли это проблему, если нижняя граница всегда была «1»?