ซึ่งคำนวณได้เร็วขึ้น ,หรือ ?


10

ซึ่งคำนวณได้เร็วขึ้นหรือหรือ ? ,และมี reals บวกกับ 1ablogaca>1

คุณจะใช้อัลกอริทึมชนิดใดในการเปรียบเทียบ ความซับซ้อนของพวกเขาคืออะไร?

ตัวอย่างเช่นเมื่อหรือaa

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


ผู้ดำเนินรายการสามารถอนุมัติการแก้ไขได้อย่างชัดเจน ฉันเห็นด้วยกับข้อเสนอแนะของ @ MarkBooth และได้รวมไว้ในคำถามตามที่เขาแนะนำ
Aron Ahmadia

อย่าลังเลที่จะจัดระเบียบความคิดเห็น (ลบ) ตอนนี้พวกเขาทำหน้าที่ตามวัตถุประสงค์แล้ว * 8 ')
ทำเครื่องหมายบูธ

คำตอบ:


8

ดูคำตอบของฉันสำหรับคำถามนี้สำหรับปัญหาที่เกี่ยวข้อง

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

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

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

ประเภทของเทคนิคการพลิกบิตที่คล้ายกันนั้นได้อธิบายไว้ในแฮ็คเกอร์ดีไลท์ (ลิงก์คือไปยังเว็บไซต์สหายสำหรับหนังสือ)

วิธีอื่นในการคำนวณการประมาณที่ดีใช้การวิเคราะห์เชิงตัวเลข (ดูบทความ Wikipedia เกี่ยวกับทฤษฎีการประมาณ ) วิธีหนึ่งที่ไม่ดีที่จะทำคือการสร้างสมการเชิงอนุพันธ์ที่เหมาะสมและรวมเข้าด้วยกันโดยใช้วิธีการเชิงตัวเลขเช่นวิธีของออยเลอร์ (อย่างที่ฉันพูดการประมาณที่ไม่ดี แต่คุณสามารถทำได้) วิธีที่ดีกว่าคือการใช้การประมาณอนุกรม ชุด Taylor มาบรรจบกันช้าเกินไปดังนั้นบางอย่างเช่นPadé Approximant หรือการประมาณค่าของชุดการรวมแบบเร็วอื่น ๆ สามารถใช้แทนได้ (ประมาณเหตุผลอื่น, ซีรีย์ Chebyshev เป็นต้น)

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

ปัญหาของการพูดคุยเกี่ยวกับความซับซ้อนคืออัลกอริธึมใด ๆ จะคำนวณเฉพาะจุดลอยตัวของฟังก์ชั่นที่คุณพูดถึงเท่านั้นดังนั้นเวลาที่ใช้จะขึ้นอยู่กับความแม่นยำที่คุณต้องการในการประมาณของคุณ แม้จะคำนึงถึงเรื่องนี้แล้ว แต่ฉันไม่คิดว่าความซับซ้อนในการคำนวณเป็นสิ่งแรกที่ประมาณค่าประสิทธิภาพได้ดี ขนาดของอินพุตของคุณจะถูกวัดเป็นบิต (เช่นจำนวนบิตที่ใช้แทน ,และa) ซึ่งจะขึ้นอยู่กับความแม่นยำมากกว่าขึ้นอยู่กับขนาดของอินพุตตัวเลขเอง เพื่อวัตถุประสงค์ในทางปฏิบัติความแม่นยำของการแสดงตัวเลขไม่ได้แตกต่างกันมากนัก (ความแม่นยำเดี่ยวความแม่นยำสองเท่าความแม่นยำสี่เท่า) และโดยทั่วไปคุณไม่ได้ตัดสินใจใช้ความแม่นยำนั้นตามการประมาณความซับซ้อนของฟังก์ชันสเกลาร์ . ตัวชี้วัดที่เกี่ยวข้องที่สุดคือเวลานาฬิกาแขวนและถ้าคุณไม่ได้ใช้สถาปัตยกรรมพิเศษ (ระบบฝังตัว) หรือแอปพลิเคชันของคุณต้องการเอ็กซ์โพเนนเชียลอย่างรวดเร็ว (ดูลิงค์โพสต์บล็อกและลิงค์การคำนวณ Neuralข้างต้น) ภาษาของทางเลือกนั้นอาจจะใช้ได้


4

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

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

