Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาพลังแห่งพลังภายใต้ mod ของไพรม์ใน C++


ในปัญหานี้ เราได้รับสี่ค่า 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