Chúng ta có thể tính từ các bit của trong thời gian không?


11

Tôi đang tìm kiếm một thuật toán hiệu quả cho vấn đề:

Dữ liệu vào : Số nguyên dương (được lưu dưới dạng bit) cho một số số nguyên .3nn0

Đầu ra : Số .n

Câu hỏi : Chúng ta có thể tính từ các bit của trong thời gian không?n3nO(n)


Đây là một câu hỏi lý thuyết được thúc đẩy bởi câu trả lời của tôi cho một câu hỏi toán học. Câu hỏi làm thế nào để tìm một công thức cho sự lựa chọn này? . Trong câu hỏi này, tác giả muốn tìm một mệnh đề từ và các số tự nhiên . Tôi đã đề xuất như một giải pháp. Một câu trả lời khác khẳng định "không có công thức đơn giản", điều này khiến tôi tự hỏi làm thế nào (tính toán) đơn giản giải pháp đề xuất của tôi là.

{2n3m:n0 and m0}
N={1,2,}
2m3n2m(2n+1)

Với giải pháp đề xuất của tôi, nếu chúng ta biết và , chúng ta có thể dễ dàng tính (viết các chữ số nhị phân của theo sau là số 0 theo sau là số 0). Điều này mất thời gian .m 2 m ( 2 n + 1 ) n 1 m O ( n + m )nm2m(2n+1)n1mO(n+m)

Tìm từ các bit của để tìm ra bit có ý nghĩa nhỏ nhất (có thể được tính bằng cách đếm các dịch chuyển bit phải, để lại trong bộ nhớ). Điều này mất thời gian .2 m 3 n 3 n O ( m )m2m3n3nO(m)

Tuy nhiên, chúng ta cũng cần tìm , có thể khó khăn hơn. Có thể tìm thấy bằng cách chia , nhưng điều này có vẻ lãng phí. Nó đòi hỏi thao tác chia, mỗi thao tác sẽ mất thời gian , vì vậy đây là tổng thời gian . [Trên thực tế, sau mỗi lần lặp, số chữ số sẽ giảm tuyến tính, nhưng điều này vẫn dẫn đến thời gian .]n 3 n O ( n ) O ( n 2 ) O ( n 2 )nn3nO(n)O(n2)O(n2)

Có vẻ như chúng ta sẽ có thể khai thác khi biết đầu vào là sức mạnh của .3


2
Mô hình chính xác của bạn tính toán là gì? Những hoạt động được phép trong thời gian ? (Nếu chúng ta có thể thực hiện số học với các số như thì nó sẽ khá hữu ích ...)log 2 3O(1)log23
Yuval Filmus

3
Downvoter có thể giải thích downvote? Nó dường như không phải là một câu hỏi nhỏ. Thời gian chạy tốt nhất theo mô hình tính toán hợp lý là gì?
Yuval Filmus

1
Tôi đang tưởng tượng các băng có 0, 1 và các ô trống (với số lượng băng vô hạn). Tôi muốn chuyển đổi một bit và các hoạt động dịch chuyển trái / phải để chạy trong thời gian . (Nếu chúng ta có một điểm đánh dấu bit thứ 0 trên một băng vô hạn, thì việc dịch chuyển trái / phải được thực hiện bằng cách dịch chuyển điểm đánh dấu). Không giống như máy Turing, tôi không muốn nó mất thời gian để di chuyển con trỏ. Vì vậy, "chuyển đổi bit 0" mất cùng thời gian với "chuyển đổi bit thứ 124126". O(1)
Rebecca J. Stones

Nó có thể liên quan đến câu hỏi
J.-E.

Là giới hạn dưới của rõ ràng? Ω(n)
Boris Bukh

Câu trả lời:


9

Cách tiếp cận rõ ràng là:

(1) Tính xấp xỉ với . Bạn có thể ước tính nó trong phạm vi sai số cộng 1 bằng cách đếm số bit trong biểu diễn nhị phân đã cho và trong lỗi cộng gộp của bằng cách nhìn vào đầu bit của đầu vào. Cần chọn giá trị không đổi là , sao cho (sau khi kết hợp với lỗi ở bước (2)), kết quả cuối cùng kết thúc với sai số cộng là .ε O ( log 1log2(3n)ϵε1/2O(log1ϵ)ϵ1/2

(2) Tính xấp xỉ với . Tôi không quen thuộc với các thuật toán cho điều này nhưng tôi hy vọng chúng sẽ mất nhiều thời gian về số lượng độ chính xác mà bạn cần và bạn chỉ cần các bit chính xác.O ( log n )log2(3)O(logn)

(3) Chia câu trả lời cho (1) cho câu trả lời cho (2) và làm tròn đến số nguyên gần nhất.

Vì vậy, bước đầu tiên cần có thời gian tuyến tính (trong hầu hết các mô hình tính toán mặc dù có thể không dành cho một số máy bị thiếu năng lượng như máy Turing một đầu ) và các bước còn lại phải là polylogarithmic.


3
Tôi tin rằng việc tính toán đến bit chính xác cần có thời gian , trong đó là thời gian để nhân số -bit. Xem Brent - Zimmermann, loria.fr/~zimmerma/mca/pub226.htmllog2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
Ryan O'Donnell

Cảm ơn đã tham khảo, và xin lỗi vì đã quá lười biếng để tự tìm kiếm nó.
David Eppstein

9

Đối với bất kỳ số nguyên , viết trong nhị phân yêu cầu chính xác các bit . Một số đại số cơ bản ngụ ý rằng Đối với bất kỳ độ dài bit , có nhiều nhất một số nguyên trong phạm vi này. Như vậy, với một sức mạnh không thể thiếu trong đó là bit dài, số mũ phải là số nguyên n>03nL=log2(3n)+1L13Ln=L-1

L2log23nL1log23.
L13L
n=L1log23.

4

Đây là một cách tiếp cận khác. Cho các chữ số thấp của , bạn có thể học và do đó . Có vẻ như là một trình tạo modulo (nghĩa là có thứ tự ).k3n3nmod10k 3 5 k 3 φ ( 5 k ) = 5 k - 1 × 43nmod5k35k3φ(5k)=5k1×4

Do đó, bằng cách sử dụng nhật ký rời rạc và nâng Hensel, tôi nghĩ bạn sẽ có thể tính toán từ các chữ số thấp của rất hiệu quả. Nói cách khác, bạn bắt đầu bằng cách tính từ chữ số thấp , bằng cách lấy nhật ký rời rạc của đến cơ sở , modulo ; điều này cho thấy và có thể được thực hiện trong thời gian . Sau đó, bạn tìm thấy nhật ký rời rạc của đến cơ sở , modulo ; điều này cho thấy và có thể được thực hiện trongnmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod25e25nmod20O(1) thời gian (tận dụng kiến ​​thức của , chỉ có khả năng bạn phải thử). Lặp đi lặp lại. Ở mỗi bước, bạn sử dụng kiến ​​thức về để giúp bạn tính toán hiệu quả nhật ký rời rạc của , sử dụng thực tế là chỉ có giá trị có thể cho .nmod45nmodφ(5k1)3nmod5kn mod φ ( 5 k )5nmodφ(5k)

Bây giờ chỉ cần để đủ lớn, và điều này cho thấy .nkn

Bạn sẽ cần biết liệu thời gian chạy có phải là , nhưng có vẻ như tôi có thể như vậy. Tôi nghi ngờ nó đủ để cho và tôi nghi ngờ bạn có thể thực hiện mỗi lần lặp trong thời gian , trong tổng thời gian .k = O ( n ) O ( 1 )O(n)k=O(n)O(1)O(n)

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.