Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/181: Рейтинг темы: голосов - 181, средняя оценка - 4.78
1 / 1 / 2
Регистрация: 07.10.2013
Сообщений: 170

Расширенный алгоритм Евклида

26.02.2014, 00:00. Показов 35313. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане! Подскажите пожалуйста как реализовать такое задание(код самого алгоритма Евклида прилагается): Программа должна предусматривать ввод исходных данных: двух неотрицательных чисел, модуля и выдачу результата: обратной величины по модулю.
C++
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
#include <iostream>
#include <cmath>
using namespace std;
 
int ext_gcd(int a, int b, int& x, int& y){
   int q, r, x1, x2, y1, y2,d;
   if (b == 0) {
      d = a, x = 1, y = 0;
      return d;
   }
   x2 = 1, x1 = 0, y2 = 0, y1 = 1;
   while (b > 0) {
      q = a / b, r = a - q * b;
      x = x2 - q * x1, y = y2 - q * y1;
      a = b, b = r;
      x2 = x1, x1 = x, y2 = y1, y1 = y;
   }
   d = a, x = x2, y = y2;
   return fabs(d);
}
 
int main(){
 
        int a, b, x, y;
        char flag='y';
        cout << "Eta programma nahod NOD\n";
        while(flag=='y'||flag == 'Y'){
                cout << "Vvedite dannie\na = ";
                cin >> a;
                cout <<"b = ";
                cin >> b;
                cout << "NOD(" << a << "," << b << ")=" <<ext_gcd(a,b,x,y) << " (rashirenniy algoritm Evklida)"<<endl;
                cout << "Najmite [y] dlya povtora\n";
                cin >> flag;
        }
        return 0;
}
Добавлено через 1 минуту
насколько я понимаю, то мы должны каким-то образом возвращать х и у
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2014, 00:00
Ответы с готовыми решениями:

