簡體   English   中英

漢明數字使用自定義函數而不是素數

[英]Hamming number using custom functions instead of prime

漢明問題是一個着名的問題,它基本上產生所有整數,其素數因子只有{2,3,5}。 (它可以擴展到我認為的任何一組素因子)

為了找到第n個漢明數,Dijkstra有一個聰明的O(N)構造算法,偽代碼如下:

List<int> H
int i=0,j=0,k=0, n=10 // find the 10-th hamming number
H.add(1)
for(i=0 to 10)
   int next = min(2*H[i], 3*H[j], 5*H[k])
   H.add(next)
   if(next == 2*H[i]) ++i
   if(next == 3*H[j]) ++j
   if(next == 5*H[k]) ++k

output(H[10])

該解決方案的關鍵點在於,如果H是漢明數,則2H,3H,5H也是漢明數


我遇到了一個問題 ,我覺得它有點像漢明問題,但它不是使用一組素因子來構造數字,而是如果我重新討論問題陳述,它就像下面這樣:

1在結果集中。 如果H在結果集中,那么2H + 1和3H + 1也在結果集中。 在結果集中找到第n個數字

然后我想知道相同的構造算法是否適用於這個問題,事實證明它確實存在! (我甚至不知道為什么會這樣)

Def f(x) 2x+1
Def g(x) 3x+1

List<int> H
int i=0,j=0,n=10 // find the 10-th hamming number
H.add(1)
for(i=0 to 10)
   int next = min(f(H[i]), g(H[j]))
   H.add(next)
   if(next == f(H[i])) ++i
   if(next == g(H[j])) ++j

output(H[10])

那么我想知道:

這個構造算法是否適用於生成數字的問題,給定一個規則,如“如果x在結果中,則所有f(x), g(x), p(x), q(x)...也在結果“,只要這些函數給出結果> = x

一個充分條件是從整數到整數的所有函數f_i必須是單調遞增的,並且對於所有in都具有n < f_i(n)

證明你需要類似規則的整數部分的例子是一對函數(n+0.5, (n + floor(n+1))/2) 這將導致序列1, 3/2, 7/4, 15/8, ...並且你永遠不會達到2

函數(2^n, 20 - 5n + n^2) 1, 2, 4, 16, 14, ...的順序出現1, 2, 4, 16, 14, ...並且顯然不是有序的。 因此需要不減少。

函數(n-3)給出序列(1,-2,-5,...)並顯示n < f_i(n)的重要性。

那么為什么這樣呢?

首先,很明顯,該算法輸出的任何內容都在集合中。

換句話說,假設滿足所有三個條件。 然后我們必須通過歸納證明,如果你屬於序列,我們會在到達之前開始尋找你,然后在我們通過你時必須生成它。 (我們通過你的事實是,序列是一組不斷增加的整數。)證明有點混亂,但很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM