## Saturday, December 5, 2009

### Calculating the square root of 2 longhand

There are many numerical methods to calculate square roots. This is the long hand method I learned in junior high. It produces one (accurate) digit at a time, but the working numbers get larger each iteration. Eventually, it bogs down because it is doing math with integers hundreds, then thousands of digits long.

Still, it is fun for tinkering. If you run this Ruby script as is, it will calculate the square root of 2 to 1,000 digits. To adjust the precision, change the number of iterations on this line:

`while iterations < 1000`

Here is the entire script...
`#!/usr/bin/ruby# calculate a square root of 2 using longhanddef newroot(divisor, doubleroot)  # calculate new root  # formula is doubleroot _ * _ = closest to divisor  # try 9, then 8, then 7 ...  i = 9  while i >= 0    multiple1 = (doubleroot.to_s + i.to_s).to_i    multiple2 = i    product = multiple1 * multiple2    if product <= divisor      # found new root      root = i      # get modulus      modulus = divisor - product      break    end    i = i - 1  end  return root, modulusendroots = Array.new# the nearest root to 2 is 1root = 1roots.push(root)remainder = 2 - rootdoubleroot = root * 2divisor = remainder * 100iterations = 0while iterations < 1000  root,remainder = newroot(divisor, doubleroot)  roots.push(root)  # compute new doubleroot   return root, modulusendroots = Array.new# the nearest root to 2 is 1root = 1roots.push(root)remainder = 2 - rootdoubleroot = root * 2divisor = remainder * 100iterations = 0while iterations < 1000  root,remainder = newroot(divisor, doubleroot)  roots.push(root)  # compute new doubleroot  doubleroot = roots.to_s.to_i * 2  # compute divisor  divisor = remainder * 100  iterations = iterations + 1  print "iteration " + iterations.to_s + "\n"endprint "final roots are " + roots.to_s + "\n"`