Seq.find вылетает для больших чисел (int64) - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий код F #, который должен найти наименьший простой множитель данного числа x:

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

Однако, когда я вызываю функцию с большим номером, например, 600851475143 моя Visual Studio занимает несколько ГБ памяти и всей мощности процессора и никогда не возвращается. Я запускаю код через JetBrains ReSharper в качестве модульного теста, написанного на C #:

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

Мой код F # и номер являются частью решения для задачи 3, Проект Эйлера

Я только начинаю с F #. Есть ли очевидная проблема с моим кодом?

1 Ответ

0 голосов
/ 03 сентября 2018

Ну, как уже упоминалось, выражение [2L .. x] создает список, и для x = 600851475143 оно выделяет 600851475143 * 8 ~ 4,806 ГБ, поэтому оно не работает. Что вы действительно хотите, так это перебирать все числа, поэтому последовательность будет работать идеально для вас:

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