#!/usr/bin/ruby
func binary_multiplier(a,b) {
a = a.split(1).map{.to_n};
b = b.split(1).map{.to_n};
a.count(0) < b.count(0) && (
(b, a) = (a, b);
);
a.reverse!;
var xlen = a.end;
var ylen = b.end;
var plen = (xlen + ylen + 1);
var k = 0;
var p = (plen+1 -> of(0));
a.each { |i|
i && (
var carry = 0;
(ylen+1).range.each { |j|
var add = (b[ylen - j] + p[plen - j - k] + carry);
var (d, m) = add.divmod(2);
p[plen - j - k] = m;
carry = d;
};
carry && (
for j in range(ylen+1, plen) {
var add = (carry + p[plen - j - k]);
var (d, m) = add.divmod(2);
p[plen - j - k] = m;
carry = (d || break);
}
)
)
k++;
}
return p;
}
var bin = binary_multiplier(
'110011111101111010100000111010110100110101010001111011000011000000000100110101001011001111101101100110011011110011100011000111100110101010000000111110010010011110111',
'110110110111100010100000111111001100011101110101101100001100110111100000000110110000000100010000000010110000010100101111101110101111010100000011111001101111100011101'
).join('');
assert_eq(bin, '101100100011010101100110101111010001111100100000011010101100110111001001011011010001110010101111100100000101111110001110111111011110101011100001010100001110011010111101110010011011101101001111011111110111110110011001001000100111010001010101011101110000001011011101110001110001111010010100001110111101111100010111100101100011111011');
say bin;