Текст подпрограммы и версий pa13i_p.zip |
Тексты тестовых примеров tpa13i_p.zip |
Разложение полинома с целыми коэффициентами на линейные множители с целыми коэффициентами.
Пусть задан полином степени N с целыми коэффициентами:
A1 XN + A2 XN-1 + ... + AN X + AN+1
Подпрограмма PA13I находит M линейных множителей Ui x + Vi, i = 1, 2, ..., M, с целыми коэффициентами, а также наибольший общий делитель C коэффициентов Ai, i = 1, 2, ..., N + 1 .
Сначала находятся все делители P коэффициента A1 и все делители Q коэффициента AN . Затем составляются всевозможные пары из найденных P и Q и проверяется, не является ли двучлен PX - Q множителем исходного полинома. Значения коэффициентов Ai не сохраняются.
procedure PA13I(var A :Array of Integer; N :Integer; var U :Array of Integer; var V :Array of Integer; var M :Integer; var C :Integer);
Параметры
A - | целый одномерный массив длины N + 1, в котором задаются коэффициенты исходного полинома в порядке убывания степеней; исходные значения массива A не сохраняются; |
N - | заданная степень исходного полинома (тип: целый); |
U, V - | целые одномерные массивы длины N, в которых размещаются вычисленные коэффициенты всех линейных множителей; |
M - | целая переменная, значение которой полагается равной количеству найденных линейных множителей; |
C - | целая переменная, значение которой полагается равной наибольшему общему делителю коэффициентов исходного полинома. |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Unit tpa13i_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, PA13I_p; function tpa13i: String; implementation function tpa13i: String; var C,_i,M :Integer; U :Array [0..3] of Integer; V :Array [0..3] of Integer; const A :Array [0..3] of Integer = ( 6,-58,156,-80 ); begin Result := ''; PA13I(A,3,U,V,M,C); Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%5d',[A[_i]]); if ( ((_i+1) mod 1)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%5d',[U[_i]]); if ( ((_i+1) mod 1)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 3 do begin Result := Result + Format('%5d',[V[_i]]); if ( ((_i+1) mod 1)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + Format('%5d %5d',[M,C]) + #$0D#$0A; UtRes('tpa13i',Result); { вывод результатов в файл tpa13i.res } exit; end; end. Результаты: U = (1, 1, 3) V = (4, 5, 2) M = 3 C = 2