Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 4

Диофантово уравнение расширенным методом Евклида

01.03.2015, 11:23. Показов 5072. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,уважаемые форумчане.Пытаюсь написать код для следующей задачки,но почему то преподаватель никак ее не принимает.В программировании новичок,не судите строго и помогите чем сможете,буду благодарна.
Задача такая: вводим переменные a,b,T,
на выходе должно получиться диофантово уравнение ax+by=T
Мои попытки:Эта работает не для всех вырожденных случаев,а именно если ввести 4,8,9 то не работает.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
Var x,y: Integer; {исходные данные}
p,q,r,s,w,m,T,n: Integer; {введённые вспомогательные переменные}
k: Integer; {для изменения значений p,q,r,s}
d: Integer; {значение наибольшего общего делителя}
g: real;
Begin
writeln('vvedite dva chisla');
Read(x,y);
writeln('vvedite T');
read(T);
 
if x mod y = 0 then 
if T mod y=0
then begin
g:=T/y;
writeln('Вырожденный случай ');
writeln(x,' делится на ', y);
writeln(T,'=',0,'*',x,'*+',g,'*',y);
end;
if x mod y = 0 then 
if T mod y<>0 then 
writeln('Вырожденный случай решений нет ');
 
if y mod x = 0 then begin
if T mod x=0
then begin
g:=T/x;
writeln('Вырожденный случай ');
writeln(x,' делится на ', y);
writeln(T,'=',g,'*',x,'*+',0,'*',y);
end;
if x mod y = 0 then 
if T mod x<>0 then 
writeln('Вырожденный случай решений нет ');
end;
 
begin
 
if y mod x<>0 then 
if x mod y<>0 
then begin
 
m:=x; n:=y; p:=1; q:=0; r:=0; s:=1;
Repeat
If m>n Then Begin
k:=m Div n; m:=m Mod n;
p:=p-k*r; q:=q-k*s
End
Else Begin
k:=n Div m; n:=n Mod m; r:=r-k*p; s:=s-k*q End;
Until (m=0) Or (n=0);
If m=0 Then Begin
d:=n; q:=r; w:=s;
End
Else Begin d:=m; q:=p; w:=q; End;
Writeln(d,'=',q,'*',x,'+',w,'*',y);
writeln(T,'=',q*T,'*',x,'*+',w*T,'*',y);
End;
end;
end.
 
 
 
Есть еще один вариант,но как оказалось,он тоже не для всего,ввожу 6,12,3 получаю нет решений.
var
a,b,T,
d,x,y:Longint;
g:real;
{расширенный алгоритм Евклида}
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
writeln('vvedite dva chisla');
Read(a,b);
writeln('vvedite T');
read(T);
if a mod b = 0 then 
if T mod b=0
then begin
g:=T/b;
writeln('Вырожденный случай ');
writeln(a,' делится на ', b);
writeln(T,'=',0,'*',a,'*+',g,'*',b);
end;
if a mod b = 0 then 
if T mod b<>0 then 
writeln('Вырожденный случай решений нет ');
 
if b mod a = 0 then begin
if T mod a=0
then begin
g:=T/a;
writeln('Вырожденный случай ');
writeln(b,' делится на ', a);
writeln(T,'=',g,'*',a,'*+',0,'*',b);
end;
if b mod a= 0 then 
if T mod a<>0 then 
writeln('Вырожденный случай решений нет ');
end;
if a mod b<>0 then 
if b mod a<>0 
then begin
Eq(a,b,d,x,y);
writeln('Расширенный алгоритм Евклида(d(НОД(a,b))=x*a+y*b):');
writeln('d=',d,' x=',x,' y=',y);
 
if d=1 then begin 
Writeln(d,'=',a,'*',x,'+',b,'*',y);
writeln(T,'=',a,'*',x*T,'*+',b,'*',y*T);
end;
if d<>1 then begin 
Writeln(d,'=',a,'*',x,'+',b,'*',y);
Writeln(1,'=',a/d,'*',x,'+',b/d,'*',y);
writeln(T,'=',a/d,'*',x*T,'*+',b/d,'*',y*T);
end;
end;
end.

