GCD của một cặp sản phẩm


8

Tôi có hai số, mỗi số là sản phẩm của một số lượng lớn các số nhỏ hơn mà tôi biết. Tôi muốn tìm GCD (ước số chung lớn nhất) của hai số này. Có cách nào tôi có thể sử dụng nhân tố một phần mà tôi có để tăng tốc quá trình không?

Đặc biệt, mỗi số lớn hơn là tích của số nhỏ hơn, mỗi số theo thứ tự 2 4000 . Tôi không biết gì về hệ số của các số nhỏ hơn.21524000

Chỉnh sửa: Trong khi các số đầu vào khoảng 120.000.000 bit, GCD là khoảng 500.000 bit. Các yếu tố của các con số đặc biệt theo thứ tự. Họ là tất cả các số nguyên trong một phạm vi liên tiếp.

Tất cả các thuật toán GCD mà tôi thấy đều sử dụng các con số trực tiếp, không phải ở dạng bao thanh toán một phần hay bất cứ thứ gì. Có thuật toán nào có thể kết hợp thông tin này để tăng tốc mọi thứ không?


Vì vậy, để rõ ràng, các sản phẩm của bạn có gì đó như 130.000.000 bit? Tôi hơi tò mò về lý do tại sao bạn muốn tìm GCD với số lượng lớn như vậy.
David Richerby

@DavidR Richby Đúng vậy. Tôi đang thử các cách giải quyết vấn đề GCD gần đúng, đây là một vấn đề về mật mã mà mọi người đã xây dựng các hệ thống mật mã trên đầu trang. Giải quyết các vấn đề GCD thực sự lớn là một cách để giải quyết các vấn đề GCD gần đúng có kích thước hợp lý.
isaacg

1
Có thể liên quan: 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 . Không có triệu chứng, bạn có thể tính toán gcd trong thời gian gần tuyến tính, do đó, không có nhiều khả năng tăng tốc nếu chúng ta chỉ quan tâm đến sự không triệu chứng, mặc dù có thể có trong thực tế, vì sự không triệu chứng có thể gây hiểu lầm do các hằng số liên quan.
DW

@DW Tôi hiện đang sử dụng thuật toán GCD gần tuyến tính của GMP.
isaacg

Câu trả lời:


1

Bạn có thể tính toán các GCD cặp của các yếu tố. Bạn phải chia GCD ra khỏi các yếu tố để tránh tìm cùng một yếu tố GCD hai lần:

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

Thật không may, tôi không nghĩ rằng điều này không nhanh hơn đáng kể so với tính toán GCD của hai số A và B.


0

Có một vấn đề tương tự đã được giải quyết một cách hợp lý hiệu quả: Giả sử bạn đang sử dụng RSA, tất cả được xây dựng trên các sản phẩm của hai số nguyên tố lớn, trong đó các sản phẩm không thể được cung cấp trong thời gian hợp lý. Nhưng nếu bạn có hai sản phẩm pq và p'q 'và p = p' hoặc q = q 'thì bạn có thể tính gcd của chúng và nhận p = p' hoặc q = q 'và yếu tố khác là tầm thường. Tất nhiên nếu p = p 'và cả q = q' thì điều này không có ích.

Không thể tưởng tượng được ai đó tạo ra một tỷ sản phẩm như vậy và hơi bất cẩn. Một tin tặc phát hiện ra rằng có khá nhiều số giống hệt nhau, vì vậy p = p 'và q = q', do đó, có thể đoán rằng khá nhiều cặp có gcd ≠ 1. Và điều đó đã xảy ra trong cuộc sống thực với các bộ định tuyến có thể mã hóa Kết quả là bị nứt.

Xin lỗi, tôi không có bất kỳ tài liệu tham khảo nào và câu chuyện hơi cũ, nhưng bạn sẽ có thể tìm thấy nó. Đã một vài năm trước, có thể sáu hoặc hơn.


Thật không may, không có yếu tố nào trong hai số đó bằng nhau, vì vậy tôi không thể loại bỏ chúng theo cách đó.
isaacg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.