พอร์ทัลข้อมูลและความบันเทิง
ค้นหาไซต์

อัลกอริทึมแบบยุคลิด การค้นหาโหนดโดยใช้อัลกอริทึมแบบยุคลิดและการใช้ข้อความการแยกตัวประกอบเฉพาะในหัวข้ออัลกอริทึมแบบยุคลิด

เส้นแบ่งร่วมที่ยิ่งใหญ่ที่สุดของตัวเลขภูมิภาคสองตัวที่ $a$ และ $b$ - $GCD(a, b)$ - คือจำนวนที่มากที่สุด โดยที่ $a$ และ $b$ บางตัวจะถูกหารโดยไม่มีเศษ

หากต้องการค้นหา $GCD(a, b)$ คุณสามารถดำเนินการด้วยวิธีธรรมชาติต่อไปนี้: แยกตัวเลขทั้งสอง la ด้วยกำลังของจำนวนเฉพาะ: $a = 2^(\alpha_1) \cdot 3^(\alpha_2) \cdot \ldots \cdot p^(\alpha_n)_n$ , $b = 2 ^(\beta_1) \cdot 3^(\beta_2) \cdot \ldots \cdot p^(\beta_n)_n$ , ($\alpha_k$ และ $ \beta_k$ สามารถเท่ากับศูนย์ได้) จากนั้น $$GCD(a, b) = 2^(\min(\alpha_1, \beta_1)) \cdot 3^(\min(\alpha_2, \beta_2)) \cdot \ldots \cdot p^(\ min( \alpha_n, \beta_n))_n.$$ ตัวอย่างเช่น หากต้องการค้นหาค่าทั่วไปที่สุดของ $2625$ และ $8100 $ เราจะได้: $2625 = 2^0 \cdot 3^1 \cdot 5^3 \cdot 7^1, 8100 = 2^2 \cdot 3^4 \cdot 5^2 \cdot 7^0$ หมายถึง $GCD(2625, 8100) = 2^0 \cdot 3^1 \cdot 5^2 \cdot 7^0 = 75$.

ข้อเสียเปรียบที่สำคัญของวิธีนี้คือการแบ่งจำนวนจำนวนมากออกเป็นชุดง่ายๆ นั้นไม่ง่ายนัก หรือค่อนข้างจะไม่เร็วนัก

Euclid ในหนังสือเล่มที่ 7 "จุดเริ่มต้น" บรรยายถึงจังหวะอัลโก-ริธึมของ "การวัดตัวเลขสองตัวทั่วไป" อัล-โก-ริธึมอธิบายโดย geo-met-ri-che-ski ว่าเป็นความคล้ายคลึงกันของการวัดสองครั้งทั่วไป มันเดือดลงไปที่ "การติดตามผลจากประชาชาติ" จากผู้ยิ่งใหญ่จากผู้เล็กจากการตัด ทีนี้ อัลโกจังหวะจากกำแพงก็เหมือนกับอัลโกจังหวะของ Ev-kli-da ในการค้นหา de-li-เหล่านั้นที่พบบ่อยที่สุด - สำหรับตัวเลขสองตัวบนธรรมชาติ

แนวคิดพื้นฐานที่ใช้อัลโกริทึมคือ $GCD$ ตัวเลข $a$ และ $b$ เท่ากับ $ GCD$ chi-sel $b$ และ $a-b$ จากตรงนี้จะตามมาว่าหากคุณบวก $a$ เข้ากับ $b$ ด้วยเศษที่เหลือ นั่นคือ แสดงในรูปแบบ $a = b \cdot q + r$ จากนั้น $GCD(a, b) = GCD(b, r)$

เราจะอธิบาย geo-met-ri-che-skaya ที่สวยงาม in-ter-pre-ta-tion ของ al-go-rit-ma, inter-active-tiv-naya re-a-li-za -tion ของบางสิ่งบางอย่าง ต่อหน้า-อันเดียวกัน-สูงกว่า

ในมุมตรงที่มีด้านยาว $a$ และ $b$ สำหรับสี่เหลี่ยมจัตุรัสที่ใหญ่ที่สุดที่เป็นไปได้ ในถ่านหินตรงที่เหลือ เราจะหากำลังสองสูงสุดที่เป็นไปได้อีกครั้ง และต่อไปเรื่อยๆ จนกระทั่งครอบคลุมสี่เหลี่ยมเดิมทั้งหมด ความยาวของรูปสี่เหลี่ยมจัตุรัสคือ 100 และจะเท่ากับ $GCD(a, b)$

รายละเอียดเพิ่มเติม แต่ geo-met-ri-che-skaya in-ter-pre-ta-tion op-sa-na ด้านล่างและ par-ral-lel-but with-ve-de-but arif-me-ti- เช-สโค โอปิส-ซา-นี อัล-โก-ริต-มา เอฟ-คลิ-ดา

