binary_multiplier.sf 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/ruby
  2. func binary_multiplier(a,b) {
  3. a = a.split(1).map{.to_n};
  4. b = b.split(1).map{.to_n};
  5. a.count(0) < b.count(0) && (
  6. (b, a) = (a, b);
  7. );
  8. a.reverse!;
  9. var xlen = a.end;
  10. var ylen = b.end;
  11. var plen = (xlen + ylen + 1);
  12. var k = 0;
  13. var p = (plen+1 -> of(0));
  14. a.each { |i|
  15. i && (
  16. var carry = 0;
  17. (ylen+1).range.each { |j|
  18. var add = (b[ylen - j] + p[plen - j - k] + carry);
  19. var (d, m) = add.divmod(2);
  20. p[plen - j - k] = m;
  21. carry = d;
  22. };
  23. carry && (
  24. for j in range(ylen+1, plen) {
  25. var add = (carry + p[plen - j - k]);
  26. var (d, m) = add.divmod(2);
  27. p[plen - j - k] = m;
  28. carry = (d || break);
  29. }
  30. )
  31. )
  32. k++;
  33. }
  34. return p;
  35. }
  36. var bin = binary_multiplier(
  37. '110011111101111010100000111010110100110101010001111011000011000000000100110101001011001111101101100110011011110011100011000111100110101010000000111110010010011110111',
  38. '110110110111100010100000111111001100011101110101101100001100110111100000000110110000000100010000000010110000010100101111101110101111010100000011111001101111100011101'
  39. ).join('');
  40. assert_eq(bin, '101100100011010101100110101111010001111100100000011010101100110111001001011011010001110010101111100100000101111110001110111111011110101011100001010100001110011010111101110010011011101101001111011111110111110110011001001000100111010001010101011101110000001011011101110001110001111010010100001110111101111100010111100101100011111011');
  41. say bin;