Нахождение обратного элемента по модулю через расширенный алгоритм Евклида - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Возникла проблема с частью программы (где находится обратный элемент по модулю через расширенный алгоритм Евклида), вот код процедуры
Листинг программы
  1. double REM(double a, double b)
  2. {
  3. double r1 = 1; double r2 = 1; double t1 = 1; double t2 = 1; int k = 0;
  4. do
  5. {
  6. k++;
  7. if (k == 1)
  8. {
  9. r1 = Math.Ceiling(-((b / a) % b)); t1 = b % a;
  10. }
  11. else if (k == 2)
  12. {
  13. r2 = (Math.Ceiling((1 - r1 * a / t1))-1) % b; t2 = a % t1;
  14. }
  15. else if (k % 2 == 1)
  16. {
  17. r1 = Math.Ceiling((r1 - r2 * t1 / t2) % b); t1 = t1 % t2;
  18. }
  19. else if (k % 2 == 0)
  20. {
  21. r2 = (Math.Ceiling((r2 - r1 * t2 / t1))-1) % b; t2 = t2 % t1;
  22. }
  23. }
  24. while ((t1 != 0) && (t2 != 0));
  25. if (k % 2 == 0) if (t1 != 1) return 0; else return r2;
  26. else if (t2 != 1) return 0; else return r1;
  27. }
Почему-то постоянно выдает неверное число (a*REM(a,b) != 1 (mod b) при проверке, число не нулевое), в чем ошибка?

Решение задачи: «Нахождение обратного элемента по модулю через расширенный алгоритм Евклида»

textual
Листинг программы
  1. private double BinModPow(double a, double b, double n)
  2.         {
  3.             decimal x = (decimal)b;
  4.             int i = 0;
  5.             do
  6.             {
  7.                 if (x % 2 == 1) x--;
  8.                 x = x / 2;
  9.                 i++;
  10.             }
  11.             while (x > 0);
  12.             x = (decimal)b;
  13.             decimal[] ar = new decimal[i];
  14.             for (i = 0; i < ar.Length; i++)
  15.             {
  16.                 ar[i] = x % 2;
  17.                 if (x % 2 == 1) x--;
  18.                 x = x / 2;
  19.             }
  20.             x = (decimal)a;
  21.             for (i = ar.Length-2; i >= 0; i--)
  22.             {
  23.                 x = (x * x) % (decimal)n;
  24.                 x = (x * (decimal)Math.Pow(a, (double)ar[i])) % (decimal)n;
  25.             }
  26.             return (double)x;
  27.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы