ในปัญหานี้ เราได้รับสี่ค่า A, B, C, M(จำนวนเฉพาะ) งานของเราคือค้นหาพลังแห่งอำนาจภายใต้ mod ของไพรม์
เราแค่ต้องหาค่าของ (A ^ (B ^ C)) (mod M)
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
A = 3, B = 6, C = 2, M = 11
ผลลัพธ์
3
คำอธิบาย
(A ^ (B ^ C)) =(3 ^ (6 ^ 2)) =(3 ^ (36)) (สมัย 11) =3
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือโดยการคำนวณค่าของ (A ^ (B ^ C)) โดยตรง ซึ่งทำได้โดยการคำนวณค่าของ (B^C) ก่อน แล้วจึง (A ^ (B ^ C)) จากนั้น ใช้ mod ของมัน (B^C) จะส่งผลให้มีการจัดเก็บตัวเลขขนาดใหญ่ซึ่งสามารถเป็นงานได้ และการคำนวณอาจทำให้ล้น
ดังนั้น วิธีที่มีประสิทธิภาพมากขึ้นคือการใช้ทฤษฎีบทน้อยของแฟร์มาต์เพื่อค้นหาค่า
ทฤษฎีบทคือ
a^(m-1) = 1 (mod M) where m is a prime number.
เมื่อใช้สิ่งนี้ เราจะแปลง bc ของปัญหาเป็นตัวเลขของรูปแบบ
x*(M-1) + y สำหรับค่าที่เรากำหนดให้เป็น M
โดยใช้ทฤษฎีบทของเฟอร์มาต์ ส่วน A^(x*(M-1)) จะกลายเป็น 1
ซึ่งจะลดการคำนวณหาค่าของ A y .
ค่าของ y สามารถคำนวณได้ดังนี้
บ ค =x*(M-1) + y
นี่ทำให้ y เหลือเศษเมื่อเราหาร B c โดย (M-1),
ดังนั้น y =B c % (M-1)
ซึ่งทำให้ได้ผลลัพธ์ที่ง่ายมากที่เราต้องหา
(A ^ ((B^C) %( M-1)) % M
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include<iostream>
using namespace std;
int calcPowerMod(int x, int y, int p) {
int powMod = 1;
x = x % p;
while (y > 0) {
if (y & 1)
powMod = (powMod*x) % p;
y /=2; // y = y/2
x = (x*x) % p;
}
return powMod;
}
int findPowerOfPowerMod(int A, int B, int C, int M) {
return calcPowerMod(A, calcPowerMod(B, C, M-1), M);
}
int main() {
int A = 3, B = 6, C = 2, M = 11;
cout<<"The power of power under modulo is "<<findPowerOfPowerMod(A, B, C, M);
return 0;
} ผลลัพธ์
The power of power under modulo is 3