อินเตอร์-พรี-ทา-ชั่น อัล-โก-ริต-มา อัล-โก-ริทึม เอฟ-คลิ-ดา
ในมุมสี่เหลี่ยมที่มีด้านยาว $a$ และ $b$ $(a \gt b)$ สำหรับสี่เหลี่ยมจัตุรัสขนาดเล็กที่สวยที่สุด (มีร้อย $b$) การดำเนินการนี้ซ้ำแล้วซ้ำอีกสำหรับชิ้นส่วนที่ไม่ได้ทาสีให้มากที่สุดเท่าที่จะเป็นไปได้ $a$ จำนวนที่มากกว่าจะถูกหารด้วยส่วนที่เหลือด้วยจำนวนที่น้อยกว่า $b$: $a = b \cdot q_1 + r_1$
หากสี่เหลี่ยมจัตุรัสดังกล่าวครอบคลุมทั้งสี่เหลี่ยมจัตุรัส ตัวเลข $b$ จะเป็น $GCD$ หากส่วนที่เหลือของ $r_1$ ปัจจุบันจากการดำเนินการเท่ากับศูนย์ ดังนั้นจำนวนที่น้อยกว่า $b$ จะเป็น $GCD$
หากมีสี่เหลี่ยมเหลืออยู่ (มีหลายร้อย $b$ และ $r_1$) มันจะมีคอสีมากที่สุดในจำนวนกำลังสองที่มีขนาดสูงสุด (มีร้อย $r_1$) ถ้าเศษของ $r_1$ ไม่เท่ากับศูนย์ ดังนั้นจำนวน $b$ ที่น้อยกว่าจะถูกหารด้วยเศษของ $r_1$: $b = r_1 \cdot q_2 + r_2 $
ถ้าสี่เหลี่ยมจัตุรัสที่มีร้อย $r_1$ ครอบคลุมทั้งสี่เหลี่ยม แล้ว $r_1$ ก็คือ $gcd$ จากผลของการลบครั้งที่สอง หากส่วนที่เหลือของ $r_2$ ปัจจุบันเท่ากับศูนย์ ดังนั้น $r_1$ จะเป็น $GCD$
ถ้ายังมีสี่เหลี่ยมเหลืออยู่ (โดยมีศตวรรษ $r_1$ และ $r_2$) แสดงว่าจะมีคอสีมากที่สุดคือจำนวนช่องสี่เหลี่ยมที่มีขนาดสูงสุด (มีร้อย $r_2$) หากส่วนที่เหลือของ $r_2$ ปัจจุบันในส่วนที่สองไม่เท่ากับศูนย์ ดังนั้น $r_1$ จะถูกหารด้วย $r_2$: $r_1 = r_2 \cdot q_3 + r_3$
และต่อไปเรื่อยๆ จนกระทั่งสี่เหลี่ยมเดิมทั้งหมดถูกตัดเป็นสี่เหลี่ยมจัตุรัส (ไม่ช้าก็เร็วสิ่งนี้จะเกิดขึ้นเมื่อสี่เหลี่ยมจัตุรัสหลายร้อยช่องลดลงและไม่ว่าในกรณีใดก็เป็นไปได้ที่จะพับครึ่งด้ายของสี่เหลี่ยมจัตุรัสที่เหลือด้วยหนึ่งร้อยหน่วย) และต่อไปเรื่อยๆ จนกว่าเศษ $r_n$ จะเท่ากับศูนย์ (ไม่ช้าก็เร็วสิ่งนี้จะเกิดขึ้น เนื่องจาก -ku-remains จะลดลง)
ความยาวของสี่เหลี่ยมจัตุรัส 100 mi-no-small-no-go คือ $NOD$ ของตัวเลขต้นทาง เศษปัจจุบันที่ไม่ใช่ศูนย์สุดท้าย $r_(n-1)$ คือ $GCD$ ของตัวเลขเริ่มต้น

Al-go-rhythm ของ Ev-kli-da เป็นเครื่องมืออันทรงพลังที่ใช้ในการแก้ปัญหาส่วนตัวต่างๆ ตัวอย่างเช่น ใช้ในการแก้สมการของจำนวนเต็ม โดยนำเสนอตัวเลขในรูปของเศษส่วนที่หักค่าคงที่ (ลูกโซ่) สามารถสรุปได้ทั่วไปเพื่อค้นหา de-li-the two-go-member-nov ที่พบมากที่สุด

วรรณกรรม

ยุคลิด. ณ-จะ-ลา เอฟ-คลิ-ดา. หนังสือ VII, X. - M.-L.: GITTL, 1950.

