मान लीजिए हमें पांच इंटीजर नंबर a, b, c, d, n दिए गए हैं। हमें ((a^b)^(c^d)) mod n ढूंढना है। आउटपुट मान एक इंटीजर नंबर है।
इसलिए, यदि इनपुट a = 2, b = 3, c = 2, d = 4, n = 10 है, तो आउटपुट 6 होगा।
2^3 = 8 2^4 = 16 8^16 = 281474976710656 281474976710656 mod 10 = 6
समाधान दृष्टिकोण
- helper() फंक्शन परिभाषित करें यूलर टोटिएंट फंक्शन की गणना के लिए
- विशेष मामलों को संभालें (b=0, c=0, d=0, a=0, d=1)
- यूलर के प्रमेय का उपयोग करके मॉड्यूलर एक्सपोनेंशिएशन की गणना करें
- बड़े एक्सपोनेंट के लिए मॉड्यूलर अंकगणित लागू करें
उदाहरण कार्यान्वयन
def helper(n):
p = n
i = 2
while i * i <= n:
if n % i == 0:
p -= p // i
while n % i == 0:
n = n // i
if i != 2:
i += 2
else:
i += 1
if n > 1:
p -= p // n
return p
def solve(a, b, c, d, n):
if b == 0 or (c == 0 and d != 0):
return pow(a, 0, n)
if c == 1 or d == 0:
return pow(a, b, n)
if a == 0 or a % n == 0:
return 0
if d == 1:
return pow(a, b * c, n)
p = helper(n)
e = pow(c, d, p) + p
return pow(pow(a, b, n), e, n)
print(solve(2, 3, 2, 4, 10))
इनपुट
2, 3, 2, 4, 10
आउटपुट
6