## Find the Fractional Form of a Repeating Decimal

I think math shortcuts and tricks are groovy. Here’s an arithmetic trick to find the fractional form of a repeating decimal.

Generally speaking, if the repeating decimal has a as the repetend, then the fraction that is represented by that repeating decimal is just   a/Z where Z is a number with the same number of digits as a, but all the digits are 9’s.

For example, the let’s find the fractional form of 0.567567…

a = 567 => 0.567567… = 567/999  (= 21/37 after reduction)

## Listing Programming Languages on Your Resume

I love programming and know a few programming languages. Every programmer I’ve met has a favorite language, however, most of us can code in more than one language. As I was revising the ‘Language’ portion of my resume, I became confused.

Should you mention all the languages you can code in?

What if they expect you to be practiced in (insert language you haven’t used in the last 3 months) and you fail the interview?

Should you be safe and only list the languages you are fluent in?

How do you simply represent skill level in languages?

I decided to divide my knowledge of languages into “proficient” and “familiar.” Here is a guide on how to sort your languages into these two categories.

If you are “proficient” at a programming language, you can sit down and code (without consulting the internet or a book) and produce a functional program. You can write efficient, concise code in this language. If given source code, you can optimize it.
If you are “familiar” at a programming language, you’ve coded at least 5 functional programs in this. You can code a simple program with no bugs. If given internet access, you can produce a complex program.  If given source code in this language, you can understand what it does and check for errors. You will likely think “I know how to do this in (insert proficient language here)! How do I do this in (insert familiar language here)?” over 3 times while coding a simple program.

For example, my ‘Language’ section currently looks like this:

(I added my knowledge of Braille and Morse Code because it amuses me to present all types of languages in my language section.)

## Pythonic Method Calling

I have an aversion to hard-coding. Hard coding is when you write out a long, elaborate code that could also be written with a dynamic loop. This usually limits the ability to easily adjust your own code in case you want to change something later (or re-use it). “Hard coding” refers to “rigidly” writing out things instead of keeping them dynamic.

This practice is frowned upon by most of the programmers I’ve met (especially the Python programmers). In Python, code is ‘pythonic’ if it is well-written and concise. This link is to an excellent article on ‘What is Pythonic?’, I highly recommend reading this for a more in-depth explanation of the term: http://blog.startifact.com/posts/older/what-is-pythonic.html

Today, while I was revising my Prime Number Algorithm program (an earlier post), I figured out how to pass functions as strings. The eval function allows me to run python code within itself. This definition of eval is vague and unhelpful.

Let me show you to make a calling method, ‘execute,’ pythonic in order to explain the purpose of the eval function.

Let’s assume that we want a program that executes methods p1(n), p2(n), …, p5(n) given some string n. I will refer to these methods collectively as ‘p’-methods.

We could hard-code this as such:
______________________

class Test():
def execute(self, n):
self.p1(n)
self.p2(n)
self.p3(n)
self.p4(n)
self.p5(n)

def p1(self,n):
print “Hello”+n
def p2(self,n):
print “Hello2″+n
def p3(self, n):
print “Hello3″+n
def p4(self,n):
print “Hello4″+n
def p5(self,n):
print “Hello5″+n

if __name__ == ‘__main__’:
test = Test()
test.execute(‘ World!’)

________________________

The above program will run all 5 ‘p’-methods and print the appropriate strings. However, what if there were 1000 different ‘p’-methods we needed to run? Must we type out each method in order to call these ‘p’-methods within the execute method?

At first, I created a forloop to iteratively call execute, providing a new method each time. If you run the code below, execute will treat the ‘method’ parameter as a String type (instead of a function) and throws an error.

_________________________(NON-FUNCTIONAL)
class Test():
def execute(self, method_name):
self.method_name(‘ World!’)

def send_method(self):
for version in xrange(1,6):
version = str(version) #run each ‘p’-method version = 1, 2, 3, 4
method = ‘self.’+’p’+version #note that type(method == String
self.execute(method)

def p1(self,n):
print “Hello”+n
def p2(self,n):
print “Hello2″+n
def p3(self, n):
print “Hello3″+n
def p4(self,n):
print “Hello4″+n
def p5(self,n):
print “Hello5″+n

if __name__ == ‘__main__’:
test = Test()
test.send_method()
_________________________

We are so very close to having a pythonic solution. In order to fix this error, we must make the String into a method call. With one extra line, we evaluate the String input (‘method_name’) as a function and run all ‘p’-methods! The final version of the execute method is:

_________________________

class Test():
def execute(self, method_name):
method = eval(method_name)
methodrun = method(‘ World!’)

def send_method(self):
for version in xrange(1,5):
version = str(version) #test each version of the algorithm, version = 1, 2, 3, 4
method = ‘self.’+’p’+version
self.execute(method)

