Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 55

Алгоритм Евклида

30.09.2015, 20:49. Показов 2485. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даны натуральные взаимно простые числа n, p. Найдите m такое, что, во-первых, m<p, во-вторых, произведение чисел m и n при делении на p даёт остаток 1.
Помогите пожалуйста!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2015, 20:49
Ответы с готовыми решениями:

Алгоритм Евклида
Найти НОД двух положительных чисел с помощью алгоритма евклида

Расширенный алгоритм Евклида
Не могу найти решение на Паскале задачи на расширенный алгоритм Евклида: Для целых m и n, в процессе нахождения d=НОД(m,n) с помощью...

Функции и Алгоритм Евклида
Помогите пожалуйста! Даны натуральные числа а и b, обозначающие соответственно числитель и знаменатель дроби. Сократить дробь т.е найти...

7
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,434
30.09.2015, 20:56
yutochka123, внизу страницы "Похожие темы".
0
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 55
30.09.2015, 21:05  [ТС]
Именно такой нет...
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
30.09.2015, 21:16
Мне кажется, что задача сводится к Диофантовому уравнению
m*n+x*p=1
m, n - из условия,
m, x - найдётся по решению, вернее, там множество решений, нужно будет ограничить m<p.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
30.09.2015, 21:57
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
function Evclid(x,y:integer):integer;
begin
repeat
if abs(x)>abs(y) then x:=x mod y
else y:=y mod x;
until (x=0) or (y=0);
Evclid:=abs(x+y);
end;
var n,p,m,i:integer;
begin
repeat
writeln('Введите 2 натуральны, взаимно простых числа');
readln(n,p);
until  Evclid(n,p)=1;
writeln('n=',n);
writeln('p=',p);
i:=1;
m:=0;
while (i<p)and(m=0) do
if i*n mod p=1 then m:=i
else inc(i);
if m=0 then write('Искомого числа нет')
else write('m=',m,' ',n,'*',m,'=',n*m,' mod ',p,'=1');
end.
Добавлено через 3 минуты
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Мне кажется, что задача сводится к Диофантовому уравнению
Прочитал это и вспомнил про расширенный алгоритм Эвклида, наверное на него задача, как писал такую на форуме.

Добавлено через 4 минуты
Хотя там условие другое...
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
01.10.2015, 21:11
И я думаю, что расширенный алгоритм Эвклида. За счёт двух условий НОД(n,p)=1 и (m*n) mod p = 1 формулы для решения линейного Диофантового уравнения слегка упростятся. А там или по формулам умножения/деления или перебором кратных чисел.

Добавлено через 21 час 46 минут
Решение задачи ТС из переделанной программы для решения диофантовых уравнений. Я не стал переименовывать переменные - оставлю это ТС. Смысл проги вот в чём:
1. Имеется уравнение вида
a*x+b*y=c
которое в переменных условия задачи выглядит
n*m+p*y=1
Т.е. имеем соответствие
a -> n
x -> m
b -> p
y -> y
Можно по всему тексту заменить названия переменных, но для автоматического переименования я выбрал слишком короткие названия, а вручную - лень.
2. Далее математика такая
g:=НОД(a, b) = 1 (по условию задачи)
По формуле
X0:=Xg*(c div g) = Xg*(1 div 1) = Xg
Y0:=Yg*(c div g) = Yg*(1 div 1) = Yg
Решение уравнения с заданными условиями
x:=X0 + b*k
y:=Y0 - a*k
Как мы помним, переменная x соответствует искомой m, которая в свою очередь меньше p ( -> b). Получим
m:=X0+b*k < p
m:=X0+b*k < b
k < (b-X0) div b
Мне сейчас трудно сообразить, возможна ли ситуация, когда (b-X0) нацело делится на b, что приведёт к m=p. Но предположим, что нет.
Тогда
k:=(b-X0) div b
И
m:=X0+b*k
Всё.
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
{
Решение диофантового a*x+b*y=c уравнения в общем виде
 
Ограничение:
Коэффициенты a и b - только неотрицательные. Для отрицательных
нужно сделать ещё некоторые телодвижения, описанные в e-maxx.
}
program LinearDiophantineEquation;
 
  {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;
  k: integer;
begin
  a := 10;
  b := 23;
  c := 1;
  {рассмотрим некоторые вырожденные случаи, доступные на данном этапе}
  {
   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');
  *)
  {теперь подгонка к решению задачи на основе диофантового уравнения}
  k := (b - X0) div b;
  writeln('m=', X0 + b * k, '<', b);
end.
Добавлено через 6 минут
Предвидя вопросы о пояснении - приведу ссылки на мои источники вдохновения: e-maxx и Wikipedia.

Добавлено через 54 минуты
------------------------------------------------------------------------------------
Если посмотреть на результат, возвращаемый расширенным алгоритмом Эвклида, то с учётом взаимной простоты чисел n и p, то получим, что Ng*n+Pg*p=1, что является условием задачи. И принимая во внимание решения для диофантовых уравнений, получим
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
program task;
 
  {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
  Ng, Pg, g: integer;
  k: integer;
  m, n, p: integer;
begin
  n := 103;
  p := 23;
  {нахождение НОД(n,p) и дополнительных переменных}
  g := ExtendedEuclideanAlgorithm(n, p, Ng, Pg);
  {теперь подгонка к решению задачи на основе диофантового уравнения}
  k := (p - Ng) div p;
  if Ng + p * k >= p then
    Dec(k);
  m := Ng + p * k;
  writeln('m=', m, '<', p);
  writeln('m*n=', m * n, ' mod ', p, ' = ', (m * n) mod p);
end.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
01.10.2015, 21:13
А мне кажется и мой код решает задачу как она описана.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
01.10.2015, 21:25
Да, согласен на все 100%. Просто хотелось решить другим способом. Это даже не для ТС, а чтобы самому вспомнить математику. Даже видно изменение кода по мере чтения .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2015, 21:25
Помогаю со студенческими работами здесь

НОК алгоритм Евклида
Определить НОК (наименьшее общее кратное) двух чисел, используя алгоритм Евклида для вычисления НОД Напоминалка: Пусть m и n одновременно...

Сокращение дроби (алгоритм Евклида)
Написать программу сокращения дроби p/q, где p и q натуральные числа (Алгоритм Евклида). Результат вывести на экран. Заранее спасибо.

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

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

Даны натуральные числа A и B. Найти их НОК, определив функцию для расчета НОД двух натуральных чисел, используя алгоритм Евклида
Даны натуральные числа A и B. Найти их наименьшее общее кратное, определив функцию для расчета наибольшего общего делителя двух натуральных...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru