Phép nhân trong


10

Tôi đã tìm kiếm ở đây và tôi nhận thấy thời gian chạy tốt nhất để nhân hai số bit là , nhưng tôi có thể dễ dàng nhận thấy thuật toán chạy trong .O ( n log n 2 O ( log * n ) O ( n log n )nO(nlogn2O(logn)O(nlogn)

Rốt cuộc, chúng ta biết cách nhân hai đa thức từ độ trong thời gian chạy . Nhưng nhân đa thức cũng giống như nhân hai số bit. Vì vậy, chúng tôi có một thuật toán để nhân hai số bit trong . Bây giờ, vấn đề duy nhất có thể xảy ra là mang, nhưng trong mỗi giai đoạn chúng ta có thể khắc phục điều đó trong thời gian , chỉ cần di chuyển trên bit bên phải và hàng xóm bên trái của nó, cho đến khi kết thúc. Đó là, thời gian chạy của chúng tôi sẽ vẫn là .O ( n log n ) n n O ( n log n ) O ( n ) O ( n log n )nO(nlogn)nnO(nlogn)O(n)O(nlogn)

Vì vậy, tôi đã thực hiện một khám phá mới (và khá rõ ràng)? Hoặc là trang wikipedia đã lỗi thời? Hoặc có lẽ tôi có một số sai lầm?


Cách mà "chúng ta biết" "nhân hai đa thức từ độ trong thời gian chạy " là gì? O ( n log n )nO(nlogn)

Câu trả lời:


8

Như @DavidR Richby đã chỉ ra, sự nhầm lẫn xuất hiện do các biện pháp phức tạp khác nhau đang bị lẫn lộn. Nhưng hãy để tôi giải thích một chút.

Thông thường, khi nghiên cứu các thuật toán cho phép nhân đa thức trên các vòng tùy ý, người ta quan tâm đến số lượng các phép toán số học trong vòng mà thuật toán sử dụng. Cụ thể, với một số vòng (giao hoán, đơn nhất) và hai đa thức có độ nhỏ hơn , thuật toán Schönhage-Strassen cần phép nhân và phép cộng trong để tính bằng cách, đại khái, nối liền với các gốc nguyên thủy thứ của sự thống nhất với để có được một số vòng lớn hơn và sau đó, sử dụng Fast Biến đổi Fourier quaf , g R [ X ] n O ( n log n log log n ) R f g R [ X ] n R D R D DRf,gR[X]nO(nlognloglogn)RfgR[X]nRDRD, Tính toán các sản phẩm trong .D

Nếu nhẫn của bạn có chứa một gốc -thứ đoàn kết, thì đây có thể được tăng tốc lên đến hoạt động trong bằng Fast Fourier Transform trực tiếp trên . Cụ thể hơn, qua , bạn có thể thực hiện việc này bằng các thao tác vòng (bỏ qua thực tế là điều này sẽ yêu cầu số học chính xác qua các số phức).O ( n log n ) R R ZC O ( n log n )nO(nlogn)RRZCO(nlogn)

Các biện pháp khác có thể được tính đến là độ phức tạp bit của một hoạt động. Và đây là điều chúng tôi quan tâm khi nhân hai số nguyên có độ dài bit . Ở đây, các hoạt động nguyên thủy được nhân lên và thêm hai chữ số (có mang). Vì vậy, khi nhân hai đa thức trên , bạn thực sự cần phải tính đến thực tế là các số phát sinh trong quá trình tính toán không thể được nhân lên bằng cách sử dụng một số lượng lớn các hoạt động nguyên thủy. Điều này và thực tế là không có gốc nguyên thủy thứ của ngăn bạn sử dụng thuật toán . Bạn khắc phục điều này bằng cách xem xétZ Z n n > 2 O ( n log n ) f , g Z /2 n + 1 n 2 n O ( n log n log log n )nZZnn>2O(nlogn)f,gvới các hệ số từ vòng , vì các hệ số của đa thức sản phẩm sẽ không vượt quá giới hạn này. Ở đó (khi là lũy thừa của hai), bạn có (lớp đồng dạng của) là gốc thứ của đơn vị và bằng cách gọi đệ quy thuật toán để nhân hệ số, bạn có thể đạt được tổng số ) hoạt động nguyên thủy (tức là bit). Điều này sau đó mang đến nhân số nguyên.Z/2n+1n2nO(nlognloglogn)

Đối với một ví dụ đặc biệt làm nổi bật tầm quan trọng của sự khác biệt giữa các hoạt động vòng và hoạt động nguyên thủy, hãy xem xét hai phương pháp để đánh giá đa thức: phương pháp Horner và phương pháp Estrin. Phương thức của Horner đánh giá một đa thức tại một số bằng cách khai thác danh tính trong khi phương thức của Estrin chia thành hai phần và tức là chứa các điều khoản về mức độ và các điều khoản về mức độf=i=0nfiXixZ

f(x)=((fnx+fn1)x++)+f0
f
H=i=1n/2fn/2+iXi
L=i=0n/2fiXi
H>n/2Ln/2(giả sử là lũy thừa của hai, vì đơn giản).n

Sau đó, chúng ta có thể tính bằng và áp dụng thuật toán đệ quy.f(x)

f(x)=H(x)xn/2+L(x)

Cái trước, sử dụng phép cộng và phép nhân, được chứng minh là tối ưu cho số lần bổ sung và phép nhân (nghĩa là các phép toán vòng), cái sau cần nhiều hơn (ít nhất là ).nn+logn

Nhưng, ở mức độ hoạt động của bit, người ta có thể (khá dễ dàng) cho thấy trong trường hợp xấu nhất, phương pháp của Horner thực hiện phép nhân số lượng kích thước ít nhất là , dẫn đến nhiều bit các hoạt động (điều này giữ ngay cả khi chúng tôi giả sử rằng hai số -bit có thể được nhân lên trong thời gian ), trong khi sơ đồ của Estrin sử dụng các hoạt động cho một số , cho đến nay, nhanh hơn là không có triệu chứng.n / 2 Ω ( n 2 ) n O ( n ) O ( n log c n ) = ~ O ( n ) c > 0n/2n/2Ω(n2)nO(n)O(nlogcn)=O~(n)c>0


9

Nói rằng bạn có thể nhân hai đa thức bậc trong thời gian ngụ ý rằng, đặc biệt, bạn có thể nhân các đa thức bậc 0, tức là hằng số, trong thời gian không đổi. Rõ ràng, do đó, những tuyên bố "nhân số bit cần có thời gian " và "nhân degree- đa thức đòi hỏi thời gian " là tương đối cho các mô hình tính toán khác nhau để không thể so sánh trực tiếp.O ( n log n ) n O ( 2 log n n log n ) n O ( n log n )nO(nlogn)nO(2lognnlogn)nO(nlogn)


5
Tôi không nghĩ đây là vấn đề. Nếu chúng ta nghĩ về các số là đa thức có "x" là cơ sở, ví dụ 2, thì thông thường chúng ta có thể nhân các đa thức bậc 0 (số nhỏ hơn cơ sở) trong thời gian không đổi. Tôi đoán vấn đề là thuật toán O (n * log n) sử dụng FFT và các số lớn hơn bất thường có thể xuất hiện bên trong thuật toán FFT.
jkff
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.