Арифметика многочленов

Автор: Пользователь скрыл имя, 17 Декабря 2010 в 12:45, контрольная работа

Краткое описание

Выбор структуры хранения полинома. Полиноминальная арифметика.

Файлы: 1 файл

1 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ.doc

— 278.50 Кб (Скачать)

     Любое поле представляет собой область единственного разложения на множители, в которой каждый ненулевой элемент обратим и в которой не существует простых элементов. Целые числа образуют область единственного разложения, в которой обратимые элементы +1 и —1, а простые —±2, ±3, ±5, ±7, ±11 и т. д. Случай, когда S содержит все целые числа, принципиален, поскольку зачастую предпочтительнее работать с целыми коэффициентами, а не с произвольными рациональными.

     Одним из ключевых фактов, связанных с  полиномами, является то, что полиномы над областью единственного разложения образуют область единственного разложения. Полином, который является простым в этой области, обычно называется неприводимым. Многократно используя теорему о единственности разложения, можно доказать, что полиномы от нескольких переменных над множеством целых чисел или над любым полем с любым числом переменных могут быть единственным образом разложены на неприводимые полиномы. Например, полином от трех переменных 90x^3 — 120х^2у + l8x^2yz - 24xy^2z над целыми числами представляет собой произведение пяти неприводимых полиномов 2*3*х*(3х—4у)*(5х+yz). Тот же полином над рациональными числами является произведением трех неприводимых полиномов (6х) (3х — 4у) • (5х + yz). Это разложение может быть записано как х • (90x - 120у) • (х + (1/5)yz) и еще бесконечным числом способов, хотя разложение, по существу, единственно.

     Как обычно, мы говорим, что u(х) кратен полиному v(x), a v(x) является делителем u(х), если u(х) = v(x)q(x) для некоторого полинома q(x). Если есть алгоритм, который определяет, является ли и кратным v для произвольных ненулевых элементов u и v некоторой области единственного разложения S, и позволяет определить w, если u = v * w, то алгоритм дает метод для выяснения, является ли u(х) кратным v(x) для произвольных ненулевых полиномов u(х) и v(x) над S. Если u(х) кратно v(x), легко увидеть, что un+k должно быть кратно vn при переходе к шагу D2; отсюда будет найдено частное u(x)/v(x). Применяя это наблюдение рекурсивно, получим алгоритм, который отвечает на вопрос, является ли данный полином над S от любого числа переменных кратным другому полиному над S, а также алгоритм, который будет находить частное, если таковое существует.

     Множество элементов области единственного  разложения называется взаимно простым, если нет простого элемента этой области единственного разложения, который делит все остальные элементы. Полином над областью единственного разложения называется примитивным, если его коэффициенты взаимно просты (не путайте это понятие с совершенно другим понятием примитивных полиномов по модулю p.

 

2 ПРАКТИЧЕСКАЯ ЧАСТЬ

     2.1 Текст программы

unit Unit1; 

interface 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Grids, Menus; 

type

  TForm1 = class(TForm)

    StringGrid1: TStringGrid;

    Label1: TLabel;

    Label2: TLabel;

    StringGrid2: TStringGrid;

    StringGrid3: TStringGrid;

    Label3: TLabel;

    Memo1: TMemo;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Button4: TButton;

    Button5: TButton;

    Button6: TButton;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    Label4: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure N3Click(Sender: TObject);

    procedure N4Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end; 

const n=5;

type mas1=array [1..n] of integer;

type mas2=array [1..n,1..n]of integer;

type mas3=array [1..n*2] of integer;

type mas4=array [1..n*2,1..n*2] of integer;

var

  Form1: TForm1;

  x1,x2,y1,y2:mas1;

  x1y1,x2y2:mas2;

  s1,s2:string;

  xr,yr:mas1;

  xyr:mas2;

  xr1,yr1:mas3;

  xyr1:mas4; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject);

var i:integer;

begin

for i:=1 to n do

begin

stringgrid1.Cells[i-1,0]:=inttostr(i);

stringgrid2.Cells[i-1,0]:=inttostr(i);

stringgrid3.Cells[i,0]:=inttostr(i);

stringgrid3.Cells[0,i]:=inttostr(i);

end;

end; 

procedure TForm1.N5Click(Sender: TObject);

begin

close;

end; 

procedure TForm1.Button1Click(Sender: TObject);

var k,i:integer;

begin

randomize;

s1:='';

for i:=1 to n do

begin

k:=random(2);

