« 楽器を捨てる日 | Main | Project Euler ( Problem 29 ) »

完全数

haskellでプログラムを書いて完全数を求める。

まず、任意の数に対する素因数分解の方法を考える。
let n = 28
[x | x<-[1..(n `div` 2)], n `mod` x == 0]

素因数分解の結果を合計する。
let n = 28
sum [x | x<-[1..(n `div` 2)], n `mod` x == 0]
28

素因数分解の結果の合計と元の数を比較し、完全数であるかを判定する。
let n = 28
( sum [x | x<-[1..(n `div` 2)], n `mod` x == 0] ) == n
True

1から任意の数(28)までの整数から完全数を抜き出す。
[n | n<-[1..28],( sum [x | x<-[1..(n `div` 2)], n `mod` x == 0] ) == n ]

自然数から完全数を抜き出す。
[n | n<-[1..],( sum [x | x<-[1..(n `div` 2)], n `mod` x == 0] ) == n ]
[6,28,496,8128

ということで、haskellを素直に書けば素直に答えが得られるとも言うことができるが、1日計算したところで、8128以降の答えが得られていない。haskellとてもなんらかの形で計算効率を考慮しなければならないということである。考えてみれば当然であるのだが。


|

« 楽器を捨てる日 | Main | Project Euler ( Problem 29 ) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference 完全数:

« 楽器を捨てる日 | Main | Project Euler ( Problem 29 ) »