Полное факториальное моделирование равномерных последовательностей…
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 5
143
int nb = n; // число объектов
int[] b = new int[nb]; // массив объектов
for (int i = 0; i < n; i++) b[i] = i + 1;
int nF = 1; // nF-факториал подпоследовательности
for (int i = 2; i <= nb; i++) nF *= i;
int iq = 0; // индекс для формируемого элемента в q
for (int z = n - 1; z > 0; z--) // цикл позиций
{ int ng = nF / nb; // число элементов в группе
int w = r / ng; // число предыдущих групп
if ((w * ng) < r) w++; // номер группы для r
int zb = w - 1; // позиция выбора из b для q
q[iq++] = b[zb]; // элемент в последовательности
for (int i = zb; i < z; i++) b[i] = b[i + 1];
r -= (w - 1) * ng; // r для следующей позиции
nb--; // на один объект меньше
nF /= z + 1; // следующий nF-факториал
}
q[n - 1] = b[0]; // последний элемент в q
}
}
}
После выполнения программы на мониторе появляется листинг:
n = 7
r = 3302
q = 5 4 3 6 1 7 2
Соответствие последовательности
q
заданному номеру
r
можно проверить
по распечатке моделирования в программе
P010301
, приведенной выше. Функ-
ция
DeonSequence()
реализует условие достаточности в доказательстве тео-
ремы об упорядоченной биекции.
В следующей программе
P010303
функция
DeonNumber()
вычисляет фак-
ториальный номер
r
функции
r
f F
для заданной равномерной последователь-
ности
,
r
d d D
состоящей из целых чисел множества
1,
B n
в модели
, ,
.
M B D F
В качестве примера использована предыдущая последователь-
ность
5, 4, 3, 6,1, 7, 2.
Пример программы
P010303
namespace P010303
{ class P010303
{ static void Main(string[] args)
{ int[] q = new int[] { 5, 4, 3, 6, 1, 7, 2 };
int n = q.Length; // длина последовательности
Console.WriteLine("n = {0}", n); // монитор
Console.Write("q = ");
for (int i = 0; i < n; i++)
Console.Write("{0,4}", q[i]);
int r = DeonNumber(q); // номер последовательности
Console.WriteLine("\nr = {0}", r); // монитор
Console.ReadKey(); // просмотр результата