Буду благодарна любым подсказкам,хочется сделать из всего этого нормально работающую программу для всех случаев.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.03.2015, 11:23
Ответы с готовыми решениями:

Диофантово уравнение
Задано Диофантово уравнение вида x2+y2 +z2 = 3*x*y*z. Вывести возможные решения до 10.

Алгоритм Евклида с расширенным условием
Всем Привет! Решаю задачу (код ниже) нахождения наибольшего общего делителя двух чисел используя алгоритм Евклида. Но он у меня не...

Обратный элемент в кольце вычетов. Найти s расширенным алгоритмом Евклида
Дано: xs = y mod N где x,y,N некоторые числа, которые известны. Необходимо найти s расширенным алгоритмом Евклида. Сам метод для...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8657 / 4491 / 1670
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
01.03.2015, 12:54
Цитата Сообщение от yulya2311 Посмотреть сообщение
Есть еще один вариант,но как оказалось,он тоже не для всего,ввожу 6,12,3 получаю нет решений.
А какое решение в целых числах есть для 6х+12у=3? Просто в левой части уравнения всегда будут чётные числа...
Пока не вникая в ваш код, отправлю по ссылке на хорошие пояснительные материалы на e-maxx.ru и в Wikipedia.
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 4
01.03.2015, 13:05  [ТС]
Павел,Вы правы,не подумала.но вне зависимости от этого последний вариант программы не принимается преподавателем,аргументируется тем что плохой код.возможно мой код как то неграмотен на взгляд программиста?просто я чуть ли не "на пальцах" рассматриваю все вырожденные случаи,может это неверно?Все ресурсы(и те что Вы указали в частности) мной уже давно изучены,так как маюсь с программой не первую неделю.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8657 / 4491 / 1670
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
01.03.2015, 14:34
Лучший ответ Сообщение было отмечено yulya2311 как решение

Решение

Ладно. Пусть для рассмотрения будем пользоваться 2-программой - я вижу в ней теги "расширенный алгоритм Евклида" (обозначу его далее по тексту, как РАЕ).
Немного позанудствую - для улучшения восприятия советую воспользоваться форматтером кода "Jedi Code Formatter". В сети можно поискать. И на сегодняшний день yandex в поиске выдаёт на 1-й странице пару мест, где я пояснял как его установить и пользоваться.
Итак, твоя 2-я программа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  Read(a, b);
  writeln('vvedite T');
  Read(T);
  if a mod b = 0 then
    if T mod b = 0 then
    begin
      g := T / b;
      writeln('Вырожденный случай ');
      writeln(a, ' делится на ', b);
      writeln(T, '=', 0, '*', a, '*+', g, '*', b);
    end;
  if a mod b = 0 then
    if T mod b <> 0 then
      writeln('Вырожденный случай решений нет ');
Это всё до применения РАЕ. Но читаем e-maxx. На начальном этапе там всё гораздо проще:
1. a=0, b=0, T=0 - бесконечное множество решений с произвольными x и y
2. a=0, b=0, T<>0 - нет ни одного решения
Т.е. нет ни одного деления по модулю.

Кроме того, в глаза бросается переменная g типа real - диофантовы уравнения исключительно целочисленны и в них нет места "плавучке". Я полагаю, что нужно было организовать целочисленное деление, и незнание синтаксиса Pascal сыграло злую шутку. Целочисленное деление - div. Т.е. "g:=T div b;".

Это для начала. Пересмотри ещё раз весь код.

Добавлено через 1 час 5 минут
Чтобы не ждать долго, выложу тот код, что сейчас набросал по пояснениям в e-maxx.
Ограничения:
1. Коэффициенты a и b - только неотрицательные. Для отрицательных нужно сделать ещё некоторые телодвижения, описанные в e-maxx.
2. Не хотелось терять время на понимание принципа расширенного алгоритма Евклида, поэтому портировал с исходника на C, взятого с того же e-maxx. Надеюсь, что правильно.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{решение диофантового a*x+b*y=c уравнения в общем виде}
program Pas_078;
 
  {Extended Euclidean algorithm}
  {
   на входе:
   a, b
   на выходе:
   НОД(a, b) = GCD(a, b)
   x, y - числа, такие, что a*x+b*y=GCD(a, b)
  }
  function ExtendedEuclideanAlgorithm(a, b: integer; var x, y: integer): integer;
  var
    x1, y1, d: integer;
  begin
    if (a = 0) then
    begin
      x := 0;
      y := 1;
      ExtendedEuclideanAlgorithm := b;
      Exit;
    end;
    d := ExtendedEuclideanAlgorithm(b mod a, a, x1, y1);
    x := y1 - (b div a) * x1;
    y := x1;
    ExtendedEuclideanAlgorithm := d;
  end;
 
 
var
  a, b, c: integer;
  Xg, Yg, g: integer;
  X0, Y0:  integer;
begin
  a := 10;
  b := 11;
  c := 99;
  {рассмотрим некоторые вырожденные случаи, доступные на данном этапе}
  {
   1. a=0, b=0, c=0 - бесконечное множество решений с произвольными x и y
   2. a=0, b=0, c<>0 - нет ни одного решения
   }
  if (a = 0) and (b = 0) then
  begin
    if (c = 0) then
      writeln('Бесконечное множество решений с любыми значениями x и y.')
    else
      writeln('Нет ни одного решения.');
    Exit;
  end;
  {нахождение НОД(a,b) и дополнительных переменных}
  g := ExtendedEuclideanAlgorithm(a, b, Xg, Yg);
  {на основе новых данных рассмотрим ещё один вырожденный случай
  3. c не делится на GCD(a, b) - нет ни одного решения
  }
  if (c mod g) <> 0 then
  begin
    writeln('Нет ни одного решения.');
    Exit;
  end;
  {нахождение одного решения}
  X0 := Xg * (c div g);
  Y0 := Yg * (c div g);
  {нахождение решения в общем виде}
  writeln('Решение диофантова уравнения ', a, 'x+', b, 'y=', c, ' в общем виде:');
  writeln('x=', X0, '+', (b div g), 'k');
  writeln('y=', Y0, '+', (a div g), 'k');
end.
Основные отличия:
1. Не используются вычисления с плавающей точкой. Нигде.
2. Иначе (и проще), но согласно пояснительным материалам, организовано рассмотрение вырожденных случаев.
1
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 4
01.03.2015, 14:51  [ТС]
Павел,Спасибо,сейчас буду разбираться в своих косяках.
У меня есть похожая задачка,попробую в ней применить Ваши идеи вечером,и выложу что получилось.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8657 / 4491 / 1670
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
01.03.2015, 15:01
Идеи не мои. Этим уравнениям несколько тысяч лет и примерно столько же - их аналитическим решениям.

Здесь есть хорошее правило: если алгоритм по описанию применим, то вне зависимости от понимания и восприятия (он может выглядеть как заклинание), его нужно воспроизводить точно и дословно. Ровно по тем же самым причинам - чтобы не поднять мертвецов с близжайшего кладбища или не пополнить их количество внезапно большими поступлениями.

Но пытаться понять, как работает алгоритм, всё равно нужно и полезно для саморазвития.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2015, 15:01
Помогаю со студенческими работами здесь

Диофантово уравнение
Недавно начал изучать Python. Первый язык программирования (не считая Pascal). Встретилась задача: Даны натуральные числа a, b, c. Если...

Диофантово уравнение
Подскажите функцию решения диофантова уравнения вида ax+by=c по известным a,b,c. заранее спасибо

Диофантово уравнение
Дано диофантово уравнение ax + by = 19990 с натуральными коэффициентами a и b. Найдите эти коэффициенты, если известно, что это уравнение...

Диофантово уравнение — 2
Диофантово уравнение — 2 Даны числа a,b,c,d,e. Подсчитайте количество таких целых чисел от 0 до 1000, которые являются корнями уравнения...

Диофантово уравнение
Существует ли решение в общем виде уравнения Ax + By = C в целых числах? (коэффициенты неизвестны, поэтому ничего &quot;угадать&quot;...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru