今回の3問は比較的悩まずサクサクサクッと解けた。
Problem 46. Goldbach's other conjecture(もうひとつのゴールドバッハの予想)
以前作っていたZaneli.Euler.primesLimitNum
を利用して、与えた数値までの素数を取得し、与えた数値と得られた素数が一致しなければ合成数と判定するようにした。
そうして作った奇合成数の無限リストの中からゴールドバッハ予想に合致しない最初の要素を取り、回答としている。
primesLimitNum (n-2)
で素数のリストを、[halfSqrt n, (halfSqrt n)-1 .. 1]
で平方数の2倍のリストを作り、リスト内包表記でそれらの和と元の数が一致すればゴールドバッハ予想に合致と判定するようにした。
truncate
とかfromIntegral
とかをゴニョゴニョしているのをもう少しスッキリできれば良かったのだが…。Problem 47. Distinct primes factors(異なる素因数)
consecutives
で連続するn個の数値の無限リストを作っている。> take 5 $ consecutives 4 [[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7],[5,6,7,8]]
distinctPrimesFactors
で各要素を因数分解して異なる素因数の数がn個以上かどうかを調べ、全て上限に該当しているものを探している。因数分解には、以前作っていた
Zaneli.Euler.primeFactors
を利用した。> distinctPrimesFactors 2 Just [14,15] > distinctPrimesFactors 3 Just [644,645,646]
Problem 48. Self powers(自身のべき乗(self powers))
まず全てのべき乗を算出してそれらを足して末尾10桁を取ろうとすると、うまくいかない。1000**1000
がInfinity
になり、それをtruncate
しても正しい値にならないからだ。計算途中で常に末尾10桁だけを残しながらべき乗と総和を算出すればよさそうだ。
drop'
をべき乗の計算中と総和の計算中に都度使いながら計算するようにした。> drop' 111222333444 1222333444 > drop' 111222333444555 2333444555