Browsing the blog archives for February, 2010.

Installing GLPK on a Mac

programming

Obsolation note:

Thanks to Dave Coleman’s comment I found out that glpk is available through homebrew now! So you just need these 2 steps to get glpk now:

  1. homebrew
  2. brew install glpk

If you still want to read on, the old way is still here…

So you want copy-paste instructions to install GLPK on your Macbook? Here are the steps:

  1. Download the latest version of GLPK from http://www.gnu.org/software/glpk/#downloading
  2. Optional: Follow the instructions to verify the download (you might need to get GNU Privacy Guard or gpg for this. You can get it at http://gnupg.org)
  3. Say it’s downloaded to your “Downloads” directory, go there and execute the following commands (using the terminal)
    cd ~/Downloads
    tar -xzf glpk-4.43.tar.gz
    ./configure --prefix=/usr/local # see note [1]
    make
    sudo make install
        
  4. At this point, you should have GLPK installed. Verify it:
    which glpsol
    /usr/local/bin/glpsol
        
  5. … and try help:
    glpsol --help
        

Now that you are all set-up, read up this excellent introduction using GLPK: http://www.ibm.com/developerworks/linux/library/l-glpk1

Notes:
[1]: HiveLogic article on why using /usr/local is better
[2] If you want MySQL support (or something “extra”) check out the INSTALL file in the package

13 Comments

Russian Peasant Multiplication in Ruby

programming

Russian Peasant Multiplication: a very simple and elegant way to multiple.

Read more: School-boy example of how and why it works and about Ancient Egyptian Multiplication on wikipedia

So here’s my simple implementation: (or as a gist on github)

module RussianPeasantMultiplication
  def russian_peasant_multiply(b)
    numbers_to_add = []
    a, b = [self, b].sort #So we have the smaller number as the first

    negative_operands = [a, b].select { |n| n < 0 }
    result_should_be_negative = negative_operands.size.odd? # or negative_operands.size == 1

    # Now get the absoultes
    a, b = [a, b].map { |n| n.abs }

    while( a > 1 )
      a = a >> 1 # halv it
      b = b < < 1 # double it
      if a.odd? # or (a % 2 == 0 )
        numbers_to_add << b
      else
      end
    end
    result = numbers_to_add.inject(0) { |sum, n| sum += n }
    result = result * -1 if result_should_be_negative
    result
  end
end

class Integer
  include RussianPeasantMultiplication
end

# Tests
require "test/unit"

class TestInteger < Test::Unit::TestCase
  def test_russian_peasant_multiply
    assert_equal(22 * 70, 22.russian_peasant_multiply(70))
  end

  def test_russian_peasant_multiply_for_negative_numbers
    assert_equal(-22 * 70, -22.russian_peasant_multiply(70))
  end

  def test_russian_peasant_multiply_for_negative_arguments
    assert_equal(22 * -70, 22.russian_peasant_multiply(-70))
  end

  def test_russian_peasant_multiply_for_negative_numbers_and_arguments
    assert_equal(-22 * -70, -22.russian_peasant_multiply(-70))
  end

  def test_russian_peasant_multiply_for_zero
    assert_equal(0 * -70, 0.russian_peasant_multiply(-70))
  end

  def test_russian_peasant_multiply_for_zero_arguments
    assert_equal(-22 * 0, -22.russian_peasant_multiply(0))
  end

  def test_russian_peasant_multiply_for_zero_numbers_and_arguments
    assert_equal(0 * 0, 0.russian_peasant_multiply(0))
  end
end
Add the first comment