Python,汉明数解释

Python,汉明数解释,python,math,Python,Math,我在做一个编程问题,我被要求写一个需要第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,

我在做一个编程问题,我被要求写一个需要第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、3和5的数

引述:

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

你可能想了解一下它们是如何工作的。但基本上这意味着,如果你取素数,乘以足够的次数,你就可以得到你的原始数。素数因子是可能的最小乘数(因为你不能得到小于素数的乘数)

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


你的代码是把一个汉明数的素因子取i,j,k的幂。只要基本因子是正确的,功率是多少并不重要。所以,你可以用2^7得到一个hamming(128),即使7不是hamming,因为2才是最重要的。例如,2^7实际上是2x2x2x2x2x2x2。所以7真的不涉及。您的初始列表只是一个随机整数列表,它与hamming无关。2、3和5是键。

“对于任何用
2^i*3^j*5^k
表示的汉明数,您都可以生成汉明数,而无需
i
j
k
作为汉明数”-是的,这是正确的。我想我现在明白了它的工作原理。问题是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。