Научная статья на тему 'Решение общего линейного диофантова уравнения. Построение и исследование модели в MS eхсel'

Решение общего линейного диофантова уравнения. Построение и исследование модели в MS eхсel Текст научной статьи по специальности «Математика»

CC BY
528
44
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ДИОФАНТОВО УРАВНЕНИЕ / ИССЛЕДОВАНИЕ / MS EХСEL

Аннотация научной статьи по математике, автор научной работы — Паньгин Александр Викторович

В статье описан алгоритм решения уравнения вида a1x1 + a2x2 +... + anxn = c, реализация алгоритма на языке Pascal, построение и исследование модели с помощью Excel.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Решение общего линейного диофантова уравнения. Построение и исследование модели в MS eхсel»

Паньгин Александр Викторович

РЕШЕНИЕ

ОБЩЕГО ЛИНЕЙНОГО ДИОФАНТОВА УРАВНЕНИЯ. ПОСТРОЕНИЕ И ИССЛЕДОВАНИЕ МОДЕЛИ

В MS EXCEL

Предположим, что ар а2, а , с - обозначают целые числа, а НОД(а1, ..., ап) -наибольший общий делитель чисел а., где 1 < . < п и не все числа а. равны нулю.

Уравнение вида а^ + а 2X2 + ... + апхп = с, разрешимое в целых числах, называется линейным диофантовым уравнением.

С помощью алгоритма Евклида можно доказать, что диофантово уравнение

а1х1 + а2х2 + ... + апхп = НОД(а1, а2, ..., ап) всегда разрешимо, следовательно, справедливо следующее утверждение.

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

Существует несколько типов задач, которые сводятся к решению диофантовых уравнений. К таковым, например, относятся:

- задачи по размену суммы денег купюрами определенного достоинства;

- задачи на переливание.

Рассмотрим алгоритм нахождения решения на частном примере уравнения

18х + 42у +10.7 = 14 а1 = 18; а2 = 42; а3 = 10; с = 14.

Легко угадывается решение: (х = 0; у = 2; 7 = -7).

Очевидно, что если любому целому числу, представимому левой частью уравнения, сопоставить конкретный набор (х, у, . ), то действия с такими числами (сложение, вычитание, умножение на любое целое число) эквивалентны аналогичным действиям с соответствующими наборами (поэлементно). В частности, для коэффициентов уравнения числу 18 можно сопоставить набор (1, 0, 0), так как 18 • 1 + 42 • 0 + 10 • 0 = 18, для чис-

ла 42 - набор (0, 1, 0), а для числа 10 -набор (0,0,1).

Найдем число 2 = НОД(18, 42, 10) и целочисленное решение уравнения 18х + 42у +10.7 = 2.

Используем свойства:

НОД(ар а2, а3) = НОД(НОД(ар а2), а3)) для последовательного определения НОД чисел;

НОД(а, Ь) = НОД(Ь, г), где г - остаток целочисленного деления а на Ь, причем 0 < г < 1Ь1.

Представим обобщенный алгоритм Евклида для решения диофантова уравнения в табличном виде (рисунок 1).

Знак «Т» определяет выражение, как в ячейке выше, и для наглядности используется в пассивных столбцах, не участвующих в текущих вычислениях. В каждой строке подчеркивается текущий найденный набор.

Ненулевое значение в первом столбце определяет НОД(18, 42, 10) = 2. Соответствующий набор (х = -4, у = 2, г = -1) определяет частное решение уравнения 18х + 42у + 10г = НОД(18, 42, 10). Правая часть исходного уравнения делится на НОД

ai набор a2 набор a3 набор примечание

18 (1, 0, 0) 42 (0, 1, 0) 10 (0, 0, 1) НОД^, b) = НОД(Ь, r) r = a - b • q; 0 = r < Ibl

6 (-2. 1, 0) 18 (1, 0, 0) т т 6 = 42 - 18 -2 (-2, 1, 0) = (0, 1, 0) - (1, 0, 0) -2

6 (-2, 1, 0) 0 (7, -3, 0) т т 0 = 18 - 6 -3 (7, -3, 0) = (1, 0, 0) - (-2, 1, 0) -3

4 (2, -1, 1) т т 6 (-2, 1, 0) 4 = 10 - 6 1 (2, -1, 1) = (0, 0, 1) - (-2, 1, 0)

