【问题标题】:Python, hamming number explanationPython,汉明数解释
【发布时间】:2014-09-23 17:53:11
【问题描述】:

我正在做一个编程问题,要求我编写一个需要第 n 个汉明数的函数。

我有一些代码可以创建一个大小为 n 的列表,列表中的每个值都是“1”,然后使用列表进行一些操作以更改列表的值,以便列表中的每个值都是汉明数。

代码在这里:

def hamming(num):
  #Make a list of size n, n-1 is the value we want to return.
  h = [1] * num

  #Make 3 variables representing the 2^i, 3^j, 5^k of our hamming number.
  x2, x3, x5 = 2,3,5

  #Counter variables that we will raise 2, 3, and 5, to.
  i = j = k = 0

    #Our initial list is filled with n values of the integer 1.
  for n in xrange(1, num):
    #Get the smallest number, then we will multiply it by 2, 3, or 5.
    h[n] = min(x2, x3, x5)
    if x2 == h[n]:
      i += 1
      x2 = 2 * h[i]
    if x3 == h[n]:
      j += 1
      x3 = 3 * h[j]
    if x5 == h[n]:
      k += 1
      x5 = 5 * h[k]
  return h[-1]

本质上,我的问题不是这种生成汉明数的方法如何工作,而是为什么。例如,128 是一个汉明数,2^7 * 3^0 * 5^0 也是 128。但是,因为 7 不是汉明数,而这会使用列表中先前计算的值生成汉明数,我猜我在问为什么对于以 2^i * 3^j * 5^k 表示的任何汉明数,您可以生成汉明数而 i、j 或 k 不是汉明数。

对不起,如果问题令人困惑,如果您需要我澄清一些问题,请尽管问,我会尽力解释得更好。

【问题讨论】:

  • “看来,对于以2^i * 3^j * 5^k 表示的任何汉明数,您都可以生成没有ijk 是汉明数的汉明数” i> - 是的,这是正确的。

标签: python math


【解决方案1】:

汉明数是一个只有质因数 2、3 和 5 的数。

引用wikipedia article

在数论中,这些数字被称为 5-平滑,因为它们可以 被描述为只有 2、3 或 5 作为质因数。

您可能想了解prime factors are 的内容以及它们的工作原理。但基本上这意味着,如果你把素数乘以足够多的倍数,你就可以得到你的原始数字。素数因子是可能的最低乘数(因为你不能小于素数)。

例如,如果您有数字 12,则 12 可以被 6、4、3 和 2 整除。在这四个因数中,2 不是质数,因此可以进一步推导。 6 可以除以 2 和 3。而 4 除以 2。因此我们的质因数是 2 和 3。

您的代码将汉明数的质因数设为 i、j 和 k 次方。只要主要因素是正确的,功率是多少都没有关系。因此,即使 7 不是汉明,您也可以得到 2^7 的汉明 (128),因为 2 很重要。例如,2^7 真的只是,2 x 2 x 2 x 2 x 2 x 2。所以 7 真的不涉及。您的初始列表只是一个随机整数列表,与汉明无关。 2、3 和 5 是它们的键。

【讨论】:

  • 我想我现在明白它是如何工作的了。问题是 2^7 = 128,但前几个汉明数字是 [1,2,3,4,5,6,8,9,10] 所以 7 不在列表中的事实让我失望.如果我只是认为 64 是一个汉明数并且 64 是 2^6,那么在某些时候代码将达到 x2 = 2 * h[i] 其中 i 是 64,那么 x2 将是 128。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
相关资源
最近更新 更多