ทำไมเราถึงตรวจสอบถึงรากที่สองของจำนวนเฉพาะเพื่อตรวจสอบว่ามันเป็นนายก?


392

ในการทดสอบว่าจำนวนนั้นเป็นจำนวนเฉพาะหรือไม่ทำไมเราจึงต้องทดสอบว่ามันหารได้เพียงแค่ถึงรากที่สองของจำนวนนั้นหรือไม่


33
เพราะถ้าn = a*bและแล้วa <= b a*a <= a*b = n
Will Ness

7
floor(sqrt(n))ชี้แจงที่นี้หมายถึงเรามีการทดสอบเท่านั้นจนถึง
คิวเมนตัส

คำตอบ:


659

หากตัวเลขnไม่ใช่จำนวนเฉพาะก็สามารถแยกออกเป็นสองปัจจัยaและb:

n = a * b

ตอนนี้aและbไม่สามารถเป็นได้ทั้งมากกว่ารากที่สองของnตั้งแต่นั้นสินค้าจะสูงกว่าa * b sqrt(n) * sqrt(n) = nดังนั้นในการแยกตัวประกอบใด ๆ ของnอย่างน้อยหนึ่งในปัจจัยจะต้องมีขนาดเล็กกว่าสแควร์รูทของnและถ้าเราไม่สามารถหาปัจจัยใด ๆ ที่น้อยกว่าหรือเท่ากับสแควร์รูทnจะต้องเป็นนายก


จะsqrt(n)ต้องมีความแม่นยำเพียงพอสำหรับสถานที่ให้ถือได้ว่าเรากำลังใช้จุดลอย
Benoît

@ Benoîtคุณสามารถใช้เช็คi * i <= nแทนi <= sqrt(n)หากคุณต้องการหลีกเลี่ยงความซับซ้อนของตัวเลขทศนิยม
Sven Marnach

348

ถ้าอย่างm = sqrt(n)นั้นเรามาพูดm × m = nกัน ตอนนี้ถ้าnไม่ได้เป็นนายกแล้วnสามารถเขียนเป็นดังนั้นn = a × b m × m = a × bขอให้สังเกตว่าmเป็นจำนวนจริงในขณะที่n, aและbเป็นตัวเลขที่เป็นธรรมชาติ

ตอนนี้มีได้ 3 กรณี:

  1. a> m ⇒ b <m
  2. a = m ⇒ b = m
  3. a <m ⇒ b> m

ทั้ง 3 min(a, b) ≤ mกรณี ดังนั้นหากเราค้นหาจนถึงmเราจะต้องหาปัจจัยอย่างน้อยหนึ่งอย่างnซึ่งเพียงพอที่จะแสดงว่าnไม่สำคัญ


4
n = 12 m = sqrt (12) = 3.46, a = 2, b = 6. n = m m เช่น 12 = 3.46 * 3.46 และ n = a b คือ 12 = 2 * 6 ตอนนี้เงื่อนไข 3 a <m <b ie 2 <3.46 <6. ดังนั้นเพื่อตรวจสอบไพรมเราต้องตรวจสอบหมายเลขน้อยกว่า 3.46 ซึ่งก็คือ 2 เพื่อหาว่าเลขนั้นไม่สำคัญ ดังนั้นตรวจสอบการหารด้วยตัวเลขที่น้อยกว่าหรือเท่ากับ (ถ้า n = 4, m = a = b = 2) สแควร์รูทของ n
anukalp

2
ฉันคิดว่าเราควรเน้นข้อสันนิษฐานก่อน สมมติn is not a primeและพิสูจน์มันไม่อย่างนั้นมันก็เป็นนายก
Huei Tan

จริงๆแล้วฉันไม่เชื่อว่ามันเป็นคำตอบที่ดีกว่า มันเป็นคำตอบที่ถูกต้อง แต่ไม่ได้ตอบคำถามจริงๆ มันอธิบายพลวัตอื่น ๆ รอบช่วงเวลาและ sqrt @ คำตอบของ Sven นั้นรวบรัดและไม่ได้สร้างคำถามเพิ่มเติมในกระบวนการ
Jon M

1
ฉันย้อนกลับไปใช้เวอร์ชันที่ดีล่าสุด คุณพลาดเมื่อมีคนลบคำโดยไม่จำเป็น ('ดังนั้น') ซึ่งจำเป็นสำหรับการไหล
Will Ness

55

เพราะหากปัจจัยมากกว่าค่าสแควร์รูทของ n ปัจจัยอื่น ๆ ที่จะคูณกับมันเท่ากันนั้นจำเป็นต้องน้อยกว่าสแควร์รูทของ n


37

คำอธิบายที่เข้าใจง่ายกว่าคือ: -

สแควร์รูทของ 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 แต่น้อยกว่าหรือเท่ากับสแควร์รูทโดยสมมติว่าคุณกำลังทดสอบตัวเลขคี่เท่านั้น

`


3
"คิดเกี่ยวกับ axb ถ้าหนึ่งในนั้นลดลงอีกอันจะต้องใหญ่กว่าเพื่อชดเชยดังนั้นผลิตภัณฑ์จะอยู่ที่ 100 พวกมันหมุนรอบรากที่สอง" เดี๋ยว aha ของฉัน! ขอบคุณ!
Brian Wigginton

นี่คือคำตอบที่ดีที่สุด
JeanieJ

19

สมมติว่า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) ไม่ได้เป็นจำนวนเฉพาะและเราทดสอบการหารได้ถึงสแควร์รูทของจำนวนนั้นเราจะพบหนึ่งในปัจจัย


8

ลองสมมุติว่าจำนวนเต็มที่กำหนด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เป็นสำคัญ

...


7

มันคือการใช้งานพื้นฐานทั้งหมดของ 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 ที่มีประโยชน์นี้เพื่อเริ่มต้นการออกจากการคำนวณแทนการสูญเสียพลังการคำนวณ ขอบคุณสำหรับการโพสต์
เอเดรียน

@ เอเดรียฉันต้องยอมรับว่าหลังจากกลับมาที่คำตอบนี้ฉันพบข้อผิดพลาดในเวลาที่โพสต์ของคุณ คุณไม่สามารถทำการหารด้วย 0 และในทางทฤษฎีหากคุณสามารถ++iกลายเป็นหมายเลข 1 ซึ่งจะกลับเท็จเสมอ (เพราะ 1 แบ่งออกเป็นทุกอย่าง) ฉันได้แก้ไขคำตอบข้างต้นแล้ว
Super Cat

ใช่ ... ฉันพูดถึงเรื่องนี้ในรหัสของฉัน ... การสังเกตรูตที่สองของคุณเป็นวิธีที่ยอดเยี่ยมในการโยนค่าที่ไม่ใช่ค่าเริ่มต้นก่อนที่คุณจะเริ่มทำการคำนวณ ฉันถูกฆ่าตายในจำนวนมากที่กลายเป็นเสียเวลามาก ฉันยังได้เรียนรู้อัลกอริทึมนี้สามารถลดเวลาในการประมวลผลจำนวนมากได้เป็นอย่างดี en.wikipedia.org/wiki/Miller –Rabin_primality_test
Adrian

6

ดังนั้นเพื่อตรวจสอบว่าหมายเลข 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)


3

สมมุติว่าเรามีตัวเลข "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"

เนื่องจากเหตุผลข้างต้นเมื่อเราทดสอบว่าตัวเลขนั้นเป็นจำนวนเฉพาะหรือไม่เราตรวจสอบเฉพาะรากที่สองของตัวเลขนั้น


1
b & c <= Math.sqrt (n)?; มันควรจะค่อนข้าง b || c (b หรือ c) เนื่องจากถ้า n = 6, b = 3, c = 2 ดังนั้น Math.sqrt (n)> c
daGo

ขอบคุณเพื่อนสำหรับการแก้ไข ทำการแก้ไข :)
Abu Naser Md Shoaib

2

กำหนดจำนวนเท่าใดก็ได้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ไปอีกครึ่งหนึ่ง


1

ให้ n เป็นคนที่ไม่ใช่นายก ดังนั้นจึงมีปัจจัยจำนวนเต็มอย่างน้อยสองตัวที่มากกว่า 1 ให้ f เป็นค่าที่น้อยที่สุดของปัจจัยดังกล่าว สมมติว่า f> sqrt n จากนั้น n / f เป็นจำนวนเต็ม LTE sqrt n จึงเล็กกว่า f ดังนั้น f ไม่สามารถเป็นปัจจัยที่เล็กที่สุดของ n Reductio ad absurdum; ปัจจัยที่เล็กที่สุดของ n ต้องเป็น LTE sqrt n


1

หมายเลขคอมโพสิตใด ๆ เป็นผลผลิตของจำนวนเฉพาะ

ให้บอกว่า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)นั้นเป็นจริงเสมอ


หากคุณสงสัยว่าทำไมมันเป็นความจริง @LoMaPh อธิบายความจริงในคำตอบของมันอย่างมาก ฉันเพิ่มคำตอบของฉันเพราะฉันมีเวลายากมากที่จะเห็นภาพและเข้าใจคำตอบอื่น ๆ มันไม่ได้คลิกเลย
daGo

0

ในการทดสอบความเป็นดั้งเดิมของตัวเลขนั้น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)


มีความเข้าใจที่สั้นกว่าและ IMHO ง่ายกว่ามากและมีคำอธิบายเพิ่มเติมในหัวข้อในความคิดเห็นและคำตอบอายุ 6 ปี ...
Thierry Lathuille
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.