Compute power of power k times % m
Given x, k and m. Compute (xxxx…k)%m, x is in power k times. Given x is always prime and m is greater than x.
Examples:
Input : 2 3 3
Output : 1
Explanation : ((2 ^ 2) ^ 2) % 3
= (4 ^ 2) % 3
= 1
Input : 3 2 3
Output : 0
Explanation : (3^3)%3 = 0
A naive approach is to compute the power of x k times and do modulus operation every time.
C++
#include <bits/stdc++.h>
using namespace std;
int calculate( int x, int k, int m)
{
int result = x;
k--;
while (k--) {
result = pow (result, x);
if (result > m)
result %= m;
}
return result;
}
int main()
{
int x = 5, k = 2, m = 3;
cout << calculate(x, k, m);
return 0;
}
|
C
#include <stdio.h>
#include <math.h>
int calculate( int x, int k, int m)
{
int result = x;
k--;
while (k--) {
result = pow (result, x);
if (result > m)
result %= m;
}
return result;
}
int main()
{
int x = 5, k = 2, m = 3;
printf ( "%d" ,calculate(x, k, m));
return 0;
}
|
Java
class GFG
{
static int calculate( int x,
int k, int m)
{
int result = x;
k--;
while (k --> 0 )
{
result = ( int )Math.pow(result, x);
if (result > m)
result %= m;
}
return result;
}
public static void main(String args[])
{
int x = 5 , k = 2 , m = 3 ;
System.out.println( calculate(x, k, m));
}
}
|
Python3
import math
def calculate(x, k, m):
result = x;
k = k - 1 ;
while (k):
result = math. pow (result, x);
if (result > m):
result = result % m;
k = k - 1 ;
return int (result);
x = 5 ;
k = 2 ;
m = 3 ;
print (calculate(x, k, m));
|
C#
using System;
class GFG
{
static int calculate( int x,
int k,
int m)
{
int result = x;
k--;
while (k --> 0)
{
result = ( int )Math.Pow(result, x);
if (result > m)
result %= m;
}
return result;
}
static public void Main ()
{
int x = 5, k = 2, m = 3;
Console.WriteLine(
calculate(x, k, m));
}
}
|
PHP
<?php
function calculate( $x , $k , $m )
{
$result = $x ;
$k --;
while ( $k --)
{
$result = pow( $result , $x );
if ( $result > $m )
$result %= $m ;
}
return $result ;
}
$x = 5;
$k = 2;
$m = 3;
echo calculate( $x , $k , $m );
?>
|
Javascript
<script>
function calculate(x, k, m)
{
let result = x;
k = k - 1;
while (k--)
{
result = Math.pow(result, x);
if (result > m)
result %= m;
}
return result;
}
let x = 5;
let k = 2;
let m = 3;
document.write(calculate(x, k, m));
</script>
|
Time Complexity: O(k * logx), where k and x represents the value of the given integers.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
An efficient solution is to use Euler’s Totient Function to solve this problem. Since x is a prime number and is always greater than m, that means x and m will always be co-prime. So the fact that will help here is (a^b)%m = (a^(b % et(m)))%m, where et(m) is Euler Totient Function. Consider having a function calculate(x, k, m) that gives the value (x^x^x^x…k times)%m. (x^x^x^x…k times)%m can be written as (a^b)%m = (a^(b % et(m)))%m, where b = calculate(x, k-1, et(m)). A recursive function can be written, with the base cases when k=0 then, answer is 1, and if m=1, then answer is 0.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
const int N = 1000000;
long long phi[N + 5];
void computeTotient()
{
for ( int i = 1; i <= N; i++)
phi[i] = i;
for ( int p = 2; p <= N; p++) {
if (phi[p] == p) {
phi[p] = p - 1;
for ( int i = 2 * p; i <= N; i += p) {
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
}
long long power( long long x, long long y, long long p)
{
long long res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
long long calculate( long long x, long long k,
long long mod)
{
long long arr[N];
long long count = 0;
while (mod > 1) {
arr[count++] = mod;
mod = phi[mod];
}
long long result = 1;
long long loop = count + 1;
arr[count] = 1;
for ( int i = min(k, loop) - 1; i >= 0; i--)
result = power(x, result, arr[i]);
return result;
}
int main()
{
computeTotient();
long long x = 3, k = 2, m = 3;
cout << calculate(x, k, m) << endl;
return 0;
}
|
C
#include <stdio.h>
#define N 1000000
long long phi[N + 5];
int min( int a, int b)
{
int min = a;
if (min > b)
min = b;
return min;
}
void computeTotient()
{
for ( int i = 1; i <= N; i++)
phi[i] = i;
for ( int p = 2; p <= N; p++) {
if (phi[p] == p) {
phi[p] = p - 1;
for ( int i = 2 * p; i <= N; i += p) {
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
}
long long power( long long x, long long y, long long p)
{
long long res = 1;
x = x % p;
while (y > 0) {
if (y & 1)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
long long calculate( long long x, long long k,
long long mod)
{
long long arr[N];
long long count = 0;
while (mod > 1) {
arr[count++] = mod;
mod = phi[mod];
}
long long result = 1;
long long loop = count + 1;
arr[count] = 1;
for ( int i = min(k, loop) - 1; i >= 0; i--)
result = power(x, result, arr[i]);
return result;
}
int main()
{
computeTotient();
long long x = 3, k = 2, m = 3;
printf ( "%lld\n" ,calculate(x, k, m));
return 0;
}
|
Java
class GFG
{
static int N = 1000000 ;
static long phi[] = new long [N + 5 ];
static void computeTotient()
{
for ( int i = 1 ; i <= N; i++)
phi[i] = i;
for ( int p = 2 ; p <= N; p++)
{
if (phi[p] == p)
{
phi[p] = p - 1 ;
for ( int i = 2 * p; i <= N; i += p)
{
phi[i] = (phi[i] / p) *
(p - 1 );
}
}
}
}
static long power( long x, long y, long p)
{
long res = 1 ;
x = x % p;
while (y > 0 )
{
if ((y & 1 ) > 0 )
res = (res * x) % p;
y = y >> 1 ;
x = (x * x) % p;
}
return res;
}
static long calculate( long x, long k,
long mod)
{
long arr[] = new long [N];
long count = 0 ;
while (mod > 1 )
{
arr[( int )count++] = mod;
mod = phi[( int )mod];
}
long result = 1 ;
long loop = count + 1 ;
arr[( int )count] = 1 ;
for ( int i = ( int )Math.min(k, loop) - 1 ;
i >= 0 ; i--)
result = power(x, result, arr[i]);
return result;
}
public static void main(String args[])
{
computeTotient();
long x = 3 , k = 2 , m = 3 ;
System.out.println(calculate(x, k, m));
}
}
|
Python3
N = 1000000
phi = [ 0 for i in range (N + 5 )]
def computeTotient():
for i in range ( 1 , N + 1 ):
phi[i] = i
for p in range ( 2 , N + 1 ):
if (phi[p] = = p):
phi[p] = p - 1
for i in range ( 2 * p, N + 1 , p):
phi[i] = (phi[i] / / p) * (p - 1 )
def power(x, y, p):
res = 1
x = x % p
while (y > 0 ):
if (y & 1 ):
res = (res * x) % p
y = y >> 1
x = (x * x) % p
return res
def calculate(x, k,mod):
arr = [ 0 for i in range (N)]
count = 0
while (mod > 1 ):
arr[count] = mod
count + = 1
mod = phi[mod]
result = 1
loop = count + 1
arr[count] = 1
for i in range ( min (k,loop), - 1 , - 1 ):
result = power(x, result, arr[i])
return result
computeTotient()
x = 3
k = 2
m = 3
print (calculate(x, k, m))
|
C#
using System;
class GFG
{
static int N = 1000000;
static long []phi = new long [N + 5];
static void computeTotient()
{
for ( int i = 1; i <= N; i++)
phi[i] = i;
for ( int p = 2; p <= N; p++)
{
if (phi[p] == p)
{
phi[p] = p - 1;
for ( int i = 2 * p;
i <= N; i += p)
{
phi[i] = (phi[i] / p) *
(p - 1);
}
}
}
}
static long power( long x,
long y, long p)
{
long res = 1;
x = x % p;
while (y > 0)
{
if ((y & 1) > 0)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
static long calculate( long x, long k,
long mod)
{
long []arr = new long [N];
long count = 0;
while (mod > 1)
{
arr[( int )count++] = mod;
mod = phi[( int )mod];
}
long result = 1;
long loop = count + 1;
arr[( int )count] = 1;
for ( int i = ( int )Math.Min(k, loop) - 1;
i >= 0; i--)
result = power(x, result,
arr[i]);
return result;
}
static public void Main ()
{
computeTotient();
long x = 3, k = 2, m = 3;
Console.WriteLine(calculate(x, k, m));
}
}
|
Javascript
<script>
let N = 1000000;
let phi = new Array(N + 5);
phi.fill(0);
function computeTotient()
{
for (let i = 1; i <= N; i++)
phi[i] = i;
for (let p = 2; p <= N; p++)
{
if (phi[p] == p)
{
phi[p] = p - 1;
for (let i = 2 * p; i <= N; i += p)
{
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
}
function power(x, y, p)
{
let res = 1;
x = x % p;
while (y > 0)
{
if ((y & 1) > 0)
res = (res * x) % p;
y = y >> 1;
x = (x * x) % p;
}
return res;
}
function calculate(x, k, mod)
{
let arr = new Array(N);
arr.fill(0);
let count = 0;
while (mod > 1)
{
arr[count++] = mod;
mod = phi[mod];
}
let result = 1;
let loop = count + 1;
arr[count] = 1;
for (let i = Math.min(k, loop) - 1; i >= 0; i--)
result = power(x, result, arr[i]);
return result;
}
computeTotient();
let x = 3, k = 2, m = 3;
document.write(calculate(x, k, m));
</script>
|
Time Complexity: O(N), where N is 106 since all the Euler Totient values are pre-calculated.
Auxiliary Space: O(N), where N is 106
Last Updated :
24 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...