【问题标题】:Quadratic sieve and nth powers二次筛和 n 次方
【发布时间】:2012-12-07 08:57:24
【问题描述】:

我根据维基百科页面上指定的基本算法在 Haskell 中实现了二次筛。它对大多数整数都很有效,但是它无法找到对 n 次幂的数字 N 的因式分解。对于偶数幂(平方),算法循环,对于奇数幂,我找到了几个平方模 N 的平滑数(我已经测试并证实了这一点),但是每个派生的平方同余(也测试和证实)只会导致一个微不足道的因素。

我有理由确定我已经实现了 Wikipedia 算法。该版本的算法是否存在问题,无法处理 n 次幂,或者我的算法中是否存在错误?

由于某种原因,stackoverflow 在格式化我的代码时遇到了问题,所以你去吧:http://pastebin.com/miUxHKCh

【问题讨论】:

  • 发布代码,以便我们判断您的实现。
  • 好的,我可以,但这是相当多的代码。在开始寻找错误之前,我想看看维基百科版本是否存在概念/理论问题。
  • 好的,我发布了代码链接。该文件中未定义的代码调用的所有函数都经过了相当彻底的测试。 psqrt(找到二次余数 mod p)可以工作,但如果模不是素数(但我只在模数肯定是素数的地方)使用它,则具有未定义的行为。我的猜测是问题出在doSievesieve'
  • unSquare 看起来它会无限循环 01
  • cs = ceiling $ (sqrt :: Float -> Float) $ fromIntegral n Double,Float 将你限制在相当小的n

标签: haskell quadratic sieve


【解决方案1】:

据我了解,二次筛不是旨在绝对考虑一个数字。相反,它的设计目的是,在典型情况下,通常考虑一个数字。

例如,至少在今天,维基百科条目将其描述为“没有对数优化或素幂的标准二次筛”。所以它明确地不考虑素数。

此外,据我了解,接近次幂的数字因式分解在更有效的算法变体中也不能很好地工作。

所以错误不在您的代码中,而在于算法通常呈现的方式(它掩盖了诸如它是否总是有效或只是通常等问题作品等:-))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2013-11-27
    • 2016-08-06
    • 2013-03-02
    相关资源
    最近更新 更多