Seq.find崩溃大数(int64)

问题描述 投票:3回答:1

我有以下F#代码,它应该找到给定数字x的最小素数因子:

let smallestFactor x : int64 = 
    [2L .. x] |> Seq.find( fun s -> x % s = 0L )

但是,当我用大数字调用该函数时,例如600851475143我的Visual Studio需要一些GB的内存和所有CPU功率,永远不会返回。我通过JetBrains ReSharper启动代码作为单元测试,用C#编写:

[Test]
public void SmallestFactorOf600851475143()
{
    var result = Problem3.smallestFactor( 600851475143 );
}

我的F#代码和数字是problem 3, Euler Project解决方案的一部分

我刚开始用F#。我的代码有明显的问题吗?

f# sequence
1个回答
2
投票

好吧,如前所述,表达式[2L .. x]创建列表,对于x = 600851475143,它分配600851475143 * 8~4,806 GB,这就是为什么它不起作用。你真正想要的是迭代所有数字,所以序列将完美适合你:

let smallestFactor x : int64 = 
    seq {2L .. x} |> Seq.find( fun s -> x % s = 0L )
© www.soinside.com 2019 - 2024. All rights reserved.