#!/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;