Дипломная работа: Алгоритмы с многочленами
Название: Алгоритмы с многочленами Раздел: Рефераты по математике Тип: дипломная работа |
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ НАБЕРЕЖНОЧЕЛНИНСКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ ИНСТИТУТ МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ КАФЕДРА МАТЕМАТИКИ И МЕТОДИКИ ЕЕ ПРЕПОДАВАНИЯ АЛГОРИТМЫ С МГНОГОЧЛЕНАМИ /дипломная работа/ Набережные Челны 2006 год Содержание 2.1. Делимость многочленов. Свойства делимости 2.2. Деление многочленов с остатком 2.3. Наибольший общий делитель многочленов 5.1. Выделение кратных множителей Список использованной литературы Тема моей дипломной работы: «Алгоритмы с многочленами». Целью данной работы является изучение многочленов, алгоритмов с ними, рассмотрение возможностей составления различных программ. Для достижения поставленной цели необходимо рассмотреть следующие вопросы: – делимость многочленов; – деление многочленов с остатком; – наибольший общий делитель, алгоритм Евклида; – кратные корни; – кратные множители, выделение кратных множителей; – производные от многочленов. Для выполнения дипломной работы я поставила следующие задачи: 1. изучить литературу о многочленах; 2. применить теорию высшей алгебры в решении задач элементарной математики; 3. составить программы для нахождения частного и остатка при делении многочленов, наибольшего общего делителя двух многочленов, производной многочлена; разложения многочленов на кратные множители. 1. МногочленыОбщий вид уравнения n-ной степени (где n некоторое положительное число) есть
Коэффициенты Если написано уравнение (1.1), то всегда предполагается, что требуется его решить, найти такие числовые значения для неизвестного x , которые удовлетворяют этому уравнению, то есть после подстановки вместо неизвестного и выполнения всех указанных операций обращают левую часть уравнения (1.1) в нуль. Целесообразно заменить задачу решения уравнения (1.1) более общей задачей изучения левой части этого уравнения
называемой многочленом n -ной степени от неизвестного х . Многочленом называется лишь выражение вида (1.2), то есть лишь сумма целых неотрицательных степеней неизвестного x , взятых с некоторыми числовыми коэффициентами. В частности, мы не будем считать многочленами такие выражения, которые содержат неизвестное x с отрицательными или дробными показателями. Для сокращенной записи многочленов употребляются символы f ( x ), g ( x ) и так далее. 2. Деление многочленовТеория многочленов в определенном отношении похожа на теорию целых чисел, хотя внешне эти две теории не имеют ничего общего. Внутренняя же близость, схожесть этих теорий объясняется тем, что для многочленов, так же как и для целых чисел, можно определить деление и, что еще более важно, деление с остатком. 2.1. Делимость многочленов. Свойства делимостиМногочлен
Например, из равенства Многочлен
откуда Но многочлен Многочлен Укажем некоторые основные свойства делимости многочленов. 1
. Если В самом деле, по условию 2
. Если Из равенств 3
.Если Если Из 2. и 3. вытекает следующее свойство: 4
. Если каждый из многочленов 5
. Всякий многочлен Если 6
. Если Из равенства 7
. Многочлены Действительно, Если Отсюда вытекает следующее свойство: 8
. Тогда и только тогда многочлены Из 1. и 8. вытекает свойство: 9
. Всякий делитель одного из двух многочленов Свойства делимости многочленов могут быть применены для изучения делимости в множестве целых чисел. Выясним, например, для каких целых чисел
n
число Натуральное число, отличное от 1, называется простым, если оно делится только на 1 и на само себя; целое отрицательное число k называется простым, если число –k простое. Для ответа на поставленный вопрос заметим, что справедливо равенство
и поэтому число Остается проверить следующие значения n
: 3, 1, 0, -3, -1 и –2. При этих значениях n
рассматриваемое число равно соответственно 19, -5, 3, 4, так что искомое множество чисел есть Может возникнуть вопрос: откуда взялось равенство (2.3)? Как мы догадались, что многочлен Из этого примера видно, что уже для решения задач, связанных с делимостью целых чисел, полезно уметь выяснять, делится ли данный многочлен на некоторый другой многочлен (раскладывается ли на множители).Ответ на такой и многие другие вопросы можно найти с помощью деления многочлена с остатком. 2.2. Деление многочленов с остаткомДля многочленов, как и для целых чисел, существует алгоритм деления с остатком. Теорема о делении с остатком. Для любых двух многочленов f ( x ) и g ( x ) можно найти такие многочлены q ( x ) и r ( x , что f ( x )= g ( x ) q ( x )+ r ( x ), причем степень r ( x ) меньше степени g ( x ) или же r ( x )=0. Многочлены q ( x ) и r ( x ), удовлетворяющие этому условию, определяются однозначно. Если разности f
(
x
)-
r
(
x
) и В практической деятельности для нахождения частного и остатка применяют способ вычисления, называемый «деление углом». Покажем его на примере. Пример.
Найти частный и остаток от деления 1.
Частным от деления 2.
Частным от деления Это правило в общем виде можно сформулировать так: 1) разделить старший член многочлена f ( x ) на старший член g ( x ) и записать результат «под длинной стороной угла»; 2)умножить g ( x ) на результат действия 1) и записать произведение под многочленомf ( x ) ; 3) вычесть из f ( x ) записанный под ним многочлен; 4) проверить имеет ли результат действия 3) степень меньшую, чем степень g ( x ) ; если да (или результат нулевой), то он является остатком, а под длинной стороной угла записано частное, если нет, то применить к этому результату действие 1), рассматривая его как многочленf ( x ) . Я составила программу для нахождения частного и остатка. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) SGd1: TStringGrid; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; i,n,m,step,j,f:integer; d,l,s:string; a,a2,b,b2,k:array[0..100] of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin n:=StrToInt(Edit1.Text); m:=StrToInt(Edit2.Text); for i:=n+1 downto 1 do begin a[i]:=StrToInt(SGd1.Cells[n-(i-1),0]); end; for i:=m+1 downto 1 do begin b[i]:=StrToInt(SGd1.Cells[m-(i-1),1]); end; s:='f1(x)='; for i:=n+1 downto 1 do begin if a[i]<>0 then begin if(a[i-1]<0)or(i=1) then begin str(a[i],l); str(i-1,d); s:=s+l+'x^'+d; end else begin str(a[i],l); str(i-1,d); s:=s+l+'x^'+d+'+'; end; end; end; Edit3.Text:=s; s:='f2(x)='; for i:=m+1 downto 1 do begin if b[i]<>0 then begin if(b[i-1]<0)or(i=1) then begin str(b[i],l); str(i-1,d); s:=s+l+'x^'+d; end else begin str(b[i],l); str(i-1,d); s:=s+l+'x^'+d+'+'; end; end; end; Edit4.Text:=s; for j:=N+1 downto 1 do begin a2[j]:=a[j]; b2[j]:=0; end; step:=n-m; f:=n+2; for i:=step+1 downto 1do begin f:=f-1; k[i]:=a2[f]; for j:=m+1 downto 1do begin b2[j]:=k[i]*b[j]; end; for j:=f downto 1 do begin a2[j]:=a2[j]*b[m+1]; end; for j:=f downto 1 do begin a2[j]:=a2[j]-b2[j+1-i]; b2[j]:=0; end; end; s:='h(x)='; for i:=f downto 1 do begin if k[i]<>0 then begin if(k[i-1]<0)or(i=1) then begin str(k[i],l); str(i-1,d); s:=s+l+'x^'+d; end else begin str(k[i],l); str(i-1,d); s:=s+l+'x^'+d+'+'; end; end; end; Edit5.Text:=s; s:='r(x)='; for i:=n downto 0 do begin if a2[i]<>0 then begin if(a2[i-1]<0)or(i=1) then begin str(a2[i],l); str(i-1,d); s:=s+l+'x^'+d; end else begin str(a2[i],l); str(i-1,d); s:=s+l+'x^'+d+'+'; end; end; end; Edit6.Text:=s; end; end. 2.3. Наибольший общий делитель многочленовПусть даны произвольные многочлены В общем же случае многочлены Наибольшим общим делителем
отличных от нуля многочленов Это определение оставляет открытым вопрос, существует ли наибольший общий делитель для любых многочленов 2.4. Алгоритм ЕвклидаАлгоритм Евклида – метод для нахождения наибольшего общего делителя двух целых чисел, а также двух многочленов от одного переменного. Он первоначально был изложен в «Началах» Евклида в геометрической форме как способ нахождения общей меры двух отрезков. Алгоритм Евклида для нахождения наибольшего общего делителя, как в кольце целых чисел, так и в кольце многочленов от одного переменного является частным случаем некого общего алгоритма в евклидовых кольцах. Алгоритм Евклида для нахождения наибольшего общего делителя двух многочленов Для доказательства запишем изложенное в виде следующей цепочки равенств: (2.4) Последнее равенство показывает, что Возьмем теперь произвольный общий делитель Мы доказали, что любые два многочлена обладают наибольшим общим делителем, и получили способ его вычисления. Этот способ показывает, что если многочлены
Если Применяя алгоритм Евклида к многочленам с целыми коэффициентами, можем, чтобы избежать дробных коэффициентов, умножить делимое или сократить делитель на любое не равное нулю число, причем не только начиная какое-либо из последовательных делений, но и в процессе самого этого деления. Это будет приводить к искажению частного, но интересующие нас остатки будут приобретать лишь некоторый множитель нулевой степени, что при разыскании наибольшего общего делителя допускается. Пример.
Найти наибольший общий делитель многочленов 1.
Совершим требуемые деления с остатком:
Построение последовательности Евклида закончено. Ее последний член 2.
Совершим требуемые деления с остатком:
Построение последовательности Евклида закончено. Ее последний член Я составила программу для нахождения наибольшего общего делителя двух многочленов: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; SGd1: TStringGrid; Label3: TLabel; Button1: TButton; Label4: TLabel; Edit4: TEdit; Label5: TLabel; Label6: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; st1,st2:integer; kof1,kof2,k1,k2:array[0..10] of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,j,k_1,st3,l:integer; sokr:boolean; k2_2,k1_1:array[0..10] of integer; begin st1:=StrToInt(Edit1.Text); st2:=StrToInt(Edit2.Text); for i:=0 to st1 do begin kof1[i]:=StrToInt(SGd1.Cells[i,0]); k1[i]:=StrToInt(SGd1.Cells[i,0]); end; for i:=0 to st2 do begin kof2[i]:=StrToInt(SGd1.Cells[i,1]); k2[i]:=StrToInt(SGd1.Cells[i,1]); end; while kof2[0]<>0 do begin repeat Edit4.Text:=''; k_1:=k1[0]; if k1[0]<>kof2[0] then begin if (k1[0] mod kof2[0])=0 then begin for j:=0 to st2 do k2[j]:=(k1[0] div kof2[0])*kof2[j]; end else begin if k2[0]<>1 then for j:=0 to st1 do k1[j]:=kof2[0]*k1[j]; if k_1<>1 then begin for j:=0 to st2 do k2[j]:=k_1*kof2[j]; end; end; end; for i:=1 to st1 do begin k1[i-1]:=k1[i]-k2[i]; end; st1:=st1-1; until st1<st2; if k1[0]<>0 then begin //Сокращение sokr:=true; for i:=1 to st1 do if k1[i]<>0 then begin if (k1[i] mod k1[0])<>0 then sokr:=false; end; k_1:=k1[0]; if sokr=true then for i:=0 to st1 do k1[i]:=k1[i] div k_1; end; for i:=0 to st2 do //Заменамногочленов k2_2[i]:=kof2[i]; for i:=0 to st1 do k1_1[i]:=k1[i]; for i:=0 to 10 do begin kof1[i]:=0; k1[i]:=0; kof2[i]:=0; k2[i]:=0; end; for i:=0 to st2 do begin k1[i]:=k2_2[i]; if k1[i]<>0 then Edit4.Text:=Edit4.Text+IntToStr(k1[i])+'x^'+IntToStr(st2-i); if (k2_2[i+1]>0)and(i<st2) then Edit4.Text:=Edit4.Text+'+'; end; for i:=0 to st1 do begin k2[i]:=k1_1[i]; kof2[i]:=k1_1[i]; end; st3:=st1; st1:=st2; st2:=st3; end; end; end. Используем алгоритм Евклида для доказательства следующей теоремы: Теорема.
Если
Можно считать при этом, если степени многочленов Доказательство
основано на равенствах (2.4). Если учтем, что
Подставляя сюда выражение
где Для доказательства второго утверждения теоремы предположим, что многочлены
где степень
Степень множителя, стоящего при Теорема доказана. Одновременно получаем, что если многочлены Применяя доказанную теорему к взаимно простым многочленам, получаем такой результат: Многочлены
Опираясь на этот результат, можно доказать несколько простых, но важных теорем о взаимно простых многочленах: Теорема 1.
Если многочлен Доказательство.
В самом деле, существуют, по (2.6), такие многочлены Умножая это равенство на
откуда следует, что всякий общий делитель Теорема 2.
Если произведениемногочленов Доказательство.
Умножая равенство Оба слагаемых левой части этого равенства делятся на Теорема 3.
Если многочлен Доказательство.
Действительно, Определение наибольшего общего делителя может быть распространен на случай любой конечной системы многочленов: наибольшим общим делителем многочленов Теорема.
Наибольший общий делитель многочленов Доказательство.
В самом деле, при В частности, система многочленов 3. Кратные корниТеорема Безу . Многочлен f ( x ) делится на x - c тогда и только тогда, когда число c является его корнем. Рассмотрим произвольный многочлен f ( x ) и разделим его с остатком на двучлен x - c . Поскольку степень этого двучлена равна 1, то остаток либо равен 0, либо имеет степень 0. И в том, и в другом случае остаток r есть число. Таким образом, многочлен f ( x ) представляется в виде: f ( x )= ( x - c ) q ( x )+ r . Положив в этом тождестве x = c , получим что f ( c )= r . Мы доказали тем самым, что остаток от деления многочлена на двучленx - c равен значению многочлена приx = c . С помощью теоремы Безу решим несколько задач. Пример 1
. Решить уравнение Многочлен f
(
x
)=
Остается решить квадратное уравнение Это уравнение не имеет действительных корней, так что x =2 – единственный действительный корень исходного уравнения. 2
. Решить уравнение Многочлен f
(
x
)=
0 Остается решить квадратное уравнение Это уравнение имеет корень 1. Так что x =-2 и x =1 – корни исходного уравнения. Если c
– корень многочлена f
(
x
)
, то есть f
(
c
)=0
, то f
(
x
)
делится на x
-
c
.
Может оказаться, что многочлен f
(
x
)
делится не только на первую степень линейного двучлена x
-
c
, но и на более высокие его степени. Во всяком случае, найдется такое натуральное число k
, что f
(
x
)
нацело делится на
где многочлен 4. Производная от многочленаПонятие кратного корня тесно связано с понятием производной от многочлена. Мы изучаем многочлены с любыми комплексными коэффициентами и поэтому не можем просто воспользоваться понятием производной, введенным в курсе математического анализа. То, что будет сказано ниже, следует рассматривать как независимое от курса анализа определение производной многочлена. Пусть дан многочлен n–ной степени f
(
x
)=
с любыми комплексными коэффициентами. Его производной (первой производной) называется многочлен (n- 1)-й степени Производная от многочлена нулевой степени и от нуля считается равной нулю. Производная от первой производной называется второй производной от многочлена f ( x ) и обозначается через f “( x ) . Очевидно, что и по этому Свойства, являющиеся формулами дифференцирования для суммы и произведения: 1. 2. Эти формулы легко проверить, впрочем, непосредственным подсчетом, беря в качестве и два произвольных многочлена и применяя данное выше определение производной. Формула (4.2) распространяется на случай произведения любого конечногочисла множителей, а поэтому выводится формула для производной от степени: 3. Доказательство. Используем метод математической индукции.
Если число с является
k
–кратным корнем многочлена
f
(
x
), то при
k
>1 оно будет (
k
-1)–кратным корнем первой производной этого многочлена; если же
k
=1 , то с не будет служить корнем для В самом деле, пусть
где
Первое слагаемое суммы делится на х-с
, а второе на х-с
не делится; поэтому вся эта сумма на х-с
не может делиться. Учитывая, что частное от деления f
(
x
)
на Применяя эту теорему несколько раз, мы получаем, что k
-кратный корень многочлена
f
(
x
) будет (
k
-
s
)-кратным в
s
-й производной этого многочлена Пример.
Найти производную
Я составила программу для нахождения первой производной многочлена. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; SGd1: TStringGrid; Label2: TLabel; Button1: TButton; Edit2: TEdit; Edit3: TEdit; Label3: TLabel; Label4: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; c,i,st:integer; k,l,s:string; kof:array[0..100] of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin st:=StrToInt(Edit1.Text); for i:=0 to st do begin if SGd1.Cells[i,0]<>'' then kof[st-i]:=StrToInt(SGd1.Cells[i,0]) elseMessageDlg ('Внимание! Не введены значения коэффициентов!',mtWarning,[mbOK],0); end; s:='f(x)='; for i:=st downto 0 do begin if kof[i]<>0 then begin if(kof[i-1]<0)or(i=0) then begin str(kof[i],l); str(i,k); s:=s+l+'x^'+k; end else begin str(kof[i],l); str(i,k); s:=s+l+'x^'+k+'+'; end; end; kof[i]:=kof[i]*i; end; Edit2.Text:=s; s:='f1(x)='; for i:=st downto 0 do begin if kof[i]<>0 then begin if(kof[i-1]<0)or(i=1) then begin str(kof[i],l); str(i-1,k); s:=s+l+'x^'+k; end else begin str(kof[i],l); str(i-1,k); s:=s+l+'x^'+k+'+'; end; end; Edit3.Text:=s; end; end; end. Существуют методы, позволяющие узнать, обладает ли данный многочлен кратными множителями, и в случае положительного ответа дающие возможность свести изучение этого многочлена к изучению многочленов, уже не содержащих кратных множителей. Теорема
. Если В самом деле, пусть
причем
Второе из слагаемых, стоящих в скобках, не делится на Из данной теоремы и из указанного выше способа разыскания наибольшего общего делителя двух многочленов следует, что если дано разложение многочлена
то наибольший общий делитель многочлена
где множитель 5.1. Выделение кратных множителейЕсли дан многочлен т.е. получим многочлен, не содержащий кратных множителей, причем всякий неприводимый множитель для Усложняя изложенный сейчас метод, можно сразу перейти к рассмотрению нескольких многочленов без кратных множителей, причем, найдя неприводимые множители этих многочленов, мы не только найдем все неприводимые множители для Пусть (5.2) будет разложением а разложение (5.3) для обозначая через ……………………………
Отсюда
……………………………
И поэтому, наконец,
Таким образом, пользуясь лишь приемами, не требующими знания неприводимых множителей многочлена Пример.
Разложить многочлен
Многочлен Я составила программу для разложения многочлена на кратные множители. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; SGd1: TStringGrid; Label2: TLabel; Button1: TButton; Label3: TLabel; SGd2: TStringGrid; SGd3: TStringGrid; SGd4: TStringGrid; Edit6: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; c,i,st1,st2,stiz,n_iz,n_nod,n,m,d_st,step,f:integer; k,d,s:string; kof1,kof2,k1,k2,izubst,a,b,a2,b2,buf,est,fxst:array[0..15] of integer; izub,e,fx:array[0..50,0..50] of integer; first:boolean; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,j,k_1,st3,l:integer; sokr:boolean; k2_2,k1_1:array[0..10] of integer; begin st1:=StrToInt(Edit1.Text); for i:=0 to st1 do begin SGd4.Cells[i,0]:=SGd1.Cells[i,0]; end; repeat n_iz:=n_iz+1; st2:=st1-1; for i:=0 to st1 do begin if SGd1.Cells[i,0]<>'' then kof1[st1-i]:=StrToInt(SGd1.Cells[i,0]) elseMessageDlg('Внимание! Не введены значения коэффициентов!',mtWarning,[mbOK],0); end; s:='f(x)='; for i:=st1 downto 0 do begin if kof1[i]<>0 then begin if(kof1[i-1]<0)or(i=0) then begin str(kof1[i],d); str(i,k); s:=s+d+'x^'+k; end else begin str(kof1[i],d); str(i,k); s:=s+d+'x^'+k+'+'; end; end; kof2[i-1]:=kof1[i]*i; end; //Edit2.Text:=s; s:='f1(x)='; for i:=st2 downto 0 do begin SGd2.Cells[st2-i,0]:=inttostr(kof2[i]); if kof2[i]<>0 then begin if(kof2[i-1]<0)or(i=1) then begin str(kof2[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(kof2[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; end; //Edit3.Text:=s; end; for i:=0 to st1 do begin kof1[i]:=StrToInt(SGd1.Cells[i,0]); k1[i]:=StrToInt(SGd1.Cells[i,0]); end; for i:=0 to st2 do begin kof2[i]:=StrToInt(SGd2.Cells[i,0]); k2[i]:=StrToInt(SGd2.Cells[i,0]); end; while kof2[0]<>0 do begin repeat //Edit4.Text:=''; stiz:=0; k_1:=k1[0]; if k1[0]<>kof2[0] then begin if (k1[0] mod kof2[0])=0 then begin for j:=0 to st2 do k2[j]:=(k1[0] div kof2[0])*kof2[j]; end else begin if k2[0]<>1 then for j:=0 to st1 do k1[j]:=kof2[0]*k1[j]; if k_1<>1 then begin for j:=0 to st2 do k2[j]:=k_1*kof2[j]; end; end; end; for i:=1 to st1 do begin k1[i-1]:=k1[i]-k2[i]; end; st1:=st1-1; until st1<st2; if k1[0]<>0 then begin //Сокращение sokr:=true; for i:=1 to st1 do if k1[i]<>0 then begin if (k1[i] mod k1[0])<>0 then sokr:=false; end; k_1:=k1[0]; if sokr=true then for i:=0 to st1 do k1[i]:=k1[i] div k_1; end; for i:=0 to st2 do //Замена многочленов k2_2[i]:=kof2[i]; for i:=0 to st1 do k1_1[i]:=k1[i]; for i:=0 to 10 do begin SGd3.Cells[i,0]:=''; SGd1.Cells[i,0]:=''; kof1[i]:=0; k1[i]:=0; kof2[i]:=0; k2[i]:=0; izub[n_iz,i]:=0; end; izubst[n_iz]:=st2; for i:=0 to st2 do begin k1[i]:=k2_2[i]; SGd1.Cells[i,0]:=inttostr(k1[i]); izub[n_iz,i]:=k1[i]; if k1[i]<>0 then begin //Edit4.Text:=Edit4.Text+IntToStr(k1[i])+'x^'+IntToStr(st2-i); end; if (k2_2[i+1]>0)and(i<st2) then //Edit4.Text:=Edit4.Text+'+'; end; for i:=0 to st1 do begin k2[i]:=k1_1[i]; kof2[i]:=k1_1[i]; end; st3:=st1; st1:=st2; st2:=st3; end; until (st1=0); d_st:=StrToInt(Edit1.Text); for i:=d_st+1 downto 1 do begin kof1[i]:=StrToInt(SGd4.Cells[d_st-(i-1),0]); end; //Нахождение Е first:=true; for n_nod:=1 to n_iz do begin n:=d_st; m:=izubst[n_nod]; d_st:=m; for i:=n+1 downto 1 do begin a[i]:=kof1[i]; end; for i:=m+1 downto 1 do begin b[i]:=izub[n_nod,m-(i-1)]; kof1[i]:=b[i]; end; s:='f1(x)='; for i:=n+1 downto 1 do begin if a[i]<>0 then begin if(a[i-1]<0)or(i=1) then begin str(a[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(a[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; end; end; //Edit3.Text:=s; s:='f2(x)='; for i:=m+1 downto 1 do begin if b[i]<>0 then begin if(b[i-1]<0)or(i=1) then begin str(b[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(b[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; end; end; //Edit4.Text:=s; for j:=n+1 downto 1 do begin a2[j]:=a[j]; b2[j]:=0; end; step:=n-m; f:=n+2; for i:=step+1 downto 1 do begin f:=f-1; buf[i]:=a2[f]; for j:=m+1 downto 1 do begin b2[j]:=buf[i]*b[j]; end; for j:=f downto 1 do begin a2[j]:=a2[j]*b[m+1]; end; for j:=f downto 1 do begin a2[j]:=a2[j]-b2[j+1-i]; b2[j]:=0; end; end; s:='h(x)='; for i:=f+1 downto 1 do begin e[n_nod,i]:=buf[i]; if buf[i]<>0 then begin if(buf[i-1]<0)or(i=1) then begin str(buf[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(buf[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; buf[i]:=0; end; end; est[n_nod]:=f; //Edit5.Text:=s; s:='r(x)='; for i:=n downto 0 do begin if a2[i]<>0 then begin if(a2[i-1]<0)or(i=1) then begin str(a2[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(a2[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; end; end; Edit6.Text:=s; first:=false; end; for n_nod:=1 to n_iz-1 do begin n:=est[n_nod]; m:=est[n_nod+1]; d_st:=m; for i:=n+1 downto 1 do begin a[i]:=e[n_nod,i]; end; for i:=m+1 downto 1 do begin b[i]:=e[n_nod+1,i]; kof1[i]:=b[i]; if n_nod=n_iz-1 then fx[n_iz,i]:=b[i]; end; s:='f1(x)='; for i:=n+1 downto 1 do begin if a[i]<>0 then begin if(a[i-1]<0)or(i=1) then begin str(a[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(a[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; end; end; //Edit3.Text:=s; s:='f2(x)='; for i:=m+1 downto 1 do begin if b[i]<>0 then begin if(b[i-1]<0)or(i=1) then begin str(b[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(b[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; end; end; //Edit4.Text:=s; for j:=n+1 downto 1 do begin a2[j]:=a[j]; b2[j]:=0; end; step:=n-m; f:=n+2; for i:=step+1 downto 1 do begin f:=f-1; buf[i]:=a2[f]; for j:=m+1 downto 1 do begin b2[j]:=buf[i]*b[j]; end; for j:=f downto 1 do begin a2[j]:=a2[j]*b[m+1]; end; for j:=f downto 1 do begin a2[j]:=a2[j]-b2[j+1-i]; b2[j]:=0; end; end; s:='h(x)='; for i:=f+1 downto 1 do begin fx[n_nod,i]:=buf[i]; if buf[i]<>0 then begin if(buf[i-1]<0)or(i=1) then begin str(buf[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(buf[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; buf[i]:=0; end; end; //Edit5.Text:=s; fxst[n_nod]:=f; s:='r(x)='; for i:=n downto 0 do begin if a2[i]<>0 then begin if(a2[i-1]<0)or(i=1) then begin str(a2[i],d); str(i-1,k); s:=s+d+'x^'+k; end else begin str(a2[i],d); str(i-1,k); s:=s+d+'x^'+k+'+'; end; end; end; Edit6.Text:=s; end; fxst[n_iz]:=est[n_iz]+1; Edit6.Text:=''; s:=''; for i:=1 to n_iz do begin s:=s+'('; for j:=fxst[i] downto 0 do begin if fx[i,j]<>0 then begin if(fx[i,j-1]<0)or(j=1) then begin str(fx[i,j],d); str(j-1,k); s:=s+d+'x^'+k; end else begin str(fx[i,j],d); str(j-1,k); s:=s+d+'x^'+k+'+'; end; end; end; s:=s+')^'+IntToStr(i)+' '; Edit6.Text:=Edit6.Text+s; s:=''; end; for i:=0 to 10 do begin SGd1.Cells[i,0]:=SGd4.Cells[i,0]; end; end; end. ЗаключениеПри выполнении дипломной работы я рассмотрела следующие вопросы: – делимость многочленов; – деление многочленов с остатком; – наибольший общий делитель, алгоритм Евклида; – кратные корни; – кратные множители, выделение кратных множителей; – производные от многочленов. Составила программы для нахождения частного и остатка при делении многочленов; наибольшего общего делителя двух многочленов; производной многочлена. Список использованной литературы1. Алгебра и теория чисел. Под ред. Н.Я. Виленкина. Москва: Просвещение, 1984. 2. Архангельский А. Я. Программирование в Delphi 6. Москва: ЗАО Бином, 2003. 3. Архангельский А. Я. Delphi 7. Справочное пособие. Москва: ООО Бином-Пресс, 2004. 4. Курош А. Г. Курс высшей алгебры. Москва: Наука, 1971. 5. Ляпин Е. С., Евсеев А. Е. Алгебра и теория чисел. Часть II. Линейная алгебра и полиномы. Москва: Просвещение, 1978. 6. Мантуров О. В. и др. Математика в понятиях, определениях и терминах. Часть 2. Москва: Просвещение, 1982. 7. Попов В.Б. TurboPascal. Москва: Финансы и статистика, 2000. 8. Потапов М. К., Александров В. В., Пасиченко П. И. Алгебра и анализ элементарных функций. Москва: Наука, 1980. 9. Сабинина Л. В. Математика в понятиях, определениях и терминах. Часть I. Москва: Просвещение, 1978. 10. Сборник задач по алгебре. Под ред. А. И. Кострикина. Москва: Наука, 1987. 11. Смолин Ю. Н. Алгебра и теория чисел. Перемь:1996. 12. Солодовников А. С., Родина М. А. Задачник-практикум по алгебре. Часть IV. Москва: Просвещение, 1985. 13. Фадеев Д. К. Лекции по алгебре. Москва: Наука, 1984. 14. Фадеев Д. К., Соминский И. С. Сборник задач по высшей алгебре. Москва: Наука, 1968. 15. Шварцбурд С. И. Избранные вопросы математики. Москва: Просвещение, 1980. |