เราสามารถคำนวณจากจำนวนบิตในเวลาหรือไม่?


11

ฉันกำลังค้นหาอัลกอริทึมที่มีประสิทธิภาพสำหรับปัญหา:

การป้อนข้อมูล : จำนวนเต็มบวก (เก็บไว้เป็นบิต) สำหรับจำนวนเต็มบาง03nn0

เอาท์พุท : จำนวนnn

คำถาม : เราสามารถคำนวณจากบิตในเวลาหรือไม่?n3nO(n)


นี่เป็นคำถามเชิงทฤษฎีที่กระตุ้นโดยคำตอบของฉันสำหรับคำถามทางคณิตศาสตร์ SE จะค้นหาสูตรสำหรับ bijection นี้ได้อย่างไร . ในคำถามนี้ผู้เขียนต้องการหา bijection จากและตัวเลขธรรมชาติ\} ฉันเสนอเป็นวิธีแก้ปัญหา มีคำตอบอีกข้อหนึ่งที่ยืนยันว่า "ไม่มีสูตรง่าย ๆ " ซึ่งทำให้ฉันสงสัยว่าวิธีแก้ปัญหาที่ฉันเสนอนั้นง่ายแค่ไหน

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

ด้วยวิธีแก้ปัญหาที่เสนอของฉันถ้าเรารู้ว่าและเราสามารถคำนวณได้อย่างง่ายดาย (เขียนเลขฐานสองของตามด้วยตามด้วย zeroes) นี้จะใช้เวลาเวลาnm2m(2n+1)n1mO(n+m)

การค้นหาจากบิตจำนวนเพื่อค้นหาบิตที่มีนัยสำคัญน้อยที่สุด (ซึ่งสามารถคำนวณได้โดยการนับการเลื่อนบิตขวา, ทิ้งไว้ในหน่วยความจำ) นี้จะใช้เวลาเวลาm2m3n3nO(m)

อย่างไรก็ตามเราต้องหาซึ่งอาจจะยากขึ้น มันจะเป็นไปได้ที่จะหาโดยหารด้วยซ้ำ ๆแต่มันดูสิ้นเปลือง ต้องใช้การดำเนินการหารซึ่งแต่ละรายการจะใช้เวลาดังนั้นนี่คือเวลาทั้งหมด[ที่จริงแล้วหลังจากแต่ละรอบซ้ำจำนวนหลักจะลดลงเป็นเส้นตรง แต่สิ่งนี้ยังคงส่งผลให้เวลา ]nn3nO(n)O(n2)O(n2)

ดูเหมือนว่าเราควรจะสามารถใช้ประโยชน์จากการรู้เข้าเป็นอำนาจของ33


2
รูปแบบการคำนวณที่แน่นอนของคุณคืออะไร? การดำเนินงานสิ่งที่ได้รับอนุญาตในเวลาหรือไม่ (ถ้าเราสามารถคำนวณทางคณิตศาสตร์ด้วยตัวเลขเช่นมันจะมีประโยชน์มาก ... )บันทึก2 3O(1)log23
Yuval Filmus

3
downvoter สามารถอธิบาย downvote ได้หรือไม่? ดูเหมือนจะเป็นคำถามที่ไม่สำคัญเลย เวลาทำงานที่ดีที่สุดภายใต้รูปแบบการคำนวณที่เหมาะสมคืออะไร
Yuval Filmus

1
ฉันจินตนาการถึงเทปที่มี 0, 1 และเซลล์ว่างเปล่า (ที่มีจำนวนไม่ จำกัด จำนวนเทป) ฉันต้องการสลับบิตเดียวและซ้าย / ขวาขยับการดำเนินงานที่จะทำงานในเวลา (ถ้าเรามีเครื่องหมายที่ 0 บิตบนเทปไม่มีที่สิ้นสุดแล้วการเลื่อนซ้าย / ขวาจะทำได้โดยการเลื่อนเครื่องหมาย) ต่างจากเครื่องทัวริงฉันไม่อยากให้มันขยับตัวชี้ ดังนั้น "สลับบิตที่ 0" จึงใช้เวลาเหมือนกับ "สลับบิตที่ 124126" O(1)
Rebecca J. Stones

อาจเกี่ยวข้องกับคำถาม
J.

ขอบเขตล่างของชัดเจนหรือไม่? Ω(n)
Boris Bukh

คำตอบ:


9

วิธีการที่ชัดเจนคือ:

