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

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

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

(*----------------------------------------------------------------------------*
 * Вид обрабатываемых данных: комплексное в виде набора из 2-х вещ.
 *----------------------------------------------------------------------------*)
ВИД 
  Вид- = НАБОР
              д+,м+:Вещ   (* оконечный (+) нежелателен, но может быть быстрее,
                                         чем доступ через задачи этого отдела *)
      (* или 
              д-,м-:Вещ (* в других отделах эти свойства\поля изменять нельзя *)
       *)
         КОН;
(*
                          вместо (как в \Отделы\Числа - у Издателя Глагола)
  Вид- = НАБОР
              x-,y-:дМатем.Вещ
         КОН;
*)
(*-----------------------------------------------------------------------------*
 * Комплексные переменные/постоянные в виде набора
 *----------------------------------------------------------------------------*)
ПЕР
              НОЛЬ- :Вид; (* < 0;            0> *)
     ДействЕДИНИЦА- :Вид; (* <+1;            0>=W(0) *)
минусДействЕДИНИЦА- :Вид; (* <-1;            0>=W(-ПИ)=W(+ПИ) *)
     МнимаяЕДИНИЦА- :Вид; (* < 0;           +1>=W(+ПИ/2)=<cos(+ПИ/2);sin(+ПИ/2)> *)
минусМнимаяЕДИНИЦА- :Вид; (* < 0;           -1>=W(-ПИ/2)=<cos(-ПИ/2);sin(-ПИ/2)> *)

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

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


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


(*----------------------------------------------------------------------------*
 * Стандартные функции: норма, модуль, аргумент (экспоненты),
 *                знак и обмен 2-х комплексных чисел в виде набора из 2-х вещ
 *----------------------------------------------------------------------------*)

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

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

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

(*----------------------------------------------------------------------------*
 * арифметические действия над комплексными в виде набора из 2-х вещ
 *----------------------------------------------------------------------------*)

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

ЗАДАЧА^ сложить-(a-,b-,к+:Вид);         (* к:=a+b - сложение  2-х  комплексных <a> и <b> *)
ЗАДАЧА^ вычесть-(a-,b-,к+:Вид);         (* к:=a-b - вычитание 2-х  комплексных <a> и <b> *)
ЗАДАЧА^ добавить-(b-,к+:Вид);(* к+=b;      к:=к+b - увеличить <к+> на комплексное <b> *)
ЗАДАЧА^ отнять-(b-,к+:Вид);  (* к-=b;      к:=к-b - уменьшить <к+> на комплексное <b> *)

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

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

ЗАДАЧА^ суммаПроизведений-(a-,b-,sum+:кнМатем.Вид); (* sum:=sum+a*b - сумма произведений двух комплексных в ДПФi *)

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

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

(*----------------------------------------------------------------------------*
 * Степенные функции комплексного аргумента в виде набора
 *----------------------------------------------------------------------------*)

ЗАДАЧА^ степКЦ-(z-:Вид; n:ЦЕЛ; к+:Вид); (* к:=z^n - степень комплексного ЦЕЛая *)
ЗАДАЧА^ степКВ-(z-:Вид; v:Вещ; к+:Вид); (* к:=z^v - степень комплексного действительная *)
ЗАДАЧА^ степКК-(a-,b-,к+:Вид);          (* к:=a^b - степень комплексного комплексная *)

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

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

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

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


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


(*============================================================================*
 * Стандартные функции: норма, модуль, аргумент (экспоненты),
 *                знак и обмен 2-х комплексных чисел в виде набора из 2-х вещ
 *============================================================================*)

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

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

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

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

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


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

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


(*============================================================================*
 * арифметические действия над комплексными в виде наборов
 *============================================================================*)

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА минус-(к+:Вид);        (* к:=-к - минус (самоотрицание) комплексного к *)
УКАЗ
  алгебрВид(-к.д,
            -к.м,к)
КОН минус;

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА сопрячьсебя-(к+:Вид);  (* к:=к* - самосопряжение        комплексного к *)
УКАЗ
  алгебрВид(+к.д,
            -к.м,к)
