ハミング数のリストアップ

30分プログラム、その788。ハミング数の列挙をやってみました。
Regular number - Wikipediaによると2^n・3^m・5^rで表せる整数のことをハミング数と呼ぶらしいです。
なんか遅延リストとfilterを組合せたクールな方法でやりたかったんですけど、うまくいきませんでした。普通に各数字を2と3と5で割れるだけ割って判定してます。

使い方

$ python hamming.py
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18]

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
from itertools import *

def take(n, seq):
    return list(islice(seq, n))

def div_by(n,m):
    (q,r) = divmod(n,m)
    if r == 0:
        return div_by(q,m)
    else:
        return n

def is_hamming(n):
    return div_by(div_by(div_by(n,2),3),5) == 1

print filter(is_hamming,range(1,20))