    9.4    

                 ᮢo 㤠e - 饨  
     襭  ⥬ Ax = b    A  
    ⫨        ந  ᯮ.
    ᮢ 㤠 㬥蠥 Ax = b  孨  㣮
    ⥬ Tx = c,    ⭮⥫쭮  ⮤
    ⭠  ⠭.     ப 
    ⥬ 㬬 ⮩  ப   㣮 ப ⥬,
      㫥 ⥫. ᯮ㥬  ⮤
    ⮡ ࠭ ⫨      ᭮
     .
            㭮           11 12 13 14 15
      ⬠.            0  22 23 24 25
    ⫨             0   0  33 34 35
        ⮫          0   0  43 44 45
    㤠.  蠣 i ⫨           0   0  53 54 55
        
      ⮫ i 㤠塞,           i=3
       ப  j,
      i+1 <= j <= n,  㬬 ப j  cப i, 
     -a[j,i]/a[i,i] . ᫥ n - 1 ⠪ 樨,  
    ⥬ -  孥 㣮쭮 ଥ.
             ᠭ אַ ᮢ ⬥ 㤠 ,
    ப  i - pivot ப ,   ப ᯮ㥬 
    ࠢ 㫥  ⫨    ⮢ 
      ⮫ i.

program parallel_gaussian_ellimination_1;
const  n=4;
(*       a:array[1..n,1..n] of real=((5,6,1,8),
                                   (5,1,8,3),
                                   (5,1,4,3),
                                   (1,5,6,4));
       b:array[1..n] of real=(5,3,2,3); *)
var    x:array[1..n] of real;
       a:array[1..n,1..n] of real;
       b:array[1..n] of real;
       i,j,k:integer;
       tmp:real;

begin
        for i:=1 to n do
          for j:=1 to n do
            begin
(*              writeln(' [',i,',',j,']: ');*)
                readln(a[i,j]);
            end;
        for i:=1 to n do
            begin
(*              writeln(' b[',i,']: ');*)
                readln(b[i]);
            end;
(*   for i:=1 to n do begin
      for j:=1 to n do
        write(a[i,j]:10:1);
        writeln(b[i]:10:1);
    end;
    writeln; *)

    for i:=1 to n-1 do
        forall j:=1 to n do
            begin
              tmp:=a[j,i]/a[i,i];
              for k:=i to n do begin
                a[j,k]:=a[j,k] - a[i,k]*tmp;
                if abs(a[j,k])<1E-10 then a[j,k]:=0;
               end;
              b[j]:=b[j] - b[i]*tmp;
            end;

(*   for i:=1 to n do begin
      for j:=1 to n do
        write(a[i,j]:10:1);
        writeln(b[i]:10:1);
    end;
    writeln; *)

   (*  襭  ⮤ ⭮ ⠭ *)

end.



                       室      
    ᫮  ⠡쭮    ஢  .  ,
    ⮩ ਠ, 뢠 ᮢ 㤠   
    ⮬, ந  १.  蠣  i  -
    ᮢ 㤠    ⮬,  ப  i - n
    饬 ப 祩  i- ⮫   ᠬ  讥
    ᮫⭮ 祭.  ப     ப  i .
                          ᯮ  ⥫
    pivot ப ( ⥯ ப i ) , ⮡   
    ⫨       ⮫ i  ப (i+1) - n.
      pivot ப  ப i    樨 ,
      ᯮ  ᢥ.    ᨢ
    pivot[i] ᮤন ⨢   ஬ ப i -
    짮  pivot ப. 㣮 ᨢ   -
    祭 । ᯮ짮  ᯥ᪠ ப
      pivot  ப;  ᨢ marked[i] ⠭ 
    1  ப  i  롨ࠥ  pivot ப. .. ப
     ⠢,    ᨢ , 騩
    ⠭ ப.

program parallel_gaussian_ellimination_2;
const  n=4;
(*       a:array[1..n,1..n] of real=((5,6,1,8),
                                   (5,1,8,3),
                                   (5,1,4,3),
                                   (1,5,6,4));
       b:array[1..n] of real=(5,3,2,3); *)
var    x:array[1..n] of real;
       a:array[1..n,1..n] of real;
       b:array[1..n] of real;
       marked:array[1..n] of integer;
       pivot:array[1..n] of integer;
       picked:integer;
       magnetude:real;
       winner:integer;
       i,j,k:integer;
       tmp:real;
       tmpv:array[1..n+1] of real;

procedure result;
begin
      for i:=1 to n do begin
        for j:=1 to n do
          write(a[pivot[i],j]:10:1);
        writeln(b[pivot[i]]:10:1);
      end;
      writeln;
end;

begin
        for i:=1 to n do
          for j:=1 to n do
            begin
(*              writeln(' [',i,',',j,']: ');*)
                readln(a[i,j]);
            end;
        for i:=1 to n do
            begin
(*              writeln(' b[',i,']: ');*)
                readln(b[i]);
            end;
(*   for i:=1 to n do begin
      for j:=1 to n do
        write(a[i,j]:10:1);
        writeln(b[i]:10:1);
    end;
    writeln; *)
    for i:=1 to n do
      marked[i]:=0;
    for i:=1 to n-1 do
      begin
        tmp:=abs(a[i,i]);
        picked:=i;
        forall j:=i to n do
          if (marked[j]=0) and (abs(a[j,i])>tmp) then
             begin
               tmp:=abs(a[j,i]);
               picked:=j;
             end;
        marked[picked]:=1;
        pivot[picked]:=i;
        for j:=1 to n do
          if marked[j]=0 then
            begin
              tmp:=a[j,i]/a[picked,i];
              for k:=i to n do begin
                a[j,k]:=a[j,k] - a[picked,k]*tmp;
                if abs(a[j,k])<1E-10 then a[j,k]:=0;
               end;
              b[j]:=b[j] - b[picked]*tmp;
            end;
      end;
      for i:=1 to n do
        if marked[i]=0 then pivot[i]:=n;
(*        result;    *)

(*  襭 ஢ ⮤ ⭮ ⠭ *)

        for i:=n downto 1 do
         begin
          x[i]:=b[pivot[i]]/a[pivot[i],i];
          forall j:=1 to n do
           begin
            b[pivot[j]]:=b[pivot[j]]-x[i]*a[pivot[j],i];
            a[pivot[j],i]:=0;
           end;
         end;

(*      for i:=1 to n do
                writeln(x[i]:10:1);

      writeln;

      for i:=1 to n do begin
        tmp:=b[i];
        for j:=1 to n do
           tmp:=tmp-x[j]*a[i,j];
        writeln(tmp:10:3);
      end;

      writeln;  *)

end.















