自然数のセットの最大ペアワイズGCDを効率的に見つける


9

次の問題を検討してください。

ましょは自然数の有限サブセットです。S={s1,s2,...sn}

ましょうgでのCのD sはIS J | sのiがS JS S IS J } 、G 、C 、D X Yはの最大公約数であり、X及びYG={ gcd(si,sj)si,sjS, sisj}gcd(x,y)xy

の最大要素を求めます。G

この問題は、ユークリッドのアルゴリズムを使用して各ペアの最大公約数を取り、最大のものを追跡することで解決できます。

これを解決するより効率的な方法はありますか?


3
PsとQsのマイニング:ネットワークデバイスでの広範囲にわたる弱いキーの検出(Heninger et al、Usenix Security 2012)のセクション3.3をご覧ください。それらは、製品ツリーと剰余ツリーを使用して、特定の設定で gcdのペアワイズgcdを計算するためのアルゴリズムを記述します。それがあなたの問題にまで及ぶかどうかはわかりませんが。O(nlgn)
DW

素因数分解で何かを試しましたか?
ライアン14

1
すべての数値が比較的素数であるが因数分解が困難であると仮定します(たとえば、大きく異なる素数p iq iの場合、各p i q iに等しい)。次に、すべてのペアワイズGCDをチェックすることを避けるのは難しいようです。(たとえば、s n 1s nすべてのペアをチェックした後、すべてのペアワイズGCDが1であることを伝えます。計算せずにg c d s n 1s nをどのように推測できますか?)sipiqipi,qi(sn1,sn)1gcd(sn1,sn)
usul 2014

@usul DWのリンクはまさに​​その問題です。膨大な数、たとえば10億という暗号化キーはすべて、2つの異なる素数の積でなければなりません。しかし、一部の暗号化キーには共通の素因数があると思われます(これは両方のキーのgcdであり、両方を因数分解しやすくします)。そのアルゴリズムにより、n = 10億に対してn(n-1)/ 2 gcdを計算せずに、共通因子を持つキーを見つけることができます。
gnasher729

回答:


-2

これは効率的なアルゴリズムです(Pythonで)。以下の説明をご覧ください。

def max_gcd_pair(S):
    # Assumption 1: S is the list of numbers
    # Assumption 2: There are no duplicates in S

    s = set(S)
    m = max(S)

    res = 0
    i = m

    while(i > 0):
        a = i
        cnt = 0
        while (a<=m): # a maxed at max of the list
            if a in s:   
               cnt += 1
            a += i

        if cnt >= 2:  # we have found the result
            res = i
            break

        i = i -1 

    return res

上記のコードスニペットの説明:

この問題では、次のことが観察されます。

  1. 結果は次を超えることはできません max(S)
  2. 結果は数値で、このリストに2つ以上の倍数があります S
  3. 実際には、結果はmax上記のプロパティを持つそのようなすべての数値です。

これらの観察により、プログラムは次のことを行います。

  1. 作成しsetたリストのを。セットは効率的に検索できるのでO(log(n))
  2. リストの最大値を見つけて変数に格納しますm
  3. スタートmまで1、セット内の2つのまたはそれ以上の倍数を持っている最初の番号を見つけます。最初に見つかったそのような数は結果です。

これが明確であることを願っています。さらに詳しい説明が必要な場合はお知らせください。


1
アルゴリズムを言葉で説明できますか?これはプログラミングサイトではありません。
Yuval Filmus

@YuvalFilmus説明を追加しました。お役に立てれば。
Subhendu Ranjan Mishra 2017

2
{2,4}

@YuvalFilmus は、の複数の倍数がセットに含まれているかどうかをチェックiするmまで、すべての開始から始まります。この例では、2の2の倍数がセット '2 and 4`にあります。したがって、答えは2です。内側のループは、m`がリストのmasxになるまでのすべてのマルチプルをチェックします。1iwhileim' as
Subhendu Ranjan Mishra 2017

1
x,yn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.