Skip to content

Instantly share code, notes, and snippets.

@imazine
Last active February 11, 2019 13:05
Show Gist options
  • Save imazine/84ffeead6a2e6115f8745fef9c9fcc69 to your computer and use it in GitHub Desktop.
Save imazine/84ffeead6a2e6115f8745fef9c9fcc69 to your computer and use it in GitHub Desktop.
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