当前位置: 首页 > 知识库问答 >
问题:

Python3中极大数的计算立方根

微生毅然
2023-03-14

我想计算Python3中一个非常大的数字的立方根。

我尝试了下面的函数,以及Python语法x**(1/n),但它们都产生了一个错误:

溢出错误:(34,数值结果超出范围)

我真的需要计算立方根来解决密码学中的一个问题。

二进制搜索:

def find_invpow(x,n):
    """Finds the integer component of the n'th root of x,
    an integer such that y ** n <= x < (y + 1) ** n.
    """
    high = 1
    while high ** n < x:
        high *= 2
    low = high/2
    while low < high:
        mid = (low + high) // 2
        if low < mid and mid**n < x:
            low = mid
        elif high > mid and mid**n > x:
            high = mid
        else:
            return mid
    return mid + 1

编号:

2402723012420288965061445118057886492024743551154629917030119156891142918839022160395719857240175320389341288681749366145145967978475131123226312522685251430708710073129238467242975159749008032321188589120967227479657671719747542846097161210054623906120260301055001127882387713498723567963440422423914882959001801987608169316360033781939732394099020551125663699345546906894669213059766588861651631700807482565194653978237220624343007162119668966610411816483339553933008437525708171932730677159310906443685072653956857962468259193402008679184817845439554701795917678112318967148892417504752971110662951416459507065969183113675073168805647217161265168559090283169303349989764721815853152625319121281629196477157281162821124326395105731219640206524664156427517206350452758237590539110470955306030593745489038645874942237826327101675102728158117033520522948576476067569350309419081936561261029262542325027092539027418272029737267

共有1个答案

姚洲
2023-03-14

可以使用decimal模块进行精确运算。

>>> import decimal
>>> decimal.getcontext().prec = 2000
>>> d = decimal.Decimal('2402723012420288965061445118057886492024743551154629917030119156891142918839022160395719857240175320389341288681749366145145967978475131123226312522685251430708710073129238467242975159749008032321188589120967227479657671719747542846097161210054623906120260301055001127882387713498723567963440422423914882959001801987608169316360033781939732394099020551125663699345546906894669213059766588861651631700807482565194653978237220624343007162119668966610411816483339553933008437525708171932730677159310906443685072653956857962468259193402008679184817845439554701795917678112318967148892417504752971110662951416459507065969183113675073168805647217161265168559090283169303349989764721815853152625319121281629196477157281162821124326395105731219640206524664156427517206350452758237590539110470955306030593745489038645874942237826327101675102728158117033520522948576476067569350309419081936561261029262542325027092539027418272029737267')
>>> d ** (decimal.Decimal('1') / 3)
Decimal('133937206273872566760548414794736210336251960742418234450742812760868006627899817648959176121676974720839395260046130578695420021242440887741838024586467483284464941105736948057343627501344322408674008360866066160169709440273267336889049052326764318741858819810142437790459410998656086770245548367092374993974.01957800067412107274671320231288433266062350364546769683592253847594623743451779703720694951107454806529528359690294725148124675778043388158795844479553929259504272303859032046859069584110837095735376305672666156318976480517890226479400274370058459434480767128207432199986761444453695779436118862839501324178398087487742940776584102213316419935313873461925911434527386116722957013094796698898872472700324272368147904802863073057018980648551662804801948996721951492839701312729619407794739229894684430062455794449661633869900331053808543005468354619833262979285703791169874072843731978696381444765081323774746768193649889006915101567415498545955639225416247411287009325988294375297958958601667209211716173048048178449049781583788393891485406794668135080292600073761513088637604929682501697901327215780654875172344481652157024703496367724775966846680098078095988613887200458438313630440073673743142814909807062482391728722162209803312904154526529349544269684966919099961646023493569723904047113508330178060117569264305364572356129475509955777812197908616643825623456854418991845353487470790610985118498418396536599578496257211629211857345844725689427541555645325863534277624999230070420282238046581410342066834795210037742864107372403222187187464238882876162544637545389362899169872326464853326158348354630857803436152663716863966593687094693903986337682985705052025525327446033300460743420392444819670886274886235041470468968990640496098175190257430642679726676520803445140667726438592299927612919060753366359346573915491216624232420766373849803692518435531717789932103622716420370476975692356853583654180285339707501578137893768162870141488833638142460328356566642144778402818983167642943155')
 类似资料:
  • 无向图G=(V,E)的独立集是V的子集I使得I中没有两个顶点相邻。也就是说,如果u和v在I中,那么(u,v)不在E中。极大独立集M是一个独立集,这样,如果我们给M添加任何附加的顶点,那么它将不再是独立的。每个图都有一个极大独立集。(你能看到这个吗?这个问题不是练习的一部分,但值得思考。)给出了一个计算图G的最大独立集的有效算法。该方法的运行时间是多少? 我不确定对深度优先搜索的修改是否能解决上述问

  • 用数组和for循环 有溪流 一般来说,我知道ArrayList有开销,这可能导致数组的最小大小在看到增益之前。此外,如果有更好的方法来执行流操作或迭代。不确定forEach在这种情况下是否有效,因为它是一个终端操作,我需要按照array/arrayList的原始顺序捕获结果。

  • 我想我终于对minimax和Alpha-beta修剪有所了解了,但实现它完全是另一回事! 根据我的理解,基础是:您为某些动作分配一个启发式函数分数(Gomoku为例)。 如果一行有5个,我们应该分配一个高值,比如9999,因为这是一个胜利的举动 当我们必须在Java中实现这一点时,我的问题来了! 我有一块彩色[][]板(8x8),其中黑色是播放器1,白色是播放器2,null表示空白,我不知道我们应

  • 极小极大算法的一个缺点是每个板状态必须被访问两次:一次查找其子级,第二次评估启发式值。 极小极大算法还有其他缺点或优点吗?对于像象棋这样的游戏,还有更好的选择吗?(当然是带有α-β修剪的极小极大算法,但还有其他吗?)

  • 问题内容: 我试图在Python 3.5.2中做到这一点: 但是得到了意外的结果: 在Python 2.7.12中运行正常,结果是: 知道为什么Python 3给我错误的结果吗? 问题答案: 在python 3中,您必须显式使用整数除法,否则即使在2个整数之间也会应用浮点除法。 这是python 2和python 3之间的主要变化之一 在您的示例中:(将同时在python 2和python 3中工

  • 在我的minimax算法中,当计算机上有一个玩家有两种方法赢得计算机时,他只会选择棋盘的第一个打开位置。以下面的例子为例。X可以在0,2和1,0位置获胜。 目前,我的算法将把o放置在位置0,1。我相信它会这样做,因为当minimax运行并将o放置在位置0,1时,因为这不是一个胜利,它再次调用minimax,这一次是为x。然后,x移动到位置0,2,为胜利。这个位置返回-10。如果计算机在位置0,2移