【问题标题】:How about big numbers? ( primality tests ) [closed]大数呢? (素性测试)[关闭]
【发布时间】:2012-02-09 11:28:00
【问题描述】:

这是一个“真正的”任务吗,可以用任何语言编写(例如 C/C++)

那么,我的任务是“生成”长度超过 50 位(最大值 = 200)的随机数?

然后,我必须在素性测试中检查这个数字。

那么,这个任务是“真实的”吗?它会消耗多少时间/资源?

另一种方法是从特殊类生成素数梅森数或其他数(可以使用哪个类?)

【问题讨论】:

  • 你所说的“真实”是什么意思?你问我们这是不是家庭作业?你应该知道...
  • 证明一个数是素数是非常困难的(嗯,微不足道但非常非常慢)。 GMP(GNU 多精度算术库)有一个可能的素数函数,它可以运行测试(你可以告诉它有多少 iirc)来告诉你一个数字是否“可能”是素数。 gmplib.org/manual/… 使用起来有点麻烦,因为它本来就是 ​​C 语言,但你可以在 c++ 中很好地使用它。
  • 'real' - 任务,只需要一台电脑,耗时不是一个小时。个人使用,是的。
  • @BoBTFish:这不是真的。确定给定数是否为素数可以在多项式时间内完成,(算法)[primes.utm.edu/prove/prove4_3.html] 由 Agrawal、Kayal 和 Saxena 于 2002 年提出。在实践中,我们使用概率 Rabin/Miller,这也很好,因为它也是多项式,只要 ERH 为真(大多数数学家都相信)。
  • @Krystian:他在哪里说不可能在多项式时间内完成?对于约 200 位数字,AKS 仍然困难且缓慢。

标签: c++ algorithm primality-test


【解决方案1】:

有用于素数测试的有效概率算法,例如 Miller-Rabin,通常用于此类目的。

选择一个随机数并使用随机算法测试素数是有效的,因为素数的密度可以保证对于 n 位数字,您需要选择 n 个数字进行测试。

【讨论】:

    【解决方案2】:

    使用Miller-Rabin primality test。此外,您还需要一个用于大小数的库,因为 50 位的数字不适合原生数据类型。

    这是一个Javascript implementation of Miller-Rabin,它执行了 50 次 Miller-Rabin 迭代。它在几秒钟内完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多