Теория алгоритмов и вычислительных процессов

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

Курсач.doc

— 707.00 Кб (Скачать файл)

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[i]);

      end;

    end;

  end;

//  InitMatr(1);

end;

 

procedure TFmKursovoy.ComboBoxPMChange(Sender: TObject);

begin

  Reinit;

end;

 

procedure TFmKursovoy.ComboBoxPNChange(Sender: TObject);

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.Count * MatS.ColCount);

  Buf2 := TMatrix.Create(1,FMatList.Count * MatS.RowCount);

  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.ColCount];

    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,k];

    except

      ShowMessage(' count ='+IntToStr(Buf2.ColCount)+'  j-'+IntTostr(j));

      Raise;

    end;

  end;

  Fnok := FuncNok(buf1.ColCount,buf2.ColCount);

  Create_AFX(buf1, Fnok);

  Create_AFX(buf2, Fnok);

  n := CalcHeming(buf1);

  Memo1.Lines.Add(' Период матрицы A = '+IntToStr(GetPeriodA(StrToInt(Trim(ComboBoxDegreeN.Text)),

     GetJ(ComboBoxPn.Text),GetTypeA(ComboBoxPn.Text))));

  Memo1.Lines.Add(' Период матрицы B = '+IntToStr(GetPeriodA(StrToInt(Trim(ComboBoxDegreeM.Text)),

     GetJ(ComboBoxPm.Text),GetTypeA(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.ColCount-1);

end;

 

procedure TFmKursovoy.Button2Click(Sender: TObject);

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:TMatrix):Integer;

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)then

    begin

      //ShowMessage('Ok-'+IntTostr(i));

      Break;

    end;

  end;

  CreateMat2;

//  ShowMessage('Stop');

//  WriteMemo;

end;

 

procedure TFmKursovoy.ComboBoxDegreeMChange(Sender: TObject);

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[i]);

      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(Sender: TObject);

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(IntTostr(PolinomList[i].Degree));

    if PolinomList[i].Degree<8 then

      ComboBoxDegreeN.Items.Add(IntTostr(PolinomList[i].Degree));

  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.ItemIndex];

        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.ItemIndex];

      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(BinList,polinom_index);

 

      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+k];

            end;

          end

          else

          begin

            mt[i,i-1] := 1;

          end;

       end

        else

        if (aType=2)  then

        begin

          mt[i,0] := BinList[BinList.Count-nCount+i];

          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(ExtractFileDir(Application.ExeName) + '\polinom.txt');

    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,Nod(n2,j),1));

end;

 

 

function TFmKursovoy.GetTypeA(const s: String): Integer;

begin

  if CharInSet(s[length(s)],['A','B','C','D']) then

    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.ItemIndex].Degree;

  if ComboBoxDegreeM.ItemIndex > -1 then

    m := PolinomList[ComboBoxDegreeM.ItemIndex].Degree;

  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,MatA);

  ShowMatrix(VirtualStringTree2,MatS);

  ShowMatrix(VirtualStringTree3,MatB);

 

end;

 

procedure TFmKursovoy.ShowMatrix(aVt:TVirtualStringTree; aMatrix: TMatrix);

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.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;

  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,Column]))

  else

    CellText := '';

end;

 

procedure TFmKursovoy.WriteMemo;

var

  k: Integer;

begin

  Memo1.Clear;

  WriteMatrix(buf1);

 

end;

 

procedure TFmKursovoy.WriteMatrix(amatrix:tMatrix);

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.

 


Информация о работе Теория алгоритмов и вычислительных процессов