GCD sepasang produk

8

Saya memiliki dua angka, yang masing-masing merupakan produk dari sejumlah besar angka yang lebih kecil yang saya tahu. Saya ingin mencari GCD (Pembagi umum terbesar) dari dua angka ini. Apakah ada cara saya dapat memanfaatkan faktorisasi parsial yang saya harus mempercepat prosesnya?

Secara khusus, setiap angka yang lebih besar adalah produk 215 angka yang lebih kecil, masing-masing sesuai urutan 24000. Saya tidak tahu apa-apa tentang faktorisasi angka yang lebih kecil.

Sunting: Sementara angka input sekitar 120.000.000 bit, GCD adalah sekitar 500.000 bit. Faktor-faktor angka khususnya dalam urutan. Mereka semua bilangan bulat dalam rentang yang berurutan.

Semua algoritme GCD yang saya lihat memanfaatkan angka-angka secara langsung, bukan dalam bentuk sebagian atau apa pun. Apakah ada algoritma yang dapat memasukkan informasi ini untuk mempercepat?

isaacg
sumber
Jadi, untuk memperjelas, produk Anda memiliki sekitar 130.000.000 bit? Saya agak ingin tahu tentang mengapa Anda ingin menemukan GCD dengan jumlah sebesar itu.
David Richerby
@ DavidRicherby Itu benar. Saya mencoba cara memecahkan masalah GCD perkiraan, yang merupakan masalah kriptografi yang orang telah membangun cryptosystems di atas. Memecahkan masalah GCD yang sangat besar adalah salah satu cara untuk memecahkan masalah GCD yang diperkirakan berukuran cukup besar.
isaacg
1
Mungkin terkait: cs.stackexchange.com/q/75387/755 , cs.stackexchange.com/q/28044/755 , factorable.net/weakkeys12.extended.pdf , cr.yp.to/factorization/smoothparts-20040510.pdf , cr.yp.to/smallfactors.html , cr.yp.to/lineartime/dcba-20040404.pdf . Secara asimptotik, Anda dapat menghitung gcd dalam waktu hampir linier, sehingga tidak ada satu ton ruang untuk percepatan jika kita hanya peduli pada asimptotik, meskipun mungkin ada dalam praktiknya, karena asimptotik mungkin menyesatkan karena konstanta yang terlibat.
DW
@ WD Saat ini saya menggunakan algoritma GCD near-linear GMP.
isaacg

Jawaban:

1

Anda dapat menghitung GCD berpasangan dari faktor-faktor tersebut. Anda harus membagi GCD dari faktor-faktor untuk menghindari menemukan faktor GCD yang sama dua kali:

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

Sayangnya, saya tidak berpikir bahwa ini tidak terlalu cepat daripada perhitungan GCD dari dua angka A dan B.

clemens
sumber
0

Ada masalah serupa yang telah diselesaikan dengan cukup efisien: Asumsikan Anda menggunakan RSA yang semuanya dibangun pada produk dari dua bilangan prima besar, di mana produk tidak dapat diperhitungkan dalam waktu yang wajar. Tetapi jika Anda memiliki dua produk pq dan p'q 'dan p = p' atau q = q 'maka Anda dapat menghitung gcd mereka dan mendapatkan p = p' atau q = q 'dan faktor lainnya sepele. Tentu saja jika p = p 'dan juga q = q' maka ini tidak membantu.

Tidak ada yang membayangkan seseorang menghasilkan satu miliar produk seperti itu dan sedikit ceroboh. Seorang hacker menemukan bahwa beberapa angka identik, jadi p = p 'dan q = q', jadi itu adalah dugaan yang baik bahwa beberapa pasangan memiliki gcd ≠ 1. Dan itu telah terjadi dalam kehidupan nyata dengan router yang enkripsi yang dapat retak sebagai hasilnya.

Maaf, saya tidak punya referensi dan ceritanya agak lama, tetapi Anda harus dapat menemukannya. Beberapa tahun yang lalu, mungkin sekitar enam tahun.

gnasher729
sumber
Sayangnya, tidak ada satu pun faktor dari kedua angka yang sama, jadi saya tidak bisa menghilangkannya.
isaacg