อาร์. คูรันต์, จี. ร็อบบินส์. มา-เต-มา-ติ-กา นี้คืออะไร? - อ.: MTsNMO, 2010.

อัลกอริทึมแบบยุคลิดสำหรับการค้นหา GCD (ตัวหารร่วมมาก)

ให้จำนวนเต็มที่ไม่เป็นลบสองตัว และ คุณต้องค้นหาตัวหารร่วมที่ยิ่งใหญ่ที่สุด เช่น จำนวนที่มากที่สุดที่เป็นตัวหารของทั้งสอง และ ในภาษาอังกฤษ "ตัวหารร่วมมาก" เขียนว่า "ตัวหารร่วมมาก" และมีชื่อเรียกทั่วไปว่า:

(ในที่นี้สัญลักษณ์ "" หมายถึง การแบ่งแยก กล่าวคือ "" หมายถึง "การแบ่ง")

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

อัลกอริธึมของยุคลิดตามที่กล่าวไว้ด้านล่างนี้ แก้ปัญหาการหาตัวหารร่วมมากของตัวเลขสองตัว และ สำหรับ

อัลกอริธึมนี้ถูกอธิบายครั้งแรกใน Euclid's Elements (ประมาณ 300 ปีก่อนคริสตกาล) แม้ว่าจะมีความเป็นไปได้ค่อนข้างมากที่อัลกอริธึมนี้มีต้นกำเนิดมาก่อนหน้านี้

อัลกอริทึม

อัลกอริธึมนั้นง่ายมากและมีคำอธิบายตามสูตรต่อไปนี้:

การนำไปปฏิบัติ

int gcd (int a, int b) ( ถ้า (b == 0 ) ส่งคืน a; อย่างอื่นส่งคืน gcd (b, a % b) ; )

การใช้ตัวดำเนินการตามเงื่อนไขแบบไตรภาคของ C++ ทำให้อัลกอริทึมสามารถเขียนได้สั้นยิ่งขึ้น:

int gcd (int a, int b) ( กลับ b ? gcd (b, a % b) : a; )

สุดท้ายนี้ เราขอนำเสนออัลกอริธึมรูปแบบไม่เกิดซ้ำ:

int gcd (int a, int b) ( while (b) ( a % = b; swap (a, b) ; ) ส่งคืน a; )

หลักฐานความถูกต้อง

ขั้นแรก โปรดทราบว่าในแต่ละการวนซ้ำของอัลกอริทึมแบบยุคลิด อาร์กิวเมนต์ที่สองของมันจะลดลงอย่างเคร่งครัด ดังนั้น เนื่องจากมันไม่ใช่ค่าลบ ดังนั้นอัลกอริทึมแบบยุคลิด เสร็จสิ้นเสมอ.

สำหรับ หลักฐานความถูกต้องเราต้องแสดงสิ่งนั้นสำหรับสิ่งใดๆ >

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

มาแสดงกันเถอะ - จากนั้นตามคำจำกัดความ และ .

แต่แล้วมันก็เป็นไปตามจากที่นี่:

เมื่อนึกถึงข้อความนี้ เราได้รับระบบ:

ตอนนี้ให้เราใช้ข้อเท็จจริงง่ายๆ ต่อไปนี้: ถ้าสำหรับตัวเลขสามตัว: และ แล้วยังถือ: ในสถานการณ์ของเราเราได้รับ:

หรือแทนที่คำจำกัดความเป็น เราได้รับ:

ดังนั้นเราจึงได้พิสูจน์ไปครึ่งหนึ่งแล้ว: เราได้แสดงให้เห็นว่าด้านซ้ายแบ่งด้านขวา การพิสูจน์ครึ่งหลังก็ทำในลักษณะเดียวกัน

ชั่วโมงทำงาน

ประมาณเวลาทำงานของอัลกอริทึม ทฤษฎีบทของลาเมซึ่งสร้างความเชื่อมโยงที่น่าประหลาดใจระหว่างอัลกอริทึมแบบยุคลิดและลำดับฟีโบนัชชี:

ถ้า > และสำหรับบางรายการ อัลกอริธึมแบบยุคลิดจะไม่ทำการเรียกซ้ำอีกต่อไป

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

YouTube สารานุกรม

    1 / 5

    √ คณิตศาสตร์ จำนวนธรรมชาติ: อัลกอริธึมของ Euclid ศูนย์การเรียนรู้ออนไลน์ Foxford

    √อัลกอริทึมแบบยุคลิด

    √ อัลกอริทึมแบบยุคลิด วิธีที่รวดเร็วในการค้นหา GCD

    √ คณิตศาสตร์ 71 ตัวหารร่วมมาก อัลกอริทึมของ Euclid - Academy of Entertainment Sciences

    , 20 ในขณะที่อัลกอริทึม Python แบบวนซ้ำ

    คำบรรยาย

