Last active
February 11, 2019 13:05
-
-
Save imazine/84ffeead6a2e6115f8745fef9c9fcc69 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const half = n => n >>> 1; | |
const odd = n => !!(n & 0x1); | |
const even = n => !!!(odd(n)); | |
const multify1 = (a, b, doubled) => { | |
doubled = doubled + 1; | |
if (a === 1) return b; | |
res = multify1(half(a), b + b, doubled); | |
if (odd(a)) res = res + b; | |
console.info('[multiFy1]Interim result', a, b, 'doubled', doubled, 'times returns', res); | |
return res; | |
}; | |
const mult_acc0 = (r, n, a) => { | |
if (n === 1) return r + a; | |
if (odd(n)) { | |
return mult_acc0(r + a, half(n), a + a); | |
} else { | |
return mult_acc0(r, half(n), a + a); | |
} | |
}; | |
const mult_acc1 = (r, n, a) => { | |
if (n == 1) return r + a; | |
if (odd(n)) r = r + a; | |
return mult_acc0(r, half(n), a + a); | |
}; | |
const mult_acc2 = (r, n, a) => { | |
if (odd(n)) { | |
r = r + a; | |
if (n === 1) return r; | |
} | |
return mult_acc2(r, half(n), a + a); | |
}; | |
const mult_acc3 = (r, n, a) => { | |
if (odd(n)) { | |
r = r + a; | |
if (n === 1) return r; | |
} | |
n = half(n); | |
a = a + a; | |
return mult_acc3(r, n, a); | |
}; | |
const mult_acc4 = (r, n, a) => { | |
while (true) { | |
if (odd(n)) { | |
r = r + a; | |
if (n === 1) return r; | |
} | |
n = half(n); | |
a = a + a; | |
} | |
}; | |
const multify2 = (n, a) => { | |
if (n === 1) return a; | |
return mult_acc4(a, n - 1, a); | |
}; | |
const multify3 = (n, a) => { | |
while (even(n)) { | |
a = a + a; | |
n = half(n); | |
} | |
if (n === 1) { | |
console.log('pre looped', a, n); | |
return a; | |
} | |
return mult_acc4(a, n - 1, a); | |
}; | |
const multify4 = (n, a) => { | |
while (even(n)) { | |
a = a + a; | |
n = half(n); | |
} | |
if (n === 1) { | |
console.log('pre looped', a, n); | |
return a; | |
} | |
return mult_acc4(a, half(n - 1), a + a); | |
}; | |
console.log('[multify1] result: ', multify1(17, 13, 0)); | |
console.log('[mult_acc0] result:', mult_acc0(0, 17, 13)); | |
console.log('[mult_acc1] result:', mult_acc1(0, 17, 13)); | |
console.log('[mult_acc2] result:', mult_acc2(0, 17, 13)); | |
console.log('[mult_acc3] result:', mult_acc3(0, 17, 13)); | |
console.log('[mult_acc4] result:', mult_acc4(0, 17, 13)); | |
console.log('[multify2] result: ', multify2(17, 12, 0)); | |
console.log('[multify3] result: ', multify3(16, 15, 0)); | |
console.log('[multify3] result: ', multify3(15, 16, 0)); | |
console.log('[multify4] result: ', multify4(16, 15, 0)); | |
console.log('[multify4] result: ', multify4(15, 16, 0)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment