Previous Page  9 / 25 Next Page
Information
Show Menu
Previous Page 9 / 25 Next Page
Page Background

А.Ф. Деон, Ю.А. Меняев

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); // монитор матрицы