mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2026-03-13 08:51:02 +08:00
Refactor fast powering algorithm.
This commit is contained in:
@@ -1,16 +0,0 @@
|
||||
import computePower from '../power';
|
||||
|
||||
describe('computePower', () => {
|
||||
it('should compute Power', () => {
|
||||
expect(computePower(1, 1)).toBe(1);
|
||||
expect(computePower(2, 0)).toBe(1);
|
||||
expect(computePower(3, 4)).toBe(81);
|
||||
expect(computePower(190, 2)).toBe(36100);
|
||||
expect(computePower(16, 16)).toBe(18446744073709552000);
|
||||
expect(computePower(100, 9)).toBe(1000000000000000000);
|
||||
expect(computePower(9, 16)).toBe(1853020188851841);
|
||||
expect(computePower(11, 5)).toBe(161051);
|
||||
expect(computePower(13, 11)).toBe(1792160394037);
|
||||
expect(computePower(7, 21)).toBe(558545864083284000);
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,4 @@
|
||||
# Power(a,b)
|
||||
# Fast Powering Algorithm
|
||||
|
||||
This computes power of (a,b)
|
||||
eg: power(2,3) = 8
|
||||
@@ -33,3 +33,7 @@ power(2,5) = 2 * power(2,2) * power(2,2) = 2 * 4 * 4 = 32
|
||||
Complexity relation: T(n) = T(n/2) + 1
|
||||
|
||||
Time complexity of the algorithm: O(logn)
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import fastPowering from '../fastPowering';
|
||||
|
||||
describe('fastPowering', () => {
|
||||
it('should compute power in log(n) time', () => {
|
||||
expect(fastPowering(1, 1)).toBe(1);
|
||||
expect(fastPowering(2, 0)).toBe(1);
|
||||
expect(fastPowering(2, 2)).toBe(4);
|
||||
expect(fastPowering(2, 3)).toBe(8);
|
||||
expect(fastPowering(2, 4)).toBe(16);
|
||||
expect(fastPowering(2, 5)).toBe(32);
|
||||
expect(fastPowering(2, 6)).toBe(64);
|
||||
expect(fastPowering(2, 7)).toBe(128);
|
||||
expect(fastPowering(2, 8)).toBe(256);
|
||||
expect(fastPowering(3, 4)).toBe(81);
|
||||
expect(fastPowering(190, 2)).toBe(36100);
|
||||
expect(fastPowering(11, 5)).toBe(161051);
|
||||
expect(fastPowering(13, 11)).toBe(1792160394037);
|
||||
expect(fastPowering(9, 16)).toBe(1853020188851841);
|
||||
expect(fastPowering(16, 16)).toBe(18446744073709552000);
|
||||
expect(fastPowering(7, 21)).toBe(558545864083284000);
|
||||
expect(fastPowering(100, 9)).toBe(1000000000000000000);
|
||||
});
|
||||
});
|
||||
@@ -1,11 +1,11 @@
|
||||
/**
|
||||
* @param {number1} number
|
||||
* @param {number2} number
|
||||
* @return {number1^number2}
|
||||
* Recursive implementation to compute power.
|
||||
*
|
||||
* @param {number} number1
|
||||
* @param {number} number2
|
||||
* @return {number}
|
||||
*/
|
||||
|
||||
// recursive implementation to compute power
|
||||
export default function computePower(number1, number2) {
|
||||
export default function fastPowering(number1, number2) {
|
||||
let val = 0;
|
||||
let res = 0;
|
||||
if (number2 === 0) { // if number2 is 0
|
||||
@@ -13,10 +13,10 @@ export default function computePower(number1, number2) {
|
||||
} else if (number2 === 1) { // if number2 is 1 return number 1 as it is
|
||||
val = number1;
|
||||
} else if (number2 % 2 === 0) { // if number2 is even
|
||||
res = computePower(number1, number2 / 2);
|
||||
res = fastPowering(number1, number2 / 2);
|
||||
val = res * res;
|
||||
} else { // if number2 is odd
|
||||
res = computePower(number1, Math.floor(number2 / 2));
|
||||
res = fastPowering(number1, Math.floor(number2 / 2));
|
||||
val = res * res * number1;
|
||||
}
|
||||
return val;
|
||||
Reference in New Issue
Block a user