一対の製品のGCD


8

私には2つの数値があり、それぞれが私が知っている多数の小さい数値の積です。これら2つの数値のGCD(最大公約数)を見つけたい。プロセスを高速化するために必要な部分分解を利用する方法はありますか?

特に、大きい数値はそれぞれ小さい数値の積であり、それぞれの数値は2 ^ {4000}のオーダーです。小さい数の因数分解については何も知りません。21524000

編集:入力数は約120,000,000ビットですが、GCDは約500,000ビットです。数字の要素は特に順番に並んでいます。それらはすべて連続した範囲の整数です。

私が見たすべてのGCDアルゴリズムは、部分的に因数分解された形式などではなく、直接数値を使用します。この情報を組み込んでスピードアップできるアルゴリズムはありますか?


それで、明確にするために、あなたの製品は130,000,000ビットのようなものを持っていますか?私はなぜあなたがその大きさの数のGCDを見つけたいのかについてちょっと興味があります。
David Richerby 2017年

@DavidRicherbyそうです。私は、人々が暗号システムを上に構築した暗号問題である、おおよそのGCD問題を解決する方法を試みています。本当に巨大なGCD問題を解決することは、適切なサイズの近似GCD問題を解決する1つの方法です。
isaacg 2017年

1
おそらく関連:cs.stackexchange.com/q/75387/755cs.stackexchange.com/q/28044/755factorable.net/weakkeys12.extended.pdfcr.yp.to/factorization/smoothparts-20040510.pdfcr.yp.to/smallfactors.htmlcr.yp.to /lineartime / dcba-20040404.pdf。漸近的には、ほぼ線形の時間でgcdを計算できます。したがって、含まれている定数により漸近が誤解を招く可能性があるため、実際にはあるかもしれませんが、漸近についてのみ考えれば、高速化の余地はありません。
DW

@DW現在、GMPのほぼ線形のGCDアルゴリズムを使用しています。
isaacg 2017年

回答:


1

因子のペアワイズGCDを計算できます。同じGCD因子を2回検出しないようにするには、因子からGCDを分割する必要があります。

a[1...m] = [given factors of A]
b[1...n] = [given factors of B]
g = 1
for i from 1 to m do
    c = a[i]
    for j from 1 to n do
        d = gcd(c, b[j])
        g = g * d
        c = a[i] / d
        b[j] = b[j] / d
return g

残念ながら、これは2つの数値AとBのGCDの計算よりも著しく高速ではないと思います。


0

合理的に効率的に解決された同様の問題がありました。RSAを使用していると仮定します。RSAはすべて、2つの大きな素数の製品に基づいて構築されており、製品を適度に時間で分解できません。しかし、2つの積pqとp'q 'があり、p = p'またはq = q 'のいずれかである場合、それらのgcdを計算してp​​ = p'またはq = q 'を取得でき、他の因子は自明です。もちろん、p = p 'およびq = q'の場合、これは役に立ちません。

誰かがそのような製品を10億個生成し、少し不注意であるとは想像できません。ハッカーは、かなりの数が同一であることを知っているため、p = p 'とq = q'なので、かなりの数のペアがgcd≠1を持っていると考えられます。結果としてひび割れます。

申し訳ありませんが、参照はありません。ストーリーは少し古いですが、見つけることができるはずです。数年前、おそらく6年かそこらだった。


残念ながら、2つの数値の要素はどれも同じではないので、そのように取り除くことはできません。
isaacg 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.