Phép nhân số nguyên khi một số nguyên được cố định


35

Đặt là số nguyên dương cố định có kích thước bit.nAn

Người ta được phép xử lý trước số nguyên này khi thích hợp.

Cho một số nguyên dương có kích thước bit, độ phức của phép nhân bao nhiêu?m A BBmAB

Lưu ý rằng chúng tôi đã có . Truy vấn ở đây là liệu chúng ta có thể lấy \ epsilon = 0 bằng cách nào thông minh hơn không? ε = 0(max(n,m))1+ϵϵ=0


6
Cho A , chỉ cần xây dựng bảng tra cứu với 2n mục. (Rõ ràng đây không phải là điều bạn muốn, nhưng tôi nghĩ bạn nên làm cho yêu cầu của mình cụ thể hơn ...)
Jukka Suomela

9
Tôi nghĩ rằng câu hỏi có ý nghĩa hoàn hảo trong mô hình mạch Boolean tiêu chuẩn.
Noam

4
Bạn có thể tóm tắt các giới hạn trên và dưới rõ ràng, và kết quả tốt nhất mà bạn biết? Điều đó cho thấy rằng bạn quan tâm đến vấn đề và bạn đã nghĩ về nó, và nó mang lại cho mọi người nhiều động lực hơn để suy nghĩ về vấn đề của bạn.
Robin Kothari

4
Tôi nghĩ rằng người hỏi ngầm có nghĩa là phần được xử lý trước phải chỉ chiếm không gian nO(1) . (Đa ma trận-vector có thuộc tính đó.)
Ryan Williams

Tôi chỉ muốn biết những gì bạn thích; Tôi cảm thấy như tôi có thể trải qua những trường hợp bất tận về điều này. Đây là câu trả lời đầu tiên của tôi, vì vậy tôi đặc biệt vui khi cố gắng cung cấp cho bạn nhiều thông tin nhất có thể. Nếu bạn muốn, bạn có thể gửi email cho tôi theo địa chỉ mgroff100@hotmail.com và tôi rất vui được làm việc với bạn nhiều hơn nữa.
Matt Groff

Câu trả lời:


20

Mặc dù nó sẽ không phải là thuật toán hiệu quả nhất, câu hỏi này có mối quan hệ rất chặt chẽ với các chuỗi bổ sung; bất kỳ thuật toán nào để tính toán nhanh chóng bằng các chuỗi bổ sung sẽ chuyển thành một thuật toán để tính toán bằng phép cộng lặp lại (tất nhiên, mỗi phép cộng là một phép toán ). Ngược lại, một thuật toán nhanh để tính toán cho bất kỳ nào dẫn đến một thuật toán nhanh để tính toán , nhưng tất nhiên thuật toán này không nhất thiết phải có dạng chuỗi bổ sung; Tuy nhiên, đó dường như là một nơi tuyệt vời để bắt đầu. Hãy xem http://en.wikipedia.org/wiki/Addition_chain hoặc xem vol. 2 trong sốf ( B ) = A B O ( n ) A B B AAf(B)=ABO(n)ABBANghệ thuật lập trình máy tính để biết thêm chi tiết.


17

Để 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.


Xin chào Matt:và? | B ||A||B|
T ....

|A|là kích thước của , về cơ bản là số phần tử trong . Điều này tương đương với của bạn , tức là . Tương tự cho. Tuy nhiên, công thức này vẫn giữ khi là khác nhau cho và . AAn|A|n|B|nAB
Matt Groff

17

Bài báo có tên Phép nhân theo hằng số là tuyến tính ( PDF ) đưa ra thuật toán cho các thao tác dịch chuyển / bổ sung, trong đó là kích thước của hằng số .O(nlogn)n

Về cơ bản, nó hoạt động bằng cách tìm kiếm bit trong hằng số, dịch chuyển và thêm số chỉ được nhân cho bit đó trong hằng số (như phép nhân dài cho nhị phân, trong đó một số trong số dưới cùng được nhân đỉnh không được dịch chuyển và thêm vào, trong khi bit có nghĩa là đỉnh được dịch chuyển và thêm vào). Tuy nhiên, đây vẫn là , vì có thể có bit trong hằng số.1101O(n)O(n) 1

