gerritjvv
gerritjvv Author of this blog

Methods of problem solving - Counting odd numbers

Methods of problem solving - Counting odd numbers

Overview

When doing arithmetic, using little square boxes, squares and rectangles, can be very useful to help understand the “shape” of numbers, and to come up with an equation to a number problem.

Yes numbers have shapes.

e.g a square:

1
2
x x
x x

The problem explored here is an algorithm for the sum of all odd numbers from 1 - n.

Explore the problem space

Odd numbers are 1, 3, 5, 7... any number not divisible by 2.

How do they look visually?

1
2
3
4
5
6
     x    xx    xxx
x   xx   xxx   xxxx

1    3     5      7

From this we can infer the following:

  • Any odd number is an even number + 1
    1
    2
    3
    4
    
           x
      2 => x    
                x
      2 + 1 => xx
    
  • Starting at any odd number, adding 2 to it gives the second odd number
    1
    2
    3
    4
    5
    
          x      x
      x + x  => xx
          
       x   x      xx
      xx + x  => xxx
    
  • The sum of any 2 odd numbers gives an even number
    1
    2
    3
    4
    5
    
                        
                        
       x    xx       xxxx 
      xx + xxx  =>   xxxx
       3 +   5  =>      8
    
  • The sum of any 3 odd numbers gives us an odd number
    1
    2
    3
    
      x    xx  xxx       xxxxxxx 
     xx + xxx xxxx  =>  xxxxxxxx
      3     5    7            15
    

Simple recursive solution

From the above pattern we can come up with a simple recursive function.

The sum of odd numbers is always the current odd number plus the sum of the odd numbers before it. The difference between any successive 2 odd numbers is 2.

1
2
3
4
N must be odd i.e rem(N/2) != 0

sum_odd [N] = N + sum_odd( N - 2 )

Python

1
2
3
4
5
6
7
def sum_odd(n):
   if not n%2:
      return Exception(f"{n} is not an odd number")
   if n == 1:
      return 1
   else:
      return n + sum_odd(n-2)

Clojure

1
2
3
4
5
6
7
8
(defn sumOdd [n]
  (when (= (rem n 2) 0) 
  (throw (RuntimeException. (str n " is not an odd number"))))
     
  (loop [acc 0 i n]
     (if (> 2 i) 
       (+ acc 1) 
       (recur (+ acc i) (- i 2)))))

On a computer this function is pretty quick, and for most practical purposes we could be done.
Simple easy and we’ve solved our problem.

If we look further though, there is more insight we can gain by playing around.

What is the sum of all odd numbers 1..2n?

Lets look at what 2n means.

If we have n=3, then 2n is 1, 3, 5.
The sum of 2n is the sum of the odd numbers 1 .. 2n-1 because 2n gives us an even number 6.

If we sum these up we get 1 + 3 + 5 => 9.

This number 9 is the square of 3.

Lets use our blocks visualisation:

1
2
3
4
5
6
7
8
9
10
11
12
13
    x   xx 
x  xx  xxx
1   3    5

=> If we add them together, and try to form a square:

                xxx
 xx      xx     xxx
 xx     xxx  => xxx
1+3     5         9 

=> And visually we can confirm its 3 x 3

Lets try another number:

If we have n=7 then 2n is 1, 3, 5, 7, 9, 11, 13.

If we sum these up using our algorithm above we get sum_odd(13) => 49.

This is seems like 7 * 7.

When we explore other combinations of 2n e.g 2*23 we get:

1
2
3
4
5
6
7
8
9
For n = 23

2 * n => 46

So we sum up odd numbers 1 ... 2n-1 => 1 ... 45:

sum_odd(45) => 529

The square root of 529 is 23

From our examples above we can say that: The sum of all odd numbers 1..2n is n * n.

Some more insight:

We could’ve also observed that when we add two odd numbers, the sum is the square of the number
of odd numbers added together.

We add 2 numbers 1 and 3

1
1 + 3 => 4

which is 2 * 2

We add 3 numbers 1, 3, 5

1
1 + 3 + 5 => 9

which is 3 * 3

So in general we can formulate that:

1
2
3
The sum of the first N odd numbers is always

N * N

Summary

Apart from having fun with numbers.

I hope I could show you that using little squares to form basic shapes to represent numbers is an interesting tool for helping discover and visualise interesting properties about numbers and equations.

comments powered by Disqus