Расширенный алгоритм Евклида
Дело движется к реализации RSA, но уже на этом этапе возникли проблемы. Дело в том что у меня большие числа реализованы на массивах (под...

RSA, Расширенный алгоритм Евклида. Код на С++
Доброго времени суток ,форумчане) тут такой вопрос: есть Расширенный алгоритм Евклида. ( кто сможет простым языком разъяснить ,как...

Алгоритм Евклида
Здравствуйте! Подскажите пожалуйста какие ошибки есть в алгоритме, который я составил? int gcd (int a, int b) { int t; if...

15
65 / 64 / 33
Регистрация: 25.02.2014
Сообщений: 229
26.02.2014, 01:15
Реализацию тяжко. А вот пояснить, что делать могу.
b - обратный к a по mod m, если a*b = 1 mod m
(a,m) - НОД чисел

При помощи алгоритма Эвклида можно найти НОД этих чисел.

Если (a,m)=d>1 (числа не взаимно простые), то a не имеет обратной величины по модулю m.

Если (a,m)=d=1, то при помоши расширенного алгоритма эвклида представляем НОД в виде
ax+my=d, где d = 1 (см. строкой выше)
Т.е. будет равенство
ax+my=1 mod m
Не трудно видеть, что my-делится на m, т.е. my=0 mod m
Тогда:
ax=1 mod m, т.е. найденное число x будет обратным элементом.

Теперь Расширенный алгоритм эвклида:
1. Прямой ход (Собственно обычный алгоритм эвклида). Приведу короткий пример, будем считать, что алгоритм закончит работу за 3 шага (справа пример на числах a=5, m=7).
Bash
1
2
3
4
5
                                    т.к. a<m меняем их местами
a=m*q1+r1                  7 = 5 * 1 + 2     
m=r1*q2+r2                 5 = 2 * 2 + 1
r1=r2*q3                      2 = 1 * 2
r2 - НОД                       1 - НОД
2. Обратный ход
Начинаем выражать остатки с конца (со второго снизу кравнения) и подставлять в уравнения выше
Bash
1
2
3
4
r2 = m - r1*q2                             1= 5 - 2*2
r1 = a - m*q1                               2 = 7 -  5* 1
=> r2 = m-(a-m*q1)*q2=            => 1 = 5 - (7-5*1)*2=
= a*(-q2)+m*(1+q1*q2)             =-7 * 1 + 5 * (1+1*2) = -7 +5 * 3
-q2 = a^-1 (обратный) 3 - обратный элемент к 5 по модулю 7: 3*5 = 14 + 1 mod 7 = 1 mod 7
0
1 / 1 / 2
Регистрация: 07.10.2013
Сообщений: 170
26.02.2014, 18:55  [ТС]
vasiatka, так будет правильно или нет?
C++
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
#include <stdio.h>
void extended_euclid(long a, long b, long *x, long *y, long *d)
{
  long q, r, x1, x2, y1, y2;
  if (b == 0) {
    *d = a, *x = 1, *y = 0;
    return;
  }
  x2 = 1, x1 = 0, y2 = 0, y1 = 1;
  while (b > 0) {
    q = a / b, r = a - q * b;
    *x = x2 - q * x1, *y = y2 - q * y1;
    a = b, b = r;
    x2 = x1, x1 = *x, y2 = y1, y1 = *y;
  }
  *d = a, *x = x2, *y = y2;
}
long inverse(long a, long n)
{
  long d, x, y;
  extended_euclid(a, n, &x, &y, &d);
  if (d == 1) return x;
  return 0;
}
int main(void)
{
  long a = 5, n = 7;
  printf("Обратная от %ld по модулю %2ld равняется %ld\n", a, n, inverse(a, n));
  a = 2, n = 12;
  printf("Обратная от %ld по модулю %2ld равняется %ld\n", a, n, inverse(a, n));
  return 0;
}
0
65 / 64 / 33
Регистрация: 25.02.2014
Сообщений: 229
26.02.2014, 21:35
Как я понял сам алгоритм ты взял тут http://www.cyberguru.ru/cpp-so... klida.html.
Только что нашел.
Вроде похоже.
Только если нод отличен от 1 возвращай отрицательное число.
Далее при выводе Если твоя функция вернула отрицательное число, то пиши обратного нет.
0
1 / 1 / 0
Регистрация: 16.12.2012
Сообщений: 202
Записей в блоге: 3
20.12.2015, 09:54
yurets17, добрый день.так можно увидеть окончательный вариант?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.12.2015, 11:52
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct arr3
{
    int a1, a2, a3;
};
 
// Возвращает набор из трёх чисел - {НОД(a,b), x, y}
// Требуется a,b > 0  и a >= b
arr3 MCD(int a, int b)
{
    arr3 U = {a, 1, 0}, V = {b, 0, 1};
    while (V.a1 != 0)
    {
        int q = U.a1 / V.a1;
        arr3 T = {U.a1 % V.a1, U.a2 - q * V.a2, U.a3 - q * V.a3};
        U = V;
        V = T;
    }
    return U;
}
0
1 / 1 / 0
Регистрация: 16.12.2012
Сообщений: 202
Записей в блоге: 3
20.12.2015, 12:51
Я верно понял что это расширенный алгоритм евклида? Новичок в с++..можно с 10по 18строку коменты дать?

Добавлено через 10 минут
Спасибо за решение. Но суть задания в том чтобы алгоритм Поиска нод расписать,а не готовую функцию применить)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.12.2015, 13:40
В функции и есть решение. Расписывай.
0
1 / 1 / 0
Регистрация: 16.12.2012
Сообщений: 202
Записей в блоге: 3
20.12.2015, 14:14
Можно объяснить с 10-ой по 18-ую строку???
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.12.2015, 14:50
Ну это и есть алгоритм Евклида.
0
1 / 1 / 0
Регистрация: 16.12.2012
Сообщений: 202
Записей в блоге: 3
20.12.2015, 17:45
не работает программа
кучу ошибок дает
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.12.2015, 17:58
У меня же работает. Значит, не правильно используешь.
0
1 / 1 / 0
Регистрация: 16.12.2012
Сообщений: 202
Записей в блоге: 3
20.12.2015, 18:06
/ ev4.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])

struct arr3
{
int a1, a2, a3;
};

