我在做一个编程问题,我被要求写一个需要n个hamming数的函数。
我有一些代码创建了一个大小为n的列表,列表中的每个值都是“1”,然后使用该列表进行一些操作以更改列表的值,使列表中的每个值都是一个hamming数。
代码在这里:
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]
从本质上讲,我的问题不在于这种生成hamming数的方法是如何工作的,而在于为什么。例如,128是汉明数,2^7*3^0*5^0也是128。但是,因为7不是汉明数,这会使用列表中先前计算的值生成汉明数,我想我是在问,为什么对于用2^I*3^j*5^k表示的任何汉明数,可以生成汉明数而不使用I、j或k作为汉明数。
很抱歉,如果这个问题让人困惑,如果你需要我澄清一些事情,请尽管问,我会尽量解释得更好。
最佳答案
hamming数是一个只有素因子2,3和5的数。
引用wikipedia article:
在数论中,这些数字被称为5-光滑,因为它们可以
特征是只有2,3或5作为主要因素。
你可能想了解一下什么prime factors are以及它们是如何工作的。但基本上这意味着如果你取素数乘以足够的次数,你就能得到原来的数字。素数因子是可能的最小乘数(因为不能小于素数)。
例如,如果数字是12,则12可以被6、4、3和2整除。在这四个因素中,2不是素数,因此可以进一步推导。6可以除以2和3。四乘二。因此我们的主因子是2和3。
你的代码把hamming数的素因子转化为i,j,k次方。只要主要因素是正确的,权力是什么并不重要。所以,你可以用2^7得到一个hamming(128),即使7不是hamming,因为2才是最重要的。例如,2^7实际上就是,2 x 2 x 2 x 2 x 2 x 2 x 2。所以7真的没什么关系。你的初始列表只是一个随机整数列表,它与hamming无关。2,3,5是钥匙。