Thắc mắc về thuật toán (a^b)%c

Mình đang tìm hiểu về thuật toán Modular Exponentiation (a^b)%c, và công thức thường dùng để giải quyết là: ((a%c)*(b%c))%c.
Nhưng khi mình debug đoạn code sau trên trang vnoi thì có vẻ không giống với công thức:

long long power(long long a, long long b, long long c) {
    long long ans = 1;
    for(int i = 1; i <= b; i++) {
        ans *= a;
        ans %= c;
    }
    return ans;
 }

Ví dụ khi tính (5^2)%3 thì theo công thức mình sẽ được: ((5%3)*(5%3))%3.
Nhưng theo đoạn code trên thì sẽ được: ((5%3)*5)%3.
Vẫn cho ra kết quả đúng, nhưng mình không biết tại sao. Mong được các bác lí giải hộ.

Không có nhân b đâu bạn :smiley: còn đoạn code kia cũng bình thường (brute force).

Lấy a = a % c trước là đủ.

1 Like

công thức đó mình lấy trên wiki mà bạn, công thức gốc có nhân b luôn mà :neutral_face:

Công thức của bạn sai rồi.

Đây là công thức tính (a * b) % c.


Theo công thức đồng dư

hay

Tương tự với

4 Likes

À ok cảm ơn bác, não mình đã được thông :rofl:

Chắc là trang vnoi :smiley: mà mình đọc lại thấy đâu có viết vậy.

Hiểu đơn giản là a*b % c = ((a%c) * b) % c.
Theo định nghĩa phép chia a = c*k + a%c với k là số nguyên.
Vậy a*b = (c*k + a%c)*b
c*k*b chia hết cho c nên phần còn lại là số dư.

Dùng đồng dư:

a = r (mod c) (đn là c | a - r)
<=> a*b = r*b (mod c) b!=0
=> a*b = (a%c)*b (mod c)
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?