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

检查一个数字是否是另一个数字的完美幂

年风华
2023-03-14

例如,243是3的完美幂,因为243=3^5。

我以前一直在使用(math.log(a)/math。日志(b))。是_integer(),我认为它工作得很好,但后来我用上面的示例尝试了它,由于浮点运算,它实际上返回了4.99999999999。所以它只适用于非常小的数字,我发现不到大约100个。

我想我可以用一个循环来重复乘法。。。i、 将i设置为3,然后设置为9,然后设置为27,然后设置为81,然后设置为243,这等于目标值,所以我们知道这是一个完美的幂。如果它达到一个大于243的点,那么我们知道它不是一个完美的能量。但我在一个循环中运行这个检查,所以这看起来效率很低。

那么,有没有其他可靠的方法来检查一个数字是否是另一个数字的完美幂呢?

共有3个答案

朱鹤轩
2023-03-14

如果您要处理大量的数字,您可能需要查看gmpy2。gmpy2提供对GMP多精度库的访问。提供的函数之一是is_power()。如果参数是某个基数的完美幂,它将返回True。它不会提供功率或基数,但它会很快过滤掉不可能是完美功率的数字。

>>> import gmpy2
>>> [n for n in range(1,1000) if gmpy2.is_power(n)]
[1, 4, 8, 9, 16, 25, 27, 32, 36, 49, 64, 81, 100, 121, 125, 128, 144, 169, 196, 216, 225, 243, 256, 289, 324, 343, 361, 400, 441, 484, 512, 529, 576, 625, 676, 729, 784, 841, 900, 961]

一旦确定了可能的幂,就可以使用iroot\u rem(x,n)找到x的第n个根和余数。然后,一旦找到有效的指数,就可以找到基数。这里有一个例子,在一个范围内搜索所有可能的完美力量。

>>> for x in range(1,1000):
...   if gmpy2.is_power(x):
...     for e in range(x.bit_length(), 1, -1):
...       temp_root, temp_rem = gmpy2.iroot_rem(x, e)
...       if not temp_rem:
...         print x, temp_root, e
... 
4 2 2
8 2 3
9 3 2
16 2 4
16 4 2
25 5 2
27 3 3
32 2 5
36 6 2
49 7 2
64 2 6
64 4 3
64 8 2
81 3 4
81 9 2
<< remainder clipped>>

免责声明:我维护gmpy2

连坚白
2023-03-14

可能是这样的:

def is_perfect_power(a, b):
  while a % b == 0:
    a = a / b
  if a == 1:
    return True
  return False

print is_perfect_power(8,2)
韦昊焜
2023-03-14

尝试:

b ** int(round(math.log(a, b))) == a

也就是说,只使用log()(注意这里有一个双参数表单!)要猜测整数幂,请验证是否“有效”。

注意,math。log()即使对于太大而无法表示为浮点的整数参数,也会返回合理的结果。还要注意,Python中的整数**是精确的,并且在内部使用了一个高效的算法(执行与指数中的位数成比例的乘法)。

这很简单,比重复除法更有效。

但我要回答你问的问题;-)如果你心里还有其他问题,其他一些答案可能更合适。

 类似资料:
  • rank ▲ ✰ vote url 41 487 108 705 url 检查一个字符串是否是一个数字 如果一个字符串可以被看做一个数字那么有什么好的方法可以检测出来? 我能想到的方法: def is_number(s): try: float(s) return True except ValueError: return Fals

  • 问题内容: 我需要测试从1到1000的每个数字是3的倍数还是5的倍数。我认为我要这样做的方式是将数字除以3,如果结果是整数,则它将是3的倍数。与5相同。 如何测试数字是否为整数? 这是我当前的代码: 问题答案: 您可以使用模运算符执行此操作, 当且仅当是的精确倍数时,计算结果为true 。在小学数学中,这被称为除法运算的余数。 在您当前的方法中,您执行除法,结果将是 如果使用整数除法,则始终为整数

  • 每个数字都应该大于或等于另一个数字。如果所有数字相等,则返回false。 例子: 通常的方式是不断地除以10,然后比较余数。 null null

  • 问题内容: 我正在尝试编写一个自定义过滤器方法,该方法接受任意数量的 kwargs 并返回一个列表,该列表包含包含这些 kwargs 的类似数据库的列表的元素。 例如,假设和=相同。结果为True。但是,假设=同一件事,再加上其他事情。我的方法需要能够确定 d1是否在d2中 ,但是Python无法使用字典来做到这一点。 内容: 我有一个字类,并且每个对象都有类似的属性,,,等等。我希望能够在这些单

  • 假设我有以下两本词典: 我想检查dict1是否是dict2的子集(即dict 1中的键值对是否显示在dict2中,而dict2中的相同键值将包括额外的值,如充电状态和设备)。 但我知道 请注意,这是一个不同的问题: 遍历所有嵌套字典值? 对嵌套字典的嵌套值求和 循环访问嵌套字典 有人能帮忙吗? 提前致谢。

  • 问题内容: 在SO上已经问过类似的问题,但是它们有更具体的约束,其答案不适用于我的问题。 一般来说,确定任意numpy数组是否是另一个数组的子集的最有效方法是什么?更具体地说,我有大约20000x3的数组,我需要知道完全包含在集合中的1x3元素的索引。更普遍地讲,是否有更Python化的方式编写以下代码: 对于我的用例,我可以安全地假设len(master)<<20000。(因此,可以安全地假设m