เรื่องราว

นักคณิตศาสตร์ชาวกรีกโบราณเรียกอัลกอริทึมนี้ว่า ἀνθυφαίρεσις หรือ ἀνταναίρεσις - "การลบซึ่งกันและกัน" Euclid ไม่ได้ค้นพบอัลกอริธึมนี้เนื่องจากมีการกล่าวถึงแล้วใน โทพีกาอริสโตเติล ใน องค์ประกอบของยุคลิด มีการอธิบายไว้สองครั้ง ในเล่มที่ 7 เพื่อค้นหาตัวหารร่วมที่มากที่สุดของจำนวนธรรมชาติ 2 จำนวน และในเล่ม X เพื่อค้นหาหน่วยวัดร่วมที่ยิ่งใหญ่ที่สุดของปริมาณที่เป็นเนื้อเดียวกันสองจำนวน ในทั้งสองกรณี จะมีคำอธิบายทางเรขาคณิตของอัลกอริทึมสำหรับการค้นหา "การวัดทั่วไป" ของทั้งสองส่วน

คำอธิบาย

อัลกอริทึมของ Euclid สำหรับจำนวนเต็ม

อนุญาต ก (\displaystyle ก)และ ข (\displaystyle b)- จำนวนเต็มที่ไม่เท่ากับศูนย์ในเวลาเดียวกัน และลำดับของตัวเลข

a > b > r 1 > r 2 > r 3 > r 4 > … > r n (\displaystyle a>b>r_(1)>r_(2)>r_(3)>r_(4)>\ \dots \ >r_(n))

กำหนดโดยข้อเท็จจริงที่ว่าแต่ละ rk (\displaystyle r_(k))- นี่คือเศษที่เหลือจากการหารหมายเลขก่อนหน้าด้วยหมายเลขก่อนหน้าและหมายเลขสุดท้ายหารด้วยหมายเลขสุดท้ายอย่างสมบูรณ์นั่นคือ:

a = b q 0 + r 1 , (\displaystyle a=bq_(0)+r_(1),) b = r 1 q 1 + r 2 , (\displaystyle b=r_(1)q_(1)+r_(2),) r 1 = r 2 q 2 + r 3 , (\displaystyle r_(1)=r_(2)q_(2)+r_(3),) ⋯ (\displaystyle \cdots) r k − 2 = r k − 1 q k − 1 + r k , (\displaystyle r_(k-2)=r_(k-1)q_(k-1)+r_(k),) ⋯ (\displaystyle \cdots) r n − 2 = r n − 1 q n − 1 + r n , (\displaystyle r_(n-2)=r_(n-1)q_(n-1)+r_(n),) r n − 1 = r n q n (\displaystyle r_(n-1)=r_(n)q_(n).)

จากนั้น GCD( , ) ตัวหารร่วมมาก และ มีค่าเท่ากัน n ซึ่งเป็นพจน์ที่ไม่เป็นศูนย์สุดท้ายของลำดับนี้

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

ความถูกต้องอัลกอริทึมนี้ตามมาจากสองคำสั่งต่อไปนี้:

  • อนุญาต = ถาม + จากนั้น gcd (a, b) = gcd (b, r)

การพิสูจน์

  • จีซีดี( , 0) = สำหรับค่าที่ไม่ใช่ศูนย์ใดๆ (เนื่องจาก 0 หารด้วยจำนวนเต็มใดๆ ที่ไม่ใช่ศูนย์)

อัลกอริทึมแบบยุคลิดเรขาคณิต

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

ตัวอย่าง

เพื่อแสดงตัวอย่าง อัลกอริธึมแบบยุคลิดจะถูกใช้เพื่อค้นหา GCD = 1,071 และ = 462 ขั้นแรก ลบผลคูณของ 462 จาก 1,071 จนกว่าเราจะได้ผลต่างน้อยกว่า 462 เราต้องลบ 462 สองครั้ง ( ถาม 0 = 2) เหลือเศษ 147:

1,071 = 2 × 462 + 147

จากนั้นลบผลคูณของ 147 จาก 462 จนกว่าเราจะได้ผลต่างน้อยกว่า 147 เราต้องลบ 147 สามครั้ง ( ถาม 1 = 3) เหลือเศษ 21:

462 = 3 × 147 + 21.

จากนั้นลบผลคูณของ 21 จาก 147 จนกระทั่งผลต่างน้อยกว่า 21 เราต้องลบ 21 เจ็ดครั้ง ( ถาม 2 = 7) ไม่เหลือเศษ:

147 = 7 × 21 + 0

ดังนั้นลำดับ a > b > 1 > 2 > 3 > … > n ในกรณีนี้จะมีลักษณะดังนี้:

