Sunday 16 July 2017

Dfa หาร ทีละ $ 5 ไบนารี ตัวเลือก


Im ทำงานในชุดปัญหาสำหรับชั้นเรียนและคิดถึงคำถามที่เกี่ยวข้องกับสิ่งที่ฉันกำลังทำอยู่ มีจำนวนน้อยที่สุดของรัฐที่หุ่นยนต์ จำกัด ต้องมีเพื่อที่จะยอมรับสตริงไบต์ที่แสดงจำนวนหารด้วยจำนวนเต็ม n ในชุดปัญหาก่อนหน้านี้ฉันสามารถสร้าง DFA ที่ยอมรับสตริงไบนารีหารด้วย 3 กับ 3 รัฐ . นี่เป็นเรื่องบังเอิญหรือมีบางอย่างที่เกิดขึ้นกับปัญหาทั่วไปในการตรวจจับสตริงที่หารด้วย n ซึ่งแสดงให้เห็นว่ามีจำนวนน้อยที่สุดที่ฉันสัญญาไว้ว่าจะไม่ตอบคำถามการบ้านสำหรับฉัน ) ถาม 29 มกราคม 12 ที่ 0:35 HuckBennett ฉันเห็นด้วยกับ Kaveh ว่าคำถามนี้ควรจะปิดใน cstheory ส่วนใหญ่จะสอดคล้อง อย่างไรก็ตามฉันยังเห็นด้วยกับคุณ: นี่เป็นคำถามที่สนุกและเมื่อคุณเห็น DFAs เป็นสิ่งที่คุณควรจะถามตัวเอง ฉันคิดว่า OP ควรพยายามที่จะมีความสนุกสนานในการทำงานออกคำตอบสำหรับตัวเองและจากนั้นให้คำปรึกษา math. SE สำหรับข้อมูลเพิ่มเติม การบ้านนี้ไม่ใช่เรื่องจริง (แม้ว่าจะได้รับแรงบันดาลใจจากคำถามการบ้าน) แต่ก็เป็นคำถามที่น่าสนใจผมไม่เชื่อว่าเป็นผลที่ได้รับความนิยมและคำตอบสำหรับคำถามที่ปรากฏในบันทึกงานวิจัย ฉันไม่เห็นเหตุผลที่ควรปิด ขอบเขตบนคือการบ้านและเป็นเรื่องง่าย แต่คำถามเกี่ยวกับขอบเขตล่าง ndash Peter Shor 29 ม. ค. 12 เวลา 13: 43 ดิฉันกำลังศึกษานิพจน์ทั่วไปและพบปัญหาการปฏิบัติที่น่าสนใจทางออนไลน์ที่เกี่ยวข้องกับการเขียนนิพจน์ทั่วไปเพื่อรับทราบเลขฐานสองทั้งหมดที่หารด้วย 3 (และมีเพียงตัวเลขเท่านั้น) ความซื่อสัตย์ปัญหาก็คือขอให้สร้าง DFA สำหรับสถานการณ์ดังกล่าว แต่ฉันคิดว่าควรใช้การแสดงออกปกติเท่าที่เป็นไปได้ ฉันรู้ว่า theres กฎเล็ก ๆ น้อย ๆ ในสถานที่เพื่อดูว่าเลขฐานสองหารด้วย 3: ใช้จำนวนคนในสถานที่แม้ในหลักและลบโดยจำนวนคนในสถานที่แปลก ๆ ในหลัก - ถ้าศูนย์นี้เท่ากับศูนย์ ตัวเลขจะหารด้วย 3 (ตัวอย่าง: 110-1 ในช่องคู่ 2 ช่องและ 1 ในช่องคี่ 1 ช่อง) อย่างไรก็ตามฉันมีปัญหาในการปรับตัวให้เข้ากับนิพจน์ทั่วไป ที่ใกล้เคียงที่สุด Ive มาคือตระหนักว่าหมายเลขสามารถ 0 เพื่อที่จะเป็นรัฐแรก ฉันยังเห็นว่าตัวเลขไบนารีหารด้วย 3 เริ่มต้นด้วย 1 ดังนั้นจะเป็นสถานะที่สอง แต่ Im ติดอยู่จากที่นั่น คนที่สามารถช่วยออกถาม 11 มีนาคม 13 ที่ 1:50 ต่อไปนี้สิ่งที่ Oli Charlesworth กล่าวว่าคุณสามารถสร้าง DFA สำหรับหารของจำนวนฐาน b โดยตัวหารบาง d. ที่รัฐใน DFA เป็นตัวแทนส่วนที่เหลือของแผนก สำหรับกรณีของคุณ (ฐาน 2 - เลขฐานสองตัวหาร d 3 10): โปรดทราบว่า DFA ข้างต้นยอมรับสตริงที่ว่างเปล่าเป็นตัวเลขที่หารด้วย 3 ซึ่งสามารถแก้ไขได้โดยการเพิ่มสถานะระดับกลางขึ้นไปที่ด้านหน้า: การแปลงเป็นนิพจน์ทั่วไปทางทฤษฎี สามารถทำได้ด้วยกระบวนการปกติ การแปลงเป็น regex ในแง่ของรสชาติที่สนับสนุน regex แบบเรียกซ้ำสามารถทำได้ง่ายเมื่อคุณมี DFA นี่แสดงในกรณีของ (ฐาน b 10, d 7 10) ในคำถามนี้จาก CodeGolf. SE ทำลายมันลงคุณสามารถดูได้ว่ามันถูกสร้างขึ้นมาอย่างไร ใช้เพื่อตรวจสอบให้แน่ใจว่าได้เลือกสตริงที่ว่างเปล่าไว้เฉพาะกลุ่มที่เป็นอะตอม (หรือกลุ่มที่ไม่ได้ย้อนกลับหรือกลุ่มที่มีพฤติกรรมเป็นเจ้าของ) นี่เป็นเคล็ดลับเพื่อเลียนแบบ (DEFINE) ใน Perl แล้วกลุ่ม A ถึง G สอดคล้องกับส่วนที่เหลือของ 0 ถึง 6 เมื่อตัวเลขหารด้วย 7. ตอบ 11 มีนาคม 13 ที่ 6:44 ฉันมีวิธีอื่นเพื่อปัญหานี้และฉันคิดว่านี้ง่ายต่อการเข้าใจ เมื่อเราแบ่งตัวเลขเป็น 3 เราสามารถมีสามส่วนที่เหลือได้: 0,1,2 เราสามารถอธิบายตัวเลขที่หารด้วย 3 โดยใช้นิพจน์ 3t (t เป็นจำนวนธรรมชาติ) เมื่อเราเพิ่ม 0 หลังจากเลขฐานสองที่เหลือเป็น 0 จำนวนทศนิยมที่แท้จริงจะเพิ่มเป็นสองเท่า เนื่องจากแต่ละหลักเคลื่อนไปยังตำแหน่งที่สูงขึ้น 3t 2 6t นี้ก็หารด้วย 3 เมื่อเราเพิ่ม 1 หลังจากที่เลขฐานสองที่เหลือเป็น 0 จำนวนทศนิยมที่แท้จริงจะเพิ่มขึ้นเป็นสองเท่าบวก 1 เนื่องจากตัวเลขแต่ละตัวเคลื่อนที่ไปที่ตำแหน่งที่สูงขึ้นตามด้วย 1 3t 2 1. ส่วนที่เหลือคือ 1. เมื่อเราเพิ่มเลข 1 หลังจากเลขฐานสองที่เหลือเป็น 1 จำนวนทศนิยมที่แท้จริงจะเพิ่มเป็นสองเท่าบวกหนึ่งส่วนที่เหลือคือ 0 (3t 1) 2 1 6t 3 นี่คือหารด้วย 3. เมื่อเราเพิ่ม 0 หลังจากเลขฐานสองที่เหลือคือ 1. จำนวนทศนิยมที่แท้จริงจะได้รับเป็นสองเท่าและส่วนที่เหลือจะเป็น 2 (3t 1) 2 6t 2. เมื่อเราเพิ่ม 0 หลังจากเลขฐานสองที่มี ส่วนที่เหลือจะเป็น 1 (3t 2) 2 3t 4 3 (2t 1) 1 เมื่อเราเพิ่มเลข 1 หลังจากเลขฐานสองที่เหลือเป็น 2 ส่วนที่เหลือจะยังคงเป็น 2 (3t 2) 2 1 t 5 3 (2t 1) 2. ไม่ว่าคุณจะเพิ่มจำนวนไบนารีลงเหลือเท่าใดก็จะมีจำนวนเท่ากับ 2 เสมอไป (3 (t 1) 2) 2 1 3 (t 2) 5 3 (t 3) 2 ตอบ 6 พ. ย. ที่ 20:45 เลขฐานสองหารด้วย 3 แบ่งออกเป็น 3 ประเภทคือตัวเลขที่มี 2 หรือ 1 วินาทีต่อเนื่องกัน จำนวนคู่ได้ 0 มีประสิทธิภาพทุกคู่ยกเลิกตัวเองออก (เช่น 11, 110, 1100, 1001, 10010, 1111) (เลขฐานสิบหก: 3, 6, 12, 9, 18, 15) ตัวเลขที่มีสามอักขระ 1 ตัวคั่นด้วยเลขคี่ 0s แฝดเหล่านี้ยังยกเลิกตัวเอง (เช่น 10101, 101010, 1010001, 1000101) (เลขฐานสิบหก: 21, 42, 81, 69) การรวมกันของกฎสองตัวแรก (รวมถึงภายในอันอื่น) (เช่น 1010111, 1110101, 1011100110001) (ทศนิยม: 87, 117 , 5937) ดังนั้นการแสดงออกปกติที่คำนึงถึงสามกฎนี้ก็คือ: หมายถึงกลุ่มตัวเลขก่อนหน้านี้เป็นตัวเลือกบ่งชี้ถึงทางเลือกของตัวเลือกทั้งสองด้านในวงเล็บข้างล่างนี้ฉันได้เขียนคำตอบสำหรับ n เท่ากับ 5 แต่คุณสามารถใช้ วิธีเดียวกันในการวาด DFAs สำหรับค่าของ n และระบบตัวเลขใด ๆ ตำแหน่งเช่นไบนารี, ternary First lean term DFA ที่สมบูรณ์แบบ DFA ที่กำหนดไว้ในโดเมนทั้งหมดใน: Q Q เรียกว่า DFA ที่สมบูรณ์ กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่าเป็นแผนภาพการเปลี่ยน DFA ที่สมบูรณ์ไม่มีขอบที่ขาดหายไป (เช่นจากแต่ละรัฐใน Q มีขอบส่งออกที่มีอยู่สำหรับสัญลักษณ์ทุกภาษาใน) หมายเหตุ: บางครั้งเรากำหนด DFA บางส่วนเป็น Q Q (อ่าน: Q Q อ่านในรูปแบบ DFA) อย่างไร ออกแบบ DFA ยอมรับตัวเลขไบนารีหารด้วยจำนวน n: ขั้นตอนที่ 1 เมื่อคุณแบ่งหมายเลขตาม n การเตือนความจำอาจเป็น 0, 1. (n - 2) หรือ (n - 1) ถ้าส่วนที่เหลือเป็น 0 นั่นหมายความว่าหารด้วย n มิฉะนั้นจะไม่ ดังนั้นใน DFA ของฉันจะมีสถานะ q r ซึ่งจะตรงกับค่าที่เหลือ r โดยที่ 0 lt r lt (n - 1) และจำนวนทั้งหมดของรัฐใน DFA คือ n หลังจากประมวลผลสตริงตัวเลขมากกว่าสถานะสิ้นสุดคือ q r อนุมานได้ว่า n r (ตัวดำเนินการเตือนความจำ) ใน automata ใด ๆ จุดประสงค์ของรัฐก็เหมือนกับองค์ประกอบของหน่วยความจำ สถานะใน atomata เก็บข้อมูลบางอย่างเช่นสวิทซ์ของแฟน ๆ ซึ่งสามารถบอกได้ว่าพัดลมอยู่ในสถานะปิดหรืออยู่ในสถานะ สำหรับ n 5, ห้ารัฐใน DFA สอดคล้องกับข้อมูลการแจ้งเตือน 5 รายการดังต่อไปนี้: สถานะ q 0 ถึงถ้าการเตือนความจำคือ 0 รัฐ 0 คือสถานะสุดท้าย (สถานะยอมรับ) นอกจากนี้ยังเป็นรัฐเริ่มต้น State q 1 ถึงถ้าการเตือนความจำคือ 1 ไม่ใช่รัฐสุดท้าย State q 2 ถ้าการแจ้งเตือนเป็น 2 รัฐที่ไม่ใช่ขั้นสุดท้าย State q 3 ถ้าการแจ้งเตือนเป็น 3 รัฐที่ไม่ใช่ขั้นสุดท้าย State q 4 ถ้าการแจ้งเตือนเป็น 4 รัฐที่ไม่ใช่ขั้นสุดท้าย ใช้ข้อมูลข้างต้นเราสามารถเริ่มต้นวาดแผนภาพการเปลี่ยนแปลง TD ของห้าสถานะดังนี้: ดังนั้น 5 รัฐ 5 ค่าที่เหลือ หลังจากการประมวลผลสตริงถ้าสถานะสิ้นสุดกลายเป็น q 0 ซึ่งหมายความว่าทศนิยมของสตริงอินพุตจะหารด้วย 5 ในรูปด้านบน 0 จะถูกทำเครื่องหมายสถานะสุดท้ายเป็นวงกลมสองวงกลม นอกจากนี้ฉันได้กำหนดกฎการเปลี่ยน: (q 0. 0) q 0 เป็นตัว loop สำหรับสัญลักษณ์ 0 ที่สถานะ q 0 เนื่องจากจำนวนทศนิยมของสตริงใด ๆ ประกอบด้วยเพียง 0 คือ 0 และ 0 เป็นหารด้วย n ขั้นตอนที่ 2 . TD ข้างต้นไม่สมบูรณ์และสามารถประมวลผลสตริงของ 0 วินาทีเท่านั้น ตอนนี้เพิ่มขอบเพิ่มเติมบางส่วนเพื่อให้สามารถประมวลผลสตริงตัวเลขที่ตามมา ตรวจสอบตารางด้านล่างแสดงกฎการเปลี่ยนใหม่ที่สามารถเพิ่มขั้นตอนต่อไปได้: ในการประมวลผลสตริงไบนารี 1 ควรมีกฎการเปลี่ยน: (q 0. 1) q 1 สอง: - การแสดงไบนารีคือ 10. สถานะสุดท้ายควรเป็น 2 . และเพื่อประมวลผล 10. เราเพียงแค่ต้องเพิ่มกฎการเปลี่ยนแปลงอีกอย่างหนึ่ง: (q 1. 0) q 2 เส้นทาง (q 0) 1 (q 1) 0 (q 2) สาม: - ในไบนารีเป็น 11 สถานะสุดท้ายคือ q 3 และเราจำเป็นต้องเพิ่มกฎการเปลี่ยน: (q 1. 1) q 3 เส้นทาง (q 0) 1 (q 1) 1 (q 3) สี่: - ในไบนารี 100 ปลายรัฐคือ q 4 TD ประมวลผลสตริงคำนำหน้า 10 แล้วเราจำเป็นต้องเพิ่มกฎการเปลี่ยนใหม่: (q 2. 0) q 4 เส้นทาง (q 0) 1 (q 1) 0 (q 2) 0 (q 4) ขั้นตอนที่ 3 ห้า 101 แผนภาพการเปลี่ยนแปลงด้านบนในรูปที่ 2 ยังคงไม่สมบูรณ์และมีขอบที่ขาดหายไปตัวอย่างเช่นไม่มีการเปลี่ยนแปลงใด ๆ สำหรับ: (q 2. 1) - และกฎควรมีอยู่เพื่อประมวลผลสตริงเช่น 101 เนื่องจาก 101 5 หารด้วย 5 และยอมรับ 101 ฉันจะเพิ่ม: (q 2. 1) q 0 ในรูปที่ 2 (q 0) 1 (q 1) 0 (q 2) 1 (q 0) ด้วยกฎใหม่นี้แผนภาพการเปลี่ยนแปลงจะเป็นดังนี้: ด้านล่างในแต่ละขั้นตอนที่ฉันเลือกเลขฐานสองถัดไปที่จะเพิ่มขอบที่ขาดหายไปจนกว่าฉันจะได้รับ TD เป็น DFA ที่สมบูรณ์ เราสามารถประมวลผล 11 ในรูป TD ปัจจุบันในรูปที่ 3 เป็น: (q 0) 11 (q 3) 0 () เนื่องจาก 6 5 1 หมายถึงการเพิ่มกฎหนึ่งข้อ (q 3 0) q 1. ขั้นตอน -6 เพิ่มสิบสอง, สิบสาม, สิบสี่จำนวนรวมของขอบในแผนภาพการเปลี่ยนแปลงภาพ -12 คือ 15 Q 5 3 (สมบูรณ์ DFA) และ DFA นี้สามารถยอมรับทุกสตริงที่ประกอบด้วยจำนวนที่เทียบเท่าทศนิยมเหล่านี้หารด้วย 5 หากคุณสังเกตเห็นในแต่ละขั้นตอนในตารางมีสามรายการเนื่องจากในแต่ละขั้นตอนฉันเพิ่มขอบขาออกทั้งหมดที่เป็นไปได้ออกจากสถานะเพื่อสร้าง DFA ที่สมบูรณ์ (และ ฉันเพิ่มขอบเพื่อให้รัฐ qr ได้รับส่วนที่เหลือคือ r) เพื่อเพิ่มอีกจำสหภาพสองภาษาปกตินอกจากนี้ยังมีปกติ หากคุณต้องการออกแบบ DFA ที่รับสตริงไบต์จำนวนที่เท่ากันของทศนิยมจะหารด้วย 3 หรือ 5 จากนั้นจึงวาด DFAs 2 รายการสำหรับหารด้วย 3 และ 5 จากนั้นรวมทั้ง DFA เพื่อสร้าง DFA เป้าหมาย (สำหรับ 1 lt n lt 10 คุณมี ไปรวม 10 DFAs) ถ้าคุณถูกขอให้วาด DFA ที่รับสตริงแบบไบนารีโดยให้เลขทศนิยมเป็นทศนิยมหารด้วย 5 และ 3 ทั้งสองนี้คุณกำลังมองหา DFA ของหารด้วย 15 (แต่สิ่งที่เกี่ยวกับ 6 และ 8) หมายเหตุ: DFA ที่วาดด้วยเทคนิคนี้จะย่อให้เล็กสุด DFA เฉพาะเมื่อไม่มีปัจจัยร่วมระหว่าง n จำนวนและฐานเช่น ในตัวอย่างแรกไม่มีระหว่าง 5 ถึง 2 และระหว่าง 5 ถึง 3 ในตัวอย่างที่สองดังนั้น DFA ที่สร้างขึ้นจะลดลง DFAs หากคุณสนใจที่จะอ่านเพิ่มเติมเกี่ยวกับรัฐมินิที่เป็นไปได้สำหรับหมายเลข n และฐาน b อ่านกระดาษ: ความแตกต่างและความซับซ้อนของรัฐ ด้านล่างฉันได้เพิ่มสคริปต์ Python ฉันเขียนมันเพื่อความสนุกสนานในขณะที่เรียนรู้ Python ห้องสมุด pygraphviz ฉันเพิ่มมันฉันหวังว่ามันจะมีประโยชน์สำหรับคนในบางประการ ออกแบบ DFA สำหรับสตริงเลขฐาน b จำนวนหารด้วยจำนวน n: เราสามารถใช้เคล็ดลับข้างต้นเพื่อวาด DFA เพื่อจดจำหมายเลขสตริงในฐาน b ซึ่งเป็นจำนวนหารได้ n ในจำนวน DFA ทั้งหมดของรัฐจะเป็น n (สำหรับ n ส่วนที่เหลือ) และจำนวนขอบควรเท่ากับ b n mdash ที่สมบูรณ์ DFA: b จำนวนสัญลักษณ์ในภาษาของ DFA และ n จำนวนรัฐ ใช้เคล็ดลับข้างต้นด้านล่างฉันได้เขียนสคริปต์ Python เพื่อวาด DFA สำหรับฐานข้อมูลและจำนวนการป้อน ในสคริปต์ฟังก์ชัน splitbyN จะสร้างกฎการเปลี่ยน DFAs ในขั้นตอนพื้นฐาน ในแต่ละขั้นตอน num, ฉันแปลง NUM เป็น NUM สตริงหมายเลขโดยใช้ฟังก์ชัน baseN () เพื่อหลีกเลี่ยงการประมวลผลตัวเลขแต่ละสตริงผมได้ใช้โครงสร้างข้อมูลแบบชั่วคราวในการค้นหา ในแต่ละขั้นตอนสถานะปลายทางสำหรับสตริงตัวเลขจะได้รับการประเมินและจัดเก็บไว้ใน lookuptable เพื่อใช้ในขั้นตอนต่อไป สำหรับกราฟการเปลี่ยนแปลงของ DFA ฉันได้เขียนฟังก์ชัน drawtransitiongraph โดยใช้ไลบรารี Pygraphviz (ใช้งานง่ายมาก) ในการใช้สคริปต์นี้คุณต้องติดตั้ง graphviz เมื่อต้องการเพิ่มขอบสีสันในแผนภาพการเปลี่ยนฉันจะสุ่มสร้างรหัสสีสำหรับฟังก์ชัน getcolordict แต่ละสัญลักษณ์ ในทำนองเดียวกันให้ป้อนฐาน 4 และหมายเลข 7 เพื่อสร้าง - dfa ยอมรับจำนวนสตริงในฐานที่ 4 ซึ่งหารด้วย 7 Btw ลองเปลี่ยนชื่อไฟล์เป็น. png หรือ. jpeg

No comments:

Post a Comment