problem3
2008/04/10
続きで、Project Eulerの問題をpythonで
数学をWikipediaで調べ、pythonをgoogleで調べながら解いたので、骨の折れる問題でした。(特に数学的な意味で)
#! /usr/bin/python# -*- coding: cp932 -*- '''13195 の素因数は 5、7、13、29 である。600851475143 の素因数のうち最大のものを求めよ。 '''def infListFrom(n): "無限リストを返す。"while 1:yield n n += 1def some(fun, list): "用意されてるかもしれないけど、自作"for i in list:if fun(i):return Truereturn Falsedef genPrimeNumber(): "素数ジェネレータ" infList = infListFrom(2)for i in infList:if not some(lambda(x): i % x == 0, range(i / 2, 1, -1)):yield iraise Exception, 'it never reach here.'def getPrimeFactors(n, acc = []): "引数 n を素因数分解する。"if n == 1:return accfor i in genPrimeNumber():if n % i == 0: acc.append(i);return getPrimeFactors(n / i, acc)raise Exception, 'failed to get prime factors.' answer = max(getPrimeFactors(600851475143))print answer
思ったことなど
- 素因数分解ってこと?素因数分解って何だっけ?
- 素数ってどうやって求めるんだっけ?エラトステネスの篩?結局もっと原始的に実装した。
- pythonらしい命名規則とはどっちなんだろう? primeNumbers or prime_numbers
- some関数とかany関数は無いのか?
- someを作った。でも実際、filterで十分だった。
- 変数で受けとった関数を、実行するの超楽(funcallしないでいい)。なんか、おもちゃで遊んでる感覚。javascriptもそうだった。
- 無限リストがあれば、素数ジェネレータ作れる? 動いたけど合ってるのかな。
- デフォルト引数を簡単に書けて嬉しい。