А.Ф. Деон, Ю.А. Меняев
94
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 2
Исходное число
0
x
начала генерации можно задать либо явно, либо авто-
матически, используя таймер компьютера. Для полных последовательностей
интерес представляют все числа только из интервала
− =
−
0,
1 0, 2 1 .
w
N
В конгруэнтной линейной формуле (2) параметр
a
выбирается по условию,
чтобы получающаяся последовательность была полной при заданной длине чисел
w
бит. Известно, что равномерные последовательности с
2
w
N
=
чисел создаются
тогда, когда
(
)
1
4 0.
a mod
−
=
Например, если длина чисел
3,
w
=
то последователь-
ность полная и содержит
3
2 2 8
w
N
= = =
чисел. В этом интервале
− =
0, 2 1 0, 7
w
параметр
a
следует выбирать как
а
= 1 или 5. Если
4
w
=
,
то
a
может принимать значения только 1, 5, 9 или 13 из интервала
∈ − =
4
1, 2 1 1, 15 .
a
Параметр
c
в формуле (2) выбирается с тем же условием, чтобы получаемая
последовательность была полной. Это достигается в тех случаях, когда параметр
c
принимает нечетные значения в диапазоне
∈ −
1, 2 1 .
w
c
Далее приведен код программы, подтверждающей рекомендации по выбо-
ру параметров
a
и
c
при максимально возможной генерации последовательно-
стей чисел длиной
4
w
=
бита по вихревой технологии с матричной проверкой
уникальности последовательностей. Функции
MatrixAdd()
,
MatrixCheck()
и
MatrixWrite()
взяты из раздела
Теория.
static void Main(string[] args)
{ int w = 4; // битовая длина числа
int N = 16; // длина последовательности
Console.WriteLine("w = {0} N = {1}", w, N);
int maskW = (int)(0xFFFFFFFF >> (32 - w)); // маска
int maskU = 1 << (w - 1); // старший бит
Console.WriteLine("maskW = {0:X} maskU = {1:X}",
maskW, maskU);
int[] x = new int[N]; // случайная последовательность
int[,] MS = new int[3000, N + 3]; // матрица
int M = 0; // количество последовательностей в матрице
for (int a = 1; a < N; a += 4)
for (int c = 1; c < N; c += 2)
{ int x0 = 1;
Cong_Start(x, N, a, c, x0, maskW);
if (Repeating(x, N)) continue; // повторения
MatrixAdd(MS, ref M, x, N, a, c);
for (int i = 1; i < w * N; i++)
{ Twist(x, w, N, maskW, maskU); // вихрь
if (Repeating(x, N)) continue;
MatrixAdd(MS, ref M, x, N, a, c);
}
}
MatrixCheck(MS, M, N, 1); // проверка совпадений
Console.WriteLine("Matrix of unique sequences");
MatrixWrite(MS, M, N); // монитор матрицы