อัลกอริธึมปัจจัยเฉพาะ: C, Python ตัวอย่าง
การแยกตัวประกอบเฉพาะคืออะไร?
ปัจจัยเฉพาะของที่กำหนด ใด number คือตัวประกอบที่เป็น a จำนวนเฉพาะ- ตัวประกอบเมื่อคูณจะได้ตัวเลขอีกจำนวนหนึ่ง จำนวนเฉพาะหารด้วยตัวมันเองหรือ 1
กล่าวอีกนัยหนึ่ง ปัจจัยเฉพาะจะถูกกำหนดโดยการหาจำนวนเฉพาะที่คูณกันเพื่อสร้างตัวเลขต้นฉบับ
ตัวอย่าง:ตัวประกอบเฉพาะของ 10 คือ 2 และ 5 นี่เป็นเพราะ 2X5 = 10 และ 2,5 ทั้งคู่เป็นจำนวนเฉพาะ
การค้นหาปัจจัยเฉพาะโดยใช้การวนซ้ำ
ในการหาตัวประกอบเฉพาะของตัวเลขที่กำหนด เราต้องทำซ้ำตัวเลขทั้งหมดตั้งแต่ 2 จนถึงรากที่สองของตัวเลขก่อน จากนั้นจึงตรวจสอบว่าตัวเลขแต่ละตัวเป็นจำนวนเฉพาะหรือไม่ ตราบใดที่ตัวเลขเดิมหารด้วยจำนวนเฉพาะนี้ได้ เราจะบวกจำนวนเฉพาะนี้ต่อไปในแต่ละรอบ
ตัวอย่าง:
จำนวนเฉพาะทุกตัวที่มากกว่า 40 เขียนด้วยสูตรต่อไปนี้: n2+n+41 ดังนั้นเราสามารถแทนที่ n ด้วยตัวเลขทั้งหมดเพื่อหาตัวประกอบเฉพาะที่สอดคล้องกัน เช่น 02+0+41=41, 12+1+41=43, 22+2+41=47,...
จะพิมพ์ตัวประกอบเฉพาะของตัวเลขได้อย่างไร?
- ในวิธีนี้ เราจะวนซ้ำตัวเลขตั้งแต่ 2 จนถึงรากที่สองของตัวเลข ดังที่ได้กล่าวไว้ในหัวข้อก่อนหน้า
- เพื่อสิ่งนั้น เราจะต้องตรวจสอบโมดูลัสของตัวเลขเดิมบนแต่ละตัวเลขตั้งแต่ 2 จนถึงรากที่สองของ n
- จากนั้นเราก็จะค้นหารายชื่อจำนวนเฉพาะที่เป็นตัวประกอบของ n
- โซลูชันนี้มีความซับซ้อนของเวลา O(Sqrt(n))
ขั้นตอนวิธีการ:
Set a counter i to 2 While i <= sqrt(n): While n% i == 0: n = n / i print i i = i +1 if n > 1: print n
อัลกอริธึมตะแกรง
วิธีการกรองจะใช้การเก็บตัวประกอบเฉพาะที่เล็กที่สุดของตัวเลข ซึ่งจะช่วยลดความซับซ้อนได้อย่างเห็นได้ชัดเมื่อคำนวณตัวประกอบเฉพาะสำหรับตัวเลขใดๆ อัลกอริทึมกรองจะค้นหาตัวประกอบเฉพาะทั้งหมดได้อย่างมีประสิทธิภาพในระดับหนึ่ง
- แนวคิดหลักของอัลกอริธึมนี้คือการเก็บตัวประกอบเฉพาะที่น้อยที่สุดของแต่ละตัวเลขจนถึงจำนวนสูงสุด
- เรานำจำนวนเฉพาะที่น้อยที่สุดสำหรับแต่ละจำนวนที่กำหนดมาบวกเข้ากับเซตของตัวประกอบเฉพาะ
- สุดท้าย เราหารด้วยจำนวนเฉพาะนี้แล้วทำซ้ำขั้นตอนนี้จนกว่าจะถึง 1.
- ทั้งหมดนี้ทำโดยมีความซับซ้อนของเวลา O(log(n)) ซึ่งช่วยปรับปรุงประสิทธิภาพของโซลูชันได้มาก
- ซึ่งทำให้สามารถคำนวณตัวประกอบเฉพาะของตัวเลขที่ใหญ่กว่ามากได้มากกว่าตัวเลขที่เราสามารถจัดการได้โดยใช้วิธีการก่อนหน้านี้
ตัวอย่าง:
วิธีที่สองคือตรวจสอบว่าสามารถเขียนตัวเลขเป็น 6n-1 หรือ 6n+1 ได้หรือไม่ เนื่องจากควรเขียนจำนวนเฉพาะใดๆ ที่ไม่ใช่ 2 และ 3 โดยใช้สูตรใดสูตรหนึ่งจากสองสูตร เช่น 5=6(1)-1, 19=6(3)+1,… .
ขั้นตอนวิธีการ:
กำหนดอาร์เรย์อาร์เรย์เพื่อจัดเก็บตัวประกอบเฉพาะที่น้อยที่สุดของแต่ละตัวเลขโดยมีค่าดัชนีเป็นค่าเริ่มต้นสำหรับทุกองค์ประกอบของ แถว.
Set array[1] to 1 Set i to 2 While i*i > max number: If array[i] == i: Set j to i*i While j > max number: If array[j] == j: Array[j] = i j = j + i i = i + 1 while the number != 1: print array[the number] the number = the number / array[the number]
Python ปัจจัยสำคัญที่ใช้การวนซ้ำ
ที่นี่เราจะแสดงโค้ดใน Python ภาษาเพื่อค้นหาตัวประกอบเฉพาะของจำนวนที่กำหนดในวิธีการวนซ้ำ:
import math def PrimeFactors(n): for i in range(2,int(math.sqrt(n))+1,1): while n%i==0:#find all the occurrences of a prime factor print((int)(i)), n=n/i if n!=1:#if the number was originally a prime print((int)(n)) n=(int)(input("Enter the number you want: ")) PrimeFactors(n)
Output:
Enter the number you want: 4 4
Python ปัจจัยสำคัญที่ใช้การเรียกซ้ำ
ส่วนนี้จะแสดงรหัสใน Python language โดยใช้วิธีตะแกรงหาตัวประกอบเฉพาะของจำนวนที่กำหนด
import math High = (int)(1e5+7) array=[0 for i in range(High)] # function to generate all the smallest prime def Sieve(): #factors of the numbers until the maximum number for i in range(1, High): array[i]=i for i in range(2, math.ceil(math.sqrt(High))): if (array[i] == i): for j in range(i*i, High,i): if(array[j]==j): array[j]=i def PrimeFactors(n): #We will keep dividing until we reach 1 if n == 1: return print((int)(array[n])) PrimeFactors((int)(n/array[n])) #Here we call the function after dividing it by this prime Sieve() n=(int)(input("Enter the number you want: ")) PrimeFactors(n)
Output:
Enter the number you want: 4 2 2
โปรแกรม C Prime Factors โดยใช้การวนซ้ำ
มันเป็นวิธีแก้ปัญหาเดียวกับ Python แบบวนซ้ำ แต่เขียนไว้ ภาษาซี.
เราขอให้ผู้ใช้กรอกตัวเลข จากนั้นสำหรับแต่ละตัวเลขตั้งแต่ 2 ถึงรากที่สองของตัวเลขนี้ เราต้องตรวจสอบว่าหารด้วยจำนวนนั้นได้หรือไม่โดยการพิมพ์เหตุการณ์ที่เกิดขึ้นทั้งหมดของตัวประกอบนี้
#include <stdio.h> int main() { int n; printf("Enter the number you want: "); scanf("%d", &n); for(int i=2; i*i<=n; i++) { while(n%i==0)//find all the occurrences of a prime factor { printf("%d\n",i); n/=i; } } if(n!=1)//if the number was originally a prime { printf("%d",n); } return 0; }
Output:
Enter the number you want: 2 2
โปรแกรม C Prime Factors โดยใช้การเรียกซ้ำ
นี่เป็นวิธีแก้ปัญหาแบบเดียวกับ Python แบบเรียกซ้ำ แต่เขียนด้วยภาษา C
เราสามารถขอให้ผู้ใช้กรอกหมายเลขได้ จากนั้นเราสร้างอาร์เรย์จำนวนเฉพาะที่เก็บตัวประกอบเฉพาะที่น้อยที่สุดของแต่ละจำนวน สุดท้าย เราเรียกฟังก์ชันการเรียกซ้ำของปัจจัยเฉพาะซึ่งหารจำนวนที่กำหนดด้วยตัวประกอบเฉพาะที่น้อยที่สุดและเรียกคืนตัวเองจนกว่าจะถึงค่าหนึ่ง
#include <stdio.h> int Max = 100007; int array[100007]; void Sieve()//helping function to generate all the smallest //prime factors of the numbers until the maximum number { for(int i=1;i<Max;i++) { array[i]=i; } for(int i=2;i*i<=Max;i++) { if(array[i]==i) { for(int j=i*i;j<Max;j+=i) { if(array[j]==j) { array[j]=i; } } } } } void PrimeFactors(int n) { if(n==1)//keep dividing until we reach 1 { return; } printf("%d\n",array[n]); PrimeFactors(n/array[n]);//call the function after dividing by //this prime } int main() { Sieve(); int n; printf("Enter the number you want: "); scanf("%d", &n); PrimeFactors(n); return 0; }
Output:
Enter the number you want: 2 2
ข้อเท็จจริงที่น่าสนใจเกี่ยวกับจำนวนเฉพาะ
- ข้อเท็จจริงที่น่าสนใจที่สุดประการหนึ่งก็คือ จำนวนคู่ใดๆ ที่ไม่ใช่ 2 สามารถเป็นผลรวมของจำนวนเฉพาะสองจำนวนได้
- ตัวอย่างเช่น: 4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3 … เป็นต้น
- ข้อเท็จจริงอีกประการหนึ่งก็คือ ไม่มีจำนวนเฉพาะที่ต่อเนื่องกันนอกจาก 2 และ 3 เนื่องจากจำนวนเฉพาะคู่เพียงตัวเดียวคือหมายเลข 2
- นอกจากนี้ จำนวนเฉพาะทั้งหมด ยกเว้น 2 และ 3 สามารถเขียนในรูปแบบต่อไปนี้ได้: 6 * n + 1 หรือ 6 * n – 1 โดยที่ n เป็นจำนวนเต็มบวก
- เซตตัวประกอบเฉพาะของจำนวนนั้นเป็นเซตที่ไม่ซ้ำกัน
- หมายเลข 1 ไม่ใช่จำนวนเฉพาะหรือจำนวนประกอบ
- การแยกตัวประกอบเฉพาะของตัวเลขสามารถช่วยแก้ปัญหาต่างๆ เช่น การหาร การทำให้เศษส่วนง่ายขึ้น และการหาตัวส่วนร่วมของเศษส่วนต่างๆ
- นอกจากนี้ การใช้การแยกตัวประกอบเฉพาะที่น่าตื่นเต้นอย่างหนึ่งคือการทำลายรหัสลับที่เป็นตัวเลข