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