(1) การคำนวณการประมาณที่จะn) คุณสามารถประมาณได้ภายในข้อผิดพลาดเพิ่มเติมของ 1 โดยการนับจำนวนบิตในการแสดงไบนารีที่กำหนดและภายในข้อผิดพลาดเพิ่มเติมของโดยดูที่ด้านบนบิตของอินพุต มันควรจะเพียงพอที่จะเลือกค่าคงที่ของดังนั้น (หลังจากรวมกับข้อผิดพลาดในขั้นตอน (2)) ผลลัพธ์สุดท้ายจะสิ้นสุดลงภายในข้อผิดพลาดเพิ่มเติมของถูกต้องϵ O ( บันทึก1)log2(3n)ϵε1/2O(log1ϵ)ϵ1/2

(2) การคำนวณการประมาณที่จะ(3) ฉันไม่คุ้นเคยกับอัลกอริธึมสำหรับเรื่องนี้ แต่ฉันคาดว่าพวกมันใช้เวลาพหุนามในจำนวนบิตความแม่นยำที่คุณต้องการและคุณต้องการเพียงบิตความแม่นยำO ( log n )log2(3)O(logn)

(3) แบ่งคำตอบเป็น (1) โดยคำตอบไปที่ (2) และปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุด

ดังนั้นขั้นตอนแรกต้องใช้เวลาเชิงเส้น (ในแบบจำลองส่วนใหญ่ของการคำนวณแม้ว่าอาจจะไม่ใช่สำหรับบางคนที่มีกำลังต่ำเช่นเครื่องทัวริงหัวเดียว ) และขั้นตอนที่เหลือควรเป็นโพลี


3
ผมเชื่อว่าการคำนวณเพื่อบิตของความแม่นยำต้องใช้เวลาที่เป็นเวลาที่จะคูณตัวเลข -bit ดูเบรนต์ - Zimmermann, loria.fr/~zimmerma/mca/pub226.htmlt O ( M ( t ) log t ) M ( t ) O ( t log t 2 log t ) tlog2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
Ryan O'Donnell

ขอบคุณสำหรับการอ้างอิงและขอโทษที่ขี้เกียจเกินไปที่จะค้นหาด้วยตัวเอง
David Eppstein

9

สำหรับจำนวนเต็มการเขียนในไบนารีต้องใช้บิตอย่างแน่นอน พีชคณิตระดับต้นบางอันแสดงถึง สำหรับความยาวบิตใด ๆมีอย่างน้อยหนึ่งจำนวนเต็มในช่วงนี้ ดังนั้นเมื่อได้รับการรวมพลังของนั่นคือบิตยาวเลขชี้กำลังต้องเป็นจำนวนเต็ม n>0 L = log 2 ( 3 n ) + 1 L - 23nL=log2(3n)+1 L13Ln=L-1

L2log23nL1log23.
L13L
n=L1log23.

4

นี่คือวิธีการอื่น ที่ได้รับต่ำหลักคุณสามารถเรียนรู้และทำให้ k ดูเหมือนว่าเป็นตัวกำเนิดโมดูโล (เช่นมีคำสั่ง )k3n3nmod10k3nmod5k35k3φ(5k)=5k1×4

ดังนั้นโดยใช้บันทึกแยกและการยก Hensel ฉันคิดว่าคุณควรคำนวณจากตัวเลขต่ำที่อย่างมีประสิทธิภาพมาก กล่าวอีกนัยหนึ่งคุณเริ่มต้นด้วยการคำนวณจากตัวเลขต่ำที่โดยบันทึกล็อกแยกจากไปยังฐาน , โมดูโล ; นี้แสดงให้เห็นและสามารถทำได้ในเวลา จากนั้นคุณจะพบบันทึกที่ไม่ต่อเนื่องของถึงฐาน , โมดูโล ; สิ่งนี้เผยให้เห็นและสามารถทำได้nmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod25e25nmod20O(1)เวลา (ใช้ประโยชน์จากความรู้ของมีเพียงคุณต้องลอง) ย้ำ. ในแต่ละขั้นตอนคุณใช้ความรู้ของเพื่อช่วยให้คุณคำนวณล็อกแบบแยกกันอย่างมีประสิทธิภาพทำให้ใช้ข้อเท็จจริงที่ว่ามีเพียงค่าเป็นไปได้สำหรับk)nmod45nmodφ(5k1)3nmod5k5nmodφ(5k)

ตอนนี้เพียงแค่ปล่อยให้จะเพียงพอขนาดใหญ่และนี้เผยให้เห็นnkn

คุณจะต้องคิดออกว่าเวลาทำงานเป็นแต่มันดูเหมือนว่าฉันอาจจะเป็น ฉันสงสัยว่ามันพอที่จะให้และฉันสงสัยว่าคุณสามารถทำซ้ำในแต่ละเวลารวมเป็นเวลาO(n)k=O(n)O(1)O(n)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.