Об одном диофантовом уравнении
Порядок решения классического диофантового уравнения. Применение расширенного алгоритма Евклида. Пример программы нахождения целочисленных результатов с помощью компьютерных технологий на языке программирования Pascal. Биективное отображение данных.
Рубрика | Математика |
Вид | практическая работа |
Язык | русский |
Дата добавления | 11.12.2014 |
Размер файла | 63,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Об одном диофантовом уравнении
Морозов В.В. - учитель математики
и информатики, г. Полысаево
В этой работе мы будем рассматривать решение диофантова уравнения вида:
,
где - целые числа, и решение отыскивается также среди целых чисел.
Если , то уравнение принимает вид:
.
Решение этого классического уравнения подробно описано в литературе, программа его решения на компьютере опубликована http://morozko1967.boom.ru/soft.htm.
Пусть . Тогда уравнение:
(1)
можно записать в виде
(2).
Зададим себе вопрос: может ли быть равным нулю? Да, если c делится на a и . Тогда решение существует, если , иными словами, . Итак, мы получили такой вывод: если и c делится на а, то существует решение: , y - любое целое число. Точно также, если b делится на а, то существует решение x - любое число, . Если , но ни с, ни b не делятся на а, то решений нет.
Пусть теперь . Тогда нет целого х, обращающего в 0 выражение . В этом случае уравнение можно записать в виде:
(3)
Докажем, что уравнение (3) имеет конечное число целочисленных решений. Рассмотрим функцию:
.
Естественно, эта функция является биекцией. Графиком функции является гипербола.
.
Значит, при достаточно больших значениях переменной х значение переменной y близко к . Между какими целыми числами заключено это число? . Начиная с некоторого значения переменной х переменная y, стремясь к , остаётся дробной. Точно также, если отрицательное х велико по модулю, то переменная y, стремясь к , остаётся дробной. Следовательно, уравнение (3) имеет конечное число целочисленных решений, и их можно поручить отыскать компьютеру простым перебором.
Но для этого необходимо найти отрезок на оси абсцисс, вне которого гарантированно нет целочисленных решений уравнения (3).
Если b не делится на а, то, очевидно, что границы целочисленных х равны и .
Если b делится на а, то границы целочисленных х равны и .
Рассмотрим эти два случая отдельно.
Случай 1. Пусть сначала b не делится на а. Найдём . Обозначим . Числа
и удовлетворяют уравнению (1). Поэтому:
(4)
Далее нам потребуется.
Лемма. Пусть a, b - целые, отличные от нуля. Тогда . Если b не делится на а, то .
Доказательство. диофантовое уравнение программа компьютерная
Сначала докажем, что для любого нецелого х:
. (5)
Действительно, по определению целой и дробной частей:
, ;
,
.
.
Допустим противное, пусть . Возможны два случая: b делится на а, и b не делится на а. Если b не делится на а, то из (5) получаем:
,
,
,
то есть b делится на а, что невозможно.
Если же b делится на а, то:
,
по условию а отлично от нуля. Полученное противоречие доказывает, что .
Докажем теперь второе неравенство леммы. Пусть b не делится на а. Допустим противное, . Тогда:
,
используя (5), получаем:
,
.
Но дробная часть любого числа всегда меньше 1. Полученное противоречие доказывает, что если b не делится на а, то .
Лемма доказана.
Доказанная лемма позволяет из соотношения (4) найти:
,
и в случае, если b не делится на а:
.
Обозначим:
,
.
Тогда все целочисленные решения уравнения (3) удовлетворяют оценке , и уравнение (3) можно решить простым перебором, беря по очереди целые значения х от А до D, вычисляя соответствующие:
,
и проверяя, является ли найденное значение у целым. Если делится на , то существует решение .
Случай 2. Пусть b делится на а. Тогда границы целочисленных х равны и .
Найдём сначала . Обозначим:
.
Тогда F удовлетворяет соотношению
.
Учитывая, что в этом случае b делится на а, получаем:
,
. (6)
Теперь найдём . Обозначим . Тогда G удовлетворяет соотношению:
.
Учитывая, что в этом случае b делится на а, получаем:
,
. (7)
Обозначим
,
.
Тогда все целочисленные решения уравнения (3) удовлетворяют оценке
,
и уравнение (3) можно решить простым перебором, беря по очереди целые значения х от А до D, вычисляя соответствующие
,
и проверяя, является ли найденное значение у целым. Если делится на , то существует решение .
Итак, оба случая рассмотрены, осталось написать программу для персонального компьютера.
Приложение
Программа решения диофантова уравнения на языке программирования Pascal.
program superdiofant;
{Программа решения диофантова уравнения вида
axy+bx+cy=d
(c) Морозов Владимир Владимирович
url: http://moroko1967.boom.ru/
mailto: morozko1967@mail.ru
ICQ 259920363}
uses crt;
var a,b,c,d,x,y,D0,A0,s,k:integer;
yy,DD,AA,ww,sgn:real;
l,ll:boolean;
hh,ha,hb,hc,hd:string;
f:Text; {Файл для вывода ответа}
{Далее идут процедуры для решения частного случая
a=0. Тогда уравнение принимает вид bx+cy=d }
procedure nod(a0,a1:longint; var x,y,nd:longint);
{Процедура находит nd=НОД(a0,a1) с помощью расширенного алгоритма Евклида, причём ищет x и y, такие, что x*a0+y*a1=nd}
var a2,q,x0,x1,x2,y0,y1,y2:integer;
begin
x0:=1; y0:=0; x1:=0; y1:=1;
while (a1 mod a0)<>0 do
begin
q:=a0 div a1;
a2:=a0-q*a1;
x2:=x0-q*x1;
y2:=y0-q*y1; {i++}
a0:=a1;
a1:=a2;
x0:=x1;
x1:=x2;
y0:=y1;
y1:=y2;
end;
nd:=a0;
x:=x0;y:=y0
end;
procedure diofant(a,b,c:longint);
{Процедура решения Дифантова уравнения ax+by=c.
На вход процедура получает коэффициенты a, b, c, а на выходе процедура печатает решение на экран и в файл}
var
x,y,ndd,nd:longint;
h,hx,hy,ha,hb,hc:string;
a1,b1,c1:longint;
tx,ty,ta:string;
begin
tx:='';
ty:='';
ta:=''; {Строки для красивого вывода ответа}
if (a<>0) and (b<>0)
then
begin
nod(a,b,x,y,nd); {Нашли Наибольший общий делитель}
if (c mod nd)<>0
then
ta:='Уравнение не имеет решений в кольце Z'
else
begin
a1:=a div nd;
b1:=b div nd;
c1:=c div nd;
nod(a1,b1,x,y,ndd);
x:=x*c1; y:=y*c1;
{Решение найдено! Формулируем ответ}
str(x,hx);str(y,hy);
str(a,ha);str(b,hb);str(c,hc);
if hx='0'
then
tx:='X='
else
tx:='X='+hx;
if hy='0'
then
ty:='Y='
else
ty:='Y='+hy;
if y<0
then hy:='('+hy+')';
if a<0
then ha:='('+ha+')';
if b<0
then hb:='('+hb+')';
if c<0
then hc:='('+hc+')';
h:=hx+'*'+ha+'+'+hy+'*'+hb+'='+hc;
ta:=h;
a1:=-a1; str(a1,ha);
if a1>0
then ha:='+'+ha;
if a1=1
then ha:='';
if a1=-1
then ha:='-';
str(b1,hb);
if b1>0
then hb:='+'+hb;
if b1=1
then hb:='';
if b1=-1
then hb:='-';
if ha='0'
then
tx:=tx+', где t - целое'
else
ty:=ty+ha+'t, где t - целое';
if hb<>'0'
then
tx:=tx+hb+'t'
end
end
else
begin
if (a=0) and (b<>0)
then
begin
if (c mod b)=0
then
begin
tx:='X - любое целое';
c1:=c div b;
str(c1,hy);
ty:='Y='+hy;
if c1>0
then hy:='+'+hy;
str(b,hb);
if b<0
then hb:='('+hb+')';
ta:='Любое*0'+hy+'*'+hb+'='+hc
end
else
ta:='Уравнение не имеет решений в кольце Z'
end;
if (a<>0) and (b=0)
then
begin
if (c mod a)=0
then
begin
ty:='Y - любое целое';
c1:=c div a;
str(c1,hx);
tx:='X='+hx;
str(a,ha);
if a<0
then ha:='('+ha+')';
ta:=hx+'*'+ha+'Любое*0='+hc
end
else
ta:='Уравнение не имеет решений в кольце Z'
end;
if (a=0) and (b=0)
then
begin
if c=0
then
begin
ta:='Любое*0+Любое*0=0';
tx:='X - Любое целое';
ty:='Y - Любое целое'
end
else
ta:='Уравнение не имеет решений в кольце Z'
end
end;
TextColor(14);
{Ответ сформирован в строках. Печатаем ответ}
Writeln('Решение: ');
writeln(tx);
writeln(ty);
writeln(ta);
Writeln(f,'Решение: ');
writeln(f,tx);
writeln(f,ty);
writeln(f,ta)
end;
begin
TextColor(14);
TextBackGround(1);
ClrScr;
Assign(f,'c:/answer.txt'); {Файл для ответа}
rewrite(f);
writeln('Программа решения диофантова уравнения вида axy+bx+cy=d');
writeln('введите целые коэффициенты a,b,c,d');
read(a,b,c,d);
if a<>0
then
begin
l:=true; {Флаг существования решения}
k:=0; {Счётик количества решений}
{Определяем границы целочисленных значений х}
if (b mod a)<>0
then
begin
if b/a<0
then
ww:=-b div a
else
ww:=(-b div a)-1;
AA:=(d-c*(ww+1))/(b+a*(ww+1));
DD:=(d-c*ww)/(b+a*ww)
end
else
begin
AA:=(d*a-a*c+c*b)/a/a;
DD:=-(d*a+a*c+c*b)/a/a
end;
if AA<DD
then
begin
A0:=trunc(AA);
d0:=trunc(DD)+1
end
else
begin
a0:=trunc(DD);
D0:=trunc(AA)+1
end;
str(a,ha); str(b,hb); str(c,hc); str(d,hd);
if a<0 then ha:='('+ha+')';
if b<0 then hb:='('+hb+')';
if c<0 then hc:='('+hc+')';
hh:=ha+'xy+'+hb+'x+'+hc+'y='+hd;
Writeln('Поиск решения уравнения '+hh);
Writeln(f,'Поиск решения уравнения '+hh);
readln;
{Перебор}
for x:=a0 to d0 do
if a*x+c<>0
then
begin
yy:=(d-b*x)/(a*x+c);
{определяем знак уу}
if yy>=0
then sgn:=1
else sgn:=-1;
{Проверяем является ли уу целым}
if yy=int(yy+sgn*0.0000001)
then
begin
y:=trunc(yy+sgn*0.0001);
writeln('(',x,';',y,')');
writeln(f,'(',x,';',y,')');
L:=false;
inc(k);
writeln('Проверка...');
s:=a*x*y+b*x+c*y;
if s=d
then
begin
writeln('Решение выдерживает проверку:)');
writeln(f,'Решение выдерживает проверку:)')
end
else
begin
writeln('Решение не выдерживает проверку:(');
writeln(f,'Решение не выдерживает проверку:(');
end;
writeln;
writeln(f)
end
end;
ll:=false;
{Обрабатывается вырожденный случай
Этот случай может добавить некоторые решения}
if b*c+a*d=0
then
begin
if (c mod a)=0
then
begin
x:= -c div a;
writeln('(',x,';любое целое число)');
writeln(f,'(',x,';любое целое число)');
ll:=true;{Поднимаем флаг, что решений бесконечно много}
l:=false
end;
if (b mod a)=0
then
begin
y:= -b div a;
writeln('(Любое целое число;',y,')');
writeln(f,'(Любое целое число;',y,')');
ll:=true;{Поднимаем флаг, что решений бесконечно много}
l:=false
end;
end;
if l
then
begin
writeln('решений нет');
writeln(f,'решений нет')
end
else
if ll
then
begin
writeln('Количество найденных решений - бесконечно много');
writeln(f,'Количество найденных решений - бесконечно много');
end
else
begin
writeln('Количество найденных решений ',k);
writeln(f,'Количество найденных решений ',k)
end
end
else
begin
{Решаем диофантово уравнение bx+cy=d}
diofant(b,c,d)
end;
close(f);
repeat until keypressed
end.
Размещено на Allbest.ru
...Подобные документы
Методы решения одного нелинейного уравнения: половинного деления, простой итерации, Ньютона, секущих. Код программы решения перечисленных методов на языке программирования Microsoft Visual C++ 6.0. Применение методов к конкретной задаче и анализ решений.
реферат [28,4 K], добавлен 24.11.2009История арифметики остатков. Понятие остатка, наибольшего общего делителя, расширенного алгоритма Евклида и применение его для решения линейных диофантовых уравнений. Алгебраический подход к делимости в кольцах и разложение чисел в цепные дроби.
дипломная работа [466,7 K], добавлен 23.08.2009Численное решение уравнения методом Эйлера и Рунге-Кутта в Excel. Программа на языке Turbo Pascal. Блок-схема алгоритма. Метод Рунге-Кутта для дифференциального уравнения второго порядка. Модель типа "хищник-жертва" с учетом внутривидового взаимодействия.
курсовая работа [391,5 K], добавлен 01.03.2012Особенности решения задач Диофантовой "Арифметики", которые решаются с помощью алгебраических уравнений или системы алгебраических уравнений с целыми коэффициентами. Характеристика великой теоремы Ферма, анализ и методы приминения алгоритма Евклида.
реферат [36,8 K], добавлен 03.03.2010Уравнения с разделяющимися переменными, методы решения. Практический пример нахождения частного и общего решения. Понятие о неполных дифференциальных уравнениях. Линейные уравнения первого порядка. Метод вариации постоянной, разделения переменных.
презентация [185,0 K], добавлен 17.09.2013Методы построения общего решения уравнения Бернулли. Примеры решения задач с помощью него. Особое решение уравнения Бернулли и его особенности. Понятие дифференциального уравнения, его виды и свойства. Значение уравнения Бернулли в математике и физике.
курсовая работа [183,1 K], добавлен 25.11.2011Применение функции Лагранжа в выпуклом и линейном программировании. Простейшая задача Больца и классического вариационного исчисления. Использование уравнения Эйлера-Лагранжа для решения изопериметрической задачи. Краевые условия для нахождения констант.
курсовая работа [1,2 M], добавлен 16.01.2013Вычисление корня функции нелинейного уравнения методом деления отрезка пополам. Способы ввода, вывода и организации данных. Модульная организация программы. Разработка блок-схемы алгоритма задачи. Порядок создания программы на алгоритмическом языке.
реферат [30,0 K], добавлен 28.10.2010Расширенный алгоритм Евклида, его использование для нахождения наибольшего общего делителя натуральных чисел посредством остатков от деления. Математическая проблема календаря. Евклидовы кольца - аналоги чисел Фибоначчи в кольце многочленов, их свойства.
реферат [571,1 K], добавлен 25.09.2009Методика нахождения уравнения прямой исследуемого треугольника и параллельной ей стороне с использованием углового коэффициента. Определение уравнения высоты этого треугольника. Порядок и составление алгоритма вычисления площади данного треугольника.
задача [21,9 K], добавлен 08.11.2010Оригинальный метод доказательства теоремы Ферма. Использование бинома Ньютона для решения диофантового уравнения. Решение теоремы Ферма при нечетных показателях степени n, при целых положительных и натуральных числах. Преобразование уравнения Ферма.
статья [16,4 K], добавлен 17.10.2009Методы решения систем линейных алгебраических уравнений (СЛАУ): Гаусса и Холецкого, их применение к конкретной задаче. Код программы решения перечисленных методов на языке программирования Borland C++ Builder 6. Понятие точного метода решения СЛАУ.
реферат [58,5 K], добавлен 24.11.2009Методы нахождения минимума функций градиентным методом наискорейшего спуска. Моделирование метода и нахождение минимума функции двух переменных с помощью ЭВМ. Алгоритм программы, отражение в ней этапов метода на языке программирования Borland Delphi 7.
лабораторная работа [533,9 K], добавлен 26.04.2014Общий вид линейного однородного уравнения. Нахождение производных, вещественные и равные корни характеристического уравнения. Пример решения дифференциального уравнения с постоянными коэффициентами. Общее и частное решение неоднородного уравнения.
презентация [206,3 K], добавлен 17.09.2013Представление великой теоремы Ферма как диофантового уравнения. Использование для ее доказательства метода замены переменных. Невозможность решения теоремы в целых положительных числах. Необходимые условия и значения чисел для решения, анализ уравнений.
статья [35,2 K], добавлен 21.05.2009Порядок решения дифференциального уравнения 1-го порядка. Поиск частного решения дифференциального уравнения, удовлетворяющего указанным начальным условиям. Особенности применения метода Эйлера. Составление характеристического уравнения матрицы системы.
контрольная работа [332,6 K], добавлен 14.12.2012Применение метода дискретной регуляризации Тихонова А.Н. для нахождения решения обратной задачи для однородного бигармонического уравнения в круге. Сведение дифференциальной задачи к интегральному уравнению; корректно и некорректно поставленные задачи.
курсовая работа [280,2 K], добавлен 20.10.2011Анализ особенностей разработки вычислительной программы. Общая характеристика метода простых итераций. Знакомство с основными способами решения нелинейного алгебраического уравнения. Рассмотрение этапов решения уравнения методом половинного деления.
лабораторная работа [463,7 K], добавлен 28.06.2013Метод аналитического решения (в радикалах) алгебраического уравнения n-ой степени с возвратом к корням исходного уравнения. Собственные значения для нахождения функций от матриц. Устойчивость решений линейных дифференциальных и разностных уравнений.
научная работа [47,7 K], добавлен 05.05.2010Задача целочисленного линейного программирования, приведение к канонической форме. Общие идеи методов отсечения. Алгоритм Гомори для решения целочисленных задач линейного программирования. Понятие правильного отсечения и простейший способ его построения.
курсовая работа [67,5 K], добавлен 25.11.2011