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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день,уважаемые форумчане.Пытаюсь написать код для следующей задачки,но почему то преподаватель никак ее не принимает.В программировании новичок,не судите строго и помогите чем сможете,буду благодарна.
Задача такая: вводим переменные 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 расширенным...

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

5
Модератор
Эксперт по электронике
8553 / 4403 / 1653
Регистрация: 01.02.2015
Сообщений: 13,675
Записей в блоге: 9
01.03.2015, 12:54 2
Цитата Сообщение от yulya2311 Посмотреть сообщение
Есть еще один вариант,но как оказалось,он тоже не для всего,ввожу 6,12,3 получаю нет решений.
А какое решение в целых числах есть для 6х+12у=3? Просто в левой части уравнения всегда будут чётные числа...
Пока не вникая в ваш код, отправлю по ссылке на хорошие пояснительные материалы на e-maxx.ru и в Wikipedia.
0
0 / 0 / 0
Регистрация: 21.12.2014
Сообщений: 4
01.03.2015, 13:05  [ТС] 3
Павел,Вы правы,не подумала.но вне зависимости от этого последний вариант программы не принимается преподавателем,аргументируется тем что плохой код.возможно мой код как то неграмотен на взгляд программиста?просто я чуть ли не "на пальцах" рассматриваю все вырожденные случаи,может это неверно?Все ресурсы(и те что Вы указали в частности) мной уже давно изучены,так как маюсь с программой не первую неделю.
0
Модератор
Эксперт по электронике
8553 / 4403 / 1653
Регистрация: 01.02.2015
Сообщений: 13,675
Записей в блоге: 9
01.03.2015, 14:34 4
Лучший ответ Сообщение было отмечено 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  [ТС] 5
Павел,Спасибо,сейчас буду разбираться в своих косяках.
У меня есть похожая задачка,попробую в ней применить Ваши идеи вечером,и выложу что получилось.
0
Модератор
Эксперт по электронике
8553 / 4403 / 1653
Регистрация: 01.02.2015
Сообщений: 13,675
Записей в блоге: 9
01.03.2015, 15:01 6
Идеи не мои. Этим уравнениям несколько тысяч лет и примерно столько же - их аналитическим решениям.

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

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

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

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

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

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

Диофантово уравнение
Дано уравнение: 14x-15y=a 1)при каких значениях a уравнение имеет решение в целых числах? ...

Линейное Диофантово уравнение
Даны натуральные числа a, b, c. Если уравнение ax+by=c имеет решения в целых числах, то выберите то...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru