Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/91: Рейтинг темы: голосов - 91, средняя оценка - 4.71
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
1

Расширенный алгоритм Евклида

14.11.2009, 13:15. Показов 17654. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу найти решение на Паскале задачи на расширенный алгоритм Евклида:
Для целых m и n, в процессе нахождения d=НОД(m,n) с помощью алгоритма Евклида, определить минимальные x и y, целые, такие, что d=m*x+n*y.
Нужно простое решение, без процедур и функций. В Инете есть что-то подобное на СИ.
Другими словами, в приведенную ниже программу надо добавить строки, определяющие x и y.

Pascal
1
2
3
4
5
6
7
8
9
var
m,n,d,x,y:integer;
begin
readln(m,n);
while (m<>0)and(n(<>0) do
if m>n then m:=m mod n else n:=n mod m;
d:=(m+n);
writeln(d);
end.
Буду очень благодарен за любую помощь.

Добавлено через 15 минут
Лишняя скобка, опечатка
Pascal
1
while (m<>0)and(n<>0) do
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2009, 13:15
Ответы с готовыми решениями:

Алгоритм Евклида
Даны натуральные взаимно простые числа n, p. Найдите m такое, что, во-первых, m&lt;p, во-вторых,...

Алгоритм Евклида
Найти НОД двух положительных чисел с помощью алгоритма евклида

Функции и Алгоритм Евклида
Помогите пожалуйста! Даны натуральные числа а и b, обозначающие соответственно числитель и...

НОК алгоритм Евклида
Определить НОК (наименьшее общее кратное) двух чисел, используя алгоритм Евклида для вычисления НОД...

11
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
14.11.2009, 14:04 2
Я что-то смысл не понимаю. Если
Алгоритм Евклида можно расширить так, что он не только даст НОД(a,b)=d, но и найдет целые числа x и y, такие что ax + by = d.
По моему ясно, что либо х=0, у=1, либо наоборот. Написал я эту программу по этому алгоритму
http://www.cyberguru.ru/cpp-so... klida.html
Выдает 0 и 1.

Или я вообще не врубаюсь.
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
14.11.2009, 14:18  [ТС] 3
Нет, немного не так. Я пример приведу, станет понятнее:
m=44 n=16 d=NOD=4
найденные числа x=3 y=-8
имеем: 44*3=132, 16*(-8)=-128
m*x+n*y=132-128=4=d


Но начинать там надо именно с 0 и 1, на СИ так написано, а потом, видимо, сохранять полученные частные
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
14.11.2009, 14:25 4
Вообще-то 16*(-32)=-512, но не в этом дело, не могу понять откуда возьмутся отрицательные числа. Надо что-то почитать.
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
14.11.2009, 14:31  [ТС] 5
Нашел ещё меньшие числа для этого примера x=-1 y=3 -44+48=4

Добавлено через 40 секунд
насчет 32 - это я погорячился, там 8

а без отрицательных чисел не получится ответа, там вычитать надо из m полученное частное, на что-то умноженное
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
14.11.2009, 22:56 6
http://ru.wikipedia.org/wiki/Алгоритм_Евклида
Там есть описание расширенного алгоритма Евклида.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
14.11.2009, 22:57 7
odip, Да уж наверно почитали. А по ссылке, которую я приложил, даже код на Си есть.
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
14.11.2009, 23:04  [ТС] 8
Да читал я всё, что есть в Инете, а уж ссылки на Википедию - спасибо, что сказали, сам, такой дурак, ни за что бы не догадался. Я просто в СИ полный ноль, мне код на Паскале нужен.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
14.11.2009, 23:53 9
Выдает 0 и 1.
Или я вообще не врубаюсь.
А по ссылке, которую я приложил, даже код на Си есть.
При a=44, b=16 выдает:
Код
x = -1 y = 3 d = 4
А вовсе не 0 и 1.

Осталось переписать на Pascal

Добавлено через 1 минуту
Вообще-то там сверху алгоритм описан на псевокоде.
Так что язык С не нужно знать.
0
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
14.11.2009, 23:59  [ТС] 10
Самое смешное, что с псевдокода ни я, никто другой, на Паскаль не смогли перевести...
0
Retired
7727 / 2559 / 671
Регистрация: 17.10.2009
Сообщений: 5,100
15.11.2009, 04:07 11
Лучший ответ Сообщение было отмечено как решение

Решение

вот мой перевод с псевдокода на Pascal. конечно может я чего-то не понял(потому как я не понимаю тогда в чем было затруднение перевода с псевдокода), но считается все верно, я проверял.
Цитата Сообщение от alexevt Посмотреть сообщение
Нужно простое решение, без процедур и функций.
не знаю конечно чем функции и процедуру усложняют программу... но влюбом случае кину два варианта с процедурой и без...
вот с процедурой:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var
  a,b,d,x,y:Longint;
{ðàñøèðåííûé àëãîðèòì Åâêëèäà}
procedure Eq(a,b:longint; var d,x,y:longint);
var
  x1,y1,x2,y2,q,r:Longint;
begin
  if b=0 then
  begin
    d:=a;
    x:=1;
    y:=0
  end
  else
  begin
    x1:=0;
    x2:=1;
    y1:=1;
    y2:=0;
    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;
    d:=a;
    x:=x2;
    y:=y2
  end;
end;
{îñíîâíàÿ ïðîãðàììà}
begin
  readln(a,b);
  Eq(a,b,d,x,y);
  writeln('Ðàñøèðåííûé àëãîðèòì Åâêëèäà(d(ÍÎÄ(a,b))=x*a+y*b):');
  writeln('d=',d,' x=',x,' y=',y)
end.
а вот и без:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var
  a,b,d,x,y,x1,y1,x2,y2,q,r:Longint;
begin
  readln(a,b);
  if b=0 then
  begin
    d:=a;
    x:=1;
    y:=0
  end
  else
  begin
    x1:=0;
    x2:=1;
    y1:=1;
    y2:=0;
    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;
    d:=a;
    x:=x2;
    y:=y2
  end;
  writeln('Ðàñøèðåííûé àëãîðèòì Åâêëèäà(d(ÍÎÄ(a,b))=x*a+y*b):');
  writeln('d=',d,' x=',x,' y=',y)
end.
8
1 / 1 / 0
Регистрация: 27.10.2012
Сообщений: 22
16.06.2013, 01:44 12
Доброго всем времени суток!
Я попытался перевести псевдокод и вот что у мя получилось:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function ExtEvklid(e,phi: integer; var x: integer; var y: integer): integer;
var 
  x1,x2,y1,y2,q,r: integer;
begin
  Result:= 0;
  x1:=0;
  x2:=1;
  y1:=1;
  y2:=0;
  if phi = 0 then 
  begin
    Result:=e;
    x:=1;
    y:=0;
  end
  else
  begin
    while phi > 0 do    
    begin
      q:=e div phi;
      r:=e-q*phi;
      x:=x2-q*x1;
      y:=y2-q*y1;
      e:=phi;
      phi:=r;
      x2:=x1;
      x1:=x;
      y2:=y1;
      y1:=y;
    end;
    Result:=e; // по условиям псевдокода 
    x:=x2;
    y:=y2;
  end;
end;
Возвращает те же результаты, что и
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure ExtEvklid(e,phi: integer; var x: integer; var y: integer);
var 
  x1,x2,y1,y2,q,r: integer;
  xx1,yy1: integer;
begin
  x1 := 1; x2 := 0;
  y1 := 0; y2 := 1; // matrix
 
  q := e div phi;
  r := e mod phi;
 
  while(r <> 0) do 
    begin
      xx1 := x1;
      yy1 := y1;
 
      x1 := x2;
      x2 := xx1 - q*x2;
      y1 := y2;
      y2 := yy1 - q*y2;
 
      e := phi; 
      phi := r; 
 
      q := e div phi;
      r := e mod phi;
    end;
 
  x := x2;
  y := y2;
end;
(за исключением НОД [GCD])
Но тут собака порылась вот в чём (или я чё-то не допетриваю):
в соответствии с примером с одного из форумов - берутся 2 числа а:= 11 и b:= 13 - ф-ция Эйлера (как и в примере) возвращает мне phi:= 120 - это кольцо вычетов, далее в примере (вродь как случайным образом) выбирают константу е:= 113 и через расширенный алгоритм Евклида вычисляют противоположную по кольцу взимнопростую d:= 17.
Pascal
1
ExtEvklid(e, phi, x, y);
возвращает х:= 17, а вот если вызвать то же самое, но e:= 17, то х:= -7...? А если в виндовском куркуляторе набрать: 120 => * => - => 7, то 113 получаем-таки а
Pascal
1
d:= phi * (-x);
получаем 840 - В чём тут соль и как енто дело подрихтовать? что-то типа:
Pascal
1
2
3
4
if x > 0 then d:= x else 
begin
...
end;
тут на PASCAL надо переводить с языка куркулятора

Заранее благодарен.

Добавлено через 23 минуты
Цитата Сообщение от UFO 007-Meloman Посмотреть сообщение
... тут на PASCAL надо переводить с языка куркулятора ...
Вернее мож Хто растолкует эквивалент (ф-цию) магической комбинации ...=> * => - =>... В справке не нашёл.

З. Ы. Сорри - не дотумкал, что в теме может быть 2-я страница и вродь как продублировал перевод псевдокода хотя и с небольшой поправочкой - это под VCL но думаю что и из-под CLX вызовется и сработает.
0
16.06.2013, 01:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2013, 01:44
Помогаю со студенческими работами здесь

Сокращение дроби (алгоритм Евклида)
Написать программу сокращения дроби p/q, где p и q натуральные числа (Алгоритм Евклида). Результат...

Наибольший общий делитель двух натуральных чисел A и B, используя алгоритм Евклида
помогите пожалуйста((( долго уже думаю над прогой.... вобщем задание... Описать не рекурсивную...

Описать рекурсивную функцию NOD(A,B), находящую наибольший общий делитель двух чисел, используя алгоритм Евклида
Описать рекурсивную функцию NOD(A,B) целого типа, находящую наибольший общий делитель двух...

Даны натуральные числа A и B. Найти их НОК, определив функцию для расчета НОД двух натуральных чисел, используя алгоритм Евклида
Даны натуральные числа A и B. Найти их наименьшее общее кратное, определив функцию для расчета...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru