Problem 3

Problem 3

module Problem_0003

(*
【問題】
13195 の素因数は 5、7、13、29 である。
600851475143 の素因数のうち最大のものを求めよ。
*)

/// 素因数分解関数
let pf num =
    let rec pfRT list num p =
        if p <= num then
            if num % p = 0M then
                pfRT (p :: list) (num / p) p
            else
                pfRT list num (p + 1M)
        else
            list
    pfRT [] num 2M

let run () =
    pf 600851475143M


書き直したパターン

let pf zero inc init num =
    let rec check (p,n) =
        if n < p then None
        elif n % p = zero then Some(p, (p, n/p))
        else check(p+inc, n)
    Seq.unfold check ((*素数*)init, (*現在の数字*)num)

let run() =
    pf 0M 1M 2M 600851475143M
    |> Seq.toList


■計算式ビルダ
使い方覚えるために書いた物なので、正直意味のないコード

module Problem_0003_Monado

(*
【問題】
13195 の素因数は 5、7、13、29 である。
600851475143 の素因数のうち最大のものを求めよ。
A. 6857
*)

type PrimeEnumeratorBuilder() =
    let rec check (p,n) =
        if n < p then None
        elif n%p=0I then Some(p,(p,(n/p)))
        else check(p+1I,n)
    member this.Bind(v,f)= f <| Seq.unfold check (2I,v)
    member this.Return v = v |> Seq.toList
let pe = PrimeEnumeratorBuilder()

let run() =
    pe {
        let! s = 600851475143I
        return s
    }
    • -