หนึ่งในปัญหาของวิธีการของนิวตันคือต้องใช้การดำเนินการหารในแต่ละการวนซ้ำซึ่งเป็นการดำเนินการจำนวนเต็มพื้นฐานที่ช้าที่สุด
อย่างไรก็ตามวิธีการของนิวตันสำหรับสแควร์รูทซึ่งกันและกันกลับทำไม่ได้ ถ้าx คือหมายเลขที่คุณต้องการค้นหา 1x√ย้ำ:
Rฉัน+ 1=12Rผม( 3 - xR2ผม)
สิ่งนี้มักแสดงเป็น:
Wผม=R2ผม
dผม= 1 -Wผมx
Rฉัน+ 1=Rผม+Rผมdผม2
นั่นคือการคูณสามครั้ง การหารด้วยสองสามารถนำไปใช้เป็น shift-right ได้
ตอนนี้ปัญหาคือว่า Rไม่ใช่จำนวนเต็ม อย่างไรก็ตามคุณสามารถจัดการมันได้โดยการใช้ floating-point ด้วยตนเองและดำเนินการ shift หลายอย่างเพื่อชดเชยเมื่อเหมาะสม
ก่อนอื่นเรามาช่วยกัน x:
x'=2- 2 จx
ที่เราต้องการ x' จะมากกว่า แต่ใกล้กับ 1. หากเราเรียกใช้อัลกอริทึมด้านบนx' แทน xเราพบว่า r =1x√'. จากนั้นx--√=2อีRx'.
ตอนนี้มาแยกกัน R เป็นแมนทิสซาและเลขชี้กำลัง:
Rผม=2-อีผมR'ผม
ที่ไหน R'ผมเป็นจำนวนเต็ม สังหรณ์ใจอีผม แสดงถึงความแม่นยำของคำตอบ
เรารู้ว่าวิธีการของนิวตันประมาณสองเท่าของจำนวนนัยสำคัญที่แม่นยำ ดังนั้นเราสามารถเลือก:
อีฉัน+ 1= 2อีผม
ด้วยการจัดการเล็กน้อยเราพบ:
อีฉัน+ 1= 2อีผม
Wผม=R'ผม2
x'ผม=x22 e -อีฉัน+ 1
dผม=2อีฉัน+ 1-W'ผมx'ผม2อีฉัน+ 1
R'ฉัน+ 1=2อีผมR'ผม-R'ผมdผม2อีผม+ 1
ทุกครั้งที่มีการซ้ำ:
x--√≈R'ผมx2e+ei
ตัวอย่างเช่นลองคำนวณหาสแควร์รูทของ x=263. เรารู้ว่าคำตอบคือ2312–√. สแควร์รูทซึ่งกันและกันคือ12√2−31ดังนั้นเราจะตั้งค่า e=31 (นี่คือขนาดของปัญหา) และสำหรับการคาดเดาเริ่มต้นของเราเราจะเลือก r′0=3 และ e0=2. (นั่นคือเราเลือก34 สำหรับการประมาณการเบื้องต้นของเราถึง 12√.)
แล้ว:
e1=4,r′1=11
อี2= 8 ,R'2= 180
อี3= 16 ,R'3= 46338
อี4= 32 ,R'4= 3037000481
เราสามารถหาเวลาที่จะหยุดซ้ำได้โดยการเปรียบเทียบ อีผม ถึง e; ถ้าฉันคำนวณอย่างถูกต้องei>2eควรจะดีพอ เราจะหยุดที่นี่และค้นหา:
263−−−√≈3037000481×263231+32=3037000481
สแควร์รูทจำนวนเต็มที่ถูกต้องคือ 3037000499ดังนั้นเราค่อนข้างสนิทกัน เราสามารถทำซ้ำอีกครั้งหรือทำซ้ำขั้นสุดท้ายที่เพิ่มประสิทธิภาพซึ่งไม่ได้เป็นสองเท่าei. รายละเอียดจะถูกทิ้งไว้เป็นแบบฝึกหัด
ในการวิเคราะห์ความซับซ้อนของวิธีการนี้ให้สังเกตว่าการคูณสอง bจำนวนเต็มบิตจะใช้เวลา O(blogb)การดำเนินงาน อย่างไรก็ตามเราได้จัดเตรียมสิ่งต่าง ๆ เพื่อให้r′i<2ei. ดังนั้นการคูณเพื่อคำนวณwi คูณสอง eiตัวเลขบิตในการผลิต ei+1- จำนวนบิตและอีกสองคูณสองคูณสอง ei+1ตัวเลขบิตในการผลิต 2ei+1หมายเลขบิต
ในแต่ละกรณีจำนวนการดำเนินการต่อการทำซ้ำคือ O(eilogei)และมี O(loge)จำเป็นต้องทำซ้ำ การคูณสุดท้ายคือตามลำดับของO(2elog2e)การดำเนินงาน ดังนั้นความซับซ้อนโดยรวมก็คือO(elog2e) การดำเนินงานซึ่งเป็นกำลังสองย่อยในจำนวนบิตใน x. ที่ทำเครื่องหมายในช่องทั้งหมด
อย่างไรก็ตามการวิเคราะห์นี้ซ่อนหลักการสำคัญที่ทุกคนที่ทำงานกับจำนวนเต็มขนาดใหญ่ควรทราบ: เนื่องจากการคูณเป็น superlinear ในจำนวนบิตการดำเนินการคูณใด ๆ ควรดำเนินการกับจำนวนเต็มที่มีขนาดความแม่นยำในปัจจุบันโดยประมาณ (และ ฉันอาจเพิ่มคุณควรลองคูณตัวเลขเข้าด้วยกันซึ่งมีขนาดเท่ากัน) การใช้จำนวนเต็มที่มากกว่านั้นเสียความพยายาม ปัจจัยคงที่มีความสำคัญและสำหรับจำนวนเต็มขนาดใหญ่พวกมันมีความสำคัญมาก
เป็นการสังเกตครั้งสุดท้ายการคูณสองครั้งเป็นแบบฟอร์ม ab2c. เห็นได้ชัดว่ามันเป็นการสิ้นเปลืองในการคำนวณบิตทั้งหมดของab โยนเท่านั้น cของพวกเขาออกไปพร้อมกับกะ - ขวา การใช้วิธีการคูณแบบชาญฉลาดซึ่งคำนึงถึงสิ่งนี้ยังถือว่าเป็นแบบฝึกหัด