2 (-4, 2, -1) т т 4 (2, -1, 1) 2 = 6 - 4 -1 (-4, 2, -1) = (-2, 1, 0) - (2, -1, 1)

2 (-4, 2, -1) т т 0 (10, -5, 3) 0 = 4 - 2 - 2 (10, -5, 3) = (2, -1, 1) - (-4, 2, -1) -2

2 (-4, 2, -1) 0 (7, -3, 0) 0 (10, -5, 3) итоговая строка результатов

Рисунок 1.

коэффициентов, следовательно, частное решение исходного уравнения существует и определяется умножением на целочисленный коэффициент е/й=1, то есть набор (х = -28, у = 14, г = -1) является частным решение исходного уравнения. Наборы при нулевых результирующих коэффициентах определяют независимые решения однородного уравнения 18х + 42у + 10 г = 0. Независимость наборов означает, что нельзя получить соответствующие компоненты одного набора из другого умножением на какое-либо целое число (это следует из сравнения третьих компонент в наборах). Очевидно, что решение однородного уравнения можно умножать на любую целочисленную константу, получая вновь решение. Следовательно, общее решение уравнения можно записать следующим образом.

...¿Лф&Ш fM рЛ^М&Ну UfMMM f&H&t кушорсши мр&релеККо-га уосемиМеи&А...

х = -28 + 1 • гг + 10 • г2 у = 14 - 3 • гг - 5 • г2 г = - 1 + 0 • г1 + 3 • г2 где ¡2 - любые целые числа

При значениях t1 = 4 и ¿2 = 0 решение (х = 0; у = 2; г = -1) совпадает с полученным ранее эмпирически.

АЛГОРИТМ РЕШЕНИЯ ДИОФАНТОВА УРАВНЕНИЯ

Ниже приводится алгоритм решения уравнения

a1x1 + a2x2 + ... + anxn = НОД(ар а2, ..., an). Функция NOD(n, а(), x()) Задать набор Na1 {1,0,...,0}

Цикл i от 2 до n

Задать набор Nai {0,0,...,0,L,0,...,0} Пока a(i) Ф 0 q = a(1)\a(i)

t = a(i); Nt = Nai {набор временный} a(i) = a(1) - q*a(i); Nai = Na1 - q*Nai {покомпонентно}

a(1) = t Na1 = Nt Конец пока {набор Nai содержит решение} {однородного уравнения} Конец цикла i

NOD = a(1) {НОД коэффициентов} x() = Na1

{набор Naj содержит частное решение} {уравнения} конец функции

РЕАЛИЗАЦИЯ АЛГОРИТМА НА ЯЗЫКЕ PASCAL

type

TVector = array[1..100] of Integer; var

n, i, a1, ai, tmp: Integer; a, x1, xi: TVector;

procedure SetUnitVector(var v: TVector;

index: Integer);

begin

FillChar(v, SizeOf(TVector), 0); v[index] := 1; end;

procedure CalculateVector(var v1, v2:

TVector; q: Integer);

var

i, tmp: Integer; begin

for i := 1 to n do begin

tmp := v2[i];

v2[i] := v1[i] - q * v2[i]; v1[i] := tmp; end; end;

begin

Write('Введите количество компонент n: ') ; ReadLn(n);

Write('Введите компоненты Ai через пробел: ');

for i := 1 to n do Read(a[i]);

ReadLn;

SetUnitVector(x1, 1);

a1 := a[1];

for i := 2 to n do

begin

SetUnitVector(xi, i); ai := a[i]; while ai <> 0 do begin

CalculateVector(x1, xi, a1 div ai); tmp := ai; ai := a1 mod ai; a1 := tmp; end; end;

WriteLn('HOfl = ', a1); for i := 1 to n do Write(x1[i], ' '); WriteLn; end.

Реализация алгоритма иа встроенном в MS Office языке Basic дана ниже.

РЕШЕНИЕ ОБЩЕГО ДИОФАНТОВА УРАВНЕНИЯ В EXCEL

Создадим в Excel модель для поиска и анализа решения общего диофантова уравнения.

