Мне нужно вывести алгоритм на C ++ для вычисления целочисленных степеней m ^ n, который использует инвариант цикла r = y ^ n и условие цикла y! = M.

Я пробовал использовать инструкцию y = y + 1 для продвижения вперед, но я не знаю, как получить (y + 1) ^ n из y ^ n, и найти его не составит труда. Так что, вероятно, это неправильный путь

Не могли бы вы помочь мне разработать программу?

РЕДАКТИРОВАТЬ: это проблема из предметных структур и алгоритмов данных. Сложность (если она вообще есть) не должна быть математической.

EDIT2: Чтобы уточнить, сложность проблемы заключается в использовании инварианта y ^ n и условия цикла y! = M. Если я изменю n, я не достигну этого

-2
Seven 1 Ноя 2018 в 14:42

2 ответа

Лучший ответ

Даны w и P такие, что 2 ^ w> m , P> 2 ^ (wn) и < сильный> 2 ^ ((P-1) / 2) = -1 mod P ,

Тогда 2 - это генератор мода P , и будет некоторое x такое, что 2 ^ x = m mod P , так что:

if (m<=1 || n==1)
    return m;
if (n==0)
    return 1;

let y = 2;
let r = 1<<n;

while(y!=m)
{
    y = (y*2)%P;
    r = (r*(1<<n))%P;
}
return r;

Если ваша функция не должна выдавать впечатляющие результаты, вы можете просто выбрать самый большой P , который соответствует целому числу на вашем языке.

1
Matt Timmermans 1 Ноя 2018 в 13:56

Нет полезной связи между (y+1)^n и y^n (вы можете написать (y+1)^n = (√(y^n)+1)^n или (y+1)^n = (1+1/y)^n y^n, но это ни к чему не приведет).

Если бы y был разложен на множители, вы могли бы использовать (a.b)^n = (a^n).(b^n), но вам понадобится таблица n -й степеней простых чисел.

Я не вижу разумного ответа.


Вы также можете подумать о биномиальной теореме,

(y+1)^n = y^n + n y^(n-1) + n(n-1)/2 y^(n-2) + ... 1

Но это хуже всего: вам нужно вычислить биномиальные коэффициенты n и обновить все степени y с 0 до n. Общая стоимость вычислений была бы смехотворно высокой.

0
Yves Daoust 1 Ноя 2018 в 13:12