E012. Модульное линейное уравнение первого порядка

e-maxx algorithm original: C/C++ #algorithm #emaxx #math #number-theory
Task text is translated from Russian for the selected interface language. Code is left unchanged.

Источник: e-maxx.ru/algo, страница PDF 38.

Постановка задачи

Это уравнение вида:

где

— заданные целые числа,

— неизвестное integer.

it is required find искомое значение

, лежащее в отрезке

(поскольку на всей numberвой прямой, ясно,

может существовать бесконечно много решений, которые будут отличаться друг друга на

, где

— любое

integer). Если Solution не единственно, то мы рассмотрим, как получить все решения.

Solution с помощью нахождения Обратного elementа

Рассмотрим сначала более простой случай — когда

и

взаимно просты. Тогда можно find обратный

element к числу

, и, домножив на него обе части уравнения, получить Solution (и оно будет единственным):

Теперь рассмотрим случай, когда

и

не взаимно просты. Тогда, очевидно, Solution будет существовать

не всегда (наExample,

).

Пусть

, т.е. их наибольший общий делитель (который в данном случае больше единицы).

Тогда, если

не делится на

, то решения не существует. В самом деле, при любом

левая часть уравнения, т. е.

, всегда делится на

, в то время как правая часть на него не делится, откуда и следует, что решений нет.

Если же

делится на

, то, разделив обе части уравнения на это

(т.е. разделив

,

и

на

), мы придём к

новому уравнению:

в котором

и

уже будут взаимно просты, а такое уравнение мы уже научились решать. Обозначим его Solution

через

.

Понятно, что это

будет также являться и Solutionм исходного уравнения. Однако если

, то оно будет

не единственным Solutionм. Можно показать, что исходное уравнение будет иметь ровно

решений, и они

будут иметь вид:

Подводя итог, можно сказать, что количество решений линейного модульного уравнения равно

либо

, либо нулю.

Solution с помощью Расширенного Algorithmа Евклида

Приведём наше модулярное уравнение к диофантову уравнению следующим образом:

где

и

— неизвестные целые числа. Способ решения этого уравнения описан в соответствующей статье Линейные диофантовы уравнения второго порядка, и заключается он в применении Расширенного Algorithmа Евклида. Там же описан и способ получения всех решений этого уравнения по одному найденному решению, и, кстати говоря, этот способ при внимательном рассмотрении абсолютно эквивалентен способу, описанному в предыдущем пункте.

C# solution

auto-draft, review before submit
// C# draft for: Модульное линейное уравнение первого порядка
// Original e-maxx article has no compact code listing in the extracted PDF text.

C++ solution

matched/original
// C++ source for: Модульное линейное уравнение первого порядка
// Compact code block was not extracted from this article.

Java solution

auto-draft, review before submit
// Java draft for: Модульное линейное уравнение первого порядка
// Original e-maxx article has no compact code listing in the extracted PDF text.

Материал разбит как Algorithmическая Task: изучить постановку, понять асимптотику и реализовать Algorithm на выбранном языке.

Vacancies for this task

Active vacancies with overlapping task tags are shown.

All vacancies
There are no active vacancies yet.