การคูณจำนวนเต็มเมื่อหนึ่งจำนวนเต็มได้รับการแก้ไข


35

ให้เป็นจำนวนเต็มบวกคงที่ของขนาดบิตAn

หนึ่งรายการได้รับอนุญาตให้ประมวลผลจำนวนเต็มนี้ล่วงหน้าตามความเหมาะสม

ด้วยจำนวนเต็มบวกขนาดบิตบวกความซับซ้อนของการคูณคืออะไร?BmAB

โปรดทราบว่าเรามีอัลกอริทึม แบบสอบถามที่นี่คือว่าเราสามารถใช้\ epsilon = 0โดยอะไรที่ฉลาดกว่านี้ไหม?(max(n,m))1+ϵϵ=0


6
รับAเพียงสร้างตารางการค้นหาที่มี2nรายการ (เห็นได้ชัดว่านี่ไม่ใช่สิ่งที่คุณต้องการ แต่ฉันคิดว่าคุณควรทำให้ความต้องการของคุณเฉพาะเจาะจงมากขึ้น ... )
Jukka Suomela

9
ฉันคิดว่าคำถามนี้สมเหตุสมผลดีในแบบจำลองวงจรบูลีนมาตรฐาน
Noam

4
คุณสามารถสรุปขอบเขตบนและล่างที่ชัดเจนและผลลัพธ์ที่ดีที่สุดที่คุณรับรู้ได้หรือไม่ มันแสดงให้เห็นว่าคุณใส่ใจกับปัญหาและความคิดของคุณและมันทำให้คนอื่นคิดมากขึ้นเกี่ยวกับปัญหาของคุณ
Robin Kothari

4
ฉันคิดว่าผู้ถามโดยปริยายหมายความว่าส่วนที่ประมวลผลล่วงหน้าต้องใช้พื้นที่เพียงnO(1)ตัว (มัลติเมทริกซ์เวกเตอร์มีคุณสมบัตินั้น)
Ryan Williams

ฉันต้องการที่จะรู้ว่าสิ่งที่คุณต้องการ; ฉันรู้สึกว่าฉันสามารถผ่านกรณีที่ไม่มีที่สิ้นสุดเกี่ยวกับเรื่องนี้ นี่เป็นคำตอบแรกของฉันดังนั้นฉันยินดีเป็นอย่างยิ่งที่จะพยายามให้ข้อมูลมากที่สุดเท่าที่จะทำได้ หากคุณต้องการคุณสามารถส่งอีเมลฉันที่ mgroff100@hotmail.com และฉันยินดีที่จะทำงานกับคุณมากขึ้น
Matt Groff

คำตอบ:


20

แม้ว่ามันจะไม่ใช่อัลกอริธึมที่มีประสิทธิภาพที่สุดเสมอไป แต่คำถามนี้มีความสัมพันธ์ที่ใกล้ชิดกับโซ่เพิ่มเติม อัลกอริทึมใด ๆ สำหรับการคำนวณอย่างรวดเร็วโดยการเพิ่มเชนจะแปลเป็นอัลกอริทึมสำหรับการคำนวณโดยการเติมซ้ำ (แน่นอนว่าการเพิ่มแต่ละครั้งจะเป็นการดำเนินการ ) Contrariwise เป็นอัลกอริทึมด่วนสำหรับการคำนวณสำหรับใด ๆ ที่นำไปสู่อัลกอริทึมด่วนสำหรับการคำนวณแต่แน่นอนว่าอัลกอริทึมนี้ไม่จำเป็นต้องมีรูปแบบของการเพิ่มโซ่ ยังคงดูเหมือนว่าเป็นสถานที่ที่ยอดเยี่ยมในการเริ่มต้น ดูhttp://en.wikipedia.org/wiki/Addition_chainหรือดูฉบับที่ 2 จากAf(B)=ABO(n)ABBAThe Art Of Computer Programmingสำหรับรายละเอียดเพิ่มเติม


17

เพื่อขยายแนวคิดของ Steven Stadnicki เราสามารถสร้างอัลกอริธึมไร้เดียงสาที่ทำได้ดีกว่าการคูณเมทริกซ์อย่างรวดเร็วโดยใช้การแปลงฟูเรียร์แบบไม่ต่อเนื่อง

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

