Program for power of a complex number in O(log n)
Last Updated :
20 Feb, 2023
Given a complex number of the form x + yi and an integer n, the task is to calculate the value of this complex number raised to the power n.
Examples:
Input: num = 17 - 12i, n = 3
Output: -2431 + i ( -8676 )
Input: num = 18 - 13i, n = 8
Output: 16976403601 + i ( 56580909840 )
Approach: This algorithm works in O(log n) time complexity. Let c = a + bi and n is the exponent then,
power(x, n) {
if(n == 1)
return x
sq = power(x, n/2);
if(n % 2 == 0)
return cmul(sq, sq);
if(n % 2 != 0)
return cmul(x, cmul(sq, sq));
}
As complex number has 2 fields one is real and other is complex hence we store it in an array. We use cmul() function to multiply two arrays where cmul() implements the below multiplication.
If x1 = a + bi and x2 = c + di
then x1 * x2 = a * c - b * d + (b * c + d * a )i
As we can see in power() function the same function is called for input decreased by 1/2 times.
T(n) = T(n / 2) + c therefore, T(n) = log n
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
long long * cmul( long long * sq1, long long * sq2)
{
long long * ans = new long long [2];
ans[0] = (sq1[0] * sq2[0]) - (sq1[1] * sq2[1]);
ans[1] = (sq1[1] * sq2[0]) + sq1[0] * sq2[1];
return ans;
}
long long * power( long long * x, long long n)
{
long long * ans = new long long [2];
if (n == 0) {
ans[0] = 0;
ans[1] = 0;
return ans;
}
if (n == 1)
return x;
long long * sq = power(x, n / 2);
if (n % 2 == 0)
return cmul(sq, sq);
return cmul(x, cmul(sq, sq));
}
int main()
{
int n;
long long * x = new long long [2];
x[0] = 18;
x[1] = -13;
n = 8;
long long * a = power(x, n);
cout << a[0] << " + i ( " << a[1] << " )" << endl;
return 0;
}
|
Java
public class Main
{
static long [] cmul( long [] sq1, long [] sq2)
{
long [] ans = new long [ 2 ];
ans[ 0 ] = (sq1[ 0 ] * sq2[ 0 ]) - (sq1[ 1 ] * sq2[ 1 ]);
ans[ 1 ] = (sq1[ 1 ] * sq2[ 0 ]) + sq1[ 0 ] * sq2[ 1 ];
return ans;
}
static long [] power( long [] x, long n)
{
long [] ans = new long [ 2 ];
if (n == 0 ) {
ans[ 0 ] = 0 ;
ans[ 1 ] = 0 ;
return ans;
}
if (n == 1 )
return x;
long [] sq = power(x, n / 2 );
if (n % 2 == 0 )
return cmul(sq, sq);
return cmul(x, cmul(sq, sq));
}
public static void main(String[] args) {
long n;
long [] x = new long [ 2 ];
x[ 0 ] = 18 ;
x[ 1 ] = - 13 ;
n = 8 ;
long [] a = power(x, n);
System.out.print(a[ 0 ] + " + i ( " + a[ 1 ] + " )" );
}
}
|
Python 3
def cmul(sq1, sq2):
ans = [ 0 ] * 2
ans[ 0 ] = ((sq1[ 0 ] * sq2[ 0 ]) -
(sq1[ 1 ] * sq2[ 1 ]))
ans[ 1 ] = ((sq1[ 1 ] * sq2[ 0 ]) +
sq1[ 0 ] * sq2[ 1 ])
return ans
def power(x, n):
ans = [ 0 ] * 2
if (n = = 0 ):
ans[ 0 ] = 0
ans[ 1 ] = 0
return ans
if (n = = 1 ):
return x
sq = power(x, n / / 2 )
if (n % 2 = = 0 ):
return cmul(sq, sq)
return cmul(x, cmul(sq, sq))
if __name__ = = "__main__" :
x = [ 0 ] * 2
x[ 0 ] = 18
x[ 1 ] = - 13
n = 8
a = power(x, n)
print (a[ 0 ], " + i ( " , a[ 1 ], " )" )
|
C#
using System;
class GFG {
static long [] cmul( long [] sq1, long [] sq2)
{
long [] ans = new long [2];
ans[0] = (sq1[0] * sq2[0]) - (sq1[1] * sq2[1]);
ans[1] = (sq1[1] * sq2[0]) + sq1[0] * sq2[1];
return ans;
}
static long [] power( long [] x, long n)
{
long [] ans = new long [2];
if (n == 0) {
ans[0] = 0;
ans[1] = 0;
return ans;
}
if (n == 1)
return x;
long [] sq = power(x, n / 2);
if (n % 2 == 0)
return cmul(sq, sq);
return cmul(x, cmul(sq, sq));
}
static void Main() {
long n;
long [] x = new long [2];
x[0] = 18;
x[1] = -13;
n = 8;
long [] a = power(x, n);
Console.Write(a[0] + " + i ( " + a[1] + " )" );
}
}
|
Javascript
<script>
function cmul(sq1, sq2)
{
let ans = new Array(2);
ans[0] = (sq1[0] * sq2[0]) - (sq1[1] * sq2[1]);
ans[1] = (sq1[1] * sq2[0]) + sq1[0] * sq2[1];
return ans;
}
function power(x, n)
{
let ans = new Array(2);
if (n == 0) {
ans[0] = 0;
ans[1] = 0;
return ans;
}
if (n == 1)
return x;
let sq = power(x, n / 2);
if (n % 2 == 0)
return cmul(sq, sq);
return cmul(x, cmul(sq, sq));
}
let n;
let x = new Array(2);
x[0] = 18;
x[1] = -13;
n = 8;
let a = power(x, n);
document.write(a[0] + " + i ( " + a[1] + " )" );
</script>
|
PHP
<?php
function cmul( $sq1 , $sq2 )
{
$ans = array ();
$ans [0] = ( $sq1 [0] * $sq2 [0]) -
( $sq1 [1] * $sq2 [1]);
$ans [1] = ( $sq1 [1] * $sq2 [0]) +
$sq1 [0] * $sq2 [1];
return $ans ;
}
function power( $x , $n )
{
$ans = array ();
if ( $n == 0)
{
$ans [0] = 0;
$ans [1] = 0;
return $ans ;
}
if ( $n == 1)
return $x ;
$sq = power( $x , $n / 2);
if ( $n % 2 == 0)
return cmul( $sq , $sq );
return cmul( $x , cmul( $sq , $sq ));
}
$x = array ();
$x [0] = 18;
$x [1] = -13;
$n = 8;
$a = power( $x , $n );
echo $a [0], " + i ( " , $a [1], " )" ;
?>
|
Output
16976403601 + i ( 56580909840 )
Time complexity : O(log n)
Space complexity : O(log n)
Another Method:
In Python, the cmath module is used to perform complex arithmetic, including logarithm and exponential functions.
Below is the implementation:
Python3
import cmath
def complex_exponentiation(a, b):
return cmath.exp(b * cmath.log(a))
a = complex ( 18 , - 13 )
b = 8
result = complex_exponentiation(a, b)
print (result)
|
Output
(16976403600.999973+56580909839.99995j)
Time complexity : O(1)
Space complexity : O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...