program FindRoot;
const
  e0=1e-10; MaxStep=10;
var a,b,m,x:double;
{
function f(x:double):double;
begin
  f:=sin(3*x)-x;
end;

function df(x:double):double;
begin
  df:=3*cos(3*x)-1;
end;
}
function f(x:double):double;
begin
  f:=x/ln(x)-20;
end;

function df(x:double):double;
begin
  df:=(ln(x)-1)/sqr(ln(x));
end;

procedure BinRoot(a,b:double; var m:double);
var fa,fb,fm:double;
  j:longint;
begin
  writeln('Bin Mode');
  fa:=f(a);  fb:=f(b);
  if fa*fb>0 then begin
    writeln('May no root in the area');
    exit;
  end;

  j:=0;
  while (abs(a-b)>e0)and(j<MaxStep) do begin
    m:=(a+b)/2.0;
    fm:=f(m);
    {if fm*fa<0 then ...}
    if (fm>0)xor(fa<0) then begin
      a:=m;  fa:=fm;
    end else begin
      b:=m;  fb:=fm;
    end;
    inc(j);
    writeln(j:2,'  ',a:1:10,'<x<',b:1:10,'  b-a=',b-a:1:10);
  end;
end;

procedure LinRoot1(a,b:double; var m:double);
var fa,fb,fm,fp:double;
  j:longint;
begin
  writeln('Line Mode simple');
  fa:=f(a);  fb:=f(b);
  if fa*fb>0 then begin
    writeln('May no root in the area');
    exit;
  end;

  j:=0;
  while (abs(a-b)>e0)and(j<MaxStep) do begin
    m:=-fa*(b-a)/(fb-fa)+a;
    fm:=f(m);
    if (fm>0)xor(fa<0) then begin
      a:=m;  fa:=fm;
    end else begin
      b:=m;  fb:=fm;
    end;
    inc(j);
    writeln(j:2,'  ',a:1:10,'<x<',b:1:10,'  b-a=',b-a:1:10);
  end;
end;

procedure LinRoot2(a,b:double; var m:double);
var fa,fb,fm,fp:double;
  j:longint;
begin
  writeln('Line Mode - with bin mode');
  fa:=f(a);  fb:=f(b);
  if fa*fb>0 then begin
    writeln('May no root in the area');
    exit;
  end;

  j:=0;
  while (abs(a-b)>e0)and(j<MaxStep) do begin
    if (j mod 5=0)and(j<MaxStep-1) then begin
      m:=(a+b)/2.0;
      fm:=f(m);
      if (fm>0)xor(fa<0) then begin
        a:=m;  fa:=fm;
      end else begin
        b:=m;  fb:=fm;
      end;
    end else begin
      m:=-fa*(b-a)/(fb-fa)+a;
      fm:=f(m);
      if (fm>0)xor(fa<0) then begin
        a:=m;  fa:=fm;
      end else begin
        b:=m;  fb:=fm;
      end;
    end;
    inc(j);
    writeln(j:2,'  ',a:1:10,'<x<',b:1:10,'  b-a=',b-a:1:10);
  end;
end;

procedure newton(a,b:double; var x:double);
var j:longint;
  old_x:double;
begin
  j:=0;
  if a>b then begin x:=a; a:=b; b:=x; end;
  old_x:=a;  x:=b;
  while (j<MaxStep)and(abs(x-old_x)>e0) do begin
    old_x:=x;
    x:=x-f(x)/df(x);
    if (x<a) or (b<x) then begin
      writeln('Fail to find root');
      break;
    end;
    inc(j);
    writeln(j:2,'  x=',x:1:10,'  x-old_x=',x-old_x:1:10);
  end;
end;

begin
{  a:=0.5;
  b:=1.0;}
  a:=60;
  b:=110;
  binroot(a,b,m);
  writeln('Root:',m);
  linroot1(a,b,m);
  linroot2(a,b,m);
  newton(a,b,m);
  writeln('Root:',m);
end.