หากมากกว่าครึ่งหนึ่งของบิตเป็นบิตเราจะทำเช่นเดียวกันกับข้างบน แต่เราใช้ศูนย์แทนการเติมรายการของตำแหน่ง แนวคิดคือเราจะลบผลรวมนี้จากผลรวมที่จะได้รับจากการคูณด้วยจำนวนทั้งหมด เพื่อให้ได้ผลรวมของทุกตัวเราเปลี่ยนตามจำนวนบิตในและลบจากนี้ จากนั้นเราสามารถลบผลรวมของเราที่ได้รับจากรายการที่เชื่อมโยงBAB

เราสามารถเรียกได้ว่าอัลกอริทึมเชื่อมโยงรายชื่อไร้เดียงสา เวลาทำงานของมันคือในกรณีที่แย่ที่สุด แต่ในกรณีทั่วไปซึ่งเร็วกว่า DFT สำหรับขนาดเล็ก.O(n2)O(|B||A|2π)|A|

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

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

หากเราได้รับอนุญาตให้มีอิสระอย่างไม่มีที่สิ้นสุดด้วยการประมวลผลล่วงหน้าเราจะแก้ไขอัลกอริธึมการแบ่งและพิชิตที่เหมาะสมที่สุดสำหรับทุกสาขาอย่างเหมาะสมที่สุด สิ่งนี้ต้องใช้เวลาในกรณีที่เลวร้ายที่สุด แต่มันควรจะเป็นวิธีที่ดีที่สุดโดยการเพิ่มวิธีการลูกโซ่O(2|A|)

ฉันกำลังคำนวณค่าที่แน่นอนกว่าสำหรับอัลกอริทึมด้านบน


สวัสดีแมท: อะไรคือและ? |A||B|
T ....

|A|คือขนาดของโดยทั่วไปจำนวนขององค์ประกอบใน นี่เทียบเท่ากับของคุณคือn เช่นเดียวกับ. แต่สูตรนี้ยังคงถือหุ้นเมื่อแตกต่างกันสำหรับและBAAn|A|n|B|nAB
Matt Groff

17

กระดาษที่เรียกว่าการคูณด้วยค่าคงที่คือ sublinear ( PDF ) ให้อัลกอริทึมสำหรับการดำเนินการเปลี่ยน / เพิ่มโดยที่คือขนาดของค่าคงที่ .O(nlogn)n

โดยพื้นฐานแล้วมันทำงานโดยการหาค่าบิตในค่าคงที่การเลื่อนและการเพิ่มจำนวนที่จะถูกคูณเฉพาะสำหรับบิตเหล่านั้นในค่าคงที่ (เช่นการคูณแบบยาวสำหรับไบนารีซึ่งบิตในจำนวนด้านล่างที่จะคูณ ด้านบนจะไม่ถูกเลื่อนและเพิ่มในขณะที่บิตหมายถึงด้านบนจะถูกเลื่อนและเพิ่ม) อย่างไรก็ตามสิ่งนี้ยังคงเป็นเพราะอาจมีบิตในค่าคงที่1101O(n)O(n) 1

จากนั้นกระดาษจะพูดถึงการเปลี่ยนการแทนค่าตัวเลขของค่าคงที่เป็นระบบเลขฐานสองฐานที่เห็นได้ชัดว่า non- -bit เป็น sparser หากการแปลงเสร็จสิ้นอย่างถูกต้อง (มันเป็นระบบตัวเลขที่ซ้ำซ้อนมาก) พวกเขาคำนวณว่ามันเบาบางแค่ไหน จำนวนของบิตที่ไม่เป็นศูนย์จะถูก จำกัด ให้น้อยกว่าดังนั้นจึงจำเป็นต้องมีการเพิ่มจำนวนย่อย อย่างไรก็ตามมันยังคงการดำเนินงานจริงเนื่องจากต้นทุนของการเพิ่มแต่ละครั้ง (โดยที่คือขนาดของ ค่าคงที่และคือขนาดของจำนวนอื่น ๆ )0O(n)O(nmlogn)O(m)nm

ดังนั้นเพื่อตอบคำถามของคุณใช่มีผลลัพธ์ที่คล้ายกันกับการคูณเมทริกซ์ - เวกเตอร์ซึ่งคุณจะได้รับเร่งความเร็วถ้ามันคงที่ แต่แน่นอนว่าการเร่งความเร็วนี้ทำได้แค่การเพิ่มความไร้เดียงสาแบบยาวและมีอัลกอริธึมการคูณที่ดีกว่าคุณสามารถทำได้ อัลกอริทึมนี้lognO(n2logn)