เมื่อคอมพิวเตอร์ใช้งานบนเลขจำนวนเต็มจำนวนหลักเลขฐานสองที่จำเป็นต้องมีค่าเท่ากับบันทึก2ของขนาดของจำนวนเต็มบวกอีกเล็กน้อยสำหรับการจัดการสัญญาณ:M2

บันทึก 2 | M | + 1dn=2|M|+1

ตัวอย่างเช่นตัวเลข -8 สามารถแสดงด้วยเลขฐานสอง 4 หลัก สำหรับประสิทธิภาพและพื้นที่ - ประสิทธิภาพหน่วยคำนวณเชิงตรรกะ (ALUs) รับผิดชอบการคำนวณเชิงตัวเลขของจำนวนเต็มในหน่วยประมวลผลที่ทันสมัยได้รับการออกแบบมาเพื่อจัดการทางคณิตศาสตร์เกี่ยวกับจำนวนเต็มจนถึงขนาดคงที่บางวันที่พบบ่อยที่สุดคือ d = 32 และ d = 64 ไม่ใช่เพียงโปรเซสเซอร์ x86 เช่นเดียวกับในคอมพิวเตอร์ของคุณที่มี ALU แต่เป็นหน่วยการสร้างพื้นฐานของสถาปัตยกรรมคอมพิวเตอร์ที่แพร่หลายในสังคมอิเล็กทรอนิกส์ในปัจจุบัน หากคุณคุ้นเคยกับเครื่องเล่นวิดีโอเกมคุณอาจจำ Nintendo 64 ซึ่งเป็นระบบวิดีโอเกมที่ตั้งชื่อตามขนาด (เป็นบิต) หน่วยคำนวณเลขคณิตบนตัวประมวลผลของคอนโซลได้รับการออกแบบมาเพื่อจัดการ

การบวกการลบและการคูณจำนวนเต็มบนหน่วยทางคณิตศาสตร์เชิงตรรกะนั้นมีประสิทธิภาพมากและมักจะไม่ต้องการการคำนวณอีกหลายรอบ หน่วยงานมีประสิทธิภาพน้อยกว่าและหน่วยประมวลผลที่ทันสมัยสามารถต้องการได้มากถึงหลายสิบรอบ ประสิทธิภาพขึ้นอยู่กับทั้งสถาปัตยกรรมของหน่วยการประมวลผล (และการใช้งานที่สอดคล้องกันของหน่วยทางคณิตศาสตร์และความถี่) โปรดทราบว่าตัวประมวลผล 64 บิตสามารถดำเนินการทางคณิตศาสตร์กับตัวถูกดำเนินการ -bit ด้วยความเร็วเดียวกันสำหรับxที่ใดก็ได้ระหว่าง 1 ถึง 64xx

ในการคำนวณทั่วไปและโดยเฉพาะอย่างยิ่งในการคำนวณทางวิทยาศาสตร์คณิตศาสตร์จำนวนเต็มไม่ได้ใช้สำหรับการคำนวณจำนวนมากและจำเป็นต้องใช้การแทนตัวเลขอีกจำนวนหนึ่งการแทนแบบ 'floating-point' จำนวนจุดลอยตัวแสดงถึงการประนีประนอมระหว่างวิธีการทำงานของไมโครโปรเซสเซอร์ที่ทันสมัย ​​(ซื้อข้อมูลในรูปแบบ bit hunks) และความต้องการในการคำนวณโดยแสดงตัวเลขบนตัวประมวลผลในสัญลักษณ์ทางวิทยาศาสตร์ที่ถูกตัดทอนโดยใช้ฐานคงที่b (ปกติb = 2หรือ= 10 ) และเป็นตัวแทนจำนวนจำนวนเต็มสองจำนวนเป็น mantissa (ซิกในวงการบางคน) sและเป็นสัญลักษณ์อี จำนวนที่กำหนดxn=2=10sอีx ถูกแสดงโดยประมาณว่า:

x=s* * * *อี

