วิธีการแยกตัวประกอบของออยเลอร์
วิธีการแยกตัวประกอบของออยเลอร์เป็นเทคนิคในการแยกตัวประกอบของจำนวนโดยการเขียนจำนวนนั้นให้อยู่ในรูปผลรวมของกำลังสองสองแบบที่แตกต่างกัน ตัวอย่างเช่น จำนวนนั้นสามารถเขียนได้เป็นหรือ เป็นและวิธีการของออยเลอร์จะให้การแยกตัวประกอบเป็น
แนวคิดที่ว่าการแสดงจำนวนเต็มบวกคี่สองรูปแบบที่แตกต่างกันอาจนำไปสู่การแยกตัวประกอบนั้น ปรากฏว่าถูกเสนอขึ้นครั้งแรกโดยมาริน เมอร์เซนน์อย่างไรก็ตาม แนวคิดนี้ไม่ได้ถูกนำไปใช้อย่างแพร่หลายจนกระทั่งหนึ่งร้อยปีต่อมาโดยออยเลอร์ การใช้งานที่มีชื่อเสียงที่สุดของวิธีการที่ปัจจุบันใช้ชื่อของเขาเป็นชื่อเรียกก็คือ การแยกตัวประกอบของจำนวนซึ่งก่อนหน้านี้เคยคิดว่าเป็นจำนวนเฉพาะ แม้ว่ามันจะไม่ใช่จำนวนเฉพาะเทียมตามการทดสอบความเป็นจำนวนเฉพาะที่สำคัญใดๆ ก็ตาม
วิธีการแยกตัวประกอบของออยเลอร์มีประสิทธิภาพมากกว่าวิธีการของแฟร์มาต์สำหรับจำนวนเต็มที่มีตัวประกอบอยู่ห่างกัน และอาจมีประสิทธิภาพมากกว่าการหารแบบลองผิดลองถูกมาก หากสามารถหาการแสดงจำนวนในรูปผลรวมของกำลังสองได้ค่อนข้างง่าย วิธีการที่ใช้ในการหาการแสดงจำนวนในรูปผลรวมของกำลังสองนั้นโดยพื้นฐานแล้วเหมือนกับวิธีการหาผลต่างของกำลังสองในวิธีการแยกตัวประกอบของแฟร์มาต์
ข้อเสียและข้อจำกัด
ข้อเสียเปรียบที่สำคัญของวิธีการแยกตัวประกอบของออยเลอร์คือ ไม่สามารถนำไปใช้กับการแยกตัวประกอบของจำนวนเต็มที่มีตัวประกอบเฉพาะในรูปแบบ 4k + 3 ที่มีกำลังคี่ในการแยกตัวประกอบเฉพาะได้ เนื่องจากจำนวนดังกล่าวไม่สามารถเป็นผลรวมของกำลังสองสองจำนวนได้ แม้แต่จำนวนประกอบคี่ในรูปแบบ 4k + 1 ก็มักจะเป็นผลคูณของจำนวนเฉพาะสองจำนวนในรูปแบบ 4k + 3 (เช่น 3053 = 43 × 71) และก็ไม่สามารถแยกตัวประกอบได้ด้วยวิธีของออยเลอร์เช่นกัน
ข้อจำกัดในการใช้งานนี้ทำให้วิธีการแยกตัวประกอบของออยเลอร์ไม่เป็นที่นิยมสำหรับอัลกอริ ธึม การแยกตัวประกอบ ใน คอมพิวเตอร์เนื่องจากผู้ใช้ที่พยายามแยกตัวประกอบจำนวนเต็มแบบสุ่มนั้นไม่น่าจะรู้ว่าวิธีการของออยเลอร์สามารถนำมาใช้กับจำนวนเต็มนั้นได้จริงหรือไม่ เพิ่งไม่นานมานี้เองที่มีความพยายามที่จะพัฒนาวิธีการของออยเลอร์ให้เป็นอัลกอริธึมคอมพิวเตอร์เพื่อใช้กับจำนวนเฉพาะที่ทราบว่าวิธีการของออยเลอร์สามารถนำมาใช้ได้
พื้นฐานทางทฤษฎี
เอกลักษณ์บราห์มาคุปตะ-ฟิโบนาชชีกล่าวว่า ผลคูณของผลรวมของกำลังสองสองจำนวนก็คือผลรวมของกำลังสองสองจำนวนเช่นกัน วิธีของออยเลอร์อาศัยทฤษฎีบทนี้ แต่สามารถมองได้ว่าเป็นสิ่งที่ตรงกันข้าม เนื่องจากเราพบว่าผลคูณของผลรวมของกำลังสองสองจำนวนนั้นเหมือนกัน
ขั้นแรกให้สรุปว่า
และแยกตัวประกอบทั้งสองด้านเพื่อให้ได้
- (1)
ทีนี้ให้และเพื่อให้มีค่าคงที่บางค่าที่สอดคล้องกับ เงื่อนไขดังกล่าว
- ,
- ,
- ,
- ,
เมื่อแทนค่าเหล่านี้ลงในสมการ (1) จะได้
การตัดตัวประกอบร่วมออกจะได้ผลลัพธ์ดังนี้
เมื่อใช้ข้อเท็จจริงที่ว่าและเป็นคู่ของจำนวนเฉพาะสัมพัทธ์ เราจะได้ว่า
ดังนั้น
ตอนนี้เราเห็นแล้วว่าและ
เมื่อใช้เอกลักษณ์บราห์มาคุปตะ-ฟิโบนาชชีเราจะได้
เนื่องจากตัวประกอบแต่ละตัวเป็นผลรวมของกำลังสองสองตัว ดังนั้นตัวประกอบตัวใดตัวหนึ่งในนั้นจะต้องมีจำนวนคู่ทั้งสองตัว คือหรือโดยไม่เสียความเป็นทั่วไป สมมติว่าคู่เป็นจำนวนคู่ การแยกตัวประกอบจึงกลายเป็น
ตัวอย่างการใช้งาน
เนื่องจาก:
จากสูตรข้างต้น เราจะได้ว่า:
| a = 1000 | (A) a − c = 28 | k = gcd[A,C] = 4 |
| b = 3 | (B) a + c = 1972 | h = gcd[B,D] = 34 |
| c = 972 | (C) d − b = 232 | l = gcd[A,D] = 14 |
| d = 235 | (D) d + b = 238 | m = gcd[B,C] = 116 |
ดังนั้น,
รหัสเทียม
ฟังก์ชัน Euler_factorize(int n) -> รายการ[int] ถ้า n เป็นจำนวนเฉพาะแล้ว print("ตัวเลขนี้ไม่สามารถแยกตัวประกอบได้") ฟังก์ชันออก ลูป for จาก a=1 ถึง a=ceiling(sqrt(n)) b2 = n - a*a b = floor(sqrt(b2)) ถ้า b*b==b2 หยุดลูปโดยรักษาค่า a,b ไว้ ถ้า a*a+b*b!=n แล้ว print("ไม่พบนิพจน์ใด ๆ สำหรับ n ในรูปผลรวมของกำลังสอง") ฟังก์ชันออก ลูป for จาก c=a+1 ถึง c=ceiling(sqrt(n)) d2 = n - c*c d = floor(sqrt(d2)) ถ้า d*d==d2 แล้ว ทำลายลูปที่รักษา c,d ไว้ ถ้า c*c+d*d!=n แล้ว print("ไม่พบนิพจน์ที่สองสำหรับ n ในรูปผลรวมของกำลังสอง") ฟังก์ชันออก A = ca, B = c+a C = bd, D = b+d k = GCD(A,C)//2, h = GCD(B,D)//2 l = GCD(A,D)//2, m = GCD(B,C)//2 แฟกเตอร์1 = k*k + h*h factor2 = l*l + m*m ส่งคืนลิสต์[แฟกเตอร์1, แฟกเตอร์2]