if k=1 then x1[i]:=random(10)-4

else x1[i]:=0;

stringgrid1.Cells[i-1,1]:=inttostr(x1[i]);

end;

for i:=1 to n do

if x1[i]<>0 then s1:=s1+'+('+inttostr(x1[i])+'*x^'+inttostr(i)+')';

end; 

procedure TForm1.Button2Click(Sender: TObject);

var k,i:integer;

begin

randomize;

s2:='';

for i:=1 to n do

begin

k:=random(2);

if k=1 then x2[i]:=random(10)-4

else x2[i]:=0;

stringgrid1.Cells[i-1,2]:=inttostr(x2[i]);

end;

for i:=1 to n do

if x2[i]<>0 then s2:=s2+'+('+inttostr(x2[i])+'*x^'+inttostr(i)+')';

end; 

procedure TForm1.Button3Click(Sender: TObject);

var k,i:integer;

begin

randomize;

for i:=1 to n do

begin

k:=random(2);

if k=1 then y1[i]:=random(10)-4

else y1[i]:=0;

stringgrid2.Cells[i-1,1]:=inttostr(y1[i]);

end;

for i:=1 to n do

if y1[i]<>0 then s1:=s1+'+('+inttostr(y1[i])+'*y^'+inttostr(i)+')';

end; 

procedure TForm1.Button4Click(Sender: TObject);

var k,i:integer;

begin

randomize;

for i:=1 to n do

begin

k:=random(2);

if k=1 then y2[i]:=random(10)-4

else y2[i]:=0;

stringgrid2.Cells[i-1,2]:=inttostr(y2[i]);

end;

for i:=1 to n do

if y2[i]<>0 then s2:=s2+'+('+inttostr(y2[i])+'*y^'+inttostr(i)+')';

end; 

procedure TForm1.Button5Click(Sender: TObject);

var k,i,j:integer;

begin

memo1.Lines.Add('Первый многочлен');

randomize;

for i:=1 to n do

for j:=1 to n do

begin

k:=random(2);

if k=1 then x1y1[i,j]:=random(10)-4

else x1y1[i,j]:=0;

stringgrid3.Cells[i,j]:=inttostr(x1y1[i,j]);

end;

for i:=1 to n do

for j:=1 to n do

if x1y1[i,j]<>0 then s1:=s1+'+('+inttostr(x1y1[i,j])+'*x^'+inttostr(i)+'y^'+inttostr(j)+')';

memo1.Lines.Add(s1);

end; 

procedure TForm1.Button6Click(Sender: TObject);

var k,i,j:integer;

begin

memo1.Lines.Add('Второй многочлен');

randomize;

for i:=1 to n do

for j:=1 to n do

begin

k:=random(2);

if k=1 then x2y2[i,j]:=random(10)-4

else x2y2[i,j]:=0;

stringgrid3.Cells[i,j]:=inttostr(x2y2[i,j]);

end;

for i:=1 to n do

for j:=1 to n do

if x2y2[i,j]<>0 then s2:=s2+'+('+inttostr(x2y2[i,j])+'*x^'+inttostr(i)+'y^'+inttostr(j)+')';

memo1.Lines.Add(s2);

end; 

procedure TForm1.N2Click(Sender: TObject);

var i,j:integer;

begin

memo1.Lines.Add('Сложение');

s1:='';

for i:=1 to n do

begin

xr[i]:=x1[i]+x2[i];

yr[i]:=y1[i]+y2[i];

end;

for i:=1 to n do

for j:=1 to n do

xyr[i,j]:=x1y1[i,j]+x2y2[i,j];

for i:=1 to n do

if xr[i]<>0 then

s1:=s1+'+('+inttostr(xr[i])+'x^'+inttostr(i)+')';

for i:=1 to n do

if yr[i]<>0 then

s1:=s1+'+('+inttostr(yr[i])+'y^'+inttostr(i)+')';

for i:=1 to n do

for j:=1 to n do

if xyr[i,j]<>0 then

s1:=s1+'+('+inttostr(xyr[i,j])+'x^'+inttostr(i)+'y^'+inttostr(j)+')';

memo1.Lines.Add(s1);

end; 

procedure TForm1.N3Click(Sender: TObject);

var i,j:integer;

begin

memo1.Lines.Add('Вычитание');

s1:='';

for i:=1 to n do

begin

xr[i]:=x1[i]-x2[i];

yr[i]:=y1[i]-y2[i];

Информация о работе Арифметика многочленов