wvogel日記

自分用の技術備忘録が多めです.

数学!

プログラムで解く数学
連続する素数の和で1000未満の素数を表したときに項数が最長になるのは953で21項を持つ.
100万未満の素数を連続する素数の和で表したときに最長になるのはどの素数か?


さて、面倒でちょっと途中だけど。

main = print $ maxprime [2] 2 $ filter prime [3..100]

prime :: Int -> Bool
prime n
    | n`mod`2 == 0 = False
    | otherwise = prime' n ((n+1)`div`2)

prime' :: Int -> Int -> Bool
prime' n x
    | x == 1 = True
    | n `mod` x == 0 = False
    | otherwise = prime' n (x-1)

maxprime :: [Int] -> Int -> [Int] -> Int
maxprime xs n (j:js)
    | n+j >= 100 = last $ filter prime xs
    | otherwise = maxprime (xs++[n+j]) (n+j) js

これだと、100未満の場合の答えは41だと導くことができます。
わーい、やったーと思ったけど、1000未満の場合は答えが281となり全然違う...
この場合、2+3+5+7+....とやっているけど、あ、別に7+11+13+....って途中から開始してもいいことに気がついた。
たしかに、2から順々に足した場合、281以上のものはすべて素数ではなかった...
tail関数を使ってやる必要があるようです。
私の予想では7から和をとったらうまくいくはず




やっぱり、7から和をとればうまくいきました。
あとはこれを組み込むだけ