Để mở rộng theo ý tưởng của Steven Stadnicki, chúng ta có thể nhanh chóng xây dựng một thuật toán ngây thơ, tốt hơn so với phép nhân ma trận bằng cách sử dụng Biến đổi Fourier rời rạc.
Chúng tôi đếm số người thân trong . Nếu ít hơn một nửa số bit là các bit, chúng tôi xây dựng một danh sách liên kết các vị trí của chúng. Để nhân, chúng ta chỉ cần dịch chuyển sang trái theo từng vị trí trong danh sách (nhân với bit đó được biểu thị) và thêm kết quả.BAB
Nếu hơn một nửa số bit là các bit, chúng ta sẽ làm tương tự như trên, nhưng chúng ta sử dụng các số 0 thay vào đó để điền vào danh sách các vị trí. Ý tưởng là chúng ta sẽ trừ tổng này khỏi tổng sẽ có được bằng cách nhân với tất cả các số đó. Để lấy tổng của tất cả các số, chúng ta dịch chuyển theo số bit trong và trừ khỏi số này. Sau đó, chúng tôi có thể trừ tổng của chúng tôi thu được từ danh sách được liên kết.A BBAB
Chúng ta có thể gọi đó là thuật toán danh sách liên kết ngây thơ. Thời gian chạy của nó là trong trường hợp xấu nhất, nhưng trong trường hợp trung bình, nhanh hơn DFT cho nhỏ.O ( | B | √O(n2)| Một|O(|B||A|2π−−−√)|A|
Để sử dụng ý tưởng của danh sách một cách tối ưu, chúng tôi sử dụng phân chia và chinh phục. Chúng tôi chia đôi và tìm kích thước của các danh sách liên quan bằng thuật toán ngây thơ. Nếu chúng lớn hơn 5, chúng ta gọi lại thuật toán ngây thơ trên một nửa lớn hơn 5 cho đến khi chúng ta quản lý để cắt tất cả các nửa xuống dưới năm. (Điều này là do chúng ta có thể giảm xuống còn 4 phép trừ)A
Thậm chí tốt hơn nữa, chúng tôi cải thiện thuật toán phân chia và chinh phục của chúng tôi. Chúng tôi lặp đi lặp lại qua tất cả các kết hợp phân nhánh có thể, tham lam chọn cái tốt nhất. Quá trình tiền xử lý này mất khoảng thời gian tương đương với phép nhân thực tế.
Nếu chúng tôi được phép tự do vô hạn với tiền xử lý, chúng tôi sẽ giải quyết thuật toán phân chia và chinh phục tối ưu cho tất cả các nhánh một cách tối ưu. Điều này làm mất thời gian trong trường hợp xấu nhất, nhưng nó phải ~ tối ưu bằng các phương pháp chuỗi bổ sung.O(2|A|)
Tôi đang làm việc để tính toán các giá trị chính xác hơn cho các thuật toán trên.