Bài báo sau đó nói về việc thay đổi đại diện số của hằng số thành hệ thống số cơ sở kép, trong đó rõ ràng, các bit không là sperer, nếu việc chuyển đổi được thực hiện chính xác (đó là một hệ thống số rất dư thừa). Họ tính toán mức độ thưa thớt của nó; số lượng bit khác không được giới hạn ở mức nhỏ hơn , do đó cần có một số bổ sung tuyến tính phụ. Tuy nhiên, đó vẫn là , do chi phí của mỗi phép cộng (trong đó là kích thước của hằng số, và là kích thước của số khác).0O(n)O(nmlogn)O(m)nm

Vì vậy, để trả lời câu hỏi của bạn, vâng, có một kết quả tương tự với phép nhân vectơ ma trận, trong đó bạn nhận được một speedup nếu nó không đổi; nhưng tất nhiên việc tăng tốc này chỉ là phép nhân dài ngây thơ và tồn tại các thuật toán nhân tốt hơn nhiều so với bạn có thể nhận được thuật toán này.lognO(n2logn)


@JAS đó là chuyên môn của tôi: D.
Realz Slaw

3
Điều này đã xuất hiện trong ARITH 2007 với tên dx.doi.org/10.1109/ARITH.2007.24 (để hoàn thiện).
András Salamon

10

Theo đề xuất của Matt Groff, bạn có thể quan tâm đến việc xem xét cộng đồng thực hành để lấy cảm hứng (hoặc nếu trong tình huống của bạn nằm trong chiều rộng bit của CPU hiện tại). Thật vậy, vấn đề nhân số nguyên với một hằng số đã được nhiều nhà văn và nhà thiết kế mạch biên dịch xem xét, mặc dù họ thường quan tâm đến "số nhân không nhân" (nhân bằng cách sử dụng shift, cộng và trừ). Một trong những tài liệu tham khảo ban đầu mà tôi biết là (Tôi đã học được điều này từ phần Hightight của 8.4.):n

Bernstein, R. (1986), Nhân với hằng số nguyên. Phần mềm: Thực hành và Kinh nghiệm, 16: 641 Ném652. doi: 10.1002 / spe.4380160704

Tác phẩm hiện đại hơn của Vincent Lefèvre có thể được tìm thấy ở đây (chắc chắn sẽ thấy các tác phẩm tiếp theo của anh ấy), và anh ấy cũng lưu ý một dự án CMU về tổng hợp mạch hiệu quả (xem các tài liệu tham khảo ở đó). Dự án sau thậm chí xem xét nhân đồng thời bởi một tập các hằng số.

PS Tôi khuyến khích bạn xem xét việc thay đổi tên người dùng của bạn thành một cái gì đó dễ nhận biết.


8

Tôi không chắc liệu điều này có liên quan trực tiếp đến câu hỏi hay không, nhưng kết quả cơ bản sau đây có thể được quan tâm. Với một số tự nhiên cố định , thao tác có thể được nhận ra bằng một máy tự động tuần tự, với điều kiện được viết bằng ký hiệu nhị phân đảo ngược (nghĩa là Bit tối thiểu đáng kể đầu tiên). Số trạng thái của máy tự động là trong đó là công suất lớn nhất của chia . Chẳng hạn, thao tác được thực hiện bằng máy tự động sau. knknnk/2r2r2kn6nnhập mô tả hình ảnh ở đây

Chẳng hạn, và . Do đó, trong nhị phân ngược, được viết là và (lựa chọn tồi, tôi biết ...) là . Xử lý mục nhập trên thiết bị tự động này cung cấp đường dẫn 185=1+8+16+32+1286×185=1110=2+4+16+64+10241851001110111100110101000110011101 01101010001

0011101000011110211200110201
cung cấp đầu ra chính xác . Loại máy tự động tuần tự mà tôi đang sử dụng ở đây được Schützenberger gọi là thế hệ sau : như bạn có thể thấy có một tiền tố ban đầu (màu xanh lá cây) và chức năng đầu ra cuối01101010001(cũng có màu xanh lá cây). Để biết thêm chi tiết cách máy tính tuần tự này có thể được tính toán một cách có hệ thống, xem liên kết này .

Bạn có thể giải thích về nhận xét của bạn?
J.-E.

> 2k là số nguyên tố . >2
T ....

Việc xây dựng một máy tự động tuần tự thực hiện thao tác có thể được thực hiện cho bất kỳ . Tuy nhiên, tính toán máy tự động này có thể dễ dàng hơn cho Prime. k knknkk
J.-E.

k2r là cấp số nhân.
T ....

nk là hằng số cố định, không liên quan đến . n
J.-E.
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.