ผลต่างระหว่างรุ่นของ "ขั้นตอนวิธีของคาราซูบา"

เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
Nullzerobot (คุย | ส่วนร่วม)
เก็บกวาด
ย้อนการแก้ไขที่ 4605650 สร้างโดย Nullzerobot (พูดคุย)
บรรทัด 4:
== กระบวนการของขั้นตอนวิธีของคาราซูบาและการวิเคราะห์ประสิทธิภาพเชิงเวลา<ref>http://saahiihii.com/images/story/ENUBusiness1354DOCUMENT2.pdf</ref> ==
การคูณ เลข 2 จำนวน x, y ที่มีขนาด n หลัก เราสามารถเขียน x, y ใหม่ โดยใช้ จำนวน m โดยที่ m<n โดยที่เราจะเลือก m = n/2
::::: x = x<sub>1</sub>10<sup>m</sup>+x<sub>0</sub>
 
::::: y = y<sub>1</sub>10<sup>m</sup>+y<sub>0</sub>
 
ดังนั้น x คูณ y จะได้เป็น
::::: xy = ( x<sub>1</sub>10<sup>m</sup>+x<sub>0</sub>) (y<sub>1</sub>10<sup>m</sup>+y<sub>0</sub>) <br />
::::: xy = x<sub>1</sub> y<sub>1</sub>10<sup>2m</sup>+ (x<sub>1</sub> y<sub>0</sub>+ x<sub>0</sub> y<sub>1</sub>)10<sup>m</sup>+ x<sub>0</sub> y<sub>0</sub>
 
กำหนดให้
::::: A = x<sub>1</sub>y<sub>1</sub>
::::: B = x<sub>0</sub>y<sub>0</sub>
::::: C = (x<sub>1</sub>+x<sub>0</sub>)(y<sub>1</sub>+y<sub>0</sub>)
จะได้
::::: xy = A10<sup>2m</sup>+(C-A-B) 10<sup>m</sup>+B<br />
 
: ซึ่งจะเห็นได้ว่าเกิดการคูณกันแค่ 3 ครั้ง คือ A, B, C เกิดการบวกกัน 4 ครั้ง ลบกัน 2 ครั้ง โดยที่การบวก และการลบใช้เวลาคงตัวโดยใช้เวลาเป็นเชิงเส้น<br />
 
: ดังนั้น '''ประสิทธิภาพเชิงเวลา''' ของขั้นตอนวิธีของคาราซูบา โดยที่ n เป็นจำนวนหลักคือ<br />
:::: T (n) = 3T (n/2) +O (n)<br />
 
: โดยที่ 3T (n/2) มาจาก 3 คือการที่เราแบ่งแล้วเกิดการคูณกัน 3 ที n/2 มาจากที่เราแบ่งจำนวนหลักของข้อมูลเป็นครึ่งหนึ่ง<br />
 
: จาก T (n) = 3T (n/2) +O (n) เราสามารถใช้ [[:en:master theorem|master theorem]] ลดรูปจนได้ T (n) = O (n<sup>log 3/log 2</sup>) ≈ '''O (n<sup>1.58</sup>)'''<br />
 
== รหัสเทียม ==
<source lang="text">
1: //input x, y (n digit integers)
2: //output x*y
3:
4: int karatsuba(int x, int y) {
5: if(n=1)
6: return x*y
7: else
8: //แบ่ง x, y เป็นครึ่งๆ
9: x = x1*10^(n/2) + x0
10: y = y1*10^(n/2) + y0
11: A = karatsuba(x1,y1)
12: B = karatsuba(x0,y0)
13: C = karatsuba(x1 + x0, y1 + y0)
14: D = C - A - B
15: return A*10^n + D*10^(n/2) + B
16: }
</source>
 
บรรทัด 53:
== ตัวอย่าง ==
การคูณเลข 2 จำนวน 5678×8765
:::: 5678 = 56×10<sup>2</sup> + 78
:::: 8765 = 87×10<sup>2</sup> + 65
:::: 5678×8765 = (56×10<sup>2</sup> + 78)(87×10<sup>2</sup> + 65)
::::::: = (56×87) 10<sup>4</sup> + ((56+78)(87+65) − (56×87) − (78×65)) 10<sup>2</sup> + (78×65)
::::::: = 4872×10<sup>4</sup> + 10426×10<sup>2</sup> + 5070
::::::: = 49767670
: การคูณของพหุนาม 2 จำนวน<ref>http://www.ccas.ru/personal/karatsuba/divcen.htm</ref> (a + bx) (c + dx)
:::: (a + bx)(c + dx) = ac + ((a+b)(c+d) − ac − bd)x + bdx<sup>2</sup>
::::::: = ac + (ad+bc)x + bdx<sup>2</sup>
 
== อ้างอิง ==