Общий вид модели представлен на рисунке 2. На листе «Данные» задаются исходные параметры уравнения: число коэффициентов (для примера, не более 10, ячейка C1) и их величины (C3:L3), значение правой части уравнения (C4). Результаты решения: индикатор существования решения в целых числах (C5), НОД коэффициентов уравнения (C6), частное решение неоднородного уравнения - набор чисел xli (1 £ i £ 10, ячейки C11 :С20), наборы решений однородного уравнения - xki (2 £ к £ 10, наборы ячеек D11:D20, E11:E20, ..., L11:L20).

При задании любых целочисленных значений свободных переменных tk (D9:L9), решение уравнения определяется вектором x (B11:B20) по формуле вычисления компонент:

10

xi = x1,i + X Xk,i • tk . k=2

МОДЕЛИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ФОРМУЛ

Используемые формулы ячеек в основном представлены на рисунке 2.

Нахождение значения НОД возможно с помощью одноименной стандартной функции Excel для строки заданных коэффициентов =НОД^3^3) или по формуле =ДBССЫЛ(C1&"!A"&ИНДEKС(C7:L7;C1)) для данного приложения.

Седьмая строка Excel описывает позиции (строки) промежуточных значений НОД для соответствующего листа Excel (после отладки приложения эта позиция может быть скрыта). Пример заполнения листов с наименованиями «2» и «3» для поиска НОД двух чисел с использованием набора (базисного представления) определенной длины показан на рисунках 3 и 4. Копирование формул в последующие строки Excel производится с помощью маркера заполнения.

ется с изменением каких-либо входных данных. Та-

П- - С Г|^|Г|-"ТА1| ' J.ÎT. "il

1 'ЕЛ А F t E É - e - 1 ■i H l T

JlilM < 1 1ИЕГВ rflffiripB-TVWi 1

2 1 Ш а." 1 n э i 0 7 0 9 4

3 VWH-IRfl li 17

-1 71 /1 tjiiTTTtyniimTjtii |

HOI 2 7 ^нтякнтЭДдооифаГиш'ДОа |

IHHJH с 2 /G fl г Z 2 2 J i £

а » r Скбл L'j>1 t ■ | .«71

п Г1ц-| il UIHI4 Î 1 j 0 0 0 0 0 0

10 h >.<i.4. % U N к К h»

11 I ■дг IL '

