2016-01-01 16 views
0

Если я вычисляю [x * (a^b)% mod + y% mod]% mod, если я просто использую (a^b)% mod, умножил бы это на x, давая мне правильный ответ ? Не будет ли вычисление (x * (a^b))% mod пошагово, лучше? Просто пытаюсь оправдать себя, почему бы не включить x работает. Что можно сделать?Переполнение с мощностью

+2

Является ли 'A [i]' integer? Заметим, что 'x * (2^y) == x << y', когда' y' - неотрицательное целое число. – timrau

+0

Тип литья поры длинный. Да A [i] является целым числом, поэтому я буду использовать оператор сдвига влево, но все равно не произойдет переполнение целого числа. – someone1

+1

Посмотрите на это: http://stackoverflow.com/questions/8496182/calculating-powa-b-mod-n – kfx

ответ

1

Попробуйте этот код. Идея состоит в том, чтобы вводить новые функции для модульного сложения, умножения и возведения в степень:

#define MOD 1000000007 

inline int modadd(int a, int b) { 
    return ((long long)a + b) % MOD; 
} 

inline int modmult(int a, int b) { 
    return ((long long) a * b) % MOD; 
} 

inline unsigned modexp(unsigned base, unsigned exp) 
{ 
    unsigned result = 1; 
    while (exp > 0) { 
     if (exp & 1) result = ((unsigned long long)result * base) % MOD; 
     base = ((unsigned long long)base * base) % MOD; 
     exp >>= 1; 
    } 
    return result; 
} 

int main(void) 
{ 
    unsigned A[3] = {1, 2, 3}; 
    unsigned r[3]; 
    unsigned i, n = 3; 

    r[0] = 0; 
    r[1] = modmult(2, A[0]); 
    for (i = 1; i < n; i++) { 
     r[i+1] = modadd(r[i], modmult(A[i], modexp(2, i))); 
    } 
} 
+0

Привет, спасибо! Я решил это, используя модульную функцию возведения в степень! Это тоже здорово. Может быть, если бы вы могли ответить на это сомнение? Кажется, я не понимаю этого. Если я вычисляю [x * (a^b)% mod + y% mod]% mod, если я просто использую (a^b)% mod, умножил бы это с помощью x, чтобы дать мне правильный ответ? Не будет ли вычисление (x * (a^b))% mod пошагово, лучше? Просто пытаюсь оправдать себя, почему бы не включить x работает. – someone1

+2

Если 'a^b' означает« a до степени b », то проблема заключается в том, что оба' x * (a^b) 'могут переполнять целочисленный диапазон, даже если' a^b' не переполняет его. Либо используйте «modmult (x, a^b)», либо «' '' '' long long'. – kfx

 Смежные вопросы

  • Нет связанных вопросов^_^