Выражение с модульным возведением в степень в C ++

Я хочу оценить выражение (an + bn + cn) % 1000000003 на C ++. Я получаю ошибки переполнения, когда n очень велико. Может кто-то помочь мне с этим ? Точнее a = q + 1, b = - 2 * q и c = q - 1. Я слежу за функцией, описанной в this

Могу я разбить (an + bn + cn) % 1000000003 на (an) % 1000000003 + (bn) % 100000003 + (cn) % 1000000003 или что-то подобное? Также я не могу использовать ничего, кроме unsigned long long int


person Mayank Jha    schedule 09.10.2013    source источник
comment
^ возведен во власть!   -  person Mayank Jha    schedule 09.10.2013
comment
@MayankJha: В C ++ нет. В C ++ ^ означает XOR.   -  person John Dibling    schedule 09.10.2013
comment
Теперь это скорее математический вопрос.   -  person john    schedule 09.10.2013
comment
@MayankJha Добро пожаловать в SO, пожалуйста, просмотрите внесенные мной изменения, потому что ^ сбивал с толку как XOR.   -  person Grijesh Chauhan    schedule 09.10.2013
comment
Спасибо за исправление!   -  person Mayank Jha    schedule 09.10.2013


Ответы (1)


Вы можете распределить свой модуль. Математически это будет звучать:

( ((a^n)%1000000003) + ((b^n)%100000003) + ((c^n)%1000000003) ) % 1000000003;

Это избавит вас от необходимости вычислять числа, выходящие за границы, позволяя вам выбирать большие значения для n.

Доказательство.

Только не забудьте использовать pow в модуле math.h:

( ((pow(a, n))%1000000003) 
    + ((pow(b, n))%100000003) 
    + ((pow(c, n))%1000000003) ) % 1000000003;
person Bucket    schedule 09.10.2013
comment
но, как вы можете видеть, b отрицательно, не приведет ли это к ошибочным результатам? - person Mayank Jha; 09.10.2013
comment
См. этот ответ. Если вам не нужны негативы, обработайте их в своем коде! :) - person Bucket; 09.10.2013
comment
Я не думаю, что это сработает, если n очень большой, скажем 1000000000 - person Mayank Jha; 09.10.2013
comment
использование pow может вызвать ошибки точности, я использую модульное возведение в степень. Будет ли работать идентичность, которую вы написали, если я применяю модульное возведение в степень? - person Mayank Jha; 09.10.2013
comment
Да, он все равно должен работать с модульным возведением в степень. Все это снижает накладные расходы на размер хранилища номеров. - person Bucket; 09.10.2013