ฉันพูดโดยประมาณเพราะมันควรจะชัดเจนว่าแม้แต่การปันส่วนอย่างง่ายเช่นไม่สามารถแสดงได้อย่างแน่นอนว่าเป็นจำนวนจุดลอยตัวสำหรับฐานมาตรฐาน จำนวนหลักที่กำหนดให้กับซิกนิฟิแคนด์กำหนดความถูกต้องของตัวเลขซึ่งสัมพันธ์กับขนาดของมันเอง IEEE 754 มาตรฐานระบุจำนวนของกฎสำหรับวิธีการที่จำนวนจุดลอยตัวที่คาดว่าจะประพฤติตนรวมทั้งช่วงของซิกและ mantissa (และช่วงและความแม่นยำที่สอดคล้องกัน) สำหรับค่าที่สำคัญหลายประการของdnเพื่อให้การคำนวณตัวเลขที่มีการทำซ้ำภายใน ความอดทนบางอย่าง มีความละเอียดเล็กน้อยเกี่ยวกับวิธีการทำงานของเลขทศนิยมซึ่งฉันไม่สามารถหวังได้ในคำตอบนี้สำหรับการแนะนำที่ดีฉันขอแนะนำ"สิ่งที่นักวิทยาศาสตร์คอมพิวเตอร์ทุกคนควรรู้เกี่ยวกับเลขคณิตจุดลอยตัว"13dn.

ความพยายามทางปัญญาจำนวนมากในช่วง 50 ปีที่ผ่านมาได้รับการลงทุนเพื่อปรับปรุงความสามารถของตัวประมวลผลเพื่อคำนวณการดำเนินการทางคณิตศาสตร์อย่างมีประสิทธิภาพ บนโปรเซสเซอร์ที่ทันสมัยการคำนวณเหล่านี้ได้รับการจัดการโดยหนึ่งหรือมากกว่าหนึ่งหน่วยจุดลอยตัว (FPUs) ซึ่งเป็นรุ่นที่ซับซ้อนมากขึ้นของหน่วยคำนวณเชิงตรรกะที่ออกแบบมาเพื่อดำเนินการทางคณิตศาสตร์กับตัวเลขทศนิยมและมักจะออกแบบมาเพื่อจัดการทั้ง IEEE 754-32 ตัวเลขจุดลอยตัว (มักเรียกว่า 'เลขทศนิยม') และตัวเลขจุดลอยตัว 64 บิต (มักเรียกว่า 'คู่') ได้อย่างมีประสิทธิภาพ เช่นเดียวกับหน่วยคำนวณทางคณิตศาสตร์หน่วยจุดลอยตัวสามารถคำนวณการบวกการลบและการคูณในเวลาเพียงไม่กี่รอบในขณะที่การหารมักจะต้องการอีกเล็กน้อย

ในกรณีส่วนใหญ่ IEEE 754 64-bit floating-point 'doubles' นั้นเพียงพอสำหรับการคำนวณเชิงตัวเลขดังนั้นให้เราสมมติว่า , bและcแต่ละตัวแสดงเป็น 64- บิตคู่และคุณสนใจประสิทธิภาพของ การคำนวณสามรายการเป็นการดำเนินการสเกลาร์บนสถาปัตยกรรม Intel Nehalem โดยใช้ชุดคำสั่งทศนิยม x87 นั่นคือคุณไม่สนใจที่จะคำนวณการดำเนินการเหล่านี้ในรูปแบบ for for loop หรือช่วงของข้อมูลและคุณไม่ต้องการใช้ส่วนขยายเวกเตอร์ . ข้อมูลเวลาในการตอบสนองจะถูกรวบรวมจากตารางอ้างอิงการเรียนการสอนที่ยอดเยี่ยมของ Agner Fogสำหรับสถาปัตยกรรม Intel / AMDa

  1. a
  2. เข้าสู่ระบบa
  3. 1

1 การยกกำลังทั่วไปมักนำมาใช้กับข้อมูลเฉพาะตัวดังต่อไปนี้:

ab=βaเข้าสู่ระบบβ

โดยที่คือ2หรือe (ในกรณีนี้ฉันใช้β = 2 ) สมมติว่าคุณยินดีทิ้งความถูกต้องในผลลัพธ์ (หน่วย x87 ทำการคำนวณด้วยความแม่นยำ 80 บิต แต่นี่ไม่เพียงพอสำหรับค่าบางช่วงสำหรับaและb ) การคำนวณนี้สามารถทำได้ด้วยคำสั่งฮาร์ดแวร์ FYL2X การคำนวณค่า t = เข้าสู่ระบบ2และการเรียนการสอนฮาร์ดแวร์ F2XM1 (มีบางช่วยปรับ) เพื่อคำนวณ2ตัน สมมติว่า ~ 20 รอบสำหรับการปรับสเกล:β2อีβ=2aเสื้อ=aเข้าสู่ระบบ22เสื้อ

FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 รอบ

2สิ่งนี้สามารถแปลงเป็นสองลอการิทึมและการหารโดยการเปลี่ยนแปลงของข้อมูลประจำตัวพื้นฐานและไม่จำเป็นต้อง rescaling สำหรับผลลัพธ์ที่ถูกต้อง

2 * FYL2X + FDIV = 2 * 80 + (7 ถึง 27) = 167 ถึง 187 รอบ

[3] นี่เทียบเท่ากับการหารตามด้วยการยกกำลังดังนั้น [1] บวก FDIV, ~ 175 รอบ


0

ให้ฉันดูว่าฉันสามารถถอดความคำถาม:

กรณีที่ 1: วิธีการที่ไม่เปรียบเทียบกับเข้าสู่ระบบ ( )เป็นแนวทางอินฟินิตี้ (ความรู้สึก asymptotic)?abloga(c)a

คำตอบ : มันขึ้นอยู่กับว่า c มีการพึ่งพา a หรือไม่และเปรียบเทียบกับ b อย่างไร (มากกว่า, น้อยกว่าหรือเท่ากับ)

ฉันจะเรียกใช้ผ่านบางกรณีที่คุณระบุเกี่ยวกับความสัมพันธ์ระหว่าง , bและa :cba

ข้อสันนิษฐาน 1 : สมมติว่าเป็นค่าคงที่จากนั้นบันทึกa ( c ) = ln ( c ) / ln ( a )ซึ่งไม่ได้เข้าใกล้อนันต์เลย (มันเข้าใกล้ศูนย์) ในกรณีนี้log a ( c )เป็นขอบเขตล่างของ asymptotic สำหรับa bในรูปแบบ infinity แต่มันไม่ได้ผูกกับ asymptotic แบบ "ตึง" การใช้ศัพท์และสัญกรณ์นิยมโดย Cormen et al, (รู้เบื้องต้นเกี่ยวกับอัลกอริทึม, 3rd Edition) = ω ( เข้าสู่ระบบcloga(c)=ln(c)/ln(a)loga(c)aba )ab=ω(loga(c))

อัสสัมชั 2 : สมมติว่า จากนั้นเข้าสู่ระบบ ( ) = B จากนั้นbคงที่ในขณะที่a bโตขึ้นโดยไม่มีขอบเขตเหมือนกับแนวทางอนันต์ ดังนั้นl o g a ( c )อีกครั้งคือขอบเขตล่างเชิงเส้นกำกับ แต่ไม่แน่น ดังนั้น = ω ( เข้าสู่ระบบ ( ) )c=abloga(ab)=bbabloga(c)ab=ω(loga(c))

อัสสัมชั 3 : สมมติว่าจะอยู่ที่ประมาณข มันไม่มีความชัดเจนในความหมายของ 'ประมาณ' ที่นี่ แต่ถ้าเราคิดว่านี่หมายถึงa bคือขอบเขตของซีมโทติคที่แน่น (นั่นคือc = Θ ( a b )จากนั้นสิ่งนี้จะให้ผลลัพธ์เช่นเดียวกันcababc=Θ(ab)

กรณีที่ 2: เปรียบเทียบกับ1 /loga(c)c1/b

abc

cc1/bbc1/b=o(loga(c))

c=abloga(c)=ac1/b=aloga(c)=Θ(c1/b)

cababc

c1/bab

cc1/babc1/b=o(ab)

c=abc1/b=ab>1abc1/b

abc


ฉันจะแยกความคิดเห็นของฉันออกเป็นสองส่วน: โวหารและเนื้อหา ฉันขอขอบคุณที่คุณได้รวมสมการไว้ในโพสต์ของคุณ โปรดทำการฟอร์แมตพวกเขาใหม่เพื่อใช้ MathJax เพื่อให้แสดงผลได้ดี (เช่นในคำถามที่โพสต์) ในการใช้ประโยชน์จาก MathJax ให้ใช้สัญลักษณ์ LaTeX เมื่อเขียนสมการของคุณ สำหรับไพรเมอร์ในการเขียนคณิตศาสตร์ในน้ำยางให้ดูที่คู่มือนี้ในตำราหรือแนะนำสั้น ๆ นี้โดยสมาคมอเมริกันคณิตศาสตร์
Geoff Oxberry

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