完全数
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とてもなんらかの形で計算効率を考慮しなければならないということである。考えてみれば当然であるのだが。
Comments