Текст подпрограммы и версий
pa13i_p.zip 
Тексты тестовых примеров
tpa13i_p.zip 

Подпрограмма:  PA13I (модуль PA13I_p)

Назначение

Разложение полинома с целыми коэффициентами на линейные множители с целыми коэффициентами.

Математическое описание

Пусть задан полином степени 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