п t 14 и M [iLrj 1

12 1 1 i Î

lJ i Y 1

к 4 1 ..P- F |

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Ю g

17 Г

■ 0 0

Ю Ù

X л

■I'll Ллн-И. * Л /37"Э J> Л Д> f 1

"HS&

Рисунок 2.

Для удаления ненужной информации (например, для листа «2» при возникновении ситуации «деление на 0») для ячеек, начиная с третьей строки Excel, использовалось условное форматирование белым цветом шрифта (рисунок 5). Аналогично для выделения только нужной информации использовалось форматирование шрифта и фона ячейки для региона ячеек Данные!С11:Ь20 (на рисунке 6 представлено форматирование ячейки С11, для остальных ячеек региона используется формат по образцу).

Даная модель в Excel не требует модулей VBA, уравнение автоматически реша-

кая модель предполагает умелое применение сложных формул с использованием встроенных функций Excel, расширенных возможностей по оформлению данных в ячейках. При работе в группе каждый учащийся может разрабатывать отдельные блоки модели (например, лист 2 или 3 и т.д., с закреплением алгоритма отыскания НОД для двух чисел). При работе с одним документом файл должен быть в общей папке. Для управления доступом к файлу в меню Сервис ® Доступ к книге ® Правка следует поставить галочку «Разрешить изменять файл нескольким пользователям одновременно».

МОДЕЛИРОВАНИЕ С ПОМОЩЬЮ МОДУЛЯ VBA

Можно упростить модель, используя лишь только один лист «Данные» (рисунок

Рисунок 4.

Рисунок 3.

VL "?Г-К1 -4м."■!"Кмча*

О

■.r "Xi ■ ■ ! j — - "ÎF! i™-

. j-^T'--^ | и-.--- | | Фтт»

t —

■_«-1ЙС*! •-»—- ЧН

па F

HI

|l---I Г

ni ■--.

Рисунок 5.

Рисунок 6.

L-^-n :■ jmr.i-?^.

2), без сложных формул в ячейках и промежуточных данных.

Создадим кнопку (с именем Кнопка 1) из панели инструментов Формы с названием «Решение» (ячейка B5), при клике мышью на которой будут выполняться следующие процедуры, описанные ниже и которые заполняют данными решения уравнения регион ячеек C11:L20.

Dim x() As Integer Dim a() As Integer Dim ai() As Integer

Sub Кнопка1_Щелкнуть() n = Range("C1")

ReDim a(n) 'массив коэффициентов

Range("C11:L20").ClearContents For i = 1 To n a(i) = Cells(3, i + 2) Next i

c = Range("C4") d = NOD(n, a, x) Range("C6") = d For i = 1 To n

Cells(i + 10, 3) = x(i) * c / d Next i End Sub

Function NOD(n, a, x) ReDim x(n) x(1) = 1 For i = 2 To n ReDim ai(n) ai(i) = 1

'Задать набор ai={0,..0,1i,0,..,0} While a(i) <> 0 q = a(1) \ a(i) t = a(i)

a(i) = a(1) - q * a(i) a(1) = t

'аналогично для наборов For j = 1 To n t = ai(j)

ai(j) = x(j) - q * ai(j) x(j) = t Next j Wend

For j = 1 To n

Cells(j + 10, 2 + i) = ai(j) Next j Next i NOD = a(1) End Function

ИССЛЕДОВАНИЕ ДИОФАНТОВА УРАВНЕНИЯ С ПОМОЩЬЮ EXCEL

Иногда возникают задачи получить решение диофантова уравнения, обладающее некоторыми свойствами.

Это может быть поиск только положительных решений (например, исходя из физической интерпретации данных). B задачах взвешивания возможны ограничения на количество гирь определенного веса. B задачах переливания может потребоваться получение заданной правой части уравнения (определенного объема жидкости) за минимальное количество ходов переливания (суммы абсолютных величин значений массива решения).

Для примера исследуем задачу переливания, предложенную на Всероссийском конкурсе «КИ0-2006» (Конструируй, Исследуй, Оптимизируй), http://www.ipo.spb.ru/kio/

Задача. Имеются три ведра заданного объема 88, 55 и 34 литра, вмещающая сколько угодно воды бочка и море. Вы можете зачерпывать воду ведрами из моря и выливать ее в бочку, выливать всю воду из ведра или бочки в море, наливать воду из бочки в ведра.

Ваша задача - с помощью ведер получить в бочке необходимый объем 147 литров морской воды. Вашим рекордом считается наименьшее число ходов, за которое будет получен необходимый объем воды в бочке.

Для нахождения общего решения уравнения 88x + 55y + 34z = 147 воспользуемся любой описанной выше моделью Excel. Получим «умопомрачительное» решение: x = -882, y =1323, z =147, где отрицательное значение означает вычерпать из бочки соответствующим ведром указанное (по абсолютной величине) количество раз, а положительное значение означает долить в бочку.

Для оптимизации решения воспользуемся интеллектуальными средствами Excel. Зададим в целевой ячейке C9 формулу подсчета общего числа ходов переливания =ABS(B 11)+ABS(B 12)+ABS(B 13) и путем подбора целочисленных значений свободных переменных ii минимизируем значение

целевой ячейки с помощью команды Excel Поиск решения в меню Сервис. Задание условий поиска показано на рисунке 7.

В результате оптимизации получим решение x = 2, y = -3, z = 4. Exсel «потавил рекорд» переливания за 9 ходов. Ваше решение короче?

Задача для самостоятельного исследования.

Можно ли составить батарею напряжением 220 В, соединяя последовательно элементы двух типов: напряжением 6В и 16В, - и если можно, то сколько надо взять тех и других.

Указание: Требуется получить положительные значения решения (для элементов обоих типов). В данной задаче таких решений будет несколько. Можно указать дополнительный критерий оптимальности (например, по количеству элементов или общей стоимости батареи).

В приложении на CD представлены рассмотренные в данной статье готовые модели.

Рисунок 7.

SW мофе&е j моря и

. ее & боику.

© Наши авторы. 2006 Ourauthors, 2006.

Паньгин Александр Викторович, инженер Центра информационных технологий г. Сосновый Бор.

i Надоели баннеры? Вы всегда можете отключить рекламу.