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

Python中的整数平方根

骆文华
2023-03-14

python或标准库中是否有整数平方根?我希望它是精确的(即返回一个整数),如果没有解决方案,就吠叫。

此刻我卷起了我自己天真的一个:

def isqrt(n):
    i = int(math.sqrt(n) + 0.5)
    if i**2 == n:
        return i
    raise ValueError('input was not a perfect square')

但是它很难看,而且我不相信它是大整数。我可以遍历这些方块,如果超过了这个值就放弃,但我认为这样做会有点慢。而且我想我可能会重新发明轮子,像这样的东西肯定已经存在于python中了。。。

共有3个答案

韶云瀚
2023-03-14

很抱歉反应太晚;我只是偶然发现了这一页。如果将来有人访问此页面,python模块gmpy2设计用于处理非常大的输入,其中包括一个整数平方根函数。

示例:

>>> import gmpy2
>>> gmpy2.isqrt((10**100+1)**2)
mpz(10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001L)
>>> gmpy2.isqrt((10**100+1)**2 - 1)
mpz(10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000L)

当然,所有东西都有“mpz”标签,但mpz与int兼容:

>>> gmpy2.mpz(3)*4
mpz(12)

>>> int(gmpy2.mpz(12))
12

参见我的另一个答案,讨论这个方法相对于这个问题的其他答案的性能

下载:https://code.google.com/p/gmpy/

柯梓
2023-03-14

更新:Python3.8有一个math。isqrt标准库中的函数!

我在小(0…222)和大(250001)输入上对每个(正确)函数进行了基准测试。两种情况下的明显赢家都是gmpy2。isqrt首先由mathmandan提出,其次是Python 3.8的数学。第二个是isqrt,第三个是由NPE链接的ActiveState配方。ActiveState配方有一系列可以用移位代替的分区,这使其速度更快(但仍落后于本机函数):

def isqrt(n):
    if n > 0:
        x = 1 << (n.bit_length() + 1 >> 1)
        while True:
            y = (x + n // x) >> 1
            if y >= x:
                return x
            x = y
    elif n == 0:
        return 0
    else:
        raise ValueError("square root not defined for negative numbers")

基准结果:

  • gmpy2。isqrt()(mathmandan):小0.08µs,大0.07 ms
  • int(gmpy2.isqrt())*:小0.3µs,大0.07 ms
  • Python3.8math。isqrt:小0.13微秒,大0.9毫秒
  • ActiveState(如上所述优化):小0.6µs,大17.0 ms
  • 活性态(NPE):小1.0µs,大17.3 ms
  • castlebravo长柄:小4µs,大80 ms
  • mathmandan改进:2.7µs小,120 ms大
  • 马提诺(经此校正):小2.3µs,大140 ms
  • 尼波特:小8微秒,大1000毫秒
  • mathmandan:1.8µs小,2200 ms大
  • castlebravo-Newton法:1.5µs小,19000 ms大
  • user448810:1.4微秒小,20000毫秒大

(*由于gmpy2.isqrt返回一个gmpy2.mpz对象,它的行为大部分但不完全像int,您可能需要将其转换回int一些用途。)

穆正青
2023-03-14

牛顿的方法对整数非常有效:

def isqrt(n):
    x = n
    y = (x + 1) // 2
    while y < x:
        x = y
        y = (x + n // x) // 2
    return x

这将返回x*x不超过n的最大整数x。如果要检查结果是否正好是平方根,只需执行乘法以检查n是否为完美平方。

我在我的博客上讨论了这个算法,以及其他三个计算平方根的算法。

 类似资料:
  • 问题内容: 在python或标准库中的某个地方是否存在整数平方根?我希望它是准确的(即返回一个整数),如果没有解决办法,可以吠叫。 此刻,我滚动了自己的幼稚: 但这很丑陋,我不太相信大整数。我可以遍历正方形,如果超出了该值,则放弃,但是我认为做这样的事情有点慢。另外我想我可能正在重新发明轮子,像这样的东西肯定已经存在于python中了… 问题答案: 牛顿的方法在整数上工作得很好: 这将返回的最大整

  • 我想找出一个整数部分的一个平方根的数字在python与pylab扩展然而,long(sqrt(n))不适用于大整数。有没有什么方法可以非常快地找到一个非常大的数的平方根的整数部分?我是新的Python和编程。我所知道的是当循环和如果语句。谢谢你们

  • 问题内容: 我正在寻找确定一个值是否为完美平方(即其平方根是另一个整数)的最快方法: 我已经通过使用内置Math.sqrt() 函数完成了简单的方法,但是我想知道是否有一种方法可以通过将自己限制为仅整数域来更快地完成操作。 维护查询表是不切实际的(因为大约2 31.5整数的平方小于2 63)。 这是我现在要做的非常简单明了的方法: 问题答案: 我想出一种方法,至少在我的CPU(x86)和编程语言(

  • 我做了一个基于距离公式的程序,但我不知道如何显示平方根请帮助Python 3代码:

  • Python3 实例 平方根,又叫二次方根,表示为〔√ ̄〕,如:数学语言为:√ ̄16=4。语言描述为:根号下16=4。 以下实例为通过用户输入一个数字,并计算这个数字的平方根: 实例(Python 3.0+)# -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com num = float(input('请输入

  • 我正在开发一个程序,在这个程序中,我将一些数据存储在一个整数中,并按位进行处理。例如,我可能会收到数字48,我会一点一点地处理它。一般来说,整数的endian取决于整数的机器表示,但是Python是否能保证整数始终是小endian?或者我需要像在C中一样检查endianness,然后为这两种情况编写单独的代码吗? 我问这个问题是因为我的代码运行在一台Sun机器上,虽然它现在运行的机器使用的是英特尔