А.Ф. Деон, Ю.А. Меняев
88
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 2
for ( int i = 1; i < N; i++ )
x[i] = ( a * x[i - 1] + c ) % m;
NN++; // общее число последовательностей
if ( Repeating(x, N) ) continue; // повтор
Console.WriteLine( "a = {0} c = {1}", a, c );
r++; // номер последовательности
Console.Write( "r = {0,4} ", r );
qWrite("x = ", x, N, true);
}
Console.WriteLine( "Finish" );
Console.WriteLine( "NN = {0}", NN );
double CC = (double)r / NN; // конгруэнтная полнота
Console.WriteLine("CC = r / NN = {0:F4}", CC);
Console.ReadKey(); // просмотр результата
}
//---------------------------------------------------------------
static bool Repeating ( int[] x, int N )
{ for ( int i = 1; i < N; i++ )
for ( int j = 0; j < i; j++ )
if ( x[i] == x[j] ) return true; // повторение
return false; // повторений нет
}
//---------------------------------------------------------------
static void qWrite ( string text, int[] x, int N,
bool newstr )
{ Console.Write( text );
for ( int i = 0; i < N; i++ )
Console.Write( "{0,3}", x[i] );
if ( newstr ) Console.WriteLine();
}
После выполнения этой программы на мониторе появляется следующий
листинг, который приводим с некоторыми сокращениями, ставя прочерк на
месте пропущенных строк
N = 8
a = 1 c = 1
r = 1 x = 1 2 3 4 5 6 7 0
r = 2 x = 2 3 4 5 6 7 0 1
− − − − −
a = 5 c = 1
r = 29 x = 1 6 7 4 5 2 3 0
r = 30 x = 2 3 0 1 6 7 4 5
− − − − −
a = 5 c = 7
r = 55 x = 6 5 0 7 2 1 4 3
a = 5 c = 7
r = 56 x = 7 2 1 4 3 6 5 0
Finish
NN = 392
CC = r / NN = 0.1429
Листинг показывает, что наблюдалось только 56 равномерных последователь-
ностей из возможных 392 конгруэнтных последовательностей во всех диапазонах