Open In App

Modular Exponentiation of Complex Numbers

Improve
Improve
Like Article
Like
Save
Share
Report

Given four integers A, B, K, M. The task is to find (A + iB)K % M which is a complex number too. A + iB represents a complex number. Examples:

Input : A = 2, B = 3, K = 4, M = 5 Output: 1 + i*0 Input : A = 7, B = 3, K = 10, M = 97 Output: 25 + i*29

Prerequisite: Modular Exponentiation Approach: An efficient approach is similar to the modular exponentiation of a single number. Here, instead of a single we have two number A, B. So, pass a pair of integers as a parameter to the function instead of a single number. Below is the implementation of the above approach : 

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


Javascript




function pair(first, second) {
    this.first = first;
    this.second = second;
}
 
function multiply(p, q, M) {
   // Multiplication of two complex numbers is
    // (a + ib)(c + id) = (ac - bd) + i(ad + bc)
    let x = ((p.first * q.first) % M - (p.second * q.second) % M + M) % M;
    let y = ((p.first * q.second) % M + (p.second * q.first) % M) % M;
    return new pair(x, y);
}
 
function compPow(complex, k, M) {
    let res = new pair(1, 0);
    while (k > 0) {
        if (k % 2 === 1) {
            res = multiply(res, complex, M);
        }
        complex = multiply(complex, complex, M);
        k = k >> 1;
    }
    return res;
}
 
let A = 7, B = 3, k = 10, M = 97;
let ans = compPow(new pair(A, B), k, M);
console.log(ans.first + " + i" + ans.second);
 
// This code is contributed by abn95knd1.


Output:

25 + i29

Time complexity: O(log k).

Auxiliary Space: O(1)



Last Updated : 10 Feb, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads