Эта глава продолжает тему, затронутую в главе 32. «Поиск простых чисел с помощью регулярных выражений» — применение регулярных выражений в задачах, связанных с целочисленной делимостью.
Речь пойдёт о линейных диофантовых уравнениях.
Диофантово уравнение — это уравнение (как правило, с несколькими неизвестными), решение которого ищется в целых (иногда в натуральных) числах. Классическим диофантовым уравнением является уравнение Ферма: Неизвестными в нём являются четыре натуральных переменных , , , .
Недавно доказанная теорема Ферма утверждает, что при уравнение Ферма неразрешимо в натуральных числах. Доказать эту теорему было очень, очень непросто. Кроме того, хорошо известно, что при уравнение разрешимо, и ещё как! Бесконечно много троек натуральных чисел обращают уравнение в верное равенство. Две наиболее известных из них — это пифагоровы тройки (катеты и гипотенуза египетского прямоугольного треугольника) и .
Нас же сейчас интересуют линейные диофантовы уравнения, то есть такие, в которых все переменные входят линейным образом: Неизвестными здесь служат буквы , , а целые числа и заданы свыше.
Читатели, интересующиеся математической стороной вопроса, могут ознакомиться с двумя методами решения линейных диофантовых уравнений с двумя неизвестными по винтажной шпаргалке [24] 1924 года издания (рисунок 33.1); там такие уравнения называются неопределёнными. Качество печати оставляет желать лучшего. Формулу (1) на странице 31 следует читать как .
Особенностью обсуждаемого в этой главе алгоритма является то, что он может находить лишь одно из решений уравнений такого типа, причём каждое из чисел , должно быть неотрицательным целым. Кроме того, все найденные могут быть целыми неотрицательными.
Такого рода задачи возникают, например, в связи с разменом денег. Например: как разменять рублей монетами достоинством в и рублей (допустим, что такие монеты бывают). Такая задача приводит к уравнению . Его единственное решение в натуральных числах — это , . Очевидно, другие подобные задачи о размене могут иметь более одного решения.
Напишем программу diophantus.pl, получающую в командной строке числа и , и выводящую целое неотрицательное решение линейного диофантова уравнения, если оно есть. Если такого решения нет, выводится сообщение об этом:
%
./diophantus.pl 5 11 37
3 2
%
./diophantus.pl 19 6 11 3 2 51
2 1 0 1 2
%
./diophantus.pl 6 11 37
./diophantus.pl: Не могу решить уравнение!