КОН сопрячьсебя;

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА добавить-(b-,к+:Вид);      (* к+=b;  к:=к+b - увеличить <к+> на комплексное <b> *)
УКАЗ
  алгебрВид(к.д + b.д,
            к.м + b.м,к)
КОН добавить;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА отнять-(b-,к+:Вид);        (* к-=b;  к:=к-b - уменьшить <к+> на комплексное <b> *)
УКАЗ
  алгебрВид(к.д - b.д,
            к.м - b.м,к)
КОН отнять;


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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА увеличВдейств-(   v:Вещ; к+:Вид); (* к*=v;
                                            к:=к*v - увеличить <к+> в действ. число <v> раз *)
УКАЗ
  алгебрВид( к.д*v,
             к.м*v,к)
КОН увеличВдейств;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА увеличВкомпл-(   b-:Вид; к+:Вид); (* к*=b;
                                            к:=к*b - увеличить <к+> в  компл. число <b> раз *)
УКАЗ
  алгебрВид(к.д*b.д - к.м*b.м,
            к.д*b.м + к.м*b.д,к)
КОН увеличВкомпл;


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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА уменьшВдейств-(   v:Вещ; к+:Вид); (* к/=v; 
                                            к:=к/v - уменьшить <к+> в действ. число <v> раз *)
УКАЗ
  алгебрВид( к.д/v,
             к.м/v,к)
КОН уменьшВдейств;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА уменьшВкомпл-(    b-:Вид; к+:Вид);(* к/=b;
                                            к:=к/b - уменьшить <к+> в  компл. число <b> раз *)
ПЕР
  врем:Вещ;
УКАЗ
  ЕСЛИ (b.д = 0) И (b.м = 0) ТО
    дМатем.код:=дМатем.ПЕРЕПОЛНЕНИЕ;
    к:=кнМатем.ДействМаксВещ;
    ВОЗВРАТ
  КОН;
  врем:=дМатем.кв(b.д) + дМатем.кв(b.м);
  алгебрВид(
            (к.д*b.д + к.м*b.м)/врем,
            (к.м*b.д - к.д*b.м)/врем,к)
КОН уменьшВкомпл;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА суммаПроизведений-(a-,b-,sum+:кнМатем.Вид); 
                             (* sum:=sum+a*b - сумма произведений двух комплексных *)
УКАЗ
  алгебрВид(
            (a.д*b.д - a.м*b.м) + sum.д,
            (a.д*b.м + a.м*b.д) + sum.м,sum)
КОН суммаПроизведений;


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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА кв-(z-,к+:Вид);       (* к:=z^(+2); к:=кв(z) - квадрат комплексного z  *)
УКАЗ
  алгебрВид(z.д*z.д - z.м*z.м,
(*          z.д*z.м + z.м*z.д,к)   *)
            z.д*z.м*2,        к) 
КОН кв;

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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА exp-(z-,к+:Вид);              (* к = <дМатем.exp(z.д)*дМатем.cos(z.м);
                                             дМатем.exp(z.д)*дМатем.sin(z.м)> *)
ПЕР
  expX:Вещ;
УКАЗ
  expX:=дМатем.exp(z.д);
  ЕСЛИ     дМатем.код = 0 ТО
    алгебрВид(expX*дМатем.cos(z.м),
              expX*дМатем.sin(z.м),к)
  ИНАЧЕ (* дМатем.код=дМатем.ПЕРЕПОЛНЕИЕ или дМатем.ОБНУЛЕНИЕ *)
    алгебрВид(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.5,
            z.м    ,кВрем2);           (*        z-0.5               *)
  умножить(кВрем1,  кВрем2,к);         (* ln(z)*(z-0.5)              *)
(*вычесть(к,z,к);   к=к-z *)           (* ln(z)*(z-0.5) - z          *)
  отнять(z,к);   (* к=к-z *)           (* ln(z)*(z-0.5) - z          *)
  к.д:=к.д+0.91893853320467274178;     (* ln(z)*(z-0.5) - z + ln(2*ПИ)/2 *)
  кВрем1:=кнМатем.ДействЕДИНИЦА;       (* кВрем1:=< 1; 0> *)
  делить(кВрем1,z,кСтепени[0]);                       (*    1/z     = z^(-1) = кСтепени[0] *)
      (* умножить(кСтепени[0],кСтепени[0],кВрем2);*)  (*    1/(z^2) = z^(-2)  *) 
               кв(кСтепени[0],кВрем2);                (* кв(1/z)    = z^(-2) = кВрем2 *)
