ขั้นตอนวิธีการแยกตัวประกอบของจำนวนเต็มของแฟร์มาต์

วิธีแยกตัวประกอบของแฟร์มาต์ (อังกฤษ: Fermat's factorization method) ตั้งชื่อตามผู้คิดค้นคือ ปิแยร์ เดอ แฟร์มาต์ (Pierre de Fermat) โดยเป็นผลงานหนึ่งที่เกี่ยวกับทฤษฎีจำนวน ที่ใช้ในการแยกตัวประกอบโดยมีหลักการที่ว่า จำนวนเต็มคี่ใดๆ สามารถแทนได้ด้วยผลต่างของเลขกำลังสองได้ดังนี้

จากการสังเกตนี้ ทำให้สามารถนำไปประยุกต์ใน ตะแกรงกำลังสอง (quadratic sieve) และ วิธีแยกตัวประกอบของดิกสัน (Dixon's Factorization Method)
จากสมบัติดังกล่าวสามารถมองได้ว่า

โดยที่ formula_3 ถ้า a หรือ b ไม่เท่ากับ 1 แสดงว่า a กับ b เป็นตัว ประกอบแท้ของ N สามารถเขียนแยกได้

หรือ

ดังนั้น

เนื่องจาก N เป็นจำนวนเต็มคี่ แล้ว a และ b เป็นจำนวนคี่ด้วย ดังนั้นจะได้ทั้งสองส่วนของสมการเป็นจำนวนเต็มและยังเขียนได้ว่า

จากสมบัติเหล่านี้จะนำมาใช้แยกตัวประกอบจำนวนเต็ม เมื่อเทียบกับ การหารเชิงทดลอง (trial division) แล้ววิธีนี้อาจจะมีประสิทธิภาพน้อยกว่า แต่เมื่อนำทั้ง วิธีการแยกตัวประกอบของแฟร์มาต์ กับการหารเชิงทดลอง มารวมกันแล้วจะทำให้ได้ประสิทธิภาพที่มากกว่าการใช้วิธีใดวิธีหนึ่ง

จากทฤษฎีข้างต้นหาค่า a ที่ทำให้ formula_10 สามารถยกกำลังสองเป็นจำนวนเต็มได้วิธีการดังกล่าวสามารถเขียนรหัสเทียมได้ดังนี้
ตัวอย่างรหัสที่สร้างโดยภาษา C++

หลักการคือต้องการแยกตัวประกอบของ N ซึ่ง N ควรเป็นจำนวนคี่ถ้าหากเป็นจำนวนคู่สามารถแยกตัวประกอบ 2 ออกไปก่อน จากนั้นหาตัวประกอบโดยหาค่า a และ b ที่เป็นจำนวนเต็มน้อยที่สุดที่ formula_11 โดยที่ formula_12 และถ้าแยกตัวประกอบได้ N=N*1 จะได้ว่า N เป็นจำนวนเฉพาะ โดยทดสอบทีละเงื่อนไขและบวกค่า a เพิ่มขึ้นเลื่อยๆจนพบคำตอบที่ได้ตัวประกอบลู่เข้ารากของ N มากที่สุด ตัวอย่างเช่น N=5959

เมื่อให้ formula_17 จะได้ว่าจำนวนครั้งในการวนลูปคือ formula_18 ของกรณีที่แย่ที่สุดคือเมื่อ N เป็นจำนวนเฉพาะ ซึ่งจะได้ประสิทธิภาพการทำงานเป็น formula_19 แต่ถ้ากรณีที่ c ต่างกับ รากของ N น้อยกว่า formula_20 ถ้าใช้จำนวนการทำงานแค่ครั้งเดียว หรือถ้าคำตอบจริงยิ่งเข้าไป รากของ N มากเท่าไหร่ประสิทธิภาพในทางปฏิบัติก็จะดีขึ้น ซึ่งจากทั้งหมดแสดงให้เห็นว่าประสิทธิภาพของวิธีแยกตัวประกอบของแฟร์มาต์จะขึ้นอยู่กับค่าของ N

จากวิธีของแฟร์มาต์จะเห็นว่าได้ประสิทธิภาพคือ formula_21 เมื่อเทียบกับ วิธีการหารเชิงทดลองที่ได้ประสิทธิภาพที่ดีกว่าคือ O(√n / log n) ซึ่งจะเห็น ดังนั้นเราสามารถเพิ่มประสิทธิภาพให้กับ วิธีการหาตัวประกอบทั้งสองให้ดีขึ้นได้โดยนำทั้งสองวิธีมารวมกันโดยใช้วิธีการหาตัวประกอบของแฟร์มาต์เป็นหลัก และใช้วิธีการหารเชิงทดลองตัดกรณีที่ใช้พิจารณามากๆได้ จาก
ทฤษฏีการหารเชิงทดลอง ตัวประกอบที่เป็นจำนวนเฉพาะของจำนวนเต็มใดๆ จะมีค่าน้อยกว่าหรือเท่ากับรากที่สองของจำนวนเต็มนั้น
จากตัวอย่างให้ N=123456789123 ใช้วิธีการแยกตัวประกอบของแฟร์มาต์ ได้ดังนี้
จริงๆแล้วจะเห็นว่าเราทำมาได้ 4 ขั้นตอนแล้วแต่ยังไม่ได้ตัวประกอบเพราะว่า b2=1637.77 ไม่ใช่จำนวนเต็มแต่เมื่อเราคำนวณ a-b2 จะได้ว่า 357368-1638=349730 ถ้าอาศัยทฤษฎีของการหารเชิงทดลองจะได้ว่าการที่จะหาตัวประกอบเฉพาะของ N ทำได้จากการทดลองหาจาก 0 ถึง 351365 (จาก การหารเชิงทดลอง) แต่กรณีนี้หลังจากที่เราทำการแยกตัวประกอบของแฟร์มาต์ยังไม่เสร็จแต่เราจะได้ว่า เราทำหาการหารเชิงทดลองโดยหาแค่จาก 0 ถึง 349730 พอซึ่งสามารถลดจากเดิมได้เป็นพันรอบโดยแค่ทำการหาตัวประกอบแบบแฟร์มาต์แค่ 4 รอบก่อน ซึ่งจากตัวอย่างด้านบนจะเห็นว่าสามารถหาค่าแล้วได้ b2 ออกมาเลื่อยๆทำให้ยิ่งเข้าใกล้ค่าตัวประกอบจริงมากขึ้นและยิ่งทำให้เมื่อนำไปหาการหารเชิงทดลองต่อมีแนวโน้มที่จะได้ประสิทธิภาพที่ดีขึ้น

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

กรณีดังกล่าวจะเห็นได้ว่าไม่มีค่า b หรือรากที่สองของ b2 เป็นจำนวนเต็ม. จากสมการ formula_31 เมื่อพิจารณาค่า formula_33เมื่อ a เป็นจำนวนเต็ม จากตัวอย่างดังนี้
จะเห็นได้ว่ากำลังสองของเลขจำนวนเต็มมักจะลงท้ายด้วย 0,1,4,5,9,16 modulo 20. จากตารางด้านบนจะพบว่าค่าที่ a mod 10 มีค่าเดียวกันยกจำลังสองแล้วจะได้เลขลงท้ายค่าเดียวกันเท่ากันด้วย หรือจะเรียกได้ว่าจะซ้ำรอบเดิมเมื่อ a ถูกเพิ่มเป็น 10 จากตัวอย่างดังกล่าวจะได้ว่าถ้าเราเพิ่ม -17 mod 20 (3), formula_34 จะได้เลขลงท้ายดังกล่าวออกมาเป็น 3,4,7,8,12,19 modulo 20 จะเห็นว่ามี 4 จากรายการนี้ที่สามารถเป็นกำลังสองได้ (เทียบอันดับกันของ formula_33 และ formula_34) ดังนั้น formula_37 ต้องเป็น 1 mod 20 หรือหมายถึง a คือ 1,9 mod 10 ซึ่งจะทำให้ b2 ลง ท้ายด้วย 4 mod 20 และ ถ้าเป็นกำลังสองอีก b จะลงท้ายด้วย 2,8 mod 10

ตัวอย่างของการใช้ มอดุลัส ค่าต่าง ของ N=2345678917

โดยทั่วไปจะเลือกค่าที่เป็นกำลังของจำนวนเฉพาะที่แตกต่างกันสำหรับ มอดุลัส
เมื่อให้ลำดับของ a-value(start,end,and step) และค่าค่า modulus ซึ่งจะมีกระบวนการได้ดังนี้

วิธีการของแฟร์มาต์จะทำงานได้ดีเมื่อตัวประกอบนั้นอยู่ใกล้กับค่า รากที่สองของ N ซึ่งเราอาจจะจัดการให้สิ่งนั้นเกิดขึ้นได้ ถ้ารู้ค่าอัตราส่วนโดยประมาณของ d/c โดยกำหนดให้ N แยกตัวประกอบได้ N = cd แล้ว สามารถเลือกอัตราส่วนจำนวน v/u ที่ใกล้กับค่านั้น แล้วประมาณได้ว่า N*u*v = (c*v)*(d*u) ซึ่งทำให้ใช้เมื่อวิธีของแฟร์มาต์จทำให้สามารถหาในรูป N=N*u*v ได้เร็วกว่า จากนั้นหาตัวหารร่วมมาก ของ factor ที่ได้กับ N เดิม จะได้ gcd(N,vc)= c และ gcd(N,du)=d (เว้น c หาร u หรือ d หาร v ลงตัว)

ประสิทธิภาพของรหัสเทียมดังกล่าวคือ formula_45

การแยกตัวประกอบของแฟร์มาต์เป็นวิธีหนึ่งที่ใช้ในการแยกตัวประกอบของจำนวนเต็มโดยใช้สมบัติของผลต่างกำลังสองที่เป็นจำนวนเต็มวิธีพื้นฐานปกติจะมีประสิทธิภาพที่ไม่ดีนักไม่ต่างกับการค้นหาจำนวนเต็มทุกตัวจาก 1 ถึง N ( formula_47 ) แต่จะมีประสิทธิภาพสูงถ้าคำตอบเข้าใกล้รากที่สองของ N และสามารถนำคุณสมบัติทางคณิตศาสตร์นี้ไปประยุกต์หรือปรับปรุงกับวิธีอื่นเช่น การหารเชิงทดลอง ทำให้เห็นว่าได้ประสิทธิภาพที่ดีกว่าการใช้ตัวใดตัวหนึ่งโดยอาศัยการแยกตัวประกอบของแฟร์มาต์มาใช้ลดช่วงของการค้น หรือประยุกต์กับวิธีของเลห์แมน ดังที่ได้กล่าวไปที่ทำให้ได้ประสิทธิภาพเป็น formula_45 โดยอาศัยสมบัติการความมีประสิทธิภาพสูงเมื่อเข้าใกล้รากที่สองของ N นอกจากนั้นยังเป็นรากฐานของเรื่อง ตะแกรงกำลังสอง(quadratic sieve) และ การกรองตัวเลขในขอบเขตแบบธรรมดา(general number field sieve)ซึ่งเป็นระเบียบวิธีการที่รู้จักดีสำหรับการแยกตัวประกอบ "กรณีที่แย่ที่สุด" จำนวนกึ่งเฉพาะขนาดใหญ่ ในขั้นตอน วิธีการของตะแกรงกำลังสอง ที่แตกต่างกับการแยกตัวประกอบของแฟร์มาต์คือ แทนที่จะหา ว่าformula_49 เป็นกำลังสองหรือไม่เป็นลำดับ แต่จะหาเซตย่อยของส่วนประกอบของลำดับดังกล่าวที่คูณกัน ที่เป็นกำลังสอง ซึ่งสุดท้ายจะได้ผลที่เหมือนกับผลต่างกำลังสอง mod n ถ้าค่าดังกล่าวเป็นผลไม่ชัด(nontrivial) สามารถนำไปใช้แยกตัวประกอบของ N ต่อได้ นอกจากนี้ยังมีการนำไปใช้อีกมากมายที่ยังไม่ได้กล่าวถึงเช่น วิธีแยกตัวประกอบของดิกสัน เป็นต้น