@ JAS นั่นคือความสามารถพิเศษของฉัน: D
Realz Slaw

3
สิ่งนี้ปรากฏใน ARITH 2007 เป็นdx.doi.org/10.1109/ARITH.2007.24 (เพื่อความสมบูรณ์)
András Salamon

10

ตามที่แนะนำโดย Matt Groff คุณอาจสนใจเข้าร่วมชุมชนฝึกหัดเพื่อหาแรงบันดาลใจ (หรือถ้าในสถานการณ์ของคุณอยู่ในความกว้างบิตของ CPU ปัจจุบัน) แท้จริงแล้วปัญหาของการคูณจำนวนเต็มโดยค่าคงที่ได้รับการพิจารณาโดยนักเขียนคอมไพเลอร์และนักออกแบบวงจรจำนวนมากแม้ว่าพวกเขามักจะสนใจในตัวคูณทวีคูณน้อยกว่า (คูณใช้ shift เพิ่มและลบ หนึ่งในการอ้างอิงต้นที่ฉันรู้คือ (ฉันได้เรียนรู้จากแฮกเกอร์ดีไลท์มาตรา 8.4):n

Bernstein, R. (1986), การคูณด้วยค่าคงที่จำนวนเต็ม ซอฟต์แวร์: การปฏิบัติและประสบการณ์ 16: 641–652 ดอย: 10.1002 / spe.4380160704

งานที่ทันสมัยมากขึ้นโดย Vincent Lefèvreสามารถพบได้ที่นี่ (โปรดดูงานติดตามผลของเขา) และเขายังบันทึกโครงการ CMU เกี่ยวกับการสังเคราะห์วงจรที่มีประสิทธิภาพ (ดูเอกสารอ้างอิงที่นั่น) โครงการหลังพิจารณาการคูณพร้อมกันโดยชุดของค่าคงที่

ป.ล. ฉันขอแนะนำให้คุณพิจารณาเปลี่ยนชื่อผู้ใช้เป็นสิ่งที่จดจำได้


8

ฉันไม่แน่ใจว่าสิ่งนี้เกี่ยวข้องโดยตรงกับคำถามหรือไม่ แต่ผลลัพธ์เบื้องต้นต่อไปนี้อาจเป็นที่สนใจ กำหนดหมายเลขธรรมชาติคงที่การดำเนินงานสามารถรับรู้ได้โดยลำดับหุ่นยนต์โดยที่ถูกเขียนในรูปแบบไบนารีย้อนกลับ (นั่นคือบิตที่สำคัญน้อยที่สุดก่อน) จำนวนของรัฐของหุ่นยนต์คือที่คือพลังที่ใหญ่ที่สุดของหารkตัวอย่างเช่นการดำเนินการได้รับการรับรู้โดยหุ่นยนต์ต่อไปนี้ knknnk/2r2r2kn6nป้อนคำอธิบายรูปภาพที่นี่

ยกตัวอย่างเช่นและดังนั้นในไบนารีกลับเขียนเป็นและ (ทางเลือกที่ดีฉันรู้ ... ) เป็น01101010001กำลังประมวลผลรายการบนหุ่นยนต์นี้ให้เส้นทาง 185=1+8+16+32+1286×185=1110=2+4+16+64+10241851001110111100110101000110011101

0011101000011110211200110201
ซึ่งจะช่วยให้การส่งออกที่ถูกต้อง{} ประเภทของหุ่นยนต์ตามลำดับผมใช้ที่นี่ถูกเรียกsubsequentialโดย Schutzenberger: ที่คุณสามารถดูมีคำนำหน้าเริ่มต้น (สีเขียว) และฟังก์ชั่นการส่งออกขั้ว01101010001(เช่นสีเขียว) สำหรับรายละเอียดเพิ่มเติมวิธีคำนวณเครื่องตามลำดับนี้อย่างเป็นระบบดูลิงค์นี้

คุณช่วยอธิบายความคิดเห็นของคุณได้ไหม?
เจ

kเป็นสำคัญ 2 >2
T ....

การก่อสร้างหุ่นลำดับตระหนักถึงการดำเนินการสามารถทำได้สำหรับการใด ๆkอย่างไรก็ตามการคำนวณหุ่นยนต์นี้อาจทำได้ง่ายกว่าสำหรับ prime nknkk
เจ

k2rเป็นเลขชี้กำลัง
T ....

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