(*
                      квкор(z,кВрем2);                (* квкор(z)   = z^(-2) = кВрем2 *)
*)
  ОТ i:=1 ДО 7 ВЫП
       умножить(кСтепени[i-1],кВрем2,кСтепени[i]) (* кСтепени[i]=кСтепени[i-1]*кВрем2 *) 
  КОН;
  ОТ i:=7 ДО 0 ПО -1 ВЫП
    алгебрВид(NBS[i]*кСтепени[i].д,
              NBS[i]*кСтепени[i].м,кВрем1);
(* сложить(к,кВрем1,к)         к=к+кВрем1 *)
    добавить(кВрем1,к)      (* к=к+кВрем1 *)
  КОН 
КОН lnГприбл;

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

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

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


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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА степКЦ-(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) И (a.м = 0) ТО
    ЕСЛИ (b.д = 0) И (b.м = 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)) *) 
  КОН 
КОН степКК;


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

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА arcsin-(z-,к+:Вид);
ПЕР
  rp,rm,s,врем,zX2:Вещ;
  t:Вид;
УКАЗ
  алгебрВид( z.м,
            -z.д,t);  (* t = z.м - i*z.д *)
  zX2:=2*z.д;
  s:=дМатем.кв(z.д)+дМатем.кв(z.м)+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.д,sinX,cosX);
  дМатем.shch(z.м,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.д,sinX2,cosX2);
  дМатем.shch(2*z.м,sinhY2,coshY2);
  ЕСЛИ дМатем.код = 0 ТО
    врем:=cosX2+coshY2
  ИНАЧЕ
    врем:=coshY2 
  КОН;
  ЕСЛИ врем # 0 ТО
    алгебрВид(
               sinX2/врем,
              sinhY2/врем,к)
  ИНАЧЕ                             (* z = ПИ/2 + к*ПИ *)
    дМатем.код:=дМатем.ОСОБЕННОСТЬ;
    к:=кнМатем.ДействМаксВещ
  КОН
КОН tg;

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


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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА sh-(z-,к+:Вид);
ПЕР
  shX,chX:Вещ;
УКАЗ
  дМатем.shch(z.д,shX,chX);
  алгебрВид(
            shX*дМатем.cos(z.м),
            chX*дМатем.sin(z.м),к)
КОН 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.д, shX,chX);
  алгебрВид(
            chX*дМатем.cos(z.м),
            shX*дМатем.sin(z.м),к)
КОН ch;

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА th-(z-,к+:Вид);
ПЕР
  X2,Y2,
  sinY2,cosY2,
  shX2,chX2, врем:Вещ;
УКАЗ
  X2:=2*z.д;
  Y2:=2*z.м;
  дМатем.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.д) = 1) И (z.м = 0)
  ТО                                      (* z = +/- 1 *)
    дМатем.код:=дМатем.ОСОБЕННОСТЬ;
    алгебрВид(дМатем.условСменаЗнакаЧ(дМатем.МаксВещ,z.д),
                                                       0 ,к)
  ИНАЧЕ 
    умножить(кнМатем.МнимаяЕДИНИЦА,z,t);  (* t= (0;1)*z - аргумент *)
    arctg(t,к);                           (* к= arctg(t)           *)
    умножить(кнМатем.МнимаяЕДИНИЦА,к,t);  (* t= (0;1)*к            *)
    отрицание(t,к)                        (* к= -t                 *)
  КОН 
КОН Arth;


(*-ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss-*)
УКАЗ
  NBS[0]:= 8.33333333333333D-02;
  NBS[1]:=-2.77777777777778D-03;
  NBS[2]:= 7.93650793650794D-04;
  NBS[3]:=-5.95238095238095D-04;
  NBS[4]:= 8.41750841750842D-04;
  NBS[5]:=-1.91752691752692D-03;
  NBS[6]:= 6.41025641025641D-03;
  NBS[7]:=-2.95506535947712D-02;

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

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

КОН кнМатем.
