幸運数

30分プログラム、その173。幸運数なるものを求めてみる。

求め方は、

  • 自然数の数列Lを用意する
  • Lから偶数を削除する
  • 2*L[1]番目の数字を削除する
  • 2*L[2]番目の数字を削除する
  • ...
  • 2*L[n]番目の数字を削除する

エラトステネスのふるいに似ているけれど、先頭から何番目かを元に削除するという部分が異なる。

使い方

>>> print sieve(range(1,11))
[1, 3, 7, 9]

ソースコード

コードは短かいけれど、えらい苦労した。

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# lucky.py - lucky number
#
# Copyright(C) 2007 by mzp
# Author: MIZUNO Hiroki <hiroki1124@gmail.com> 
# http://mzp.sakura.ne.jp/
#
# Timestamp: 2007/11/04 08:48:01
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Python itself.
#

# l = [1,2,3,4,...]
def sieve(l,index=0):
    if len(l) <= index:
	return l
    else:
	top = 2 if l[index] == 1 else l[index]
	# top*n番目の数を削除する
	xs = [x for (x,i) in zip(l,range(1,len(l)+1)) if i % top != 0]
	return sieve(xs,index+1)

print sieve(range(1,100))