Скажите, что у меня есть большой интегральный номер Integer
. Существует ли библиотечная функция (в прелюдии или где-либо еще), которая при задании Integer
X возвращает интегральную часть квадратного корня из X как Integer
?Получить целочисленную часть квадратного корня в Haskell
ответ
Пакет arithmoi имеет Integer
квадратный корень функции под названием integerSquareRoot
, которая работает для любого Integral
экземпляра.
Он также имеет правила специализации, чтобы вы могли использовать его на равнине Ints
и иметь корень, вычисленный через функцию sqrt на парном разряде.
Я принял ваш ответ, потому что раньше я использовал библиотеки 'Math.NumberTheory'. [Даниэльс ответ] (http://stackoverflow.com/a/21493329/1465011) не менее корректен, но я предпочитаю ваш. –
Вы можете пройти через CReal
.
isqrt :: Integer -> Integer
isqrt = floor . (sqrt :: CReal -> CReal) . fromInteger
Слишком плохо 'Data.Number.CReal' не экспортирует [' floorqrt'] (http://hackage.haskell.org/package/numbers-2009.8.9/docs/src/Data-Number-CReal.html# floorqrt), но, надеюсь, GHC оптимизирует избыточные преобразования. – rampion
Спасибо ** '$ божество **, мне не нужно переводить проект на **' C' ** из-за этого! –
@rampion Ты прав, это * * стыд! Я серьезно сомневаюсь, что GHC будет делать оптимизацию, которую вы предлагаете. –
Я предполагаю, что вы googled для целочисленного квадратного корня? –
@GregS Конечно, я хочу знать, есть ли библиотечные решения, прежде чем катиться самостоятельно. –
Является ли ваше целое неограниченным или вы знаете какую-то практическую и конечную верхнюю границу? –