2

Скажите, что у меня есть большой интегральный номер Integer. Существует ли библиотечная функция (в прелюдии или где-либо еще), которая при задании IntegerX возвращает интегральную часть квадратного корня из X как Integer?Получить целочисленную часть квадратного корня в Haskell

+0

Я предполагаю, что вы googled для целочисленного квадратного корня? –

+0

@GregS Конечно, я хочу знать, есть ли библиотечные решения, прежде чем катиться самостоятельно. –

+0

Является ли ваше целое неограниченным или вы знаете какую-то практическую и конечную верхнюю границу? –

ответ

4

Пакет arithmoi имеет Integer квадратный корень функции под названием integerSquareRoot, которая работает для любого Integral экземпляра.

Он также имеет правила специализации, чтобы вы могли использовать его на равнине Ints и иметь корень, вычисленный через функцию sqrt на парном разряде.

+1

Я принял ваш ответ, потому что раньше я использовал библиотеки 'Math.NumberTheory'. [Даниэльс ответ] (http://stackoverflow.com/a/21493329/1465011) не менее корректен, но я предпочитаю ваш. –

7

Вы можете пройти через CReal.

isqrt :: Integer -> Integer 
isqrt = floor . (sqrt :: CReal -> CReal) . fromInteger 
+0

Слишком плохо 'Data.Number.CReal' не экспортирует [' floorqrt'] (http://hackage.haskell.org/package/numbers-2009.8.9/docs/src/Data-Number-CReal.html# floorqrt), но, надеюсь, GHC оптимизирует избыточные преобразования. – rampion

+0

Спасибо ** '$ божество **, мне не нужно переводить проект на **' C' ** из-за этого! –

+0

@rampion Ты прав, это * * стыд! Я серьезно сомневаюсь, что GHC будет делать оптимизацию, которую вы предлагаете. –