【问题标题】:Infinite lazy lists of digits无限的惰性数字列表
【发布时间】:2014-01-14 20:40:51
【问题描述】:

所以我正在尝试做一些数论工作,我使用的是 Mathematica,但认为 Haskell 更适合处理无限列表(因为 AFAIK Mathematica 没有惰性求值)。我想要做的是让 Haskell 将 1/x 的所有数字存储在一个无限的惰性列表中。到目前为止,我的搜索还没有找到一种方法来将比率拆分为返回数字列表而不是实际浮点数的数字。

【问题讨论】:

  • 这可能会有所帮助stackoverflow.com/questions/804934/…
  • @SamYonnou 指出了正确的方向。然而,在你进入一些琐碎的东西之前,请记住 Haskell 有非常好内置的 bignum 支持:Integer 类型。可能仍然需要摆弄比特,但可能不需要。记得尽可能使用 quotrem 而不是 divmod。
  • 您可能会发现这个 StackExchange 帖子很有趣:“使用惰性列表的功能样式?”:mathematica.stackexchange.com/questions/838/… 这个问题启发了 Mathematica 包,其中一个答案引用了它。
  • @SamYonnou,该页面有我需要的答案。谢谢。最终代码为:nDigRat :: Int -> Int -> Int -> IntnDigRat num denom n = floor (fromIntegral (10*(10^(n-1)*num `rem` denom)) / fromIntegral denom) `rem` 10decExpansionRecipRat :: Int -> [Int]decExpansionRecipRat n = map (nDigRat 1 n) [1..]`
  • kocho - 你应该把它作为答案发布,这样更容易阅读

标签: haskell lazy-evaluation number-theory


【解决方案1】:

我们也可以将其实现为一个简单的流生产者:

divDigits :: Int -> Int -> [Int]
divDigits x y = x `div` y : divDigits (10 * (x `mod` y)) y

实际上存在使用惰性列表来表示这种“无限”精度数字的库,请参阅Haskell Wiki

【讨论】:

    【解决方案2】:

    非常感谢 Sam Yonnou,他提供的链接有正确的公式
    使用的公式:
    x/y 的第 n 位是 (10^(n-1)*x mod y)/y = floor(10 * (10^(n-1)*x mod y) / y) mod 10 的第 1 位

    结束代码如下所示:

    nDigRat :: Int -> Int -> Int -> Int
    nDigRat num denom n = floor (fromIntegral (10*(10^(n-1)*num `rem` denom)) / 
                                 fromIntegral denom) 
                          `rem` 10
    
    decExpansionRecipRat :: Int -> [Int]
    decExpansionRecipRat n = map (nDigRat 1 n) [1..]
    

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多