1071 > 462 > 147 > 21.

เนื่องจากเศษสุดท้ายเป็นศูนย์ อัลกอริทึมจึงลงท้ายด้วยตัวเลข 21 และ gcd(1071, 462) = 21

ในรูปแบบตาราง มีขั้นตอนดังนี้

การใช้งาน

อัลกอริธึมแบบยูคลิดแบบขยายและความสัมพันธ์ของเบซูต์

สูตรสำหรับ r ฉัน (\displaystyle r_(i))สามารถเขียนใหม่ได้ดังนี้:

r 1 = a + b (− q 0) (\displaystyle r_(1)=a+b(-q_(0))) r 2 = b − r 1 q 1 = a (− q 1) + b (1 + q 1 q 0) (\displaystyle r_(2)=b-r_(1)q_(1)=a(-q_( 1))+b(1+q_(1)q_(0))) ⋮ (\displaystyle \vdots) จีซีดี (a , b) = r n = a s + b t (\displaystyle (a,b)=r_(n)=as+bt)

ที่นี่ และ ทีทั้งหมด. การแทนตัวหารร่วมที่ยิ่งใหญ่ที่สุดนี้เรียกว่าความสัมพันธ์แบบเบซูต์และตัวเลข และ ที- ค่าสัมประสิทธิ์เบซูต์ ความสัมพันธ์ของเบซูต์เป็นกุญแจสำคัญในการพิสูจน์บทแทรกของยุคลิดและทฤษฎีบทพื้นฐานของเลขคณิต

เศษส่วนต่อ

อัลกอริธึมของ Euclid ค่อนข้างสัมพันธ์กับเศษส่วนต่อเนื่องอย่างใกล้ชิด ทัศนคติ /สามารถแสดงเป็นเศษส่วนต่อเนื่องได้:

เป็น ข = [ คิว 0 ; q 1 , q 2 , ⋯ , q n ] (\displaystyle (\frac (a)(b))=).

ในกรณีนี้ เศษส่วนต่อเนื่องที่ไม่มีเทอมสุดท้ายจะเท่ากับอัตราส่วนของสัมประสิทธิ์เบซูต์ ที/ถ่ายด้วยเครื่องหมายลบ:

[คิว 0 ; q 1 , q 2 , ⋯ , q n − 1 ] = − t s (\displaystyle =-(\frac (t)(s))).

ลำดับความเท่าเทียมกันที่กำหนดอัลกอริทึมแบบยุคลิดสามารถเขียนใหม่ได้ในรูปแบบ:

a b = q 0 + r 0 b b r 0 = q 1 + r 1 r 0 r 0 r 1 = q 2 + r 2 r 1 ⋮ r k − 2 r k − 1 = q k + rk rk − 1 ⋮ r N − 2 r N − 1 = q N (\displaystyle (\begin(aligned)(\frac (a)(b))&=q_(0)+(\frac (r_(0))(b))\\(\frac (b) )(r_(0)))&=q_(1)+(\frac (r_(1))(r_(0)))\\(\frac (r_(0))(r_(1)))& =q_(2)+(\frac (r_(2))(r_(1)))\\&()\ \vdots \\(\frac (r_(k-2))(r_(k-1) ))&=q_(k)+(\frac (r_(k))(r_(k-1)))\\&()\ \vdots \\(\frac (r_(N-2))(r_ (N-1)))&=q_(N)\end(ชิด)))

เทอมสุดท้ายทางด้านขวาของสมการจะเท่ากับค่าผกผันของด้านซ้ายของสมการต่อไปนี้เสมอ ดังนั้น สองสมการแรกสามารถรวมกันได้ในรูปแบบ:

a b = q 0 + 1 q 1 + r 1 r 0 (\displaystyle (\frac (a)(b))=q_(0)+(\cfrac (1)(q_(1)+(\cfrac (r_( 1))(r_(0))))))

ความเท่าเทียมกันที่สามสามารถใช้เพื่อแทนที่ตัวส่วนของนิพจน์ได้ 1 / 0 เราได้รับ:

a b = q 0 + 1 q 1 + 1 q 2 + r 2 r 1 (\displaystyle (\frac (a)(b))=q_(0)+(\cfrac (1)(q_(1)+(\ cfrac (1)(q_(2)+(\cfrac (r_(2))(r_(1))))))))

อัตราส่วนคงเหลือล่าสุด เค / เค−1 สามารถแทนที่ได้เสมอโดยใช้สมการถัดไปในลำดับ และต่อๆ ไปจนกระทั่งสมการสุดท้าย ผลลัพธ์ที่ได้คือเศษส่วนต่อเนื่อง:

ab = q 0 + 1 q 1 + 1 q 2 + 1 ⋱ + 1 q N = [ q 0 ; q 1 , q 2 , … , q N ] (\displaystyle (\frac (a)(b))=q_(0)+(\cfrac (1)(q_(1)+(\cfrac (1)(q_ (2)+(\cfrac (1)(\ddots +(\cfrac (1)(q_(N))))))))=)

อัลกอริธึมแบบยุคลิดทั่วไปสำหรับพหุนาม

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

ตัวอย่างแหวน ซี[x]

ให้ cont(f) ตามนิยามเป็น gcd ของสัมประสิทธิ์ของพหุนาม f(x) จาก Z[x] - เนื้อหาพหุนาม เรียกผลหารของ f(x) หารด้วย cont(f) ส่วนดั้งเดิมพหุนาม f(x) และเขียนแทนด้วย primpart(f(x)) คำจำกัดความเหล่านี้จำเป็นต่อการค้นหา gcd ของพหุนามสองตัว p1(เอ็กซ์)และ p2(x)ในวงแหวน Z[x] สำหรับพหุนามมากกว่าจำนวนเต็ม ต่อไปนี้เป็นจริง:

C o n t ((\displaystyle cont()นอดนอด ( c o n t (p 1 (x)) , c o n t (p 2 (x)) , (\displaystyle \(cont(p_(1)(x)),cont(p_(2)(x))\),)

P r i m p a r t ((\displaystyle primpart()จีซีดี ( หน้า 1 (x) , หน้า 2 (x) )) = (\displaystyle \(p_(1)(x),p_(2)(x)\))=)จีซีดี ( p r i m p a r t (p 1 (x)), p r i m p a r t (p 2 (x)) . (\displaystyle \(primpart(p_(1)(x)),primpart(p_(2)(x))\).)

ดังนั้น ปัญหาในการค้นหา GCD ของพหุนามตามอำเภอใจสองตัวจึงลดลงเหลือเพียงปัญหาในการค้นหา GCD ของพหุนามดั้งเดิม

ให้มีพหุนามดั้งเดิมสองตัว p 1 (x) และ p 2 (x) จาก Z[x] โดยที่ความสัมพันธ์ระหว่างกำลังทั้งสองมีอยู่: deg(p 1 (x)) = m และ deg(p 2 (x) ) = n, ม. > n การหารพหุนามด้วยเศษจะถือว่าการหารค่าสัมประสิทธิ์สูงสุดของเงินปันผลลงตัวกับค่าสัมประสิทธิ์สูงสุดของตัวหาร ในกรณีทั่วไป ไม่สามารถทำการหารด้วยเศษได้ ดังนั้นจึงมีการใช้อัลกอริธึมการหารหลอก ซึ่งยังคงอนุญาตให้ได้รับผลหารหลอกและเศษหลอก (เปรม) ซึ่งจะอยู่ในเซตของพหุนามมากกว่าจำนวนเต็ม

โดยการหารหลอก เราหมายความว่าการหารนั้นนำหน้าด้วยการคูณพหุนาม หน้า 1 (x) (\displaystyle p_(1)(x))บน (lc (p 2 (x))) m − n + 1 (\displaystyle (lc(p_(2)(x)))^(m-n+1)), นั่นคือ

L c (p 2 (x)) m − n + 1 p 1 (x) = p 2 (x) q (x) + r 2 (x) , องศา ⁡ (r (x))< deg ⁡ (p 2 (x)) , {\displaystyle lc(p_{2}(x))^{m-n+1}p_{1}(x)=p_{2}(x)q(x)+r_{2}(x),\deg(r(x))<\deg(p_{2}(x)),}

ที่ไหน q (x) (\displaystyle q(x))และ r (x) (\displaystyle r(x))- ผลหารหลอกและส่วนที่เหลือหลอกตามลำดับ

ดังนั้น, p 1 (x) , p 2 (x) ∈ Z [ x ] (\displaystyle p_(1)(x),p_(2)(x)\in Z[x]), และ องศา ⁡ (p 1) = n 1 ≥ องศา ⁡ (p 2) = n 2 (\displaystyle \deg(p_(1))=n_(1)\geq \deg(p_(2))=n_(2) )- จากนั้นอัลกอริทึมแบบยุคลิดประกอบด้วยขั้นตอนต่อไปนี้:

1. การคำนวณเนื้อหา GCD:

C:= (\displaystyle c:=)จีซีดี ( c o n t (p 1) , c o n t (p 2) ) (\displaystyle \(cont(p_(1)),cont(p_(2))\)).

2. การคำนวณส่วนดั้งเดิม:

P 1 ′ (x) := p r i mp r t (p 1 (x)) ; (\displaystyle p_(1)"(x):=primpart(p_(1)(x));)

P 2 ′ (x) := p r ฉัน p a r t (p 2 (x)) . (\displaystyle p_(2)"(x):=primpart(p_(2)(x)).)

3. การสร้างลำดับของเศษพหุนาม:

P 1 ′ (x) , (\displaystyle p_(1)"(x),)

P 2 ′ (x) , (\displaystyle p_(2)"(x),)

P 3 (x) := p r e m (p 1 ′ (x) , p 2 ′ (x)) , (\displaystyle p_(3)(x):=prem(p_(1)"(x),p_(2 )"(x)),)

P 4 (x) := p r e m (p 2 ′ (x) , p 3 (x)) , (\displaystyle p_(4)(x):=prem(p_(2)"(x),p_(3) (เอ็กซ์)))

P 5 (x) := p re m (p 3 (x) , p 4 (x)) , (\displaystyle p_(5)(x):=prem(p_(3)(x),p_(4)(x) )))

-

-

อัลกอริธึมของยุคลิด-

(\displaystyle ...) P h (x) := p r e ม (p h − 2 (x) , p h − 1 (x)) . (\displaystyle p_(h)(x):=prem(p_(h-2)(x),p_(h-1)(x)).)

เป็นอัลกอริทึมสำหรับค้นหาตัวหารร่วมมาก (GCD) ของจำนวนเต็มคู่

  1. ตัวหารร่วมมาก (GCD)
  2. คือตัวเลขที่หารตัวเลขสองตัวโดยไม่มีเศษและสามารถหารตัวเองได้โดยไม่มีเศษเหลือด้วยตัวหารอื่นๆ ของตัวเลขสองตัวที่กำหนด พูดง่ายๆ คือ นี่คือจำนวนที่มากที่สุดซึ่งสามารถหารตัวเลขสองตัวที่ต้องการหา gcd ได้โดยไม่มีเศษ
  3. อัลกอริทึมสำหรับการค้นหา GCD ตามการแบ่ง
  4. หารจำนวนที่มากกว่าด้วยจำนวนที่น้อยกว่า.

หากหารโดยไม่มีเศษ จำนวนที่น้อยกว่าคือ GCD (คุณควรออกจากวงจร)
หากมีเศษเหลือ ให้แทนที่จำนวนที่มากกว่าด้วยเศษที่เหลือของการหาร
เรามาต่อกันที่จุดที่ 1 กันเลย
ตัวอย่าง:
ค้นหา gcd สำหรับ 30 และ 18
30/18 = 1 (เหลือ 12)
18/12 = 1 (เหลือ 6)

12/6 = 2 (เหลือ 0)

สิ้นสุด: GCD เป็นตัวหารของ 6

GCD(30, 18) = 6

  1. a = 50 b = 130 ในขณะที่ a != 0 และ b != 0 : if a > b: a = a % b else : b = b % a print (a + b)
  2. หากผลลัพธ์เป็น 0 แสดงว่าตัวเลขเท่ากันและเป็น GCD (คุณควรออกจากลูป)
  3. หากผลลัพธ์ของการลบไม่เท่ากับ 0 ให้แทนที่จำนวนที่มากกว่าด้วยผลลัพธ์ของการลบ
  4. หารจำนวนที่มากกว่าด้วยจำนวนที่น้อยกว่า.

หากหารโดยไม่มีเศษ จำนวนที่น้อยกว่าคือ GCD (คุณควรออกจากวงจร)
หากมีเศษเหลือ ให้แทนที่จำนวนที่มากกว่าด้วยเศษที่เหลือของการหาร
30 - 18 = 12
18 - 12 = 6
12 - 6 = 6
6 - 6 = 0
สิ้นสุด: GCD เป็นส่วนย่อยหรือส่วนย่อย
18/12 = 1 (เหลือ 6)

a = 50 b = 130 ในขณะที่ a != b: if a > b: a = a - b else : b = b - a print (a)

อัลกอริธึมของยุคลิด

ตัวหารร่วมมาก

พิจารณาปัญหาต่อไปนี้: คุณต้องเขียนโปรแกรมเพื่อหาตัวหารร่วมมาก (GCD) ของจำนวนธรรมชาติสองตัว

มาจำคณิตศาสตร์กันเถอะ ตัวหารร่วมที่ยิ่งใหญ่ที่สุดของจำนวนธรรมชาติสองตัวคือจำนวนธรรมชาติที่ใหญ่ที่สุดซึ่งหารลงตัวเท่ากัน ตัวอย่างเช่น ตัวเลข 12 และ 18 มีตัวประกอบร่วม: 2, 3, 6 ตัวประกอบร่วมที่ยิ่งใหญ่ที่สุดคือหมายเลข 6 ซึ่งเขียนได้ดังนี้:

GCD(12, 18) = 6.

ให้เราแสดงข้อมูลเริ่มต้นเป็น M u N คำชี้แจงปัญหามีดังนี้:
ที่ให้ไว้:เอ็ม เอ็น
หา: GCD(ม, ยังไม่มีข้อความ)

ในกรณีนี้ ไม่จำเป็นต้องมีการกำหนดรูปแบบทางคณิตศาสตร์เพิ่มเติม การกำหนดปัญหานั้นมีลักษณะทางคณิตศาสตร์ที่เป็นทางการ ไม่มีสูตรในการคำนวณ GCD(M, N) จากค่าของ M และ N แต่เมื่อนานมาแล้วก่อนที่จะมีการถือกำเนิดของคอมพิวเตอร์จึงทราบวิธีการอัลกอริทึมในการแก้ปัญหานี้ ก็เรียกว่า อัลกอริทึมแบบยุคลิด .

แนวคิดของอัลกอริธึม Euclid

แนวคิดของอัลกอริธึมนี้ขึ้นอยู่กับคุณสมบัติที่ว่าถ้า M>N แล้ว

GCD(M, N) = GCD(M - N, N)

กล่าวอีกนัยหนึ่ง gcd ของจำนวนธรรมชาติสองตัวจะเท่ากับ gcd ของผลต่างเชิงบวก (โมดูลัสของผลต่าง) และจำนวนที่น้อยกว่า

มันง่ายที่จะพิสูจน์คุณสมบัตินี้ ให้ K เป็นตัวหารร่วมของ M u N (M> N) ซึ่งหมายความว่า M = mK, N = nK โดยที่ m, n คือตัวเลขธรรมชาติ และ m > n จากนั้น M - N = K(m - n) ซึ่งหมายความว่า K เป็นตัวหารของตัวเลข M - N ซึ่งหมายความว่าตัวหารร่วมทั้งหมดของตัวเลข M และ N เป็นตัวหารของผลต่าง M - N รวมถึงตัวหารที่ยิ่งใหญ่ที่สุดด้วย ตัวหารร่วม

คุณสมบัติที่ชัดเจนประการที่สอง:

GCD(M, M) = ม.

สำหรับการนับแบบ "ด้วยตนเอง" อัลกอริทึมแบบยุคลิดจะมีลักษณะดังนี้:

1) หากตัวเลขเท่ากันให้นำคำตอบใด ๆ มาเป็นคำตอบ มิฉะนั้นดำเนินการอัลกอริทึมต่อไป

2) แทนที่จำนวนที่มากขึ้นด้วยความแตกต่างระหว่างจำนวนที่มากกว่าและน้อยกว่า

3) กลับสู่ขั้นตอนที่ 1

ลองพิจารณาอัลกอริทึมนี้โดยใช้ตัวอย่างของ M=32, N=24:

โครงสร้างของอัลกอริธึมเป็นแบบ while-loop พร้อมการแยกย่อยแบบซ้อน วงจรจะทำซ้ำจนกว่าค่าของ M และ N จะเท่ากัน ในการแตกแขนง ค่าที่มากกว่าของทั้งสองค่าจะถูกแทนที่ด้วยความแตกต่าง

ตอนนี้ดูที่ตารางการติดตามของอัลกอริทึมสำหรับค่าเริ่มต้น M = 32, N = 24

ขั้นตอน การดำเนินการ เอ็น เงื่อนไข
1 อินพุตเอ็ม 32
2 อินพุต N 24
3 มน 32 เบอร์ 24 ใช่ครับ
4 ม>น 32>24 ใช่ครับ
5 ม:=ม-น 8
6 มน 8¹24 ใช่แล้ว
7 ม>น 8>24 ไม่ใช่
8 N:=N-M 16
9 มน 8¹16 ใช่แล้ว
10 ม>น 8>16 ไม่ใช่
11 N:=N-M 8
12 มน 8¹8 ไม่ใช่
13 พิน เอ็ม 8
14 จบ

ในที่สุดผลลัพธ์ก็ถูกต้อง

โปรแกรมใน AY และ Pascal

มาเขียนอัลกอริทึมใน AY และโปรแกรมใน Pascal กันดีกว่า

คำถามและงาน

1. เรียกใช้โปรแกรม Evklid บนคอมพิวเตอร์ของคุณ ทดสอบกับค่า M = 32, N = 24; ม = 696, ยังไม่มีข้อความ = 234

2. เขียนโปรแกรมเพื่อหาตัวหารร่วมมากของตัวเลขสามตัวโดยใช้สูตรต่อไปนี้:

GCD(A, B, C) = GCD(GCD(A, B), C)

3. เขียนโปรแกรมเพื่อค้นหาตัวคูณร่วมน้อย (LCM) ของตัวเลขสองตัวโดยใช้สูตร:

A × B = GCD(A, B) × GCD(A, B)