Показать сообщение отдельно
  #7 (permalink)  
Старый 09.11.2019, 19:44
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от Malleys
Alexandroppolus, проверьте свой алгоритм, powToMod(366142356n, 1447804911n, 219020071n) должно выдавать 38504623
тот же вариант для БигИнта, работает правильно

function powModBig(n, p, m) {
  if (n < 1n) { return 0n; }
  if (m < 0n) { m = 0n; }
  n = n % m;
  var r = 1n;
  while (p >= 1n) {
    if (p % 2n) {
      r = (r * n) % m;
    }
    n = (n * n) % m;
    p = p / 2n;
  }
  return r;
}

alert(powModBig(366142356n, 1447804911n, 219020071n))


а по сути здесь абсолютно тот же алгоритм, как у тебя, только без рекурсии.

----
вариант для обычных чисел не может с такими параметрами, потому что 366142356 % 219020071 дает большое число, которое при возведении в квадрат вылезает за пределы нумбера.

Последний раз редактировалось Alexandroppolus, 09.11.2019 в 19:46.
Ответить с цитированием