Автор работы: Пользователь скрыл имя, 14 Мая 2013 в 15:45, курсовая работа
Данный курсовой проект является разработкой и исследованием алгоритма и прикладной программы моделирования автономной матричной линейной последовательностной машины (АМЛПМ) над полем GF(р).
Данная тема является актуальной, так как линейные последовательностные машины (ЛПМ) широко применяются в автоматике и вычислительной технике в качестве генераторов последовательностей, счетчиков, кодирующих и декодирующих устройств, устройств обнаружения а исправления ошибок, при моделировании нейронных сетей и т. д.
1. Вступление. 3
2. Краткие теоретические сведения 4
2.1 Основные аспекты псевдослучайных последовательностей 4
2.2 Разновидности ПСП 6
2.1.1. М-последовательности 6
2.2.3. Последовательности Голда 8
2.2.4. Последовательности Касами 10
2.2.5. Последовательности Баркера 11
2.3 Случайные и псевдослучайные числа 12
3. Алгоритм работы программы 14
Описание схемы алгоритма основного модуля: 15
4. Описание программы 17
5. Описание и обоснование выбора состава технических средств 19
6. Результаты работы программы 20
7. Выводы 22
8. Литература 23
var
i, k: Integer;
begin
with ComboBoxPN do
begin
Items.Clear;
k := ComboBoxDegreeN.ItemIndex;
if k > -1 then
begin
for i := 0 to PolinomList[k].List.Count - 1 do
begin
Items.Add(PolinomList[k].List[
end;
end;
end;
// InitMatr(1);
end;
procedure TFmKursovoy.ComboBoxPMChange(
begin
Reinit;
end;
procedure TFmKursovoy.ComboBoxPNChange(
begin
Reinit;
end;
procedure TFmKursovoy.CreateAfv;
var
aM: TMatrix;
i,j,k: Integer;
d: double;
function MySum(a1,a2:Integer):Integer;
begin
{if a1=a2 then
Result := 1
else
Result := 0; }
Result := a1 xor a2;
end;
begin
aM := TMatrix.Create(buf1.RowCount, buf1.ColCount);
i := 0;
while i< 100 do //buf2.ColCount-1
begin
for k := i to buf2.ColCount-1 do
aM[0,k-i] := buf1[0,k-i] * buf2[0,k];
for k := buf2.ColCount-i to buf2.ColCount-1 do
aM[0,k] := buf1[0,k] * buf2[0,k-(buf2.ColCount-i)];
d := 0;
for j := 0 to aM.ColCount-1 do
d := d + aM[0,j];
d := d / Fnok;
afv.Add(d);
i := i + 1;
end;
end;
procedure TFmKursovoy.CreateMat2;
var i,j,k: Integer;
n: Integer;
function GetJ(const s: String):Integer;
var npos: Integer;
begin
npos := pos(' ',s);
if npos>0 then
Result := StrToInt(Trim(copy(s,1,npos)))
else
Result := 0;
end;
begin
Buf1 := TMatrix.Create(1,FMatList.
Buf2 := TMatrix.Create(1,FMatList.
for I := 0 to FMatList.Count-1 do
begin
Randomize;
k := Random(MatS.RowCount);
for j := i*MatS.ColCount to (i+1)*MatS.ColCount-1 do
try
if j>=Buf1.ColCount then
begin
ShowMessage('Uu!');
end;
Buf1[0,j] :=
FMatList[i][k,j-i*MatS.
except
ShowMessage(' count ='+IntToStr(Buf1.ColCount)+' j-'+IntTostr(j)+' '+IntTostr(i)+ ' '+IntTostr(FMatList.Count));
Raise;
end;
end;
for I := 0 to FMatList.Count-1 do
begin
Randomize;
k := Random(MatS.ColCount);
for j := i*MatS.RowCount to (i+1)*MatS.RowCount-1 do
try
Buf2[0,j] :=
FMatList[i][j-i*MatS.RowCount,
except
ShowMessage(' count ='+IntToStr(Buf2.ColCount)+' j-'+IntTostr(j));
Raise;
end;
end;
Fnok := FuncNok(buf1.ColCount,buf2.
Create_AFX(buf1, Fnok);
Create_AFX(buf2, Fnok);
n := CalcHeming(buf1);
Memo1.Lines.Add(' Период матрицы A = '+IntToStr(GetPeriodA(
GetJ(ComboBoxPn.Text),
Memo1.Lines.Add(' Период матрицы B = '+IntToStr(GetPeriodA(
GetJ(ComboBoxPm.Text),
Memo1.Lines.Add(' Период матрицы S = '+IntToStr(FMatList.Count));
Memo1.Lines.Add('Вес Хеминга ПСП1 = '+IntTostr(n));
n := CalcHeming(buf2);
Memo1.Lines.Add('Вес Хеминга ПСП2 = '+IntTostr(n));
Application.ProcessMessages;
CreateAfv;
// WriteMatrix(buf1);
// WriteMatrix(buf2);
end;
procedure TFmKursovoy.Create_AFX(var amat: TMatrix; anok: Integer);
var nCount: integer;
i: Integer;
aShablon: TMatrix;
begin
aShablon := TMatrix.Create(aMat);
while aMat.ColCount < anok do
aMat.InsertCols(aShablon,aMat.
end;
procedure TFmKursovoy.Button2Click(
var i: Integer;
begin
{ ShowMessage(IntTostr(1 and 0));
ShowMessage(IntTostr(1 and 1));
ShowMessage(IntTostr(0 and 0));}
if afv.count>0 then
with fmChart do
begin
List.Clear;
for i:=0 to afv.count-1 do
List.Add(afv[i]);
ShowModal;
end;
end;
function TFmKursovoy.CalcHeming(aMat:
var i: Integer;
begin
Result := 0;
for I := 0 to amat.ColCount-1 do
if aMat[0,i]=1 then
Inc(Result);
end;
procedure TFmKursovoy.CalcList;
var i: Integer;
m: TMatrix;
begin
FMatList.Clear;
m := TMatrix.Create(MatA);
m.Mult2(MatS);
m.Mult2(MatB);
FMatList.Add(m);
for I := 1 to 10000000 do
begin
m := TMatrix.Create(MatA);
m.Mult2(FMatList[i-1]);
m.Mult2(MatB);
FMatList.Add(m);
if FMatList[i].Equivalent(MatS)
begin
//ShowMessage('Ok-'+IntTostr(
Break;
end;
end;
CreateMat2;
// ShowMessage('Stop');
// WriteMemo;
end;
procedure TFmKursovoy.
var
i, k: Integer;
begin
with ComboBoxPM do
begin
Items.Clear;
k := ComboBoxDegreeM.ItemIndex;
if k > -1 then
begin
for i := 0 to PolinomList[k].List.Count - 1 do
begin
Items.Add(PolinomList[k].List[
end;
end;
end;
// InitMatr(2);
end;
procedure TFmKursovoy.FormCreate(Sender: TObject);
var
mPolinom: TPolinom;
begin
Panel1.Caption := '';
Panel2.Caption := '';
//Panel3.Caption := '';
//Panel4.Caption := '';
//Panel5.Caption := '';
FPolinomList := TList<TPolinom>.Create;
FMatList := TList<TMatrix>.Create;
LoadPolinoms;
InitComboBox;
Caption := 'Курсовой (Коршуна Александра)';
MatA := nil;
MatB := nil;
MatS := nil;
afv := TList<double>.Create;
Memo1.Clear;
end;
procedure TFmKursovoy.FormDestroy(
var
i: Integer;
begin
for I := 0 to FPolinomList.Count-1 do
FPolinomList[i].destroy;
for I := 0 to FMatList.Count-1 do
FMatList[i].destroy;
FreeAndNil(FPolinomList);
FreeAndNil(FMatList);
FreeAndNil(MatA);
FreeAndNil(MatB);
FreeAndNil(MatS);
FreeAndNil(afv);
end;
procedure TFmKursovoy.FormResize(Sender: TObject);
var
nWidth: Integer;
begin
nWidth := ClientWidth div 3;
GroupBox1.Width := nWidth;
GroupBox2.Width := nWidth;
end;
procedure TFmKursovoy.InitComboBox;
var
i: Integer;
begin
for i := 0 to PolinomList.Count - 1 do
begin
ComboBoxDegreeM.Items.Add(
if PolinomList[i].Degree<8 then
ComboBoxDegreeN.Items.Add(
end;
end;
procedure TFmKursovoy.InitMatr(aType: Integer);
var
mt: TMatrix;
nCount: Integer;
i,k: Integer;
mPolinom: TPolinom;
polinom_index: Integer;
BinList: TIntList;
begin
BinList := TIntList.Create;
try
if aType = 1 then
begin
if ComboBoxDegreeN.ItemIndex > -1 then
begin
mPolinom := PolinomList[ComboBoxDegreeN.
mt := MatA;
if ComboBoxPN.ItemIndex > -1 then
polinom_index := ComboBoxPN.ItemIndex
else
raise Exception.Create('Не выбран полином!');
end;
end
else if aType = 2 then
begin
mPolinom :=
PolinomList[ComboBoxDegreeM.
if ComboBoxDegreeM.ItemIndex > -1 then
begin
mt := MatB;
if ComboBoxPM.ItemIndex > -1 then
polinom_index := ComboBoxPM.ItemIndex
else
raise Exception.Create('Не выбран полином!');
end;
end
else
Raise Exception.Create('Не допустимый параметр');
nCount := mt.RowCount;
with mt do
begin
mPolinom.CalcBinPolinom(
for i:=0 to nCount-1 do
begin
if (aType=1) then
begin
if (i)=0 then
begin
for k := 0 to nCount-1 do
begin
mt[i,k] := BinList[BinList.Count-nCount+
end;
end
else
begin
mt[i,i-1] := 1;
end;
end
else
if (aType=2) then
begin
mt[i,0] := BinList[BinList.Count-nCount+
if i<nCount-1 then
mt[i,i+1] := 1;
end;
end;
end;
finally
FreeAndNil(BinList);
end;
end;
procedure TFmKursovoy.LoadPolinoms;
var
SList: TStringList;
i, nEnd: Integer;
mPolinom: TPolinom;
begin
SList := TStringList.Create;
try
SList.LoadFromFile(
for i := 0 to SList.Count - 1 do
begin
if pos('<n=', SList[i]) = 1 then
begin
mPolinom := TPolinom.Create;
nEnd := pos('>', SList[i]);
mPolinom.Degree := StrToInt(Copy(SList[i], 4, nEnd - 4));
end
else if pos('</n=', SList[i]) = 1 then
begin
PolinomList.Add(mPolinom);
end
else if length(Trim(SList[i])) <> 0 then
mPolinom.List.Add(SList[i]);
end;
finally
FreeAndNil(SList);
end;
end;
function TFmKursovoy.Nod(a, b: Integer): Integer;
begin
while (a*b <> 0) do
if (a >= b) then
a := a mod b
else
b := b mod a;
Result := a + b;
end;
function TFmKursovoy.FuncNok(a, b: Integer): Int64;
var n: Integer;
begin
n := Nod(a,b);
Result := a*(b div n);
end;
function TFmKursovoy.GetPeriodA(n, j, nType: Integer): Integer;
var n2: Integer;
begin
n2 := Round(power(2,n));
Result := Round((n2-1)/IfThen(nType=2,
end;
function TFmKursovoy.GetTypeA(const s: String): Integer;
begin
if CharInSet(s[length(s)],['A','
Result := 2
else
Result := 1;
end;
procedure TFmKursovoy.ReInit;
var
m, n, i, j: Integer;
begin
m := -1;
n := -1;
if ComboBoxDegreeN.ItemIndex > -1 then
n := PolinomList[ComboBoxDegreeN.
if ComboBoxDegreeM.ItemIndex > -1 then
m := PolinomList[ComboBoxDegreeM.
if (m = -1) or (n = -1) then
Exit;
FreeAndNil(MatS);
FreeAndNil(MatA);
FreeAndNil(MatB);
MatS := TMatrix.Create(n,m);
MatA := TMatrix.Create(n,n);
MatB := TMatrix.Create(m,m);
{with MemTableEh_S do
begin
Close;
EmptyTable;
FieldDefs.Clear;
for i := 0 to n - 1 do
FieldDefs.Add('f' + IntTostr(i), ftInteger);
CreateDataSet;
Open; }
for i := 0 to n - 1 do
begin
Randomize;
for j := 0 to m - 1 do
MatS[i,j] := Random(2);
end;
// end; }
InitMatr(1);
InitMatr(2);
ShowMatrix(VirtualStringTree1,
ShowMatrix(VirtualStringTree2,
ShowMatrix(VirtualStringTree3,
end;
procedure TFmKursovoy.ShowMatrix(aVt:
var i:Integer;
begin
aVt.RootNodeCount := 0;
aVt.RootNodeCount := aMatrix.RowCount;
for i := 0 to aMatrix.ColCount-1 do
aVt.Header.Columns.Add;
end;
procedure TFmKursovoy.VirtualStringTree1
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
mt: TMatrix;
begin
if Sender=VirtualstringTree1 then
mt := MatA
else
if Sender=VirtualstringTree2 then
mt := MatS
else
if Sender=VirtualstringTree3 then
mt := MatB;
if (Column>-1) and (Column< mt.ColCount) then
CellText := IntToStr(Round(mt[node.Index,
else
CellText := '';
end;
procedure TFmKursovoy.WriteMemo;
var
k: Integer;
begin
Memo1.Clear;
WriteMatrix(buf1);
end;
procedure TFmKursovoy.WriteMatrix(
var i,j: Integer;
s: String;
begin
Memo1.Lines.Add('');
for I := 0 to aMatrix.RowCount-1 do
begin
s:= '';
for j := 0 to aMatrix.ColCount-1 do
s := s+IntToStr(aMatrix[i,j]);
Memo1.Lines.Add(s);
end;
end;
end.
Информация о работе Теория алгоритмов и вычислительных процессов