// Возвращает набор из трёх чисел - {НОД(a,b), x, y}
// Требуется a,b > 0 и a >= b
arr3 MCD(int a, int b)
{
arr3 U = {a, 1, 0}, V = {b, 0, 1};
while (V.a1 != 0)
{
int q = U.a1 / V.a1 ;
arr3 T = {U.a1 % V.a1, U.a2 - q * V.a2, U.a3 - q * V.a3};
U = V;
V = T;
}
return U;
}


1>c:\users\александр\documents\visual studio 2010\projects\ev4\ev4\ev4.cpp(10): error C2143: синтаксическая ошибка: отсутствие ";" перед "<class-head>"
0
Dimension
595 / 463 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
20.12.2015, 18:29
херово наверное за 3 года так и не выучить структуру кода
0
1 / 1 / 0
Регистрация: 16.12.2012
Сообщений: 202
Записей в блоге: 3
20.12.2015, 19:41
C++
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
include <iostream>
#include <cmath>
using namespace std;
 
int gcd(int a, int b) {
   int t;
   while (b) {
     t = a % b;
     a = b;
     b = t;        
   }
   return abs(a);
}
 
int ext_gcd(int a, int b, int& x, int& y)
{
   int q, r, x1, x2, y1, y2,d;
   if (b == 0) {
      d = a, x = 1, y = 0;
      return d;
   }
   x2 = 1, x1 = 0, y2 = 0, y1 = 1;
   while (b > 0) {
      q = a / b, r = a - q * b; 
      x = x2 - q * x1, y = y2 - q * y1; 
      a = b, b = r; 
      x2 = x1, x1 = x, y2 = y1, y1 = y;
   }
   d = a, x = x2, y = y2;
   return abs(d);
  
}
 
 
int main(){
    
    int a, b, x, y;
    char flag='y';
    cout << "Eta programma nahod NOD\n";
    while(flag=='y'||flag == 'Y'){
        cout << "Vvedite dannie\na = ";
        cin >> a;
        cout <<"b = ";
        cin >> b;
        cout << "NOD(" << a << "," << b << ")=" <<gcd(a,b) << " (algoritm Evklida)"<<endl;
        cout << "NOD(" << a << "," << b << ")=" <<ext_gcd(a,b,x,y) << " (rashirenniy algoritm Evklida)"<<endl;
        cout << "x = " << x << endl;
        cout << "y = " << y << endl;
        cout << "Obr po mod " << x <<endl;
        cout << "Najmite [y] dlya povtora\n";
        cin >> flag;
    }
    return 0;
}
Зачем здесь 2 условия while???разве нельзя ограничиться случаем когда больше 0?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
20.12.2015, 20:12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct arr3
{
    int a1, a2, a3;
};
 
arr3 MCD(int a, int b)
{
    arr3 U = {a, 1, 0}, V = {b, 0, 1};
    while (V.a1 != 0)
    {
        int q = U.a1 / V.a1;
        arr3 T = {U.a1 % V.a1, U.a2 - q * V.a2, U.a3 - q * V.a3};
        U = V;
        V = T;
    }
    return U;
}
 
int main()
{
    arr3 a;
    a = MCD(10, 5);
    cout << a.a1 << endl;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2015, 20:12
Помогаю со студенческими работами здесь

Алгоритм Евклида
Привет всем. Задача такова, надо написать программу на С++ для поиска Самого Малого Кратного (СМК) по алгоритму Евклида. Дано три...

алгоритм евклида
не могу выкупить ничего что происходит и как решить. вот мое задание : : : : Даны натуральные а и b, не равные 0 одновременно. Найти d =...

Визуализировать алгоритм Евклида
Визуализировать алгоритм эвклида

Необычный алгоритм Евклида
Помогите,пожалуйста!Написал програму,не могу найти ,где в ней ошбка.Условие:дано натуральное число n ичислаа1,а2,а3,...,аn,которые вводятся...

Алгоритм Евклида. Переведите с Паскаля на С++
begin g 0 : = b; g 1 : = a; i : = 1 while g i ! = 0 do begin ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru