(*~\Глагол\Отделы\ЧисАн\32\к\Ряд\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                       ОТДЕЛ крМатем;
(*============================================================================*
 * НАЗНАЧЕНИЕ: функции комплексной переменной,
 *         представленной в виде ряда из 2-х действительных вида дМатем.Вещ
 *----------------------------------------------------------------------------*
 * ПРИМЕЧАНИЯ: после вызова задачи переменная <дМатем.код> может стать # 0,
 * это означает, что ответ задачи содержит не результат вычислений, а
 * особое значение.
 *============================================================================*)

ИСПОЛЬЗУЕТ
 дМатем   ИЗ "..\..\..\..\..\Отделы\ЧисАн\32\д\";

ВИД 
        (* вид Вещ - это удвоенная точность 32 разряда (6 десятичных знаков)  *)
  Вещ = дМатем.Вещ;                   (* локально *)

(*----------------------------------------------------------------------------*
 * Вид обрабатываемых данных: комплексное в виде ряда из двух
 *----------------------------------------------------------------------------*)
ВИД 
  Вид- = РЯД 2 ИЗ Вещ;
(*
                          вместо
  Вид- = НАБОР
              д-,м-:Вещ
         КОН;
*)

(*----------------------------------------------------------------------------*
 * Комплексные постоянные в виде ряда
 *----------------------------------------------------------------------------*)
ПЕР
  НОЛЬ-              :Вид; (* [0]=0;             [1]=0;  *)
  ДействЕДИНИЦА-     :Вид; (* [0]=+1;            [1]=0;  *)
  минусДействЕДИНИЦА-:Вид; (* [0]=-1;            [1]=0;  *)
  МнимаяЕДИНИЦА-     :Вид; (* [0]=0;             [1]=+1; *)
  минусМнимаяЕДИНИЦА-:Вид; (* [0]=0;             [1]=-1; *)

  ДействМаксВещ-     :Вид; (* [0]=Матем.МаксВещ; [1]=0;  *)
  ДействПолПИ-       :Вид; (* [0]=Матем.ПолПИ;   [1]=0;  *)

  NBS:РЯД 8 ИЗ Вещ;  (* ряд для Г-функции *)


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


ЗАДАЧА^ знакЧ-(z-:Вид):ЦЕЛ;(* вернуть знак (-1,0,+1) действительной или мнимой
                                                               части компл. числа *)
ЗАДАЧА^ норма-(z-:Вид):Вещ;(* Norma(z)=z[0]^2+z[1]^2        - норма    компл. числа *)
ЗАДАЧА^ мод-(z-:Вид):Вещ;    (*    |z|=квкор(z[0]^2+z[1]^2) - модуль   компл. числа *)
ЗАДАЧА^ arg-(z-:Вид):Вещ;    (* arg(z)=arctg2(z[1],z[0])    - аргумент компл. числа *)

ЗАДАЧА^ обмен-(z+,к+:Вид);       (* z <- к; к <- z *)

(*----------------------------------------------------------------------------*)
(* Собрать из двух действительных одно комплексное
                                                        в алгебраическом виде *)
ЗАДАЧА^ алгебрВид-(Дейст,Мним:Вещ; к+:Вид);  (* к:=Дейст + i*Мним             *)
(*----------------------------------------------------------------------------*)
(* Собрать из двух действительных одно комплексное
                                       в тригонометрическом виде (экспонента) *)
ЗАДАЧА^ тригонВид-(r,тета:Вещ; к+:Вид);      (* к:=r*exp(i*тета)              *)

(*----------------------------------------------------------------------------*)
ЗАДАЧА^ отр-(z-,к+:Вид);                (* к:=-z  - минус комплексный         *)
ЗАДАЧА^ сопр-(z-,к+:Вид);               (* к:=z*  - сопряжение комплексного z *)

ЗАДАЧА^ доб-(a-,b-,к+:Вид);             (* к:=a+b - добавление                *)
ЗАДАЧА^ выч-(a-,b-,к+:Вид);             (* к:=a-b - вычитание                 *)

ЗАДАЧА^ умн-(a-,b-,к+:Вид);             (* к:=a*b - умножение 2-х комплексных *)
ЗАДАЧА^ умнВ-(z-:Вид; v:Вещ; к+:Вид);   (* к:=z*v - умножение "z-" на действ./вещ. v *)

ЗАДАЧА^ дел-(a-,b-,к+:Вид);             (* к:=a/b - деление компл. на компл.  *)
ЗАДАЧА^ делВ-(z-:Вид; v:Вещ; к+:Вид);   (* к:=z/v - деление компл. на действ./вещ. v *)

(*----------------------------------------------------------------------------*
 * Тригонометрические функции комплексного аргумента
 *----------------------------------------------------------------------------*)

ЗАДАЧА^ sin-(z-,к+:Вид);      
ЗАДАЧА^ arcsin-(z-,к+:Вид);
ЗАДАЧА^ cos-(z-,к+:Вид);      
ЗАДАЧА^ arccos-(z-,к+:Вид);
ЗАДАЧА^ tg-(z-,к+:Вид);
ЗАДАЧА^ arctg-(z-,к+:Вид);   

(*----------------------------------------------------------------------------*
 * Гиперболические функции комплексного аргумента
 *----------------------------------------------------------------------------*)

ЗАДАЧА^ sh-(z-,к+:Вид);
ЗАДАЧА^ Arsh-(z-,к+:Вид);
ЗАДАЧА^ ch-(z-,к+:Вид);
ЗАДАЧА^ Arch-(z-,к+:Вид);
ЗАДАЧА^ th-(z-,к+:Вид);
ЗАДАЧА^ Arth-(z-,к+:Вид);

(*----------------------------------------------------------------------------*
 * Логарифмические, показательные и степенные функции комплексного аргумента
 *----------------------------------------------------------------------------*)

ЗАДАЧА^ степКЦ-(z-:Вид; n:ЦЕЛ; к+:Вид); (* к:=z^n - степень комплексного ЦЕЛая *)
ЗАДАЧА^ степКВ-(z-:Вид; v:Вещ; к+:Вид); (* к:=z^v - степень комплексного действительная *)
ЗАДАЧА^ степКК-(a-,b-,к+:Вид);          (* к:=a^b - степень комплексного комплексная *)
ЗАДАЧА^ корни-(z-:Вид; m,n:ЦЕЛ; к+:Вид);(* к:=z^(1/n), m=0..n-1 - все n-корней комплексного z *)
(* задача корни должна вычислить все "n" корней комплексного z,
   если при её вызове изменять "m" от 0 до n-1 *)
ЗАДАЧА^ квкор-(z-,к+:Вид);              (* к:=квкор(z) - кв.корень из комплексного *)
ЗАДАЧА^ exp-(z-,к+:Вид);                (* к:=<Матем.exp(z[0])*Матем.cos(z[1]);
                                               Матем.exp(z[0])*Матем.sin(z[1])> *)
ЗАДАЧА^ ln-(z-,к+:Вид);                 (* к:=ln(z)   - комплексный Ln        *)
ЗАДАЧА^ lnГ-(z-,к+:Вид);                (* к:=ln( Г(z) ) - Ln Г-функции от комплексного z *)


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА знакЧ-(z-:Вид):ЦЕЛ; (* вернуть знак (-1,0,+1) действительной или мнимой
                                                            части компл.числа *)
УКАЗ
  ЕСЛИ z[0] > 0 ТО
    ВОЗВРАТ 1
  АЕСЛИ z[0] < 0 ТО
    ВОЗВРАТ -1
  АЕСЛИ z[1] > 0 ТО
    ВОЗВРАТ 1
  АЕСЛИ z[1] < 0 ТО
    ВОЗВРАТ -1
  ИНАЧЕ
    ВОЗВРАТ 0 
  КОН
КОН знакЧ;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА норма-(z-:Вид):Вещ;     (* Norma(z)=z[0]^2+z[1]^2 - норма    компл.числа *)
УКАЗ
  ВОЗВРАТ Матем.кв(z[0]) + Матем.кв(z[1])
КОН норма;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА мод-(z-:Вид):Вещ;   (* |z|=квкор(z[0]^2+z[1]^2) - модуль     компл.числа *)
УКАЗ
  ВОЗВРАТ Матем.Пифагор(z[0],z[1])
КОН мод;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА arg-(z-:Вид):Вещ;(* arg(z)=arctg2(z[1],z[0]) - аргумент/фаза компл.числа *)
УКАЗ
  ВОЗВРАТ Матем.arctg2(z[1],z[0])(* arctg(z[1]/z[0]) или
                                                    неопределённость вида 0/0 *)
КОН arg;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА обмен-(z+,к+:Вид);             (* z <- к; к <- z *)
ПЕР
  врем:Вид;
УКАЗ
  врем:=z;
  z:=к;
  к:=врем
КОН обмен;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(* Собрать из двух действительных одно комплексное
                                                        в алгебраическом виде *)
ЗАДАЧА алгебрВид-(Дейст,Мним:Вещ; к+:Вид);
УКАЗ
  к[0]:=Дейст;
  к[1]:=Мним
КОН алгебрВид;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(* Собрать из двух действительных одно комплексное
                                       в тригонометрическом виде (экспонента) *)
ЗАДАЧА тригонВид-(r,тета:Вещ; к+:Вид);
УКАЗ
  алгебрВид(r*Матем.cos(тета),
            r*Матем.sin(тета),к)
КОН тригонВид;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА отр-(z-,к+:Вид);                  (* к:=-z - минус комплексный *)
УКАЗ
  алгебрВид(-z[0],                        (* это работает даже при "к+" = "z-" *)
            -z[1],к)
КОН отр;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА сопр-(z-,к+:Вид);                 (* к:=z* - сопряжение комплексного z *)
УКАЗ
  алгебрВид( z[0],                        (* это работает даже при "к+" = "z-" *)
            -z[1],к)
КОН сопр;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА доб-(a-,b-,к+:Вид);   (* к:=a+b - добавление/сложение двух комплексных *)
УКАЗ
  алгебрВид(a[0] + b[0],                   (* это работает даже при "к+" = "a-" *)
            a[1] + b[1],к)
КОН доб;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА выч-(a-,b-,к+:Вид);   (* к:=a-b - вычитание/разность  двух комплексных *)
УКАЗ
  алгебрВид(a[0] - b[0],                   (* это работает даже при "к+" = "a-" *)
            a[1] - b[1],к)
КОН выч;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА умн-(a-,b-,к+:Вид);              (* к:=a*b - умножение 2-х комплексных *)
УКАЗ
  алгебрВид(a[0]*b[0] - a[1]*b[1],           (* это работает даже при "к+" = "a-" *)
            a[0]*b[1] + a[1]*b[0],к)
КОН умн;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА умнВ-(z-:Вид; v:Вещ; к+:Вид);    (* к:=z*v - умножение "z-" на вещ. v  *)
УКАЗ
  алгебрВид( z[0]*v,                      (* это работает даже при "к+" = "z-" *)
             z[1]*v,к)
КОН умнВ;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА дел-(a-,b-,к+:Вид);               (* к:=a/b - деление на комплексное b *)
ПЕР
  врем:Вещ;
УКАЗ
  ЕСЛИ (b[0] = 0) И (b[1] = 0) ТО
    Матем.код:=Матем.ПЕРЕПОЛНЕНИЕ;
    к:=крМатем.ДействМаксВещ;
    ВОЗВРАТ
  КОН;
  врем:=Матем.кв(b[0])+Матем.кв(b[1]);
  алгебрВид((a[0]*b[0]+a[1]*b[1])/врем,      (* это работает даже при "к+" = "a-" *)
            (a[1]*b[0]-a[0]*b[1])/врем,к)
КОН дел;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА делВ-(z-:Вид; v:Вещ; к+:Вид);     (* к:=z/v - деление  "z-" на вещ. v  *)
УКАЗ
  алгебрВид( z[0]/v,                      (* это работает даже при "к+" = "z-" *)
             z[1]/v,к)
КОН делВ;

(*============================================================================*
 * Тригонометрические функции комплексного аргумента
 *============================================================================*)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА sin-(z-,к+:Вид);
ПЕР
  sinX,cosX,
  sinhY,coshY:Вещ;
УКАЗ
  Матем.sincos(z[0],sinX,cosX);
  Матем.shch(z[1],sinhY,coshY);  
  алгебрВид( sinX*coshY,
             cosX*sinhY,к)
КОН sin;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА arcsin-(z-,к+:Вид);
ПЕР
  rp,rm,s,врем,zX2:Вещ;
  t:Вид;
УКАЗ
  алгебрВид( z[1],
            -z[0],t);  (* t = z[1] - i*z[0] *)
  zX2:=2*z[0];
  s:=Матем.кв(z[0])+Матем.кв(z[1])+1;
  rp:=0.5*Матем.квкор(s+zX2);
  rm:=0.5*Матем.квкор(s-zX2);
  врем:=rp+rm;
  алгебрВид(        Матем.arcsin(rp - rm),
           знакЧ(t)*Матем.ln(врем + Матем.квкор(Матем.кв(врем)-1)),к);
КОН arcsin;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА cos-(z-,к+:Вид);
ПЕР
  sinX,cosX,
  sinhY,coshY:Вещ;
УКАЗ
  Матем.sincos(z[0],sinX,cosX);
  Матем.shch(z[1],sinhY,coshY);  
  алгебрВид( cosX*coshY,
            -sinX*sinhY,к)
КОН cos;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА arccos-(z-,к+:Вид);
ПЕР
  t:Вид;
УКАЗ
  arcsin(z,t);                           (* t = arcsin(z) *)
  выч(крМатем.ДействПолПИ,t,к)(* к = ПИ/2 - t             *)
КОН arccos;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА tg-(z-,к+:Вид);
ПЕР
  sinX2,cosX2,
  sinhY2,coshY2, врем:Вещ;
УКАЗ
  Матем.sincos(2*z[0],sinX2,cosX2);
  Матем.shch(2*z[1],sinhY2,coshY2);
  ЕСЛИ Матем.код = 0 ТО
    врем:=cosX2+coshY2
  ИНАЧЕ
    врем:=coshY2 
  КОН;
  ЕСЛИ врем # 0 ТО
    алгебрВид( sinX2/врем,
              sinhY2/врем,к)
  ИНАЧЕ (* z = ПИ/2 + к*ПИ *)
    Матем.код:=Матем.ОСОБЕННОСТЬ;
    к:=крМатем.ДействМаксВещ
  КОН
КОН tg;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА arctg-(z-,к+:Вид); (* *)
ПЕР
  квZд,incZм,decZм:Вещ;
УКАЗ
  ЕСЛИ (z[0] = 0) И (МОДУЛЬ(z[1]) = 1) ТО  (* z = +/- i *)
    Матем.код:=Матем.ОСОБЕННОСТЬ;
    алгебрВид(0,
               Матем.условСменаЗнакаЧ(Матем.МаксВещ,z[1]),к);
    ВОЗВРАТ
  КОН;
  квZд:=Матем.кв(z[0]);
  incZм:=z[1]+1;
  decZм:=z[1]-1;
  алгебрВид(0.5*(Матем.arctg2(z[0],-decZм) - Матем.arctg2(-z[0],incZм)),
            0.25*Матем.ln((квZд + Матем.кв(incZм))/(квZд + Матем.кв(decZм))),к)
КОН arctg;


(*============================================================================*
 * Гиперболические функции комплексного аргумента
 *============================================================================*)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА sh-(z-,к+:Вид);
ПЕР
  shX,chX:Вещ;
УКАЗ
  Матем.shch(z[0],shX,chX);
  алгебрВид(shX*Матем.cos(z[1]),
            chX*Матем.sin(z[1]),к)
КОН sh;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Arsh-(z-,к+:Вид);
(* arsh(z) = -i*arcsin(i*z) *)
ПЕР
  t:Вид;
УКАЗ
  умн(крМатем.МнимаяЕДИНИЦА,z,t);       (* t= (0;1)*z            *)
  arcsin(t,к);                          (* к= arcsin(t)          *)
  умн(крМатем.МнимаяЕДИНИЦА,к,t);       (* t= (0;1)*к            *)
  отр(t,к)                              (* к= -t                 *)
КОН Arsh;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ch-(z-,к+:Вид);
ПЕР
  shX,chX:Вещ;
УКАЗ
  Матем.shch(z[0], shX,chX);
  алгебрВид(chX*Матем.cos(z[1]),
            shX*Матем.sin(z[1]),к)
КОН ch;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Arch-(z-,к+:Вид);
(* arch(z) = знакЧ(z[1] + i*(1-z[0])) * i*arccos(z), где z = z[0]+i*z[1] *)
ПЕР
  кX,кY:Вид;
УКАЗ
  arccos(z,к);
  умн(крМатем.МнимаяЕДИНИЦА,к,кX);   (* вычисляем комплексное кX *)
  алгебрВид(  z[1],
            1-z[0],кY);       (* вычисляем комплексное кY *)
  ЕСЛИ знакЧ(кY) = -1 ТО
    отр(кX,к)
  ИНАЧЕ
           к:=кX 
  КОН
КОН Arch;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА th-(z-,к+:Вид);
ПЕР
  X2,Y2,
  sinY2,cosY2,
  shX2,chX2, врем:Вещ;
УКАЗ
  X2:=2*z[0];
  Y2:=2*z[1];
  Матем.sincos(Y2,sinY2,cosY2);
  Матем.shch(X2,shX2,chX2);
  ЕСЛИ Матем.код = 0 ТО
    врем:=chX2+cosY2
  ИНАЧЕ
    врем:=chX2 
  КОН;
  ЕСЛИ врем # 0 ТО
    алгебрВид( shX2/врем,
              sinY2/врем,к)
  ИНАЧЕ (* z = i*(ПИ/2 + к*ПИ) *)
    Матем.код:=Матем.ОСОБЕННОСТЬ;
    алгебрВид(0,
              Матем.МаксВещ,к)
  КОН
КОН th;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Arth-(z-,к+:Вид);
(* arth(z) = -i*arctg(i*z) *)
ПЕР
  t:Вид;
УКАЗ
  ЕСЛИ (МОДУЛЬ(z[0]) = 1) И (z[1] = 0) ТО  (* z = +/- 1 *)
    Матем.код:=Матем.ОСОБЕННОСТЬ;
    алгебрВид(Матем.условСменаЗнакаЧ(Матем.МаксВещ,z[0]),
                                           0,к)
  ИНАЧЕ 
    умн(крМатем.МнимаяЕДИНИЦА,z,t);       (* t= (0;1)*z  *)
    arctg(t,к);                           (* к= arctg(t)          *)
    умн(крМатем.МнимаяЕДИНИЦА,к,t);       (* t= (0;1)*к  *)
    отр(t,к)                              (* к= -t                *)
  КОН 
КОН Arth;


(*============================================================================*
 * Логарифмические, показательные и степенные функции комплексного аргумента
 *============================================================================*)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА степКЦ-(z-:Вид; n:ЦЕЛ;
                      к+:Вид);          (* к=z^n - степень комплексного ЦЕЛая *)
ПЕР
  r,тета:Вещ;
УКАЗ
  r:=мод(z);
  тета:=arg(z);
  ЕСЛИ r = 0 ТО
    ЕСЛИ n = 0 ТО
      к:=крМатем.ДействЕДИНИЦА
    АЕСЛИ n > 0 ТО
      к:=крМатем.НОЛЬ
    ИНАЧЕ
      Матем.код:=Матем.ОСОБЕННОСТЬ;
      к:=крМатем.ДействМаксВещ;
    КОН
  ИНАЧЕ
    тригонВид(Матем.степВЦ(r,n),
              Матем.уголВПи(n*тета),к)
  КОН
КОН степКЦ;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА степКВ-(z-:Вид; v:Вещ;
                      к+:Вид); (* к=z^v - степень комплексного действительная *)
ПЕР
  r,тета:Вещ;
УКАЗ
  r:=мод(z);
  тета:=arg(z);
  ЕСЛИ r = 0 ТО
    ЕСЛИ v = 0 ТО
      к:=крМатем.ДействЕДИНИЦА
    АЕСЛИ v > 0 ТО
      к:=крМатем.НОЛЬ
    ИНАЧЕ
      Матем.код:=Матем.ОСОБЕННОСТЬ;
      к:=крМатем.ДействМаксВещ;
    КОН
  ИНАЧЕ
    тригонВид(Матем.степВВ(r,v),
              Матем.уголВПи(v*тета),к)
  КОН
КОН степКВ;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА степКК-(a-,b-,
                  к+:Вид);        (* к=a^b - степень комплексного комплексная *)
ПЕР
  t:Вид;
УКАЗ
  ЕСЛИ (a[0] = 0) И (a[1] = 0) ТО
    ЕСЛИ (b[0] = 0) И (b[1] = 0) ТО
      к:=крМатем.ДействЕДИНИЦА          (* к= lim a^a = 1 при a -> 0 *)
    ИНАЧЕ
      к:=крМатем.НОЛЬ                   (* к= 0^b = 0, b > 0 *)
    КОН 
  ИНАЧЕ
    ln(a,к);           (* к=ln(a) -> к=a^b = exp(b*ln(a)) *)
    умн(b,к,t);        (* t=b*к = b*ln(a)                 *)
    exp(t,к)           (* к= exp(t)        = exp(b*ln(a)) *) 
  КОН 
КОН степКК;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА корни-(z-:Вид; m,n:ЦЕЛ; к+:Вид);   (* к:=z^(1/n),   m=0..n-1 *)
(* задача корни должна вычислить все "n" корней комплексного z,
   если при её вызове изменять "m" от 0 до n-1 *)
ПЕР
  r,тета:Вещ;
УКАЗ
  ЕСЛИ (n <= 0)
   ИЛИ (m < 0) ИЛИ (m >= n) ТО
    Матем.код:=Матем.ВНЕОБЛАСТИ;
    к:=крМатем.НОЛЬ;
    ВОЗВРАТ
  КОН;
  r:=мод(z);
  тета:=arg(z);
  ЕСЛИ r = 0 ТО
    к:=крМатем.НОЛЬ
  ИНАЧЕ                                (* результат *)
    тригонВид(Матем.степВВ(r,1/n),
              Матем.уголВПи((тета + m*Матем.ДваПИ)/n),к)
  КОН
КОН корни;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА квкор-(z-,к+:Вид); (* к=квкор(z) - отрицательная 2-я степень (кв.корень из) комплексного z *)
ПЕР
  r,тета:Вещ;
УКАЗ
  r:=мод(z);
  тета:=arg(z);
  ЕСЛИ r = 0 ТО
    к:=крМатем.НОЛЬ
  ИНАЧЕ
    тригонВид(Матем.квкор(r),
              Матем.уголВПи(0.5*тета),к)
  КОН
КОН квкор;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА exp-(z-,к+:Вид);                (* к = <Матем.exp(z[0])*Матем.cos(z[1]);
                                               Матем.exp(z[0])*Матем.sin(z[1])> *)
ПЕР
  expX:Вещ;
УКАЗ
  expX:=Матем.exp(z[0]);
  ЕСЛИ     Матем.код = 0 ТО
    алгебрВид(expX*Матем.cos(z[1]),
              expX*Матем.sin(z[1]),к)
  ИНАЧЕ (* Матем.код=ПЕРЕПОЛНЕИЕ или ОБНУЛЕНИЕ *)
    алгебрВид(expX, (* МаксВещ   или  0 *)
                 0,к)
  КОН
КОН exp;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ln-(z-,к+:Вид);                (* к=ln (z) - Ln от комплексного z *)
ПЕР
  r,тета,lnr:Вещ;
УКАЗ
  r:=мод(z);
  тета:=arg(z);
  lnr:=Матем.ln(r);
  ЕСЛИ Матем.код = 0 ТО
    алгебрВид( lnr,
              тета,к)
  ИНАЧЕ
    алгебрВид(-Матем.МаксВещ,
                           0,к)
  КОН
КОН ln;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА lnГприбл(z-,к+:Вид);                                      (* локальная *)
(* Это NBS приближение Г функции в области (9 < Re(z) < 10; 0 < Im(z) < 10). 
 * Другие значения можно получить из: ln Г(z+1) = ln z + ln Г(z) *)
ПЕР
  i:ЦЕЛ;
  кСтепени:РЯД 8 ИЗ Вид;
  кВрем1,
  кВрем2:Вид;
УКАЗ
  ln(z,кВрем1);                        (* ln(z)                      *)
  алгебрВид(z[0]-0.5,
            z[1]    ,кВрем2);          (*  z-0.5                     *)
  умн(кВрем1,кВрем2,к);                (* (z-0.5)*ln(z)              *)
  выч(к,z,к);                          (* (z-0.5)*ln(z)-z            *)
  к[0]:=к[0]+0.91893853320467274178;   (* (z-0.5)*ln(z)-z+ln(2*ПИ)/2 *)
  кВрем1:=крМатем.ДействЕДИНИЦА;
  дел(кВрем1,z,кСтепени[0]);           (*  z^(-1)  *)
  умн(кСтепени[0],кСтепени[0],кВрем2); (*  z^(-2)  *)
  ОТ i:=1 ДО 7 ВЫП
    умн(кСтепени[i-1],кВрем2,кСтепени[i]) 
  КОН;
  ОТ i:=7 ДО 0 ПО -1 ВЫП
    алгебрВид(NBS[i]*кСтепени[i][0],
              NBS[i]*кСтепени[i][1],кВрем1);
    доб(к,кВрем1,к)  
  КОН 
КОН lnГприбл;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА lnГ-(z-,к+:Вид);      (* к=ln( Г(z) ) - Ln Г-функции от комплексного z *)
ПЕР
  lnZ,кX,кY:Вид;
УКАЗ
  Матем.код:=0;

  ЕСЛИ (z[0] <= 0) И (z[1] = 0) ТО
    ЕСЛИ (ЦЕЛЧАСТЬ(z[0]-1.D-8)-z[0]) = 0 ТО           (* Отрицательное целое? *)
      Матем.код:=Матем.ОСОБЕННОСТЬ;
      к:=крМатем.ДействМаксВещ;
      ВОЗВРАТ
    КОН 
  КОН;

  ЕСЛИ z[1] < 0 ТО      (* III (IV) квадрант? *)
    сопр(z,кX);         (* Отображение во II (I) квадрант *)
    lnГ(кX,кY);         (* Попытаемся вычислить здесь *)
    сопр(кY,к)          (* Обратное отображение *)
  ИНАЧЕ
    ЕСЛИ z[0] < 9 ТО    (* за пределами области определения NBS *)
      ln(z,lnZ);
      алгебрВид(1+z[0],
                  z[1],кX);
      lnГ(кX,кY);
      выч(кY,lnZ,к)
    ИНАЧЕ
      lnГприбл(z,к)     (* область определения NBS: 9 < Re(к) < 10 *)
    КОН 
  КОН 
КОН lnГ;

(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
  NBS[0]:= 8.33333E-02;
  NBS[1]:=-2.77777E-03;
  NBS[2]:= 7.93650E-04;
  NBS[3]:=-5.95238E-04;
  NBS[4]:= 8.41750E-04;
  NBS[5]:=-1.91752E-03;
  NBS[6]:= 6.41025E-03;
  NBS[7]:=-2.95506E-02;

  алгебрВид( 0,            0, крМатем.НОЛЬ);              (* кнМатем.НОЛЬ              =< 0; 0> *)
  алгебрВид( 1,            0, крМатем.ДействЕДИНИЦА);     (* кнМатем.ДействЕДИНИЦА     =< 1; 0>=W(0) *)
  алгебрВид(-1,            0, крМатем.минусДействЕДИНИЦА);(* кнМатем.минусДействЕДИНИЦА=<-1; 0>=W(-ПИ)=W(+ПИ) *)
  алгебрВид( 0,            1, крМатем.МнимаяЕДИНИЦА);     (* кнМатем.МнимаяЕДИНИЦА     =< 0; 1>=W(+ПИ/2) *)
  алгебрВид( 0,           -1, крМатем.минусМнимаяЕДИНИЦА);(* кнМатем.минусМнимаяЕДИНИЦА=< 0;-1>=W(-ПИ/2) *)

  алгебрВид(Матем.МаксВещ, 0, крМатем.ДействМаксВещ);     (* кнМатем.ДействМаксВещ     =<Матем.МаксВещ;0> *)
  алгебрВид(Матем.ПолПИ,   0, крМатем.ДействПолПИ)        (* кнМатем.ДействПолПИ       =<Матем.ПолПИ;  0> *)

КОН крМатем.