def p1(self,n):
print “Hello”+n
def p2(self,n):
print “Hello2″+n
def p3(self, n):
print “Hello3″+n
def p4(self,n):
print “Hello4″+n
def p5(self,n):
print “Hello5″+n

if __name__ == ‘__main__’:
test = Test()
test.send_method()

_________________________

I hope this gives you an idea of: why hard-coding is bad, what ‘pythonic’ means, how ‘eval’ comes in handy and what I do in my free time.

## Introduction to Braille

I’m currently researching machine learning using Braille as my language platform. There is a Research Symposium for Mason’s College of Science at the end of April.

Below is a sneak peak of my paper. I’ve just finished my “Introduction to Braille” section:

## Implementation of Prime Number Algorithms

I’m currently reading Algorithms Unplugged, lent to me by my friend and professor, Dr. Marr.

The text provided 4 versions of an algorithm and claimed that each new version had a noticeable increase in runtime efficiency.

These algorithms take some number n and return a list of all prime numbers up to and including n. For example, if n = 13, this algorithm returns [2,3,5,7,11,13].

I was skeptical of their claims $\Rightarrow$ I took the psuedocode and converted it into functional Python, then wrote a timing function: this tests each algorithm by letting n = 2^6 to 2^20 and repeating each calculation 1000 times (in order to find the average runtime).

I had to wrestle with Python in order to stop it from rounding off the calculated runtimes (treating runtime as a float), which lead to an interesting adventure into the time module man page.

tl;dr

• take psuedocode from a book (p.121-127 of Algorithms Unplugged by various German computer scientists*)
• translate said psuedocode into functional code, and
• test the run-times of each algorithm

'''
Catherine Ray
prime_runtime0.py

'Algorithms Unplugged' Demonstration
Program uses algorithms listed in psuedocode from pg.119-127. Each algorithm returns a list of all primes up to some number n.
There are 4 versions of this algorithm; this program computes the average runtimes of each version and prints to stdout.
'''

import math
import time as t

class Runtime():
def execute(self):
repeat = 1000 #number of times to repeat runtime calculation
n = [2**x for x in xrange(6, 21, 7)] #produce list of large numbers to test algorithms
#n = [2**6, 2**20]
for v in xrange(1,5):
method = 'self.prime_number'+str(v) #test each version of the algorithm, version = 1, 2, 3, 4
print 'ntVersion ' + str(v), 'nHighest Prime Number Computed : Average Runtimen'  #find runtime
[self.runtime(method, number, repeat) for number in n]

def runtime(self, method, n, repeat):
#function = function to test
#n = highest prime to compute
#repeat = number of trials to run
method = eval(method)
total = 0 #reset total
for r in xrange(0, repeat+1):
start = t.time() #get start time
methodrun=method(n)
end = t.time() #get end time
total = total + end-start #add to previously calculated time
average_time = total/repeat #find average runtime
print  '2^%d :' %(int(math.log(n)/math.log(2))), average_time

def prime_number1(self, n): #version 1, pg. 121
list = [i for i in xrange(2,n+1)] #write down all numbers between 2 and n in a list
for i in xrange(2, n+1):
for k in xrange(2, n+1):
if i*k in list: list.remove(i*k) #if i*k is in list, remove
else: pass #if i*k isn't in list, do nothing
return list

def prime_number2(self, n): #version 2, pg. 123
list = [i for i in xrange(2,n+1)] #write down all numbers between 2 and n in a list
for i in xrange(2, int(math.floor(math.sqrt(n)))+1):
for k in xrange(2, int(math.floor(n/i))+1):
if i*k in list: list.remove(i*k) #if i*k is in list, remove
else: pass #if i*k isn't in list, do nothing
return list

def prime_number3(self, n): #version 3, pg. 125
list = [i for i in xrange(2,n+1)] #write down all numbers  between 2 and n in a list
for i in xrange(2, int(math.floor(math.sqrt(n)))+1):
if i in list:
for k in xrange(2, int(math.floor(n/i))+1):
if i*k in list: list.remove(i*k) #if i*k is in list, remove
else: pass #if i*k isn't in list, do nothing
return list

def prime_number4(self, n): #final version, pg.127
list = [i for i in xrange(2,n+1)] #write down all numbers between 2 and n in a list
for i in xrange(2, int(math.floor(math.sqrt(n)))+1):
if i in list:
for k in xrange(int(math.floor(n/i)), i-1, -1):
if k in list:
if i*k in list: list.remove(i*k)  #if i*k is in list, remove
else: pass #if i*k isn't in list, do nothing
return list

if __name__ == '__main__':
runtime = Runtime()
runtime.execute()

I left the code to run overnight.

Taking a brief glance at the output, I found confirmation of the authors’ claims. The runtime each version is less than the previous version (version4 should take less time to run than version1).

*Berthold Vöcking, Helmut Alt, Martin Dietzfelbinger, Rüdiger Reischuk, Christian Scheideler, Heribert Vollmer, Dorothea Wagner