【问题标题】:How do you Visualize a Huge Integer in Python?如何在 Python 中可视化一个巨大的整数?
【发布时间】:2018-10-24 05:40:11
【问题描述】:

所以,只是为了好玩,我想亲眼看看我们发现的最大素数(2^277,232,917 - 1 根据this),它是一个 23,249,425 位的数字。好家伙。所以我开始手动计算 Python 中的数字:2**277232917-1 这会给我一个答案……最终……总有一天。在我的一个核心一直受到限制的情况下等待了半小时后,我开始寻找一种更快的解决方案来解决指数问题。我在被称为

的维基百科上找到了this gem

平方求幂

def exp_by_squaring(x, n):
    if n<0:
        return exp_by_squaring(1 / x, -n)
    elif x==0:
        return 1
    elif x==1:
        return x
    elif n%2==0:
        return exp_by_squaring(x * x,  n / 2)
    elif not n%2==0:
        return x * exp_by_squaring(x * x, (n - 1) / 2)

将其插入 python3 控制台并输入t=exp_by_squaring(2, 277232917)-1 并等待...哦,等待完成!我喜欢这个概念。现在有了这个号码,我可以print(str(t)),它又被冻结了。假设我可以让它在一夜之间写入文件f=open("LargestPrime", "w") f.write(str(t)) f.close()。第二天早上用一个 23.2 MB 文本文件,试图打开它只是冻结并再次限制核心。我想它太多了,甚至无法显示。

您将如何实现这一目标?您能否将int 拆分为单独的部分,然后将它们转换为字符串以将它们写入单独的文件?我会以其他格式保存它吗?我怎样才能缩短将这个 23M+ 数字 int 转换为字符串所需的时间?我怎么能实际显示这么大的数字?我在这里完全错过了什么吗?

【问题讨论】:

  • 顺便说一句,math.log(2**277232917-1,10) 约为 83,455,424,因此所讨论的数字有那么多十进制数字。计算数字不需要时间;转换为字符串需要很长时间。所以,主要问题是:你为什么想要这个数字的字符串表示?
  • @DYZ 所以,只是为了好玩,我想看看我们发现的最大素数
  • @DYZ 因为我认为看到迄今为止已知的最大的已知素数在所有它的不切实际但令人印象深刻的荣耀中将是惊人的。此外,显然还有一场比赛,要找到一个超过 1 亿位数的素数,并获得 150,000 美元的奖励。不要认为我可以很快做到这一点,但我发现了很多很酷的东西,例如平方概念和模幂运算以及 Lucas-Lehmer 素数检验以及梅森素数是什么。不要以为我会真正深入了解这些在 MAT 154 中真正存在的东西,但在未来的池塘里让我的脚有点湿也无妨。

标签: python string int largenumber


【解决方案1】:

来自维基百科,https://en.wikipedia.org/wiki/Largest_known_prime_number,目前的记录保持者是本月的,他们显示了数字的第一位和最后一位,这是来自维基百科的 sn-p:

Current record
The record is currently held by 2^82,589,933 − 1 with 24,862,048 digits, found by GIMPS in December 2018.[1] Its value is:

148894445742041325547806458472397916603026273992795324185271289425213239361064475310309971132180337174752834401423587560 ...

(24,861,808 digits omitted)

... 062107557947958297531595208807192693676521782184472526640076912114355308311969487633766457823695074037951210325217902591[6]

The first and last 120 digits are shown above.

你可以像这样在 python 中看到自己的数字:


In [304]: t = pow(2,82589933)-1                                                                                                                                 

In [305]: n = 24862048-1000                                                                                                                                     

In [306]: a = pow(10,n)                                                                                                                                         

In [310]: f = t // a                                                                                                                                            

In [311]: len(str(f))                                                                                                                                           
Out[311]: 1000

In [312]: f                                                                                                                                                     
Out[312]: 1488944457420413255478064584723979166030262739927953241852712894252132393610644753103099711321803371747528344014235875600519775183265856491842931959708229506343343451097313699205342310641140595264767876746819332211781849375477107986211226534792788629942124472358169794644246737226991115661546889834987857788089927363336356512975433528625745217905541113567854803029538259231829040461918808066672007922224457105930988153887394047699962279207194319396507712065726965912877889178044489321452540526892581106697213587260581303968314495108439814585421184420014843770161064290389581708297705941888994879327016081279727414348185908077459964865519006267229417152151375452828119103082446114401235115945685219674703882657903762551993641583352385315154281845586882595358954721029880984778088370168635141972524013277223153442722574718130614762581537465586626911838102926072292274274159167780554098619357220471593661193199616071805842054109436528998477753168262245190870602541591290575551503401919575208699092280595

【讨论】:

  • 我把链接放在消息里了,也是 82,589,933 的 2 次方,我也在我的帖子中更新了
  • 实际上是 82,589,933,我也更正了,它复制粘贴奇数导致了这种情况,但现在修复了
  • 好的,现在剩下要做的就是在 Python 中完成 :-)。顺便说一句,使用decimal 模块可以在几秒钟内轻松完成。
  • 不熟悉如何使用小数模块获得答案,但我刚刚为基于整数的答案添加了答案。
  • 嗯,好吧,我想这也行得通,虽然硬编码 24862048 有点笨拙。在将 precEmax 设置为最大值后,您可以执行 str(Decimal(2)**82589933 - 1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多