Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
диплом_без_exe / Второй основной вариант.docx
Скачиваний:
92
Добавлен:
21.05.2015
Размер:
1.73 Mб
Скачать

Заключение

Поставленная задача была выполнена в полном объёме. В рамках дипломной работы был проведен анализ существующих алгоритмов генерации псевдослучайных последовательностей. Основным достоинством блоков стохастического преобразования и генераторов ПСП на их основе является эффективная программная и аппаратная реализация при приемлемой для большинства приложений криптостойкости.

Была написана программа генерации ключевых последовательностей с возможностью их тестирования, в котором сравниваются свойства сформированных возможным алгоритмом генерации псевдослучайных последовательностей со свойствами истинно случайных последовательностей. На основе изученных сведений можно сделать вывод о наиболее рациональном и наименее ресурсоемком проекте, отвечающим всем требованиям и критериям работы с информацией.

Список использованных источников

  1. Воронков Б.Н. Элементы теории чисел и криптозащита: учеб. пособие для вузов / Б. Н. Воронков – Воронеж: Воронежский ГУ, 2008. – 87с.

  2. Воронков Б.Н. Криптографические методы защиты информации: учеб. пособие для вузов / Б. Н. Воронков – Воронеж: Воронежский ГУ, 2008. – 58с.

  3. Осмоловский С.А. Стохастические методы передачи данных: учеб. пособие / С. А. Осмоловский – М.: Радио и связь, 1991. – 240с.

  4. ООО «СТОКОС» - Инновационные разработки IT-технологий: [сайт]. – (URL: http://www.stokos.ru/) (дата обращения: 24.03.2013).

  5. Пат. 2367007 Российская Федерация, МПК G06F 11/00 H04L 1/20 H03M 13/35. Способ передачи и комплексной защиты информации / Осмоловский С.А. – № 2007132646/09 ; заявл. 30.08.2007 ; опубл. 10.09.2009, Бюл. № 25. – 22с. : ил.

  6. Иванов М.А. Стохастические методы и средства защиты информации в компьютерных системах и сетях: учеб. пособие / М. А. Иванов, А. В. Ковалев, Н. А. Мацук, Д. М. Михайлов, И. В. Чугунков ­­­– М.: КУДИЦ-ПРЕСС, 2009. – 512с.

  7. Иванов М.А. Теория, применение и оценка качества генераторов псевдослучайных последовательностей: учеб. пособие / М. А. Иванов, И. В. Чугунков – М.: КУДИЦ-ОБРАЗ, 2003. – 240с.

  8. Квантили распределения хи-квадрат: [сайт]. – (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.

Соседние файлы в папке диплом_без_exe