Finding palindromic numbers

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 x 99. Let's try to find the largest palindrome made from the product of two 3-digit numbers.

How to do it...

We will create an array to hold 3-digit numbers from 100 to 999 using our favorite NumPy function arange.

  1. Create a 3-digit numbers array.

    Check the first and last element of the array with the assert_equal function from the numpy.testing package:

    a = numpy.arange(100, 1000)
    numpy.testing.assert_equal(100, a[0])
    numpy.testing.assert_equal(999, a[-1])
  2. Create the products array

    Now, we will create an array to hold all the possible products of the elements of the 3-digits array with itself. We can accomplish this with the outer function. The resulting array needs to be flattened with ravel, to be able to easily iterate over it. Call the sort method on the array to make sure the array is properly sorted. After that, we can do some sanity checks:

    numbers = numpy.outer(a, a)
    numbers = numpy.ravel(numbers)
    numbers.sort()
    numpy.testing.assert_equal(810000, len(numbers))
    numpy.testing.assert_equal(10000, numbers[0])
    numpy.testing.assert_equal(998001, numbers[-1])

The following is the complete program:

import numpy
import numpy.testing

#A palindromic number reads the same both ways. 
#The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 x 99.

#Find the largest palindrome made from the product of two 3-digit numbers.


#1. Create  3-digits numbers array
a = numpy.arange(100, 1000)
numpy.testing.assert_equal(100, a[0])
numpy.testing.assert_equal(999, a[-1])

#2. Create products array
numbers = numpy.outer(a, a)
numbers = numpy.ravel(numbers)
numbers.sort()
numpy.testing.assert_equal(810000, len(numbers))
numpy.testing.assert_equal(10000, numbers[0])
numpy.testing.assert_equal(998001, numbers[-1])
#3. Find largest palindromic number
for i in xrange(-1, -1 * len(numbers), -1):
    s = str(numbers[i])
    if s == s[::-1]:
      print s
      break

The code prints 906609, which is a palindromic number.

How it works...

We saw the outer function in action. This function returns the outer product of two arrays (http://en.wikipedia.org/wiki/Outer_product). The sort function returns a sorted copy of an array.

There's more...

It might be a good idea to check the result. Find out which two 3-digit numbers produce our palindromic number by modifying the code a bit. Try implementing the last step in a NumPy way.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset