ในการทดสอบว่าจำนวนนั้นเป็นจำนวนเฉพาะหรือไม่ทำไมเราจึงต้องทดสอบว่ามันหารได้เพียงแค่ถึงรากที่สองของจำนวนนั้นหรือไม่
floor(sqrt(n))
ชี้แจงที่นี้หมายถึงเรามีการทดสอบเท่านั้นจนถึง
ในการทดสอบว่าจำนวนนั้นเป็นจำนวนเฉพาะหรือไม่ทำไมเราจึงต้องทดสอบว่ามันหารได้เพียงแค่ถึงรากที่สองของจำนวนนั้นหรือไม่
floor(sqrt(n))
ชี้แจงที่นี้หมายถึงเรามีการทดสอบเท่านั้นจนถึง
คำตอบ:
หากตัวเลขn
ไม่ใช่จำนวนเฉพาะก็สามารถแยกออกเป็นสองปัจจัยa
และb
:
n = a * b
ตอนนี้a
และb
ไม่สามารถเป็นได้ทั้งมากกว่ารากที่สองของn
ตั้งแต่นั้นสินค้าจะสูงกว่าa * b
sqrt(n) * sqrt(n) = n
ดังนั้นในการแยกตัวประกอบใด ๆ ของn
อย่างน้อยหนึ่งในปัจจัยจะต้องมีขนาดเล็กกว่าสแควร์รูทของn
และถ้าเราไม่สามารถหาปัจจัยใด ๆ ที่น้อยกว่าหรือเท่ากับสแควร์รูทn
จะต้องเป็นนายก
sqrt(n)
ต้องมีความแม่นยำเพียงพอสำหรับสถานที่ให้ถือได้ว่าเรากำลังใช้จุดลอย
i * i <= n
แทนi <= sqrt(n)
หากคุณต้องการหลีกเลี่ยงความซับซ้อนของตัวเลขทศนิยม
ถ้าอย่างm = sqrt(n)
นั้นเรามาพูดm × m = n
กัน ตอนนี้ถ้าn
ไม่ได้เป็นนายกแล้วn
สามารถเขียนเป็นดังนั้นn = a × b
m × m = a × b
ขอให้สังเกตว่าm
เป็นจำนวนจริงในขณะที่n
, a
และb
เป็นตัวเลขที่เป็นธรรมชาติ
ตอนนี้มีได้ 3 กรณี:
ทั้ง 3 min(a, b) ≤ m
กรณี ดังนั้นหากเราค้นหาจนถึงm
เราจะต้องหาปัจจัยอย่างน้อยหนึ่งอย่างn
ซึ่งเพียงพอที่จะแสดงว่าn
ไม่สำคัญ
n is not a prime
และพิสูจน์มันไม่อย่างนั้นมันก็เป็นนายก
เพราะหากปัจจัยมากกว่าค่าสแควร์รูทของ n ปัจจัยอื่น ๆ ที่จะคูณกับมันเท่ากันนั้นจำเป็นต้องน้อยกว่าสแควร์รูทของ n
คำอธิบายที่เข้าใจง่ายกว่าคือ: -
สแควร์รูทของ 100 คือ 10 สมมุติว่า axb = 100 สำหรับคู่ของ a และ b ต่างๆ
หาก a == b แสดงว่าพวกเขาเท่ากันและเป็นสแควร์รูทของ 100 อย่างแน่นอน ซึ่งคือ 10
หากหนึ่งในนั้นน้อยกว่า 10 อีกจะต้องมากกว่า ตัวอย่างเช่น 5 x 20 == 100 หนึ่งมากกว่า 10 อื่น ๆ น้อยกว่า 10
เมื่อนึกถึง axb ถ้ามีสักตัวหนึ่งลงไปอีกอันจะต้องใหญ่กว่าเพื่อชดเชยดังนั้นผลิตภัณฑ์จะอยู่ที่ 100 พวกมันหมุนรอบรากที่สอง
สแควร์รูทของ 101 มีค่าประมาณ 10.049875621 ดังนั้นหากคุณกำลังทดสอบหมายเลข 101 สำหรับอันดับแรกคุณจะต้องลองจำนวนเต็มจนถึง 10 รวมถึง 10 แต่ 8, 9 และ 10 นั้นไม่ได้อยู่ในอันดับแรกดังนั้นคุณต้องทดสอบถึง 7 ซึ่งก็คือ สำคัญ
เพราะถ้ามีคู่ของปัจจัยที่มีหนึ่งในตัวเลขที่ใหญ่กว่า 10 อีกคู่หนึ่งจะต้องน้อยกว่า 10 ถ้าไม่มีตัวที่เล็กกว่าไม่มีตัวประกอบที่ใหญ่กว่า 101
หากคุณกำลังทดสอบ 121 สแควร์รูทคือ 11 คุณต้องทดสอบจำนวนเต็ม 1 ถึง 11 (รวม) เพื่อดูว่ามันเป็นไปอย่างสม่ำเสมอหรือไม่ 11 ไปใน 11 ครั้งดังนั้น 121 จึงไม่เหมาะ หากคุณหยุดที่ 10 และไม่ทดสอบ 11 คุณจะพลาด 11
คุณต้องทดสอบจำนวนเต็มสำคัญทุกตัวที่มากกว่า 2 แต่น้อยกว่าหรือเท่ากับสแควร์รูทโดยสมมติว่าคุณกำลังทดสอบตัวเลขคี่เท่านั้น
`
สมมติว่าn
ไม่ใช่จำนวนเฉพาะ (มากกว่า 1) ดังนั้นจึงมีตัวเลขa
และb
สิ่งนั้น
n = ab (1 < a <= b < n)
โดยการคูณความสัมพันธ์a<=b
ด้วยa
และb
เราได้รับ:
a^2 <= ab
ab <= b^2
ดังนั้น: (โปรดทราบว่าn=ab
)
a^2 <= n <= b^2
ดังนั้น: (โปรดทราบว่าa
และb
เป็นบวก)
a <= sqrt(n) <= b
ดังนั้นหากจำนวน (มากกว่า 1) ไม่ได้เป็นจำนวนเฉพาะและเราทดสอบการหารได้ถึงสแควร์รูทของจำนวนนั้นเราจะพบหนึ่งในปัจจัย
ลองสมมุติว่าจำนวนเต็มที่กำหนดN
ไม่ได้เป็นจำนวนเฉพาะ
แล้ว n สามารถ factorized เป็นสองปัจจัยa
และb
, ดังกล่าวว่า2 <= a, b < N
N = a*b
เห็นได้ชัดว่าพวกเขาทั้งสองจะต้องไม่มากกว่าsqrt(N)
พร้อมกัน
ให้เราสมมติโดยไม่สูญเสียความเป็นนายพลที่a
น้อยลงไป
ทีนี้ถ้าคุณไม่สามารถหาตัวหารใด ๆN
ที่อยู่ในช่วง[2, sqrt(N)]
นั่นหมายความว่าอย่างไร
ซึ่งหมายความว่าN
ไม่ได้มีตัวหารใด ๆ ใน[2, a]
ขณะที่a <= sqrt(N)
ขณะที่
ดังนั้นa = 1
และb = n
และด้วยเหตุนี้ตามคำนิยามN
เป็นสำคัญ
...
อ่านเพิ่มเติมหากคุณไม่พอใจ:
การผสมผสานที่แตกต่างกันจำนวนมาก(a, b)
อาจเป็นไปได้ สมมติว่าพวกเขาคือ:
(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ..... , (a k , b k ) โดยไม่สูญเสียของทั่วไปสมมติฉัน <b ฉัน1<= i <=k
,
ตอนนี้เพื่อให้สามารถแสดงให้เห็นว่าN
ไม่สำคัญมันก็เพียงพอที่จะแสดงว่าฉันไม่สามารถแยกตัวประกอบเพิ่มเติมได้ และเรายังรู้ว่าฉัน <= sqrt(N)
และทำให้คุณต้องตรวจสอบจนถึงsqrt(N)
ซึ่งจะครอบคลุมทั้งหมดฉัน และด้วยเหตุนี้คุณจะสามารถสรุปได้ว่าหรือไม่N
เป็นสำคัญ
...
มันคือการใช้งานพื้นฐานทั้งหมดของ Factorization และ Square Roots
มันอาจดูเหมือนจะเป็นนามธรรม แต่ในความเป็นจริงมันก็แค่อยู่กับความจริงที่ว่าตัวเลขที่เป็นไปได้สูงสุดของจำนวนที่ไม่ใช่นายก - จะต้องเป็นรากที่สองเพราะ:
sqrroot(n) * sqrroot(n) = n
.
ระบุว่าหากจำนวนเต็มใด ๆ สูง1
กว่าหรือต่ำกว่าหรือสูงกว่าเพื่อsqrroot(n)
หารให้เท่ากันn
แล้วn
ไม่ควรเป็นจำนวนเฉพาะ
ตัวอย่างรหัสเทียม:
i = 2;
is_prime = true;
while loop (i <= sqrroot(n))
{
if (n % i == 0)
{
is_prime = false;
exit while;
}
++i;
}
guard
คำสั่งใน Swift ร่วมกับstackoverflow.com/a/25555762/4475605 ที่มีประโยชน์นี้เพื่อเริ่มต้นการออกจากการคำนวณแทนการสูญเสียพลังการคำนวณ ขอบคุณสำหรับการโพสต์
++i
กลายเป็นหมายเลข 1 ซึ่งจะกลับเท็จเสมอ (เพราะ 1 แบ่งออกเป็นทุกอย่าง) ฉันได้แก้ไขคำตอบข้างต้นแล้ว
ดังนั้นเพื่อตรวจสอบว่าหมายเลข N เป็น Prime หรือไม่ เราจำเป็นต้องตรวจสอบว่า N สามารถหารด้วยตัวเลข <= SQROOT (N) นี่เป็นเพราะถ้าเราคำนึงถึง N เป็น 2 ปัจจัยใดก็ตามที่บอกว่า X และ Y คือ N = X Y แต่ละ X และ Y ต้องไม่น้อยกว่า SQROOT (N) เพราะตอนนั้น X Y <N แต่ละ X และ Y ไม่สามารถมากกว่า SQROOT (N) เพราะ X * Y> N
ดังนั้นปัจจัยหนึ่งจะต้องน้อยกว่าหรือเท่ากับ SQROOT (N) (ในขณะที่อีกปัจจัยจะมากกว่าหรือเท่ากับ SQROOT (N)) ดังนั้นเพื่อตรวจสอบว่า N เป็น Prime เราต้องการเพียงตรวจสอบตัวเลขเหล่านั้น <= SQROOT (N)
สมมุติว่าเรามีตัวเลข "a" ซึ่งไม่ใช่จำนวนเฉพาะ [ไม่ใช่จำนวนเฉพาะ / หมายถึงจำนวนประกอบ - ตัวเลขที่สามารถหารได้อย่างเท่าเทียมกันโดยตัวเลขอื่นที่ไม่ใช่ 1 หรือตัวมันเอง ตัวอย่างเช่น 6 สามารถแบ่งได้อย่างเท่าเทียมกันโดย 2 หรือ 3 เช่นเดียวกับ 1 หรือ 6]
6 = 1 × 6 หรือ 6 = 2 × 3
ตอนนี้ถ้า "a" ไม่ได้เป็นเอกสิทธิ์จากนั้นก็สามารถหารด้วยตัวเลขอีกสองตัวและสมมุติว่าตัวเลขเหล่านั้นคือ "b" และ "c" ซึ่งหมายความว่า
A = b * ค
ทีนี้ถ้า "b" หรือ "c" สิ่งใด ๆ ในนั้นมีค่ามากกว่ารากที่สองของ "a" มากกว่าการคูณของ "b" & "c" จะมากกว่า "a"
ดังนั้น "b" หรือ "c" จึงเป็น <= สแควร์รูทของ "a" เสมอเพื่อพิสูจน์สมการ "a = b * c"
เนื่องจากเหตุผลข้างต้นเมื่อเราทดสอบว่าตัวเลขนั้นเป็นจำนวนเฉพาะหรือไม่เราตรวจสอบเฉพาะรากที่สองของตัวเลขนั้น
กำหนดจำนวนเท่าใดก็ได้n
วิธีหนึ่งในการค้นหาปัจจัยคือรับสแควร์รูทp
:
sqrt(n) = p
แน่นอนถ้าเราคูณp
ด้วยตัวเองเราจะกลับมาn
:
p*p = n
มันสามารถเขียนใหม่เป็น:
a*b = n
p = a = b
ที่ไหน หากa
เพิ่มขึ้นแล้วลดลงในการรักษาb
a*b = n
ดังนั้นจึงp
เป็นขีด จำกัด บน
ปรับปรุง:ฉันกำลังอ่านคำตอบนี้อีกครั้งในวันนี้และมันชัดเจนสำหรับฉันมากขึ้น ค่าp
ไม่จำเป็นต้องหมายถึงจำนวนเต็มเพราะถ้าเป็นเช่นนั้นn
จะไม่เป็นจำนวนเฉพาะ ดังนั้นp
อาจเป็นจำนวนจริง (เช่นมีเศษส่วน) และแทนจะผ่านทั้งช่วงของตอนนี้เราจะต้องไปผ่านทั้งช่วงของn
p
อีกอันp
คือสำเนากระจกดังนั้นเราจึงลดระยะลงครึ่งหนึ่ง จากนั้นตอนนี้ฉันเห็นแล้วว่าเราสามารถทำสิ่งต่อไปได้อีกsquare root
และทำp
ไปอีกครึ่งหนึ่ง
ให้ n เป็นคนที่ไม่ใช่นายก ดังนั้นจึงมีปัจจัยจำนวนเต็มอย่างน้อยสองตัวที่มากกว่า 1 ให้ f เป็นค่าที่น้อยที่สุดของปัจจัยดังกล่าว สมมติว่า f> sqrt n จากนั้น n / f เป็นจำนวนเต็ม LTE sqrt n จึงเล็กกว่า f ดังนั้น f ไม่สามารถเป็นปัจจัยที่เล็กที่สุดของ n Reductio ad absurdum; ปัจจัยที่เล็กที่สุดของ n ต้องเป็น LTE sqrt n
หมายเลขคอมโพสิตใด ๆ เป็นผลผลิตของจำนวนเฉพาะ
ให้บอกว่าn = p1 * p2
ที่ไหนp2 > p1
และพวกเขามีช่วงเวลา
หากn % p1 === 0
แล้วnเป็นจำนวนคอมโพสิต
ถ้าเช่นn % p2 === 0
นั้นก็เดาได้n % p1 === 0
เช่นกัน!
ดังนั้นจึงไม่มีทางที่ถ้าn % p2 === 0
แต่n % p1 !== 0
ในเวลาเดียวกัน กล่าวอีกนัยหนึ่งถ้าจำนวนประกอบประกอบด้วยnสามารถแบ่งเท่า ๆ กันโดย
p2, p3 ... pi (ปัจจัยที่ใหญ่กว่า) มันจะต้องถูกหารด้วยปัจจัยต่ำสุดp1ด้วย ปรากฎว่าปัจจัยที่ต่ำที่สุดp1 <= Math.square(n)
นั้นเป็นจริงเสมอ
ในการทดสอบความเป็นดั้งเดิมของตัวเลขนั้นnจะคาดว่าจะวนซ้ำเช่นต่อไปนี้ในสถานที่แรก:
bool isPrime = true;
for(int i = 2; i < n; i++){
if(n%i == 0){
isPrime = false;
break;
}
}
สิ่งที่ลูปข้างต้นทำคือ: สำหรับ1 <i <n ที่กำหนดจะตรวจสอบว่า n / i เป็นจำนวนเต็มหรือไม่ (เหลือ 0) หากมี i ที่ n / i เป็นจำนวนเต็มเราสามารถมั่นใจได้ว่า n ไม่ใช่หมายเลขเฉพาะ ณ จุดที่ลูปสิ้นสุด ถ้าไม่ใช่ฉัน, n / i เป็นจำนวนเต็มดังนั้น n คือจำนวนเฉพาะ
เช่นเดียวกับอัลกอริธึมทั้งหมดเราถามว่า: เราทำได้ดีกว่านี้ไหม
ให้เราดูว่าเกิดอะไรขึ้นในลูปด้านบน
ลำดับของ i ไป: i = 2, 3, 4, ... , n-1
และลำดับของการตรวจสอบจำนวนเต็มไป: j = n / i, ซึ่งคือ n / 2, n / 3, n / 4, ... , n / (n-1)
หาก i = a บางตัว n / a เป็นจำนวนเต็มดังนั้น n / a = k (จำนวนเต็ม)
หรือ n = ak, ชัดเจน n> k> 1 (ถ้า k = 1, a = n, แต่ฉันไม่เคยไปถึง n และถ้า k = n, จากนั้น a = 1, แต่ฉันเริ่มฟอร์ม 2)
นอกจากนี้ n / k = a และตามที่ระบุไว้ข้างต้น a คือค่าของ i so n> a> 1
ดังนั้น a และ k เป็นจำนวนเต็มทั้งคู่ระหว่าง 1 ถึง n (พิเศษ) ตั้งแต่ฉันมาถึงจำนวนเต็มทุกตัวในช่วงนั้นในการทำซ้ำ i = a และที่การทำซ้ำอื่น ๆ ที่บางส่วน i = k หากการทดสอบดั้งเดิมของ n ล้มเหลวสำหรับ min (a, k) มันจะล้มเหลวสำหรับ max (a, k) ดังนั้นเราจำเป็นต้องตรวจสอบเพียงหนึ่งในสองกรณีนี้ยกเว้น min (a, k) = max (a, k) (ที่สองเช็คลดลงเหลือหนึ่ง) คือ a = k ที่จุด a * a = n ซึ่ง หมายถึง a = sqrt (n)
กล่าวอีกนัยหนึ่งถ้าการทดสอบแบบดั้งเดิมของ n ต้องล้มเหลวสำหรับบางคน> iii = sqrt (n) (เช่น max (a, k)) ดังนั้นมันจะล้มเหลวสำหรับ i <= n (เช่น min (a) , k)) ดังนั้นจะพอเพียงถ้าเราทำการทดสอบสำหรับ i = 2 ถึง sqrt (n)
n = a*b
และแล้วa <= b
a*a <= a*b = n