mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-02-17 14:58:10 +00:00
binary exponentiation
This commit is contained in:
parent
3ecb193ae6
commit
b695175da3
77
other/binary_exponentiation.java
Normal file
77
other/binary_exponentiation.java
Normal file
|
@ -0,0 +1,77 @@
|
|||
/**
|
||||
* Binary Exponentiation
|
||||
* This is a method to find a^b in a time complexity of O(log b)
|
||||
* This is one of the most commonly used methods of finding powers.
|
||||
* Also useful in cases where solution to (a^b)%c is required,
|
||||
* where a,b,c can be numbers over the computers calculation limits.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @author chinmoy159
|
||||
* @version 1.0 dated 10/08/2017
|
||||
*/
|
||||
public class bin_expo
|
||||
{
|
||||
/**
|
||||
* function :- b_expo (int a, int b)
|
||||
* returns a^b
|
||||
*/
|
||||
public static int b_expo(int a, int b)
|
||||
{
|
||||
/*
|
||||
* iterative solution
|
||||
*/
|
||||
int res;
|
||||
for (res = 1; b > 0; a *=a, b >>= 1) {
|
||||
if ((b&1) == 1) {
|
||||
res *= a;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
/*
|
||||
* recursive solution
|
||||
if (b == 0) {
|
||||
return 1;
|
||||
}
|
||||
if (b == 1) {
|
||||
return a;
|
||||
}
|
||||
if ((b & 1) == 1) {
|
||||
return a * b_expo(a*a, b >> 1);
|
||||
} else {
|
||||
return b_expo (a*a, b >> 1);
|
||||
}
|
||||
*/
|
||||
}
|
||||
/**
|
||||
* function :- b_expo (long a, long b, long c)
|
||||
* return (a^b)%c
|
||||
*/
|
||||
public static long b_expo(long a, long b, long c)
|
||||
{
|
||||
/*
|
||||
* iterative solution
|
||||
*/
|
||||
long res;
|
||||
for (res = 1l; b > 0; a *=a, b >>= 1) {
|
||||
if ((b&1) == 1) {
|
||||
res = ((res%c) * (a%c)) % c;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
/*
|
||||
* recursive solution
|
||||
if (b == 0) {
|
||||
return 1;
|
||||
}
|
||||
if (b == 1) {
|
||||
return a;
|
||||
}
|
||||
if ((b & 1) == 1) {
|
||||
return ((a%c) * (b_expo(a*a, b >> 1)%c))%c;
|
||||
} else {
|
||||
return b_expo (a*a, b >> 1)%c;
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user