Dados cuatro enteros A , B , K , M . La tarea es encontrar (A + iB) K % M que también es un número complejo. A + iB representa un número complejo. Ejemplos:
Entrada: A = 2, B = 3, K = 4, M = 5 Salida: 1 + i*0 Entrada: A = 7, B = 3, K = 10, M = 97 Salida: 25 + i*29
Requisito previo : Enfoque de exponenciación modular : un enfoque eficiente es similar a la exponenciación modular de un solo número. Aquí, en lugar de uno solo, tenemos dos números A, B. Entonces, pase un par de enteros como parámetro a la función en lugar de un solo número. A continuación se muestra la implementación del enfoque anterior:
C++
#include <bits/stdc++.h> using namespace std; // Function to multiply two complex numbers modulo M pair<int, int> Multiply (pair<int, int> p, pair<int, int> q, int M) { // Multiplication of two complex numbers is // (a + ib)(c + id) = (ac - bd) + i(ad + bc) int x = ((p.first * q.first) % M - (p.second * q.second) % M + M) % M; int y = ((p.first * q.second) % M + (p.second * q.first) % M) %M; // Return the multiplied value return {x, y}; } // Function to calculate the complex modular exponentiation pair<int, int> compPow(pair<int, int> complex, int k, int M) { // Here, res is initialised to (1 + i0) pair<int, int> res = { 1, 0 }; while (k > 0) { // If k is odd if (k & 1) { // Multiply 'complex' with 'res' res = Multiply(res, complex, M); } // Make complex as complex*complex complex = Multiply(complex, complex, M); // Make k as k/2 k = k >> 1; } //Return the required answer return res; } // Driver code int main() { int A = 7, B = 3, k = 10, M = 97; // Function call pair<int, int> ans = compPow({A, B}, k, M); cout << ans.first << " + i" << ans.second; return 0; }
Java
// Java implementation of the approach import java.util.*; class GFG { static class pair { int first, second; public pair(int first, int second) { this.first = first; this.second = second; } } // Function to multiply two complex numbers modulo M static pair Multiply (pair p, pair q, int M) { // Multiplication of two complex numbers is // (a + ib)(c + id) = (ac - bd) + i(ad + bc) int x = ((p.first * q.first) % M - (p.second * q.second) % M + M) % M; int y = ((p.first * q.second) % M + (p.second * q.first) % M) % M; // Return the multiplied value return new pair(x, y); } // Function to calculate the // complex modular exponentiation static pair compPow(pair complex, int k, int M) { // Here, res is initialised to (1 + i0) pair res = new pair(1, 0 ); while (k > 0) { // If k is odd if (k % 2 == 1) { // Multiply 'complex' with 'res' res = Multiply(res, complex, M); } // Make complex as complex*complex complex = Multiply(complex, complex, M); // Make k as k/2 k = k >> 1; } // Return the required answer return res; } // Driver code public static void main(String[] args) { int A = 7, B = 3, k = 10, M = 97; // Function call pair ans = compPow(new pair(A, B), k, M); System.out.println(ans.first + " + i" + ans.second); } } // This code is contributed by PrinciRaj1992
Python3
# Python3 implementation of the approach # Function to multiply two complex numbers modulo M def Multiply (p, q, M): # Multiplication of two complex numbers is # (a + ib)(c + id) = (ac - bd) + i(ad + bc) x = ((p[0] * q[0]) % M - \ (p[1] * q[1]) % M + M) % M y = ((p[0] * q[1]) % M + \ (p[1] * q[0]) % M) %M # Return the multiplied value return [x, y] # Function to calculate the # complex modular exponentiation def compPow(complex, k, M): # Here, res is initialised to (1 + i0) res = [1, 0] while (k > 0): # If k is odd if (k & 1): # Multiply 'complex' with 'res' res = Multiply(res, complex, M) # Make complex as complex*complex complex = Multiply(complex, complex, M) # Make k as k/2 k = k >> 1 # Return the required answer return res # Driver code if __name__ == '__main__': A = 7 B = 3 k = 10 M = 97 # Function call ans = compPow([A, B], k, M) print(ans[0], "+ i", end = "") print(ans[1]) # This code is contributed by # Surendra_Gangwar
C#
// C# implementation of the approach using System; class GFG { public class pair { public int first, second; public pair(int first, int second) { this.first = first; this.second = second; } } // Function to multiply two complex numbers modulo M static pair Multiply (pair p, pair q, int M) { // Multiplication of two complex numbers is // (a + ib)(c + id) = (ac - bd) + i(ad + bc) int x = ((p.first * q.first) % M - (p.second * q.second) % M + M) % M; int y = ((p.first * q.second) % M + (p.second * q.first) % M) % M; // Return the multiplied value return new pair(x, y); } // Function to calculate the // complex modular exponentiation static pair compPow(pair complex, int k, int M) { // Here, res is initialised to (1 + i0) pair res = new pair(1, 0 ); while (k > 0) { // If k is odd if (k % 2 == 1) { // Multiply 'complex' with 'res' res = Multiply(res, complex, M); } // Make complex as complex*complex complex = Multiply(complex, complex, M); // Make k as k/2 k = k >> 1; } // Return the required answer return res; } // Driver code public static void Main(String[] args) { int A = 7, B = 3, k = 10, M = 97; // Function call pair ans = compPow(new pair(A, B), k, M); Console.WriteLine(ans.first + " + i" + ans.second); } } // This code is contributed by 29AjayKumar
25 + i29
Complejidad temporal: O(log k).
Espacio Auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por greenindia y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA