{***************************************************
 * ПРОГРАММА 1.5P
 *
 * МЕТОД НЬЮТОНА (метод касательных) В КОМПЛЕКСНОЙ ОБЛАСТИ
 * (Без использования специального модуля работы с комплексными числами)
 *
 * На примере уравнения Валлиса. x^3 - 2*x -5 = 0
 * На входе:
 *	X1 = 2 (приближённое значение к ответу, реальная часть.)
 *	X2 = -1 (приблежение в комплексной части)
 *		( Чем ближе к ответу, тем быстрее считает
 *
 *	E = 1e-5 или 1e-6, погрешность
 *	N = 4 (коэффициенты кубического уравнения, кол-во ячеек P)
 *	P[1] =  1, куб
 *	P[2] =  0, квадрат
 *	P[3] = -2, первая степень
 *	P[4] = -5, свободный член
 * На выходе:
 *	X = 2.09455
 ***************************************************}
VAR 
  P: ARRAY[1..9] OF Single; 
  X1, X2, E: Single;
  K, N: INTEGER;

{ Исследуемая функция }  
PROCEDURE F(X1, X2: Single; VAR F1, F2: Single);
VAR 
  R1, R2, R, Q: Single;
BEGIN 
  F1:=P[1]; 
  F2:=0.0; 
  R1:=F2; 
  R2:=R1;
  FOR K:=2 TO N DO 
  BEGIN
    R:=F1+X1*R1-X2*R2;
    R2:=F2+X1*R2+X2*R1;
    R1:=R;
    R:=P[K]+X1*F1-X2*F2; 
    F2:=X1*F2+X2*F1;
    F1:=R;
  END;
  R:=R1*R1+R2*R2;
  Q:=(F1*R1+F2*R2)/R; 
  F2:=(F2*R1-F1*R2)/R; 
  F1:=Q;
end;

{ Метод ньютона }
PROCEDURE NEWTON(VAR XI, X2, E: Single);
VAR 
  F1, F2: Single;
BEGIN
  REPEAT 
    F(X1, X2, F1, F2); 
    X1:=X1-F1; 
    X2:=X2-F2;
  UNTIL SQRT(F1*F1+F2*F2)<E;
End;

BEGIN
  WRITE(' X1, X2, E ? '); 
  READLN(X1, X2, E);
  WRITE('СКОЛЬКО ПАРАМЕТРОВ ? '); 
  READLN(N);
  FOR K:= 1 TO N DO 
  BEGIN
    WRITE('P(', K:2, ') ? '); 
    READLN(P[K]);
  End ;
  NEWTON(X1, X2, E); 
  WRITELN('X = ', X1, ' + I * ( ', X2, ')');
END.
