Помощь - Поиск - Пользователи - Календарь
Полная версия: алгоритм евклида
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Feagor
условие в прикрепленном файле.
вот то что сделал, дальше что делать не врубаюсь
uses crt;
 function nod(a, b:longint):longint;
 begin
  if (a=0) or (b=0) then if a=0 then nod:=b
                                else nod:=a
                    else if a >= b then nod:=nod(a mod b,b)
                                   else nod:=nod(a,b mod a);
 end;
 var f,g,i:integer;
 ff,aa:array[1..1000] of integer;
  begin
    clrscr;
    read(f,g);
    ff[1]:=f;
    ff[2]:=g;
    i:=2;
    while ff[i] mod ff[i-1]>0 do
        begin
         inc(i);
         ff[i]:=ff[i-1] mod ff[i-2];
         aa[i]:=ff[i-1] div ff[i-2];
        end;
    readkey;
  end.

Tan
Тут материал с пояснением.
Feagor
2 Tan - посмотри внимательно задание, и посмотри пожалуста, что у меня сделано! на той ссылке лежит разъянению функции, которая считает нод!
 function nod(a, b:longint):longint;
 begin
  if (a=0) or (b=0) then if a=0 then nod:=b
                                else nod:=a
                    else if a >= b then nod:=nod(a mod b,b)
                                   else nod:=nod(a,b mod a);
 end;

она у меня написана, проблема в том что вообще делать дальше?!
Tan
Алгоритм Евклида - это поиск наибольшего общего делителя двух целых чисел, что и сделано в приведённой мной ссылке. Не вижу проблемы.
Michael_Rybak
Tan, имеется ввиду расширенный алгоритм Эвклида. Посмотри объяснение, присоединенное к первому посту.

Feagor, тебе нужно кроме f и a еще считать коэффициенты p и s такие, что для любого i:

f[0] * s[i] + f[1] * p[i] = f[i].

Как это сделать, написано в том объяснении.

Ответом будет пара (s[n], p[n]).



Feagor
2 Michael_Rybak в каком объяснении?я туплю?=)
а с вариантом Б) и В) что делать?
Michael_Rybak
б) - сократи уравнение на нод и подумай что дальше делать

в) - делай то что там сказано. вычисляй не s[i] и p[i] а только s[i].
Feagor
спасип, буду разбиратся! понял на счет объяснения, туплю!!!
Feagor
после десятикратного прочтения объяснения, до сих пор не могу понять как искать u и v...
Michael_Rybak
u=s[n]
v=p[n]
Feagor
а n- это последний член? или как?
Feagor
по материалам algolist.manual.ru решил сделать вот так:
uses crt;
 procedure nod(a, b:longint; var d,x,y:longint);
 var q,r,x1,x2,y1,y2:longint;
 begin
   if b=0 then
        begin
          d:=a;
          x:=1;
          y:=0;
        end
   else
        begin
          x2:=1;x1:=0;y2:=0;x1:=1;
          while b>0 do
                begin
                  q:=a div b;
                  r:=a-q*b;
                  x:=x2-q*x1;
                  y:=y2-q*y1;
                  a:=b;b:=r;x2:=x1;x1:=x;y2:=y1;y1:=y;
                end;
        end;
   d:=a; x:=x2;y:=y2;
 end;
 var a,b,d,x,y:longint;
 begin
   clrscr;
   Write('Input f,g');
   Read(a,b);
   nod(a,b,d,x,y);
   writeln(d,'   ',x,'   ',y);
   readkey;
 end.


заработало!!! остались б и в
Michael_Rybak
работает неправильно на каком тесте?
Feagor
2 Michael_Rybak попровил свои кривые ручки - заработало, помоги с написанием б
Michael_Rybak
про б я тебе уже сказал что делать.
Feagor
ну вот смотри, берем уравнение fu+gv=nod(f,g) делим его на нод fu/nod(f,g)+fg/nod(f,g)=1 выносим за скобку u и g u*(f/nod(f,g))+v*(g/nod(f,g))=1, тогда m=1; k=f/nod(f,g); l=g/nod(f,g) Я правильно тебя понял так делать?

Добавлено через 1 мин.
тольков объяснении кажись что-то другое написано
Michael_Rybak
Не совсем так.

Тебе нужно вычислить не m, k и l - они тебе даны! А вычислить нужно х и у.

Берешь уравнение kx + ly = m, и делишь его на нод(x, y).
Feagor
Цитата
Берешь уравнение kx + ly = m, и делишь его на нод(x, y).
может не нод(x,y), а нод(k,l)?
Michael_Rybak
Ой smile.gif Да, конечно.

Feagor
вот что получилось:
uses crt;
 procedure nod(a, b:longint; var d,x,y:longint);
 var q,r,x1,x2,y1,y2:longint;
 begin
   if b=0 then
        begin
          d:=a;
          x:=1;
          y:=0;
        end
   else
        begin
          x2:=1;x1:=0;y2:=0;y1:=1;
          while b>0 do
                begin
                  q:=a div b;
                  r:=a-q*b;
                  x:=x2-q*x1;
                  y:=y2-q*y1;
                  a:=b;b:=r;x2:=x1;x1:=x;y2:=y1;y1:=y;
                end;
        end;
   d:=a; x:=x2;y:=y2;
 end;
 var a,b,d,x,y,k,l,m:longint;
     xx,yy:real;
 begin
   clrscr;
   Writeln('Input f,g');
   Read(a,b);
   nod(a,b,d,x,y);
   writeln(d,'   ',x,'   ',y);
   writeln('Input k,l,m');
   read(k,l,m);
   nod(abs(k),abs(l),d,x,y);
   xx:=x*m/d;
   yy:=y*m/d;
   writeln(trunc(xx),'   ',trunc(yy));
   readkey;
 end.


Вроде работает, Michael_Rybak +1 за великое знание cool.gif lol.gif
Michael_Rybak
smile.gif всегда рад smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.