อัลกอริธึมคำนวณถ้าตัวเลขมีค่าเท่ากับ 3


13

เมื่อทำแคลคูลัสจิตหนึ่งสามารถทำ:

  • กำหนดจำนวนเต็ม k รวมตัวเลขทั้งหมด (ในฐาน 10) และหากผลลัพธ์คือผลคูณของ 3 ดังนั้น k คือผลคูณของ 3

คุณรู้หรือไม่ว่าอัลกอริทึมทำงานคล้ายกัน แต่ทำงานกับตัวเลขฐานสอง (บิต) หรือไม่

  • ตอนแรกฉันคิดว่าการใช้ฟังก์ชั่นสำเร็จรูปของภาษาของฉันการแปลงจำนวนเต็มเป็น ascii เพื่อทำการแปลงจากฐาน 2 เป็นฐาน 10 จากนั้นใช้เคล็ดลับแคลคูลัสจิต แต่แน่นอนแล้วฉันสามารถเข้ารหัสการแปลงฐาน 2 ถึง 10 ด้วยตัวเอง ฉันยังไม่ได้ทำ แต่ฉันจะลองดู

  • จากนั้นฉันก็นึกถึงการแบ่งยูคลิเดียนในฐาน 2 ...

อย่างไรก็ตามฉันสงสัยว่ามีวิธีการอื่น ๆ


คำตอบ:


22

พิจารณาข้อสังเกตสองข้อต่อไปนี้ (เหลือเป็นแบบฝึกหัดให้ผู้อ่าน):

  1. พลังคู่ของทั้งสองคือ 1 โมดูโล 3
  2. พลังคี่ของสองคือ -1 โมดูโล 3

เราสรุปได้ว่าตัวเลข (เป็นเลขฐานสอง) หารด้วยสามถ้าหากผลรวมของบิตในตำแหน่งคู่เท่ากับผลรวมของบิตในตำแหน่งแปลกโมดูโล 3


7
นี่เป็นเหมือนกฎการหารด้วย 11 เป็นทศนิยม
Yuval Filmus

1
@YuvalFilmus: แม่นยำ ฉันกำลังจะเพิ่มแบบฝึกหัดอื่นสำหรับผู้อ่าน แต่ตัดสินใจกับมัน
mumum

3
ตกลงวิธีการเกี่ยวกับการหาว่าตัวเลขที่เขียนในเลขฐานสิบหกหารด้วย 17 (ทศนิยม) หรือไม่ หรือ 15 (ทศนิยม) สำหรับเรื่องนั้น ;-)
vonbrand

33

ออโตเมติกสถานะอัน จำกัด สำหรับงานนี้เป็นอย่างไร?

ป้อนคำอธิบายรูปภาพที่นี่

แน่นอนมายากลเป็นเพียงการคำนวณแบบโมดูโล 3. การเพิ่มสัญลักษณ์เบื้องหลังสตริงหมายถึง "ค่าไบนารี" ของสตริงไปจากสำหรับไปสำหรับXAดังนั้นจากรัฐและสัญลักษณ์เราย้ายไปรัฐสำหรับและ\} หมายเหตุเป็นสตริง wherasคือค่าที่เป็นสตริงไบนารีaxval(x)x2val(x)+axapa2p+amod3p{0,1,2}a{0,1}x{0,1}val(x)N


1
ฉันชอบไอเดียลองดูด้วย 9. ฉันป้อน 1001 ด้วยเลขฐานสอง บิตแรกส่งฉันถึง state1 จากนั้น state2 จากนั้น state1 จากนั้นกลับสู่ state0 ดังนั้น state0 จึงเท่ากับ 3 และความซับซ้อนของอัลกอริทึมคือจำนวนบิตที่ใช้ไม่มีอะไรเพิ่มเติม มันเจ๋งมาก !
Stephane Rolland

แนวคิดนี้อยู่ในลิงค์ที่เกี่ยวข้องหรือไม่ ฉันคิดว่ามันง่ายกว่า geomathry.wordpress.com/2017/02/13/0-1-and-a-new-number

1
@WaqarAhmad ใช่เกี่ยวข้องไม่ง่ายขึ้น ช่วงการเปลี่ยนภาพในหุ่นยนต์ จำกัด ยังสามารถใช้เพื่ออธิบายการประเมิน L2R เช่นในคำอธิบายของคุณ การเปลี่ยนกำหนด , , , , , \ที่นี่เรามีสามสถานะดังนั้นสามสัญลักษณ์สำหรับรัฐจึงมีความจำเป็น สัญลักษณ์ของคุณเป็นการประเมินตัวเลขโมดูโลตามลำดับและสัญลักษณ์แรกในการประเมิน L2R ของคุณคือ "สถานะ" หากคุณต้องการสนทนาอาจเป็นการดีกว่าถ้าคุณเริ่มคำถามใหม่ในเว็บไซต์! 0¯0=0¯0¯1=1¯1¯0=2¯1¯1=0¯2¯0=1¯2¯1=2¯Θ,1,01,2,0
เฮนดริค ม.ค.

ไม่เกี่ยวกับการเขียนโปรแกรม สิ่งนี้จะมีประสิทธิภาพมากขึ้นในคอมพิวเตอร์ที่ประกอบไปด้วยหรือไม่

4

ในเลขฐานสองตัวเลข 1, 100, 10000 (= 100 × 100), 1000000 (= 100 × 100 × 100) และอื่น ๆ ให้ส่วนที่เหลือเหมือนกันหลังจากหารด้วย 11 (สาม) ดังนั้นหากเราแบ่งเลขฐานสองเป็นส่วนที่มีความยาวเท่ากันผลรวมของส่วนต่าง ๆ จะให้ส่วนที่เหลือเท่ากับหมายเลขเดิม

(เมื่อแบ่งจำนวนเราจะเพิ่มศูนย์ให้มากที่สุดเท่าที่จำเป็นสำหรับการเริ่มต้นตัวอย่างเช่นเราจะแบ่ง 1,0111 เป็นกลุ่ม 01,01,11 หรือ 0001,0111)

ในทางคณิตศาสตร์เพียงแบ่งตัวเลขออกเป็นกลุ่มตัวเลขสองหลักแล้วเพิ่มกลุ่ม และทำซ้ำจนกว่าผลลัพธ์ของคุณจะเป็น 00 หรือ 11 = หมายเลขเดิมคือผลคูณของสาม หรือ 01 หรือ 10 = หมายเลขเดิมไม่ใช่จำนวนทวีคูณของสาม

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

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


0

ในขณะที่ไม่ใช่เฉพาะไบนารีเมื่อมีข้อสงสัยการลบซ้ำ ๆ มักเป็นวิธีที่แน่นอนในการคำนวณการหารด้วยส่วนที่เหลือ


2
การลบซ้ำเป็นความคิดที่ไม่ดี ส่วนที่เหลือจะเร็วกว่ามาก
Yuval Filmus

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