- •Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «воронежский государственный университет» ( фгбоу впо вгу)
- •Содержание
- •Список основных сокращений
- •Введение
- •Постановка задачи
- •Гпсп в системах защиты информации
- •1.1. Гпсп и шифрование мультимедийных данных [8]
- •1.2. Гпсп и хэширование
- •1.3. Гпсп и криптографические протоколы
- •1.4. Вероятностное шифрование и алгоритм эль-гамаля [1, 2]
- •Принципы построения и классификация гпсп
- •2.1. Два варианта построения гпсп
- •2.2. Криптографические гпсп
- •2.3. Линейные гпсп
- •2.4. Нелинейные гпсп [7]
- •Конечные поля и гпсп
- •3.1. Основные понятия теории конечных полей
- •3.2. Стохастические гпсп [3, 8]
- •Описание программы
- •4.1. Основные сведения
- •Инструкция по работе с программой
- •Графические тесты.
- •Оценочные тесты.
- •Заключение
- •Список использованных источников
- •Приложение
Заключение
Поставленная задача была выполнена в полном объёме. В рамках дипломной работы был проведен анализ существующих алгоритмов генерации псевдослучайных последовательностей. Основным достоинством блоков стохастического преобразования и генераторов ПСП на их основе является эффективная программная и аппаратная реализация при приемлемой для большинства приложений криптостойкости.
Была написана программа генерации ключевых последовательностей с возможностью их тестирования, в котором сравниваются свойства сформированных возможным алгоритмом генерации псевдослучайных последовательностей со свойствами истинно случайных последовательностей. На основе изученных сведений можно сделать вывод о наиболее рациональном и наименее ресурсоемком проекте, отвечающим всем требованиям и критериям работы с информацией.
Список использованных источников
Воронков Б.Н. Элементы теории чисел и криптозащита: учеб. пособие для вузов / Б. Н. Воронков – Воронеж: Воронежский ГУ, 2008. – 87с.
Воронков Б.Н. Криптографические методы защиты информации: учеб. пособие для вузов / Б. Н. Воронков – Воронеж: Воронежский ГУ, 2008. – 58с.
Осмоловский С.А. Стохастические методы передачи данных: учеб. пособие / С. А. Осмоловский – М.: Радио и связь, 1991. – 240с.
ООО «СТОКОС» - Инновационные разработки IT-технологий: [сайт]. – (URL: http://www.stokos.ru/) (дата обращения: 24.03.2013).
Пат. 2367007 Российская Федерация, МПК G06F 11/00 H04L 1/20 H03M 13/35. Способ передачи и комплексной защиты информации / Осмоловский С.А. – № 2007132646/09 ; заявл. 30.08.2007 ; опубл. 10.09.2009, Бюл. № 25. – 22с. : ил.
Иванов М.А. Стохастические методы и средства защиты информации в компьютерных системах и сетях: учеб. пособие / М. А. Иванов, А. В. Ковалев, Н. А. Мацук, Д. М. Михайлов, И. В. Чугунков – М.: КУДИЦ-ПРЕСС, 2009. – 512с.
Иванов М.А. Теория, применение и оценка качества генераторов псевдослучайных последовательностей: учеб. пособие / М. А. Иванов, И. В. Чугунков – М.: КУДИЦ-ОБРАЗ, 2003. – 240с.
Квантили распределения хи-квадрат: [сайт]. – (URL: http://ru.wikipedia.org/wiki/Квантили_распределения_хи-квадрат/) (дата обращения: 04.06.2013).
Приложение
Текст программы «Cryptographically Strong Key Algorithm and Analysis (CSKA)».
unit urfsr; {Главный модуль}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series, Buttons,
Menus, CheckLst, ComCtrls, Spin, Math;
type
TTwoDimArray = array of array of Double;
mas = array [0..15] of integer;
mass = array [0..999999] of integer;
TForm1 = class(TForm)
About: TMenuItem; //описание элементов формы
bClear: TButton;
bClose: TButton;
bDot: TButton;
bGisto: TButton;
bKnyt: TButton;
bMonot: TButton;
bRun: TButton;
bRunN: TButton;
bSeries: TButton;
dOpen: TOpenDialog;
dSave: TSaveDialog;
Exit1: TMenuItem;
File1: TMenuItem;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
mMenu: TMainMenu;
mmo1: TMemo;
Open1: TMenuItem;
Save: TMenuItem;
SaveAs: TMenuItem;
SaveKey: TMenuItem;
sConst: TSpinEdit;
sNum: TSpinEdit;
sType: TSpinEdit;
procedure AboutClick(Sender: TObject); //процедуры элементов управления с формы
procedure bClearClick(Sender: TObject);
procedure bCloseClick(Sender: TObject);
procedure bDotClick(Sender: TObject);
procedure bGistoClick(Sender: TObject);
procedure bKnytClick(Sender: TObject);
procedure bMonotClick(Sender: TObject);
procedure bRunClick(Sender: TObject);
procedure bRunNClick(Sender: TObject);
procedure bSeriesClick(Sender: TObject);
procedure Open1Click(Sender: TObject);
procedure SaveAsClick(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure SaveKeyClick(Sender: TObject);
private
{ Private declarations }
procedureRun; {построение блокаRстохастического преобразования(Random)}
procedureFill; {формирование ключевой последовательности из 16 чисел}
procedure GetStirlingNumbers(n_max, m_max: integer; var StirlingNumbers: TTwoDimArray); //числа Стирлинга
public
{ Public declarations }
end;
var
Form1: TForm1;
gType:integer; //параметр размерности тестируемого массива с формы
Z:mas; //массив случайных чисел, формирующий ключевую последовательность
b:mass; //вспомогательный массив-счетчик для проведения тестов
outN:TstringList; //переменная для хранения кодированной последовательности
implementation
uses uGistogramm, uRaspredelenie, uMonotonnost, uSeries, uKnyt;
{$R*.dfm}
procedureTForm1.bRunClick(Sender:TObject); {выполнение операции формирования ключевой последовательности по нажатию кнопки на форме}
begin
outN := TStringList.Create;
Fill;
end;
procedureTForm1.Fill; {формирование ключевой последовательности из 16 чисел разрядности 9}
var a: string; i, k: integer;
begin
Run;
a:= '';
fori:= 0to15do//цикл восстановления корректной разрядности (9) в таблице из 16 случайных чисел
begin
for k := length(inttostr(Z[i])) to 8 do
a := a + '0';
a := a + inttostr(Z[i]);
end;
outN.Add(copy(a, 1, 77)); //формирование ключевой последовательности из первых 77 чисел
mmo1.Lines.Add(a); //вывод на экран ключевой последовательности из 144 чисел
end;
procedureTForm1.Run; {построение блокаRстохастического преобразования(Random)}
var i, c: integer; R: mas;
begin
c:=strtoint(sConst.text); //задаваемый пользователем параметр преобразования, задающий смещение для формирования ключевой последовательности
fori:= 0to15do//цикл формирования таблицы из 16 случайных чисел
R[i] :=Random(536870913); //случайное число из отрезка [0..536870912]
fori:= 0to15do//цикл генерации ключевой информации из сформированного массива случайных чисел
begin
Z[i] := (R[Random(16)] +c)mod536870912; //вычисление модуля случайного числа, смещенного на заранее заданную константу смещения "с"
end;
end;
procedureTForm1.bRunNClick(Sender:TObject); {выполнение операции формирования заданного количества ключевых последовательностей по нажатию кнопки на форме}
var i: integer;
begin
outN := TStringList.Create;
fori:= 1tostrtoint(sNum.text)do//число необходимых последовательностей считывается с формы
Fill;
end;
procedure TForm1.bCloseClick(Sender: TObject); {закрытие программы}
begin
Close;
end;
procedure TForm1.Open1Click(Sender: TObject); {открытие файла сохраненной ключевой последовательности}
begin
with dOpen do
if Execute then
begin
mmo1.Lines.LoadFromFile(filename);
historylist.add(filename);
Caption := 'Генератор Псевдослучайных Последовательностей - ' + ExtractFileName(FileName);
dSave.filename := filename;
end;
end;
procedureTForm1.SaveClick(Sender:TObject); {сохранение сформированной ключевой последовательности в файл}
begin
if dOpen.FileName <> '' then
mmo1.Lines.SaveToFile(dSave.FileName)
else
SaveAsClick(Sender);
end;
procedure TForm1.SaveAsClick(Sender: TObject); {сохранение сформированной ключевой последовательности в файл}
begin
with dSave do
if execute then
begin
mmo1.Lines.SaveToFile(FileName);
Caption:= 'Генератор Псевдослучайных Последовательностей - ' +ExtractFileName(FileName);
end;
end;
procedureTForm1.SaveKeyClick(Sender:TObject); {сохранение кодированной в двойчную систему исчисления сформированной ключевой последовательности в файл}
begin
with dSave do
if execute then
begin
outN.SaveToFile(FileName);
end;
end;
procedure TForm1.AboutClick(Sender: TObject); {о программе}
begin
MessageDlg('Генератор псевдослучайных последовательностейv1.00',mtInformation, [mbOK],0);
end;
procedureTForm1.bClearClick(Sender:TObject); {очистка формы отображения ключевой последовательности}
begin
mmo1.Clear;
end;
procedureTForm1.bGistoClick(Sender:TObject); {процедура тестирования равномерности распределения символов в исследуемой последовательности}
var i, j, f, max: integer; a: string;
begin
gType:=strtoint(sType.text); //разрядность для считывания из ключевой последовательности
Form2.Show;
Form2.Series1.Clear;
max:= 0;
fori:= 1togTypedomax:=max* 10 + 9; //нахождение максимального значения "max" по заданной разрядности
fori:= 0tomaxdob[i] := 0; //обнуление массива-счетчика повторений
fori:= 0tommo1.Lines.Count- 1do//цикл подсчета повторяющихся значений в ключевой последовательности
begin
a:=mmo1.Lines[i]; //считывание из ключевой последовательности построчно
j:= 1; //счетчик перемещения по последовательности
whilej<=length(a)do//цикл подсчета количества повторяющихся чисел заданной разрядностиgTypeдо конца строки
begin
f:=strtoint(copy(a,j,gType)); //копируем из последовательности число согласно разрядности
j:=j+gType;
inc(b[f]); //счетчик повторений
end;
end;
fori:= 0tomaxdo//вывод на форму гистограммы по найденным значениям
begin
Form2.Series1.AddXY(i, b[i]);
end;
end;
procedureTForm1.bDotClick(Sender:TObject); {процедура тестирования зависимости между элементами исследуемой последовательности}
var i, j, x, y: integer; a: string; sD: real;
begin
gType := strtoint(sType.text);
Form3.Show;
Form3.Image1.Canvas.Brush.Color := clWhite; //сбрасываем на белый фон поля для отображения
Form3.Image1.Canvas.FillRect(Rect(0, 0, 909, 909)); //задаём размер на форме для отображения результата
sD:= 11; //делитель разрядности 4 для отображения на форме всех найденных значений
ifgType= 3thensD:= 1.1else//подсчет делителя для заданной разрядности
if gType = 2 then sD := 0.1 else
if gType = 1 then sD := 0.01 else
if gType = 5 then sD := 110.01 else
if gType = 6 then sD := 1100.1;
y:= 0;
fori:= 0tommo1.Lines.Count- 1do//цикл исследования по всем сформированным ключевым последовательностям
begin
a:=mmo1.Lines[i]; //считывание из ключевой последовательности построчно
j:= 1; //счетчик перемещения по последовательности
whilej<length(a)do//цикл считывания значений требуемой разрядности из ключевой последовательности
begin
x:=strtoint(copy(a,j,gType)); //копируем из последовательности число согласно разрядности
j:=j+gType;
Form3.Image1.Canvas.Pixels[Round(y/sD),Round(x/sD)] :=clBlack; //отображение на форме точек с координатами предыдущего/текущего значения требуемой разрядности из последовательности
y := x;
end;
end;
end;
procedureTForm1.bMonotClick(Sender:TObject); {процедура тестирования равномерности распределения символов в исследуемой последовательности на основании участков неубывания и невозрастания}
var i, j, x1, x2, k, m, l: integer; a: string; up1, up2: boolean;
begin
gType := strtoint(sType.text);
Form4.Show;
Form4.Series1.Clear;
up1 :=true; //флаги характера неубывания/невозрастания исследуемой последовательности
up2 :=true;
l:= 1; //начальное значение счетчика количества изменения характера последовательности
k:= 0; //задание счетчика неубывания
m:= 0; //задание счетчика невозрастания
x2 := 0; //предыдущее число последовательности для сравнения
fori:= 0tommo1.Lines.Count- 1do//цикл исследования по всем сформированным ключевым последовательностям
begin
a:=mmo1.Lines[i]; //считывание из ключевой последовательности построчно
j:= 1; //счетчик перемещения по последовательности
whilej<length(a)do//цикл считывания значений требуемой разрядности из ключевой последовательности
begin
x1 :=strtoint(copy(a,j,gType)); //копируем из последовательности число согласно разрядности
j:=j+gType;
ifx1 >x2then//проверка неубывания/невозрастания предыдущего/текущего значения требуемой разрядности из последовательности
begin
inc(k); //счетчик неубывания
up1 := true;
end else
if x1 < x2 then
begin
inc(m); //счетчик невозрастания
up1 :=false;
end else
begin
inc(k);
inc(m);
end;
ifup1 <>up2then//вывод на форму гистограммы, отображающей последовательно периоды неубывания/невозрастания при смене характера
begin
if not up1 then
begin
Form4.Series1.SeriesColor:=clRed; //невозрастание отображаем красным цветом
Form4.Series1.AddXY(l, k, '', clRed);
k:= 0; //сброс счетчиков неубывания/невозрастания
m:= 1;
end else
begin
Form4.Series1.SeriesColor := clBlack; //невозрастание отображаем черным цветом
Form4.Series1.AddXY(l, m, '', clBlack);
m:= 0; //сброс счетчиков неубывания/невозрастания
k:= 1;
end;
inc(l); //счетчик количества изменения характера последовательности
end;
up2 := up1;
x2 := x1;
end;
end;
end;
procedureTForm1.bSeriesClick(Sender:TObject); {процедура тестирования равномерности распределения символов в исследуемой последовательности на основании появления серий единиц и нулей}
var i, j, x, e, k, m, l, s2, dType: integer; a, D: string; aD: TstringList;
begin
gType := strtoint(sType.text);
aD:=TStringList.Create; //переменная для хранения кодированной последовательности
aD.Add(''); //формирование начального значения переменной для хранения кодированной последовательности
Form5.Show;
Form5.Series1.Clear;
s2 := 0;
fori:= 1togTypedos2 :=s2 * 10 + 9; //нахождение максимального значения "max" по заданной разрядности
fori:= 0tos2dob[i] := 0; //обнуление массива-счетчика повторений
dType:= 13; //разрядность чисел кодированной последовательности, рассчитывается по заданной пользователем разрядности исходной ключевой последовательности
if gType = 3 then dType := 9 else
if gType = 2 then dType := 6 else
if gType = 1 then dType := 3 else
if gType = 5 then dType := 16 else
if gType = 6 then dType := 19;
m := 1;
l:= 0;
fori:= 0tommo1.Lines.Count- 1do//цикл исследования по всем сформированным ключевым последовательностям
begin
a:=mmo1.Lines[i]; //считывание из ключевой последовательности построчно
j:= 1;
whilej<=length(a)do//цикл считывания значений требуемой разрядности из ключевой последовательности
begin
x:=strtoint(copy(a,j,gType)); //копируем из последовательности число согласно разрядности
j := j + gType;
D := '';
whilex>= 2do//перевод из десятеричной системы исчисления в двоичную
begin
e := x mod 2;
x := x div 2;
D := IntToStr(e) + D;
end;
D:=IntToStr(x) +D; //кодированное двоичное значение
fork:=length(D)todTypedoD:= '0' +D; //восстановление требуемой разрядности для вычисленного двоичного значения
ifm<= 9then//запись в переменную по 9 чисел требуемой разрядности в строке
begin
aD.Strings[l] :=aD.Strings[l] +D; //добавление значения в текущую строку
inc(m);
endelse
begin
aD.Add(D); //начало записи в новую строку
m:= 2; //сброс счетчика значений в строке
inc(l); //счетчик строк
end;
end;
end;
fork:= 0toaD.Count- 1do//цикл исследования по всем кодированным двоичным последовательностям
fori:= 1tolength(aD.Strings[k])do//считывание из ключевой последовательности построчно
begin
inc(b[strtoint(aD.Strings[k][i])]); //подсчет количества "0" и "1"
if(imod2) = 0then//подсчет количества требуемых сочетаний "0" и "1"
begin
if copy(aD.Strings[k], i-1, 2) = '00' then inc(b[2]);
if copy(aD.Strings[k], i-1, 2) = '01' then inc(b[3]);
if copy(aD.Strings[k], i-1, 2) = '10' then inc(b[4]);
if copy(aD.Strings[k], i-1, 2) = '11' then inc(b[5]);
end;
if(imod3) = 0then//подсчет количества требуемых сочетаний "0" и "1"
begin
if copy(aD.Strings[k], i-2, 3) = '000' then inc(b[6]);
if copy(aD.Strings[k], i-2, 3) = '001' then inc(b[7]);
if copy(aD.Strings[k], i-2, 3) = '010' then inc(b[8]);
if copy(aD.Strings[k], i-2, 3) = '011' then inc(b[9]);
if copy(aD.Strings[k], i-2, 3) = '100' then inc(b[10]);
if copy(aD.Strings[k], i-2, 3) = '101' then inc(b[11]);
if copy(aD.Strings[k], i-2, 3) = '110' then inc(b[12]);
if copy(aD.Strings[k], i-2, 3) = '111' then inc(b[13]);
end;
end;
{вывод на форму гистограммы с посчитанным значением количества искомых комбинаций "0" и "1"}
Form5.Series1.AddXY(0, b[0], '"0"');
Form5.Series1.AddXY(1, b[1], '"1"');
Form5.Series1.AddXY(2, b[2], '"00"');
Form5.Series1.AddXY(3, b[3], '"01"');
Form5.Series1.AddXY(4, b[4], '"10"');
Form5.Series1.AddXY(5, b[5], '"11"');
Form5.Series1.AddXY(6, b[6], '"000"');
Form5.Series1.AddXY(7, b[7], '"001"');
Form5.Series1.AddXY(8, b[8], '"010"');
Form5.Series1.AddXY(9, b[9], '"011"');
Form5.Series1.AddXY(10, b[10], '"100"');
Form5.Series1.AddXY(11, b[11], '"101"');
Form5.Series1.AddXY(12, b[12], '"110"');
Form5.Series1.AddXY(13, b[13], '"111"');
end;
procedureTForm1.bKnytClick(Sender:TObject); {процедура тестирования статистических свойств исследуемой последовательности, автор Д. Кнут}
var
i, j, x, e, k, m, l, u, s2, dType: integer;
a, Dv: string; aD: TstringList;
kn, Km: real;
c: array [0..9] of integer;
d: array [1..6] of integer;
p: array [1..6] of real;
St:TTwoDimArray; //переменная для вычисления числа Стерлинга
begin
gType := strtoint(sType.text);
ifmmo1.Lines.Strings[0] = ''thenFill; //контроль генерации ключевой последовательности
Form6.Show;
Form6.mmo1.Clear;
aD:=TStringList.Create; //переменная для хранения кодированной последовательности
aD.Add(''); //формирование начального значения переменной для хранения кодированной последовательности
for i := 1 to 6 do d[i] := 0;
for i := 1 to 6 do p[i] := 0;
s2 := 0;
fori:= 1togTypedos2 :=s2 * 10 + 9; //нахождение максимального значения "max" по заданной разрядности
fori:= 0tos2dob[i] := 0; //обнуление массива-счетчика повторений
dType:= 13; //разрядность чисел кодированной последовательности, рассчитывается по заданной пользователем разрядности исходной ключевой последовательности
ifgType= 3thendType:= 9else//разрядность чисел кодированной последовательности, рассчитывается по заданной пользователем разрядности исходной ключевой последовательности
if gType = 2 then dType := 6 else
if gType = 1 then dType := 3 else
if gType = 5 then dType := 16 else
if gType = 6 then dType := 19;
m:= 1;
l:= 0;
fori:= 0tommo1.Lines.Count- 1do//цикл исследования по всем сформированным ключевым последовательностям
begin
a:=mmo1.Lines[i]; //считывание из ключевой последовательности построчно
j:= 1;
whilej<=length(a)do//цикл считывания значений требуемой разрядности из ключевой последовательности
begin
x:=strtoint(copy(a,j,gType)); //копируем из последовательности число согласно разрядности
u:= 0;
fork:= 0to9doc[k] := 0; //обнуление массива подсчета повторения чисел
fork:= 0togType- 1do//подсчет количества неповторяющихся значений в числе
inc(c[strtoint(a[j + k])]);
fork:= 0to9do//подсчет количества по неповторяющимся числам
if c[k] <> 0 then inc(u);
inc(d[u]); //вычисление массива числа подпоследовательностей, содержащих различные числа
j := j + gType;
Dv := '';
whilex>= 2do//перевод из десятеричной системы исчисления в двоичную
begin
e := x mod 2;
x := x div 2;
Dv := IntToStr(e) + Dv;
end;
Dv:=IntToStr(x) +Dv; //кодированное двоичное значение
fork:=length(Dv)todTypedoDv:= '0' +Dv; //восстановление требуемой разрядности для вычисленного двоичного значения
ifm<= 9then//запись в переменную по 9 чисел требуемой разрядности в строке
begin
aD.Strings[l] :=aD.Strings[l] +Dv; //добавление значения в текущую строку
inc(m);
endelse
begin
aD.Add(Dv); //начало записи в новую строку
m:= 2; //сброс счетчика значений в строке
inc(l); //счетчик строк
end;
end;
end;
fork:= 0toaD.Count- 1do//цикл исследования по всем кодированным двоичным последовательностям
fori:= 1tolength(aD.Strings[k])do//считывание из ключевой последовательности построчно
begin
inc(b[strtoint(aD.Strings[k][i])]); //подсчет количества "0" и "1"
if(imod2) = 0then//подсчет количества требуемых сочетаний "0" и "1"
begin
if copy(aD.Strings[k], i-1, 2) = '00' then inc(b[2]);
if copy(aD.Strings[k], i-1, 2) = '01' then inc(b[3]);
if copy(aD.Strings[k], i-1, 2) = '10' then inc(b[4]);
if copy(aD.Strings[k], i-1, 2) = '11' then inc(b[5]);
end;
if(imod3) = 0then//подсчет количества требуемых сочетаний "0" и "1"
begin
if copy(aD.Strings[k], i-2, 3) = '000' then inc(b[6]);
if copy(aD.Strings[k], i-2, 3) = '001' then inc(b[7]);
if copy(aD.Strings[k], i-2, 3) = '010' then inc(b[8]);
if copy(aD.Strings[k], i-2, 3) = '011' then inc(b[9]);
if copy(aD.Strings[k], i-2, 3) = '100' then inc(b[10]);
if copy(aD.Strings[k], i-2, 3) = '101' then inc(b[11]);
if copy(aD.Strings[k], i-2, 3) = '110' then inc(b[12]);
if copy(aD.Strings[k], i-2, 3) = '111' then inc(b[13]);
end;
end;
Form6.mmo1.Lines.Add('Тест Проверка несцепленных серий');
kn:= 0;
fori:= 0to1do//подсчет распределения хи-квадрат для серий из 1 цифры
kn := kn + (b[i] - (length(ad.Strings[0]) * aD.Count / 2)) * (b[i]-(length(ad.Strings[0]) * aD.Count / 2));
kn := kn / (length(ad.Strings[0]) * aD.Count / 2);
Form6.Mmo1.Lines.Add('для серии длиной 1 - ' +floattostr(roundto(kn,-2))); //вывод на форму подсчитанного значения
kn:= 0;
fori:= 2to5do//подсчет распределения хи-квадрат для серий из 2 цифр
kn := kn + (b[i] - (length(ad.Strings[0]) * aD.Count / 8)) * (b[i] - (length(ad.Strings[0]) * aD.Count / 8));
kn := kn / (length(ad.Strings[0]) * aD.Count / 8);
Form6.Mmo1.Lines.Add('для серии длиной 2 - ' +floattostr(roundto(kn,-2))); //вывод на форму подсчитанного значения
kn:= 0;
fori:= 6to13do//подсчет распределения хи-квадрат для серий из 3 цифр
kn := kn + (b[i] - (length(ad.Strings[0]) * aD.Count / 24)) * (b[i] - (length(ad.Strings[0]) * aD.Count / 24));
kn := kn / (length(ad.Strings[0]) * aD.Count / 24);
Form6.Mmo1.Lines.Add('для серии длиной 3 - ' +floattostr(roundto(kn,-2))); //вывод на форму подсчитанного значения
Form6.mmo1.Lines.Add('анализируется при помощи критерия хи-квадрат с числом степеней свободы, равным ' +floattostr(power(2,gType) - 1));
GetStirlingNumbers(gType,gType,St); //получение таблицы чисел Стирлинга
p[1] := 7; //вычисление множителяpiдля нахождения распределения хи-квадрат
for i := 2 to gType do
p[i] := p[i-1] * (7-i+1);
for i := 1 to gType do
p[i] := p[i] * St[gType, i] / power(7, gType);
Km:= 0;
fori:= 1togTypedo//подсчет распределения хи-квадрат
if d[i] <> 0 then
Km := Km + (d[i] - length(mmo1.Lines.Strings[0]) * mmo1.Lines.Count * p[i]/ gType) * (d[i] - length(mmo1.Lines.Strings[0]) * mmo1.Lines.Count * p[i]/ gType) / (length(mmo1.Lines.Strings[0]) * mmo1.Lines.Count * p[i]/ gType);
Form6.mmo1.Lines.Add('Тест Проверка комбинаций');
Form6.mmo1.Lines.Add('распределение хи-квадрат = ' +floattostr(roundto(Km,-2))); //вывод на форму подсчитанного значения
Form6.mmo1.Lines.Add('анализируется при помощи критерия хи-квадрат с числом степеней свободы, равным ' +inttostr(gType-1));
end;
procedureTForm1.GetStirlingNumbers(n_max,m_max:Integer;varStirlingNumbers:TTwoDimArray); {вычисление таблицы значений Стирлинга}
vari,j:integer;
begin
SetLength(StirlingNumbers,n_max+1,m_max+1); //Выделение памяти под массив чисел
for i := 0 to n_max do //Заполнение массива S(n,0) = 0
StirlingNumbers[i, 0] := 0;
for i := 0 to n_max do //Заполнение массива S(n,n) = 1
StirlingNumbers[i, i] := 1;
for i := 1 to n_max do //Заполнение массива S(n,m) = S(n-1,m-1) + m*S(n-1,m)
for j := 1 to i-1 do
StirlingNumbers[i, j] := StirlingNumbers[i-1, j-1] + j * StirlingNumbers[i-1, j];
end;
initialization
randomize;
end.
