【问题标题】:Mersenne Primes processing梅森素数处理
【发布时间】:2020-02-03 13:18:34
【问题描述】:

我对 Mersenne Primes https://www.mersenne.org/ 感兴趣。 Great Internet Mersenne Prime Search (GIMPS) 正在做这方面的研究。 这些是质数,但非常大而且很少。 第 49 个梅森素数有 2200 万位长。令人难以置信的是,一个数字可以是 2200 万位。

我试过并且可以赶上第 8 个梅森素数,它有 10 位数长,在 20 亿以内。 我正在使用 Postgres BIGINT,它最多支持 19 位长整数,即 900 万亿。 所以,如果我一次处理 10 亿行,我需要 900 万次迭代。 我可以进一步使用支持小数点左侧 131072 位和精度 16383 位的 NUMERIC 数据类型。当然,我只需要使用整数。我不需要精确。 另一种选择是 Postgres 的 CHAR VARYING,它可以存储多达 10 亿个。但不能用于计算。

Postgres 提供的东西足以满足任何实际需求。 我的问题是 GIMPS 的人如何计算如此大的数字。 他们是否将这些数字存储在任何数据库中。哪个数据库支持这么大的数字。 我是否与数据库世界取得的进展不同步。

我知道他们拥有强大的处理能力 Curtis Cooper 提到正在使用 700 台服务器来发现和验证这些数字。 确切需要多少存储空间。正在使用什么语言。

只是好奇。这听起来像是我失业了吗?

谢谢

bb23850

【问题讨论】:

  • 就 GIMPS 而言,看起来他们的源代码在 Assembly 中。我对汇编了解不多(确实很少),但据我所知,汇编不需要数据类型,它只是推动内存位置。所以存储数百万甚至数十亿的数字只是内存分配的问题。位就是位,无论该位是数字、单词、日期还是其他东西的一部分都没有关系。汇编只知道位操作(同样,这是据我所知)。
  • 感谢您的回答。没有出现的是他们如何存储这些数字以供重复使用。梅森数不是素数。必须根据质数对其进行验证。因此质数必须存储在数据库或文件中。这是我的理解。

标签: sql postgresql bigint


【解决方案1】:

评论太长了。

梅森数字非常容易计算。它们总是小于 2 的幂:

select n, cast(power(cast(2 as numeric), n) - 1 as numeric(1000,0))
from generate_series(1, 100, 1) gs(n)
order by n;

挑战在于确定结果数是否为素数。梅森知道n 必须是素数才能使对应的梅森数成为素数。

与计算机一样快,一旦数字有十几个或两打左右的数字,对所有因素进行详尽的搜索是不可行的。从上面的代码可以看出,在第 100 个梅森数字之前,穷举搜索就变得不可行了。

为了确定这样的数字是否为素数,需要使用大量数学方法——其中一些是为这个特定问题而发明的或受其启发的。我很确定在关系数据库中实现任何这些素性测试都非常困难。

【讨论】:

  • 感谢您的回答。并非所有梅森数都是素数。 2^4-1=15, 2^6-1=63 不是素数。我花了将近 24 小时来处理 10 亿个数字来识别素数。现在我意识到这是多么艰巨的工作。你的意思是有替代算法来验证它是否是素数。这是一个有趣的探索课题。但我不会轻易放弃数据库。
  • @BB23850 。 . .我对数据库有很多了解,对数论也有一些了解,对高等数学也有足够的了解,我知道数据库不太可能在这项工作中提供帮助,除非作为更复杂算法的一部分的信息数据存储。但我鼓励您努力更多地了解梅森素数、一般素数和数论。
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多